Merge v234 into tizen
authorŁukasz Stelmach <l.stelmach@samsung.com>
Wed, 10 Jan 2024 22:30:39 +0000 (23:30 +0100)
committerŁukasz Stelmach <l.stelmach@samsung.com>
Mon, 12 Feb 2024 15:37:44 +0000 (16:37 +0100)
Change-Id: I1d9ddc87c40adffae7aaf5cd93a16d2d31309073
Signed-off-by: Łukasz Stelmach <l.stelmach@samsung.com>
1251 files changed:
.dir-locals.el
.github/CONTRIBUTING.md
.github/ISSUE_TEMPLATE.md
.gitignore
.mailmap
.mkosi/Makefile [new symlink]
.mkosi/mkosi.arch [new file with mode: 0644]
.mkosi/mkosi.debian [new file with mode: 0644]
.mkosi/mkosi.fedora [new file with mode: 0644]
CODING_STYLE
DISTRO_PORTING
ENVIRONMENT.md [new file with mode: 0644]
HACKING
Makefile-man.am
Makefile.am
NEWS
README
README.md
TODO
autogen.sh
catalog/meson.build [new file with mode: 0644]
catalog/systemd.be.catalog.in
catalog/systemd.be@latin.catalog.in
catalog/systemd.bg.catalog.in
catalog/systemd.catalog.in
catalog/systemd.da.catalog.in
catalog/systemd.fr.catalog.in
catalog/systemd.hr.catalog.in
catalog/systemd.hu.catalog.in
catalog/systemd.it.catalog.in
catalog/systemd.ko.catalog.in
catalog/systemd.pl.catalog.in
catalog/systemd.pt_BR.catalog.in
catalog/systemd.ru.catalog.in
catalog/systemd.sr.catalog.in
catalog/systemd.zh_CN.catalog.in
catalog/systemd.zh_TW.catalog.in
coccinelle/free_and_replace.cocci [new file with mode: 0644]
coccinelle/mfree_return.cocci [new file with mode: 0644]
coccinelle/strjoin.cocci [new file with mode: 0644]
configure.ac
docs/sysvinit/README.in
docs/sysvinit/meson.build [new file with mode: 0644]
docs/var-log/meson.build [new file with mode: 0644]
hwdb/20-OUI.hwdb
hwdb/20-acpi-vendor.hwdb
hwdb/20-bluetooth-vendor-product.hwdb
hwdb/20-pci-vendor-model.hwdb
hwdb/20-usb-vendor-model.hwdb
hwdb/60-evdev.hwdb
hwdb/60-keyboard.hwdb
hwdb/60-sensor.hwdb [new file with mode: 0644]
hwdb/70-joystick.hwdb [new file with mode: 0644]
hwdb/70-mouse.hwdb
hwdb/70-pointingstick.hwdb
hwdb/70-touchpad.hwdb
hwdb/acpi-update.py
hwdb/meson.build [new file with mode: 0644]
hwdb/parse_hwdb.py [new file with mode: 0755]
man/50-xdg-data-dirs.sh [new file with mode: 0755]
man/90-rearrange-path.py [new file with mode: 0755]
man/bootctl.xml
man/bootup.xml
man/busctl.xml
man/coredump.conf.xml
man/coredumpctl.xml
man/crypttab.xml
man/custom-entities.ent.in [new file with mode: 0644]
man/dnssec-trust-anchors.d.xml
man/environment.d.xml [new file with mode: 0644]
man/file-hierarchy.xml
man/hostnamectl.xml
man/hwdb.xml
man/journal-remote.conf.xml
man/journal-upload.conf.xml [new file with mode: 0644]
man/journalctl.xml
man/journald.conf.xml
man/kernel-command-line.xml
man/kernel-install.xml
man/less-variables.xml
man/locale.conf.xml
man/localectl.xml
man/loginctl.xml
man/logind.conf.xml
man/machine-id.xml
man/machine-info.xml
man/machinectl.xml
man/meson.build [new file with mode: 0644]
man/networkctl.xml
man/networkd.conf.xml
man/nss-myhostname.xml
man/nss-mymachines.xml
man/nss-resolve.xml
man/nss-systemd.xml [new file with mode: 0644]
man/pam_systemd.xml
man/resolved.conf.xml
man/rules/meson.build [new file with mode: 0644]
man/sd-bus.xml
man/sd-event.xml
man/sd-id128.xml
man/sd-journal.xml
man/sd-login.xml
man/sd_bus_add_match.xml
man/sd_bus_creds_get_pid.xml
man/sd_bus_creds_new_from_pid.xml
man/sd_bus_error.xml
man/sd_bus_error_add_map.xml
man/sd_bus_message_append.xml
man/sd_bus_negotiate_fds.xml
man/sd_bus_path_encode.xml
man/sd_bus_track_add_name.xml [new file with mode: 0644]
man/sd_bus_track_new.xml [new file with mode: 0644]
man/sd_event_add_defer.xml
man/sd_event_new.xml
man/sd_event_source_set_prepare.xml
man/sd_event_source_set_priority.xml
man/sd_get_seats.xml
man/sd_id128_get_machine.xml
man/sd_id128_randomize.xml
man/sd_is_fifo.xml
man/sd_journal_add_match.xml
man/sd_journal_enumerate_fields.xml
man/sd_journal_get_catalog.xml
man/sd_journal_get_cursor.xml
man/sd_journal_get_cutoff_realtime_usec.xml
man/sd_journal_get_data.xml
man/sd_journal_get_fd.xml
man/sd_journal_get_usage.xml
man/sd_journal_has_runtime_files.xml
man/sd_journal_next.xml
man/sd_journal_open.xml
man/sd_journal_print.xml
man/sd_journal_query_unique.xml
man/sd_journal_seek_head.xml
man/sd_journal_stream_fd.xml
man/sd_listen_fds.xml
man/sd_login_monitor_new.xml
man/sd_notify.xml
man/sd_pid_get_session.xml
man/sd_seat_get_active.xml
man/sd_session_is_active.xml
man/sd_watchdog_enabled.xml
man/standard-options.xml
man/systemctl.xml
man/systemd-analyze.xml
man/systemd-ask-password-console.service.xml
man/systemd-ask-password.xml
man/systemd-cgls.xml
man/systemd-coredump.xml
man/systemd-cryptsetup@.service.xml
man/systemd-debug-generator.xml
man/systemd-delta.xml
man/systemd-detect-virt.xml
man/systemd-environment-d-generator.xml [new file with mode: 0644]
man/systemd-escape.xml
man/systemd-firstboot.xml
man/systemd-fsck@.service.xml
man/systemd-fstab-generator.xml
man/systemd-getty-generator.xml
man/systemd-gpt-auto-generator.xml
man/systemd-hibernate-resume-generator.xml
man/systemd-hibernate-resume@.service.xml
man/systemd-hostnamed.service.xml
man/systemd-importd.service.xml
man/systemd-inhibit.xml
man/systemd-journal-gatewayd.service.xml
man/systemd-journal-remote.xml
man/systemd-localed.service.xml
man/systemd-logind.service.xml
man/systemd-machine-id-setup.xml
man/systemd-machined.service.xml
man/systemd-modules-load.service.xml
man/systemd-mount.xml [new file with mode: 0644]
man/systemd-notify.xml
man/systemd-nspawn.xml
man/systemd-remount-fs.service.xml
man/systemd-resolve.xml
man/systemd-resolved.service.xml
man/systemd-run.xml
man/systemd-socket-activate.xml
man/systemd-socket-proxyd.xml
man/systemd-suspend.service.xml
man/systemd-system.conf.xml
man/systemd-timedated.service.xml
man/systemd-timesyncd.service.xml
man/systemd-tty-ask-password-agent.xml
man/systemd-udevd.service.xml
man/systemd-vconsole-setup.service.xml
man/systemd-veritysetup-generator.xml [new file with mode: 0644]
man/systemd-veritysetup@.service.xml [new file with mode: 0644]
man/systemd-volatile-root.service.xml [new file with mode: 0644]
man/systemd.environment-generator.xml [new file with mode: 0644]
man/systemd.exec.xml
man/systemd.generator.xml
man/systemd.journal-fields.xml
man/systemd.link.xml
man/systemd.mount.xml
man/systemd.netdev.xml
man/systemd.network.xml
man/systemd.nspawn.xml
man/systemd.offline-updates.xml
man/systemd.preset.xml
man/systemd.resource-control.xml
man/systemd.scope.xml
man/systemd.service.xml
man/systemd.slice.xml
man/systemd.socket.xml
man/systemd.special.xml
man/systemd.swap.xml
man/systemd.target.xml
man/systemd.time.xml
man/systemd.timer.xml
man/systemd.unit.xml
man/systemd.xml
man/sysusers.d.xml
man/telinit.xml
man/timedatectl.xml
man/tmpfiles.d.xml
man/udev.xml
man/udevadm.xml
man/vconsole.conf.xml
meson.build [new file with mode: 0644]
meson_options.txt [new file with mode: 0644]
mkosi.build
mkosi.default [changed from file to symlink]
network/meson.build [new file with mode: 0644]
packaging/sysctl-tizen-override.conf [new file with mode: 0644]
packaging/systemd.spec
po/LINGUAS
po/ca.po [new file with mode: 0644]
po/cs.po [new file with mode: 0644]
po/hr.po
po/hu.po
po/id.po [changed mode: 0755->0644]
po/meson.build [new file with mode: 0644]
po/pl.po
po/pt_BR.po
po/sk.po [new file with mode: 0644]
po/sv.po
rules/.gitignore
rules/50-udev-default.rules.in [moved from rules/50-udev-default.rules with 94% similarity]
rules/60-cdrom_id.rules
rules/60-drm.rules
rules/60-evdev.rules
rules/60-input-id.rules [new file with mode: 0644]
rules/60-persistent-input.rules
rules/60-persistent-storage.rules
rules/60-sensor.rules [new file with mode: 0644]
rules/70-joystick.rules [new file with mode: 0644]
rules/78-sound-card.rules
rules/99-systemd.rules.in
rules/meson.build [new file with mode: 0644]
shell-completion/bash/coredumpctl
shell-completion/bash/hostnamectl
shell-completion/bash/journalctl
shell-completion/bash/meson.build [new file with mode: 0644]
shell-completion/bash/networkctl
shell-completion/bash/systemctl.in
shell-completion/bash/systemd-analyze
shell-completion/bash/systemd-resolve
shell-completion/bash/systemd-run
shell-completion/zsh/_coredumpctl
shell-completion/zsh/_hostnamectl
shell-completion/zsh/_journalctl
shell-completion/zsh/_networkctl
shell-completion/zsh/_sd_outputmodes
shell-completion/zsh/_systemctl.in
shell-completion/zsh/_systemd-analyze
shell-completion/zsh/_systemd-run
shell-completion/zsh/meson.build [new file with mode: 0644]
src/activate/activate.c
src/analyze/analyze-verify.c
src/analyze/analyze.c
src/analyze/meson.build [new file with mode: 0644]
src/backlight/backlight.c
src/basic/MurmurHash2.c
src/basic/af-list.c
src/basic/af-to-name.awk [new file with mode: 0644]
src/basic/alloc-util.h
src/basic/architecture.c
src/basic/architecture.h
src/basic/arphrd-list.c
src/basic/arphrd-to-name.awk [new file with mode: 0644]
src/basic/audit-util.c
src/basic/bitmap.c
src/basic/blkid-util.h
src/basic/btrfs-util.c
src/basic/btrfs-util.h
src/basic/build.h
src/basic/calendarspec.c
src/basic/calendarspec.h
src/basic/cap-list.c
src/basic/cap-to-name.awk [new file with mode: 0644]
src/basic/capability-util.c
src/basic/cgroup-util.c
src/basic/cgroup-util.h
src/basic/conf-files.c
src/basic/copy.c
src/basic/copy.h
src/basic/def.h
src/basic/dirent-util.c
src/basic/dirent-util.h
src/basic/env-util.c
src/basic/env-util.h
src/basic/errno-list.c
src/basic/errno-to-name.awk [new file with mode: 0644]
src/basic/escape.c
src/basic/escape.h
src/basic/exec-util.c [new file with mode: 0644]
src/basic/exec-util.h [new file with mode: 0644]
src/basic/exit-status.c
src/basic/exit-status.h
src/basic/extract-word.c
src/basic/extract-word.h
src/basic/fd-util.c
src/basic/fileio-label.c
src/basic/fileio-label.h
src/basic/fileio.c
src/basic/fileio.h
src/basic/format-util.h [moved from src/basic/formats-util.h with 94% similarity]
src/basic/fs-util.c
src/basic/fs-util.h
src/basic/generate-af-list.sh [new file with mode: 0755]
src/basic/generate-arphrd-list.sh [new file with mode: 0755]
src/basic/generate-cap-list.sh [new file with mode: 0755]
src/basic/generate-errno-list.sh [new file with mode: 0755]
src/basic/generate-gperfs.py [new file with mode: 0755]
src/basic/glob-util.c
src/basic/glob-util.h
src/basic/gunicode.c
src/basic/hexdecoct.c
src/basic/hostname-util.c
src/basic/in-addr-util.c
src/basic/in-addr-util.h
src/basic/journal-importer.c [new file with mode: 0644]
src/basic/journal-importer.h [new file with mode: 0644]
src/basic/khash.c [new file with mode: 0644]
src/basic/khash.h [new file with mode: 0644]
src/basic/list.h
src/basic/log.c
src/basic/log.h
src/basic/macro.h
src/basic/meson.build [new file with mode: 0644]
src/basic/missing.h
src/basic/missing_syscall.h
src/basic/mount-util.c
src/basic/mount-util.h
src/basic/parse-util.c
src/basic/parse-util.h
src/basic/path-util.c
src/basic/path-util.h
src/basic/prioq.c
src/basic/proc-cmdline.c
src/basic/proc-cmdline.h
src/basic/process-util.c
src/basic/process-util.h
src/basic/random-util.c
src/basic/random-util.h
src/basic/raw-clone.h
src/basic/replace-var.c
src/basic/rlimit-util.c
src/basic/rm-rf.c
src/basic/rm-rf.h
src/basic/selinux-util.c
src/basic/selinux-util.h
src/basic/set.h
src/basic/siphash24.c
src/basic/socket-util.c
src/basic/socket-util.h
src/basic/sparse-endian.h
src/basic/special.h
src/basic/stat-util.c
src/basic/stat-util.h
src/basic/strbuf.c
src/basic/string-util.c
src/basic/string-util.h
src/basic/strv.c
src/basic/strv.h
src/basic/strxcpyx.c
src/basic/terminal-util.c
src/basic/terminal-util.h
src/basic/time-util.c
src/basic/time-util.h
src/basic/unit-name.c
src/basic/unit-name.h
src/basic/user-util.c
src/basic/user-util.h
src/basic/util.c
src/basic/util.h
src/basic/virt.c
src/basic/virt.h
src/boot/bootctl.c
src/boot/efi/boot.c
src/boot/efi/measure.c
src/boot/efi/measure.h
src/boot/efi/meson.build [new file with mode: 0644]
src/boot/efi/no-undefined-symbols.sh [new file with mode: 0755]
src/boot/efi/pe.c [moved from src/boot/efi/pefile.c with 60% similarity]
src/boot/efi/pe.h [moved from src/boot/efi/pefile.h with 67% similarity]
src/boot/efi/shim.c [new file with mode: 0644]
src/boot/efi/shim.h [new file with mode: 0644]
src/boot/efi/stub.c
src/busctl/busctl-introspect.c [moved from src/libsystemd/sd-bus/busctl-introspect.c with 92% similarity]
src/busctl/busctl-introspect.h [moved from src/libsystemd/sd-bus/busctl-introspect.h with 100% similarity]
src/busctl/busctl.c [moved from src/libsystemd/sd-bus/busctl.c with 99% similarity]
src/cgls/cgls.c
src/cgtop/cgtop.c
src/core/audit-fd.c
src/core/automount.c
src/core/busname.c
src/core/cgroup.c
src/core/cgroup.h
src/core/dbus-automount.c
src/core/dbus-automount.h
src/core/dbus-cgroup.c
src/core/dbus-execute.c
src/core/dbus-job.c
src/core/dbus-job.h
src/core/dbus-manager.c
src/core/dbus-manager.h
src/core/dbus-mount.c
src/core/dbus-service.c
src/core/dbus-socket.c
src/core/dbus-swap.c
src/core/dbus-timer.c
src/core/dbus-unit.c
src/core/dbus-unit.h
src/core/dbus.c
src/core/dbus.h
src/core/device.c
src/core/device.h
src/core/dynamic-user.c [new file with mode: 0644]
src/core/dynamic-user.h [new file with mode: 0644]
src/core/emergency-action.c [moved from src/core/failure-action.c with 60% similarity]
src/core/emergency-action.h [moved from src/core/failure-action.h with 56% similarity]
src/core/execute.c
src/core/execute.h
src/core/hostname-setup.c
src/core/ima-setup.c
src/core/job.c
src/core/job.h
src/core/killall.c
src/core/load-dropin.c
src/core/load-dropin.h
src/core/load-fragment-gperf-nulstr.awk [new file with mode: 0644]
src/core/load-fragment-gperf.gperf.m4
src/core/load-fragment.c
src/core/load-fragment.h
src/core/locale-setup.c
src/core/loopback-setup.c
src/core/machine-id-setup.c
src/core/macros.systemd.in
src/core/main.c
src/core/manager.c
src/core/manager.h
src/core/meson.build [new file with mode: 0644]
src/core/mount-setup.c
src/core/mount.c
src/core/mount.h
src/core/namespace.c
src/core/namespace.h
src/core/org.freedesktop.systemd1.conf
src/core/path.c
src/core/scope.c
src/core/selinux-access.c
src/core/selinux-access.h
src/core/service.c
src/core/service.h
src/core/show-status.c
src/core/shutdown.c
src/core/slice.c
src/core/smack-setup.c
src/core/socket.c
src/core/socket.h
src/core/swap.c
src/core/swap.h
src/core/system.conf
src/core/target.c
src/core/timer.c
src/core/timer.h
src/core/transaction.c
src/core/triggers.systemd.in
src/core/umount.c
src/core/unit-printf.c
src/core/unit.c
src/core/unit.h
src/coredump/coredump.c
src/coredump/coredumpctl.c
src/coredump/meson.build [new file with mode: 0644]
src/coredump/stacktrace.c
src/cryptsetup/cryptsetup-generator.c
src/cryptsetup/cryptsetup.c
src/debug-generator/debug-generator.c
src/delta/delta.c
src/detect-virt/detect-virt.c
src/dissect/Makefile [new symlink]
src/dissect/dissect.c [new file with mode: 0644]
src/environment-d-generator/Makefile [new symlink]
src/environment-d-generator/environment-d-generator.c [new file with mode: 0644]
src/escape/escape.c
src/firstboot/firstboot.c
src/fsck/fsck.c
src/fstab-generator/fstab-generator.c
src/gpt-auto-generator/gpt-auto-generator.c
src/hibernate-resume/hibernate-resume-generator.c
src/hostname/hostnamectl.c
src/hostname/hostnamed.c
src/hostname/meson.build [new file with mode: 0644]
src/hwdb/hwdb.c
src/import/curl-util.c
src/import/export-raw.c
src/import/export-tar.c
src/import/import-raw.c
src/import/import-tar.c
src/import/importd.c
src/import/meson.build [new file with mode: 0644]
src/import/pull-common.c
src/import/pull-common.h
src/import/pull-job.c
src/import/pull-job.h
src/import/pull-raw.c
src/import/pull-raw.h
src/import/pull-tar.c
src/import/pull.c
src/initctl/initctl.c
src/journal-remote/journal-gatewayd.c
src/journal-remote/journal-remote-parse.c
src/journal-remote/journal-remote-parse.h
src/journal-remote/journal-remote-write.c
src/journal-remote/journal-remote-write.h
src/journal-remote/journal-remote.c
src/journal-remote/journal-upload-journal.c
src/journal-remote/journal-upload.c
src/journal-remote/log-generator.py
src/journal-remote/meson.build [new file with mode: 0644]
src/journal-remote/microhttpd-util.c
src/journal-remote/microhttpd-util.h
src/journal/.gitignore
src/journal/audit_type-to-name.awk [new file with mode: 0644]
src/journal/compress.c
src/journal/fsprg.c
src/journal/generate-audit_type-list.sh [new file with mode: 0755]
src/journal/journal-file.c
src/journal/journal-file.h
src/journal/journal-qrcode.c
src/journal/journal-vacuum.c
src/journal/journal-verify.c
src/journal/journalctl.c
src/journal/journald-console.c
src/journal/journald-gperf.gperf
src/journal/journald-kmsg.c
src/journal/journald-native.c
src/journal/journald-native.h
src/journal/journald-rate-limit.c
src/journal/journald-server.c
src/journal/journald-server.h
src/journal/journald-stream.c
src/journal/journald-syslog.c
src/journal/journald-wall.c
src/journal/journald.c
src/journal/lookup3.c
src/journal/meson.build [new file with mode: 0644]
src/journal/mmap-cache.c
src/journal/mmap-cache.h
src/journal/sd-journal.c
src/journal/test-catalog.c
src/journal/test-compress-benchmark.c
src/journal/test-compress.c
src/journal/test-journal-interleaving.c
src/journal/test-mmap-cache.c
src/kernel-install/50-depmod.install
src/kernel-install/90-loaderentry.install
src/kernel-install/kernel-install
src/kernel-install/meson.build [new file with mode: 0644]
src/libsystemd-network/arp-util.c
src/libsystemd-network/dhcp-internal.h
src/libsystemd-network/dhcp-lease-internal.h
src/libsystemd-network/dhcp-network.c
src/libsystemd-network/dhcp-packet.c
src/libsystemd-network/dhcp6-option.c
src/libsystemd-network/icmp6-util.c
src/libsystemd-network/icmp6-util.h
src/libsystemd-network/lldp-neighbor.c
src/libsystemd-network/lldp-network.c
src/libsystemd-network/meson.build [new file with mode: 0644]
src/libsystemd-network/ndisc-internal.h
src/libsystemd-network/ndisc-router.c
src/libsystemd-network/network-internal.c
src/libsystemd-network/network-internal.h
src/libsystemd-network/radv-internal.h [new file with mode: 0644]
src/libsystemd-network/sd-dhcp-client.c
src/libsystemd-network/sd-dhcp-lease.c
src/libsystemd-network/sd-dhcp-server.c
src/libsystemd-network/sd-dhcp6-client.c
src/libsystemd-network/sd-dhcp6-lease.c
src/libsystemd-network/sd-ipv4acd.c
src/libsystemd-network/sd-ipv4ll.c
src/libsystemd-network/sd-lldp.c
src/libsystemd-network/sd-ndisc.c
src/libsystemd-network/sd-radv.c [new file with mode: 0644]
src/libsystemd-network/test-dhcp-client.c
src/libsystemd-network/test-dhcp-server.c
src/libsystemd-network/test-ipv4ll.c
src/libsystemd-network/test-lldp.c
src/libsystemd-network/test-ndisc-ra.c [new file with mode: 0644]
src/libsystemd-network/test-ndisc-rs.c
src/libsystemd-network/test-sd-dhcp-lease.c [new file with mode: 0644]
src/libsystemd/libsystemd.pc.in
src/libsystemd/libsystemd.sym
src/libsystemd/meson.build [new file with mode: 0644]
src/libsystemd/sd-bus/DIFFERENCES [deleted file]
src/libsystemd/sd-bus/GVARIANT-SERIALIZATION
src/libsystemd/sd-bus/PORTING-DBUS1 [deleted file]
src/libsystemd/sd-bus/bus-common-errors.c
src/libsystemd/sd-bus/bus-common-errors.h
src/libsystemd/sd-bus/bus-control.c
src/libsystemd/sd-bus/bus-creds.c
src/libsystemd/sd-bus/bus-dump.c
src/libsystemd/sd-bus/bus-error.c
src/libsystemd/sd-bus/bus-internal.h
src/libsystemd/sd-bus/bus-kernel.c
src/libsystemd/sd-bus/bus-objects.c
src/libsystemd/sd-bus/bus-slot.c
src/libsystemd/sd-bus/bus-socket.c
src/libsystemd/sd-bus/bus-track.c
src/libsystemd/sd-bus/bus-track.h
src/libsystemd/sd-bus/sd-bus.c
src/libsystemd/sd-bus/test-bus-chat.c
src/libsystemd/sd-bus/test-bus-creds.c
src/libsystemd/sd-bus/test-bus-objects.c
src/libsystemd/sd-bus/test-bus-track.c [new file with mode: 0644]
src/libsystemd/sd-bus/test-bus-vtable-cc.cc [new symlink]
src/libsystemd/sd-bus/test-bus-vtable.c [new file with mode: 0644]
src/libsystemd/sd-daemon/sd-daemon.c
src/libsystemd/sd-device/device-enumerator.c
src/libsystemd/sd-device/device-internal.h
src/libsystemd/sd-device/device-private.c
src/libsystemd/sd-device/sd-device.c
src/libsystemd/sd-event/sd-event.c
src/libsystemd/sd-event/test-event.c
src/libsystemd/sd-hwdb/hwdb-internal.h
src/libsystemd/sd-hwdb/sd-hwdb.c
src/libsystemd/sd-id128/id128-util.c
src/libsystemd/sd-id128/id128-util.h
src/libsystemd/sd-id128/sd-id128.c
src/libsystemd/sd-login/sd-login.c
src/libsystemd/sd-login/test-login.c
src/libsystemd/sd-netlink/netlink-message.c
src/libsystemd/sd-netlink/netlink-socket.c
src/libsystemd/sd-netlink/netlink-types.c
src/libsystemd/sd-netlink/netlink-types.h
src/libsystemd/sd-netlink/netlink-util.c
src/libsystemd/sd-netlink/netlink-util.h
src/libsystemd/sd-netlink/rtnl-message.c
src/libsystemd/sd-netlink/sd-netlink.c
src/libsystemd/sd-network/sd-network.c
src/libsystemd/sd-path/sd-path.c
src/libudev/libudev-device.c
src/libudev/libudev-list.c
src/libudev/libudev-monitor.c
src/libudev/libudev-util.c
src/libudev/libudev.c
src/libudev/libudev.pc.in
src/libudev/meson.build [new file with mode: 0644]
src/locale/keymap-util.c
src/locale/localectl.c
src/locale/localed.c
src/locale/meson.build [new file with mode: 0644]
src/login/70-power-switch.rules
src/login/inhibit.c
src/login/loginctl.c
src/login/logind-acl.c
src/login/logind-action.c
src/login/logind-button.c
src/login/logind-core.c
src/login/logind-dbus.c
src/login/logind-device.c
src/login/logind-inhibit.c
src/login/logind-seat.c
src/login/logind-session-dbus.c
src/login/logind-session-device.c
src/login/logind-session-device.h
src/login/logind-session.c
src/login/logind-session.h
src/login/logind-user-dbus.c
src/login/logind-user.c
src/login/logind-utmp.c
src/login/logind.c
src/login/logind.h
src/login/meson.build [new file with mode: 0644]
src/login/pam_systemd.c
src/login/systemd-user.m4
src/machine-id-setup/machine-id-setup-main.c
src/machine/image-dbus.c
src/machine/image-dbus.h
src/machine/machine-dbus.c
src/machine/machine-dbus.h
src/machine/machine.c
src/machine/machine.h
src/machine/machinectl.c
src/machine/machined-dbus.c
src/machine/machined.c
src/machine/meson.build [new file with mode: 0644]
src/machine/operation.c
src/machine/org.freedesktop.machine1.conf
src/modules-load/modules-load.c
src/mount/Makefile [new symlink]
src/mount/mount-tool.c [new file with mode: 0644]
src/network/.gitignore
src/network/meson.build [new file with mode: 0644]
src/network/netdev/.gitignore [new file with mode: 0644]
src/network/netdev/Makefile [new symlink]
src/network/netdev/bond.c [moved from src/network/networkd-netdev-bond.c with 98% similarity]
src/network/netdev/bond.h [moved from src/network/networkd-netdev-bond.h with 99% similarity]
src/network/netdev/bridge.c [moved from src/network/networkd-netdev-bridge.c with 78% similarity]
src/network/netdev/bridge.h [moved from src/network/networkd-netdev-bridge.h with 88% similarity]
src/network/netdev/dummy.c [moved from src/network/networkd-netdev-dummy.c with 96% similarity]
src/network/netdev/dummy.h [moved from src/network/networkd-netdev-dummy.h with 96% similarity]
src/network/netdev/geneve.c [new file with mode: 0644]
src/network/netdev/geneve.h [new file with mode: 0644]
src/network/netdev/ipvlan.c [moved from src/network/networkd-netdev-ipvlan.c with 98% similarity]
src/network/netdev/ipvlan.h [moved from src/network/networkd-netdev-ipvlan.h with 98% similarity]
src/network/netdev/macvlan.c [moved from src/network/networkd-netdev-macvlan.c with 98% similarity]
src/network/netdev/macvlan.h [moved from src/network/networkd-netdev-macvlan.h with 98% similarity]
src/network/netdev/netdev-gperf.gperf [new file with mode: 0644]
src/network/netdev/netdev.c [moved from src/network/networkd-netdev.c with 94% similarity]
src/network/netdev/netdev.h [moved from src/network/networkd-netdev.h with 96% similarity]
src/network/netdev/tunnel.c [moved from src/network/networkd-netdev-tunnel.c with 90% similarity]
src/network/netdev/tunnel.h [moved from src/network/networkd-netdev-tunnel.h with 99% similarity]
src/network/netdev/tuntap.c [moved from src/network/networkd-netdev-tuntap.c with 99% similarity]
src/network/netdev/tuntap.h [moved from src/network/networkd-netdev-tuntap.h with 97% similarity]
src/network/netdev/vcan.c [new file with mode: 0644]
src/network/netdev/vcan.h [new file with mode: 0644]
src/network/netdev/veth.c [moved from src/network/networkd-netdev-veth.c with 98% similarity]
src/network/netdev/veth.h [moved from src/network/networkd-netdev-veth.h with 97% similarity]
src/network/netdev/vlan.c [moved from src/network/networkd-netdev-vlan.c with 65% similarity]
src/network/netdev/vlan.h [moved from src/network/networkd-netdev-vlan.h with 88% similarity]
src/network/netdev/vrf.c [moved from src/network/networkd-netdev-vrf.c with 97% similarity]
src/network/netdev/vrf.h [moved from src/network/networkd-netdev-vrf.h with 96% similarity]
src/network/netdev/vxlan.c [moved from src/network/networkd-netdev-vxlan.c with 70% similarity]
src/network/netdev/vxlan.h [moved from src/network/networkd-netdev-vxlan.h with 59% similarity]
src/network/networkctl.c
src/network/networkd-address-label.c [new file with mode: 0644]
src/network/networkd-address-label.h [new file with mode: 0644]
src/network/networkd-address-pool.c
src/network/networkd-address.c
src/network/networkd-address.h
src/network/networkd-brvlan.c
src/network/networkd-brvlan.h
src/network/networkd-conf.c
src/network/networkd-conf.h
src/network/networkd-dhcp4.c
src/network/networkd-dhcp6.c
src/network/networkd-fdb.c
src/network/networkd-gperf.gperf
src/network/networkd-ipv4ll.c
src/network/networkd-ipv6-proxy-ndp.c [new file with mode: 0644]
src/network/networkd-ipv6-proxy-ndp.h [new file with mode: 0644]
src/network/networkd-link-bus.c
src/network/networkd-link.c
src/network/networkd-link.h
src/network/networkd-lldp-tx.c
src/network/networkd-manager-bus.c
src/network/networkd-manager.c
src/network/networkd-manager.h [moved from src/network/networkd.h with 85% similarity]
src/network/networkd-ndisc.c
src/network/networkd-ndisc.h
src/network/networkd-netdev-gperf.gperf [deleted file]
src/network/networkd-network-bus.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h
src/network/networkd-radv.c [new file with mode: 0644]
src/network/networkd-radv.h [new file with mode: 0644]
src/network/networkd-route.c
src/network/networkd-route.h
src/network/networkd.c
src/network/systemd-networkd.pkla [new file with mode: 0644]
src/network/systemd-networkd.rules [new file with mode: 0644]
src/network/test-network-tables.c
src/network/test-network.c
src/network/wait-online/Makefile [new symlink]
src/network/wait-online/link.c [moved from src/network/networkd-wait-online-link.c with 97% similarity]
src/network/wait-online/link.h [moved from src/network/networkd-wait-online-link.h with 95% similarity]
src/network/wait-online/manager.c [moved from src/network/networkd-wait-online-manager.c with 99% similarity]
src/network/wait-online/manager.h [moved from src/network/networkd-wait-online.h with 97% similarity]
src/network/wait-online/wait-online.c [moved from src/network/networkd-wait-online.c with 99% similarity]
src/notify/notify.c
src/nspawn/meson.build [new file with mode: 0644]
src/nspawn/nspawn-cgroup.c
src/nspawn/nspawn-cgroup.h
src/nspawn/nspawn-expose-ports.c
src/nspawn/nspawn-gperf.gperf
src/nspawn/nspawn-mount.c
src/nspawn/nspawn-mount.h
src/nspawn/nspawn-network.c
src/nspawn/nspawn-patch-uid.c
src/nspawn/nspawn-register.c
src/nspawn/nspawn-register.h
src/nspawn/nspawn-seccomp.c
src/nspawn/nspawn-settings.c
src/nspawn/nspawn-settings.h
src/nspawn/nspawn-stub-pid1.c
src/nspawn/nspawn-stub-pid1.h
src/nspawn/nspawn.c
src/nss-myhostname/nss-myhostname.c
src/nss-mymachines/nss-mymachines.c
src/nss-resolve/nss-resolve.c
src/nss-systemd/Makefile [new symlink]
src/nss-systemd/nss-systemd.c [new file with mode: 0644]
src/nss-systemd/nss-systemd.sym [new file with mode: 0644]
src/quotacheck/quotacheck.c
src/rc-local-generator/rc-local-generator.c
src/remount-fs/remount-fs.c
src/reply-password/reply-password.c
src/resolve/dns-type.c
src/resolve/dns_type-to-name.awk [new file with mode: 0644]
src/resolve/generate-dns_type-gperf.py [new file with mode: 0755]
src/resolve/generate-dns_type-list.sed [new file with mode: 0644]
src/resolve/meson.build [new file with mode: 0644]
src/resolve/resolve-tool.c
src/resolve/resolved-bus.c
src/resolve/resolved-conf.c
src/resolve/resolved-conf.h
src/resolve/resolved-dns-answer.c
src/resolve/resolved-dns-answer.h
src/resolve/resolved-dns-cache.c
src/resolve/resolved-dns-dnssec.c
src/resolve/resolved-dns-packet.c
src/resolve/resolved-dns-packet.h
src/resolve/resolved-dns-query.c
src/resolve/resolved-dns-query.h
src/resolve/resolved-dns-question.c
src/resolve/resolved-dns-rr.c
src/resolve/resolved-dns-scope.c
src/resolve/resolved-dns-scope.h
src/resolve/resolved-dns-search-domain.c
src/resolve/resolved-dns-server.c
src/resolve/resolved-dns-server.h
src/resolve/resolved-dns-stream.c
src/resolve/resolved-dns-stream.h
src/resolve/resolved-dns-stub.c
src/resolve/resolved-dns-stub.h
src/resolve/resolved-dns-transaction.c
src/resolve/resolved-dns-transaction.h
src/resolve/resolved-dns-trust-anchor.c
src/resolve/resolved-dns-zone.c
src/resolve/resolved-dns-zone.h
src/resolve/resolved-etc-hosts.c
src/resolve/resolved-gperf.gperf
src/resolve/resolved-link-bus.c
src/resolve/resolved-link.c
src/resolve/resolved-link.h
src/resolve/resolved-llmnr.c
src/resolve/resolved-manager.c
src/resolve/resolved-manager.h
src/resolve/resolved-mdns.c
src/resolve/resolved-mdns.h
src/resolve/resolved-resolv-conf.c
src/resolve/resolved.c
src/resolve/resolved.conf.in
src/resolve/test-dns-packet.c
src/resolve/test-dnssec-complex.c
src/resolve/test-resolved-packet.c [new file with mode: 0644]
src/rfkill/rfkill.c
src/run/run.c
src/shared/acl-util.c
src/shared/ask-password-api.c
src/shared/base-filesystem.c
src/shared/bus-unit-util.c
src/shared/bus-unit-util.h
src/shared/bus-util.c
src/shared/bus-util.h
src/shared/cgroup-show.c
src/shared/cgroup-show.h
src/shared/clean-ipc.c
src/shared/clean-ipc.h
src/shared/condition.c
src/shared/condition.h
src/shared/conf-parser.c
src/shared/conf-parser.h
src/shared/dissect-image.c [new file with mode: 0644]
src/shared/dissect-image.h [new file with mode: 0644]
src/shared/dns-domain.c
src/shared/dns-domain.h
src/shared/dropin.c
src/shared/dropin.h
src/shared/efivars.c
src/shared/fdset.c
src/shared/firewall-util.c
src/shared/fstab-util.c
src/shared/fstab-util.h
src/shared/gcrypt-util.h
src/shared/generator.c
src/shared/generator.h
src/shared/gpt.h
src/shared/install-printf.c
src/shared/install.c
src/shared/install.h
src/shared/journal-util.c [new file with mode: 0644]
src/shared/journal-util.h [new file with mode: 0644]
src/shared/linux-3.13/dm-ioctl.h [new file with mode: 0644]
src/shared/logs-show.c
src/shared/loop-util.c [new file with mode: 0644]
src/shared/loop-util.h [new file with mode: 0644]
src/shared/machine-image.c
src/shared/machine-pool.c
src/shared/meson.build [new file with mode: 0644]
src/shared/nsflags.c [new file with mode: 0644]
src/shared/nsflags.h [new file with mode: 0644]
src/shared/output-mode.c
src/shared/output-mode.h
src/shared/pager.c
src/shared/path-lookup.c
src/shared/ptyfwd.c
src/shared/ptyfwd.h
src/shared/seccomp-util.c
src/shared/seccomp-util.h
src/shared/sleep-config.c
src/shared/switch-root.c
src/shared/tests.c
src/shared/tests.h
src/shared/udev-util.c [new file with mode: 0644]
src/shared/udev-util.h
src/shared/vlan-util.c
src/shared/vlan-util.h
src/shared/volatile-util.c [new file with mode: 0644]
src/shared/volatile-util.h [new file with mode: 0644]
src/sleep/sleep.c
src/socket-proxy/socket-proxyd.c
src/stdio-bridge/stdio-bridge.c
src/sulogin-shell/.gitignore [new file with mode: 0644]
src/sulogin-shell/meson.build [new file with mode: 0644]
src/sulogin-shell/systemd-sulogin-shell.in [new file with mode: 0755]
src/sysctl/sysctl.c
src/system-update-generator/system-update-generator.c
src/systemctl/systemctl.c
src/systemd/_sd-common.h
src/systemd/meson.build [new file with mode: 0644]
src/systemd/sd-bus-vtable.h
src/systemd/sd-bus.h
src/systemd/sd-daemon.h
src/systemd/sd-dhcp-client.h
src/systemd/sd-dhcp-lease.h
src/systemd/sd-event.h
src/systemd/sd-id128.h
src/systemd/sd-ipv4ll.h
src/systemd/sd-messages.h
src/systemd/sd-netlink.h
src/systemd/sd-radv.h [new file with mode: 0644]
src/sysusers/sysusers.c
src/sysv-generator/sysv-generator.c
src/test/generate-sym-test.py [new file with mode: 0755]
src/test/meson.build [new file with mode: 0644]
src/test/test-acl-util.c
src/test/test-af-list.c
src/test/test-arphrd-list.c
src/test/test-async.c
src/test/test-calendarspec.c
src/test/test-cgroup-mask.c
src/test/test-cgroup-util.c
src/test/test-clock.c
src/test/test-condition.c
src/test/test-conf-files.c
src/test/test-conf-parser.c
src/test/test-copy.c
src/test/test-date.c
src/test/test-dissect-image.c [new file with mode: 0644]
src/test/test-dlopen.c [new file with mode: 0644]
src/test/test-dns-domain.c
src/test/test-engine.c
src/test/test-env-util.c
src/test/test-escape.c
src/test/test-exec-util.c [new file with mode: 0644]
src/test/test-execute.c
src/test/test-fd-util.c
src/test/test-fdset.c
src/test/test-fileio.c
src/test/test-fs-util.c
src/test/test-glob-util.c
src/test/test-hash.c [new file with mode: 0644]
src/test/test-hashmap-ordered.awk [new file with mode: 0644]
src/test/test-hexdecoct.c
src/test/test-hostname-util.c
src/test/test-id128.c
src/test/test-install-root.c
src/test/test-install.c
src/test/test-ipcrm.c
src/test/test-journal-importer.c [new file with mode: 0644]
src/test/test-libudev.c
src/test/test-list.c
src/test/test-log.c
src/test/test-loopback.c
src/test/test-mount-util.c [new file with mode: 0644]
src/test/test-namespace.c
src/test/test-ns.c
src/test/test-nss.c
src/test/test-parse-util.c
src/test/test-path-util.c
src/test/test-path.c
src/test/test-proc-cmdline.c
src/test/test-process-util.c
src/test/test-random-util.c [new file with mode: 0644]
src/test/test-replace-var.c
src/test/test-sched-prio.c
src/test/test-seccomp.c [new file with mode: 0644]
src/test/test-selinux.c
src/test/test-sigbus.c
src/test/test-sizeof.c
src/test/test-socket-util.c
src/test/test-stat-util.c
src/test/test-string-util.c
src/test/test-strv.c
src/test/test-strxcpyx.c
src/test/test-tables.c
src/test/test-terminal-util.c
src/test/test-time.c
src/test/test-tmpfiles.c
src/test/test-udev.c
src/test/test-unit-file.c
src/test/test-user-util.c
src/test/test-util.c
src/timedate/meson.build [new file with mode: 0644]
src/timedate/timedatectl.c
src/timedate/timedated.c
src/timesync/meson.build [new file with mode: 0644]
src/timesync/test-timesync.c [new file with mode: 0644]
src/timesync/timesyncd-conf.c
src/timesync/timesyncd-conf.h
src/timesync/timesyncd-manager.c
src/timesync/timesyncd-manager.h
src/timesync/timesyncd-server.c
src/timesync/timesyncd.c
src/tmpfiles/tmpfiles.c
src/tty-ask-password-agent/tty-ask-password-agent.c
src/udev/ata_id/ata_id.c
src/udev/cdrom_id/cdrom_id.c
src/udev/collect/collect.c
src/udev/generate-keyboard-keys-gperf.sh [new file with mode: 0755]
src/udev/generate-keyboard-keys-list.sh [new file with mode: 0755]
src/udev/meson.build [new file with mode: 0644]
src/udev/net/ethtool-util.c
src/udev/net/ethtool-util.h
src/udev/net/link-config-gperf.gperf
src/udev/net/link-config.c
src/udev/net/link-config.h
src/udev/scsi_id/scsi_id.c
src/udev/udev-builtin-blkid.c
src/udev/udev-builtin-hwdb.c
src/udev/udev-builtin-input_id.c
src/udev/udev-builtin-keyboard.c
src/udev/udev-builtin-net_id.c
src/udev/udev-builtin-path_id.c
src/udev/udev-ctrl.c
src/udev/udev-event.c
src/udev/udev-node.c
src/udev/udev-rules.c
src/udev/udev-watch.c
src/udev/udev.h
src/udev/udev.pc.in
src/udev/udevadm-control.c
src/udev/udevadm-hwdb.c
src/udev/udevadm-info.c
src/udev/udevadm-monitor.c
src/udev/udevadm-test.c
src/udev/udevadm.c
src/udev/udevd.c
src/update-done/update-done.c
src/update-utmp/update-utmp.c
src/vconsole/90-vconsole.rules.in
src/vconsole/meson.build [new file with mode: 0644]
src/vconsole/vconsole-setup.c
src/veritysetup/Makefile [new symlink]
src/veritysetup/veritysetup-generator.c [new file with mode: 0644]
src/veritysetup/veritysetup.c [new file with mode: 0644]
src/volatile-root/Makefile [new symlink]
src/volatile-root/volatile-root.c [new file with mode: 0644]
sysctl.d/50-default.conf
sysctl.d/meson.build [new file with mode: 0644]
system-preset/90-systemd.preset
sysusers.d/basic.conf.in
sysusers.d/meson.build [new file with mode: 0644]
test/README.testsuite
test/TEST-03-JOBS/test-jobs.sh
test/TEST-04-JOURNAL/test-journal.sh
test/TEST-12-ISSUE-3171/test.sh
test/TEST-13-NSPAWN-SMOKE/Makefile [new file with mode: 0644]
test/TEST-13-NSPAWN-SMOKE/create-busybox-container [new file with mode: 0755]
test/TEST-13-NSPAWN-SMOKE/test.sh [new file with mode: 0755]
test/TEST-14-MACHINE-ID/Makefile [new file with mode: 0644]
test/TEST-14-MACHINE-ID/test.sh [new file with mode: 0755]
test/TEST-15-DROPIN/Makefile [new symlink]
test/TEST-15-DROPIN/test-dropin.sh [new file with mode: 0755]
test/TEST-15-DROPIN/test.sh [new file with mode: 0755]
test/TEST-15-DROPIN/testsuite.service [new file with mode: 0644]
test/create-sys-script.py [new file with mode: 0755]
test/hwdb-test.sh [new file with mode: 0755]
test/hwdb/10-bad.hwdb [new file with mode: 0644]
test/journal-data/journal-1.txt [new file with mode: 0644]
test/journal-data/journal-2.txt [new file with mode: 0644]
test/meson.build [new file with mode: 0644]
test/networkd-test.py
test/rule-syntax-check.py [changed mode: 0644->0755]
test/sys-script.py [new file with mode: 0755]
test/sys.tar.xz [deleted file]
test/sysv-generator-test.py
test/test-efi-create-disk.sh
test/test-exec-deserialization.py [new file with mode: 0755]
test/test-execute/exec-dynamicuser-fixeduser-one-supplementarygroup.service [new file with mode: 0644]
test/test-execute/exec-dynamicuser-fixeduser.service [new file with mode: 0644]
test/test-execute/exec-dynamicuser-supplementarygroups.service [new file with mode: 0644]
test/test-execute/exec-inaccessiblepaths-mount-propagation.service [new file with mode: 0644]
test/test-execute/exec-inaccessiblepaths-proc.service [new file with mode: 0644]
test/test-execute/exec-personality-aarch64.service [new file with mode: 0644]
test/test-execute/exec-personality-ppc64.service [new file with mode: 0644]
test/test-execute/exec-personality-ppc64le.service [new file with mode: 0644]
test/test-execute/exec-privatedevices-no-capability-mknod.service [new file with mode: 0644]
test/test-execute/exec-privatedevices-no-capability-sys-rawio.service [new file with mode: 0644]
test/test-execute/exec-privatedevices-no.service
test/test-execute/exec-privatedevices-yes-capability-mknod.service [new file with mode: 0644]
test/test-execute/exec-privatedevices-yes-capability-sys-rawio.service [new file with mode: 0644]
test/test-execute/exec-privatedevices-yes.service
test/test-execute/exec-protectkernelmodules-no-capabilities.service [new file with mode: 0644]
test/test-execute/exec-protectkernelmodules-yes-capabilities.service [new file with mode: 0644]
test/test-execute/exec-protectkernelmodules-yes-mount-propagation.service [new file with mode: 0644]
test/test-execute/exec-read-only-path-succeed.service [new file with mode: 0644]
test/test-execute/exec-readonlypaths-mount-propagation.service [new file with mode: 0644]
test/test-execute/exec-readonlypaths.service [new file with mode: 0644]
test/test-execute/exec-readwritepaths-mount-propagation.service [new file with mode: 0644]
test/test-execute/exec-restrict-namespaces-mnt-blacklist.service [new file with mode: 0644]
test/test-execute/exec-restrict-namespaces-mnt.service [new file with mode: 0644]
test/test-execute/exec-restrict-namespaces-no.service [new file with mode: 0644]
test/test-execute/exec-restrict-namespaces-yes.service [new file with mode: 0644]
test/test-execute/exec-supplementarygroups-multiple-groups-default-group-user.service [new file with mode: 0644]
test/test-execute/exec-supplementarygroups-multiple-groups-withgid.service [new file with mode: 0644]
test/test-execute/exec-supplementarygroups-multiple-groups-withuid.service [new file with mode: 0644]
test/test-execute/exec-supplementarygroups-single-group-user.service [new file with mode: 0644]
test/test-execute/exec-supplementarygroups-single-group.service [new file with mode: 0644]
test/test-execute/exec-supplementarygroups.service [new file with mode: 0644]
test/test-functions
test/test-resolve/_443._tcp.fedoraproject.org.pkts [moved from src/resolve/test-data/_443._tcp.fedoraproject.org.pkts with 100% similarity]
test/test-resolve/_openpgpkey.fedoraproject.org.pkts [moved from src/resolve/test-data/_openpgpkey.fedoraproject.org.pkts with 100% similarity]
test/test-resolve/fake-caa.pkts [moved from src/resolve/test-data/fake-caa.pkts with 100% similarity]
test/test-resolve/fedoraproject.org.pkts [moved from src/resolve/test-data/fedoraproject.org.pkts with 100% similarity]
test/test-resolve/gandi.net.pkts [moved from src/resolve/test-data/gandi.net.pkts with 100% similarity]
test/test-resolve/google.com.pkts [moved from src/resolve/test-data/google.com.pkts with 100% similarity]
test/test-resolve/kyhwana.org.pkts [moved from src/resolve/test-data/kyhwana.org.pkts with 100% similarity]
test/test-resolve/root.pkts [moved from src/resolve/test-data/root.pkts with 100% similarity]
test/test-resolve/sw1a1aa-sw1a2aa-sw1a2ab-sw1a2ac.find.me.uk.pkts [moved from src/resolve/test-data/sw1a1aa-sw1a2aa-sw1a2ab-sw1a2ac.find.me.uk.pkts with 100% similarity]
test/test-resolve/teamits.com.pkts [moved from src/resolve/test-data/teamits.com.pkts with 100% similarity]
test/test-resolve/zbyszek@fedoraproject.org.pkts [moved from src/resolve/test-data/zbyszek@fedoraproject.org.pkts with 100% similarity]
test/udev-test.pl
tmpfiles.d/.gitignore
tmpfiles.d/meson.build [new file with mode: 0644]
tmpfiles.d/systemd-remote.conf.m4 [moved from tmpfiles.d/systemd-remote.conf with 89% similarity]
tmpfiles.d/systemd.conf.m4
tmpfiles.d/tmp.conf
tmpfiles.d/var.conf.m4 [moved from tmpfiles.d/var.conf with 88% similarity]
tools/catalog-report.py [new file with mode: 0755]
tools/gdb-sd_dump_hashmaps.py
tools/make-directive-index.py
tools/make-man-index.py
tools/make-man-rules.py [changed mode: 0644->0755]
tools/meson-check-compilation.sh [new file with mode: 0755]
tools/meson-check-help.sh [new file with mode: 0755]
tools/meson-git-contrib.sh [new file with mode: 0755]
tools/meson-hwdb-update.sh [new file with mode: 0755]
tools/meson-link-test.c [new file with mode: 0644]
tools/meson-make-symlink.sh [new file with mode: 0755]
tools/xml_helper.py [changed mode: 0644->0755]
units/.gitignore
units/booting-done.service.in [moved from units/booting-done.service with 80% similarity]
units/console-getty.service.m4.in
units/console-shell.service.m4.in [deleted file]
units/container-getty@.service.m4.in
units/dev-hugepages.mount
units/dev-mqueue.mount
units/emergency.service.in
units/getty@.service.m4
units/initrd-switch-root.service.in
units/initrd-switch-root.target
units/meson-add-wants.sh [new file with mode: 0755]
units/meson.build [new file with mode: 0644]
units/network-online.target
units/network-pre.target
units/network.target
units/org.freedesktop.hostname1.busname
units/org.freedesktop.locale1.busname
units/org.freedesktop.login1.busname
units/org.freedesktop.machine1.busname
units/org.freedesktop.resolve1.busname
units/org.freedesktop.systemd1.busname
units/org.freedesktop.timedate1.busname
units/proc-sys-fs-binfmt_misc.automount
units/proc-sys-fs-binfmt_misc.mount
units/quotaon.service.in
units/rescue.service.in
units/serial-getty@.service.m4
units/sys-fs-fuse-connections.mount
units/sys-kernel-config.mount
units/sys-kernel-debug.mount
units/syslog.socket
units/system-default-target-done.service.in [moved from units/system-default-target-done.service with 80% similarity]
units/system-delayed-target-done.service.in [new file with mode: 0644]
units/system-delayed-target-trigger.service.in [moved from units/system-delayed-target-trigger.service with 78% similarity]
units/system-update-cleanup.service.in [new file with mode: 0644]
units/system-update.target
units/systemd-ask-password-console.path
units/systemd-ask-password-console.service.in
units/systemd-ask-password-wall.path
units/systemd-ask-password-wall.service.in
units/systemd-coredump@.service.in
units/systemd-hostnamed.service.in
units/systemd-importd.service.in
units/systemd-initctl.service.in
units/systemd-journal-catalog-update.service.in
units/systemd-journal-gatewayd.service.in
units/systemd-journal-remote.service.in
units/systemd-journal-upload.service.in
units/systemd-journald.service.in
units/systemd-localed.service.in
units/systemd-logind.service.in
units/systemd-machined.service.in
units/systemd-networkd-wait-online.service.in
units/systemd-networkd.service.m4.in
units/systemd-nspawn@.service.in
units/systemd-quotacheck.service.in
units/systemd-random-seed.service.in
units/systemd-remount-fs.service.in
units/systemd-resolved.service.m4.in
units/systemd-sysctl.service.in
units/systemd-timedated.service.in
units/systemd-timesyncd.service.in
units/systemd-udevd-control.socket
units/systemd-udevd.service.in
units/systemd-vconsole-setup.service.in
units/systemd-volatile-root.service.in [new file with mode: 0644]
units/tmp.mount.m4
units/user/bluetooth.target [new symlink]
units/user/busnames.target [new symlink]
units/user/graphical-session-pre.target [new file with mode: 0644]
units/user/graphical-session.target [moved from units/x-.slice with 75% similarity]
units/user/meson.build [new file with mode: 0644]
units/user/paths.target [new symlink]
units/user/printer.target [new symlink]
units/user/shutdown.target [new symlink]
units/user/smartcard.target [new symlink]
units/user/sockets.target [new symlink]
units/user/sound.target [new symlink]
units/user/timers.target [new symlink]
units/user@.service.m4.in

index 3e1b2d7..5ef7e11 100644 (file)
@@ -20,4 +20,8 @@
             (eval . (c-set-offset 'arglist-intro '++))
             (eval . (c-set-offset 'arglist-close 0))))
  (nxml-mode . ((nxml-child-indent . 2)
-               (fill-column . 119))))
+               (fill-column . 119)))
+ (meson-mode . ((meson-indent-basic . 8)))
+ (sh-mode . ((sh-basic-offset . 8)
+             (sh-indentation . 8)))
+ (awk-mode . ((c-basic-offset . 8))))
index 8a6db1f..f2ed0d9 100644 (file)
@@ -4,13 +4,23 @@ We welcome contributions from everyone. However, please follow the following gui
 
 ## Filing Issues
 
-* We use GitHub Issues **exclusively** for tracking **bugs** and **feature** **requests** of systemd. If you are looking for help, please contact our [mailing list](http://lists.freedesktop.org/mailman/listinfo/systemd-devel) instead.
+* We use GitHub Issues **exclusively** for tracking **bugs** and **feature** **requests** of systemd. If you are looking for help, please contact our [mailing list](https://lists.freedesktop.org/mailman/listinfo/systemd-devel) instead.
 * We only track bugs in the **two** **most** **recently** **released** **versions** of systemd in the GitHub Issue tracker. If you are using an older version of systemd, please contact your distribution's bug tracker instead.
 * When filing an issue, specify the **systemd** **version** you are experiencing the issue with. Also, indicate which **distribution** you are using.
 * Please include an explanation how to reproduce the issue you are pointing out.
 
 Following these guidelines makes it easier for us to process your issue, and ensures we won't close your issue right-away for being misfiled.
 
+### Older downstream versions
+For older versions that are still supported by your distribution please use respective downstream tracker:
+* **Fedora** - [bugzilla](https://bugzilla.redhat.com/enter_bug.cgi?product=Fedora&component=systemd)
+* **RHEL-7/CentOS-7** - [bugzilla](https://bugzilla.redhat.com/enter_bug.cgi?product=Red%20Hat%20Enterprise%20Linux%207&component=systemd) or [systemd-rhel github](https://github.com/lnykryn/systemd-rhel/issues)
+* **Debian** - [bugs.debian.org](https://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=systemd)
+
+## Security vulnerability reports
+
+If you discover a security vulnerability, we'd appreciate a non-public disclosure. The issue tracker and mailing list listed above are fully public. If you need to reach systemd developers in a non-public way, report the issue in one of the "big" distributions using systemd: [Fedora](https://bugzilla.redhat.com/enter_bug.cgi?product=Fedora&component=systemd) (be sure to check "Security Sensitive Bug" under "Show Advanced Fields"), [Ubuntu](https://launchpad.net/ubuntu/+source/systemd/+filebug) (be sure to change "This bug contains information that is" from "Public" to "Private Security"), or [Debian](mailto:security@debian.org). Various systemd developers are active distribution maintainers and will propagate the information about the bug to other parties.
+
 ## Posting Pull Requests
 
 * Make sure to post PRs only relative to a very recent git master.
@@ -18,7 +28,7 @@ Following these guidelines makes it easier for us to process your issue, and ens
 * Please make sure to test your change before submitting the PR. See [HACKING](https://raw.githubusercontent.com/systemd/systemd/master/HACKING) for details how to do this.
 * Make sure to run "make check" locally, before posting your PR. We use a CI system, meaning we don't even look at your PR, if the build and tests don't pass.
 * If you need to update the code in an existing PR, force-push into the same branch, overriding old commits with new versions.
-* After you have pushed a new version, try to remove the `reviewed/needs-rework` label. Also add a comment about the new version (no notification is sent just for the commits, so it's easy to miss the update without an explicit comment).
+* After you have pushed a new version, add a comment about the new version (no notification is sent just for the commits, so it's easy to miss the update without an explicit comment). If you are a member of the systemd project on github, remove the `reviewed/needs-rework` label.
 
 ## Final Words
 
index 750f9e7..687270e 100644 (file)
@@ -1,15 +1,18 @@
 ### Submission type
 
-  - [ ] Bug report
-  - [ ] Request for enhancement (RFE)
+<!-- Delete the inappropriate option below: -->
 
-*NOTE: Do not submit anything other than bug reports or RFEs via the issue tracker!*
+ - Bug report
+ - Request for enhancement (RFE)
+
+<!-- **NOTE:** Do not submit anything other than bug reports or RFEs via the issue tracker! -->
 
 ### systemd version the issue has been seen with
 
 > …
 
-*NOTE: Do not submit bug reports about anything but the two most recently released systemd versions upstream!*
+<!-- **NOTE:** Do not submit bug reports about anything but the two most recently released systemd versions upstream! -->
+<!-- For older version please use distribution trackers (see https://github.com/systemd/systemd/blob/master/.github/CONTRIBUTING.md#filing-issues). -->
 
 ### Used distribution
 
index f7db68b..fd9bef4 100644 (file)
@@ -1,5 +1,8 @@
+cscope.files
+cscope.out
 *.a
 *.cache
+*.gch
 *.la
 *.lo
 *.log
@@ -18,6 +21,7 @@
 /*.tar.bz2
 /*.tar.gz
 /*.tar.xz
+/30-systemd-environment-d-generator
 /GPATH
 /GRTAGS
 /GSYMS
@@ -26,7 +30,7 @@
 /TAGS
 /ata_id
 /bootctl
-/build-aux
+/build*
 /busctl
 /cdrom_id
 /collect
@@ -36,6 +40,7 @@
 /exported
 /exported-*
 /hostnamectl
+/image.raw
 /install-tree
 /journalctl
 /libtool
@@ -65,6 +70,7 @@
 /systemd-debug-generator
 /systemd-delta
 /systemd-detect-virt
+/systemd-dissect
 /systemd-escape
 /systemd-export
 /systemd-firstboot
@@ -89,6 +95,7 @@
 /systemd-machine-id-setup
 /systemd-machined
 /systemd-modules-load
+/systemd-mount
 /systemd-networkd
 /systemd-networkd-wait-online
 /systemd-notify
 /systemd-update-utmp
 /systemd-user-sessions
 /systemd-vconsole-setup
+/systemd-veritysetup
+/systemd-veritysetup-generator
+/systemd-volatile-root
 /tags
 /test-acd
 /test-acl-util
 /test-bus-policy
 /test-bus-server
 /test-bus-signature
+/test-bus-track
+/test-bus-vtable
+/test-bus-vtable-cc
 /test-bus-zero-copy
 /test-calendarspec
 /test-cap-list
 /test-dhcp-option
 /test-dhcp-server
 /test-dhcp6-client
+/test-dissect-image
 /test-dns-domain
 /test-dns-packet
 /test-dnssec
 /test-env-util
 /test-escape
 /test-event
+/test-exec-util
 /test-execute
 /test-extract-word
 /test-fd-util
 /test-fs-util
 /test-fstab-util
 /test-glob-util
+/test-hash
 /test-hashmap
 /test-hexdecoct
 /test-hostname
 /test-journal
 /test-journal-enum
 /test-journal-flush
+/test-journal-importer
 /test-journal-init
 /test-journal-interleaving
 /test-journal-match
 /test-loopback
 /test-machine-tables
 /test-mmap-cache
+/test-mount-util
 /test-namespace
 /test-ndisc-rs
 /test-netlink
 /test-process-util
 /test-pty
 /test-qcow2
+/test-random-util
 /test-ratelimit
 /test-replace-var
 /test-resolve
 /test-resolve-tables
+/test-resolved-packet
 /test-ring
 /test-rlimit-util
 /test-sched-prio
+/test-sd-dhcp-lease
+/test-seccomp
 /test-selinux
 /test-set
 /test-sizeof
 /test-tables
 /test-terminal-util
 /test-time
+/test-timesync
 /test-tmpfiles
 /test-udev
 /test-uid-range
index d56fb67..e2a390b 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -74,3 +74,52 @@ Thomas H. P. Andersen <phomes@gmail.com>
 Michael Olbrich <m.olbrich@pengutronix.de>
 Douglas Christman <DouglasChristman@gmail.com>
 Alexander Kuleshov <kuleshovmail@gmail.com> <0xAX@users.noreply.github.com>
+Andreas Henriksson <andreas@fatal.se>
+Daniel Rusek <mail@asciiwolf.com>
+Dennis Wassenberg <dennis.wassenberg@secunet.com>
+Reid Price <reid.price@gmail.com>
+Stefan Schweter <stefan@schweter.it>
+Seraphime Kirkovski <kirkseraph@gmail.com>
+Bart Rulon <barron@lexmark.com>
+Richard W.M. Jones <rjones@redhat.com>
+Roman Stingler <coolx67@gmx.at>
+Michael Hoy <rimmington@gmail.com>
+Tiago Levit <liamgliam@gmail.com>
+Eric Cook <llua@users.noreply.github.com>
+Lukáš Nykrýn <lnykryn@redhat.com>
+Heikki Kemppainen <heikki.kemppainen@nokia.com>
+Hendrik Brueckner <hbrueckner@users.noreply.github.com>
+Alexandros Frantzis <alexandros.frantzis@canonical.com>
+Alexander Kochetkov <al.kochet@gmail.com>
+Fionn Cleary <clearyf@tcd.ie>
+Michel Kraus <github@demonsphere.de> <27o@users.noreply.github.com>
+Charles (Chas) Williams <ciwillia@brocade.com>
+Emil Soleyman <emil@soleyman.com>
+Dmitry Khlebnikov <dmitry.khlebnikov@rea-group.com> <galaxy4public@users.noreply.github.com>
+Antoine Eiche <lewo@abesis.fr>
+Gianluca Boiano <morf3089@gmail.com>
+Paolo Giangrandi <paolo@luccalug.it>
+Karl Kraus <karl.kraus@tum.de> <laqueray@gmail.com>
+Tibor Nagy <xnagytibor@gmail.com>
+Stuart McLaren <stuart.mclaren@hp.com>
+John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
+John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de> <glaubitz@suse.com>
+Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+Neil Brown <neil@brown.name>
+Michal Suchanek <msuchanek@suse.de> <hramrach@gmail.com>
+Michal Suchanek <msuchanek@suse.de>
+Bastien Nocera <hadess@hadess.net> <hadess@users.noreply.github.com>
+Umut Tezduyar Lindskog <umut@tezduyar.com>
+Alexander Kurtz <alexander@kurtz.be>
+Piotr Szydełko <wiertel@users.sourceforge.net>
+Łukasz Stelmach <l.stelmach@samsung.com> <stlman@poczta.fm>
+Krzysztof Jackiewicz <k.jackiewicz@samsung.com> <kjackiewicz@users.noreply.github.com>
+Marcus Cooper <marcusc@axis.com> <codekipper@gmail.com>
+Insun Pyo <insun.pyo@samsung.com> <iplayinsun@gmail.com>
+Ted Wood <ted.l.wood@gmail.com>
+Ted Wood <ted@mailchimp.com>
+Anthony Parsons <flussence@users.noreply.github.com>
+Federico Di Pierro <nierro92@gmail.com>
+Josef Andersson <josef.andersson@fripost.org>
+Josef Andersson <l10nl18nsweja@gmail.com>
+Hendrik Westerberg <hendrik@gestorf.com>
diff --git a/.mkosi/Makefile b/.mkosi/Makefile
new file mode 120000 (symlink)
index 0000000..bd10475
--- /dev/null
@@ -0,0 +1 @@
+../src/Makefile
\ No newline at end of file
diff --git a/.mkosi/mkosi.arch b/.mkosi/mkosi.arch
new file mode 100644 (file)
index 0000000..613ef47
--- /dev/null
@@ -0,0 +1,68 @@
+# This file is part of systemd.
+#
+# Copyright 2016 Zeal Jagannatha
+#
+# 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/>.
+
+# This is a settings file for OS image generation using mkosi (https://github.com/systemd/mkosi).
+# Simply invoke "mkosi" in the project directory to build an OS image.
+
+[Distribution]
+Distribution=arch
+
+[Output]
+Format=raw_btrfs
+Bootable=yes
+
+[Partitions]
+RootSize=2G
+
+[Packages]
+Cache=/var/cache/pacman/pkg/
+BuildPackages=
+        acl
+        bzip2
+        cryptsetup
+        curl
+        dbus
+        docbook-xsl
+        elfutils
+        gcc
+        git
+        gnu-efi-libs
+        gnutls
+        gperf
+        intltool
+        iptables
+        kmod
+        libcap
+        libgcrypt
+        libidn2
+        libmicrohttpd
+        libseccomp
+        libtool
+        libutil-linux
+        libxkbcommon
+        libxslt
+        lz4
+        meson
+        pam
+        pkgconfig
+        python
+        python-lxml
+        qrencode
+        xz
+
+Packages=
+        libidn2
diff --git a/.mkosi/mkosi.debian b/.mkosi/mkosi.debian
new file mode 100644 (file)
index 0000000..c41fc1d
--- /dev/null
@@ -0,0 +1,80 @@
+# This file is part of systemd.
+#
+# Copyright 2016 Daniel Rusek
+#
+# 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/>.
+
+# This is a settings file for OS image generation using mkosi (https://github.com/systemd/mkosi).
+# Simply invoke "mkosi" in the project directory to build an OS image.
+
+[Distribution]
+Distribution=debian
+Release=unstable
+
+[Output]
+Format=raw_btrfs
+Bootable=yes
+
+[Partitions]
+RootSize=2G
+
+[Packages]
+BuildPackages=
+        acl
+        docbook-xml
+        docbook-xsl
+        gcc
+        git
+        gnu-efi
+        gperf
+        intltool
+        iptables-dev
+        libacl1-dev
+        libaudit-dev
+        libblkid-dev
+        libbz2-dev
+        libcap-dev
+        libcryptsetup-dev
+        libcurl4-gnutls-dev
+        libdbus-1-dev
+        libdw-dev
+        libfdisk-dev
+        libgcrypt20-dev
+        libgnutls28-dev
+        libidn2-0-dev
+        libkmod-dev
+        liblzma-dev
+        liblz4-dev
+        liblz4-tool
+        libmicrohttpd-dev
+        libmount-dev
+        libpam0g-dev
+        libqrencode-dev
+        libseccomp-dev
+        libsmartcols-dev
+        libtool
+        libxkbcommon-dev
+        meson
+        pkg-config
+        python3
+        python3-lxml
+        tree
+        uuid-dev
+        xsltproc
+        xz-utils
+
+Packages=
+        libqrencode3
+        locales
+        libidn2-0
diff --git a/.mkosi/mkosi.fedora b/.mkosi/mkosi.fedora
new file mode 100644 (file)
index 0000000..c38ee7e
--- /dev/null
@@ -0,0 +1,75 @@
+# This file is part of systemd.
+#
+# Copyright 2016 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/>.
+
+# This is a settings file for OS image generation using mkosi (https://github.com/systemd/mkosi).
+# Simply invoke "mkosi" in the project directory to build an OS image.
+
+[Distribution]
+Distribution=fedora
+Release=26
+
+[Output]
+Format=raw_btrfs
+Bootable=yes
+
+[Partitions]
+RootSize=3G
+
+[Packages]
+BuildPackages=
+        audit-libs-devel
+        bzip2-devel
+        cryptsetup-devel
+        dbus-devel
+        diffutils
+        docbook-style-xsl
+        elfutils-devel
+        gcc
+        git
+        gnu-efi
+        gnu-efi-devel
+        gnutls-devel
+        gperf
+        intltool
+        iptables-devel
+        kmod-devel
+        libacl-devel
+        libblkid-devel
+        libcap-devel
+        libcurl-devel
+        libgcrypt-devel
+        libidn2-devel
+        libmicrohttpd-devel
+        libmount-devel
+        libseccomp-devel
+        libselinux-devel
+        libtool
+        libxkbcommon-devel
+        libxslt
+        lz4
+        lz4-devel
+        meson
+        pam-devel
+        pkgconfig
+        python3-devel
+        python3-lxml
+        qrencode-devel
+        tree
+        xz-devel
+
+Packages=
+        libidn2
index e89b3c6..ed61ea9 100644 (file)
   and Linux/GNU-specific APIs, we generally prefer the POSIX APIs. If there
   aren't, we are happy to use GNU or Linux APIs, and expect non-GNU
   implementations of libc to catch up with glibc.
+
+- Whenever installing a signal handler, make sure to set SA_RESTART for it, so
+  that interrupted system calls are automatically restarted, and we minimize
+  hassles with handling EINTR (in particular as EINTR handling is pretty broken
+  on Linux).
index 07aea86..68107e4 100644 (file)
@@ -15,6 +15,7 @@ HOWTO:
             --with-kbd-setfont=
             --with-tty-gid=
             --with-ntp-servers=
+            --with-support-url=
 
         2) Try it out. Play around (as an ordinary user) with
         '/usr/lib/systemd/systemd --test --system' for a test run
@@ -24,21 +25,29 @@ HOWTO:
 
 NTP POOL:
 
-        By default, timesyncd uses the Google NTP servers
-        time[1-4].google.com. They serve time that is not standards
-        compliant, and can be up to .5s off. Google does not
-        officially support these servers for the broader
-        audience. Distributions and vendors really should not ship
-        OSes or devices with these NTP servers configured. Instead,
-        please register your own vendor pool at ntp.org and make it
-        the built-in default by passing --with-ntp-servers= to
-        configure. Registering vendor pools is free:
+        By default, timesyncd uses the Google Public NTP servers
+        time[1-4].google.com. They serve time that uses a leap second
+        smear, and can be up to .5s off from servers that use stepped
+        leap seconds.
+
+        https://developers.google.com/time/smear
+
+        If you prefer to use leap second steps, please register your own
+        vendor pool at ntp.org and make it the built-in default by
+        passing --with-ntp-servers= to configure. Registering vendor
+        pools is free:
 
         http://www.pool.ntp.org/en/vendors.html
 
-        Again, if you ship your software or device with the default
-        NTP servers, then you will get served wrong time, and will
-        rely on services that might not be supported for long.
+PAM:
+        The default PAM config shipped by systemd is really bare bones.
+        It does not include many modules your distro might want to enable
+        to provide a more seamless experience. For example, limits set in
+        /etc/security/limits.conf will not be read unless you load pam_limits.
+        Make sure you add modules your distro expects from user services.
+
+        Pass --with-pamconfdir=no to ./configure to avoid installing this file
+        and instead install your own.
 
 CONTRIBUTING UPSTREAM:
 
diff --git a/ENVIRONMENT.md b/ENVIRONMENT.md
new file mode 100644 (file)
index 0000000..e542d4e
--- /dev/null
@@ -0,0 +1,66 @@
+# Known Environment Variables
+
+A number of systemd components take additional runtime parameters via
+environment variables. Many of these environment variables are not supported at
+the same level as command line switches and other interfaces are: we don't
+document them in the man pages and we make no stability guarantees for
+them. While they generally are unlikely to be dropped any time soon again, we
+do not want to guarantee that they stay around for good either.
+
+Below is an (incomprehensive) list of the environment variables understood by
+the various tools. Note that this list only covers environment variables not
+documented in the proper man pages.
+
+All tools:
+
+* `$SYSTEMD_IGNORE_CHROOT=1` — if set, don't check whether being invoked in a
+  chroot() environment. This is particularly relevant for systemctl, as it will
+  not alter its behaviour for chroot() environments if set. (Normally it
+  refrains from talking to PID 1 in such a case.)
+
+* `$SD_EVENT_PROFILE_DELAYS=1` — if set, the sd-event event loop implementation
+  will print latency information at runtime.
+
+* `$SYSTEMD_PROC_CMDLINE` — if set, may contain a string that is used as kernel
+  command line instead of the actual one readable from /proc/cmdline. This is
+  useful for debugging, in order to test generators and other code against
+  specific kernel command lines.
+
+systemctl:
+
+* `$SYSTEMCTL_FORCE_BUS=1` — if set, do not connect to PID1's private D-Bus
+  listener, and instead always connect through the dbus-daemon D-bus broker.
+
+* `$SYSTEMCTL_INSTALL_CLIENT_SIDE=1` — if set, enable or disable unit files on
+  the client side, instead of asking PID 1 to do this.
+
+* `$SYSTEMCTL_SKIP_SYSV=1` — if set, do not call out to SysV compatibility hooks.
+
+systemd-nspawn:
+
+* `$UNIFIED_CGROUP_HIERARCHY=1` — if set, force nspawn into unified cgroup
+  hierarchy mode.
+
+* `$SYSTEMD_NSPAWN_API_VFS_WRITABLE=1` — if set, make /sys and /proc/sys and
+  friends writable in the container. If set to "network", leave only
+  /proc/sys/net writable.
+
+* `$SYSTEMD_NSPAWN_CONTAINER_SERVICE=…` — override the "service" name nspawn
+  uses to register with machined. If unset defaults to "nspawn", but with this
+  variable may be set to any other value.
+
+* `$SYSTEMD_NSPAWN_USE_CGNS=0` — if set, do not use cgroup namespacing, even if
+  it is available.
+
+* `$SYSTEMD_NSPAWN_LOCK=0` — if set, do not lock container images when running.
+
+systemd-logind:
+
+* `$SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1` — if set, report that
+  hibernation is available even if the swap devices do not provide enough room
+  for it.
+
+installed systemd tests:
+
+* `$SYSTEMD_TEST_DATA` — override the location of test data. This is useful if
+  a test executable is moved to an arbitrary location.
diff --git a/HACKING b/HACKING
index 3ee1c7e..193cff1 100644 (file)
--- a/HACKING
+++ b/HACKING
@@ -30,7 +30,7 @@ systemd-nspawn or in an UEFI-capable VM:
 
 or:
 
-        # qemu-kvm -m 512 -smp 2 -bios /usr/share/edk2/ovmf/OVMF_CODE.fd -hda image.raw
+        # qemu-system-x86_64 -enable-kvm -m 512 -smp 2 -bios /usr/share/edk2/ovmf/OVMF_CODE.fd -hda image.raw
 
 Every time you rerun the "mkosi" command a fresh image is built, incorporating
 all current changes you made to the project tree.
@@ -51,12 +51,14 @@ systemd's build dependencies:
 Putting this all together, here's a series of commands for preparing a patch
 for systemd (this example is for Fedora):
 
+        $ sudo dnf builddep systemd            # install build dependencies
+        $ sudo dnf install mkosi               # install tool to quickly build images
         $ git clone https://github.com/systemd/systemd.git
         $ cd systemd
         $ vim src/core/main.c                  # or wherever you'd like to make your changes
-        $ dnf builddep systemd                 # install build dependencies
         $ ./autogen.sh c                       # configure the source tree
         $ make -j `nproc`                      # build it locally, see if everything compiles fine
+        $ make -j `nproc` check                # run some simple regression tests
         $ sudo mkosi                           # build a test image
         $ sudo systemd-nspawn -bi image.raw    # boot up the test image
         $ git add -p                           # interactively put together your patch
index 4088caa..d51236e 100644 (file)
@@ -51,6 +51,8 @@ MANPAGES += \
        man/sd_bus_path_encode.3 \
        man/sd_bus_process.3 \
        man/sd_bus_request_name.3 \
+       man/sd_bus_track_add_name.3 \
+       man/sd_bus_track_new.3 \
        man/sd_event_add_child.3 \
        man/sd_event_add_defer.3 \
        man/sd_event_add_io.3 \
@@ -113,18 +115,16 @@ MANPAGES += \
        man/systemd-getty-generator.8 \
        man/systemd-gpt-auto-generator.8 \
        man/systemd-halt.service.8 \
-       man/systemd-hibernate-resume-generator.8 \
-       man/systemd-hibernate-resume@.service.8 \
        man/systemd-inhibit.1 \
        man/systemd-initctl.service.8 \
        man/systemd-journald.service.8 \
        man/systemd-machine-id-commit.service.8 \
        man/systemd-machine-id-setup.1 \
+       man/systemd-mount.1 \
        man/systemd-notify.1 \
        man/systemd-nspawn.1 \
        man/systemd-path.1 \
        man/systemd-remount-fs.service.8 \
-       man/systemd-resolve.1 \
        man/systemd-run.1 \
        man/systemd-sleep.conf.5 \
        man/systemd-socket-activate.1 \
@@ -138,6 +138,7 @@ MANPAGES += \
        man/systemd-tty-ask-password-agent.1 \
        man/systemd-udevd.service.8 \
        man/systemd-update-done.service.8 \
+       man/systemd-volatile-root.service.8 \
        man/systemd.1 \
        man/systemd.automount.5 \
        man/systemd.device.5 \
@@ -235,6 +236,8 @@ MANPAGES_ALIAS += \
        man/SD_ID128_FORMAT_STR.3 \
        man/SD_ID128_FORMAT_VAL.3 \
        man/SD_ID128_MAKE.3 \
+       man/SD_ID128_MAKE_STR.3 \
+       man/SD_ID128_NULL.3 \
        man/SD_INFO.3 \
        man/SD_JOURNAL_APPEND.3 \
        man/SD_JOURNAL_CURRENT_USER.3 \
@@ -330,6 +333,23 @@ MANPAGES_ALIAS += \
        man/sd_bus_path_encode_many.3 \
        man/sd_bus_ref.3 \
        man/sd_bus_release_name.3 \
+       man/sd_bus_track_add_sender.3 \
+       man/sd_bus_track_contains.3 \
+       man/sd_bus_track_count.3 \
+       man/sd_bus_track_count_name.3 \
+       man/sd_bus_track_count_sender.3 \
+       man/sd_bus_track_first.3 \
+       man/sd_bus_track_get_bus.3 \
+       man/sd_bus_track_get_recursive.3 \
+       man/sd_bus_track_get_userdata.3 \
+       man/sd_bus_track_next.3 \
+       man/sd_bus_track_ref.3 \
+       man/sd_bus_track_remove_name.3 \
+       man/sd_bus_track_remove_sender.3 \
+       man/sd_bus_track_set_recursive.3 \
+       man/sd_bus_track_set_userdata.3 \
+       man/sd_bus_track_unref.3 \
+       man/sd_bus_track_unrefp.3 \
        man/sd_bus_unref.3 \
        man/sd_bus_unrefp.3 \
        man/sd_event.3 \
@@ -374,10 +394,14 @@ MANPAGES_ALIAS += \
        man/sd_id128_equal.3 \
        man/sd_id128_from_string.3 \
        man/sd_id128_get_boot.3 \
+       man/sd_id128_get_invocation.3 \
+       man/sd_id128_get_machine_app_specific.3 \
+       man/sd_id128_is_null.3 \
        man/sd_id128_t.3 \
        man/sd_is_mq.3 \
        man/sd_is_socket.3 \
        man/sd_is_socket_inet.3 \
+       man/sd_is_socket_sockaddr.3 \
        man/sd_is_socket_unix.3 \
        man/sd_is_special.3 \
        man/sd_journal.3 \
@@ -430,7 +454,6 @@ MANPAGES_ALIAS += \
        man/systemd-ask-password-wall.service.8 \
        man/systemd-fsck-root.service.8 \
        man/systemd-fsck.8 \
-       man/systemd-hibernate-resume.8 \
        man/systemd-hibernate.service.8 \
        man/systemd-hybrid-sleep.service.8 \
        man/systemd-initctl.8 \
@@ -454,8 +477,10 @@ MANPAGES_ALIAS += \
        man/systemd-udevd-control.socket.8 \
        man/systemd-udevd-kernel.socket.8 \
        man/systemd-udevd.8 \
+       man/systemd-umount.1 \
        man/systemd-update-done.8 \
        man/systemd-user.conf.5 \
+       man/systemd-volatile-root.8 \
        man/udev_device_get_action.3 \
        man/udev_device_get_devlinks_list_entry.3 \
        man/udev_device_get_devnode.3 \
@@ -568,6 +593,8 @@ man/SD_ID128_CONST_STR.3: man/sd-id128.3
 man/SD_ID128_FORMAT_STR.3: man/sd-id128.3
 man/SD_ID128_FORMAT_VAL.3: man/sd-id128.3
 man/SD_ID128_MAKE.3: man/sd-id128.3
+man/SD_ID128_MAKE_STR.3: man/sd-id128.3
+man/SD_ID128_NULL.3: man/sd-id128.3
 man/SD_INFO.3: man/sd-daemon.3
 man/SD_JOURNAL_APPEND.3: man/sd_journal_get_fd.3
 man/SD_JOURNAL_CURRENT_USER.3: man/sd_journal_open.3
@@ -663,6 +690,23 @@ man/sd_bus_path_decode_many.3: man/sd_bus_path_encode.3
 man/sd_bus_path_encode_many.3: man/sd_bus_path_encode.3
 man/sd_bus_ref.3: man/sd_bus_new.3
 man/sd_bus_release_name.3: man/sd_bus_request_name.3
+man/sd_bus_track_add_sender.3: man/sd_bus_track_add_name.3
+man/sd_bus_track_contains.3: man/sd_bus_track_add_name.3
+man/sd_bus_track_count.3: man/sd_bus_track_add_name.3
+man/sd_bus_track_count_name.3: man/sd_bus_track_add_name.3
+man/sd_bus_track_count_sender.3: man/sd_bus_track_add_name.3
+man/sd_bus_track_first.3: man/sd_bus_track_add_name.3
+man/sd_bus_track_get_bus.3: man/sd_bus_track_new.3
+man/sd_bus_track_get_recursive.3: man/sd_bus_track_new.3
+man/sd_bus_track_get_userdata.3: man/sd_bus_track_new.3
+man/sd_bus_track_next.3: man/sd_bus_track_add_name.3
+man/sd_bus_track_ref.3: man/sd_bus_track_new.3
+man/sd_bus_track_remove_name.3: man/sd_bus_track_add_name.3
+man/sd_bus_track_remove_sender.3: man/sd_bus_track_add_name.3
+man/sd_bus_track_set_recursive.3: man/sd_bus_track_new.3
+man/sd_bus_track_set_userdata.3: man/sd_bus_track_new.3
+man/sd_bus_track_unref.3: man/sd_bus_track_new.3
+man/sd_bus_track_unrefp.3: man/sd_bus_track_new.3
 man/sd_bus_unref.3: man/sd_bus_new.3
 man/sd_bus_unrefp.3: man/sd_bus_new.3
 man/sd_event.3: man/sd_event_new.3
@@ -707,10 +751,14 @@ man/sd_event_unrefp.3: man/sd_event_new.3
 man/sd_id128_equal.3: man/sd-id128.3
 man/sd_id128_from_string.3: man/sd_id128_to_string.3
 man/sd_id128_get_boot.3: man/sd_id128_get_machine.3
+man/sd_id128_get_invocation.3: man/sd_id128_get_machine.3
+man/sd_id128_get_machine_app_specific.3: man/sd_id128_get_machine.3
+man/sd_id128_is_null.3: man/sd-id128.3
 man/sd_id128_t.3: man/sd-id128.3
 man/sd_is_mq.3: man/sd_is_fifo.3
 man/sd_is_socket.3: man/sd_is_fifo.3
 man/sd_is_socket_inet.3: man/sd_is_fifo.3
+man/sd_is_socket_sockaddr.3: man/sd_is_fifo.3
 man/sd_is_socket_unix.3: man/sd_is_fifo.3
 man/sd_is_special.3: man/sd_is_fifo.3
 man/sd_journal.3: man/sd_journal_open.3
@@ -763,7 +811,6 @@ man/systemd-ask-password-wall.path.8: man/systemd-ask-password-console.service.8
 man/systemd-ask-password-wall.service.8: man/systemd-ask-password-console.service.8
 man/systemd-fsck-root.service.8: man/systemd-fsck@.service.8
 man/systemd-fsck.8: man/systemd-fsck@.service.8
-man/systemd-hibernate-resume.8: man/systemd-hibernate-resume@.service.8
 man/systemd-hibernate.service.8: man/systemd-suspend.service.8
 man/systemd-hybrid-sleep.service.8: man/systemd-suspend.service.8
 man/systemd-initctl.8: man/systemd-initctl.service.8
@@ -787,8 +834,10 @@ man/systemd-tmpfiles-setup.service.8: man/systemd-tmpfiles.8
 man/systemd-udevd-control.socket.8: man/systemd-udevd.service.8
 man/systemd-udevd-kernel.socket.8: man/systemd-udevd.service.8
 man/systemd-udevd.8: man/systemd-udevd.service.8
+man/systemd-umount.1: man/systemd-mount.1
 man/systemd-update-done.8: man/systemd-update-done.service.8
 man/systemd-user.conf.5: man/systemd-system.conf.5
+man/systemd-volatile-root.8: man/systemd-volatile-root.service.8
 man/udev_device_get_action.3: man/udev_device_get_syspath.3
 man/udev_device_get_devlinks_list_entry.3: man/udev_device_has_tag.3
 man/udev_device_get_devnode.3: man/udev_device_get_syspath.3
@@ -1013,6 +1062,12 @@ man/SD_ID128_FORMAT_VAL.html: man/sd-id128.html
 man/SD_ID128_MAKE.html: man/sd-id128.html
        $(html-alias)
 
+man/SD_ID128_MAKE_STR.html: man/sd-id128.html
+       $(html-alias)
+
+man/SD_ID128_NULL.html: man/sd-id128.html
+       $(html-alias)
+
 man/SD_INFO.html: man/sd-daemon.html
        $(html-alias)
 
@@ -1298,6 +1353,57 @@ man/sd_bus_ref.html: man/sd_bus_new.html
 man/sd_bus_release_name.html: man/sd_bus_request_name.html
        $(html-alias)
 
+man/sd_bus_track_add_sender.html: man/sd_bus_track_add_name.html
+       $(html-alias)
+
+man/sd_bus_track_contains.html: man/sd_bus_track_add_name.html
+       $(html-alias)
+
+man/sd_bus_track_count.html: man/sd_bus_track_add_name.html
+       $(html-alias)
+
+man/sd_bus_track_count_name.html: man/sd_bus_track_add_name.html
+       $(html-alias)
+
+man/sd_bus_track_count_sender.html: man/sd_bus_track_add_name.html
+       $(html-alias)
+
+man/sd_bus_track_first.html: man/sd_bus_track_add_name.html
+       $(html-alias)
+
+man/sd_bus_track_get_bus.html: man/sd_bus_track_new.html
+       $(html-alias)
+
+man/sd_bus_track_get_recursive.html: man/sd_bus_track_new.html
+       $(html-alias)
+
+man/sd_bus_track_get_userdata.html: man/sd_bus_track_new.html
+       $(html-alias)
+
+man/sd_bus_track_next.html: man/sd_bus_track_add_name.html
+       $(html-alias)
+
+man/sd_bus_track_ref.html: man/sd_bus_track_new.html
+       $(html-alias)
+
+man/sd_bus_track_remove_name.html: man/sd_bus_track_add_name.html
+       $(html-alias)
+
+man/sd_bus_track_remove_sender.html: man/sd_bus_track_add_name.html
+       $(html-alias)
+
+man/sd_bus_track_set_recursive.html: man/sd_bus_track_new.html
+       $(html-alias)
+
+man/sd_bus_track_set_userdata.html: man/sd_bus_track_new.html
+       $(html-alias)
+
+man/sd_bus_track_unref.html: man/sd_bus_track_new.html
+       $(html-alias)
+
+man/sd_bus_track_unrefp.html: man/sd_bus_track_new.html
+       $(html-alias)
+
 man/sd_bus_unref.html: man/sd_bus_new.html
        $(html-alias)
 
@@ -1430,6 +1536,15 @@ man/sd_id128_from_string.html: man/sd_id128_to_string.html
 man/sd_id128_get_boot.html: man/sd_id128_get_machine.html
        $(html-alias)
 
+man/sd_id128_get_invocation.html: man/sd_id128_get_machine.html
+       $(html-alias)
+
+man/sd_id128_get_machine_app_specific.html: man/sd_id128_get_machine.html
+       $(html-alias)
+
+man/sd_id128_is_null.html: man/sd-id128.html
+       $(html-alias)
+
 man/sd_id128_t.html: man/sd-id128.html
        $(html-alias)
 
@@ -1442,6 +1557,9 @@ man/sd_is_socket.html: man/sd_is_fifo.html
 man/sd_is_socket_inet.html: man/sd_is_fifo.html
        $(html-alias)
 
+man/sd_is_socket_sockaddr.html: man/sd_is_fifo.html
+       $(html-alias)
+
 man/sd_is_socket_unix.html: man/sd_is_fifo.html
        $(html-alias)
 
@@ -1598,9 +1716,6 @@ man/systemd-fsck-root.service.html: man/systemd-fsck@.service.html
 man/systemd-fsck.html: man/systemd-fsck@.service.html
        $(html-alias)
 
-man/systemd-hibernate-resume.html: man/systemd-hibernate-resume@.service.html
-       $(html-alias)
-
 man/systemd-hibernate.service.html: man/systemd-suspend.service.html
        $(html-alias)
 
@@ -1670,12 +1785,18 @@ man/systemd-udevd-kernel.socket.html: man/systemd-udevd.service.html
 man/systemd-udevd.html: man/systemd-udevd.service.html
        $(html-alias)
 
+man/systemd-umount.html: man/systemd-mount.html
+       $(html-alias)
+
 man/systemd-update-done.html: man/systemd-update-done.service.html
        $(html-alias)
 
 man/systemd-user.conf.html: man/systemd-system.conf.html
        $(html-alias)
 
+man/systemd-volatile-root.html: man/systemd-volatile-root.service.html
+       $(html-alias)
+
 man/udev_device_get_action.html: man/udev_device_get_syspath.html
        $(html-alias)
 
@@ -1900,6 +2021,19 @@ MANPAGES_ALIAS += \
 
 endif
 
+if ENABLE_ENVIRONMENT_D
+MANPAGES += \
+       man/environment.d.5 \
+       man/systemd-environment-d-generator.8 \
+       man/systemd.environment-generator.7
+MANPAGES_ALIAS += \
+       man/30-systemd-environment-d-generator.8
+man/30-systemd-environment-d-generator.8: man/systemd-environment-d-generator.8
+man/30-systemd-environment-d-generator.html: man/systemd-environment-d-generator.html
+       $(html-alias)
+
+endif
+
 if ENABLE_FIRSTBOOT
 MANPAGES += \
        man/systemd-firstboot.1
@@ -1911,6 +2045,18 @@ man/systemd-firstboot.service.html: man/systemd-firstboot.html
 
 endif
 
+if ENABLE_HIBERNATE
+MANPAGES += \
+       man/systemd-hibernate-resume-generator.8 \
+       man/systemd-hibernate-resume@.service.8
+MANPAGES_ALIAS += \
+       man/systemd-hibernate-resume.8
+man/systemd-hibernate-resume.8: man/systemd-hibernate-resume@.service.8
+man/systemd-hibernate-resume.html: man/systemd-hibernate-resume@.service.html
+       $(html-alias)
+
+endif
+
 if ENABLE_HOSTNAMED
 MANPAGES += \
        man/hostnamectl.1 \
@@ -2018,6 +2164,17 @@ man/systemd-networkd.html: man/systemd-networkd.service.html
 
 endif
 
+if ENABLE_NSS_SYSTEMD
+MANPAGES += \
+       man/nss-systemd.8
+MANPAGES_ALIAS += \
+       man/libnss_systemd.so.2.8
+man/libnss_systemd.so.2.8: man/nss-systemd.8
+man/libnss_systemd.so.2.html: man/nss-systemd.html
+       $(html-alias)
+
+endif
+
 if ENABLE_QUOTACHECK
 MANPAGES += \
        man/systemd-quotacheck.service.8
@@ -2045,6 +2202,7 @@ MANPAGES += \
        man/dnssec-trust-anchors.d.5 \
        man/nss-resolve.8 \
        man/resolved.conf.5 \
+       man/systemd-resolve.1 \
        man/systemd-resolved.service.8
 MANPAGES_ALIAS += \
        man/libnss_resolve.so.2.8 \
@@ -2156,31 +2314,44 @@ if HAVE_LIBCRYPTSETUP
 MANPAGES += \
        man/crypttab.5 \
        man/systemd-cryptsetup-generator.8 \
-       man/systemd-cryptsetup@.service.8
+       man/systemd-cryptsetup@.service.8 \
+       man/systemd-veritysetup-generator.8 \
+       man/systemd-veritysetup@.service.8
 MANPAGES_ALIAS += \
-       man/systemd-cryptsetup.8
+       man/systemd-cryptsetup.8 \
+       man/systemd-veritysetup.8
 man/systemd-cryptsetup.8: man/systemd-cryptsetup@.service.8
+man/systemd-veritysetup.8: man/systemd-veritysetup@.service.8
 man/systemd-cryptsetup.html: man/systemd-cryptsetup@.service.html
        $(html-alias)
 
+man/systemd-veritysetup.html: man/systemd-veritysetup@.service.html
+       $(html-alias)
+
 endif
 
 if HAVE_MICROHTTPD
 MANPAGES += \
        man/journal-remote.conf.5 \
+       man/journal-upload.conf.5 \
        man/systemd-journal-gatewayd.service.8 \
        man/systemd-journal-remote.8 \
        man/systemd-journal-upload.8
 MANPAGES_ALIAS += \
        man/journal-remote.conf.d.5 \
+       man/journal-upload.conf.d.5 \
        man/systemd-journal-gatewayd.8 \
        man/systemd-journal-gatewayd.socket.8
 man/journal-remote.conf.d.5: man/journal-remote.conf.5
+man/journal-upload.conf.d.5: man/journal-upload.conf.5
 man/systemd-journal-gatewayd.8: man/systemd-journal-gatewayd.service.8
 man/systemd-journal-gatewayd.socket.8: man/systemd-journal-gatewayd.service.8
 man/journal-remote.conf.d.html: man/journal-remote.conf.html
        $(html-alias)
 
+man/journal-upload.conf.d.html: man/journal-upload.conf.html
+       $(html-alias)
+
 man/systemd-journal-gatewayd.html: man/systemd-journal-gatewayd.service.html
        $(html-alias)
 
@@ -2497,12 +2668,14 @@ EXTRA_DIST += \
        man/crypttab.xml \
        man/daemon.xml \
        man/dnssec-trust-anchors.d.xml \
+       man/environment.d.xml \
        man/file-hierarchy.xml \
        man/halt.xml \
        man/hostname.xml \
        man/hostnamectl.xml \
        man/hwdb.xml \
        man/journal-remote.conf.xml \
+       man/journal-upload.conf.xml \
        man/journalctl.xml \
        man/journald.conf.xml \
        man/kernel-command-line.xml \
@@ -2524,6 +2697,7 @@ EXTRA_DIST += \
        man/nss-myhostname.xml \
        man/nss-mymachines.xml \
        man/nss-resolve.xml \
+       man/nss-systemd.xml \
        man/os-release.xml \
        man/pam_systemd.xml \
        man/resolved.conf.xml \
@@ -2556,6 +2730,8 @@ EXTRA_DIST += \
        man/sd_bus_path_encode.xml \
        man/sd_bus_process.xml \
        man/sd_bus_request_name.xml \
+       man/sd_bus_track_add_name.xml \
+       man/sd_bus_track_new.xml \
        man/sd_event_add_child.xml \
        man/sd_event_add_defer.xml \
        man/sd_event_add_io.xml \
@@ -2625,6 +2801,7 @@ EXTRA_DIST += \
        man/systemd-debug-generator.xml \
        man/systemd-delta.xml \
        man/systemd-detect-virt.xml \
+       man/systemd-environment-d-generator.xml \
        man/systemd-escape.xml \
        man/systemd-firstboot.xml \
        man/systemd-fsck@.service.xml \
@@ -2649,6 +2826,7 @@ EXTRA_DIST += \
        man/systemd-machine-id-setup.xml \
        man/systemd-machined.service.xml \
        man/systemd-modules-load.service.xml \
+       man/systemd-mount.xml \
        man/systemd-networkd-wait-online.service.xml \
        man/systemd-networkd.service.xml \
        man/systemd-notify.xml \
@@ -2679,8 +2857,12 @@ EXTRA_DIST += \
        man/systemd-update-utmp.service.xml \
        man/systemd-user-sessions.service.xml \
        man/systemd-vconsole-setup.service.xml \
+       man/systemd-veritysetup-generator.xml \
+       man/systemd-veritysetup@.service.xml \
+       man/systemd-volatile-root.service.xml \
        man/systemd.automount.xml \
        man/systemd.device.xml \
+       man/systemd.environment-generator.xml \
        man/systemd.exec.xml \
        man/systemd.generator.xml \
        man/systemd.journal-fields.xml \
index 30aefea..7684a87 100644 (file)
@@ -39,12 +39,12 @@ SUBDIRS = . po
 .PRECIOUS: $(TEST_SUITE_LOG) Makefile
 
 LIBUDEV_CURRENT=7
-LIBUDEV_REVISION=5
+LIBUDEV_REVISION=6
 LIBUDEV_AGE=6
 
-LIBSYSTEMD_CURRENT=16
+LIBSYSTEMD_CURRENT=19
 LIBSYSTEMD_REVISION=0
-LIBSYSTEMD_AGE=16
+LIBSYSTEMD_AGE=19
 
 # Dirs of external packages
 dbuspolicydir=@dbuspolicydir@
@@ -55,6 +55,8 @@ pamconfdir=@pamconfdir@
 pkgconfigdatadir=$(datadir)/pkgconfig
 pkgconfiglibdir=$(libdir)/pkgconfig
 polkitpolicydir=$(datadir)/polkit-1/actions
+polkitrulesdir=$(datadir)/polkit-1/rules.d
+polkitpkladir=$(localstatedir)/lib/polkit-1/localauthority/10-vendor.d
 bashcompletiondir=@bashcompletiondir@
 zshcompletiondir=@zshcompletiondir@
 rpmmacrosdir=@rpmmacrosdir@
@@ -66,6 +68,7 @@ catalogstatedir=$(systemdstatedir)/catalog
 xinitrcdir=$(sysconfdir)/X11/xinit/xinitrc.d
 
 # Our own, non-special dirs
+environmentdir=$(prefix)/lib/environment.d
 pkgsysconfdir=$(sysconfdir)/systemd
 userunitdir=$(prefix)/lib/systemd/user
 userpresetdir=$(prefix)/lib/systemd/user-preset
@@ -78,6 +81,8 @@ networkdir=$(rootprefix)/lib/systemd/network
 pkgincludedir=$(includedir)/systemd
 systemgeneratordir=$(rootlibexecdir)/system-generators
 usergeneratordir=$(prefix)/lib/systemd/user-generators
+systemenvgeneratordir=$(prefix)/lib/systemd/system-environment-generators
+userenvgeneratordir=$(prefix)/lib/systemd/user-environment-generators
 systemshutdowndir=$(rootlibexecdir)/system-shutdown
 systemsleepdir=$(rootlibexecdir)/system-sleep
 systemunitdir=$(rootprefix)/lib/systemd/system
@@ -91,6 +96,7 @@ kernelinstalldir = $(prefix)/lib/kernel/install.d
 factory_etcdir = $(datadir)/factory/etc
 factory_pamdir = $(datadir)/factory/etc/pam.d
 bootlibdir = $(prefix)/lib/systemd/boot/efi
+testsdir = $(prefix)/lib/systemd/tests
 
 # And these are the special ones for /
 rootprefix=@rootprefix@
@@ -116,6 +122,8 @@ pkgconfiglib_DATA =
 polkitpolicy_in_in_files =
 polkitpolicy_in_files =
 polkitpolicy_files =
+polkitrules_files =
+polkitpkla_files =
 dist_udevrules_DATA =
 nodist_udevrules_DATA =
 dist_pkgsysconf_DATA =
@@ -129,6 +137,7 @@ check_DATA =
 dist_rootlibexec_DATA =
 tests=
 manual_tests =
+TEST_DATA_FILES =
 TEST_EXTENSIONS = .py
 PY_LOG_COMPILER = $(PYTHON)
 DISABLE_HARD_ERRORS = yes
@@ -145,7 +154,8 @@ TESTS =
 endif
 AM_TESTS_ENVIRONMENT = \
        export SYSTEMD_KBD_MODEL_MAP=$(abs_top_srcdir)/src/locale/kbd-model-map; \
-       export SYSTEMD_LANGUAGE_FALLBACK_MAP=$(abs_top_srcdir)/src/locale/language-fallback-map;
+       export SYSTEMD_LANGUAGE_FALLBACK_MAP=$(abs_top_srcdir)/src/locale/language-fallback-map; \
+       export PATH=$(abs_top_builddir):$$PATH;
 
 if ENABLE_BASH_COMPLETION
 dist_bashcompletion_DATA = $(dist_bashcompletion_data)
@@ -157,6 +167,7 @@ nodist_zshcompletion_DATA = $(nodist_zshcompletion_data)
 endif
 udevlibexec_PROGRAMS =
 gperf_gperf_sources =
+rootlib_LTLIBRARIES =
 
 in_files = $(filter %.in,$(EXTRA_DIST))
 in_in_files = $(filter %.in.in, $(in_files))
@@ -200,6 +211,8 @@ AM_CPPFLAGS = \
        -DSYSTEMD_CRYPTSETUP_PATH=\"$(rootlibexecdir)/systemd-cryptsetup\" \
        -DSYSTEM_GENERATOR_PATH=\"$(systemgeneratordir)\" \
        -DUSER_GENERATOR_PATH=\"$(usergeneratordir)\" \
+       -DSYSTEM_ENV_GENERATOR_PATH=\"$(systemenvgeneratordir)\" \
+       -DUSER_ENV_GENERATOR_PATH=\"$(userenvgeneratordir)\" \
        -DSYSTEM_SHUTDOWN_PATH=\"$(systemshutdowndir)\" \
        -DSYSTEM_SLEEP_PATH=\"$(systemsleepdir)\" \
        -DSYSTEMD_KBD_MODEL_MAP=\"$(pkgdatadir)/kbd-model-map\" \
@@ -213,7 +226,6 @@ AM_CPPFLAGS = \
        -DLIBDIR=\"$(libdir)\" \
        -DROOTLIBDIR=\"$(rootlibdir)\" \
        -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \
-       -DTEST_DIR=\"$(abs_top_srcdir)/test\" \
        -I $(top_srcdir)/src \
        -I $(top_builddir)/src/basic \
        -I $(top_srcdir)/src/basic \
@@ -245,31 +257,23 @@ AM_CPPFLAGS = \
        -I $(top_srcdir)/src/libsystemd/sd-device \
        -I $(top_srcdir)/src/libsystemd/sd-id128 \
        -I $(top_srcdir)/src/libsystemd-network \
+       -DABS_SRC_DIR=\"$(abs_top_srcdir)\" \
+       -DABS_BUILD_DIR=\"$(abs_top_builddir)\" \
        $(OUR_CPPFLAGS)
 
 AM_CFLAGS = $(OUR_CFLAGS)
 AM_LDFLAGS = $(OUR_LDFLAGS)
 
 # ------------------------------------------------------------------------------
-define move-to-rootlibdir
-       if test "$(libdir)" != "$(rootlibdir)"; then \
-               $(MKDIR_P) $(DESTDIR)$(rootlibdir) && \
-               so_img_name=$$(readlink $(DESTDIR)$(libdir)/$$libname) && \
-               rm -f $(DESTDIR)$(libdir)/$$libname && \
-               cd $(DESTDIR); $(LN_S) -f ./$(rootlibdir)/$$so_img_name ./$(libdir)/$$libname && \
-               mv $(DESTDIR)$(libdir)/$$libname.* $(DESTDIR)$(rootlibdir); \
-       fi
-endef
-
-
-
 INSTALL_DIRS =
 
 SHUTDOWN_TARGET_WANTS =
 LOCAL_FS_TARGET_WANTS =
+REMOTE_FS_TARGET_WANTS =
 MULTI_USER_TARGET_WANTS =
 GRAPHICAL_TARGET_WANTS =
 DELAYED_TARGET_WANTS=
+MACHINES_TARGET_WANTS =
 RESCUE_TARGET_WANTS =
 SYSINIT_TARGET_WANTS =
 SOCKETS_TARGET_WANTS =
@@ -287,6 +291,8 @@ GENERAL_ALIASES =
 install-target-wants-hook:
        what="$(SHUTDOWN_TARGET_WANTS)" && wants=shutdown.target && dir=$(systemunitdir) && $(add-wants)
        what="$(LOCAL_FS_TARGET_WANTS)" && wants=local-fs.target && dir=$(systemunitdir) && $(add-wants)
+       what="$(REMOTE_FS_TARGET_WANTS)" && wants=remote-fs.target && dir=$(systemunitdir) && $(add-wants)
+       what="$(MACHINES_TARGET_WANTS)" && wants=machines.target && dir=$(systemunitdir) && $(add-wants)
        what="$(MULTI_USER_TARGET_WANTS)" && wants=multi-user.target && dir=$(systemunitdir) && $(add-wants)
        what="$(GRAPHICAL_TARGET_WANTS)" && wants=graphical.target && dir=$(systemunitdir) && $(add-wants)
        what="$(DELAYED_TARGET_WANTS)" && wants=delayed.target && dir=$(systemunitdir) && $(add-wants)
@@ -315,6 +321,10 @@ endef
 install-directories-hook:
        $(MKDIR_P) $(addprefix $(DESTDIR),$(INSTALL_DIRS))
 
+install-environment-conf-hook: install-directories-hook
+       $(AM_V_LN)$(LN_S) --relative -f $(DESTDIR)$(sysconfdir)/environment \
+               $(DESTDIR)$(environmentdir)/99-environment.conf
+
 install-aliases-hook:
        set -- $(SYSTEM_UNIT_ALIASES) && \
                dir=$(systemunitdir) && $(install-aliases)
@@ -348,10 +358,13 @@ INSTALL_EXEC_HOOKS += \
        install-target-wants-hook \
        install-directories-hook \
        install-aliases-hook \
-       install-touch-usr-hook
+       install-touch-usr-hook \
+       install-busnames-target-wants-hook
 
+if ENABLE_ENVIRONMENT_D
 INSTALL_EXEC_HOOKS += \
-       install-busnames-target-wants-hook
+       install-environment-conf-hook
+endif
 
 # ------------------------------------------------------------------------------
 AM_V_M4 = $(AM_V_M4_$(V))
@@ -391,6 +404,7 @@ bin_PROGRAMS = \
        systemd-delta \
        systemd-analyze \
        systemd-run \
+       systemd-mount \
        systemd-stdio-bridge \
        systemd-path
 
@@ -407,6 +421,7 @@ rootlibexec_PROGRAMS = \
        systemd-initctl \
        systemd-shutdown \
        systemd-remount-fs \
+       systemd-volatile-root \
        systemd-reply-password \
        systemd-fsck \
        systemd-ac-power \
@@ -415,6 +430,11 @@ rootlibexec_PROGRAMS = \
        systemd-socket-proxyd \
        systemd-update-done
 
+if HAVE_BLKID
+rootlibexec_PROGRAMS += \
+       systemd-dissect
+endif
+
 if HAVE_UTMP
 rootlibexec_PROGRAMS += \
        systemd-update-utmp
@@ -426,6 +446,17 @@ systemgenerator_PROGRAMS = \
        systemd-system-update-generator \
        systemd-debug-generator
 
+if ENABLE_ENVIRONMENT_D
+userenvgenerator_PROGRAMS = \
+       30-systemd-environment-d-generator
+endif
+
+rootlibexec_SCRIPTS = \
+       src/sulogin-shell/systemd-sulogin-shell
+
+EXTRA_DIST += \
+       src/sulogin-shell/systemd-sulogin-shell.in
+
 dist_bashcompletion_data = \
        shell-completion/bash/busctl \
        shell-completion/bash/journalctl \
@@ -508,7 +539,6 @@ dist_systemunit_DATA = \
        units/swap.target \
        units/slices.target \
        units/system.slice \
-       units/x-.slice \
        units/systemd-initctl.socket \
        units/syslog.socket \
        units/dev-hugepages.mount \
@@ -517,10 +547,8 @@ dist_systemunit_DATA = \
        units/sys-kernel-debug.mount \
        units/sys-fs-fuse-connections.mount \
        units/tmp.mount \
-       units/var-lib-machines.mount \
        units/printer.target \
        units/sound.target \
-       units/bluetooth.target \
        units/smartcard.target \
        units/systemd-ask-password-wall.path \
        units/systemd-ask-password-console.path \
@@ -540,6 +568,12 @@ dist_systemunit_DATA += \
        units/system-default-target-done.service \
        units/system-delayed-target-done.service
 
+EXTRA_DIST += \
+       units/booting-done.service.in \
+       units/system-delayed-target-done.service.in \
+       units/system-delayed-target-trigger.service.in \
+       units/system-default-target-done.service.in
+
 GRAPHICAL_TARGET_WANTS += \
        system-delayed-target-trigger.service \
        system-default-target-done.service
@@ -554,11 +588,12 @@ dist_systemunit_DATA_busnames += \
 nodist_systemunit_DATA = \
        units/getty@.service \
        units/serial-getty@.service \
-       units/console-shell.service \
        units/console-getty.service \
        units/container-getty@.service \
+       units/system-update-cleanup.service \
        units/systemd-initctl.service \
        units/systemd-remount-fs.service \
+       units/systemd-volatile-root.service \
        units/systemd-ask-password-wall.service \
        units/systemd-ask-password-console.service \
        units/systemd-sysctl.service \
@@ -595,7 +630,18 @@ endif
 dist_userunit_DATA = \
        units/user/basic.target \
        units/user/default.target \
-       units/user/exit.target
+       units/user/exit.target \
+       units/user/graphical-session.target \
+       units/user/graphical-session-pre.target \
+       units/user/bluetooth.target \
+       units/user/busnames.target \
+       units/user/paths.target \
+       units/user/printer.target \
+       units/user/shutdown.target \
+       units/user/smartcard.target \
+       units/user/sockets.target \
+       units/user/sound.target \
+       units/user/timers.target
 
 dist_userunit_DATA += \
        units/user/delayed.target \
@@ -619,12 +665,13 @@ dist_systempreset_DATA = \
 EXTRA_DIST += \
        units/getty@.service.m4 \
        units/serial-getty@.service.m4 \
-       units/console-shell.service.m4.in \
        units/console-getty.service.m4.in \
        units/container-getty@.service.m4.in \
        units/rescue.service.in \
+       units/system-update-cleanup.service.in \
        units/systemd-initctl.service.in \
        units/systemd-remount-fs.service.in \
+       units/systemd-volatile-root.service.in \
        units/systemd-update-utmp.service.in \
        units/systemd-update-utmp-runlevel.service.in \
        units/systemd-ask-password-wall.service.in \
@@ -650,7 +697,7 @@ EXTRA_DIST += \
        units/initrd-switch-root.service.in \
        units/systemd-nspawn@.service.in \
        units/systemd-update-done.service.in \
-    units/tmp.mount.m4
+       units/tmp.mount.m4
 
 if HAVE_SYSV_COMPAT
 nodist_systemunit_DATA += \
@@ -667,16 +714,8 @@ EXTRA_DIST += \
        units/rc-local.service.in \
        units/halt-local.service.in
 
-# automake is broken and can't handle files with a dash in front
-# http://debbugs.gnu.org/cgi/bugreport.cgi?bug=14728#8
-units-install-hook:
-       mv $(DESTDIR)$(systemunitdir)/x-.slice $(DESTDIR)/$(systemunitdir)/-.slice
-
-units-uninstall-hook:
-       rm -f $(DESTDIR)/$(systemunitdir)/-.slice
-
-INSTALL_DATA_HOOKS += units-install-hook
-UNINSTALL_DATA_HOOKS += units-uninstall-hook
+GENERAL_ALIASES += \
+       $(systemunitdir)/machines.target $(pkgsysconfdir)/system/multi-user.target.wants/machines.target
 
 dist_doc_DATA = \
        README \
@@ -685,8 +724,6 @@ dist_doc_DATA = \
        LICENSE.LGPL2.1 \
        LICENSE.GPL2 \
        DISTRO_PORTING \
-       src/libsystemd/sd-bus/PORTING-DBUS1 \
-       src/libsystemd/sd-bus/DIFFERENCES \
        src/libsystemd/sd-bus/GVARIANT-SERIALIZATION
 
 EXTRA_DIST += \
@@ -701,6 +738,15 @@ EXTRA_DIST += \
 
 @INTLTOOL_POLICY_RULE@
 
+systemd-mount-install-hook:
+       -$(LN_S) systemd-mount $(DESTDIR)$(bindir)/systemd-umount
+
+systemd-mount-uninstall-hook:
+       -rm $(DESTDIR)$(bindir)/systemd-umount
+
+INSTALL_EXEC_HOOKS += systemd-mount-install-hook
+UNINSTALL_EXEC_HOOKS += systemd-mount-uninstall-hook
+
 # ------------------------------------------------------------------------------
 
 MANPAGES =
@@ -743,9 +789,11 @@ man/index.html: man/systemd.index.html
        $(AM_V_LN)$(LN_S) -f systemd.index.html $@
 
 if HAVE_PYTHON
+if ENABLE_MANPAGES
 noinst_DATA += \
        man/index.html
 endif
+endif
 
 CLEANFILES += \
        man/index.html
@@ -780,7 +828,9 @@ EXTRA_DIST += \
        tools/make-man-rules.py \
        tools/make-directive-index.py \
        tools/xml_helper.py \
-       man/glib-event-glue.c
+       man/glib-event-glue.c \
+       man/50-xdg-data-dirs.sh \
+       man/90-rearrange-path.py
 
 # ------------------------------------------------------------------------------
 noinst_LTLIBRARIES += \
@@ -892,6 +942,8 @@ libbasic_la_SOURCES = \
        src/basic/bus-label.h \
        src/basic/ratelimit.h \
        src/basic/ratelimit.c \
+       src/basic/exec-util.c \
+       src/basic/exec-util.h \
        src/basic/exit-status.c \
        src/basic/exit-status.h \
        src/basic/virt.c \
@@ -974,8 +1026,12 @@ libbasic_la_SOURCES = \
        src/basic/copy.h \
        src/basic/alloc-util.h \
        src/basic/alloc-util.c \
-       src/basic/formats-util.h \
-       src/basic/nss-util.h
+       src/basic/format-util.h \
+       src/basic/nss-util.h \
+       src/basic/khash.h \
+       src/basic/khash.c \
+       src/basic/journal-importer.h \
+       src/basic/journal-importer.c
 
 nodist_libbasic_la_SOURCES = \
        src/basic/errno-from-name.h \
@@ -996,8 +1052,7 @@ libbasic_la_CFLAGS = \
 libbasic_la_LIBADD = \
        $(SELINUX_LIBS) \
        $(CAP_LIBS) \
-       -lrt \
-       -lm
+       -lrt
 
 # -----------------------------------------------------------------------------
 noinst_LTLIBRARIES += \
@@ -1008,7 +1063,9 @@ libshared_la_SOURCES = \
        src/shared/output-mode.c \
        src/shared/gpt.h \
        src/shared/udev-util.h \
+       src/shared/udev-util.c \
        src/shared/linux/auto_dev-ioctl.h \
+       src/shared/linux-3.13/dm-ioctl.h \
        src/shared/initreq.h \
        src/shared/dns-domain.c \
        src/shared/dns-domain.h \
@@ -1028,6 +1085,8 @@ libshared_la_SOURCES = \
        src/shared/apparmor-util.h \
        src/shared/ima-util.c \
        src/shared/ima-util.h \
+       src/shared/journal-util.c \
+       src/shared/journal-util.h \
        src/shared/ptyfwd.c \
        src/shared/ptyfwd.h \
        src/shared/base-filesystem.c \
@@ -1079,6 +1138,8 @@ libshared_la_SOURCES = \
        src/shared/machine-image.h \
        src/shared/machine-pool.c \
        src/shared/machine-pool.h \
+       src/shared/loop-util.c \
+       src/shared/loop-util.h \
        src/shared/resolve-util.c \
        src/shared/resolve-util.h \
        src/shared/bus-unit-util.c \
@@ -1088,7 +1149,13 @@ libshared_la_SOURCES = \
        src/shared/tests.h \
        src/shared/tests.c \
        src/shared/fdset.c \
-       src/shared/fdset.h
+       src/shared/fdset.h \
+       src/shared/nsflags.h \
+       src/shared/nsflags.c \
+       src/shared/dissect-image.c \
+       src/shared/dissect-image.h \
+       src/shared/volatile-util.c \
+       src/shared/volatile-util.h
 
 if HAVE_UTMP
 libshared_la_SOURCES += \
@@ -1111,7 +1178,10 @@ libshared_la_CFLAGS = \
        $(AM_CFLAGS) \
        $(ACL_CFLAGS) \
        $(LIBIDN_CFLAGS) \
-       $(SECCOMP_CFLAGS)
+       $(LIBIDN2_CFLAGS) \
+       $(SECCOMP_CFLAGS) \
+       $(BLKID_CFLAGS) \
+       $(LIBCRYPTSETUP_CFLAGS)
 
 libshared_la_LIBADD = \
        libsystemd-internal.la \
@@ -1120,7 +1190,10 @@ libshared_la_LIBADD = \
        libudev-internal.la \
        $(ACL_LIBS) \
        $(LIBIDN_LIBS) \
-       $(SECCOMP_LIBS)
+       $(LIBIDN2_LIBS) \
+       $(SECCOMP_LIBS) \
+       $(BLKID_LIBS) \
+       $(LIBCRYPTSETUP_LIBS)
 
 rootlibexec_LTLIBRARIES += \
        libsystemd-shared.la
@@ -1141,7 +1214,10 @@ libsystemd_shared_la_CFLAGS = \
        $(libudev_internal_la_CFLAGS) \
        $(ACL_CFLAGS) \
        $(LIBIDN_CFLAGS) \
+       $(LIBIDN2_CFLAGS) \
        $(SECCOMP_CFLAGS) \
+       $(BLKID_CFLAGS) \
+       $(LIBCRYPTSETUP_CFLAGS) \
        -fvisibility=default
 
 # We can't use libshared_la_LIBADD here because it would
@@ -1153,7 +1229,10 @@ libsystemd_shared_la_LIBADD = \
        $(libudev_internal_la_LIBADD) \
        $(ACL_LIBS) \
        $(LIBIDN_LIBS) \
-       $(SECCOMP_LIBS)
+       $(LIBIDN2_LIBS) \
+       $(SECCOMP_LIBS) \
+       $(BLKID_LIBS) \
+       $(LIBCRYPTSETUP_LIBS)
 
 libsystemd_shared_la_LDFLAGS = \
        $(AM_LDFLAGS) \
@@ -1233,6 +1312,8 @@ libcore_la_SOURCES = \
        src/core/load-dropin.h \
        src/core/execute.c \
        src/core/execute.h \
+       src/core/dynamic-user.c \
+       src/core/dynamic-user.h \
        src/core/kill.c \
        src/core/kill.h \
        src/core/dbus.c \
@@ -1303,8 +1384,8 @@ libcore_la_SOURCES = \
        src/core/audit-fd.h \
        src/core/show-status.c \
        src/core/show-status.h \
-       src/core/failure-action.c \
-       src/core/failure-action.h
+       src/core/emergency-action.c \
+       src/core/emergency-action.h
 
 nodist_libcore_la_SOURCES = \
        src/core/load-fragment-gperf.c \
@@ -1491,7 +1572,8 @@ manual_tests += \
        test-btrfs \
        test-acd \
        test-ipv4ll-manual \
-       test-ask-password-api
+       test-ask-password-api \
+       test-dissect-image
 
 unsafe_tests = \
        test-hostname \
@@ -1527,6 +1609,8 @@ tests += \
        test-utf8 \
        test-ellipsize \
        test-util \
+       test-mount-util \
+       test-exec-util \
        test-cpu-set-util \
        test-hexdecoct \
        test-escape \
@@ -1577,6 +1661,7 @@ tests += \
        test-conf-parser \
        test-capability \
        test-async \
+       test-random-util \
        test-ratelimit \
        test-condition \
        test-uid-range \
@@ -1593,14 +1678,20 @@ tests += \
        test-rlimit-util \
        test-signal-util \
        test-selinux \
-       test-sizeof
+       test-sizeof \
+       test-journal-importer
 
 if HAVE_ACL
 tests += \
        test-acl-util
 endif
 
-EXTRA_DIST += \
+if HAVE_SECCOMP
+tests += \
+       test-seccomp
+endif
+
+TEST_DATA_FILES += \
        test/a.service \
        test/basic.target \
        test/b.service \
@@ -1657,15 +1748,37 @@ EXTRA_DIST += \
        test/test-execute/exec-passenvironment.service \
        test/test-execute/exec-group.service \
        test/test-execute/exec-group-nfsnobody.service \
+       test/test-execute/exec-supplementarygroups.service \
+       test/test-execute/exec-supplementarygroups-single-group.service \
+       test/test-execute/exec-supplementarygroups-single-group-user.service \
+       test/test-execute/exec-supplementarygroups-multiple-groups-default-group-user.service \
+       test/test-execute/exec-supplementarygroups-multiple-groups-withgid.service \
+       test/test-execute/exec-supplementarygroups-multiple-groups-withuid.service \
+       test/test-execute/exec-dynamicuser-fixeduser.service \
+       test/test-execute/exec-dynamicuser-fixeduser-one-supplementarygroup.service \
+       test/test-execute/exec-dynamicuser-supplementarygroups.service \
        test/test-execute/exec-ignoresigpipe-no.service \
        test/test-execute/exec-ignoresigpipe-yes.service \
        test/test-execute/exec-personality-x86-64.service \
        test/test-execute/exec-personality-x86.service \
        test/test-execute/exec-personality-s390.service \
+       test/test-execute/exec-personality-ppc64.service \
+       test/test-execute/exec-personality-ppc64le.service \
+       test/test-execute/exec-personality-aarch64.service \
        test/test-execute/exec-privatedevices-no.service \
        test/test-execute/exec-privatedevices-yes.service \
+       test/test-execute/exec-privatedevices-no-capability-mknod.service \
+       test/test-execute/exec-privatedevices-yes-capability-mknod.service \
+       test/test-execute/exec-protectkernelmodules-no-capabilities.service \
+       test/test-execute/exec-protectkernelmodules-yes-capabilities.service \
+       test/test-execute/exec-protectkernelmodules-yes-mount-propagation.service \
        test/test-execute/exec-privatetmp-no.service \
        test/test-execute/exec-privatetmp-yes.service \
+       test/test-execute/exec-readonlypaths.service \
+       test/test-execute/exec-readonlypaths-mount-propagation.service \
+       test/test-execute/exec-readwritepaths-mount-propagation.service \
+       test/test-execute/exec-inaccessiblepaths-mount-propagation.service \
+       test/test-execute/exec-inaccessiblepaths-proc.service \
        test/test-execute/exec-spec-interpolation.service \
        test/test-execute/exec-systemcallerrornumber.service \
        test/test-execute/exec-systemcallfilter-failing2.service \
@@ -1699,13 +1812,21 @@ EXTRA_DIST += \
        test/test-execute/exec-runtimedirectory-mode.service \
        test/test-execute/exec-runtimedirectory-owner.service \
        test/test-execute/exec-runtimedirectory-owner-nfsnobody.service \
+       test/test-execute/exec-restrict-namespaces-no.service \
+       test/test-execute/exec-restrict-namespaces-yes.service \
+       test/test-execute/exec-restrict-namespaces-mnt.service \
+       test/test-execute/exec-restrict-namespaces-mnt-blacklist.service \
+       test/test-execute/exec-read-only-path-succeed.service \
+       test/test-execute/exec-privatedevices-yes-capability-sys-rawio.service \
+       test/test-execute/exec-privatedevices-no-capability-sys-rawio.service \
        test/bus-policy/hello.conf \
        test/bus-policy/methods.conf \
        test/bus-policy/ownerships.conf \
        test/bus-policy/signals.conf \
        test/bus-policy/check-own-rules.conf \
        test/bus-policy/many-rules.conf \
-       test/bus-policy/test.conf
+       test/bus-policy/test.conf \
+       test/hwdb/10-bad.hwdb
 
 
 EXTRA_DIST += \
@@ -1862,6 +1983,12 @@ test_fstab_util_SOURCES = \
 test_fstab_util_LDADD = \
        libsystemd-shared.la
 
+test_random_util_SOURCES = \
+       src/test/test-random-util.c
+
+test_random_util_LDADD = \
+       libsystemd-shared.la
+
 test_ratelimit_SOURCES = \
        src/test/test-ratelimit.c
 
@@ -1875,6 +2002,18 @@ test_util_LDADD = \
        libsystemd-internal.la \
        libsystemd-shared.la
 
+test_mount_util_SOURCES = \
+       src/test/test-mount-util.c
+
+test_mount_util_LDADD = \
+       libsystemd-shared.la
+
+test_exec_util_SOURCES = \
+       src/test/test-exec-util.c
+
+test_exec_util_LDADD = \
+       libsystemd-shared.la
+
 test_hexdecoct_SOURCES = \
        src/test/test-hexdecoct.c
 
@@ -2051,6 +2190,17 @@ test_acl_util_SOURCES = \
 test_acl_util_LDADD = \
        libsystemd-shared.la
 
+test_seccomp_SOURCES = \
+       src/test/test-seccomp.c
+
+test_seccomp_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(SECCOMP_CFLAGS)
+
+test_seccomp_LDADD = \
+       libsystemd-shared.la \
+       $(SECCOMP_LIBS)
+
 test_namespace_LDADD = \
        libcore.la
 
@@ -2066,6 +2216,17 @@ test_ask_password_api_SOURCES = \
 test_ask_password_api_LDADD = \
        libsystemd-shared.la
 
+test_dissect_image_SOURCES = \
+       src/test/test-dissect-image.c
+
+test_dissect_image_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(BLKID_CFLAGS)
+
+test_dissect_image_LDADD = \
+       libsystemd-shared.la \
+       $(BLKID_LIBS)
+
 test_signal_util_SOURCES = \
        src/test/test-signal-util.c
 
@@ -2081,9 +2242,6 @@ test_selinux_LDADD = \
 test_sizeof_SOURCES = \
        src/test/test-sizeof.c
 
-test_sizeof_LDADD = \
-       libsystemd-shared.la
-
 BUILT_SOURCES += \
        src/test/test-hashmap-ordered.c
 
@@ -2335,6 +2493,7 @@ test_execute_SOURCES = \
 
 test_execute_CFLAGS = \
        $(AM_CFLAGS) \
+       $(SECCOMP_CFLAGS) \
        $(MOUNT_CFLAGS)
 
 test_execute_LDADD = \
@@ -2402,6 +2561,16 @@ test_arphrd_list_SOURCES = \
 test_arphrd_list_LDADD = \
        libsystemd-shared.la
 
+test_journal_importer_SOURCES = \
+       src/test/test-journal-importer.c
+
+test_journal_importer_LDADD = \
+       libsystemd-shared.la
+
+TEST_DATA_FILES += \
+       test/journal-data/journal-1.txt \
+       test/journal-data/journal-2.txt
+
 # ------------------------------------------------------------------------------
 ## .PHONY so it always rebuilds it
 .PHONY: coverage lcov-run lcov-report coverage-sync
@@ -2560,7 +2729,6 @@ dist_tmpfiles_DATA = \
        tmpfiles.d/systemd-nologin.conf \
        tmpfiles.d/tmp.conf \
        tmpfiles.d/x11.conf \
-       tmpfiles.d/var.conf \
        tmpfiles.d/home.conf \
        tmpfiles.d/systemd-nspawn.conf \
        tmpfiles.d/journal-nocow.conf
@@ -2570,6 +2738,11 @@ dist_tmpfiles_DATA += \
        tmpfiles.d/legacy.conf
 endif
 
+if HAVE_REMOTE
+nodist_tmpfiles_DATA += \
+       tmpfiles.d/systemd-remote.conf
+endif
+
 SYSINIT_TARGET_WANTS += \
        systemd-tmpfiles-setup-dev.service \
        systemd-tmpfiles-setup.service
@@ -2587,7 +2760,9 @@ endif
 
 EXTRA_DIST += \
        tmpfiles.d/systemd.conf.m4 \
+       tmpfiles.d/systemd-remote.conf.m4 \
        tmpfiles.d/etc.conf.m4 \
+       tmpfiles.d/var.conf.m4 \
        units/systemd-tmpfiles-setup-dev.service.in \
        units/systemd-tmpfiles-setup.service.in \
        units/systemd-tmpfiles-clean.service.in
@@ -2707,9 +2882,6 @@ systemd_detect_virt_SOURCES = \
 systemd_detect_virt_LDADD = \
        libsystemd-shared.la
 
-INSTALL_EXEC_HOOKS += \
-       systemd-detect-virt-install-hook
-
 # ------------------------------------------------------------------------------
 systemd_delta_SOURCES = \
        src/delta/delta.c
@@ -2747,6 +2919,13 @@ systemd_system_update_generator_LDADD = \
        libsystemd-shared.la
 
 # ------------------------------------------------------------------------------
+30_systemd_environment_d_generator_SOURCES = \
+       src/environment-d-generator/environment-d-generator.c
+
+30_systemd_environment_d_generator_LDADD = \
+       libsystemd-shared.la
+
+# ------------------------------------------------------------------------------
 if ENABLE_HIBERNATE
 systemgenerator_PROGRAMS += \
        systemd-hibernate-resume-generator
@@ -2866,28 +3045,37 @@ if ARCH_AARCH64
 efi_ldflags += --defsym=EFI_SUBSYSTEM=0xa
 EFI_FORMAT = -O binary
 else
+if ARCH_ARM
+efi_ldflags += --defsym=EFI_SUBSYSTEM=0xa
+EFI_FORMAT = -O binary
+else
 EFI_FORMAT = --target=efi-app-$(EFI_ARCH)
 endif
 endif
 endif
+endif
 
 # ------------------------------------------------------------------------------
-systemd_boot_headers = \
-       src/boot/efi/util.h \
+efi_headers = \
        src/boot/efi/console.h \
+       src/boot/efi/disk.h \
        src/boot/efi/graphics.h \
-       src/boot/efi/pefile.h \
+       src/boot/efi/linux.h \
        src/boot/efi/measure.h \
-       src/boot/efi/disk.h
+       src/boot/efi/pe.h \
+       src/boot/efi/splash.h \
+       src/boot/efi/util.h \
+       src/boot/efi/shim.h
 
 systemd_boot_sources = \
-       src/boot/efi/util.c \
+       src/boot/efi/boot.c \
        src/boot/efi/console.c \
-       src/boot/efi/graphics.c \
-       src/boot/efi/pefile.c \
        src/boot/efi/disk.c \
+       src/boot/efi/graphics.c \
        src/boot/efi/measure.c \
-       src/boot/efi/boot.c
+       src/boot/efi/pe.c \
+       src/boot/efi/util.c \
+       src/boot/efi/shim.c
 
 EXTRA_DIST += $(systemd_boot_sources) $(systemd_boot_headers)
 
@@ -2899,7 +3087,7 @@ if ENABLE_EFI
 if HAVE_GNUEFI
 bootlib_DATA = $(systemd_boot)
 
-$(top_builddir)/src/boot/efi/%.o: $(top_srcdir)/src/boot/efi/%.c $(addprefix $(top_srcdir)/,$(systemd_boot_headers))
+$(top_builddir)/src/boot/efi/%.o: $(top_srcdir)/src/boot/efi/%.c $(addprefix $(top_srcdir)/,$(efi_headers))
        @$(MKDIR_P) $(top_builddir)/src/boot/efi/
        $(AM_V_CC)$(EFI_CC) $(efi_cppflags) $(efi_cflags) -c $< -o $@
 
@@ -2917,24 +3105,15 @@ endif
 CLEANFILES += $(systemd_boot_objects) $(systemd_boot_solib) $(systemd_boot)
 
 # ------------------------------------------------------------------------------
-stub_headers = \
-       src/boot/efi/util.h \
-       src/boot/efi/pefile.h \
-       src/boot/efi/disk.h \
-       src/boot/efi/graphics.h \
-       src/boot/efi/splash.h \
-       src/boot/efi/measure.h \
-       src/boot/efi/linux.h
-
 stub_sources = \
-       src/boot/efi/util.c \
-       src/boot/efi/pefile.c \
        src/boot/efi/disk.c \
        src/boot/efi/graphics.c \
-       src/boot/efi/splash.c \
        src/boot/efi/linux.c \
        src/boot/efi/measure.c \
-       src/boot/efi/stub.c
+       src/boot/efi/pe.c \
+       src/boot/efi/splash.c \
+       src/boot/efi/stub.c \
+       src/boot/efi/util.c
 
 EXTRA_DIST += \
        $(stub_sources) \
@@ -2949,10 +3128,6 @@ if ENABLE_EFI
 if HAVE_GNUEFI
 bootlib_DATA += $(stub)
 
-$(top_builddir)/src/boot/efi/%.o: $(top_srcdir)/src/boot/efi/%.c $(addprefix $(top_srcdir)/,$(stub_headers))
-       @$(MKDIR_P) $(top_builddir)/src/boot/efi/
-       $(AM_V_CC)$(EFI_CC) $(efi_cppflags) $(efi_cflags) -c $< -o $@
-
 $(stub_solib): $(stub_objects)
        $(AM_V_CCLD)$(LD) $(efi_ldflags) $(stub_objects) \
                -o $@ -lefi -lgnuefi $(shell $(CC) -print-libgcc-file-name); \
@@ -2970,8 +3145,8 @@ CLEANFILES += $(stub_objects) $(stub_solib) $(stub)
 # ------------------------------------------------------------------------------
 CLEANFILES += test-efi-disk.img
 
-test-efi-disk.img: $(systemd_boot) $(stub) test/test-efi-create-disk.sh
-       $(AM_V_GEN)test/test-efi-create-disk.sh
+test-efi-disk.img: $(systemd_boot) $(stub) test/splash.bmp test/test-efi-create-disk.sh
+       $(AM_V_GEN)test/test-efi-create-disk.sh $@ $(systemd_boot) $(stub) test/splash.bmp
 
 test-efi: test-efi-disk.img
        $(QEMU) -machine accel=kvm -m 1024 -bios $(QEMU_BIOS) -snapshot test-efi-disk.img
@@ -3043,6 +3218,13 @@ systemd_remount_fs_LDADD = \
        libsystemd-shared.la
 
 # ------------------------------------------------------------------------------
+systemd_volatile_root_SOURCES = \
+       src/volatile-root/volatile-root.c
+
+systemd_volatile_root_LDADD = \
+       libsystemd-shared.la
+
+# ------------------------------------------------------------------------------
 systemd_cgroups_agent_SOURCES = \
        src/cgroups-agent/cgroups-agent.c
 
@@ -3071,6 +3253,13 @@ systemd_notify_LDADD = \
        libsystemd-shared.la
 
 # ------------------------------------------------------------------------------
+systemd_dissect_SOURCES = \
+       src/dissect/dissect.c
+
+systemd_dissect_LDADD = \
+       libsystemd-shared.la
+
+# ------------------------------------------------------------------------------
 systemd_path_SOURCES = \
        src/path/path.c
 
@@ -3182,6 +3371,13 @@ systemd_run_LDADD = \
        libsystemd-shared.la
 
 # ------------------------------------------------------------------------------
+systemd_mount_SOURCES = \
+       src/mount/mount-tool.c
+
+systemd_mount_LDADD = \
+       libsystemd-shared.la
+
+# ------------------------------------------------------------------------------
 systemd_stdio_bridge_SOURCES = \
        src/stdio-bridge/stdio-bridge.c
 
@@ -3295,7 +3491,6 @@ noinst_LTLIBRARIES += \
 
 EXTRA_DIST += \
        src/libsystemd/libsystemd.pc.in \
-       src/libsystemd/sd-bus/DIFFERENCES \
        src/libsystemd/sd-bus/GVARIANT-SERIALIZATION
 
 libsystemd_la_SOURCES =
@@ -3310,15 +3505,6 @@ libsystemd_la_LIBADD = \
        libbasic.la \
        libsystemd-journal-internal.la
 
-libsystemd-install-hook:
-       libname=libsystemd.so && $(move-to-rootlibdir)
-
-libsystemd-uninstall-hook:
-       rm -f $(DESTDIR)$(rootlibdir)/libsystemd.so*
-
-INSTALL_EXEC_HOOKS += libsystemd-install-hook
-UNINSTALL_EXEC_HOOKS += libsystemd-uninstall-hook
-
 pkgconfiglib_DATA += \
        src/libsystemd/libsystemd.pc
 
@@ -3331,7 +3517,7 @@ pkginclude_HEADERS += \
        src/systemd/sd-id128.h \
        src/systemd/sd-daemon.h
 
-lib_LTLIBRARIES += \
+rootlib_LTLIBRARIES += \
        libsystemd.la
 
 tests += \
@@ -3347,9 +3533,11 @@ tests += \
        test-bus-zero-copy \
        test-bus-introspect \
        test-bus-objects \
+       test-bus-vtable \
        test-bus-error \
        test-bus-creds \
        test-bus-gvariant \
+       test-bus-track \
        test-event \
        test-netlink \
        test-local-addresses \
@@ -3393,6 +3581,16 @@ test_bus_cleanup_CFLAGS = \
 test_bus_cleanup_LDADD = \
        libsystemd-shared.la
 
+test_bus_track_SOURCES = \
+       src/libsystemd/sd-bus/test-bus-track.c
+
+test_bus_track_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(SECCOMP_CFLAGS)
+
+test_bus_track_LDADD = \
+       libsystemd-shared.la
+
 test_bus_server_SOURCES = \
        src/libsystemd/sd-bus/test-bus-server.c
 
@@ -3405,6 +3603,12 @@ test_bus_objects_SOURCES = \
 test_bus_objects_LDADD = \
        libsystemd-shared.la
 
+test_bus_vtable_SOURCES = \
+       src/libsystemd/sd-bus/test-bus-vtable.c
+
+test_bus_vtable_LDADD = \
+       libsystemd-shared.la
+
 test_bus_error_SOURCES = \
        src/libsystemd/sd-bus/test-bus-error.c
 
@@ -3490,9 +3694,9 @@ test_resolve_LDADD = \
        libsystemd-shared.la
 
 busctl_SOURCES = \
-       src/libsystemd/sd-bus/busctl.c \
-       src/libsystemd/sd-bus/busctl-introspect.c \
-       src/libsystemd/sd-bus/busctl-introspect.h
+       src/busctl/busctl.c \
+       src/busctl/busctl-introspect.c \
+       src/busctl/busctl-introspect.h
 
 busctl_LDADD = \
        libsystemd-shared.la
@@ -3512,6 +3716,7 @@ libsystemd_network_la_SOURCES = \
        src/systemd/sd-ipv4ll.h \
        src/systemd/sd-ipv4acd.h \
        src/systemd/sd-ndisc.h \
+       src/systemd/sd-radv.h \
        src/systemd/sd-dhcp6-client.h \
        src/systemd/sd-dhcp6-lease.h \
        src/systemd/sd-lldp.h \
@@ -3535,6 +3740,8 @@ libsystemd_network_la_SOURCES = \
        src/libsystemd-network/ndisc-internal.h \
        src/libsystemd-network/ndisc-router.h \
        src/libsystemd-network/ndisc-router.c \
+       src/libsystemd-network/sd-radv.c \
+       src/libsystemd-network/radv-internal.h \
        src/libsystemd-network/icmp6-util.h \
        src/libsystemd-network/icmp6-util.c \
        src/libsystemd-network/sd-dhcp6-client.c \
@@ -3565,6 +3772,14 @@ test_dhcp_option_LDADD = \
        libsystemd-network.la \
        libsystemd-shared.la
 
+test_sd_dhcp_lease_SOURCES = \
+      src/libsystemd-network/dhcp-lease-internal.h \
+      src/libsystemd-network/test-sd-dhcp-lease.c
+
+test_sd_dhcp_lease_LDADD = \
+      libsystemd-network.la \
+      libsystemd-shared.la
+
 test_dhcp_client_SOURCES = \
        src/systemd/sd-dhcp-client.h \
        src/libsystemd-network/dhcp-protocol.h \
@@ -3620,6 +3835,16 @@ test_ndisc_rs_LDADD = \
        libudev.la \
        libsystemd-shared.la
 
+test_ndisc_ra_SOURCES = \
+       src/systemd/sd-ndisc.h \
+       src/libsystemd-network/icmp6-util.h \
+       src/libsystemd-network/test-ndisc-ra.c
+
+test_ndisc_ra_LDADD = \
+       libsystemd-network.la \
+       libudev.la \
+       libsystemd-shared.la
+
 test_dhcp6_client_SOURCES = \
        src/systemd/sd-dhcp6-client.h \
        src/libsystemd-network/dhcp6-internal.h \
@@ -3643,8 +3868,10 @@ tests += \
        test-dhcp-option \
        test-dhcp-client \
        test-dhcp-server \
+       test-sd-dhcp-lease \
        test-ipv4ll \
        test-ndisc-rs \
+       test-ndisc-ra \
        test-dhcp6-client \
        test-lldp
 
@@ -3652,7 +3879,7 @@ tests += \
 include_HEADERS += \
        src/libudev/libudev.h
 
-lib_LTLIBRARIES += \
+rootlib_LTLIBRARIES += \
        libudev.la
 
 libudev_la_SOURCES =\
@@ -3684,16 +3911,6 @@ pkgconfiglib_DATA += \
 EXTRA_DIST += \
        src/libudev/libudev.pc.in
 
-# move lib from $(libdir) to $(rootlibdir) and update devel link, if needed
-libudev-install-hook:
-       libname=libudev.so && $(move-to-rootlibdir)
-
-libudev-uninstall-hook:
-       rm -f $(DESTDIR)$(rootlibdir)/libudev.so*
-
-INSTALL_EXEC_HOOKS += libudev-install-hook
-UNINSTALL_EXEC_HOOKS += libudev-uninstall-hook
-
 # ------------------------------------------------------------------------------
 noinst_LTLIBRARIES += \
        libudev-internal.la
@@ -3712,16 +3929,18 @@ dist_network_DATA = \
        network/80-container-vz.network
 
 dist_udevrules_DATA += \
-       rules/50-udev-default.rules \
        rules/60-block.rules \
        rules/60-drm.rules \
        rules/60-evdev.rules \
+       rules/60-input-id.rules \
        rules/60-persistent-storage-tape.rules \
        rules/60-persistent-input.rules \
        rules/60-persistent-alsa.rules \
        rules/60-persistent-storage.rules \
+       rules/60-sensor.rules \
        rules/60-serial.rules \
        rules/64-btrfs.rules \
+       rules/70-joystick.rules \
        rules/70-mouse.rules \
        rules/70-touchpad.rules \
        rules/75-net-description.rules \
@@ -3729,6 +3948,7 @@ dist_udevrules_DATA += \
        rules/80-net-setup-link.rules
 
 nodist_udevrules_DATA += \
+       rules/50-udev-default.rules \
        rules/99-systemd.rules
 
 if HAVE_SMACK
@@ -3744,6 +3964,7 @@ pkgconfigdata_DATA += \
        src/udev/udev.pc
 
 EXTRA_DIST += \
+       rules/50-udev-default.rules.in \
        rules/99-systemd.rules.in \
        src/udev/udev.pc.in
 
@@ -3771,10 +3992,10 @@ noinst_LTLIBRARIES += \
 
 src/udev/keyboard-keys-list.txt:
        $(AM_V_at)$(MKDIR_P) $(dir $@)
-       $(AM_V_GEN)$(CPP) $(CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) -dM -include linux/input.h - < /dev/null | $(AWK) '/^#define[ \t]+KEY_[^ ]+[ \t]+[0-9K]/ { if ($$2 != "KEY_MAX") { print $$2 } }' > $@
+       $(AM_V_GEN)$(top_srcdir)/src/udev/generate-keyboard-keys-list.sh "$(CPP) $(CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS)" > $@
 
 src/udev/keyboard-keys-from-name.gperf: src/udev/keyboard-keys-list.txt
-       $(AM_V_GEN)$(AWK) 'BEGIN{ print "struct key { const char* name; unsigned short id; };"; print "%null-strings"; print "%%";} { print tolower(substr($$1 ,5)) ", " $$1 }' < $< > $@
+       $(AM_V_GEN)$(top_srcdir)/src/udev/generate-keyboard-keys-gperf.sh $< > $@
 
 src/udev/keyboard-keys-from-name.h: src/udev/keyboard-keys-from-name.gperf
        $(AM_V_GPERF)$(GPERF) -L ANSI-C -t -N keyboard_lookup_key -H hash_key_name -p -C < $< > $@
@@ -3813,7 +4034,8 @@ gperf_gperf_sources += \
 libudev_core_la_CFLAGS = \
        $(AM_CFLAGS) \
        $(BLKID_CFLAGS) \
-       $(KMOD_CFLAGS)
+       $(KMOD_CFLAGS) \
+       -DLOG_REALM=LOG_REALM_UDEV
 
 libudev_core_la_LIBADD = \
        libsystemd-network.la \
@@ -3845,6 +4067,10 @@ endif
 systemd_udevd_SOURCES = \
        src/udev/udevd.c
 
+systemd_udevd_CFLAGS = \
+       $(AM_CFLAGS) \
+       -DLOG_REALM=LOG_REALM_UDEV
+
 systemd_udevd_LDADD = \
        libudev-core.la \
        libbasic.la
@@ -3894,6 +4120,7 @@ dist_udevhwdb_DATA = \
        hwdb/20-net-ifname.hwdb \
        hwdb/60-evdev.hwdb \
        hwdb/60-keyboard.hwdb \
+       hwdb/60-sensor.hwdb \
        hwdb/70-mouse.hwdb \
        hwdb/70-pointingstick.hwdb \
        hwdb/70-touchpad.hwdb
@@ -3921,11 +4148,13 @@ EXTRA_DIST += \
 # ------------------------------------------------------------------------------
 if ENABLE_TESTS
 TESTS += \
-       test/udev-test.pl
+       test/udev-test.pl \
+       test/hwdb-test.sh
 
 if HAVE_PYTHON
 TESTS += \
-       test/rule-syntax-check.py
+       test/rule-syntax-check.py \
+       hwdb/parse_hwdb.py
 
 if HAVE_SYSV_COMPAT
 TESTS += \
@@ -3961,28 +4190,34 @@ check_DATA += \
        test/sys
 endif
 
-# packed sysfs test tree
-test/sys: test/sys.tar.xz
-       -rm -rf test/sys
+# sysfs test tree
+test/sys: test/sys-script.py
+       -rm -rf $@
        $(AM_V_at)$(MKDIR_P) $(dir $@)
-       $(AM_V_GEN)tar -C test/ -xJf $(top_srcdir)/test/sys.tar.xz
-       -touch test/sys
+       $(AM_V_GEN)$(top_srcdir)/test/sys-script.py $(dir $@)
+       -touch $@
 
 test-sys-distclean:
        -rm -rf test/sys
 DISTCLEAN_LOCAL_HOOKS += test-sys-distclean
 
 EXTRA_DIST += \
-       test/sys.tar.xz \
+       test/sys-script.py \
        test/udev-test.pl \
+       test/hwdb-test.sh \
        test/rule-syntax-check.py \
        test/sysv-generator-test.py \
-       test/mocks/fsck
+       test/mocks/fsck \
+       hwdb/parse_hwdb.py
 
 # ------------------------------------------------------------------------------
 ata_id_SOURCES = \
        src/udev/ata_id/ata_id.c
 
+ata_id_CFLAGS = \
+       $(AM_CFLAGS) \
+       -DLOG_REALM=LOG_REALM_UDEV
+
 ata_id_LDADD = \
        libshared.la
 
@@ -3993,6 +4228,10 @@ udevlibexec_PROGRAMS += \
 cdrom_id_SOURCES = \
        src/udev/cdrom_id/cdrom_id.c
 
+cdrom_id_CFLAGS = \
+       $(AM_CFLAGS) \
+       -DLOG_REALM=LOG_REALM_UDEV
+
 cdrom_id_LDADD = \
        libshared.la
 
@@ -4006,6 +4245,10 @@ dist_udevrules_DATA += \
 collect_SOURCES = \
        src/udev/collect/collect.c
 
+collect_CFLAGS = \
+       $(AM_CFLAGS) \
+       -DLOG_REALM=LOG_REALM_UDEV
+
 collect_LDADD = \
        libshared.la
 
@@ -4019,6 +4262,10 @@ scsi_id_SOURCES =\
        src/udev/scsi_id/scsi.h \
        src/udev/scsi_id/scsi_id.h
 
+scsi_id_CFLAGS = \
+       $(AM_CFLAGS) \
+       -DLOG_REALM=LOG_REALM_UDEV
+
 scsi_id_LDADD = \
        libshared.la
 
@@ -4032,6 +4279,10 @@ EXTRA_DIST += \
 v4l_id_SOURCES = \
        src/udev/v4l_id/v4l_id.c
 
+v4l_id_CFLAGS = \
+       $(AM_CFLAGS) \
+       -DLOG_REALM=LOG_REALM_UDEV
+
 v4l_id_LDADD = \
        libshared.la
 
@@ -4047,6 +4298,10 @@ mtd_probe_SOURCES =  \
        src/udev/mtd_probe/mtd_probe.h \
        src/udev/mtd_probe/probe_smartmedia.c
 
+mtd_probe_CFLAGS = \
+       $(AM_CFLAGS) \
+       -DLOG_REALM=LOG_REALM_UDEV
+
 dist_udevrules_DATA += \
        rules/75-probe_mtd.rules
 
@@ -4064,6 +4319,16 @@ tests += \
        test-id128
 
 # ------------------------------------------------------------------------------
+test_hash_SOURCES = \
+       src/test/test-hash.c
+
+test_hash_LDADD = \
+       libsystemd-shared.la
+
+tests += \
+       test-hash
+
+# ------------------------------------------------------------------------------
 
 bin_PROGRAMS += \
        systemd-socket-activate
@@ -4143,11 +4408,6 @@ systemd_journal_remote_CFLAGS = \
 systemd_journal_remote_LDADD += \
        $(MICROHTTPD_LIBS)
 
-if ENABLE_TMPFILES
-dist_tmpfiles_DATA += \
-       tmpfiles.d/systemd-remote.conf
-endif
-
 if HAVE_GNUTLS
 systemd_journal_remote_LDADD += \
        $(GNUTLS_LIBS)
@@ -4443,10 +4703,8 @@ libsystemd_journal_internal_la_SOURCES += \
 libsystemd_journal_internal_la_LIBADD += \
        $(GCRYPT_LIBS)
 
-# fsprg.c is a drop-in file using void pointer arithmetic
 libsystemd_journal_internal_la_CFLAGS += \
-       $(GCRYPT_CFLAGS) \
-       -Wno-pointer-arith
+       $(GCRYPT_CFLAGS)
 endif
 
 noinst_LTLIBRARIES += \
@@ -4689,9 +4947,6 @@ nodist_udevrules_DATA += \
 
 nodist_systemunit_DATA += \
        units/systemd-vconsole-setup.service
-
-SYSINIT_TARGET_WANTS += \
-       systemd-vconsole-setup.service
 endif
 
 EXTRA_DIST += \
@@ -4783,10 +5038,12 @@ EXTRA_DIST += \
 # ------------------------------------------------------------------------------
 if HAVE_LIBCRYPTSETUP
 rootlibexec_PROGRAMS += \
-       systemd-cryptsetup
+       systemd-cryptsetup \
+       systemd-veritysetup
 
 systemgenerator_PROGRAMS += \
-       systemd-cryptsetup-generator
+       systemd-cryptsetup-generator \
+       systemd-veritysetup-generator
 
 dist_systemunit_DATA += \
        units/cryptsetup.target \
@@ -4809,6 +5066,23 @@ systemd_cryptsetup_generator_SOURCES = \
 systemd_cryptsetup_generator_LDADD = \
        libsystemd-shared.la
 
+systemd_veritysetup_SOURCES = \
+       src/veritysetup/veritysetup.c
+
+systemd_veritysetup_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(LIBCRYPTSETUP_CFLAGS)
+
+systemd_veritysetup_LDADD = \
+       libsystemd-shared.la \
+       $(LIBCRYPTSETUP_LIBS)
+
+systemd_veritysetup_generator_SOURCES = \
+       src/veritysetup/veritysetup-generator.c
+
+systemd_veritysetup_generator_LDADD = \
+       libsystemd-shared.la
+
 SYSINIT_TARGET_WANTS += \
        cryptsetup.target
 
@@ -4886,10 +5160,6 @@ systemd_localed_LDADD = \
        libsystemd-shared.la \
        -ldl
 
-systemd_localed_CFLAGS = \
-       $(AM_CFLAGS) \
-       $(XKBCOMMON_CFLAGS)
-
 nodist_systemunit_DATA += \
        units/systemd-localed.service
 
@@ -4947,8 +5217,6 @@ dist_zshcompletion_data += \
        shell-completion/zsh/_localectl
 endif
 
-.PHONY: update-kbd-model-map
-
 polkitpolicy_in_files += \
        src/locale/org.freedesktop.locale1.policy.in
 
@@ -5028,6 +5296,25 @@ systemd_timesyncd_LDADD = \
        libsystemd-shared.la \
        -lm
 
+test_timesync_SOURCES = \
+       src/timesync/test-timesync.c \
+       src/timesync/timesyncd-manager.c \
+       src/timesync/timesyncd-manager.h \
+       src/timesync/timesyncd-conf.c \
+       src/timesync/timesyncd-conf.h \
+       src/timesync/timesyncd-server.c \
+       src/timesync/timesyncd-server.h
+
+nodist_test_timesync_SOURCES = \
+       src/timesync/timesyncd-gperf.c
+
+test_timesync_LDADD = \
+       libsystemd-shared.la \
+       -lm
+
+tests += \
+       test-timesync
+
 rootlibexec_PROGRAMS += \
        systemd-timesyncd
 
@@ -5062,6 +5349,29 @@ manual_tests += \
        test-nss
 
 # ------------------------------------------------------------------------------
+if ENABLE_NSS_SYSTEMD
+libnss_systemd_la_SOURCES = \
+       src/nss-systemd/nss-systemd.sym \
+       src/nss-systemd/nss-systemd.c
+
+libnss_systemd_la_LDFLAGS = \
+       $(AM_LDFLAGS) \
+       -module \
+       -export-dynamic \
+       -avoid-version \
+       -shared \
+       -shrext .so.2 \
+       -Wl,--version-script=$(top_srcdir)/src/nss-systemd/nss-systemd.sym
+
+libnss_systemd_la_LIBADD = \
+       libsystemd-internal.la \
+       libbasic.la
+
+rootlib_LTLIBRARIES += \
+       libnss_systemd.la
+endif
+
+# ------------------------------------------------------------------------------
 if HAVE_MYHOSTNAME
 libnss_myhostname_la_SOURCES = \
        src/nss-myhostname/nss-myhostname.sym \
@@ -5080,12 +5390,16 @@ libnss_myhostname_la_LIBADD = \
        libsystemd-internal.la \
        libbasic.la
 
-lib_LTLIBRARIES += \
+rootlib_LTLIBRARIES += \
        libnss_myhostname.la
 endif
 
 # ------------------------------------------------------------------------------
 if ENABLE_MACHINED
+
+dist_systemunit_DATA += \
+       units/var-lib-machines.mount
+
 systemd_machined_SOURCES = \
        src/machine/machined.c \
        src/machine/machined.h
@@ -5179,7 +5493,7 @@ libnss_mymachines_la_LIBADD = \
        libsystemd-internal.la \
        libbasic.la
 
-lib_LTLIBRARIES += \
+rootlib_LTLIBRARIES += \
        libnss_mymachines.la
 
 endif
@@ -5448,18 +5762,19 @@ dist_dbuspolicy_DATA += \
 dist_dbussystemservice_DATA += \
        src/resolve/org.freedesktop.resolve1.service
 
-SYSTEM_UNIT_ALIASES += \
-       systemd-resolved.service dbus-org.freedesktop.resolve1.service
-
 BUSNAMES_TARGET_WANTS += \
        org.freedesktop.resolve1.busname
 
 GENERAL_ALIASES += \
-       $(systemunitdir)/systemd-resolved.service $(pkgsysconfdir)/system/multi-user.target.wants/systemd-resolved.service
+       $(systemunitdir)/systemd-resolved.service $(pkgsysconfdir)/system/multi-user.target.wants/systemd-resolved.service \
+       $(systemunitdir)/systemd-resolved.service $(pkgsysconfdir)/system/dbus-org.freedesktop.resolve1.service
 
 nodist_pkgsysconf_DATA += \
        src/resolve/resolved.conf
 
+dist_rootlibexec_DATA += \
+       src/resolve/resolv.conf
+
 libnss_resolve_la_SOURCES = \
        src/nss-resolve/nss-resolve.sym \
        src/nss-resolve/nss-resolve.c
@@ -5475,10 +5790,9 @@ libnss_resolve_la_LDFLAGS = \
 
 libnss_resolve_la_LIBADD = \
        libsystemd-internal.la \
-       libbasic.la \
-        -ldl
+       libbasic.la
 
-lib_LTLIBRARIES += \
+rootlib_LTLIBRARIES += \
        libnss_resolve.la
 
 systemd_resolve_SOURCES = \
@@ -5512,6 +5826,7 @@ dist_zshcompletion_data += \
 tests += \
        test-dns-packet \
        test-resolve-tables \
+       test-resolved-packet \
        test-dnssec
 
 manual_tests += \
@@ -5533,13 +5848,26 @@ test_resolve_tables_LDADD = \
        $(GCRYPT_LIBS) \
        -lm
 
+test_resolved_packet_SOURCES = \
+       src/resolve/test-resolved-packet.c \
+       $(basic_dns_sources)
+
+test_resolved_packet_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(GCRYPT_CFLAGS)
+
+test_resolved_packet_LDADD = \
+       libsystemd-shared.la \
+       $(GCRYPT_LIBS) \
+       -lm
+
 test_dns_packet_SOURCES = \
        src/resolve/test-dns-packet.c \
        $(basic_dns_sources)
 
 test_dns_packet_CPPFLAGS = \
        $(AM_CPPFLAGS) \
-       -DRESOLVE_TEST_DIR=\"$(abs_top_srcdir)/src/resolve/test-data\"
+       -I $(top_srcdir)/src/test
 
 test_dns_packet_CFLAGS = \
        $(AM_CFLAGS) \
@@ -5550,18 +5878,20 @@ test_dns_packet_LDADD = \
        $(GCRYPT_LIBS) \
        -lm
 
-EXTRA_DIST += \
-       src/resolve/test-data/_openpgpkey.fedoraproject.org.pkts \
-       src/resolve/test-data/fedoraproject.org.pkts \
-       src/resolve/test-data/gandi.net.pkts \
-       src/resolve/test-data/google.com.pkts \
-       src/resolve/test-data/root.pkts \
-       src/resolve/test-data/sw1a1aa-sw1a2aa-sw1a2ab-sw1a2ac.find.me.uk.pkts \
-       src/resolve/test-data/teamits.com.pkts \
-       src/resolve/test-data/zbyszek@fedoraproject.org.pkts \
-       src/resolve/test-data/_443._tcp.fedoraproject.org.pkts \
-       src/resolve/test-data/kyhwana.org.pkts \
-       src/resolve/test-data/fake-caa.pkts
+TEST_DATA_FILES += \
+       test/test-resolve/_openpgpkey.fedoraproject.org.pkts \
+       test/test-resolve/fedoraproject.org.pkts \
+       test/test-resolve/gandi.net.pkts \
+       test/test-resolve/google.com.pkts \
+       test/test-resolve/root.pkts \
+       test/test-resolve/sw1a1aa-sw1a2aa-sw1a2ab-sw1a2ac.find.me.uk.pkts \
+       test/test-resolve/teamits.com.pkts \
+       test/test-resolve/zbyszek@fedoraproject.org.pkts \
+       test/test-resolve/_443._tcp.fedoraproject.org.pkts \
+       test/test-resolve/kyhwana.org.pkts \
+       test/test-resolve/fake-caa.pkts
+
+EXTRA_DIST += $(TEST_DATA_FILES)
 
 test_dnssec_SOURCES = \
        src/resolve/test-dnssec.c \
@@ -5596,9 +5926,6 @@ EXTRA_DIST += \
        units/systemd-resolved.service.m4.in \
        src/resolve/resolved.conf.in
 
-dist_rootlibexec_DATA += \
-       src/resolve/resolv.conf
-
 # ------------------------------------------------------------------------------
 if ENABLE_NETWORKD
 rootlibexec_PROGRAMS += \
@@ -5623,50 +5950,60 @@ libnetworkd_core_la_CFLAGS = \
 
 libnetworkd_core_la_SOURCES = \
        src/libsystemd-network/network-internal.h \
-       src/network/networkd.h \
+       src/network/netdev/netdev.h \
+       src/network/netdev/netdev.c \
+       src/network/netdev/vrf.h \
+       src/network/netdev/vrf.c \
+       src/network/netdev/tunnel.h \
+       src/network/netdev/tunnel.c \
+       src/network/netdev/veth.h \
+       src/network/netdev/veth.c \
+       src/network/netdev/vxlan.h \
+       src/network/netdev/vxlan.c \
+       src/network/netdev/geneve.h \
+       src/network/netdev/geneve.c \
+       src/network/netdev/vlan.h \
+       src/network/netdev/vlan.c \
+       src/network/netdev/macvlan.h \
+       src/network/netdev/macvlan.c \
+       src/network/netdev/ipvlan.h \
+       src/network/netdev/ipvlan.c \
+       src/network/netdev/dummy.h \
+       src/network/netdev/dummy.c \
+       src/network/netdev/tuntap.h \
+       src/network/netdev/tuntap.c \
+       src/network/netdev/bond.h \
+       src/network/netdev/bond.c \
+       src/network/netdev/bridge.h \
+       src/network/netdev/bridge.c \
+       src/network/netdev/vcan.h \
+       src/network/netdev/vcan.c \
+       src/network/networkd-manager.h \
+       src/network/networkd-manager.c \
+       src/network/networkd-manager-bus.c \
        src/network/networkd-conf.h \
        src/network/networkd-conf.c \
        src/network/networkd-link.h \
        src/network/networkd-link.c \
-       src/network/networkd-netdev.h \
-       src/network/networkd-netdev.c \
-       src/network/networkd-netdev-vrf.h \
-       src/network/networkd-netdev-vrf.c \
-       src/network/networkd-netdev-tunnel.h \
-       src/network/networkd-netdev-tunnel.c \
-       src/network/networkd-netdev-veth.h \
-       src/network/networkd-netdev-veth.c \
-       src/network/networkd-netdev-vxlan.h \
-       src/network/networkd-netdev-vxlan.c \
-       src/network/networkd-netdev-vlan.h \
-       src/network/networkd-netdev-vlan.c \
-       src/network/networkd-netdev-macvlan.h \
-       src/network/networkd-netdev-macvlan.c \
-       src/network/networkd-netdev-ipvlan.h \
-       src/network/networkd-netdev-ipvlan.c \
-       src/network/networkd-netdev-dummy.h \
-       src/network/networkd-netdev-dummy.c \
-       src/network/networkd-netdev-tuntap.h \
-       src/network/networkd-netdev-tuntap.c \
-       src/network/networkd-netdev-bond.h \
-       src/network/networkd-netdev-bond.c \
-       src/network/networkd-netdev-bridge.h \
-       src/network/networkd-netdev-bridge.c \
        src/network/networkd-link-bus.c \
        src/network/networkd-ipv4ll.c \
+       src/network/networkd-ipv6-proxy-ndp.h \
+       src/network/networkd-ipv6-proxy-ndp.c \
        src/network/networkd-dhcp4.c \
        src/network/networkd-dhcp6.c \
        src/network/networkd-ndisc.h \
+       src/network/networkd-radv.c \
+       src/network/networkd-radv.h \
        src/network/networkd-ndisc.c \
        src/network/networkd-network.h \
        src/network/networkd-network.c \
        src/network/networkd-network-bus.c \
        src/network/networkd-address.h \
        src/network/networkd-address.c \
+       src/network/networkd-address-label.h \
+       src/network/networkd-address-label.c \
        src/network/networkd-route.h \
        src/network/networkd-route.c \
-       src/network/networkd-manager.c \
-       src/network/networkd-manager-bus.c \
        src/network/networkd-fdb.h \
        src/network/networkd-fdb.c \
        src/network/networkd-brvlan.h \
@@ -5681,7 +6018,7 @@ libnetworkd_core_la_SOURCES = \
 nodist_libnetworkd_core_la_SOURCES = \
        src/network/networkd-gperf.c \
        src/network/networkd-network-gperf.c \
-       src/network/networkd-netdev-gperf.c
+       src/network/netdev/netdev-gperf.c
 
 libnetworkd_core_la_LIBADD = \
        libsystemd-network.la \
@@ -5695,11 +6032,11 @@ systemd_networkd_wait_online_CFLAGS = \
 
 systemd_networkd_wait_online_SOURCES = \
        src/libsystemd-network/network-internal.h \
-       src/network/networkd-wait-online.h \
-       src/network/networkd-wait-online-link.h \
-       src/network/networkd-wait-online.c \
-       src/network/networkd-wait-online-manager.c \
-       src/network/networkd-wait-online-link.c
+       src/network/wait-online/link.h \
+       src/network/wait-online/link.c \
+       src/network/wait-online/manager.h \
+       src/network/wait-online/manager.c \
+       src/network/wait-online/wait-online.c
 
 systemd_networkd_wait_online_LDADD = \
        libsystemd-network.la \
@@ -5718,6 +6055,9 @@ networkctl_LDADD = \
 dist_bashcompletion_data += \
        shell-completion/bash/networkctl
 
+dist_zshcompletion_data += \
+       shell-completion/zsh/_networkctl
+
 test_networkd_conf_SOURCES = \
        src/network/test-networkd-conf.c
 
@@ -5772,25 +6112,32 @@ dist_dbuspolicy_DATA += \
 GENERAL_ALIASES += \
        $(systemunitdir)/systemd-networkd.socket $(pkgsysconfdir)/system/sockets.target.wants/systemd-networkd.socket \
        $(systemunitdir)/systemd-networkd.service $(pkgsysconfdir)/system/multi-user.target.wants/systemd-networkd.service \
-       $(systemunitdir)/systemd-networkd-wait-online.service $(pkgsysconfdir)/system/network-online.target.wants/systemd-networkd-wait-online.service
-
-SYSTEM_UNIT_ALIASES += \
-       systemd-networkd.service dbus-org.freedesktop.network1.service
+       $(systemunitdir)/systemd-networkd-wait-online.service $(pkgsysconfdir)/system/network-online.target.wants/systemd-networkd-wait-online.service \
+       $(systemunitdir)/systemd-networkd.service $(pkgsysconfdir)/system/dbus-org.freedesktop.network1.service
 
 BUSNAMES_TARGET_WANTS += \
        org.freedesktop.network1.busname
 
+polkitrules_files += \
+       src/network/systemd-networkd.rules
+
+polkitpkla_files += \
+       src/network/systemd-networkd.pkla
+
 endif
 
 gperf_gperf_sources += \
        src/network/networkd-gperf.gperf \
        src/network/networkd-network-gperf.gperf \
-       src/network/networkd-netdev-gperf.gperf
+       src/network/netdev/netdev-gperf.gperf
 
 EXTRA_DIST += \
+       src/network/systemd-networkd.rules \
+       src/network/systemd-networkd.pkla \
        units/systemd-networkd.service.m4.in \
        units/systemd-networkd-wait-online.service.in \
-       test/networkd-test.py
+       test/networkd-test.py \
+       test/test-exec-deserialization.py
 
 # ------------------------------------------------------------------------------
 if ENABLE_LOGIND
@@ -5895,10 +6242,10 @@ test_login_tables_LDADD = \
        liblogind-core.la
 
 manual_tests += \
-       test-login \
        test-inhibit
 
 tests += \
+       test-login \
        test-login-tables \
        test-login-shared
 
@@ -5926,8 +6273,10 @@ pam_systemd_la_LIBADD = \
 pamlib_LTLIBRARIES = \
        pam_systemd.la
 
+if ENABLE_PAM_CONFIG
 dist_pamconf_DATA = \
        src/login/systemd-user
+endif
 
 EXTRA_DIST += \
        src/login/systemd-user.m4
@@ -6049,6 +6398,11 @@ EXTRA_DIST += \
        test/TEST-11-ISSUE-3166/test.sh \
        test/TEST-12-ISSUE-3171/Makefile \
        test/TEST-12-ISSUE-3171/test.sh \
+       test/TEST-13-NSPAWN-SMOKE/Makefile \
+       test/TEST-13-NSPAWN-SMOKE/create-busybox-container \
+       test/TEST-13-NSPAWN-SMOKE/test.sh \
+       test/TEST-14-MACHINE-ID/Makefile \
+       test/TEST-14-MACHINE-ID/test.sh \
        test/test-functions
 
 EXTRA_DIST += \
@@ -6061,6 +6415,7 @@ EXTRA_DIST += \
 
 # ------------------------------------------------------------------------------
 substitutions = \
+       '|rootlibdir=$(rootlibdir)|' \
        '|rootlibexecdir=$(rootlibexecdir)|' \
        '|rootbindir=$(rootbindir)|' \
        '|bindir=$(bindir)|' \
@@ -6082,6 +6437,8 @@ substitutions = \
        '|sysctldir=$(sysctldir)|' \
        '|systemgeneratordir=$(systemgeneratordir)|' \
        '|usergeneratordir=$(usergeneratordir)|' \
+       '|systemenvgeneratordir=$(systemenvgeneratordir)|' \
+       '|userenvgeneratordir=$(userenvgeneratordir)|' \
        '|CERTIFICATEROOT=$(CERTIFICATEROOT)|' \
        '|PACKAGE_VERSION=$(PACKAGE_VERSION)|' \
        '|PACKAGE_NAME=$(PACKAGE_NAME)|' \
@@ -6092,7 +6449,6 @@ substitutions = \
        '|exec_prefix=$(exec_prefix)|' \
        '|libdir=$(libdir)|' \
        '|includedir=$(includedir)|' \
-       '|VERSION=$(VERSION)|' \
        '|rootprefix=$(rootprefix)|' \
        '|udevlibexecdir=$(udevlibexecdir)|' \
        '|SUSHELL=$(SUSHELL)|' \
@@ -6116,6 +6472,7 @@ substitutions = \
        '|KILL_USER_PROCESSES=$(KILL_USER_PROCESSES)|' \
        '|systemuidmax=$(SYSTEM_UID_MAX)|' \
        '|systemgidmax=$(SYSTEM_GID_MAX)|' \
+       '|DEV_KVM_MODE=$(DEV_KVM_MODE)|' \
        '|TTY_GID=$(TTY_GID)|' \
        '|systemsleepdir=$(systemsleepdir)|' \
        '|systemshutdowndir=$(systemshutdowndir)|' \
@@ -6125,6 +6482,7 @@ substitutions = \
 SED_PROCESS = \
        $(AM_V_GEN)$(MKDIR_P) $(dir $@) && \
        $(SED) $(subst '|,-e 's|@,$(subst =,\@|,$(subst |',|g',$(substitutions)))) \
+                -e '/^\#\# /d' \
                < $< > $@
 
 units/%: units/%.in
@@ -6148,6 +6506,10 @@ src/core/%.systemd: src/core/%.systemd.in
 src/%.policy.in: src/%.policy.in.in
        $(SED_PROCESS)
 
+src/sulogin-shell/%: src/sulogin-shell/%.in
+       $(SED_PROCESS)
+       $(AM_V_GEN)chmod +x $@
+
 shell-completion/%: shell-completion/%.in
        $(SED_PROCESS)
 
@@ -6190,6 +6552,10 @@ if ENABLE_POLKIT
 nodist_polkitpolicy_DATA = \
        $(polkitpolicy_files) \
        $(polkitpolicy_in_in_files:.policy.in.in=.policy)
+polkitrules_DATA = $(polkitrules_files)
+if ENABLE_POLKIT_PKLA
+polkitpkla_DATA = $(polkitpkla_files)
+endif
 endif
 
 EXTRA_DIST += \
@@ -6213,7 +6579,7 @@ XSLTPROC_FLAGS = \
        --stringparam funcsynopsis.style ansi \
        --stringparam man.authors.section.enabled 0 \
        --stringparam man.copyright.section.enabled 0 \
-       --stringparam systemd.version $(VERSION) \
+       --stringparam systemd.version $(PACKAGE_VERSION) \
        --path '$(builddir)/man:$(srcdir)/man'
 
 XSLT = $(if $(XSLTPROC), $(XSLTPROC), xsltproc)
@@ -6294,7 +6660,9 @@ SYSINIT_TARGET_WANTS += \
 
 LOCAL_FS_TARGET_WANTS += \
        systemd-remount-fs.service \
-       tmp.mount \
+       tmp.mount
+
+REMOTE_FS_TARGET_WANTS += \
        var-lib-machines.mount
 
 MULTI_USER_TARGET_WANTS += \
@@ -6310,6 +6678,11 @@ SYSINIT_TARGET_WANTS += \
        systemd-sysctl.service \
        systemd-ask-password-console.path
 
+if ENABLE_MACHINED
+MACHINES_TARGET_WANTS += \
+       var-lib-machines.mount
+endif
+
 if HAVE_SYSV_COMPAT
 SYSTEM_UNIT_ALIASES += \
        poweroff.target runlevel0.target \
@@ -6326,19 +6699,6 @@ SYSTEM_UNIT_ALIASES += \
        reboot.target ctrl-alt-del.target \
        getty@.service autovt@.service
 
-USER_UNIT_ALIASES += \
-       $(systemunitdir)/shutdown.target shutdown.target \
-       $(systemunitdir)/sockets.target sockets.target \
-       $(systemunitdir)/timers.target timers.target \
-       $(systemunitdir)/paths.target paths.target \
-       $(systemunitdir)/bluetooth.target bluetooth.target \
-       $(systemunitdir)/printer.target printer.target \
-       $(systemunitdir)/sound.target sound.target \
-       $(systemunitdir)/smartcard.target smartcard.target
-
-USER_UNIT_ALIASES += \
-       $(systemunitdir)/busnames.target busnames.target
-
 GENERAL_ALIASES += \
        $(systemunitdir)/remote-fs.target $(pkgsysconfdir)/system/multi-user.target.wants/remote-fs.target \
        $(systemunitdir)/getty@.service $(pkgsysconfdir)/system/getty.target.wants/getty@tty1.service \
@@ -6355,6 +6715,7 @@ INSTALL_DIRS += \
 endif
 
 INSTALL_DIRS += \
+       $(environmentdir) \
        $(prefix)/lib/modules-load.d \
        $(sysconfdir)/modules-load.d \
        $(prefix)/lib/systemd/network \
@@ -6441,34 +6802,27 @@ dist-check-includes: $(public_headers)
        done; exit $$res
 
 .PHONY: hwdb-update
-hwdb-update:
-       ( cd $(top_srcdir)/hwdb && \
-       wget -O usb.ids 'http://www.linux-usb.org/usb.ids' && \
-       wget -O pci.ids 'http://pci-ids.ucw.cz/v2.2/pci.ids' && \
-       wget -O ma-large.txt 'http://standards.ieee.org/develop/regauth/oui/oui.txt' && \
-       wget -O ma-medium.txt 'http://standards.ieee.org/develop/regauth/oui28/mam.txt' && \
-       wget -O ma-small.txt 'http://standards.ieee.org/develop/regauth/oui36/oui36.txt' && \
-       wget -O pnp_id_registry.html 'http://www.uefi.org/uefi-pnp-export' && \
-       wget -O acpi_id_registry.html 'http://www.uefi.org/uefi-acpi-export' && \
-       ./ids-update.pl && \
-       ./acpi-update.py > 20-acpi-vendor.hwdb.base && \
-       patch -p0 -o- 20-acpi-vendor.hwdb.base < 20-acpi-vendor.hwdb.patch > 20-acpi-vendor.hwdb )
+hwdb-update: tools/meson-hwdb-update.sh
+       $< $(top_srcdir)/hwdb
 
 .PHONY: built-sources
 built-sources: $(BUILT_SOURCES)
 
 .PHONY: git-tag
 git-tag:
-       git tag -s "v$(VERSION)" -m "systemd $(VERSION)"
+       git tag -s "v$(PACKAGE_VERSION)" -m "systemd $(PACKAGE_VERSION)"
 
 .PHONY: git-tar
 git-tar:
-       git archive --format=tar --prefix=systemd-$(VERSION)/ HEAD | gzip > systemd-$(VERSION).tar.gz
+       git archive -o systemd-$(PACKAGE_VERSION).tar.gz --prefix=systemd-$(PACKAGE_VERSION)/ HEAD
+
+%.asc: %
+       gpg2 --detach-sign -a -o $@ $<
 
 www_target = www.freedesktop.org:/srv/www.freedesktop.org/www/software/systemd
 
 .PHONY: doc-sync
-doc-sync: all
+doc-sync: man
        rsync -rlv --delete-excluded --include="*.html" --exclude="*" --omit-dir-times man/ $(www_target)/man/
 
 .PHONY: install-tree
@@ -6485,7 +6839,7 @@ valgrind-tests: $(TESTS)
                if $(LIBTOOL) --mode=execute file $$f | grep -q shell; then \
                echo -e "$${x}Skipping non-binary $$f"; else \
                echo -e "$${x}Running $$f"; \
-               $(LIBTOOL) --mode=execute valgrind -q --leak-check=full --max-stackframe=5242880 --error-exitcode=55 $(builddir)/$$f ; fi; \
+               $(AM_TESTS_ENVIRONMENT) $(LIBTOOL) --mode=execute valgrind -q --leak-check=full --max-stackframe=5242880 --error-exitcode=55 $(builddir)/$$f ; fi; \
                x="\n\n"; \
        done
 
@@ -6583,6 +6937,20 @@ tests += \
        test-libsystemd-sym \
        test-libudev-sym
 
+.PHONY: install-tests
+install-tests: $(tests) $(TEST_DATA_FILES)
+       for f in $(tests); do \
+           if [ -x $(top_builddir)/.libs/$$f ]; then \
+               install -D -m 755 $(top_builddir)/.libs/$$f $(DESTDIR)/$(testsdir)/$$f; \
+           else \
+               install -D -m 755 $(top_builddir)/$$f $(DESTDIR)/$(testsdir)/$$f; \
+           fi; \
+       done
+       for f in $(TEST_DATA_FILES); do \
+           install -D -m 644 $(top_srcdir)/$$f $(DESTDIR)/$(testsdir)/testdata/$${f#test/}; \
+       done
+
+
 .PHONY: cppcheck
 cppcheck:
        cppcheck --enable=all -q $(top_srcdir)
@@ -6591,14 +6959,17 @@ cppcheck:
 print-%:
        @echo $($*)
 
+.PHONY: git-contrib
 git-contrib:
-       @git shortlog -s `git describe --abbrev=0`.. | cut -c8- | awk '{ print $$0 "," }' | sort -u
+       @git shortlog -s `git describe --abbrev=0`.. | cut -c8- | sed 's/ / /g' | awk '{ print $$0 "," }' | sort -u
 
 EXTRA_DIST += \
         tools/gdb-sd_dump_hashmaps.py
 
+.PHONY: list-keys
 list-keys:
        gpg --verbose --no-options --no-default-keyring --no-auto-key-locate --batch --trust-model=always --keyring=$(srcdir)/src/import/import-pubring.gpg --list-keys
 
+.PHONY: add-key
 add-key:
        gpg --verbose --no-options --no-default-keyring --no-auto-key-locate --batch --trust-model=always --keyring=$(srcdir)/src/import/import-pubring.gpg --import -
diff --git a/NEWS b/NEWS
index ca54685..d56b7a6 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,907 @@
 systemd System and Service Manager
 
+CHANGES WITH 234:
+
+        * Meson is now supported as build system in addition to Automake. It is
+          our plan to remove Automake in one of our next releases, so that
+          Meson becomes our exclusive build system. Hence, please start using
+          the Meson build system in your downstream packaging. There's plenty
+          of documentation around how to use Meson, the extremely brief
+          summary:
+
+              ./autogen.sh && ./configure && make && sudo make install
+
+          becomes:
+
+              meson build && ninja -C build && sudo ninja -C build install
+
+        * Unit files gained support for a new JobRunningTimeoutUSec= setting,
+          which permits configuring a timeout on the time a job is
+          running. This is particularly useful for setting timeouts on jobs for
+          .device units.
+
+        * Unit files gained two new options ConditionUser= and ConditionGroup=
+          for conditionalizing units based on the identity of the user/group
+          running a systemd user instance.
+
+        * systemd-networkd now understands a new FlowLabel= setting in the
+          [VXLAN] section of .network files, as well as a Priority= in
+          [Bridge], GVRP= + MVRP= + LooseBinding= + ReorderHeader= in [VLAN]
+          and GatewayOnlink= + IPv6Preference= + Protocol= in [Route]. It also
+          gained support for configuration of GENEVE links, and IPv6 address
+          labels. The [Network] section gained the new IPv6ProxyNDP= setting.
+
+        * .link files now understand a new Port= setting.
+
+        * systemd-networkd's DHCP support gained support for DHCP option 119
+          (domain search list).
+
+        * systemd-networkd gained support for serving IPv6 address ranges using
+          the Router Advertisment protocol. The new .network configuration
+          section [IPv6Prefix] may be used to configure the ranges to
+          serve. This is implemented based on a new, minimal, native server
+          implementation of RA.
+
+        * journalctl's --output= switch gained support for a new parameter
+          "short-iso-precise" for a mode where timestamps are shown as precise
+          ISO date values.
+
+        * systemd-udevd's "net_id" builtin may now generate stable network
+          interface names from IBM PowerVM VIO devices as well as ACPI platform
+          devices.
+
+        * MulticastDNS support in systemd-resolved may now be explicitly
+          enabled/disabled using the new MulticastDNS= configuration file
+          option.
+
+        * systemd-resolved may now optionally use libidn2 instead of the libidn
+          for processing internationalized domain names. Support for libidn2
+          should be considered experimental and should not be enabled by
+          default yet.
+
+        * "machinectl pull-tar" and related call may now do verification of
+          downloaded images using SUSE-style .sha256 checksum files in addition
+          to the already existing support for validating using Ubuntu-style
+          SHA256SUMS files.
+
+        * sd-bus gained support for a new sd_bus_message_appendv() call which
+          is va_list equivalent of sd_bus_message_append().
+
+        * sd-boot gained support for validating images using SHIM/MOK.
+
+        * The SMACK code learnt support for "onlycap".
+
+        * systemd-mount --umount is now much smarter in figuring out how to
+          properly unmount a device given its mount or device path.
+
+        * The code to call libnss_dns as a fallback from libnss_resolve when
+          the communication with systemd-resolved fails was removed. This
+          fallback was redundant and interfered with the [!UNAVAIL=return]
+          suffix. See nss-resolve(8) for the recommended configuration.
+
+        * systemd-logind may now be restarted without losing state. It stores
+          the file descriptors for devices it manages in the system manager
+          using the FDSTORE= mechanism. Please note that further changes in
+          other components may be required to make use of this (for example
+          Xorg has code to listen for stops of systemd-logind and terminate
+          itself when logind is stopped or restarted, in order to avoid using
+          stale file descriptors for graphical devices, which is now
+          counterproductive and must be reverted in order for restarts of
+          systemd-logind to be safe. See
+          https://cgit.freedesktop.org/xorg/xserver/commit/?id=dc48bd653c7e101.)
+
+        * All kernel install plugins are called with the environment variable
+          KERNEL_INSTALL_MACHINE_ID which is set to the machine ID given by
+          /etc/machine-id. If the file is missing or empty, the variable is
+          empty and BOOT_DIR_ABS is the path of a temporary directory which is
+          removed after all the plugins exit. So, if KERNEL_INSTALL_MACHINE_ID
+          is empty, all plugins should not put anything in BOOT_DIR_ABS.
+
+        Contributions from: Adrian Heine né Lang, Aggelos Avgerinos, Alexander
+        Kurtz, Alexandros Frantzis, Alexey Brodkin, Alex Lu, Amir Pakdel, Amir
+        Yalon, Anchor Cat, Anthony Parsons, Bastien Nocera, Benjamin Gilbert,
+        Benjamin Robin, Boucman, Charles Plessy, Chris Chiu, Chris Lamb,
+        Christian Brauner, Christian Hesse, Colin Walters, Daniel Drake,
+        Danielle Church, Daniel Molkentin, Daniel Rusek, Daniel Wang, Davide
+        Cavalca, David Herrmann, David Michael, Dax Kelson, Dimitri John
+        Ledkov, Djalal Harouni, Dušan Kazik, Elias Probst, Evgeny Vereshchagin,
+        Federico Di Pierro, Felipe Sateler, Felix Zhang, Franck Bui, Gary
+        Tierney, George McCollister, Giedrius Statkevičius, Hans de Goede,
+        hecke, Hendrik Westerberg, Hristo Venev, Ian Wienand, Insun Pyo, Ivan
+        Shapovalov, James Cowgill, James Hemsing, Janne Heß, Jan Synacek, Jason
+        Reeder, João Paulo Rechi Vita, John Paul Adrian Glaubitz, Jörg
+        Thalheim, Josef Andersson, Josef Gajdusek, Julian Mehne, Kai Krakow,
+        Krzysztof Jackiewicz, Lars Karlitski, Lennart Poettering, Lluís Gili,
+        Lucas Werkmeister, Lukáš Nykrýn, Łukasz Stelmach, Mantas Mikulėnas,
+        Marcin Bachry, Marcus Cooper, Mark Stosberg, Martin Pitt, Matija Skala,
+        Matt Clarkson, Matthew Garrett, Matthias Greiner, Matthijs van Duin,
+        Max Resch, Michael Biebl, Michal Koutný, Michal Sekletar, Michal
+        Soltys, Michal Suchanek, Mike Gilbert, Nate Clark, Nathaniel R. Lewis,
+        Neil Brown, Nikolai Kondrashov, Pascal S. de Kloe, Pat Riehecky, Patrik
+        Flykt, Paul Kocialkowski, Peter Hutterer, Philip Withnall, Piotr
+        Szydełko, Rafael Fontenelle, Ray Strode, Richard Maw, Roelf Wichertjes,
+        Ronny Chevalier, Sarang S. Dalal, Sjoerd Simons, slodki, Stefan
+        Schweter, Susant Sahani, Ted Wood, Thomas Blume, Thomas Haller, Thomas
+        H. P. Andersen, Timothée Ravier, Tobias Jungel, Tobias Stoeckmann, Tom
+        Gundersen, Tom Yan, Torstein Husebø, Umut Tezduyar Lindskog,
+        userwithuid, Vito Caputo, Waldemar Brodkorb, WaLyong Cho, Yu, Li-Yu,
+        Yusuke Nojima, Yu Watanabe, Zbigniew Jędrzejewski-Szmek, Дамјан
+        Георгиевски
+
+        — Berlin, 2017-07-12
+
+CHANGES WITH 233:
+
+        * This version requires at least gperf 3.1 for building, 3.0 is not
+          sufficient.
+
+        * The "hybrid" control group mode has been modified to improve
+          compatibility with "legacy" cgroups-v1 setups. Specifically, the
+          "hybrid" setup of /sys/fs/cgroup is now pretty much identical to
+          "legacy" (including /sys/fs/cgroup/systemd as "name=systemd" named
+          cgroups-v1 hierarchy), the only externally visible change being that
+          the cgroups-v2 hierarchy is also mounted, to
+          /sys/fs/cgroup/unified. This should provide a large degree of
+          compatibility with "legacy" cgroups-v1, while taking benefit of the
+          better management capabilities of cgroups-v2.
+
+        * The default control group setup mode may be selected both a boot-time
+          via a set of kernel command line parameters (specifically:
+          systemd.unified_cgroup_hierarchy= and
+          systemd.legacy_systemd_cgroup_controller=), as well as a compile-time
+          default selected on the configure command line
+          (--with-default-hierarchy=). The upstream default is "hybrid"
+          (i.e. the cgroups-v1 + cgroups-v2 mixture discussed above) now, but
+          this will change in a future systemd version to be "unified" (pure
+          cgroups-v2 mode). The third option for the compile time option is
+          "legacy", to enter pure cgroups-v1 mode. We recommend downstream
+          distributions to default to "hybrid" mode for release distributions,
+          starting with v233. We recommend "unified" for development
+          distributions (specifically: distributions such as Fedora's rawhide)
+          as that's where things are headed in the long run. Use "legacy" for
+          greatest stability and compatibility only.
+
+        * Note one current limitation of "unified" and "hybrid" control group
+          setup modes: the kernel currently does not permit the systemd --user
+          instance (i.e. unprivileged code) to migrate processes between two
+          disconnected cgroup subtrees, even if both are managed and owned by
+          the user. This effectively means "systemd-run --user --scope" doesn't
+          work when invoked from outside of any "systemd --user" service or
+          scope. Specifically, it is not supported from session scopes. We are
+          working on fixing this in a future systemd version. (See #3388 for
+          further details about this.)
+
+        * DBus policy files are now installed into /usr rather than /etc. Make
+          sure your system has dbus >= 1.9.18 running before upgrading to this
+          version, or override the install path with --with-dbuspolicydir= .
+
+        * All python scripts shipped with systemd (specifically: the various
+          tests written in Python) now require Python 3.
+
+        * systemd unit tests can now run standalone (without the source or
+          build directories), and can be installed into /usr/lib/systemd/tests/
+          with 'make install-tests'.
+
+        * Note that from this version on, CONFIG_CRYPTO_USER_API_HASH,
+          CONFIG_CRYPTO_HMAC and CONFIG_CRYPTO_SHA256 need to be enabled in the
+          kernel.
+
+        * Support for the %c, %r, %R specifiers in unit files has been
+          removed. Specifiers are not supposed to be dependent on configuration
+          in the unit file itself (so that they resolve the same regardless
+          where used in the unit files), but these specifiers were influenced
+          by the Slice= option.
+
+        * The shell invoked by debug-shell.service now defaults to /bin/sh in
+          all cases. If distributions want to use a different shell for this
+          purpose (for example Fedora's /sbin/sushell) they need to specify
+          this explicitly at configure time using --with-debug-shell=.
+
+        * The confirmation spawn prompt has been reworked to offer the
+          following choices:
+
+           (c)ontinue, proceed without asking anymore
+           (D)ump, show the state of the unit
+           (f)ail, don't execute the command and pretend it failed
+           (h)elp
+           (i)nfo, show a short summary of the unit
+           (j)obs, show jobs that are in progress
+           (s)kip, don't execute the command and pretend it succeeded
+           (y)es, execute the command
+
+          The 'n' choice for the confirmation spawn prompt has been removed,
+          because its meaning was confusing.
+
+          The prompt may now also be redirected to an alternative console by
+          specifying the console as parameter to systemd.confirm_spawn=.
+
+        * Services of Type=notify require a READY=1 notification to be sent
+          during startup. If no such message is sent, the service now fails,
+          even if the main process exited with a successful exit code.
+
+        * Services that fail to start up correctly now always have their
+          ExecStopPost= commands executed. Previously, they'd enter "failed"
+          state directly, without executing these commands.
+
+        * The option MulticastDNS= of network configuration files has acquired
+          an actual implementation. With MulticastDNS=yes a host can resolve
+          names of remote hosts and reply to mDNS A and AAAA requests.
+
+        * When units are about to be started an additional check is now done to
+          ensure that all dependencies of type BindsTo= (when used in
+          combination with After=) have been started.
+
+        * systemd-analyze gained a new verb "syscall-filter" which shows which
+          system call groups are defined for the SystemCallFilter= unit file
+          setting, and which system calls they contain.
+
+        * A new system call filter group "@filesystem" has been added,
+          consisting of various file system related system calls. Group
+          "@reboot" has been added, covering reboot, kexec and shutdown related
+          calls. Finally, group "@swap" has been added covering swap
+          configuration related calls.
+
+        * A new unit file option RestrictNamespaces= has been added that may be
+          used to restrict access to the various process namespace types the
+          Linux kernel provides. Specifically, it may be used to take away the
+          right for a service unit to create additional file system, network,
+          user, and other namespaces. This sandboxing option is particularly
+          relevant due to the high amount of recently discovered namespacing
+          related vulnerabilities in the kernel.
+
+        * systemd-udev's .link files gained support for a new AutoNegotiation=
+          setting for configuring Ethernet auto-negotiation.
+
+        * systemd-networkd's .network files gained support for a new
+          ListenPort= setting in the [DHCP] section to explicitly configure the
+          UDP client port the DHCP client shall listen on.
+
+        * .network files gained a new Unmanaged= boolean setting for explicitly
+          excluding one or more interfaces from management by systemd-networkd.
+
+        * The systemd-networkd ProxyARP= option has been renamed to
+          IPV4ProxyARP=. Similarly, VXLAN-specific option ARPProxy= has been
+          renamed to ReduceARPProxy=. The old names continue to be available
+          for compatibility.
+
+        * systemd-networkd gained support for configuring IPv6 Proxy NDP
+          addresses via the new IPv6ProxyNDPAddress= .network file setting.
+
+        * systemd-networkd's bonding device support gained support for two new
+          configuration options ActiveSlave= and PrimarySlave=.
+
+        * The various options in the [Match] section of .network files gained
+          support for negative matching.
+
+        * New systemd-specific mount options are now understood in /etc/fstab:
+
+          x-systemd.mount-timeout= may be used to configure the maximum
+          permitted runtime of the mount command.
+
+          x-systemd.device-bound may be set to bind a mount point to its
+          backing device unit, in order to automatically remove a mount point
+          if its backing device is unplugged. This option may also be
+          configured through the new SYSTEMD_MOUNT_DEVICE_BOUND udev property
+          on the block device, which is now automatically set for all CDROM
+          drives, so that mounted CDs are automatically unmounted when they are
+          removed from the drive.
+
+          x-systemd.after= and x-systemd.before= may be used to explicitly
+          order a mount after or before another unit or mount point.
+
+        * Enqueued start jobs for device units are now automatically garbage
+          collected if there are no jobs waiting for them anymore.
+
+        * systemctl list-jobs gained two new switches: with --after, for every
+          queued job the jobs it's waiting for are shown; with --before the
+          jobs which it's blocking are shown.
+
+        * systemd-nspawn gained support for ephemeral boots from disk images
+          (or in other words: --ephemeral and --image= may now be
+          combined). Moreover, ephemeral boots are now supported for normal
+          directories, even if the backing file system is not btrfs. Of course,
+          if the file system does not support file system snapshots or
+          reflinks, the initial copy operation will be relatively expensive, but
+          this should still be suitable for many use cases.
+
+        * Calendar time specifications in .timer units now support
+          specifications relative to the end of a month by using "~" instead of
+          "-" as separator between month and day. For example, "*-02~03" means
+          "the third last day in February". In addition a new syntax for
+          repeated events has been added using the "/" character. For example,
+          "9..17/2:00" means "every two hours from 9am to 5pm".
+
+        * systemd-socket-proxyd gained a new parameter --connections-max= for
+          configuring the maximum number of concurrent connections.
+
+        * sd-id128 gained a new API for generating unique IDs for the host in a
+          way that does not leak the machine ID. Specifically,
+          sd_id128_get_machine_app_specific() derives an ID based on the
+          machine ID a in well-defined, non-reversible, stable way. This is
+          useful whenever an identifier for the host is needed but where the
+          identifier shall not be useful to identify the system beyond the
+          scope of the application itself. (Internally this uses HMAC-SHA256 as
+          keyed hash function using the machine ID as input.)
+
+        * NotifyAccess= gained a new supported value "exec". When set
+          notifications are accepted from all processes systemd itself invoked,
+          including all control processes.
+
+        * .nspawn files gained support for defining overlay mounts using the
+          Overlay= and OverlayReadOnly= options. Previously this functionality
+          was only available on the systemd-nspawn command line.
+
+        * systemd-nspawn's --bind= and --overlay= options gained support for
+          bind/overlay mounts whose source lies within the container tree by
+          prefixing the source path with "+".
+
+        * systemd-nspawn's --bind= and --overlay= options gained support for
+          automatically allocating a temporary source directory in /var/tmp
+          that is removed when the container dies. Specifically, if the source
+          directory is specified as empty string this mechanism is selected. An
+          example usage is --overlay=+/var::/var, which creates an overlay
+          mount based on the original /var contained in the image, overlayed
+          with a temporary directory in the host's /var/tmp. This way changes
+          to /var are automatically flushed when the container shuts down.
+
+        * systemd-nspawn --image= option does now permit raw file system block
+          devices (in addition to images containing partition tables, as
+          before).
+
+        * The disk image dissection logic in systemd-nspawn gained support for
+          automatically setting up LUKS encrypted as well as Verity protected
+          partitions. When a container is booted from an encrypted image the
+          passphrase is queried at start-up time. When a container with Verity
+          data is started, the root hash is search in a ".roothash" file
+          accompanying the disk image (alternatively, pass the root hash via
+          the new --root-hash= command line option).
+
+        * A new tool /usr/lib/systemd/systemd-dissect has been added that may
+          be used to dissect disk images the same way as systemd-nspawn does
+          it, following the Bootable Partition Specification. It may even be
+          used to mount disk images with complex partition setups (including
+          LUKS and Verity partitions) to a local host directory, in order to
+          inspect them. This tool is not considered public API (yet), and is
+          thus not installed into /usr/bin. Please do not rely on its
+          existence, since it might go away or be changed in later systemd
+          versions.
+
+        * A new generator "systemd-verity-generator" has been added, similar in
+          style to "systemd-cryptsetup-generator", permitting automatic setup of
+          Verity root partitions when systemd boots up. In order to make use of
+          this your partition setup should follow the Discoverable Partitions
+          Specification, and the GPT partition ID of the root file system
+          partition should be identical to the upper 128bit of the Verity root
+          hash. The GPT partition ID of the Verity partition protecting it
+          should be the lower 128bit of the Verity root hash. If the partition
+          image follows this model it is sufficient to specify a single
+          "roothash=" kernel command line argument to both configure which root
+          image and verity partition to use as well as the root hash for
+          it. Note that systemd-nspawn's Verity support follows the same
+          semantics, meaning that disk images with proper Verity data in place
+          may be booted in containers with systemd-nspawn as well as on
+          physical systems via the verity generator. Also note that the "mkosi"
+          tool available at https://github.com/systemd/mkosi has been updated
+          to generate Verity protected disk images following this scheme. In
+          fact, it has been updated to generate disk images that optionally
+          implement a complete UEFI SecureBoot trust chain, involving a signed
+          kernel and initrd image that incorporates such a root hash as well as
+          a Verity-enabled root partition.
+
+        * The hardware database (hwdb) udev supports has been updated to carry
+          accelerometer quirks.
+
+        * All system services are now run with a fresh kernel keyring set up
+          for them. The invocation ID is stored by default in it, thus
+          providing a safe, non-overridable way to determine the invocation
+          ID of each service.
+
+        * Service unit files gained new BindPaths= and BindReadOnlyPaths=
+          options for bind mounting arbitrary paths in a service-specific
+          way. When these options are used, arbitrary host or service files and
+          directories may be mounted to arbitrary locations in the service's
+          view.
+
+        * Documentation has been added that lists all of systemd's low-level
+          environment variables:
+
+          https://github.com/systemd/systemd/blob/master/ENVIRONMENT.md
+
+        * sd-daemon gained a new API sd_is_socket_sockaddr() for determining
+          whether a specific socket file descriptor matches a specified socket
+          address.
+
+        * systemd-firstboot has been updated to check for the
+          systemd.firstboot= kernel command line option. It accepts a boolean
+          and when set to false the first boot questions are skipped.
+
+        * systemd-fstab-generator has been updated to check for the
+          systemd.volatile= kernel command line option, which either takes an
+          optional boolean parameter or the special value "state". If used the
+          system may be booted in a "volatile" boot mode. Specifically,
+          "systemd.volatile" is used, the root directory will be mounted as
+          tmpfs, and only /usr is mounted from the actual root file system. If
+          "systemd.volatile=state" is used, the root directory will be mounted
+          as usual, but /var is mounted as tmpfs. This concept provides similar
+          functionality as systemd-nspawn's --volatile= option, but provides it
+          on physical boots. Use this option for implementing stateless
+          systems, or testing systems with all state and/or configuration reset
+          to the defaults. (Note though that many distributions are not
+          prepared to boot up without a populated /etc or /var, though.)
+
+        * systemd-gpt-auto-generator gained support for LUKS encrypted root
+          partitions. Previously it only supported LUKS encrypted partitions
+          for all other uses, except for the root partition itself.
+
+        * Socket units gained support for listening on AF_VSOCK sockets for
+          communication in virtualized QEMU environments.
+
+        * The "configure" script gained a new option --with-fallback-hostname=
+          for specifying the fallback hostname to use if none is configured in
+          /etc/hostname. For example, by specifying
+          --with-fallback-hostname=fedora it is possible to default to a
+          hostname of "fedora" on pristine installations.
+
+        * systemd-cgls gained support for a new --unit= switch for listing only
+          the control groups of a specific unit. Similar --user-unit= has been
+          added for listing only the control groups of a specific user unit.
+
+        * systemd-mount gained a new --umount switch for unmounting a mount or
+          automount point (and all mount/automount points below it).
+
+        * systemd will now refuse full configuration reloads (via systemctl
+          daemon-reload and related calls) unless at least 16MiB of free space
+          are available in /run. This is a safety precaution in order to ensure
+          that generators can safely operate after the reload completed.
+
+        * A new unit file option RootImage= has been added, which has a similar
+          effect as RootDirectory= but mounts the service's root directory from
+          a disk image instead of plain directory. This logic reuses the same
+          image dissection and mount logic that systemd-nspawn already uses,
+          and hence supports any disk images systemd-nspawn supports, including
+          those following the Discoverable Partition Specification, as well as
+          Verity enabled images. This option enables systemd to run system
+          services directly off disk images acting as resource bundles,
+          possibly even including full integrity data.
+
+        * A new MountAPIVFS= unit file option has been added, taking a boolean
+          argument. If enabled /proc, /sys and /dev (collectively called the
+          "API VFS") will be mounted for the service. This is only relevant if
+          RootDirectory= or RootImage= is used for the service, as these mounts
+          are of course in place in the host mount namespace anyway.
+
+        * systemd-nspawn gained support for a new --pivot-root= switch. If
+          specified the root directory within the container image is pivoted to
+          the specified mount point, while the original root disk is moved to a
+          different place. This option enables booting of ostree images
+          directly with systemd-nspawn.
+
+        * The systemd build scripts will no longer complain if the NTP server
+          addresses are not changed from the defaults. Google now supports
+          these NTP servers officially. We still recommend downstreams to
+          properly register an NTP pool with the NTP pool project though.
+
+        * coredumpctl gained a new "--reverse" option for printing the list
+          of coredumps in reverse order.
+
+        * coredumpctl will now show additional information about truncated and
+          inaccessible coredumps, as well as coredumps that are still being
+          processed. It also gained a new --quiet switch for suppressing
+          additional informational message in its output.
+
+        * coredumpctl gained support for only showing coredumps newer and/or
+          older than specific timestamps, using the new --since= and --until=
+          options, reminiscent of journalctl's options by the same name.
+
+        * The systemd-coredump logic has been improved so that it may be reused
+          to collect backtraces in non-compiled languages, for example in
+          scripting languages such as Python.
+
+        * machinectl will now show the UID shift of local containers, if user
+          namespacing is enabled for them.
+
+        * systemd will now optionally run "environment generator" binaries at
+          configuration load time. They may be used to add environment
+          variables to the environment block passed to services invoked. One
+          user environment generator is shipped by default that sets up
+          environment variables based on files dropped into /etc/environment.d
+          and ~/.config/environment.d/.
+
+        * systemd-resolved now includes the new, recently published 2017 DNSSEC
+          root key (KSK).
+
+        * hostnamed has been updated to report a new chassis type of
+          "convertible" to cover "foldable" laptops that can both act as a
+          tablet and as a laptop, such as various Lenovo Yoga devices.
+
+        Contributions from: Adrián López, Alexander Galanin, Alexander
+        Kochetkov, Alexandros Frantzis, Andrey Ulanov, Antoine Eiche, Baruch
+        Siach, Bastien Nocera, Benjamin Robin, Björn, Brandon Philips, Cédric
+        Schieli, Charles (Chas) Williams, Christian Hesse, Daniele Medri,
+        Daniel Drake, Daniel Rusek, Daniel Wagner, Dan Streetman, Dave Reisner,
+        David Glasser, David Herrmann, David Michael, Djalal Harouni, Dmitry
+        Khlebnikov, Dmitry Rozhkov, Dongsu Park, Douglas Christman, Earnestly,
+        Emil Soleyman, Eric Cook, Evgeny Vereshchagin, Felipe Sateler, Fionn
+        Cleary, Florian Klink, Francesco Brozzu, Franck Bui, Gabriel Rauter,
+        Gianluca Boiano, Giedrius Statkevičius, Graeme Lawes, Hans de Goede,
+        Harald Hoyer, Ian Kelling, Ivan Shapovalov, Jakub Wilk, Janne Heß, Jan
+        Synacek, Jason Reeder, Jonathan Boulle, Jörg Thalheim, Jouke Witteveen,
+        Karl Kraus, Kees Cook, Keith Busch, Kieran Colford, kilian-k, Lennart
+        Poettering, Lubomir Rintel, Lucas Werkmeister, Lukas Rusak, Maarten de
+        Vries, Maks Naumov, Mantas Mikulėnas, Marc-Andre Lureau, Marcin Bachry,
+        Mark Stosberg, Martin Ejdestig, Martin Pitt, Mauricio Faria de
+        Oliveira, micah, Michael Biebl, Michael Shields, Michal Schmidt, Michal
+        Sekletar, Michel Kraus, Mike Gilbert, Mikko Ylinen, Mirza Krak,
+        Namhyung Kim, nikolaof, peoronoob, Peter Hutterer, Peter Körner, Philip
+        Withnall, Piotr Drąg, Ray Strode, Reverend Homer, Rike-Benjamin
+        Schuppner, Robert Kreuzer, Ronny Chevalier, Ruslan Bilovol, sammynx,
+        Sergey Ptashnick, Sergiusz Urbaniak, Stefan Berger, Stefan Hajnoczi,
+        Stefan Schweter, Stuart McLaren, Susant Sahani, Sylvain Plantefève,
+        Taylor Smock, Tejun Heo, Thomas Blume, Thomas H. P. Andersen, Tibor
+        Nagy, Tobias Stoeckmann, Tom Gundersen, Torstein Husebø, Viktar
+        Vaŭčkievič, Viktor Mihajlovski, Vitaly Sulimov, Waldemar Brodkorb,
+        Walter Garcia-Fontes, Wim de With, Yassine Imounachen, Yi EungJun,
+        YunQiang Su, Yu Watanabe, Zbigniew Jędrzejewski-Szmek, Александр
+        Тихонов
+
+        — Berlin, 2017-03-01
+
+CHANGES WITH 232:
+
+        * udev now runs with MemoryDenyWriteExecute=, RestrictRealtime= and
+          RestrictAddressFamilies= enabled. These sandboxing options should
+          generally be compatible with the various external udev call-out
+          binaries we are aware of, however there may be exceptions, in
+          particular when exotic languages for these call-outs are used. In
+          this case, consider turning off these settings locally.
+
+        * The new RemoveIPC= option can be used to remove IPC objects owned by
+          the user or group of a service when that service exits.
+
+        * The new ProtectKernelModules= option can be used to disable explicit
+          load and unload operations of kernel modules by a service. In
+          addition access to /usr/lib/modules is removed if this option is set.
+
+        * ProtectSystem= option gained a new value "strict", which causes the
+          whole file system tree with the exception of /dev, /proc, and /sys,
+          to be remounted read-only for a service.
+
+        * The new ProtectKernelTunables= option can be used to disable
+          modification of configuration files in /sys and /proc by a service.
+          Various directories and files are remounted read-only, so access is
+          restricted even if the file permissions would allow it.
+
+        * The new ProtectControlGroups= option can be used to disable write
+          access by a service to /sys/fs/cgroup.
+
+        * Various systemd services have been hardened with
+          ProtectKernelTunables=yes, ProtectControlGroups=yes,
+          RestrictAddressFamilies=.
+
+        * Support for dynamically creating users for the lifetime of a service
+          has been added. If DynamicUser=yes is specified, user and group IDs
+          will be allocated from the range 61184..65519 for the lifetime of the
+          service. They can be resolved using the new nss-systemd.so NSS
+          module. The module must be enabled in /etc/nsswitch.conf. Services
+          started in this way have PrivateTmp= and RemoveIPC= enabled, so that
+          any resources allocated by the service will be cleaned up when the
+          service exits. They also have ProtectHome=read-only and
+          ProtectSystem=strict enabled, so they are not able to make any
+          permanent modifications to the system.
+
+        * The nss-systemd module also always resolves root and nobody, making
+          it possible to have no /etc/passwd or /etc/group files in minimal
+          container or chroot environments.
+
+        * Services may be started with their own user namespace using the new
+          boolean PrivateUsers= option. Only root, nobody, and the uid/gid
+          under which the service is running are mapped. All other users are
+          mapped to nobody.
+
+        * Support for the cgroup namespace has been added to systemd-nspawn. If
+          supported by kernel, the container system started by systemd-nspawn
+          will have its own view of the cgroup hierarchy. This new behaviour
+          can be disabled using $SYSTEMD_NSPAWN_USE_CGNS environment variable.
+
+        * The new MemorySwapMax= option can be used to limit the maximum swap
+          usage under the unified cgroup hierarchy.
+
+        * Support for the CPU controller in the unified cgroup hierarchy has
+          been added, via the CPUWeight=, CPUStartupWeight=, CPUAccounting=
+          options. This controller requires out-of-tree patches for the kernel
+          and the support is provisional.
+
+        * Mount and automount units may now be created transiently
+          (i.e. dynamically at runtime via the bus API, instead of requiring
+          unit files in the file system).
+
+        * systemd-mount is a new tool which may mount file systems – much like
+          mount(8), optionally pulling in additional dependencies through
+          transient .mount and .automount units. For example, this tool
+          automatically runs fsck on a backing block device before mounting,
+          and allows the automount logic to be used dynamically from the
+          command line for establishing mount points. This tool is particularly
+          useful when dealing with removable media, as it will ensure fsck is
+          run – if necessary – before the first access and that the file system
+          is quickly unmounted after each access by utilizing the automount
+          logic. This maximizes the chance that the file system on the
+          removable media stays in a clean state, and if it isn't in a clean
+          state is fixed automatically.
+
+        * LazyUnmount=yes option for mount units has been added to expose the
+          umount --lazy option. Similarly, ForceUnmount=yes exposes the --force
+          option.
+
+        * /efi will be used as the mount point of the EFI boot partition, if
+          the directory is present, and the mount point was not configured
+          through other means (e.g. fstab). If /efi directory does not exist,
+          /boot will be used as before. This makes it easier to automatically
+          mount the EFI partition on systems where /boot is used for something
+          else.
+
+        * When operating on GPT disk images for containers, systemd-nspawn will
+          now mount the ESP to /boot or /efi according to the same rules as PID
+          1 running on a host. This allows tools like "bootctl" to operate
+          correctly within such containers, in order to make container images
+          bootable on physical systems.
+
+        * disk/by-id and disk/by-path symlinks are now created for NVMe drives.
+
+        * Two new user session targets have been added to support running
+          graphical sessions under the systemd --user instance:
+          graphical-session.target and graphical-session-pre.target. See
+          systemd.special(7) for a description of how those targets should be
+          used.
+
+        * The vconsole initialization code has been significantly reworked to
+          use KD_FONT_OP_GET/SET ioctls instead of KD_FONT_OP_COPY and better
+          support unicode keymaps. Font and keymap configuration will now be
+          copied to all allocated virtual consoles.
+
+        * FreeBSD's bhyve virtualization is now detected.
+
+        * Information recorded in the journal for core dumps now includes the
+          contents of /proc/mountinfo and the command line of the process at
+          the top of the process hierarchy (which is usually the init process
+          of the container).
+
+        * systemd-journal-gatewayd learned the --directory= option to serve
+          files from the specified location.
+
+        * journalctl --root=… can be used to peruse the journal in the
+          /var/log/ directories inside of a container tree. This is similar to
+          the existing --machine= option, but does not require the container to
+          be active.
+
+        * The hardware database has been extended to support
+          ID_INPUT_TRACKBALL, used in addition to ID_INPUT_MOUSE to identify
+          trackball devices.
+
+          MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL hwdb property has been added to
+          specify the click rate for mice which include a horizontal wheel with
+          a click rate that is different than the one for the vertical wheel.
+
+        * systemd-run gained a new --wait option that makes service execution
+          synchronous. (Specifically, the command will not return until the
+          specified service binary exited.)
+
+        * systemctl gained a new --wait option that causes the start command to
+          wait until the units being started have terminated again.
+
+        * A new journal output mode "short-full" has been added which displays
+          timestamps with abbreviated English day names and adds a timezone
+          suffix. Those timestamps include more information than the default
+          "short" output mode, and can be passed directly to journalctl's
+          --since= and --until= options.
+
+        * /etc/resolv.conf will be bind-mounted into containers started by
+          systemd-nspawn, if possible, so any changes to resolv.conf contents
+          are automatically propagated to the container.
+
+        * The number of instances for socket-activated services originating
+          from a single IP address can be limited with
+          MaxConnectionsPerSource=, extending the existing setting of
+          MaxConnections=.
+
+        * systemd-networkd gained support for vcan ("Virtual CAN") interface
+          configuration.
+
+        * .netdev and .network configuration can now be extended through
+          drop-ins.
+
+        * UDP Segmentation Offload, TCP Segmentation Offload, Generic
+          Segmentation Offload, Generic Receive Offload, Large Receive Offload
+          can be enabled and disabled using the new UDPSegmentationOffload=,
+          TCPSegmentationOffload=, GenericSegmentationOffload=,
+          GenericReceiveOffload=, LargeReceiveOffload= options in the
+          [Link] section of .link files.
+
+        * The Spanning Tree Protocol, Priority, Aging Time, and the Default
+          Port VLAN ID can be configured for bridge devices using the new STP=,
+          Priority=, AgeingTimeSec=, and DefaultPVID= settings in the [Bridge]
+          section of .netdev files.
+
+        * The route table to which routes received over DHCP or RA should be
+          added can be configured with the new RouteTable= option in the [DHCP]
+          and [IPv6AcceptRA] sections of .network files.
+
+        * The Address Resolution Protocol can be disabled on links managed by
+          systemd-networkd using the ARP=no setting in the [Link] section of
+          .network files.
+
+        * New environment variables $SERVICE_RESULT, $EXIT_CODE and
+          $EXIT_STATUS are set for ExecStop= and ExecStopPost= commands, and
+          encode information about the result and exit codes of the current
+          service runtime cycle.
+
+        * systemd-sysctl will now configure kernel parameters in the order
+          they occur in the configuration files. This matches what sysctl
+          has been traditionally doing.
+
+        * kernel-install "plugins" that are executed to perform various
+          tasks after a new kernel is added and before an old one is removed
+          can now return a special value to terminate the procedure and
+          prevent any later plugins from running.
+
+        * Journald's SplitMode=login setting has been deprecated. It has been
+          removed from documentation, and its use is discouraged. In a future
+          release it will be completely removed, and made equivalent to current
+          default of SplitMode=uid.
+
+        * Storage=both option setting in /etc/systemd/coredump.conf has been
+          removed. With fast LZ4 compression storing the core dump twice is not
+          useful.
+
+        * The --share-system systemd-nspawn option has been replaced with an
+          (undocumented) variable $SYSTEMD_NSPAWN_SHARE_SYSTEM, but the use of
+          this functionality is discouraged. In addition the variables
+          $SYSTEMD_NSPAWN_SHARE_NS_IPC, $SYSTEMD_NSPAWN_SHARE_NS_PID,
+          $SYSTEMD_NSPAWN_SHARE_NS_UTS may be used to control the unsharing of
+          individual namespaces.
+
+        * "machinectl list" now shows the IP address of running containers in
+          the output, as well as OS release information.
+
+        * "loginctl list" now shows the TTY of each session in the output.
+
+        * sd-bus gained new API calls sd_bus_track_set_recursive(),
+          sd_bus_track_get_recursive(), sd_bus_track_count_name(),
+          sd_bus_track_count_sender(). They permit usage of sd_bus_track peer
+          tracking objects in a "recursive" mode, where a single client can be
+          counted multiple times, if it takes multiple references.
+
+        * sd-bus gained new API calls sd_bus_set_exit_on_disconnect() and
+          sd_bus_get_exit_on_disconnect(). They may be used to to make a
+          process using sd-bus automatically exit if the bus connection is
+          severed.
+
+        * Bus clients of the service manager may now "pin" loaded units into
+          memory, by taking an explicit reference on them. This is useful to
+          ensure the client can retrieve runtime data about the service even
+          after the service completed execution. Taking such a reference is
+          available only for privileged clients and should be helpful to watch
+          running services in a race-free manner, and in particular collect
+          information about exit statuses and results.
+
+        * The nss-resolve module has been changed to strictly return UNAVAIL
+          when communication via D-Bus with resolved failed, and NOTFOUND when
+          a lookup completed but was negative. This means it is now possible to
+          neatly configure fallbacks using nsswitch.conf result checking
+          expressions. Taking benefit of this, the new recommended
+          configuration line for the "hosts" entry in /etc/nsswitch.conf is:
+
+              hosts: files mymachines resolve [!UNAVAIL=return] dns myhostname
+
+        * A new setting CtrlAltDelBurstAction= has been added to
+          /etc/systemd/system.conf which may be used to configure the precise
+          behaviour if the user on the console presses Ctrl-Alt-Del more often
+          than 7 times in 2s. Previously this would unconditionally result in
+          an expedited, immediate reboot. With this new setting the precise
+          operation may be configured in more detail, and also turned off
+          entirely.
+
+        * In .netdev files two new settings RemoteChecksumTx= and
+          RemoteChecksumRx= are now understood that permit configuring the
+          remote checksumming logic for VXLAN networks.
+
+        * The service manager learnt a new "invocation ID" concept for invoked
+          services. Each runtime cycle of a service will get a new invocation
+          ID (a 128bit random UUID) assigned that identifies the current
+          run of the service uniquely and globally. A new invocation ID
+          is generated each time a service starts up. The journal will store
+          the invocation ID of a service along with any logged messages, thus
+          making the invocation ID useful for matching the online runtime of a
+          service with the offline log data it generated in a safe way without
+          relying on synchronized timestamps. In many ways this new service
+          invocation ID concept is similar to the kernel's boot ID concept that
+          uniquely and globally identifies the runtime of each boot. The
+          invocation ID of a service is passed to the service itself via an
+          environment variable ($INVOCATION_ID). A new bus call
+          GetUnitByInvocationID() has been added that is similar to GetUnit()
+          but instead of retrieving the bus path for a unit by its name
+          retrieves it by its invocation ID. The returned path is valid only as
+          long as the passed invocation ID is current.
+
+        * systemd-resolved gained a new "DNSStubListener" setting in
+          resolved.conf. It either takes a boolean value or the special values
+          "udp" and "tcp", and configures whether to enable the stub DNS
+          listener on 127.0.0.53:53.
+
+        * IP addresses configured via networkd may now carry additional
+          configuration settings supported by the kernel. New options include:
+          HomeAddress=, DuplicateAddressDetection=, ManageTemporaryAddress=,
+          PrefixRoute=, AutoJoin=.
+
+        * The PAM configuration fragment file for "user@.service" shipped with
+          systemd (i.e. the --user instance of systemd) has been stripped to
+          the minimum necessary to make the system boot. Previously, it
+          contained Fedora-specific stanzas that did not apply to other
+          distributions. It is expected that downstream distributions add
+          additional configuration lines, matching their needs to this file,
+          using it only as rough template of what systemd itself needs. Note
+          that this reduced fragment does not even include an invocation of
+          pam_limits which most distributions probably want to add, even though
+          systemd itself does not need it. (There's also the new build time
+          option --with-pamconfdir=no to disable installation of the PAM
+          fragment entirely.)
+
+        * If PrivateDevices=yes is set for a service the CAP_SYS_RAWIO
+          capability is now also dropped from its set (in addition to
+          CAP_SYS_MKNOD as before).
+
+        * In service unit files it is now possible to connect a specific named
+          file descriptor with stdin/stdout/stdout of an executed service. The
+          name may be specified in matching .socket units using the
+          FileDescriptorName= setting.
+
+        * A number of journal settings may now be configured on the kernel
+          command line. Specifically, the following options are now understood:
+          systemd.journald.max_level_console=,
+          systemd.journald.max_level_store=,
+          systemd.journald.max_level_syslog=, systemd.journald.max_level_kmsg=,
+          systemd.journald.max_level_wall=.
+
+        * "systemctl is-enabled --full" will now show by which symlinks a unit
+          file is enabled in the unit dependency tree.
+
+        * Support for VeraCrypt encrypted partitions has been added to the
+          "cryptsetup" logic and /etc/crypttab.
+
+        * systemd-detect-virt gained support for a new --private-users switch
+          that checks whether the invoking processes are running inside a user
+          namespace. Similar, a new special value "private-users" for the
+          existing ConditionVirtualization= setting has been added, permitting
+          skipping of specific units in user namespace environments.
+
+        Contributions from: Alban Crequy, Alexander Kuleshov, Alfie John,
+        Andreas Henriksson, Andrew Jeddeloh, Balázs Úr, Bart Rulon, Benjamin
+        Richter, Ben Gamari, Ben Harris, Brian J. Murrell, Christian Brauner,
+        Christian Rebischke, Clinton Roy, Colin Walters, Cristian Rodríguez,
+        Daniel Hahler, Daniel Mack, Daniel Maixner, Daniel Rusek, Dan Dedrick,
+        Davide Cavalca, David Herrmann, David Michael, Dennis Wassenberg,
+        Djalal Harouni, Dongsu Park, Douglas Christman, Elias Probst, Eric
+        Cook, Erik Karlsson, Evgeny Vereshchagin, Felipe Sateler, Felix Zhang,
+        Franck Bui, George Hilliard, Giuseppe Scrivano, HATAYAMA Daisuke,
+        Heikki Kemppainen, Hendrik Brueckner, hi117, Ismo Puustinen, Ivan
+        Shapovalov, Jakub Filak, Jakub Wilk, Jan Synacek, Jason Kölker,
+        Jean-Sébastien Bour, Jiří Pírko, Jonathan Boulle, Jorge Niedbalski,
+        Keith Busch, kristbaum, Kyle Russell, Lans Zhang, Lennart Poettering,
+        Leonardo Brondani Schenkel, Lucas Werkmeister, Luca Bruno, Lukáš
+        Nykrýn, Maciek Borzecki, Mantas Mikulėnas, Marc-Antoine Perennou,
+        Marcel Holtmann, Marcos Mello, Martin Ejdestig, Martin Pitt, Matej
+        Habrnal, Maxime de Roucy, Michael Biebl, Michael Chapman, Michael Hoy,
+        Michael Olbrich, Michael Pope, Michal Sekletar, Michal Soltys, Mike
+        Gilbert, Nick Owens, Patrik Flykt, Paweł Szewczyk, Peter Hutterer,
+        Piotr Drąg, Reid Price, Richard W.M. Jones, Roman Stingler, Ronny
+        Chevalier, Seraphime Kirkovski, Stefan Schweter, Steve Muir, Susant
+        Sahani, Tejun Heo, Thomas Blume, Thomas H. P. Andersen, Tiago Levit,
+        Tobias Jungel, Tomáš Janoušek, Topi Miettinen, Torstein Husebø, Umut
+        Tezduyar Lindskog, Vito Caputo, WaLyong Cho, Wilhelm Schuster, Yann
+        E. MORIN, Yi EungJun, Yuki Inoguchi, Yu Watanabe, Zbigniew
+        Jędrzejewski-Szmek, Zeal Jagannatha
+
+        — Santa Fe, 2016-11-03
+
 CHANGES WITH 231:
 
         * In service units the various ExecXYZ= settings have been extended
@@ -176,7 +1078,7 @@ CHANGES WITH 231:
           file. It can be used in lieu of %systemd_requires in packages which
           don't use any systemd functionality and are intended to be installed
           in minimal containers without systemd present. This macro provides
-          ordering dependecies to ensure that if the package is installed in
+          ordering dependencies to ensure that if the package is installed in
           the same rpm transaction as systemd, systemd will be installed before
           the scriptlets for the package are executed, allowing unit presets
           to be handled.
@@ -211,11 +1113,14 @@ CHANGES WITH 231:
           "mkosi" is invoked in the build tree a new raw OS image is generated
           incorporating the systemd sources currently being worked on and a
           clean, fresh distribution installation. The generated OS image may be
-          booted up with "systemd-nspawn -b -i", qemu-kvm or on any physcial
+          booted up with "systemd-nspawn -b -i", qemu-kvm or on any physical
           UEFI PC. This functionality is particularly useful to easily test
           local changes made to systemd in a pristine, defined environment. See
           HACKING for details.
 
+        * configure learned the --with-support-url= option to specify the
+          distribution's bugtracker.
+
         Contributions from: Alban Crequy, Alessandro Puccetti, Alessio Igor
         Bogani, Alexander Kuleshov, Alexander Kurtz, Alex Gaynor, Andika
         Triwidada, Andreas Pokorny, Andreas Rammhold, Andrew Jeddeloh, Ansgar
@@ -385,13 +1290,13 @@ CHANGES WITH 230:
           of the owners and the ACLs of all files and directories in a
           container tree to match the UID/GID user namespacing range selected
           for the container invocation. This mode is enabled via the new
-          --private-user-chown switch. It also gained support for automatically
-          choosing a free, previously unused UID/GID range when starting a
-          container, via the new --private-users=pick setting (which implies
-          --private-user-chown). Together, these options for the first time
-          make user namespacing for nspawn containers fully automatic and thus
-          deployable. The systemd-nspawn@.service template unit file has been
-          changed to use this functionality by default.
+          --private-users-chown switch. It also gained support for
+          automatically choosing a free, previously unused UID/GID range when
+          starting a container, via the new --private-users=pick setting (which
+          implies --private-users-chown). Together, these options for the first
+          time make user namespacing for nspawn containers fully automatic and
+          thus deployable. The systemd-nspawn@.service template unit file has
+          been changed to use this functionality by default.
 
         * systemd-nspawn gained a new --network-zone= switch, that allows
           creating ad-hoc virtual Ethernet links between multiple containers,
@@ -871,7 +1776,7 @@ CHANGES WITH 228:
           --user instance of systemd these specifiers where correctly
           resolved, but hardly made any sense, since the user instance
           lacks privileges to do user switches anyway, and User= is
-          hence useless. Morever, even in the --user instance of
+          hence useless. Moreover, even in the --user instance of
           systemd behaviour was awkward as it would only take settings
           from User= assignment placed before the specifier into
           account. In order to unify and simplify the logic around
@@ -1007,7 +1912,7 @@ CHANGES WITH 227:
         * The RuntimeDirectory= setting now understands unit
           specifiers like %i or %f.
 
-        * A new (still internal) libary API sd-ipv4acd has been added,
+        * A new (still internal) library API sd-ipv4acd has been added,
           that implements address conflict detection for IPv4. It's
           based on code from sd-ipv4ll, and will be useful for
           detecting DHCP address conflicts.
@@ -1501,7 +2406,7 @@ CHANGES WITH 220:
           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
+          https://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
@@ -1576,7 +2481,7 @@ CHANGES WITH 220:
 
         * 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
+          setting resource parameters (e.g. "CPUShares=500") on
           containers started from the command line.
 
         * systemd-nspawn gained a new --private-users= switch to make
@@ -1874,7 +2779,7 @@ CHANGES WITH 219:
           files.
 
         * systemd now provides a way to store file descriptors
-          per-service in PID 1.This is useful for daemons to ensure
+          per-service in PID 1. This is useful for daemons to ensure
           that fds they require are not lost during a daemon
           restart. The fds are passed to the daemon on the next
           invocation in the same way socket activation fds are
@@ -2543,7 +3448,7 @@ CHANGES WITH 216:
           like Cockpit which register web clients as PAM sessions.
 
         * timer units with at least one OnCalendar= setting will now
-          be started only after timer-sync.target has been
+          be started only after time-sync.target has been
           reached. This way they will not elapse before the system
           clock has been corrected by a local NTP client or
           similar. This is particular useful on RTC-less embedded
@@ -2922,7 +3827,7 @@ CHANGES WITH 214:
           time, the extended attribute calls have moved to glibc, and
           libattr is thus unnecessary.
 
-        * Virtualization detection works without priviliges now. This
+        * Virtualization detection works without privileges now. This
           means the systemd-detect-virt binary no longer requires
           CAP_SYS_PTRACE file capabilities, and our daemons can run
           with fewer privileges.
@@ -3404,7 +4309,7 @@ CHANGES WITH 211:
           also supports LUKS-encrypted partitions now. With this in
           place, automatic discovery of partitions to mount following
           the Discoverable Partitions Specification
-          (http://www.freedesktop.org/wiki/Specifications/DiscoverablePartitionsSpec)
+          (https://www.freedesktop.org/wiki/Specifications/DiscoverablePartitionsSpec)
           is now a lot more complete. This allows booting without
           /etc/fstab and without root= on the kernel command line on
           systems prepared appropriately.
@@ -3646,7 +4551,7 @@ CHANGES WITH 209:
           /usr/lib/net/links/99-default.link. Old
           80-net-name-slot.rules udev configuration file has been
           removed, so local configuration overriding this file should
-          be adapated to override 99-default.link instead.
+          be adapted to override 99-default.link instead.
 
         * When the User= switch is used in a unit file, also
           initialize $SHELL= based on the user database entry.
@@ -4289,7 +5194,7 @@ CHANGES WITH 206:
 
         * logind's device ACLs may now be applied to these "dead"
           devices nodes too, thus finally allowing managed access to
-          devices such as /dev/snd/sequencer whithout loading the
+          devices such as /dev/snd/sequencer without loading the
           backing module right-away.
 
         * A new RPM macro has been added that may be used to apply
@@ -4756,7 +5661,7 @@ CHANGES WITH 199:
         * A new libsystemd-bus module has been added that implements a
           pretty complete D-Bus client library. For details see:
 
-          http://lists.freedesktop.org/archives/systemd-devel/2013-March/009797.html
+          https://lists.freedesktop.org/archives/systemd-devel/2013-March/009797.html
 
         * journald will now explicitly flush the journal files to disk
           at the latest 5min after each write. The file will then also
@@ -4780,7 +5685,7 @@ CHANGES WITH 199:
           processes executed in parallel based on the number of available
           CPUs instead of the amount of available RAM. This is supposed
           to provide a more reliable default and limit a too aggressive
-          paralellism for setups with 1000s of devices connected.
+          parallelism for setups with 1000s of devices connected.
 
         Contributions from: Auke Kok, Colin Walters, Cristian
         Rodríguez, Daniel Buch, Dave Reisner, Frederic Crozat, Hannes
@@ -4906,7 +5811,7 @@ CHANGES WITH 198:
           only in conjunction with Gummiboot, but could be supported
           by other boot loaders too. For details see:
 
-          http://www.freedesktop.org/wiki/Software/systemd/BootLoaderInterface
+          https://www.freedesktop.org/wiki/Software/systemd/BootLoaderInterface
 
         * A new generator has been added that automatically mounts the
           EFI System Partition (ESP) to /boot, if that directory
@@ -4982,7 +5887,7 @@ CHANGES WITH 198:
         * A new tool kernel-install has been added that can install
           kernel images according to the Boot Loader Specification:
 
-          http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec
+          https://www.freedesktop.org/wiki/Specifications/BootLoaderSpec
 
         * Boot time console output has been improved to provide
           animated boot time output for hanging jobs.
@@ -5072,7 +5977,7 @@ CHANGES WITH 197:
           of these policies is now the default. Please see this wiki
           document for details:
 
-          http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames
+          https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames
 
         * Auke Kok's bootchart implementation has been added to the
           systemd tree. It is an optional component that can graph the
@@ -5118,7 +6023,7 @@ CHANGES WITH 197:
           presenting log data.
 
         * systemctl will no longer show control group information for
-          a unit if the control group is empty anyway.
+          a unit if the control group is empty anyway.
 
         * logind can now automatically suspend/hibernate/shutdown the
           system on idle.
@@ -5220,7 +6125,7 @@ CHANGES WITH 196:
           indexed database to link up additional information with
           journal entries. For further details please check:
 
-          http://www.freedesktop.org/wiki/Software/systemd/catalog
+          https://www.freedesktop.org/wiki/Software/systemd/catalog
 
           The indexed message catalog database also needs to be
           rebuilt after installation of message catalog files. Use
@@ -5909,7 +6814,7 @@ CHANGES WITH 186:
         * The SysV search path is no longer exported on the D-Bus
           Manager object.
 
-        * The Names= option is been removed from unit file parsing.
+        * The Names= option has been removed from unit file parsing.
 
         * There's a new man page bootup(7) detailing the boot process.
 
@@ -6054,7 +6959,7 @@ CHANGES WITH 183:
           about this in more detail.
 
         * var-run.mount and var-lock.mount are no longer provided
-          (which prevously bind mounted these directories to their new
+          (which previously bind mounted these directories to their new
           places). Distributions which have not converted these
           directories to symlinks should consider stealing these files
           from git history and add them downstream.
@@ -6072,7 +6977,7 @@ CHANGES WITH 183:
 
         * A framework for implementing offline system updates is now
           integrated, for details see:
-          http://freedesktop.org/wiki/Software/systemd/SystemUpdates
+          https://www.freedesktop.org/wiki/Software/systemd/SystemUpdates
 
         * A new service type Type=idle is available now which helps us
           avoiding ugly interleaving of getty output and boot status
@@ -6195,7 +7100,7 @@ CHANGES WITH 44:
         * Many bugfixes for the journal, including endianness fixes and
           ensuring that disk space enforcement works
 
-        * sd-login.h is C++ comptaible again
+        * sd-login.h is C++ compatible again
 
         * Extend the /etc/os-release format on request of the Debian
           folks
@@ -6353,7 +7258,7 @@ CHANGES WITH 39:
 
         * New unit file option ControlGroupPersistent= to make cgroups
           persistent, following the mechanisms outlined in
-          http://www.freedesktop.org/wiki/Software/systemd/PaxControlGroups
+          https://www.freedesktop.org/wiki/Software/systemd/PaxControlGroups
 
         * Support multiple local RTCs in a sane way
 
@@ -6423,7 +7328,7 @@ CHANGES WITH 38:
 
         * New man pages for all APIs from libsystemd-login.
 
-        * The build tree got reorganized and the build system is a
+        * The build tree got reorganized and the build system is a
           lot more modular allowing embedded setups to specifically
           select the components of systemd they are interested in.
 
@@ -6440,7 +7345,7 @@ CHANGES WITH 38:
         * Processes with '@' in argv[0][0] are now excluded from the
           final shut-down killing spree, following the logic explained
           in:
-          http://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons
+          https://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons
 
         * All processes remaining in a service cgroup when we enter
           the START or START_PRE states are now killed with
diff --git a/README b/README
index ca8993c..60388ee 100644 (file)
--- a/README
+++ b/README
@@ -4,7 +4,7 @@ DETAILS:
         http://0pointer.de/blog/projects/systemd.html
 
 WEB SITE:
-        http://www.freedesktop.org/wiki/Software/systemd
+        https://www.freedesktop.org/wiki/Software/systemd
 
 GIT:
         git@github.com:systemd/systemd.git
@@ -14,7 +14,7 @@ GITWEB:
         https://github.com/systemd/systemd
 
 MAILING LIST:
-        http://lists.freedesktop.org/mailman/listinfo/systemd-devel
+        https://lists.freedesktop.org/mailman/listinfo/systemd-devel
 
 IRC:
         #systemd on irc.freenode.org
@@ -35,7 +35,7 @@ LICENSE:
         - except src/udev/* which is (currently still) GPLv2, GPLv2+
 
 REQUIREMENTS:
-        Linux kernel >= 3.12
+        Linux kernel >= 3.13
         Linux kernel >= 4.2 for unified cgroup hierarchy support
 
         Kernel Config Options:
@@ -50,6 +50,11 @@ REQUIREMENTS:
           CONFIG_PROC_FS
           CONFIG_FHANDLE (libudev, mount and bind mount handling)
 
+        Kernel crypto/hash API
+          CONFIG_CRYPTO_USER_API_HASH
+          CONFIG_CRYPTO_HMAC
+          CONFIG_CRYPTO_SHA256
+
         udev will fail to work with the legacy sysfs layout:
           CONFIG_SYSFS_DEPRECATED=n
 
@@ -67,18 +72,22 @@ REQUIREMENTS:
         create additional symlinks in /dev/disk/ and /dev/tape:
           CONFIG_BLK_DEV_BSG
 
-        Required for PrivateNetwork and PrivateDevices in service units:
+        Required for PrivateNetwork= and PrivateDevices= in service units:
           CONFIG_NET_NS
           CONFIG_DEVPTS_MULTIPLE_INSTANCES
         Note that systemd-localed.service and other systemd units use
         PrivateNetwork and PrivateDevices so this is effectively required.
 
+        Required for PrivateUsers= in service units:
+          CONFIG_USER_NS
+
         Optional but strongly recommended:
           CONFIG_IPV6
           CONFIG_AUTOFS4_FS
           CONFIG_TMPFS_XATTR
           CONFIG_{TMPFS,EXT4,XFS,BTRFS_FS,...}_POSIX_ACL
           CONFIG_SECCOMP
+          CONFIG_SECCOMP_FILTER (required for seccomp support)
           CONFIG_CHECKPOINT_RESTORE (for the kcmp() syscall)
 
         Required for CPUShares= in resource control unit settings
@@ -118,8 +127,9 @@ REQUIREMENTS:
         glibc >= 2.16
         libcap
         libmount >= 2.27.1 (from util-linux)
-                (util-linux *must* be built with --enable-libmount-force-mountinfo)
-        libseccomp >= 1.0.0 (optional)
+                (util-linux < 2.29 *must* be built with --enable-libmount-force-mountinfo,
+                 and later versions without --enable-libmount-support-mtab.)
+        libseccomp >= 2.3.1 (optional)
         libblkid >= 2.24 (from util-linux) (optional)
         libkmod >= 15 (optional)
         PAM >= 1.1.2 (optional)
@@ -133,7 +143,7 @@ REQUIREMENTS:
         libqrencode (optional)
         libmicrohttpd (optional)
         libpython (optional)
-        libidn (optional)
+        libidn2 or libidn (optional)
         elfutils >= 158 (optional)
         make, gcc, and similar tools
 
@@ -142,24 +152,52 @@ REQUIREMENTS:
 
         util-linux >= v2.27.1 required
         dbus >= 1.4.0 (strictly speaking optional, but recommended)
+                NOTE: If using dbus < 1.9.18, you should override the default
+                policy directory (--with-dbuspolicydir=/etc/dbus-1/system.d).
         dracut (optional)
         PolicyKit (optional)
 
-        When building from git, the following tools are needed:
+        Two build systems are supported: meson + ninja-build and autools + make.
+
+        The following tools are needed with both systems:
 
         pkg-config
-        docbook-xsl
-        xsltproc
+        gperf >= 3.1
+        docbook-xsl (optional, required for documentation)
+        xsltproc    (optional, required for documentation)
+        python-lxml (optional, required to build the indices)
+
+        When building with meson, python and ninja-build are required.
+
+        To build in directory build/:
+          meson build/ && ninja -C build
+
+        Any configuration options can be specfied as -Darg=value... arguments
+        to meson. After the build directory is initially configured, meson will
+        refuse to run again, and options must be changed with:
+          mesonconf -Darg=value...
+        mesonconf without any arguments will print out available options and
+        their current values.
+
+        Useful commands:
+          ninja -v some/target
+          ninja test
+          sudo ninja install
+          DESTDIR=... ninja install
+
+        When building with autotools, the following tools are needed:
+
         automake
         autoconf
         libtool
         intltool
-        gperf
         python (optional)
-        python-lxml (optional, but required to build the indices)
 
-        The build system is initialized with ./autogen.sh. A tar ball
-        can be created with:
+        The build system is initialized with ./autogen.sh and the usual
+          ./configure && make
+        should be used.
+
+        A tar ball can be created with:
           git archive --format=tar --prefix=systemd-222/ v222 | xz > systemd-222.tar.xz
 
         When systemd-hostnamed is used, it is strongly recommended to
@@ -168,6 +206,14 @@ REQUIREMENTS:
         under all circumstances. In fact, systemd-hostnamed will warn
         if nss-myhostname is not installed.
 
+        Additional packages are necessary to run some tests:
+        - busybox            (used by test/TEST-13-NSPAWN-SMOKE)
+        - nc                 (used by test/TEST-12-ISSUE-3171)
+        - python3-pyparsing
+        - python3-evdev      (used by hwdb parsing tests)
+        - strace             (used by test/test-functions)
+        - capsh              (optional, used by test-execute)
+
 USERS AND GROUPS:
         Default udev rules use the following standard system group
         names, which need to be resolvable by getgrnam() at any time,
@@ -201,7 +247,7 @@ USERS AND GROUPS:
         "systemd-coredump" system user and group to exist.
 
 NSS:
-        systemd ships with three NSS modules:
+        systemd ships with four glibc NSS modules:
 
         nss-myhostname resolves the local hostname to locally
         configured IP addresses, as well as "localhost" to
@@ -210,15 +256,22 @@ NSS:
         nss-resolve enables DNS resolution via the systemd-resolved
         DNS/LLMNR caching stub resolver "systemd-resolved".
 
-        nss-mymachines enables resolution of all local containers
-        registered with machined to their respective IP addresses.
+        nss-mymachines enables resolution of all local containers registered
+        with machined to their respective IP addresses. It also maps UID/GIDs
+        ranges used by containers to useful names.
+
+        nss-systemd enables resolution of all dynamically allocated service
+        users. (See the DynamicUser= setting in unit files.)
 
-        To make use of these NSS modules, please add them to the
-        "hosts: " line in /etc/nsswitch.conf. The "resolve" module
-        should replace the glibc "dns" module in this file.
+        To make use of these NSS modules, please add them to the "hosts:",
+        "passwd:" and "group:" lines in /etc/nsswitch.conf. The "resolve"
+        module should replace the glibc "dns" module in this file (and don't
+        worry, it chain-loads the "dns" module if it can't talk to resolved).
 
-        The three modules should be used in the following order:
+        The four modules should be used in the following order:
 
+                passwd: compat mymachines systemd
+                group: compat mymachines systemd
                 hosts: files mymachines resolve myhostname
 
 SYSV INIT.D SCRIPTS:
@@ -248,18 +301,13 @@ WARNINGS:
         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
+        https://www.freedesktop.org/wiki/Software/systemd/separate-usr-is-broken
 
         To run systemd under valgrind, compile with VALGRIND defined
         (e.g. ./configure CPPFLAGS='... -DVALGRIND=1'). Otherwise,
         false positives will be triggered by code which violates
         some rules but is actually safe.
 
-        Currently, systemd-timesyncd defaults to use the Google NTP
-        servers if not specified otherwise at configure time. You
-        really should not ship an OS or device with this default
-        setting. See DISTRO_PORTING for details.
-
 ENGINEERING AND CONSULTING SERVICES:
         Kinvolk (https://kinvolk.io) offers professional engineering
         and consulting services for systemd. Please contact Chris Kühl
index 35ab966..c406aca 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,11 +1,13 @@
 # systemd - System and Service Manager
 
+<a href="https://in.waw.pl/systemd-github-state/systemd-systemd-issues.svg"><img align="right" src="https://in.waw.pl/systemd-github-state/systemd-systemd-issues-small.svg" alt="Count of open issues over time"></a>
+<a href="https://in.waw.pl/systemd-github-state/systemd-systemd-pull-requests.svg"><img align="right" src="https://in.waw.pl/systemd-github-state/systemd-systemd-pull-requests-small.svg" alt="Count of open pull requests over time"></a>
 [![Build Status](https://semaphoreci.com/api/v1/projects/28a5a3ca-3c56-4078-8b5e-7ed6ef912e14/443470/shields_badge.svg)](https://semaphoreci.com/systemd/systemd)<br/>
 [![Coverity Scan Status](https://scan.coverity.com/projects/350/badge.svg)](https://scan.coverity.com/projects/350)
 
 ## Details
 
-General information about systemd can be found in the [systemd Wiki](http://www.freedesktop.org/wiki/Software/systemd).
+General information about systemd can be found in the [systemd Wiki](https://www.freedesktop.org/wiki/Software/systemd).
 
 Information about build requirements are provided in the [README file](../master/README).
 
@@ -17,4 +19,4 @@ Please see our [Contribution Guidelines](../master/.github/CONTRIBUTING.md) for
 
 When preparing patches for systemd, please follow our [Coding Style Guidelines](../master/CODING_STYLE).
 
-If you are looking for support, please contact our [mailing list](http://lists.freedesktop.org/mailman/listinfo/systemd-devel) or join our [IRC channel](irc://irc.freenode.org/%23systemd).
+If you are looking for support, please contact our [mailing list](https://lists.freedesktop.org/mailman/listinfo/systemd-devel) or join our [IRC channel](irc://irc.freenode.org/%23systemd).
diff --git a/TODO b/TODO
index 3d1239f..0b96d40 100644 (file)
--- a/TODO
+++ b/TODO
@@ -12,9 +12,6 @@ Bugfixes:
           Environment=ONE='one' "TWO='two two' too" THREE=
           ExecStart=/bin/python3 -c 'import sys;print(sys.argv)' $ONE $TWO $THREE
 
-* When systemctl --host is used, underlying ssh connection can remain open.
-  bus_close does not kill children?
-
 External:
 
 * Fedora: add an rpmlint check that verifies that all unit files in the RPM are listed in %systemd_post macros.
@@ -23,54 +20,180 @@ External:
 
 Janitorial Clean-ups:
 
-* code cleanup: retire FOREACH_WORD_QUOTED, port to extract_first_word() loops instead
+* Rearrange tests so that the various test-xyz.c match a specific src/basic/xyz.c again
 
-* replace manual readdir() loops with FOREACH_DIRENT or FOREACH_DIRENT_ALL
+Features:
 
-* Get rid of the last strerror() invocations in favour of %m and strerror_r()
+* Add AddUser= setting to unit files, similar to DynamicUser=1 which however
+  creates a static, persistent user rather than a dynamic, transient user. We
+  can leverage code from sysusers.d for this.
 
-* Rearrange tests so that the various test-xyz.c match a specific src/basic/xyz.c again
+* add some optional flag to ReadWritePaths= and friends, that has the effect
+  that we create the dir in question when the service is started. Example:
 
-Features:
+  ReadWritePaths=:/var/lib/foobar
 
-* ProtectKernelLogs= (drops CAP_SYSLOG, add seccomp for syslog() syscall, and DeviceAllow to /dev/kmsg) in service files
+* sort generated hwdb files alphabetically when we import them, so that git
+  diffs remain minimal (in particular: the OUI databases we import are not
+  sorted, and not stable)
 
-* ProtectClock= (drops CAP_SYS_TIMES, adds seecomp filters for settimeofday, adjtimex), sets DeviceAllow o /dev/rtc
+* set SystemCallArchitectures=native on all our services
 
-* ProtectMount= (drop mount/umount/pivot_root from seccomp, disallow fuse via DeviceAllow, imply Mountflags=slave)
+* maybe add call sd_journal_set_block_timeout() or so to set SO_SNDTIMEO for
+  the sd-journal logging socket, and, if the timeout is set to 0, sets
+  O_NONBLOCK on it. That way people can control if and when to block for
+  logging.
 
-* ProtectDevices= should also take iopl/ioperm/pciaccess away
+* tighten sd_notify() MAINPID= checks a bit: don't accept foreign PIDs (i.e.
+  PIDs not managed by the service manager)
 
-* ProtectKeyRing= to take keyring calls away
+* journald: when we recv a log datagram via the native or syslog transports,
+  search for the PID in the active stream connections, and let's make sure to
+  always process the datagrams before the streams. Then, cache client metadata
+  per stream in the stream object. This way we can somewhat fix the race with
+  quickly exiting processes which log as long as they had their own stream
+  connection...
 
-* PrivateUsers= which maps the all user ids except root and the one specified
-  in User= to nobody
+* hostnamed: populate form factor data from a new hwdb database, so that old
+  yogas can be recognized as "convertible" too, even if they predate the DMI
+  "convertible" form factor
 
-* Add AllocateUser= for allowing dynamic user ids per-service
+* Maybe add a small tool invoked early at boot, that adds in or resizes
+  partitions automatically, to be used when the media used is actually larger
+  than the image written onto it is.
 
-* Add DataDirectory=, CacheDirectory= and LogDirectory= to match
-  RuntimeDirectory=, and create it as necessary when starting a service, owned by the right user.
+* Maybe add PrivatePIDs= as new unit setting, and do minimal PID namespacing
+  after all. Be strict however, only support the equivalent of nspawn's
+  --as-pid2 switch, and sanely proxy sd_notify() messages dropping stuff such
+  as MAINPID.
+
+* change the dependency Set* objects in Unit structures to become Hashmap*, and
+  then store a bit mask who created a specific dependency: the source unit via
+  fragment configuration, the destination unit via fragment configuration, or
+  the source unit via udev rules (in case of .device units), or any combination
+  thereof. This information can then be used to flush out old udev-created
+  dependencies when the udev properties change, and eventually to implement a
+  "systemctl refresh" operation for reloading the configuration of individual
+  units without reloading the whole set.
+
+* Add ExecMonitor= setting. May be used multiple times. Forks off a process in
+  the service cgroup, which is supposed to monitor the service, and when it
+  exits the service is considered failed by its monitor.
+
+* track the per-service PAM process properly (i.e. as an additional control
+  process), so that it may be queried on the bus and everything.
+
+* add a new "debug" job mode, that is propagated to unit_start() and for
+  services results in two things: we raise SIGSTOP right before invoking
+  execve() and turn off watchdog support. Then, use that to implement
+  "systemd-gdb" for attaching to the start-up of any system service in its
+  natural habitat.
+
+* replace all canonicalize_file_name() invocations by chase_symlinks(), in
+  particulr those where a rootdir is relevant.
+
+* maybe introduce gpt auto discovery for /var/tmp?
+
+* set ProtectSystem=strict for all our usual services.
+
+* fix PrivateNetwork= so that we fall back gracefully on kernels lacking
+  namespacing support (similar for the other namespacing options)
+
+* maybe add gpt-partition-based user management: each user gets his own
+  LUKS-encrypted GPT partition with a new GPT type. A small nss module
+  enumerates users via udev partition enumeration. UIDs are assigned in a fixed
+  way: the partition index is added as offset to some fixed base uid. User name
+  is stored in GPT partition name. A PAM module authenticates the user via the
+  LUKS partition password. Benefits: strong per-user security, compatibility
+  with stateless/read-only/verity-enabled root. (other idea: do this based on
+  loopback files in /home, without GPT involvement)
+
+* gpt-auto logic: introduce support for discovering /var matching an image. For
+  that, use a partition type UUID that is hashed from the OS name (as encoded
+  in /etc/os-release), the architecture, and 4 new bits from the gpt flags
+  field of the root partition. This way can easily support multiple OS
+  installations on the same GPT partition table, without problems with
+  unmatched /var partitions.
+
+* gpt-auto logic: related to the above, maybe support a "secondary" root
+  partition, that is mounted to / and is writable, and where the actual root's
+  /usr is mounted into.
+
+* machined: add apis to query /etc/machine-info data of a container
+
+* .mount and .swap units: add Format=yes|no option that formats the partition before mounting/enabling it, implicitly
+
+* gpt-auto logic: support encrypted swap, add kernel cmdline option to force it, and honour a gpt bit about it, plus maybe a configuration file
+
+* drop nss-myhostname in favour of nss-resolve?
+
+* drop internal dlopen() based nss-dns fallback in nss-resolve, and rely on the
+  external nsswitch.conf based one
+
+* add a percentage syntax for TimeoutStopSec=, e.g. TimeoutStopSec=150%, and
+  then use that for the setting used in user@.service. It should be understood
+  relative to the configured default value.
+
+* on cgroupsv2 add DelegateControllers=, to pick the precise cgroup controllers to delegate
+
+* in networkd, when matching device types, fix up DEVTYPE rubbish the kernel passes to us
+
+* enable LockMLOCK to take a percentage value relative to physical memory
 
-* Add BindDirectory= for allowing arbitrary, private bind mounts for services
+* switch to ProtectSystem=strict for all our long-running services where that's possible
 
-* Beef up RootDirectory= to use namespacing/bind mounts as soon as fs
-  namespaces are enabled by the service
+* Permit masking specific netlink APIs with RestrictAddressFamily=
 
-* Add RootImage= for mounting a disk image or file as root directory
+* nspawn: start UID allocation loop from hash of container name
 
-* RestrictNamespaces= or so in services (taking away the ability to create namespaces, with setns, unshare, clone)
+* nspawn: support that /proc, /sys/, /dev are pre-mounted
 
-* nspawn: make /proc/sys/net writable?
+* define gpt header bits to select volatility mode
+
+* ProtectKernelLogs= (drops CAP_SYSLOG, add seccomp for syslog() syscall, and DeviceAllow to /dev/kmsg) in service files
+
+* ProtectClock= (drops CAP_SYS_TIMES, adds seecomp filters for settimeofday, adjtimex), sets DeviceAllow o /dev/rtc
+
+* ProtectTracing= (drops CAP_SYS_PTRACE, blocks ptrace syscall, makes /sys/kernel/tracing go away)
+
+* ProtectMount= (drop mount/umount/pivot_root from seccomp, disallow fuse via DeviceAllow, imply Mountflags=slave)
+
+* ProtectKeyRing= to take keyring calls away
+
+* RemoveKeyRing= to remove all keyring entries of the specified user
+
+* ProtectReboot= that masks reboot() and kexec_load() syscalls, prohibits kill
+  on PID 1 with the relevant signals, and makes relevant files in /sys and
+  /proc (such as the sysrq stuff) unavailable
+
+* DeviceAllow= should also generate seccomp filters for mknod()
+
+* Add DataDirectory=, CacheDirectory= and LogDirectory= to match
+  RuntimeDirectory=, and create it as necessary when starting a service, owned by the right user.
 
 * make sure the ratelimit object can deal with USEC_INFINITY as way to turn off things
 
 * journalctl: make sure -f ends when the container indicated by -M terminates
 
+* mount: automatically search for "main" partition of an image has multiple
+  partitions
+
 * expose the "privileged" flag of ExecCommand on the bus, and open it up to
   transient units
 
+* in nss-systemd, if we run inside of RootDirectory= with PrivateUsers= set,
+  find a way to map the User=/Group= of the service to the right name. This way
+  a user/group for a service only has to exist on the host for the right
+  mapping to work.
+
 * allow attaching additional journald log fields to cgroups
 
+* add bus API for creating unit files in /etc, reusing the code for transient units
+
+* add bus API to remove unit files from /etc
+
+* add bus API to retrieve current unit file contents (i.e. implement "systemctl cat" on the bus only)
+
 * rework fopen_temporary() to make use of open_tmpfile_linkable() (problem: the
   kernel doesn't support linkat() that replaces existing files, currently)
 
@@ -82,10 +205,6 @@ Features:
 * journald: sigbus API via a signal-handler safe function that people may call
   from the SIGBUS handler
 
-* when using UTF8, ellipsize with "…" rather than "...", so that we can show more contents before truncating
-
-* move specifier expansion from service_spawn() into load-fragment.c
-
 * optionally, also require WATCHDOG=1 notifications during service start-up and shutdown
 
 * resolved: when routing queries, make sure only look for the *longest* suffix...
@@ -99,8 +218,6 @@ Features:
 
 * add systemctl stop --job-mode=triggering that follows TRIGGERED_BY deps and adds them to the same transaction
 
-* Maybe add a way how users can "pin" units into memory, so that they are not subject to automatic GC?
-
 * PID1: find a way how we can reload unit file configuration for
   specific units only, without reloading the whole of systemd
 
@@ -116,8 +233,6 @@ Features:
 
 * PID 1 should send out sd_notify("WATCHDOG=1") messages (for usage in the --user mode, and when run via nspawn)
 
-* consider throwing a warning if a service declares it wants to be "Before=" a .device unit.
-
 * there's probably something wrong with having user mounts below /sys,
   as we have for debugfs. for exmaple, src/core/mount.c handles mounts
   prefixed with /sys generally special.
@@ -155,7 +270,7 @@ Features:
 * implement a per-service firewall based on net_cls
 
 * Port various tools to make use of verbs.[ch], where applicable: busctl,
-  bootctl, coredumpctl, hostnamectl, localectl, systemd-analyze, timedatectl
+  coredumpctl, hostnamectl, localectl, systemd-analyze, timedatectl
 
 * hostnamectl: show root image uuid
 
@@ -172,7 +287,7 @@ Features:
 * synchronize console access with BSD locks:
   http://lists.freedesktop.org/archives/systemd-devel/2014-October/024582.html
 
-* as soon as we have kdbus, and sender timestamps, revisit coalescing multiple parallel daemon reloads:
+* as soon as we have sender timestamps, revisit coalescing multiple parallel daemon reloads:
   http://lists.freedesktop.org/archives/systemd-devel/2014-December/025862.html
 
 * in systemctl list-unit-files: show the install value the presets would suggest for a service in a third column
@@ -212,10 +327,6 @@ Features:
 
 * timesyncd: add ugly bus calls to set NTP servers per-interface, for usage by NM
 
-* extract_many_words() should probably be used by a lot of code that
-  currently uses FOREACH_WORD and friends. For example, most conf
-  parsing callbacks should use it.
-
 * merge ~/.local/share and ~/.local/lib into one similar /usr/lib and /usr/share....
 
 * systemd.show_status= should probably have a mode where only failed
@@ -244,7 +355,6 @@ Features:
 
 * support empty /etc boots nicely:
   - nspawn/gpt-generator: introduce new gpt partition type for /usr
-  - fstab-generator: support systemd.volatile=yes|no|state on the kernel cmdline, too, similar to nspawn's --volatile=
 
 * generator that automatically discovers btrfs subvolumes, identifies their purpose based on some xattr on them.
 
@@ -257,12 +367,9 @@ Features:
 * For timer units: add some mechanisms so that timer units that trigger immediately on boot do not have the services
   they run added to the initial transaction and thus confuse Type=idle.
 
-* Run most system services with cgroupfs read-only and procfs with a more secure mode (doesn't work, since the hidepid= option is per-pid-namespace, not per-mount)
-
 * add bus api to query unit file's X fields.
 
 * gpt-auto-generator:
-  - Support LUKS for root devices
   - Define new partition type for encrypted swap? Support probed LUKS for encrypted swap?
   - Make /home automount rather than mount?
 
@@ -272,9 +379,6 @@ Features:
 
 * MessageQueueMessageSize= (and suchlike) should use parse_iec_size().
 
-* "busctl status" works only as root on dbus1, since we cannot read
-  /proc/$PID/exe
-
 * implement Distribute= in socket units to allow running multiple
   service instances processing the listening socket, and open this up
   for ReusePort=
@@ -285,8 +389,6 @@ Features:
   and passes this back to PID1 via SCM_RIGHTS. This also could be used
   to allow Chown/chgrp on sockets without requiring NSS in PID 1.
 
-* New service property: maximum CPU runtime for a service
-
 * introduce bus call FreezeUnit(s, b), as well as "systemctl freeze
   $UNIT" and "systemctl thaw $UNIT" as wrappers around this. The calls
   should SIGSTOP all unit processes in a loop until all processes of
@@ -323,11 +425,7 @@ Features:
   error. Currently, we just ignore it and read the unit from the search
   path anyway.
 
-* refuse boot if /etc/os-release is missing or /etc/machine-id cannot be set up
-
-* btrfs raid assembly: some .device jobs stay stuck in the queue
-
-* make sure gdm does not use multi-user-x but the new default X configuration file, and then remove multi-user-x from systemd
+* refuse boot if /usr/lib/os-release is missing or /etc/machine-id cannot be set up
 
 * man: the documentation of Restart= currently is very misleading and suggests the tools from ExecStartPre= might get restarted.
 
@@ -476,7 +574,6 @@ Features:
     message that works, but alraedy after a short tiemout
   - check if we can make journalctl by default use --follow mode inside of less if called without args?
   - maybe add API to send pairs of iovecs via sd_journal_send
-  - journal: when writing journal auto-rotate if time jumps backwards
   - journal: add a setgid "systemd-journal" utility to invoke from libsystemd-journal, which passes fds via STDOUT and does PK access
   - journactl: support negative filtering, i.e. FOOBAR!="waldo",
     and !FOOBAR for events without FOOBAR.
@@ -547,7 +644,6 @@ Features:
   - man: maybe sort directives in man pages, and take sections from --help and apply them to man too
 
 * systemctl:
-  - systemctl list-jobs - show dependencies
   - add systemctl switch to dump transaction without executing it
   - Add a verbose mode to "systemctl start" and friends that explains what is being done or not done
   - "systemctl disable" on a static unit prints no message and does
@@ -568,7 +664,6 @@ Features:
   - timer units should get the ability to trigger when:
     o CLOCK_REALTIME makes jumps (TFD_TIMER_CANCEL_ON_SET)
     o DST changes
-  - Support 2012-02~4 as syntax for specifying the fourth to last day of the month.
   - Modulate timer frequency based on battery state
 
 * add libsystemd-password or so to query passwords during boot using the password agent logic
@@ -577,18 +672,13 @@ Features:
 
 * on shutdown: move utmp, wall, audit logic all into PID 1 (or logind?), get rid of systemd-update-utmp-runlevel
 
-* make repeated alt-ctrl-del presses printing a dump, or even force a reboot without
-  waiting for the timeout
+* make repeated alt-ctrl-del presses printing a dump
 
 * hostnamed: before returning information from /etc/machine-info.conf check the modification data and reread. Similar for localed, ...
 
 * currently x-systemd.timeout is lost in the initrd, since crypttab is copied into dracut, but fstab is not
 
 * nspawn:
-  - to allow "linking" of nspawn containers, extend --network-bridge= so
-    that it can dynamically create bridge interfaces that are refcounted
-    by the containers on them. For each group of containers to link together
-  - nspawn -x should support ephemeral instances of gpt images
   - emulate /dev/kmsg using CUSE and turn off the syslog syscall
     with seccomp. That should provide us with a useful log buffer that
     systemd can log to during early boot, and disconnect container logs
@@ -596,8 +686,6 @@ Features:
   - as soon as networkd has a bus interface, hook up --network-interface=,
     --network-bridge= with networkd, to trigger netdev creation should an
     interface be missing
-  - don't copy /etc/resolv.conf from host into container unless we are in
-    shared-network mode
   - a nice way to boot up without machine id set, so that it is set at boot
     automatically for supporting --ephemeral. Maybe hash the host machine id
     together with the machine name to generate the machine id for the container
@@ -613,9 +701,11 @@ Features:
   - maybe make copying of /etc/resolv.conf optional, and skip it if --read-only
     is used
 
+* dissect
+  - refuse mounting over a mount point
+  - automatically discover .roothash files in dissect, similarly to nspawn
+
 * machined:
-  - "machinectl list" should probably show columns for OS version and IP
-    addresses
   - add an API so that libvirt-lxc can inform us about network interfaces being
     removed or added to an existing machine
   - "machinectl migrate" or similar to copy a container from or to a
@@ -665,7 +755,7 @@ Features:
 
 * coredump:
   - save coredump in Windows/Mozilla minidump format
-  - move PID 1 segfaults to /var/lib/systemd/coredump?
+  - when truncating coredumps, also log the full size that the process had, and make a metadata field so we can report truncated coredumps
 
 * support crash reporting operation modes (https://live.gnome.org/GnomeOS/Design/Whiteboards/ProblemReporting)
 
@@ -729,10 +819,8 @@ Features:
   - maybe introduce WantsMountsFor=? Usecase:
     http://lists.freedesktop.org/archives/systemd-devel/2015-January/027729.html
   - recreate systemd's D-Bus private socket file on SIGUSR2
-  - GC unreferenced jobs (such as .device jobs)
   - move PAM code into its own binary
   - when we automatically restart a service, ensure we restart its rdeps, too.
-  - for services: do not set $HOME in services unless requested
   - hide PAM options in fragment parser when compile time disabled
   - Support --test based on current system state
   - If we show an error about a unit (such as not showing up) and it has no Description string, then show a description string generated form the reverse of unit_name_mangle().
@@ -782,7 +870,6 @@ Features:
    - add reduced [Link] support to .network files
    - add Scope= parsing option for [Network]
    - properly handle routerless dhcp leases
-   - add more attribute support for SIT tunnel
    - work with non-Ethernet devices
    - add support for more bond options
    - dhcp: do we allow configuring dhcp routes on interfaces that are not the one we got the dhcp info from?
@@ -799,7 +886,6 @@ Features:
      support Name=foo*|bar*|baz ?
    - duplicate address check for static IPs (like ARPCHECK in network-scripts)
    - allow DUID/IAID to be customized, see issue #394.
-   - support configuration option for TSO (tcp segmentation offload)
    - whenever uplink info changes, make DHCP server send out FORCERENEW
 
 * networkd-wait-online:
@@ -821,6 +907,7 @@ Features:
      or interface down
    - some servers don't do rapid commit without a filled in IA_NA, verify
      this behavior
+   - RouteTable= ?
 
 External:
 
index 4ec1b2b..1897e23 100755 (executable)
 
 set -e
 
+verb="$1"
+
+case "$verb" in
+"") ;;
+[cgals]) shift ;;
+*) echo "Unexpected argument: $verb" >&2; exit 1 ;;
+esac
+
 oldpwd=$(pwd)
 topdir=$(dirname $0)
 cd $topdir
@@ -52,21 +60,27 @@ args="$args \
 "
 fi
 
+args="$args $@"
 cd $oldpwd
 
-if [ "x$1" = "xc" ]; then
+if [ "$verb" = "c" ]; then
+        set -x
         $topdir/configure CFLAGS='-g -O0 -ftrapv' $args
-        make clean
-elif [ "x$1" = "xg" ]; then
+        make clean >/dev/null
+elif [ "$verb" = "g" ]; then
+        set -x
         $topdir/configure CFLAGS='-g -Og -ftrapv' $args
-        make clean
-elif [ "x$1" = "xa" ]; then
+        make clean >/dev/null
+elif [ "$verb" = "a" ]; then
+        set -x
         $topdir/configure CFLAGS='-g -O0 -Wsuggest-attribute=pure -Wsuggest-attribute=const -ftrapv' $args
-        make clean
-elif [ "x$1" = "xl" ]; then
+        make clean >/dev/null
+elif [ "$verb" = "l" ]; then
+        set -x
         $topdir/configure CC=clang CFLAGS='-g -O0 -ftrapv' $args
-        make clean
-elif [ "x$1" = "xs" ]; then
+        make clean >/dev/null
+elif [ "$verb" = "s" ]; then
+        set -x
         scan-build $topdir/configure CFLAGS='-std=gnu99 -g -O0 -ftrapv' $args
         scan-build make
 else
diff --git a/catalog/meson.build b/catalog/meson.build
new file mode 100644 (file)
index 0000000..6d205b1
--- /dev/null
@@ -0,0 +1,28 @@
+in_files = '''
+        systemd.bg.catalog
+        systemd.be.catalog
+        systemd.be@latin.catalog
+        systemd.fr.catalog
+        systemd.it.catalog
+        systemd.pl.catalog
+        systemd.pt_BR.catalog
+        systemd.ru.catalog
+        systemd.zh_CN.catalog
+        systemd.zh_TW.catalog
+        systemd.catalog
+'''.split()
+
+support_url = get_option('support-url')
+support_sed = 's~%SUPPORT_URL%~@0@~'.format(support_url)
+build_catalog_dir = meson.current_build_dir()
+
+foreach file : in_files
+        custom_target(
+                file,
+                input : file + '.in',
+                output: file,
+                command : [sed, support_sed, '@INPUT@'],
+                capture : true,
+                install : true,
+                install_dir : catalogdir)
+endforeach
index 5b237f0..5b1cdf2 100644 (file)
@@ -20,7 +20,7 @@
 # Belarusian translation
 
 # Фармат каталога апісаны на старонцы
-# http://www.freedesktop.org/wiki/Software/systemd/catalog
+# https://www.freedesktop.org/wiki/Software/systemd/catalog
 
 # For an explanation why we do all this, see https://xkcd.com/1024/
 
@@ -94,7 +94,7 @@ Documentation: man:core(5)
 Subject: Новая сесія № @SESSION_ID@ створана для карыстальніка @USER_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Новая сесія з № @SESSION_ID@ створана для карыстальніка @USER_ID@.
 
@@ -104,7 +104,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: Сесія № @SESSION_ID@ спынена
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Сесія № @SESSION_ID@ спынена.
 
@@ -112,7 +112,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: Даступна новае працоўнае месца № @SEAT_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Новае працоўнае месца № @SEAT_ID@ наладжана і даступна для выкарыстання.
 
@@ -120,7 +120,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: Працоўнае месца № @SEAT_ID@ выдалена
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Працоўнае месца № @SEAT_ID@ выдалена і больш не даступна.
 
index fc9f7ca..764432c 100644 (file)
@@ -20,7 +20,7 @@
 # Belarusian Latin translation
 
 # Farmat kataloha apisany na staroncy
-# http://www.freedesktop.org/wiki/Software/systemd/catalog
+# https://www.freedesktop.org/wiki/Software/systemd/catalog
 
 # For an explanation why we do all this, see https://xkcd.com/1024/
 
@@ -95,7 +95,7 @@ Rekamiendujecca paviedamić ab hetym raspracoŭnikam.
 Subject: Novaja siesija № @SESSION_ID@ stvorana dlia karystaĺnika @USER_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Novaja siesija z № @SESSION_ID@ stvorana dlia karystaĺnika @USER_ID@.
 
@@ -105,7 +105,7 @@ Lidar hetaj siesii pad № @LEADER@.
 Subject: Siesija № @SESSION_ID@ spyniena
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Siesija № @SESSION_ID@ spyniena.
 
@@ -113,7 +113,7 @@ Siesija № @SESSION_ID@ spyniena.
 Subject: Dastupna novaje pracoŭnaje miesca № @SEAT_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Novaje pracoŭnaje miesca № @SEAT_ID@ naladžana i dastupna dlia
 vykarystannia.
@@ -122,7 +122,7 @@ vykarystannia.
 Subject: Pracoŭnaje miesca № @SEAT_ID@ vydaliena
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Pracoŭnaje miesca № @SEAT_ID@ vydaliena i boĺš nie dastupna.
 
index 76b0ce8..4b6cf11 100644 (file)
@@ -19,7 +19,7 @@
 # Message catalog for systemd's own messages
 
 # The catalog format is documented on
-# http://www.freedesktop.org/wiki/Software/systemd/catalog
+# https://www.freedesktop.org/wiki/Software/systemd/catalog
 
 # For an explanation why we do all this, see https://xkcd.com/1024/
 
@@ -95,7 +95,7 @@ Documentation: man:core(5)
 Subject: Създадена е нова сесия № @SESSION_ID@ за потребителя „@USER_ID@“
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 За потребителя „@USER_ID@“ е създадена нова сесия № @SESSION_ID@.
 
@@ -105,7 +105,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: Сесия № @SESSION_ID@ приключи
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Сесия № @SESSION_ID@ приключи работа.
 
@@ -113,7 +113,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: Налично е ново работно място № @SEAT_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Новото работно място № @SEAT_ID@ е настроено и готово за работа.
 
@@ -121,7 +121,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: Работното място № @SEAT_ID@ е премахнато
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Работното място № @SEAT_ID@ вече не е налично.
 
index 8de8597..9cd3e6b 100644 (file)
@@ -18,7 +18,7 @@
 # Message catalog for systemd's own messages
 
 # The catalog format is documented on
-# http://www.freedesktop.org/wiki/Software/systemd/catalog
+# https://www.freedesktop.org/wiki/Software/systemd/catalog
 
 # For an explanation why we do all this, see https://xkcd.com/1024/
 
@@ -88,6 +88,17 @@ Process @COREDUMP_PID@ (@COREDUMP_COMM@) crashed and dumped core.
 This usually indicates a programming error in the crashing program and
 should be reported to its vendor as a bug.
 
+-- 5aadd8e954dc4b1a8c954d63fd9e1137
+Subject: Core file was truncated to @SIZE_LIMIT@ bytes.
+Defined-By: systemd
+Support: %SUPPORT_URL%
+Documentation: man:coredump.conf(5)
+
+The process had more memory mapped than the configured maximum for processing
+and storage by systemd-coredump(8). Only the first @SIZE_LIMIT@ bytes were
+saved. This core might still be usable, but various tools like gdb(1) will warn
+about the file being truncated.
+
 -- fc2e22bc6ee647b6b90729ab34a250b1 de
 Subject: Speicherabbild für Prozess @COREDUMP_PID@ (@COREDUMP_COMM) generiert
 Defined-By: systemd
@@ -104,7 +115,7 @@ als Fehler dem jeweiligen Hersteller gemeldet werden.
 Subject: A new session @SESSION_ID@ has been created for user @USER_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 A new session with the ID @SESSION_ID@ has been created for the user @USER_ID@.
 
@@ -114,7 +125,7 @@ The leading process of the session is @LEADER@.
 Subject: Session @SESSION_ID@ has been terminated
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 A session with the ID @SESSION_ID@ has been terminated.
 
@@ -122,7 +133,7 @@ A session with the ID @SESSION_ID@ has been terminated.
 Subject: A new seat @SEAT_ID@ is now available
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 A new seat @SEAT_ID@ has been configured and is now available.
 
@@ -130,7 +141,7 @@ A new seat @SEAT_ID@ has been configured and is now available.
 Subject: Seat @SEAT_ID@ has now been removed
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 A seat @SEAT_ID@ has been removed and is no longer available.
 
@@ -161,8 +172,8 @@ Defined-By: systemd
 Support: %SUPPORT_URL%
 
 All system services necessary queued for starting at boot have been
-successfully started. Note that this does not mean that the machine is
-now idle as services might still be busy with completing start-up.
+started. Note that this does not mean that the machine is now idle as services
+might still be busy with completing start-up.
 
 Kernel start-up required @KERNEL_USEC@ microseconds.
 
@@ -170,6 +181,17 @@ Initial RAM disk start-up required @INITRD_USEC@ microseconds.
 
 Userspace start-up required @USERSPACE_USEC@ microseconds.
 
+-- eed00a68ffd84e31882105fd973abdd1
+Subject: User manager start-up is now complete
+Defined-By: systemd
+Support: %SUPPORT_URL%
+
+The user manager instance for user @_UID@ has been started. All services queued
+for starting have been started. Note that other services might still be starting
+up or be started at any later time.
+
+Startup of the manager took @USERSPACE_USEC@ microseconds.
+
 -- 6bbd95ee977941e497c48be27c254128
 Subject: System sleep state @SLEEP@ entered
 Defined-By: systemd
index bc7d944..a5570f4 100644 (file)
@@ -19,7 +19,7 @@
 # Danish translation
 
 # The catalog format is documented on
-# http://www.freedesktop.org/wiki/Software/systemd/catalog
+# https://www.freedesktop.org/wiki/Software/systemd/catalog
 
 # For an explanation why we do all this, see https://xkcd.com/1024/
 
@@ -79,7 +79,7 @@ og burde blive reporteret som en bug til folkene bag
 Subject: En ny session @SESSION_ID@ er blevet lavet for bruger @USER_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 En ny session med ID @SESSION_ID@ er blevet lavet for brugeren @USER_ID@.
 
@@ -89,7 +89,7 @@ Den ledende process for sessionen er @LEADER@.
 Subject: Session @SESSION_ID@ er blevet lukket ned
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 En session med ID @SESSION_ID@ er blevet lukket ned.
 
@@ -97,7 +97,7 @@ En session med ID @SESSION_ID@ er blevet lukket ned.
 Subject: En ny arbejdsstation $SEAT_ID@ er nu tilgængelig
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 En ny arbejdsstation @SEAT_ID@ er blevet konfigureret og er nu tilgængelig.
 
@@ -105,7 +105,7 @@ En ny arbejdsstation @SEAT_ID@ er blevet konfigureret og er nu tilgængelig.
 Subject: Arbejdsstation @SEAT_ID@ er nu blevet fjernet
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 En arbejdsstation @SEAT_ID@ er blevet fjernet og er ikke længere tilgængelig.
 
index 573b288..c4b1a81 100644 (file)
@@ -1,7 +1,7 @@
 #  This file is part of systemd.
 #
 #  Copyright 2012 Lennart Poettering
-#  Copyright 2013-2015 Sylvain Plantefève
+#  Copyright 2013-2016 Sylvain Plantefève
 #
 #  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
@@ -20,7 +20,7 @@
 # French translation
 
 # Le format du catalogue de messages est décrit (en anglais) içi :
-# http://www.freedesktop.org/wiki/Software/systemd/catalog
+# https://www.freedesktop.org/wiki/Software/systemd/catalog
 
 -- f77379a8490b408bbe5f6940505a777b
 Subject: Le journal a été démarré
@@ -96,7 +96,7 @@ incriminé, et cela devrait être notifié à son concepteur comme un défaut (b
 Subject: Une nouvelle session @SESSION_ID@ a été créée pour l'utilisateur @USER_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Une nouvelle session a été créée pour l'utilisateur @USER_ID@ avec
 l'identifiant (ID) @SESSION_ID@.
@@ -107,7 +107,7 @@ Le processus maître de la session est @LEADER@.
 Subject: La session @SESSION_ID@ s'est terminée
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 La session d'identifiant (ID) @SESSION_ID@ s'est terminée.
 
@@ -115,7 +115,7 @@ La session d'identifiant (ID) @SESSION_ID@ s'est terminée.
 Subject: Un nouveau poste (seat) @SEAT_ID@ est disponible
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Un nouveau poste (seat) @SEAT_ID@ a été configuré et est maintenant
 disponible.
@@ -124,7 +124,7 @@ disponible.
 Subject: Le poste (seat) @SEAT_ID@ a été retiré
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Le poste (seat) @SEAT_ID@ a été retiré et n'est plus disponible.
 
@@ -148,10 +148,9 @@ Subject: Le démarrage du système est terminé
 Defined-By: systemd
 Support: %SUPPORT_URL%
 
-Tous les services nécessaires au démarrage du système ont été lancés avec
-succès. Notez que cela ne signifie pas que le système est maintenant au
-repos, car des services peuvent encore être en train de terminer leur
-démarrage.
+Tous les services nécessaires au démarrage du système ont été lancés.
+Notez que cela ne signifie pas que le système est maintenant au repos,
+car des services peuvent encore être en train de terminer leur démarrage.
 
 Le chargement du noyau a nécessité @KERNEL_USEC@ microsecondes.
 
@@ -159,6 +158,18 @@ Le chargement du « RAM disk » initial a nécessité @INITRD_USEC@ microseconde
 
 Le chargement de l'espace utilisateur a nécessité @USERSPACE_USEC@ microsecondes.
 
+-- eed00a68ffd84e31882105fd973abdd1
+Subject: Le démarrage du gestionnaire utilisateur est terminé
+Defined-By: systemd
+Support: %SUPPORT_URL%
+
+L'instance du gestionnaire d'utilisateurs pour l'utilisateur @_UID@ a été démarrée.
+Tous les services en file d'attente pour démarrer ont été lancés.
+Notez que des services peuvent être encore en train de démarrer,
+ou d'autres être lancés à tout moment ultérieur.
+
+Le démarrage du gestionnaire a nécéssité @USERSPACE_USEC@ microsecondes.
+
 -- 6bbd95ee977941e497c48be27c254128
 Subject: Le système entre dans l'état de repos (sleep state) @SLEEP@
 Defined-By: systemd
index 7502aed..d30e955 100644 (file)
@@ -19,7 +19,7 @@
 # Croatian translation
 
 # Format kataloga je dokumentiran na
-# http://www.freedesktop.org/wiki/Software/systemd/catalog
+# https://www.freedesktop.org/wiki/Software/systemd/catalog
 
 # Za pojašnjenje zašto ovo radimo, posjetite https://xkcd.com/1024/
 
@@ -93,7 +93,7 @@ trebalo bi se prijaviti razvijatelju kao greška.
 Subject: Nova sesija @SESSION_ID@ je stvorena za korisnika @USER_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Nova sesija sa ID @SESSION_ID@ je stvorena za korisnika @USER_ID@.
 
@@ -103,7 +103,7 @@ Glavni proces sesije je @LEADER@.
 Subject: Sesija @SESSION_ID@ je prekinuta
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Sesija sa ID @SESSION_ID@ je prekinuta.
 
@@ -111,7 +111,7 @@ Sesija sa ID @SESSION_ID@ je prekinuta.
 Subject: Novo sjedište @SEAT_ID@ je sada dostupno
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Novo sjedište @SEAT_ID@ je podešeno i sada je dostupno.
 
@@ -119,7 +119,7 @@ Novo sjedište @SEAT_ID@ je podešeno i sada je dostupno.
 Subject: Sjedište @SEAT_ID@ je sada uklonjeno
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Sjedište @SEAT_ID@ je uklonjeno i više nije dostupno.
 
index f538b7f..23c1cd4 100644 (file)
@@ -19,7 +19,7 @@
 # Message catalog for systemd's own messages
 
 # The catalog format is documented on
-# http://www.freedesktop.org/wiki/Software/systemd/catalog
+# https://www.freedesktop.org/wiki/Software/systemd/catalog
 
 # For an explanation why we do all this, see https://xkcd.com/1024/
 
@@ -78,7 +78,7 @@ a szállítója felé kell bejelenteni.
 Subject: Új munkamenet (@SESSION_ID@) létrehozva, felhasználója: @USER_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Létrejött egy új munkamenet @SESSION_ID@ azonosítóval ezen felhasználóhoz:
 @USER_ID@.
@@ -89,7 +89,7 @@ A munkamenet vezető folyamata: @LEADER@.
 Subject: Munkamenet (@SESSION_ID@) befejezve
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 A következő azonosítójú munkamenet befejeződött: @SESSION_ID@.
 
@@ -97,7 +97,7 @@ A következő azonosítójú munkamenet befejeződött: @SESSION_ID@.
 Subject: Elérhető egy új munkaállomás: @SEAT_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Beállításra kerül és használható egy új munkaállomás: @SEAT_ID@.
 
@@ -105,7 +105,7 @@ Beállításra kerül és használható egy új munkaállomás: @SEAT_ID@.
 Subject: A munkaállomás eltávolítva: @SEAT_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 A munkaállomás el lett távolítva, és már nem érhető el: @SEAT_ID@
 
index 86e44a6..208ac2b 100644 (file)
@@ -33,6 +33,21 @@ Support: %SUPPORT_URL%
 Il processo relativo al registro di sistema è stato terminato e ha chiuso
 tutti i file attivi.
 
+-- ec387f577b844b8fa948f33cad9a75e6
+Subject: Spazio disco utilizzato dal journal
+Defined-By: systemd
+Support: %SUPPORT_URL%
+
+@JOURNAL_NAME@ (@JOURNAL_PATH@) sta attualmente utilizzando @CURRENT_USE_PRETTY@.
+L'utilizzo massimo consentito è impostato a @MAX_USE_PRETTY@.
+Lasciando liberi almeno @DISK_KEEP_FREE_PRETTY@ (dell'attuale @DISK_AVAILABLE_PRETTY@ di spazio libero).
+Il limite di utilizzo forzato è quindi @LIMIT_PRETTY@, del quale @AVAILABLE_PRETTY@ sono ancora disponibili.
+
+I limiti di controllo dello spazio disco utilizzati dal Journal possono
+essere configurati con le impostazioni SystemMaxUse=, SystemKeepFree=, SystemMaxFileSize=,
+RuntimeMaxUse=, RuntimeKeepFree=, RuntimeMaxFileSize= nel file di configurazione
+/etc/systemd/journald.conf. Guardare journald.conf(5) per i dettagli.
+
 -- a596d6fe7bfa4994828e72309e95d61e
 Subject: I messaggi di un servizio sono stati soppressi
 Defined-By: systemd
@@ -54,7 +69,7 @@ Subject: I messaggi di un servizio sono stati perduti
 Defined-By: systemd
 Support: %SUPPORT_URL%
 
-I messaggi del kernel sono stati perduti perché, il registro di sistema
+I messaggi del kernel sono andati persi perché, il registro di sistema
 non è stato in grado di gestirli abbastanza velocemente.
 
 -- fc2e22bc6ee647b6b90729ab34a250b1
@@ -68,11 +83,22 @@ Il processo @COREDUMP_PID@ (@COREDUMP_COMM@) si è bloccato generando un dump.
 Questo di solito capita per un errore di programmazione nell'applicazione e
 dovrebbe essere segnalato al vendor come un bug.
 
+-- 5aadd8e954dc4b1a8c954d63fd9e1137
+Subject: Il Core file è stato troncato a @SIZE_LIMIT@ bytes.
+Defined-By: systemd
+Support: %SUPPORT_URL%
+Documentation: man:coredump.conf(5)
+
+Il processo più memoria mappata del limite massimo configurato da systemd-coredump(8) 
+per processare e memorizzare. Solo i primi @SIZE_LIMIT@ bytes sono stati salvati.
+Il file potrebbe essere ancora utile, ma strumenti come gdb(1) dovrebbero
+segnalare la troncatura.
+
 -- 8d45620c1a4348dbb17410da57c60c66
 Subject: La nuova sessione @SESSION_ID@ è stata creata per l'utente @USER_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Una nuova sessione con ID @SESSION_ID@ è stata creata per l'utente @USER_ID@.
 
@@ -82,7 +108,7 @@ Il processo primario della sessione è @LEADER@.
 Subject: La sessione @SESSION_ID@ è terminata
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 La sessione con ID @SESSION_ID@ è terminata.
 
@@ -90,7 +116,7 @@ La sessione con ID @SESSION_ID@ è terminata.
 Subject: La nuova postazione @SEAT_ID@ è ora disponibile
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 La nuova postazione @SEAT_ID@ è stata configurata ed è ora disponibile.
 
@@ -98,7 +124,7 @@ La nuova postazione @SEAT_ID@ è stata configurata ed è ora disponibile.
 Subject: La postazione @SEAT_ID@ è stata rimossa
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 La postazione @SEAT_ID@ è stata rimossa e non è più disponibile.
 
@@ -131,6 +157,17 @@ L'avvio del disco RAM ha richiesto @INITRD_USEC@ microsecondi.
 
 L'avvio dello userspace ha richiesto @USERSPACE_USEC@ microsecondi.
 
+-- eed00a68ffd84e31882105fd973abdd1
+Subject: User manager start-up is now complete
+Defined-By: systemd
+Support: %SUPPORT_URL%
+
+L'istanza di gestione per l'utente @_UID@ è stata avviata. Tutti i servizi
+interrogati sono stati avviati. Da notare che altri servizi potrebbero essere
+ancora in fase di avvio o in attesa di essere avviati.
+
+L'avvio dell'istanza ha impiegato @USERSPACE_USEC@ microsecondi.
+
 -- 6bbd95ee977941e497c48be27c254128
 Subject: Il sistema è entrato in fase di pausa @SLEEP@
 Defined-By: systemd
@@ -252,3 +289,42 @@ Defined-By: systemd
 Support: %SUPPORT_URL%
 
 La macchina virtuale @NAME@ con PID primario @LEADER@ è stata spenta.
+
+-- 36db2dfa5a9045e1bd4af5f93e1cf057
+Subject: La modalità DNSSEC è stata spenta, il server non la supporta
+Defined-By: systemd
+Support: %SUPPORT_URL%
+Documentation: man:systemd-resolved.service(8) resolved.conf(5)
+
+Il servizio di risoluzione (systemd-resolved.service) ha rilevato che il
+server DNS indicato non supporta DNSSEC e la validazione DNSSEC è stata
+conseguentemente disabilitata.
+
+Ciò avverrà se DNSSEC=allow-downgrade è configurato nel file
+resolved.conf e il server DNS indicato è incompatibile con DNSSEC. Da notare
+che in questo modo ci si espone ad attacchi DNSSEC downgrade, e un aggressore
+potrebbe disabilitare la validazione DNSSEC sul sistema inserendo risposte
+DNS nel canale di comunicazione.
+
+Questo evento potrebbe essere indice che il DNS server è forse incompatibile
+con DNSSEC o che un aggressore è riuscito nel suo intento malevolo.
+
+-- 1675d7f172174098b1108bf8c7dc8f5d
+Subject: La validazione DNSSEC è fallita
+Defined-By: systemd
+Support: %SUPPORT_URL%
+Documentation: man:systemd-resolved.service(8)
+
+Una query DNS o un dato hanno fatto fallire la validazione DNSSEC. Questo è
+usualmente un segnale che il canale di comunicazione utilizzato è stato
+manomesso.
+
+-- 4d4408cfd0d144859184d1e65d7c8a65
+Subject: Un trust anchor DNSSEC è stato revocato
+Defined-By: systemd
+Support: %SUPPORT_URL%
+Documentation: man:systemd-resolved.service(8)
+
+Un trust anchor DNSSEC è stato revocato. Un nuovo punto di fiducia è stato
+riconfigurato o il sistema operativo deve essere aggiornato per fornire un
+nuovo ancoraggio.
index 8a05325..4e8d700 100644 (file)
 # Korean translation
 
 # The catalog format is documented on
-# http://www.freedesktop.org/wiki/Software/systemd/catalog
+# https://www.freedesktop.org/wiki/Software/systemd/catalog
 
 # For an explanation why we do all this, see https://xkcd.com/1024/
 #
 # Translator :
 #     Seong-ho Cho <darkcircle.0426@gmail.com>, 2015.
+#     Dongsu Park <dpark@posteo.net>, 2016.
 
 -- f77379a8490b408bbe5f6940505a777b
 Subject: 저널 시작
@@ -42,6 +43,24 @@ Support: %SUPPORT_URL%
 시스템 저널 프로세스를 껐고 현재 활성화 중인 저널 파일을 모두
 닫았습니다.
 
+-- ec387f577b844b8fa948f33cad9a75e6
+Subject: 저널이 디스크 공간을 점유중
+Defined-By: systemd
+Support: %SUPPORT_URL%
+
+저널 @JOURNAL_NAME@ (@JOURNAL_PATH@)이 현재 @CURRENT_USE_PRETTY@
+만큼의 용량을 사용하고 있습니다. 최대 허용 용량은
+@MAX_USE_PRETTY@입니다. 최소한 @DISK_KEEP_FREE_PRETTY@의 빈공간을
+남겨둡니다. (현재 디스크 전체 용량은 @DISK_AVAILABLE_PRETTY@)
+따라서 실제 사용 최대 한도는 @LIMIT_PRETTY@으로 설정되며,
+@AVAILABLE_PRETTY@ 만큼의 용량이 계속 비어있습니다.
+
+저널이 차지하는 디스크 공간을 제어하기 위해서는
+/etc/systemd/journald.conf 의 SystemMaxUse=, SystemKeepFree=,
+SystemMaxFileSize=, RuntimeMaxUse=, RuntimeKeepFree=,
+RuntimeMaxFileSize= 변수를 설정합니다. 자세한 내용은
+journald.conf(5)을 살펴보십시오.
+
 -- a596d6fe7bfa4994828e72309e95d61e
 Subject: 서비스의 메시지를 거절함
 Defined-By: systemd
@@ -56,7 +75,7 @@ Documentation: man:journald.conf(5)
 
 메시지 거절 제어 제한 값은 /etc/systemd/journald.conf 의
 RateLimitIntervalSec= 변수와 RateLimitBurst= 변수로 설정합니다.
-자세한 내용은 ournald.conf(5)를 살펴보십시오.
+자세한 내용은 journald.conf(5)를 살펴보십시오.
 
 -- e9bf28e6e834481bb6f48f548ad13606
 Subject: 저널 메시지 놓침
@@ -82,7 +101,7 @@ Documentation: man:core(5)
 Subject: @USER_ID@ 사용자의 새 @SESSION_ID@ 세션 만듦
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 @USER_ID@ 사용자의 새 @SESSION_ID@ 세션을 만들었습니다.
 
@@ -92,7 +111,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: @SESSION_ID@ 세션 마침
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 @SESSION_ID@ 세션을 끝냈습니다.
 
@@ -100,7 +119,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: 새 @SEAT_ID@ 시트 사용할 수 있음
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 새 @SEAT_ID@ 시트를 설정했고 사용할 수 있습니다.
 
@@ -108,7 +127,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: @SEAT_ID@ 시트 제거함
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 @SEAT_ID@ 시트를 제거했으며 더이상 사용할 수 없습니다.
 
@@ -246,7 +265,7 @@ Support: %SUPPORT_URL%
  두번째 필드 또는 systemd 유닛 파일의 Where= 필드) 비어있지 않습니다.
 마운트 과정에 방해가 되진 않지만 이전에 이 디렉터리에 존재하는 파일에
  접근할 수 없게 됩니다. 중복으로 마운트한 파일을 보려면, 근본 파일
\8b\9cì\8a¤í\85\9cì\9d\98 ë\8b¤ì\9d\8c 위치에 직접 마운트하십시오.
\8b\9cì\8a¤í\85\9cì\9d\84 ë³\84ë\8f\84 위치에 직접 마운트하십시오.
 
 -- 24d8d4452573402496068381a6312df2
 Subject: 가상 머신 또는 컨테이너 시작
@@ -262,3 +281,41 @@ Defined-By: systemd
 Support: %SUPPORT_URL%
 
 @LEADER@ 프로세스 ID로 동작하는 @NAME@ 가상 머신을 껐습니다.
+
+-- 36db2dfa5a9045e1bd4af5f93e1cf057
+Subject: 서버 미지원으로 인하여 DNSSEC 모드 종료
+Defined-By: systemd
+Support: %SUPPORT_URL%
+Documentation: man:systemd-resolved.service(8) resolved.conf(5)
+
+해당 DNS 서버가 DNSSEC을 지원하지 않는다는 것을 리졸버 서비스
+(systemd-resolved.service)가 인식했습니다. 따라서 DNSSEC 검증 기능도
+꺼집니다.
+
+이 이벤트는 resolved.conf 파일에 DNSSEC=allow-downgrade가 설정되었고, 해당
+DNS 서버가 DNSSEC과 비호환일 경우에만 발생합니다. 이 모드를 켤 경우에는
+DNSSEC 다운그레이드 공격을 허용할수 있다는 점에 주의하세요. 이는 공격자
+역시 다운그레이드가 발생한 통신 채널에 DNS 응답 메시지를 끼워넣는 방식으로
+DNSSEC 검증 기능을 꺼버릴수 있기 때문입니다.
+
+이 이벤트가 의미하는 것은, DNS 서버가 실제로 DNSSEC과 비호환이거나, 또는
+공격자가 위와 같은 다운그레이드 공격을 수행하는데 성공했다는 뜻입니다.
+
+-- 1675d7f172174098b1108bf8c7dc8f5d
+Subject: DNSSEC 검증 실패
+Defined-By: systemd
+Support: %SUPPORT_URL%
+Documentation: man:systemd-resolved.service(8)
+
+DNS 요청 또는 리소스 레코드가 DNSSEC 검증에 실패했습니다. 이것은 보통
+해당 통신 채널이 조작되었다는 뜻입니다.
+
+-- 4d4408cfd0d144859184d1e65d7c8a65
+Subject: DNSSEC 신뢰성 시작점 취소
+Defined-By: systemd
+Support: %SUPPORT_URL%
+Documentation: man:systemd-resolved.service(8)
+
+DNSSEC 신뢰성 시작점이 취소되었습니다. 새로운 신뢰성 시작점이 설정되거나,
+또는 업데이트된 DNSSEC 신뢰성 시작점을 제공하기 위해서 운영체제를 업데이트
+해야 합니다.
index 33c2122..981fefb 100644 (file)
@@ -1,7 +1,7 @@
 #  This file is part of systemd.
 #
 #  Copyright 2012 Lennart Poettering
-#  Copyright 2014, 2015, 2016 Piotr Drąg
+#  Copyright 2014-2016 Piotr Drąg
 #
 #  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
@@ -20,7 +20,7 @@
 # Polish translation
 
 # The catalog format is documented on
-# http://www.freedesktop.org/wiki/Software/systemd/catalog
+# https://www.freedesktop.org/wiki/Software/systemd/catalog
 
 # For an explanation why we do all this, see https://xkcd.com/1024/
 
@@ -29,15 +29,15 @@ Subject: Uruchomiono dziennik
 Defined-By: systemd
 Support: %SUPPORT_URL%
 
-Systemowy proces dziennika został uruchomiony, otworzył pliki dziennika do
-zapisu i jest gotowy do przetwarzania żądań.
+Systemowy proces dziennika został uruchomiony, otworzył pliki dziennika
+do zapisu i jest gotowy do przetwarzania żądań.
 
 -- d93fb3c9c24d451a97cea615ce59c00b
 Subject: Zatrzymano dziennik
 Defined-By: systemd
 Support: %SUPPORT_URL%
 
-Systemowy proces dziennika został wyłączony i zamknął wszystkie obecnie
+Systemowy proces dziennika został wyłączony i zamknął wszystkie obecnie
 aktywne pliki dziennika.
 
 -- ec387f577b844b8fa948f33cad9a75e6
@@ -48,28 +48,28 @@ Support: %SUPPORT_URL%
 @JOURNAL_NAME@ (@JOURNAL_PATH@) obecnie używa @CURRENT_USE_PRETTY@.
 Maksymalnie może używać @MAX_USE_PRETTY@.
 Zostawianie co najmniej @DISK_KEEP_FREE_PRETTY@ wolnego (z obecnie dostępnego @DISK_AVAILABLE_PRETTY@ miejsca na dysku).
-Wymuszone ograniczenie użycia wynosi więc @LIMIT_PRETTY@, z czego @AVAILABLE_PRETTY@ jest nadal dostępne.
+Wymuszone ograniczenie użycia wynosi więc @LIMIT_PRETTY@, z czego @AVAILABLE_PRETTY@ jest nadal dostępne.
 
 Ograniczenia kontrolujące ilość miejsca na dysku używanego przez dziennik
 można konfigurować za pomocą ustawień SystemMaxUse=, SystemKeepFree=,
 SystemMaxFileSize=, RuntimeMaxUse=, RuntimeKeepFree=, RuntimeMaxFileSize=
-w pliku /etc/systemd/journald.conf. Strona journald.conf(5) zawiera więcej
+w pliku /etc/systemd/journald.conf. Strona journald.conf(5) zawiera więcej
 informacji.
 
 -- a596d6fe7bfa4994828e72309e95d61e
-Subject: Ograniczono komunikaty z usługi
+Subject: Ograniczono komunikaty z usługi
 Defined-By: systemd
 Support: %SUPPORT_URL%
 Documentation: man:journald.conf(5)
 
-Usługa zapisała za dużo komunikatów w określonym czasie. Komunikaty z usługi
-zostały pominięte.
+Usługa zapisała za dużo komunikatów w określonym czasie.
+Komunikaty z usługi zostały pominięte.
 
-Proszę zauważyć, że tylko komunikaty z danej usługi zostały pominięte. Nie ma
-to wpływu na komunikaty innych usług.
+Proszę zauważyć, że tylko komunikaty z danej usługi zostały pominięte.
+Nie ma to wpływu na komunikaty innych usług.
 
 Ograniczenia kontrolujące pomijanie komunikatów mogą być konfigurowane
-za pomocą opcji RateLimitIntervalSec= i RateLimitBurst= w pliku
+za pomocą opcji RateLimitIntervalSec= i RateLimitBurst= w pliku
 /etc/systemd/journald.conf. Strona journald.conf(5) zawiera więcej informacji.
 
 -- e9bf28e6e834481bb6f48f548ad13606
@@ -86,18 +86,29 @@ Defined-By: systemd
 Support: %SUPPORT_URL%
 Documentation: man:core(5)
 
-Proces @COREDUMP_PID@ (@COREDUMP_COMM@) uległ awarii i zrzucił plik core.
+Proces @COREDUMP_PID@ (@COREDUMP_COMM@) uległ awarii i zrzucił plik core.
 
-Zwykle wskazuje to na błąd programistyczny w danym programie i powinno zostać
+Zwykle wskazuje to na błąd programistyczny w danym programie i powinno zostać
 zgłoszone jego producentowi jako błąd.
 
+-- 5aadd8e954dc4b1a8c954d63fd9e1137
+Subject: Plik core został skrócony do @SIZE_LIMIT@ B.
+Defined-By: systemd
+Support: %SUPPORT_URL%
+Documentation: man:coredump.conf(5)
+
+Proces miał więcej zmapowanej pamięci niż maksimum dla przetwarzania i miejsca
+skonfigurowane przez systemd-coredump(8). Tylko pierwsze @SIZE_LIMIT@ B
+zostało zapisanych. Ten plik core może nadal być używalny, ale narzędzia typu
+gdb(1) będą ostrzegały o skróceniu pliku.
+
 -- 8d45620c1a4348dbb17410da57c60c66
 Subject: Utworzono nową sesję @SESSION_ID@ dla użytkownika @USER_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
-Nowa sesja o identyfikatorze @SESSION_ID@ została utworzona dla użytkownika
+Nowa sesja o identyfikatorze @SESSION_ID@ została utworzona dla użytkownika
 @USER_ID@.
 
 Proces prowadzący sesji: @LEADER@.
@@ -106,25 +117,25 @@ Proces prowadzący sesji: @LEADER@.
 Subject: Zakończono sesję @SESSION_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
-Sesja o identyfikatorze @SESSION_ID@ została zakończona.
+Sesja o identyfikatorze @SESSION_ID@ została zakończona.
 
 -- fcbefc5da23d428093f97c82a9290f7b
 Subject: Dostępne jest nowe stanowisko @SEAT_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
-Nowe stanowisko @SEAT_ID@ zostało skonfigurowane i jest teraz dostępne.
+Nowe stanowisko @SEAT_ID@ zostało skonfigurowane i jest teraz dostępne.
 
 -- e7852bfe46784ed0accde04bc864c2d5
 Subject: Usunięto stanowisko @SEAT_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
-Stanowisko @SEAT_ID@ zostało usunięte i nie jest już dostępne.
+Stanowisko @SEAT_ID@ zostało usunięte i nie jest już dostępne.
 
 -- c7a787079b354eaaa9e77b371893cd27
 Subject: Zmiana czasu
@@ -146,9 +157,9 @@ Defined-By: systemd
 Support: %SUPPORT_URL%
 
 Wszystkie usługi systemowe obowiązkowo zakolejkowane do włączenia podczas
-uruchamiania systemu zostały pomyślnie uruchomione. Proszę zauważyć, że nie
-oznacza to, że komputer jest bezczynny, jako że usługi mogą wciąż kończyć
-proces uruchamiania.
+uruchamiania systemu zostały uruchomione. Proszę zauważyć, że nie oznacza
+to, że komputer jest bezczynny, jako że usługi mogą wciąż kończyć proces
+uruchamiania.
 
 Uruchamianie jądra zajęło @KERNEL_USEC@ μs.
 
@@ -156,6 +167,18 @@ Uruchamianie początkowego dysku RAM zajęło @INITRD_USEC@ μs.
 
 Uruchamianie przestrzeni użytkownika zajęło @USERSPACE_USEC@ μs.
 
+-- eed00a68ffd84e31882105fd973abdd1
+Subject: Ukończono uruchamianie menedżera użytkownika
+Defined-By: systemd
+Support: %SUPPORT_URL%
+
+Wystąpienie menedżera dla użytkownika @_UID@ zostało uruchomione.
+Wszystkie usługi zakolejkowane do włączenia zostały uruchomione.
+Proszę zauważyć, że inne usługi mogą być nadal uruchamiane
+lub zostać uruchomione później.
+
+Uruchamianie menedżera zajęło @USERSPACE_USEC@ μs.
+
 -- 6bbd95ee977941e497c48be27c254128
 Subject: Przejście do stanu uśpienia @SLEEP@
 Defined-By: systemd
@@ -175,8 +198,8 @@ Subject: Zainicjowano wyłączenie systemu
 Defined-By: systemd
 Support: %SUPPORT_URL%
 
-Zainicjowano wyłączenie systemd. Wyłączenie zostało rozpoczęte i wszystkie
-usługi systemowe zostały zakończone, a wszystkie systemy plików odmontowane.
+Zainicjowano wyłączenie systemd. Wyłączenie zostało rozpoczęte i wszystkie
+usługi systemowe zostały zakończone, a wszystkie systemy plików odmontowane.
 
 -- 7d4958e842da4a758f6c1cdc7b36dcc5
 Subject: Rozpoczęto uruchamianie jednostki @UNIT@
@@ -238,7 +261,7 @@ Subject: Nie można wykonać procesu @EXECUTABLE@
 Defined-By: systemd
 Support: %SUPPORT_URL%
 
-Proces @EXECUTABLE@ nie mógł zostać wykonany i się nie powiódł.
+Proces @EXECUTABLE@ nie mógł zostać wykonany i się nie powiódł.
 
 Numer błędu zwrócony przez ten proces: @ERRNO@.
 
@@ -249,25 +272,25 @@ Support: %SUPPORT_URL%
 
 Jeden lub więcej komunikatów nie może zostać przekazanych do usługi syslog
 uruchomionej obok journald. Zwykle oznacza to, że implementacja syslog nie
-jest w stanie nadążyć za prędkością kolejki komunikatów.
+jest w stanie nadążyć za prędkością kolejki komunikatów.
 
 -- 1dee0369c7fc4736b7099b38ecb46ee7
 Subject: Punkt montowania nie jest pusty
 Defined-By: systemd
 Support: %SUPPORT_URL%
 
-Katalog @WHERE@ został podany jako punkt montowania (drugie pole w pliku
-/etc/fstab lub pole Where= w pliku jednostki systemd) i nie jest pusty. Nie
-wpływa to na montowanie, ale wcześniej istniejące pliki w tym katalogu stają
+Katalog @WHERE@ został podany jako punkt montowania (drugie pole w pliku
+/etc/fstab lub pole Where= w pliku jednostki systemd) i nie jest pusty. Nie
+wpływa to na montowanie, ale wcześniej istniejące pliki w tym katalogu stają
 się niedostępne. Aby zobaczyć te pliki, proszę ręcznie zamontować system
-plików w innym położeniu.
+plików w innym położeniu.
 
 -- 24d8d4452573402496068381a6312df2
 Subject: Uruchomiono maszynę wirtualną lub kontener
 Defined-By: systemd
 Support: %SUPPORT_URL%
 
-Maszyna wirtualna @NAME@ (PID prowadzący @LEADER@) została uruchomiona i jest
+Maszyna wirtualna @NAME@ (PID prowadzący @LEADER@) została uruchomiona i jest
 gotowa do użycia.
 
 -- 58432bd3bace477cb514b56381b8a758
@@ -284,15 +307,15 @@ Support: %SUPPORT_URL%
 Documentation: man:systemd-resolved.service(8) resolved.conf(5)
 
 Usługa resolver (systemd-resolved.service) wykryła, że skonfigurowany serwer
-DNS nie obsługuje DNSSEC, w wyniku czego walidacja DNSSEC została wyłączona.
+DNS nie obsługuje DNSSEC, w wyniku czego walidacja DNSSEC została wyłączona.
 
 To zdarzenie będzie miało miejsce, jeśli skonfigurowano DNSSEC=allow-downgrade
-w pliku resolved.conf, a skonfigurowany serwer DNS jest niezgodny z DNSSEC.
+w pliku resolved.conf, a skonfigurowany serwer DNS jest niezgodny z DNSSEC.
 Proszę zauważyć, że używanie tego trybu umożliwia ataki wyłączające DNSSEC,
 ponieważ atakujący będzie mógł wyłączyć walidację DNSSEC na komputerze przez
-umieszczenie odpowiednich odpowiedzi DNS w kanale komunikacji.
+umieszczenie odpowiednich odpowiedzi DNS w kanale komunikacji.
 
-To zdarzenie może wskazywać, że serwer DNS jest faktycznie niezgodny z DNSSEC,
+To zdarzenie może wskazywać, że serwer DNS jest faktycznie niezgodny z DNSSEC,
 albo że atakującemu udało się upozorować atak tego typu.
 
 -- 1675d7f172174098b1108bf8c7dc8f5d
index e461c2b..192fd33 100644 (file)
@@ -19,7 +19,7 @@
 # Catálogo de mensagens para as mensagens do próprio systemd
 
 # O formato do catálogo está documentado em
-# http://www.freedesktop.org/wiki/Software/systemd/catalog
+# https://www.freedesktop.org/wiki/Software/systemd/catalog
 
 # Para uma explicação do porquê de fazermos tudo isso, veja
 # https://xkcd.com/1024/
@@ -79,7 +79,7 @@ deveria ser relatado para seu fabricante como um erro.
 Subject: A nova sessão @SESSION_ID@ foi criada para usuário o @USER_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Uma nova sessão com o ID @SESSION_ID@ foi criada para o usuário @USER_ID@.
 
@@ -89,7 +89,7 @@ O processo originador da sessão é @LEADER@.
 Subject: Sessão @SESSION_ID@ foi terminada
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Um sessão com o ID @SESSION_ID@ foi terminada.
 
@@ -97,7 +97,7 @@ Um sessão com o ID @SESSION_ID@ foi terminada.
 Subject: Um novo seat @SEAT_ID@ está disponível
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Um novo seat @SEAT_ID@ foi configurado e está disponível.
 
@@ -105,7 +105,7 @@ Um novo seat @SEAT_ID@ foi configurado e está disponível.
 Subject: Seat @SEAT_ID@ foi removido agora
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Um seat @SEAT_ID@ foi removido e não está mais disponível.
 
index df55478..367ed89 100644 (file)
@@ -1,7 +1,7 @@
 #  This file is part of systemd.
 #
 #  Copyright 2012 Lennart Poettering
-#  Copyright 2013-2016 Sergey Ptashnick
+#  Copyright 2013-2017 Sergey Ptashnick
 #
 #  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
@@ -20,7 +20,7 @@
 # Russian translation
 
 # Формат каталога сообщений описан по ссылке
-# http://www.freedesktop.org/wiki/Software/systemd/catalog
+# https://www.freedesktop.org/wiki/Software/systemd/catalog
 
 # Перед каждым элементом в комментарии указан Subject исходного
 # сообщения (на английском).
@@ -102,12 +102,24 @@ Documentation: man:core(5)
 Вероятно, это произошло из-за ошибки, допущенной в коде программы.
 Рекомендуется сообщить её разработчикам о возникшей проблеме.
 
+# Subject: Core file was truncated to @SIZE_LIMIT@ bytes
+-- 5aadd8e954dc4b1a8c954d63fd9e1137
+Subject: Файл с дампом памяти был урезан до @SIZE_LIMIT@ байт
+Defined-By: systemd
+Support: %SUPPORT_URL%
+Documentation: man:coredump.conf(5)
+
+Объем памяти процесса превысил ограничения на размер дампа, установленные
+для systemd-coredump(8). Записаны только первые @SIZE_LIMIT@ байт. Не исключено,
+что этот дамп еще пригоден для анализа, хотя инструменты для анализа
+дампов (например, gdb(1)) могут выдать предупреждение, что файл был урезан.
+
 # Subject: A new session @SESSION_ID@ has been created for user @USER_ID@
 -- 8d45620c1a4348dbb17410da57c60c66
 Subject: Для пользователя @USER_ID@ создан новый сеанс @SESSION_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Для пользователя @USER_ID@ создан новый сеанс с идентификатором @SESSION_ID@.
 
@@ -118,7 +130,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: Сеанс @SESSION_ID@ завершен
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Сеанс с идентификатором @SESSION_ID@ завершился.
 
@@ -127,7 +139,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: Добавлено новое рабочее место @SEAT_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Новое рабочее место (seat) @SEAT_ID@ полностью настроено и готово к
 использованию.
@@ -137,7 +149,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: Рабочее место @SEAT_ID@ отключено
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Рабочее место (seat) @SEAT_ID@ было отключено.
 
@@ -175,6 +187,19 @@ Support: %SUPPORT_URL%
 
 Запуск системных служб занял @USERSPACE_USEC@ микросекунд.
 
+# Subject: User manager start-up is now complete
+-- eed00a68ffd84e31882105fd973abdd1
+Subject: Завершен запуск менеджера пользовательского сеанса
+Defined-By: systemd
+Support: %SUPPORT_URL%
+
+Менеджер пользовательского сеанса для пользователя с идентификатором @_UID@
+был запущен. Все службы, стоявшие в очереди на запуск, также были запущены. Тем 
+не менее, прочие службы могут все еще находиться в процессе запуска, либо могут
+быть запущены позднее.
+
+Запуск менеджера занял @USERSPACE_USEC@ микросекунд.
+
 # Subject: System sleep state @SLEEP@ entered
 -- 6bbd95ee977941e497c48be27c254128
 Subject: Система перешла в состояние сна (@SLEEP@)
index 06a0ff6..674eb55 100644 (file)
@@ -19,7 +19,7 @@
 # Serbian translation
 
 # Формат каталога је документован на
-# http://www.freedesktop.org/wiki/Software/systemd/catalog
+# https://www.freedesktop.org/wiki/Software/systemd/catalog
 
 # Да бисте видели зашто ово радимо, погледајте https://xkcd.com/1024/
 
@@ -78,7 +78,7 @@ Documentation: man:core(5)
 Subject: Нова сесија @SESSION_ID@ је направљена за корисника @USER_ID@
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Нова сесија са ИБ-ом @SESSION_ID@ је направљена за корисника @USER_ID@.
 
@@ -88,7 +88,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: Сесија @SESSION_ID@ је окончана
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Сесија са ИБ-ом @SESSION_ID@ је окончана.
 
@@ -96,7 +96,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: Ново седиште @SEAT_ID@ је сада доступно
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Ново седиште @SEAT_ID@ је исподешавано и сада је доступно.
 
@@ -104,7 +104,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: Седиште @SEAT_ID@ је сада уклоњено
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 Седиште @SEAT_ID@ је сада уклоњено и више није доступно.
 
index ba7c697..78a8a8c 100644 (file)
@@ -20,7 +20,7 @@
 # Simplified Chinese translation
 
 # 本 catalog 文档格式被记载在
-# http://www.freedesktop.org/wiki/Software/systemd/catalog
+# https://www.freedesktop.org/wiki/Software/systemd/catalog
 
 # 如需了解我们为什么做这些工作,请见 https://xkcd.com/1024/
 
@@ -76,7 +76,7 @@ Documentation: man:core(5)
 Subject: 一个新会话 @SESSION_ID@ 已为用户 @USER_ID@ 建立
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 一个 ID 为 @SESSION_ID@ 的新会话已为用户 @USER_ID@ 建立。
 
@@ -86,7 +86,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: 会话 @SESSION_ID@ 已终止
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 一个 ID 为 @SESSION_ID@ 的会话已终止。
 
@@ -94,7 +94,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: 一个新的座位 @SEAT_ID@ 可用
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 一个新的座位 @SEAT_ID@ 已被配置并已可用。
 
@@ -102,7 +102,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: 座位 @SEAT_ID@ 已被移除
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 座位 @SEAT_ID@ 已被移除并不再可用。
 
@@ -137,7 +137,7 @@ Support: %SUPPORT_URL%
 -- 6bbd95ee977941e497c48be27c254128
 Subject: 系统已进入 @SLEEP@ 睡眠状态
 Defined-By: systemd
-Support: http://lists.freedesktop.org/mailman/listinfo/systemd-deve
+Support: %SUPPORT_URL%
 
 系统现已进入 @SLEEP@ 睡眠状态。
 
index f7b42fa..d262b88 100644 (file)
@@ -20,7 +20,7 @@
 # Traditional Chinese translation
 
 # Catalog 的格式記錄於
-# http://www.freedesktop.org/wiki/Software/systemd/catalog
+# https://www.freedesktop.org/wiki/Software/systemd/catalog
 
 # For an explanation why we do all this, see https://xkcd.com/1024/
 
@@ -79,7 +79,7 @@ Documentation: man:core(5)
 Subject: 新的工作階段 @SESSION_ID@ 已為使用者 @USER_ID@ 建立
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 一個新的工作階段,ID @SESSION_ID@ 已為使用者 @USER_ID@ 建立。
 
@@ -89,7 +89,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: 工作階段 @SESSION_ID@ 已結束
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 一個工作階段,ID @SESSION_ID@ 已結束。
 
@@ -97,7 +97,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: 新的座位 @SEAT_ID@ 可用
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 一個新的座位 @SEAT_ID@ 已被設定且現在可用。
 
@@ -105,7 +105,7 @@ Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Subject: 座位 @SEAT_ID@ 已被移除
 Defined-By: systemd
 Support: %SUPPORT_URL%
-Documentation: http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation: https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 座位 @SEAT_ID@ 已被移除且不再可用。
 
diff --git a/coccinelle/free_and_replace.cocci b/coccinelle/free_and_replace.cocci
new file mode 100644 (file)
index 0000000..9dcdbf4
--- /dev/null
@@ -0,0 +1,15 @@
+@@
+expression p, q;
+@@
+- free(p);
+- p = q;
+- q = NULL;
+- return 0;
++ return free_and_replace(p, q);
+@@
+expression p, q;
+@@
+- free(p);
+- p = q;
+- q = NULL;
++ free_and_replace(p, q);
diff --git a/coccinelle/mfree_return.cocci b/coccinelle/mfree_return.cocci
new file mode 100644 (file)
index 0000000..8119fe0
--- /dev/null
@@ -0,0 +1,6 @@
+@@
+expression p;
+@@
+- free(p);
+- return NULL;
++ return mfree(p);
diff --git a/coccinelle/strjoin.cocci b/coccinelle/strjoin.cocci
new file mode 100644 (file)
index 0000000..675760e
--- /dev/null
@@ -0,0 +1,16 @@
+@@
+expression list args;
+@@
+- strjoin(args, NULL);
++ strjoin(args);
+@@
+expression t;
+expression list args;
+@@
+- t = strjoin(args, NULL);
++ t = strjoin(args);
+@@
+expression list args;
+@@
+- return strjoin(args, NULL);
++ return strjoin(args);
index 774a2fa..c3de8f7 100644 (file)
 AC_PREREQ([2.64])
 
 AC_INIT([systemd],
-        [231],
-        [http://github.com/systemd/systemd/issues],
+        [234],
+        [https://github.com/systemd/systemd/issues],
         [systemd],
-        [http://www.freedesktop.org/wiki/Software/systemd])
+        [https://www.freedesktop.org/wiki/Software/systemd])
 
 AC_CONFIG_SRCDIR([src/core/main.c])
 AC_CONFIG_MACRO_DIR([m4])
@@ -57,6 +57,7 @@ AS_IF([test "x$enable_largefile" = "xno"], [AC_MSG_ERROR([--disable-largefile is
 SET_ARCH(X86_64, x86_64*)
 SET_ARCH(IA32, i*86*)
 SET_ARCH(MIPS, mips*)
+SET_ARCH(ARM, arm*)
 SET_ARCH(AARCH64, aarch64*)
 
 # i18n stuff for the PolicyKit policy files, heck whether intltool can be found, disable NLS otherwise
@@ -97,8 +98,6 @@ AC_PATH_PROG([M4], [m4])
 AC_PATH_PROG([QUOTAON], [quotaon], [/usr/sbin/quotaon], [$PATH:/usr/sbin:/sbin])
 AC_PATH_PROG([QUOTACHECK], [quotacheck], [/usr/sbin/quotacheck], [$PATH:/usr/sbin:/sbin])
 
-AC_PATH_PROG([SETCAP], [setcap], [/usr/sbin/setcap], [$PATH:/usr/sbin:/sbin])
-
 AC_PATH_PROG([KILL], [kill], [/usr/bin/kill], [$PATH:/usr/sbin:/sbin])
 
 AC_PATH_PROG([KMOD], [kmod], [/usr/bin/kmod], [$PATH:/usr/sbin:/sbin])
@@ -157,7 +156,6 @@ CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\
         -Wall \
         -Wextra \
         -Wundef \
-        "-Wformat=2 -Wformat-security -Wformat-nonliteral" \
         -Wlogical-op \
         -Wmissing-include-dirs \
         -Wold-style-definition \
@@ -170,6 +168,8 @@ CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\
         -Werror=implicit-function-declaration \
         -Werror=missing-declarations \
         -Werror=return-type \
+        -Werror=incompatible-pointer-types \
+        -Werror=format=2 \
         -Wstrict-prototypes \
         -Wredundant-decls \
         -Wmissing-noreturn \
@@ -212,29 +212,28 @@ AS_CASE([$CC], [*clang*],
                -Wno-gnu-variable-sized-type-not-at-end \
         ])])
 
+AC_ARG_ENABLE([lto], [AS_HELP_STRING([--disable-lto], [disable -flto])],
+                     [], [enable_lto=yes])
 AS_CASE([$CFLAGS], [*-O[[12345sz\ ]]*],
-        [CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\
-               -flto])],
+        [AS_IF([test "x$enable_lto" = "xyes"],
+               [CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [-flto])],
+               [AC_MSG_RESULT([disabling -flto as requested])])],
         [AC_MSG_RESULT([skipping -flto, optimization not enabled])])
-AC_SUBST([OUR_CFLAGS], "$with_cflags $sanitizer_cflags")
 
 AS_CASE([$CFLAGS], [*-O[[12345sz\ ]]*],
         [CC_CHECK_FLAGS_APPEND([with_cppflags], [CPPFLAGS], [\
                -Wp,-D_FORTIFY_SOURCE=2])],
         [AC_MSG_RESULT([skipping -D_FORTIFY_SOURCE, optimization not enabled])])
-AC_SUBST([OUR_CPPFLAGS], "$with_cppflags $sanitizer_cppflags")
 
 AS_CASE([$CFLAGS], [*-O[[12345sz\ ]]*],
         [CC_CHECK_FLAGS_APPEND([with_ldflags], [LDFLAGS], [\
                -Wl,--gc-sections])],
         [AC_MSG_RESULT([skipping --gc-sections, optimization not enabled])])
-AC_SUBST([OUR_CFLAGS], "$with_ldflags $sanitizer_cflags")
 
 AS_CASE([$CFLAGS], [*-O[[12345sz\ ]]*],
         [CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\
                -ffunction-sections -fdata-sections])],
         [AC_MSG_RESULT([skipping -ffunction/data-section, optimization not enabled])])
-AC_SUBST([OUR_CFLAGS], "$with_cflags $sanitizer_cflags")
 
 CC_CHECK_FLAGS_APPEND([with_ldflags], [LDFLAGS], [\
         -Wl,--as-needed \
@@ -243,6 +242,9 @@ CC_CHECK_FLAGS_APPEND([with_ldflags], [LDFLAGS], [\
         -Wl,-z,now \
         -pie \
         -Wl,-fuse-ld=gold])
+
+AC_SUBST([OUR_CPPFLAGS], "$with_cppflags $sanitizer_cppflags")
+AC_SUBST([OUR_CFLAGS], "-D__SANE_USERSPACE_TYPES__ $with_cflags $sanitizer_cflags")
 AC_SUBST([OUR_LDFLAGS], "$with_ldflags $sanitizer_ldflags")
 
 AC_CHECK_SIZEOF(pid_t)
@@ -256,15 +258,37 @@ AC_CHECK_SIZEOF(rlim_t,,[
        #include <sys/resource.h>
 ])
 
+GPERF_TEST="$(echo foo,bar | ${GPERF} -L ANSI-C)"
+
+AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([
+                #include <string.h>
+                const char * in_word_set(const char *, size_t);
+                $GPERF_TEST]
+        )],
+        [GPERF_LEN_TYPE=size_t],
+        [AC_COMPILE_IFELSE(
+                [AC_LANG_PROGRAM([
+                        #include <string.h>
+                        const char * in_word_set(const char *, unsigned);
+                        $GPERF_TEST]
+                )],
+                [GPERF_LEN_TYPE=unsigned],
+                [AC_MSG_ERROR([** unable to determine gperf len type])]
+        )]
+)
+
+AC_DEFINE_UNQUOTED([GPERF_LEN_TYPE], [$GPERF_LEN_TYPE], [gperf len type])
+
 # ------------------------------------------------------------------------------
 # we use python to build the man page index
 have_python=no
 AC_ARG_WITH([python],
-        [AS_HELP_STRING([--without-python], [Disable building the man page index and systemd-python (default: test)])])
+        [AS_HELP_STRING([--without-python], [disable building the man page index and systemd-python (default: test)])])
 
 have_lxml=no
 AS_IF([test "x$with_python" != "xno"], [
-        AM_PATH_PYTHON(,, [:])
+        AM_PATH_PYTHON([3],, [:])
         AS_IF([test "x$PYTHON" != "x:"], [
                 AC_MSG_CHECKING([for python lxml module])
                 AS_IF(["$PYTHON" -c 'import lxml' 2>/dev/null], [have_lxml=yes])
@@ -286,6 +310,7 @@ AM_CONDITIONAL([HAVE_PYTHON], [test "x$have_python" = "xyes"])
 AC_CHECK_HEADERS([sys/capability.h], [], [AC_MSG_ERROR([*** POSIX caps headers not found])])
 AC_CHECK_HEADERS([linux/btrfs.h], [], [])
 AC_CHECK_HEADERS([linux/memfd.h], [], [])
+AC_CHECK_HEADERS([linux/vm_sockets.h], [], [], [#include <sys/socket.h>])
 
 # unconditionally pull-in librt with old glibc versions
 AC_SEARCH_LIBS([clock_gettime], [rt], [], [])
@@ -304,25 +329,34 @@ AC_CHECK_DECLS([
         pivot_root,
         name_to_handle_at,
         setns,
-        getrandom,
         renameat2,
         kcmp,
         keyctl,
         LO_FLAGS_PARTSCAN,
-        copy_file_range],
+        copy_file_range,
+        explicit_bzero],
         [], [], [[
 #include <sys/types.h>
 #include <unistd.h>
 #include <sys/mount.h>
 #include <fcntl.h>
 #include <sched.h>
+#include <string.h>
 #include <linux/loop.h>
+]])
+
+AC_CHECK_DECLS([getrandom],
+               [AC_DEFINE([USE_SYS_RANDOM_H], [], [sys/random.h is usable])],
+               [AC_CHECK_DECLS([getrandom], [], [], [[
+#include <sys/random.h>
+]])], [[
 #include <linux/random.h>
 ]])
 
-AC_CHECK_TYPES([char16_t, char32_t, key_serial_t],
+AC_CHECK_TYPES([char16_t, char32_t, key_serial_t, struct ethtool_link_settings],
                [], [], [[
 #include <uchar.h>
+#include <linux/ethtool.h>
 ]])
 
 AC_CHECK_DECLS([IFLA_INET6_ADDR_GEN_MODE,
@@ -334,7 +368,8 @@ AC_CHECK_DECLS([IFLA_INET6_ADDR_GEN_MODE,
                 IFLA_PHYS_PORT_ID,
                 IFLA_BOND_AD_INFO,
                 IFLA_VLAN_PROTOCOL,
-                IFLA_VXLAN_REMCSUM_NOPARTIAL,
+                IFLA_VXLAN_GPE,
+                IFLA_GENEVE_LABEL,
                 IFLA_IPTUN_ENCAP_DPORT,
                 IFLA_GRE_ENCAP_DPORT,
                 IFLA_BRIDGE_VLAN_INFO,
@@ -372,13 +407,27 @@ AS_IF([test "x$enable_dbus" != "xno"], [
 AM_CONDITIONAL(HAVE_DBUS, [test "$have_dbus" = "yes"])
 
 # ------------------------------------------------------------------------------
+have_glib=no
+AC_ARG_ENABLE(glib, AS_HELP_STRING([--disable-glib], [disable usage of glib,gobject,gio in tests]))
+AS_IF([test "x$enable_glib" != "xno"], [
+        PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.22.0 gobject-2.0 >= 2.22.0 gio-2.0],
+                [AC_DEFINE(HAVE_GLIB, 1, [Define if glib,gobject,gio are available]) have_glib=yes],
+                [have_glib=no])
+        AS_IF([test "x$have_glib" = "xno" -a "x$enable_glib" = "xyes"],
+                [AC_MSG_ERROR([*** glib support requested but libraries not found])])])
+
+# ------------------------------------------------------------------------------
 have_utmp=yes
 AC_ARG_ENABLE([utmp], AS_HELP_STRING([--disable-utmp], [disable utmp/wtmp log handling]),
         AS_CASE("x${enableval}",
                 [xyes], [have_utmp=yes],
                 [xno],  [have_utmp=no],
                 AC_MSG_ERROR(bad value ${enableval} for --enable-utmp)))
-AS_IF([test "x$have_utmp" = "xyes"], [AC_DEFINE(HAVE_UTMP, 1, [Define if utmp/wtmp support is enabled])])
+AS_IF([test "x$have_utmp" = "xyes"], [
+        AC_DEFINE(HAVE_UTMP, 1, [Define if utmp/wtmp support is enabled])
+        have_utmp=yes
+        M4_DEFINES="$M4_DEFINES -DHAVE_UTMP"],
+        [have_utmp=no])
 AM_CONDITIONAL([HAVE_UTMP], [test "x$have_utmp" = "xyes"])
 
 # ------------------------------------------------------------------------------
@@ -455,9 +504,9 @@ AM_CONDITIONAL(HAVE_LIBMOUNT, [test "$have_libmount" = "yes"])
 
 # ------------------------------------------------------------------------------
 have_seccomp=no
-AC_ARG_ENABLE(seccomp, AS_HELP_STRING([--disable-seccomp], [Disable optional SECCOMP support]))
+AC_ARG_ENABLE(seccomp, AS_HELP_STRING([--disable-seccomp], [disable optional SECCOMP support]))
 if test "x$enable_seccomp" != "xno"; then
-        PKG_CHECK_MODULES(SECCOMP, [libseccomp >= 1.0.0],
+        PKG_CHECK_MODULES(SECCOMP, [libseccomp >= 2.3.1],
                [AC_DEFINE(HAVE_SECCOMP, 1, [Define if seccomp is available])
                 have_seccomp=yes
                 M4_DEFINES="$M4_DEFINES -DHAVE_SECCOMP"],
@@ -470,7 +519,7 @@ AM_CONDITIONAL(HAVE_SECCOMP, [test "$have_seccomp" = "yes"])
 
 # ------------------------------------------------------------------------------
 have_ima=yes
-AC_ARG_ENABLE([ima], AS_HELP_STRING([--disable-ima],[Disable optional IMA support]),
+AC_ARG_ENABLE([ima], AS_HELP_STRING([--disable-ima], [disable optional IMA support]),
                 [case "${enableval}" in
                         yes) have_ima=yes ;;
                         no) have_ima=no ;;
@@ -484,7 +533,7 @@ fi
 
 # ------------------------------------------------------------------------------
 have_selinux=no
-AC_ARG_ENABLE(selinux, AS_HELP_STRING([--disable-selinux], [Disable optional SELINUX support]))
+AC_ARG_ENABLE(selinux, AS_HELP_STRING([--disable-selinux], [disable optional SELINUX support]))
 if test "x$enable_selinux" != "xno"; then
         PKG_CHECK_MODULES([SELINUX], [libselinux >= 2.1.9],
                 [AC_DEFINE(HAVE_SELINUX, 1, [Define if SELinux is available])
@@ -498,7 +547,7 @@ fi
 AM_CONDITIONAL(HAVE_SELINUX, [test "$have_selinux" = "yes"])
 
 have_apparmor=no
-AC_ARG_ENABLE(apparmor, AS_HELP_STRING([--disable-apparmor], [Disable optional AppArmor support]))
+AC_ARG_ENABLE(apparmor, AS_HELP_STRING([--disable-apparmor], [disable optional AppArmor support]))
 if test "x$enable_apparmor" != "xno"; then
         PKG_CHECK_MODULES([APPARMOR], [libapparmor],
                 [AC_DEFINE(HAVE_APPARMOR, 1, [Define if AppArmor is available])
@@ -530,15 +579,15 @@ AS_IF([test "x$enable_wheel_group" != "xno"], [
 
 AC_ARG_WITH(debug-shell,
         AS_HELP_STRING([--with-debug-shell=PATH],
-                [Path to debug shell binary]),
-        [SUSHELL="$withval"],[
-        AS_IF([test "x${have_selinux}" != "xno"], [SUSHELL="/sbin/sushell"] , [SUSHELL="/bin/sh"])])
+                [path to debug shell binary]),
+        [SUSHELL="$withval"],
+        [SUSHELL="/bin/sh"])
 
 AC_SUBST(SUSHELL)
 
 AC_ARG_WITH([debug-tty],
         AS_HELP_STRING([--with-debug-tty=PATH],
-                [Specify the tty device for debug shell]),
+                [specify the tty device for debug shell]),
         [DEBUGTTY="$withval"],
         [DEBUGTTY=/dev/tty9])
 
@@ -546,7 +595,7 @@ AC_SUBST(DEBUGTTY)
 
 AC_ARG_WITH([certificate-root],
         AS_HELP_STRING([--with-certificate-root=PATH],
-                [Specify the prefix for TLS certificates [/etc/ssl]]),
+                [specify the prefix for TLS certificates [/etc/ssl]]),
         [CERTIFICATEROOT="$withval"],
         [CERTIFICATEROOT="/etc/ssl"])
 
@@ -554,15 +603,59 @@ AC_SUBST(CERTIFICATEROOT)
 
 AC_ARG_WITH([support-url],
         AS_HELP_STRING([--with-support-url=URL],
-                [Specify the supoport URL to show in catalog entries included in systemd]),
+                [specify the support URL to show in catalog entries included in systemd]),
         [SUPPORT_URL="$withval"],
-        [SUPPORT_URL=http://lists.freedesktop.org/mailman/listinfo/systemd-devel])
+        [SUPPORT_URL=https://lists.freedesktop.org/mailman/listinfo/systemd-devel])
 
 AC_SUBST(SUPPORT_URL)
 
+AC_ARG_WITH([nobody-user],
+        AS_HELP_STRING([--with-nobody-user=NAME],
+                [specify the name of the nobody user (the one with UID 65534)]),
+        [NOBODY_USER_NAME="$withval"],
+        [NOBODY_USER_NAME=nobody])
+
+AC_SUBST(NOBODY_USER_NAME)
+AC_DEFINE_UNQUOTED(NOBODY_USER_NAME, ["$NOBODY_USER_NAME"], [The name of the nobody user (the one with UID 65534)])
+
+AC_ARG_WITH([nobody-group],
+        AS_HELP_STRING([--with-nobody-group=NAME],
+                [specify the name of the nobody group (the one with GID 65534)]),
+        [NOBODY_GROUP_NAME="$withval"],
+        [NOBODY_GROUP_NAME=nobody])
+
+AC_SUBST(NOBODY_GROUP_NAME)
+AC_DEFINE_UNQUOTED(NOBODY_GROUP_NAME, ["$NOBODY_GROUP_NAME"], [The name of the nobody group (the one with GID 65534)])
+
+AC_ARG_WITH([fallback-hostname],
+        AS_HELP_STRING([--with-fallback-hostname=NAME],
+                [specify the hostname used if none configured]),
+        [FALLBACK_HOSTNAME="$withval"],
+        [FALLBACK_HOSTNAME=localhost])
+
+AC_SUBST(FALLBACK_HOSTNAME)
+AC_DEFINE_UNQUOTED(FALLBACK_HOSTNAME, ["$FALLBACK_HOSTNAME"], [The hostname used if none configured])
+
+# ------------------------------------------------------------------------------
+
+AC_ARG_WITH(default-hierarchy,
+        AS_HELP_STRING([--with-default-hierarchy=MODE],
+                [default cgroup hierarchy, defaults to "hybrid"]),
+        [DEFAULT_HIERARCHY="$withval"],
+        [DEFAULT_HIERARCHY="hybrid"])
+
+AS_CASE("$DEFAULT_HIERARCHY",
+        [legacy], [mode=CGROUP_UNIFIED_NONE],
+        [hybrid], [mode=CGROUP_UNIFIED_SYSTEMD],
+        [unified], [mode=CGROUP_UNIFIED_ALL],
+        AC_MSG_ERROR(Bad default hierarchy mode ${DEFAULT_HIERARCHY}))
+AC_DEFINE_UNQUOTED(DEFAULT_HIERARCHY, [$mode], [Default cgroup hierarchy])
+AC_DEFINE_UNQUOTED(DEFAULT_HIERARCHY_NAME, ["$DEFAULT_HIERARCHY"],
+                                           [Default cgroup hierarchy as string])
+
 # ------------------------------------------------------------------------------
 have_xz=no
-AC_ARG_ENABLE(xz, AS_HELP_STRING([--disable-xz], [Disable optional XZ support]))
+AC_ARG_ENABLE(xz, AS_HELP_STRING([--disable-xz], [disable optional XZ support]))
 AS_IF([test "x$enable_xz" != "xno"], [
         PKG_CHECK_MODULES(XZ, [ liblzma ],
                 [AC_DEFINE(HAVE_XZ, 1, [Define if XZ is available])
@@ -575,7 +668,7 @@ AM_CONDITIONAL(HAVE_XZ, [test "$have_xz" = "yes"])
 
 # ------------------------------------------------------------------------------
 have_zlib=no
-AC_ARG_ENABLE(zlib, AS_HELP_STRING([--disable-zlib], [Disable optional ZLIB support]))
+AC_ARG_ENABLE(zlib, AS_HELP_STRING([--disable-zlib], [disable optional ZLIB support]))
 AS_IF([test "x$enable_zlib" != "xno"], [
         PKG_CHECK_MODULES(ZLIB, [ zlib ],
                 [AC_DEFINE(HAVE_ZLIB, 1, [Define if ZLIB is available])
@@ -588,7 +681,7 @@ AM_CONDITIONAL(HAVE_ZLIB, [test "$have_zlib" = "yes"])
 
 # ------------------------------------------------------------------------------
 have_bzip2=no
-AC_ARG_ENABLE(bzip2, AS_HELP_STRING([--enable-bzip2], [Enable optional BZIP2 support]))
+AC_ARG_ENABLE(bzip2, AS_HELP_STRING([--disable-bzip2], [disable optional BZIP2 support]))
 AS_IF([test "x$enable_bzip2" != "xno"], [
         AC_CHECK_HEADERS(bzlib.h,
                 [AC_DEFINE(HAVE_BZIP2, 1, [Define if BZIP2 is available])
@@ -601,12 +694,15 @@ AM_CONDITIONAL(HAVE_BZIP2, [test "$have_bzip2" = "yes"])
 
 # ------------------------------------------------------------------------------
 have_lz4=no
-AC_ARG_ENABLE(lz4, AS_HELP_STRING([--disable-lz4], [Disable optional LZ4 support]))
+AC_ARG_ENABLE(lz4, AS_HELP_STRING([--disable-lz4], [disable optional LZ4 support]))
 AS_IF([test "x$enable_lz4" != "xno"], [
-        PKG_CHECK_MODULES(LZ4, [ liblz4 >= 125 ],
-               [AC_DEFINE(HAVE_LZ4, 1, [Define in LZ4 is available])
+        PKG_CHECK_MODULES(LZ4, [ liblz4 < 10 ],
+               [AC_DEFINE(HAVE_LZ4, 1, [Define if LZ4 is available])
                 have_lz4=yes],
-                have_lz4=no)
+                [PKG_CHECK_MODULES(LZ4, [ liblz4 >= 125 ],
+                      [AC_DEFINE(HAVE_LZ4, 1, [Define if LZ4 is available])
+                      have_lz4=yes],
+                      have_lz4=no)])
         AS_IF([test "x$have_lz4" = xno -a "x$enable_lz4" = xyes],
               [AC_MSG_ERROR([*** LZ4 support requested but libraries not found])])
 ])
@@ -616,7 +712,7 @@ AM_CONDITIONAL(HAVE_COMPRESSION, [test "$have_xz" = "yes" -o "$have_lz4" = "yes"
 
 # ------------------------------------------------------------------------------
 AC_ARG_ENABLE([pam],
-        AS_HELP_STRING([--disable-pam],[Disable optional PAM support]),
+        AS_HELP_STRING([--disable-pam], [disable optional PAM support]),
                 [case "${enableval}" in
                         yes) have_pam=yes ;;
                         no) have_pam=no ;;
@@ -655,7 +751,7 @@ AM_CONDITIONAL([HAVE_PAM], [test "x$have_pam" != xno])
 
 # ------------------------------------------------------------------------------
 AC_ARG_ENABLE([acl],
-        AS_HELP_STRING([--disable-acl],[Disable optional ACL support]),
+        AS_HELP_STRING([--disable-acl], [disable optional ACL support]),
                 [case "${enableval}" in
                         yes) have_acl=yes ;;
                         no) have_acl=no ;;
@@ -693,7 +789,7 @@ AC_SUBST(ACL_LIBS)
 AM_CONDITIONAL([HAVE_ACL], [test "x$have_acl" != xno])
 
 # ------------------------------------------------------------------------------
-AC_ARG_ENABLE([smack], AS_HELP_STRING([--disable-smack],[Disable optional SMACK support]),
+AC_ARG_ENABLE([smack], AS_HELP_STRING([--disable-smack], [disable optional SMACK support]),
                 [case "${enableval}" in
                         yes) have_smack=yes ;;
                         no) have_smack=no ;;
@@ -728,7 +824,7 @@ AS_HELP_STRING([--with-smack-default-process-label=STRING],
 
 # ------------------------------------------------------------------------------
 AC_ARG_ENABLE([gcrypt],
-        AS_HELP_STRING([--disable-gcrypt],[Disable optional GCRYPT support]),
+        AS_HELP_STRING([--disable-gcrypt], [disable optional GCRYPT support]),
                 [case "${enableval}" in
                         yes) have_gcrypt=yes ;;
                         no) have_gcrypt=no ;;
@@ -780,7 +876,7 @@ AM_CONDITIONAL([HAVE_GCRYPT], [test "x$have_gcrypt" != xno])
 
 # ------------------------------------------------------------------------------
 AC_ARG_ENABLE([audit],
-        AS_HELP_STRING([--disable-audit],[Disable optional AUDIT support]),
+        AS_HELP_STRING([--disable-audit], [disable optional AUDIT support]),
                 [case "${enableval}" in
                         yes) have_audit=yes ;;
                         no) have_audit=no ;;
@@ -818,7 +914,7 @@ AM_CONDITIONAL([HAVE_AUDIT], [test "x$have_audit" != xno])
 
 # ------------------------------------------------------------------------------
 AC_ARG_ENABLE([elfutils],
-        AS_HELP_STRING([--disable-elfutils],[Disable optional ELFUTILS support]),
+        AS_HELP_STRING([--disable-elfutils], [disable optional ELFUTILS support]),
                 [case "${enableval}" in
                         yes) have_elfutils=yes ;;
                         no) have_elfutils=no ;;
@@ -925,7 +1021,7 @@ AM_CONDITIONAL(HAVE_REMOTE, [test "$have_microhttpd" = "yes" -o "$have_libcurl"
 
 # ------------------------------------------------------------------------------
 have_libidn=no
-AC_ARG_ENABLE(libidn, AS_HELP_STRING([--disable-libidn], [Disable optional LIBIDN support]))
+AC_ARG_ENABLE(libidn, AS_HELP_STRING([--disable-libidn], [disable optional LIBIDN support]))
 if test "x$enable_libidn" != "xno"; then
         PKG_CHECK_MODULES(LIBIDN, [libidn],
                [AC_DEFINE(HAVE_LIBIDN, 1, [Define if libidn is available])
@@ -938,9 +1034,43 @@ if test "x$enable_libidn" != "xno"; then
 fi
 AM_CONDITIONAL(HAVE_LIBIDN, [test "$have_libidn" = "yes"])
 
+have_libidn2=no
+AC_ARG_ENABLE(libidn2, AS_HELP_STRING([--disable-libidn2], [disable optional LIBIDN2 support]))
+if test "$have_libidn" != "yes"; then
+        if test "x$enable_libidn2" != "xno"; then
+                PKG_CHECK_MODULES(LIBIDN2, [libidn2 >= 2.0.0],
+                       [AC_DEFINE(HAVE_LIBIDN2, 1, [Define if libidn2 is available])
+                        have_libidn2=yes
+                        M4_DEFINES="$M4_DEFINES -DHAVE_LIBIDN2"],
+                       [have_libidn2=no])
+                if test "x$have_libidn2" = "xno" -a "x$enable_libidn2" = "xyes"; then
+                        AC_MSG_ERROR([*** libidn2 support requested but libraries not found])
+                fi
+        fi
+fi
+AM_CONDITIONAL(HAVE_LIBIDN2, [test "$have_libidn2" = "yes"])
+
+# ------------------------------------------------------------------------------
+have_idn=no
+AC_ARG_ENABLE(idn, AS_HELP_STRING([--disable-idn], [disable IDN when printing host names]))
+if test "x$enable_idn" != "xno"; then
+        have_idn=yes
+        AC_DEFINE(ENABLE_IDN, [1], [IDN is enabled])
+fi
+AM_CONDITIONAL(ENABLE_IDN, [test "$have_idn" = "yes"])
+
+# ------------------------------------------------------------------------------
+have_nss_systemd=no
+AC_ARG_ENABLE(nss-systemd, AS_HELP_STRING([--disable-nss-systemd], [disable nss-systemd support]))
+if test "x$enable_nss_systemd" != "xno"; then
+        have_nss_systemd=yes
+        AC_DEFINE(ENABLE_NSS_SYSTEMD, [1], [nss-systemd is enabled])
+fi
+AM_CONDITIONAL(ENABLE_NSS_SYSTEMD, [test "$have_nss_systemd" = "yes"])
+
 # ------------------------------------------------------------------------------
 have_libiptc=no
-AC_ARG_ENABLE(libiptc, AS_HELP_STRING([--disable-libiptc], [Disable optional LIBIPTC support]))
+AC_ARG_ENABLE(libiptc, AS_HELP_STRING([--disable-libiptc], [disable optional LIBIPTC support]))
 if test "x$enable_libiptc" != "xno"; then
         PKG_CHECK_MODULES(LIBIPTC, [libiptc],
                [AC_DEFINE(HAVE_LIBIPTC, 1, [Define if libiptc is available])
@@ -986,6 +1116,14 @@ fi
 AM_CONDITIONAL(ENABLE_TMPFILES, [test "$have_tmpfiles" = "yes"])
 
 # ------------------------------------------------------------------------------
+have_environment_d=no
+AC_ARG_ENABLE(environment-d, AS_HELP_STRING([--disable-environment-d], [disable environment.d support]))
+if test "x$enable_environment_d" != "xno"; then
+        have_environment_d=yes
+fi
+AM_CONDITIONAL(ENABLE_ENVIRONMENT_D, [test "$have_environment_d" = "yes"])
+
+# ------------------------------------------------------------------------------
 have_sysusers=no
 AC_ARG_ENABLE(sysusers, AS_HELP_STRING([--disable-sysusers], [disable sysusers support]))
 if test "x$enable_sysusers" != "xno"; then
@@ -993,6 +1131,11 @@ if test "x$enable_sysusers" != "xno"; then
 fi
 AM_CONDITIONAL(ENABLE_SYSUSERS, [test "$have_sysusers" = "yes"])
 
+AC_ARG_ENABLE(gshadow, AS_HELP_STRING([--disable-gshadow], [disable shadow group support]))
+AS_IF([test "x${enable_gshadow}" != "xno"], [
+        AC_DEFINE(ENABLE_GSHADOW, 1, [shadow group support is enabled])
+])
+
 # ------------------------------------------------------------------------------
 have_firstboot=no
 AC_ARG_ENABLE(firstboot, AS_HELP_STRING([--disable-firstboot], [disable firstboot support]))
@@ -1032,10 +1175,10 @@ if test "x$enable_logind" != "xno"; then
         have_logind=yes
 fi
 AM_CONDITIONAL(ENABLE_LOGIND, [test "$have_logind" = "yes"])
-AS_IF([test "$have_logind" = "yes"], [ AC_DEFINE(HAVE_LOGIND, [1], [Logind support available]) ])
+AS_IF([test "$have_logind" = "yes"], [ AC_DEFINE(ENABLE_LOGIND, [1], [Logind support available]) ])
 
 AC_ARG_WITH([kill-user-processes],
-        [AS_HELP_STRING([--without-kill-user-processes], [Set logind's KillUserProcesses=no by default])])
+        [AS_HELP_STRING([--without-kill-user-processes], [set logind's KillUserProcesses=no by default])])
 AS_IF([test "$with_kill_user_processes" != "no"],
        [kill_user_processes=true
         KILL_USER_PROCESSES=yes],
@@ -1089,19 +1232,16 @@ AM_CONDITIONAL(ENABLE_TIMESYNCD, [test "$have_timesyncd" = "yes"])
 
 AC_ARG_WITH(ntp-servers,
         AS_HELP_STRING([--with-ntp-servers=NTPSERVERS],
-                [Space-separated list of default NTP servers]),
+                [space-separated list of default NTP servers]),
         [NTP_SERVERS="$withval"],
-        [NTP_SERVERS="time1.google.com time2.google.com time3.google.com time4.google.com"
-        AC_MSG_WARN([*** Using Google NTP servers.
-                        Do not ship OSes or devices with these default settings.
-                        See DISTRO_PORTING for details!])])
+        [NTP_SERVERS="time1.google.com time2.google.com time3.google.com time4.google.com"])
 
 AC_DEFINE_UNQUOTED(NTP_SERVERS, ["$NTP_SERVERS"], [Default NTP Servers])
 AC_SUBST(NTP_SERVERS)
 
 AC_ARG_WITH(time-epoch,
         AS_HELP_STRING([--with-time-epoch=SECONDS],
-                [Time epoch for time clients]),
+                [time epoch for time clients]),
         [TIME_EPOCH="$withval"],
         [TIME_EPOCH="`stat -c %Y ${srcdir}/NEWS 2>/dev/null || echo 0`"])
 
@@ -1110,7 +1250,7 @@ AC_DEFINE_UNQUOTED(TIME_EPOCH, [$TIME_EPOCH], [Time Epoch])
 # ------------------------------------------------------------------------------
 AC_ARG_WITH(system-uid-max,
         AS_HELP_STRING([--with-system-uid-max=UID]
-                [Maximum UID for system users]),
+                [maximum UID for system users]),
         [SYSTEM_UID_MAX="$withval"],
         [SYSTEM_UID_MAX="`awk 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }' /etc/login.defs 2>/dev/null || echo 999`"])
 
@@ -1120,7 +1260,7 @@ AC_SUBST(SYSTEM_UID_MAX)
 # ------------------------------------------------------------------------------
 AC_ARG_WITH(system-gid-max,
         AS_HELP_STRING([--with-system-gid-max=GID]
-                [Maximum GID for system groups]),
+                [maximum GID for system groups]),
         [SYSTEM_GID_MAX="$withval"],
         [SYSTEM_GID_MAX="`awk 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }' /etc/login.defs 2>/dev/null || echo 999`"])
 
@@ -1128,6 +1268,16 @@ AC_DEFINE_UNQUOTED(SYSTEM_GID_MAX, [$SYSTEM_GID_MAX], [Maximum System GID])
 AC_SUBST(SYSTEM_GID_MAX)
 
 # ------------------------------------------------------------------------------
+
+AC_ARG_WITH(dev-kvm-mode,
+        AS_HELP_STRING([--with-dev-kvm-mode=MODE],
+                [/dev/kvm access mode, defaults to "0660"]),
+        [DEV_KVM_MODE="$withval"],
+        [DEV_KVM_MODE="0660"])
+
+AC_SUBST(DEV_KVM_MODE, [$DEV_KVM_MODE], [/dev/kvm access mode])
+
+# ------------------------------------------------------------------------------
 have_localed=no
 AC_ARG_ENABLE(localed, AS_HELP_STRING([--disable-localed], [disable locale daemon]))
 if test "x$enable_localed" != "xno"; then
@@ -1150,8 +1300,14 @@ AC_ARG_ENABLE(polkit, AS_HELP_STRING([--disable-polkit], [disable PolicyKit supp
 if test "x$enable_polkit" != "xno"; then
         AC_DEFINE(ENABLE_POLKIT, 1, [Define if PolicyKit support is to be enabled])
         have_polkit=yes
+
+        # also enable support for *.pkla files on old polkit
+        PKG_CHECK_MODULES(POLKIT, [ polkit-gobject-1 < 0.106 ],
+                           [polkit_pkla=yes],
+                           [polkit_pkla=no])
 fi
 AM_CONDITIONAL(ENABLE_POLKIT, [test "x$have_polkit" = "xyes"])
+AM_CONDITIONAL(ENABLE_POLKIT_PKLA, [test "x$polkit_pkla" = "xyes"])
 
 # ------------------------------------------------------------------------------
 have_resolved=no
@@ -1167,7 +1323,7 @@ AM_CONDITIONAL(ENABLE_RESOLVED, [test "$have_resolved" = "yes"])
 
 AC_ARG_WITH(dns-servers,
         AS_HELP_STRING([--with-dns-servers=DNSSERVERS],
-                [Space-separated list of default DNS servers]),
+                [space-separated list of default DNS servers]),
         [DNS_SERVERS="$withval"],
         [DNS_SERVERS="8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844"])
 
@@ -1176,10 +1332,15 @@ AC_SUBST(DNS_SERVERS)
 
 AC_ARG_WITH(default-dnssec,
         AS_HELP_STRING([--with-default-dnssec=MODE],
-               [Default DNSSEC mode, defaults to "allow-downgrade"]),
+               [default DNSSEC mode, defaults to "allow-downgrade"]),
         [DEFAULT_DNSSEC_MODE="$withval"],
         [DEFAULT_DNSSEC_MODE="allow-downgrade"])
 
+if test "x$have_gcrypt" = xno -a "x${DEFAULT_DNSSEC_MODE}" != xno ; then
+        AC_MSG_WARN(default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.)
+        DEFAULT_DNSSEC_MODE="no"
+fi
+
 AS_CASE("x${DEFAULT_DNSSEC_MODE}",
         [xno], [mode=DNSSEC_NO],
         [xyes], [mode=DNSSEC_YES],
@@ -1200,9 +1361,9 @@ AM_CONDITIONAL(ENABLE_NETWORKD, [test "x$have_networkd" = "xyes"])
 
 # ------------------------------------------------------------------------------
 have_efi=no
-AC_ARG_ENABLE(efi, AS_HELP_STRING([--disable-efi], [disable EFI support]))
+AC_ARG_ENABLE(efi, AS_HELP_STRING([--disable-efi], [disable systemd-boot and bootctl (EFI support)]))
 if test "x$enable_efi" != "xno"; then
-        AC_DEFINE(ENABLE_EFI, 1, [Define if EFI support is to be enabled])
+        AC_DEFINE(ENABLE_EFI, 1, [Define if systemd-boot and bootctl are to be enabled])
         have_efi=yes
 fi
 AM_CONDITIONAL(ENABLE_EFI, [test "x$have_efi" = "xyes"])
@@ -1219,6 +1380,9 @@ AM_COND_IF(ARCH_IA32, [
 AM_COND_IF(ARCH_X86_64, [
         EFI_MACHINE_TYPE_NAME=x64])
 
+AM_COND_IF(ARCH_ARM, [
+        EFI_MACHINE_TYPE_NAME=arm])
+
 AM_COND_IF(ARCH_AARCH64, [
         EFI_MACHINE_TYPE_NAME=aa64])
 
@@ -1226,9 +1390,15 @@ AC_SUBST([EFI_ARCH])
 AC_SUBST([EFI_MACHINE_TYPE_NAME])
 
 have_gnuefi=no
-AC_ARG_ENABLE(gnuefi, AS_HELP_STRING([--enable-gnuefi], [Enable optional gnuefi support]))
+AC_ARG_ENABLE(gnuefi, AS_HELP_STRING([--enable-gnuefi], [enable optional gnuefi support]))
 AS_IF([test "x$enable_gnuefi" != "xno"], [
-        AC_CHECK_HEADERS(efi/${EFI_ARCH}/efibind.h,
+        AC_ARG_WITH(efi-includedir,
+                AS_HELP_STRING([--with-efi-includedir=PATH], [path to EFI include directory]),
+                [EFI_INC_DIR="$withval"], [EFI_INC_DIR="/usr/include"]
+        )
+        AC_SUBST([EFI_INC_DIR])
+
+        AC_CHECK_HEADERS(${EFI_INC_DIR}/efi/${EFI_ARCH}/efibind.h,
                 [AC_DEFINE(HAVE_GNUEFI, 1, [Define if gnuefi is available])
                  have_gnuefi=yes],
                 [AS_IF([test "x$enable_gnuefi" = xyes],
@@ -1239,14 +1409,14 @@ AS_IF([test "x$enable_gnuefi" != "xno"], [
 
         EFI_LIB_DIR="$efiroot"
         AC_ARG_WITH(efi-libdir,
-                AS_HELP_STRING([--with-efi-libdir=PATH], [Path to EFI lib directory]),
+                AS_HELP_STRING([--with-efi-libdir=PATH], [path to EFI lib directory]),
                 [EFI_LIB_DIR="$withval"], [EFI_LIB_DIR="$efiroot"]
         )
         AC_SUBST([EFI_LIB_DIR])
 
         have_efi_lds=no
         AC_ARG_WITH(efi-ldsdir,
-                AS_HELP_STRING([--with-efi-ldsdir=PATH], [Path to EFI lds directory]),
+                AS_HELP_STRING([--with-efi-ldsdir=PATH], [path to EFI lds directory]),
                 [EFI_LDS_DIR="$withval" && AS_IF([test -f "${EFI_LDS_DIR}/elf_${EFI_ARCH}_efi.lds"],
                         [have_efi_lds=yes])],
                 [AS_FOR([DIR], [EFI_LDS_DIR], ["${EFI_LIB_DIR}/gnuefi" "${EFI_LIB_DIR}"],
@@ -1257,18 +1427,12 @@ AS_IF([test "x$enable_gnuefi" != "xno"], [
               [AS_IF([test "x$enable_gnuefi" = xyes],
                      [AC_MSG_ERROR([*** gnuefi support requested but files not found])],
                      [have_gnuefi=no])])
-
-        AC_ARG_WITH(efi-includedir,
-                AS_HELP_STRING([--with-efi-includedir=PATH], [Path to EFI include directory]),
-                [EFI_INC_DIR="$withval"], [EFI_INC_DIR="/usr/include"]
-        )
-        AC_SUBST([EFI_INC_DIR])
 ])
 AM_CONDITIONAL(HAVE_GNUEFI, [test "x$have_gnuefi" = xyes])
 
 # ------------------------------------------------------------------------------
 have_tpm=no
-AC_ARG_ENABLE([tpm], AS_HELP_STRING([--enable-tpm],[Enable optional TPM support]),
+AC_ARG_ENABLE([tpm], AS_HELP_STRING([--enable-tpm], [enable optional TPM support]),
                 [case "${enableval}" in
                         yes) have_tpm=yes ;;
                         no) have_tpm=no ;;
@@ -1291,13 +1455,13 @@ AC_DEFINE_UNQUOTED(SD_TPM_PCR, [$SD_TPM_PCR], [TPM PCR register number to use])
 # ------------------------------------------------------------------------------
 AC_ARG_WITH(rc-local-script-path-start,
         AS_HELP_STRING([--with-rc-local-script-path-start=PATH],
-                [Path to /etc/rc.local]),
+                [path to /etc/rc.local]),
         [RC_LOCAL_SCRIPT_PATH_START="$withval"],
         [RC_LOCAL_SCRIPT_PATH_START="/etc/rc.local"])
 
 AC_ARG_WITH(rc-local-script-path-stop,
         AS_HELP_STRING([--with-rc-local-script-path-stop=PATH],
-                [Path to /usr/sbin/halt.local]),
+                [path to /usr/sbin/halt.local]),
         [RC_LOCAL_SCRIPT_PATH_STOP="$withval"],
         [RC_LOCAL_SCRIPT_PATH_STOP="/usr/sbin/halt.local"])
 
@@ -1310,13 +1474,13 @@ AC_SUBST(RC_LOCAL_SCRIPT_PATH_STOP)
 # ------------------------------------------------------------------------------
 AC_ARG_WITH(kbd-loadkeys,
         AS_HELP_STRING([--with-kbd-loadkeys=PATH],
-                [Path to loadkeys]),
+                [path to loadkeys]),
         [KBD_LOADKEYS="$withval"],
         [KBD_LOADKEYS="/usr/bin/loadkeys"])
 
 AC_ARG_WITH(kbd-setfont,
         AS_HELP_STRING([--with-kbd-setfont=PATH],
-                [Path to setfont]),
+                [path to setfont]),
         [KBD_SETFONT="$withval"],
         [KBD_SETFONT="/usr/bin/setfont"])
 
@@ -1328,7 +1492,7 @@ AC_SUBST(KBD_SETFONT)
 
 AC_ARG_WITH(telinit,
         AS_HELP_STRING([--with-telinit=PATH],
-                [Path to telinit]),
+                [path to telinit]),
         [TELINIT="$withval"],
         [TELINIT="/lib/sysvinit/telinit"])
 
@@ -1358,7 +1522,7 @@ fi
 AM_CONDITIONAL(HAVE_MYHOSTNAME, [test "$have_myhostname" = "yes"])
 
 # ------------------------------------------------------------------------------
-AC_ARG_ENABLE(hwdb, [AC_HELP_STRING([--disable-hwdb], [disable hardware database support])],
+AC_ARG_ENABLE(hwdb, [AS_HELP_STRING([--disable-hwdb], [disable hardware database support])],
        enable_hwdb=$enableval, enable_hwdb=yes)
 AM_CONDITIONAL(ENABLE_HWDB, [test x$enable_hwdb = xyes])
 
@@ -1389,13 +1553,13 @@ fi
 
 # ------------------------------------------------------------------------------
 AC_ARG_ENABLE(hibernate,
-       [AC_HELP_STRING([--disable-hibernate], [disable hibernation support])],
+       [AS_HELP_STRING([--disable-hibernate], [disable hibernation support])],
        enable_hibernate=$enableval, enable_hibernate=yes)
 AM_CONDITIONAL(ENABLE_HIBERNATE, [test x$enable_hibernate = xyes])
 
 # ------------------------------------------------------------------------------
 AC_ARG_ENABLE(ldconfig,
-       [AC_HELP_STRING([--disable-ldconfig], [disable ldconfig])],
+       [AS_HELP_STRING([--disable-ldconfig], [disable ldconfig])],
        enable_ldconfig=$enableval, enable_ldconfig=yes)
 AM_CONDITIONAL(ENABLE_LDCONFIG, [test x$enable_ldconfig = xyes])
 
@@ -1406,13 +1570,13 @@ SYSTEM_SYSVRCND_PATH=/etc/rc.d
 
 AC_ARG_WITH([sysvinit-path],
         [AS_HELP_STRING([--with-sysvinit-path=PATH],
-                [Specify the path to where the SysV init scripts are located])],
+                [specify the path to where the SysV init scripts are located])],
         [SYSTEM_SYSVINIT_PATH="$withval"],
         [])
 
 AC_ARG_WITH([sysvrcnd-path],
         [AS_HELP_STRING([--with-sysvrcnd-path=PATH],
-                [Specify the path to the base directory for the SysV rcN.d directories])],
+                [specify the path to the base directory for the SysV rcN.d directories])],
         [SYSTEM_SYSVRCND_PATH="$withval"],
         [])
 
@@ -1434,7 +1598,7 @@ AM_CONDITIONAL(HAVE_SYSV_COMPAT, test "$SYSTEM_SYSV_COMPAT" = "yes")
 
 AC_ARG_WITH([tty-gid],
         [AS_HELP_STRING([--with-tty-gid=GID],
-                [Specify the numeric GID of the 'tty' group])],
+                [specify the numeric GID of the 'tty' group])],
         [TTY_GID="$withval"],
         [TTY_GID="5"])
 
@@ -1444,7 +1608,7 @@ AC_SUBST(TTY_GID)
 AC_ARG_WITH([dbuspolicydir],
         AS_HELP_STRING([--with-dbuspolicydir=DIR], [D-Bus policy directory]),
         [],
-        [with_dbuspolicydir=${sysconfdir}/dbus-1/system.d])
+        [with_dbuspolicydir=${datadir}/dbus-1/system.d])
 AX_NORMALIZE_PATH([with_dbuspolicydir])
 
 AC_ARG_WITH([dbussessionservicedir],
@@ -1460,7 +1624,7 @@ AC_ARG_WITH([dbussystemservicedir],
 AX_NORMALIZE_PATH([with_dbussystemservicedir])
 
 AC_ARG_WITH([bashcompletiondir],
-        AS_HELP_STRING([--with-bashcompletiondir=DIR], [Bash completions directory]),
+        AS_HELP_STRING([--with-bashcompletiondir=DIR], [bash completions directory]),
         [],
         [AS_IF([$($PKG_CONFIG --exists bash-completion)], [
                 with_bashcompletiondir=$($PKG_CONFIG --variable=completionsdir bash-completion)
@@ -1471,7 +1635,7 @@ AM_CONDITIONAL(ENABLE_BASH_COMPLETION, [test "$with_bashcompletiondir" != "no"])
 AX_NORMALIZE_PATH([with_bashcompletiondir])
 
 AC_ARG_WITH([zshcompletiondir],
-        AS_HELP_STRING([--with-zshcompletiondir=DIR], [Zsh completions directory]),
+        AS_HELP_STRING([--with-zshcompletiondir=DIR], [zsh completions directory]),
         [], [with_zshcompletiondir=${datadir}/zsh/site-functions])
 AM_CONDITIONAL(ENABLE_ZSH_COMPLETION, [test "$with_zshcompletiondir" != "no"])
 AX_NORMALIZE_PATH([with_zshcompletiondir])
@@ -1489,21 +1653,22 @@ fi
 AX_NORMALIZE_PATH([with_rootprefix])
 
 AC_ARG_WITH([rootlibdir],
-        AS_HELP_STRING([--with-rootlibdir=DIR], [Root directory for libraries necessary for boot]),
+        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]),
+        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]),
+        AS_HELP_STRING([--with-pamconfdir=DIR], [directory for PAM configuration (pass no to disable installing)]),
         [],
         [with_pamconfdir=${sysconfdir}/pam.d])
+AM_CONDITIONAL(ENABLE_PAM_CONFIG, [test "$with_pamconfdir" != "no"])
 AX_NORMALIZE_PATH([with_pamconfdir])
 
 AC_ARG_WITH([rpmmacrosdir],
@@ -1513,7 +1678,7 @@ AM_CONDITIONAL(ENABLE_RPM_MACROS, [test "$with_rpmmacrosdir" != "no"])
 AX_NORMALIZE_PATH([with_rpmmacrosdir])
 
 AC_ARG_ENABLE([split-usr],
-        AS_HELP_STRING([--enable-split-usr], [Assume that /bin, /sbin aren\'t symlinks into /usr]),
+        AS_HELP_STRING([--enable-split-usr], [assume that /bin, /sbin aren't symlinks into /usr]),
         [],
         [AS_IF([test "x${ac_default_prefix}" != "x${with_rootprefix}"], [
                 enable_split_usr=yes
@@ -1540,13 +1705,13 @@ AS_IF([test x"$cross_compiling" = "xyes"], [], [
 ])
 
 AC_ARG_ENABLE(tests,
-        [AC_HELP_STRING([--disable-tests], [disable tests, or enable extra tests with =unsafe])],
+        [AS_HELP_STRING([--disable-tests], [disable tests, or enable extra tests with =unsafe])],
         enable_tests=$enableval, enable_tests=yes)
 AM_CONDITIONAL(ENABLE_TESTS, [test x$enable_tests = xyes -o x$enable_tests = xunsafe])
 AM_CONDITIONAL(ENABLE_UNSAFE_TESTS, [test x$enable_tests = xunsafe])
 
 AC_ARG_ENABLE(debug,
-        [AC_HELP_STRING([--enable-debug@<:@=LIST@:>@], [enable extra debugging (hashmap,mmap-cache)])],
+        [AS_HELP_STRING([--enable-debug@<:@=LIST@:>@], [enable extra debugging (hashmap,mmap-cache)])],
         [if test "x$enableval" = "xyes"; then
                 enableval="hashmap,mmap-cache"
         fi
@@ -1593,7 +1758,7 @@ AC_CONFIG_FILES([
 
 AC_OUTPUT
 AC_MSG_RESULT([
-        $PACKAGE_NAME $VERSION
+        $PACKAGE_NAME $PACKAGE_VERSION
 
         libcryptsetup:                     ${have_libcryptsetup}
         PAM:                               ${have_pam}
@@ -1613,34 +1778,38 @@ AC_MSG_RESULT([
         MICROHTTPD:                        ${have_microhttpd}
         GNUTLS:                            ${have_gnutls}
         libcurl:                           ${have_libcurl}
+        libidn2:                           ${have_libidn2}
         libidn:                            ${have_libidn}
+        IDN:                               ${have_idn}
         libiptc:                           ${have_libiptc}
         ELFUTILS:                          ${have_elfutils}
         binfmt:                            ${have_binfmt}
         vconsole:                          ${have_vconsole}
         quotacheck:                        ${have_quotacheck}
         tmpfiles:                          ${have_tmpfiles}
+        environment.d:                     ${have_environment_d}
         sysusers:                          ${have_sysusers}
         firstboot:                         ${have_firstboot}
         randomseed:                        ${have_randomseed}
         backlight:                         ${have_backlight}
         rfkill:                            ${have_rfkill}
         logind:                            ${have_logind}
-        Default KillUserProcesses setting: ${KILL_USER_PROCESSES}
+        default cgroup hierarchy:          ${DEFAULT_HIERARCHY}
+        default KillUserProcesses setting: ${KILL_USER_PROCESSES}
         machined:                          ${have_machined}
         importd:                           ${have_importd}
         hostnamed:                         ${have_hostnamed}
         timedated:                         ${have_timedated}
         timesyncd:                         ${have_timesyncd}
-        Default NTP servers:               ${NTP_SERVERS}
+        default NTP servers:               ${NTP_SERVERS}
         time epoch:                        ${TIME_EPOCH}
         localed:                           ${have_localed}
         networkd:                          ${have_networkd}
         resolved:                          ${have_resolved}
-        Default DNS servers:               ${DNS_SERVERS}
-        Default DNSSEC mode:               ${DEFAULT_DNSSEC_MODE}
+        default DNS servers:               ${DNS_SERVERS}
+        default DNSSEC mode:               ${DEFAULT_DNSSEC_MODE}
         coredump:                          ${have_coredump}
-        polkit:                            ${have_polkit}
+        polkit:                            ${have_polkit} (legacy pkla support: ${polkit_pkla})
         efi:                               ${have_efi}
         gnuefi:                            ${have_gnuefi}
         efi arch:                          ${EFI_ARCH}
@@ -1654,10 +1823,11 @@ AC_MSG_RESULT([
         blkid:                             ${have_blkid}
         libmount:                          ${have_libmount}
         dbus:                              ${have_dbus}
+        glib:                              ${have_glib}
         nss-myhostname:                    ${have_myhostname}
+        nss-systemd:                       ${have_nss_systemd}
         hwdb:                              ${enable_hwdb}
         tpm:                               ${have_tpm}
-        kdbus:                             ${have_kdbus}
         Python:                            ${have_python}
         man pages:                         ${have_manpages}
         test coverage:                     ${have_coverage}
@@ -1678,25 +1848,29 @@ AC_MSG_RESULT([
         rootlib dir:                       ${with_rootlibdir}
         SysV init scripts:                 ${SYSTEM_SYSVINIT_PATH}
         SysV rc?.d directories:            ${SYSTEM_SYSVRCND_PATH}
-        Build Python:                      ${PYTHON}
+        build Python:                      ${PYTHON}
         PAM modules dir:                   ${with_pamlibdir}
         PAM configuration dir:             ${with_pamconfdir}
         RPM macros dir:                    ${with_rpmmacrosdir}
         D-Bus policy dir:                  ${with_dbuspolicydir}
         D-Bus session dir:                 ${with_dbussessionservicedir}
         D-Bus system dir:                  ${with_dbussystemservicedir}
-        Bash completions dir:              ${with_bashcompletiondir}
-        Zsh completions dir:               ${with_zshcompletiondir}
-        Extra start script:                ${RC_LOCAL_SCRIPT_PATH_START}
-        Extra stop script:                 ${RC_LOCAL_SCRIPT_PATH_STOP}
-        Adm group:                         ${have_adm_group}
-        Wheel group:                       ${have_wheel_group}
-        Debug shell:                       ${SUSHELL} @ ${DEBUGTTY}
+        bash completions dir:              ${with_bashcompletiondir}
+        zsh completions dir:               ${with_zshcompletiondir}
+        extra start script:                ${RC_LOCAL_SCRIPT_PATH_START}
+        extra stop script:                 ${RC_LOCAL_SCRIPT_PATH_STOP}
+        adm group:                         ${have_adm_group}
+        wheel group:                       ${have_wheel_group}
+        debug shell:                       ${SUSHELL} @ ${DEBUGTTY}
         TTY GID:                           ${TTY_GID}
-        Maximum System UID:                ${SYSTEM_UID_MAX}
-        Maximum System GID:                ${SYSTEM_GID_MAX}
-        Certificate root:                  ${CERTIFICATEROOT}
-        Support URL:                       ${SUPPORT_URL}
+        maximum system UID:                ${SYSTEM_UID_MAX}
+        maximum system GID:                ${SYSTEM_GID_MAX}
+        /dev/kvm access mode:              ${DEV_KVM_MODE}
+        certificate root:                  ${CERTIFICATEROOT}
+        support URL:                       ${SUPPORT_URL}
+        nobody user name:                  ${NOBODY_USER_NAME}
+        nobody group name:                 ${NOBODY_GROUP_NAME}
+        fallback hostname:                 ${FALLBACK_HOSTNAME}
 
         CFLAGS:   ${OUR_CFLAGS} ${CFLAGS}
         CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
index 996402d..de5d80d 100644 (file)
@@ -24,4 +24,4 @@ Further reading:
         man:systemctl(1)
         man:systemd(1)
         http://0pointer.de/blog/projects/systemd-for-admins-3.html
-        http://www.freedesktop.org/wiki/Software/systemd/Incompatibilities
+        https://www.freedesktop.org/wiki/Software/systemd/Incompatibilities
diff --git a/docs/sysvinit/meson.build b/docs/sysvinit/meson.build
new file mode 100644 (file)
index 0000000..79d1bab
--- /dev/null
@@ -0,0 +1,9 @@
+file = configure_file(
+        input : 'README.in',
+        output : 'README',
+        configuration : substs)
+
+if conf.get('HAVE_SYSV_COMPAT', false)
+        install_data(file,
+                     install_dir : sysvinit_path)
+endif
diff --git a/docs/var-log/meson.build b/docs/var-log/meson.build
new file mode 100644 (file)
index 0000000..d8364e3
--- /dev/null
@@ -0,0 +1,9 @@
+file = configure_file(
+        input : 'README.in',
+        output : 'README',
+        configuration : substs)
+
+if conf.get('HAVE_SYSV_COMPAT', false)
+        install_data(file,
+                     install_dir : varlogdir)
+endif
index dd63627..5c1bb7f 100644 (file)
@@ -101,9 +101,6 @@ OUI:70B3D55B1*
 OUI:70B3D5EAE*
  ID_OUI_FROM_DATABASE=Orlaco Products B.V.
 
-OUI:70B3D5066*
- ID_OUI_FROM_DATABASE=North Pole Engineering, Inc.
-
 OUI:70B3D557D*
  ID_OUI_FROM_DATABASE=WICOM1 GmbH
 
@@ -356,9 +353,6 @@ OUI:70B3D5660*
 OUI:70B3D5EFE*
  ID_OUI_FROM_DATABASE=MEIDEN SYSTEM SOLUTIONS
 
-OUI:70B3D5C60*
- ID_OUI_FROM_DATABASE=Aircell Inc
-
 OUI:70B3D5C03*
  ID_OUI_FROM_DATABASE=XAVi Technologies Corp.
 
@@ -836,9 +830,6 @@ OUI:70B3D53A9*
 OUI:001BC5087*
  ID_OUI_FROM_DATABASE=Onnet Technologies and Innovations LLC
 
-OUI:70B3D5720*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:70B3D56BF*
  ID_OUI_FROM_DATABASE=Otto Bihler Maschinenfabrik GmbH & Co. KG
 
@@ -911,9 +902,6 @@ OUI:70B3D5ABA*
 OUI:70B3D565A*
  ID_OUI_FROM_DATABASE=Aplex Technology Inc.
 
-OUI:70B3D5FFE*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:70B3D5721*
  ID_OUI_FROM_DATABASE=Zoe Medical
 
@@ -998,6 +986,369 @@ OUI:70B3D51C8*
 OUI:70B3D5142*
  ID_OUI_FROM_DATABASE=DAVE SRL
 
+OUI:70B3D5666*
+ ID_OUI_FROM_DATABASE=Aplex Technology Inc.
+
+OUI:70B3D56A8*
+ ID_OUI_FROM_DATABASE=Vitsch Electronics
+
+OUI:70B3D5EBD*
+ ID_OUI_FROM_DATABASE=midBit Technologies, LLC
+
+OUI:70B3D5A8E*
+ ID_OUI_FROM_DATABASE=OMESH CITY GROUP
+
+OUI:70B3D5779*
+ ID_OUI_FROM_DATABASE=DR.BRIDGE AQUATECH
+
+OUI:70B3D5F5C*
+ ID_OUI_FROM_DATABASE=Nable Communications, Inc.
+
+OUI:70B3D5550*
+ ID_OUI_FROM_DATABASE=Merten GmbH&CoKG
+
+OUI:70B3D51BB*
+ ID_OUI_FROM_DATABASE=EFENTO T P SZYDŁOWSKI K ZARĘBA SPÓŁKA JAWNA
+
+OUI:70B3D5498*
+ ID_OUI_FROM_DATABASE=XGEM SAS
+
+OUI:70B3D5AAA*
+ ID_OUI_FROM_DATABASE=Xemex NV
+
+OUI:70B3D5197*
+ ID_OUI_FROM_DATABASE=Lattech Systems Pty Ltd
+
+OUI:70B3D5593*
+ ID_OUI_FROM_DATABASE=Asis Pro
+
+OUI:70B3D522F*
+ ID_OUI_FROM_DATABASE=Instec, Inc.
+
+OUI:70B3D5DD8*
+ ID_OUI_FROM_DATABASE=EMSCAN Corp.
+
+OUI:70B3D5ACD*
+ ID_OUI_FROM_DATABASE=CRDE
+
+OUI:70B3D5BCC*
+ ID_OUI_FROM_DATABASE=MB connect line GmbH Fernwartungssysteme
+
+OUI:70B3D55D6*
+ ID_OUI_FROM_DATABASE=BMT Messtechnik Gmbh
+
+OUI:70B3D53BE*
+ ID_OUI_FROM_DATABASE=MyDefence Communication ApS
+
+OUI:70B3D5289*
+ ID_OUI_FROM_DATABASE=Shenzhen Rongda Computer Co.,Ltd
+
+OUI:70B3D5C3E*
+ ID_OUI_FROM_DATABASE=DOSADORES ALLTRONIC
+
+OUI:70B3D59FB*
+ ID_OUI_FROM_DATABASE=Unicom Global, Inc.
+
+OUI:70B3D524D*
+ ID_OUI_FROM_DATABASE=INFO CREATIVE (HK) LTD
+
+OUI:70B3D5A36*
+ ID_OUI_FROM_DATABASE=Beijing DamingWuzhou Science&Technology Co., Ltd.
+
+OUI:70B3D59F8*
+ ID_OUI_FROM_DATABASE=Asymmetric Technologies
+
+OUI:70B3D5A85*
+ ID_OUI_FROM_DATABASE=exceet electronics GesmbH
+
+OUI:70B3D5AC5*
+ ID_OUI_FROM_DATABASE=ATOM GIKEN Co.,Ltd.
+
+OUI:70B3D5F07*
+ ID_OUI_FROM_DATABASE=DUVAL MESSIEN
+
+OUI:70B3D5939*
+ ID_OUI_FROM_DATABASE=Invertek Drives Ltd
+
+OUI:70B3D56D0*
+ ID_OUI_FROM_DATABASE=Code Blue Corporation
+
+OUI:70B3D52C3*
+ ID_OUI_FROM_DATABASE=Proterra
+
+OUI:70B3D5816*
+ ID_OUI_FROM_DATABASE=Smith Meter, Inc.
+
+OUI:70B3D5693*
+ ID_OUI_FROM_DATABASE=Altron, a.s.
+
+OUI:70B3D55D3*
+ ID_OUI_FROM_DATABASE=Supracon AG
+
+OUI:70B3D52AD*
+ ID_OUI_FROM_DATABASE=Opgal Optronic Industries
+
+OUI:70B3D58EC*
+ ID_OUI_FROM_DATABASE=Rudy Tellert
+
+OUI:70B3D5CF5*
+ ID_OUI_FROM_DATABASE=Petring Energietechnik GmbH
+
+OUI:70B3D5269*
+ ID_OUI_FROM_DATABASE=Gilbarco Veeder-Root  ‎
+
+OUI:70B3D5FF7*
+ ID_OUI_FROM_DATABASE=Cybercom AB
+
+OUI:70B3D5DCC*
+ ID_OUI_FROM_DATABASE=Eutron SPA
+
+OUI:70B3D515C*
+ ID_OUI_FROM_DATABASE=Woods Hole Oceanographic Institution
+
+OUI:70B3D5173*
+ ID_OUI_FROM_DATABASE=National TeleConsultants LLC
+
+OUI:70B3D5CAE*
+ ID_OUI_FROM_DATABASE=THEMA
+
+OUI:70B3D55BC*
+ ID_OUI_FROM_DATABASE=LAMTEC Meß- und Regeltechnik für Feuerungen GmbH & Co. KG
+
+OUI:70B3D51B8*
+ ID_OUI_FROM_DATABASE=OES Inc.
+
+OUI:70B3D585A*
+ ID_OUI_FROM_DATABASE=BRUSHIES
+
+OUI:70B3D5FAF*
+ ID_OUI_FROM_DATABASE=Radig Hard & Software
+
+OUI:70B3D50BC*
+ ID_OUI_FROM_DATABASE=Practical Software Studio LLC
+
+OUI:70B3D57A2*
+ ID_OUI_FROM_DATABASE=Alpha ESS Co., Ltd.
+
+OUI:70B3D5724*
+ ID_OUI_FROM_DATABASE=Quan International Co., Ltd.
+
+OUI:70B3D553B*
+ ID_OUI_FROM_DATABASE=Mr.Loop
+
+OUI:70B3D5EBE*
+ ID_OUI_FROM_DATABASE=Sierra Pacific Innovations Corp
+
+OUI:70B3D5103*
+ ID_OUI_FROM_DATABASE=HANYOUNG NUX CO.,LTD
+
+OUI:70B3D504A*
+ ID_OUI_FROM_DATABASE=Gecko Robotics Inc
+
+OUI:70B3D5040*
+ ID_OUI_FROM_DATABASE=Savari Inc
+
+OUI:70B3D592A*
+ ID_OUI_FROM_DATABASE=Miravue
+
+OUI:70B3D5063*
+ ID_OUI_FROM_DATABASE=PoolDigital GmbH & Co. KG
+
+OUI:70B3D5209*
+ ID_OUI_FROM_DATABASE=SmartNodes
+
+OUI:70B3D514C*
+ ID_OUI_FROM_DATABASE=CRDE
+
+OUI:70B3D5F9E*
+ ID_OUI_FROM_DATABASE=International Center for Elementary Particle Physics, The University of Tokyo
+
+OUI:70B3D59C6*
+ ID_OUI_FROM_DATABASE=Overspeed SARL
+
+OUI:70B3D507A*
+ ID_OUI_FROM_DATABASE=ZAO ZEO
+
+OUI:70B3D506B*
+ ID_OUI_FROM_DATABASE=U-Tech
+
+OUI:70B3D5F77*
+ ID_OUI_FROM_DATABASE=Satcube AB
+
+OUI:70B3D57A1*
+ ID_OUI_FROM_DATABASE=Excelfore Corporation
+
+OUI:70B3D590D*
+ ID_OUI_FROM_DATABASE=Modtronix Engineering
+
+OUI:70B3D5C60*
+ ID_OUI_FROM_DATABASE=Gogo BA
+
+OUI:70B3D5A73*
+ ID_OUI_FROM_DATABASE=MobiPromo
+
+OUI:70B3D5585*
+ ID_OUI_FROM_DATABASE=Nefteavtomatika
+
+OUI:70B3D5495*
+ ID_OUI_FROM_DATABASE=Fiem Industries Ltd.
+
+OUI:70B3D5AD2*
+ ID_OUI_FROM_DATABASE=Wart-Elektronik
+
+OUI:70B3D52B4*
+ ID_OUI_FROM_DATABASE=Foerster-Technik GmbH
+
+OUI:70B3D5276*
+ ID_OUI_FROM_DATABASE=TELL Software Hungaria Kft.
+
+OUI:70B3D528C*
+ ID_OUI_FROM_DATABASE=Step Technica Co., Ltd.
+
+OUI:70B3D57E0*
+ ID_OUI_FROM_DATABASE=Sanko-sha,inc.
+
+OUI:70B3D5E50*
+ ID_OUI_FROM_DATABASE=Advanced Vision Technology Ltd
+
+OUI:70B3D58C1*
+ ID_OUI_FROM_DATABASE=Rievtech Electronic Co.,Ltd
+
+OUI:70B3D5F0C*
+ ID_OUI_FROM_DATABASE=ModulaTeam GmbH
+
+OUI:70B3D58AC*
+ ID_OUI_FROM_DATABASE=​ASUNG TECHNO CO.,Ltd
+
+OUI:70B3D5CE1*
+ ID_OUI_FROM_DATABASE=EA Elektroautomatik GmbH & Co. KG
+
+OUI:70B3D5677*
+ ID_OUI_FROM_DATABASE=Fraunhofer-Institut IIS
+
+OUI:70B3D538B*
+ ID_OUI_FROM_DATABASE=Lookman Electroplast Industries Ltd
+
+OUI:70B3D59DC*
+ ID_OUI_FROM_DATABASE=Shanghai Daorech Industry Developmnet Co.,Ltd
+
+OUI:70B3D5888*
+ ID_OUI_FROM_DATABASE=Zetechtics Ltd
+
+OUI:70B3D5168*
+ ID_OUI_FROM_DATABASE=Biwave Technologies, Inc.
+
+OUI:70B3D5F25*
+ ID_OUI_FROM_DATABASE=JSC “Scientific Industrial Enterprise Rubin
+
+OUI:70B3D5A48*
+ ID_OUI_FROM_DATABASE=Applied Satellite Engineering
+
+OUI:70B3D546C*
+ ID_OUI_FROM_DATABASE=SHANGHAI CHENZHU INSTRUMENT CO., LTD.
+
+OUI:70B3D580B*
+ ID_OUI_FROM_DATABASE=Fischer Block, Inc.
+
+OUI:70B3D5FAD*
+ ID_OUI_FROM_DATABASE=ARC Technology Solutions, LLC
+
+OUI:70B3D5AB8*
+ ID_OUI_FROM_DATABASE=HORIBA ABX SAS
+
+OUI:70B3D5E6C*
+ ID_OUI_FROM_DATABASE=Fusar Technologies inc
+
+OUI:70B3D52B0*
+ ID_OUI_FROM_DATABASE=Beijing Zhongyi Yue Tai Technology Co., Ltd
+
+OUI:70B3D52E2*
+ ID_OUI_FROM_DATABASE=Spark Lasers
+
+OUI:70B3D5446*
+ ID_OUI_FROM_DATABASE=Santa Barbara Imaging Systems
+
+OUI:70B3D556B*
+ ID_OUI_FROM_DATABASE=S.E.I. CO.,LTD.
+
+OUI:70B3D5B48*
+ ID_OUI_FROM_DATABASE=DWQ Informatikai Tanacsado es Vezerlestechnikai KFT
+
+OUI:70B3D5A7E*
+ ID_OUI_FROM_DATABASE=QUICCO SOUND Corporation
+
+OUI:70B3D5878*
+ ID_OUI_FROM_DATABASE=Package Guard, Inc
+
+OUI:70B3D5245*
+ ID_OUI_FROM_DATABASE=Newtec A/S
+
+OUI:70B3D5FFE*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:70B3D53FE*
+ ID_OUI_FROM_DATABASE=Mentor Graphics
+
+OUI:70B3D574D*
+ ID_OUI_FROM_DATABASE=SPEECH TECHNOLOGY CENTER LIMITED
+
+OUI:70B3D55BF*
+ ID_OUI_FROM_DATABASE=Aton srl
+
+OUI:70B3D5EEA*
+ ID_OUI_FROM_DATABASE=Dameca a/s
+
+OUI:70B3D59B8*
+ ID_OUI_FROM_DATABASE=Loma Systems
+
+OUI:70B3D5BEA*
+ ID_OUI_FROM_DATABASE=Virtuosys Ltd
+
+OUI:70B3D5066*
+ ID_OUI_FROM_DATABASE=North Pole Engineering, Inc.
+
+OUI:70B3D52A1*
+ ID_OUI_FROM_DATABASE=Blink Services AB
+
+OUI:70B3D5591*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:70B3D5133*
+ ID_OUI_FROM_DATABASE=Vidisys GmbH
+
+OUI:70B3D5720*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:70B3D51E6*
+ ID_OUI_FROM_DATABASE=Sanmina Israel
+
+OUI:70B3D5809*
+ ID_OUI_FROM_DATABASE=Tecnint HTE SRL
+
+OUI:70B3D52AB*
+ ID_OUI_FROM_DATABASE=NASA Johnson Space Center
+
+OUI:70B3D5254*
+ ID_OUI_FROM_DATABASE=Spectrum Brands
+
+OUI:70B3D57C9*
+ ID_OUI_FROM_DATABASE=Council Rock
+
+OUI:70B3D553A*
+ ID_OUI_FROM_DATABASE=Pano0ramic Power
+
+OUI:70B3D5E18*
+ ID_OUI_FROM_DATABASE=Plasmapp Co.,Ltd.
+
+OUI:70B3D5D44*
+ ID_OUI_FROM_DATABASE=ic-automation GmbH
+
+OUI:70B3D59D7*
+ ID_OUI_FROM_DATABASE=KM OptoElektronik GmbH
+
+OUI:70B3D561B*
+ ID_OUI_FROM_DATABASE=Nubewell Networks Pvt Ltd
+
 OUI:70B3D5D60*
  ID_OUI_FROM_DATABASE=Flintab AB
 
@@ -1040,9 +1391,6 @@ OUI:70B3D5AE0*
 OUI:70B3D52B3*
  ID_OUI_FROM_DATABASE=HAS co.,ltd.
 
-OUI:70B3D511D*
- ID_OUI_FROM_DATABASE=Texka Labs
-
 OUI:70B3D5D5A*
  ID_OUI_FROM_DATABASE=WyreStorm Technologies Ltd
 
@@ -1133,9 +1481,6 @@ OUI:70B3D58A4*
 OUI:70B3D5166*
  ID_OUI_FROM_DATABASE=SERIAL IMAGE INC.
 
-OUI:70B3D5E59*
- ID_OUI_FROM_DATABASE=FRACARRO SPA
-
 OUI:70B3D576D*
  ID_OUI_FROM_DATABASE=Trimble
 
@@ -1571,9 +1916,6 @@ OUI:001BC5054*
 OUI:001BC5050*
  ID_OUI_FROM_DATABASE=TeliSwitch Solutions
 
-OUI:001BC5046*
- ID_OUI_FROM_DATABASE=Trans-European Research and Education Networking Association (TERENA)
-
 OUI:001BC5040*
  ID_OUI_FROM_DATABASE=OOO Actidata
 
@@ -1793,9 +2135,6 @@ OUI:70B3D5DE4*
 OUI:70B3D5712*
  ID_OUI_FROM_DATABASE=APG Cash Drawer, LLC
 
-OUI:70B3D5580*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:70B3D5776*
  ID_OUI_FROM_DATABASE=Power Ltd.
 
@@ -1817,6 +2156,66 @@ OUI:70B3D513E*
 OUI:70B3D50BA*
  ID_OUI_FROM_DATABASE=Ayre Acoustics, Inc.
 
+OUI:70B3D510C*
+ ID_OUI_FROM_DATABASE=Vocality International Ltd
+
+OUI:70B3D5B7D*
+ ID_OUI_FROM_DATABASE=LOGIX ITS Inc
+
+OUI:70B3D5307*
+ ID_OUI_FROM_DATABASE=Energi innovation Aps
+
+OUI:70B3D59FA*
+ ID_OUI_FROM_DATABASE=Ideas srl
+
+OUI:70B3D5649*
+ ID_OUI_FROM_DATABASE=swissled technologies AG
+
+OUI:70B3D5C0E*
+ ID_OUI_FROM_DATABASE=SYSDEV Srl
+
+OUI:70B3D54C7*
+ ID_OUI_FROM_DATABASE=SOLVERIS sp. z o.o.
+
+OUI:70B3D57A4*
+ ID_OUI_FROM_DATABASE=Potter Electric Signal Co. LLC
+
+OUI:70B3D5C86*
+ ID_OUI_FROM_DATABASE=Woodam Co., Ltd.
+
+OUI:70B3D5BE8*
+ ID_OUI_FROM_DATABASE=AndFun Co.,Ltd.
+
+OUI:70B3D527A*
+ ID_OUI_FROM_DATABASE=TD ECOPHISIKA
+
+OUI:70B3D554F*
+ ID_OUI_FROM_DATABASE=Assembly Contracts Limited
+
+OUI:70B3D5C0A*
+ ID_OUI_FROM_DATABASE=Infosocket Co., Ltd.
+
+OUI:70B3D5D95*
+ ID_OUI_FROM_DATABASE=SANO SERVICE Co.,Ltd
+
+OUI:70B3D52AC*
+ ID_OUI_FROM_DATABASE=New Imaging Technologies
+
+OUI:70B3D50D3*
+ ID_OUI_FROM_DATABASE=TSAT AS
+
+OUI:70B3D5A89*
+ ID_OUI_FROM_DATABASE=GBS COMMUNICATIONS, LLC
+
+OUI:70B3D57E1*
+ ID_OUI_FROM_DATABASE=Applied Materials
+
+OUI:70B3D554C*
+ ID_OUI_FROM_DATABASE=Husty M.Styczen J.Hupert Sp.J.
+
+OUI:70B3D5041*
+ ID_OUI_FROM_DATABASE=FIBERNET LTD
+
 OUI:70B3D5AAE*
  ID_OUI_FROM_DATABASE=Nuviz Oy
 
@@ -1907,30 +2306,387 @@ OUI:70B3D5238*
 OUI:70B3D59B6*
  ID_OUI_FROM_DATABASE=Intercomp S.p.A.
 
-OUI:70B3D510C*
- ID_OUI_FROM_DATABASE=Vocality International Ltd
+OUI:70B3D5E8F*
+ ID_OUI_FROM_DATABASE=DISMUNTEL, S.A.
 
-OUI:70B3D5B7D*
- ID_OUI_FROM_DATABASE=LOGIX ITS Inc
+OUI:70B3D57B0*
+ ID_OUI_FROM_DATABASE=Medisafe International
 
-OUI:70B3D5307*
- ID_OUI_FROM_DATABASE=Energi innovation Aps
+OUI:70B3D509F*
+ ID_OUI_FROM_DATABASE=COMTECH Kft.
 
-OUI:70B3D59FA*
- ID_OUI_FROM_DATABASE=Ideas srl
+OUI:70B3D5009*
+ ID_OUI_FROM_DATABASE=HolidayCoro
 
-OUI:70B3D5649*
- ID_OUI_FROM_DATABASE=swissled technologies AG
+OUI:70B3D5AB0*
+ ID_OUI_FROM_DATABASE=OSR R&D ISRAEL LTD
 
-OUI:70B3D5C0E*
- ID_OUI_FROM_DATABASE=SYSDEV Srl
+OUI:70B3D5317*
+ ID_OUI_FROM_DATABASE=Iotopia Solutions
 
-OUI:70B3D54C7*
- ID_OUI_FROM_DATABASE=SOLVERIS sp. z o.o.
+OUI:70B3D5D32*
+ ID_OUI_FROM_DATABASE=Euklis by GSG International
 
-OUI:70B3D57A4*
+OUI:70B3D56B0*
+ ID_OUI_FROM_DATABASE=PTYPE Co., LTD.
+
+OUI:70B3D51E9*
+ ID_OUI_FROM_DATABASE=comtime GmbH
+
+OUI:70B3D586C*
+ ID_OUI_FROM_DATABASE=eeas gmbh
+
+OUI:70B3D5B0C*
+ ID_OUI_FROM_DATABASE=Vigilate srl
+
+OUI:70B3D5B37*
+ ID_OUI_FROM_DATABASE=CODEC Co., Ltd.
+
+OUI:70B3D5597*
+ ID_OUI_FROM_DATABASE=VAPE RAIL INTERNATIONAL
+
+OUI:70B3D5850*
+ ID_OUI_FROM_DATABASE=REO AG
+
+OUI:70B3D537A*
+ ID_OUI_FROM_DATABASE=APG Cash Drawer, LLC
+
+OUI:70B3D5C3D*
+ ID_OUI_FROM_DATABASE=CISTECH Solutions
+
+OUI:70B3D5F8B*
+ ID_OUI_FROM_DATABASE=IOOOTA Srl
+
+OUI:70B3D52EC*
+ ID_OUI_FROM_DATABASE=Grupo Epelsa S.L.
+
+OUI:70B3D599E*
+ ID_OUI_FROM_DATABASE=Trinity College Dublin
+
+OUI:70B3D5462*
+ ID_OUI_FROM_DATABASE=EarTex
+
+OUI:70B3D54CE*
+ ID_OUI_FROM_DATABASE=Agilack
+
+OUI:70B3D5F17*
+ ID_OUI_FROM_DATABASE=VITEC
+
+OUI:70B3D511D*
+ ID_OUI_FROM_DATABASE=Dakton Microlabs LLC
+
+OUI:70B3D5924*
+ ID_OUI_FROM_DATABASE=Meridian Technologies Inc
+
+OUI:70B3D503D*
+ ID_OUI_FROM_DATABASE=QUERCUS TECHNOLOGIES, S.L.
+
+OUI:70B3D5B97*
+ ID_OUI_FROM_DATABASE=Canam Technology, Inc.
+
+OUI:70B3D5352*
+ ID_OUI_FROM_DATABASE=Globalcom Engineering SPA
+
+OUI:70B3D57F4*
+ ID_OUI_FROM_DATABASE=KST technology
+
+OUI:70B3D5122*
+ ID_OUI_FROM_DATABASE=Henri Systems Holland bv
+
+OUI:70B3D5767*
+ ID_OUI_FROM_DATABASE=FRANKLIN FRANCE
+
+OUI:70B3D5465*
+ ID_OUI_FROM_DATABASE=ENERGISME
+
+OUI:70B3D5E09*
+ ID_OUI_FROM_DATABASE=L-3 communications ComCept Division
+
+OUI:70B3D5A07*
+ ID_OUI_FROM_DATABASE=IoTrek Technology Private Limited
+
+OUI:70B3D521D*
+ ID_OUI_FROM_DATABASE=iRF - Intelligent RF Solutions, LLC
+
+OUI:70B3D5E9C*
+ ID_OUI_FROM_DATABASE=ATG UV Technology
+
+OUI:70B3D5267*
+ ID_OUI_FROM_DATABASE=Zehntner Testing Instruments
+
+OUI:70B3D539E*
+ ID_OUI_FROM_DATABASE=Lanmark Controls Inc.
+
+OUI:70B3D5C2E*
+ ID_OUI_FROM_DATABASE=Triax A/S
+
+OUI:70B3D50EF*
+ ID_OUI_FROM_DATABASE=Dextera Labs
+
+OUI:70B3D54C2*
+ ID_OUI_FROM_DATABASE=hera Laborsysteme GmbH
+
+OUI:70B3D50A1*
+ ID_OUI_FROM_DATABASE=PTN Electronics Limited
+
+OUI:70B3D5AA4*
+ ID_OUI_FROM_DATABASE=Pullnet Technology,S.L.
+
+OUI:70B3D5C68*
+ ID_OUI_FROM_DATABASE=Mini Solution Co. Ltd.
+
+OUI:70B3D581A*
+ ID_OUI_FROM_DATABASE=Joehl & Koeferli AG
+
+OUI:70B3D586E*
+ ID_OUI_FROM_DATABASE=Profcon AB
+
+OUI:70B3D50E8*
+ ID_OUI_FROM_DATABASE=Grossenbacher Systeme AG
+
+OUI:70B3D59D9*
+ ID_OUI_FROM_DATABASE=ATX Networks Corp
+
+OUI:70B3D5348*
+ ID_OUI_FROM_DATABASE=BÄR Bahnsicherung AG
+
+OUI:70B3D5A30*
+ ID_OUI_FROM_DATABASE=SHEN ZHEN HUAWANG TECHNOLOGY CO; LTD
+
+OUI:70B3D5DFD*
+ ID_OUI_FROM_DATABASE=Contiweb
+
+OUI:70B3D5B30*
+ ID_OUI_FROM_DATABASE=Systolé Hardware B.V.
+
+OUI:70B3D5745*
+ ID_OUI_FROM_DATABASE=TMSI LLC
+
+OUI:70B3D53BF*
+ ID_OUI_FROM_DATABASE=Star Electronics GmbH & Co. KG
+
+OUI:70B3D5D1C*
+ ID_OUI_FROM_DATABASE=Specialised Imaging Limited
+
+OUI:70B3D5E8E*
+ ID_OUI_FROM_DATABASE=Macnica Technology
+
+OUI:70B3D5ADF*
+ ID_OUI_FROM_DATABASE=Seraphim Optronics Ltd
+
+OUI:70B3D522C*
+ ID_OUI_FROM_DATABASE=Hiquel Elektronik- und Anlagenbau GmbH
+
+OUI:70B3D52A2*
+ ID_OUI_FROM_DATABASE=Visualware, Inc.
+
+OUI:70B3D5DCE*
+ ID_OUI_FROM_DATABASE=Stahl GmbH
+
+OUI:70B3D5D08*
+ ID_OUI_FROM_DATABASE=Veeco Instruments
+
+OUI:70B3D5630*
+ ID_OUI_FROM_DATABASE=LGE
+
+OUI:70B3D5873*
+ ID_OUI_FROM_DATABASE=Vishay Nobel AB
+
+OUI:70B3D5653*
+ ID_OUI_FROM_DATABASE=Luxar Tech, Inc.
+
+OUI:70B3D5F1F*
+ ID_OUI_FROM_DATABASE=HKC Limited
+
+OUI:70B3D5AF6*
+ ID_OUI_FROM_DATABASE=S.C.E. srl
+
+OUI:70B3D5F37*
+ ID_OUI_FROM_DATABASE=Mitsubishi Electric Micro-Computer Application Software Co.,Ltd.
+
+OUI:70B3D58C3*
+ ID_OUI_FROM_DATABASE=Wyebot, Inc.
+
+OUI:70B3D542D*
+ ID_OUI_FROM_DATABASE=RCH Italia SpA
+
+OUI:70B3D5332*
+ ID_OUI_FROM_DATABASE=InnoSenT
+
+OUI:70B3D5A47*
+ ID_OUI_FROM_DATABASE=KANOA INC
+
+OUI:70B3D5F45*
+ ID_OUI_FROM_DATABASE=Norbit ODM AS
+
+OUI:70B3D5DEE*
+ ID_OUI_FROM_DATABASE=CRDE
+
+OUI:70B3D5E59*
+ ID_OUI_FROM_DATABASE=Fracarro srl
+
+OUI:70B3D5127*
+ ID_OUI_FROM_DATABASE=VITEC
+
+OUI:001BC5046*
+ ID_OUI_FROM_DATABASE=GÉANT
+
+OUI:70B3D573A*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:70B3D59DE*
+ ID_OUI_FROM_DATABASE=System 11 Sp. z o.o.
+
+OUI:70B3D596D*
+ ID_OUI_FROM_DATABASE=MSB Elektronik und Gerätebau GmbH
+
+OUI:70B3D5C17*
  ID_OUI_FROM_DATABASE=Potter Electric Signal Co. LLC
 
+OUI:70B3D5108*
+ ID_OUI_FROM_DATABASE=TEX COMPUTER SRL
+
+OUI:70B3D54E7*
+ ID_OUI_FROM_DATABASE=Digital Domain
+
+OUI:70B3D5007*
+ ID_OUI_FROM_DATABASE=SENSONEO
+
+OUI:70B3D5D10*
+ ID_OUI_FROM_DATABASE=Contec DTx
+
+OUI:70B3D57F3*
+ ID_OUI_FROM_DATABASE=Shenzhen Virtual Clusters Information Technology Co.,Ltd.
+
+OUI:70B3D5C8C*
+ ID_OUI_FROM_DATABASE=Rollogo Limited
+
+OUI:70B3D5D4C*
+ ID_OUI_FROM_DATABASE=Elystec Technology Co., Ltd
+
+OUI:70B3D596B*
+ ID_OUI_FROM_DATABASE=FOCAL-JMLab
+
+OUI:70B3D584D*
+ ID_OUI_FROM_DATABASE=Quantum Design Inc.
+
+OUI:70B3D5E57*
+ ID_OUI_FROM_DATABASE=Iradimed
+
+OUI:70B3D5125*
+ ID_OUI_FROM_DATABASE=Securolytics, Inc.
+
+OUI:70B3D5C6E*
+ ID_OUI_FROM_DATABASE=Orion Technologies, LLC
+
+OUI:70B3D5CC8*
+ ID_OUI_FROM_DATABASE=PROFEN COMMUNICATIONS
+
+OUI:70B3D5FDB*
+ ID_OUI_FROM_DATABASE=Design SHIFT
+
+OUI:70B3D5791*
+ ID_OUI_FROM_DATABASE=Romteck Australia
+
+OUI:70B3D569F*
+ ID_OUI_FROM_DATABASE=T+A elektroakustik GmbH & Co.KG
+
+OUI:70B3D5D20*
+ ID_OUI_FROM_DATABASE=Rheonics GmbH
+
+OUI:70B3D55FB*
+ ID_OUI_FROM_DATABASE=TELEPLATFORMS
+
+OUI:70B3D5768*
+ ID_OUI_FROM_DATABASE=Kazan Networks Corporation
+
+OUI:70B3D56B2*
+ ID_OUI_FROM_DATABASE=CRDE
+
+OUI:70B3D57F7*
+ ID_OUI_FROM_DATABASE=JASCO Applied Sciences Canada Ltd
+
+OUI:70B3D5F42*
+ ID_OUI_FROM_DATABASE=Matsuhisa Corporation
+
+OUI:70B3D5381*
+ ID_OUI_FROM_DATABASE=CRDE
+
+OUI:70B3D5488*
+ ID_OUI_FROM_DATABASE=Cardinal Scale Mfg Co
+
+OUI:70B3D5273*
+ ID_OUI_FROM_DATABASE=WeVo Tech
+
+OUI:70B3D5379*
+ ID_OUI_FROM_DATABASE=Vensi, Inc.
+
+OUI:70B3D50B2*
+ ID_OUI_FROM_DATABASE=ndb technologies
+
+OUI:70B3D5CB3*
+ ID_OUI_FROM_DATABASE=KST technology
+
+OUI:70B3D530D*
+ ID_OUI_FROM_DATABASE=Fiberbase
+
+OUI:70B3D5842*
+ ID_OUI_FROM_DATABASE=PLUTO Solution co.,ltd.
+
+OUI:70B3D5EB9*
+ ID_OUI_FROM_DATABASE=Thiel Audio Products Company, LLC
+
+OUI:70B3D5031*
+ ID_OUI_FROM_DATABASE=SHENZHEN GAONA ELECTRONIC CO.LTD
+
+OUI:70B3D5548*
+ ID_OUI_FROM_DATABASE=DIGIVERV INC
+
+OUI:70B3D5284*
+ ID_OUI_FROM_DATABASE=Globalcom Engineering SPA
+
+OUI:70B3D5A4E*
+ ID_OUI_FROM_DATABASE=Array Technologies Inc.
+
+OUI:70B3D5580*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:70B3D52F2*
+ ID_OUI_FROM_DATABASE=Health Care Originals, Inc.
+
+OUI:70B3D5B98*
+ ID_OUI_FROM_DATABASE=GSF Corporation Pte Ltd
+
+OUI:70B3D5BA9*
+ ID_OUI_FROM_DATABASE=Alma
+
+OUI:70B3D50DE*
+ ID_OUI_FROM_DATABASE=Grossenbacher Systeme AG
+
+OUI:70B3D54B8*
+ ID_OUI_FROM_DATABASE=International Roll-Call Corporation
+
+OUI:70B3D5991*
+ ID_OUI_FROM_DATABASE=Javasparrow Inc.
+
+OUI:70B3D5894*
+ ID_OUI_FROM_DATABASE=UnI Systech Co.,Ltd
+
+OUI:70B3D516B*
+ ID_OUI_FROM_DATABASE=IOT Engineering
+
+OUI:70B3D53AA*
+ ID_OUI_FROM_DATABASE=RCATSONE
+
+OUI:70B3D5432*
+ ID_OUI_FROM_DATABASE=DEUTA-WERKE GmbH
+
+OUI:70B3D5086*
+ ID_OUI_FROM_DATABASE=Husty M.Styczen J.Hupert Sp.J.
+
+OUI:70B3D5E17*
+ ID_OUI_FROM_DATABASE=Private
+
 OUI:70B3D5494*
  ID_OUI_FROM_DATABASE=Schildknecht AG
 
@@ -2003,9 +2759,6 @@ OUI:70B3D5061*
 OUI:70B3D5383*
  ID_OUI_FROM_DATABASE=LPA Excil Electronics
 
-OUI:70B3D59F6*
- ID_OUI_FROM_DATABASE=Edgeware AB
-
 OUI:70B3D5504*
  ID_OUI_FROM_DATABASE=Xsight Systems Ltd.
 
@@ -2669,9 +3422,6 @@ OUI:70B3D50FA*
 OUI:70B3D531E*
  ID_OUI_FROM_DATABASE=GILLAM-FEI S.A.
 
-OUI:70B3D54D5*
- ID_OUI_FROM_DATABASE=Morgan Rekofa  GmbH
-
 OUI:70B3D58C5*
  ID_OUI_FROM_DATABASE=HMicro Inc
 
@@ -2708,9 +3458,6 @@ OUI:70B3D54FE*
 OUI:70B3D51FD*
  ID_OUI_FROM_DATABASE=BRS Sistemas Eletrônicos
 
-OUI:70B3D5631*
- ID_OUI_FROM_DATABASE=SENSO2ME
-
 OUI:70B3D5396*
  ID_OUI_FROM_DATABASE=CTG sp. z o. o.
 
@@ -2729,9 +3476,6 @@ OUI:70B3D53D9*
 OUI:70B3D535F*
  ID_OUI_FROM_DATABASE=Aplex Technology Inc.
 
-OUI:70B3D5FFF*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:70B3D533E*
  ID_OUI_FROM_DATABASE=Dynamic Connect (Suzhou) Hi-Tech Electronic Co.,Ltd.
 
@@ -2816,12 +3560,12 @@ OUI:70B3D58B3*
 OUI:70B3D5599*
  ID_OUI_FROM_DATABASE=LECO Corporation
 
-OUI:70B3D5896*
- ID_OUI_FROM_DATABASE=Shanghai Longpal Communication Equipment Co., Ltd.
-
 OUI:70B3D5692*
  ID_OUI_FROM_DATABASE=HOSIN INDUSTRIAL LIMITED
 
+OUI:70B3D5896*
+ ID_OUI_FROM_DATABASE=Shanghai Longpal Communication Equipment Co., Ltd.
+
 OUI:70B3D5AE7*
  ID_OUI_FROM_DATABASE=E-T-A Elektrotechnische Apparate GmbH
 
@@ -2834,15 +3578,15 @@ OUI:70B3D5E0F*
 OUI:70B3D512F*
  ID_OUI_FROM_DATABASE=DSP4YOU LTd
 
+OUI:70B3D571B*
+ ID_OUI_FROM_DATABASE=elsys
+
 OUI:70B3D59B1*
  ID_OUI_FROM_DATABASE=Aplex Technology Inc.
 
 OUI:70B3D5CA4*
  ID_OUI_FROM_DATABASE=Netemera Sp. z o.o.
 
-OUI:70B3D571B*
- ID_OUI_FROM_DATABASE=elsys
-
 OUI:70B3D548F*
  ID_OUI_FROM_DATABASE=Seiwa Giken
 
@@ -2858,6 +3602,390 @@ OUI:70B3D5D2F*
 OUI:70B3D536A*
  ID_OUI_FROM_DATABASE=Becton Dickinson
 
+OUI:70B3D5C80*
+ ID_OUI_FROM_DATABASE=Link Care Services
+
+OUI:70B3D5607*
+ ID_OUI_FROM_DATABASE=ATEME
+
+OUI:70B3D5A33*
+ ID_OUI_FROM_DATABASE=TIAMA
+
+OUI:70B3D5A19*
+ ID_OUI_FROM_DATABASE=Qualitronix Madrass Pvt Ltd
+
+OUI:70B3D5F81*
+ ID_OUI_FROM_DATABASE=Littlemore Scientific
+
+OUI:70B3D5B3F*
+ ID_OUI_FROM_DATABASE=Orbit International
+
+OUI:70B3D528D*
+ ID_OUI_FROM_DATABASE=Technica Engineering GmbH
+
+OUI:70B3D5B62*
+ ID_OUI_FROM_DATABASE=Sakura Seiki Co.,Ltd.
+
+OUI:70B3D5CCF*
+ ID_OUI_FROM_DATABASE=Netberg
+
+OUI:70B3D5131*
+ ID_OUI_FROM_DATABASE=Inova Design Solutions Ltd
+
+OUI:70B3D5987*
+ ID_OUI_FROM_DATABASE=AXIS CORPORATION
+
+OUI:70B3D52BA*
+ ID_OUI_FROM_DATABASE=Active Brains
+
+OUI:70B3D50CE*
+ ID_OUI_FROM_DATABASE=Innominds Software Inc
+
+OUI:70B3D5644*
+ ID_OUI_FROM_DATABASE=ATX Networks Corp
+
+OUI:70B3D5376*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:70B3D552C*
+ ID_OUI_FROM_DATABASE=Centuryarks Ltd.,
+
+OUI:70B3D5BC2*
+ ID_OUI_FROM_DATABASE=DWEWOONG ELECTRIC Co., Ltd.
+
+OUI:70B3D5DFC*
+ ID_OUI_FROM_DATABASE=ELECTRONIC SYSTEMS DESIGN SPRL
+
+OUI:70B3D57E5*
+ ID_OUI_FROM_DATABASE=Megaflex Oy
+
+OUI:70B3D5503*
+ ID_OUI_FROM_DATABASE=Itest communication Tech Co., LTD
+
+OUI:70B3D548A*
+ ID_OUI_FROM_DATABASE=George Wilson Industries Ltd
+
+OUI:70B3D50E5*
+ ID_OUI_FROM_DATABASE=Delta Solutions LLC
+
+OUI:70B3D581E*
+ ID_OUI_FROM_DATABASE=Novathings
+
+OUI:70B3D504B*
+ ID_OUI_FROM_DATABASE=Dream I System Co., Ltd
+
+OUI:70B3D549A*
+ ID_OUI_FROM_DATABASE=HAXE SYSTEME
+
+OUI:70B3D563C*
+ ID_OUI_FROM_DATABASE=Pivothead
+
+OUI:70B3D5ADB*
+ ID_OUI_FROM_DATABASE=RF Code
+
+OUI:70B3D5B53*
+ ID_OUI_FROM_DATABASE=Revolution Retail Systems, LLC
+
+OUI:70B3D5C7E*
+ ID_OUI_FROM_DATABASE=BirdDog Australia
+
+OUI:70B3D5F03*
+ ID_OUI_FROM_DATABASE=GMI Ltd
+
+OUI:70B3D58C2*
+ ID_OUI_FROM_DATABASE=F-domain corporation
+
+OUI:70B3D56CF*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:70B3D572C*
+ ID_OUI_FROM_DATABASE=NuRi&G Engineering co,.Ltd.
+
+OUI:70B3D5735*
+ ID_OUI_FROM_DATABASE=Swiss Audio
+
+OUI:70B3D5260*
+ ID_OUI_FROM_DATABASE=ModuSystems, Inc
+
+OUI:70B3D54EF*
+ ID_OUI_FROM_DATABASE=CMI, Inc.
+
+OUI:70B3D5C12*
+ ID_OUI_FROM_DATABASE=Beijing Wisetone Information Technology Co.,Ltd.
+
+OUI:70B3D5930*
+ ID_OUI_FROM_DATABASE=The Institute of Mine Seismology
+
+OUI:70B3D5188*
+ ID_OUI_FROM_DATABASE=Birket Engineering
+
+OUI:70B3D55E2*
+ ID_OUI_FROM_DATABASE=Grossenbacher Systeme AG
+
+OUI:70B3D525A*
+ ID_OUI_FROM_DATABASE=DEUTA-WERKE GmbH
+
+OUI:70B3D516F*
+ ID_OUI_FROM_DATABASE=NimbeLink Corp
+
+OUI:70B3D59C0*
+ ID_OUI_FROM_DATABASE=Schneider Displaytechnik GmbH
+
+OUI:70B3D5E98*
+ ID_OUI_FROM_DATABASE=JSC Kaluga Astral
+
+OUI:70B3D5443*
+ ID_OUI_FROM_DATABASE=Slot3 GmbH
+
+OUI:70B3D5149*
+ ID_OUI_FROM_DATABASE=eleven-x
+
+OUI:70B3D5952*
+ ID_OUI_FROM_DATABASE=REQUEA
+
+OUI:70B3D5BAA*
+ ID_OUI_FROM_DATABASE=Device Solutions Ltd
+
+OUI:70B3D5C5C*
+ ID_OUI_FROM_DATABASE=Layer Logic Inc
+
+OUI:70B3D5F3B*
+ ID_OUI_FROM_DATABASE=Epdm Pty Ltd
+
+OUI:70B3D536F*
+ ID_OUI_FROM_DATABASE=BuddyGuard GmbH
+
+OUI:70B3D59F6*
+ ID_OUI_FROM_DATABASE=Edgeware AB
+
+OUI:70B3D5222*
+ ID_OUI_FROM_DATABASE=Marioff Corporation Oy
+
+OUI:70B3D50E3*
+ ID_OUI_FROM_DATABASE=SinTau SrL
+
+OUI:70B3D52E5*
+ ID_OUI_FROM_DATABASE=Fläkt Woods AB
+
+OUI:70B3D588D*
+ ID_OUI_FROM_DATABASE=LG Electronics
+
+OUI:70B3D5A8B*
+ ID_OUI_FROM_DATABASE=Giant Power Technology Biomedical Corporation
+
+OUI:70B3D50F1*
+ ID_OUI_FROM_DATABASE=Beijing One City Science & Technology Co., LTD
+
+OUI:70B3D5F70*
+ ID_OUI_FROM_DATABASE=Honeywell
+
+OUI:70B3D59CE*
+ ID_OUI_FROM_DATABASE=Terragene S.A
+
+OUI:70B3D5CEA*
+ ID_OUI_FROM_DATABASE=Computerwise, Inc.
+
+OUI:70B3D5F1D*
+ ID_OUI_FROM_DATABASE=Critical Link LLC
+
+OUI:70B3D5F05*
+ ID_OUI_FROM_DATABASE=Motomuto Aps
+
+OUI:70B3D5FFC*
+ ID_OUI_FROM_DATABASE=Symetrics Industries d.b.a. Extant Aerospace
+
+OUI:70B3D530E*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:70B3D54F8*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:70B3D55E0*
+ ID_OUI_FROM_DATABASE=Hexagon Metrology SAS
+
+OUI:70B3D5B2B*
+ ID_OUI_FROM_DATABASE=Vtron Pty Ltd
+
+OUI:70B3D59D0*
+ ID_OUI_FROM_DATABASE=RJ45 Technologies
+
+OUI:70B3D5672*
+ ID_OUI_FROM_DATABASE=KLEIBER Infrared GmbH
+
+OUI:70B3D5572*
+ ID_OUI_FROM_DATABASE=CRDE
+
+OUI:70B3D5927*
+ ID_OUI_FROM_DATABASE=LG Electronics
+
+OUI:70B3D5489*
+ ID_OUI_FROM_DATABASE=ard sa
+
+OUI:70B3D52B1*
+ ID_OUI_FROM_DATABASE=WIXCON Co., Ltd
+
+OUI:70B3D5B6A*
+ ID_OUI_FROM_DATABASE=YUYAMA MFG Co.,Ltd
+
+OUI:70B3D5579*
+ ID_OUI_FROM_DATABASE=Chelsea Technologies Group Ltd
+
+OUI:70B3D59B2*
+ ID_OUI_FROM_DATABASE=CONTINENT, Ltd
+
+OUI:70B3D5365*
+ ID_OUI_FROM_DATABASE=CircuitMeter Inc.
+
+OUI:70B3D5805*
+ ID_OUI_FROM_DATABASE=Eurotronik Kranj d.o.o.
+
+OUI:70B3D5BF6*
+ ID_OUI_FROM_DATABASE=comtac AG
+
+OUI:70B3D50B4*
+ ID_OUI_FROM_DATABASE=AVER
+
+OUI:70B3D51B6*
+ ID_OUI_FROM_DATABASE=DACOM West GmbH
+
+OUI:70B3D59C1*
+ ID_OUI_FROM_DATABASE=Zeroplus Technology Co.,Ltd.
+
+OUI:70B3D5094*
+ ID_OUI_FROM_DATABASE=Circuitlink Pty Ltd
+
+OUI:70B3D5AA3*
+ ID_OUI_FROM_DATABASE=LINEAGE POWER PVT LTD.,
+
+OUI:70B3D5AEF*
+ ID_OUI_FROM_DATABASE=Baumtec GmbH
+
+OUI:70B3D5D92*
+ ID_OUI_FROM_DATABASE=Zamir Recognition Systems Ltd.
+
+OUI:70B3D5DA4*
+ ID_OUI_FROM_DATABASE=CRDE
+
+OUI:70B3D5CC9*
+ ID_OUI_FROM_DATABASE=Rapiscan Systems
+
+OUI:70B3D52D0*
+ ID_OUI_FROM_DATABASE=ijin co.,ltd.
+
+OUI:70B3D50A0*
+ ID_OUI_FROM_DATABASE=Cominfo, Inc.
+
+OUI:70B3D520F*
+ ID_OUI_FROM_DATABASE=Tieline Research Pty Ltd
+
+OUI:70B3D5C20*
+ ID_OUI_FROM_DATABASE=Mipot S.p.a.
+
+OUI:70B3D54D5*
+ ID_OUI_FROM_DATABASE=Moog Rekofa  GmbH
+
+OUI:70B3D5D3C*
+ ID_OUI_FROM_DATABASE=HRT
+
+OUI:70B3D5DDB*
+ ID_OUI_FROM_DATABASE=Intra Corporation
+
+OUI:70B3D58EE*
+ ID_OUI_FROM_DATABASE=Network Additions
+
+OUI:70B3D5445*
+ ID_OUI_FROM_DATABASE=Advanced Devices SpA
+
+OUI:70B3D5674*
+ ID_OUI_FROM_DATABASE=Fortress Cyber Security
+
+OUI:70B3D5FFF*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:70B3D5DB8*
+ ID_OUI_FROM_DATABASE=SISTEM SA
+
+OUI:70B3D5FBC*
+ ID_OUI_FROM_DATABASE=Twoway Communications, Inc.
+
+OUI:70B3D5969*
+ ID_OUI_FROM_DATABASE=Emtel System Sp. z o.o.
+
+OUI:70B3D5C33*
+ ID_OUI_FROM_DATABASE=Dandong Dongfang Measurement & Control Technology Co., Ltd.
+
+OUI:70B3D5B2E*
+ ID_OUI_FROM_DATABASE=Green Access Ltd
+
+OUI:70B3D558C*
+ ID_OUI_FROM_DATABASE=OPTSYS
+
+OUI:70B3D595B*
+ ID_OUI_FROM_DATABASE=SRS Group s.r.o.
+
+OUI:70B3D534E*
+ ID_OUI_FROM_DATABASE=Risk Expert sarl
+
+OUI:70B3D56AD*
+ ID_OUI_FROM_DATABASE=CONNIT
+
+OUI:70B3D5C14*
+ ID_OUI_FROM_DATABASE=Grupo Epelsa S.L.
+
+OUI:70B3D5631*
+ ID_OUI_FROM_DATABASE=SENSO2ME bvba
+
+OUI:70B3D5C53*
+ ID_OUI_FROM_DATABASE=S Labs sp. z o.o.
+
+OUI:70B3D5F24*
+ ID_OUI_FROM_DATABASE=Daavlin
+
+OUI:70B3D56E7*
+ ID_OUI_FROM_DATABASE=AML
+
+OUI:70B3D577B*
+ ID_OUI_FROM_DATABASE=AeroVision Avionics, Inc.
+
+OUI:70B3D504E*
+ ID_OUI_FROM_DATABASE=HUGEL GmbH
+
+OUI:70B3D5319*
+ ID_OUI_FROM_DATABASE=ISO/TC 22/SC 31
+
+OUI:70B3D5844*
+ ID_OUI_FROM_DATABASE=SANSFIL Technologies
+
+OUI:70B3D5826*
+ ID_OUI_FROM_DATABASE=Elbit Systems of Amerixca
+
+OUI:70B3D5C42*
+ ID_OUI_FROM_DATABASE=CRDE
+
+OUI:70B3D5557*
+ ID_OUI_FROM_DATABASE=HEITEC AG
+
+OUI:70B3D568C*
+ ID_OUI_FROM_DATABASE=ND METER
+
+OUI:70B3D5727*
+ ID_OUI_FROM_DATABASE=LP Technologies Inc.
+
+OUI:70B3D549B*
+ ID_OUI_FROM_DATABASE=Algodue Elettronica Srl
+
+OUI:70B3D57F9*
+ ID_OUI_FROM_DATABASE=CSS Inc.
+
+OUI:70B3D592B*
+ ID_OUI_FROM_DATABASE=ENTEC Electric & Electronic Co., LTD.
+
+OUI:70B3D5B13*
+ ID_OUI_FROM_DATABASE=Omwave
+
+OUI:70B3D5EA7*
+ ID_OUI_FROM_DATABASE=S.I.C.E.S. srl
+
 OUI:70B3D566B*
  ID_OUI_FROM_DATABASE=Innitive B.V.
 
@@ -3023,9 +4151,6 @@ OUI:70B3D5435*
 OUI:70B3D50CD*
  ID_OUI_FROM_DATABASE=AML Oceanographic
 
-OUI:70B3D56E8*
- ID_OUI_FROM_DATABASE=BluWireless Technology Ltd
-
 OUI:70B3D56B3*
  ID_OUI_FROM_DATABASE=DuraComm Corporation
 
@@ -3269,9 +4394,6 @@ OUI:70B3D5010*
 OUI:70B3D586D*
  ID_OUI_FROM_DATABASE=Census Digital Incorporated
 
-OUI:70B3D560B*
- ID_OUI_FROM_DATABASE=Edgeware AB
-
 OUI:70B3D5ADD*
  ID_OUI_FROM_DATABASE=GHL Systems Berhad
 
@@ -3560,9 +4682,6 @@ OUI:70B3D5528*
 OUI:70B3D5B81*
  ID_OUI_FROM_DATABASE=Instro Precision Limited
 
-OUI:70B3D5479*
- ID_OUI_FROM_DATABASE=LINEAGE POWER PVT. LTD.
-
 OUI:70B3D5A66*
  ID_OUI_FROM_DATABASE=Trapeze Software Group Inc
 
@@ -3626,6 +4745,117 @@ OUI:70B3D5A96*
 OUI:70B3D5367*
  ID_OUI_FROM_DATABASE=Living Water
 
+OUI:70B3D58DB*
+ ID_OUI_FROM_DATABASE=Kratos Analytical Ltd
+
+OUI:70B3D5A4F*
+ ID_OUI_FROM_DATABASE=Weltek Technologies Co. Ltd.
+
+OUI:70B3D51A3*
+ ID_OUI_FROM_DATABASE=Telairity Semiconductor
+
+OUI:70B3D5650*
+ ID_OUI_FROM_DATABASE=GIFAS-ELECTRIC GmbH
+
+OUI:70B3D5C63*
+ ID_OUI_FROM_DATABASE=Xentech Solutions Limited
+
+OUI:70B3D5106*
+ ID_OUI_FROM_DATABASE=Aplex Technology Inc.
+
+OUI:70B3D56C5*
+ ID_OUI_FROM_DATABASE=CJSC «Russian telecom equipment company» (CJSC RTEC)
+
+OUI:70B3D5FE9*
+ ID_OUI_FROM_DATABASE=Camsat Przemysław Gralak
+
+OUI:70B3D54C5*
+ ID_OUI_FROM_DATABASE=Moving iMage Technologies LLC
+
+OUI:70B3D591A*
+ ID_OUI_FROM_DATABASE=Fujian Landfone Information Technology Co.,Ltd
+
+OUI:70B3D59EC*
+ ID_OUI_FROM_DATABASE=eSoftThings
+
+OUI:70B3D5761*
+ ID_OUI_FROM_DATABASE=Critical Link LLC
+
+OUI:70B3D5C22*
+ ID_OUI_FROM_DATABASE=Skyriver Communications Inc.
+
+OUI:70B3D53BB*
+ ID_OUI_FROM_DATABASE=A-M Systems
+
+OUI:70B3D5B44*
+ ID_OUI_FROM_DATABASE=ENTEC Electric & Electronic Co., LTD.
+
+OUI:70B3D5584*
+ ID_OUI_FROM_DATABASE=Sertone, a division of Opti-Knights Ltd
+
+OUI:70B3D53EF*
+ ID_OUI_FROM_DATABASE=Vtron Pty Ltd
+
+OUI:70B3D57C2*
+ ID_OUI_FROM_DATABASE=Morgan Schaffer Inc.
+
+OUI:70B3D5697*
+ ID_OUI_FROM_DATABASE=Alazar Technologies Inc.
+
+OUI:70B3D561A*
+ ID_OUI_FROM_DATABASE=Rocket Lab Ltd.
+
+OUI:70B3D5855*
+ ID_OUI_FROM_DATABASE=CRDE
+
+OUI:70B3D5F8D*
+ ID_OUI_FROM_DATABASE=Flextronics Canafa Design Services
+
+OUI:70B3D59AE*
+ ID_OUI_FROM_DATABASE=Volansys technologies pvt ltd
+
+OUI:70B3D542C*
+ ID_OUI_FROM_DATABASE=D.Marchiori Srl
+
+OUI:70B3D5CE5*
+ ID_OUI_FROM_DATABASE=GridBridge Inc
+
+OUI:70B3D51EF*
+ ID_OUI_FROM_DATABASE=ADTEK
+
+OUI:70B3D5EDB*
+ ID_OUI_FROM_DATABASE=Netfort Solutions
+
+OUI:70B3D5CD9*
+ ID_OUI_FROM_DATABASE=Peter Huber Kaeltemaschinenbau GmbH
+
+OUI:70B3D51D7*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:70B3D5976*
+ ID_OUI_FROM_DATABASE=Atonarp Micro-Systems India Pvt. Ltd.
+
+OUI:70B3D50DA*
+ ID_OUI_FROM_DATABASE=Aquavision Distribution Ltd
+
+OUI:70B3D5989*
+ ID_OUI_FROM_DATABASE=DCNS
+
+OUI:70B3D5833*
+ ID_OUI_FROM_DATABASE=Alpiq InTec Management AG
+
+OUI:70B3D53E8*
+ ID_OUI_FROM_DATABASE=COSMOS web Co., Ltd.
+
+OUI:70B3D597F*
+ ID_OUI_FROM_DATABASE=BISTOS.,Co.,Ltd
+
+OUI:70B3D5C5D*
+ ID_OUI_FROM_DATABASE=FOSHAN SHILANTIAN NETWORK S.T. CO., LTD.
+
+OUI:70B3D573B*
+ ID_OUI_FROM_DATABASE=S-I-C
+
 OUI:70B3D5114*
  ID_OUI_FROM_DATABASE=Project H Pty Ltd
 
@@ -3683,83 +4913,371 @@ OUI:70B3D5C4F*
 OUI:70B3D5BD9*
  ID_OUI_FROM_DATABASE=SolwayTech
 
-OUI:70B3D58DB*
- ID_OUI_FROM_DATABASE=Kratos Analytical Ltd
+OUI:70B3D5F35*
+ ID_OUI_FROM_DATABASE=carbonTRACK
 
-OUI:70B3D5A4F*
- ID_OUI_FROM_DATABASE=Weltek Technologies Co. Ltd.
+OUI:70B3D529F*
+ ID_OUI_FROM_DATABASE=Code Hardware SA
 
-OUI:70B3D51A3*
- ID_OUI_FROM_DATABASE=Telairity Semiconductor
+OUI:70B3D5F76*
+ ID_OUI_FROM_DATABASE=Thermo Fisher Scientific
 
-OUI:70B3D5650*
- ID_OUI_FROM_DATABASE=GIFAS-ELECTRIC GmbH
+OUI:70B3D52B9*
+ ID_OUI_FROM_DATABASE=BELECTRIC GmbH
 
-OUI:70B3D5C63*
- ID_OUI_FROM_DATABASE=Xentech Solutions Limited
+OUI:70B3D59AD*
+ ID_OUI_FROM_DATABASE=Fortuna Impex Pvt ltd
 
-OUI:70B3D5106*
- ID_OUI_FROM_DATABASE=Aplex Technology Inc.
+OUI:70B3D5594*
+ ID_OUI_FROM_DATABASE=ATE Systems Inc
 
-OUI:70B3D56C5*
- ID_OUI_FROM_DATABASE=CJSC «Russian telecom equipment company» (CJSC RTEC)
+OUI:70B3D58CB*
+ ID_OUI_FROM_DATABASE=WELT Corporation
 
-OUI:70B3D5FE9*
- ID_OUI_FROM_DATABASE=Camsat Przemysław Gralak
+OUI:70B3D5405*
+ ID_OUI_FROM_DATABASE=MG s.r.l.
 
-OUI:70B3D54C5*
- ID_OUI_FROM_DATABASE=Moving iMage Technologies LLC
+OUI:70B3D587E*
+ ID_OUI_FROM_DATABASE=Septentrio NV
 
-OUI:70B3D591A*
- ID_OUI_FROM_DATABASE=Fujian Landfone Information Technology Co.,Ltd
+OUI:70B3D5ECB*
+ ID_OUI_FROM_DATABASE=Re spa - Controlli Industriali - IT01782300154
 
-OUI:70B3D59EC*
- ID_OUI_FROM_DATABASE=eSoftThings
+OUI:70B3D55F4*
+ ID_OUI_FROM_DATABASE=FDSTiming
 
-OUI:70B3D5761*
- ID_OUI_FROM_DATABASE=Critical Link LLC
+OUI:70B3D5D75*
+ ID_OUI_FROM_DATABASE=Hyundai MNSOFT
 
-OUI:70B3D5C22*
- ID_OUI_FROM_DATABASE=Skyriver Communications Inc.
+OUI:70B3D5D9A*
+ ID_OUI_FROM_DATABASE=Wuhan Xingtuxinke ELectronic Co.,Ltd
 
-OUI:70B3D53BB*
- ID_OUI_FROM_DATABASE=A-M Systems
+OUI:70B3D59C7*
+ ID_OUI_FROM_DATABASE=YUYAMA MFG Co.,Ltd
 
-OUI:70B3D5B44*
- ID_OUI_FROM_DATABASE=ENTEC Electric & Electronic Co., LTD.
+OUI:70B3D532A*
+ ID_OUI_FROM_DATABASE=Wuhan Xingtuxinke ELectronic Co.,Ltd
 
-OUI:70B3D5584*
- ID_OUI_FROM_DATABASE=Sertone, a division of Opti-Knights Ltd
+OUI:70B3D560E*
+ ID_OUI_FROM_DATABASE=HDANYWHERE
 
-OUI:70B3D53EF*
- ID_OUI_FROM_DATABASE=Vtron Pty Ltd
+OUI:70B3D5EBB*
+ ID_OUI_FROM_DATABASE=Beijing Wing ICT Technology Co., Ltd.
 
-OUI:70B3D57C2*
- ID_OUI_FROM_DATABASE=Morgan Schaffer Inc.
+OUI:70B3D5B09*
+ ID_OUI_FROM_DATABASE=FIRST LIGHT IMAGING
 
-OUI:70B3D5697*
- ID_OUI_FROM_DATABASE=Alazar Technologies Inc.
+OUI:70B3D518C*
+ ID_OUI_FROM_DATABASE=CMC Industrial Electronics Ltd
 
-OUI:70B3D561A*
- ID_OUI_FROM_DATABASE=Rocket Lab Ltd.
+OUI:70B3D5AFF*
+ ID_OUI_FROM_DATABASE=digital-spice
 
-OUI:70B3D5855*
+OUI:70B3D5563*
+ ID_OUI_FROM_DATABASE=Zhejiang Hao Teng Electronic Technology Co., Ltd.
+
+OUI:70B3D5C06*
+ ID_OUI_FROM_DATABASE=XotonicsMED GmbH
+
+OUI:70B3D52DB*
+ ID_OUI_FROM_DATABASE=ProtoPixel SL
+
+OUI:70B3D5A58*
+ ID_OUI_FROM_DATABASE=MCQ TECH GmbH
+
+OUI:70B3D5934*
+ ID_OUI_FROM_DATABASE=RBS Netkom GmbH
+
+OUI:70B3D513D*
+ ID_OUI_FROM_DATABASE=Elsist Srl
+
+OUI:70B3D53B7*
+ ID_OUI_FROM_DATABASE=Paul Scherrer Institut (PSI)
+
+OUI:70B3D594D*
+ ID_OUI_FROM_DATABASE=SEASON DESIGN TECHNOLOGY
+
+OUI:70B3D5A4C*
+ ID_OUI_FROM_DATABASE=Alere Technologies AS
+
+OUI:70B3D590B*
+ ID_OUI_FROM_DATABASE=Matrix Switch Corporation
+
+OUI:70B3D5C4B*
+ ID_OUI_FROM_DATABASE=ANKER-EAST
+
+OUI:70B3D5542*
+ ID_OUI_FROM_DATABASE=RTDS Technologies Inc.
+
+OUI:70B3D568E*
+ ID_OUI_FROM_DATABASE=CEA Technologies Pty Ltd
+
+OUI:70B3D51E4*
+ ID_OUI_FROM_DATABASE=Tecnologix s.r.l.
+
+OUI:70B3D51C5*
+ ID_OUI_FROM_DATABASE=ELSAG
+
+OUI:70B3D5635*
+ ID_OUI_FROM_DATABASE=Cosylab d.d.
+
+OUI:70B3D5D84*
+ ID_OUI_FROM_DATABASE=Sentry360
+
+OUI:70B3D575A*
+ ID_OUI_FROM_DATABASE=Standard Backhaul Communications
+
+OUI:70B3D5482*
+ ID_OUI_FROM_DATABASE=Aeryon Labs Inc
+
+OUI:70B3D5FBF*
+ ID_OUI_FROM_DATABASE=SenSys (Design Electronics Ltd)
+
+OUI:70B3D5825*
+ ID_OUI_FROM_DATABASE=TATTILE SRL
+
+OUI:70B3D5039*
+ ID_OUI_FROM_DATABASE=DoWoo Digitech
+
+OUI:70B3D527E*
+ ID_OUI_FROM_DATABASE=Mettler Toledo Hi Speed
+
+OUI:70B3D5D37*
+ ID_OUI_FROM_DATABASE=Sicon srl
+
+OUI:70B3D5F83*
+ ID_OUI_FROM_DATABASE=Tata Communications Ltd.
+
+OUI:70B3D560B*
+ ID_OUI_FROM_DATABASE=Edgeware AB
+
+OUI:70B3D50D9*
+ ID_OUI_FROM_DATABASE=Brechbuehler AG
+
+OUI:70B3D537C*
+ ID_OUI_FROM_DATABASE=Merus Power Dynamics Ltd.
+
+OUI:70B3D54CF*
+ ID_OUI_FROM_DATABASE=GREEN HOUSE CO., LTD.
+
+OUI:70B3D5EF8*
+ ID_OUI_FROM_DATABASE=DKS Dienstl.ges. f. Komm.anl. d. Stadt- u. Reg.verk. mbH
+
+OUI:70B3D5D58*
+ ID_OUI_FROM_DATABASE=Idyllic Engineering Pte Ltd
+
+OUI:70B3D5954*
+ ID_OUI_FROM_DATABASE=Dot System S.r.l.
+
+OUI:70B3D5880*
+ ID_OUI_FROM_DATABASE=Skopei B.V.
+
+OUI:70B3D5D40*
  ID_OUI_FROM_DATABASE=CRDE
 
-OUI:70B3D5F8D*
- ID_OUI_FROM_DATABASE=Flextronics Canafa Design Services
+OUI:70B3D551C*
+ ID_OUI_FROM_DATABASE=ATX Networks Corp
 
-OUI:70B3D59AE*
- ID_OUI_FROM_DATABASE=Volansys technologies pvt ltd
+OUI:70B3D5511*
+ ID_OUI_FROM_DATABASE=Next Sight srl
 
-OUI:70B3D542C*
- ID_OUI_FROM_DATABASE=D.Marchiori Srl
+OUI:70B3D5FBD*
+ ID_OUI_FROM_DATABASE=MB connect line GmbH Fernwartungssysteme
 
-OUI:70B3D5CE5*
- ID_OUI_FROM_DATABASE=GridBridge Inc
+OUI:70B3D5FA7*
+ ID_OUI_FROM_DATABASE=Nordson Corporation
 
-OUI:70B3D51EF*
- ID_OUI_FROM_DATABASE=ADTEK
+OUI:70B3D585E*
+ ID_OUI_FROM_DATABASE=XLOGIC srl
+
+OUI:70B3D531C*
+ ID_OUI_FROM_DATABASE=FINANCIERE DE L'OMBREE (eolane)
+
+OUI:70B3D5C41*
+ ID_OUI_FROM_DATABASE=Merlin CSI
+
+OUI:70B3D5902*
+ ID_OUI_FROM_DATABASE=Unlimiterhear co.,ltd. taiwan branch
+
+OUI:70B3D5AD1*
+ ID_OUI_FROM_DATABASE=Sensile Technologies SA
+
+OUI:70B3D5637*
+ ID_OUI_FROM_DATABASE=INEO-SENSE
+
+OUI:70B3D5397*
+ ID_OUI_FROM_DATABASE=Guangxi Hunter Information Industry Co.,Ltd
+
+OUI:70B3D5378*
+ ID_OUI_FROM_DATABASE=synchrotron SOLEIL
+
+OUI:70B3D57B2*
+ ID_OUI_FROM_DATABASE=Rail Power Systems GmbH
+
+OUI:70B3D5F12*
+ ID_OUI_FROM_DATABASE=Incoil Induktion AB
+
+OUI:70B3D5997*
+ ID_OUI_FROM_DATABASE=ProTom International
+
+OUI:70B3D5288*
+ ID_OUI_FROM_DATABASE=Bresslergroup
+
+OUI:70B3D54BE*
+ ID_OUI_FROM_DATABASE=GY-FX SAS
+
+OUI:70B3D510F*
+ ID_OUI_FROM_DATABASE=neQis
+
+OUI:70B3D598C*
+ ID_OUI_FROM_DATABASE=University of Wisconsin Madison - Department of High Energy Physics
+
+OUI:70B3D5E04*
+ ID_OUI_FROM_DATABASE=Combilent
+
+OUI:70B3D5022*
+ ID_OUI_FROM_DATABASE=Ravelin Ltd
+
+OUI:70B3D5135*
+ ID_OUI_FROM_DATABASE=DORLET SAU
+
+OUI:70B3D5FF1*
+ ID_OUI_FROM_DATABASE=Data Strategy Limited
+
+OUI:70B3D5002*
+ ID_OUI_FROM_DATABASE=Gogo BA
+
+OUI:70B3D50B0*
+ ID_OUI_FROM_DATABASE=Raven Systems Design, Inc
+
+OUI:70B3D5596*
+ ID_OUI_FROM_DATABASE=Mencom Corporation
+
+OUI:70B3D5138*
+ ID_OUI_FROM_DATABASE=SMITEC S.p.A.
+
+OUI:70B3D517A*
+ ID_OUI_FROM_DATABASE=Gencoa Ltd
+
+OUI:70B3D5C49*
+ ID_OUI_FROM_DATABASE=BTG Instruments AB
+
+OUI:70B3D530B*
+ ID_OUI_FROM_DATABASE=Ash Technologies
+
+OUI:70B3D56A6*
+ ID_OUI_FROM_DATABASE=WOW System
+
+OUI:70B3D5FEF*
+ ID_OUI_FROM_DATABASE=HANGZHOU HUALAN MICROELECTRONIQUE CO.,LTD
+
+OUI:70B3D5211*
+ ID_OUI_FROM_DATABASE=Fracarro srl
+
+OUI:70B3D560A*
+ ID_OUI_FROM_DATABASE=TATA POWER SED
+
+OUI:70B3D5129*
+ ID_OUI_FROM_DATABASE=OOO Microlink-Svyaz
+
+OUI:70B3D5479*
+ ID_OUI_FROM_DATABASE=LINEAGE POWER PVT LTD.,
+
+OUI:70B3D564C*
+ ID_OUI_FROM_DATABASE=ACEMIS FRANCE
+
+OUI:70B3D5763*
+ ID_OUI_FROM_DATABASE=A Trap, USA
+
+OUI:70B3D5175*
+ ID_OUI_FROM_DATABASE=Akribis Systems
+
+OUI:70B3D547F*
+ ID_OUI_FROM_DATABASE=ASE GmbH
+
+OUI:70B3D5DC9*
+ ID_OUI_FROM_DATABASE=Sensoterra BV
+
+OUI:70B3D5371*
+ ID_OUI_FROM_DATABASE=BEDEROV GmbH
+
+OUI:70B3D559C*
+ ID_OUI_FROM_DATABASE=DAVE SRL
+
+OUI:70B3D5C79*
+ ID_OUI_FROM_DATABASE=MB connect line GmbH Fernwartungssysteme
+
+OUI:70B3D5B04*
+ ID_OUI_FROM_DATABASE=Herrmann Datensysteme GmbH
+
+OUI:70B3D5229*
+ ID_OUI_FROM_DATABASE=CONTROL SYSTEMS Srl
+
+OUI:70B3D555E*
+ ID_OUI_FROM_DATABASE=BRS Sistemas Eletrônicos
+
+OUI:70B3D5EE3*
+ ID_OUI_FROM_DATABASE=Lithe Technology, LLC
+
+OUI:70B3D5D69*
+ ID_OUI_FROM_DATABASE=Thermo Fisher Scientific
+
+OUI:70B3D5FA0*
+ ID_OUI_FROM_DATABASE=TIAMA
+
+OUI:70B3D57DF*
+ ID_OUI_FROM_DATABASE=RDT Ltd
+
+OUI:70B3D508D*
+ ID_OUI_FROM_DATABASE=Clover Electronics Technology Co., Ltd.
+
+OUI:70B3D57D2*
+ ID_OUI_FROM_DATABASE=SDK Kristall
+
+OUI:70B3D5AF0*
+ ID_OUI_FROM_DATABASE=SEASON DESIGN TECHNOLOGY
+
+OUI:70B3D5D6C*
+ ID_OUI_FROM_DATABASE=GP Systems GmbH
+
+OUI:70B3D56AF*
+ ID_OUI_FROM_DATABASE=Sensorberg GmbH
+
+OUI:70B3D518E*
+ ID_OUI_FROM_DATABASE=NIPPON SEIKI CO., LTD.
+
+OUI:70B3D5C0C*
+ ID_OUI_FROM_DATABASE=Tech4Race
+
+OUI:70B3D55D8*
+ ID_OUI_FROM_DATABASE=LYNX Technik AG
+
+OUI:70B3D5374*
+ ID_OUI_FROM_DATABASE=OOO NPP Mars-Energo
+
+OUI:70B3D54A5*
+ ID_OUI_FROM_DATABASE=Intermind Inc.
+
+OUI:70B3D5C1D*
+ ID_OUI_FROM_DATABASE=Kranze Technology Solutions
+
+OUI:70B3D5CC3*
+ ID_OUI_FROM_DATABASE=Fidalia Networks Inc
+
+OUI:70B3D507F*
+ ID_OUI_FROM_DATABASE=Abalance Corporation
+
+OUI:70B3D56E8*
+ ID_OUI_FROM_DATABASE=Blu Wireless Technology Ltd
+
+OUI:70B3D5CD3*
+ ID_OUI_FROM_DATABASE=Controlrad
+
+OUI:70B3D54E5*
+ ID_OUI_FROM_DATABASE=viZaar industrial imaging AG
+
+OUI:70B3D5DE6*
+ ID_OUI_FROM_DATABASE=MB connect line GmbH Fernwartungssysteme
 
 OUI:70B3D58AB*
  ID_OUI_FROM_DATABASE=EMAC, Inc.
@@ -4028,9 +5546,6 @@ OUI:70B3D5EFB*
 OUI:70B3D5A81*
  ID_OUI_FROM_DATABASE=Sienda New Media Technologies GmbH
 
-OUI:70B3D5A1B*
- ID_OUI_FROM_DATABASE=Potter Electric Signal Co.
-
 OUI:70B3D5EAC*
  ID_OUI_FROM_DATABASE=Kentech Instruments Limited
 
@@ -4067,9 +5582,6 @@ OUI:70B3D5DCF*
 OUI:70B3D5A25*
  ID_OUI_FROM_DATABASE=PulseTor LLC
 
-OUI:70B3D5D3B*
- ID_OUI_FROM_DATABASE=NimbeLink Corp
-
 OUI:70B3D5882*
  ID_OUI_FROM_DATABASE=SIMON TECH, S.L.
 
@@ -4247,9 +5759,6 @@ OUI:70B3D53C2*
 OUI:70B3D5EF9*
  ID_OUI_FROM_DATABASE=Critical Link
 
-OUI:001BC50B2*
- ID_OUI_FROM_DATABASE=SKODA electric a.s.
-
 OUI:001BC50B6*
  ID_OUI_FROM_DATABASE=Veilux inc.
 
@@ -4523,6 +6032,90 @@ OUI:70B3D594F*
 OUI:70B3D5DFF*
  ID_OUI_FROM_DATABASE=Spanawave Corporation
 
+OUI:70B3D57B6*
+ ID_OUI_FROM_DATABASE=Amada Miyachi America Inc.
+
+OUI:70B3D555A*
+ ID_OUI_FROM_DATABASE=Sontay Ltd.
+
+OUI:70B3D511C*
+ ID_OUI_FROM_DATABASE=Samriddi Automations Pvt. Ltd.
+
+OUI:70B3D5CB2*
+ ID_OUI_FROM_DATABASE=SECLAB
+
+OUI:70B3D5A91*
+ ID_OUI_FROM_DATABASE=IDEAL INDUSTRIES Ltd t/a Casella
+
+OUI:70B3D5AE5*
+ ID_OUI_FROM_DATABASE=BeatCraft, Inc.
+
+OUI:70B3D51DD*
+ ID_OUI_FROM_DATABASE=RF CREATIONS LTD
+
+OUI:70B3D51DA*
+ ID_OUI_FROM_DATABASE=Promess Inc.
+
+OUI:70B3D555B*
+ ID_OUI_FROM_DATABASE=Procon Electronics Pty Ltd
+
+OUI:70B3D50AE*
+ ID_OUI_FROM_DATABASE=Norsat International Inc.
+
+OUI:70B3D5461*
+ ID_OUI_FROM_DATABASE=TESEC Corporation
+
+OUI:70B3D57FB*
+ ID_OUI_FROM_DATABASE=db Broadcast Products Ltd
+
+OUI:70B3D56FF*
+ ID_OUI_FROM_DATABASE=AKEO PLUS
+
+OUI:70B3D5CD2*
+ ID_OUI_FROM_DATABASE=HBH Microwave GmbH
+
+OUI:70B3D5B23*
+ ID_OUI_FROM_DATABASE=Supervision Test et Pilotage
+
+OUI:70B3D5178*
+ ID_OUI_FROM_DATABASE=Gamber Johnson-LLC
+
+OUI:70B3D5A5C*
+ ID_OUI_FROM_DATABASE=Molekule
+
+OUI:70B3D5012*
+ ID_OUI_FROM_DATABASE=KST technology
+
+OUI:70B3D5FEC*
+ ID_OUI_FROM_DATABASE=Finder SpA
+
+OUI:70B3D519E*
+ ID_OUI_FROM_DATABASE=J-Factor Embedded Technologies
+
+OUI:70B3D5A20*
+ ID_OUI_FROM_DATABASE=Design For Life Systems
+
+OUI:70B3D590A*
+ ID_OUI_FROM_DATABASE=Hangzhou SunTown Intelligent Science & Technology Co.,Ltd.
+
+OUI:70B3D51DB*
+ ID_OUI_FROM_DATABASE=Hudson Robotics
+
+OUI:70B3D55CC*
+ ID_OUI_FROM_DATABASE=Akse srl
+
+OUI:70B3D5973*
+ ID_OUI_FROM_DATABASE=Autonomic Controls, Inc.
+
+OUI:70B3D5083*
+ ID_OUI_FROM_DATABASE=ZAO ZEO
+
+OUI:70B3D542A*
+ ID_OUI_FROM_DATABASE=Critical Link LLC
+
+OUI:70B3D5C0F*
+ ID_OUI_FROM_DATABASE=Honeywell Safety Products USA, Inc
+
 OUI:70B3D565C*
  ID_OUI_FROM_DATABASE=Aplex Technology Inc.
 
@@ -4580,9 +6173,6 @@ OUI:70B3D5A4A*
 OUI:70B3D585B*
  ID_OUI_FROM_DATABASE=TSUBAKIMOTO CHAIN CO.
 
-OUI:70B3D56FF*
- ID_OUI_FROM_DATABASE=AKEO PLUS
-
 OUI:70B3D589B*
  ID_OUI_FROM_DATABASE=ControlWorks, Inc.
 
@@ -4592,62 +6182,371 @@ OUI:70B3D568F*
 OUI:70B3D55AB*
  ID_OUI_FROM_DATABASE=Sea Air and Land Communications Ltd
 
-OUI:70B3D5CD2*
- ID_OUI_FROM_DATABASE=HBH Microwave GmbH
+OUI:70B3D5CED*
+ ID_OUI_FROM_DATABASE=Advanced Products Corporation Pte Ltd
 
-OUI:70B3D5B23*
- ID_OUI_FROM_DATABASE=Supervision Test et Pilotage
+OUI:70B3D5DB0*
+ ID_OUI_FROM_DATABASE=Arnouse Digital Devices Corp
 
-OUI:70B3D5178*
- ID_OUI_FROM_DATABASE=Gamber Johnson-LLC
+OUI:70B3D5CCD*
+ ID_OUI_FROM_DATABASE=Suzhou PowerCore Technology Co.,Ltd.
 
-OUI:70B3D57B6*
- ID_OUI_FROM_DATABASE=Amada Miyachi America Inc.
+OUI:70B3D5163*
+ ID_OUI_FROM_DATABASE=BHARAT HEAVY ELECTRICALS LIMITED
 
-OUI:70B3D555A*
- ID_OUI_FROM_DATABASE=Sontay Ltd.
+OUI:70B3D5227*
+ ID_OUI_FROM_DATABASE=Montalvo
 
-OUI:70B3D5CB2*
- ID_OUI_FROM_DATABASE=SECLAB
+OUI:70B3D5910*
+ ID_OUI_FROM_DATABASE=Eginity, Inc.
 
-OUI:70B3D511C*
- ID_OUI_FROM_DATABASE=Samriddi Automations Pvt. Ltd.
+OUI:70B3D57D1*
+ ID_OUI_FROM_DATABASE=Schneider Electric Motion USA
 
-OUI:70B3D5AE5*
- ID_OUI_FROM_DATABASE=BeatCraft, Inc.
+OUI:70B3D570F*
+ ID_OUI_FROM_DATABASE=Alion Science & Technology
 
-OUI:70B3D5A91*
- ID_OUI_FROM_DATABASE=IDEAL INDUSTRIES Ltd t/a Casella
+OUI:70B3D5A1B*
+ ID_OUI_FROM_DATABASE=Potter Electric Signal Co. LLC
 
-OUI:70B3D51DD*
- ID_OUI_FROM_DATABASE=RF CREATIONS LTD
+OUI:70B3D5947*
+ ID_OUI_FROM_DATABASE=Checkbill Co,Ltd.
 
-OUI:70B3D50AE*
- ID_OUI_FROM_DATABASE=Norsat International Inc.
+OUI:70B3D5B77*
+ ID_OUI_FROM_DATABASE=Motec Pty Ltd
 
-OUI:70B3D51DA*
- ID_OUI_FROM_DATABASE=Promess Inc.
+OUI:70B3D5D9D*
+ ID_OUI_FROM_DATABASE=Electroimpact, Inc.
 
-OUI:70B3D555B*
- ID_OUI_FROM_DATABASE=Procon Electronics Pty Ltd
+OUI:70B3D5C6F*
+ ID_OUI_FROM_DATABASE=nyantec UG (haftungsbeschränkt)
 
-OUI:70B3D5461*
- ID_OUI_FROM_DATABASE=TESEC Corporation
+OUI:70B3D5475*
+ ID_OUI_FROM_DATABASE=EWATTCH
 
-OUI:70B3D57FB*
- ID_OUI_FROM_DATABASE=db Broadcast Products Ltd
+OUI:70B3D5F30*
+ ID_OUI_FROM_DATABASE=ADE Technology Inc.
 
-OUI:70B3D5CED*
- ID_OUI_FROM_DATABASE=Advanced Products Corporation Pte Ltd
+OUI:70B3D5F95*
+ ID_OUI_FROM_DATABASE=Get SAT
 
-OUI:70B3D5DB0*
+OUI:70B3D5457*
+ ID_OUI_FROM_DATABASE=Vivaldi Clima Srl
+
+OUI:70B3D5CD5*
+ ID_OUI_FROM_DATABASE=Apantac LLC
+
+OUI:70B3D511F*
+ ID_OUI_FROM_DATABASE=Geppetto Electronics
+
+OUI:70B3D5136*
+ ID_OUI_FROM_DATABASE=Miguel Corporate Services Pte Ltd
+
+OUI:70B3D5E1A*
+ ID_OUI_FROM_DATABASE=BIZERBA LUCEO
+
+OUI:70B3D55D5*
+ ID_OUI_FROM_DATABASE=CT Company
+
+OUI:70B3D5A1F*
+ ID_OUI_FROM_DATABASE=GlobalTest LLC
+
+OUI:70B3D58CA*
+ ID_OUI_FROM_DATABASE=Allied Data Systems
+
+OUI:70B3D5785*
+ ID_OUI_FROM_DATABASE=Density Inc.
+
+OUI:70B3D56B1*
+ ID_OUI_FROM_DATABASE=TTC TELEKOMUNIKACE, s.r.o.
+
+OUI:70B3D5BD5*
+ ID_OUI_FROM_DATABASE=Synics AG
+
+OUI:70B3D55C1*
+ ID_OUI_FROM_DATABASE=Shanghai JaWay Information Technology Co., Ltd.
+
+OUI:70B3D5BE9*
+ ID_OUI_FROM_DATABASE=Telecast Inc.
+
+OUI:70B3D5C62*
+ ID_OUI_FROM_DATABASE=WIZNOVA
+
+OUI:70B3D5D3B*
+ ID_OUI_FROM_DATABASE=NimbeLink Corp
+
+OUI:70B3D5FF4*
+ ID_OUI_FROM_DATABASE=Serveron Corporation
+
+OUI:70B3D5760*
+ ID_OUI_FROM_DATABASE=QUALITTEQ LLC
+
+OUI:70B3D5272*
+ ID_OUI_FROM_DATABASE=TELECOM SANTE
+
+OUI:70B3D520D*
+ ID_OUI_FROM_DATABASE=Engage Technologies
+
+OUI:70B3D5D55*
+ ID_OUI_FROM_DATABASE=WM Design s.r.o
+
+OUI:70B3D5E67*
+ ID_OUI_FROM_DATABASE=APPLIED PROCESSING
+
+OUI:70B3D5523*
+ ID_OUI_FROM_DATABASE=Tibit Communications
+
+OUI:70B3D5241*
+ ID_OUI_FROM_DATABASE=Bolide Technology Group, Inc.
+
+OUI:70B3D5D25*
+ ID_OUI_FROM_DATABASE=ENGenesis
+
+OUI:70B3D54A9*
+ ID_OUI_FROM_DATABASE=WARECUBE,INC
+
+OUI:70B3D52F8*
+ ID_OUI_FROM_DATABASE=Tunstall A/S
+
+OUI:70B3D50A3*
+ ID_OUI_FROM_DATABASE=Solace Systems Inc.
+
+OUI:70B3D5FC2*
+ ID_OUI_FROM_DATABASE=HUNTER LIBERTY CORPORATION
+
+OUI:70B3D561C*
+ ID_OUI_FROM_DATABASE=Earth Works
+
+OUI:70B3D56EA*
+ ID_OUI_FROM_DATABASE=Edgeware AB
+
+OUI:70B3D5A05*
+ ID_OUI_FROM_DATABASE=Transas Marine Limited
+
+OUI:70B3D5AA6*
+ ID_OUI_FROM_DATABASE=Proximus
+
+OUI:70B3D51D4*
+ ID_OUI_FROM_DATABASE=Brinkmann Audio GmbH
+
+OUI:70B3D55E5*
+ ID_OUI_FROM_DATABASE=HAIYANG OLIX CO.,LTD.
+
+OUI:70B3D5E2C*
+ ID_OUI_FROM_DATABASE=Fourth Frontier Technologies Private Limited
+
+OUI:70B3D55CA*
+ ID_OUI_FROM_DATABASE=ACD Elekronik GmbH
+
+OUI:70B3D5427*
+ ID_OUI_FROM_DATABASE=Key Chemical & Equipment Company
+
+OUI:70B3D5753*
+ ID_OUI_FROM_DATABASE=HCH. Kündig & CIE. AG
+
+OUI:70B3D5A18*
+ ID_OUI_FROM_DATABASE=Embedded Systems Lukasz Panasiuk
+
+OUI:70B3D50C2*
+ ID_OUI_FROM_DATABASE=LOOK EASY INTERNATIONAL LIMITED
+
+OUI:70B3D51DE*
+ ID_OUI_FROM_DATABASE=DYCEC, S.A.
+
+OUI:70B3D516C*
+ ID_OUI_FROM_DATABASE=OCEAN
+
+OUI:70B3D5778*
+ ID_OUI_FROM_DATABASE=Lumacron Technology Ltd.
+
+OUI:70B3D505D*
+ ID_OUI_FROM_DATABASE=KOMS Co.,Ltd.
+
+OUI:70B3D5EC8*
+ ID_OUI_FROM_DATABASE=Viko Elektrik-Elektronik A.Ş.
+
+OUI:70B3D53F0*
+ ID_OUI_FROM_DATABASE=Intervala
+
+OUI:70B3D5BD1*
+ ID_OUI_FROM_DATABASE=CableLabs
+
+OUI:70B3D5B1A*
+ ID_OUI_FROM_DATABASE=Aaronia AG
+
+OUI:70B3D5F0D*
+ ID_OUI_FROM_DATABASE=MeQ Inc.
+
+OUI:70B3D5215*
+ ID_OUI_FROM_DATABASE=Dataspeed Inc
+
+OUI:70B3D5115*
+ ID_OUI_FROM_DATABASE=Welltec Corp.
+
+OUI:70B3D5C45*
+ ID_OUI_FROM_DATABASE=Stiebel Eltron GmbH
+
+OUI:70B3D5B56*
+ ID_OUI_FROM_DATABASE=Power Electronics Espana, S.L.
+
+OUI:70B3D5911*
+ ID_OUI_FROM_DATABASE=Equatel
+
+OUI:70B3D5661*
+ ID_OUI_FROM_DATABASE=DesignA Electronics Limited
+
+OUI:70B3D5011*
+ ID_OUI_FROM_DATABASE=Sumer Data S.L
+
+OUI:70B3D52C2*
+ ID_OUI_FROM_DATABASE=Quantum Detectors
+
+OUI:70B3D5BF3*
+ ID_OUI_FROM_DATABASE=CG-WIRELESS
+
+OUI:70B3D59A1*
+ ID_OUI_FROM_DATABASE=ITS Industrial Turbine Services GmbH
+
+OUI:70B3D5861*
+ ID_OUI_FROM_DATABASE=KST technology
+
+OUI:70B3D5442*
+ ID_OUI_FROM_DATABASE=Blair Companies
+
+OUI:70B3D5C74*
+ ID_OUI_FROM_DATABASE=Qtechnology A/S
+
+OUI:70B3D5E16*
+ ID_OUI_FROM_DATABASE=China Entropy Co., Ltd.
+
+OUI:70B3D502E*
+ ID_OUI_FROM_DATABASE=Monnit Corporation
+
+OUI:70B3D5370*
+ ID_OUI_FROM_DATABASE=Inphi Corporation
+
+OUI:70B3D57E8*
+ ID_OUI_FROM_DATABASE=Mannkind Corporation
+
+OUI:70B3D53F3*
+ ID_OUI_FROM_DATABASE=SPEA SPA
+
+OUI:70B3D5549*
+ ID_OUI_FROM_DATABASE=Procon automatic systems GmbH
+
+OUI:70B3D5831*
  ID_OUI_FROM_DATABASE=Arnouse Digital Devices Corp
 
-OUI:70B3D5CCD*
- ID_OUI_FROM_DATABASE=Suzhou PowerCore Technology Co.,Ltd.
+OUI:70B3D5D8E*
+ ID_OUI_FROM_DATABASE=Axatel SrL
 
-OUI:70B3D5163*
- ID_OUI_FROM_DATABASE=BHARAT HEAVY ELECTRICALS LIMITED
+OUI:70B3D5A28*
+ ID_OUI_FROM_DATABASE=PEEK TRAFFIC
+
+OUI:70B3D5AC7*
+ ID_OUI_FROM_DATABASE=vivaMOS
+
+OUI:70B3D5DB2*
+ ID_OUI_FROM_DATABASE=Micro Electroninc Products
+
+OUI:70B3D5967*
+ ID_OUI_FROM_DATABASE=TATTILE SRL
+
+OUI:70B3D5C16*
+ ID_OUI_FROM_DATABASE=Southern Innovation
+
+OUI:70B3D590F*
+ ID_OUI_FROM_DATABASE=DTRON Communications (Pty) Ltd
+
+OUI:70B3D5E22*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:70B3D5408*
+ ID_OUI_FROM_DATABASE=Comrod AS
+
+OUI:70B3D5945*
+ ID_OUI_FROM_DATABASE=Symboticware Incorporated
+
+OUI:70B3D5D4D*
+ ID_OUI_FROM_DATABASE=The Morey Corporation
+
+OUI:70B3D5192*
+ ID_OUI_FROM_DATABASE=ASPT, INC.
+
+OUI:70B3D5807*
+ ID_OUI_FROM_DATABASE=Camsat Przemysław Gralak
+
+OUI:70B3D5DD1*
+ ID_OUI_FROM_DATABASE=em-tec GmbH
+
+OUI:70B3D5ED1*
+ ID_OUI_FROM_DATABASE=Przemyslowy Instytut Automatyki i Pomiarow
+
+OUI:70B3D514A*
+ ID_OUI_FROM_DATABASE=ExSens Technology (Pty) Ltd.
+
+OUI:70B3D5A69*
+ ID_OUI_FROM_DATABASE=Leviathan Solutions Ltd.
+
+OUI:70B3D5A9A*
+ ID_OUI_FROM_DATABASE=Amphenol Advanced Sensors
+
+OUI:70B3D5715*
+ ID_OUI_FROM_DATABASE=RIOT
+
+OUI:70B3D5FF8*
+ ID_OUI_FROM_DATABASE=Dutile, Glines and Higgins Corporation
+
+OUI:70B3D5413*
+ ID_OUI_FROM_DATABASE=Axess AG
+
+OUI:70B3D5E5E*
+ ID_OUI_FROM_DATABASE=Critical Link LLC
+
+OUI:70B3D5E7D*
+ ID_OUI_FROM_DATABASE=Nanjing Dandick Science&technology development co., LTD
+
+OUI:70B3D5D98*
+ ID_OUI_FROM_DATABASE=ACD Elekronik GmbH
+
+OUI:70B3D5FA6*
+ ID_OUI_FROM_DATABASE=RFL Electronics, Inc.
+
+OUI:70B3D5D43*
+ ID_OUI_FROM_DATABASE=EZSYS Co., Ltd.
+
+OUI:70B3D5A35*
+ ID_OUI_FROM_DATABASE=Sicon srl
+
+OUI:70B3D5359*
+ ID_OUI_FROM_DATABASE=Boutronic
+
+OUI:70B3D5279*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:001BC50B2*
+ ID_OUI_FROM_DATABASE=SKODA ELECTRIC a.s.
+
+OUI:70B3D5035*
+ ID_OUI_FROM_DATABASE=HKW-Elektronik GmbH
+
+OUI:70B3D5DFA*
+ ID_OUI_FROM_DATABASE=Newtouch Electronics (Shanghai) Co.,Ltd.
+
+OUI:70B3D5EC7*
+ ID_OUI_FROM_DATABASE=Neoptix Inc.
+
+OUI:70B3D55B8*
+ ID_OUI_FROM_DATABASE=Hella Gutmann Solutions GmbH
+
+OUI:70B3D5203*
+ ID_OUI_FROM_DATABASE=WOOJIN Inc
+
+OUI:70B3D5845*
+ ID_OUI_FROM_DATABASE=Harborside Technology
+
+OUI:70B3D52F4*
+ ID_OUI_FROM_DATABASE=Radixon s.r.o.
 
 OUI:1C8776D*
  ID_OUI_FROM_DATABASE=Qivivo
@@ -4907,9 +6806,6 @@ OUI:28FD803*
 OUI:E818635*
  ID_OUI_FROM_DATABASE=WETEK ELECTRONICS LIMITED
 
-OUI:E818632*
- ID_OUI_FROM_DATABASE=AVCON Information Technology Co.,Ltd
-
 OUI:B8D812D*
  ID_OUI_FROM_DATABASE=Lam Research
 
@@ -5027,9 +6923,6 @@ OUI:BC34007*
 OUI:B01F81D*
  ID_OUI_FROM_DATABASE=TAIWAN Anjie Electronics Co.,Ltd.
 
-OUI:7419F87*
- ID_OUI_FROM_DATABASE=Broadanet S.T.M
-
 OUI:A43BFA7*
  ID_OUI_FROM_DATABASE=Deatronic srl
 
@@ -5084,9 +6977,6 @@ OUI:78CA83E*
 OUI:38B8EBB*
  ID_OUI_FROM_DATABASE=ExaScaler Inc.
 
-OUI:38FDFEC*
- ID_OUI_FROM_DATABASE=New Garden Co., Ltd.
-
 OUI:38FDFE5*
  ID_OUI_FROM_DATABASE=CaptiveAire Systems Inc.
 
@@ -5171,9 +7061,6 @@ OUI:CCD31E3*
 OUI:D0D94F9*
  ID_OUI_FROM_DATABASE=Hangzhou xiaoben technology co.,Ltd
 
-OUI:D0D94F7*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:D0D94F0*
  ID_OUI_FROM_DATABASE=Perfant Technology Co., Ltd
 
@@ -5195,42 +7082,18 @@ OUI:283638A*
 OUI:CC1BE0F*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:F40E11F*
- ID_OUI_FROM_DATABASE=Private
-
-OUI:D07650F*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:E81863F*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:3C39E7F*
- ID_OUI_FROM_DATABASE=Private
-
-OUI:F80278F*
- ID_OUI_FROM_DATABASE=Private
-
-OUI:9802D8F*
- ID_OUI_FROM_DATABASE=Private
-
-OUI:90C682F*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:283638D*
  ID_OUI_FROM_DATABASE=APPEAK Technology System Co.Ltd.
 
-OUI:1CCAE3F*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:2836389*
  ID_OUI_FROM_DATABASE=Shenzhen  Zhi Hua  Creative Technology  Co., Ltd.
 
 OUI:B0C5CA7*
  ID_OUI_FROM_DATABASE=SHENZHEN KTC TECHNOLOGY GROUP
 
-OUI:283638E*
- ID_OUI_FROM_DATABASE=SCA Hygiene Products AB
-
 OUI:F0ACD73*
  ID_OUI_FROM_DATABASE=Med-Pat/Inn-Phone
 
@@ -5300,9 +7163,363 @@ OUI:4CE1737*
 OUI:4CE1739*
  ID_OUI_FROM_DATABASE=Shenzhen Evolution Dynamics Co., Ltd.
 
+OUI:1CC0E11*
+ ID_OUI_FROM_DATABASE=Hangzhou Kaierda Electric Welding Machine Co.,Ltd
+
+OUI:1CC0E15*
+ ID_OUI_FROM_DATABASE=Kids Wireless Inc
+
 OUI:1CC0E13*
  ID_OUI_FROM_DATABASE=HANGZHOU SOFTEL OPTIC CO., LTD
 
+OUI:1CC0E1E*
+ ID_OUI_FROM_DATABASE=Yun Yang Fire Safety Equipment Co.,Ltd.
+
+OUI:1CC0E1A*
+ ID_OUI_FROM_DATABASE=SECHERON SA
+
+OUI:1CC0E17*
+ ID_OUI_FROM_DATABASE=SHENZHEN KINSTONE D&T DEVELOP CO.,LTD
+
+OUI:4865EE0*
+ ID_OUI_FROM_DATABASE=DefPower Ltd
+
+OUI:4865EEC*
+ ID_OUI_FROM_DATABASE=DNV GL
+
+OUI:3C39E7F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:4865EE4*
+ ID_OUI_FROM_DATABASE=Mission Microwave Technologies, Inc
+
+OUI:244E7B2*
+ ID_OUI_FROM_DATABASE=RCC TIME CO .,LIMITED
+
+OUI:244E7B1*
+ ID_OUI_FROM_DATABASE=sonoscape
+
+OUI:244E7B7*
+ ID_OUI_FROM_DATABASE=Nanjing Wanlida Technology Co., Ltd.
+
+OUI:244E7B3*
+ ID_OUI_FROM_DATABASE=Shenzhen Ruixunyun Technology Co.,Ltd.
+
+OUI:244E7BB*
+ ID_OUI_FROM_DATABASE=Mighty Audio, Inc.
+
+OUI:7CCBE28*
+ ID_OUI_FROM_DATABASE=Polarteknik Oy
+
+OUI:7CCBE24*
+ ID_OUI_FROM_DATABASE=Ningbo bird sales co.,LTD
+
+OUI:7CCBE2D*
+ ID_OUI_FROM_DATABASE=optilink networks pvt ltd
+
+OUI:7419F87*
+ ID_OUI_FROM_DATABASE=Heptagon Systems PTY. LTD.
+
+OUI:500B91B*
+ ID_OUI_FROM_DATABASE=thumbzup UK Limited
+
+OUI:500B91C*
+ ID_OUI_FROM_DATABASE=Diamond Traffic Products, Inc
+
+OUI:500B915*
+ ID_OUI_FROM_DATABASE=jiangsu zhongling high-tech CO.,LTD.
+
+OUI:500B914*
+ ID_OUI_FROM_DATABASE=Sinope technologies Inc
+
+OUI:1CC0E14*
+ ID_OUI_FROM_DATABASE=Videri Inc.
+
+OUI:A4580F3*
+ ID_OUI_FROM_DATABASE=Engineered SA
+
+OUI:A4580FD*
+ ID_OUI_FROM_DATABASE=EYE IO, LLC
+
+OUI:40ED981*
+ ID_OUI_FROM_DATABASE=GuangZhou FiiO Electronics Technology Co.,Ltd
+
+OUI:40ED985*
+ ID_OUI_FROM_DATABASE=Cape
+
+OUI:34049E3*
+ ID_OUI_FROM_DATABASE=Nanjing Mythware Information Technology Co., Ltd.
+
+OUI:34049EA*
+ ID_OUI_FROM_DATABASE=i3 International Inc.
+
+OUI:50A4D06*
+ ID_OUI_FROM_DATABASE=PointGrab
+
+OUI:34049EE*
+ ID_OUI_FROM_DATABASE=ND SatCom GmbH
+
+OUI:50A4D05*
+ ID_OUI_FROM_DATABASE=TREXOM S.r.l.
+
+OUI:50A4D01*
+ ID_OUI_FROM_DATABASE=Beijing ANTVR Technology Co., LTD
+
+OUI:50A4D0A*
+ ID_OUI_FROM_DATABASE=Changsha SinoCare, Inc
+
+OUI:8CC8F4C*
+ ID_OUI_FROM_DATABASE=Shenzhen KSTAR Science and Technology Co., Ltd
+
+OUI:40F385D*
+ ID_OUI_FROM_DATABASE=Digital Bros S.p.A.
+
+OUI:40F3854*
+ ID_OUI_FROM_DATABASE=Embedded IQ
+
+OUI:40F3859*
+ ID_OUI_FROM_DATABASE=Fast Precision Technologies Co. Ltd.
+
+OUI:40F3850*
+ ID_OUI_FROM_DATABASE=SubPac
+
+OUI:1CA0D32*
+ ID_OUI_FROM_DATABASE=NovTech, Inc.
+
+OUI:38FDFEC*
+ ID_OUI_FROM_DATABASE=New Garden Co., Ltd.
+
+OUI:1CA0D3E*
+ ID_OUI_FROM_DATABASE=Exicom Tele-Systems Ltd.
+
+OUI:A411630*
+ ID_OUI_FROM_DATABASE=Adetel Equipment
+
+OUI:A411637*
+ ID_OUI_FROM_DATABASE=SHENZHEN YIWANJIA INFORMATION TECHNOLOGY CO.,LTD
+
+OUI:144FD72*
+ ID_OUI_FROM_DATABASE=FedEx Services OTI
+
+OUI:144FD79*
+ ID_OUI_FROM_DATABASE=Emerson Network Power (India) Pvt. Ltd.
+
+OUI:144FD7D*
+ ID_OUI_FROM_DATABASE=Shanghai B&A Technology Co., Ltd
+
+OUI:144FD73*
+ ID_OUI_FROM_DATABASE=Qingdao Wodatong Electronics Co., Ltd.
+
+OUI:98AAFC0*
+ ID_OUI_FROM_DATABASE=Dalian Eastern Display Co., Ltd.
+
+OUI:98AAFC9*
+ ID_OUI_FROM_DATABASE=BEAM Authentic
+
+OUI:98AAFCE*
+ ID_OUI_FROM_DATABASE=Comarch S.A.
+
+OUI:98AAFC8*
+ ID_OUI_FROM_DATABASE=Beijing Tiandi-Marco Electro-Hydraulic Control System Company Ltd.
+
+OUI:98AAFCC*
+ ID_OUI_FROM_DATABASE=dots Inc.
+
+OUI:08ED023*
+ ID_OUI_FROM_DATABASE=Jiangsu Logread Network Technology Co., LTD.
+
+OUI:08ED026*
+ ID_OUI_FROM_DATABASE=SANGO ELECTRONICS CO
+
+OUI:08ED024*
+ ID_OUI_FROM_DATABASE=Fio Corporation
+
+OUI:60D7E3D*
+ ID_OUI_FROM_DATABASE=Quantronix, Inc.
+
+OUI:60D7E36*
+ ID_OUI_FROM_DATABASE=Ameli s.r.l.
+
+OUI:60D7E3B*
+ ID_OUI_FROM_DATABASE=Nextivity
+
+OUI:60D7E30*
+ ID_OUI_FROM_DATABASE=Avalun
+
+OUI:F023B98*
+ ID_OUI_FROM_DATABASE=G3 TECHNOLOGIES< INC
+
+OUI:F023B9E*
+ ID_OUI_FROM_DATABASE=Domotz Ltd
+
+OUI:F023B92*
+ ID_OUI_FROM_DATABASE=Raysgem Electronics and Technology Co.Ltd
+
+OUI:F023B95*
+ ID_OUI_FROM_DATABASE=Audeara Pty. Ltd.
+
+OUI:8C147DC*
+ ID_OUI_FROM_DATABASE=Reynaers Aluminium
+
+OUI:8C147D0*
+ ID_OUI_FROM_DATABASE=Nio
+
+OUI:A0C5F26*
+ ID_OUI_FROM_DATABASE=ShenZhen JuWangShi Tech
+
+OUI:A0C5F22*
+ ID_OUI_FROM_DATABASE=Speedgoat GmbH
+
+OUI:A0C5F24*
+ ID_OUI_FROM_DATABASE=AiCare Corp.
+
+OUI:4C65A8A*
+ ID_OUI_FROM_DATABASE=Suzhou Embedded Electronic Technology Co., Ltd.
+
+OUI:F88A3C8*
+ ID_OUI_FROM_DATABASE=Cadmus Electronic Co.,Ltd.
+
+OUI:7CBACCB*
+ ID_OUI_FROM_DATABASE=Briowireless Inc.
+
+OUI:7CBACC3*
+ ID_OUI_FROM_DATABASE=Izkare
+
+OUI:F40E11F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:78D8001*
+ ID_OUI_FROM_DATABASE=Shenzhen Envicool Information Technology Co., Ltd
+
+OUI:78D8003*
+ ID_OUI_FROM_DATABASE=Shenzhen Scodeno Technology Co,. Ltd.
+
+OUI:78D8007*
+ ID_OUI_FROM_DATABASE=NimbeLink Corp
+
+OUI:78D800A*
+ ID_OUI_FROM_DATABASE=Insignal Co., Ltd.
+
+OUI:78D8008*
+ ID_OUI_FROM_DATABASE=Salunda Ltd
+
+OUI:78D800E*
+ ID_OUI_FROM_DATABASE=CL International
+
+OUI:28F5378*
+ ID_OUI_FROM_DATABASE=1MORE, INC.
+
+OUI:28F5379*
+ ID_OUI_FROM_DATABASE=Herbert Waldmann GmbH & Co. KG
+
+OUI:28F5375*
+ ID_OUI_FROM_DATABASE=Atomrock LLC
+
+OUI:1CCAE3F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:90C682F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:9802D8F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:F80278F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:D07650F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:28F537C*
+ ID_OUI_FROM_DATABASE=Matricx Singapore Pte Ltd
+
+OUI:28F537B*
+ ID_OUI_FROM_DATABASE=LogiM GmbH Software und Entwicklung
+
+OUI:E818632*
+ ID_OUI_FROM_DATABASE=AVCON Information Technology Co.,Ltd
+
+OUI:34298F6*
+ ID_OUI_FROM_DATABASE=Bellman & Symfon
+
+OUI:34298F5*
+ ID_OUI_FROM_DATABASE=Highlite International B.V.
+
+OUI:34298FC*
+ ID_OUI_FROM_DATABASE=Albert Handtmann Maschinenfabrik GmbH&Co.KG
+
+OUI:34298F8*
+ ID_OUI_FROM_DATABASE=Nanjing Sandemarine Electric Co.,Ltd
+
+OUI:189BA5A*
+ ID_OUI_FROM_DATABASE=SHENZHEN FIONEXX TECHNOLOGIES LTD.
+
+OUI:189BA57*
+ ID_OUI_FROM_DATABASE=Beijing Xinertel Technology Co., Ltd.
+
+OUI:904E915*
+ ID_OUI_FROM_DATABASE=mcf88 SRL
+
+OUI:904E917*
+ ID_OUI_FROM_DATABASE=IBM
+
+OUI:904E916*
+ ID_OUI_FROM_DATABASE=Nuwa Robotics (HK) Limited Taiwan Branch
+
+OUI:904E910*
+ ID_OUI_FROM_DATABASE=Spirtech
+
+OUI:2C279ED*
+ ID_OUI_FROM_DATABASE=Jiangsu JianHu Science & Technology Co., Ltd.
+
+OUI:904E91E*
+ ID_OUI_FROM_DATABASE=Shenzhen Cloudynamo Internet Technologies Co.,LTD.
+
+OUI:2C279E0*
+ ID_OUI_FROM_DATABASE=Changzhou WEBO Weighing Device & System CO.,LTD
+
+OUI:904E91D*
+ ID_OUI_FROM_DATABASE=SKODA ELECTRIC a.s.
+
+OUI:2C279EC*
+ ID_OUI_FROM_DATABASE=WAYCOM Technology Co.,Ltd
+
+OUI:283638E*
+ ID_OUI_FROM_DATABASE=SCA Hygiene Products AB
+
+OUI:2C279E2*
+ ID_OUI_FROM_DATABASE=Kunyi electronic technology (Shanghai) Co., Ltd.
+
+OUI:2C279E9*
+ ID_OUI_FROM_DATABASE=octoScope, Inc.
+
+OUI:D0D94F7*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:CC2237C*
+ ID_OUI_FROM_DATABASE=Hebei ZHSF Technology Co.,Ltd.
+
+OUI:CC2237A*
+ ID_OUI_FROM_DATABASE=shenzhen zonglian network technology limited
+
+OUI:CC22375*
+ ID_OUI_FROM_DATABASE=Beijing Safesoft Greatmaker Co.,ltd
+
+OUI:CC22378*
+ ID_OUI_FROM_DATABASE=Safilo S.p.A.
+
+OUI:741AE00*
+ ID_OUI_FROM_DATABASE=Huano International Technology Limited
+
+OUI:741AE07*
+ ID_OUI_FROM_DATABASE=BÄR Bahnsicherung AG
+
+OUI:741AE01*
+ ID_OUI_FROM_DATABASE=Socionext Inc.
+
+OUI:741AE0A*
+ ID_OUI_FROM_DATABASE=SAIERCOM CORPORATION
+
 OUI:1C8776C*
  ID_OUI_FROM_DATABASE=Strone Technology
 
@@ -5363,9 +7580,6 @@ OUI:CC1BE0B*
 OUI:CC1BE07*
  ID_OUI_FROM_DATABASE=Sichuan Dianjia network technology Co.Ltd.
 
-OUI:CC1BE00*
- ID_OUI_FROM_DATABASE=MICROTECH SYSTEM
-
 OUI:DC44270*
  ID_OUI_FROM_DATABASE=Suritel
 
@@ -5852,96 +8066,6 @@ OUI:8C192D3*
 OUI:8C192D1*
  ID_OUI_FROM_DATABASE=Shenzhen Huanuo Internet Technology Co.,Ltd
 
-OUI:D02212F*
- ID_OUI_FROM_DATABASE=Private
-
-OUI:100723F*
- ID_OUI_FROM_DATABASE=Private
-
-OUI:B0C5CAF*
- ID_OUI_FROM_DATABASE=Private
-
-OUI:2836383*
- ID_OUI_FROM_DATABASE=Sabinetek
-
-OUI:2836380*
- ID_OUI_FROM_DATABASE=Knowles Electronics LLC
-
-OUI:8C192D7*
- ID_OUI_FROM_DATABASE=SRETT
-
-OUI:7C70BCF*
- ID_OUI_FROM_DATABASE=Private
-
-OUI:A43BFAF*
- ID_OUI_FROM_DATABASE=Private
-
-OUI:B01F81F*
- ID_OUI_FROM_DATABASE=Private
-
-OUI:0055DAF*
- ID_OUI_FROM_DATABASE=Private
-
-OUI:2836381*
- ID_OUI_FROM_DATABASE=Panasonic System Solutions Europe
-
-OUI:F0ACD7B*
- ID_OUI_FROM_DATABASE=Zhejiang Makepower Electronics,Inc.
-
-OUI:84E0F48*
- ID_OUI_FROM_DATABASE=RAY Co.,LTD
-
-OUI:84E0F49*
- ID_OUI_FROM_DATABASE=SHENZHEN HCN.ELECTRONICS CO.,LTD.
-
-OUI:84E0F4A*
- ID_OUI_FROM_DATABASE=iSolution Technologies Co.,Ltd.
-
-OUI:70F8E74*
- ID_OUI_FROM_DATABASE=CLIP Inc.
-
-OUI:70F8E70*
- ID_OUI_FROM_DATABASE=SHENZHEN Xin JiuNing Electronics Co Ltd
-
-OUI:70F8E79*
- ID_OUI_FROM_DATABASE=Kontech Electronics Co., Ltd
-
-OUI:F81D78C*
- ID_OUI_FROM_DATABASE=SHENZHUOYUE TECHNOLOGY.,LTD
-
-OUI:70F8E71*
- ID_OUI_FROM_DATABASE=System Level Solutions (India) Pvt.
-
-OUI:F81D78A*
- ID_OUI_FROM_DATABASE=AVPro Global Holdings LLC
-
-OUI:383A21B*
- ID_OUI_FROM_DATABASE=Pactron
-
-OUI:383A214*
- ID_OUI_FROM_DATABASE=Dongguan Innovation Technology Co Ltd
-
-OUI:383A21A*
- ID_OUI_FROM_DATABASE=Foresight Sports
-
-OUI:383A218*
- ID_OUI_FROM_DATABASE=Alicat Scientific
-
-OUI:AC64DD1*
- ID_OUI_FROM_DATABASE=JSC InfoTeCS
-
-OUI:383A21E*
- ID_OUI_FROM_DATABASE=SDNware technology co.,LTD
-
-OUI:AC64DD4*
- ID_OUI_FROM_DATABASE=8Cups
-
-OUI:AC64DDC*
- ID_OUI_FROM_DATABASE=Beijing Hamigua Technology Co., Ltd.
-
-OUI:4CE1730*
- ID_OUI_FROM_DATABASE=Beijing Sutongwang E-Business Co., Ltd
-
 OUI:F0ACD72*
  ID_OUI_FROM_DATABASE=QUANTUM POWER SYSTEMS
 
@@ -5963,30 +8087,381 @@ OUI:C0D3916*
 OUI:C0D3912*
  ID_OUI_FROM_DATABASE=Hofon Automation Co.,Ltd
 
-OUI:C0D391B*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:84E0F40*
  ID_OUI_FROM_DATABASE=ShenZhen Panrich Technology Limited
 
+OUI:70F8E79*
+ ID_OUI_FROM_DATABASE=Kontech Electronics Co., Ltd
+
+OUI:70F8E70*
+ ID_OUI_FROM_DATABASE=SHENZHEN Xin JiuNing Electronics Co Ltd
+
+OUI:70F8E74*
+ ID_OUI_FROM_DATABASE=CLIP Inc.
+
+OUI:4CE173D*
+ ID_OUI_FROM_DATABASE=KTC(K-TEL)
+
+OUI:4865EE3*
+ ID_OUI_FROM_DATABASE=Data Technology Inc.
+
+OUI:4865EE1*
+ ID_OUI_FROM_DATABASE=Gopod Group Limited
+
+OUI:7CCBE26*
+ ID_OUI_FROM_DATABASE=SY Electronics Limited
+
+OUI:7CCBE2B*
+ ID_OUI_FROM_DATABASE=Easy Broadband Technology Co., Ltd.
+
+OUI:500B917*
+ ID_OUI_FROM_DATABASE=Shenzhen Xinfa Electronic Co.,ltd
+
+OUI:500B919*
+ ID_OUI_FROM_DATABASE=Machfu, Inc.
+
+OUI:500B913*
+ ID_OUI_FROM_DATABASE=EWIN TECHNOLOGY LIMITED
+
+OUI:A4580F5*
+ ID_OUI_FROM_DATABASE=CoAsia Microelectronics Corp.
+
+OUI:A4580FA*
+ ID_OUI_FROM_DATABASE=GUANGZHOU OPTICAL BRIDGE COMMUNICATION EQUIPMENT CO.,LTD.
+
+OUI:A4580FE*
+ ID_OUI_FROM_DATABASE=Finetree Communications Inc
+
+OUI:40ED980*
+ ID_OUI_FROM_DATABASE=Tsinghua Tongfang Co., LTD
+
+OUI:D02212F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:100723F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:2836383*
+ ID_OUI_FROM_DATABASE=Sabinetek
+
+OUI:2836380*
+ ID_OUI_FROM_DATABASE=Knowles Electronics LLC
+
+OUI:8C192D7*
+ ID_OUI_FROM_DATABASE=SRETT
+
+OUI:0055DAF*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:2836381*
+ ID_OUI_FROM_DATABASE=Panasonic System Solutions Europe
+
+OUI:F0ACD7B*
+ ID_OUI_FROM_DATABASE=Zhejiang Makepower Electronics,Inc.
+
+OUI:84E0F48*
+ ID_OUI_FROM_DATABASE=RAY Co.,LTD
+
+OUI:84E0F49*
+ ID_OUI_FROM_DATABASE=SHENZHEN HCN.ELECTRONICS CO.,LTD.
+
+OUI:84E0F4A*
+ ID_OUI_FROM_DATABASE=iSolution Technologies Co.,Ltd.
+
+OUI:F81D78C*
+ ID_OUI_FROM_DATABASE=SHENZHUOYUE TECHNOLOGY.,LTD
+
+OUI:70F8E71*
+ ID_OUI_FROM_DATABASE=System Level Solutions (India) Pvt.
+
+OUI:F81D78A*
+ ID_OUI_FROM_DATABASE=AVPro Global Holdings LLC
+
+OUI:383A21B*
+ ID_OUI_FROM_DATABASE=Pactron
+
+OUI:383A214*
+ ID_OUI_FROM_DATABASE=Dongguan Innovation Technology Co Ltd
+
+OUI:383A21A*
+ ID_OUI_FROM_DATABASE=Foresight Sports
+
+OUI:383A218*
+ ID_OUI_FROM_DATABASE=Alicat Scientific
+
+OUI:AC64DD1*
+ ID_OUI_FROM_DATABASE=JSC InfoTeCS
+
+OUI:383A21E*
+ ID_OUI_FROM_DATABASE=SDNware technology co.,LTD
+
+OUI:AC64DD4*
+ ID_OUI_FROM_DATABASE=8Cups
+
 OUI:AC64DD5*
  ID_OUI_FROM_DATABASE=SHANGHAI ZTE TECHNOLOGIES CO.,LTD
 
 OUI:AC64DD8*
  ID_OUI_FROM_DATABASE=PFDC ELANCYL
 
+OUI:AC64DDC*
+ ID_OUI_FROM_DATABASE=Beijing Hamigua Technology Co., Ltd.
+
 OUI:AC64DDE*
  ID_OUI_FROM_DATABASE=DIGIBIRD TECHNOLOGY CO., LTD.
 
-OUI:4CE1736*
- ID_OUI_FROM_DATABASE=CHINA CNR CORPORATION LIMITED DALIAN ELECTRIC TRACTION R&D CENTER
-
-OUI:4CE173D*
- ID_OUI_FROM_DATABASE=KTC(K-TEL)
+OUI:4CE1730*
+ ID_OUI_FROM_DATABASE=Beijing Sutongwang E-Business Co., Ltd
 
 OUI:4CE173E*
  ID_OUI_FROM_DATABASE=Plus One Japan Limited
 
+OUI:1CC0E12*
+ ID_OUI_FROM_DATABASE=Abbott Medical Optics Inc.
+
+OUI:4CE1736*
+ ID_OUI_FROM_DATABASE=DAIKOKU DENKI CO.,LTD.
+
+OUI:4865EE6*
+ ID_OUI_FROM_DATABASE=shenzhen sunflower technologies CO., LIMITED
+
+OUI:4865EE9*
+ ID_OUI_FROM_DATABASE=VideoStitch, Inc
+
+OUI:244E7B9*
+ ID_OUI_FROM_DATABASE=UniMAT Automation Technology Co., Ltd.
+
+OUI:4865EE5*
+ ID_OUI_FROM_DATABASE=Swistec Systems AG
+
+OUI:244E7BA*
+ ID_OUI_FROM_DATABASE=Shenzhen AWT science &  technology limited
+
+OUI:500B911*
+ ID_OUI_FROM_DATABASE=SPD Development Company Ltd
+
+OUI:A4580F0*
+ ID_OUI_FROM_DATABASE=INNOPRO
+
+OUI:A4580F4*
+ ID_OUI_FROM_DATABASE=Shenzhen City billion Leiden science and Technology Co., Ltd.
+
+OUI:40ED98B*
+ ID_OUI_FROM_DATABASE=Siebert Industrieelektronik GmbH
+
+OUI:40ED98A*
+ ID_OUI_FROM_DATABASE=Integrated Design Ltd
+
+OUI:34049ED*
+ ID_OUI_FROM_DATABASE=uikismart
+
+OUI:50A4D03*
+ ID_OUI_FROM_DATABASE=Guangzhou Hysoon Electronic Co., Ltd.
+
+OUI:50A4D07*
+ ID_OUI_FROM_DATABASE=Shanghai Pujiang Smart Card Systems Co., Ltd.
+
+OUI:8CC8F49*
+ ID_OUI_FROM_DATABASE=Swift Navigation Inc
+
+OUI:8CC8F41*
+ ID_OUI_FROM_DATABASE=Lanhomex Technology(Shen Zhen)Co.,Ltd.
+
+OUI:8CC8F4A*
+ ID_OUI_FROM_DATABASE=Trilux Group Management GmbH
+
+OUI:40F3856*
+ ID_OUI_FROM_DATABASE=Lennox International Incorporated
+
+OUI:40F3855*
+ ID_OUI_FROM_DATABASE=KATO ENGINEERING INC.
+
+OUI:1CA0D35*
+ ID_OUI_FROM_DATABASE=Dynamic Connect (Suzhou) Hi-Tech Electronic Co.,Ltd.
+
+OUI:1CA0D37*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:A411634*
+ ID_OUI_FROM_DATABASE=AlterG, Inc.
+
+OUI:1CA0D33*
+ ID_OUI_FROM_DATABASE=SAVELEC
+
+OUI:A411631*
+ ID_OUI_FROM_DATABASE=INTER CONTROL Hermann Köhler Elektrik GmbH & Co.KG
+
+OUI:144FD77*
+ ID_OUI_FROM_DATABASE=Shenzhen V-Streaming Technology Co., Ltd.
+
+OUI:144FD7A*
+ ID_OUI_FROM_DATABASE=Unirobot Corporation
+
+OUI:98AAFC1*
+ ID_OUI_FROM_DATABASE=SURTEC
+
+OUI:08ED028*
+ ID_OUI_FROM_DATABASE=HANTAS CO., LTD.
+
+OUI:08ED027*
+ ID_OUI_FROM_DATABASE=Eleven Engineering Incorporated
+
+OUI:08ED022*
+ ID_OUI_FROM_DATABASE=TES Touch Embedded Solutions Inc.
+
+OUI:08ED02E*
+ ID_OUI_FROM_DATABASE=Telstra Corporation Limited
+
+OUI:60D7E3C*
+ ID_OUI_FROM_DATABASE=Zhejiang Send Intelligent Technology,Ltd
+
+OUI:60D7E38*
+ ID_OUI_FROM_DATABASE=HindlePower, Inc
+
+OUI:60D7E3A*
+ ID_OUI_FROM_DATABASE=Wilderness Labs Inc.
+
+OUI:60D7E31*
+ ID_OUI_FROM_DATABASE=Elap s.r.l.
+
+OUI:04714B1*
+ ID_OUI_FROM_DATABASE=uAvionix Corporation
+
+OUI:04714B8*
+ ID_OUI_FROM_DATABASE=Energport Inc
+
+OUI:F023B94*
+ ID_OUI_FROM_DATABASE=EZVIS LIMITED
+
+OUI:F023B9A*
+ ID_OUI_FROM_DATABASE=annapurnalabs
+
+OUI:8C147D5*
+ ID_OUI_FROM_DATABASE=Unwired Networks
+
+OUI:8C147D2*
+ ID_OUI_FROM_DATABASE=Agilent S.p.A
+
+OUI:8C147DE*
+ ID_OUI_FROM_DATABASE=Electrical & Automation Larsen & Toubro Limited
+
+OUI:A0C5F29*
+ ID_OUI_FROM_DATABASE=Impulse Networks Pte Ltd
+
+OUI:A0C5F2B*
+ ID_OUI_FROM_DATABASE=Oray.com co., LTD.
+
+OUI:4C65A89*
+ ID_OUI_FROM_DATABASE=SHENZHEN LISAIER TRONICS CO.,LTD
+
+OUI:4C65A86*
+ ID_OUI_FROM_DATABASE=Nuviz Oy
+
+OUI:A0C5F23*
+ ID_OUI_FROM_DATABASE=Shenzhen Feima Robotics Technology Co.,Ltd
+
+OUI:7C70BCF*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:B01F81F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:7CBACC5*
+ ID_OUI_FROM_DATABASE=Fortem Technologies, Inc.
+
+OUI:78D8006*
+ ID_OUI_FROM_DATABASE=Alango Technologies Ltd
+
+OUI:78D800C*
+ ID_OUI_FROM_DATABASE=Shenzhen Chenzhuo Technology Co., Ltd.
+
+OUI:28F5374*
+ ID_OUI_FROM_DATABASE=Phyn LLC
+
+OUI:A43BFAF*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:28F5376*
+ ID_OUI_FROM_DATABASE=MyOmega Systems GmbH
+
+OUI:28F5377*
+ ID_OUI_FROM_DATABASE=Shenzhen Modern Cowboy Technology Co.,Ltd.
+
+OUI:28F537A*
+ ID_OUI_FROM_DATABASE=Honeywell Safety Products USA, Inc
+
+OUI:B0C5CAF*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:34008A4*
+ ID_OUI_FROM_DATABASE=Fotonic i Norden AB
+
+OUI:34008A7*
+ ID_OUI_FROM_DATABASE=uberGARD Pte. Ltd.
+
+OUI:34008A8*
+ ID_OUI_FROM_DATABASE=Shenzhen Andakai Technologies Co., Ltd.
+
+OUI:34008A0*
+ ID_OUI_FROM_DATABASE=Angee Technologies Ltd.
+
+OUI:34008AC*
+ ID_OUI_FROM_DATABASE=Shenzhen Eternal Idea Tech Co.,Ltd
+
+OUI:34298F0*
+ ID_OUI_FROM_DATABASE=BlackEdge Capital
+
+OUI:34298F1*
+ ID_OUI_FROM_DATABASE=Chengdu Meross Technology Co., Ltd.
+
+OUI:CC1BE00*
+ ID_OUI_FROM_DATABASE=Microtech System,Inc
+
+OUI:189BA56*
+ ID_OUI_FROM_DATABASE=Mantra Softech India Pvt Ltd
+
+OUI:189BA52*
+ ID_OUI_FROM_DATABASE=Airprotec
+
+OUI:189BA50*
+ ID_OUI_FROM_DATABASE=Dectris Ltd.
+
+OUI:189BA5B*
+ ID_OUI_FROM_DATABASE=Eutron SPA
+
+OUI:189BA58*
+ ID_OUI_FROM_DATABASE=Shenzhen Tong Tai Yi information Technology Co.,Ltd
+
+OUI:C0D391B*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:904E918*
+ ID_OUI_FROM_DATABASE=CommandScape, Inc.
+
+OUI:2C279E6*
+ ID_OUI_FROM_DATABASE=Rutledge Omni Services Pte Ltd
+
+OUI:CC22372*
+ ID_OUI_FROM_DATABASE=Apeiron Data Systems
+
+OUI:04714B2*
+ ID_OUI_FROM_DATABASE=Shenzhen WayOS Technology Crop., Ltd.
+
+OUI:741AE04*
+ ID_OUI_FROM_DATABASE=Revl Inc.
+
+OUI:741AE09*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:741AE0B*
+ ID_OUI_FROM_DATABASE=SHEN ZHEN YINGJIACHUANG ELECTRONICS TECHNOLOGY CO.,LTD.
+
+OUI:741AE05*
+ ID_OUI_FROM_DATABASE=FUJIAN TAILI COMMUNICATION TECHNOLOGY CO.,LTD
+
+OUI:741AE0C*
+ ID_OUI_FROM_DATABASE=bistos.co.ltd
+
 OUI:1C87765*
  ID_OUI_FROM_DATABASE=Zhuhai MYZR Technology Co.,Ltd
 
@@ -6275,9 +8750,6 @@ OUI:2C265F0*
 OUI:F80278D*
  ID_OUI_FROM_DATABASE=Dueton Systems s.r.o.
 
-OUI:0CEFAFB*
- ID_OUI_FROM_DATABASE=Hubei Century Network Technology Co .Ltd
-
 OUI:A44F291*
  ID_OUI_FROM_DATABASE=Olssen B.V.
 
@@ -6584,27 +9056,12 @@ OUI:8C192DC*
 OUI:8C192D9*
  ID_OUI_FROM_DATABASE=ViaWear, Inc.
 
-OUI:BC3400F*
- ID_OUI_FROM_DATABASE=Private
-
-OUI:7419F8F*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:1C21D1F*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:DC4427F*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:C88ED1F*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:80E4DAF*
- ID_OUI_FROM_DATABASE=Private
-
-OUI:885D90F*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:2836385*
  ID_OUI_FROM_DATABASE=CHARGELIB
 
@@ -6707,15 +9164,288 @@ OUI:AC64DDD*
 OUI:AC64DD0*
  ID_OUI_FROM_DATABASE=Jia-Teng
 
-OUI:4CE1731*
- ID_OUI_FROM_DATABASE=Datastorm Technologies Inc.
-
 OUI:4CE1733*
  ID_OUI_FROM_DATABASE=outpaceIO
 
 OUI:4CE173C*
  ID_OUI_FROM_DATABASE=REMONDE NETWORK
 
+OUI:1CC0E1B*
+ ID_OUI_FROM_DATABASE=Exigent Sensors
+
+OUI:1CC0E10*
+ ID_OUI_FROM_DATABASE=Shenzhen Highsharp Electronics Ltd.
+
+OUI:4865EE7*
+ ID_OUI_FROM_DATABASE=Venture Research Inc.
+
+OUI:4865EEB*
+ ID_OUI_FROM_DATABASE=EnBW Energie Baden-Württemberg AG
+
+OUI:244E7B0*
+ ID_OUI_FROM_DATABASE=Tekelek Europe Ltd
+
+OUI:500B912*
+ ID_OUI_FROM_DATABASE=annapurnalabs
+
+OUI:500B91A*
+ ID_OUI_FROM_DATABASE=New Audio LLC
+
+OUI:A4580F7*
+ ID_OUI_FROM_DATABASE=Changsha Tai Hui Network Technology Co.,Ltd
+
+OUI:A4580FB*
+ ID_OUI_FROM_DATABASE=ABB AB PGHV
+
+OUI:A4580F1*
+ ID_OUI_FROM_DATABASE=Stone Lock Global, Inc.
+
+OUI:40ED983*
+ ID_OUI_FROM_DATABASE=Knox Company
+
+OUI:40ED989*
+ ID_OUI_FROM_DATABASE=TeraTron GmbH
+
+OUI:40ED982*
+ ID_OUI_FROM_DATABASE=A-IOX INC.
+
+OUI:34049E4*
+ ID_OUI_FROM_DATABASE=Harbin Yantuo Science and Technology Development Co., Ltd
+
+OUI:34049E0*
+ ID_OUI_FROM_DATABASE=GoChip Inc.
+
+OUI:34049E2*
+ ID_OUI_FROM_DATABASE=EFD Induction
+
+OUI:34049E9*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:50A4D08*
+ ID_OUI_FROM_DATABASE=XinLian'AnBao(Beijing)Technology Co.,LTD.
+
+OUI:8CC8F40*
+ ID_OUI_FROM_DATABASE=Guardtec,Inc
+
+OUI:8CC8F46*
+ ID_OUI_FROM_DATABASE=SHENZHEN D-light Technolgy Limited
+
+OUI:8CC8F48*
+ ID_OUI_FROM_DATABASE=Strongbyte Solutions Limited
+
+OUI:8CC8F4E*
+ ID_OUI_FROM_DATABASE=Evaporcool Solutions
+
+OUI:40F385B*
+ ID_OUI_FROM_DATABASE=URMET Home & Building Solutions Pty Ltd
+
+OUI:40F3858*
+ ID_OUI_FROM_DATABASE=Teleepoch Ltd
+
+OUI:1CA0D3B*
+ ID_OUI_FROM_DATABASE=Guang Dong He Zheng Network Technology Co.,Ltd
+
+OUI:1CA0D3D*
+ ID_OUI_FROM_DATABASE=ERATO (HK) Corporation Limited
+
+OUI:1CA0D38*
+ ID_OUI_FROM_DATABASE=Desarrollos y Soluciones Guinea I+D S.L.
+
+OUI:1CA0D3A*
+ ID_OUI_FROM_DATABASE=DSM Messtechnik GmbH
+
+OUI:A411638*
+ ID_OUI_FROM_DATABASE=Dspread Technology (Beijing) Inc.
+
+OUI:A411639*
+ ID_OUI_FROM_DATABASE=accesso Technology Group
+
+OUI:A41163A*
+ ID_OUI_FROM_DATABASE=ISE GmbH
+
+OUI:4CE1731*
+ ID_OUI_FROM_DATABASE=Nexoforge Inc.
+
+OUI:A411635*
+ ID_OUI_FROM_DATABASE=Carbon, Inc.
+
+OUI:144FD70*
+ ID_OUI_FROM_DATABASE=annapurnalabs
+
+OUI:144FD75*
+ ID_OUI_FROM_DATABASE=FLS FINLAND OY
+
+OUI:144FD74*
+ ID_OUI_FROM_DATABASE=Red Technology Limited
+
+OUI:98AAFCD*
+ ID_OUI_FROM_DATABASE=MCS Micronic Computer Systeme GmbH
+
+OUI:98AAFC7*
+ ID_OUI_FROM_DATABASE=Shenzhen Hubsan Technology Co.,LTD.
+
+OUI:08ED02C*
+ ID_OUI_FROM_DATABASE=Guard RFID Solutions
+
+OUI:08ED021*
+ ID_OUI_FROM_DATABASE=Imperx, Inc
+
+OUI:60D7E34*
+ ID_OUI_FROM_DATABASE=Hemisphere GNSS
+
+OUI:60D7E37*
+ ID_OUI_FROM_DATABASE=Phase One A/S
+
+OUI:60D7E33*
+ ID_OUI_FROM_DATABASE=SKS Automaatio oy
+
+OUI:60D7E3E*
+ ID_OUI_FROM_DATABASE=HuBDIC CO.,LTD
+
+OUI:04714BB*
+ ID_OUI_FROM_DATABASE=DIGIBEST TECHNOLOGY CO., LTD.
+
+OUI:04714B6*
+ ID_OUI_FROM_DATABASE=Armstrong Fluid Technology
+
+OUI:04714B4*
+ ID_OUI_FROM_DATABASE=Apparatebau Gauting GmbH
+
+OUI:04714BE*
+ ID_OUI_FROM_DATABASE=Gimso Mobile Ltd
+
+OUI:F023B90*
+ ID_OUI_FROM_DATABASE=Aquametro AG
+
+OUI:F023B99*
+ ID_OUI_FROM_DATABASE=Emu Technology
+
+OUI:F023B91*
+ ID_OUI_FROM_DATABASE=Ubiant
+
+OUI:8C147D7*
+ ID_OUI_FROM_DATABASE=UrbanHello
+
+OUI:8C147D9*
+ ID_OUI_FROM_DATABASE=Anyware Solutions ApS
+
+OUI:A0C5F27*
+ ID_OUI_FROM_DATABASE=Viettronimex JSC
+
+OUI:A0C5F25*
+ ID_OUI_FROM_DATABASE=Tango Wave
+
+OUI:A0C5F2C*
+ ID_OUI_FROM_DATABASE=Glooko inc
+
+OUI:4C65A83*
+ ID_OUI_FROM_DATABASE=Roost
+
+OUI:4C65A8D*
+ ID_OUI_FROM_DATABASE=Qingping Technology (Beijing) Co., Ltd.
+
+OUI:F88A3C4*
+ ID_OUI_FROM_DATABASE=GO-LINK TECHNOLOGY CO., LTD.
+
+OUI:F88A3C0*
+ ID_OUI_FROM_DATABASE=ART SPA
+
+OUI:F88A3CE*
+ ID_OUI_FROM_DATABASE=Avateq Corp.
+
+OUI:F88A3CA*
+ ID_OUI_FROM_DATABASE=Protos GmbH
+
+OUI:7CBACC0*
+ ID_OUI_FROM_DATABASE=TGT Limited
+
+OUI:7CBACCA*
+ ID_OUI_FROM_DATABASE=annapurnalabs
+
+OUI:7CBACC4*
+ ID_OUI_FROM_DATABASE=Sun Asia Trade Co.
+
+OUI:885D90F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:BC3400F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:28F537D*
+ ID_OUI_FROM_DATABASE=Skyrockettoys LLC
+
+OUI:7419F8F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:80E4DAF*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:28F5373*
+ ID_OUI_FROM_DATABASE=PRIMETECH ENGINEERING CORP.
+
+OUI:34008A2*
+ ID_OUI_FROM_DATABASE=RPE Monitor
+
+OUI:0CEFAFB*
+ ID_OUI_FROM_DATABASE=Hubei Century Network Technology Co., Ltd
+
+OUI:34008AB*
+ ID_OUI_FROM_DATABASE=Project Engineering srl
+
+OUI:34298FA*
+ ID_OUI_FROM_DATABASE=Virtual Trunk Pte Ltd
+
+OUI:DC4427F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:189BA5C*
+ ID_OUI_FROM_DATABASE=Christ Electronic System GmbH
+
+OUI:189BA59*
+ ID_OUI_FROM_DATABASE=APANA Inc.
+
+OUI:189BA51*
+ ID_OUI_FROM_DATABASE=ChengDu Vantron Technology, Ltd.
+
+OUI:189BA5D*
+ ID_OUI_FROM_DATABASE=legendsky tech
+
+OUI:904E911*
+ ID_OUI_FROM_DATABASE=Apollo Video Technology
+
+OUI:904E91B*
+ ID_OUI_FROM_DATABASE=Shanghai JaWay Information Technology Co., Ltd.
+
+OUI:904E912*
+ ID_OUI_FROM_DATABASE=North Pole Engineering, Inc.
+
+OUI:2C279E3*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:2C279EA*
+ ID_OUI_FROM_DATABASE=Exegy Inc
+
+OUI:2C279E1*
+ ID_OUI_FROM_DATABASE=Electronique Bluewave Inc.
+
+OUI:2C279E8*
+ ID_OUI_FROM_DATABASE=Institut Dr. Foerster GmbH & Co. KG
+
+OUI:CC2237D*
+ ID_OUI_FROM_DATABASE=SHENZHEN HOOENERGY TECHNOLOGY CO.,LTD
+
+OUI:CC22371*
+ ID_OUI_FROM_DATABASE=Terma Sp. z o.o.
+
+OUI:CC2237B*
+ ID_OUI_FROM_DATABASE=Tolomatic, Inc.
+
+OUI:AC1DDF6*
+ ID_OUI_FROM_DATABASE=Shenzheng SenseTime Technology Co. Ltd
+
+OUI:741AE02*
+ ID_OUI_FROM_DATABASE=NURA HOLDINGS PTY LTD
+
 OUI:1C8776B*
  ID_OUI_FROM_DATABASE=Hekatron Vertriebs GmbH
 
@@ -7211,9 +9941,6 @@ OUI:38B8EB1*
 OUI:38B8EBA*
  ID_OUI_FROM_DATABASE=SECAD SA
 
-OUI:38B8EB7*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:38FDFE6*
  ID_OUI_FROM_DATABASE=Inspero Inc
 
@@ -7322,6 +10049,90 @@ OUI:7C477CA*
 OUI:1C87760*
  ID_OUI_FROM_DATABASE=Dspread Technology (Beijing) Inc.
 
+OUI:F0ACD70*
+ ID_OUI_FROM_DATABASE=Guilin glsun Science and Tech Co.,LTD
+
+OUI:F0ACD7E*
+ ID_OUI_FROM_DATABASE=Fiziico Co., Ltd.
+
+OUI:58E8761*
+ ID_OUI_FROM_DATABASE=Beijing Perabytes IS Technology Co., Ltd
+
+OUI:C0D3914*
+ ID_OUI_FROM_DATABASE=Vernier Software & Technology
+
+OUI:C0D3919*
+ ID_OUI_FROM_DATABASE=xxter bv
+
+OUI:C0D391E*
+ ID_OUI_FROM_DATABASE=SAMSARA NETWORKS INC
+
+OUI:84E0F4D*
+ ID_OUI_FROM_DATABASE=Logos01 Srl
+
+OUI:70F8E7E*
+ ID_OUI_FROM_DATABASE=CUAV
+
+OUI:70F8E73*
+ ID_OUI_FROM_DATABASE=Dr. Simon Consulting GmbH
+
+OUI:F81D783*
+ ID_OUI_FROM_DATABASE=SHANGHAI SUN TELECOMMUNICATION CO., LTD.
+
+OUI:383A210*
+ ID_OUI_FROM_DATABASE=R3C Information(Shenzhen) Co.,Ltd.
+
+OUI:383A213*
+ ID_OUI_FROM_DATABASE=Shanghai Greatwall Safety System Co.,Ltd
+
+OUI:AC64DD7*
+ ID_OUI_FROM_DATABASE=Wittmann Kunststoffgeräte GmbH
+
+OUI:4CE1734*
+ ID_OUI_FROM_DATABASE=Huizhou Dehong Technology Co., Ltd.
+
+OUI:4CE173A*
+ ID_OUI_FROM_DATABASE=jvi
+
+OUI:1CC0E19*
+ ID_OUI_FROM_DATABASE=Ospicon Company Limited
+
+OUI:4865EE2*
+ ID_OUI_FROM_DATABASE=CaptionCall
+
+OUI:4865EEE*
+ ID_OUI_FROM_DATABASE=CNU
+
+OUI:4865EED*
+ ID_OUI_FROM_DATABASE=Winn Technology Co.,Ltd
+
+OUI:244E7BC*
+ ID_OUI_FROM_DATABASE=CHUNGHSIN TECHNOLOGY GROUP CO.,LTD
+
+OUI:7CCBE29*
+ ID_OUI_FROM_DATABASE=Hangzhou Haohaokaiche Technology Co.,Ltd.
+
+OUI:7CCBE2C*
+ ID_OUI_FROM_DATABASE=mirakonta s.l.
+
+OUI:7CCBE23*
+ ID_OUI_FROM_DATABASE=Astrum Technologies CC
+
+OUI:244E7BD*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:500B91D*
+ ID_OUI_FROM_DATABASE=Shenzhen Lucky Sonics Co .,Ltd
+
+OUI:7CCBE2E*
+ ID_OUI_FROM_DATABASE=Aplex Technology Inc.
+
+OUI:A4580F2*
+ ID_OUI_FROM_DATABASE=BLOKS. GmbH
+
+OUI:40ED986*
+ ID_OUI_FROM_DATABASE=Shanghai Broadwan Communications Co.,Ltd
+
 OUI:8C192D5*
  ID_OUI_FROM_DATABASE=ELCO(TIANJIN)ELECTRONICS CO.,LTD.
 
@@ -7331,125 +10142,347 @@ OUI:8C192DA*
 OUI:A03E6BF*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:58FCDBF*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:283638C*
  ID_OUI_FROM_DATABASE=Swisson AG
 
-OUI:E4956EF*
+OUI:74E14AF*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:74F8DBF*
+OUI:B8D812F*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:BC6641F*
+OUI:2836388*
+ ID_OUI_FROM_DATABASE=Havells India Limited
+
+OUI:84E0F44*
+ ID_OUI_FROM_DATABASE=PetroInTrade
+
+OUI:84E0F43*
+ ID_OUI_FROM_DATABASE=ASL Intercom B.V.
+
+OUI:1C88798*
+ ID_OUI_FROM_DATABASE=Toshiba Toko Meter Systems Co., LTD.
+
+OUI:70F8E7C*
+ ID_OUI_FROM_DATABASE=Fixstars Corporation
+
+OUI:F81D78D*
+ ID_OUI_FROM_DATABASE=Tofino
+
+OUI:F81D787*
+ ID_OUI_FROM_DATABASE=WUHAN GUIDE INFRARED CO.,LTD
+
+OUI:F81D789*
+ ID_OUI_FROM_DATABASE=Ophrys Systèmes
+
+OUI:383A21D*
+ ID_OUI_FROM_DATABASE=Colooc AB
+
+OUI:AC64DD9*
+ ID_OUI_FROM_DATABASE=Micro Connect Pty Ltd
+
+OUI:AC64DD3*
+ ID_OUI_FROM_DATABASE=infypower Co., Ltd
+
+OUI:4865EE8*
+ ID_OUI_FROM_DATABASE=SmartDisplayer Technology Co., Ltd.
+
+OUI:244E7B4*
+ ID_OUI_FROM_DATABASE=Leshi Internet Information & Technology (Beijing) Corp.
+
+OUI:244E7B6*
+ ID_OUI_FROM_DATABASE=Owasys Advanced Wireless Devices
+
+OUI:244E7BE*
+ ID_OUI_FROM_DATABASE=WithWin Technology ShenZhen CO.,LTD
+
+OUI:244E7B5*
+ ID_OUI_FROM_DATABASE=Jiangsu Xuanbo Electronic Technologies Co.,Ltd
+
+OUI:7CCBE25*
+ ID_OUI_FROM_DATABASE=DTECH Labs, Inc.
+
+OUI:7CCBE27*
+ ID_OUI_FROM_DATABASE=Hangzhou Kaicom Communication Co.,Ltd
+
+OUI:A4580F8*
+ ID_OUI_FROM_DATABASE=AIR LIQUIDE MEDICAL SYSTEMS
+
+OUI:40ED98C*
+ ID_OUI_FROM_DATABASE=BloomSky,Inc.
+
+OUI:40ED98E*
+ ID_OUI_FROM_DATABASE=BORDA TECHNOLOGY
+
+OUI:34049E6*
+ ID_OUI_FROM_DATABASE=Life Interface Co., Ltd.
+
+OUI:34049E1*
+ ID_OUI_FROM_DATABASE=Connected IO Inc.
+
+OUI:34049EB*
+ ID_OUI_FROM_DATABASE=Eginity, Inc.
+
+OUI:34049E5*
+ ID_OUI_FROM_DATABASE=Seeiner Technology Co.,LTD
+
+OUI:34049EC*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:74E14AF*
+OUI:50A4D09*
+ ID_OUI_FROM_DATABASE=OEM PRODUCTION INC.
+
+OUI:50A4D00*
+ ID_OUI_FROM_DATABASE=TRAXENS
+
+OUI:50A4D02*
+ ID_OUI_FROM_DATABASE=Seneco A/S
+
+OUI:8CC8F42*
+ ID_OUI_FROM_DATABASE=Dark Horse Connect LLC
+
+OUI:8CC8F4B*
+ ID_OUI_FROM_DATABASE=PTYPE Co., LTD.
+
+OUI:8CC8F45*
+ ID_OUI_FROM_DATABASE=Beijing KXWELL Technology CO., LTD
+
+OUI:8CC8F43*
+ ID_OUI_FROM_DATABASE=TOHO DENKI IND.CO.,LTD
+
+OUI:40F385A*
+ ID_OUI_FROM_DATABASE=Creanord
+
+OUI:40F3857*
+ ID_OUI_FROM_DATABASE=PALAZZETTI LELIO SPA
+
+OUI:1CA0D34*
+ ID_OUI_FROM_DATABASE=NPO TELECOM JSC
+
+OUI:1CA0D30*
+ ID_OUI_FROM_DATABASE=OOO Tekhnotronika
+
+OUI:1CA0D3C*
+ ID_OUI_FROM_DATABASE=LYT inc.
+
+OUI:1CA0D39*
+ ID_OUI_FROM_DATABASE=Cirque Audio Technology Co., Ltd
+
+OUI:1CA0D31*
+ ID_OUI_FROM_DATABASE=Jabil circuit italia srl
+
+OUI:A41163B*
+ ID_OUI_FROM_DATABASE=Moog Music Inc.
+
+OUI:A41163D*
+ ID_OUI_FROM_DATABASE=SHENZHEN ZHISHI TECHNOLOGY CO., LTD.
+
+OUI:A411632*
+ ID_OUI_FROM_DATABASE=Allgo Tech. (Beijing) Co.,Ltd
+
+OUI:144FD7C*
+ ID_OUI_FROM_DATABASE=D&S Cable Industries (HK) Limited
+
+OUI:144FD7B*
+ ID_OUI_FROM_DATABASE=Arkus-ST Ltd
+
+OUI:98AAFCA*
+ ID_OUI_FROM_DATABASE=SENKO Co.,Ltd.
+
+OUI:98AAFC6*
+ ID_OUI_FROM_DATABASE=Mekotronics Co., Ltd
+
+OUI:08ED029*
+ ID_OUI_FROM_DATABASE=Savox Communications
+
+OUI:08ED02B*
+ ID_OUI_FROM_DATABASE=Szok Energy and Communication Co., Ltd.
+
+OUI:60D7E39*
+ ID_OUI_FROM_DATABASE=LongSung Technology (Shanghai) Co.,Ltd.
+
+OUI:04714BC*
+ ID_OUI_FROM_DATABASE=KittyHawk Corporation
+
+OUI:04714B7*
+ ID_OUI_FROM_DATABASE=Omylis Pte Ltd
+
+OUI:04714B5*
+ ID_OUI_FROM_DATABASE=Bureau Electronique Appliquee
+
+OUI:04714B0*
+ ID_OUI_FROM_DATABASE=Neurio Technology Inc.
+
+OUI:F023B9B*
+ ID_OUI_FROM_DATABASE=Q Core Medical Ltd
+
+OUI:F023B9D*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:B8D812F*
+OUI:F023B96*
+ ID_OUI_FROM_DATABASE=Xiamen Jinhaode Electronic Co.,Ltd
+
+OUI:F023B9C*
+ ID_OUI_FROM_DATABASE=Shenzhen Lachesis Mhealth Co., Ltd.
+
+OUI:8C147DA*
+ ID_OUI_FROM_DATABASE=Bluemega Document & Print Services
+
+OUI:8C147D1*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:2C265FF*
+OUI:8C147DB*
+ ID_OUI_FROM_DATABASE=Bausch Datacom NV/SA
+
+OUI:A0C5F2D*
+ ID_OUI_FROM_DATABASE=UnaliWear, Inc.
+
+OUI:A0C5F20*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:2C6A6FF*
+OUI:A0C5F2E*
+ ID_OUI_FROM_DATABASE=Synapsys Solutions Ltd.
+
+OUI:4C65A88*
+ ID_OUI_FROM_DATABASE=Instant Byte, S.L.
+
+OUI:4C65A82*
+ ID_OUI_FROM_DATABASE=Orica Europe Pty Ltd & Co KG
+
+OUI:4C65A84*
+ ID_OUI_FROM_DATABASE=Plus One Japan Limited
+
+OUI:4C65A8C*
+ ID_OUI_FROM_DATABASE=Fuse
+
+OUI:F88A3C7*
+ ID_OUI_FROM_DATABASE=Josh.ai
+
+OUI:F88A3C1*
+ ID_OUI_FROM_DATABASE=Carefree of Colorado
+
+OUI:F88A3C5*
+ ID_OUI_FROM_DATABASE=KOKKIA INC
+
+OUI:F88A3C9*
+ ID_OUI_FROM_DATABASE=withus
+
+OUI:7CBACCC*
+ ID_OUI_FROM_DATABASE=Flying Loft Inc.
+
+OUI:7CBACCD*
+ ID_OUI_FROM_DATABASE=SIGMA-ELEKTRO GmbH
+
+OUI:7CBACC2*
+ ID_OUI_FROM_DATABASE=Maco Lighting Pty. Ltd.
+
+OUI:7CBACC9*
+ ID_OUI_FROM_DATABASE=Yongguan Electronic Technology (D.G)LTD
+
+OUI:74F8DBF*
  ID_OUI_FROM_DATABASE=Private
 
+OUI:7CBACCE*
+ ID_OUI_FROM_DATABASE=ALPHA TECHNOLOGIES, LLC
+
+OUI:78D8009*
+ ID_OUI_FROM_DATABASE=SightLine Applications
+
+OUI:78D8005*
+ ID_OUI_FROM_DATABASE=Björkviks Consulting AB
+
+OUI:78D8002*
+ ID_OUI_FROM_DATABASE=Shanghai Espacetime Technology Co.,Ltd.
+
+OUI:28F5372*
+ ID_OUI_FROM_DATABASE=Unicair Communication Tec Co., Ltd.
+
+OUI:78D8000*
+ ID_OUI_FROM_DATABASE=Kverneland Group Mechatronics
+
+OUI:28F5371*
+ ID_OUI_FROM_DATABASE=Umojo
+
 OUI:64FB81F*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:28FD80F*
+OUI:58FCDBF*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:A0BB3EF*
+OUI:2C265FF*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:2CD141F*
+OUI:28FD80F*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:2836388*
- ID_OUI_FROM_DATABASE=Havells India Limited
-
-OUI:84E0F44*
- ID_OUI_FROM_DATABASE=PetroInTrade
+OUI:2CD141F*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:84E0F43*
- ID_OUI_FROM_DATABASE=ASL Intercom B.V.
+OUI:2C6A6FF*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:1C88798*
- ID_OUI_FROM_DATABASE=Toshiba Toko Meter Systems Co., LTD.
+OUI:A0BB3EF*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:383A210*
- ID_OUI_FROM_DATABASE=R3C Information(Shenzhen) Co.,Ltd.
+OUI:BC6641F*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:4CE1734*
- ID_OUI_FROM_DATABASE=Huizhou Dehong Technology Co., Ltd.
+OUI:34008AA*
+ ID_OUI_FROM_DATABASE=Hibertek International Limited
 
-OUI:4CE173A*
- ID_OUI_FROM_DATABASE=jvi
+OUI:34008A6*
+ ID_OUI_FROM_DATABASE=Sithon Technologies SAS
 
-OUI:F0ACD70*
- ID_OUI_FROM_DATABASE=Guilin glsun Science and Tech Co.,LTD
+OUI:34298FD*
+ ID_OUI_FROM_DATABASE=Keystone Electronic Solutions
 
-OUI:F0ACD7E*
- ID_OUI_FROM_DATABASE=Fiziico Co., Ltd.
+OUI:34298F7*
+ ID_OUI_FROM_DATABASE=Dongguan Kingtron Electronics Tech Co., Ltd
 
 OUI:58E8760*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:58E8761*
- ID_OUI_FROM_DATABASE=Beijing Perabytes IS Technology Co., Ltd
-
-OUI:C0D3914*
- ID_OUI_FROM_DATABASE=Vernier Software & Technology
-
-OUI:C0D3919*
- ID_OUI_FROM_DATABASE=xxter bv
-
-OUI:C0D391E*
- ID_OUI_FROM_DATABASE=SAMSARA NETWORKS INC
+OUI:34298FE*
+ ID_OUI_FROM_DATABASE=ARC Technology Co., Ltd
 
-OUI:84E0F4D*
- ID_OUI_FROM_DATABASE=Logos01 Srl
+OUI:189BA53*
+ ID_OUI_FROM_DATABASE=PHINETWORKS
 
-OUI:70F8E7E*
- ID_OUI_FROM_DATABASE=CUAV
+OUI:189BA55*
+ ID_OUI_FROM_DATABASE=Starfire Industries LLC
 
-OUI:70F8E73*
- ID_OUI_FROM_DATABASE=Dr. Simon Consulting GmbH
+OUI:E4956EF*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:70F8E7C*
- ID_OUI_FROM_DATABASE=Fixstars Corporation
+OUI:189BA5E*
+ ID_OUI_FROM_DATABASE=Taiwan Name Plate Co.,LTD
 
-OUI:F81D783*
- ID_OUI_FROM_DATABASE=SHANGHAI SUN TELECOMMUNICATION CO., LTD.
+OUI:904E914*
+ ID_OUI_FROM_DATABASE=Wrtnode technology Inc.
 
-OUI:F81D78D*
- ID_OUI_FROM_DATABASE=Tofino
+OUI:2C279E4*
+ ID_OUI_FROM_DATABASE=Shijiazhuang King Transportation Equipment Co.,Ltd
 
-OUI:F81D787*
- ID_OUI_FROM_DATABASE=WUHAN GUIDE INFRARED CO.,LTD
+OUI:2C279E5*
+ ID_OUI_FROM_DATABASE=AudioNord Distribution A/S
 
-OUI:F81D789*
- ID_OUI_FROM_DATABASE=Ophrys Systèmes
+OUI:38B8EB7*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:383A21D*
- ID_OUI_FROM_DATABASE=Colooc AB
+OUI:CC22377*
+ ID_OUI_FROM_DATABASE=Shanghai Doit IOT Technology Co.,Ltd.
 
-OUI:383A213*
- ID_OUI_FROM_DATABASE=Shanghai Greatwall Safety System Co.,Ltd
+OUI:34298FB*
+ ID_OUI_FROM_DATABASE=Schnick-Schnack-Systems GmbH
 
-OUI:AC64DD7*
- ID_OUI_FROM_DATABASE=Wittmann Kunststoffgeräte GmbH
+OUI:741AE0D*
+ ID_OUI_FROM_DATABASE=Voltaware Services Limited
 
-OUI:AC64DD9*
- ID_OUI_FROM_DATABASE=Micro Connect Pty Ltd
+OUI:741AE0E*
+ ID_OUI_FROM_DATABASE=ITS Partner (O.B.S) S.L.
 
-OUI:AC64DD3*
- ID_OUI_FROM_DATABASE=infypower Co., Ltd
+OUI:AC1DDF5*
+ ID_OUI_FROM_DATABASE=Shenzhen Ouzheng Electronic Tech Co,.Ltd
 
 OUI:1C87740*
  ID_OUI_FROM_DATABASE=Philips Personal Health Solutions
@@ -7763,9 +10796,6 @@ OUI:D022128*
 OUI:100723B*
  ID_OUI_FROM_DATABASE=Fujian Quanzhou Dong Ang Electronics Co., Ltd.
 
-OUI:100723C*
- ID_OUI_FROM_DATABASE=SHENZHEN XINFA ELECTRONIC CO.,LTD
-
 OUI:1007235*
  ID_OUI_FROM_DATABASE=BEIJING SOOALL INFORMATION TECHNOLOGY CO.,LTD
 
@@ -7895,9 +10925,6 @@ OUI:38FDFEB*
 OUI:38FDFE4*
  ID_OUI_FROM_DATABASE=New Telecom Solutions LLC
 
-OUI:38FDFE9*
- ID_OUI_FROM_DATABASE=OOO Group of Industrial Technologies
-
 OUI:5CF2860*
  ID_OUI_FROM_DATABASE=Hangzhou Signwei Electronics Technology Co., Ltd
 
@@ -7916,9 +10943,6 @@ OUI:7C477C6*
 OUI:7C477CD*
  ID_OUI_FROM_DATABASE=Speedifi Inc
 
-OUI:986D359*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:986D353*
  ID_OUI_FROM_DATABASE=DH Mechatronic AG
 
@@ -7946,31 +10970,82 @@ OUI:6891D0E*
 OUI:D0D94FC*
  ID_OUI_FROM_DATABASE=ARROWAVE TECHNOLOGIES LIMITED
 
-OUI:2836387*
- ID_OUI_FROM_DATABASE=Innovative Technology Ltd
+OUI:F0ACD7A*
+ ID_OUI_FROM_DATABASE=Groupeer Technologies
 
-OUI:800A80F*
- ID_OUI_FROM_DATABASE=Private
+OUI:F0ACD74*
+ ID_OUI_FROM_DATABASE=Sercomm Corporation.
 
-OUI:B437D1F*
- ID_OUI_FROM_DATABASE=Private
+OUI:58E876B*
+ ID_OUI_FROM_DATABASE=annapurnalabs
 
-OUI:0CEFAFF*
- ID_OUI_FROM_DATABASE=Private
+OUI:58E876A*
+ ID_OUI_FROM_DATABASE=SHENZHEN DIGISSIN TECHNOLOGY
+
+OUI:58E8762*
+ ID_OUI_FROM_DATABASE=Coala Life AB
+
+OUI:C0D3917*
+ ID_OUI_FROM_DATABASE=ALNETz Co.,LTD
+
+OUI:C0D3918*
+ ID_OUI_FROM_DATABASE=XENA SECURITY LIMITED
+
+OUI:C0D391C*
+ ID_OUI_FROM_DATABASE=Zhinengguo technology company limited
+
+OUI:84E0F42*
+ ID_OUI_FROM_DATABASE=Hangzhou Uni-Ubi Co.,Ltd.
+
+OUI:84E0F46*
+ ID_OUI_FROM_DATABASE=Liaoning IK'SONYA Science and Technology Co., Ltd.
+
+OUI:383A216*
+ ID_OUI_FROM_DATABASE=Shenzhen Smart-core Technology co., Ltd.
+
+OUI:4CE1735*
+ ID_OUI_FROM_DATABASE=NewVastek
+
+OUI:AC64DD6*
+ ID_OUI_FROM_DATABASE=Kpnetworks Ltd.
+
+OUI:1CC0E18*
+ ID_OUI_FROM_DATABASE=LX Corporation Pty Ltd
+
+OUI:4865EEA*
+ ID_OUI_FROM_DATABASE=Shenzhen Inpor cloud Computing Co., Ltd.
+
+OUI:244E7B8*
+ ID_OUI_FROM_DATABASE=Cyber1st
+
+OUI:7CCBE2A*
+ ID_OUI_FROM_DATABASE=Shanghai Institute of Applied Physics, Chinese Academy of Sciences
+
+OUI:7CCBE21*
+ ID_OUI_FROM_DATABASE=CeoTronics AG
 
 OUI:A44F29F*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:78C2C0F*
- ID_OUI_FROM_DATABASE=Private
+OUI:A4580F9*
+ ID_OUI_FROM_DATABASE=Ksenia Security srl
 
-OUI:141FBAF*
- ID_OUI_FROM_DATABASE=Private
+OUI:A4580FC*
+ ID_OUI_FROM_DATABASE=Homebeaver
 
-OUI:549A11F*
- ID_OUI_FROM_DATABASE=Private
+OUI:A4580F6*
+ ID_OUI_FROM_DATABASE=Astro, Inc
 
-OUI:807B85F*
+OUI:40ED984*
+ ID_OUI_FROM_DATABASE=Kendrion Kuhnke Automation GmbH
+
+OUI:40ED987*
+ ID_OUI_FROM_DATABASE=Vaisala Oyj
+
+OUI:2836387*
+ ID_OUI_FROM_DATABASE=Innovative Technology Ltd
+
+OUI:800A80F*
  ID_OUI_FROM_DATABASE=Private
 
 OUI:2836386*
@@ -8018,44 +11093,350 @@ OUI:4CE1732*
 OUI:4CE1738*
  ID_OUI_FROM_DATABASE=Nanjing Tongke Technology Development Co., LTD
 
-OUI:F0ACD7A*
- ID_OUI_FROM_DATABASE=Groupeer Technologies
+OUI:1CC0E1D*
+ ID_OUI_FROM_DATABASE=NewLand (NZ) Communication Tech Limited
 
-OUI:F0ACD74*
- ID_OUI_FROM_DATABASE=Sercomm Corporation.
+OUI:1CC0E16*
+ ID_OUI_FROM_DATABASE=Monument Labs, Inc.
 
-OUI:58E876B*
- ID_OUI_FROM_DATABASE=annapurnalabs
+OUI:1CC0E1C*
+ ID_OUI_FROM_DATABASE=Nitto Seiko
 
-OUI:58E876A*
- ID_OUI_FROM_DATABASE=SHENZHEN DIGISSIN TECHNOLOGY
+OUI:100723C*
+ ID_OUI_FROM_DATABASE=Shenzhen Xinfa Electronic Co.,ltd
 
-OUI:58E8762*
- ID_OUI_FROM_DATABASE=Coala Life AB
+OUI:7CCBE20*
+ ID_OUI_FROM_DATABASE=Heyuan Yongyida Technology Holdings Co.,Ltd.
 
-OUI:C0D3917*
- ID_OUI_FROM_DATABASE=ALNETz Co.,LTD
+OUI:7CCBE22*
+ ID_OUI_FROM_DATABASE=1000eyes GmbH
 
-OUI:C0D3918*
- ID_OUI_FROM_DATABASE=XENA SECURITY LIMITED
+OUI:500B918*
+ ID_OUI_FROM_DATABASE=Panasonic Enterprise Solutions Company
 
-OUI:C0D391C*
- ID_OUI_FROM_DATABASE=Zhinengguo technology company limited
+OUI:500B910*
+ ID_OUI_FROM_DATABASE=Igor, Inc.
 
-OUI:84E0F42*
- ID_OUI_FROM_DATABASE=Hangzhou Uni-Ubi Co.,Ltd.
+OUI:500B916*
+ ID_OUI_FROM_DATABASE=Security Alarms & Co. S.A.
 
-OUI:84E0F46*
- ID_OUI_FROM_DATABASE=Liaoning IK'SONYA Science and Technology Co., Ltd.
+OUI:500B91E*
+ ID_OUI_FROM_DATABASE=Shenzhen zhong ju  Fiber optical Co.Ltd
 
-OUI:383A216*
- ID_OUI_FROM_DATABASE=Shenzhen Smart-core Technology co., Ltd.
+OUI:40ED98D*
+ ID_OUI_FROM_DATABASE=Hangzhou GANX Technology Co.,Ltd.
 
-OUI:4CE1735*
- ID_OUI_FROM_DATABASE=NewVastek
+OUI:40ED988*
+ ID_OUI_FROM_DATABASE=GUANGZHOU AURIC INTELLIGENT TECHNOLOGY CO.,LTD.
 
-OUI:AC64DD6*
- ID_OUI_FROM_DATABASE=Kpnetworks Ltd.
+OUI:34049E8*
+ ID_OUI_FROM_DATABASE=Eclipse Information Technologies
+
+OUI:34049E7*
+ ID_OUI_FROM_DATABASE=Pebble Technology
+
+OUI:50A4D04*
+ ID_OUI_FROM_DATABASE=Raven Industries Inc.
+
+OUI:50A4D0D*
+ ID_OUI_FROM_DATABASE=Axel Technology
+
+OUI:50A4D0C*
+ ID_OUI_FROM_DATABASE=Beijing YangLian Networks Technology co., LTD
+
+OUI:50A4D0E*
+ ID_OUI_FROM_DATABASE=Sagetech Corporation
+
+OUI:50A4D0B*
+ ID_OUI_FROM_DATABASE=ZHENG DIAN ELECTRONICS LIMITED
+
+OUI:8CC8F4D*
+ ID_OUI_FROM_DATABASE=Beijing Xinxunxintong Eletronics Co.,Ltd
+
+OUI:8CC8F47*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:8CC8F44*
+ ID_OUI_FROM_DATABASE=ITECH Electronic Co.,ltd.
+
+OUI:40F3852*
+ ID_OUI_FROM_DATABASE=Beijing Zongheng Electro-Mechanical Technology Development Co.
+
+OUI:40F3853*
+ ID_OUI_FROM_DATABASE=IntelliDesign Pty Ltd
+
+OUI:40F3851*
+ ID_OUI_FROM_DATABASE=Johnson Matthey
+
+OUI:40F385C*
+ ID_OUI_FROM_DATABASE=Clixxo Broadband Private Limited
+
+OUI:40F385E*
+ ID_OUI_FROM_DATABASE=BBB Inc.
+
+OUI:1CA0D36*
+ ID_OUI_FROM_DATABASE=Intertecno SRL NISUTA
+
+OUI:A411636*
+ ID_OUI_FROM_DATABASE=Beijing XiaoRui Technology Co., Ltd
+
+OUI:A411633*
+ ID_OUI_FROM_DATABASE=Pax
+
+OUI:A41163C*
+ ID_OUI_FROM_DATABASE=Viloc
+
+OUI:A41163E*
+ ID_OUI_FROM_DATABASE=tinylogics
+
+OUI:144FD78*
+ ID_OUI_FROM_DATABASE=NPort Networks Inc.,
+
+OUI:144FD76*
+ ID_OUI_FROM_DATABASE=i-SENS, Inc.
+
+OUI:144FD71*
+ ID_OUI_FROM_DATABASE=Zehnder Group AG
+
+OUI:144FD7E*
+ ID_OUI_FROM_DATABASE=Edan Instruments, Inc.
+
+OUI:98AAFC5*
+ ID_OUI_FROM_DATABASE=SPM Instrument AB
+
+OUI:98AAFC2*
+ ID_OUI_FROM_DATABASE=Shenzhen UniStrong Science & Technology Co., Ltd
+
+OUI:38FDFE9*
+ ID_OUI_FROM_DATABASE=OOO Group of Industrial Technologies
+
+OUI:98AAFC4*
+ ID_OUI_FROM_DATABASE=RPE RADICO
+
+OUI:98AAFC3*
+ ID_OUI_FROM_DATABASE=Nexus Electrical(Jiaxing) Limited
+
+OUI:98AAFCB*
+ ID_OUI_FROM_DATABASE=Resonant Systems Inc.
+
+OUI:08ED025*
+ ID_OUI_FROM_DATABASE=Vigitron Inc.
+
+OUI:08ED02D*
+ ID_OUI_FROM_DATABASE=Origami Energy Ltd
+
+OUI:08ED020*
+ ID_OUI_FROM_DATABASE=D2SLink Systems
+
+OUI:08ED02A*
+ ID_OUI_FROM_DATABASE=Victiana SRL
+
+OUI:60D7E35*
+ ID_OUI_FROM_DATABASE=Revol Technologies inc
+
+OUI:60D7E32*
+ ID_OUI_FROM_DATABASE=Novo innovations Ltd
+
+OUI:04714B3*
+ ID_OUI_FROM_DATABASE=Griesser Electronic AG
+
+OUI:04714B9*
+ ID_OUI_FROM_DATABASE=Lighthouse AI, Inc
+
+OUI:04714BD*
+ ID_OUI_FROM_DATABASE=Shenzhen BoClouds Technology Co.,Ltd.
+
+OUI:04714BA*
+ ID_OUI_FROM_DATABASE=Observables, Inc.
+
+OUI:F023B97*
+ ID_OUI_FROM_DATABASE=Transcend Building Automation control network corporation
+
+OUI:F023B93*
+ ID_OUI_FROM_DATABASE=BSP RUS Ltd.
+
+OUI:8C147DD*
+ ID_OUI_FROM_DATABASE=Shenzhen  Lanxus  technology Co. Ltd.
+
+OUI:8C147D3*
+ ID_OUI_FROM_DATABASE=Remotec Technology Limited
+
+OUI:8C147D4*
+ ID_OUI_FROM_DATABASE=Nanjing bilian information Technology Co.,Ltd.
+
+OUI:8C147D6*
+ ID_OUI_FROM_DATABASE=Shenzhen Meidou Technology Co, Ltd.
+
+OUI:8C147D8*
+ ID_OUI_FROM_DATABASE=V2 S.p.A.
+
+OUI:A0C5F28*
+ ID_OUI_FROM_DATABASE=CoolR Group Inc
+
+OUI:A0C5F2A*
+ ID_OUI_FROM_DATABASE=Serious Integrated, Inc.
+
+OUI:A0C5F21*
+ ID_OUI_FROM_DATABASE=KNS Group LLC (YADRO Company)
+
+OUI:4C65A81*
+ ID_OUI_FROM_DATABASE=Beijing Bluehalo Internet Inc.
+
+OUI:4C65A80*
+ ID_OUI_FROM_DATABASE=WELT Corporation
+
+OUI:4C65A87*
+ ID_OUI_FROM_DATABASE=Wuhan MoreQuick Network Technology Co., Ltd.
+
+OUI:4C65A85*
+ ID_OUI_FROM_DATABASE=TEL-Electronics Ltd
+
+OUI:4C65A8B*
+ ID_OUI_FROM_DATABASE=ZMIN Technologies
+
+OUI:F88A3CC*
+ ID_OUI_FROM_DATABASE=EXCETOP TECHNOLOGY (BEIJING) CO., LTD.
+
+OUI:F88A3C3*
+ ID_OUI_FROM_DATABASE=Shenzhen Shengyuan Tech Ltd.
+
+OUI:F88A3C6*
+ ID_OUI_FROM_DATABASE=Beijing Zhong Chuang Communication Technology Ltd.
+
+OUI:4C65A8E*
+ ID_OUI_FROM_DATABASE=High Infinity Germany
+
+OUI:F88A3C2*
+ ID_OUI_FROM_DATABASE=KLATU Networks Inc
+
+OUI:F88A3CD*
+ ID_OUI_FROM_DATABASE=THK Co.,LTD.
+
+OUI:F88A3CB*
+ ID_OUI_FROM_DATABASE=FARA AS
+
+OUI:7CBACC7*
+ ID_OUI_FROM_DATABASE=Virgin Orbit
+
+OUI:7CBACC1*
+ ID_OUI_FROM_DATABASE=Changsha SUNYE Electric Co., Ltd.
+
+OUI:807B85F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:549A11F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:141FBAF*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:B437D1F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:7CBACC8*
+ ID_OUI_FROM_DATABASE=Collinear Networks Inc.
+
+OUI:7CBACC6*
+ ID_OUI_FROM_DATABASE=Fossil Power Systems Inc
+
+OUI:78D8004*
+ ID_OUI_FROM_DATABASE=CS Instruments GmbH
+
+OUI:78D800D*
+ ID_OUI_FROM_DATABASE=Korea Micro Wireless Co.,Ltd.
+
+OUI:78D800B*
+ ID_OUI_FROM_DATABASE=Maddalena S.p.A.
+
+OUI:28F5370*
+ ID_OUI_FROM_DATABASE=Valeo Siemens eAutomotive Norway
+
+OUI:78C2C0F*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:0CEFAFF*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:28F537E*
+ ID_OUI_FROM_DATABASE=Performance Motion Devices
+
+OUI:34008A9*
+ ID_OUI_FROM_DATABASE=Keruyun Technoligies(Beijing) Corporation Limited
+
+OUI:986D359*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:34008A3*
+ ID_OUI_FROM_DATABASE=Globex 99 LTD
+
+OUI:34008AD*
+ ID_OUI_FROM_DATABASE=ChengDu HuiZhong Cloud Information Technology Co., Ltd.
+
+OUI:34008A1*
+ ID_OUI_FROM_DATABASE=ZQAM Communications
+
+OUI:34008A5*
+ ID_OUI_FROM_DATABASE=Federal Aviation Administration
+
+OUI:34298F2*
+ ID_OUI_FROM_DATABASE=Shenzhen Advance River System Technology Co., Ltd
+
+OUI:34008AE*
+ ID_OUI_FROM_DATABASE=SHENZHEN WXL ELECTRONICS CO., LTD.
+
+OUI:34298F9*
+ ID_OUI_FROM_DATABASE=Wiesheu GmbH
+
+OUI:34298F3*
+ ID_OUI_FROM_DATABASE=Beijing Vorx Telecommunications Co., Ltd.
+
+OUI:34298F4*
+ ID_OUI_FROM_DATABASE=ISRA Vision AG
+
+OUI:189BA54*
+ ID_OUI_FROM_DATABASE=Innominds Software Inc
+
+OUI:904E91C*
+ ID_OUI_FROM_DATABASE=Showtacle s.r.o.
+
+OUI:904E913*
+ ID_OUI_FROM_DATABASE=Teleepoch Ltd
+
+OUI:904E91A*
+ ID_OUI_FROM_DATABASE=Kaertech Limited
+
+OUI:904E919*
+ ID_OUI_FROM_DATABASE=CUTTER Systems spol. s r.o.
+
+OUI:2C279EE*
+ ID_OUI_FROM_DATABASE=Amaryllo International Inc.
+
+OUI:CC22374*
+ ID_OUI_FROM_DATABASE=SHANGHAI CARGOA M.&E.EQUIPMENT CO.LTD
+
+OUI:CC22376*
+ ID_OUI_FROM_DATABASE=Siemens AG Austria
+
+OUI:CC22370*
+ ID_OUI_FROM_DATABASE=MEDCOM sp. z o.o.
+
+OUI:CC22379*
+ ID_OUI_FROM_DATABASE=E Ink Corp
+
+OUI:CC22373*
+ ID_OUI_FROM_DATABASE=XConnect Professional Services
+
+OUI:CC2237E*
+ ID_OUI_FROM_DATABASE=MANUFACTURAS Y TRANSFORMADOS AB, S.L.
+
+OUI:741AE08*
+ ID_OUI_FROM_DATABASE=Broadcast Wireless Systems Ltd
+
+OUI:741AE06*
+ ID_OUI_FROM_DATABASE=Blocks Wearables Inc.
+
+OUI:741AE03*
+ ID_OUI_FROM_DATABASE=Philips Personal Health Solutions
 
 OUI:E043DB*
  ID_OUI_FROM_DATABASE=Shenzhen ViewAt Technology Co.,Ltd.
@@ -8063,9 +11444,6 @@ OUI:E043DB*
 OUI:2405F5*
  ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
-OUI:2C3033*
- ID_OUI_FROM_DATABASE=NETGEAR
-
 OUI:3CD92B*
  ID_OUI_FROM_DATABASE=Hewlett Packard
 
@@ -8126,15 +11504,6 @@ OUI:348AAE*
 OUI:BCEC23*
  ID_OUI_FROM_DATABASE=SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD
 
-OUI:8CE748*
- ID_OUI_FROM_DATABASE=Private
-
-OUI:F09CE9*
- ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
-
-OUI:C413E2*
- ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
-
 OUI:AC06C7*
  ID_OUI_FROM_DATABASE=ServerNet S.r.l.
 
@@ -8312,12 +11681,6 @@ OUI:BC7670*
 OUI:24DBAC*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:BC3AEA*
- ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
-
-OUI:E8BBA8*
- ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
-
 OUI:0021E8*
  ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
@@ -8327,15 +11690,6 @@ OUI:006057*
 OUI:0007D8*
  ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
 
-OUI:0012F2*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
-
-OUI:001BED*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
-
-OUI:002438*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
-
 OUI:84742A*
  ID_OUI_FROM_DATABASE=zte corporation
 
@@ -8513,24 +11867,6 @@ OUI:283152*
 OUI:DCD2FC*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:F8A45F*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
-
-OUI:8CBEBE*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
-
-OUI:640980*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
-
-OUI:98FAE3*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
-
-OUI:185936*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
-
-OUI:9C99A0*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
-
 OUI:0003DD*
  ID_OUI_FROM_DATABASE=Comark Interactive Solutions
 
@@ -8588,30 +11924,6 @@ OUI:781DBA*
 OUI:001E10*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:B0ADAA*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:10CDAE*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:50CD22*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:FCA841*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:3CB15B*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:C8F406*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:2CF4C5*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:7038EE*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
 OUI:88F031*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -8978,9 +12290,6 @@ OUI:70BF3E*
 OUI:D848EE*
  ID_OUI_FROM_DATABASE=Hangzhou Xueji Technology Co., Ltd.
 
-OUI:88947E*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
-
 OUI:88C242*
  ID_OUI_FROM_DATABASE=Poynt Co.
 
@@ -9032,9 +12341,6 @@ OUI:C8A9FC*
 OUI:C49FF3*
  ID_OUI_FROM_DATABASE=Mciao Technologies, Inc.
 
-OUI:80739F*
- ID_OUI_FROM_DATABASE=KYOCERA Corporation
-
 OUI:7C2BE1*
  ID_OUI_FROM_DATABASE=Shenzhen Ferex Electrical Co.,Ltd
 
@@ -9056,9 +12362,6 @@ OUI:2CA539*
 OUI:FC335F*
  ID_OUI_FROM_DATABASE=Polyera
 
-OUI:FCC233*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:A8C87F*
  ID_OUI_FROM_DATABASE=Roqos, Inc.
 
@@ -9116,9 +12419,6 @@ OUI:DC3CF6*
 OUI:3C3178*
  ID_OUI_FROM_DATABASE=Qolsys Inc.
 
-OUI:F4573E*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
-
 OUI:083A5C*
  ID_OUI_FROM_DATABASE=Junilab, Inc.
 
@@ -9143,18 +12443,12 @@ OUI:6459F8*
 OUI:082CB0*
  ID_OUI_FROM_DATABASE=Network Instruments
 
-OUI:F0AB54*
- ID_OUI_FROM_DATABASE=MITSUMI ELECTRIC CO.,LTD.
-
 OUI:485073*
  ID_OUI_FROM_DATABASE=Microsoft Corporation
 
 OUI:3CA31A*
  ID_OUI_FROM_DATABASE=Oilfind International LLC
 
-OUI:ACFD93*
- ID_OUI_FROM_DATABASE=Weifang GoerTek Electronics Co., Ltd.
-
 OUI:A424DD*
  ID_OUI_FROM_DATABASE=Cambrionix Ltd
 
@@ -9278,9 +12572,6 @@ OUI:E8162B*
 OUI:709F2D*
  ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:5C6B4F*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:ECE2FD*
  ID_OUI_FROM_DATABASE=SKG Electric Group(Thailand) Co., Ltd.
 
@@ -9305,9 +12596,6 @@ OUI:38C70A*
 OUI:60E6BC*
  ID_OUI_FROM_DATABASE=Sino-Telecom Technology Co.,Ltd.
 
-OUI:1CA532*
- ID_OUI_FROM_DATABASE=Shenzhen Gongjin Electronics Co.,Ltd
-
 OUI:486EFB*
  ID_OUI_FROM_DATABASE=Davit System Technology Co., Ltd.
 
@@ -9428,9 +12716,6 @@ OUI:8CDF9D*
 OUI:F8E903*
  ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:F0B052*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
-
 OUI:6828F6*
  ID_OUI_FROM_DATABASE=Vubiq Networks, Inc.
 
@@ -9539,9 +12824,6 @@ OUI:3C46D8*
 OUI:6C0273*
  ID_OUI_FROM_DATABASE=Shenzhen Jin Yun Video Equipment Co., Ltd.
 
-OUI:2CFAA2*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent
-
 OUI:F0761C*
  ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
 
@@ -9557,9 +12839,6 @@ OUI:BC9CC5*
 OUI:505065*
  ID_OUI_FROM_DATABASE=TAKT Corporation
 
-OUI:D00AAB*
- ID_OUI_FROM_DATABASE=Yokogawa Digital Computer Corporation
-
 OUI:A4A4D3*
  ID_OUI_FROM_DATABASE=Bluebank Communication Technology Co.Ltd
 
@@ -9569,9 +12848,6 @@ OUI:74F413*
 OUI:34F0CA*
  ID_OUI_FROM_DATABASE=Shenzhen Linghangyuan Digital Technology Co.,Ltd.
 
-OUI:84183A*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
-
 OUI:30B5F1*
  ID_OUI_FROM_DATABASE=Aitexin Technology Co., Ltd
 
@@ -9656,15 +12932,9 @@ OUI:FC4AE9*
 OUI:34E42A*
  ID_OUI_FROM_DATABASE=Automatic Bar Controls Inc.
 
-OUI:B87CF2*
- ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
-
 OUI:20A787*
  ID_OUI_FROM_DATABASE=Bointec Taiwan Corporation Limited
 
-OUI:6CAAB3*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
-
 OUI:A481EE*
  ID_OUI_FROM_DATABASE=Nokia Corporation
 
@@ -9719,9 +12989,6 @@ OUI:9451BF*
 OUI:4C7F62*
  ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:841766*
- ID_OUI_FROM_DATABASE=Weifang GoerTek Electronics Co., Ltd
-
 OUI:F03FF8*
  ID_OUI_FROM_DATABASE=R L Drake
 
@@ -9854,9 +13121,6 @@ OUI:80BAE6*
 OUI:3C18A0*
  ID_OUI_FROM_DATABASE=Luxshare Precision Industry Co.,Ltd.
 
-OUI:4CB81C*
- ID_OUI_FROM_DATABASE=SAM Electronics GmbH
-
 OUI:041A04*
  ID_OUI_FROM_DATABASE=WaveIP
 
@@ -10016,9 +13280,6 @@ OUI:F42896*
 OUI:1C7B21*
  ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:BC9680*
- ID_OUI_FROM_DATABASE=Shenzhen Gongjin Electronics Co.,Ltd
-
 OUI:9C2840*
  ID_OUI_FROM_DATABASE=Discovery Technology,LTD..
 
@@ -10142,9 +13403,6 @@ OUI:C47F51*
 OUI:E8D4E0*
  ID_OUI_FROM_DATABASE=Beijing BenyWave Technology Co., Ltd.
 
-OUI:3889DC*
- ID_OUI_FROM_DATABASE=Opticon Sensors Europe B.V.
-
 OUI:681D64*
  ID_OUI_FROM_DATABASE=Sunwave Communications Co., Ltd
 
@@ -10154,9 +13412,6 @@ OUI:F4CD90*
 OUI:E438F2*
  ID_OUI_FROM_DATABASE=Advantage Controls
 
-OUI:24C9A1*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
-
 OUI:C8F386*
  ID_OUI_FROM_DATABASE=Shenzhen Xiaoniao Technology Co.,Ltd
 
@@ -10340,9 +13595,6 @@ OUI:48F230*
 OUI:B0C95B*
  ID_OUI_FROM_DATABASE=Beijing Symtech CO.,LTD
 
-OUI:881544*
- ID_OUI_FROM_DATABASE=Meraki, Inc.
-
 OUI:DCA989*
  ID_OUI_FROM_DATABASE=MACANDC
 
@@ -10541,9 +13793,6 @@ OUI:58CF4B*
 OUI:C4393A*
  ID_OUI_FROM_DATABASE=SMC Networks Inc
 
-OUI:C4017C*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
-
 OUI:D45C70*
  ID_OUI_FROM_DATABASE=Wi-Fi Alliance
 
@@ -10763,9 +14012,6 @@ OUI:18F87A*
 OUI:142DF5*
  ID_OUI_FROM_DATABASE=Amphitech
 
-OUI:C08ADE*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
-
 OUI:90F72F*
  ID_OUI_FROM_DATABASE=Phillips Machine & Welding Co., Inc.
 
@@ -10907,9 +14153,6 @@ OUI:AC3FA4*
 OUI:0C130B*
  ID_OUI_FROM_DATABASE=Uniqoteq Ltd.
 
-OUI:14CF8D*
- ID_OUI_FROM_DATABASE=OHSUNG ELECTRONICS CO., LTD.
-
 OUI:808698*
  ID_OUI_FROM_DATABASE=Netronics Technologies Inc.
 
@@ -11015,9 +14258,6 @@ OUI:D01AA7*
 OUI:B08E1A*
  ID_OUI_FROM_DATABASE=URadio Systems Co., Ltd
 
-OUI:40605A*
- ID_OUI_FROM_DATABASE=Hawkeye Tech Co. Ltd
-
 OUI:E05DA6*
  ID_OUI_FROM_DATABASE=Detlef Fink Elektronik & Softwareentwicklung
 
@@ -11036,9 +14276,6 @@ OUI:608C2B*
 OUI:EC1120*
  ID_OUI_FROM_DATABASE=FloDesign Wind Turbine Corporation
 
-OUI:D0F73B*
- ID_OUI_FROM_DATABASE=Helmut Mauell GmbH
-
 OUI:C495A2*
  ID_OUI_FROM_DATABASE=SHENZHEN WEIJIU INDUSTRY AND TRADE DEVELOPMENT CO., LTD
 
@@ -11297,18 +14534,12 @@ OUI:8C8A6E*
 OUI:E0ED1A*
  ID_OUI_FROM_DATABASE=vastriver Technology Co., Ltd
 
-OUI:C83B45*
- ID_OUI_FROM_DATABASE=JRI-Maxant
-
 OUI:685E6B*
  ID_OUI_FROM_DATABASE=PowerRay Co., Ltd.
 
 OUI:4C32D9*
  ID_OUI_FROM_DATABASE=M Rutty Holdings Pty. Ltd.
 
-OUI:50A733*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
-
 OUI:603FC5*
  ID_OUI_FROM_DATABASE=COX CO., LTD
 
@@ -11384,9 +14615,6 @@ OUI:C436DA*
 OUI:00FC70*
  ID_OUI_FROM_DATABASE=Intrepid Control Systems, Inc.
 
-OUI:A4EE57*
- ID_OUI_FROM_DATABASE=SEIKO EPSON CORPORATION
-
 OUI:D0AFB6*
  ID_OUI_FROM_DATABASE=Linktop Technology Co., LTD
 
@@ -11474,9 +14702,6 @@ OUI:802275*
 OUI:BC8199*
  ID_OUI_FROM_DATABASE=BASIC Co.,Ltd.
 
-OUI:000726*
- ID_OUI_FROM_DATABASE=Shenzhen Gongjin Electronics Co., Ltd.
-
 OUI:24470E*
  ID_OUI_FROM_DATABASE=PentronicAB
 
@@ -11618,9 +14843,6 @@ OUI:707EDE*
 OUI:CCBE71*
  ID_OUI_FROM_DATABASE=OptiLogix BV
 
-OUI:D8B12A*
- ID_OUI_FROM_DATABASE=Panasonic Mobile Communications Co., Ltd.
-
 OUI:7CDD90*
  ID_OUI_FROM_DATABASE=Shenzhen Ogemray Technology Co., Ltd.
 
@@ -11801,15 +15023,9 @@ OUI:60893C*
 OUI:5C17D3*
  ID_OUI_FROM_DATABASE=LGE
 
-OUI:347877*
- ID_OUI_FROM_DATABASE=O-NET Communications(Shenzhen) Limited
-
 OUI:70A191*
  ID_OUI_FROM_DATABASE=Trendsetter Medical, LLC
 
-OUI:A49B13*
- ID_OUI_FROM_DATABASE=Burroughs Payment Systems, Inc.
-
 OUI:58BC27*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -11888,9 +15104,6 @@ OUI:84DB2F*
 OUI:A45055*
  ID_OUI_FROM_DATABASE=busware.de
 
-OUI:2CD2E7*
- ID_OUI_FROM_DATABASE=Nokia Corporation
-
 OUI:C89383*
  ID_OUI_FROM_DATABASE=Embedded Automation, Inc.
 
@@ -12137,9 +15350,6 @@ OUI:448E81*
 OUI:2046F9*
  ID_OUI_FROM_DATABASE=Advanced Network Devices (dba:AND)
 
-OUI:681FD8*
- ID_OUI_FROM_DATABASE=Advanced Telemetry
-
 OUI:0C8230*
  ID_OUI_FROM_DATABASE=SHENZHEN MAGNUS TECHNOLOGIES CO.,LTD
 
@@ -12410,9 +15620,6 @@ OUI:0025EF*
 OUI:0025E9*
  ID_OUI_FROM_DATABASE=i-mate Development, Inc.
 
-OUI:0025DF*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:002690*
  ID_OUI_FROM_DATABASE=I DO IT
 
@@ -12989,9 +16196,6 @@ OUI:00229A*
 OUI:002299*
  ID_OUI_FROM_DATABASE=SeaMicro Inc.
 
-OUI:002294*
- ID_OUI_FROM_DATABASE=Kyocera Corporation
-
 OUI:0021FA*
  ID_OUI_FROM_DATABASE=A4SP Technologies Ltd.
 
@@ -13157,9 +16361,6 @@ OUI:001F3E*
 OUI:001F42*
  ID_OUI_FROM_DATABASE=Etherstack plc
 
-OUI:001F41*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
-
 OUI:001F39*
  ID_OUI_FROM_DATABASE=Construcciones y Auxiliar de Ferrocarriles, S.A.
 
@@ -14162,9 +17363,6 @@ OUI:001890*
 OUI:001884*
  ID_OUI_FROM_DATABASE=Fon Technology S.L.
 
-OUI:00187D*
- ID_OUI_FROM_DATABASE=Armorlink shanghai Co. Ltd
-
 OUI:00187F*
  ID_OUI_FROM_DATABASE=ZODIANET
 
@@ -14192,9 +17390,6 @@ OUI:0016AB*
 OUI:0016A6*
  ID_OUI_FROM_DATABASE=Dovado FZ-LLC
 
-OUI:0017C8*
- ID_OUI_FROM_DATABASE=KYOCERA Document Solutions Inc.
-
 OUI:0017CF*
  ID_OUI_FROM_DATABASE=iMCA-GmbH
 
@@ -14252,9 +17447,6 @@ OUI:00175F*
 OUI:001751*
  ID_OUI_FROM_DATABASE=Online Corporation
 
-OUI:001753*
- ID_OUI_FROM_DATABASE=nFore Technology Inc.
-
 OUI:001758*
  ID_OUI_FROM_DATABASE=ThruVision Ltd
 
@@ -14510,9 +17702,6 @@ OUI:001531*
 OUI:001538*
  ID_OUI_FROM_DATABASE=RFID, Inc.
 
-OUI:00152A*
- ID_OUI_FROM_DATABASE=Nokia GmbH
-
 OUI:00161D*
  ID_OUI_FROM_DATABASE=Innovative Wireless Technologies, Inc.
 
@@ -15092,9 +18281,6 @@ OUI:001137*
 OUI:00112D*
  ID_OUI_FROM_DATABASE=iPulse Systems
 
-OUI:111111*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:001123*
  ID_OUI_FROM_DATABASE=Appointech, Inc.
 
@@ -15512,9 +18698,6 @@ OUI:000E5D*
 OUI:000E5E*
  ID_OUI_FROM_DATABASE=Raisecom Technology
 
-OUI:000E58*
- ID_OUI_FROM_DATABASE=Sonos, Inc.
-
 OUI:000BE2*
  ID_OUI_FROM_DATABASE=Lumenera Corporation
 
@@ -16154,9 +19337,6 @@ OUI:00089D*
 OUI:000890*
  ID_OUI_FROM_DATABASE=AVILINKS SA
 
-OUI:000889*
- ID_OUI_FROM_DATABASE=Echostar Technologies Corp
-
 OUI:000884*
  ID_OUI_FROM_DATABASE=Index Braille AB
 
@@ -16793,9 +19973,6 @@ OUI:0004D1*
 OUI:0004CB*
  ID_OUI_FROM_DATABASE=Tdsoft Communication, Ltd.
 
-OUI:0004BF*
- ID_OUI_FROM_DATABASE=VersaLogic Corp.
-
 OUI:0004C5*
  ID_OUI_FROM_DATABASE=ASE Technologies, USA
 
@@ -17234,18 +20411,12 @@ OUI:000189*
 OUI:00308B*
  ID_OUI_FROM_DATABASE=Brix Networks
 
-OUI:00014F*
- ID_OUI_FROM_DATABASE=ADTRAN INC
-
 OUI:00015A*
  ID_OUI_FROM_DATABASE=Digital Video Broadcasting
 
 OUI:000166*
  ID_OUI_FROM_DATABASE=TC GROUP A/S
 
-OUI:00016D*
- ID_OUI_FROM_DATABASE=CarrierComm Inc.
-
 OUI:00015F*
  ID_OUI_FROM_DATABASE=DIGITAL DESIGN GmbH
 
@@ -17507,9 +20678,6 @@ OUI:00D00E*
 OUI:00D055*
  ID_OUI_FROM_DATABASE=KATHREIN-WERKE KG
 
-OUI:00D095*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent, Enterprise Business Group
-
 OUI:00D000*
  ID_OUI_FROM_DATABASE=FERRAN SCIENTIFIC, INC.
 
@@ -18104,9 +21272,6 @@ OUI:006010*
 OUI:006044*
  ID_OUI_FROM_DATABASE=LITTON/POLY-SCIENTIFIC
 
-OUI:00609B*
- ID_OUI_FROM_DATABASE=ASTRO-MED, INC.
-
 OUI:0060BE*
  ID_OUI_FROM_DATABASE=WEBTRONICS
 
@@ -19109,9 +22274,6 @@ OUI:080076*
 OUI:080072*
  ID_OUI_FROM_DATABASE=XEROX CORP UNIV GRANT PROGRAM
 
-OUI:080070*
- ID_OUI_FROM_DATABASE=MITSUBISHI ELECTRIC CORP.
-
 OUI:080068*
  ID_OUI_FROM_DATABASE=RIDGE COMPUTERS
 
@@ -19253,9 +22415,6 @@ OUI:00004C*
 OUI:00003B*
  ID_OUI_FROM_DATABASE=i Controls, Inc.
 
-OUI:0000FE*
- ID_OUI_FROM_DATABASE=ANNAPOLIS MICRO SYSTEMS
-
 OUI:080013*
  ID_OUI_FROM_DATABASE=Exxon
 
@@ -19340,15 +22499,6 @@ OUI:C8CD72*
 OUI:E8BE81*
  ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:28FAA0*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
-
-OUI:3CA348*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
-
-OUI:F42981*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
-
 OUI:C4282D*
  ID_OUI_FROM_DATABASE=Embedded Intellect Pty Ltd
 
@@ -19364,9 +22514,6 @@ OUI:000FB0*
 OUI:1C7508*
  ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
 
-OUI:8C0EE3*
- ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
-
 OUI:3829DD*
  ID_OUI_FROM_DATABASE=ONvocal Inc
 
@@ -19463,9 +22610,6 @@ OUI:806C1B*
 OUI:A470D6*
  ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:3407FB*
- ID_OUI_FROM_DATABASE=Ericsson AB
-
 OUI:001B21*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -19511,9 +22655,6 @@ OUI:9C4E36*
 OUI:541473*
  ID_OUI_FROM_DATABASE=Wingtech Group (HongKong)Limited
 
-OUI:14144B*
- ID_OUI_FROM_DATABASE=FUJIAN STAR-NET COMMUNICATION CO.,LTD
-
 OUI:001C50*
  ID_OUI_FROM_DATABASE=TCL Technoly Electronics (Huizhou) Co., Ltd.
 
@@ -19634,9 +22775,6 @@ OUI:6487D7*
 OUI:00E098*
  ID_OUI_FROM_DATABASE=AboCom
 
-OUI:F0A225*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:0000B1*
  ID_OUI_FROM_DATABASE=Alpha Micro
 
@@ -19709,12 +22847,6 @@ OUI:E839DF*
 OUI:00138F*
  ID_OUI_FROM_DATABASE=Asiarock Technology Limited
 
-OUI:2CB05D*
- ID_OUI_FROM_DATABASE=NETGEAR
-
-OUI:00146C*
- ID_OUI_FROM_DATABASE=NETGEAR
-
 OUI:1C69A5*
  ID_OUI_FROM_DATABASE=BlackBerry RTS
 
@@ -19730,21 +22862,9 @@ OUI:002308*
 OUI:880355*
  ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
 
-OUI:A42B8C*
- ID_OUI_FROM_DATABASE=NETGEAR
-
-OUI:04A151*
- ID_OUI_FROM_DATABASE=NETGEAR
-
-OUI:28C68E*
- ID_OUI_FROM_DATABASE=NETGEAR
-
 OUI:5CDC96*
  ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
 
-OUI:504A6E*
- ID_OUI_FROM_DATABASE=NETGEAR
-
 OUI:D0D04B*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
@@ -19808,18 +22928,6 @@ OUI:E0CBEE*
 OUI:64B853*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:988389*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
-
-OUI:244B03*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
-
-OUI:FC8F90*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
-
-OUI:1816C9*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
-
 OUI:F4428F*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
@@ -19868,18 +22976,12 @@ OUI:D059E4*
 OUI:64B310*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:78ABBB*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
-
 OUI:000B3B*
  ID_OUI_FROM_DATABASE=devolo AG
 
 OUI:001D20*
  ID_OUI_FROM_DATABASE=Comtrend Corporation
 
-OUI:6C38A1*
- ID_OUI_FROM_DATABASE=Ubee Interactive Corp.
-
 OUI:140C76*
  ID_OUI_FROM_DATABASE=FREEBOX SAS
 
@@ -19994,9 +23096,6 @@ OUI:246968*
 OUI:8CA2FD*
  ID_OUI_FROM_DATABASE=Starry, Inc.
 
-OUI:14BB6E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
-
 OUI:AC61EA*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -20024,9 +23123,6 @@ OUI:000BA2*
 OUI:30CBF8*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:2C4D79*
- ID_OUI_FROM_DATABASE=GoerTek Inc.
-
 OUI:40D357*
  ID_OUI_FROM_DATABASE=Ison Technology Co., Ltd.
 
@@ -20069,9 +23165,6 @@ OUI:D8803C*
 OUI:703C03*
  ID_OUI_FROM_DATABASE=RadiAnt Co.,Ltd
 
-OUI:F0D2F1*
- ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
-
 OUI:583277*
  ID_OUI_FROM_DATABASE=Reliance Communications LLC
 
@@ -20123,9 +23216,6 @@ OUI:349971*
 OUI:24615A*
  ID_OUI_FROM_DATABASE=China Mobile Group Device Co.,Ltd.
 
-OUI:B0E2E5*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
-
 OUI:AC0D1B*
  ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
@@ -20141,9 +23231,6 @@ OUI:001706*
 OUI:30F6B9*
  ID_OUI_FROM_DATABASE=Ecocentric Energy
 
-OUI:1C3ADE*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
-
 OUI:004268*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -20360,9 +23447,6 @@ OUI:045604*
 OUI:10BD55*
  ID_OUI_FROM_DATABASE=Q-Lab Corporation
 
-OUI:C449BB*
- ID_OUI_FROM_DATABASE=MITSUMI ELECTRIC CO.,LTD.
-
 OUI:8C6D50*
  ID_OUI_FROM_DATABASE=SHENZHEN MTC CO LTD
 
@@ -20405,9 +23489,6 @@ OUI:680715*
 OUI:A09E1A*
  ID_OUI_FROM_DATABASE=Polar Electro Oy
 
-OUI:3CB6B7*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
-
 OUI:D0B2C4*
  ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
@@ -20426,15 +23507,6 @@ OUI:BC307D*
 OUI:5410EC*
  ID_OUI_FROM_DATABASE=Microchip Technology Inc.
 
-OUI:00262D*
- ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
-
-OUI:5CFF35*
- ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
-
-OUI:000AE4*
- ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
-
 OUI:309BAD*
  ID_OUI_FROM_DATABASE=BBK EDUCATIONAL ELECTRONICS CORP.,LTD.
 
@@ -20540,9 +23612,6 @@ OUI:0050C2*
 OUI:CC79CF*
  ID_OUI_FROM_DATABASE=SHENZHEN RF-LINK TECHNOLOGY CO.,LTD.
 
-OUI:544E45*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:6CB9C5*
  ID_OUI_FROM_DATABASE=Delta Networks, Inc.
 
@@ -20705,9 +23774,6 @@ OUI:001A8F*
 OUI:E89309*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D0B2*
- ID_OUI_FROM_DATABASE=19514
-
 OUI:001988*
  ID_OUI_FROM_DATABASE=Wi2Wi, Inc
 
@@ -20729,9 +23795,6 @@ OUI:00B0B3*
 OUI:14825B*
  ID_OUI_FROM_DATABASE=Hefei Radio Communication Technology Co., Ltd
 
-OUI:00549F*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
 OUI:00562B*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -20852,159 +23915,9 @@ OUI:98F058*
 OUI:24E43F*
  ID_OUI_FROM_DATABASE=Wenzhou Kunmei Communication Technology Co.,Ltd.
 
-OUI:A00460*
- ID_OUI_FROM_DATABASE=NETGEAR
-
-OUI:946269*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:D40598*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:78719C*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:E0B70A*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:C83FB4*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:207355*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:900DCB*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:14CFE2*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:0015D0*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:E86D52*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:3C438E*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:90B134*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:20E564*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:40B7F3*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:94CCB9*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:00ACE0*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:3C36E4*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:0000C5*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:D039B3*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:8C7F3B*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:903EAB*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:CCA462*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:001DCD*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:001DD4*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:001DCE*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:0050E3*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:00080E*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:00159A*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:00192C*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:D40AA9*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:384C90*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:44AAF5*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:7085C6*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:D0E54D*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:B4F2E8*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:FC8E7E*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:005094*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:002143*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:0023EE*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:64ED57*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:0023A3*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:F87B7A*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:0025F1*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:001A66*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:0018C0*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:001E46*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:001ADE*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
-OUI:0023AF*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
 OUI:240AC4*
  ID_OUI_FROM_DATABASE=Espressif Inc.
 
-OUI:5856E8*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
-
 OUI:E4C1F1*
  ID_OUI_FROM_DATABASE=SHENZHEN SPOTMAU INFORMATION TECHNOLIGY CO., Ltd
 
@@ -21230,12 +24143,6 @@ OUI:C80E14*
 OUI:E0686D*
  ID_OUI_FROM_DATABASE=Raybased AB
 
-OUI:A45385*
- ID_OUI_FROM_DATABASE=Weifang GoerTek Electronics Co., Ltd.
-
-OUI:000678*
- ID_OUI_FROM_DATABASE=D&M Holdings Inc.
-
 OUI:98B039*
  ID_OUI_FROM_DATABASE=Nokia
 
@@ -21323,9 +24230,6 @@ OUI:FCCAC4*
 OUI:04BA36*
  ID_OUI_FROM_DATABASE=Li Seng Technology Ltd
 
-OUI:DCF090*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:4409B8*
  ID_OUI_FROM_DATABASE=Salcomp (Shenzhen) CO., LTD.
 
@@ -21401,15 +24305,9 @@ OUI:A4D9A4*
 OUI:484D7E*
  ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:8871E5*
- ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
-
 OUI:F4B549*
  ID_OUI_FROM_DATABASE=Xiamen Yeastar Information Technology Co., Ltd.
 
-OUI:9C3DCF*
- ID_OUI_FROM_DATABASE=NETGEAR
-
 OUI:28EED3*
  ID_OUI_FROM_DATABASE=Shenzhen Super D Technology Co., Ltd
 
@@ -21428,39935 +24326,43475 @@ OUI:50584F*
 OUI:00A2EE*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0C6F9C*
- ID_OUI_FROM_DATABASE=Shaw Communications Inc.
+OUI:98E476*
+ ID_OUI_FROM_DATABASE=Zentan
 
-OUI:1801E3*
- ID_OUI_FROM_DATABASE=Bittium Wireless Ltd
+OUI:18F76B*
+ ID_OUI_FROM_DATABASE=Zhejiang Winsight Technology CO.,LTD
 
-OUI:C0AC54*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:00609B*
+ ID_OUI_FROM_DATABASE=AstroNova, Inc
 
-OUI:40F201*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:B87CF2*
+ ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
 
-OUI:C891F9*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:C413E2*
+ ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
 
-OUI:4CFF12*
- ID_OUI_FROM_DATABASE=Fuze Entertainment Co., ltd
+OUI:F09CE9*
+ ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
 
-OUI:0059AC*
- ID_OUI_FROM_DATABASE=KPN. B.V.
+OUI:CCC5EF*
+ ID_OUI_FROM_DATABASE=Co-Comm Servicios Telecomunicaciones S.L.
 
-OUI:AC9A22*
- ID_OUI_FROM_DATABASE=NXP Semiconductors
+OUI:5C6B4F*
+ ID_OUI_FROM_DATABASE=Hello Inc.
 
-OUI:006037*
- ID_OUI_FROM_DATABASE=NXP Semiconductors
+OUI:C09C04*
+ ID_OUI_FROM_DATABASE=Shaanxi GuoLian Digital TV Technology Co.,Ltd.
 
-OUI:546009*
- ID_OUI_FROM_DATABASE=Google, Inc.
+OUI:D0F73B*
+ ID_OUI_FROM_DATABASE=Helmut Mauell GmbH Werk Weida
 
-OUI:A47733*
- ID_OUI_FROM_DATABASE=Google, Inc.
+OUI:D00AAB*
+ ID_OUI_FROM_DATABASE=Yokogawa Digital Computer Corporation
 
-OUI:94EB2C*
- ID_OUI_FROM_DATABASE=Google, Inc.
+OUI:AC233F*
+ ID_OUI_FROM_DATABASE=Shenzhen Minew Technologies Co., Ltd.
 
-OUI:28BC56*
- ID_OUI_FROM_DATABASE=EMAC, Inc.
+OUI:000E58*
+ ID_OUI_FROM_DATABASE=Sonos, Inc.
 
-OUI:287CDB*
- ID_OUI_FROM_DATABASE=Hefei  Toycloud Technology Co.,ltd
+OUI:2C598A*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:D0B33F*
- ID_OUI_FROM_DATABASE=Shenzhen TINNO Mobile Technology Corp.
+OUI:E0508B*
+ ID_OUI_FROM_DATABASE=Zhejiang Dahua Technology Co., Ltd.
 
-OUI:00738D*
- ID_OUI_FROM_DATABASE=Shenzhen TINNO Mobile Technology Corp.
+OUI:2C6FC9*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:A8CA7B*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:9C99A0*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:ACCF85*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:185936*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:0CD746*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:98FAE3*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:440010*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:640980*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:2435CC*
- ID_OUI_FROM_DATABASE=Zhongshan Scinan Internet of Things Co.,Ltd.
+OUI:8CBEBE*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:2C27D7*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:F8A45F*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:000F3D*
- ID_OUI_FROM_DATABASE=D-Link Corporation
+OUI:508A0F*
+ ID_OUI_FROM_DATABASE=SHENZHEN FISE TECHNOLOGY HOLDING CO.,LTD.
 
-OUI:001195*
- ID_OUI_FROM_DATABASE=D-Link Corporation
+OUI:E4B005*
+ ID_OUI_FROM_DATABASE=Beijing IQIYI Science & Technology Co., Ltd.
 
-OUI:0015E9*
- ID_OUI_FROM_DATABASE=D-Link Corporation
+OUI:C83B45*
+ ID_OUI_FROM_DATABASE=JRI
 
-OUI:0CFD37*
- ID_OUI_FROM_DATABASE=SUSE Linux GmbH
+OUI:1CEEC9*
+ ID_OUI_FROM_DATABASE=Elo touch solutions
 
-OUI:2CFF65*
- ID_OUI_FROM_DATABASE=Oki Electric Industry Co., Ltd.
+OUI:4CB81C*
+ ID_OUI_FROM_DATABASE=SAM Electronics GmbH
 
-OUI:001CF0*
- ID_OUI_FROM_DATABASE=D-Link Corporation
+OUI:2CDCAD*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
-OUI:00265A*
- ID_OUI_FROM_DATABASE=D-Link Corporation
+OUI:704D7B*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:ACF1DF*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:7CF95C*
+ ID_OUI_FROM_DATABASE=U.I. Lapp GmbH
 
-OUI:FC7516*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:743A65*
+ ID_OUI_FROM_DATABASE=NEC Corporation
 
-OUI:7C18CD*
- ID_OUI_FROM_DATABASE=E-TRON Co.,Ltd.
+OUI:C80CC8*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:C8665D*
- ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
+OUI:0425C5*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:3897D6*
- ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+OUI:A4EE57*
+ ID_OUI_FROM_DATABASE=Seiko Epson Corporation
 
-OUI:C8478C*
- ID_OUI_FROM_DATABASE=Beken Corporation
+OUI:480033*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:E498D6*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:14B31F*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:606944*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:BC8385*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
 
-OUI:001977*
- ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
+OUI:A03D6F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:4018B1*
- ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
+OUI:40605A*
+ ID_OUI_FROM_DATABASE=Hawkeye Tech Co. Ltd
 
-OUI:8896B6*
- ID_OUI_FROM_DATABASE=Global Fire Equipment S.A.
+OUI:C0210D*
+ ID_OUI_FROM_DATABASE=SHENZHEN RF-LINK TECHNOLOGY CO.,LTD.
 
-OUI:188796*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:000678*
+ ID_OUI_FROM_DATABASE=D&M Holdings Inc.
 
-OUI:AC2A0C*
- ID_OUI_FROM_DATABASE=CSR ZHUZHOU INSTITUTE CO.,LTD.
+OUI:886B44*
+ ID_OUI_FROM_DATABASE=Sunnovo International Limited
 
-OUI:F4CA24*
- ID_OUI_FROM_DATABASE=FreeBit Co., Ltd.
+OUI:A408F5*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:000A57*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:54FA96*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:643150*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:1840A4*
+ ID_OUI_FROM_DATABASE=Shenzhen Trylong Smart Science and Technology Co., Ltd.
 
-OUI:002376*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:9C50EE*
+ ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
 
-OUI:0007E9*
- ID_OUI_FROM_DATABASE=Intel Corporation
+OUI:F015B9*
+ ID_OUI_FROM_DATABASE=PlayFusion Limited
 
-OUI:B46D83*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:70700D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:E4FAFD*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:24A7DC*
+ ID_OUI_FROM_DATABASE=BSkyB Ltd
 
-OUI:DC5360*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:2CD02D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:780CB8*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:3478D7*
+ ID_OUI_FROM_DATABASE=Gionee Communication Equipment Co.,Ltd.
 
-OUI:484520*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:1CEFCE*
+ ID_OUI_FROM_DATABASE=bebro electronic GmbH
 
-OUI:004026*
- ID_OUI_FROM_DATABASE=BUFFALO.INC
+OUI:CCB8A8*
+ ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
 
-OUI:0002A5*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:5CFF35*
+ ID_OUI_FROM_DATABASE=Wistron Corporation
 
-OUI:A02BB8*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:78F29E*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
-OUI:6CC217*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:00D0B2*
+ ID_OUI_FROM_DATABASE=Xiotech Corporation
 
-OUI:3863BB*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:000AE4*
+ ID_OUI_FROM_DATABASE=Wistron Corporation
 
-OUI:CC3E5F*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:00262D*
+ ID_OUI_FROM_DATABASE=Wistron Corporation
 
-OUI:7446A0*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:908674*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
 
-OUI:443192*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:F49651*
+ ID_OUI_FROM_DATABASE=NAKAYO Inc
 
-OUI:FC15B4*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:681FD8*
+ ID_OUI_FROM_DATABASE=Siemens Industry, Inc.
 
-OUI:EC9A74*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:C43018*
+ ID_OUI_FROM_DATABASE=MCS Logic Inc.
 
-OUI:80C16E*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:FCB58A*
+ ID_OUI_FROM_DATABASE=Wapice Ltd.
 
-OUI:D07E28*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:DCEFCA*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:7403BD*
- ID_OUI_FROM_DATABASE=BUFFALO.INC
+OUI:E865D4*
+ ID_OUI_FROM_DATABASE=Tenda Technology Co.,Ltd.Dongguan branch
 
-OUI:101F74*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:285261*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001A4B*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:286F7F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001F29*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:089E08*
+ ID_OUI_FROM_DATABASE=Google, Inc.
 
-OUI:00215A*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:00014F*
+ ID_OUI_FROM_DATABASE=Adtran Inc
 
-OUI:000F61*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:045D4B*
+ ID_OUI_FROM_DATABASE=Sony Corporation
 
-OUI:001185*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:A80CCA*
+ ID_OUI_FROM_DATABASE=Shenzhen Sundray Technologies Company Limited
 
-OUI:001279*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:94652D*
+ ID_OUI_FROM_DATABASE=OnePlus Technology (Shenzhen) Co., Ltd
 
-OUI:001708*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:F8A34F*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:2832C5*
- ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
+OUI:845A81*
+ ID_OUI_FROM_DATABASE=ffly4u
 
-OUI:EC4D47*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:347877*
+ ID_OUI_FROM_DATABASE=O-Net Communications (Shenzhen) Limited
 
-OUI:88CF98*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:F483E1*
+ ID_OUI_FROM_DATABASE=Shanghai Clouder Semiconductor Co.,Ltd
 
-OUI:6CE3B6*
- ID_OUI_FROM_DATABASE=Nera Telecommunications Ltd.
+OUI:08CCA7*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:942CB3*
- ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
+OUI:7868F7*
+ ID_OUI_FROM_DATABASE=YSTen Technology Co.,Ltd
 
-OUI:0452F3*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:704F57*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:241EEB*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:3407FB*
+ ID_OUI_FROM_DATABASE=Ericsson AB
 
-OUI:F431C3*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:6CB4A7*
+ ID_OUI_FROM_DATABASE=Landauer, Inc.
 
-OUI:C4F57C*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:F8A5C5*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:8C7CFF*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:A49B13*
+ ID_OUI_FROM_DATABASE=Digital Check
 
-OUI:000CDB*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:542F8A*
+ ID_OUI_FROM_DATABASE=TELLESCOM INDUSTRIA E COMERCIO EM TELECOMUNICACAO
 
-OUI:006069*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:DCC64B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:C87B5B*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:043389*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:98F537*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:A0A33B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001E73*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:6854C1*
+ ID_OUI_FROM_DATABASE=ColorTokens, Inc.
 
-OUI:0019C6*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:887873*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:0015EB*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:6C750D*
+ ID_OUI_FROM_DATABASE=WiFiSONG
 
-OUI:A051C6*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:E45D51*
+ ID_OUI_FROM_DATABASE=SFR
 
-OUI:24D921*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:346E9D*
+ ID_OUI_FROM_DATABASE=Ericsson AB
 
-OUI:848371*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:B816DB*
+ ID_OUI_FROM_DATABASE=CHANT SINCERE CO.,LTD
 
-OUI:7052C5*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:D461FE*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:001B4F*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:54E1AD*
+ ID_OUI_FROM_DATABASE=LCFC(HeFei) Electronics Technology co., ltd
 
-OUI:F0EBD0*
- ID_OUI_FROM_DATABASE=Shanghai Feixun Communication Co.,Ltd.
+OUI:94F551*
+ ID_OUI_FROM_DATABASE=Cadi Scientific Pte Ltd
 
-OUI:D8490B*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:BC452E*
+ ID_OUI_FROM_DATABASE=Knowledge Development for POF S.L.
 
-OUI:888603*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:E8D11B*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
-OUI:F8E811*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:44032C*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:E09796*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:14987D*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:CCCC81*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:D4CF37*
+ ID_OUI_FROM_DATABASE=Symbolic IO
 
-OUI:101B54*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:283F69*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:7054F5*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:F0D2F1*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:D07AB5*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:8871E5*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:C40528*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:7C5049*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:3CDFBD*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:F0A225*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:14B968*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:E048AF*
+ ID_OUI_FROM_DATABASE=Premietech Limited
 
-OUI:80717A*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:2C3311*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:F49FF3*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:503A7D*
+ ID_OUI_FROM_DATABASE=AlphaTech PLC Int’l Co., Ltd.
 
-OUI:2C5BB8*
- ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+OUI:9CFCD1*
+ ID_OUI_FROM_DATABASE=Aetheris Technology (Shanghai) Co., Ltd.
 
-OUI:B0AA36*
- ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+OUI:949901*
+ ID_OUI_FROM_DATABASE=Shenzhen YITOA Digital Appliance CO.,LTD
 
-OUI:784B87*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:E89E0C*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:28A183*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:D8A105*
+ ID_OUI_FROM_DATABASE=Syslane, Co., Ltd.
 
-OUI:5CF8A1*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:C4B9CD*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:6021C0*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:10954B*
+ ID_OUI_FROM_DATABASE=Megabyte Ltd.
 
-OUI:84DBAC*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:900628*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:C07009*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:C4700B*
+ ID_OUI_FROM_DATABASE=GUANGZHOU CHIP TECHNOLOGIES CO.,LTD
 
-OUI:E0191D*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:D4AE05*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:B8BC1B*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:3C0518*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:241FA0*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:04946B*
+ ID_OUI_FROM_DATABASE=TECNO MOBILE LIMITED
 
-OUI:50A72B*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:A04C5B*
+ ID_OUI_FROM_DATABASE=Shenzhen TINNO Mobile Technology Corp.
 
-OUI:C85195*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:98DDEA*
+ ID_OUI_FROM_DATABASE=Infinix mobility limited
 
-OUI:00F81C*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:D4619D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:F4559C*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:B0481A*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:283CE4*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:989E63*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:64A5C3*
+OUI:DCA904*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:001D0F*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:48A195*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:5C63BF*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:6CAB31*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:B0487A*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:503237*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:388345*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:000889*
+ ID_OUI_FROM_DATABASE=Echostar Technologies Corp
 
-OUI:14E6E4*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:2C029F*
+ ID_OUI_FROM_DATABASE=3ALogics
 
-OUI:647002*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:58D9D5*
+ ID_OUI_FROM_DATABASE=Tenda Technology Co.,Ltd.Dongguan branch
 
-OUI:6466B3*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:60E78A*
+ ID_OUI_FROM_DATABASE=UNISEM
 
-OUI:6CE873*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:6C5976*
+ ID_OUI_FROM_DATABASE=Shanghai Tricheer Technology Co.,Ltd.
 
-OUI:08E84F*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:F4A739*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:04BD70*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:2CFAA2*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Enterprise
 
-OUI:18C58A*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:00D095*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Enterprise
 
-OUI:04C06F*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:4095BD*
+ ID_OUI_FROM_DATABASE=NTmore.Co.,Ltd
 
-OUI:5C4CA9*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:2CABEB*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:4C5499*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:BC66DE*
+ ID_OUI_FROM_DATABASE=Shadow Creator Information Technology Co.,Ltd.
 
-OUI:00259E*
+OUI:A0086F*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001882*
+OUI:C4FF1F*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:D4EA0E*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:B4475E*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:90FB5B*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:7C7B8B*
+ ID_OUI_FROM_DATABASE=Control Concepts, Inc.
 
-OUI:14F65A*
+OUI:C40BCB*
  ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:0C1DAF*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:D8C06A*
+ ID_OUI_FROM_DATABASE=Hunantv.com Interactive Entertainment Media Co.,Ltd.
 
-OUI:28E31F*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:9C32A9*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
 
-OUI:F0B429*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:601466*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:00906F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:30D386*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:0090A6*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:900E83*
+ ID_OUI_FROM_DATABASE=Monico Monitoring, Inc.
 
-OUI:0090AB*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:E8BBA8*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:7426AC*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:BC3AEA*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:B000B4*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:8C0EE3*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:2834A2*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:6C5C14*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:641225*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:F894C2*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:544A00*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:7CB960*
+ ID_OUI_FROM_DATABASE=Shanghai X-Cheng telecom LTD
 
-OUI:5067AE*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:A8D579*
+ ID_OUI_FROM_DATABASE=Beijing Chushang Science and Technology Co.,Ltd
 
-OUI:BC16F5*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:28C63F*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:6899CD*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:600837*
+ ID_OUI_FROM_DATABASE=ivvi Scientific(Nanchang)Co.Ltd
 
-OUI:F44E05*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D860B3*
+ ID_OUI_FROM_DATABASE=Guangdong Global Electronic Technology CO.,LTD
 
-OUI:0CF5A4*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:3C9509*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:5CFC66*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:44B412*
+ ID_OUI_FROM_DATABASE=SIUS AG
 
-OUI:D0A5A6*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:3CA308*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:3C5EC3*
+OUI:00F82C*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:64F69D*
+OUI:00C1B1*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:74A2E6*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D0F88C*
+ ID_OUI_FROM_DATABASE=Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.
 
-OUI:204C9E*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:2CB115*
+ ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
-OUI:00112F*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:78ABBB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0011D8*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:1816C9*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001731*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:FC8F90*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0018F3*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:244B03*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:485B39*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:988389*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:F46D04*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:14BB6E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:3085A9*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:1C3ADE*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00900C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:F83F51*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001079*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D8E0E1*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00102F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:50FF20*
+ ID_OUI_FROM_DATABASE=Keenetic Limited
 
-OUI:000E08*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:ECF342*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:00602F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D4C1C8*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:006070*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:EC237B*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:006083*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:881544*
+ ID_OUI_FROM_DATABASE=Cisco Meraki
 
-OUI:00067C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:F44156*
+ ID_OUI_FROM_DATABASE=Arrikto Inc.
 
-OUI:C8D719*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:D4258B*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:CC08E0*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B4F2E8*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:5855CA*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:D0E54D*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:8C7B9D*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:7085C6*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:88C663*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:44AAF5*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:C82A14*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:005094*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:9803D8*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:FC8E7E*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:8C5877*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:00E18C*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:3451C9*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:903EAB*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:E0B9BA*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:14CFE2*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:D023DB*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:900DCB*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:B88D12*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:207355*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:B817C2*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:C83FB4*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:68A86D*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:E0B70A*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:78A3E4*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:78719C*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:54781A*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D40598*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:58971E*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:946269*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:CCD539*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:8C7F3B*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:20BBC0*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:40B7F3*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:4C4E35*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:20E564*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:7CAD74*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:90B134*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:10F311*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:3C438E*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:08CC68*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:E86D52*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:D0C789*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0015D0*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:F84F57*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001DCE*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:34DBFD*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001DD4*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:5CA48A*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001DCD*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:AC7A4D*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:CCA462*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:FC62B9*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:D039B3*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0010A6*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0000C5*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:E86549*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:3C36E4*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:84B517*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00ACE0*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:046273*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:384C90*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:9C57AD*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D40AA9*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:00223A*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:48D343*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001839*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:E02202*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001EE5*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:2C1DB8*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:38C85C*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:E45740*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:F45FD4*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:0023A3*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:002306*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:64ED57*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001E3D*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:0023EE*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0019C1*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:002143*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:BC926B*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:0023AF*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0050E4*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:001ADE*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:003065*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:00159A*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:000A27*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:00080E*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001451*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:0050E3*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0019E3*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:94CCB9*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:002312*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:001E46*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:002332*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:0018C0*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:002436*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:001A66*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:00254B*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:00192C*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0026BB*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:0025F1*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:E80688*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:F87B7A*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:985AEB*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:5856E8*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:2078F0*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:145E45*
+ ID_OUI_FROM_DATABASE=Kaleao Limited
 
-OUI:78D75F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:88D7F6*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:E0ACCB*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:1C1FD4*
+ ID_OUI_FROM_DATABASE=LifeBEAM Technologies LTD
 
-OUI:98E0D9*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:88BD78*
+ ID_OUI_FROM_DATABASE=Flaircomm Microelectronics,Inc.
 
-OUI:C0CECD*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:5092B9*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:70E72C*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B4BFF6*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:D03311*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:C8D7B0*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:847D50*
- ID_OUI_FROM_DATABASE=Holley Metering Limited
+OUI:60720B*
+ ID_OUI_FROM_DATABASE=BLU Products Inc
 
-OUI:6C4A39*
- ID_OUI_FROM_DATABASE=BITA
+OUI:F4A997*
+ ID_OUI_FROM_DATABASE=CANON INC.
 
-OUI:C8B5B7*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:3C4CD0*
+ ID_OUI_FROM_DATABASE=CERAGON NETWORKS
 
-OUI:A8BBCF*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B04E26*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:90B21F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:FC06ED*
+ ID_OUI_FROM_DATABASE=M2Motive Technology Inc.
 
-OUI:B8E856*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:54C9DF*
+ ID_OUI_FROM_DATABASE=FN-LINK TECHNOLOGY LIMITED
 
-OUI:1499E2*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:30C3D9*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
 
-OUI:04214C*
- ID_OUI_FROM_DATABASE=Insight Energy Ventures LLC
+OUI:FC4D8C*
+ ID_OUI_FROM_DATABASE=SHENZHEN PANTE ELECTRONICS TECHNOLOGY CO., LTD
 
-OUI:B418D1*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B01F29*
+ ID_OUI_FROM_DATABASE=Helvetia INC.
 
-OUI:80006E*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:28070D*
+ ID_OUI_FROM_DATABASE=GUANGZHOU WINSOUND INFORMATION TECHNOLOGY CO.,LTD.
 
-OUI:60D9C7*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:7038EE*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:C8F650*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:2CF4C5*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:1C1AC0*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:C8F406*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:E06678*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:3CB15B*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:5C8D4E*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:FCA841*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:64A3CB*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:50CD22*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:44FB42*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:10CDAE*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:F41BA1*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B0ADAA*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:3CE072*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:00549F*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:E88D28*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:6049C1*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:CC785F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:E0D848*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:AC3C0B*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:145BE1*
+ ID_OUI_FROM_DATABASE=nyantec UG (haftungsbeschränkt)
 
-OUI:88CB87*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:00187D*
+ ID_OUI_FROM_DATABASE=Armorlink Co .Ltd
 
-OUI:EC3586*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:F42981*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:F0C1F1*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:3CA348*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:F4F951*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:A40E2B*
+ ID_OUI_FROM_DATABASE=Facebook Inc
 
-OUI:18AF8F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:28FAA0*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:C0F2FB*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:3CB6B7*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:00F76F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:5419C8*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:AC87A3*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:F4B7B3*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:48437C*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:1C4D70*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:34A395*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:E43A6E*
+ ID_OUI_FROM_DATABASE=Shenzhen Zeroone Technology CO.,LTD
 
-OUI:9CF387*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:60DA83*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:A85B78*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:2C5731*
+ ID_OUI_FROM_DATABASE=Wingtech Group (HongKong)Limited
 
-OUI:908D6C*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:F46BEF*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:0C1539*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:085114*
+ ID_OUI_FROM_DATABASE=QINGDAO TOPSCOMM COMMUNICATION CO., LTD
 
-OUI:BC4CC4*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:D05A00*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:0CBC9F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:70F11C*
+ ID_OUI_FROM_DATABASE=Shenzhen Ogemray Technology Co.,Ltd
 
-OUI:A45E60*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:14144B*
+ ID_OUI_FROM_DATABASE=Ruijie Networks Co.,LTD
 
-OUI:680927*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:70DF2F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:60FACD*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:6447E0*
+ ID_OUI_FROM_DATABASE=Feitian Technologies Co., Ltd
 
-OUI:1CABA7*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:001753*
+ ID_OUI_FROM_DATABASE=nFore Technology Inc.
 
-OUI:8CFABA*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:58C583*
+ ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
 
-OUI:5C95AE*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:E86D65*
+ ID_OUI_FROM_DATABASE=AUDIO MOBIL Elektronik GmbH
 
-OUI:E0C97A*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:E86FF2*
+ ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
 
-OUI:BC52B7*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:00016D*
+ ID_OUI_FROM_DATABASE=CarrierComm Inc.
 
-OUI:14109F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:F0B052*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:542696*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:84183A*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:D8D1CB*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:6CAAB3*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:4C8ECC*
- ID_OUI_FROM_DATABASE=SILKAN SA
+OUI:C4017C*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:3CEF8C*
- ID_OUI_FROM_DATABASE=ZHEJIANG DAHUA TECHNOLOGY CO.,LTD.
+OUI:70DEF9*
+ ID_OUI_FROM_DATABASE=FAI WAH INTERNATIONAL (HONG KONG) LIMITED
 
-OUI:98F428*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:001F41*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:7C5A67*
- ID_OUI_FROM_DATABASE=JNC Systems, Inc.
+OUI:C08ADE*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:C4BBEA*
- ID_OUI_FROM_DATABASE=Pakedge Device and Software Inc
+OUI:50A733*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:84100D*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:24C9A1*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:D88B4C*
- ID_OUI_FROM_DATABASE=KingTing Tech.
+OUI:245880*
+ ID_OUI_FROM_DATABASE=VIZEO
 
-OUI:E81363*
- ID_OUI_FROM_DATABASE=Comstock RD, Inc.
+OUI:000726*
+ ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
 
-OUI:6C9354*
- ID_OUI_FROM_DATABASE=Yaojin Technology (Shenzhen) Co., LTD.
+OUI:BC9680*
+ ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
 
-OUI:4054E4*
- ID_OUI_FROM_DATABASE=Wearsafe Labs Inc
+OUI:1CA532*
+ ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
 
-OUI:8CE2DA*
- ID_OUI_FROM_DATABASE=Circle Media Inc
+OUI:0000FE*
+ ID_OUI_FROM_DATABASE=Annapolis Micro Systems, Inc.
 
-OUI:74D7CA*
- ID_OUI_FROM_DATABASE=Panasonic Corporation Automotive
+OUI:188090*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:1CCDE5*
- ID_OUI_FROM_DATABASE=Shanghai Wind Technologies Co.,Ltd
+OUI:BC024A*
+ ID_OUI_FROM_DATABASE=HMD Global Oy
 
-OUI:20896F*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:90A365*
+ ID_OUI_FROM_DATABASE=HMD Global Oy
 
-OUI:D494E8*
+OUI:C444A0*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:F83441*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
+OUI:5C0339*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:B078F0*
- ID_OUI_FROM_DATABASE=Beijing HuaqinWorld Technology Co.,Ltd.
+OUI:044F4C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:3029BE*
- ID_OUI_FROM_DATABASE=Shanghai MRDcom Co.,Ltd
+OUI:1C151F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:7011AE*
- ID_OUI_FROM_DATABASE=Music Life LTD
+OUI:544E45*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:ECB870*
- ID_OUI_FROM_DATABASE=Beijing Heweinet Technology Co.,Ltd.
+OUI:DCEB53*
+ ID_OUI_FROM_DATABASE=Wuhan QianXiao Elecronic Technology CO.,LTD
 
-OUI:3095E3*
- ID_OUI_FROM_DATABASE=SHANGHAI SIMCOM LIMITED
+OUI:94E36D*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:401B5F*
- ID_OUI_FROM_DATABASE=Weifang GoerTek Electronics Co., Ltd.
+OUI:74819A*
+ ID_OUI_FROM_DATABASE=PT. Hartono Istana Teknologi
 
-OUI:4040A7*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:0835B2*
+ ID_OUI_FROM_DATABASE=CoreEdge Networks Co., Ltd
 
-OUI:54BE53*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:6C38A1*
+ ID_OUI_FROM_DATABASE=Ubee Interactive Co., Limited
 
-OUI:A01E0B*
- ID_OUI_FROM_DATABASE=MINIX Technology Limited
+OUI:B40F3B*
+ ID_OUI_FROM_DATABASE=Tenda Technology Co.,Ltd.Dongguan branch
 
-OUI:D48304*
- ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
+OUI:1062D0*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:385F66*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:7802B1*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:544E90*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:309935*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:58FC73*
- ID_OUI_FROM_DATABASE=Arria Live Media, Inc.
+OUI:94D9B3*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:2C1BC8*
- ID_OUI_FROM_DATABASE=Hunan Topview Network System CO.,LTD
+OUI:409BCD*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:5CADCF*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:005C86*
+ ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
 
-OUI:006D52*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:1CAB34*
+ ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
 
-OUI:D888CE*
- ID_OUI_FROM_DATABASE=RF Technology Pty Ltd
+OUI:5C0979*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:D4F4BE*
- ID_OUI_FROM_DATABASE=Palo Alto Networks
+OUI:002EC7*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:B88687*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:488EEF*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:68F956*
- ID_OUI_FROM_DATABASE=Objetivos y Servicio de Valor Añadido
+OUI:002438*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:58B633*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:001BED*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:AC60B6*
- ID_OUI_FROM_DATABASE=Ericsson AB
+OUI:0012F2*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:F4E926*
- ID_OUI_FROM_DATABASE=Tianjin Zanpu Technology Inc.
+OUI:04A151*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:04C23E*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:A42B8C*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:2CFCE4*
- ID_OUI_FROM_DATABASE=CTEK Sweden AB
+OUI:A00460*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:C0B713*
- ID_OUI_FROM_DATABASE=Beijing Xiaoyuer Technology Co. Ltd.
+OUI:9C3DCF*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:DCA3AC*
- ID_OUI_FROM_DATABASE=RBcloudtech
+OUI:2CB05D*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:44656A*
- ID_OUI_FROM_DATABASE=Mega Video Electronic(HK) Industry Co., Ltd
+OUI:504A6E*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:0C9160*
- ID_OUI_FROM_DATABASE=Hui Zhou Gaoshengda Technology Co.,LTD
+OUI:28C68E*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:ECA9FA*
- ID_OUI_FROM_DATABASE=GUANGDONG GENIUS TECHNOLOGY CO.,LTD.
+OUI:2C3033*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:300C23*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:00146C*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:445F8C*
- ID_OUI_FROM_DATABASE=Intercel Group Limited
+OUI:ACFD93*
+ ID_OUI_FROM_DATABASE=Weifang GoerTek Technology Co.,Ltd.
 
-OUI:A48D3B*
- ID_OUI_FROM_DATABASE=Vizio, Inc
+OUI:A45385*
+ ID_OUI_FROM_DATABASE=Weifang GoerTek Technology Co.,Ltd.
 
-OUI:0C756C*
- ID_OUI_FROM_DATABASE=Anaren Microwave, Inc.
+OUI:2C4D79*
+ ID_OUI_FROM_DATABASE=Weifang GoerTek Technology Co.,Ltd.
 
-OUI:5C5188*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:841766*
+ ID_OUI_FROM_DATABASE=Weifang GoerTek Technology Co.,Ltd.
 
-OUI:689AB7*
- ID_OUI_FROM_DATABASE=Atelier Vision Corporation
+OUI:741C27*
+ ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
 
-OUI:640DE6*
- ID_OUI_FROM_DATABASE=Petra Systems
+OUI:111111*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:283713*
- ID_OUI_FROM_DATABASE=Shenzhen 3Nod Digital Technology Co., Ltd.
+OUI:FCC233*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:7CAB25*
- ID_OUI_FROM_DATABASE=MESMO TECHNOLOGY INC.
+OUI:2830AC*
+ ID_OUI_FROM_DATABASE=Frontiir Co. Ltd.
 
-OUI:74042B*
- ID_OUI_FROM_DATABASE=Lenovo Mobile Communication (Wuhan) Company Limited
+OUI:9050CA*
+ ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
 
-OUI:4455B1*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:0004BF*
+ ID_OUI_FROM_DATABASE=VersaLogic Corp.
 
-OUI:A45602*
- ID_OUI_FROM_DATABASE=fenglian Technology Co.,Ltd.
+OUI:D8B12A*
+ ID_OUI_FROM_DATABASE=Panasonic Mobile Communications Co.,Ltd.
 
-OUI:D06A1F*
- ID_OUI_FROM_DATABASE=BSE CO.,LTD.
+OUI:64B5C6*
+ ID_OUI_FROM_DATABASE=Nintendo Co.,Ltd
 
-OUI:A88038*
- ID_OUI_FROM_DATABASE=ShenZhen MovingComm Technology Co., Limited
+OUI:A41115*
+ ID_OUI_FROM_DATABASE=Robert Bosch Engineering and Business Solutions pvt. Ltd.
 
-OUI:805067*
- ID_OUI_FROM_DATABASE=W & D TECHNOLOGY CORPORATION
+OUI:EC0441*
+ ID_OUI_FROM_DATABASE=ShenZhen TIGO Semiconductor Co., Ltd.
 
-OUI:402814*
- ID_OUI_FROM_DATABASE=RFI Engineering
+OUI:BC88C3*
+ ID_OUI_FROM_DATABASE=Ningbo Dooya Mechanic & Electronic Technology Co., Ltd
 
-OUI:102C83*
- ID_OUI_FROM_DATABASE=XIMEA
+OUI:A8BE27*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:D468BA*
- ID_OUI_FROM_DATABASE=Shenzhen Sundray Technologies Company Limited
+OUI:B8634D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:A47B85*
- ID_OUI_FROM_DATABASE=ULTIMEDIA Co Ltd,
+OUI:6C96CF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:CC37AB*
- ID_OUI_FROM_DATABASE=Edgecore Networks Corportation
+OUI:3035AD*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:F80D60*
- ID_OUI_FROM_DATABASE=CANON INC.
+OUI:681F40*
+ ID_OUI_FROM_DATABASE=Blu Wireless Technology Ltd
 
-OUI:E02CB2*
- ID_OUI_FROM_DATABASE=Lenovo Mobile Communication (Wuhan) Company Limited
+OUI:48C58D*
+ ID_OUI_FROM_DATABASE=Lear Corporation GmbH
 
-OUI:DC15DB*
- ID_OUI_FROM_DATABASE=Ge Ruili Intelligent Technology ( Beijing ) Co., Ltd.
+OUI:90ADF7*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:30F335*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:982D68*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co., Ltd
 
-OUI:E89120*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:2CD2E7*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:546172*
- ID_OUI_FROM_DATABASE=ZODIAC AEROSPACE SAS
+OUI:00152A*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:54CD10*
- ID_OUI_FROM_DATABASE=Panasonic Mobile Communications Co.,Ltd.
+OUI:5CEA1D*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:A4A1E4*
- ID_OUI_FROM_DATABASE=Innotube, Inc.
+OUI:A43412*
+ ID_OUI_FROM_DATABASE=Thales Alenia Space
 
-OUI:706879*
- ID_OUI_FROM_DATABASE=Saijo Denki International Co., Ltd.
+OUI:ECD09F*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:343D98*
- ID_OUI_FROM_DATABASE=JinQianMao Technology Co.,Ltd.
+OUI:9C65EE*
+ ID_OUI_FROM_DATABASE=DASAN Network Solutions
 
-OUI:5804CB*
- ID_OUI_FROM_DATABASE=Tianjin Huisun Technology Co.,Ltd.
+OUI:80739F*
+ ID_OUI_FROM_DATABASE=KYOCERA CORPORATION
 
-OUI:1CB72C*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:3889DC*
+ ID_OUI_FROM_DATABASE=Opticon Sensors Europe B.V.
 
-OUI:40B837*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:38E2DD*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:287610*
- ID_OUI_FROM_DATABASE=IgniteNet
+OUI:74E5F9*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:68A378*
- ID_OUI_FROM_DATABASE=FREEBOX SAS
+OUI:0017C8*
+ ID_OUI_FROM_DATABASE=KYOCERA Display Corporation
 
-OUI:746A3A*
- ID_OUI_FROM_DATABASE=Aperi Corporation
+OUI:002294*
+ ID_OUI_FROM_DATABASE=KYOCERA CORPORATION
 
-OUI:1844E6*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:3C11B2*
+ ID_OUI_FROM_DATABASE=Fraunhofer FIT
 
-OUI:A8D409*
- ID_OUI_FROM_DATABASE=USA 111 Inc
+OUI:080070*
+ ID_OUI_FROM_DATABASE=Mitsubishi Precision Co.,LTd.
 
-OUI:3089D3*
- ID_OUI_FROM_DATABASE=HONGKONG UCLOUDLINK NETWORK TECHNOLOGY LIMITED
+OUI:DCF090*
+ ID_OUI_FROM_DATABASE=Nubia Technology Co.,Ltd.
 
-OUI:4CB76D*
- ID_OUI_FROM_DATABASE=Novi Security
+OUI:DC6AEA*
+ ID_OUI_FROM_DATABASE=Infinix mobility limited
 
-OUI:906CAC*
- ID_OUI_FROM_DATABASE=Fortinet, Inc.
+OUI:0025DF*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:00323A*
- ID_OUI_FROM_DATABASE=so-logic
+OUI:D8A01D*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
 
-OUI:64DB81*
- ID_OUI_FROM_DATABASE=Syszone Co., Ltd.
+OUI:8CE38E*
+ ID_OUI_FROM_DATABASE=Toshiba Memory Corporation
 
-OUI:C4BAA3*
- ID_OUI_FROM_DATABASE=Beijing Winicssec Technologies Co., Ltd.
+OUI:74EAC8*
+ ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
 
-OUI:A013CB*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:A434F1*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:20635F*
- ID_OUI_FROM_DATABASE=Abeeway
+OUI:C4F312*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:E00370*
- ID_OUI_FROM_DATABASE=ShenZhen Continental Wireless Technology Co., Ltd.
+OUI:44EAD8*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:709C8F*
- ID_OUI_FROM_DATABASE=Nero AG
+OUI:8C5F48*
+ ID_OUI_FROM_DATABASE=Continental Intelligent Transportation Systems LLC
 
-OUI:807459*
- ID_OUI_FROM_DATABASE=K's Co.,Ltd.
+OUI:A0D86F*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:CC9635*
- ID_OUI_FROM_DATABASE=LVS Co.,Ltd.
+OUI:3890A5*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:700136*
- ID_OUI_FROM_DATABASE=FATEK Automation Corporation
+OUI:4C1365*
+ ID_OUI_FROM_DATABASE=Emplus Technologies
 
-OUI:E03560*
- ID_OUI_FROM_DATABASE=Challenger Supply Holdings, LLC
+OUI:2054FA*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0CB5DE*
- ID_OUI_FROM_DATABASE=Alcatel Lucent
+OUI:989C57*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:04C9D9*
- ID_OUI_FROM_DATABASE=EchoStar Technologies Corp
+OUI:E4A7C5*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:E4CE70*
- ID_OUI_FROM_DATABASE=Health & Life co., Ltd.
+OUI:104400*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:EC5A86*
- ID_OUI_FROM_DATABASE=Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd
+OUI:88DA1A*
+ ID_OUI_FROM_DATABASE=Redpine Signals, Inc.
 
-OUI:F87AEF*
- ID_OUI_FROM_DATABASE=Rosonix Technology, Inc.
+OUI:14CF8D*
+ ID_OUI_FROM_DATABASE=OHSUNG
 
-OUI:C43ABE*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:8CE748*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:18B169*
- ID_OUI_FROM_DATABASE=Sonicwall
+OUI:48D35D*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:D4684D*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:E446DA*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:1CC72D*
- ID_OUI_FROM_DATABASE=Shenzhen Huapu Digital CO.,Ltd
+OUI:500F80*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:38D82F*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:F4F5DB*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:C8D779*
- ID_OUI_FROM_DATABASE=Qingdao Haier Telecom Co.,Ltd
+OUI:38A6CE*
+ ID_OUI_FROM_DATABASE=BSkyB Ltd
 
-OUI:2CA2B4*
- ID_OUI_FROM_DATABASE=Fortify Technologies, LLC
+OUI:1077B0*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:D87495*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:1C398A*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:8C873B*
- ID_OUI_FROM_DATABASE=Leica Camera AG
+OUI:CC0677*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:28E476*
- ID_OUI_FROM_DATABASE=Pi-Coral
+OUI:C84029*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:9C685B*
- ID_OUI_FROM_DATABASE=Octonion SA
+OUI:28BF89*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:ACABBF*
- ID_OUI_FROM_DATABASE=AthenTek Inc.
+OUI:F4573E*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:5C41E7*
- ID_OUI_FROM_DATABASE=Wiatec International Ltd.
+OUI:88947E*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:DC0914*
- ID_OUI_FROM_DATABASE=Talk-A-Phone Co.
+OUI:B0E2E5*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:142971*
- ID_OUI_FROM_DATABASE=NEMOA ELECTRONICS (HK) CO. LTD
+OUI:F0AB54*
+ ID_OUI_FROM_DATABASE=MITSUMI ELECTRIC CO.,LTD.
 
-OUI:B47356*
- ID_OUI_FROM_DATABASE=Hangzhou Treebear Networking Co., Ltd.
+OUI:C449BB*
+ ID_OUI_FROM_DATABASE=MITSUMI ELECTRIC CO.,LTD.
 
-OUI:D88D5C*
- ID_OUI_FROM_DATABASE=Elentec
+OUI:B430C0*
+ ID_OUI_FROM_DATABASE=York Instruments Ltd
 
-OUI:50ADD5*
- ID_OUI_FROM_DATABASE=Dynalec Corporation
+OUI:C468D0*
+ ID_OUI_FROM_DATABASE=VTech Telecommunications Ltd.
 
-OUI:28D98A*
- ID_OUI_FROM_DATABASE=Hangzhou Konke Technology Co.,Ltd.
+OUI:48D6D5*
+ ID_OUI_FROM_DATABASE=Google, Inc.
 
-OUI:BC4DFB*
- ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
+OUI:F0BD2E*
+ ID_OUI_FROM_DATABASE=H+S Polatis Ltd
 
-OUI:40EACE*
- ID_OUI_FROM_DATABASE=FOUNDER BROADBAND NETWORK SERVICE CO.,LTD
+OUI:842C80*
+ ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
 
-OUI:10C67E*
- ID_OUI_FROM_DATABASE=SHENZHEN JUCHIN TECHNOLOGY CO., LTD
+OUI:182D98*
+ ID_OUI_FROM_DATABASE=Jinwoo Industrial system
 
-OUI:3C4937*
- ID_OUI_FROM_DATABASE=ASSMANN Electronic GmbH
+OUI:0C1C20*
+ ID_OUI_FROM_DATABASE=Kakao Corp
 
-OUI:904506*
- ID_OUI_FROM_DATABASE=Tokyo Boeki Medisys Inc.
+OUI:40498A*
+ ID_OUI_FROM_DATABASE=Synapticon GmbH
 
-OUI:80A85D*
- ID_OUI_FROM_DATABASE=Osterhout Design Group
+OUI:D80831*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:9C6C15*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:24F27F*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:EC74BA*
- ID_OUI_FROM_DATABASE=Hirschmann Automation and Control GmbH
+OUI:00B69F*
+ ID_OUI_FROM_DATABASE=Latch
 
-OUI:683C7D*
- ID_OUI_FROM_DATABASE=Magic Intelligence Technology Limited
+OUI:A88200*
+ ID_OUI_FROM_DATABASE=Hisense Electric Co.,Ltd
 
-OUI:60128B*
- ID_OUI_FROM_DATABASE=CANON INC.
+OUI:F449EF*
+ ID_OUI_FROM_DATABASE=EMSTONE
 
-OUI:ECBAFE*
- ID_OUI_FROM_DATABASE=GIROPTIC
+OUI:0C6F9C*
+ ID_OUI_FROM_DATABASE=Shaw Communications Inc.
 
-OUI:E8447E*
- ID_OUI_FROM_DATABASE=Bitdefender SRL
+OUI:1801E3*
+ ID_OUI_FROM_DATABASE=Bittium Wireless Ltd
 
-OUI:84C3E8*
- ID_OUI_FROM_DATABASE=Vaillant GmbH
+OUI:C0AC54*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:B88EC6*
- ID_OUI_FROM_DATABASE=Stateless Networks
+OUI:40F201*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:146B72*
- ID_OUI_FROM_DATABASE=Shenzhen Fortune Ship Technology Co., Ltd.
+OUI:C891F9*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:40A5EF*
- ID_OUI_FROM_DATABASE=Shenzhen Four Seas Global Link Network Technology Co., Ltd.
+OUI:4CFF12*
+ ID_OUI_FROM_DATABASE=Fuze Entertainment Co., ltd
 
-OUI:7C7A53*
- ID_OUI_FROM_DATABASE=Phytrex Technology Corp.
+OUI:0059AC*
+ ID_OUI_FROM_DATABASE=KPN. B.V.
 
-OUI:4886E8*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:AC9A22*
+ ID_OUI_FROM_DATABASE=NXP Semiconductors
 
-OUI:78FC14*
- ID_OUI_FROM_DATABASE=B Communications Pty Ltd
+OUI:006037*
+ ID_OUI_FROM_DATABASE=NXP Semiconductors
 
-OUI:88E161*
- ID_OUI_FROM_DATABASE=Art Beijing Science and Technology Development Co., Ltd.
+OUI:546009*
+ ID_OUI_FROM_DATABASE=Google, Inc.
 
-OUI:B4A9FE*
- ID_OUI_FROM_DATABASE=GHIA Technology (Shenzhen) LTD
+OUI:A47733*
+ ID_OUI_FROM_DATABASE=Google, Inc.
 
-OUI:700FC7*
- ID_OUI_FROM_DATABASE=SHENZHEN IKINLOOP TECHNOLOGY CO.,LTD.
+OUI:94EB2C*
+ ID_OUI_FROM_DATABASE=Google, Inc.
 
-OUI:EC8009*
- ID_OUI_FROM_DATABASE=NovaSparks
+OUI:28BC56*
+ ID_OUI_FROM_DATABASE=EMAC, Inc.
 
-OUI:64002D*
- ID_OUI_FROM_DATABASE=Powerlinq Co., LTD
+OUI:287CDB*
+ ID_OUI_FROM_DATABASE=Hefei  Toycloud Technology Co.,ltd
 
-OUI:101218*
- ID_OUI_FROM_DATABASE=Korins Inc.
+OUI:D0B33F*
+ ID_OUI_FROM_DATABASE=Shenzhen TINNO Mobile Technology Corp.
 
-OUI:B04515*
- ID_OUI_FROM_DATABASE=mira fitness,LLC.
+OUI:00738D*
+ ID_OUI_FROM_DATABASE=Shenzhen TINNO Mobile Technology Corp.
 
-OUI:307512*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:A8CA7B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:A49D49*
- ID_OUI_FROM_DATABASE=Ketra, Inc.
+OUI:ACCF85*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:C09879*
- ID_OUI_FROM_DATABASE=Acer Inc.
+OUI:0CD746*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:1C9ECB*
- ID_OUI_FROM_DATABASE=Beijing Nari Smartchip Microelectronics Company Limited
+OUI:440010*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:D48DD9*
- ID_OUI_FROM_DATABASE=Meld Technology, Inc
+OUI:2435CC*
+ ID_OUI_FROM_DATABASE=Zhongshan Scinan Internet of Things Co.,Ltd.
 
-OUI:2C3796*
- ID_OUI_FROM_DATABASE=CYBO CO.,LTD.
+OUI:2C27D7*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:9470D2*
- ID_OUI_FROM_DATABASE=WINFIRM TECHNOLOGY
+OUI:000F3D*
+ ID_OUI_FROM_DATABASE=D-Link Corporation
 
-OUI:2C2997*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:001195*
+ ID_OUI_FROM_DATABASE=D-Link Corporation
 
-OUI:4CE2F1*
- ID_OUI_FROM_DATABASE=sclak srl
+OUI:0015E9*
+ ID_OUI_FROM_DATABASE=D-Link Corporation
 
-OUI:344DEA*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:0CFD37*
+ ID_OUI_FROM_DATABASE=SUSE Linux GmbH
 
-OUI:908C09*
- ID_OUI_FROM_DATABASE=Total Phase
+OUI:2CFF65*
+ ID_OUI_FROM_DATABASE=Oki Electric Industry Co., Ltd.
 
-OUI:1C7E51*
- ID_OUI_FROM_DATABASE=3bumen.com
+OUI:001CF0*
+ ID_OUI_FROM_DATABASE=D-Link Corporation
 
-OUI:60C798*
- ID_OUI_FROM_DATABASE=Verifone, Inc.
+OUI:00265A*
+ ID_OUI_FROM_DATABASE=D-Link Corporation
 
-OUI:380E7B*
- ID_OUI_FROM_DATABASE=V.P.S. Thai Co., Ltd
+OUI:ACF1DF*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:38F33F*
- ID_OUI_FROM_DATABASE=TATSUNO CORPORATION
+OUI:FC7516*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:28A5EE*
- ID_OUI_FROM_DATABASE=Shenzhen SDGI CATV Co., Ltd
+OUI:7C18CD*
+ ID_OUI_FROM_DATABASE=E-TRON Co.,Ltd.
 
-OUI:94CE31*
- ID_OUI_FROM_DATABASE=CTS Limited
+OUI:3897D6*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:4CBB58*
- ID_OUI_FROM_DATABASE=Chicony Electronics Co., Ltd.
+OUI:C8478C*
+ ID_OUI_FROM_DATABASE=Beken Corporation
 
-OUI:C40006*
- ID_OUI_FROM_DATABASE=Lipi Data Systems Ltd.
+OUI:E498D6*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:789CE7*
- ID_OUI_FROM_DATABASE=Shenzhen Aikede Technology Co., Ltd
+OUI:606944*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:5C2ED2*
- ID_OUI_FROM_DATABASE=ABC(XiSheng) Electronics Co.,Ltd
+OUI:8896B6*
+ ID_OUI_FROM_DATABASE=Global Fire Equipment S.A.
 
-OUI:D8F710*
- ID_OUI_FROM_DATABASE=Libre Wireless Technologies Inc.
+OUI:188796*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:68F728*
- ID_OUI_FROM_DATABASE=LCFC(HeFei) Electronics Technology co., ltd
+OUI:AC2A0C*
+ ID_OUI_FROM_DATABASE=CSR ZHUZHOU INSTITUTE CO.,LTD.
 
-OUI:DCEC06*
- ID_OUI_FROM_DATABASE=Heimi Network Technology Co., Ltd.
+OUI:F4CA24*
+ ID_OUI_FROM_DATABASE=FreeBit Co., Ltd.
 
-OUI:8870EF*
- ID_OUI_FROM_DATABASE=SC Professional Trading Co., Ltd.
+OUI:000A57*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:102F6B*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:643150*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:ACB74F*
- ID_OUI_FROM_DATABASE=METEL s.r.o.
+OUI:002376*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:CCF538*
- ID_OUI_FROM_DATABASE=3isysnetworks
+OUI:0007E9*
+ ID_OUI_FROM_DATABASE=Intel Corporation
 
-OUI:04DEDB*
- ID_OUI_FROM_DATABASE=Rockport Networks Inc
+OUI:B46D83*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:68F06D*
- ID_OUI_FROM_DATABASE=ALONG INDUSTRIAL CO., LIMITED
+OUI:E4FAFD*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:54F876*
- ID_OUI_FROM_DATABASE=ABB AG
+OUI:DC5360*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:4857DD*
- ID_OUI_FROM_DATABASE=Facebook
+OUI:780CB8*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:84930C*
- ID_OUI_FROM_DATABASE=InCoax Networks Europe AB
+OUI:484520*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:D47B35*
- ID_OUI_FROM_DATABASE=NEO Monitors AS
+OUI:004026*
+ ID_OUI_FROM_DATABASE=BUFFALO.INC
 
-OUI:D8FB11*
- ID_OUI_FROM_DATABASE=AXACORE
+OUI:0002A5*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:C8D019*
- ID_OUI_FROM_DATABASE=Shanghai Tigercel Communication Technology Co.,Ltd
+OUI:A02BB8*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:18A958*
- ID_OUI_FROM_DATABASE=PROVISION THAI CO., LTD.
+OUI:6CC217*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:D8DECE*
- ID_OUI_FROM_DATABASE=ISUNG CO.,LTD
+OUI:3863BB*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:CC3E5F*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:7446A0*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:443192*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:FC15B4*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:EC9A74*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:80C16E*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:D07E28*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:7403BD*
+ ID_OUI_FROM_DATABASE=BUFFALO.INC
+
+OUI:101F74*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:001A4B*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:001F29*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:00215A*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:000F61*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:001185*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:001279*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:001708*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:2832C5*
+ ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
+
+OUI:EC4D47*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:88CF98*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:6CE3B6*
+ ID_OUI_FROM_DATABASE=Nera Telecommunications Ltd.
+
+OUI:942CB3*
+ ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
+
+OUI:0452F3*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:241EEB*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:F431C3*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:C87B5B*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:98F537*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:001E73*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:0019C6*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:0015EB*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:F0EBD0*
+ ID_OUI_FROM_DATABASE=Shanghai Feixun Communication Co.,Ltd.
+
+OUI:D8490B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:888603*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:F8E811*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:E09796*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:CCCC81*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:101B54*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:7054F5*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:D07AB5*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:C40528*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:3CDFBD*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:14B968*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:80717A*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:F49FF3*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:784B87*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+
+OUI:28A183*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+
+OUI:5CF8A1*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+
+OUI:6021C0*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+
+OUI:84DBAC*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:C07009*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:E0191D*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:B8BC1B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:241FA0*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:50A72B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:C85195*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:00F81C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:F4559C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:283CE4*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:64A5C3*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:001D0F*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:5C63BF*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:B0487A*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:388345*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:14E6E4*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:647002*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:6466B3*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:6CE873*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:08E84F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:04BD70*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:18C58A*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:04C06F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:5C4CA9*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:4C5499*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:00259E*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:001882*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:00906F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:0090A6*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:0090AB*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:7426AC*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:B000B4*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:2834A2*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:641225*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:544A00*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:5067AE*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:BC16F5*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:6899CD*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:F44E05*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:0CF5A4*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:5CFC66*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:D0A5A6*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:3C5EC3*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:64F69D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:74A2E6*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:204C9E*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:00112F*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
+OUI:0011D8*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
+OUI:001731*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
+OUI:0018F3*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
+OUI:485B39*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
+OUI:F46D04*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
+OUI:3085A9*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
+OUI:00900C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:001079*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:00102F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:000E08*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+
+OUI:00602F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:006070*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:006083*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:00067C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:C8D719*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+
+OUI:CC08E0*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:5855CA*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:8C7B9D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:88C663*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:C82A14*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:9803D8*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:8C5877*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:3451C9*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:E0B9BA*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:D023DB*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:B88D12*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:B817C2*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:68A86D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:78A3E4*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:54781A*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:58971E*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:CCD539*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:20BBC0*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:4C4E35*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:7CAD74*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:10F311*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:08CC68*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:D0C789*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:F84F57*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:34DBFD*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:5CA48A*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:AC7A4D*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+
+OUI:FC62B9*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+
+OUI:0010A6*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:E86549*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:84B517*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:046273*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:9C57AD*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:00223A*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
+
+OUI:001839*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+
+OUI:001EE5*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+
+OUI:38C85C*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
+
+OUI:F45FD4*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
+
+OUI:002306*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+
+OUI:001E3D*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+
+OUI:0019C1*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+
+OUI:BC926B*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:0050E4*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:003065*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:000A27*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:001451*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:0019E3*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:002312*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:002332*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:002436*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:00254B*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:0026BB*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:E80688*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:985AEB*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:2078F0*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:78D75F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:E0ACCB*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:98E0D9*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:C0CECD*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:70E72C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:D03311*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:847D50*
+ ID_OUI_FROM_DATABASE=Holley Metering Limited
+
+OUI:6C4A39*
+ ID_OUI_FROM_DATABASE=BITA
+
+OUI:C8B5B7*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:A8BBCF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:90B21F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:B8E856*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:1499E2*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:04214C*
+ ID_OUI_FROM_DATABASE=Insight Energy Ventures LLC
+
+OUI:B418D1*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:80006E*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:60D9C7*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:C8F650*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:1C1AC0*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:E06678*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:5C8D4E*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:64A3CB*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:44FB42*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:F41BA1*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:3CE072*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:E88D28*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:CC785F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:AC3C0B*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:88CB87*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:EC3586*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:F0C1F1*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:F4F951*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:18AF8F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:C0F2FB*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:00F76F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:AC87A3*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:48437C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:34A395*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:9CF387*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:A85B78*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:908D6C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:0C1539*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:BC4CC4*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:0CBC9F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:A45E60*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:680927*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:60FACD*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:1CABA7*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:8CFABA*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:5C95AE*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:E0C97A*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:BC52B7*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:14109F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:542696*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:D8D1CB*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:4C8ECC*
+ ID_OUI_FROM_DATABASE=SILKAN SA
+
+OUI:98F428*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:7C5A67*
+ ID_OUI_FROM_DATABASE=JNC Systems, Inc.
+
+OUI:C4BBEA*
+ ID_OUI_FROM_DATABASE=Pakedge Device and Software Inc
+
+OUI:84100D*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+
+OUI:D88B4C*
+ ID_OUI_FROM_DATABASE=KingTing Tech.
+
+OUI:6C9354*
+ ID_OUI_FROM_DATABASE=Yaojin Technology (Shenzhen) Co., LTD.
+
+OUI:4054E4*
+ ID_OUI_FROM_DATABASE=Wearsafe Labs Inc
+
+OUI:8CE2DA*
+ ID_OUI_FROM_DATABASE=Circle Media Inc
+
+OUI:74D7CA*
+ ID_OUI_FROM_DATABASE=Panasonic Corporation Automotive
+
+OUI:1CCDE5*
+ ID_OUI_FROM_DATABASE=Shanghai Wind Technologies Co.,Ltd
+
+OUI:D494E8*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:B078F0*
+ ID_OUI_FROM_DATABASE=Beijing HuaqinWorld Technology Co.,Ltd.
+
+OUI:3029BE*
+ ID_OUI_FROM_DATABASE=Shanghai MRDcom Co.,Ltd
+
+OUI:7011AE*
+ ID_OUI_FROM_DATABASE=Music Life LTD
+
+OUI:ECB870*
+ ID_OUI_FROM_DATABASE=Beijing Heweinet Technology Co.,Ltd.
+
+OUI:3095E3*
+ ID_OUI_FROM_DATABASE=SHANGHAI SIMCOM LIMITED
+
+OUI:4040A7*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+
+OUI:54BE53*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:A01E0B*
+ ID_OUI_FROM_DATABASE=MINIX Technology Limited
+
+OUI:D48304*
+ ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
+
+OUI:385F66*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
+
+OUI:544E90*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:58FC73*
+ ID_OUI_FROM_DATABASE=Arria Live Media, Inc.
+
+OUI:2C1BC8*
+ ID_OUI_FROM_DATABASE=Hunan Topview Network System CO.,LTD
+
+OUI:5CADCF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:006D52*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:D888CE*
+ ID_OUI_FROM_DATABASE=RF Technology Pty Ltd
+
+OUI:D4F4BE*
+ ID_OUI_FROM_DATABASE=Palo Alto Networks
+
+OUI:B88687*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+
+OUI:68F956*
+ ID_OUI_FROM_DATABASE=Objetivos y Servicio de Valor Añadido
+
+OUI:F4E926*
+ ID_OUI_FROM_DATABASE=Tianjin Zanpu Technology Inc.
+
+OUI:04C23E*
+ ID_OUI_FROM_DATABASE=HTC Corporation
+
+OUI:2CFCE4*
+ ID_OUI_FROM_DATABASE=CTEK Sweden AB
+
+OUI:C0B713*
+ ID_OUI_FROM_DATABASE=Beijing Xiaoyuer Technology Co. Ltd.
+
+OUI:DCA3AC*
+ ID_OUI_FROM_DATABASE=RBcloudtech
+
+OUI:44656A*
+ ID_OUI_FROM_DATABASE=Mega Video Electronic(HK) Industry Co., Ltd
+
+OUI:0C9160*
+ ID_OUI_FROM_DATABASE=Hui Zhou Gaoshengda Technology Co.,LTD
+
+OUI:ECA9FA*
+ ID_OUI_FROM_DATABASE=GUANGDONG GENIUS TECHNOLOGY CO.,LTD.
+
+OUI:300C23*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:445F8C*
+ ID_OUI_FROM_DATABASE=Intercel Group Limited
+
+OUI:A48D3B*
+ ID_OUI_FROM_DATABASE=Vizio, Inc
+
+OUI:0C756C*
+ ID_OUI_FROM_DATABASE=Anaren Microwave, Inc.
+
+OUI:5C5188*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+
+OUI:689AB7*
+ ID_OUI_FROM_DATABASE=Atelier Vision Corporation
+
+OUI:640DE6*
+ ID_OUI_FROM_DATABASE=Petra Systems
+
+OUI:283713*
+ ID_OUI_FROM_DATABASE=Shenzhen 3Nod Digital Technology Co., Ltd.
+
+OUI:7CAB25*
+ ID_OUI_FROM_DATABASE=MESMO TECHNOLOGY INC.
+
+OUI:74042B*
+ ID_OUI_FROM_DATABASE=Lenovo Mobile Communication (Wuhan) Company Limited
+
+OUI:4455B1*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:A45602*
+ ID_OUI_FROM_DATABASE=fenglian Technology Co.,Ltd.
+
+OUI:D06A1F*
+ ID_OUI_FROM_DATABASE=BSE CO.,LTD.
+
+OUI:A88038*
+ ID_OUI_FROM_DATABASE=ShenZhen MovingComm Technology Co., Limited
+
+OUI:805067*
+ ID_OUI_FROM_DATABASE=W & D TECHNOLOGY CORPORATION
+
+OUI:402814*
+ ID_OUI_FROM_DATABASE=RFI Engineering
+
+OUI:102C83*
+ ID_OUI_FROM_DATABASE=XIMEA
+
+OUI:D468BA*
+ ID_OUI_FROM_DATABASE=Shenzhen Sundray Technologies Company Limited
+
+OUI:A47B85*
+ ID_OUI_FROM_DATABASE=ULTIMEDIA Co Ltd,
+
+OUI:CC37AB*
+ ID_OUI_FROM_DATABASE=Edgecore Networks Corportation
+
+OUI:F80D60*
+ ID_OUI_FROM_DATABASE=CANON INC.
+
+OUI:E02CB2*
+ ID_OUI_FROM_DATABASE=Lenovo Mobile Communication (Wuhan) Company Limited
+
+OUI:DC15DB*
+ ID_OUI_FROM_DATABASE=Ge Ruili Intelligent Technology ( Beijing ) Co., Ltd.
+
+OUI:30F335*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:E89120*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+
+OUI:546172*
+ ID_OUI_FROM_DATABASE=ZODIAC AEROSPACE SAS
+
+OUI:54CD10*
+ ID_OUI_FROM_DATABASE=Panasonic Mobile Communications Co.,Ltd.
+
+OUI:A4A1E4*
+ ID_OUI_FROM_DATABASE=Innotube, Inc.
+
+OUI:706879*
+ ID_OUI_FROM_DATABASE=Saijo Denki International Co., Ltd.
+
+OUI:343D98*
+ ID_OUI_FROM_DATABASE=JinQianMao Technology Co.,Ltd.
+
+OUI:5804CB*
+ ID_OUI_FROM_DATABASE=Tianjin Huisun Technology Co.,Ltd.
+
+OUI:1CB72C*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
+OUI:40B837*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+
+OUI:287610*
+ ID_OUI_FROM_DATABASE=IgniteNet
+
+OUI:68A378*
+ ID_OUI_FROM_DATABASE=FREEBOX SAS
+
+OUI:746A3A*
+ ID_OUI_FROM_DATABASE=Aperi Corporation
+
+OUI:1844E6*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:A8D409*
+ ID_OUI_FROM_DATABASE=USA 111 Inc
+
+OUI:3089D3*
+ ID_OUI_FROM_DATABASE=HONGKONG UCLOUDLINK NETWORK TECHNOLOGY LIMITED
+
+OUI:4CB76D*
+ ID_OUI_FROM_DATABASE=Novi Security
+
+OUI:906CAC*
+ ID_OUI_FROM_DATABASE=Fortinet, Inc.
+
+OUI:00323A*
+ ID_OUI_FROM_DATABASE=so-logic
+
+OUI:64DB81*
+ ID_OUI_FROM_DATABASE=Syszone Co., Ltd.
+
+OUI:C4BAA3*
+ ID_OUI_FROM_DATABASE=Beijing Winicssec Technologies Co., Ltd.
+
+OUI:20635F*
+ ID_OUI_FROM_DATABASE=Abeeway
+
+OUI:E00370*
+ ID_OUI_FROM_DATABASE=ShenZhen Continental Wireless Technology Co., Ltd.
+
+OUI:709C8F*
+ ID_OUI_FROM_DATABASE=Nero AG
+
+OUI:807459*
+ ID_OUI_FROM_DATABASE=K's Co.,Ltd.
+
+OUI:CC9635*
+ ID_OUI_FROM_DATABASE=LVS Co.,Ltd.
+
+OUI:700136*
+ ID_OUI_FROM_DATABASE=FATEK Automation Corporation
+
+OUI:E03560*
+ ID_OUI_FROM_DATABASE=Challenger Supply Holdings, LLC
+
+OUI:0CB5DE*
+ ID_OUI_FROM_DATABASE=Alcatel Lucent
+
+OUI:E4CE70*
+ ID_OUI_FROM_DATABASE=Health & Life co., Ltd.
+
+OUI:EC5A86*
+ ID_OUI_FROM_DATABASE=Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd
+
+OUI:F87AEF*
+ ID_OUI_FROM_DATABASE=Rosonix Technology, Inc.
+
+OUI:C43ABE*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+
+OUI:18B169*
+ ID_OUI_FROM_DATABASE=Sonicwall
+
+OUI:1CC72D*
+ ID_OUI_FROM_DATABASE=Shenzhen Huapu Digital CO.,Ltd
+
+OUI:38D82F*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:C8D779*
+ ID_OUI_FROM_DATABASE=Qingdao Haier Telecom Co.,Ltd
+
+OUI:2CA2B4*
+ ID_OUI_FROM_DATABASE=Fortify Technologies, LLC
+
+OUI:D87495*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:8C873B*
+ ID_OUI_FROM_DATABASE=Leica Camera AG
+
+OUI:28E476*
+ ID_OUI_FROM_DATABASE=Pi-Coral
+
+OUI:9C685B*
+ ID_OUI_FROM_DATABASE=Octonion SA
+
+OUI:ACABBF*
+ ID_OUI_FROM_DATABASE=AthenTek Inc.
+
+OUI:5C41E7*
+ ID_OUI_FROM_DATABASE=Wiatec International Ltd.
+
+OUI:DC0914*
+ ID_OUI_FROM_DATABASE=Talk-A-Phone Co.
+
+OUI:142971*
+ ID_OUI_FROM_DATABASE=NEMOA ELECTRONICS (HK) CO. LTD
+
+OUI:B47356*
+ ID_OUI_FROM_DATABASE=Hangzhou Treebear Networking Co., Ltd.
+
+OUI:D88D5C*
+ ID_OUI_FROM_DATABASE=Elentec
+
+OUI:50ADD5*
+ ID_OUI_FROM_DATABASE=Dynalec Corporation
+
+OUI:28D98A*
+ ID_OUI_FROM_DATABASE=Hangzhou Konke Technology Co.,Ltd.
+
+OUI:BC4DFB*
+ ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
+
+OUI:40EACE*
+ ID_OUI_FROM_DATABASE=FOUNDER BROADBAND NETWORK SERVICE CO.,LTD
+
+OUI:10C67E*
+ ID_OUI_FROM_DATABASE=SHENZHEN JUCHIN TECHNOLOGY CO., LTD
+
+OUI:3C4937*
+ ID_OUI_FROM_DATABASE=ASSMANN Electronic GmbH
+
+OUI:904506*
+ ID_OUI_FROM_DATABASE=Tokyo Boeki Medisys Inc.
+
+OUI:80A85D*
+ ID_OUI_FROM_DATABASE=Osterhout Design Group
+
+OUI:9C6C15*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
+
+OUI:EC74BA*
+ ID_OUI_FROM_DATABASE=Hirschmann Automation and Control GmbH
+
+OUI:683C7D*
+ ID_OUI_FROM_DATABASE=Magic Intelligence Technology Limited
+
+OUI:60128B*
+ ID_OUI_FROM_DATABASE=CANON INC.
+
+OUI:ECBAFE*
+ ID_OUI_FROM_DATABASE=GIROPTIC
+
+OUI:E8447E*
+ ID_OUI_FROM_DATABASE=Bitdefender SRL
+
+OUI:84C3E8*
+ ID_OUI_FROM_DATABASE=Vaillant GmbH
+
+OUI:B88EC6*
+ ID_OUI_FROM_DATABASE=Stateless Networks
+
+OUI:146B72*
+ ID_OUI_FROM_DATABASE=Shenzhen Fortune Ship Technology Co., Ltd.
+
+OUI:40A5EF*
+ ID_OUI_FROM_DATABASE=Shenzhen Four Seas Global Link Network Technology Co., Ltd.
+
+OUI:7C7A53*
+ ID_OUI_FROM_DATABASE=Phytrex Technology Corp.
+
+OUI:4886E8*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
+
+OUI:88E161*
+ ID_OUI_FROM_DATABASE=Art Beijing Science and Technology Development Co., Ltd.
+
+OUI:B4A9FE*
+ ID_OUI_FROM_DATABASE=GHIA Technology (Shenzhen) LTD
+
+OUI:700FC7*
+ ID_OUI_FROM_DATABASE=SHENZHEN IKINLOOP TECHNOLOGY CO.,LTD.
+
+OUI:EC8009*
+ ID_OUI_FROM_DATABASE=NovaSparks
+
+OUI:64002D*
+ ID_OUI_FROM_DATABASE=Powerlinq Co., LTD
+
+OUI:101218*
+ ID_OUI_FROM_DATABASE=Korins Inc.
+
+OUI:B04515*
+ ID_OUI_FROM_DATABASE=mira fitness,LLC.
+
+OUI:307512*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+
+OUI:A49D49*
+ ID_OUI_FROM_DATABASE=Ketra, Inc.
+
+OUI:C09879*
+ ID_OUI_FROM_DATABASE=Acer Inc.
+
+OUI:1C9ECB*
+ ID_OUI_FROM_DATABASE=Beijing Nari Smartchip Microelectronics Company Limited
+
+OUI:D48DD9*
+ ID_OUI_FROM_DATABASE=Meld Technology, Inc
+
+OUI:2C3796*
+ ID_OUI_FROM_DATABASE=CYBO CO.,LTD.
+
+OUI:9470D2*
+ ID_OUI_FROM_DATABASE=WINFIRM TECHNOLOGY
+
+OUI:2C2997*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
+
+OUI:4CE2F1*
+ ID_OUI_FROM_DATABASE=sclak srl
+
+OUI:344DEA*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:908C09*
+ ID_OUI_FROM_DATABASE=Total Phase
+
+OUI:1C7E51*
+ ID_OUI_FROM_DATABASE=3bumen.com
+
+OUI:380E7B*
+ ID_OUI_FROM_DATABASE=V.P.S. Thai Co., Ltd
+
+OUI:38F33F*
+ ID_OUI_FROM_DATABASE=TATSUNO CORPORATION
+
+OUI:28A5EE*
+ ID_OUI_FROM_DATABASE=Shenzhen SDGI CATV Co., Ltd
+
+OUI:94CE31*
+ ID_OUI_FROM_DATABASE=CTS Limited
+
+OUI:4CBB58*
+ ID_OUI_FROM_DATABASE=Chicony Electronics Co., Ltd.
+
+OUI:C40006*
+ ID_OUI_FROM_DATABASE=Lipi Data Systems Ltd.
+
+OUI:789CE7*
+ ID_OUI_FROM_DATABASE=Shenzhen Aikede Technology Co., Ltd
+
+OUI:5C2ED2*
+ ID_OUI_FROM_DATABASE=ABC(XiSheng) Electronics Co.,Ltd
+
+OUI:D8F710*
+ ID_OUI_FROM_DATABASE=Libre Wireless Technologies Inc.
+
+OUI:68F728*
+ ID_OUI_FROM_DATABASE=LCFC(HeFei) Electronics Technology co., ltd
+
+OUI:DCEC06*
+ ID_OUI_FROM_DATABASE=Heimi Network Technology Co., Ltd.
+
+OUI:8870EF*
+ ID_OUI_FROM_DATABASE=SC Professional Trading Co., Ltd.
+
+OUI:102F6B*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
+
+OUI:ACB74F*
+ ID_OUI_FROM_DATABASE=METEL s.r.o.
+
+OUI:CCF538*
+ ID_OUI_FROM_DATABASE=3isysnetworks
+
+OUI:04DEDB*
+ ID_OUI_FROM_DATABASE=Rockport Networks Inc
+
+OUI:68F06D*
+ ID_OUI_FROM_DATABASE=ALONG INDUSTRIAL CO., LIMITED
+
+OUI:54F876*
+ ID_OUI_FROM_DATABASE=ABB AG
+
+OUI:84930C*
+ ID_OUI_FROM_DATABASE=InCoax Networks Europe AB
+
+OUI:D47B35*
+ ID_OUI_FROM_DATABASE=NEO Monitors AS
+
+OUI:D8FB11*
+ ID_OUI_FROM_DATABASE=AXACORE
+
+OUI:C8D019*
+ ID_OUI_FROM_DATABASE=Shanghai Tigercel Communication Technology Co.,Ltd
+
+OUI:18A958*
+ ID_OUI_FROM_DATABASE=PROVISION THAI CO., LTD.
+
+OUI:D8DECE*
+ ID_OUI_FROM_DATABASE=ISUNG CO.,LTD
 
 OUI:2053CA*
  ID_OUI_FROM_DATABASE=Risk Technology Ltd
 
-OUI:142BD6*
- ID_OUI_FROM_DATABASE=Guangdong Appscomm Co.,Ltd
+OUI:142BD6*
+ ID_OUI_FROM_DATABASE=Guangdong Appscomm Co.,Ltd
+
+OUI:B025AA*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:408256*
+ ID_OUI_FROM_DATABASE=Continental Automotive GmbH
+
+OUI:D866EE*
+ ID_OUI_FROM_DATABASE=BOXIN COMMUNICATION CO.,LTD.
+
+OUI:3C189F*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:2829CC*
+ ID_OUI_FROM_DATABASE=Corsa Technology Incorporated
+
+OUI:FC790B*
+ ID_OUI_FROM_DATABASE=Hitachi High Technologies America, Inc.
+
+OUI:28E6E9*
+ ID_OUI_FROM_DATABASE=SIS Sat Internet Services GmbH
+
+OUI:BC4E5D*
+ ID_OUI_FROM_DATABASE=ZhongMiao Technology Co., Ltd.
+
+OUI:08F728*
+ ID_OUI_FROM_DATABASE=GLOBO Multimedia Sp. z o.o. Sp.k.
+
+OUI:70720D*
+ ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
+
+OUI:8401A7*
+ ID_OUI_FROM_DATABASE=Greyware Automation Products, Inc
+
+OUI:C4C9EC*
+ ID_OUI_FROM_DATABASE=Gugaoo   HK Limited
+
+OUI:F406A5*
+ ID_OUI_FROM_DATABASE=Hangzhou Bianfeng Networking Technology Co., Ltd.
+
+OUI:4C3909*
+ ID_OUI_FROM_DATABASE=HPL Electric & Power Private Limited
+
+OUI:7CFE4E*
+ ID_OUI_FROM_DATABASE=Shenzhen Safe vision Technology Co.,LTD
+
+OUI:54EF92*
+ ID_OUI_FROM_DATABASE=Shenzhen Elink Technology Co., LTD
+
+OUI:800E24*
+ ID_OUI_FROM_DATABASE=ForgetBox
+
+OUI:FCE186*
+ ID_OUI_FROM_DATABASE=A3M Co., LTD
+
+OUI:CCB691*
+ ID_OUI_FROM_DATABASE=NECMagnusCommunications
+
+OUI:40167E*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
+OUI:C89F1D*
+ ID_OUI_FROM_DATABASE=SHENZHEN COMMUNICATION TECHNOLOGIES CO.,LTD
+
+OUI:983713*
+ ID_OUI_FROM_DATABASE=PT.Navicom Indonesia
+
+OUI:ACA919*
+ ID_OUI_FROM_DATABASE=TrekStor GmbH
+
+OUI:84850A*
+ ID_OUI_FROM_DATABASE=Hella Sonnen- und Wetterschutztechnik GmbH
+
+OUI:183009*
+ ID_OUI_FROM_DATABASE=Woojin Industrial Systems Co., Ltd.
+
+OUI:6081F9*
+ ID_OUI_FROM_DATABASE=Helium Systems, Inc
+
+OUI:34C5D0*
+ ID_OUI_FROM_DATABASE=Hagleitner Hygiene International GmbH
+
+OUI:74DBD1*
+ ID_OUI_FROM_DATABASE=Ebay Inc
+
+OUI:3431C4*
+ ID_OUI_FROM_DATABASE=AVM GmbH
+
+OUI:DC537C*
+ ID_OUI_FROM_DATABASE=Compal Broadband Networks, Inc.
+
+OUI:A00627*
+ ID_OUI_FROM_DATABASE=NEXPA System
+
+OUI:303335*
+ ID_OUI_FROM_DATABASE=Boosty
+
+OUI:18D5B6*
+ ID_OUI_FROM_DATABASE=SMG Holdings LLC
+
+OUI:C8FF77*
+ ID_OUI_FROM_DATABASE=Dyson Limited
+
+OUI:DCF110*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:54DF00*
+ ID_OUI_FROM_DATABASE=Ulterius Technologies, LLC
+
+OUI:E01D38*
+ ID_OUI_FROM_DATABASE=Beijing HuaqinWorld Technology Co.,Ltd
+
+OUI:D80CCF*
+ ID_OUI_FROM_DATABASE=C.G.V. S.A.S.
+
+OUI:143DF2*
+ ID_OUI_FROM_DATABASE=Beijing Shidai Hongyuan Network Communication Co.,Ltd
+
+OUI:B0D59D*
+ ID_OUI_FROM_DATABASE=Shenzhen Zowee Technology Co., Ltd
+
+OUI:C4913A*
+ ID_OUI_FROM_DATABASE=Shenzhen Sanland Electronic Co., ltd.
+
+OUI:A46032*
+ ID_OUI_FROM_DATABASE=MRV Communications (Networks) LTD
+
+OUI:205A00*
+ ID_OUI_FROM_DATABASE=Coval
+
+OUI:0C2026*
+ ID_OUI_FROM_DATABASE=noax Technologies AG
+
+OUI:880FB6*
+ ID_OUI_FROM_DATABASE=Jabil Circuits India Pvt Ltd,-EHTP unit
+
+OUI:C4626B*
+ ID_OUI_FROM_DATABASE=ZPT Vigantice
+
+OUI:74F85D*
+ ID_OUI_FROM_DATABASE=Berkeley Nucleonics Corp
+
+OUI:48EE07*
+ ID_OUI_FROM_DATABASE=Silver Palm Technologies LLC
+
+OUI:9CFBF1*
+ ID_OUI_FROM_DATABASE=MESOMATIC GmbH & Co.KG
+
+OUI:94C014*
+ ID_OUI_FROM_DATABASE=Sorter Sp. j. Konrad Grzeszczyk MichaA, Ziomek
+
+OUI:1027BE*
+ ID_OUI_FROM_DATABASE=TVIP
+
+OUI:2087AC*
+ ID_OUI_FROM_DATABASE=AES motomation
+
+OUI:A824EB*
+ ID_OUI_FROM_DATABASE=ZAO NPO Introtest
+
+OUI:447E76*
+ ID_OUI_FROM_DATABASE=Trek Technology (S) Pte Ltd
+
+OUI:E8FC60*
+ ID_OUI_FROM_DATABASE=ELCOM Innovations Private Limited
+
+OUI:1CFCBB*
+ ID_OUI_FROM_DATABASE=Realfiction ApS
+
+OUI:B0EC8F*
+ ID_OUI_FROM_DATABASE=GMX SAS
+
+OUI:C40E45*
+ ID_OUI_FROM_DATABASE=ACK Networks,Inc.
+
+OUI:5C254C*
+ ID_OUI_FROM_DATABASE=Avire Global Pte Ltd
+
+OUI:7C1A03*
+ ID_OUI_FROM_DATABASE=8Locations Co., Ltd.
+
+OUI:481842*
+ ID_OUI_FROM_DATABASE=Shanghai Winaas Co. Equipment Co. Ltd.
+
+OUI:D09C30*
+ ID_OUI_FROM_DATABASE=Foster Electric Company, Limited
+
+OUI:78FEE2*
+ ID_OUI_FROM_DATABASE=Shanghai Diveo Technology Co., Ltd
+
+OUI:386C9B*
+ ID_OUI_FROM_DATABASE=Ivy Biomedical
+
+OUI:E44C6C*
+ ID_OUI_FROM_DATABASE=Shenzhen Guo Wei Electronic Co,. Ltd.
+
+OUI:008B43*
+ ID_OUI_FROM_DATABASE=RFTECH
+
+OUI:2C957F*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:242642*
+ ID_OUI_FROM_DATABASE=SHARP Corporation.
+
+OUI:282246*
+ ID_OUI_FROM_DATABASE=Beijing Sinoix Communication Co., LTD
+
+OUI:FC1607*
+ ID_OUI_FROM_DATABASE=Taian Technology(Wuxi) Co.,Ltd.
+
+OUI:CC89FD*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:E86183*
+ ID_OUI_FROM_DATABASE=Black Diamond Advanced Technology, LLC
+
+OUI:C4824E*
+ ID_OUI_FROM_DATABASE=Changzhou Uchip Electronics Co., LTD.
+
+OUI:24A87D*
+ ID_OUI_FROM_DATABASE=Panasonic Automotive Systems Asia Pacific(Thailand)Co.,Ltd.
+
+OUI:78EC74*
+ ID_OUI_FROM_DATABASE=Kyland-USA
+
+OUI:28C825*
+ ID_OUI_FROM_DATABASE=DellKing Industrial Co., Ltd
+
+OUI:64E892*
+ ID_OUI_FROM_DATABASE=Morio Denki Co., Ltd.
+
+OUI:086DF2*
+ ID_OUI_FROM_DATABASE=Shenzhen MIMOWAVE Technology Co.,Ltd
+
+OUI:48D0CF*
+ ID_OUI_FROM_DATABASE=Universal Electronics, Inc.
+
+OUI:DCC793*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:E03F49*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
+OUI:D8EE78*
+ ID_OUI_FROM_DATABASE=Moog Protokraft
+
+OUI:F4B6E5*
+ ID_OUI_FROM_DATABASE=TerraSem Co.,Ltd
+
+OUI:28BB59*
+ ID_OUI_FROM_DATABASE=RNET Technologies, Inc.
+
+OUI:7C8D91*
+ ID_OUI_FROM_DATABASE=Shanghai Hongzhuo Information Technology co.,LTD
+
+OUI:A881F1*
+ ID_OUI_FROM_DATABASE=BMEYE B.V.
+
+OUI:241148*
+ ID_OUI_FROM_DATABASE=Entropix, LLC
+
+OUI:30B5C2*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:F85C45*
+ ID_OUI_FROM_DATABASE=IC Nexus Co. Ltd.
+
+OUI:04DB8A*
+ ID_OUI_FROM_DATABASE=Suntech International Ltd.
+
+OUI:083F76*
+ ID_OUI_FROM_DATABASE=Intellian Technologies, Inc.
+
+OUI:D0634D*
+ ID_OUI_FROM_DATABASE=Meiko Maschinenbau GmbH &amp; Co. KG
+
+OUI:889CA6*
+ ID_OUI_FROM_DATABASE=BTB Korea INC
+
+OUI:B0DA00*
+ ID_OUI_FROM_DATABASE=CERA ELECTRONIQUE
+
+OUI:447098*
+ ID_OUI_FROM_DATABASE=MING HONG TECHNOLOGY (SHEN ZHEN) LIMITED
+
+OUI:00EEBD*
+ ID_OUI_FROM_DATABASE=HTC Corporation
+
+OUI:48B5A7*
+ ID_OUI_FROM_DATABASE=Glory Horse Industries Ltd.
+
+OUI:DC5E36*
+ ID_OUI_FROM_DATABASE=Paterson Technology
+
+OUI:50E0C7*
+ ID_OUI_FROM_DATABASE=TurControlSystme AG
+
+OUI:9CD643*
+ ID_OUI_FROM_DATABASE=D-Link International
+
+OUI:28FC51*
+ ID_OUI_FROM_DATABASE=The Electric Controller and Manufacturing Co., LLC
+
+OUI:34A5E1*
+ ID_OUI_FROM_DATABASE=Sensorist ApS
+
+OUI:A4E9A3*
+ ID_OUI_FROM_DATABASE=Honest Technology Co., Ltd
+
+OUI:C4E92F*
+ ID_OUI_FROM_DATABASE=AB Sciex
+
+OUI:9C216A*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:F862AA*
+ ID_OUI_FROM_DATABASE=xn systems
+
+OUI:A4059E*
+ ID_OUI_FROM_DATABASE=STA Infinity LLP
+
+OUI:6C15F9*
+ ID_OUI_FROM_DATABASE=Nautronix Limited
+
+OUI:680AD7*
+ ID_OUI_FROM_DATABASE=Yancheng Kecheng Optoelectronic Technology Co., Ltd
+
+OUI:BC8893*
+ ID_OUI_FROM_DATABASE=VILLBAU Ltd.
+
+OUI:643F5F*
+ ID_OUI_FROM_DATABASE=Exablaze
+
+OUI:E8F226*
+ ID_OUI_FROM_DATABASE=MILLSON CUSTOM SOLUTIONS INC.
+
+OUI:7060DE*
+ ID_OUI_FROM_DATABASE=LaVision GmbH
+
+OUI:FCFE77*
+ ID_OUI_FROM_DATABASE=Hitachi Reftechno, Inc.
+
+OUI:70533F*
+ ID_OUI_FROM_DATABASE=Alfa Instrumentos Eletronicos Ltda.
+
+OUI:448A5B*
+ ID_OUI_FROM_DATABASE=Micro-Star INT'L CO., LTD.
+
+OUI:68193F*
+ ID_OUI_FROM_DATABASE=Digital Airways
+
+OUI:5CD61F*
+ ID_OUI_FROM_DATABASE=Qardio, Inc
+
+OUI:902083*
+ ID_OUI_FROM_DATABASE=General Engine Management Systems Ltd.
+
+OUI:14B126*
+ ID_OUI_FROM_DATABASE=Industrial Software Co
+
+OUI:C03580*
+ ID_OUI_FROM_DATABASE=A&R TECH
+
+OUI:1446E4*
+ ID_OUI_FROM_DATABASE=AVISTEL
+
+OUI:907990*
+ ID_OUI_FROM_DATABASE=Benchmark Electronics Romania SRL
+
+OUI:C49380*
+ ID_OUI_FROM_DATABASE=Speedytel technology
+
+OUI:B4A82B*
+ ID_OUI_FROM_DATABASE=Histar Digital Electronics Co., Ltd.
+
+OUI:60A9B0*
+ ID_OUI_FROM_DATABASE=Merchandising Technologies, Inc
+
+OUI:007DFA*
+ ID_OUI_FROM_DATABASE=Volkswagen Group of America
+
+OUI:6024C1*
+ ID_OUI_FROM_DATABASE=Jiangsu Zhongxun Electronic Technology Co., Ltd
+
+OUI:6C5AB5*
+ ID_OUI_FROM_DATABASE=TCL Technoly Electronics (Huizhou) Co., Ltd.
+
+OUI:88789C*
+ ID_OUI_FROM_DATABASE=Game Technologies SA
+
+OUI:18AA45*
+ ID_OUI_FROM_DATABASE=Fon Technology
+
+OUI:549359*
+ ID_OUI_FROM_DATABASE=SHENZHEN TWOWING TECHNOLOGIES CO.,LTD.
+
+OUI:284430*
+ ID_OUI_FROM_DATABASE=GenesisTechnical Systems (UK) Ltd
+
+OUI:9843DA*
+ ID_OUI_FROM_DATABASE=INTERTECH
+
+OUI:B07908*
+ ID_OUI_FROM_DATABASE=Cummings Engineering
+
+OUI:04CB1D*
+ ID_OUI_FROM_DATABASE=Traka plc
+
+OUI:B87AC9*
+ ID_OUI_FROM_DATABASE=Siemens Ltd.
+
+OUI:B0989F*
+ ID_OUI_FROM_DATABASE=LG CNS
+
+OUI:3C300C*
+ ID_OUI_FROM_DATABASE=Dewar Electronics Pty Ltd
+
+OUI:78B5D2*
+ ID_OUI_FROM_DATABASE=Ever Treasure Industrial Limited
+
+OUI:A409CB*
+ ID_OUI_FROM_DATABASE=Alfred Kaercher GmbH &amp; Co KG
+
+OUI:C445EC*
+ ID_OUI_FROM_DATABASE=Shanghai Yali Electron Co.,LTD
+
+OUI:E8611F*
+ ID_OUI_FROM_DATABASE=Dawning Information Industry Co.,Ltd
+
+OUI:0CA694*
+ ID_OUI_FROM_DATABASE=Sunitec Enterprise Co.,Ltd
+
+OUI:146080*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:986CF5*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:78491D*
+ ID_OUI_FROM_DATABASE=The Will-Burt Company
+
+OUI:74D435*
+ ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
+
+OUI:840F45*
+ ID_OUI_FROM_DATABASE=Shanghai GMT Digital Technologies Co., Ltd
+
+OUI:D8270C*
+ ID_OUI_FROM_DATABASE=MaxTronic International Co., Ltd.
+
+OUI:E80410*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:8C088B*
+ ID_OUI_FROM_DATABASE=Remote Solution
+
+OUI:A47760*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:24A495*
+ ID_OUI_FROM_DATABASE=Thales Canada Inc.
+
+OUI:883612*
+ ID_OUI_FROM_DATABASE=SRC Computers, LLC
+
+OUI:E0A198*
+ ID_OUI_FROM_DATABASE=NOJA Power Switchgear Pty Ltd
+
+OUI:CC7B35*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:04D437*
+ ID_OUI_FROM_DATABASE=ZNV
+
+OUI:CCF407*
+ ID_OUI_FROM_DATABASE=EUKREA ELECTROMATIQUE SARL
+
+OUI:BC2BD7*
+ ID_OUI_FROM_DATABASE=Revogi Innovation Co., Ltd.
+
+OUI:24ECD6*
+ ID_OUI_FROM_DATABASE=CSG Science & Technology Co.,Ltd.Hefei
+
+OUI:102279*
+ ID_OUI_FROM_DATABASE=ZeroDesktop, Inc.
+
+OUI:CC4AE1*
+ ID_OUI_FROM_DATABASE=fourtec -Fourier Technologies
+
+OUI:A4895B*
+ ID_OUI_FROM_DATABASE=ARK INFOSOLUTIONS PVT LTD
+
+OUI:38EC11*
+ ID_OUI_FROM_DATABASE=Novatek Microelectronics Corp.
+
+OUI:A8CCC5*
+ ID_OUI_FROM_DATABASE=Saab AB (publ)
+
+OUI:988E4A*
+ ID_OUI_FROM_DATABASE=NOXUS(BEIJING) TECHNOLOGY CO.,LTD
+
+OUI:1C4158*
+ ID_OUI_FROM_DATABASE=Gemalto M2M GmbH
+
+OUI:541B5D*
+ ID_OUI_FROM_DATABASE=Techno-Innov
+
+OUI:78CB33*
+ ID_OUI_FROM_DATABASE=DHC Software Co.,Ltd
+
+OUI:507691*
+ ID_OUI_FROM_DATABASE=Tekpea, Inc.
+
+OUI:A4C0C7*
+ ID_OUI_FROM_DATABASE=ShenZhen Hitom Communication Technology Co..LTD
+
+OUI:EC2257*
+ ID_OUI_FROM_DATABASE=JiangSu NanJing University Electronic Information Technology Co.,Ltd
+
+OUI:341A4C*
+ ID_OUI_FROM_DATABASE=SHENZHEN WEIBU ELECTRONICS CO.,LTD.
+
+OUI:A09BBD*
+ ID_OUI_FROM_DATABASE=Total Aviation Solutions Pty Ltd
+
+OUI:E8481F*
+ ID_OUI_FROM_DATABASE=Advanced Automotive Antennas
+
+OUI:18D6CF*
+ ID_OUI_FROM_DATABASE=Kurth Electronic GmbH
+
+OUI:E07F88*
+ ID_OUI_FROM_DATABASE=EVIDENCE Network SIA
+
+OUI:1C7CC7*
+ ID_OUI_FROM_DATABASE=Coriant GmbH
+
+OUI:542CEA*
+ ID_OUI_FROM_DATABASE=PROTECTRON
+
+OUI:00C5DB*
+ ID_OUI_FROM_DATABASE=Datatech Sistemas Digitales Avanzados SL
+
+OUI:109AB9*
+ ID_OUI_FROM_DATABASE=Tosibox Oy
+
+OUI:F842FB*
+ ID_OUI_FROM_DATABASE=Yasuda Joho Co.,ltd.
+
+OUI:887398*
+ ID_OUI_FROM_DATABASE=K2E Tekpoint
+
+OUI:68EE96*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
+
+OUI:FC6018*
+ ID_OUI_FROM_DATABASE=Zhejiang Kangtai Electric Co., Ltd.
+
+OUI:303EAD*
+ ID_OUI_FROM_DATABASE=Sonavox Canada Inc
+
+OUI:444A65*
+ ID_OUI_FROM_DATABASE=Silverflare Ltd.
+
+OUI:50A0BF*
+ ID_OUI_FROM_DATABASE=Alba Fiber Systems Inc.
+
+OUI:3C977E*
+ ID_OUI_FROM_DATABASE=IPS Technology Limited
+
+OUI:F02405*
+ ID_OUI_FROM_DATABASE=OPUS High Technology Corporation
+
+OUI:D8B04C*
+ ID_OUI_FROM_DATABASE=Jinan USR IOT Technology Co., Ltd.
+
+OUI:646EEA*
+ ID_OUI_FROM_DATABASE=Iskratel d.o.o.
+
+OUI:043D98*
+ ID_OUI_FROM_DATABASE=ChongQing QingJia Electronics CO.,LTD
+
+OUI:E8BB3D*
+ ID_OUI_FROM_DATABASE=Sino Prime-Tech Limited
+
+OUI:98CDB4*
+ ID_OUI_FROM_DATABASE=Virident Systems, Inc.
+
+OUI:54E3B0*
+ ID_OUI_FROM_DATABASE=JVL Industri Elektronik
+
+OUI:640B4A*
+ ID_OUI_FROM_DATABASE=Digital Telecom Technology Limited
+
+OUI:F42012*
+ ID_OUI_FROM_DATABASE=Cuciniale GmbH
+
+OUI:4C21D0*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+
+OUI:18104E*
+ ID_OUI_FROM_DATABASE=CEDINT-UPM
+
+OUI:2C7B84*
+ ID_OUI_FROM_DATABASE=OOO Petr Telegin
+
+OUI:540536*
+ ID_OUI_FROM_DATABASE=Vivago Oy
+
+OUI:E0FAEC*
+ ID_OUI_FROM_DATABASE=Platan sp. z o.o. sp. k.
+
+OUI:F08EDB*
+ ID_OUI_FROM_DATABASE=VeloCloud Networks
+
+OUI:B8DC87*
+ ID_OUI_FROM_DATABASE=IAI Corporation
+
+OUI:7C6FF8*
+ ID_OUI_FROM_DATABASE=ShenZhen ACTO Digital Video Technology Co.,Ltd.
+
+OUI:8C4B59*
+ ID_OUI_FROM_DATABASE=3D Imaging & Simulations Corp
+
+OUI:A4FB8D*
+ ID_OUI_FROM_DATABASE=Hangzhou Dunchong Technology Co.Ltd
+
+OUI:0075E1*
+ ID_OUI_FROM_DATABASE=Ampt, LLC
+
+OUI:CC04B4*
+ ID_OUI_FROM_DATABASE=Select Comfort
+
+OUI:284FCE*
+ ID_OUI_FROM_DATABASE=Liaoning Wontel Science and Technology Development Co.,Ltd.
+
+OUI:0CC81F*
+ ID_OUI_FROM_DATABASE=Summer Infant, Inc.
+
+OUI:D86960*
+ ID_OUI_FROM_DATABASE=Steinsvik
+
+OUI:442AFF*
+ ID_OUI_FROM_DATABASE=E3 Technology, Inc.
+
+OUI:0C9301*
+ ID_OUI_FROM_DATABASE=PT. Prasimax Inovasi Teknologi
+
+OUI:60699B*
+ ID_OUI_FROM_DATABASE=isepos GmbH
+
+OUI:B830A8*
+ ID_OUI_FROM_DATABASE=Road-Track Telematics Development
+
+OUI:542160*
+ ID_OUI_FROM_DATABASE=Resolution Products
+
+OUI:88462A*
+ ID_OUI_FROM_DATABASE=Telechips Inc.
+
+OUI:A897DC*
+ ID_OUI_FROM_DATABASE=IBM
+
+OUI:E8DE27*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:FC229C*
+ ID_OUI_FROM_DATABASE=Han Kyung I Net Co.,Ltd.
+
+OUI:148692*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:1832A2*
+ ID_OUI_FROM_DATABASE=LAON TECHNOLOGY CO., LTD.
+
+OUI:985C93*
+ ID_OUI_FROM_DATABASE=SBG Systems SAS
+
+OUI:64E599*
+ ID_OUI_FROM_DATABASE=EFM Networks
+
+OUI:F499AC*
+ ID_OUI_FROM_DATABASE=WEBER Schraubautomaten GmbH
+
+OUI:8CC7D0*
+ ID_OUI_FROM_DATABASE=zhejiang ebang communication co.,ltd
+
+OUI:70820E*
+ ID_OUI_FROM_DATABASE=as electronics GmbH
+
+OUI:DC2BCA*
+ ID_OUI_FROM_DATABASE=Zera GmbH
+
+OUI:508D6F*
+ ID_OUI_FROM_DATABASE=CHAHOO Limited
+
+OUI:68831A*
+ ID_OUI_FROM_DATABASE=Pandora Mobility Corporation
+
+OUI:D4223F*
+ ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
+
+OUI:0868D0*
+ ID_OUI_FROM_DATABASE=Japan System Design
+
+OUI:103DEA*
+ ID_OUI_FROM_DATABASE=HFC Technology (Beijing) Ltd. Co.
+
+OUI:2C7B5A*
+ ID_OUI_FROM_DATABASE=Milper Ltd
+
+OUI:185AE8*
+ ID_OUI_FROM_DATABASE=Zenotech.Co.,Ltd
+
+OUI:E0AEED*
+ ID_OUI_FROM_DATABASE=LOENK
+
+OUI:D4EE07*
+ ID_OUI_FROM_DATABASE=HIWIFI Co., Ltd.
+
+OUI:908260*
+ ID_OUI_FROM_DATABASE=IEEE 1904.1 Working Group
+
+OUI:FCAD0F*
+ ID_OUI_FROM_DATABASE=QTS NETWORKS
+
+OUI:984C04*
+ ID_OUI_FROM_DATABASE=Zhangzhou Keneng Electrical Equipment Co Ltd
+
+OUI:CC047C*
+ ID_OUI_FROM_DATABASE=G-WAY Microwave
+
+OUI:44F849*
+ ID_OUI_FROM_DATABASE=Union Pacific Railroad
+
+OUI:1CFA68*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:D0BE2C*
+ ID_OUI_FROM_DATABASE=CNSLink Co., Ltd.
+
+OUI:281878*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
+
+OUI:E457A8*
+ ID_OUI_FROM_DATABASE=Stuart Manufacturing, Inc.
+
+OUI:2481AA*
+ ID_OUI_FROM_DATABASE=KSH International Co., Ltd.
+
+OUI:789966*
+ ID_OUI_FROM_DATABASE=Musilab Electronics (DongGuan)Co.,Ltd.
+
+OUI:EC2C49*
+ ID_OUI_FROM_DATABASE=University of Tokyo
+
+OUI:CC5D57*
+ ID_OUI_FROM_DATABASE=Information  System Research Institute,Inc.
+
+OUI:1C37BF*
+ ID_OUI_FROM_DATABASE=Cloudium Systems Ltd.
+
+OUI:249504*
+ ID_OUI_FROM_DATABASE=SFR
+
+OUI:308999*
+ ID_OUI_FROM_DATABASE=Guangdong East Power Co.,
+
+OUI:D4A499*
+ ID_OUI_FROM_DATABASE=InView Technology Corporation
+
+OUI:AC4122*
+ ID_OUI_FROM_DATABASE=Eclipse Electronic Systems Inc.
+
+OUI:A073FC*
+ ID_OUI_FROM_DATABASE=Rancore Technologies Private Limited
+
+OUI:846223*
+ ID_OUI_FROM_DATABASE=Shenzhen Coship Electronics Co., Ltd.
+
+OUI:A4E991*
+ ID_OUI_FROM_DATABASE=SISTEMAS AUDIOVISUALES ITELSIS S.L.
+
+OUI:84F493*
+ ID_OUI_FROM_DATABASE=OMS spol. s.r.o.
+
+OUI:386793*
+ ID_OUI_FROM_DATABASE=Asia Optical Co., Inc.
+
+OUI:BCD177*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:C8B373*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+
+OUI:983071*
+ ID_OUI_FROM_DATABASE=DAIKYUNG VASCOM
+
+OUI:0C0400*
+ ID_OUI_FROM_DATABASE=Jantar d.o.o.
+
+OUI:C04301*
+ ID_OUI_FROM_DATABASE=Epec Oy
+
+OUI:687CD5*
+ ID_OUI_FROM_DATABASE=Y Soft Corporation, a.s.
+
+OUI:E07C62*
+ ID_OUI_FROM_DATABASE=Whistle Labs, Inc.
+
+OUI:FC4499*
+ ID_OUI_FROM_DATABASE=Swarco LEA d.o.o.
+
+OUI:0C8484*
+ ID_OUI_FROM_DATABASE=Zenovia Electronics Inc.
+
+OUI:5CF370*
+ ID_OUI_FROM_DATABASE=CC&C Technologies, Inc
+
+OUI:A01C05*
+ ID_OUI_FROM_DATABASE=NIMAX TELECOM CO.,LTD.
+
+OUI:F80DEA*
+ ID_OUI_FROM_DATABASE=ZyCast Technology Inc.
+
+OUI:1800DB*
+ ID_OUI_FROM_DATABASE=Fitbit Inc.
+
+OUI:50A715*
+ ID_OUI_FROM_DATABASE=Aboundi, Inc.
+
+OUI:FC35E6*
+ ID_OUI_FROM_DATABASE=Visteon corp
+
+OUI:D866C6*
+ ID_OUI_FROM_DATABASE=Shenzhen Daystar Technology Co.,ltd
+
+OUI:1836FC*
+ ID_OUI_FROM_DATABASE=Elecsys International Corporation
+
+OUI:F48139*
+ ID_OUI_FROM_DATABASE=CANON INC.
+
+OUI:D40BB9*
+ ID_OUI_FROM_DATABASE=Solid Semecs bv.
+
+OUI:748E08*
+ ID_OUI_FROM_DATABASE=Bestek Corp.
+
+OUI:B8C855*
+ ID_OUI_FROM_DATABASE=Shanghai GBCOM Communication Technology Co.,Ltd.
+
+OUI:C47DFE*
+ ID_OUI_FROM_DATABASE=A.N. Solutions GmbH
+
+OUI:E031D0*
+ ID_OUI_FROM_DATABASE=SZ Telstar CO., LTD
+
+OUI:70C6AC*
+ ID_OUI_FROM_DATABASE=Bosch Automotive Aftermarket
+
+OUI:2C69BA*
+ ID_OUI_FROM_DATABASE=RF Controls, LLC
+
+OUI:DC5726*
+ ID_OUI_FROM_DATABASE=Power-One
+
+OUI:2C245F*
+ ID_OUI_FROM_DATABASE=Babolat VS
+
+OUI:D464F7*
+ ID_OUI_FROM_DATABASE=CHENGDU USEE DIGITAL TECHNOLOGY CO., LTD
+
+OUI:A47ACF*
+ ID_OUI_FROM_DATABASE=VIBICOM COMMUNICATIONS INC.
+
+OUI:CC3C3F*
+ ID_OUI_FROM_DATABASE=SA.S.S. Datentechnik AG
+
+OUI:905692*
+ ID_OUI_FROM_DATABASE=Autotalks Ltd.
+
+OUI:0C2AE7*
+ ID_OUI_FROM_DATABASE=Beijing General Research Institute of Mining and Metallurgy
+
+OUI:DCD52A*
+ ID_OUI_FROM_DATABASE=Sunny Heart Limited
+
+OUI:C4C755*
+ ID_OUI_FROM_DATABASE=Beijing HuaqinWorld Technology Co.,Ltd
+
+OUI:9C79AC*
+ ID_OUI_FROM_DATABASE=Suntec Software(Shanghai) Co., Ltd.
+
+OUI:F8DFA8*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:ACA430*
+ ID_OUI_FROM_DATABASE=Peerless AV
+
+OUI:B4AB2C*
+ ID_OUI_FROM_DATABASE=MtM Technology Corporation
+
+OUI:74372F*
+ ID_OUI_FROM_DATABASE=Tongfang Shenzhen Cloudcomputing Technology Co.,Ltd
+
+OUI:BC51FE*
+ ID_OUI_FROM_DATABASE=Swann communications Pty Ltd
+
+OUI:D40FB2*
+ ID_OUI_FROM_DATABASE=Applied Micro Electronics AME bv
+
+OUI:74FE48*
+ ID_OUI_FROM_DATABASE=ADVANTECH CO., LTD.
+
+OUI:D0B498*
+ ID_OUI_FROM_DATABASE=Robert Bosch LLC Automotive Electronics
+
+OUI:80B95C*
+ ID_OUI_FROM_DATABASE=ELFTECH Co., Ltd.
+
+OUI:E85AA7*
+ ID_OUI_FROM_DATABASE=LLC Emzior
+
+OUI:242FFA*
+ ID_OUI_FROM_DATABASE=Toshiba Global Commerce Solutions
+
+OUI:A0BAB8*
+ ID_OUI_FROM_DATABASE=Pixon Imaging
+
+OUI:9CE1D6*
+ ID_OUI_FROM_DATABASE=Junger Audio-Studiotechnik GmbH
+
+OUI:E4E409*
+ ID_OUI_FROM_DATABASE=LEIFHEIT AG
+
+OUI:004D32*
+ ID_OUI_FROM_DATABASE=Andon Health Co.,Ltd.
+
+OUI:C46DF1*
+ ID_OUI_FROM_DATABASE=DataGravity
+
+OUI:28D244*
+ ID_OUI_FROM_DATABASE=LCFC(HeFei) Electronics Technology Co., Ltd.
+
+OUI:ACE87E*
+ ID_OUI_FROM_DATABASE=Bytemark Computer Consulting Ltd
+
+OUI:60CDC5*
+ ID_OUI_FROM_DATABASE=Taiwan Carol Electronics., Ltd
+
+OUI:60C5A8*
+ ID_OUI_FROM_DATABASE=Beijing LT Honway Technology Co.,Ltd
+
+OUI:B4DF3B*
+ ID_OUI_FROM_DATABASE=Chromlech
+
+OUI:A46E79*
+ ID_OUI_FROM_DATABASE=DFT System Co.Ltd
+
+OUI:94DE80*
+ ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
+
+OUI:C88A83*
+ ID_OUI_FROM_DATABASE=Dongguan HuaHong Electronics Co.,Ltd
+
+OUI:0CC655*
+ ID_OUI_FROM_DATABASE=Wuxi YSTen Technology Co.,Ltd.
+
+OUI:D410CF*
+ ID_OUI_FROM_DATABASE=Huanshun Network Science and Technology Co., Ltd.
+
+OUI:B80415*
+ ID_OUI_FROM_DATABASE=Bayan Audio
+
+OUI:84C8B1*
+ ID_OUI_FROM_DATABASE=Incognito Software Systems Inc.
+
+OUI:645A04*
+ ID_OUI_FROM_DATABASE=Chicony Electronics Co., Ltd.
+
+OUI:5C89D4*
+ ID_OUI_FROM_DATABASE=Beijing Banner Electric Co.,Ltd
+
+OUI:984CD3*
+ ID_OUI_FROM_DATABASE=Mantis Deposition
+
+OUI:8C4CDC*
+ ID_OUI_FROM_DATABASE=PLANEX COMMUNICATIONS INC.
+
+OUI:D063B4*
+ ID_OUI_FROM_DATABASE=SolidRun Ltd.
+
+OUI:2C3BFD*
+ ID_OUI_FROM_DATABASE=Netstor Technology Co., Ltd.
+
+OUI:F073AE*
+ ID_OUI_FROM_DATABASE=PEAK-System Technik
+
+OUI:684CA8*
+ ID_OUI_FROM_DATABASE=Shenzhen Herotel Tech. Co., Ltd.
+
+OUI:F4472A*
+ ID_OUI_FROM_DATABASE=Nanjing Rousing Sci. and Tech. Industrial Co., Ltd
+
+OUI:185253*
+ ID_OUI_FROM_DATABASE=Pixord Corporation
+
+OUI:FCA9B0*
+ ID_OUI_FROM_DATABASE=MIARTECH (SHANGHAI),INC.
+
+OUI:80D733*
+ ID_OUI_FROM_DATABASE=QSR Automations, Inc.
+
+OUI:8C3330*
+ ID_OUI_FROM_DATABASE=EmFirst Co., Ltd.
+
+OUI:08E5DA*
+ ID_OUI_FROM_DATABASE=NANJING FUJITSU COMPUTER PRODUCTS CO.,LTD.
+
+OUI:5884E4*
+ ID_OUI_FROM_DATABASE=IP500 Alliance e.V.
+
+OUI:04E9E5*
+ ID_OUI_FROM_DATABASE=PJRC.COM, LLC
+
+OUI:703811*
+ ID_OUI_FROM_DATABASE=Invensys Rail
+
+OUI:ACE64B*
+ ID_OUI_FROM_DATABASE=Shenzhen Baojia Battery Technology Co., Ltd.
+
+OUI:303294*
+ ID_OUI_FROM_DATABASE=W-IE-NE-R Plein & Baus GmbH
+
+OUI:EC473C*
+ ID_OUI_FROM_DATABASE=Redwire, LLC
+
+OUI:5481AD*
+ ID_OUI_FROM_DATABASE=Eagle Research Corporation
+
+OUI:7C822D*
+ ID_OUI_FROM_DATABASE=Nortec
+
+OUI:745FAE*
+ ID_OUI_FROM_DATABASE=TSL PPL
+
+OUI:8462A6*
+ ID_OUI_FROM_DATABASE=EuroCB (Phils), Inc.
+
+OUI:80FA5B*
+ ID_OUI_FROM_DATABASE=CLEVO CO.
+
+OUI:E4F365*
+ ID_OUI_FROM_DATABASE=Time-O-Matic, Inc.
+
+OUI:18550F*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
+
+OUI:1C9179*
+ ID_OUI_FROM_DATABASE=Integrated System Technologies Ltd
+
+OUI:38F597*
+ ID_OUI_FROM_DATABASE=home2net GmbH
+
+OUI:386645*
+ ID_OUI_FROM_DATABASE=OOSIC Technology CO.,Ltd
+
+OUI:D0DFB2*
+ ID_OUI_FROM_DATABASE=Genie Networks Limited
+
+OUI:808B5C*
+ ID_OUI_FROM_DATABASE=Shenzhen Runhuicheng Technology Co., Ltd
+
+OUI:04586F*
+ ID_OUI_FROM_DATABASE=Sichuan Whayer information industry Co.,LTD
+
+OUI:449B78*
+ ID_OUI_FROM_DATABASE=The Now Factory
+
+OUI:D052A8*
+ ID_OUI_FROM_DATABASE=Physical Graph Corporation
+
+OUI:34F62D*
+ ID_OUI_FROM_DATABASE=SHARP Corporation
+
+OUI:C4EBE3*
+ ID_OUI_FROM_DATABASE=RRCN SAS
+
+OUI:4C1A95*
+ ID_OUI_FROM_DATABASE=Novakon Co., Ltd.
+
+OUI:C04A00*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:9C3178*
+ ID_OUI_FROM_DATABASE=Foshan Huadian Intelligent Communications Teachnologies Co.,Ltd
+
+OUI:48BE2D*
+ ID_OUI_FROM_DATABASE=Symanitron
+
+OUI:B86091*
+ ID_OUI_FROM_DATABASE=Onnet Technologies and Innovations LLC
+
+OUI:201A06*
+ ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
+
+OUI:D4CA6E*
+ ID_OUI_FROM_DATABASE=u-blox AG
+
+OUI:C011A6*
+ ID_OUI_FROM_DATABASE=Fort-Telecom ltd.
+
+OUI:B8DAF1*
+ ID_OUI_FROM_DATABASE=Strahlenschutz- Entwicklungs- und Ausruestungsgesellschaft mbH
+
+OUI:1C11E1*
+ ID_OUI_FROM_DATABASE=Wartsila Finland Oy
+
+OUI:50465D*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
+OUI:74BFA1*
+ ID_OUI_FROM_DATABASE=HYUNTECK
+
+OUI:F8AA8A*
+ ID_OUI_FROM_DATABASE=Axview Technology (Shenzhen) Co.,Ltd
+
+OUI:5894CF*
+ ID_OUI_FROM_DATABASE=Vertex Standard LMR, Inc.
+
+OUI:2C5AA3*
+ ID_OUI_FROM_DATABASE=PROMATE ELECTRONIC CO.LTD
+
+OUI:B4009C*
+ ID_OUI_FROM_DATABASE=CableWorld Ltd.
+
+OUI:803FD6*
+ ID_OUI_FROM_DATABASE=bytes at work AG
+
+OUI:645FFF*
+ ID_OUI_FROM_DATABASE=Nicolet Neuro
+
+OUI:2829D9*
+ ID_OUI_FROM_DATABASE=GlobalBeiMing technology (Beijing)Co. Ltd
+
+OUI:189A67*
+ ID_OUI_FROM_DATABASE=CSE-Servelec Limited
+
+OUI:38A5B6*
+ ID_OUI_FROM_DATABASE=SHENZHEN MEGMEET ELECTRICAL CO.,LTD
+
+OUI:E43FA2*
+ ID_OUI_FROM_DATABASE=Wuxi DSP Technologies Inc.
+
+OUI:00FD4C*
+ ID_OUI_FROM_DATABASE=NEVATEC
+
+OUI:6045BD*
+ ID_OUI_FROM_DATABASE=Microsoft
+
+OUI:9C54CA*
+ ID_OUI_FROM_DATABASE=Zhengzhou VCOM Science and Technology Co.,Ltd
+
+OUI:388AB7*
+ ID_OUI_FROM_DATABASE=ITC Networks
+
+OUI:BCC23A*
+ ID_OUI_FROM_DATABASE=Thomson Video Networks
+
+OUI:00BF15*
+ ID_OUI_FROM_DATABASE=Genetec Inc.
+
+OUI:20F85E*
+ ID_OUI_FROM_DATABASE=Delta Electronics
+
+OUI:68CE4E*
+ ID_OUI_FROM_DATABASE=L-3 Communications Infrared Products
+
+OUI:68B6FC*
+ ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
+
+OUI:7C160D*
+ ID_OUI_FROM_DATABASE=Saia-Burgess Controls AG
+
+OUI:A4D18F*
+ ID_OUI_FROM_DATABASE=Shenzhen Skyee Optical Fiber Communication Technology Ltd.
+
+OUI:0C565C*
+ ID_OUI_FROM_DATABASE=HyBroad Vision (Hong Kong) Technology Co Ltd
+
+OUI:649FF7*
+ ID_OUI_FROM_DATABASE=Kone OYj
+
+OUI:4C068A*
+ ID_OUI_FROM_DATABASE=Basler Electric Company
+
+OUI:E0A30F*
+ ID_OUI_FROM_DATABASE=Pevco
+
+OUI:5C1737*
+ ID_OUI_FROM_DATABASE=I-View Now, LLC.
+
+OUI:049C62*
+ ID_OUI_FROM_DATABASE=BMT Medical Technology s.r.o.
+
+OUI:C4BA99*
+ ID_OUI_FROM_DATABASE=I+ME Actia Informatik und Mikro-Elektronik GmbH
+
+OUI:0C2A69*
+ ID_OUI_FROM_DATABASE=electric imp, incorporated
+
+OUI:BC811F*
+ ID_OUI_FROM_DATABASE=Ingate Systems
+
+OUI:34E0CF*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:6C40C6*
+ ID_OUI_FROM_DATABASE=Nimbus Data Systems, Inc.
+
+OUI:503F56*
+ ID_OUI_FROM_DATABASE=Syncmold Enterprise Corp
+
+OUI:D04CC1*
+ ID_OUI_FROM_DATABASE=SINTRONES Technology Corp.
+
+OUI:DC9FA4*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:44C39B*
+ ID_OUI_FROM_DATABASE=OOO RUBEZH NPO
+
+OUI:58C232*
+ ID_OUI_FROM_DATABASE=NEC Corporation
+
+OUI:D8C691*
+ ID_OUI_FROM_DATABASE=Hichan Technology Corp.
+
+OUI:7C02BC*
+ ID_OUI_FROM_DATABASE=Hansung Electronics Co. LTD
+
+OUI:1848D8*
+ ID_OUI_FROM_DATABASE=Fastback Networks
+
+OUI:702393*
+ ID_OUI_FROM_DATABASE=fos4X GmbH
+
+OUI:58ECE1*
+ ID_OUI_FROM_DATABASE=Newport Corporation
+
+OUI:14358B*
+ ID_OUI_FROM_DATABASE=Mediabridge Products, LLC.
+
+OUI:34996F*
+ ID_OUI_FROM_DATABASE=VPI Engineering
+
+OUI:241064*
+ ID_OUI_FROM_DATABASE=Shenzhen Ecsino Tecnical Co. Ltd
+
+OUI:10D1DC*
+ ID_OUI_FROM_DATABASE=INSTAR Deutschland GmbH
+
+OUI:D8160A*
+ ID_OUI_FROM_DATABASE=Nippon Electro-Sensory Devices
+
+OUI:F45433*
+ ID_OUI_FROM_DATABASE=Rockwell Automation
+
+OUI:EC9327*
+ ID_OUI_FROM_DATABASE=MEMMERT GmbH + Co. KG
+
+OUI:1C43EC*
+ ID_OUI_FROM_DATABASE=JAPAN CIRCUIT CO.,LTD
+
+OUI:BC28D6*
+ ID_OUI_FROM_DATABASE=Rowley Associates Limited
+
+OUI:F05F5A*
+ ID_OUI_FROM_DATABASE=Getriebebau NORD GmbH and Co. KG
+
+OUI:009569*
+ ID_OUI_FROM_DATABASE=LSD Science and Technology Co.,Ltd.
+
+OUI:34C803*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:5011EB*
+ ID_OUI_FROM_DATABASE=SilverNet Ltd
+
+OUI:5CD41B*
+ ID_OUI_FROM_DATABASE=UCZOON Technology Co., LTD
+
+OUI:783CE3*
+ ID_OUI_FROM_DATABASE=Kai-EE
+
+OUI:0868EA*
+ ID_OUI_FROM_DATABASE=EITO ELECTRONICS CO., LTD.
+
+OUI:5C4A26*
+ ID_OUI_FROM_DATABASE=Enguity Technology Corp
+
+OUI:289EDF*
+ ID_OUI_FROM_DATABASE=Danfoss Turbocor Compressors, Inc
+
+OUI:50053D*
+ ID_OUI_FROM_DATABASE=CyWee Group Ltd
+
+OUI:4C64D9*
+ ID_OUI_FROM_DATABASE=Guangdong Leawin Group Co., Ltd
+
+OUI:7CB03E*
+ ID_OUI_FROM_DATABASE=OSRAM GmbH
+
+OUI:14B1C8*
+ ID_OUI_FROM_DATABASE=InfiniWing, Inc.
+
+OUI:C0493D*
+ ID_OUI_FROM_DATABASE=MAITRISE TECHNOLOGIQUE
+
+OUI:34A7BA*
+ ID_OUI_FROM_DATABASE=Fischer International Systems Corporation
+
+OUI:ACD364*
+ ID_OUI_FROM_DATABASE=ABB SPA, ABB SACE DIV.
+
+OUI:38F8B7*
+ ID_OUI_FROM_DATABASE=V2COM PARTICIPACOES S.A.
+
+OUI:B48255*
+ ID_OUI_FROM_DATABASE=Research Products Corporation
+
+OUI:2C750F*
+ ID_OUI_FROM_DATABASE=Shanghai Dongzhou-Lawton Communication Technology Co. Ltd.
+
+OUI:B40418*
+ ID_OUI_FROM_DATABASE=Smartchip Integrated Inc.
+
+OUI:F4EA67*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:D0AEEC*
+ ID_OUI_FROM_DATABASE=Alpha Networks Inc.
+
+OUI:3C98BF*
+ ID_OUI_FROM_DATABASE=Quest Controls, Inc.
+
+OUI:D05785*
+ ID_OUI_FROM_DATABASE=Pantech Co., Ltd.
+
+OUI:045C06*
+ ID_OUI_FROM_DATABASE=Zmodo Technology Corporation
+
+OUI:504A5E*
+ ID_OUI_FROM_DATABASE=Masimo Corporation
+
+OUI:38BF33*
+ ID_OUI_FROM_DATABASE=NEC CASIO Mobile Communications
+
+OUI:A041A7*
+ ID_OUI_FROM_DATABASE=NL Ministry of Defense
+
+OUI:342F6E*
+ ID_OUI_FROM_DATABASE=Anywire corporation
+
+OUI:E86D6E*
+ ID_OUI_FROM_DATABASE=voestalpine SIGNALING Fareham Ltd.
+
+OUI:F8D462*
+ ID_OUI_FROM_DATABASE=Pumatronix Equipamentos Eletronicos Ltda.
+
+OUI:5453ED*
+ ID_OUI_FROM_DATABASE=Sony Corporation
+
+OUI:940070*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:6C3A84*
+ ID_OUI_FROM_DATABASE=Shenzhen Aero-Startech. Co.Ltd
+
+OUI:442B03*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:781C5A*
+ ID_OUI_FROM_DATABASE=SHARP Corporation
+
+OUI:E4C6E6*
+ ID_OUI_FROM_DATABASE=Mophie, LLC
+
+OUI:502D1D*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:BCEA2B*
+ ID_OUI_FROM_DATABASE=CityCom GmbH
+
+OUI:944444*
+ ID_OUI_FROM_DATABASE=LG Innotek
+
+OUI:E4C806*
+ ID_OUI_FROM_DATABASE=Ceiec Electric Technology Inc.
+
+OUI:18B591*
+ ID_OUI_FROM_DATABASE=I-Storm
+
+OUI:A45630*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:002AAF*
+ ID_OUI_FROM_DATABASE=LARsys-Automation GmbH
+
+OUI:60F3DA*
+ ID_OUI_FROM_DATABASE=Logic Way GmbH
+
+OUI:A06D09*
+ ID_OUI_FROM_DATABASE=Intelcan Technosystems Inc.
+
+OUI:BC1401*
+ ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
+
+OUI:68D925*
+ ID_OUI_FROM_DATABASE=ProSys Development Services
+
+OUI:B41DEF*
+ ID_OUI_FROM_DATABASE=Internet Laboratories, Inc.
+
+OUI:284121*
+ ID_OUI_FROM_DATABASE=OptiSense Network, LLC
+
+OUI:5057A8*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:38458C*
+ ID_OUI_FROM_DATABASE=MyCloud Technology corporation
+
+OUI:0C9D56*
+ ID_OUI_FROM_DATABASE=Consort Controls Ltd
+
+OUI:3CCE73*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:A47C14*
+ ID_OUI_FROM_DATABASE=ChargeStorm AB
+
+OUI:F4600D*
+ ID_OUI_FROM_DATABASE=Panoptic Technology, Inc
+
+OUI:ACCF23*
+ ID_OUI_FROM_DATABASE=Hi-flying electronics technology Co.,Ltd
+
+OUI:C08170*
+ ID_OUI_FROM_DATABASE=Effigis GeoSolutions
+
+OUI:78C4AB*
+ ID_OUI_FROM_DATABASE=Shenzhen Runsil Technology Co.,Ltd
+
+OUI:709A0B*
+ ID_OUI_FROM_DATABASE=Italian Institute of Technology
+
+OUI:240917*
+ ID_OUI_FROM_DATABASE=Devlin Electronics Limited
+
+OUI:DC37D2*
+ ID_OUI_FROM_DATABASE=Hunan HKT Electronic Technology Co., Ltd
+
+OUI:5076A6*
+ ID_OUI_FROM_DATABASE=Ecil Informatica Ind. Com. Ltda
+
+OUI:B431B8*
+ ID_OUI_FROM_DATABASE=Aviwest
+
+OUI:241125*
+ ID_OUI_FROM_DATABASE=Hutek Co., Ltd.
+
+OUI:0036FE*
+ ID_OUI_FROM_DATABASE=SuperVision
+
+OUI:CC187B*
+ ID_OUI_FROM_DATABASE=Manzanita Systems, Inc.
+
+OUI:38B12D*
+ ID_OUI_FROM_DATABASE=Sonotronic Nagel GmbH
+
+OUI:8020AF*
+ ID_OUI_FROM_DATABASE=Trade FIDES, a.s.
+
+OUI:50D274*
+ ID_OUI_FROM_DATABASE=Steffes Corporation
+
+OUI:48D54C*
+ ID_OUI_FROM_DATABASE=Jeda Networks
+
+OUI:3497FB*
+ ID_OUI_FROM_DATABASE=ADVANCED RF TECHNOLOGIES INC
+
+OUI:C46413*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:143AEA*
+ ID_OUI_FROM_DATABASE=Dynapower Company LLC
+
+OUI:9CA134*
+ ID_OUI_FROM_DATABASE=Nike, Inc.
+
+OUI:B4D8A9*
+ ID_OUI_FROM_DATABASE=BetterBots
+
+OUI:7CC8D7*
+ ID_OUI_FROM_DATABASE=Damalisk
+
+OUI:0091FA*
+ ID_OUI_FROM_DATABASE=Synapse Product Development
+
+OUI:A05AA4*
+ ID_OUI_FROM_DATABASE=Grand Products Nevada, Inc.
+
+OUI:24C0B3*
+ ID_OUI_FROM_DATABASE=RSF
+
+OUI:E00B28*
+ ID_OUI_FROM_DATABASE=Inovonics
+
+OUI:500B32*
+ ID_OUI_FROM_DATABASE=Foxda Technology Industrial(ShenZhen)Co.,LTD
+
+OUI:302DE8*
+ ID_OUI_FROM_DATABASE=JDA, LLC (JDA Systems)
+
+OUI:70CA9B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:2C3F38*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:803F5D*
+ ID_OUI_FROM_DATABASE=Winstars Technology Ltd
+
+OUI:780738*
+ ID_OUI_FROM_DATABASE=Z.U.K. Elzab S.A.
+
+OUI:640E36*
+ ID_OUI_FROM_DATABASE=TAZTAG
+
+OUI:70EE50*
+ ID_OUI_FROM_DATABASE=Netatmo
+
+OUI:EC63E5*
+ ID_OUI_FROM_DATABASE=ePBoard Design LLC
+
+OUI:60B606*
+ ID_OUI_FROM_DATABASE=Phorus
+
+OUI:F4E6D7*
+ ID_OUI_FROM_DATABASE=Solar Power Technologies, Inc.
+
+OUI:78DDD6*
+ ID_OUI_FROM_DATABASE=c-scape
+
+OUI:984A47*
+ ID_OUI_FROM_DATABASE=CHG Hospital Beds
+
+OUI:3C6A7D*
+ ID_OUI_FROM_DATABASE=Niigata Power Systems Co., Ltd.
+
+OUI:FC455F*
+ ID_OUI_FROM_DATABASE=JIANGXI SHANSHUI OPTOELECTRONIC TECHNOLOGY CO.,LTD
+
+OUI:3C7059*
+ ID_OUI_FROM_DATABASE=MakerBot Industries
+
+OUI:F8FE5C*
+ ID_OUI_FROM_DATABASE=Reciprocal Labs Corp
+
+OUI:6C9CED*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:94E0D0*
+ ID_OUI_FROM_DATABASE=HealthStream Taiwan Inc.
+
+OUI:DCF858*
+ ID_OUI_FROM_DATABASE=Lorent Networks, Inc.
+
+OUI:A05E6B*
+ ID_OUI_FROM_DATABASE=MELPER Co., Ltd.
+
+OUI:30B3A2*
+ ID_OUI_FROM_DATABASE=Shenzhen Heguang Measurement & Control Technology Co.,Ltd
+
+OUI:F0007F*
+ ID_OUI_FROM_DATABASE=Janz - Contadores de Energia, SA
+
+OUI:CC944A*
+ ID_OUI_FROM_DATABASE=Pfeiffer Vacuum GmbH
+
+OUI:0C8525*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:BCE59F*
+ ID_OUI_FROM_DATABASE=WATERWORLD Technology Co.,LTD
+
+OUI:1C5C55*
+ ID_OUI_FROM_DATABASE=PRIMA Cinema, Inc
+
+OUI:082522*
+ ID_OUI_FROM_DATABASE=ADVANSEE
+
+OUI:4C2F9D*
+ ID_OUI_FROM_DATABASE=ICM Controls
+
+OUI:E467BA*
+ ID_OUI_FROM_DATABASE=Danish Interpretation Systems A/S
+
+OUI:BCFE8C*
+ ID_OUI_FROM_DATABASE=Altronic, LLC
+
+OUI:24BBC1*
+ ID_OUI_FROM_DATABASE=Absolute Analysis
+
+OUI:7CDD11*
+ ID_OUI_FROM_DATABASE=Chongqing MAS SCI&TECH.Co.,Ltd
+
+OUI:C43C3C*
+ ID_OUI_FROM_DATABASE=CYBELEC SA
+
+OUI:00D632*
+ ID_OUI_FROM_DATABASE=GE Energy
+
+OUI:C40ACB*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:7463DF*
+ ID_OUI_FROM_DATABASE=VTS GmbH
+
+OUI:3828EA*
+ ID_OUI_FROM_DATABASE=Fujian Netcom Technology Co., LTD
+
+OUI:2CEE26*
+ ID_OUI_FROM_DATABASE=Petroleum Geo-Services
+
+OUI:DC3E51*
+ ID_OUI_FROM_DATABASE=Solberg & Andersen AS
+
+OUI:D8B90E*
+ ID_OUI_FROM_DATABASE=Triple Domain Vision Co.,Ltd.
+
+OUI:7C4B78*
+ ID_OUI_FROM_DATABASE=Red Sun Synthesis Pte Ltd
+
+OUI:28D1AF*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:68BC0C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:2C9EFC*
+ ID_OUI_FROM_DATABASE=CANON INC.
+
+OUI:98C845*
+ ID_OUI_FROM_DATABASE=PacketAccess
+
+OUI:988217*
+ ID_OUI_FROM_DATABASE=Disruptive Ltd
+
+OUI:80FFA8*
+ ID_OUI_FROM_DATABASE=UNIDIS
+
+OUI:489BE2*
+ ID_OUI_FROM_DATABASE=SCI Innovations Ltd
+
+OUI:B0E50E*
+ ID_OUI_FROM_DATABASE=NRG SYSTEMS INC
+
+OUI:4C5FD2*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent
+
+OUI:E878A1*
+ ID_OUI_FROM_DATABASE=BEOVIEW INTERCOM DOO
+
+OUI:3057AC*
+ ID_OUI_FROM_DATABASE=IRLAB LTD.
+
+OUI:28AF0A*
+ ID_OUI_FROM_DATABASE=Sirius XM Radio Inc
+
+OUI:2486F4*
+ ID_OUI_FROM_DATABASE=Ctek, Inc.
+
+OUI:3CE5B4*
+ ID_OUI_FROM_DATABASE=KIDASEN INDUSTRIA E COMERCIO DE ANTENAS LTDA
+
+OUI:A85BF3*
+ ID_OUI_FROM_DATABASE=Audivo GmbH
+
+OUI:344F69*
+ ID_OUI_FROM_DATABASE=EKINOPS SAS
+
+OUI:C02973*
+ ID_OUI_FROM_DATABASE=Audyssey Laboratories Inc.
+
+OUI:30168D*
+ ID_OUI_FROM_DATABASE=ProLon
+
+OUI:B451F9*
+ ID_OUI_FROM_DATABASE=NB Software
+
+OUI:30688C*
+ ID_OUI_FROM_DATABASE=Reach Technology Inc.
+
+OUI:88F488*
+ ID_OUI_FROM_DATABASE=cellon communications technology(shenzhen)Co.,Ltd.
+
+OUI:0041B4*
+ ID_OUI_FROM_DATABASE=Wuxi Zhongxing Optoelectronics Technology Co.,Ltd.
+
+OUI:D453AF*
+ ID_OUI_FROM_DATABASE=VIGO System S.A.
+
+OUI:1CE192*
+ ID_OUI_FROM_DATABASE=Qisda Corporation
+
+OUI:20C8B3*
+ ID_OUI_FROM_DATABASE=SHENZHEN BUL-TECH CO.,LTD.
+
+OUI:58B0D4*
+ ID_OUI_FROM_DATABASE=ZuniData Systems Inc.
+
+OUI:64557F*
+ ID_OUI_FROM_DATABASE=NSFOCUS Information Technology Co., Ltd.
+
+OUI:406AAB*
+ ID_OUI_FROM_DATABASE=RIM
+
+OUI:248707*
+ ID_OUI_FROM_DATABASE=SEnergy Corporation
+
+OUI:EC3F05*
+ ID_OUI_FROM_DATABASE=Institute 706, The Second Academy China Aerospace Science & Industry Corp
+
+OUI:C4C19F*
+ ID_OUI_FROM_DATABASE=National Oilwell Varco Instrumentation, Monitoring, and Optimization (NOV IMO)
+
+OUI:68CD0F*
+ ID_OUI_FROM_DATABASE=U Tek Company Limited
+
+OUI:D4CEB8*
+ ID_OUI_FROM_DATABASE=Enatel LTD
+
+OUI:ECF236*
+ ID_OUI_FROM_DATABASE=NEOMONTANA ELECTRONICS
+
+OUI:E4A5EF*
+ ID_OUI_FROM_DATABASE=TRON LINK ELECTRONICS CO., LTD.
+
+OUI:AC4AFE*
+ ID_OUI_FROM_DATABASE=Hisense Broadband Multimedia Technology Co.,Ltd.
+
+OUI:2C1EEA*
+ ID_OUI_FROM_DATABASE=AERODEV
+
+OUI:FC6C31*
+ ID_OUI_FROM_DATABASE=LXinstruments GmbH
+
+OUI:3C6F45*
+ ID_OUI_FROM_DATABASE=Fiberpro Inc.
+
+OUI:B4FC75*
+ ID_OUI_FROM_DATABASE=SEMA Electronics(HK) CO.,LTD
+
+OUI:5C16C7*
+ ID_OUI_FROM_DATABASE=Big Switch Networks
+
+OUI:B0BF99*
+ ID_OUI_FROM_DATABASE=WIZITDONGDO
+
+OUI:147DB3*
+ ID_OUI_FROM_DATABASE=JOA TELECOM.CO.,LTD
+
+OUI:3CD16E*
+ ID_OUI_FROM_DATABASE=Telepower Communication Co., Ltd
+
+OUI:00077D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:1045BE*
+ ID_OUI_FROM_DATABASE=Norphonic AS
+
+OUI:A0E295*
+ ID_OUI_FROM_DATABASE=DAT System Co.,Ltd
+
+OUI:40F14C*
+ ID_OUI_FROM_DATABASE=ISE Europe SPRL
+
+OUI:98293F*
+ ID_OUI_FROM_DATABASE=Fujian Start Computer Equipment Co.,Ltd
+
+OUI:70D4F2*
+ ID_OUI_FROM_DATABASE=RIM
+
+OUI:9067F3*
+ ID_OUI_FROM_DATABASE=Alcatel Lucent
+
+OUI:64D912*
+ ID_OUI_FROM_DATABASE=Solidica, Inc.
+
+OUI:8C5CA1*
+ ID_OUI_FROM_DATABASE=d-broad,INC
+
+OUI:C8F981*
+ ID_OUI_FROM_DATABASE=Seneca s.r.l.
+
+OUI:703187*
+ ID_OUI_FROM_DATABASE=ACX GmbH
+
+OUI:14307A*
+ ID_OUI_FROM_DATABASE=Avermetrics
+
+OUI:8C7EB3*
+ ID_OUI_FROM_DATABASE=Lytro, Inc.
+
+OUI:587675*
+ ID_OUI_FROM_DATABASE=Beijing ECHO Technologies Co.,Ltd
+
+OUI:78EF4C*
+ ID_OUI_FROM_DATABASE=Unetconvergence Co., Ltd.
+
+OUI:E8DA96*
+ ID_OUI_FROM_DATABASE=Zhuhai Tianrui Electrical Power Tech. Co., Ltd.
+
+OUI:6CA780*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:04888C*
+ ID_OUI_FROM_DATABASE=Eifelwerk Butler Systeme GmbH
+
+OUI:1013EE*
+ ID_OUI_FROM_DATABASE=Justec International Technology INC.
+
+OUI:704642*
+ ID_OUI_FROM_DATABASE=CHYNG HONG ELECTRONIC CO., LTD.
+
+OUI:78BEB6*
+ ID_OUI_FROM_DATABASE=Enhanced Vision
+
+OUI:ECEA03*
+ ID_OUI_FROM_DATABASE=DARFON LIGHTING CORP
+
+OUI:C8903E*
+ ID_OUI_FROM_DATABASE=Pakton Technologies
+
+OUI:7465D1*
+ ID_OUI_FROM_DATABASE=Atlinks
+
+OUI:301A28*
+ ID_OUI_FROM_DATABASE=Mako Networks Ltd
+
+OUI:D4945A*
+ ID_OUI_FROM_DATABASE=COSMO CO., LTD
+
+OUI:5CF207*
+ ID_OUI_FROM_DATABASE=Speco Technologies
+
+OUI:B01B7C*
+ ID_OUI_FROM_DATABASE=Ontrol A.S.
 
-OUI:B025AA*
- ID_OUI_FROM_DATABASE=Private
+OUI:D47B75*
+ ID_OUI_FROM_DATABASE=HARTING Electronics GmbH
 
-OUI:408256*
- ID_OUI_FROM_DATABASE=Continental Automotive GmbH
+OUI:70E843*
+ ID_OUI_FROM_DATABASE=Beijing C&W Optical Communication Technology Co.,Ltd.
 
-OUI:D866EE*
- ID_OUI_FROM_DATABASE=BOXIN COMMUNICATION CO.,LTD.
+OUI:08ACA5*
+ ID_OUI_FROM_DATABASE=Benu Video, Inc.
 
-OUI:3C189F*
+OUI:D89DB9*
+ ID_OUI_FROM_DATABASE=eMegatech International Corp.
+
+OUI:405A9B*
+ ID_OUI_FROM_DATABASE=ANOVO
+
+OUI:ACCA54*
+ ID_OUI_FROM_DATABASE=Telldus Technologies AB
+
+OUI:CC1EFF*
+ ID_OUI_FROM_DATABASE=Metrological Group BV
+
+OUI:941673*
+ ID_OUI_FROM_DATABASE=Point Core SARL
+
+OUI:6C5D63*
+ ID_OUI_FROM_DATABASE=ShenZhen Rapoo Technology Co., Ltd.
+
+OUI:E4D71D*
+ ID_OUI_FROM_DATABASE=Oraya Therapeutics
+
+OUI:C8FE30*
+ ID_OUI_FROM_DATABASE=Bejing DAYO Mobile Communication Technology Ltd.
+
+OUI:64B64A*
+ ID_OUI_FROM_DATABASE=ViVOtech, Inc.
+
+OUI:DCA7D9*
+ ID_OUI_FROM_DATABASE=Compressor Controls Corp
+
+OUI:C455A6*
+ ID_OUI_FROM_DATABASE=Cadac Holdings Ltd
+
+OUI:BCBBC9*
+ ID_OUI_FROM_DATABASE=Kellendonk Elektronik GmbH
+
+OUI:781DFD*
+ ID_OUI_FROM_DATABASE=Jabil Inc
+
+OUI:103711*
+ ID_OUI_FROM_DATABASE=Simlink AS
+
+OUI:601199*
+ ID_OUI_FROM_DATABASE=Siama Systems Inc
+
+OUI:300B9C*
+ ID_OUI_FROM_DATABASE=Delta Mobile Systems, Inc.
+
+OUI:90EA60*
+ ID_OUI_FROM_DATABASE=SPI Lasers Ltd
+
+OUI:D46F42*
+ ID_OUI_FROM_DATABASE=WAXESS USA Inc
+
+OUI:B0A72A*
+ ID_OUI_FROM_DATABASE=Ensemble Designs, Inc.
+
+OUI:50795B*
+ ID_OUI_FROM_DATABASE=Interexport Telecomunicaciones S.A.
+
+OUI:E8C229*
+ ID_OUI_FROM_DATABASE=H-Displays (MSC) Bhd
+
+OUI:B0BDA1*
+ ID_OUI_FROM_DATABASE=ZAKLAD ELEKTRONICZNY SIMS
+
+OUI:8C4435*
+ ID_OUI_FROM_DATABASE=Shanghai BroadMobi Communication Technology Co., Ltd.
+
+OUI:24B8D2*
+ ID_OUI_FROM_DATABASE=Opzoon Technology Co.,Ltd.
+
+OUI:24CBE7*
+ ID_OUI_FROM_DATABASE=MYK, Inc.
+
+OUI:88BFD5*
+ ID_OUI_FROM_DATABASE=Simple Audio Ltd
+
+OUI:948B03*
+ ID_OUI_FROM_DATABASE=EAGET Innovation and Technology Co., Ltd.
+
+OUI:802DE1*
+ ID_OUI_FROM_DATABASE=Solarbridge Technologies
+
+OUI:F081AF*
+ ID_OUI_FROM_DATABASE=IRZ AUTOMATION TECHNOLOGIES LTD
+
+OUI:14EB33*
+ ID_OUI_FROM_DATABASE=BSMediasoft Co., Ltd.
+
+OUI:AC8674*
+ ID_OUI_FROM_DATABASE=Open Mesh, Inc.
+
+OUI:14A9E3*
+ ID_OUI_FROM_DATABASE=MST CORPORATION
+
+OUI:589835*
+ ID_OUI_FROM_DATABASE=Technicolor
+
+OUI:50D6D7*
+ ID_OUI_FROM_DATABASE=Takahata Precision
+
+OUI:B4A5A9*
+ ID_OUI_FROM_DATABASE=MODI GmbH
+
+OUI:D09B05*
+ ID_OUI_FROM_DATABASE=Emtronix
+
+OUI:98EC65*
+ ID_OUI_FROM_DATABASE=Cosesy ApS
+
+OUI:900917*
+ ID_OUI_FROM_DATABASE=Far-sighted mobile
+
+OUI:88F077*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:AC4723*
+ ID_OUI_FROM_DATABASE=Genelec
+
+OUI:20B7C0*
+ ID_OUI_FROM_DATABASE=OMICRON electronics GmbH
+
+OUI:D42C3D*
+ ID_OUI_FROM_DATABASE=Sky Light Digital Limited
+
+OUI:806CBC*
+ ID_OUI_FROM_DATABASE=NET New Electronic Technology GmbH
+
+OUI:1C184A*
+ ID_OUI_FROM_DATABASE=ShenZhen RicherLink Technologies Co.,LTD
+
+OUI:04E662*
+ ID_OUI_FROM_DATABASE=Acroname Inc.
+
+OUI:F0BF97*
+ ID_OUI_FROM_DATABASE=Sony Corporation
+
+OUI:C44AD0*
+ ID_OUI_FROM_DATABASE=FIREFLIES SYSTEMS
+
+OUI:88E0A0*
+ ID_OUI_FROM_DATABASE=Shenzhen VisionSTOR Technologies Co., Ltd
+
+OUI:6879ED*
+ ID_OUI_FROM_DATABASE=SHARP Corporation
+
+OUI:9CC0D2*
+ ID_OUI_FROM_DATABASE=Conductix-Wampfler GmbH
+
+OUI:447E95*
+ ID_OUI_FROM_DATABASE=Alpha and Omega, Inc
+
+OUI:E8B748*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:DC16A2*
+ ID_OUI_FROM_DATABASE=Medtronic Diabetes
+
+OUI:78CA04*
  ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:2829CC*
- ID_OUI_FROM_DATABASE=Corsa Technology Incorporated
+OUI:2C8BF2*
+ ID_OUI_FROM_DATABASE=Hitachi Metals America Ltd
 
-OUI:FC790B*
- ID_OUI_FROM_DATABASE=Hitachi High Technologies America, Inc.
+OUI:58F98E*
+ ID_OUI_FROM_DATABASE=SECUDOS GmbH
 
-OUI:28E6E9*
- ID_OUI_FROM_DATABASE=SIS Sat Internet Services GmbH
+OUI:2826A6*
+ ID_OUI_FROM_DATABASE=PBR electronics GmbH
 
-OUI:BC4E5D*
- ID_OUI_FROM_DATABASE=ZhongMiao Technology Co., Ltd.
+OUI:CC7669*
+ ID_OUI_FROM_DATABASE=SEETECH
 
-OUI:08F728*
- ID_OUI_FROM_DATABASE=GLOBO Multimedia Sp. z o.o. Sp.k.
+OUI:E437D7*
+ ID_OUI_FROM_DATABASE=HENRI DEPAEPE S.A.S.
 
-OUI:70720D*
- ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
+OUI:582F42*
+ ID_OUI_FROM_DATABASE=Universal Electric Corporation
 
-OUI:8401A7*
- ID_OUI_FROM_DATABASE=Greyware Automation Products, Inc
+OUI:AC20AA*
+ ID_OUI_FROM_DATABASE=DMATEK Co., Ltd.
 
-OUI:C4C9EC*
- ID_OUI_FROM_DATABASE=Gugaoo   HK Limited
+OUI:E0A1D7*
+ ID_OUI_FROM_DATABASE=SFR
 
-OUI:F406A5*
- ID_OUI_FROM_DATABASE=Hangzhou Bianfeng Networking Technology Co., Ltd.
+OUI:28852D*
+ ID_OUI_FROM_DATABASE=Touch Networks
 
-OUI:4C3909*
- ID_OUI_FROM_DATABASE=HPL Electric & Power Private Limited
+OUI:F02A61*
+ ID_OUI_FROM_DATABASE=Waldo Networks, Inc.
 
-OUI:7CFE4E*
- ID_OUI_FROM_DATABASE=Shenzhen Safe vision Technology Co.,LTD
+OUI:B8415F*
+ ID_OUI_FROM_DATABASE=ASP AG
 
-OUI:54EF92*
- ID_OUI_FROM_DATABASE=Shenzhen Elink Technology Co., LTD
+OUI:2CB69D*
+ ID_OUI_FROM_DATABASE=RED Digital Cinema
 
-OUI:800E24*
- ID_OUI_FROM_DATABASE=ForgetBox
+OUI:988E34*
+ ID_OUI_FROM_DATABASE=ZHEJIANG BOXSAM ELECTRONIC CO.,LTD
 
-OUI:FCE186*
- ID_OUI_FROM_DATABASE=A3M Co., LTD
+OUI:D44C24*
+ ID_OUI_FROM_DATABASE=Vuppalamritha Magnetic Components LTD
 
-OUI:CCB691*
- ID_OUI_FROM_DATABASE=NECMagnusCommunications
+OUI:4CB4EA*
+ ID_OUI_FROM_DATABASE=HRD (S) PTE., LTD.
 
-OUI:40167E*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:34BDF9*
+ ID_OUI_FROM_DATABASE=Shanghai WDK Industrial Co.,Ltd.
 
-OUI:C89F1D*
- ID_OUI_FROM_DATABASE=SHENZHEN COMMUNICATION TECHNOLOGIES CO.,LTD
+OUI:74CE56*
+ ID_OUI_FROM_DATABASE=Packet Force Technology Limited Company
 
-OUI:983713*
- ID_OUI_FROM_DATABASE=PT.Navicom Indonesia
+OUI:A89B10*
+ ID_OUI_FROM_DATABASE=inMotion Ltd.
 
-OUI:ACA919*
- ID_OUI_FROM_DATABASE=TrekStor GmbH
+OUI:888C19*
+ ID_OUI_FROM_DATABASE=Brady Corp Asia Pacific Ltd
 
-OUI:84850A*
- ID_OUI_FROM_DATABASE=Hella Sonnen- und Wetterschutztechnik GmbH
+OUI:747DB6*
+ ID_OUI_FROM_DATABASE=Aliwei Communications, Inc
 
-OUI:183009*
- ID_OUI_FROM_DATABASE=Woojin Industrial Systems Co., Ltd.
+OUI:B41489*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:6081F9*
- ID_OUI_FROM_DATABASE=Helium Systems, Inc
+OUI:AC6F4F*
+ ID_OUI_FROM_DATABASE=Enspert Inc
 
-OUI:34C5D0*
- ID_OUI_FROM_DATABASE=Hagleitner Hygiene International GmbH
+OUI:8886A0*
+ ID_OUI_FROM_DATABASE=Simton Technologies, Ltd.
 
-OUI:74DBD1*
- ID_OUI_FROM_DATABASE=Ebay Inc
+OUI:F0C88C*
+ ID_OUI_FROM_DATABASE=LeddarTech Inc.
 
-OUI:3431C4*
- ID_OUI_FROM_DATABASE=AVM GmbH
+OUI:68EBC5*
+ ID_OUI_FROM_DATABASE=Angstrem Telecom
 
-OUI:DC537C*
- ID_OUI_FROM_DATABASE=Compal Broadband Networks, Inc.
+OUI:448C52*
+ ID_OUI_FROM_DATABASE=KTIS CO., Ltd
 
-OUI:A00627*
- ID_OUI_FROM_DATABASE=NEXPA System
+OUI:686359*
+ ID_OUI_FROM_DATABASE=Advanced Digital Broadcast SA
 
-OUI:303335*
- ID_OUI_FROM_DATABASE=Boosty
+OUI:4018D7*
+ ID_OUI_FROM_DATABASE=Smartronix, Inc.
 
-OUI:18D5B6*
- ID_OUI_FROM_DATABASE=SMG Holdings LLC
+OUI:18922C*
+ ID_OUI_FROM_DATABASE=Virtual Instruments
 
-OUI:C8FF77*
- ID_OUI_FROM_DATABASE=Dyson Limited
+OUI:F80F84*
+ ID_OUI_FROM_DATABASE=Natural Security SAS
 
-OUI:C03D46*
- ID_OUI_FROM_DATABASE=Shanghai Mochui Network Technology Co., Ltd
+OUI:EC9ECD*
+ ID_OUI_FROM_DATABASE=Artesyn Embedded Technologies
 
-OUI:DCF110*
+OUI:303955*
+ ID_OUI_FROM_DATABASE=Shenzhen Jinhengjia Electronic Co., Ltd.
+
+OUI:FC5B24*
+ ID_OUI_FROM_DATABASE=Weibel Scientific A/S
+
+OUI:34B571*
+ ID_OUI_FROM_DATABASE=PLDS
+
+OUI:A862A2*
+ ID_OUI_FROM_DATABASE=JIWUMEDIA CO., LTD.
+
+OUI:984E97*
+ ID_OUI_FROM_DATABASE=Starlight Marketing (H. K.) Ltd.
+
+OUI:7C6ADB*
+ ID_OUI_FROM_DATABASE=SafeTone Technology Co.,Ltd
+
+OUI:EC986C*
+ ID_OUI_FROM_DATABASE=Lufft Mess- und Regeltechnik GmbH
+
+OUI:B0518E*
+ ID_OUI_FROM_DATABASE=Holl technology CO.Ltd.
+
+OUI:DCDECA*
+ ID_OUI_FROM_DATABASE=Akyllor
+
+OUI:A071A9*
  ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:54DF00*
- ID_OUI_FROM_DATABASE=Ulterius Technologies, LLC
+OUI:8065E9*
+ ID_OUI_FROM_DATABASE=BenQ Corporation
 
-OUI:E01D38*
- ID_OUI_FROM_DATABASE=Beijing HuaqinWorld Technology Co.,Ltd
+OUI:845DD7*
+ ID_OUI_FROM_DATABASE=Shenzhen Netcom Electronics Co.,Ltd
 
-OUI:D80CCF*
- ID_OUI_FROM_DATABASE=C.G.V. S.A.S.
+OUI:447DA5*
+ ID_OUI_FROM_DATABASE=VTION INFORMATION TECHNOLOGY (FUJIAN) CO.,LTD
 
-OUI:143DF2*
- ID_OUI_FROM_DATABASE=Beijing Shidai Hongyuan Network Communication Co.,Ltd
+OUI:0CCDD3*
+ ID_OUI_FROM_DATABASE=EASTRIVER TECHNOLOGY CO., LTD.
 
-OUI:B0D59D*
- ID_OUI_FROM_DATABASE=Shenzhen Zowee Technology Co., Ltd
+OUI:B8E589*
+ ID_OUI_FROM_DATABASE=Payter BV
 
-OUI:C4913A*
- ID_OUI_FROM_DATABASE=Shenzhen Sanland Electronic Co., ltd.
+OUI:C89C1D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:A46032*
- ID_OUI_FROM_DATABASE=MRV Communications (Networks) LTD
+OUI:503DE5*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:205A00*
- ID_OUI_FROM_DATABASE=Coval
+OUI:801440*
+ ID_OUI_FROM_DATABASE=Sunlit System Technology Corp
 
-OUI:0C2026*
- ID_OUI_FROM_DATABASE=noax Technologies AG
+OUI:948D50*
+ ID_OUI_FROM_DATABASE=Beamex Oy Ab
 
-OUI:880FB6*
- ID_OUI_FROM_DATABASE=Jabil Circuits India Pvt Ltd,-EHTP unit
+OUI:94E226*
+ ID_OUI_FROM_DATABASE=D. ORtiz Consulting, LLC
 
-OUI:C4626B*
- ID_OUI_FROM_DATABASE=ZPT Vigantice
+OUI:386E21*
+ ID_OUI_FROM_DATABASE=Wasion Group Ltd.
 
-OUI:74F85D*
- ID_OUI_FROM_DATABASE=Berkeley Nucleonics Corp
+OUI:D8C99D*
+ ID_OUI_FROM_DATABASE=EA DISPLAY LIMITED
 
-OUI:48EE07*
- ID_OUI_FROM_DATABASE=Silver Palm Technologies LLC
+OUI:CCFC6D*
+ ID_OUI_FROM_DATABASE=RIZ TRANSMITTERS
 
-OUI:9CFBF1*
- ID_OUI_FROM_DATABASE=MESOMATIC GmbH & Co.KG
+OUI:AC80D6*
+ ID_OUI_FROM_DATABASE=Hexatronic AB
+
+OUI:9CF938*
+ ID_OUI_FROM_DATABASE=AREVA NP GmbH
+
+OUI:500E6D*
+ ID_OUI_FROM_DATABASE=TrafficCast International
+
+OUI:1CFEA7*
+ ID_OUI_FROM_DATABASE=IDentytech Solutins Ltd.
+
+OUI:D0B53D*
+ ID_OUI_FROM_DATABASE=SEPRO ROBOTIQUE
+
+OUI:A0DE05*
+ ID_OUI_FROM_DATABASE=JSC Irbis-T
+
+OUI:8895B9*
+ ID_OUI_FROM_DATABASE=Unified Packet Systems Crop
+
+OUI:78593E*
+ ID_OUI_FROM_DATABASE=RAFI GmbH & Co.KG
+
+OUI:684352*
+ ID_OUI_FROM_DATABASE=Bhuu Limited
+
+OUI:3CC0C6*
+ ID_OUI_FROM_DATABASE=d&b audiotechnik GmbH
+
+OUI:F8DAF4*
+ ID_OUI_FROM_DATABASE=Taishan Online Technology Co., Ltd.
+
+OUI:D8E3AE*
+ ID_OUI_FROM_DATABASE=CIRTEC MEDICAL SYSTEMS
+
+OUI:A83944*
+ ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
+
+OUI:FC1FC0*
+ ID_OUI_FROM_DATABASE=EURECAM
+
+OUI:4891F6*
+ ID_OUI_FROM_DATABASE=Shenzhen Reach software technology CO.,LTD
+
+OUI:EC14F6*
+ ID_OUI_FROM_DATABASE=BioControl AS
+
+OUI:B8D06F*
+ ID_OUI_FROM_DATABASE=GUANGZHOU HKUST FOK YING TUNG RESEARCH INSTITUTE
+
+OUI:B4C44E*
+ ID_OUI_FROM_DATABASE=VXL eTech Pvt Ltd
+
+OUI:F0933A*
+ ID_OUI_FROM_DATABASE=NxtConect
+
+OUI:6052D0*
+ ID_OUI_FROM_DATABASE=FACTS Engineering
+
+OUI:8C278A*
+ ID_OUI_FROM_DATABASE=Vocollect Inc
+
+OUI:FCAF6A*
+ ID_OUI_FROM_DATABASE=Qulsar Inc
+
+OUI:ECE555*
+ ID_OUI_FROM_DATABASE=Hirschmann Automation
+
+OUI:DCD0F7*
+ ID_OUI_FROM_DATABASE=Bentek Systems Ltd.
+
+OUI:D0574C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:8818AE*
+ ID_OUI_FROM_DATABASE=Tamron Co., Ltd
+
+OUI:20D607*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:58DB8D*
+ ID_OUI_FROM_DATABASE=Fast Co., Ltd.
+
+OUI:18EF63*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:CCCE40*
+ ID_OUI_FROM_DATABASE=Janteq Corp
+
+OUI:8C4DEA*
+ ID_OUI_FROM_DATABASE=Cerio Corporation
+
+OUI:ECFAAA*
+ ID_OUI_FROM_DATABASE=The IMS Company
+
+OUI:CC55AD*
+ ID_OUI_FROM_DATABASE=RIM
+
+OUI:F0F7B3*
+ ID_OUI_FROM_DATABASE=Phorm
+
+OUI:E8757F*
+ ID_OUI_FROM_DATABASE=FIRS Technologies(Shenzhen) Co., Ltd
+
+OUI:C83EA7*
+ ID_OUI_FROM_DATABASE=KUNBUS GmbH
+
+OUI:E0CF2D*
+ ID_OUI_FROM_DATABASE=Gemintek Corporation
+
+OUI:68BDAB*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:9CADEF*
+ ID_OUI_FROM_DATABASE=Obihai Technology, Inc.
+
+OUI:D08999*
+ ID_OUI_FROM_DATABASE=APCON, Inc.
+
+OUI:4454C0*
+ ID_OUI_FROM_DATABASE=Thompson Aerospace
+
+OUI:B4A4E3*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:90903C*
+ ID_OUI_FROM_DATABASE=TRISON TECHNOLOGY CORPORATION
 
-OUI:94C014*
- ID_OUI_FROM_DATABASE=Sorter Sp. j. Konrad Grzeszczyk MichaA, Ziomek
+OUI:94DD3F*
+ ID_OUI_FROM_DATABASE=A+V Link Technologies, Corp.
 
-OUI:1027BE*
- ID_OUI_FROM_DATABASE=TVIP
+OUI:C8EE08*
+ ID_OUI_FROM_DATABASE=TANGTOP TECHNOLOGY CO.,LTD
 
-OUI:2087AC*
- ID_OUI_FROM_DATABASE=AES motomation
+OUI:7472F2*
+ ID_OUI_FROM_DATABASE=Chipsip Technology Co., Ltd.
 
-OUI:A824EB*
- ID_OUI_FROM_DATABASE=ZAO NPO Introtest
+OUI:5CD998*
+ ID_OUI_FROM_DATABASE=D-Link Corporation
 
-OUI:447E76*
- ID_OUI_FROM_DATABASE=Trek Technology (S) Pte Ltd
+OUI:D46CDA*
+ ID_OUI_FROM_DATABASE=CSM GmbH
 
-OUI:E8FC60*
- ID_OUI_FROM_DATABASE=ELCOM Innovations Private Limited
+OUI:C4F464*
+ ID_OUI_FROM_DATABASE=Spica international
 
-OUI:1CFCBB*
- ID_OUI_FROM_DATABASE=Realfiction ApS
+OUI:544A05*
+ ID_OUI_FROM_DATABASE=wenglor sensoric gmbh
 
-OUI:B0EC8F*
- ID_OUI_FROM_DATABASE=GMX SAS
+OUI:5CCA32*
+ ID_OUI_FROM_DATABASE=Theben AG
 
-OUI:C40E45*
- ID_OUI_FROM_DATABASE=ACK Networks,Inc.
+OUI:84C7A9*
+ ID_OUI_FROM_DATABASE=C3PO S.A.
 
-OUI:5C254C*
- ID_OUI_FROM_DATABASE=Avire Global Pte Ltd
+OUI:F8AC6D*
+ ID_OUI_FROM_DATABASE=Deltenna Ltd
 
-OUI:7C1A03*
- ID_OUI_FROM_DATABASE=8Locations Co., Ltd.
+OUI:641084*
+ ID_OUI_FROM_DATABASE=HEXIUM Technical Development Co., Ltd.
 
-OUI:481842*
- ID_OUI_FROM_DATABASE=Shanghai Winaas Co. Equipment Co. Ltd.
+OUI:C416FA*
+ ID_OUI_FROM_DATABASE=Prysm Inc
 
-OUI:E817FC*
- ID_OUI_FROM_DATABASE=NIFTY Corporation
+OUI:E0C286*
+ ID_OUI_FROM_DATABASE=Aisai Communication Technology Co., Ltd.
 
-OUI:D09C30*
- ID_OUI_FROM_DATABASE=Foster Electric Company, Limited
+OUI:D84B2A*
+ ID_OUI_FROM_DATABASE=Cognitas Technologies, Inc.
 
-OUI:78FEE2*
- ID_OUI_FROM_DATABASE=Shanghai Diveo Technology Co., Ltd
+OUI:684B88*
+ ID_OUI_FROM_DATABASE=Galtronics Telemetry Inc.
 
-OUI:386C9B*
- ID_OUI_FROM_DATABASE=Ivy Biomedical
+OUI:842914*
+ ID_OUI_FROM_DATABASE=EMPORIA TELECOM Produktions- und VertriebsgesmbH & Co KG
 
-OUI:E44C6C*
- ID_OUI_FROM_DATABASE=Shenzhen Guo Wei Electronic Co,. Ltd.
+OUI:4C8B55*
+ ID_OUI_FROM_DATABASE=Grupo Digicon
 
-OUI:008B43*
- ID_OUI_FROM_DATABASE=RFTECH
+OUI:04A3F3*
+ ID_OUI_FROM_DATABASE=Emicon
 
-OUI:2C957F*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:F866F2*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:242642*
- ID_OUI_FROM_DATABASE=SHARP Corporation.
+OUI:7C55E7*
+ ID_OUI_FROM_DATABASE=YSI, Inc.
 
-OUI:282246*
- ID_OUI_FROM_DATABASE=Beijing Sinoix Communication Co., LTD
+OUI:C02BFC*
+ ID_OUI_FROM_DATABASE=iNES. applied informatics GmbH
 
-OUI:FC1607*
- ID_OUI_FROM_DATABASE=Taian Technology(Wuxi) Co.,Ltd.
+OUI:AC34CB*
+ ID_OUI_FROM_DATABASE=Shanhai GBCOM Communication Technology Co. Ltd
 
-OUI:CC89FD*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:D4A928*
+ ID_OUI_FROM_DATABASE=GreenWave Reality Inc
 
-OUI:E86183*
- ID_OUI_FROM_DATABASE=Black Diamond Advanced Technology, LLC
+OUI:9CFFBE*
+ ID_OUI_FROM_DATABASE=OTSL Inc.
 
-OUI:C4824E*
- ID_OUI_FROM_DATABASE=Changzhou Uchip Electronics Co., LTD.
+OUI:2CD1DA*
+ ID_OUI_FROM_DATABASE=Sanjole, Inc.
 
-OUI:24A87D*
- ID_OUI_FROM_DATABASE=Panasonic Automotive Systems Asia Pacific(Thailand)Co.,Ltd.
+OUI:100E2B*
+ ID_OUI_FROM_DATABASE=NEC CASIO Mobile Communications
 
-OUI:78EC74*
- ID_OUI_FROM_DATABASE=Kyland-USA
+OUI:445EF3*
+ ID_OUI_FROM_DATABASE=Tonalite Holding B.V.
 
-OUI:28C825*
- ID_OUI_FROM_DATABASE=DellKing Industrial Co., Ltd
+OUI:100C24*
+ ID_OUI_FROM_DATABASE=pomdevices, LLC
 
-OUI:64E892*
- ID_OUI_FROM_DATABASE=Morio Denki Co., Ltd.
+OUI:58F6BF*
+ ID_OUI_FROM_DATABASE=Kyoto University
 
-OUI:086DF2*
- ID_OUI_FROM_DATABASE=Shenzhen MIMOWAVE Technology Co.,Ltd
+OUI:7CED8D*
+ ID_OUI_FROM_DATABASE=Microsoft
 
-OUI:64EB8C*
- ID_OUI_FROM_DATABASE=Seiko Epson Corporation
+OUI:54FDBF*
+ ID_OUI_FROM_DATABASE=Scheidt & Bachmann GmbH
 
-OUI:48D0CF*
- ID_OUI_FROM_DATABASE=Universal Electronics, Inc.
+OUI:B40EDC*
+ ID_OUI_FROM_DATABASE=LG-Ericsson Co.,Ltd.
 
-OUI:DCC793*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:A4D1D1*
+ ID_OUI_FROM_DATABASE=ECOtality North America
 
-OUI:E03F49*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:C8D5FE*
+ ID_OUI_FROM_DATABASE=Shenzhen Zowee Technology Co., Ltd
 
-OUI:D8EE78*
- ID_OUI_FROM_DATABASE=Moog Protokraft
+OUI:C49313*
+ ID_OUI_FROM_DATABASE=100fio networks technology llc
 
-OUI:F4B6E5*
- ID_OUI_FROM_DATABASE=TerraSem Co.,Ltd
+OUI:A4A80F*
+ ID_OUI_FROM_DATABASE=Shenzhen Coship Electronics Co., Ltd.
 
-OUI:28BB59*
- ID_OUI_FROM_DATABASE=RNET Technologies, Inc.
+OUI:B8921D*
+ ID_OUI_FROM_DATABASE=BG T&A
 
-OUI:7C8D91*
- ID_OUI_FROM_DATABASE=Shanghai Hongzhuo Information Technology co.,LTD
+OUI:48FCB8*
+ ID_OUI_FROM_DATABASE=Woodstream Corporation
 
-OUI:A881F1*
- ID_OUI_FROM_DATABASE=BMEYE B.V.
+OUI:548922*
+ ID_OUI_FROM_DATABASE=Zelfy Inc
 
-OUI:241148*
- ID_OUI_FROM_DATABASE=Entropix, LLC
+OUI:F8C091*
+ ID_OUI_FROM_DATABASE=Highgates Technology
 
-OUI:30B5C2*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:6C5CDE*
+ ID_OUI_FROM_DATABASE=SunReports, Inc.
 
-OUI:F85C45*
- ID_OUI_FROM_DATABASE=IC Nexus Co. Ltd.
+OUI:241F2C*
+ ID_OUI_FROM_DATABASE=Calsys, Inc.
 
-OUI:04DB8A*
- ID_OUI_FROM_DATABASE=Suntech International Ltd.
+OUI:284846*
+ ID_OUI_FROM_DATABASE=GridCentric Inc.
 
-OUI:083F76*
- ID_OUI_FROM_DATABASE=Intellian Technologies, Inc.
+OUI:58B9E1*
+ ID_OUI_FROM_DATABASE=Crystalfontz America, Inc.
 
-OUI:0CC47A*
- ID_OUI_FROM_DATABASE=Super Micro Computer, Inc.
+OUI:646707*
+ ID_OUI_FROM_DATABASE=Beijing Omnific Technology, Ltd.
 
-OUI:D0634D*
- ID_OUI_FROM_DATABASE=Meiko Maschinenbau GmbH &amp; Co. KG
+OUI:D4000D*
+ ID_OUI_FROM_DATABASE=Phoenix Broadband Technologies, LLC.
 
-OUI:88C626*
- ID_OUI_FROM_DATABASE=Logitech - Ultimate Ears
+OUI:E87AF3*
+ ID_OUI_FROM_DATABASE=S5 Tech S.r.l.
 
-OUI:889CA6*
- ID_OUI_FROM_DATABASE=BTB Korea INC
+OUI:40C7C9*
+ ID_OUI_FROM_DATABASE=Naviit Inc.
 
-OUI:B0DA00*
- ID_OUI_FROM_DATABASE=CERA ELECTRONIQUE
+OUI:A0A763*
+ ID_OUI_FROM_DATABASE=Polytron Vertrieb GmbH
 
-OUI:447098*
- ID_OUI_FROM_DATABASE=MING HONG TECHNOLOGY (SHEN ZHEN) LIMITED
+OUI:D496DF*
+ ID_OUI_FROM_DATABASE=SUNGJIN C&T CO.,LTD
 
-OUI:00EEBD*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:D07DE5*
+ ID_OUI_FROM_DATABASE=Forward Pay Systems, Inc.
 
-OUI:48B5A7*
- ID_OUI_FROM_DATABASE=Glory Horse Industries Ltd.
+OUI:7CEF18*
+ ID_OUI_FROM_DATABASE=Creative Product Design Pty. Ltd.
 
-OUI:DC5E36*
- ID_OUI_FROM_DATABASE=Paterson Technology
+OUI:FCD4F6*
+ ID_OUI_FROM_DATABASE=Messana Air.Ray Conditioning s.r.l.
 
-OUI:50E0C7*
- ID_OUI_FROM_DATABASE=TurControlSystme AG
+OUI:0CD696*
+ ID_OUI_FROM_DATABASE=Amimon Ltd
 
-OUI:9CD643*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:B43741*
+ ID_OUI_FROM_DATABASE=Consert, Inc.
 
-OUI:28FC51*
- ID_OUI_FROM_DATABASE=The Electric Controller and Manufacturing Co., LLC
+OUI:F8FB2F*
+ ID_OUI_FROM_DATABASE=Santur Corporation
 
-OUI:34A5E1*
- ID_OUI_FROM_DATABASE=Sensorist ApS
+OUI:2CCD43*
+ ID_OUI_FROM_DATABASE=Summit Technology Group
 
-OUI:A4E9A3*
- ID_OUI_FROM_DATABASE=Honest Technology Co., Ltd
+OUI:6C8D65*
+ ID_OUI_FROM_DATABASE=Wireless Glue Networks, Inc.
 
-OUI:C4E92F*
- ID_OUI_FROM_DATABASE=AB Sciex
+OUI:CCFCB1*
+ ID_OUI_FROM_DATABASE=Wireless Technology, Inc.
 
-OUI:9C216A*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:CC5C75*
+ ID_OUI_FROM_DATABASE=Weightech Com. Imp. Exp. Equip. Pesagem Ltda
 
-OUI:F862AA*
- ID_OUI_FROM_DATABASE=xn systems
+OUI:A098ED*
+ ID_OUI_FROM_DATABASE=Shandong Intelligent Optical Communication Development Co., Ltd.
 
-OUI:A4059E*
- ID_OUI_FROM_DATABASE=STA Infinity LLP
+OUI:34C69A*
+ ID_OUI_FROM_DATABASE=Enecsys Ltd
 
-OUI:6C15F9*
- ID_OUI_FROM_DATABASE=Nautronix Limited
+OUI:502A8B*
+ ID_OUI_FROM_DATABASE=Telekom Research and Development Sdn Bhd
 
-OUI:680AD7*
- ID_OUI_FROM_DATABASE=Yancheng Kecheng Optoelectronic Technology Co., Ltd
+OUI:F88DEF*
+ ID_OUI_FROM_DATABASE=Tenebraex
 
-OUI:BC8893*
- ID_OUI_FROM_DATABASE=VILLBAU Ltd.
+OUI:EC43E6*
+ ID_OUI_FROM_DATABASE=AWCER Ltd.
 
-OUI:643F5F*
- ID_OUI_FROM_DATABASE=Exablaze
+OUI:F0EC39*
+ ID_OUI_FROM_DATABASE=Essec
 
-OUI:E8F226*
- ID_OUI_FROM_DATABASE=MILLSON CUSTOM SOLUTIONS INC.
+OUI:5849BA*
+ ID_OUI_FROM_DATABASE=Chitai Electronic Corp.
 
-OUI:7060DE*
- ID_OUI_FROM_DATABASE=LaVision GmbH
+OUI:181714*
+ ID_OUI_FROM_DATABASE=DAEWOOIS
 
-OUI:FCFE77*
- ID_OUI_FROM_DATABASE=Hitachi Reftechno, Inc.
+OUI:80B289*
+ ID_OUI_FROM_DATABASE=Forworld Electronics Ltd.
 
-OUI:70533F*
- ID_OUI_FROM_DATABASE=Alfa Instrumentos Eletronicos Ltda.
+OUI:14A62C*
+ ID_OUI_FROM_DATABASE=S.M. Dezac S.A.
 
-OUI:448A5B*
- ID_OUI_FROM_DATABASE=Micro-Star INT'L CO., LTD.
+OUI:A8F470*
+ ID_OUI_FROM_DATABASE=Fujian Newland Communication Science Technologies Co.,Ltd.
 
-OUI:68193F*
- ID_OUI_FROM_DATABASE=Digital Airways
+OUI:DC1D9F*
+ ID_OUI_FROM_DATABASE=U & B tech
 
-OUI:5CD61F*
- ID_OUI_FROM_DATABASE=Qardio, Inc
+OUI:081651*
+ ID_OUI_FROM_DATABASE=SHENZHEN SEA STAR TECHNOLOGY CO.,LTD
 
-OUI:902083*
- ID_OUI_FROM_DATABASE=General Engine Management Systems Ltd.
+OUI:DC49C9*
+ ID_OUI_FROM_DATABASE=CASCO SIGNAL LTD
 
-OUI:14B126*
- ID_OUI_FROM_DATABASE=Industrial Software Co
+OUI:B09134*
+ ID_OUI_FROM_DATABASE=Taleo
 
-OUI:C03580*
- ID_OUI_FROM_DATABASE=A&R TECH
+OUI:A863DF*
+ ID_OUI_FROM_DATABASE=DISPLAIRE CORPORATION
 
-OUI:1446E4*
- ID_OUI_FROM_DATABASE=AVISTEL
+OUI:104369*
+ ID_OUI_FROM_DATABASE=Soundmax Electronic Limited
 
-OUI:907990*
- ID_OUI_FROM_DATABASE=Benchmark Electronics Romania SRL
+OUI:C06C0F*
+ ID_OUI_FROM_DATABASE=Dobbs Stanford
 
-OUI:C49380*
- ID_OUI_FROM_DATABASE=Speedytel technology
+OUI:5475D0*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:B4A82B*
- ID_OUI_FROM_DATABASE=Histar Digital Electronics Co., Ltd.
+OUI:BC6A16*
+ ID_OUI_FROM_DATABASE=tdvine
 
-OUI:60A9B0*
- ID_OUI_FROM_DATABASE=Merchandising Technologies, Inc
+OUI:C8EF2E*
+ ID_OUI_FROM_DATABASE=Beijing Gefei Tech. Co., Ltd
 
-OUI:007DFA*
- ID_OUI_FROM_DATABASE=Volkswagen Group of America
+OUI:98DCD9*
+ ID_OUI_FROM_DATABASE=UNITEC Co., Ltd.
 
-OUI:6024C1*
- ID_OUI_FROM_DATABASE=Jiangsu Zhongxun Electronic Technology Co., Ltd
+OUI:30525A*
+ ID_OUI_FROM_DATABASE=NST Co., LTD
 
-OUI:6C5AB5*
- ID_OUI_FROM_DATABASE=TCL Technoly Electronics (Huizhou) Co., Ltd.
+OUI:6089B7*
+ ID_OUI_FROM_DATABASE=KAEL MÜHENDİSLİK ELEKTRONİK TİCARET SANAYİ LİMİTED ŞİRKETİ
 
-OUI:88789C*
- ID_OUI_FROM_DATABASE=Game Technologies SA
+OUI:2CA780*
+ ID_OUI_FROM_DATABASE=True Technologies Inc.
 
-OUI:18AA45*
- ID_OUI_FROM_DATABASE=Fon Technology
+OUI:545FA9*
+ ID_OUI_FROM_DATABASE=Teracom Limited
 
-OUI:549359*
- ID_OUI_FROM_DATABASE=SHENZHEN TWOWING TECHNOLOGIES CO.,LTD.
+OUI:ECC882*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:284430*
- ID_OUI_FROM_DATABASE=GenesisTechnical Systems (UK) Ltd
+OUI:A0B9ED*
+ ID_OUI_FROM_DATABASE=Skytap
 
-OUI:9843DA*
- ID_OUI_FROM_DATABASE=INTERTECH
+OUI:502DF4*
+ ID_OUI_FROM_DATABASE=Phytec Messtechnik GmbH
 
-OUI:285767*
- ID_OUI_FROM_DATABASE=Echostar Technologies Corp
+OUI:38E8DF*
+ ID_OUI_FROM_DATABASE=b gmbh medien + datenbanken
 
-OUI:B07908*
- ID_OUI_FROM_DATABASE=Cummings Engineering
+OUI:10189E*
+ ID_OUI_FROM_DATABASE=Elmo Motion Control
 
-OUI:04CB1D*
- ID_OUI_FROM_DATABASE=Traka plc
+OUI:88FD15*
+ ID_OUI_FROM_DATABASE=LINEEYE CO., LTD
 
-OUI:B87AC9*
- ID_OUI_FROM_DATABASE=Siemens Ltd.
+OUI:10445A*
+ ID_OUI_FROM_DATABASE=Shaanxi Hitech Electronic Co., LTD
 
-OUI:B0989F*
- ID_OUI_FROM_DATABASE=LG CNS
+OUI:60B3C4*
+ ID_OUI_FROM_DATABASE=Elber Srl
 
-OUI:3C300C*
- ID_OUI_FROM_DATABASE=Dewar Electronics Pty Ltd
+OUI:04C880*
+ ID_OUI_FROM_DATABASE=Samtec Inc
 
-OUI:78B5D2*
- ID_OUI_FROM_DATABASE=Ever Treasure Industrial Limited
+OUI:884B39*
+ ID_OUI_FROM_DATABASE=Siemens AG, Healthcare Sector
 
-OUI:A409CB*
- ID_OUI_FROM_DATABASE=Alfred Kaercher GmbH &amp; Co KG
+OUI:44C233*
+ ID_OUI_FROM_DATABASE=Guangzhou Comet Technology Development Co.Ltd
 
-OUI:C445EC*
- ID_OUI_FROM_DATABASE=Shanghai Yali Electron Co.,LTD
+OUI:B482FE*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
-OUI:E8611F*
- ID_OUI_FROM_DATABASE=Dawning Information Industry Co.,Ltd
+OUI:307C30*
+ ID_OUI_FROM_DATABASE=RIM
 
-OUI:0CA694*
- ID_OUI_FROM_DATABASE=Sunitec Enterprise Co.,Ltd
+OUI:BC4E3C*
+ ID_OUI_FROM_DATABASE=CORE STAFF CO., LTD.
 
-OUI:146080*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:80BAAC*
+ ID_OUI_FROM_DATABASE=TeleAdapt Ltd
 
-OUI:986CF5*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:FC4463*
+ ID_OUI_FROM_DATABASE=Universal Audio, Inc
 
-OUI:78491D*
- ID_OUI_FROM_DATABASE=The Will-Burt Company
+OUI:F06853*
+ ID_OUI_FROM_DATABASE=Integrated Corporation
 
-OUI:74D435*
- ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
+OUI:10E6AE*
+ ID_OUI_FROM_DATABASE=Source Technologies, LLC
 
-OUI:840F45*
- ID_OUI_FROM_DATABASE=Shanghai GMT Digital Technologies Co., Ltd
+OUI:A4ADB8*
+ ID_OUI_FROM_DATABASE=Vitec Group, Camera Dynamics Ltd
 
-OUI:D8270C*
- ID_OUI_FROM_DATABASE=MaxTronic International Co., Ltd.
+OUI:90A2DA*
+ ID_OUI_FROM_DATABASE=GHEO SA
 
-OUI:E80410*
- ID_OUI_FROM_DATABASE=Private
+OUI:C41ECE*
+ ID_OUI_FROM_DATABASE=HMI Sources Ltd.
 
-OUI:8C088B*
- ID_OUI_FROM_DATABASE=Remote Solution
+OUI:BCD5B6*
+ ID_OUI_FROM_DATABASE=d2d technologies
 
-OUI:A47760*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:1C8F8A*
+ ID_OUI_FROM_DATABASE=Phase Motion Control SpA
 
-OUI:24A495*
- ID_OUI_FROM_DATABASE=Thales Canada Inc.
+OUI:A4B1EE*
+ ID_OUI_FROM_DATABASE=H. ZANDER GmbH & Co. KG
 
-OUI:883612*
- ID_OUI_FROM_DATABASE=SRC Computers, LLC
+OUI:486FD2*
+ ID_OUI_FROM_DATABASE=StorSimple Inc
 
-OUI:E0A198*
- ID_OUI_FROM_DATABASE=NOJA Power Switchgear Pty Ltd
+OUI:D4F143*
+ ID_OUI_FROM_DATABASE=IPROAD.,Inc
 
-OUI:CC7B35*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:CC5459*
+ ID_OUI_FROM_DATABASE=OnTime Networks AS
 
-OUI:04D437*
- ID_OUI_FROM_DATABASE=ZNV
+OUI:3CB17F*
+ ID_OUI_FROM_DATABASE=Wattwatchers Pty Ld
 
-OUI:CCF407*
- ID_OUI_FROM_DATABASE=EUKREA ELECTROMATIQUE SARL
+OUI:00DB45*
+ ID_OUI_FROM_DATABASE=THAMWAY CO.,LTD.
 
-OUI:BC2BD7*
- ID_OUI_FROM_DATABASE=Revogi Innovation Co., Ltd.
+OUI:A0231B*
+ ID_OUI_FROM_DATABASE=TeleComp R&D Corp.
 
-OUI:24ECD6*
- ID_OUI_FROM_DATABASE=CSG Science & Technology Co.,Ltd.Hefei
+OUI:94C4E9*
+ ID_OUI_FROM_DATABASE=PowerLayer Microsystems HongKong Limited
 
-OUI:102279*
- ID_OUI_FROM_DATABASE=ZeroDesktop, Inc.
+OUI:8843E1*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:CC4AE1*
- ID_OUI_FROM_DATABASE=fourtec -Fourier Technologies
+OUI:B4ED19*
+ ID_OUI_FROM_DATABASE=Pie Digital, Inc.
 
-OUI:A4895B*
- ID_OUI_FROM_DATABASE=ARK INFOSOLUTIONS PVT LTD
+OUI:888717*
+ ID_OUI_FROM_DATABASE=CANON INC.
 
-OUI:38EC11*
- ID_OUI_FROM_DATABASE=Novatek Microelectronics Corp.
+OUI:E0271A*
+ ID_OUI_FROM_DATABASE=TTC Next-generation Home Network System WG
 
-OUI:A8CCC5*
- ID_OUI_FROM_DATABASE=Saab AB (publ)
+OUI:84C727*
+ ID_OUI_FROM_DATABASE=Gnodal Ltd
 
-OUI:988E4A*
- ID_OUI_FROM_DATABASE=NOXUS(BEIJING) TECHNOLOGY CO.,LTD
+OUI:E4AB46*
+ ID_OUI_FROM_DATABASE=UAB Selteka
 
-OUI:1C4158*
- ID_OUI_FROM_DATABASE=Gemalto M2M GmbH
+OUI:D479C3*
+ ID_OUI_FROM_DATABASE=Cameronet GmbH & Co. KG
 
-OUI:ACD657*
- ID_OUI_FROM_DATABASE=Shaanxi Guolian Digital TV Technology Co., Ltd.
+OUI:945B7E*
+ ID_OUI_FROM_DATABASE=TRILOBIT LTDA.
 
-OUI:541B5D*
- ID_OUI_FROM_DATABASE=Techno-Innov
+OUI:E85B5B*
+ ID_OUI_FROM_DATABASE=LG ELECTRONICS INC
 
-OUI:78CB33*
- ID_OUI_FROM_DATABASE=DHC Software Co.,Ltd
+OUI:20D906*
+ ID_OUI_FROM_DATABASE=Iota, Inc.
 
-OUI:507691*
- ID_OUI_FROM_DATABASE=Tekpea, Inc.
+OUI:404022*
+ ID_OUI_FROM_DATABASE=ZIV
+
+OUI:74F726*
+ ID_OUI_FROM_DATABASE=Neuron Robotics
 
-OUI:C421C8*
- ID_OUI_FROM_DATABASE=KYOCERA Corporation
+OUI:18FC9F*
+ ID_OUI_FROM_DATABASE=Changhe Electronics Co., Ltd.
 
-OUI:A4C0C7*
- ID_OUI_FROM_DATABASE=ShenZhen Hitom Communication Technology Co..LTD
+OUI:A438FC*
+ ID_OUI_FROM_DATABASE=Plastic Logic
 
-OUI:EC2257*
- ID_OUI_FROM_DATABASE=JiangSu NanJing University Electronic Information Technology Co.,Ltd
+OUI:601D0F*
+ ID_OUI_FROM_DATABASE=Midnite Solar
 
-OUI:341A4C*
- ID_OUI_FROM_DATABASE=SHENZHEN WEIBU ELECTRONICS CO.,LTD.
+OUI:50A6E3*
+ ID_OUI_FROM_DATABASE=David Clark Company
 
-OUI:A09BBD*
- ID_OUI_FROM_DATABASE=Total Aviation Solutions Pty Ltd
+OUI:549A16*
+ ID_OUI_FROM_DATABASE=Uzushio Electric Co.,Ltd.
 
-OUI:E8481F*
- ID_OUI_FROM_DATABASE=Advanced Automotive Antennas
+OUI:4001C6*
+ ID_OUI_FROM_DATABASE=3COM EUROPE LTD
 
-OUI:18D6CF*
- ID_OUI_FROM_DATABASE=Kurth Electronic GmbH
+OUI:608D17*
+ ID_OUI_FROM_DATABASE=Sentrus Government Systems Division, Inc
 
-OUI:E07F88*
- ID_OUI_FROM_DATABASE=EVIDENCE Network SIA
+OUI:80912A*
+ ID_OUI_FROM_DATABASE=Lih Rong electronic Enterprise Co., Ltd.
 
-OUI:1C7CC7*
- ID_OUI_FROM_DATABASE=Coriant GmbH
+OUI:8038FD*
+ ID_OUI_FROM_DATABASE=LeapFrog Enterprises, Inc.
 
-OUI:542CEA*
- ID_OUI_FROM_DATABASE=PROTECTRON
+OUI:7072CF*
+ ID_OUI_FROM_DATABASE=EdgeCore Networks
 
-OUI:00C5DB*
- ID_OUI_FROM_DATABASE=Datatech Sistemas Digitales Avanzados SL
+OUI:803B9A*
+ ID_OUI_FROM_DATABASE=ghe-ces electronic ag
 
-OUI:109AB9*
- ID_OUI_FROM_DATABASE=Tosibox Oy
+OUI:9CCD82*
+ ID_OUI_FROM_DATABASE=CHENG UEI PRECISION INDUSTRY CO.,LTD
 
-OUI:F842FB*
- ID_OUI_FROM_DATABASE=Yasuda Joho Co.,ltd.
+OUI:C8AACC*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:887398*
- ID_OUI_FROM_DATABASE=K2E Tekpoint
+OUI:003D41*
+ ID_OUI_FROM_DATABASE=Hatteland Computer AS
 
-OUI:68EE96*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:087618*
+ ID_OUI_FROM_DATABASE=ViE Technologies Sdn. Bhd.
 
-OUI:FC6018*
- ID_OUI_FROM_DATABASE=Zhejiang Kangtai Electric Co., Ltd.
+OUI:A4AD00*
+ ID_OUI_FROM_DATABASE=Ragsdale Technology
 
-OUI:303EAD*
- ID_OUI_FROM_DATABASE=Sonavox Canada Inc
+OUI:2C1984*
+ ID_OUI_FROM_DATABASE=IDN Telecom, Inc.
 
-OUI:444A65*
- ID_OUI_FROM_DATABASE=Silverflare Ltd.
+OUI:3863F6*
+ ID_OUI_FROM_DATABASE=3NOD MULTIMEDIA(SHENZHEN)CO.,LTD
 
-OUI:50A0BF*
- ID_OUI_FROM_DATABASE=Alba Fiber Systems Inc.
+OUI:DCE2AC*
+ ID_OUI_FROM_DATABASE=Lumens Digital Optics Inc.
 
-OUI:3C977E*
- ID_OUI_FROM_DATABASE=IPS Technology Limited
+OUI:98D88C*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:F02405*
- ID_OUI_FROM_DATABASE=OPUS High Technology Corporation
+OUI:C8873B*
+ ID_OUI_FROM_DATABASE=Net Optics
 
-OUI:D8B04C*
- ID_OUI_FROM_DATABASE=Jinan USR IOT Technology Co., Ltd.
+OUI:B0E97E*
+ ID_OUI_FROM_DATABASE=Advanced Micro Peripherals
 
-OUI:646EEA*
- ID_OUI_FROM_DATABASE=Iskratel d.o.o.
+OUI:D44CA7*
+ ID_OUI_FROM_DATABASE=Informtekhnika & Communication, LLC
 
-OUI:043D98*
- ID_OUI_FROM_DATABASE=ChongQing QingJia Electronics CO.,LTD
+OUI:202CB7*
+ ID_OUI_FROM_DATABASE=Kong Yue Electronics & Information Industry (Xinhui) Ltd.
 
-OUI:E8BB3D*
- ID_OUI_FROM_DATABASE=Sino Prime-Tech Limited
+OUI:68CC9C*
+ ID_OUI_FROM_DATABASE=Mine Site Technologies
 
-OUI:98CDB4*
- ID_OUI_FROM_DATABASE=Virident Systems, Inc.
+OUI:04B466*
+ ID_OUI_FROM_DATABASE=BSP Co., Ltd.
 
-OUI:54E3B0*
- ID_OUI_FROM_DATABASE=JVL Industri Elektronik
+OUI:E41F13*
+ ID_OUI_FROM_DATABASE=IBM Corp
 
-OUI:640B4A*
- ID_OUI_FROM_DATABASE=Digital Telecom Technology Limited
+OUI:00271B*
+ ID_OUI_FROM_DATABASE=Alec Sicherheitssysteme GmbH
 
-OUI:F42012*
- ID_OUI_FROM_DATABASE=Cuciniale GmbH
+OUI:002718*
+ ID_OUI_FROM_DATABASE=Suzhou NEW SEAUNION Video Technology Co.,Ltd
 
-OUI:4C21D0*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:00270C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:18104E*
- ID_OUI_FROM_DATABASE=CEDINT-UPM
+OUI:00270B*
+ ID_OUI_FROM_DATABASE=Adura Technologies
 
-OUI:2C7B84*
- ID_OUI_FROM_DATABASE=OOO Petr Telegin
+OUI:002705*
+ ID_OUI_FROM_DATABASE=Sectronic
 
-OUI:540536*
- ID_OUI_FROM_DATABASE=Vivago Oy
+OUI:002706*
+ ID_OUI_FROM_DATABASE=YOISYS
 
-OUI:2CE6CC*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:0026F9*
+ ID_OUI_FROM_DATABASE=S.E.M. srl
 
-OUI:E0FAEC*
- ID_OUI_FROM_DATABASE=Platan sp. z o.o. sp. k.
+OUI:0026F3*
+ ID_OUI_FROM_DATABASE=SMC Networks
 
-OUI:F08EDB*
- ID_OUI_FROM_DATABASE=VeloCloud Networks
+OUI:688540*
+ ID_OUI_FROM_DATABASE=IGI Mobile, Inc.
 
-OUI:B8DC87*
- ID_OUI_FROM_DATABASE=IAI Corporation
+OUI:6465C0*
+ ID_OUI_FROM_DATABASE=Nuvon, Inc
 
-OUI:7C6FF8*
- ID_OUI_FROM_DATABASE=ShenZhen ACTO Digital Video Technology Co.,Ltd.
+OUI:F0DE71*
+ ID_OUI_FROM_DATABASE=Shanghai EDO Technologies Co.,Ltd.
 
-OUI:8C4B59*
- ID_OUI_FROM_DATABASE=3D Imaging & Simulations Corp
+OUI:28FBD3*
+ ID_OUI_FROM_DATABASE=Ragentek Technology Group
 
-OUI:A4FB8D*
- ID_OUI_FROM_DATABASE=Hangzhou Dunchong Technology Co.Ltd
+OUI:7C1EB3*
+ ID_OUI_FROM_DATABASE=2N TELEKOMUNIKACE a.s.
 
-OUI:0075E1*
- ID_OUI_FROM_DATABASE=Ampt, LLC
+OUI:146E0A*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:CC04B4*
- ID_OUI_FROM_DATABASE=Select Comfort
+OUI:1045F8*
+ ID_OUI_FROM_DATABASE=LNT-Automation GmbH
 
-OUI:284FCE*
- ID_OUI_FROM_DATABASE=Liaoning Wontel Science and Technology Development Co.,Ltd.
+OUI:644F74*
+ ID_OUI_FROM_DATABASE=LENUS Co., Ltd.
 
-OUI:0CC81F*
- ID_OUI_FROM_DATABASE=Summer Infant, Inc.
+OUI:787F62*
+ ID_OUI_FROM_DATABASE=GiK mbH
 
-OUI:D86960*
- ID_OUI_FROM_DATABASE=Steinsvik
+OUI:D4AAFF*
+ ID_OUI_FROM_DATABASE=MICRO WORLD
 
-OUI:442AFF*
- ID_OUI_FROM_DATABASE=E3 Technology, Inc.
+OUI:C4FCE4*
+ ID_OUI_FROM_DATABASE=DishTV NZ Ltd
 
-OUI:0C9301*
- ID_OUI_FROM_DATABASE=PT. Prasimax Inovasi Teknologi
+OUI:0CD7C2*
+ ID_OUI_FROM_DATABASE=Axium Technologies, Inc.
 
-OUI:60699B*
- ID_OUI_FROM_DATABASE=isepos GmbH
+OUI:40F52E*
+ ID_OUI_FROM_DATABASE=Leica Microsystems (Schweiz) AG
 
-OUI:B830A8*
- ID_OUI_FROM_DATABASE=Road-Track Telematics Development
+OUI:C02250*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:542160*
- ID_OUI_FROM_DATABASE=Resolution Products
+OUI:64BC11*
+ ID_OUI_FROM_DATABASE=CombiQ AB
 
-OUI:88462A*
- ID_OUI_FROM_DATABASE=Telechips Inc.
+OUI:4097D1*
+ ID_OUI_FROM_DATABASE=BK Electronics cc
 
-OUI:A897DC*
- ID_OUI_FROM_DATABASE=IBM
+OUI:68AAD2*
+ ID_OUI_FROM_DATABASE=DATECS LTD.,
 
-OUI:E8DE27*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:0026EC*
+ ID_OUI_FROM_DATABASE=Legrand Home Systems, Inc
 
-OUI:FC229C*
- ID_OUI_FROM_DATABASE=Han Kyung I Net Co.,Ltd.
+OUI:0026E6*
+ ID_OUI_FROM_DATABASE=Visionhitech Co., Ltd.
 
-OUI:148692*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:0026E0*
+ ID_OUI_FROM_DATABASE=ASITEQ
 
-OUI:1832A2*
- ID_OUI_FROM_DATABASE=LAON TECHNOLOGY CO., LTD.
+OUI:0026DA*
+ ID_OUI_FROM_DATABASE=Universal Media Corporation /Slovakia/ s.r.o.
 
-OUI:6854ED*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent - Nuage
+OUI:0026D3*
+ ID_OUI_FROM_DATABASE=Zeno Information System
 
-OUI:985C93*
- ID_OUI_FROM_DATABASE=SBG Systems SAS
+OUI:0026D4*
+ ID_OUI_FROM_DATABASE=IRCA SpA
 
-OUI:64E599*
- ID_OUI_FROM_DATABASE=EFM Networks
+OUI:0026CD*
+ ID_OUI_FROM_DATABASE=PurpleComm, Inc.
 
-OUI:F499AC*
- ID_OUI_FROM_DATABASE=WEBER Schraubautomaten GmbH
+OUI:10880F*
+ ID_OUI_FROM_DATABASE=Daruma Telecomunicações e Informática S.A.
 
-OUI:8CC7D0*
- ID_OUI_FROM_DATABASE=zhejiang ebang communication co.,ltd
+OUI:4C4B68*
+ ID_OUI_FROM_DATABASE=Mobile Device, Inc.
 
-OUI:70820E*
- ID_OUI_FROM_DATABASE=as electronics GmbH
+OUI:94BA31*
+ ID_OUI_FROM_DATABASE=Visiontec da Amazônia Ltda.
 
-OUI:DC2BCA*
- ID_OUI_FROM_DATABASE=Zera GmbH
+OUI:F45FF7*
+ ID_OUI_FROM_DATABASE=DQ Technology Inc.
 
-OUI:508D6F*
- ID_OUI_FROM_DATABASE=CHAHOO Limited
+OUI:60F13D*
+ ID_OUI_FROM_DATABASE=JABLOCOM s.r.o.
 
-OUI:68831A*
- ID_OUI_FROM_DATABASE=Pandora Mobility Corporation
+OUI:0CEF7C*
+ ID_OUI_FROM_DATABASE=AnaCom Inc
 
-OUI:D4223F*
- ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
+OUI:E08FEC*
+ ID_OUI_FROM_DATABASE=REPOTEC CO., LTD.
 
-OUI:0868D0*
- ID_OUI_FROM_DATABASE=Japan System Design
+OUI:D0D286*
+ ID_OUI_FROM_DATABASE=Beckman Coulter K.K.
 
-OUI:103DEA*
- ID_OUI_FROM_DATABASE=HFC Technology (Beijing) Ltd. Co.
+OUI:1C0FCF*
+ ID_OUI_FROM_DATABASE=Sypro Optics GmbH
 
-OUI:E8E875*
- ID_OUI_FROM_DATABASE=iS5 Communications Inc.
+OUI:0025AB*
+ ID_OUI_FROM_DATABASE=AIO LCD PC BU / TPV
 
-OUI:2C7B5A*
- ID_OUI_FROM_DATABASE=Milper Ltd
+OUI:0025A4*
+ ID_OUI_FROM_DATABASE=EuroDesign embedded technologies GmbH
 
-OUI:185AE8*
- ID_OUI_FROM_DATABASE=Zenotech.Co.,Ltd
+OUI:00259D*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:E0AEED*
- ID_OUI_FROM_DATABASE=LOENK
+OUI:002598*
+ ID_OUI_FROM_DATABASE=Zhong Shan City Litai Electronic Industrial Co. Ltd
 
-OUI:D4EE07*
- ID_OUI_FROM_DATABASE=HIWIFI Co., Ltd.
+OUI:002591*
+ ID_OUI_FROM_DATABASE=NEXTEK, Inc.
 
-OUI:908260*
- ID_OUI_FROM_DATABASE=IEEE 1904.1 Working Group
+OUI:00258C*
+ ID_OUI_FROM_DATABASE=ESUS ELEKTRONIK SAN. VE DIS. TIC. LTD. STI.
 
-OUI:FCAD0F*
- ID_OUI_FROM_DATABASE=QTS NETWORKS
+OUI:002587*
+ ID_OUI_FROM_DATABASE=Vitality, Inc.
 
-OUI:984C04*
- ID_OUI_FROM_DATABASE=Zhangzhou Keneng Electrical Equipment Co Ltd
+OUI:002581*
+ ID_OUI_FROM_DATABASE=x-star networks Inc.
 
-OUI:CC047C*
- ID_OUI_FROM_DATABASE=G-WAY Microwave
+OUI:002582*
+ ID_OUI_FROM_DATABASE=Maksat Technologies (P) Ltd
 
-OUI:44F849*
- ID_OUI_FROM_DATABASE=Union Pacific Railroad
+OUI:002578*
+ ID_OUI_FROM_DATABASE=JSC Concern Sozvezdie
 
-OUI:1CFA68*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:00257D*
+ ID_OUI_FROM_DATABASE=PointRed Telecom Private Ltd.
 
-OUI:D0BE2C*
- ID_OUI_FROM_DATABASE=CNSLink Co., Ltd.
+OUI:002577*
+ ID_OUI_FROM_DATABASE=D-BOX Technologies
 
-OUI:281878*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:002571*
+ ID_OUI_FROM_DATABASE=Zhejiang Tianle Digital Electric Co.,Ltd
 
-OUI:E457A8*
- ID_OUI_FROM_DATABASE=Stuart Manufacturing, Inc.
+OUI:00256A*
+ ID_OUI_FROM_DATABASE=inIT - Institut Industrial IT
 
-OUI:2481AA*
- ID_OUI_FROM_DATABASE=KSH International Co., Ltd.
+OUI:002565*
+ ID_OUI_FROM_DATABASE=Vizimax Inc.
 
-OUI:789966*
- ID_OUI_FROM_DATABASE=Musilab Electronics (DongGuan)Co.,Ltd.
+OUI:00255E*
+ ID_OUI_FROM_DATABASE=Shanghai Dare Technologies Co.,Ltd.
 
-OUI:EC2C49*
- ID_OUI_FROM_DATABASE=University of Tokyo
+OUI:002558*
+ ID_OUI_FROM_DATABASE=MPEDIA
 
-OUI:CC5D57*
- ID_OUI_FROM_DATABASE=Information  System Research Institute,Inc.
+OUI:002635*
+ ID_OUI_FROM_DATABASE=Bluetechnix GmbH
 
-OUI:1C37BF*
- ID_OUI_FROM_DATABASE=Cloudium Systems Ltd.
+OUI:00262F*
+ ID_OUI_FROM_DATABASE=HAMAMATSU TOA ELECTRONICS
 
-OUI:249504*
- ID_OUI_FROM_DATABASE=SFR
+OUI:002623*
+ ID_OUI_FROM_DATABASE=JRD Communication Inc
 
-OUI:308999*
- ID_OUI_FROM_DATABASE=Guangdong East Power Co.,
+OUI:002628*
+ ID_OUI_FROM_DATABASE=companytec automação e controle ltda.
 
-OUI:D4A499*
- ID_OUI_FROM_DATABASE=InView Technology Corporation
+OUI:00261C*
+ ID_OUI_FROM_DATABASE=NEOVIA INC.
 
-OUI:AC4122*
- ID_OUI_FROM_DATABASE=Eclipse Electronic Systems Inc.
+OUI:002615*
+ ID_OUI_FROM_DATABASE=Teracom Limited
 
-OUI:A073FC*
- ID_OUI_FROM_DATABASE=Rancore Technologies Private Limited
+OUI:002616*
+ ID_OUI_FROM_DATABASE=Rosemount Inc.
 
-OUI:846223*
- ID_OUI_FROM_DATABASE=Shenzhen Coship Electronics Co., Ltd.
+OUI:002610*
+ ID_OUI_FROM_DATABASE=Apacewave Technologies
 
-OUI:A4E991*
- ID_OUI_FROM_DATABASE=SISTEMAS AUDIOVISUALES ITELSIS S.L.
+OUI:002609*
+ ID_OUI_FROM_DATABASE=Phyllis Co., Ltd.
 
-OUI:84F493*
- ID_OUI_FROM_DATABASE=OMS spol. s.r.o.
+OUI:00268C*
+ ID_OUI_FROM_DATABASE=StarLeaf Ltd.
 
-OUI:386793*
- ID_OUI_FROM_DATABASE=Asia Optical Co., Inc.
+OUI:002686*
+ ID_OUI_FROM_DATABASE=Quantenna Communcations, Inc.
 
-OUI:BCD177*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:002680*
+ ID_OUI_FROM_DATABASE=SIL3 Pty.Ltd
 
-OUI:C8B373*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:00267F*
+ ID_OUI_FROM_DATABASE=Zenterio AB
 
-OUI:983071*
- ID_OUI_FROM_DATABASE=DAIKYUNG VASCOM
+OUI:00267A*
+ ID_OUI_FROM_DATABASE=wuhan hongxin telecommunication technologies co.,ltd
 
-OUI:0C0400*
- ID_OUI_FROM_DATABASE=Jantar d.o.o.
+OUI:002679*
+ ID_OUI_FROM_DATABASE=Euphonic Technologies, Inc.
 
-OUI:C04301*
- ID_OUI_FROM_DATABASE=Epec Oy
+OUI:002673*
+ ID_OUI_FROM_DATABASE=RICOH COMPANY,LTD.
 
-OUI:687CD5*
- ID_OUI_FROM_DATABASE=Y Soft Corporation, a.s.
+OUI:00266D*
+ ID_OUI_FROM_DATABASE=MobileAccess Networks
 
-OUI:E07C62*
- ID_OUI_FROM_DATABASE=Whistle Labs, Inc.
+OUI:0025D6*
+ ID_OUI_FROM_DATABASE=The Kroger Co.
 
-OUI:FC4499*
- ID_OUI_FROM_DATABASE=Swarco LEA d.o.o.
+OUI:0025CA*
+ ID_OUI_FROM_DATABASE=LS Research, LLC
 
-OUI:0C8484*
- ID_OUI_FROM_DATABASE=Zenovia Electronics Inc.
+OUI:0025BE*
+ ID_OUI_FROM_DATABASE=Tektrap Systems Inc.
 
-OUI:5CF370*
- ID_OUI_FROM_DATABASE=CC&C Technologies, Inc
+OUI:0025BD*
+ ID_OUI_FROM_DATABASE=Italdata Ingegneria dell'Idea S.p.A.
 
-OUI:A01C05*
- ID_OUI_FROM_DATABASE=NIMAX TELECOM CO.,LTD.
+OUI:0025B7*
+ ID_OUI_FROM_DATABASE=Costar  electronics, inc.,
 
-OUI:F80DEA*
- ID_OUI_FROM_DATABASE=ZyCast Technology Inc.
+OUI:0025B0*
+ ID_OUI_FROM_DATABASE=Schmartz Inc
 
-OUI:1800DB*
- ID_OUI_FROM_DATABASE=Fitbit Inc.
+OUI:002546*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:50A715*
- ID_OUI_FROM_DATABASE=Aboundi, Inc.
+OUI:002545*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:FC35E6*
- ID_OUI_FROM_DATABASE=Visteon corp
+OUI:002535*
+ ID_OUI_FROM_DATABASE=Minimax GmbH & Co KG
 
-OUI:D866C6*
- ID_OUI_FROM_DATABASE=Shenzhen Daystar Technology Co.,ltd
+OUI:002532*
+ ID_OUI_FROM_DATABASE=Digital Recorders
 
-OUI:1836FC*
- ID_OUI_FROM_DATABASE=Elecsys International Corporation
+OUI:00252B*
+ ID_OUI_FROM_DATABASE=Stirling Energy Systems
 
-OUI:F48139*
- ID_OUI_FROM_DATABASE=CANON INC.
+OUI:0025FD*
+ ID_OUI_FROM_DATABASE=OBR Centrum Techniki Morskiej S.A.
 
-OUI:D40BB9*
- ID_OUI_FROM_DATABASE=Solid Semecs bv.
+OUI:002603*
+ ID_OUI_FROM_DATABASE=Shenzhen Wistar Technology Co., Ltd
 
-OUI:748E08*
- ID_OUI_FROM_DATABASE=Bestek Corp.
+OUI:0025F3*
+ ID_OUI_FROM_DATABASE=Nordwestdeutsche Zählerrevision
 
-OUI:B8C855*
- ID_OUI_FROM_DATABASE=Shanghai GBCOM Communication Technology Co.,Ltd.
+OUI:0025EC*
+ ID_OUI_FROM_DATABASE=Humanware
 
-OUI:C47DFE*
- ID_OUI_FROM_DATABASE=A.N. Solutions GmbH
+OUI:0025E2*
+ ID_OUI_FROM_DATABASE=Everspring Industry Co., Ltd.
 
-OUI:E031D0*
- ID_OUI_FROM_DATABASE=SZ Telstar CO., LTD
+OUI:0025DD*
+ ID_OUI_FROM_DATABASE=SUNNYTEK INFORMATION CO., LTD.
 
-OUI:70C6AC*
- ID_OUI_FROM_DATABASE=Bosch Automotive Aftermarket
+OUI:002667*
+ ID_OUI_FROM_DATABASE=CARECOM CO.,LTD.
 
-OUI:2C69BA*
- ID_OUI_FROM_DATABASE=RF Controls, LLC
+OUI:002660*
+ ID_OUI_FROM_DATABASE=Logiways
 
-OUI:DC5726*
- ID_OUI_FROM_DATABASE=Power-One
+OUI:002656*
+ ID_OUI_FROM_DATABASE=Sansonic Electronics USA
 
-OUI:2C245F*
- ID_OUI_FROM_DATABASE=Babolat VS
+OUI:002653*
+ ID_OUI_FROM_DATABASE=DaySequerra Corporation
 
-OUI:D464F7*
- ID_OUI_FROM_DATABASE=CHENGDU USEE DIGITAL TECHNOLOGY CO., LTD
+OUI:00264C*
+ ID_OUI_FROM_DATABASE=Shanghai DigiVision Technology Co., Ltd.
 
-OUI:A47ACF*
- ID_OUI_FROM_DATABASE=VIBICOM COMMUNICATIONS INC.
+OUI:002647*
+ ID_OUI_FROM_DATABASE=WFE TECHNOLOGY CORP.
 
-OUI:CC3C3F*
- ID_OUI_FROM_DATABASE=SA.S.S. Datentechnik AG
+OUI:00263B*
+ ID_OUI_FROM_DATABASE=Onbnetech
 
-OUI:905692*
- ID_OUI_FROM_DATABASE=Autotalks Ltd.
+OUI:0026C1*
+ ID_OUI_FROM_DATABASE=ARTRAY CO., LTD.
 
-OUI:0C2AE7*
- ID_OUI_FROM_DATABASE=Beijing General Research Institute of Mining and Metallurgy
+OUI:0026B5*
+ ID_OUI_FROM_DATABASE=ICOMM Tele Ltd
 
-OUI:DCD52A*
- ID_OUI_FROM_DATABASE=Sunny Heart Limited
+OUI:0026AF*
+ ID_OUI_FROM_DATABASE=Duelco A/S
 
-OUI:C4C755*
- ID_OUI_FROM_DATABASE=Beijing HuaqinWorld Technology Co.,Ltd
+OUI:0026A5*
+ ID_OUI_FROM_DATABASE=MICROROBOT.CO.,LTD
 
-OUI:9C79AC*
- ID_OUI_FROM_DATABASE=Suntec Software(Shanghai) Co., Ltd.
+OUI:00269F*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:F8DFA8*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:002699*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:ACA430*
- ID_OUI_FROM_DATABASE=Peerless AV
+OUI:002489*
+ ID_OUI_FROM_DATABASE=Vodafone Omnitel N.V.
 
-OUI:B4AB2C*
- ID_OUI_FROM_DATABASE=MtM Technology Corporation
+OUI:00248E*
+ ID_OUI_FROM_DATABASE=Infoware ZRt.
 
-OUI:74372F*
- ID_OUI_FROM_DATABASE=Tongfang Shenzhen Cloudcomputing Technology Co.,Ltd
+OUI:002476*
+ ID_OUI_FROM_DATABASE=TAP.tv
 
-OUI:BC51FE*
- ID_OUI_FROM_DATABASE=Swann communications Pty Ltd
+OUI:00246F*
+ ID_OUI_FROM_DATABASE=Onda Communication spa
 
-OUI:D40FB2*
- ID_OUI_FROM_DATABASE=Applied Micro Electronics AME bv
+OUI:00246A*
+ ID_OUI_FROM_DATABASE=Solid Year Co., Ltd.
 
-OUI:74FE48*
- ID_OUI_FROM_DATABASE=ADVANTECH CO., LTD.
+OUI:0023FA*
+ ID_OUI_FROM_DATABASE=RG Nets, Inc.
 
-OUI:D0B498*
- ID_OUI_FROM_DATABASE=Robert Bosch LLC Automotive Electronics
+OUI:0023FF*
+ ID_OUI_FROM_DATABASE=Beijing HTTC Technology Ltd.
 
-OUI:80B95C*
- ID_OUI_FROM_DATABASE=ELFTECH Co., Ltd.
+OUI:0023F4*
+ ID_OUI_FROM_DATABASE=Masternaut
 
-OUI:E85AA7*
- ID_OUI_FROM_DATABASE=LLC Emzior
+OUI:0023EA*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:242FFA*
- ID_OUI_FROM_DATABASE=Toshiba Global Commerce Solutions
+OUI:0023E4*
+ ID_OUI_FROM_DATABASE=IPnect co. ltd.
 
-OUI:A0BAB8*
- ID_OUI_FROM_DATABASE=Pixon Imaging
+OUI:0023DE*
+ ID_OUI_FROM_DATABASE=Ansync Inc.
 
-OUI:9CE1D6*
- ID_OUI_FROM_DATABASE=Junger Audio-Studiotechnik GmbH
+OUI:0023D1*
+ ID_OUI_FROM_DATABASE=TRG
 
-OUI:E4E409*
- ID_OUI_FROM_DATABASE=LEIFHEIT AG
+OUI:0023CB*
+ ID_OUI_FROM_DATABASE=Shenzhen Full-join Technology Co.,Ltd
 
-OUI:004D32*
- ID_OUI_FROM_DATABASE=Andon Health Co.,Ltd.
+OUI:0023D2*
+ ID_OUI_FROM_DATABASE=Inhand Electronics, Inc.
 
-OUI:C46DF1*
- ID_OUI_FROM_DATABASE=DataGravity
+OUI:0024B4*
+ ID_OUI_FROM_DATABASE=ESCATRONIC GmbH
 
-OUI:28D244*
- ID_OUI_FROM_DATABASE=LCFC(HeFei) Electronics Technology Co., Ltd.
+OUI:0024AD*
+ ID_OUI_FROM_DATABASE=Adolf Thies Gmbh & Co. KG
 
-OUI:ACE87E*
- ID_OUI_FROM_DATABASE=Bytemark Computer Consulting Ltd
+OUI:00249C*
+ ID_OUI_FROM_DATABASE=Bimeng Comunication System Co. Ltd
 
-OUI:60CDC5*
- ID_OUI_FROM_DATABASE=Taiwan Carol Electronics., Ltd
+OUI:002526*
+ ID_OUI_FROM_DATABASE=Genuine Technologies Co., Ltd.
 
-OUI:60C5A8*
- ID_OUI_FROM_DATABASE=Beijing LT Honway Technology Co.,Ltd
+OUI:002525*
+ ID_OUI_FROM_DATABASE=CTERA Networks Ltd.
 
-OUI:B4DF3B*
- ID_OUI_FROM_DATABASE=Chromlech
+OUI:002520*
+ ID_OUI_FROM_DATABASE=SMA Railway Technology GmbH
 
-OUI:A46E79*
- ID_OUI_FROM_DATABASE=DFT System Co.Ltd
+OUI:00251B*
+ ID_OUI_FROM_DATABASE=Philips CareServant
 
-OUI:94DE80*
- ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
+OUI:002516*
+ ID_OUI_FROM_DATABASE=Integrated Design Tools, Inc.
 
-OUI:C88A83*
- ID_OUI_FROM_DATABASE=Dongguan HuaHong Electronics Co.,Ltd
+OUI:00250F*
+ ID_OUI_FROM_DATABASE=On-Ramp Wireless, Inc.
 
-OUI:0CC655*
- ID_OUI_FROM_DATABASE=Wuxi YSTen Technology Co.,Ltd.
+OUI:002503*
+ ID_OUI_FROM_DATABASE=IBM Corp
 
-OUI:D410CF*
- ID_OUI_FROM_DATABASE=Huanshun Network Science and Technology Co., Ltd.
+OUI:00250A*
+ ID_OUI_FROM_DATABASE=Security Expert Co. Ltd
 
-OUI:B80415*
- ID_OUI_FROM_DATABASE=Bayan Audio
+OUI:0024DD*
+ ID_OUI_FROM_DATABASE=Centrak, Inc.
 
-OUI:84C8B1*
- ID_OUI_FROM_DATABASE=Incognito Software Systems Inc.
+OUI:0024D8*
+ ID_OUI_FROM_DATABASE=IlSung Precision
 
-OUI:645A04*
- ID_OUI_FROM_DATABASE=Chicony Electronics Co., Ltd.
+OUI:0024CC*
+ ID_OUI_FROM_DATABASE=Fascinations Toys and Gifts, Inc.
 
-OUI:5C89D4*
- ID_OUI_FROM_DATABASE=Beijing Banner Electric Co.,Ltd
+OUI:0024D1*
+ ID_OUI_FROM_DATABASE=Thomson Inc.
 
-OUI:984CD3*
- ID_OUI_FROM_DATABASE=Mantis Deposition
+OUI:0024CA*
+ ID_OUI_FROM_DATABASE=Tobii Technology AB
 
-OUI:8C4CDC*
- ID_OUI_FROM_DATABASE=PLANEX COMMUNICATIONS INC.
+OUI:0024C5*
+ ID_OUI_FROM_DATABASE=Meridian Audio Limited
 
-OUI:D063B4*
- ID_OUI_FROM_DATABASE=SolidRun Ltd.
+OUI:0024B9*
+ ID_OUI_FROM_DATABASE=Wuhan Higheasy Electronic Technology Development Co.Ltd
 
-OUI:2C3BFD*
- ID_OUI_FROM_DATABASE=Netstor Technology Co., Ltd.
+OUI:002425*
+ ID_OUI_FROM_DATABASE=Shenzhenshi chuangzhicheng Technology Co.,Ltd
 
-OUI:F073AE*
- ID_OUI_FROM_DATABASE=PEAK-System Technik
+OUI:002419*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:684CA8*
- ID_OUI_FROM_DATABASE=Shenzhen Herotel Tech. Co., Ltd.
+OUI:002412*
+ ID_OUI_FROM_DATABASE=Benign Technologies Co, Ltd.
 
-OUI:F4472A*
- ID_OUI_FROM_DATABASE=Nanjing Rousing Sci. and Tech. Industrial Co., Ltd
+OUI:00240C*
+ ID_OUI_FROM_DATABASE=DELEC GmbH
 
-OUI:185253*
- ID_OUI_FROM_DATABASE=Pixord Corporation
+OUI:002406*
+ ID_OUI_FROM_DATABASE=Pointmobile
 
-OUI:FCA9B0*
- ID_OUI_FROM_DATABASE=MIARTECH (SHANGHAI),INC.
+OUI:0023F9*
+ ID_OUI_FROM_DATABASE=Double-Take Software, INC.
 
-OUI:80D733*
- ID_OUI_FROM_DATABASE=QSR Automations, Inc.
+OUI:002463*
+ ID_OUI_FROM_DATABASE=Phybridge Inc
 
-OUI:8C3330*
- ID_OUI_FROM_DATABASE=EmFirst Co., Ltd.
+OUI:002459*
+ ID_OUI_FROM_DATABASE=ABB Automation products GmbH
 
-OUI:8C0C90*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:00245E*
+ ID_OUI_FROM_DATABASE=Hivision Co.,ltd
 
-OUI:08E5DA*
- ID_OUI_FROM_DATABASE=NANJING FUJITSU COMPUTER PRODUCTS CO.,LTD.
+OUI:002451*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:5884E4*
- ID_OUI_FROM_DATABASE=IP500 Alliance e.V.
+OUI:00244C*
+ ID_OUI_FROM_DATABASE=Solartron Metrology Ltd
 
-OUI:04E9E5*
- ID_OUI_FROM_DATABASE=PJRC.COM, LLC
+OUI:00243F*
+ ID_OUI_FROM_DATABASE=Storwize, Inc.
 
-OUI:703811*
- ID_OUI_FROM_DATABASE=Invensys Rail
+OUI:002440*
+ ID_OUI_FROM_DATABASE=Halo Monitoring, Inc.
 
-OUI:ACE64B*
- ID_OUI_FROM_DATABASE=Shenzhen Baojia Battery Technology Co., Ltd.
+OUI:00243B*
+ ID_OUI_FROM_DATABASE=CSSI (S) Pte Ltd
 
-OUI:303294*
- ID_OUI_FROM_DATABASE=W-IE-NE-R Plein & Baus GmbH
+OUI:0024FC*
+ ID_OUI_FROM_DATABASE=QuoPin Co., Ltd.
 
-OUI:EC473C*
- ID_OUI_FROM_DATABASE=Redwire, LLC
+OUI:0024F7*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:5481AD*
- ID_OUI_FROM_DATABASE=Eagle Research Corporation
+OUI:0024F0*
+ ID_OUI_FROM_DATABASE=Seanodes
 
-OUI:7C822D*
- ID_OUI_FROM_DATABASE=Nortec
+OUI:0024EB*
+ ID_OUI_FROM_DATABASE=ClearPath Networks, Inc.
 
-OUI:745FAE*
- ID_OUI_FROM_DATABASE=TSL PPL
+OUI:0024E4*
+ ID_OUI_FROM_DATABASE=Withings
 
-OUI:8462A6*
- ID_OUI_FROM_DATABASE=EuroCB (Phils), Inc.
+OUI:002435*
+ ID_OUI_FROM_DATABASE=WIDE CORPORATION
 
-OUI:80FA5B*
- ID_OUI_FROM_DATABASE=CLEVO CO.
+OUI:00242F*
+ ID_OUI_FROM_DATABASE=Micron
 
-OUI:E4F365*
- ID_OUI_FROM_DATABASE=Time-O-Matic, Inc.
+OUI:00241F*
+ ID_OUI_FROM_DATABASE=DCT-Delta GmbH
 
-OUI:18550F*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:0023C5*
+ ID_OUI_FROM_DATABASE=Radiation Safety and Control Services Inc
 
-OUI:1C9179*
- ID_OUI_FROM_DATABASE=Integrated System Technologies Ltd
+OUI:0023C4*
+ ID_OUI_FROM_DATABASE=Lux Lumen
 
-OUI:38F597*
- ID_OUI_FROM_DATABASE=home2net GmbH
+OUI:0023B8*
+ ID_OUI_FROM_DATABASE=Sichuan Jiuzhou Electronic Technology Co.,Ltd
 
-OUI:386645*
- ID_OUI_FROM_DATABASE=OOSIC Technology CO.,Ltd
+OUI:0023BF*
+ ID_OUI_FROM_DATABASE=Mainpine, Inc.
 
-OUI:D0DFB2*
- ID_OUI_FROM_DATABASE=Genie Networks Limited
+OUI:0023B2*
+ ID_OUI_FROM_DATABASE=Intelligent Mechatronic Systems Inc
 
-OUI:808B5C*
- ID_OUI_FROM_DATABASE=Shenzhen Runhuicheng Technology Co., Ltd
+OUI:0023AC*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:04586F*
- ID_OUI_FROM_DATABASE=Sichuan Whayer information industry Co.,LTD
+OUI:0023A0*
+ ID_OUI_FROM_DATABASE=Hana CNS Co., LTD.
 
-OUI:449B78*
- ID_OUI_FROM_DATABASE=The Now Factory
+OUI:0023A5*
+ ID_OUI_FROM_DATABASE=SageTV, LLC
 
-OUI:D052A8*
- ID_OUI_FROM_DATABASE=Physical Graph Corporation
+OUI:0022B6*
+ ID_OUI_FROM_DATABASE=Superflow Technologies Group
 
-OUI:34F62D*
- ID_OUI_FROM_DATABASE=SHARP Corporation
+OUI:0022A3*
+ ID_OUI_FROM_DATABASE=California Eastern Laboratories
 
-OUI:C4EBE3*
- ID_OUI_FROM_DATABASE=RRCN SAS
+OUI:00229E*
+ ID_OUI_FROM_DATABASE=Social Aid Research Co., Ltd.
 
-OUI:4C1A95*
- ID_OUI_FROM_DATABASE=Novakon Co., Ltd.
+OUI:002291*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:C04A00*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:002292*
+ ID_OUI_FROM_DATABASE=Cinetal
 
-OUI:9C3178*
- ID_OUI_FROM_DATABASE=Foshan Huadian Intelligent Communications Teachnologies Co.,Ltd
+OUI:002297*
+ ID_OUI_FROM_DATABASE=XMOS Semiconductor
 
-OUI:48BE2D*
- ID_OUI_FROM_DATABASE=Symanitron
+OUI:00228B*
+ ID_OUI_FROM_DATABASE=Kensington Computer Products Group
 
-OUI:38E595*
- ID_OUI_FROM_DATABASE=Shenzhen Gongjin Electronics Co.,Ltd
+OUI:002284*
+ ID_OUI_FROM_DATABASE=DESAY A&V SCIENCE AND TECHNOLOGY CO.,LTD
 
-OUI:B86091*
- ID_OUI_FROM_DATABASE=Onnet Technologies and Innovations LLC
+OUI:002277*
+ ID_OUI_FROM_DATABASE=NEC Australia Pty Ltd
 
-OUI:201A06*
- ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
+OUI:00226D*
+ ID_OUI_FROM_DATABASE=Shenzhen GIEC Electronics Co., Ltd.
 
-OUI:D4CA6E*
- ID_OUI_FROM_DATABASE=u-blox AG
+OUI:002263*
+ ID_OUI_FROM_DATABASE=Koos Technical Services, Inc.
 
-OUI:C011A6*
- ID_OUI_FROM_DATABASE=Fort-Telecom ltd.
+OUI:002267*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:B8DAF1*
- ID_OUI_FROM_DATABASE=Strahlenschutz- Entwicklungs- und Ausruestungsgesellschaft mbH
+OUI:002259*
+ ID_OUI_FROM_DATABASE=Guangzhou New Postcom Equipment Co.,Ltd.
 
-OUI:1C11E1*
- ID_OUI_FROM_DATABASE=Wartsila Finland Oy
+OUI:0022E4*
+ ID_OUI_FROM_DATABASE=APASS TECHNOLOGY CO., LTD.
 
-OUI:50465D*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:0022DD*
+ ID_OUI_FROM_DATABASE=Protecta Electronics Ltd
 
-OUI:74BFA1*
- ID_OUI_FROM_DATABASE=HYUNTECK
+OUI:0022D8*
+ ID_OUI_FROM_DATABASE=Shenzhen GST Security and Safety Technology Limited
 
-OUI:F8AA8A*
- ID_OUI_FROM_DATABASE=Axview Technology (Shenzhen) Co.,Ltd
+OUI:0022D1*
+ ID_OUI_FROM_DATABASE=Albrecht Jung GmbH & Co. KG
 
-OUI:5894CF*
- ID_OUI_FROM_DATABASE=Vertex Standard LMR, Inc.
+OUI:0022C3*
+ ID_OUI_FROM_DATABASE=Zeeport Technology Inc.
 
-OUI:2C5AA3*
- ID_OUI_FROM_DATABASE=PROMATE ELECTRONIC CO.LTD
+OUI:0022C7*
+ ID_OUI_FROM_DATABASE=SEGGER Microcontroller GmbH & Co. KG
 
-OUI:B4009C*
- ID_OUI_FROM_DATABASE=CableWorld Ltd.
+OUI:0022BD*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:803FD6*
- ID_OUI_FROM_DATABASE=bytes at work AG
+OUI:002344*
+ ID_OUI_FROM_DATABASE=Objective Interface Systems, Inc.
 
-OUI:645FFF*
- ID_OUI_FROM_DATABASE=Nicolet Neuro
+OUI:002343*
+ ID_OUI_FROM_DATABASE=TEM AG
 
-OUI:2829D9*
- ID_OUI_FROM_DATABASE=GlobalBeiMing technology (Beijing)Co. Ltd
+OUI:002337*
+ ID_OUI_FROM_DATABASE=Global Star Solutions ULC
 
-OUI:189A67*
- ID_OUI_FROM_DATABASE=CSE-Servelec Limited
+OUI:00232B*
+ ID_OUI_FROM_DATABASE=IRD A/S
 
-OUI:38A5B6*
- ID_OUI_FROM_DATABASE=SHENZHEN MEGMEET ELECTRICAL CO.,LTD
+OUI:00231C*
+ ID_OUI_FROM_DATABASE=Fourier Systems Ltd.
 
-OUI:E43FA2*
- ID_OUI_FROM_DATABASE=Wuxi DSP Technologies Inc.
+OUI:00231B*
+ ID_OUI_FROM_DATABASE=Danaher Motion - Kollmorgen
 
-OUI:00FD4C*
- ID_OUI_FROM_DATABASE=NEVATEC
+OUI:00239F*
+ ID_OUI_FROM_DATABASE=Institut für Prüftechnik
 
-OUI:6045BD*
- ID_OUI_FROM_DATABASE=Microsoft
+OUI:002393*
+ ID_OUI_FROM_DATABASE=AJINEXTEK
 
-OUI:9C54CA*
- ID_OUI_FROM_DATABASE=Zhengzhou VCOM Science and Technology Co.,Ltd
+OUI:00238F*
+ ID_OUI_FROM_DATABASE=NIDEC COPAL CORPORATION
 
-OUI:388AB7*
- ID_OUI_FROM_DATABASE=ITC Networks
+OUI:002385*
+ ID_OUI_FROM_DATABASE=ANTIPODE
 
-OUI:BCC23A*
- ID_OUI_FROM_DATABASE=Thomson Video Networks
+OUI:00237E*
+ ID_OUI_FROM_DATABASE=ELSTER GMBH
 
-OUI:00BF15*
- ID_OUI_FROM_DATABASE=Genetec Inc.
+OUI:002379*
+ ID_OUI_FROM_DATABASE=Union Business Machines Co. Ltd.
 
-OUI:20F85E*
- ID_OUI_FROM_DATABASE=Delta Electronics
+OUI:002253*
+ ID_OUI_FROM_DATABASE=Entorian Technologies
 
-OUI:68CE4E*
- ID_OUI_FROM_DATABASE=L-3 Communications Infrared Products
+OUI:002250*
+ ID_OUI_FROM_DATABASE=Point Six Wireless, LLC
 
-OUI:68B6FC*
- ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
+OUI:002249*
+ ID_OUI_FROM_DATABASE=HOME MULTIENERGY SL
 
-OUI:7C160D*
- ID_OUI_FROM_DATABASE=Saia-Burgess Controls AG
+OUI:00224A*
+ ID_OUI_FROM_DATABASE=RAYLASE AG
 
-OUI:A4D18F*
- ID_OUI_FROM_DATABASE=Shenzhen Skyee Optical Fiber Communication Technology Ltd.
+OUI:002240*
+ ID_OUI_FROM_DATABASE=Universal Telecom S/A
 
-OUI:0C565C*
- ID_OUI_FROM_DATABASE=HyBroad Vision (Hong Kong) Technology Co Ltd
+OUI:00222D*
+ ID_OUI_FROM_DATABASE=SMC Networks Inc.
 
-OUI:647C34*
- ID_OUI_FROM_DATABASE=Ubee Interactive Corp.
+OUI:00222E*
+ ID_OUI_FROM_DATABASE=maintech GmbH
 
-OUI:649FF7*
- ID_OUI_FROM_DATABASE=Kone OYj
+OUI:002364*
+ ID_OUI_FROM_DATABASE=Power Instruments Pte Ltd
 
-OUI:4C068A*
- ID_OUI_FROM_DATABASE=Basler Electric Company
+OUI:002369*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
-OUI:E0A30F*
- ID_OUI_FROM_DATABASE=Pevco
+OUI:002370*
+ ID_OUI_FROM_DATABASE=Snell
 
-OUI:5C1737*
- ID_OUI_FROM_DATABASE=I-View Now, LLC.
+OUI:00235D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:049C62*
- ID_OUI_FROM_DATABASE=BMT Medical Technology s.r.o.
+OUI:002356*
+ ID_OUI_FROM_DATABASE=Packet Forensics LLC
 
-OUI:C4BA99*
- ID_OUI_FROM_DATABASE=I+ME Actia Informatik und Mikro-Elektronik GmbH
+OUI:002313*
+ ID_OUI_FROM_DATABASE=Qool Technologies Ltd.
 
-OUI:0C2A69*
- ID_OUI_FROM_DATABASE=electric imp, incorporated
+OUI:00230D*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:BC811F*
- ID_OUI_FROM_DATABASE=Ingate Systems
+OUI:002301*
+ ID_OUI_FROM_DATABASE=Witron Technology Limited
 
-OUI:34E0CF*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:0022F7*
+ ID_OUI_FROM_DATABASE=Conceptronic
 
-OUI:801DAA*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:0022EA*
+ ID_OUI_FROM_DATABASE=Rustelcom Inc.
 
-OUI:6C40C6*
- ID_OUI_FROM_DATABASE=Nimbus Data Systems, Inc.
+OUI:0022F0*
+ ID_OUI_FROM_DATABASE=3 Greens Aviation Limited
 
-OUI:503F56*
- ID_OUI_FROM_DATABASE=Syncmold Enterprise Corp
+OUI:0022E9*
+ ID_OUI_FROM_DATABASE=ProVision Communications
 
-OUI:D04CC1*
- ID_OUI_FROM_DATABASE=SINTRONES Technology Corp.
+OUI:00211C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:DC9FA4*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:002117*
+ ID_OUI_FROM_DATABASE=Tellord
 
-OUI:44C39B*
- ID_OUI_FROM_DATABASE=OOO RUBEZH NPO
+OUI:002110*
+ ID_OUI_FROM_DATABASE=Clearbox Systems
 
-OUI:58C232*
- ID_OUI_FROM_DATABASE=NEC Corporation
+OUI:002106*
+ ID_OUI_FROM_DATABASE=RIM Testing Services
 
-OUI:D8C691*
- ID_OUI_FROM_DATABASE=Hichan Technology Corp.
+OUI:001FFF*
+ ID_OUI_FROM_DATABASE=Respironics, Inc.
 
-OUI:7C02BC*
- ID_OUI_FROM_DATABASE=Hansung Electronics Co. LTD
+OUI:001FFE*
+ ID_OUI_FROM_DATABASE=HPN Supply Chain
 
-OUI:1848D8*
- ID_OUI_FROM_DATABASE=Fastback Networks
+OUI:001FF8*
+ ID_OUI_FROM_DATABASE=Siemens AG, Sector Industry, Drive Technologies, Motion Control Systems
 
-OUI:702393*
- ID_OUI_FROM_DATABASE=fos4X GmbH
+OUI:001FFD*
+ ID_OUI_FROM_DATABASE=Indigo Mobile Technologies Corp.
 
-OUI:D8AFF1*
- ID_OUI_FROM_DATABASE=Panasonic Appliances Company
+OUI:002221*
+ ID_OUI_FROM_DATABASE=ITOH DENKI CO,LTD.
 
-OUI:58ECE1*
- ID_OUI_FROM_DATABASE=Newport Corporation
+OUI:00221B*
+ ID_OUI_FROM_DATABASE=Morega Systems
 
-OUI:14358B*
- ID_OUI_FROM_DATABASE=Mediabridge Products, LLC.
+OUI:002220*
+ ID_OUI_FROM_DATABASE=Mitac Technology Corp
 
-OUI:34996F*
- ID_OUI_FROM_DATABASE=VPI Engineering
+OUI:002227*
+ ID_OUI_FROM_DATABASE=uv-electronic GmbH
 
-OUI:241064*
- ID_OUI_FROM_DATABASE=Shenzhen Ecsino Tecnical Co. Ltd
+OUI:002214*
+ ID_OUI_FROM_DATABASE=RINNAI KOREA
 
-OUI:10D1DC*
- ID_OUI_FROM_DATABASE=INSTAR Deutschland GmbH
+OUI:00220E*
+ ID_OUI_FROM_DATABASE=Indigo Security Co., Ltd.
 
-OUI:D8160A*
- ID_OUI_FROM_DATABASE=Nippon Electro-Sensory Devices
+OUI:002208*
+ ID_OUI_FROM_DATABASE=Certicom Corp
 
-OUI:F45433*
- ID_OUI_FROM_DATABASE=Rockwell Automation
+OUI:002201*
+ ID_OUI_FROM_DATABASE=Aksys Networks Inc
 
-OUI:EC9327*
- ID_OUI_FROM_DATABASE=MEMMERT GmbH + Co. KG
+OUI:0021F7*
+ ID_OUI_FROM_DATABASE=HPN Supply Chain
 
-OUI:1C43EC*
- ID_OUI_FROM_DATABASE=JAPAN CIRCUIT CO.,LTD
+OUI:0021A0*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:BC28D6*
- ID_OUI_FROM_DATABASE=Rowley Associates Limited
+OUI:00219C*
+ ID_OUI_FROM_DATABASE=Honeywld Technology Corp.
 
-OUI:F05F5A*
- ID_OUI_FROM_DATABASE=Getriebebau NORD GmbH and Co. KG
+OUI:002192*
+ ID_OUI_FROM_DATABASE=Baoding Galaxy Electronic Technology  Co.,Ltd
 
-OUI:009569*
- ID_OUI_FROM_DATABASE=LSD Science and Technology Co.,Ltd.
+OUI:00218C*
+ ID_OUI_FROM_DATABASE=TopControl GMBH
 
-OUI:34C803*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:00217F*
+ ID_OUI_FROM_DATABASE=Intraco Technology Pte Ltd
 
-OUI:5011EB*
- ID_OUI_FROM_DATABASE=SilverNet Ltd
+OUI:00217A*
+ ID_OUI_FROM_DATABASE=Sejin Electron, Inc.
 
-OUI:5CD41B*
- ID_OUI_FROM_DATABASE=UCZOON Technology Co., LTD
+OUI:002179*
+ ID_OUI_FROM_DATABASE=IOGEAR, Inc.
 
-OUI:783CE3*
- ID_OUI_FROM_DATABASE=Kai-EE
+OUI:002173*
+ ID_OUI_FROM_DATABASE=Ion Torrent Systems, Inc.
 
-OUI:0868EA*
- ID_OUI_FROM_DATABASE=EITO ELECTRONICS CO., LTD.
+OUI:001FC3*
+ ID_OUI_FROM_DATABASE=SmartSynch, Inc
 
-OUI:5C4A26*
- ID_OUI_FROM_DATABASE=Enguity Technology Corp
+OUI:001FC8*
+ ID_OUI_FROM_DATABASE=Up-Today Industrial Co., Ltd.
 
-OUI:289EDF*
- ID_OUI_FROM_DATABASE=Danfoss Turbocor Compressors, Inc
+OUI:001FC1*
+ ID_OUI_FROM_DATABASE=Hanlong Technology Co.,LTD
 
-OUI:50053D*
- ID_OUI_FROM_DATABASE=CyWee Group Ltd
+OUI:001FC2*
+ ID_OUI_FROM_DATABASE=Jow Tong Technology Co Ltd
 
-OUI:4C64D9*
- ID_OUI_FROM_DATABASE=Guangdong Leawin Group Co., Ltd
+OUI:001FBC*
+ ID_OUI_FROM_DATABASE=EVGA Corporation
 
-OUI:7CB03E*
- ID_OUI_FROM_DATABASE=OSRAM GmbH
+OUI:001FB0*
+ ID_OUI_FROM_DATABASE=TimeIPS, Inc.
 
-OUI:14B1C8*
- ID_OUI_FROM_DATABASE=InfiniWing, Inc.
+OUI:001FB5*
+ ID_OUI_FROM_DATABASE=I/O Interconnect Inc.
 
-OUI:C0493D*
- ID_OUI_FROM_DATABASE=MAITRISE TECHNOLOGIQUE
+OUI:001FA9*
+ ID_OUI_FROM_DATABASE=Atlanta DTH, Inc.
 
-OUI:34A7BA*
- ID_OUI_FROM_DATABASE=Fischer International Systems Corporation
+OUI:0021F1*
+ ID_OUI_FROM_DATABASE=Tutus Data AB
 
-OUI:ACD364*
- ID_OUI_FROM_DATABASE=ABB SPA, ABB SACE DIV.
+OUI:0021F2*
+ ID_OUI_FROM_DATABASE=EASY3CALL Technology Limited
 
-OUI:38F8B7*
- ID_OUI_FROM_DATABASE=V2COM PARTICIPACOES S.A.
+OUI:0021EB*
+ ID_OUI_FROM_DATABASE=ESP SYSTEMS, LLC
 
-OUI:B48255*
- ID_OUI_FROM_DATABASE=Research Products Corporation
+OUI:0021E5*
+ ID_OUI_FROM_DATABASE=Display Solution AG
 
-OUI:2C750F*
- ID_OUI_FROM_DATABASE=Shanghai Dongzhou-Lawton Communication Technology Co. Ltd.
+OUI:0021E4*
+ ID_OUI_FROM_DATABASE=I-WIN
 
-OUI:B40418*
- ID_OUI_FROM_DATABASE=Smartchip Integrated Inc.
+OUI:0021DF*
+ ID_OUI_FROM_DATABASE=Martin Christ GmbH
 
-OUI:F4EA67*
+OUI:0021D8*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:D0AEEC*
- ID_OUI_FROM_DATABASE=Alpha Networks Inc.
+OUI:0021CC*
+ ID_OUI_FROM_DATABASE=Flextronics International
 
-OUI:3C98BF*
- ID_OUI_FROM_DATABASE=Quest Controls, Inc.
+OUI:001FF1*
+ ID_OUI_FROM_DATABASE=Paradox Hellas S.A.
 
-OUI:D05785*
- ID_OUI_FROM_DATABASE=Pantech Co., Ltd.
+OUI:001FEC*
+ ID_OUI_FROM_DATABASE=Synapse Électronique
 
-OUI:045C06*
- ID_OUI_FROM_DATABASE=Zmodo Technology Corporation
+OUI:001FE5*
+ ID_OUI_FROM_DATABASE=In-Circuit GmbH
 
-OUI:504A5E*
- ID_OUI_FROM_DATABASE=Masimo Corporation
+OUI:001FD9*
+ ID_OUI_FROM_DATABASE=RSD Communications Ltd
 
-OUI:38BF33*
- ID_OUI_FROM_DATABASE=NEC CASIO Mobile Communications
+OUI:001FD4*
+ ID_OUI_FROM_DATABASE=4IPNET, INC.
 
-OUI:A041A7*
- ID_OUI_FROM_DATABASE=NL Ministry of Defense
+OUI:001FCF*
+ ID_OUI_FROM_DATABASE=MSI Technology GmbH
 
-OUI:342F6E*
- ID_OUI_FROM_DATABASE=Anywire corporation
+OUI:00213F*
+ ID_OUI_FROM_DATABASE=A-Team Technology Ltd.
 
-OUI:E86D6E*
- ID_OUI_FROM_DATABASE=voestalpine SIGNALING Fareham Ltd.
+OUI:002139*
+ ID_OUI_FROM_DATABASE=Escherlogic Inc.
 
-OUI:F8D462*
- ID_OUI_FROM_DATABASE=Pumatronix Equipamentos Eletronicos Ltda.
+OUI:002134*
+ ID_OUI_FROM_DATABASE=Brandywine Communications
 
-OUI:5453ED*
- ID_OUI_FROM_DATABASE=Sony Corporation
+OUI:00212F*
+ ID_OUI_FROM_DATABASE=Phoebe Micro Inc.
 
-OUI:940070*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:002129*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
-OUI:6C3A84*
- ID_OUI_FROM_DATABASE=Shenzhen Aero-Startech. Co.Ltd
+OUI:00212A*
+ ID_OUI_FROM_DATABASE=Audiovox Corporation
 
-OUI:442B03*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:002123*
+ ID_OUI_FROM_DATABASE=Aerosat Avionics
 
-OUI:781C5A*
- ID_OUI_FROM_DATABASE=SHARP Corporation
+OUI:00216D*
+ ID_OUI_FROM_DATABASE=Soltech Co., Ltd.
 
-OUI:E4C6E6*
- ID_OUI_FROM_DATABASE=Mophie, LLC
+OUI:00216C*
+ ID_OUI_FROM_DATABASE=ODVA
 
-OUI:502D1D*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:002167*
+ ID_OUI_FROM_DATABASE=HWA JIN T&I Corp.
 
-OUI:BCEA2B*
- ID_OUI_FROM_DATABASE=CityCom GmbH
+OUI:002160*
+ ID_OUI_FROM_DATABASE=Hidea Solutions Co. Ltd.
 
-OUI:944444*
- ID_OUI_FROM_DATABASE=LG Innotek
+OUI:002154*
+ ID_OUI_FROM_DATABASE=D-TACQ Solutions Ltd
 
-OUI:E4C806*
- ID_OUI_FROM_DATABASE=Ceiec Electric Technology Inc.
+OUI:00214D*
+ ID_OUI_FROM_DATABASE=Guangzhou Skytone Transmission Technology Com. Ltd.
 
-OUI:18B591*
- ID_OUI_FROM_DATABASE=I-Storm
+OUI:002148*
+ ID_OUI_FROM_DATABASE=Kaco Solar Korea
 
-OUI:A45630*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0021C5*
+ ID_OUI_FROM_DATABASE=3DSP Corp
 
-OUI:002AAF*
- ID_OUI_FROM_DATABASE=LARsys-Automation GmbH
+OUI:0021BF*
+ ID_OUI_FROM_DATABASE=Hitachi High-Tech Control Systems Corporation
 
-OUI:60F3DA*
- ID_OUI_FROM_DATABASE=Logic Way GmbH
+OUI:0021C0*
+ ID_OUI_FROM_DATABASE=Mobile Appliance, Inc.
 
-OUI:A06D09*
- ID_OUI_FROM_DATABASE=Intelcan Technosystems Inc.
+OUI:0021B9*
+ ID_OUI_FROM_DATABASE=Universal Devices Inc.
 
-OUI:BC1401*
- ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
+OUI:0021B3*
+ ID_OUI_FROM_DATABASE=Ross Controls
 
-OUI:68D925*
- ID_OUI_FROM_DATABASE=ProSys Development Services
+OUI:0021B2*
+ ID_OUI_FROM_DATABASE=Fiberblaze A/S
 
-OUI:B41DEF*
- ID_OUI_FROM_DATABASE=Internet Laboratories, Inc.
+OUI:0021AD*
+ ID_OUI_FROM_DATABASE=Nordic ID Oy
 
-OUI:284121*
- ID_OUI_FROM_DATABASE=OptiSense Network, LLC
+OUI:0021A6*
+ ID_OUI_FROM_DATABASE=Videotec Spa
 
-OUI:5057A8*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001F11*
+ ID_OUI_FROM_DATABASE=OPENMOKO, INC.
 
-OUI:38458C*
- ID_OUI_FROM_DATABASE=MyCloud Technology corporation
+OUI:001F0B*
+ ID_OUI_FROM_DATABASE=Federal State Unitary Enterprise Industrial UnionElectropribor
 
-OUI:0C9D56*
- ID_OUI_FROM_DATABASE=Consort Controls Ltd
+OUI:001EFF*
+ ID_OUI_FROM_DATABASE=Mueller-Elektronik GmbH & Co. KG
 
-OUI:3CCE73*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001F06*
+ ID_OUI_FROM_DATABASE=Integrated Dispatch Solutions
 
-OUI:A47C14*
- ID_OUI_FROM_DATABASE=ChargeStorm AB
+OUI:001F05*
+ ID_OUI_FROM_DATABASE=iTAS Technology Corp.
 
-OUI:F4600D*
- ID_OUI_FROM_DATABASE=Panoptic Technology, Inc
+OUI:001EF3*
+ ID_OUI_FROM_DATABASE=From2
 
-OUI:ACCF23*
- ID_OUI_FROM_DATABASE=Hi-flying electronics technology Co.,Ltd
+OUI:001EF8*
+ ID_OUI_FROM_DATABASE=Emfinity Inc.
 
-OUI:C08170*
- ID_OUI_FROM_DATABASE=Effigis GeoSolutions
+OUI:001F7A*
+ ID_OUI_FROM_DATABASE=WiWide Inc.
 
-OUI:78C4AB*
- ID_OUI_FROM_DATABASE=Shenzhen Runsil Technology Co.,Ltd
+OUI:001F70*
+ ID_OUI_FROM_DATABASE=Botik Technologies LTD
 
-OUI:709A0B*
- ID_OUI_FROM_DATABASE=Italian Institute of Technology
+OUI:001F75*
+ ID_OUI_FROM_DATABASE=GiBahn Media
 
-OUI:240917*
- ID_OUI_FROM_DATABASE=Devlin Electronics Limited
+OUI:001F64*
+ ID_OUI_FROM_DATABASE=Beijing Autelan Technology Inc.
 
-OUI:DC37D2*
- ID_OUI_FROM_DATABASE=Hunan HKT Electronic Technology Co., Ltd
+OUI:001F5E*
+ ID_OUI_FROM_DATABASE=Dyna Technology Co.,Ltd.
 
-OUI:048B42*
- ID_OUI_FROM_DATABASE=Skspruce Technology Limited
+OUI:001F58*
+ ID_OUI_FROM_DATABASE=EMH Energiemesstechnik GmbH
 
-OUI:5076A6*
- ID_OUI_FROM_DATABASE=Ecil Informatica Ind. Com. Ltda
+OUI:001F4C*
+ ID_OUI_FROM_DATABASE=Roseman Engineering Ltd
 
-OUI:B431B8*
- ID_OUI_FROM_DATABASE=Aviwest
+OUI:001F51*
+ ID_OUI_FROM_DATABASE=HD Communications Corp
 
-OUI:241125*
- ID_OUI_FROM_DATABASE=Hutek Co., Ltd.
+OUI:001F4B*
+ ID_OUI_FROM_DATABASE=Lineage Power
 
-OUI:0036FE*
- ID_OUI_FROM_DATABASE=SuperVision
+OUI:001F9F*
+ ID_OUI_FROM_DATABASE=Thomson Telecom Belgium
 
-OUI:CC187B*
- ID_OUI_FROM_DATABASE=Manzanita Systems, Inc.
+OUI:001F93*
+ ID_OUI_FROM_DATABASE=Xiotech Corporation
 
-OUI:38B12D*
- ID_OUI_FROM_DATABASE=Sonotronic Nagel GmbH
+OUI:001F98*
+ ID_OUI_FROM_DATABASE=DAIICHI-DENTSU LTD.
 
-OUI:8020AF*
- ID_OUI_FROM_DATABASE=Trade FIDES, a.s.
+OUI:001F8C*
+ ID_OUI_FROM_DATABASE=CCS Inc.
 
-OUI:50D274*
- ID_OUI_FROM_DATABASE=Steffes Corporation
+OUI:001F8A*
+ ID_OUI_FROM_DATABASE=Ellion Digital Inc.
 
-OUI:48D54C*
- ID_OUI_FROM_DATABASE=Jeda Networks
+OUI:001F83*
+ ID_OUI_FROM_DATABASE=Teleplan Technology Services Sdn Bhd
 
-OUI:3497FB*
- ID_OUI_FROM_DATABASE=ADVANCED RF TECHNOLOGIES INC
+OUI:001E30*
+ ID_OUI_FROM_DATABASE=Shireen Inc
 
-OUI:C46413*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001E2B*
+ ID_OUI_FROM_DATABASE=Radio Systems Design, Inc.
 
-OUI:143AEA*
- ID_OUI_FROM_DATABASE=Dynapower Company LLC
+OUI:001E24*
+ ID_OUI_FROM_DATABASE=Zhejiang Bell Technology Co.,ltd
 
-OUI:9CA134*
- ID_OUI_FROM_DATABASE=Nike, Inc.
+OUI:001E18*
+ ID_OUI_FROM_DATABASE=Radio Activity srl
 
-OUI:B4D8A9*
- ID_OUI_FROM_DATABASE=BetterBots
+OUI:001E1D*
+ ID_OUI_FROM_DATABASE=East Coast Datacom, Inc.
 
-OUI:7CC8D7*
- ID_OUI_FROM_DATABASE=Damalisk
+OUI:001E1E*
+ ID_OUI_FROM_DATABASE=Honeywell Life Safety
 
-OUI:0091FA*
- ID_OUI_FROM_DATABASE=Synapse Product Development
+OUI:001E13*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:A05AA4*
- ID_OUI_FROM_DATABASE=Grand Products Nevada, Inc.
+OUI:001E0E*
+ ID_OUI_FROM_DATABASE=MAXI VIEW HOLDINGS LIMITED
 
-OUI:24C0B3*
- ID_OUI_FROM_DATABASE=RSF
+OUI:001E60*
+ ID_OUI_FROM_DATABASE=Digital Lighting Systems, Inc
 
-OUI:E00B28*
- ID_OUI_FROM_DATABASE=Inovonics
+OUI:001E59*
+ ID_OUI_FROM_DATABASE=Silicon Turnkey Express, LLC
 
-OUI:500B32*
- ID_OUI_FROM_DATABASE=Foxda Technology Industrial(ShenZhen)Co.,LTD
+OUI:001E54*
+ ID_OUI_FROM_DATABASE=TOYO ELECTRIC Corporation
 
-OUI:302DE8*
- ID_OUI_FROM_DATABASE=JDA, LLC (JDA Systems)
+OUI:001E4D*
+ ID_OUI_FROM_DATABASE=Welkin Sciences, LLC
 
-OUI:70CA9B*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001E48*
+ ID_OUI_FROM_DATABASE=Wi-Links
 
-OUI:2C3F38*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001E43*
+ ID_OUI_FROM_DATABASE=AISIN AW CO.,LTD.
 
-OUI:803F5D*
- ID_OUI_FROM_DATABASE=Winstars Technology Ltd
+OUI:001E3E*
+ ID_OUI_FROM_DATABASE=KMW Inc.
 
-OUI:780738*
- ID_OUI_FROM_DATABASE=Z.U.K. Elzab S.A.
+OUI:001EC3*
+ ID_OUI_FROM_DATABASE=Kozio, Inc.
 
-OUI:640E36*
- ID_OUI_FROM_DATABASE=TAZTAG
+OUI:001EBC*
+ ID_OUI_FROM_DATABASE=WINTECH AUTOMATION CO.,LTD.
 
-OUI:70EE50*
- ID_OUI_FROM_DATABASE=Netatmo
+OUI:001EB7*
+ ID_OUI_FROM_DATABASE=TBTech, Co., Ltd.
 
-OUI:EC63E5*
- ID_OUI_FROM_DATABASE=ePBoard Design LLC
+OUI:001EB0*
+ ID_OUI_FROM_DATABASE=ImesD Electronica S.L.
 
-OUI:60B606*
- ID_OUI_FROM_DATABASE=Phorus
+OUI:001EA5*
+ ID_OUI_FROM_DATABASE=ROBOTOUS, Inc.
 
-OUI:F4E6D7*
- ID_OUI_FROM_DATABASE=Solar Power Technologies, Inc.
+OUI:001EAB*
+ ID_OUI_FROM_DATABASE=TeleWell Oy
 
-OUI:78DDD6*
- ID_OUI_FROM_DATABASE=c-scape
+OUI:001E9E*
+ ID_OUI_FROM_DATABASE=ddm hopt + schuler Gmbh + Co. KG
 
-OUI:984A47*
- ID_OUI_FROM_DATABASE=CHG Hospital Beds
+OUI:001E99*
+ ID_OUI_FROM_DATABASE=Vantanol Industrial Corporation
 
-OUI:3C6A7D*
- ID_OUI_FROM_DATABASE=Niigata Power Systems Co., Ltd.
+OUI:001F36*
+ ID_OUI_FROM_DATABASE=Bellwin Information Co. Ltd.,
 
-OUI:FC455F*
- ID_OUI_FROM_DATABASE=JIANGXI SHANSHUI OPTOELECTRONIC TECHNOLOGY CO.,LTD
+OUI:001F35*
+ ID_OUI_FROM_DATABASE=AIR802 LLC
 
-OUI:3C7059*
- ID_OUI_FROM_DATABASE=MakerBot Industries
+OUI:001F30*
+ ID_OUI_FROM_DATABASE=Travelping
 
-OUI:F8FE5C*
- ID_OUI_FROM_DATABASE=Reciprocal Labs Corp
+OUI:001F23*
+ ID_OUI_FROM_DATABASE=Interacoustics
 
-OUI:6C9CED*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001F24*
+ ID_OUI_FROM_DATABASE=DIGITVIEW TECHNOLOGY CO., LTD.
 
-OUI:94E0D0*
- ID_OUI_FROM_DATABASE=HealthStream Taiwan Inc.
+OUI:001F1D*
+ ID_OUI_FROM_DATABASE=Atlas Material Testing Technology LLC
 
-OUI:DCF858*
- ID_OUI_FROM_DATABASE=Lorent Networks, Inc.
+OUI:001E92*
+ ID_OUI_FROM_DATABASE=JEULIN S.A.
 
-OUI:589396*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:001E89*
+ ID_OUI_FROM_DATABASE=CRFS Limited
 
-OUI:A05E6B*
- ID_OUI_FROM_DATABASE=MELPER Co., Ltd.
+OUI:001E84*
+ ID_OUI_FROM_DATABASE=Pika Technologies Inc.
 
-OUI:30B3A2*
- ID_OUI_FROM_DATABASE=Shenzhen Heguang Measurement & Control Technology Co.,Ltd
+OUI:001E83*
+ ID_OUI_FROM_DATABASE=LAN/MAN Standards Association (LMSC)
 
-OUI:F0007F*
- ID_OUI_FROM_DATABASE=Janz - Contadores de Energia, SA
+OUI:001E6C*
+ ID_OUI_FROM_DATABASE=Opaque Systems
 
-OUI:CC944A*
- ID_OUI_FROM_DATABASE=Pfeiffer Vacuum GmbH
+OUI:001EE6*
+ ID_OUI_FROM_DATABASE=Shenzhen Advanced Video Info-Tech Co., Ltd.
 
-OUI:0C8525*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001EE0*
+ ID_OUI_FROM_DATABASE=Urmet Domus SpA
 
-OUI:BCE59F*
- ID_OUI_FROM_DATABASE=WATERWORLD Technology Co.,LTD
+OUI:001EDB*
+ ID_OUI_FROM_DATABASE=Giken Trastem Co., Ltd.
 
-OUI:1C5C55*
- ID_OUI_FROM_DATABASE=PRIMA Cinema, Inc
+OUI:001ED6*
+ ID_OUI_FROM_DATABASE=Alentec & Orion AB
 
-OUI:082522*
- ID_OUI_FROM_DATABASE=ADVANSEE
+OUI:001ECF*
+ ID_OUI_FROM_DATABASE=PHILIPS ELECTRONICS UK LTD
 
-OUI:4C2F9D*
- ID_OUI_FROM_DATABASE=ICM Controls
+OUI:001C96*
+ ID_OUI_FROM_DATABASE=Linkwise Technology Pte Ltd
 
-OUI:E467BA*
- ID_OUI_FROM_DATABASE=Danish Interpretation Systems A/S
+OUI:001C91*
+ ID_OUI_FROM_DATABASE=Gefen Inc.
 
-OUI:BCFE8C*
- ID_OUI_FROM_DATABASE=Altronic, LLC
+OUI:001C8A*
+ ID_OUI_FROM_DATABASE=Cirrascale Corporation
 
-OUI:24BBC1*
- ID_OUI_FROM_DATABASE=Absolute Analysis
+OUI:001C84*
+ ID_OUI_FROM_DATABASE=STL Solution Co.,Ltd.
 
-OUI:7CDD11*
- ID_OUI_FROM_DATABASE=Chongqing MAS SCI&TECH.Co.,Ltd
+OUI:001C80*
+ ID_OUI_FROM_DATABASE=New Business Division/Rhea-Information CO., LTD.
 
-OUI:C43C3C*
- ID_OUI_FROM_DATABASE=CYBELEC SA
+OUI:001C76*
+ ID_OUI_FROM_DATABASE=The Wandsworth Group Ltd
 
-OUI:00D632*
- ID_OUI_FROM_DATABASE=GE Energy
+OUI:001C6F*
+ ID_OUI_FROM_DATABASE=Emfit Ltd
 
-OUI:C40ACB*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001C71*
+ ID_OUI_FROM_DATABASE=Emergent Electronics
 
-OUI:7463DF*
- ID_OUI_FROM_DATABASE=VTS GmbH
+OUI:001C70*
+ ID_OUI_FROM_DATABASE=NOVACOMM LTDA
 
-OUI:3828EA*
- ID_OUI_FROM_DATABASE=Fujian Netcom Technology Co., LTD
+OUI:001C6A*
+ ID_OUI_FROM_DATABASE=Weiss Engineering Ltd.
+
+OUI:001D59*
+ ID_OUI_FROM_DATABASE=Mitra Energy & Infrastructure
 
-OUI:2CEE26*
- ID_OUI_FROM_DATABASE=Petroleum Geo-Services
+OUI:001D52*
+ ID_OUI_FROM_DATABASE=Defzone B.V.
 
-OUI:DC3E51*
- ID_OUI_FROM_DATABASE=Solberg & Andersen AS
+OUI:001D4C*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent
 
-OUI:D8B90E*
- ID_OUI_FROM_DATABASE=Triple Domain Vision Co.,Ltd.
+OUI:001D48*
+ ID_OUI_FROM_DATABASE=Sensor-Technik Wiedemann GmbH
 
-OUI:7C4B78*
- ID_OUI_FROM_DATABASE=Red Sun Synthesis Pte Ltd
+OUI:001D41*
+ ID_OUI_FROM_DATABASE=Hardy Instruments
 
-OUI:28D1AF*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:001D3C*
+ ID_OUI_FROM_DATABASE=Muscle Corporation
 
-OUI:68BC0C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001D30*
+ ID_OUI_FROM_DATABASE=YX Wireless S.A.
 
-OUI:2C9EFC*
- ID_OUI_FROM_DATABASE=CANON INC.
+OUI:001D35*
+ ID_OUI_FROM_DATABASE=Viconics Electronics Inc.
 
-OUI:98C845*
- ID_OUI_FROM_DATABASE=PacketAccess
+OUI:001D2F*
+ ID_OUI_FROM_DATABASE=QuantumVision Corporation
 
-OUI:988217*
- ID_OUI_FROM_DATABASE=Disruptive Ltd
+OUI:001CD3*
+ ID_OUI_FROM_DATABASE=ZP Engineering SEL
 
-OUI:80FFA8*
- ID_OUI_FROM_DATABASE=UNIDIS
+OUI:001CCE*
+ ID_OUI_FROM_DATABASE=By Techdesign
 
-OUI:489BE2*
- ID_OUI_FROM_DATABASE=SCI Innovations Ltd
+OUI:001CC7*
+ ID_OUI_FROM_DATABASE=Rembrandt Technologies, LLC d/b/a REMSTREAM
 
-OUI:B0E50E*
- ID_OUI_FROM_DATABASE=NRG SYSTEMS INC
+OUI:001CC2*
+ ID_OUI_FROM_DATABASE=Part II Research, Inc.
 
-OUI:4C5FD2*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent
+OUI:001CBB*
+ ID_OUI_FROM_DATABASE=MusicianLink
 
-OUI:E878A1*
- ID_OUI_FROM_DATABASE=BEOVIEW INTERCOM DOO
+OUI:001CB1*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:3057AC*
- ID_OUI_FROM_DATABASE=IRLAB LTD.
+OUI:001CB7*
+ ID_OUI_FROM_DATABASE=USC DigiArk Corporation
 
-OUI:9002A9*
- ID_OUI_FROM_DATABASE=ZHEJIANG DAHUA TECHNOLOGY CO.,LTD
+OUI:001CA3*
+ ID_OUI_FROM_DATABASE=Terra
 
-OUI:28AF0A*
- ID_OUI_FROM_DATABASE=Sirius XM Radio Inc
+OUI:001CA5*
+ ID_OUI_FROM_DATABASE=Zygo Corporation
 
-OUI:2486F4*
- ID_OUI_FROM_DATABASE=Ctek, Inc.
+OUI:001CAA*
+ ID_OUI_FROM_DATABASE=Bellon Pty Ltd
 
-OUI:3CE5B4*
- ID_OUI_FROM_DATABASE=KIDASEN INDUSTRIA E COMERCIO DE ANTENAS LTDA
+OUI:001C9D*
+ ID_OUI_FROM_DATABASE=Liecthi AG
 
-OUI:A85BF3*
- ID_OUI_FROM_DATABASE=Audivo GmbH
+OUI:001DCA*
+ ID_OUI_FROM_DATABASE=PAV Electronics Limited
 
-OUI:344F69*
- ID_OUI_FROM_DATABASE=EKINOPS SAS
+OUI:001DC4*
+ ID_OUI_FROM_DATABASE=AIOI Systems Co., Ltd.
 
-OUI:C02973*
- ID_OUI_FROM_DATABASE=Audyssey Laboratories Inc.
+OUI:001DC3*
+ ID_OUI_FROM_DATABASE=RIKOR TV, Ltd
 
-OUI:30168D*
- ID_OUI_FROM_DATABASE=ProLon
+OUI:001DB1*
+ ID_OUI_FROM_DATABASE=Crescendo Networks
 
-OUI:B451F9*
- ID_OUI_FROM_DATABASE=NB Software
+OUI:001DB2*
+ ID_OUI_FROM_DATABASE=HOKKAIDO ELECTRIC ENGINEERING CO.,LTD.
 
-OUI:30688C*
- ID_OUI_FROM_DATABASE=Reach Technology Inc.
+OUI:001DB7*
+ ID_OUI_FROM_DATABASE=Tendril Networks, Inc.
 
-OUI:88F488*
- ID_OUI_FROM_DATABASE=cellon communications technology(shenzhen)Co.,Ltd.
+OUI:001DAD*
+ ID_OUI_FROM_DATABASE=Sinotech Engineering Consultants, Inc.  Geotechnical Enginee
 
-OUI:0041B4*
- ID_OUI_FROM_DATABASE=Wuxi Zhongxing Optoelectronics Technology Co.,Ltd.
+OUI:001DA8*
+ ID_OUI_FROM_DATABASE=Takahata Electronics Co.,Ltd
 
-OUI:D453AF*
- ID_OUI_FROM_DATABASE=VIGO System S.A.
+OUI:001DA7*
+ ID_OUI_FROM_DATABASE=Seamless Internet
 
-OUI:1CE192*
- ID_OUI_FROM_DATABASE=Qisda Corporation
+OUI:001DA1*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:20C8B3*
- ID_OUI_FROM_DATABASE=SHENZHEN BUL-TECH CO.,LTD.
+OUI:001D9A*
+ ID_OUI_FROM_DATABASE=GODEX INTERNATIONAL CO., LTD
 
-OUI:58B0D4*
- ID_OUI_FROM_DATABASE=ZuniData Systems Inc.
+OUI:001D95*
+ ID_OUI_FROM_DATABASE=Flash, Inc.
 
-OUI:64557F*
- ID_OUI_FROM_DATABASE=NSFOCUS Information Technology Co., Ltd.
+OUI:001D8E*
+ ID_OUI_FROM_DATABASE=Alereon, Inc.
 
-OUI:406AAB*
- ID_OUI_FROM_DATABASE=RIM
+OUI:001D87*
+ ID_OUI_FROM_DATABASE=VigTech Labs Sdn Bhd
 
-OUI:248707*
- ID_OUI_FROM_DATABASE=SEnergy Corporation
+OUI:001D88*
+ ID_OUI_FROM_DATABASE=Clearwire
 
-OUI:EC3F05*
- ID_OUI_FROM_DATABASE=Institute 706, The Second Academy China Aerospace Science & Industry Corp
+OUI:001D7E*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
-OUI:C4C19F*
- ID_OUI_FROM_DATABASE=National Oilwell Varco Instrumentation, Monitoring, and Optimization (NOV IMO)
+OUI:001D7D*
+ ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
 
-OUI:68CD0F*
- ID_OUI_FROM_DATABASE=U Tek Company Limited
+OUI:001D6C*
+ ID_OUI_FROM_DATABASE=ClariPhy Communications, Inc.
 
-OUI:D4CEB8*
- ID_OUI_FROM_DATABASE=Enatel LTD
+OUI:001D71*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:ECF236*
- ID_OUI_FROM_DATABASE=NEOMONTANA ELECTRONICS
+OUI:001D78*
+ ID_OUI_FROM_DATABASE=Invengo Information Technology Co.,Ltd
 
-OUI:E4A5EF*
- ID_OUI_FROM_DATABASE=TRON LINK ELECTRONICS CO., LTD.
+OUI:001D65*
+ ID_OUI_FROM_DATABASE=Microwave Radio Communications
 
-OUI:AC4AFE*
- ID_OUI_FROM_DATABASE=Hisense Broadband Multimedia Technology Co.,Ltd.
+OUI:001D5E*
+ ID_OUI_FROM_DATABASE=COMING MEDIA CORP.
 
-OUI:2C1EEA*
- ID_OUI_FROM_DATABASE=AERODEV
+OUI:001D29*
+ ID_OUI_FROM_DATABASE=Doro AB
 
-OUI:FC6C31*
- ID_OUI_FROM_DATABASE=LXinstruments GmbH
+OUI:001D22*
+ ID_OUI_FROM_DATABASE=Foss Analytical A/S
 
-OUI:3C6F45*
- ID_OUI_FROM_DATABASE=Fiberpro Inc.
+OUI:001D1D*
+ ID_OUI_FROM_DATABASE=Inter-M Corporation
 
-OUI:B4FC75*
- ID_OUI_FROM_DATABASE=SEMA Electronics(HK) CO.,LTD
+OUI:001D16*
+ ID_OUI_FROM_DATABASE=SFR
 
-OUI:5C16C7*
- ID_OUI_FROM_DATABASE=Big Switch Networks
+OUI:001D10*
+ ID_OUI_FROM_DATABASE=LightHaus Logic, Inc.
 
-OUI:B0BF99*
- ID_OUI_FROM_DATABASE=WIZITDONGDO
+OUI:001D0A*
+ ID_OUI_FROM_DATABASE=Davis Instruments, Inc.
 
-OUI:147DB3*
- ID_OUI_FROM_DATABASE=JOA TELECOM.CO.,LTD
+OUI:001D03*
+ ID_OUI_FROM_DATABASE=Design Solutions Inc.
 
-OUI:3CD16E*
- ID_OUI_FROM_DATABASE=Telepower Communication Co., Ltd
+OUI:001CFE*
+ ID_OUI_FROM_DATABASE=Quartics Inc
 
-OUI:00077D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001CF7*
+ ID_OUI_FROM_DATABASE=AudioScience
 
-OUI:1045BE*
- ID_OUI_FROM_DATABASE=Norphonic AS
+OUI:001CE6*
+ ID_OUI_FROM_DATABASE=INNES
 
-OUI:A0E295*
- ID_OUI_FROM_DATABASE=DAT System Co.,Ltd
+OUI:001CE1*
+ ID_OUI_FROM_DATABASE=INDRA SISTEMAS, S.A.
 
-OUI:40F14C*
- ID_OUI_FROM_DATABASE=ISE Europe SPRL
+OUI:001CDA*
+ ID_OUI_FROM_DATABASE=Exegin Technologies Limited
 
-OUI:98293F*
- ID_OUI_FROM_DATABASE=Fujian Start Computer Equipment Co.,Ltd
+OUI:001E07*
+ ID_OUI_FROM_DATABASE=Winy Technology Co., Ltd.
 
-OUI:70D4F2*
- ID_OUI_FROM_DATABASE=RIM
+OUI:001E02*
+ ID_OUI_FROM_DATABASE=Sougou Keikaku Kougyou Co.,Ltd.
 
-OUI:9067F3*
- ID_OUI_FROM_DATABASE=Alcatel Lucent
+OUI:001E01*
+ ID_OUI_FROM_DATABASE=Renesas Technology Sales Co., Ltd.
 
-OUI:64D912*
- ID_OUI_FROM_DATABASE=Solidica, Inc.
+OUI:001DFB*
+ ID_OUI_FROM_DATABASE=NETCLEUS Systems Corporation
 
-OUI:8C5CA1*
- ID_OUI_FROM_DATABASE=d-broad,INC
+OUI:001DF4*
+ ID_OUI_FROM_DATABASE=Magellan Technology Pty Limited
 
-OUI:C8F981*
- ID_OUI_FROM_DATABASE=Seneca s.r.l.
+OUI:001DEF*
+ ID_OUI_FROM_DATABASE=TRIMM, INC.
 
-OUI:703187*
- ID_OUI_FROM_DATABASE=ACX GmbH
+OUI:001DE8*
+ ID_OUI_FROM_DATABASE=Nikko Denki Tsushin Corporation(NDTC)
 
-OUI:14307A*
- ID_OUI_FROM_DATABASE=Avermetrics
+OUI:001DE3*
+ ID_OUI_FROM_DATABASE=Intuicom
 
-OUI:8C7EB3*
- ID_OUI_FROM_DATABASE=Lytro, Inc.
+OUI:001DDD*
+ ID_OUI_FROM_DATABASE=DAT H.K. LIMITED
 
-OUI:587675*
- ID_OUI_FROM_DATABASE=Beijing ECHO Technologies Co.,Ltd
+OUI:001AF8*
+ ID_OUI_FROM_DATABASE=Copley Controls Corporation
 
-OUI:78EF4C*
- ID_OUI_FROM_DATABASE=Unetconvergence Co., Ltd.
+OUI:001AF3*
+ ID_OUI_FROM_DATABASE=Samyoung Electronics
 
-OUI:E8DA96*
- ID_OUI_FROM_DATABASE=Zhuhai Tianrui Electrical Power Tech. Co., Ltd.
+OUI:001AEE*
+ ID_OUI_FROM_DATABASE=Shenztech Ltd
 
-OUI:6CA780*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:001AE2*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:04888C*
- ID_OUI_FROM_DATABASE=Eifelwerk Butler Systeme GmbH
+OUI:001AE7*
+ ID_OUI_FROM_DATABASE=Aztek Networks, Inc.
 
-OUI:1013EE*
- ID_OUI_FROM_DATABASE=Justec International Technology INC.
+OUI:001AD4*
+ ID_OUI_FROM_DATABASE=iPOX Technology Co., Ltd.
 
-OUI:704642*
- ID_OUI_FROM_DATABASE=CHYNG HONG ELECTRONIC CO., LTD.
+OUI:001AD6*
+ ID_OUI_FROM_DATABASE=JIAGNSU AETNA ELECTRIC CO.,LTD
 
-OUI:78BEB6*
- ID_OUI_FROM_DATABASE=Enhanced Vision
+OUI:001B97*
+ ID_OUI_FROM_DATABASE=Violin Technologies
 
-OUI:ECEA03*
- ID_OUI_FROM_DATABASE=DARFON LIGHTING CORP
+OUI:001B9C*
+ ID_OUI_FROM_DATABASE=SATEL sp. z o.o.
 
-OUI:C8903E*
- ID_OUI_FROM_DATABASE=Pakton Technologies
+OUI:001B90*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:7465D1*
- ID_OUI_FROM_DATABASE=Atlinks
+OUI:001B86*
+ ID_OUI_FROM_DATABASE=Bosch Access Systems GmbH
 
-OUI:301A28*
- ID_OUI_FROM_DATABASE=Mako Networks Ltd
+OUI:001B8B*
+ ID_OUI_FROM_DATABASE=NEC Platforms, Ltd.
 
-OUI:D4945A*
- ID_OUI_FROM_DATABASE=COSMO CO., LTD
+OUI:001B7F*
+ ID_OUI_FROM_DATABASE=TMN Technologies Telecomunicacoes Ltda
 
-OUI:5CF207*
- ID_OUI_FROM_DATABASE=Speco Technologies
+OUI:001B81*
+ ID_OUI_FROM_DATABASE=DATAQ Instruments, Inc.
 
-OUI:B01B7C*
- ID_OUI_FROM_DATABASE=Ontrol A.S.
+OUI:001B80*
+ ID_OUI_FROM_DATABASE=LORD Corporation
 
-OUI:D47B75*
- ID_OUI_FROM_DATABASE=HARTING Electronics GmbH
+OUI:001B73*
+ ID_OUI_FROM_DATABASE=DTL Broadcast Ltd
 
-OUI:70E843*
- ID_OUI_FROM_DATABASE=Beijing C&W Optical Communication Technology Co.,Ltd.
+OUI:001B6E*
+ ID_OUI_FROM_DATABASE=Anue Systems, Inc.
 
-OUI:08ACA5*
- ID_OUI_FROM_DATABASE=Benu Video, Inc.
+OUI:001B67*
+ ID_OUI_FROM_DATABASE=Cisco Systems Inc
 
-OUI:D89DB9*
- ID_OUI_FROM_DATABASE=eMegatech International Corp.
+OUI:001B60*
+ ID_OUI_FROM_DATABASE=NAVIGON AG
 
-OUI:405A9B*
- ID_OUI_FROM_DATABASE=ANOVO
+OUI:001B54*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:ACCA54*
- ID_OUI_FROM_DATABASE=Telldus Technologies AB
+OUI:001B48*
+ ID_OUI_FROM_DATABASE=Shenzhen Lantech Electronics Co., Ltd.
 
-OUI:CC1EFF*
- ID_OUI_FROM_DATABASE=Metrological Group BV
+OUI:001B4D*
+ ID_OUI_FROM_DATABASE=Areca Technology Corporation
 
-OUI:941673*
- ID_OUI_FROM_DATABASE=Point Core SARL
+OUI:001B41*
+ ID_OUI_FROM_DATABASE=General Infinity Co.,Ltd.
 
-OUI:6C5D63*
- ID_OUI_FROM_DATABASE=ShenZhen Rapoo Technology Co., Ltd.
+OUI:001B3C*
+ ID_OUI_FROM_DATABASE=Software Technologies Group,Inc.
 
-OUI:E4D71D*
- ID_OUI_FROM_DATABASE=Oraya Therapeutics
+OUI:001B35*
+ ID_OUI_FROM_DATABASE=ChongQing JINOU Science & Technology Development CO.,Ltd
 
-OUI:C8FE30*
- ID_OUI_FROM_DATABASE=Bejing DAYO Mobile Communication Technology Ltd.
+OUI:001B2E*
+ ID_OUI_FROM_DATABASE=Sinkyo Electron Inc
 
-OUI:64B64A*
- ID_OUI_FROM_DATABASE=ViVOtech, Inc.
+OUI:001B30*
+ ID_OUI_FROM_DATABASE=Solitech Inc.
 
-OUI:DCA7D9*
- ID_OUI_FROM_DATABASE=Compressor Controls Corp
+OUI:001BC7*
+ ID_OUI_FROM_DATABASE=StarVedia Technology Inc.
 
-OUI:C455A6*
- ID_OUI_FROM_DATABASE=Cadac Holdings Ltd
+OUI:001BC6*
+ ID_OUI_FROM_DATABASE=Strato Rechenzentrum AG
 
-OUI:BCBBC9*
- ID_OUI_FROM_DATABASE=Kellendonk Elektronik GmbH
+OUI:001BBB*
+ ID_OUI_FROM_DATABASE=RFTech Co.,Ltd
 
-OUI:781DFD*
- ID_OUI_FROM_DATABASE=Jabil Inc
+OUI:001BB6*
+ ID_OUI_FROM_DATABASE=Bird Electronic Corp.
 
-OUI:103711*
- ID_OUI_FROM_DATABASE=Simlink AS
+OUI:001BAA*
+ ID_OUI_FROM_DATABASE=XenICs nv
 
-OUI:601199*
- ID_OUI_FROM_DATABASE=Siama Systems Inc
+OUI:001BA3*
+ ID_OUI_FROM_DATABASE=Flexit Group GmbH
 
-OUI:300B9C*
- ID_OUI_FROM_DATABASE=Delta Mobile Systems, Inc.
+OUI:001C63*
+ ID_OUI_FROM_DATABASE=TRUEN
 
-OUI:90EA60*
- ID_OUI_FROM_DATABASE=SPI Lasers Ltd
+OUI:001C57*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:D46F42*
- ID_OUI_FROM_DATABASE=WAXESS USA Inc
+OUI:001C5E*
+ ID_OUI_FROM_DATABASE=ASTON France
 
-OUI:B0A72A*
- ID_OUI_FROM_DATABASE=Ensemble Designs, Inc.
+OUI:001C46*
+ ID_OUI_FROM_DATABASE=QTUM
 
-OUI:50795B*
- ID_OUI_FROM_DATABASE=Interexport Telecomunicaciones S.A.
+OUI:001C3A*
+ ID_OUI_FROM_DATABASE=Element Labs, Inc.
 
-OUI:E8C229*
- ID_OUI_FROM_DATABASE=H-Displays (MSC) Bhd
+OUI:001C41*
+ ID_OUI_FROM_DATABASE=scemtec Transponder Technology GmbH
 
-OUI:B0BDA1*
- ID_OUI_FROM_DATABASE=ZAKLAD ELEKTRONICZNY SIMS
+OUI:001C34*
+ ID_OUI_FROM_DATABASE=HUEY CHIAO INTERNATIONAL CO., LTD.
 
-OUI:8C4435*
- ID_OUI_FROM_DATABASE=Shanghai BroadMobi Communication Technology Co., Ltd.
+OUI:001C33*
+ ID_OUI_FROM_DATABASE=Sutron
 
-OUI:24B8D2*
- ID_OUI_FROM_DATABASE=Opzoon Technology Co.,Ltd.
+OUI:001BF7*
+ ID_OUI_FROM_DATABASE=Lund IP Products AB
 
-OUI:24CBE7*
- ID_OUI_FROM_DATABASE=MYK, Inc.
+OUI:001BF9*
+ ID_OUI_FROM_DATABASE=Intellitect Water Ltd
 
-OUI:88BFD5*
- ID_OUI_FROM_DATABASE=Simple Audio Ltd
+OUI:001BF8*
+ ID_OUI_FROM_DATABASE=Digitrax Inc.
 
-OUI:948B03*
- ID_OUI_FROM_DATABASE=EAGET Innovation and Technology Co., Ltd.
+OUI:001BF2*
+ ID_OUI_FROM_DATABASE=KWORLD COMPUTER CO., LTD
 
-OUI:802DE1*
- ID_OUI_FROM_DATABASE=Solarbridge Technologies
+OUI:001BEB*
+ ID_OUI_FROM_DATABASE=DMP Electronics INC.
 
-OUI:F081AF*
- ID_OUI_FROM_DATABASE=IRZ AUTOMATION TECHNOLOGIES LTD
+OUI:001BE6*
+ ID_OUI_FROM_DATABASE=VR AG
 
-OUI:14EB33*
- ID_OUI_FROM_DATABASE=BSMediasoft Co., Ltd.
+OUI:001BDF*
+ ID_OUI_FROM_DATABASE=Iskra Sistemi d.d.
 
-OUI:AC8674*
- ID_OUI_FROM_DATABASE=Open Mesh, Inc.
+OUI:001BD8*
+ ID_OUI_FROM_DATABASE=DVTel LTD
 
-OUI:14A9E3*
- ID_OUI_FROM_DATABASE=MST CORPORATION
+OUI:001BCC*
+ ID_OUI_FROM_DATABASE=KINGTEK CCTV ALLIANCE CO., LTD.
 
-OUI:589835*
- ID_OUI_FROM_DATABASE=Technicolor
+OUI:001AC8*
+ ID_OUI_FROM_DATABASE=ISL (Instrumentation Scientifique de Laboratoire)
 
-OUI:50D6D7*
- ID_OUI_FROM_DATABASE=Takahata Precision
+OUI:001ACF*
+ ID_OUI_FROM_DATABASE=C.T. ELETTRONICA
 
-OUI:B4A5A9*
- ID_OUI_FROM_DATABASE=MODI GmbH
+OUI:001AC3*
+ ID_OUI_FROM_DATABASE=Scientific-Atlanta, Inc
 
-OUI:D09B05*
- ID_OUI_FROM_DATABASE=Emtronix
+OUI:001AB9*
+ ID_OUI_FROM_DATABASE=PMC
 
-OUI:98EC65*
- ID_OUI_FROM_DATABASE=Cosesy ApS
+OUI:001ABE*
+ ID_OUI_FROM_DATABASE=COMPUTER HI-TECH INC.
 
-OUI:900917*
- ID_OUI_FROM_DATABASE=Far-sighted mobile
+OUI:001AAB*
+ ID_OUI_FROM_DATABASE=eWings s.r.l.
 
-OUI:88F077*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001AB2*
+ ID_OUI_FROM_DATABASE=Cyber Solutions Inc.
 
-OUI:AC4723*
- ID_OUI_FROM_DATABASE=Genelec
+OUI:001AB7*
+ ID_OUI_FROM_DATABASE=Ethos Networks LTD.
 
-OUI:20B7C0*
- ID_OUI_FROM_DATABASE=OMICRON electronics GmbH
+OUI:001C2E*
+ ID_OUI_FROM_DATABASE=HPN Supply Chain
 
-OUI:D42C3D*
- ID_OUI_FROM_DATABASE=Sky Light Digital Limited
+OUI:001C27*
+ ID_OUI_FROM_DATABASE=Sunell Electronics Co.
 
-OUI:806CBC*
- ID_OUI_FROM_DATABASE=NET New Electronic Technology GmbH
+OUI:001C22*
+ ID_OUI_FROM_DATABASE=Aeris Elettronica s.r.l.
 
-OUI:1C184A*
- ID_OUI_FROM_DATABASE=ShenZhen RicherLink Technologies Co.,LTD
+OUI:001C1D*
+ ID_OUI_FROM_DATABASE=CHENZHOU GOSPELL DIGITAL TECHNOLOGY CO.,LTD
 
-OUI:04E662*
- ID_OUI_FROM_DATABASE=Acroname Inc.
+OUI:001C18*
+ ID_OUI_FROM_DATABASE=Sicert S.r.L.
 
-OUI:F0BF97*
- ID_OUI_FROM_DATABASE=Sony Corporation
+OUI:001C0A*
+ ID_OUI_FROM_DATABASE=Shenzhen AEE Technology Co.,Ltd.
 
-OUI:C44AD0*
- ID_OUI_FROM_DATABASE=FIREFLIES SYSTEMS
+OUI:001C05*
+ ID_OUI_FROM_DATABASE=Nonin Medical Inc.
 
-OUI:88E0A0*
- ID_OUI_FROM_DATABASE=Shenzhen VisionSTOR Technologies Co., Ltd
+OUI:001BFE*
+ ID_OUI_FROM_DATABASE=Zavio Inc.
+
+OUI:001B29*
+ ID_OUI_FROM_DATABASE=Avantis.Co.,Ltd
 
-OUI:6879ED*
- ID_OUI_FROM_DATABASE=SHARP Corporation
+OUI:001B23*
+ ID_OUI_FROM_DATABASE=SimpleComTools
 
-OUI:9CC0D2*
- ID_OUI_FROM_DATABASE=Conductix-Wampfler GmbH
+OUI:001B1E*
+ ID_OUI_FROM_DATABASE=HART Communication Foundation
 
-OUI:408BF6*
- ID_OUI_FROM_DATABASE=Shenzhen TCL New Technology Co; Ltd.
+OUI:001B12*
+ ID_OUI_FROM_DATABASE=Apprion
 
-OUI:447E95*
- ID_OUI_FROM_DATABASE=Alpha and Omega, Inc
+OUI:001B0B*
+ ID_OUI_FROM_DATABASE=Phidgets Inc.
 
-OUI:E8B748*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001B10*
+ ID_OUI_FROM_DATABASE=ShenZhen Kang Hui Technology Co.,ltd
 
-OUI:DC16A2*
- ID_OUI_FROM_DATABASE=Medtronic Diabetes
+OUI:001B04*
+ ID_OUI_FROM_DATABASE=Affinity International S.p.a
 
-OUI:78CA04*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:001AFF*
+ ID_OUI_FROM_DATABASE=Wizyoung Tech.
 
-OUI:2C8BF2*
- ID_OUI_FROM_DATABASE=Hitachi Metals America Ltd
+OUI:001AFD*
+ ID_OUI_FROM_DATABASE=EVOLIS
 
-OUI:58F98E*
- ID_OUI_FROM_DATABASE=SECUDOS GmbH
+OUI:00191C*
+ ID_OUI_FROM_DATABASE=Sensicast Systems
 
-OUI:2826A6*
- ID_OUI_FROM_DATABASE=PBR electronics GmbH
+OUI:00191E*
+ ID_OUI_FROM_DATABASE=Beyondwiz Co., Ltd.
 
-OUI:CC7669*
- ID_OUI_FROM_DATABASE=SEETECH
+OUI:001923*
+ ID_OUI_FROM_DATABASE=Phonex Korea Co., LTD.
 
-OUI:E437D7*
- ID_OUI_FROM_DATABASE=HENRI DEPAEPE S.A.S.
+OUI:00192A*
+ ID_OUI_FROM_DATABASE=Antiope Associates
 
-OUI:582F42*
- ID_OUI_FROM_DATABASE=Universal Electric Corporation
+OUI:001910*
+ ID_OUI_FROM_DATABASE=Knick Elektronische Messgeraete GmbH & Co. KG
 
-OUI:AC20AA*
- ID_OUI_FROM_DATABASE=DMATEK Co., Ltd.
+OUI:001917*
+ ID_OUI_FROM_DATABASE=Posiflex Inc.
 
-OUI:E0A1D7*
- ID_OUI_FROM_DATABASE=SFR
+OUI:001909*
+ ID_OUI_FROM_DATABASE=DEVI - Danfoss A/S
 
-OUI:28852D*
- ID_OUI_FROM_DATABASE=Touch Networks
+OUI:00190B*
+ ID_OUI_FROM_DATABASE=Southern Vision Systems, Inc.
 
-OUI:F02A61*
- ID_OUI_FROM_DATABASE=Waldo Networks, Inc.
+OUI:001904*
+ ID_OUI_FROM_DATABASE=WB Electronics Sp. z o.o.
 
-OUI:B8415F*
- ID_OUI_FROM_DATABASE=ASP AG
+OUI:0018FF*
+ ID_OUI_FROM_DATABASE=PowerQuattro Co.
 
-OUI:2CB69D*
- ID_OUI_FROM_DATABASE=RED Digital Cinema
+OUI:0018FA*
+ ID_OUI_FROM_DATABASE=Yushin Precision Equipment Co.,Ltd.
 
-OUI:988E34*
- ID_OUI_FROM_DATABASE=ZHEJIANG BOXSAM ELECTRONIC CO.,LTD
+OUI:001955*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:D44C24*
- ID_OUI_FROM_DATABASE=Vuppalamritha Magnetic Components LTD
+OUI:00194E*
+ ID_OUI_FROM_DATABASE=Ultra Electronics - TCS (Tactical Communication Systems)
 
-OUI:4CB4EA*
- ID_OUI_FROM_DATABASE=HRD (S) PTE., LTD.
+OUI:001950*
+ ID_OUI_FROM_DATABASE=Harman Multimedia
 
-OUI:34BDF9*
- ID_OUI_FROM_DATABASE=Shanghai WDK Industrial Co.,Ltd.
+OUI:001949*
+ ID_OUI_FROM_DATABASE=TENTEL  COMTECH CO., LTD.
 
-OUI:74CE56*
- ID_OUI_FROM_DATABASE=Packet Force Technology Limited Company
+OUI:001942*
+ ID_OUI_FROM_DATABASE=ON SOFTWARE INTERNATIONAL LIMITED
 
-OUI:A89B10*
- ID_OUI_FROM_DATABASE=inMotion Ltd.
+OUI:00193D*
+ ID_OUI_FROM_DATABASE=GMC Guardian Mobility Corp.
 
-OUI:888C19*
- ID_OUI_FROM_DATABASE=Brady Corp Asia Pacific Ltd
+OUI:001936*
+ ID_OUI_FROM_DATABASE=STERLITE OPTICAL TECHNOLOGIES LIMITED
 
-OUI:747DB6*
- ID_OUI_FROM_DATABASE=Aliwei Communications, Inc
+OUI:00193B*
+ ID_OUI_FROM_DATABASE=Wilibox Deliberant Group LLC
 
-OUI:B41489*
+OUI:00192F*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:AC6F4F*
- ID_OUI_FROM_DATABASE=Enspert Inc
+OUI:001A20*
+ ID_OUI_FROM_DATABASE=CMOTECH Co. Ltd.
 
-OUI:8886A0*
- ID_OUI_FROM_DATABASE=Simton Technologies, Ltd.
+OUI:001A22*
+ ID_OUI_FROM_DATABASE=eQ-3 Entwicklung GmbH
 
-OUI:F0C88C*
- ID_OUI_FROM_DATABASE=LeddarTech Inc.
+OUI:001A14*
+ ID_OUI_FROM_DATABASE=Xin Hua Control Engineering Co.,Ltd.
 
-OUI:68EBC5*
- ID_OUI_FROM_DATABASE=Angstrem Telecom
+OUI:001A0D*
+ ID_OUI_FROM_DATABASE=HandHeld entertainment, Inc.
 
-OUI:448C52*
- ID_OUI_FROM_DATABASE=KTIS CO., Ltd
+OUI:001A0F*
+ ID_OUI_FROM_DATABASE=Sistemas Avanzados de Control, S.A.
 
-OUI:686359*
- ID_OUI_FROM_DATABASE=Advanced Digital Broadcast SA
+OUI:001A08*
+ ID_OUI_FROM_DATABASE=Simoco Ltd.
 
-OUI:4018D7*
- ID_OUI_FROM_DATABASE=Smartronix, Inc.
+OUI:001A01*
+ ID_OUI_FROM_DATABASE=Smiths Medical
 
-OUI:18922C*
- ID_OUI_FROM_DATABASE=Virtual Instruments
+OUI:0019FC*
+ ID_OUI_FROM_DATABASE=PT. Ufoakses Sukses Luarbiasa
 
-OUI:F80F84*
- ID_OUI_FROM_DATABASE=Natural Security SAS
+OUI:0019EF*
+ ID_OUI_FROM_DATABASE=SHENZHEN LINNKING ELECTRONICS CO.,LTD
 
-OUI:EC9ECD*
- ID_OUI_FROM_DATABASE=Artesyn Embedded Technologies
+OUI:0019F1*
+ ID_OUI_FROM_DATABASE=Star Communication Network Technology Co.,Ltd
 
-OUI:303955*
- ID_OUI_FROM_DATABASE=Shenzhen Jinhengjia Electronic Co., Ltd.
+OUI:0019F6*
+ ID_OUI_FROM_DATABASE=Acconet (PTE) Ltd
 
-OUI:FC5B24*
- ID_OUI_FROM_DATABASE=Weibel Scientific A/S
+OUI:001A76*
+ ID_OUI_FROM_DATABASE=SDT information Technology Co.,LTD.
 
-OUI:34B571*
- ID_OUI_FROM_DATABASE=PLDS
+OUI:001A6F*
+ ID_OUI_FROM_DATABASE=MI.TEL s.r.l.
 
-OUI:A862A2*
- ID_OUI_FROM_DATABASE=JIWUMEDIA CO., LTD.
+OUI:001A6A*
+ ID_OUI_FROM_DATABASE=Tranzas, Inc.
 
-OUI:984E97*
- ID_OUI_FROM_DATABASE=Starlight Marketing (H. K.) Ltd.
+OUI:001A63*
+ ID_OUI_FROM_DATABASE=Elster Solutions, LLC,
 
-OUI:7C6ADB*
- ID_OUI_FROM_DATABASE=SafeTone Technology Co.,Ltd
+OUI:001A5E*
+ ID_OUI_FROM_DATABASE=Thincom Technology Co.,Ltd
 
-OUI:EC986C*
- ID_OUI_FROM_DATABASE=Lufft Mess- und Regeltechnik GmbH
+OUI:001A57*
+ ID_OUI_FROM_DATABASE=Matrix Design Group, LLC
 
-OUI:B0518E*
- ID_OUI_FROM_DATABASE=Holl technology CO.Ltd.
+OUI:001A5C*
+ ID_OUI_FROM_DATABASE=Euchner GmbH+Co. KG
 
-OUI:DCDECA*
- ID_OUI_FROM_DATABASE=Akyllor
+OUI:001A50*
+ ID_OUI_FROM_DATABASE=PheeNet Technology Corp.
 
-OUI:A071A9*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:001A9D*
+ ID_OUI_FROM_DATABASE=Skipper Wireless, Inc.
 
-OUI:8065E9*
- ID_OUI_FROM_DATABASE=BenQ Corporation
+OUI:001AA2*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:845DD7*
- ID_OUI_FROM_DATABASE=Shenzhen Netcom Electronics Co.,Ltd
+OUI:001A91*
+ ID_OUI_FROM_DATABASE=FusionDynamic Ltd.
 
-OUI:447DA5*
- ID_OUI_FROM_DATABASE=VTION INFORMATION TECHNOLOGY (FUJIAN) CO.,LTD
+OUI:001A96*
+ ID_OUI_FROM_DATABASE=ECLER S.A.
 
-OUI:0CCDD3*
- ID_OUI_FROM_DATABASE=EASTRIVER TECHNOLOGY CO., LTD.
+OUI:001A90*
+ ID_OUI_FROM_DATABASE=Trópico Sistemas e Telecomunicações da Amazônia LTDA.
 
-OUI:B8E589*
- ID_OUI_FROM_DATABASE=Payter BV
+OUI:001A8C*
+ ID_OUI_FROM_DATABASE=Sophos Ltd
 
-OUI:C89C1D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001A85*
+ ID_OUI_FROM_DATABASE=NV Michel Van de Wiele
 
-OUI:503DE5*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001A87*
+ ID_OUI_FROM_DATABASE=Canhold International Limited
 
-OUI:801440*
- ID_OUI_FROM_DATABASE=Sunlit System Technology Corp
+OUI:001A86*
+ ID_OUI_FROM_DATABASE=AdvancedIO Systems Inc
 
-OUI:948D50*
- ID_OUI_FROM_DATABASE=Beamex Oy Ab
+OUI:0019B5*
+ ID_OUI_FROM_DATABASE=Famar Fueguina S.A.
 
-OUI:94E226*
- ID_OUI_FROM_DATABASE=D. ORtiz Consulting, LLC
+OUI:0019BA*
+ ID_OUI_FROM_DATABASE=Paradox Security Systems Ltd
 
-OUI:E8E732*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent
+OUI:0019A2*
+ ID_OUI_FROM_DATABASE=ORDYN TECHNOLOGIES
 
-OUI:386E21*
- ID_OUI_FROM_DATABASE=Wasion Group Ltd.
+OUI:0019AE*
+ ID_OUI_FROM_DATABASE=Hopling Technologies b.v.
 
-OUI:D8C99D*
- ID_OUI_FROM_DATABASE=EA DISPLAY LIMITED
+OUI:0019A7*
+ ID_OUI_FROM_DATABASE=ITU-T
 
-OUI:CCFC6D*
- ID_OUI_FROM_DATABASE=RIZ TRANSMITTERS
+OUI:001996*
+ ID_OUI_FROM_DATABASE=TurboChef Technologies Inc.
 
-OUI:AC80D6*
- ID_OUI_FROM_DATABASE=Hexatronic AB
+OUI:00199B*
+ ID_OUI_FROM_DATABASE=Diversified Technical Systems, Inc.
 
-OUI:9CF938*
- ID_OUI_FROM_DATABASE=AREVA NP GmbH
+OUI:001991*
+ ID_OUI_FROM_DATABASE=avinfo
 
-OUI:500E6D*
- ID_OUI_FROM_DATABASE=TrafficCast International
+OUI:00198A*
+ ID_OUI_FROM_DATABASE=Northrop Grumman Systems Corp.
 
-OUI:1CFEA7*
- ID_OUI_FROM_DATABASE=IDentytech Solutins Ltd.
+OUI:00198C*
+ ID_OUI_FROM_DATABASE=iXSea
 
-OUI:D0B53D*
- ID_OUI_FROM_DATABASE=SEPRO ROBOTIQUE
+OUI:001985*
+ ID_OUI_FROM_DATABASE=IT Watchdogs, Inc
 
-OUI:A0DE05*
- ID_OUI_FROM_DATABASE=JSC Irbis-T
+OUI:00196B*
+ ID_OUI_FROM_DATABASE=Danpex Corporation
 
-OUI:8895B9*
- ID_OUI_FROM_DATABASE=Unified Packet Systems Crop
+OUI:001966*
+ ID_OUI_FROM_DATABASE=Asiarock Technology Limited
 
-OUI:78593E*
- ID_OUI_FROM_DATABASE=RAFI GmbH & Co.KG
+OUI:00195C*
+ ID_OUI_FROM_DATABASE=Innotech Corporation
 
-OUI:684352*
- ID_OUI_FROM_DATABASE=Bhuu Limited
+OUI:001961*
+ ID_OUI_FROM_DATABASE=Blaupunkt  Embedded Systems GmbH
 
-OUI:3CC0C6*
- ID_OUI_FROM_DATABASE=d&b audiotechnik GmbH
+OUI:0019DE*
+ ID_OUI_FROM_DATABASE=MOBITEK
 
-OUI:F8DAF4*
- ID_OUI_FROM_DATABASE=Taishan Online Technology Co., Ltd.
+OUI:0019EA*
+ ID_OUI_FROM_DATABASE=TeraMage Technologies Co., Ltd.
 
-OUI:D8E3AE*
- ID_OUI_FROM_DATABASE=CIRTEC MEDICAL SYSTEMS
+OUI:0019D0*
+ ID_OUI_FROM_DATABASE=Cathexis
 
-OUI:A83944*
- ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
+OUI:0019D7*
+ ID_OUI_FROM_DATABASE=FORTUNETEK CO., LTD
 
-OUI:FC1FC0*
- ID_OUI_FROM_DATABASE=EURECAM
+OUI:0019B3*
+ ID_OUI_FROM_DATABASE=Stanford Research Systems
 
-OUI:4891F6*
- ID_OUI_FROM_DATABASE=Shenzhen Reach software technology CO.,LTD
+OUI:001A44*
+ ID_OUI_FROM_DATABASE=JWTrading Co., Ltd
 
-OUI:EC14F6*
- ID_OUI_FROM_DATABASE=BioControl AS
+OUI:001A49*
+ ID_OUI_FROM_DATABASE=Micro Vision Co.,LTD
 
-OUI:B8D06F*
- ID_OUI_FROM_DATABASE=GUANGZHOU HKUST FOK YING TUNG RESEARCH INSTITUTE
+OUI:001A3D*
+ ID_OUI_FROM_DATABASE=Ajin Vision Co.,Ltd
 
-OUI:B4C44E*
- ID_OUI_FROM_DATABASE=VXL eTech Pvt Ltd
+OUI:001A31*
+ ID_OUI_FROM_DATABASE=SCAN COIN Industries AB
 
-OUI:F0933A*
- ID_OUI_FROM_DATABASE=NxtConect
+OUI:001A38*
+ ID_OUI_FROM_DATABASE=Sanmina-SCI
 
-OUI:6052D0*
- ID_OUI_FROM_DATABASE=FACTS Engineering
+OUI:001A2C*
+ ID_OUI_FROM_DATABASE=SATEC Co.,LTD
 
-OUI:8C278A*
- ID_OUI_FROM_DATABASE=Vocollect Inc
+OUI:001A27*
+ ID_OUI_FROM_DATABASE=Ubistar
 
-OUI:FCAF6A*
- ID_OUI_FROM_DATABASE=Qulsar Inc
+OUI:0017AE*
+ ID_OUI_FROM_DATABASE=GAI-Tronics
 
-OUI:ECE555*
- ID_OUI_FROM_DATABASE=Hirschmann Automation
+OUI:0017A2*
+ ID_OUI_FROM_DATABASE=Camrivox Ltd.
 
-OUI:DCD0F7*
- ID_OUI_FROM_DATABASE=Bentek Systems Ltd.
+OUI:0017A7*
+ ID_OUI_FROM_DATABASE=Mobile Computing Promotion Consortium
 
-OUI:D0574C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00179D*
+ ID_OUI_FROM_DATABASE=Kelman Limited
 
-OUI:8818AE*
- ID_OUI_FROM_DATABASE=Tamron Co., Ltd
+OUI:001791*
+ ID_OUI_FROM_DATABASE=LinTech GmbH
 
-OUI:20D607*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:001796*
+ ID_OUI_FROM_DATABASE=Rittmeyer AG
 
-OUI:58DB8D*
- ID_OUI_FROM_DATABASE=Fast Co., Ltd.
+OUI:001798*
+ ID_OUI_FROM_DATABASE=Azonic Technology Co., LTD
 
-OUI:18EF63*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00178A*
+ ID_OUI_FROM_DATABASE=DARTS TECHNOLOGIES CORP.
 
-OUI:CCCE40*
- ID_OUI_FROM_DATABASE=Janteq Corp
+OUI:00177E*
+ ID_OUI_FROM_DATABASE=Meshcom Technologies Inc.
 
-OUI:8C4DEA*
- ID_OUI_FROM_DATABASE=Cerio Corporation
+OUI:001785*
+ ID_OUI_FROM_DATABASE=Sparr Electronics Ltd
 
-OUI:ECFAAA*
- ID_OUI_FROM_DATABASE=The IMS Company
+OUI:001809*
+ ID_OUI_FROM_DATABASE=CRESYN
 
-OUI:CC55AD*
- ID_OUI_FROM_DATABASE=RIM
+OUI:00180E*
+ ID_OUI_FROM_DATABASE=Avega Systems
 
-OUI:F0F7B3*
- ID_OUI_FROM_DATABASE=Phorm
+OUI:001810*
+ ID_OUI_FROM_DATABASE=IPTrade S.A.
 
-OUI:E8757F*
- ID_OUI_FROM_DATABASE=FIRS Technologies(Shenzhen) Co., Ltd
+OUI:0017F6*
+ ID_OUI_FROM_DATABASE=Pyramid Meriden Inc.
 
-OUI:C83EA7*
- ID_OUI_FROM_DATABASE=KUNBUS GmbH
+OUI:0017FB*
+ ID_OUI_FROM_DATABASE=FA
 
-OUI:A8D3C8*
- ID_OUI_FROM_DATABASE=Wachendorff Elektronik  GmbH & Co. KG
+OUI:0017FD*
+ ID_OUI_FROM_DATABASE=Amulet Hotkey
 
-OUI:E0CF2D*
- ID_OUI_FROM_DATABASE=Gemintek Corporation
+OUI:0017EF*
+ ID_OUI_FROM_DATABASE=IBM Corp
 
-OUI:68BDAB*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0017D7*
+ ID_OUI_FROM_DATABASE=ION Geophysical Corporation Inc.
 
-OUI:9CADEF*
- ID_OUI_FROM_DATABASE=Obihai Technology, Inc.
+OUI:0017DC*
+ ID_OUI_FROM_DATABASE=DAEMYUNG ZERO1
 
-OUI:D08999*
- ID_OUI_FROM_DATABASE=APCON, Inc.
+OUI:0017DE*
+ ID_OUI_FROM_DATABASE=Advantage Six Ltd
 
-OUI:4454C0*
- ID_OUI_FROM_DATABASE=Thompson Aerospace
+OUI:0018C3*
+ ID_OUI_FROM_DATABASE=CS Corporation
 
-OUI:B4A4E3*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0018CA*
+ ID_OUI_FROM_DATABASE=Viprinet GmbH
 
-OUI:90903C*
- ID_OUI_FROM_DATABASE=TRISON TECHNOLOGY CORPORATION
+OUI:0018BE*
+ ID_OUI_FROM_DATABASE=ANSA Corporation
 
-OUI:94DD3F*
- ID_OUI_FROM_DATABASE=A+V Link Technologies, Corp.
+OUI:0018B2*
+ ID_OUI_FROM_DATABASE=ADEUNIS RF
 
-OUI:C8EE08*
- ID_OUI_FROM_DATABASE=TANGTOP TECHNOLOGY CO.,LTD
+OUI:0018B7*
+ ID_OUI_FROM_DATABASE=D3 LED, LLC
 
-OUI:7472F2*
- ID_OUI_FROM_DATABASE=Chipsip Technology Co., Ltd.
+OUI:0018AB*
+ ID_OUI_FROM_DATABASE=BEIJING LHWT MICROELECTRONICS INC.
 
-OUI:5CD998*
- ID_OUI_FROM_DATABASE=D-Link Corporation
+OUI:0018A6*
+ ID_OUI_FROM_DATABASE=Persistent Systems, LLC
 
-OUI:D46CDA*
- ID_OUI_FROM_DATABASE=CSM GmbH
+OUI:001895*
+ ID_OUI_FROM_DATABASE=Hansun Technologies Inc.
 
-OUI:C4F464*
- ID_OUI_FROM_DATABASE=Spica international
+OUI:00189A*
+ ID_OUI_FROM_DATABASE=HANA Micron Inc.
 
-OUI:74911A*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:0018E7*
+ ID_OUI_FROM_DATABASE=Cameo Communications, INC.
 
-OUI:544A05*
- ID_OUI_FROM_DATABASE=wenglor sensoric gmbh
+OUI:0018EE*
+ ID_OUI_FROM_DATABASE=Videology Imaging Solutions, Inc.
 
-OUI:5CCA32*
- ID_OUI_FROM_DATABASE=Theben AG
+OUI:0018E2*
+ ID_OUI_FROM_DATABASE=Topdata Sistemas de Automacao Ltda
 
-OUI:84C7A9*
- ID_OUI_FROM_DATABASE=C3PO S.A.
+OUI:0018DB*
+ ID_OUI_FROM_DATABASE=EPL Technology Ltd
 
-OUI:F8AC6D*
- ID_OUI_FROM_DATABASE=Deltenna Ltd
+OUI:0018E0*
+ ID_OUI_FROM_DATABASE=ANAVEO
 
-OUI:641084*
- ID_OUI_FROM_DATABASE=HEXIUM Technical Development Co., Ltd.
+OUI:0018CF*
+ ID_OUI_FROM_DATABASE=Baldor Electric Company
 
-OUI:C416FA*
- ID_OUI_FROM_DATABASE=Prysm Inc
+OUI:0018D4*
+ ID_OUI_FROM_DATABASE=Unified Display Interface SIG
 
-OUI:E0C286*
- ID_OUI_FROM_DATABASE=Aisai Communication Technology Co., Ltd.
+OUI:00184A*
+ ID_OUI_FROM_DATABASE=Catcher, Inc.
 
-OUI:D84B2A*
- ID_OUI_FROM_DATABASE=Cognitas Technologies, Inc.
+OUI:00184C*
+ ID_OUI_FROM_DATABASE=Bogen Communications
 
-OUI:684B88*
- ID_OUI_FROM_DATABASE=Galtronics Telemetry Inc.
+OUI:001845*
+ ID_OUI_FROM_DATABASE=Pulsar-Telecom LLC.
 
-OUI:842914*
- ID_OUI_FROM_DATABASE=EMPORIA TELECOM Produktions- und VertriebsgesmbH & Co KG
+OUI:00183E*
+ ID_OUI_FROM_DATABASE=Digilent, Inc
 
-OUI:4C8B55*
- ID_OUI_FROM_DATABASE=Grupo Digicon
+OUI:001828*
+ ID_OUI_FROM_DATABASE=e2v technologies (UK) ltd.
 
-OUI:04A3F3*
- ID_OUI_FROM_DATABASE=Emicon
+OUI:00182D*
+ ID_OUI_FROM_DATABASE=Artec Design
 
-OUI:F866F2*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001821*
+ ID_OUI_FROM_DATABASE=SINDORICOH
 
-OUI:7C55E7*
- ID_OUI_FROM_DATABASE=YSI, Inc.
+OUI:001815*
+ ID_OUI_FROM_DATABASE=GZ Technologies, Inc.
+
+OUI:00181C*
+ ID_OUI_FROM_DATABASE=Exterity Limited
+
+OUI:001772*
+ ID_OUI_FROM_DATABASE=ASTRO Strobel Kommunikationssysteme GmbH
 
-OUI:C02BFC*
- ID_OUI_FROM_DATABASE=iNES. applied informatics GmbH
+OUI:001777*
+ ID_OUI_FROM_DATABASE=Obsidian Research Corporation
 
-OUI:AC34CB*
- ID_OUI_FROM_DATABASE=Shanhai GBCOM Communication Technology Co. Ltd
+OUI:00176E*
+ ID_OUI_FROM_DATABASE=DUCATI SISTEMI
 
-OUI:D4A928*
- ID_OUI_FROM_DATABASE=GreenWave Reality Inc
+OUI:001762*
+ ID_OUI_FROM_DATABASE=Solar Technology, Inc.
 
-OUI:9CFFBE*
- ID_OUI_FROM_DATABASE=OTSL Inc.
+OUI:001769*
+ ID_OUI_FROM_DATABASE=Cymphonix Corp
 
-OUI:2CD1DA*
- ID_OUI_FROM_DATABASE=Sanjole, Inc.
+OUI:00175D*
+ ID_OUI_FROM_DATABASE=Dongseo system.
 
-OUI:100E2B*
- ID_OUI_FROM_DATABASE=NEC CASIO Mobile Communications
+OUI:00175B*
+ ID_OUI_FROM_DATABASE=ACS Solutions Switzerland Ltd.
 
-OUI:445EF3*
- ID_OUI_FROM_DATABASE=Tonalite Holding B.V.
+OUI:001756*
+ ID_OUI_FROM_DATABASE=Vinci Labs Oy
 
-OUI:100C24*
- ID_OUI_FROM_DATABASE=pomdevices, LLC
+OUI:00174F*
+ ID_OUI_FROM_DATABASE=iCatch Inc.
 
-OUI:58F6BF*
- ID_OUI_FROM_DATABASE=Kyoto University
+OUI:0017CD*
+ ID_OUI_FROM_DATABASE=CEC Wireless R&D Ltd.
 
-OUI:7CED8D*
- ID_OUI_FROM_DATABASE=Microsoft
+OUI:0017D2*
+ ID_OUI_FROM_DATABASE=THINLINX PTY LTD
 
-OUI:54FDBF*
- ID_OUI_FROM_DATABASE=Scheidt & Bachmann GmbH
+OUI:0017C6*
+ ID_OUI_FROM_DATABASE=Cross Match Technologies Inc
 
-OUI:B40EDC*
- ID_OUI_FROM_DATABASE=LG-Ericsson Co.,Ltd.
+OUI:0017BA*
+ ID_OUI_FROM_DATABASE=SEDO CO., LTD.
 
-OUI:A4D1D1*
- ID_OUI_FROM_DATABASE=ECOtality North America
+OUI:0017BF*
+ ID_OUI_FROM_DATABASE=Coherent Research Limited
 
-OUI:C8D5FE*
- ID_OUI_FROM_DATABASE=Shenzhen Zowee Technology Co., Ltd
+OUI:0017C1*
+ ID_OUI_FROM_DATABASE=CM Precision Technology LTD.
 
-OUI:C49313*
- ID_OUI_FROM_DATABASE=100fio networks technology llc
+OUI:0017B3*
+ ID_OUI_FROM_DATABASE=Aftek Infosys Limited
 
-OUI:A4A80F*
- ID_OUI_FROM_DATABASE=Shenzhen Coship Electronics Co., Ltd.
+OUI:00186A*
+ ID_OUI_FROM_DATABASE=Global Link Digital Technology Co,.LTD
 
-OUI:B8921D*
- ID_OUI_FROM_DATABASE=BG T&A
+OUI:00186F*
+ ID_OUI_FROM_DATABASE=Setha Industria Eletronica LTDA
 
-OUI:48FCB8*
- ID_OUI_FROM_DATABASE=Woodstream Corporation
+OUI:001876*
+ ID_OUI_FROM_DATABASE=WowWee Ltd.
 
-OUI:548922*
- ID_OUI_FROM_DATABASE=Zelfy Inc
+OUI:001869*
+ ID_OUI_FROM_DATABASE=KINGJIM
 
-OUI:F8C091*
- ID_OUI_FROM_DATABASE=Highgates Technology
+OUI:001864*
+ ID_OUI_FROM_DATABASE=Eaton Corporation
 
-OUI:6C5CDE*
- ID_OUI_FROM_DATABASE=SunReports, Inc.
+OUI:00185D*
+ ID_OUI_FROM_DATABASE=TAIGUEN TECHNOLOGY (SHEN-ZHEN) CO., LTD.
 
-OUI:241F2C*
- ID_OUI_FROM_DATABASE=Calsys, Inc.
+OUI:001851*
+ ID_OUI_FROM_DATABASE=SWsoft
 
-OUI:284846*
- ID_OUI_FROM_DATABASE=GridCentric Inc.
+OUI:001858*
+ ID_OUI_FROM_DATABASE=TagMaster AB
 
-OUI:58B9E1*
- ID_OUI_FROM_DATABASE=Crystalfontz America, Inc.
+OUI:00189F*
+ ID_OUI_FROM_DATABASE=Lenntek Corporation
 
-OUI:646707*
- ID_OUI_FROM_DATABASE=Beijing Omnific Technology, Ltd.
+OUI:00188E*
+ ID_OUI_FROM_DATABASE=Ekahau, Inc.
 
-OUI:D4000D*
- ID_OUI_FROM_DATABASE=Phoenix Broadband Technologies, LLC.
+OUI:001887*
+ ID_OUI_FROM_DATABASE=Metasystem SpA
 
-OUI:E87AF3*
- ID_OUI_FROM_DATABASE=S5 Tech S.r.l.
+OUI:001889*
+ ID_OUI_FROM_DATABASE=WinNet Solutions Limited
 
-OUI:40C7C9*
- ID_OUI_FROM_DATABASE=Naviit Inc.
+OUI:00187B*
+ ID_OUI_FROM_DATABASE=4NSYS Co. Ltd.
 
-OUI:A0A763*
- ID_OUI_FROM_DATABASE=Polytron Vertrieb GmbH
+OUI:001661*
+ ID_OUI_FROM_DATABASE=Novatium Solutions (P) Ltd
 
-OUI:D496DF*
- ID_OUI_FROM_DATABASE=SUNGJIN C&T CO.,LTD
+OUI:001663*
+ ID_OUI_FROM_DATABASE=KBT Mobile
 
-OUI:D07DE5*
- ID_OUI_FROM_DATABASE=Forward Pay Systems, Inc.
+OUI:001668*
+ ID_OUI_FROM_DATABASE=Eishin Electronics
 
-OUI:7CEF18*
- ID_OUI_FROM_DATABASE=Creative Product Design Pty. Ltd.
+OUI:001662*
+ ID_OUI_FROM_DATABASE=Liyuh Technology Ltd.
 
-OUI:FCD4F6*
- ID_OUI_FROM_DATABASE=Messana Air.Ray Conditioning s.r.l.
+OUI:00165C*
+ ID_OUI_FROM_DATABASE=Trackflow Ltd
 
-OUI:0CD696*
- ID_OUI_FROM_DATABASE=Amimon Ltd
+OUI:001655*
+ ID_OUI_FROM_DATABASE=FUHO TECHNOLOGY Co., LTD
 
-OUI:B43741*
- ID_OUI_FROM_DATABASE=Consert, Inc.
+OUI:0015E4*
+ ID_OUI_FROM_DATABASE=Zimmer Elektromedizin
 
-OUI:F8FB2F*
- ID_OUI_FROM_DATABASE=Santur Corporation
+OUI:0015DA*
+ ID_OUI_FROM_DATABASE=IRITEL A.D.
 
-OUI:2CCD43*
- ID_OUI_FROM_DATABASE=Summit Technology Group
+OUI:0015DF*
+ ID_OUI_FROM_DATABASE=Clivet S.p.A.
 
-OUI:6C8D65*
- ID_OUI_FROM_DATABASE=Wireless Glue Networks, Inc.
+OUI:0015D3*
+ ID_OUI_FROM_DATABASE=Pantech&Curitel Communications, Inc.
 
-OUI:CCFCB1*
- ID_OUI_FROM_DATABASE=Wireless Technology, Inc.
+OUI:0015C7*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:CC5C75*
- ID_OUI_FROM_DATABASE=Weightech Com. Imp. Exp. Equip. Pesagem Ltda
+OUI:0015C0*
+ ID_OUI_FROM_DATABASE=DIGITAL TELEMEDIA CO.,LTD.
 
-OUI:A098ED*
- ID_OUI_FROM_DATABASE=Shandong Intelligent Optical Communication Development Co., Ltd.
+OUI:0015BA*
+ ID_OUI_FROM_DATABASE=iba AG
 
-OUI:34C69A*
- ID_OUI_FROM_DATABASE=Enecsys Ltd
+OUI:00174A*
+ ID_OUI_FROM_DATABASE=SOCOMEC
 
-OUI:502A8B*
- ID_OUI_FROM_DATABASE=Telekom Research and Development Sdn Bhd
+OUI:001743*
+ ID_OUI_FROM_DATABASE=Deck Srl
 
-OUI:F88DEF*
- ID_OUI_FROM_DATABASE=Tenebraex
+OUI:00173D*
+ ID_OUI_FROM_DATABASE=Neology
 
-OUI:EC43E6*
- ID_OUI_FROM_DATABASE=AWCER Ltd.
+OUI:00173E*
+ ID_OUI_FROM_DATABASE=LeucotronEquipamentos Ltda.
 
-OUI:F0EC39*
- ID_OUI_FROM_DATABASE=Essec
+OUI:001738*
+ ID_OUI_FROM_DATABASE=International Business Machines
 
-OUI:5849BA*
- ID_OUI_FROM_DATABASE=Chitai Electronic Corp.
+OUI:00172C*
+ ID_OUI_FROM_DATABASE=TAEJIN INFOTECH
 
-OUI:181714*
- ID_OUI_FROM_DATABASE=DAEWOOIS
+OUI:001720*
+ ID_OUI_FROM_DATABASE=Image Sensing Systems, Inc.
 
-OUI:80B289*
- ID_OUI_FROM_DATABASE=Forworld Electronics Ltd.
+OUI:001725*
+ ID_OUI_FROM_DATABASE=Liquid Computing
 
-OUI:14A62C*
- ID_OUI_FROM_DATABASE=S.M. Dezac S.A.
+OUI:001701*
+ ID_OUI_FROM_DATABASE=KDE, Inc.
 
-OUI:A8F470*
- ID_OUI_FROM_DATABASE=Fujian Newland Communication Science Technologies Co.,Ltd.
+OUI:001703*
+ ID_OUI_FROM_DATABASE=MOSDAN Internation Co.,Ltd
 
-OUI:DC1D9F*
- ID_OUI_FROM_DATABASE=U & B tech
+OUI:0016FC*
+ ID_OUI_FROM_DATABASE=TOHKEN CO.,LTD.
 
-OUI:081651*
- ID_OUI_FROM_DATABASE=SHENZHEN SEA STAR TECHNOLOGY CO.,LTD
+OUI:0016F0*
+ ID_OUI_FROM_DATABASE=Dell
 
-OUI:DC49C9*
- ID_OUI_FROM_DATABASE=CASCO SIGNAL LTD
+OUI:0016F5*
+ ID_OUI_FROM_DATABASE=Dalian Golden Hualu Digital Technology Co.,Ltd
 
-OUI:B09134*
- ID_OUI_FROM_DATABASE=Taleo
+OUI:0016E9*
+ ID_OUI_FROM_DATABASE=Tiba Medical Inc
 
-OUI:A863DF*
- ID_OUI_FROM_DATABASE=DISPLAIRE CORPORATION
+OUI:0016E4*
+ ID_OUI_FROM_DATABASE=VANGUARD SECURITY ENGINEERING CORP.
 
-OUI:104369*
- ID_OUI_FROM_DATABASE=Soundmax Electronic Limited
+OUI:0016DD*
+ ID_OUI_FROM_DATABASE=Gigabeam Corporation
 
-OUI:C06C0F*
- ID_OUI_FROM_DATABASE=Dobbs Stanford
+OUI:0016E2*
+ ID_OUI_FROM_DATABASE=American Fibertek, Inc.
 
-OUI:5475D0*
+OUI:0016D8*
+ ID_OUI_FROM_DATABASE=Senea AB
+
+OUI:00169C*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:BC6A16*
- ID_OUI_FROM_DATABASE=tdvine
+OUI:00169E*
+ ID_OUI_FROM_DATABASE=TV One Ltd
 
-OUI:C8EF2E*
- ID_OUI_FROM_DATABASE=Beijing Gefei Tech. Co., Ltd
+OUI:0016A3*
+ ID_OUI_FROM_DATABASE=Ingeteam Transmission&Distribution, S.A.
 
-OUI:98DCD9*
- ID_OUI_FROM_DATABASE=UNITEC Co., Ltd.
+OUI:001690*
+ ID_OUI_FROM_DATABASE=J-TEK INCORPORATION
 
-OUI:30525A*
- ID_OUI_FROM_DATABASE=NST Co., LTD
+OUI:001697*
+ ID_OUI_FROM_DATABASE=NEC Corporation
 
-OUI:6089B7*
- ID_OUI_FROM_DATABASE=KAEL MÜHENDİSLİK ELEKTRONİK TİCARET SANAYİ LİMİTED ŞİRKETİ
+OUI:001689*
+ ID_OUI_FROM_DATABASE=Pilkor Electronics Co., Ltd
 
-OUI:2CA780*
- ID_OUI_FROM_DATABASE=True Technologies Inc.
+OUI:00168B*
+ ID_OUI_FROM_DATABASE=Paralan Corporation
 
-OUI:545FA9*
- ID_OUI_FROM_DATABASE=Teracom Limited
+OUI:001684*
+ ID_OUI_FROM_DATABASE=Donjin Co.,Ltd.
 
-OUI:ECC882*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00167D*
+ ID_OUI_FROM_DATABASE=Sky-Line Information Co., Ltd.
 
-OUI:A0B9ED*
- ID_OUI_FROM_DATABASE=Skytap
+OUI:001678*
+ ID_OUI_FROM_DATABASE=SHENZHEN BAOAN GAOKE ELECTRONICS CO., LTD
 
-OUI:502DF4*
- ID_OUI_FROM_DATABASE=Phytec Messtechnik GmbH
+OUI:001649*
+ ID_OUI_FROM_DATABASE=SetOne GmbH
 
-OUI:38E8DF*
- ID_OUI_FROM_DATABASE=b gmbh medien + datenbanken
+OUI:00163F*
+ ID_OUI_FROM_DATABASE=CReTE SYSTEMS Inc.
 
-OUI:10189E*
- ID_OUI_FROM_DATABASE=Elmo Motion Control
+OUI:001638*
+ ID_OUI_FROM_DATABASE=TECOM Co., Ltd.
 
-OUI:88FD15*
- ID_OUI_FROM_DATABASE=LINEEYE CO., LTD
+OUI:001633*
+ ID_OUI_FROM_DATABASE=Oxford Diagnostics Ltd.
 
-OUI:10445A*
- ID_OUI_FROM_DATABASE=Shaanxi Hitech Electronic Co., LTD
+OUI:00162C*
+ ID_OUI_FROM_DATABASE=Xanboo
 
-OUI:60B3C4*
- ID_OUI_FROM_DATABASE=Elber Srl
+OUI:001627*
+ ID_OUI_FROM_DATABASE=embedded-logic DESIGN AND MORE GmbH
 
-OUI:04C880*
- ID_OUI_FROM_DATABASE=Samtec Inc
+OUI:001619*
+ ID_OUI_FROM_DATABASE=Lancelan Technologies S.L.
 
-OUI:884B39*
- ID_OUI_FROM_DATABASE=Siemens AG, Healthcare Sector
+OUI:001614*
+ ID_OUI_FROM_DATABASE=Picosecond Pulse Labs
 
-OUI:44C233*
- ID_OUI_FROM_DATABASE=Guangzhou Comet Technology Development Co.Ltd
+OUI:001719*
+ ID_OUI_FROM_DATABASE=Audiocodes USA, Inc
 
-OUI:B482FE*
- ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+OUI:00171E*
+ ID_OUI_FROM_DATABASE=Theo Benning GmbH & Co. KG
 
-OUI:307C30*
- ID_OUI_FROM_DATABASE=RIM
+OUI:001712*
+ ID_OUI_FROM_DATABASE=ISCO International
 
-OUI:BC4E3C*
- ID_OUI_FROM_DATABASE=CORE STAFF CO., LTD.
+OUI:00170D*
+ ID_OUI_FROM_DATABASE=Dust Networks Inc.
 
-OUI:80BAAC*
- ID_OUI_FROM_DATABASE=TeleAdapt Ltd
+OUI:00160F*
+ ID_OUI_FROM_DATABASE=BADGER METER INC
 
-OUI:FC4463*
- ID_OUI_FROM_DATABASE=Universal Audio, Inc
+OUI:00160A*
+ ID_OUI_FROM_DATABASE=SWEEX Europe BV
 
-OUI:F06853*
- ID_OUI_FROM_DATABASE=Integrated Corporation
+OUI:001603*
+ ID_OUI_FROM_DATABASE=COOLKSKY Co., LTD
 
-OUI:10E6AE*
- ID_OUI_FROM_DATABASE=Source Technologies, LLC
+OUI:0015F7*
+ ID_OUI_FROM_DATABASE=Wintecronics Ltd.
 
-OUI:A4ADB8*
- ID_OUI_FROM_DATABASE=Vitec Group, Camera Dynamics Ltd
+OUI:0015F0*
+ ID_OUI_FROM_DATABASE=EGO BV
 
-OUI:90A2DA*
- ID_OUI_FROM_DATABASE=GHEO SA
+OUI:0015EA*
+ ID_OUI_FROM_DATABASE=Tellumat (Pty) Ltd
 
-OUI:C41ECE*
- ID_OUI_FROM_DATABASE=HMI Sources Ltd.
+OUI:0016C5*
+ ID_OUI_FROM_DATABASE=Shenzhen Xing Feng Industry Co.,Ltd
 
-OUI:BCD5B6*
- ID_OUI_FROM_DATABASE=d2d technologies
+OUI:0016C7*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:1C8F8A*
- ID_OUI_FROM_DATABASE=Phase Motion Control SpA
+OUI:0016CC*
+ ID_OUI_FROM_DATABASE=Xcute Mobile Corp.
 
-OUI:A4B1EE*
- ID_OUI_FROM_DATABASE=H. ZANDER GmbH & Co. KG
+OUI:0016C0*
+ ID_OUI_FROM_DATABASE=Semtech Corporation
 
-OUI:486FD2*
- ID_OUI_FROM_DATABASE=StorSimple Inc
+OUI:0016B4*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:D4F143*
- ID_OUI_FROM_DATABASE=IPROAD.,Inc
+OUI:0016A8*
+ ID_OUI_FROM_DATABASE=CWT CO., LTD.
 
-OUI:CC5459*
- ID_OUI_FROM_DATABASE=OnTime Networks AS
+OUI:0016AD*
+ ID_OUI_FROM_DATABASE=BT-Links Company Limited
 
-OUI:3CB17F*
- ID_OUI_FROM_DATABASE=Wattwatchers Pty Ld
+OUI:001553*
+ ID_OUI_FROM_DATABASE=Cytyc Corporation
 
-OUI:00DB45*
- ID_OUI_FROM_DATABASE=THAMWAY CO.,LTD.
+OUI:001555*
+ ID_OUI_FROM_DATABASE=DFM GmbH
 
-OUI:A0231B*
- ID_OUI_FROM_DATABASE=TeleComp R&D Corp.
+OUI:00154E*
+ ID_OUI_FROM_DATABASE=IEC
 
-OUI:94C4E9*
- ID_OUI_FROM_DATABASE=PowerLayer Microsystems HongKong Limited
+OUI:001547*
+ ID_OUI_FROM_DATABASE=AiZen Solutions Inc.
 
-OUI:8843E1*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001542*
+ ID_OUI_FROM_DATABASE=MICROHARD S.R.L.
 
-OUI:B4ED19*
- ID_OUI_FROM_DATABASE=Pie Digital, Inc.
+OUI:00153B*
+ ID_OUI_FROM_DATABASE=EMH metering GmbH & Co. KG
 
-OUI:888717*
- ID_OUI_FROM_DATABASE=CANON INC.
+OUI:001534*
+ ID_OUI_FROM_DATABASE=A Beltrónica-Companhia de Comunicações, Lda
 
-OUI:E0271A*
- ID_OUI_FROM_DATABASE=TTC Next-generation Home Network System WG
+OUI:001440*
+ ID_OUI_FROM_DATABASE=ATOMIC Corporation
 
-OUI:84C727*
- ID_OUI_FROM_DATABASE=Gnodal Ltd
+OUI:001434*
+ ID_OUI_FROM_DATABASE=Keri Systems, Inc
 
-OUI:E4AB46*
- ID_OUI_FROM_DATABASE=UAB Selteka
+OUI:00142D*
+ ID_OUI_FROM_DATABASE=Toradex AG
 
-OUI:D479C3*
- ID_OUI_FROM_DATABASE=Cameronet GmbH & Co. KG
+OUI:001426*
+ ID_OUI_FROM_DATABASE=NL Technology
 
-OUI:945B7E*
- ID_OUI_FROM_DATABASE=TRILOBIT LTDA.
+OUI:001421*
+ ID_OUI_FROM_DATABASE=Total Wireless Technologies Pte. Ltd.
 
-OUI:E85B5B*
- ID_OUI_FROM_DATABASE=LG ELECTRONICS INC
+OUI:00141C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:20D906*
- ID_OUI_FROM_DATABASE=Iota, Inc.
+OUI:001583*
+ ID_OUI_FROM_DATABASE=IVT corporation
 
-OUI:404022*
- ID_OUI_FROM_DATABASE=ZIV
+OUI:00157E*
+ ID_OUI_FROM_DATABASE=Weidmüller Interface GmbH & Co. KG
 
-OUI:74F726*
- ID_OUI_FROM_DATABASE=Neuron Robotics
+OUI:001579*
+ ID_OUI_FROM_DATABASE=Lunatone Industrielle Elektronik GmbH
 
-OUI:18FC9F*
- ID_OUI_FROM_DATABASE=Changhe Electronics Co., Ltd.
+OUI:001574*
+ ID_OUI_FROM_DATABASE=Horizon Semiconductors Ltd.
 
-OUI:A438FC*
- ID_OUI_FROM_DATABASE=Plastic Logic
+OUI:001566*
+ ID_OUI_FROM_DATABASE=A-First Technology Co., Ltd.
 
-OUI:601D0F*
- ID_OUI_FROM_DATABASE=Midnite Solar
+OUI:001561*
+ ID_OUI_FROM_DATABASE=JJPlus Corporation
 
-OUI:50A6E3*
- ID_OUI_FROM_DATABASE=David Clark Company
+OUI:00155A*
+ ID_OUI_FROM_DATABASE=DAINIPPON PHARMACEUTICAL CO., LTD.
 
-OUI:549A16*
- ID_OUI_FROM_DATABASE=Uzushio Electric Co.,Ltd.
+OUI:001554*
+ ID_OUI_FROM_DATABASE=Atalum Wireless S.A.
 
-OUI:4001C6*
- ID_OUI_FROM_DATABASE=3COM EUROPE LTD
+OUI:001528*
+ ID_OUI_FROM_DATABASE=Beacon Medical Products LLC d.b.a. BeaconMedaes
 
-OUI:608D17*
- ID_OUI_FROM_DATABASE=Sentrus Government Systems Division, Inc
+OUI:001521*
+ ID_OUI_FROM_DATABASE=Horoquartz
 
-OUI:80912A*
- ID_OUI_FROM_DATABASE=Lih Rong electronic Enterprise Co., Ltd.
+OUI:001523*
+ ID_OUI_FROM_DATABASE=Meteor Communications Corporation
 
-OUI:8038FD*
- ID_OUI_FROM_DATABASE=LeapFrog Enterprises, Inc.
+OUI:001522*
+ ID_OUI_FROM_DATABASE=Dea Security
 
-OUI:7072CF*
- ID_OUI_FROM_DATABASE=EdgeCore Networks
+OUI:00151C*
+ ID_OUI_FROM_DATABASE=LENECO
 
-OUI:803B9A*
- ID_OUI_FROM_DATABASE=ghe-ces electronic ag
+OUI:001512*
+ ID_OUI_FROM_DATABASE=Zurich University of Applied Sciences
 
-OUI:9CCD82*
- ID_OUI_FROM_DATABASE=CHENG UEI PRECISION INDUSTRY CO.,LTD
+OUI:00150B*
+ ID_OUI_FROM_DATABASE=SAGE INFOTECH LTD.
 
-OUI:C8AACC*
- ID_OUI_FROM_DATABASE=Private
+OUI:001506*
+ ID_OUI_FROM_DATABASE=Neo Photonics
 
-OUI:003D41*
- ID_OUI_FROM_DATABASE=Hatteland Computer AS
+OUI:0014FF*
+ ID_OUI_FROM_DATABASE=Precise Automation, Inc.
 
-OUI:087618*
- ID_OUI_FROM_DATABASE=ViE Technologies Sdn. Bhd.
+OUI:0014F8*
+ ID_OUI_FROM_DATABASE=Scientific Atlanta
 
-OUI:A4AD00*
- ID_OUI_FROM_DATABASE=Ragsdale Technology
+OUI:0014F3*
+ ID_OUI_FROM_DATABASE=ViXS Systems Inc
 
-OUI:2C1984*
- ID_OUI_FROM_DATABASE=IDN Telecom, Inc.
+OUI:0014E7*
+ ID_OUI_FROM_DATABASE=Stolinx,. Inc
 
-OUI:3863F6*
- ID_OUI_FROM_DATABASE=3NOD MULTIMEDIA(SHENZHEN)CO.,LTD
+OUI:0014EC*
+ ID_OUI_FROM_DATABASE=Acro Telecom
+
+OUI:0014E2*
+ ID_OUI_FROM_DATABASE=datacom systems inc.
 
-OUI:DCE2AC*
- ID_OUI_FROM_DATABASE=Lumens Digital Optics Inc.
+OUI:0014D6*
+ ID_OUI_FROM_DATABASE=Jeongmin Electronics Co.,Ltd.
 
-OUI:98D88C*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:0014DB*
+ ID_OUI_FROM_DATABASE=Elma Trenew Electronic GmbH
 
-OUI:C8873B*
- ID_OUI_FROM_DATABASE=Net Optics
+OUI:0014DD*
+ ID_OUI_FROM_DATABASE=Covergence Inc.
 
-OUI:B0E97E*
- ID_OUI_FROM_DATABASE=Advanced Micro Peripherals
+OUI:0014DC*
+ ID_OUI_FROM_DATABASE=Communication System Design & Manufacturing (CSDM)
 
-OUI:D44CA7*
- ID_OUI_FROM_DATABASE=Informtekhnika & Communication, LLC
+OUI:0014CF*
+ ID_OUI_FROM_DATABASE=INVISIO Communications
 
-OUI:202CB7*
- ID_OUI_FROM_DATABASE=Kong Yue Electronics & Information Industry (Xinhui) Ltd.
+OUI:0014CA*
+ ID_OUI_FROM_DATABASE=Key Radio Systems Limited
 
-OUI:68CC9C*
- ID_OUI_FROM_DATABASE=Mine Site Technologies
+OUI:0014C3*
+ ID_OUI_FROM_DATABASE=Seagate Technology
 
-OUI:04B466*
- ID_OUI_FROM_DATABASE=BSP Co., Ltd.
+OUI:0014BC*
+ ID_OUI_FROM_DATABASE=SYNECTIC TELECOM EXPORTS PVT. LTD.
 
-OUI:E41F13*
- ID_OUI_FROM_DATABASE=IBM Corp
+OUI:0014B7*
+ ID_OUI_FROM_DATABASE=AR Infotek Inc.
 
-OUI:00271B*
- ID_OUI_FROM_DATABASE=Alec Sicherheitssysteme GmbH
+OUI:0014AD*
+ ID_OUI_FROM_DATABASE=Gassner Wiege- und Meßtechnik GmbH
 
-OUI:002718*
- ID_OUI_FROM_DATABASE=Suzhou NEW SEAUNION Video Technology Co.,Ltd
+OUI:0014B2*
+ ID_OUI_FROM_DATABASE=mCubelogics Corporation
 
-OUI:00270C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0014A6*
+ ID_OUI_FROM_DATABASE=Teranetics, Inc.
 
-OUI:00270B*
- ID_OUI_FROM_DATABASE=Adura Technologies
+OUI:00149F*
+ ID_OUI_FROM_DATABASE=System and Chips, Inc.
 
-OUI:002705*
- ID_OUI_FROM_DATABASE=Sectronic
+OUI:0014A1*
+ ID_OUI_FROM_DATABASE=Synchronous Communication Corp
 
-OUI:002706*
- ID_OUI_FROM_DATABASE=YOISYS
+OUI:001470*
+ ID_OUI_FROM_DATABASE=Prokom Software SA
 
-OUI:0026F9*
- ID_OUI_FROM_DATABASE=S.E.M. srl
+OUI:001469*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0026F3*
- ID_OUI_FROM_DATABASE=SMC Networks
+OUI:001462*
+ ID_OUI_FROM_DATABASE=Digiwell Technology, inc
 
-OUI:688540*
- ID_OUI_FROM_DATABASE=IGI Mobile, Inc.
+OUI:00145D*
+ ID_OUI_FROM_DATABASE=WJ Communications, Inc.
 
-OUI:6465C0*
- ID_OUI_FROM_DATABASE=Nuvon, Inc
+OUI:001450*
+ ID_OUI_FROM_DATABASE=Heim Systems GmbH
 
-OUI:F0DE71*
- ID_OUI_FROM_DATABASE=Shanghai EDO Technologies Co.,Ltd.
+OUI:001456*
+ ID_OUI_FROM_DATABASE=Edge Products
 
-OUI:28FBD3*
- ID_OUI_FROM_DATABASE=Ragentek Technology Group
+OUI:00144C*
+ ID_OUI_FROM_DATABASE=General Meters Corp.
 
-OUI:7C1EB3*
- ID_OUI_FROM_DATABASE=2N TELEKOMUNIKACE a.s.
+OUI:001445*
+ ID_OUI_FROM_DATABASE=Telefon-Gradnja d.o.o.
 
-OUI:146E0A*
- ID_OUI_FROM_DATABASE=Private
+OUI:001447*
+ ID_OUI_FROM_DATABASE=BOAZ Inc.
 
-OUI:1045F8*
- ID_OUI_FROM_DATABASE=LNT-Automation GmbH
+OUI:001446*
+ ID_OUI_FROM_DATABASE=SuperVision Solutions LLC
 
-OUI:644F74*
- ID_OUI_FROM_DATABASE=LENUS Co., Ltd.
+OUI:0015B3*
+ ID_OUI_FROM_DATABASE=Caretech AB
 
-OUI:787F62*
- ID_OUI_FROM_DATABASE=GiK mbH
+OUI:0015A9*
+ ID_OUI_FROM_DATABASE=KWANG WOO I&C CO.,LTD
 
-OUI:D4AAFF*
- ID_OUI_FROM_DATABASE=MICRO WORLD
+OUI:00159D*
+ ID_OUI_FROM_DATABASE=Tripp Lite
 
-OUI:C4FCE4*
- ID_OUI_FROM_DATABASE=DishTV NZ Ltd
+OUI:001591*
+ ID_OUI_FROM_DATABASE=RLW Inc.
 
-OUI:0CD7C2*
- ID_OUI_FROM_DATABASE=Axium Technologies, Inc.
+OUI:00158A*
+ ID_OUI_FROM_DATABASE=SURECOM Technology Corp.
 
-OUI:40F52E*
- ID_OUI_FROM_DATABASE=Leica Microsystems (Schweiz) AG
+OUI:00158F*
+ ID_OUI_FROM_DATABASE=NTT Advanced Technology Corporation
 
-OUI:C02250*
- ID_OUI_FROM_DATABASE=Private
+OUI:001590*
+ ID_OUI_FROM_DATABASE=Hectronic GmbH
 
-OUI:64BC11*
- ID_OUI_FROM_DATABASE=CombiQ AB
+OUI:0014A0*
+ ID_OUI_FROM_DATABASE=Accsense, Inc.
 
-OUI:4097D1*
- ID_OUI_FROM_DATABASE=BK Electronics cc
+OUI:001493*
+ ID_OUI_FROM_DATABASE=Systimax Solutions
 
-OUI:68AAD2*
- ID_OUI_FROM_DATABASE=DATECS LTD.,
+OUI:00148E*
+ ID_OUI_FROM_DATABASE=Tele Power Inc.
 
-OUI:0026EC*
- ID_OUI_FROM_DATABASE=Legrand Home Systems, Inc
+OUI:001487*
+ ID_OUI_FROM_DATABASE=American Technology Integrators
 
-OUI:0026E6*
- ID_OUI_FROM_DATABASE=Visionhitech Co., Ltd.
+OUI:001482*
+ ID_OUI_FROM_DATABASE=Aurora Networks
 
-OUI:0026E0*
- ID_OUI_FROM_DATABASE=ASITEQ
+OUI:001481*
+ ID_OUI_FROM_DATABASE=Multilink Inc
 
-OUI:0026DA*
- ID_OUI_FROM_DATABASE=Universal Media Corporation /Slovakia/ s.r.o.
+OUI:00147C*
+ ID_OUI_FROM_DATABASE=3Com Ltd
 
-OUI:0026D3*
- ID_OUI_FROM_DATABASE=Zeno Information System
+OUI:001475*
+ ID_OUI_FROM_DATABASE=Wiline Networks, Inc.
 
-OUI:0026D4*
- ID_OUI_FROM_DATABASE=IRCA SpA
+OUI:0012E7*
+ ID_OUI_FROM_DATABASE=Projectek Networking Electronics Corp.
 
-OUI:0026CD*
- ID_OUI_FROM_DATABASE=PurpleComm, Inc.
+OUI:0012E8*
+ ID_OUI_FROM_DATABASE=Fraunhofer IMS
 
-OUI:10880F*
- ID_OUI_FROM_DATABASE=Daruma Telecomunicações e Informática S.A.
+OUI:0012DB*
+ ID_OUI_FROM_DATABASE=ZIEHL industrie-elektronik GmbH + Co KG
 
-OUI:4C4B68*
- ID_OUI_FROM_DATABASE=Mobile Device, Inc.
+OUI:0012E2*
+ ID_OUI_FROM_DATABASE=ALAXALA Networks Corporation
 
-OUI:94BA31*
- ID_OUI_FROM_DATABASE=Visiontec da Amazônia Ltda.
+OUI:0012D6*
+ ID_OUI_FROM_DATABASE=Jiangsu Yitong High-Tech Co.,Ltd
 
-OUI:F45FF7*
- ID_OUI_FROM_DATABASE=DQ Technology Inc.
+OUI:0012D5*
+ ID_OUI_FROM_DATABASE=Motion Reality Inc.
 
-OUI:60F13D*
- ID_OUI_FROM_DATABASE=JABLOCOM s.r.o.
+OUI:0012C3*
+ ID_OUI_FROM_DATABASE=WIT S.A.
 
-OUI:0CEF7C*
- ID_OUI_FROM_DATABASE=AnaCom Inc
+OUI:0013E5*
+ ID_OUI_FROM_DATABASE=TENOSYS, INC.
 
-OUI:E08FEC*
- ID_OUI_FROM_DATABASE=REPOTEC CO., LTD.
+OUI:0013EA*
+ ID_OUI_FROM_DATABASE=Kamstrup A/S
 
-OUI:D0D286*
- ID_OUI_FROM_DATABASE=Beckman Coulter K.K.
+OUI:0013DE*
+ ID_OUI_FROM_DATABASE=Adapt4, LLC
 
-OUI:1C0FCF*
- ID_OUI_FROM_DATABASE=Sypro Optics GmbH
+OUI:0013D7*
+ ID_OUI_FROM_DATABASE=SPIDCOM Technologies SA
 
-OUI:0025AB*
- ID_OUI_FROM_DATABASE=AIO LCD PC BU / TPV
+OUI:0013D8*
+ ID_OUI_FROM_DATABASE=Princeton Instruments
 
-OUI:0025A4*
- ID_OUI_FROM_DATABASE=EuroDesign embedded technologies GmbH
+OUI:0013CF*
+ ID_OUI_FROM_DATABASE=4Access Communications
 
-OUI:00259D*
- ID_OUI_FROM_DATABASE=Private
+OUI:0013D2*
+ ID_OUI_FROM_DATABASE=PAGE IBERICA, S.A.
 
-OUI:002598*
- ID_OUI_FROM_DATABASE=Zhong Shan City Litai Electronic Industrial Co. Ltd
+OUI:0013C9*
+ ID_OUI_FROM_DATABASE=Beyond Achieve Enterprises Ltd.
 
-OUI:002591*
- ID_OUI_FROM_DATABASE=NEXTEK, Inc.
+OUI:0013C2*
+ ID_OUI_FROM_DATABASE=WACOM Co.,Ltd
 
-OUI:00258C*
- ID_OUI_FROM_DATABASE=ESUS ELEKTRONIK SAN. VE DIS. TIC. LTD. STI.
+OUI:0013BD*
+ ID_OUI_FROM_DATABASE=HYMATOM SA
 
-OUI:002587*
- ID_OUI_FROM_DATABASE=Vitality, Inc.
+OUI:0013B8*
+ ID_OUI_FROM_DATABASE=RyCo Electronic Systems Limited
 
-OUI:002581*
- ID_OUI_FROM_DATABASE=x-star networks Inc.
+OUI:00134E*
+ ID_OUI_FROM_DATABASE=Valox Systems, Inc.
 
-OUI:002582*
- ID_OUI_FROM_DATABASE=Maksat Technologies (P) Ltd
+OUI:001353*
+ ID_OUI_FROM_DATABASE=HYDAC Filtertechnik GMBH
 
-OUI:002578*
- ID_OUI_FROM_DATABASE=JSC Concern Sozvezdie
+OUI:00134D*
+ ID_OUI_FROM_DATABASE=Inepro BV
 
-OUI:00257D*
- ID_OUI_FROM_DATABASE=PointRed Telecom Private Ltd.
+OUI:001347*
+ ID_OUI_FROM_DATABASE=Red Lion Controls, LP
 
-OUI:002577*
- ID_OUI_FROM_DATABASE=D-BOX Technologies
+OUI:00133B*
+ ID_OUI_FROM_DATABASE=Speed Dragon Multimedia Limited
 
-OUI:002571*
- ID_OUI_FROM_DATABASE=Zhejiang Tianle Digital Electric Co.,Ltd
+OUI:001340*
+ ID_OUI_FROM_DATABASE=AD.EL s.r.l.
 
-OUI:00256A*
- ID_OUI_FROM_DATABASE=inIT - Institut Industrial IT
+OUI:00132E*
+ ID_OUI_FROM_DATABASE=ITian Coporation
 
-OUI:002565*
- ID_OUI_FROM_DATABASE=Vizimax Inc.
+OUI:001328*
+ ID_OUI_FROM_DATABASE=Westech Korea Inc.,
 
-OUI:00255E*
- ID_OUI_FROM_DATABASE=Shanghai Dare Technologies Co.,Ltd.
+OUI:00132D*
+ ID_OUI_FROM_DATABASE=iWise Communications
 
-OUI:002558*
- ID_OUI_FROM_DATABASE=MPEDIA
+OUI:001334*
+ ID_OUI_FROM_DATABASE=Arkados, Inc.
 
-OUI:002635*
- ID_OUI_FROM_DATABASE=Bluetechnix GmbH
+OUI:0013B3*
+ ID_OUI_FROM_DATABASE=Ecom Communications Technology Co., Ltd.
 
-OUI:00262F*
- ID_OUI_FROM_DATABASE=HAMAMATSU TOA ELECTRONICS
+OUI:0013AC*
+ ID_OUI_FROM_DATABASE=Sunmyung Electronics Co., LTD
 
-OUI:002623*
- ID_OUI_FROM_DATABASE=JRD Communication Inc
+OUI:0013A6*
+ ID_OUI_FROM_DATABASE=Extricom Ltd
 
-OUI:002628*
- ID_OUI_FROM_DATABASE=companytec automação e controle ltda.
+OUI:0013A5*
+ ID_OUI_FROM_DATABASE=General Solutions, LTD.
 
-OUI:00261C*
- ID_OUI_FROM_DATABASE=NEOVIA INC.
+OUI:0013A0*
+ ID_OUI_FROM_DATABASE=ALGOSYSTEM Co., Ltd.
 
-OUI:002615*
- ID_OUI_FROM_DATABASE=Teracom Limited
+OUI:001399*
+ ID_OUI_FROM_DATABASE=STAC Corporation.
 
-OUI:002616*
- ID_OUI_FROM_DATABASE=Rosemount Inc.
+OUI:001393*
+ ID_OUI_FROM_DATABASE=Panta Systems, Inc.
 
-OUI:002610*
- ID_OUI_FROM_DATABASE=Apacewave Technologies
+OUI:001394*
+ ID_OUI_FROM_DATABASE=Infohand Co.,Ltd
 
-OUI:002609*
- ID_OUI_FROM_DATABASE=Phyllis Co., Ltd.
+OUI:00138D*
+ ID_OUI_FROM_DATABASE=Kinghold
 
-OUI:00268C*
- ID_OUI_FROM_DATABASE=StarLeaf Ltd.
+OUI:0012C8*
+ ID_OUI_FROM_DATABASE=Perfect tech
 
-OUI:002692*
- ID_OUI_FROM_DATABASE=Mitsubishi Electric Co.
+OUI:0012B9*
+ ID_OUI_FROM_DATABASE=Fusion Digital Technology
 
-OUI:002686*
- ID_OUI_FROM_DATABASE=Quantenna Communcations, Inc.
+OUI:0012BE*
+ ID_OUI_FROM_DATABASE=Astek Corporation
 
-OUI:002680*
- ID_OUI_FROM_DATABASE=SIL3 Pty.Ltd
+OUI:0012AC*
+ ID_OUI_FROM_DATABASE=ONTIMETEK INC.
 
-OUI:00267F*
- ID_OUI_FROM_DATABASE=Zenterio AB
+OUI:0012AB*
+ ID_OUI_FROM_DATABASE=WiLife, Inc.
 
-OUI:00267A*
- ID_OUI_FROM_DATABASE=wuhan hongxin telecommunication technologies co.,ltd
+OUI:0012B2*
+ ID_OUI_FROM_DATABASE=AVOLITES LTD.
 
-OUI:002679*
- ID_OUI_FROM_DATABASE=Euphonic Technologies, Inc.
+OUI:0012A6*
+ ID_OUI_FROM_DATABASE=Dolby Australia
 
-OUI:002673*
- ID_OUI_FROM_DATABASE=RICOH COMPANY,LTD.
+OUI:001378*
+ ID_OUI_FROM_DATABASE=Qsan Technology, Inc.
 
-OUI:00266D*
- ID_OUI_FROM_DATABASE=MobileAccess Networks
+OUI:00137D*
+ ID_OUI_FROM_DATABASE=Dynalab, Inc.
 
-OUI:0025D6*
- ID_OUI_FROM_DATABASE=The Kroger Co.
+OUI:001384*
+ ID_OUI_FROM_DATABASE=Advanced Motion Controls
 
-OUI:0025CA*
- ID_OUI_FROM_DATABASE=LS Research, LLC
+OUI:00137E*
+ ID_OUI_FROM_DATABASE=CorEdge Networks, Inc.
 
-OUI:0025BE*
- ID_OUI_FROM_DATABASE=Tektrap Systems Inc.
+OUI:00136C*
+ ID_OUI_FROM_DATABASE=TomTom
 
-OUI:0025BD*
- ID_OUI_FROM_DATABASE=Italdata Ingegneria dell'Idea S.p.A.
+OUI:00136B*
+ ID_OUI_FROM_DATABASE=E-TEC
 
-OUI:0025B7*
- ID_OUI_FROM_DATABASE=Costar  electronics, inc.,
+OUI:001359*
+ ID_OUI_FROM_DATABASE=ProTelevision Technologies A/S
 
-OUI:0025B0*
- ID_OUI_FROM_DATABASE=Schmartz Inc
+OUI:00135E*
+ ID_OUI_FROM_DATABASE=EAB/RWI/K
 
-OUI:002546*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00129F*
+ ID_OUI_FROM_DATABASE=RAE Systems
 
-OUI:002545*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001299*
+ ID_OUI_FROM_DATABASE=Ktech Telecommunications Inc
 
-OUI:002535*
- ID_OUI_FROM_DATABASE=Minimax GmbH & Co KG
+OUI:00129A*
+ ID_OUI_FROM_DATABASE=IRT Electronics Pty Ltd
 
-OUI:002532*
- ID_OUI_FROM_DATABASE=Digital Recorders
+OUI:00128C*
+ ID_OUI_FROM_DATABASE=Woodward Governor
 
-OUI:00252B*
- ID_OUI_FROM_DATABASE=Stirling Energy Systems
+OUI:001293*
+ ID_OUI_FROM_DATABASE=GE Energy
 
-OUI:0025FD*
- ID_OUI_FROM_DATABASE=OBR Centrum Techniki Morskiej S.A.
+OUI:001287*
+ ID_OUI_FROM_DATABASE=Digital Everywhere Unterhaltungselektronik GmbH
 
-OUI:002603*
- ID_OUI_FROM_DATABASE=Shenzhen Wistar Technology Co., Ltd
+OUI:001280*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0025F3*
- ID_OUI_FROM_DATABASE=Nordwestdeutsche Zählerrevision
+OUI:00131E*
+ ID_OUI_FROM_DATABASE=Peiker acustic GmbH & Co. KG
 
-OUI:0025EC*
- ID_OUI_FROM_DATABASE=Humanware
+OUI:001323*
+ ID_OUI_FROM_DATABASE=Cap Co., Ltd.
 
-OUI:0025E2*
- ID_OUI_FROM_DATABASE=Everspring Industry Co., Ltd.
+OUI:00130B*
+ ID_OUI_FROM_DATABASE=Mextal B.V.
 
-OUI:0025DD*
- ID_OUI_FROM_DATABASE=SUNNYTEK INFORMATION CO., LTD.
+OUI:001312*
+ ID_OUI_FROM_DATABASE=Amedia Networks Inc.
 
-OUI:002667*
- ID_OUI_FROM_DATABASE=CARECOM CO.,LTD.
+OUI:0012F8*
+ ID_OUI_FROM_DATABASE=WNI Resources, LLC
 
-OUI:002660*
- ID_OUI_FROM_DATABASE=Logiways
+OUI:0012FF*
+ ID_OUI_FROM_DATABASE=Lely Industries N.V.
 
-OUI:002656*
- ID_OUI_FROM_DATABASE=Sansonic Electronics USA
+OUI:001304*
+ ID_OUI_FROM_DATABASE=Flaircomm Technologies Co. LTD
 
-OUI:002653*
- ID_OUI_FROM_DATABASE=DaySequerra Corporation
+OUI:001410*
+ ID_OUI_FROM_DATABASE=Suzhou Keda Technology CO.,Ltd
 
-OUI:00264C*
- ID_OUI_FROM_DATABASE=Shanghai DigiVision Technology Co., Ltd.
+OUI:001417*
+ ID_OUI_FROM_DATABASE=RSE Informations Technologie GmbH
 
-OUI:002647*
- ID_OUI_FROM_DATABASE=WFE TECHNOLOGY CORP.
+OUI:001408*
+ ID_OUI_FROM_DATABASE=Eka Systems Inc.
 
-OUI:00263B*
- ID_OUI_FROM_DATABASE=Onbnetech
+OUI:001402*
+ ID_OUI_FROM_DATABASE=kk-electronic a/s
 
-OUI:0026C1*
- ID_OUI_FROM_DATABASE=ARTRAY CO., LTD.
+OUI:001401*
+ ID_OUI_FROM_DATABASE=Rivertree Networks Corp.
 
-OUI:0026B5*
- ID_OUI_FROM_DATABASE=ICOMM Tele Ltd
+OUI:0013FB*
+ ID_OUI_FROM_DATABASE=RKC INSTRUMENT INC.
 
-OUI:0026AF*
- ID_OUI_FROM_DATABASE=Duelco A/S
+OUI:0013F4*
+ ID_OUI_FROM_DATABASE=Psitek (Pty) Ltd
 
-OUI:0026AB*
- ID_OUI_FROM_DATABASE=SEIKO EPSON CORPORATION
+OUI:0013EF*
+ ID_OUI_FROM_DATABASE=Kingjon Digital Technology Co.,Ltd
 
-OUI:0026A5*
- ID_OUI_FROM_DATABASE=MICROROBOT.CO.,LTD
+OUI:0011F7*
+ ID_OUI_FROM_DATABASE=Shenzhen Forward Industry Co., Ltd
 
-OUI:00269F*
- ID_OUI_FROM_DATABASE=Private
+OUI:0011F2*
+ ID_OUI_FROM_DATABASE=Institute of Network Technologies
 
-OUI:002699*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0011EB*
+ ID_OUI_FROM_DATABASE=Innovative Integration
 
-OUI:002489*
- ID_OUI_FROM_DATABASE=Vodafone Omnitel N.V.
+OUI:0011E6*
+ ID_OUI_FROM_DATABASE=Scientific Atlanta
 
-OUI:00248E*
- ID_OUI_FROM_DATABASE=Infoware ZRt.
+OUI:0011E5*
+ ID_OUI_FROM_DATABASE=KCodes Corporation
 
-OUI:002482*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:0011DF*
+ ID_OUI_FROM_DATABASE=Current Energy
 
-OUI:002476*
- ID_OUI_FROM_DATABASE=TAP.tv
+OUI:0011D3*
+ ID_OUI_FROM_DATABASE=NextGenTel Holding ASA
 
-OUI:00246F*
- ID_OUI_FROM_DATABASE=Onda Communication spa
+OUI:00110E*
+ ID_OUI_FROM_DATABASE=Tsurusaki Sealand Transportation Co. Ltd.
 
-OUI:00246A*
- ID_OUI_FROM_DATABASE=Solid Year Co., Ltd.
+OUI:001115*
+ ID_OUI_FROM_DATABASE=EPIN Technologies, Inc.
 
-OUI:0023FA*
- ID_OUI_FROM_DATABASE=RG Nets, Inc.
+OUI:001114*
+ ID_OUI_FROM_DATABASE=EverFocus Electronics Corp.
 
-OUI:0023FF*
- ID_OUI_FROM_DATABASE=Beijing HTTC Technology Ltd.
+OUI:001107*
+ ID_OUI_FROM_DATABASE=RGB Networks Inc.
 
-OUI:0023F4*
- ID_OUI_FROM_DATABASE=Masternaut
+OUI:001108*
+ ID_OUI_FROM_DATABASE=Orbital Data Corporation
 
-OUI:0023EA*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001102*
+ ID_OUI_FROM_DATABASE=Aurora Multimedia Corp.
 
-OUI:0023E4*
- ID_OUI_FROM_DATABASE=IPnect co. ltd.
+OUI:000FFC*
+ ID_OUI_FROM_DATABASE=Merit Li-Lin Ent.
 
-OUI:0023DE*
- ID_OUI_FROM_DATABASE=Ansync Inc.
+OUI:000FDA*
+ ID_OUI_FROM_DATABASE=YAZAKI CORPORATION
 
-OUI:0023D1*
- ID_OUI_FROM_DATABASE=TRG
+OUI:000FF3*
+ ID_OUI_FROM_DATABASE=Jung Myoung Communications&Technology
 
-OUI:0023CB*
- ID_OUI_FROM_DATABASE=Shenzhen Full-join Technology Co.,Ltd
+OUI:0011A2*
+ ID_OUI_FROM_DATABASE=Manufacturing Technology Inc
 
-OUI:0023D2*
- ID_OUI_FROM_DATABASE=Inhand Electronics, Inc.
+OUI:00119B*
+ ID_OUI_FROM_DATABASE=Telesynergy Research Inc.
 
-OUI:0024B4*
- ID_OUI_FROM_DATABASE=ESCATRONIC GmbH
+OUI:00118C*
+ ID_OUI_FROM_DATABASE=Missouri Department of Transportation
 
-OUI:0024AF*
- ID_OUI_FROM_DATABASE=EchoStar Technologies
+OUI:001191*
+ ID_OUI_FROM_DATABASE=CTS-Clima Temperatur Systeme GmbH
 
-OUI:0024AD*
- ID_OUI_FROM_DATABASE=Adolf Thies Gmbh & Co. KG
+OUI:001196*
+ ID_OUI_FROM_DATABASE=Actuality Systems, Inc.
 
-OUI:00249C*
- ID_OUI_FROM_DATABASE=Bimeng Comunication System Co. Ltd
+OUI:001179*
+ ID_OUI_FROM_DATABASE=Singular Technology Co. Ltd.
 
-OUI:002526*
- ID_OUI_FROM_DATABASE=Genuine Technologies Co., Ltd.
+OUI:001172*
+ ID_OUI_FROM_DATABASE=COTRON CORPORATION
 
-OUI:002525*
- ID_OUI_FROM_DATABASE=CTERA Networks Ltd.
+OUI:001166*
+ ID_OUI_FROM_DATABASE=Taelim Electronics Co., Ltd.
 
-OUI:002520*
- ID_OUI_FROM_DATABASE=SMA Railway Technology GmbH
+OUI:00116B*
+ ID_OUI_FROM_DATABASE=Digital Data Communications Asia Co.,Ltd
 
-OUI:00251B*
- ID_OUI_FROM_DATABASE=Philips CareServant
+OUI:00116C*
+ ID_OUI_FROM_DATABASE=Nanwang Multimedia Inc.,Ltd
 
-OUI:002516*
- ID_OUI_FROM_DATABASE=Integrated Design Tools, Inc.
+OUI:001162*
+ ID_OUI_FROM_DATABASE=STAR MICRONICS CO.,LTD.
 
-OUI:00250F*
- ID_OUI_FROM_DATABASE=On-Ramp Wireless, Inc.
+OUI:001161*
+ ID_OUI_FROM_DATABASE=NetStreams, LLC
 
-OUI:002503*
- ID_OUI_FROM_DATABASE=IBM Corp
+OUI:001155*
+ ID_OUI_FROM_DATABASE=Sevis Systems
 
-OUI:00250A*
- ID_OUI_FROM_DATABASE=Security Expert Co. Ltd
+OUI:00115C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0024DD*
- ID_OUI_FROM_DATABASE=Centrak, Inc.
+OUI:001147*
+ ID_OUI_FROM_DATABASE=Secom-Industry co.LTD.
 
-OUI:0024D8*
- ID_OUI_FROM_DATABASE=IlSung Precision
+OUI:00114C*
+ ID_OUI_FROM_DATABASE=caffeina applied research ltd.
 
-OUI:0024CC*
- ID_OUI_FROM_DATABASE=Fascinations Toys and Gifts, Inc.
+OUI:001274*
+ ID_OUI_FROM_DATABASE=NIT lab
 
-OUI:0024D1*
- ID_OUI_FROM_DATABASE=Thomson Inc.
+OUI:00127A*
+ ID_OUI_FROM_DATABASE=Sanyu Industry Co.,Ltd.
 
-OUI:0024CA*
- ID_OUI_FROM_DATABASE=Tobii Technology AB
+OUI:00126D*
+ ID_OUI_FROM_DATABASE=University of California, Berkeley
 
-OUI:0024C5*
- ID_OUI_FROM_DATABASE=Meridian Audio Limited
+OUI:001268*
+ ID_OUI_FROM_DATABASE=IPS d.o.o.
 
-OUI:0024B9*
- ID_OUI_FROM_DATABASE=Wuhan Higheasy Electronic Technology Development Co.Ltd
+OUI:001267*
+ ID_OUI_FROM_DATABASE=Panasonic Corporation
 
-OUI:002425*
- ID_OUI_FROM_DATABASE=Shenzhenshi chuangzhicheng Technology Co.,Ltd
+OUI:001261*
+ ID_OUI_FROM_DATABASE=Adaptix, Inc
 
-OUI:002419*
- ID_OUI_FROM_DATABASE=Private
+OUI:001257*
+ ID_OUI_FROM_DATABASE=LeapComm Communication Technologies Inc.
 
-OUI:002412*
- ID_OUI_FROM_DATABASE=Benign Technologies Co, Ltd.
+OUI:001222*
+ ID_OUI_FROM_DATABASE=Skardin (UK) Ltd
 
-OUI:00240C*
- ID_OUI_FROM_DATABASE=DELEC GmbH
+OUI:001227*
+ ID_OUI_FROM_DATABASE=Franklin Electric Co., Inc.
 
-OUI:002406*
- ID_OUI_FROM_DATABASE=Pointmobile
+OUI:00121B*
+ ID_OUI_FROM_DATABASE=Sound Devices, LLC
 
-OUI:0023F9*
- ID_OUI_FROM_DATABASE=Double-Take Software, INC.
+OUI:001221*
+ ID_OUI_FROM_DATABASE=B.Braun Melsungen AG
 
-OUI:002463*
- ID_OUI_FROM_DATABASE=Phybridge Inc
+OUI:001214*
+ ID_OUI_FROM_DATABASE=Koenig & Bauer AG
 
-OUI:002459*
- ID_OUI_FROM_DATABASE=ABB Automation products GmbH
+OUI:00120F*
+ ID_OUI_FROM_DATABASE=IEEE 802.3
 
-OUI:00245E*
- ID_OUI_FROM_DATABASE=Hivision Co.,ltd
+OUI:001208*
+ ID_OUI_FROM_DATABASE=Gantner Instruments GmbH
 
-OUI:002451*
+OUI:001201*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00244C*
- ID_OUI_FROM_DATABASE=Solartron Metrology Ltd
-
-OUI:002445*
- ID_OUI_FROM_DATABASE=CommScope Canada Inc.
+OUI:001202*
+ ID_OUI_FROM_DATABASE=Decrane Aerospace - Audio International Inc.
 
-OUI:00243F*
- ID_OUI_FROM_DATABASE=Storwize, Inc.
+OUI:0011C7*
+ ID_OUI_FROM_DATABASE=Raymarine UK Ltd
 
-OUI:002440*
- ID_OUI_FROM_DATABASE=Halo Monitoring, Inc.
+OUI:0011CC*
+ ID_OUI_FROM_DATABASE=Guangzhou Jinpeng Group Co.,Ltd.
 
-OUI:00243B*
- ID_OUI_FROM_DATABASE=CSSI (S) Pte Ltd
+OUI:0011B5*
+ ID_OUI_FROM_DATABASE=Shenzhen Powercom Co.,Ltd
 
-OUI:0024FC*
- ID_OUI_FROM_DATABASE=QuoPin Co., Ltd.
+OUI:0011BA*
+ ID_OUI_FROM_DATABASE=Elexol Pty Ltd
 
-OUI:0024F7*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0011C1*
+ ID_OUI_FROM_DATABASE=4P MOBILE DATA PROCESSING
 
-OUI:0024F0*
- ID_OUI_FROM_DATABASE=Seanodes
+OUI:0011A8*
+ ID_OUI_FROM_DATABASE=Quest Technologies
 
-OUI:0024EB*
- ID_OUI_FROM_DATABASE=ClearPath Networks, Inc.
+OUI:0011A7*
+ ID_OUI_FROM_DATABASE=Infilco Degremont Inc.
 
-OUI:0024E4*
- ID_OUI_FROM_DATABASE=Withings
+OUI:001250*
+ ID_OUI_FROM_DATABASE=Tokyo Aircaft Instrument Co., Ltd.
 
-OUI:002435*
- ID_OUI_FROM_DATABASE=WIDE CORPORATION
+OUI:00124B*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00242F*
- ID_OUI_FROM_DATABASE=Micron
+OUI:001244*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00241F*
- ID_OUI_FROM_DATABASE=DCT-Delta GmbH
+OUI:001238*
+ ID_OUI_FROM_DATABASE=SetaBox Technology Co., Ltd.
 
-OUI:0023C5*
- ID_OUI_FROM_DATABASE=Radiation Safety and Control Services Inc
+OUI:00123D*
+ ID_OUI_FROM_DATABASE=GES Co, Ltd
 
-OUI:0023C4*
- ID_OUI_FROM_DATABASE=Lux Lumen
+OUI:00123E*
+ ID_OUI_FROM_DATABASE=ERUNE technology Co., Ltd.
 
-OUI:0023B8*
- ID_OUI_FROM_DATABASE=Sichuan Jiuzhou Electronic Technology Co.,Ltd
+OUI:00122C*
+ ID_OUI_FROM_DATABASE=Soenen Controls N.V.
 
-OUI:0023BF*
- ID_OUI_FROM_DATABASE=Mainpine, Inc.
+OUI:001231*
+ ID_OUI_FROM_DATABASE=Motion Control Systems, Inc.
 
-OUI:0023B2*
- ID_OUI_FROM_DATABASE=Intelligent Mechatronic Systems Inc
+OUI:001146*
+ ID_OUI_FROM_DATABASE=Telecard-Pribor Ltd
 
-OUI:0023AC*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001140*
+ ID_OUI_FROM_DATABASE=Nanometrics Inc.
 
-OUI:0023A0*
- ID_OUI_FROM_DATABASE=Hana CNS Co., LTD.
+OUI:001139*
+ ID_OUI_FROM_DATABASE=STOEBER ANTRIEBSTECHNIK GmbH + Co. KG.
 
-OUI:0023A5*
- ID_OUI_FROM_DATABASE=SageTV, LLC
+OUI:00113A*
+ ID_OUI_FROM_DATABASE=SHINBORAM
 
-OUI:0022B6*
- ID_OUI_FROM_DATABASE=Superflow Technologies Group
+OUI:001134*
+ ID_OUI_FROM_DATABASE=MediaCell, Inc.
 
-OUI:0022A3*
- ID_OUI_FROM_DATABASE=California Eastern Laboratories
+OUI:001127*
+ ID_OUI_FROM_DATABASE=TASI, Inc
 
-OUI:00229E*
- ID_OUI_FROM_DATABASE=Social Aid Research Co., Ltd.
+OUI:00112A*
+ ID_OUI_FROM_DATABASE=Niko NV
 
-OUI:002291*
+OUI:001121*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:002292*
- ID_OUI_FROM_DATABASE=Cinetal
+OUI:000EBB*
+ ID_OUI_FROM_DATABASE=Everbee Networks
 
-OUI:002297*
- ID_OUI_FROM_DATABASE=XMOS Semiconductor
+OUI:000EB4*
+ ID_OUI_FROM_DATABASE=GUANGZHOU GAOKE COMMUNICATIONS TECHNOLOGY CO.LTD.
 
-OUI:00228B*
- ID_OUI_FROM_DATABASE=Kensington Computer Products Group
+OUI:000EAE*
+ ID_OUI_FROM_DATABASE=GAWELL TECHNOLOGIES CORP.
 
-OUI:002284*
- ID_OUI_FROM_DATABASE=DESAY A&V SCIENCE AND TECHNOLOGY CO.,LTD
+OUI:000EA8*
+ ID_OUI_FROM_DATABASE=United Technologists Europe Limited
 
-OUI:00227F*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:000EAD*
+ ID_OUI_FROM_DATABASE=Metanoia Technologies, Inc.
 
-OUI:002277*
- ID_OUI_FROM_DATABASE=NEC Australia Pty Ltd
+OUI:000EA1*
+ ID_OUI_FROM_DATABASE=Formosa Teletek Corporation
 
-OUI:00226D*
- ID_OUI_FROM_DATABASE=Shenzhen GIEC Electronics Co., Ltd.
+OUI:000E9C*
+ ID_OUI_FROM_DATABASE=Benchmark Electronics
 
-OUI:002263*
- ID_OUI_FROM_DATABASE=Koos Technical Services, Inc.
+OUI:000E9B*
+ ID_OUI_FROM_DATABASE=Ambit Microsystems Corporation
 
-OUI:002267*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:000E8E*
+ ID_OUI_FROM_DATABASE=SparkLAN Communications, Inc.
 
-OUI:002259*
- ID_OUI_FROM_DATABASE=Guangzhou New Postcom Equipment Co.,Ltd.
+OUI:000E95*
+ ID_OUI_FROM_DATABASE=Fujiya Denki Seisakusho Co.,Ltd.
 
-OUI:0022E4*
- ID_OUI_FROM_DATABASE=APASS TECHNOLOGY CO., LTD.
+OUI:000FC1*
+ ID_OUI_FROM_DATABASE=WAVE Corporation
 
-OUI:0022DD*
- ID_OUI_FROM_DATABASE=Protecta Electronics Ltd
+OUI:000FC8*
+ ID_OUI_FROM_DATABASE=Chantry Networks
 
-OUI:0022D8*
- ID_OUI_FROM_DATABASE=Shenzhen GST Security and Safety Technology Limited
+OUI:000FC7*
+ ID_OUI_FROM_DATABASE=Dionica R&D Ltd.
 
-OUI:0022D1*
- ID_OUI_FROM_DATABASE=Albrecht Jung GmbH & Co. KG
+OUI:000FBA*
+ ID_OUI_FROM_DATABASE=Tevebox AB
 
-OUI:0022C3*
- ID_OUI_FROM_DATABASE=Zeeport Technology Inc.
+OUI:000FA7*
+ ID_OUI_FROM_DATABASE=Raptor Networks Technology
 
-OUI:0022C7*
- ID_OUI_FROM_DATABASE=SEGGER Microcontroller GmbH & Co. KG
+OUI:000FAE*
+ ID_OUI_FROM_DATABASE=E2O Communications
 
-OUI:0022BD*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000FA8*
+ ID_OUI_FROM_DATABASE=Photometrics, Inc.
 
-OUI:002344*
- ID_OUI_FROM_DATABASE=Objective Interface Systems, Inc.
+OUI:000F9A*
+ ID_OUI_FROM_DATABASE=Synchrony, Inc.
 
-OUI:002343*
- ID_OUI_FROM_DATABASE=TEM AG
+OUI:000FA2*
+ ID_OUI_FROM_DATABASE=2xWireless
 
-OUI:002337*
- ID_OUI_FROM_DATABASE=Global Star Solutions ULC
+OUI:000E89*
+ ID_OUI_FROM_DATABASE=CLEMATIC
 
-OUI:00232B*
- ID_OUI_FROM_DATABASE=IRD A/S
+OUI:000E82*
+ ID_OUI_FROM_DATABASE=Commtech Wireless
 
-OUI:00231C*
- ID_OUI_FROM_DATABASE=Fourier Systems Ltd.
+OUI:000E7C*
+ ID_OUI_FROM_DATABASE=Televes S.A.
 
-OUI:00231B*
- ID_OUI_FROM_DATABASE=Danaher Motion - Kollmorgen
+OUI:000E76*
+ ID_OUI_FROM_DATABASE=GEMSOC INNOVISION INC.
 
-OUI:00239F*
- ID_OUI_FROM_DATABASE=Institut für Prüftechnik
+OUI:000E6E*
+ ID_OUI_FROM_DATABASE=MAT S.A. (Mircrelec Advanced Technology)
 
-OUI:002393*
- ID_OUI_FROM_DATABASE=AJINEXTEK
+OUI:000E72*
+ ID_OUI_FROM_DATABASE=CTS electronics
 
-OUI:00238F*
- ID_OUI_FROM_DATABASE=NIDEC COPAL CORPORATION
+OUI:000E68*
+ ID_OUI_FROM_DATABASE=E-TOP Network Technology Inc.
 
-OUI:002385*
- ID_OUI_FROM_DATABASE=ANTIPODE
+OUI:000E67*
+ ID_OUI_FROM_DATABASE=Eltis Microelectronics Ltd.
 
-OUI:00237E*
- ID_OUI_FROM_DATABASE=ELSTER GMBH
+OUI:000FE7*
+ ID_OUI_FROM_DATABASE=Lutron Electronics Co., Inc.
 
-OUI:00237F*
- ID_OUI_FROM_DATABASE=PLANTRONICS, INC.
+OUI:000FEC*
+ ID_OUI_FROM_DATABASE=ARKUS Inc.
 
-OUI:002379*
- ID_OUI_FROM_DATABASE=Union Business Machines Co. Ltd.
+OUI:000FE0*
+ ID_OUI_FROM_DATABASE=NComputing Co.,Ltd.
 
-OUI:002253*
- ID_OUI_FROM_DATABASE=Entorian Technologies
+OUI:000FD4*
+ ID_OUI_FROM_DATABASE=Soundcraft
 
-OUI:002250*
- ID_OUI_FROM_DATABASE=Point Six Wireless, LLC
+OUI:000FD9*
+ ID_OUI_FROM_DATABASE=FlexDSL Telecommunications AG
 
-OUI:002249*
- ID_OUI_FROM_DATABASE=HOME MULTIENERGY SL
+OUI:000EEA*
+ ID_OUI_FROM_DATABASE=Shadong Luneng Jicheng Electronics,Co.,Ltd
 
-OUI:00224A*
- ID_OUI_FROM_DATABASE=RAYLASE AG
+OUI:000EDD*
+ ID_OUI_FROM_DATABASE=SHURE INCORPORATED
 
-OUI:002240*
- ID_OUI_FROM_DATABASE=Universal Telecom S/A
+OUI:000EE4*
+ ID_OUI_FROM_DATABASE=BOE TECHNOLOGY GROUP CO.,LTD
 
-OUI:00222D*
- ID_OUI_FROM_DATABASE=SMC Networks Inc.
+OUI:000ED8*
+ ID_OUI_FROM_DATABASE=Positron Access Solutions Corp
 
-OUI:00222E*
- ID_OUI_FROM_DATABASE=maintech GmbH
+OUI:000ECD*
+ ID_OUI_FROM_DATABASE=SKOV A/S
 
-OUI:002364*
- ID_OUI_FROM_DATABASE=Power Instruments Pte Ltd
+OUI:000ECE*
+ ID_OUI_FROM_DATABASE=S.I.T.T.I. S.p.A.
 
-OUI:002369*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:000ED3*
+ ID_OUI_FROM_DATABASE=Epicenter, Inc.
 
-OUI:002370*
- ID_OUI_FROM_DATABASE=Snell
+OUI:000EC7*
+ ID_OUI_FROM_DATABASE=Motorola Korea
 
-OUI:00235D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000F93*
+ ID_OUI_FROM_DATABASE=Landis+Gyr Ltd.
 
-OUI:002356*
- ID_OUI_FROM_DATABASE=Packet Forensics LLC
+OUI:000F94*
+ ID_OUI_FROM_DATABASE=Genexis BV
 
-OUI:00234A*
- ID_OUI_FROM_DATABASE=Private
+OUI:000F8E*
+ ID_OUI_FROM_DATABASE=DONGYANG TELECOM CO.,LTD.
 
-OUI:002313*
- ID_OUI_FROM_DATABASE=Qool Technologies Ltd.
+OUI:000F87*
+ ID_OUI_FROM_DATABASE=Maxcess International
 
-OUI:00230D*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:000F82*
+ ID_OUI_FROM_DATABASE=Mortara Instrument, Inc.
 
-OUI:002301*
- ID_OUI_FROM_DATABASE=Witron Technology Limited
+OUI:000F81*
+ ID_OUI_FROM_DATABASE=PAL Pacific Inc.
 
-OUI:0022F7*
- ID_OUI_FROM_DATABASE=Conceptronic
+OUI:000F74*
+ ID_OUI_FROM_DATABASE=Qamcom Technology AB
 
-OUI:0022EA*
- ID_OUI_FROM_DATABASE=Rustelcom Inc.
+OUI:000F7B*
+ ID_OUI_FROM_DATABASE=Arce Sistemas, S.A.
 
-OUI:0022F0*
- ID_OUI_FROM_DATABASE=3 Greens Aviation Limited
+OUI:000F68*
+ ID_OUI_FROM_DATABASE=Vavic Network Technology, Inc.
 
-OUI:0022E9*
- ID_OUI_FROM_DATABASE=ProVision Communications
+OUI:000F6F*
+ ID_OUI_FROM_DATABASE=FTA Communication Technologies
 
-OUI:00211C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000F62*
+ ID_OUI_FROM_DATABASE=Alcatel Bell Space N.V.
 
-OUI:002117*
- ID_OUI_FROM_DATABASE=Tellord
+OUI:000F5C*
+ ID_OUI_FROM_DATABASE=Day One Digital Media Limited
 
-OUI:002110*
- ID_OUI_FROM_DATABASE=Clearbox Systems
+OUI:000F55*
+ ID_OUI_FROM_DATABASE=Datawire Communication Networks Inc.
 
-OUI:002106*
- ID_OUI_FROM_DATABASE=RIM Testing Services
+OUI:000F49*
+ ID_OUI_FROM_DATABASE=Northover Solutions Limited
 
-OUI:001FFF*
- ID_OUI_FROM_DATABASE=Respironics, Inc.
+OUI:000F50*
+ ID_OUI_FROM_DATABASE=StreamScale Limited
 
-OUI:001FFE*
- ID_OUI_FROM_DATABASE=HPN Supply Chain
+OUI:000F42*
+ ID_OUI_FROM_DATABASE=Xalyo Systems
 
-OUI:001FF8*
- ID_OUI_FROM_DATABASE=Siemens AG, Sector Industry, Drive Technologies, Motion Control Systems
+OUI:000F1C*
+ ID_OUI_FROM_DATABASE=DigitAll World Co., Ltd
 
-OUI:001FFD*
- ID_OUI_FROM_DATABASE=Indigo Mobile Technologies Corp.
+OUI:000F0A*
+ ID_OUI_FROM_DATABASE=Clear Edge Networks
 
-OUI:002221*
- ID_OUI_FROM_DATABASE=ITOH DENKI CO,LTD.
+OUI:000F09*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:00221B*
- ID_OUI_FROM_DATABASE=Morega Systems
+OUI:000F03*
+ ID_OUI_FROM_DATABASE=COM&C CO., LTD
 
-OUI:002220*
- ID_OUI_FROM_DATABASE=Mitac Technology Corp
+OUI:000EF7*
+ ID_OUI_FROM_DATABASE=Vulcan Portals Inc
 
-OUI:002227*
- ID_OUI_FROM_DATABASE=uv-electronic GmbH
+OUI:000EFC*
+ ID_OUI_FROM_DATABASE=JTAG Technologies B.V.
 
-OUI:002214*
- ID_OUI_FROM_DATABASE=RINNAI KOREA
+OUI:000EE9*
+ ID_OUI_FROM_DATABASE=WayTech Development, Inc.
 
-OUI:00220E*
- ID_OUI_FROM_DATABASE=Indigo Security Co., Ltd.
+OUI:000EF0*
+ ID_OUI_FROM_DATABASE=Festo AG & Co. KG
 
-OUI:002208*
- ID_OUI_FROM_DATABASE=Certicom Corp
+OUI:000F35*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:002201*
- ID_OUI_FROM_DATABASE=Aksys Networks Inc
+OUI:000F2E*
+ ID_OUI_FROM_DATABASE=Megapower International Corp.
 
-OUI:0021F7*
- ID_OUI_FROM_DATABASE=HPN Supply Chain
+OUI:000F29*
+ ID_OUI_FROM_DATABASE=Augmentix Corporation
 
-OUI:0021A0*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000F22*
+ ID_OUI_FROM_DATABASE=Helius, Inc.
 
-OUI:00219C*
- ID_OUI_FROM_DATABASE=Honeywld Technology Corp.
+OUI:000F0F*
+ ID_OUI_FROM_DATABASE=Real ID Technology Co., Ltd.
 
-OUI:002192*
- ID_OUI_FROM_DATABASE=Baoding Galaxy Electronic Technology  Co.,Ltd
+OUI:000F16*
+ ID_OUI_FROM_DATABASE=JAY HOW TECHNOLOGY CO.,
 
-OUI:00218C*
- ID_OUI_FROM_DATABASE=TopControl GMBH
+OUI:000F1B*
+ ID_OUI_FROM_DATABASE=Ego Systems Inc.
+
+OUI:000D74*
+ ID_OUI_FROM_DATABASE=Sand Network Systems, Inc.
+
+OUI:000D7B*
+ ID_OUI_FROM_DATABASE=Consensys Computers Inc.
+
+OUI:000D6E*
+ ID_OUI_FROM_DATABASE=K-Patents Oy
 
-OUI:00217F*
- ID_OUI_FROM_DATABASE=Intraco Technology Pte Ltd
+OUI:000D68*
+ ID_OUI_FROM_DATABASE=Vinci Systems, Inc.
 
-OUI:00217A*
- ID_OUI_FROM_DATABASE=Sejin Electron, Inc.
+OUI:000D6D*
+ ID_OUI_FROM_DATABASE=K-Tech Devices Corp.
 
-OUI:002179*
- ID_OUI_FROM_DATABASE=IOGEAR, Inc.
+OUI:000D5B*
+ ID_OUI_FROM_DATABASE=Smart Empire Investments Limited
 
-OUI:002173*
- ID_OUI_FROM_DATABASE=Ion Torrent Systems, Inc.
+OUI:000D5C*
+ ID_OUI_FROM_DATABASE=Robert Bosch GmbH, VT-ATMO
 
-OUI:001FC3*
- ID_OUI_FROM_DATABASE=SmartSynch, Inc
+OUI:000D61*
+ ID_OUI_FROM_DATABASE=Giga-Byte Technology Co., Ltd.
 
-OUI:001FC8*
- ID_OUI_FROM_DATABASE=Up-Today Industrial Co., Ltd.
+OUI:000D55*
+ ID_OUI_FROM_DATABASE=SANYCOM Technology Co.,Ltd
 
-OUI:001FC1*
- ID_OUI_FROM_DATABASE=Hanlong Technology Co.,LTD
+OUI:000D49*
+ ID_OUI_FROM_DATABASE=Triton Systems of Delaware, Inc.
 
-OUI:001FC2*
- ID_OUI_FROM_DATABASE=Jow Tong Technology Co Ltd
+OUI:000D4E*
+ ID_OUI_FROM_DATABASE=NDR Co.,LTD.
 
-OUI:001FBC*
- ID_OUI_FROM_DATABASE=EVGA Corporation
+OUI:000E5B*
+ ID_OUI_FROM_DATABASE=ParkerVision - Direct2Data
 
-OUI:001FB0*
- ID_OUI_FROM_DATABASE=TimeIPS, Inc.
+OUI:000E55*
+ ID_OUI_FROM_DATABASE=AUVITRAN
 
-OUI:001FB5*
- ID_OUI_FROM_DATABASE=I/O Interconnect Inc.
+OUI:000E56*
+ ID_OUI_FROM_DATABASE=4G Systems GmbH & Co. KG
 
-OUI:001FA9*
- ID_OUI_FROM_DATABASE=Atlanta DTH, Inc.
+OUI:000E4F*
+ ID_OUI_FROM_DATABASE=Trajet GmbH
 
-OUI:0021F1*
- ID_OUI_FROM_DATABASE=Tutus Data AB
+OUI:000E48*
+ ID_OUI_FROM_DATABASE=Lipman TransAction Solutions
 
-OUI:0021F2*
- ID_OUI_FROM_DATABASE=EASY3CALL Technology Limited
+OUI:000E43*
+ ID_OUI_FROM_DATABASE=G-Tek Electronics Sdn. Bhd.
 
-OUI:0021EB*
- ID_OUI_FROM_DATABASE=ESP SYSTEMS, LLC
+OUI:000E34*
+ ID_OUI_FROM_DATABASE=NexGen City, LP
 
-OUI:0021E5*
- ID_OUI_FROM_DATABASE=Display Solution AG
+OUI:000E3B*
+ ID_OUI_FROM_DATABASE=Hawking Technologies, Inc.
 
-OUI:0021E4*
- ID_OUI_FROM_DATABASE=I-WIN
+OUI:000E2F*
+ ID_OUI_FROM_DATABASE=Roche Diagnostics GmbH
 
-OUI:0021DF*
- ID_OUI_FROM_DATABASE=Martin Christ GmbH
+OUI:000DFB*
+ ID_OUI_FROM_DATABASE=Komax AG
 
-OUI:0021D8*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000DE9*
+ ID_OUI_FROM_DATABASE=Napatech Aps
 
-OUI:0021CC*
- ID_OUI_FROM_DATABASE=Flextronics International
+OUI:000DEE*
+ ID_OUI_FROM_DATABASE=Andrew RF Power Amplifier Group
 
-OUI:001FF1*
- ID_OUI_FROM_DATABASE=Paradox Hellas S.A.
+OUI:000DE2*
+ ID_OUI_FROM_DATABASE=CMZ Sistemi Elettronici
 
-OUI:001FEC*
- ID_OUI_FROM_DATABASE=Synapse Électronique
+OUI:000DDC*
+ ID_OUI_FROM_DATABASE=VAC
 
-OUI:001FE5*
- ID_OUI_FROM_DATABASE=In-Circuit GmbH
+OUI:000DD6*
+ ID_OUI_FROM_DATABASE=ITI    LTD
 
-OUI:001FD9*
- ID_OUI_FROM_DATABASE=RSD Communications Ltd
+OUI:000DDB*
+ ID_OUI_FROM_DATABASE=AIRWAVE TECHNOLOGIES INC.
 
-OUI:001FD4*
- ID_OUI_FROM_DATABASE=4IPNET, INC.
+OUI:000DCA*
+ ID_OUI_FROM_DATABASE=Tait Electronics
 
-OUI:001FCF*
- ID_OUI_FROM_DATABASE=MSI Technology GmbH
+OUI:000DCF*
+ ID_OUI_FROM_DATABASE=Cidra Corp.
 
-OUI:00213F*
- ID_OUI_FROM_DATABASE=A-Team Technology Ltd.
+OUI:000E28*
+ ID_OUI_FROM_DATABASE=Dynamic Ratings P/L
 
-OUI:002139*
- ID_OUI_FROM_DATABASE=Escherlogic Inc.
+OUI:000E22*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:002134*
- ID_OUI_FROM_DATABASE=Brandywine Communications
+OUI:000E21*
+ ID_OUI_FROM_DATABASE=MTU Friedrichshafen GmbH
 
-OUI:00212F*
- ID_OUI_FROM_DATABASE=Phoebe Micro Inc.
+OUI:000E15*
+ ID_OUI_FROM_DATABASE=Tadlys LTD
 
-OUI:002129*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:000E1C*
+ ID_OUI_FROM_DATABASE=Hach Company
 
-OUI:00212A*
- ID_OUI_FROM_DATABASE=Audiovox Corporation
+OUI:000E0D*
+ ID_OUI_FROM_DATABASE=Hesch Schröder GmbH
 
-OUI:002123*
- ID_OUI_FROM_DATABASE=Aerosat Avionics
+OUI:000E10*
+ ID_OUI_FROM_DATABASE=C-guys, Inc.
 
-OUI:00216D*
- ID_OUI_FROM_DATABASE=Soltech Co., Ltd.
+OUI:000DF5*
+ ID_OUI_FROM_DATABASE=Teletronics International Inc.
 
-OUI:00216C*
- ID_OUI_FROM_DATABASE=ODVA
+OUI:000DFC*
+ ID_OUI_FROM_DATABASE=ITFOR Inc.
 
-OUI:002167*
- ID_OUI_FROM_DATABASE=HWA JIN T&I Corp.
+OUI:000E01*
+ ID_OUI_FROM_DATABASE=ASIP Technologies Inc.
 
-OUI:002160*
- ID_OUI_FROM_DATABASE=Hidea Solutions Co. Ltd.
+OUI:000CF0*
+ ID_OUI_FROM_DATABASE=M & N GmbH
 
-OUI:002154*
- ID_OUI_FROM_DATABASE=D-TACQ Solutions Ltd
+OUI:000CF5*
+ ID_OUI_FROM_DATABASE=InfoExpress
 
-OUI:00214D*
- ID_OUI_FROM_DATABASE=Guangzhou Skytone Transmission Technology Com. Ltd.
+OUI:000CE0*
+ ID_OUI_FROM_DATABASE=Trek Diagnostics Inc.
 
-OUI:002148*
- ID_OUI_FROM_DATABASE=Kaco Solar Korea
+OUI:000CE4*
+ ID_OUI_FROM_DATABASE=NeuroCom International, Inc.
 
-OUI:0021C5*
- ID_OUI_FROM_DATABASE=3DSP Corp
+OUI:000CE9*
+ ID_OUI_FROM_DATABASE=BLOOMBERG L.P.
 
-OUI:0021BF*
- ID_OUI_FROM_DATABASE=Hitachi High-Tech Control Systems Corporation
+OUI:000CCE*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0021C0*
- ID_OUI_FROM_DATABASE=Mobile Appliance, Inc.
+OUI:000CD4*
+ ID_OUI_FROM_DATABASE=Positron Public Safety Systems inc.
 
-OUI:0021B9*
- ID_OUI_FROM_DATABASE=Universal Devices Inc.
+OUI:000CCD*
+ ID_OUI_FROM_DATABASE=IEC - TC57
 
-OUI:0021B3*
- ID_OUI_FROM_DATABASE=Ross Controls
+OUI:000D15*
+ ID_OUI_FROM_DATABASE=Voipac s.r.o.
 
-OUI:0021B2*
- ID_OUI_FROM_DATABASE=Fiberblaze A/S
+OUI:000D16*
+ ID_OUI_FROM_DATABASE=UHS Systems Pty Ltd
 
-OUI:0021AD*
- ID_OUI_FROM_DATABASE=Nordic ID Oy
+OUI:000D1B*
+ ID_OUI_FROM_DATABASE=Kyoto Electronics Manufacturing Co., Ltd.
 
-OUI:0021A6*
- ID_OUI_FROM_DATABASE=Videotec Spa
+OUI:000D0F*
+ ID_OUI_FROM_DATABASE=Finlux Ltd
 
-OUI:001F11*
- ID_OUI_FROM_DATABASE=OPENMOKO, INC.
+OUI:000D03*
+ ID_OUI_FROM_DATABASE=Matrics, Inc.
 
-OUI:001F0B*
- ID_OUI_FROM_DATABASE=Federal State Unitary Enterprise Industrial UnionElectropribor
+OUI:000D08*
+ ID_OUI_FROM_DATABASE=AboveCable, Inc.
 
-OUI:001EFF*
- ID_OUI_FROM_DATABASE=Mueller-Elektronik GmbH & Co. KG
+OUI:000CFC*
+ ID_OUI_FROM_DATABASE=S2io Technologies Corp
 
-OUI:001F06*
- ID_OUI_FROM_DATABASE=Integrated Dispatch Solutions
+OUI:000CF6*
+ ID_OUI_FROM_DATABASE=Sitecom Europe BV
 
-OUI:001F05*
- ID_OUI_FROM_DATABASE=iTAS Technology Corp.
+OUI:000DA3*
+ ID_OUI_FROM_DATABASE=Emerging Technologies Limited
 
-OUI:001EF3*
- ID_OUI_FROM_DATABASE=From2
+OUI:000D9C*
+ ID_OUI_FROM_DATABASE=Elan GmbH & Co KG
 
-OUI:001EF8*
- ID_OUI_FROM_DATABASE=Emfinity Inc.
+OUI:000D96*
+ ID_OUI_FROM_DATABASE=Vtera Technology Inc.
 
-OUI:001F7A*
- ID_OUI_FROM_DATABASE=WiWide Inc.
+OUI:000D95*
+ ID_OUI_FROM_DATABASE=Opti-cell, Inc.
 
-OUI:001F70*
- ID_OUI_FROM_DATABASE=Botik Technologies LTD
+OUI:000D90*
+ ID_OUI_FROM_DATABASE=Factum Electronics AB
 
-OUI:001F75*
- ID_OUI_FROM_DATABASE=GiBahn Media
+OUI:000D89*
+ ID_OUI_FROM_DATABASE=Bils Technology Inc
 
-OUI:001F64*
- ID_OUI_FROM_DATABASE=Beijing Autelan Technology Inc.
+OUI:000D80*
+ ID_OUI_FROM_DATABASE=Online Development Inc
 
-OUI:001F5E*
- ID_OUI_FROM_DATABASE=Dyna Technology Co.,Ltd.
+OUI:000DC9*
+ ID_OUI_FROM_DATABASE=THALES Elektronik Systeme GmbH
 
-OUI:001F58*
- ID_OUI_FROM_DATABASE=EMH Energiemesstechnik GmbH
+OUI:000DC3*
+ ID_OUI_FROM_DATABASE=First Communication, Inc.
 
-OUI:001F4C*
- ID_OUI_FROM_DATABASE=Roseman Engineering Ltd
+OUI:000DBC*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001F51*
- ID_OUI_FROM_DATABASE=HD Communications Corp
+OUI:000DB7*
+ ID_OUI_FROM_DATABASE=SANKO ELECTRIC CO,.LTD
 
-OUI:001F4B*
- ID_OUI_FROM_DATABASE=Lineage Power
+OUI:000DB0*
+ ID_OUI_FROM_DATABASE=Olym-tech Co.,Ltd.
 
-OUI:001F9F*
- ID_OUI_FROM_DATABASE=Thomson Telecom Belgium
+OUI:000DA8*
+ ID_OUI_FROM_DATABASE=Teletronics Technology Corporation
 
-OUI:001F93*
- ID_OUI_FROM_DATABASE=Xiotech Corporation
+OUI:000D41*
+ ID_OUI_FROM_DATABASE=Siemens AG ICM MP UC RD IT KLF1
 
-OUI:001F98*
- ID_OUI_FROM_DATABASE=DAIICHI-DENTSU LTD.
+OUI:000D3A*
+ ID_OUI_FROM_DATABASE=Microsoft Corp.
 
-OUI:001F8C*
- ID_OUI_FROM_DATABASE=CCS Inc.
+OUI:000D35*
+ ID_OUI_FROM_DATABASE=PAC International Ltd
 
-OUI:001F8A*
- ID_OUI_FROM_DATABASE=Ellion Digital Inc.
+OUI:000D2E*
+ ID_OUI_FROM_DATABASE=Matsushita Avionics Systems Corporation
 
-OUI:001F83*
- ID_OUI_FROM_DATABASE=Teleplan Technology Services Sdn Bhd
+OUI:000D28*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001E30*
- ID_OUI_FROM_DATABASE=Shireen Inc
+OUI:000D22*
+ ID_OUI_FROM_DATABASE=Unitronics LTD
 
-OUI:001E2B*
- ID_OUI_FROM_DATABASE=Radio Systems Design, Inc.
+OUI:000D27*
+ ID_OUI_FROM_DATABASE=MICROPLEX Printware AG
 
-OUI:001E24*
- ID_OUI_FROM_DATABASE=Zhejiang Bell Technology Co.,ltd
+OUI:000C21*
+ ID_OUI_FROM_DATABASE=Faculty of Science and Technology, Keio University
 
-OUI:001E18*
- ID_OUI_FROM_DATABASE=Radio Activity srl
+OUI:000C11*
+ ID_OUI_FROM_DATABASE=NIPPON DEMPA CO.,LTD.
 
-OUI:001E1D*
- ID_OUI_FROM_DATABASE=East Coast Datacom, Inc.
+OUI:000C10*
+ ID_OUI_FROM_DATABASE=PNI Corporation
 
-OUI:001E1E*
- ID_OUI_FROM_DATABASE=Honeywell Life Safety
+OUI:000C12*
+ ID_OUI_FROM_DATABASE=Micro-Optronic-Messtechnik GmbH
 
-OUI:001E13*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000C17*
+ ID_OUI_FROM_DATABASE=AJA Video Systems Inc
 
-OUI:001E0E*
- ID_OUI_FROM_DATABASE=MAXI VIEW HOLDINGS LIMITED
+OUI:000C04*
+ ID_OUI_FROM_DATABASE=Tecnova
 
-OUI:001E60*
- ID_OUI_FROM_DATABASE=Digital Lighting Systems, Inc
+OUI:000C0B*
+ ID_OUI_FROM_DATABASE=Broadbus Technologies
 
-OUI:001E59*
- ID_OUI_FROM_DATABASE=Silicon Turnkey Express, LLC
+OUI:000BF8*
+ ID_OUI_FROM_DATABASE=Infinera
 
-OUI:001E54*
- ID_OUI_FROM_DATABASE=TOYO ELECTRIC Corporation
+OUI:000BFF*
+ ID_OUI_FROM_DATABASE=Berkeley Camera Engineering
 
-OUI:001E4D*
- ID_OUI_FROM_DATABASE=Welkin Sciences, LLC
+OUI:000BEC*
+ ID_OUI_FROM_DATABASE=NIPPON ELECTRIC INSTRUMENT, INC.
 
-OUI:001E48*
- ID_OUI_FROM_DATABASE=Wi-Links
+OUI:000BB8*
+ ID_OUI_FROM_DATABASE=Kihoku Electronic Co.
 
-OUI:001E43*
- ID_OUI_FROM_DATABASE=AISIN AW CO.,LTD.
+OUI:000BBD*
+ ID_OUI_FROM_DATABASE=Connexionz Limited
 
-OUI:001E3E*
- ID_OUI_FROM_DATABASE=KMW Inc.
+OUI:000BAD*
+ ID_OUI_FROM_DATABASE=PC-PoS Inc.
 
-OUI:001EC3*
- ID_OUI_FROM_DATABASE=Kozio, Inc.
+OUI:000BA0*
+ ID_OUI_FROM_DATABASE=T&L Information Inc.
 
-OUI:001EBC*
- ID_OUI_FROM_DATABASE=WINTECH AUTOMATION CO.,LTD.
+OUI:000BA7*
+ ID_OUI_FROM_DATABASE=Maranti Networks
 
-OUI:001EB7*
- ID_OUI_FROM_DATABASE=TBTech, Co., Ltd.
+OUI:000BAC*
+ ID_OUI_FROM_DATABASE=3Com Ltd
 
-OUI:001EB0*
- ID_OUI_FROM_DATABASE=ImesD Electronica S.L.
+OUI:000B93*
+ ID_OUI_FROM_DATABASE=Ritter Elektronik
 
-OUI:001EA5*
- ID_OUI_FROM_DATABASE=ROBOTOUS, Inc.
+OUI:000B98*
+ ID_OUI_FROM_DATABASE=NiceTechVision
 
-OUI:001EAB*
- ID_OUI_FROM_DATABASE=TeleWell Oy
+OUI:000B9B*
+ ID_OUI_FROM_DATABASE=Sirius System Co, Ltd.
 
-OUI:001E9E*
- ID_OUI_FROM_DATABASE=ddm hopt + schuler Gmbh + Co. KG
+OUI:000B8C*
+ ID_OUI_FROM_DATABASE=Flextronics
 
-OUI:001E99*
- ID_OUI_FROM_DATABASE=Vantanol Industrial Corporation
+OUI:000BF1*
+ ID_OUI_FROM_DATABASE=LAP Laser Applikations
 
-OUI:001F36*
- ID_OUI_FROM_DATABASE=Bellwin Information Co. Ltd.,
+OUI:000BDF*
+ ID_OUI_FROM_DATABASE=Shenzhen RouterD Networks Limited
 
-OUI:001F35*
- ID_OUI_FROM_DATABASE=AIR802 LLC
+OUI:000BDE*
+ ID_OUI_FROM_DATABASE=TELDIX GmbH
 
-OUI:001F30*
- ID_OUI_FROM_DATABASE=Travelping
+OUI:000BE0*
+ ID_OUI_FROM_DATABASE=SercoNet Ltd.
 
-OUI:001F23*
- ID_OUI_FROM_DATABASE=Interacoustics
+OUI:000BE5*
+ ID_OUI_FROM_DATABASE=HIMS International Corporation
 
-OUI:001F24*
- ID_OUI_FROM_DATABASE=DIGITVIEW TECHNOLOGY CO., LTD.
+OUI:000BD9*
+ ID_OUI_FROM_DATABASE=General Hydrogen
 
-OUI:001F1D*
- ID_OUI_FROM_DATABASE=Atlas Material Testing Technology LLC
+OUI:000BAE*
+ ID_OUI_FROM_DATABASE=Vitals System Inc.
 
-OUI:001E92*
- ID_OUI_FROM_DATABASE=JEULIN S.A.
+OUI:000BD0*
+ ID_OUI_FROM_DATABASE=XiMeta Technology Americas Inc.
 
-OUI:001E89*
- ID_OUI_FROM_DATABASE=CRFS Limited
+OUI:000BD5*
+ ID_OUI_FROM_DATABASE=Nvergence, Inc.
 
-OUI:001E84*
- ID_OUI_FROM_DATABASE=Pika Technologies Inc.
+OUI:000BC4*
+ ID_OUI_FROM_DATABASE=BIOTRONIK GmbH & Co
 
-OUI:001E83*
- ID_OUI_FROM_DATABASE=LAN/MAN Standards Association (LMSC)
+OUI:000BC9*
+ ID_OUI_FROM_DATABASE=Electroline Equipment
 
-OUI:001E6C*
- ID_OUI_FROM_DATABASE=Opaque Systems
+OUI:000BB1*
+ ID_OUI_FROM_DATABASE=Super Star Technology Co., Ltd.
 
-OUI:001EE6*
- ID_OUI_FROM_DATABASE=Shenzhen Advanced Video Info-Tech Co., Ltd.
+OUI:000BB6*
+ ID_OUI_FROM_DATABASE=Metalligence Technology Corp.
 
-OUI:001EE0*
- ID_OUI_FROM_DATABASE=Urmet Domus SpA
+OUI:000B79*
+ ID_OUI_FROM_DATABASE=X-COM, Inc.
 
-OUI:001EDB*
- ID_OUI_FROM_DATABASE=Giken Trastem Co., Ltd.
+OUI:000B80*
+ ID_OUI_FROM_DATABASE=Lycium Networks
 
-OUI:001ED6*
- ID_OUI_FROM_DATABASE=Alentec & Orion AB
+OUI:000B87*
+ ID_OUI_FROM_DATABASE=American Reliance Inc.
 
-OUI:001ECF*
- ID_OUI_FROM_DATABASE=PHILIPS ELECTRONICS UK LTD
+OUI:000B6D*
+ ID_OUI_FROM_DATABASE=SOLECTRON JAPAN NAKANIIDA
 
-OUI:001C96*
- ID_OUI_FROM_DATABASE=Linkwise Technology Pte Ltd
+OUI:000B74*
+ ID_OUI_FROM_DATABASE=Kingwave Technology Co., Ltd.
 
-OUI:001C91*
- ID_OUI_FROM_DATABASE=Gefen Inc.
+OUI:000B67*
+ ID_OUI_FROM_DATABASE=Topview Technology Corporation
 
-OUI:001C8A*
- ID_OUI_FROM_DATABASE=Cirrascale Corporation
+OUI:000B61*
+ ID_OUI_FROM_DATABASE=Friedrich Lütze GmbH & Co. KG
 
-OUI:001C84*
- ID_OUI_FROM_DATABASE=STL Solution Co.,Ltd.
+OUI:000B66*
+ ID_OUI_FROM_DATABASE=Teralink Communications
 
-OUI:001C80*
- ID_OUI_FROM_DATABASE=New Business Division/Rhea-Information CO., LTD.
+OUI:000B68*
+ ID_OUI_FROM_DATABASE=Addvalue Communications Pte Ltd
 
-OUI:001C76*
- ID_OUI_FROM_DATABASE=The Wandsworth Group Ltd
+OUI:000B58*
+ ID_OUI_FROM_DATABASE=Astronautics C.A  LTD
 
-OUI:001C6F*
- ID_OUI_FROM_DATABASE=Emfit Ltd
+OUI:000B50*
+ ID_OUI_FROM_DATABASE=Oxygnet
 
-OUI:001C71*
- ID_OUI_FROM_DATABASE=Emergent Electronics
+OUI:000B44*
+ ID_OUI_FROM_DATABASE=Concord IDea Corp.
 
-OUI:001C70*
- ID_OUI_FROM_DATABASE=NOVACOMM LTDA
+OUI:000B49*
+ ID_OUI_FROM_DATABASE=RF-Link System Inc.
 
-OUI:001C6A*
- ID_OUI_FROM_DATABASE=Weiss Engineering Ltd.
+OUI:000B4B*
+ ID_OUI_FROM_DATABASE=VISIOWAVE SA
 
-OUI:001D59*
- ID_OUI_FROM_DATABASE=Mitra Energy & Infrastructure
+OUI:000B31*
+ ID_OUI_FROM_DATABASE=Yantai ZhiYang Scientific and technology industry CO., LTD
 
-OUI:001D52*
- ID_OUI_FROM_DATABASE=Defzone B.V.
+OUI:000B3D*
+ ID_OUI_FROM_DATABASE=CONTAL OK Ltd.
 
-OUI:001D4C*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent
+OUI:000B38*
+ ID_OUI_FROM_DATABASE=Knürr GmbH
 
-OUI:001D48*
- ID_OUI_FROM_DATABASE=Sensor-Technik Wiedemann GmbH
+OUI:000B2A*
+ ID_OUI_FROM_DATABASE=HOWTEL Co., Ltd.
 
-OUI:001D41*
- ID_OUI_FROM_DATABASE=Hardy Instruments
+OUI:000B2C*
+ ID_OUI_FROM_DATABASE=Eiki Industrial Co. Ltd.
 
-OUI:001D3C*
- ID_OUI_FROM_DATABASE=Muscle Corporation
+OUI:000C97*
+ ID_OUI_FROM_DATABASE=NV ADB TTV Technologies SA
 
-OUI:001D30*
- ID_OUI_FROM_DATABASE=YX Wireless S.A.
+OUI:000C9C*
+ ID_OUI_FROM_DATABASE=Chongho information & communications
 
-OUI:001D35*
- ID_OUI_FROM_DATABASE=Viconics Electronics Inc.
+OUI:000C9E*
+ ID_OUI_FROM_DATABASE=MemoryLink Corp.
 
-OUI:001D2F*
- ID_OUI_FROM_DATABASE=QuantumVision Corporation
+OUI:000C89*
+ ID_OUI_FROM_DATABASE=AC Electric Vehicles, Ltd.
 
-OUI:001CD3*
- ID_OUI_FROM_DATABASE=ZP Engineering SEL
+OUI:000C8B*
+ ID_OUI_FROM_DATABASE=Connect Tech Inc
 
-OUI:001CCE*
- ID_OUI_FROM_DATABASE=By Techdesign
+OUI:000C90*
+ ID_OUI_FROM_DATABASE=Octasic Inc.
 
-OUI:001CC7*
- ID_OUI_FROM_DATABASE=Rembrandt Technologies, LLC d/b/a REMSTREAM
+OUI:000C84*
+ ID_OUI_FROM_DATABASE=Eazix, Inc.
 
-OUI:001CC2*
- ID_OUI_FROM_DATABASE=Part II Research, Inc.
+OUI:000C75*
+ ID_OUI_FROM_DATABASE=Oriental integrated electronics. LTD
 
-OUI:001CBB*
- ID_OUI_FROM_DATABASE=MusicianLink
+OUI:000C77*
+ ID_OUI_FROM_DATABASE=Life Racing Ltd
 
-OUI:001CB1*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000C7C*
+ ID_OUI_FROM_DATABASE=Internet Information Image Inc.
 
-OUI:001CB7*
- ID_OUI_FROM_DATABASE=USC DigiArk Corporation
+OUI:000C43*
+ ID_OUI_FROM_DATABASE=Ralink Technology, Corp.
 
-OUI:001CA3*
- ID_OUI_FROM_DATABASE=Terra
+OUI:000C45*
+ ID_OUI_FROM_DATABASE=Animation Technologies Inc.
 
-OUI:001CA5*
- ID_OUI_FROM_DATABASE=Zygo Corporation
+OUI:000C3C*
+ ID_OUI_FROM_DATABASE=MediaChorus, Inc.
 
-OUI:001CAA*
- ID_OUI_FROM_DATABASE=Bellon Pty Ltd
+OUI:000C32*
+ ID_OUI_FROM_DATABASE=Avionic Design Development GmbH
 
-OUI:001C9D*
- ID_OUI_FROM_DATABASE=Liecthi AG
+OUI:000C35*
+ ID_OUI_FROM_DATABASE=KaVo Dental GmbH & Co. KG
 
-OUI:001DCA*
- ID_OUI_FROM_DATABASE=PAV Electronics Limited
+OUI:000C2B*
+ ID_OUI_FROM_DATABASE=ELIAS Technology, Inc.
 
-OUI:001DC4*
- ID_OUI_FROM_DATABASE=AIOI Systems Co., Ltd.
+OUI:000C28*
+ ID_OUI_FROM_DATABASE=RIFATRON
 
-OUI:001DC3*
- ID_OUI_FROM_DATABASE=RIKOR TV, Ltd
+OUI:000C1C*
+ ID_OUI_FROM_DATABASE=MicroWeb Co., Ltd.
 
-OUI:001DB1*
- ID_OUI_FROM_DATABASE=Crescendo Networks
+OUI:000C64*
+ ID_OUI_FROM_DATABASE=X2 MSA Group
 
-OUI:001DB2*
- ID_OUI_FROM_DATABASE=HOKKAIDO ELECTRIC ENGINEERING CO.,LTD.
+OUI:000C69*
+ ID_OUI_FROM_DATABASE=National Radio Astronomy Observatory
 
-OUI:001DB7*
- ID_OUI_FROM_DATABASE=Tendril Networks, Inc.
+OUI:000C70*
+ ID_OUI_FROM_DATABASE=ACC GmbH
 
-OUI:001DAD*
- ID_OUI_FROM_DATABASE=Sinotech Engineering Consultants, Inc.  Geotechnical Enginee
+OUI:000C51*
+ ID_OUI_FROM_DATABASE=Scientific Technologies Inc.
 
-OUI:001DA8*
- ID_OUI_FROM_DATABASE=Takahata Electronics Co.,Ltd
+OUI:000C56*
+ ID_OUI_FROM_DATABASE=Megatel Computer (1986) Corp.
 
-OUI:001DA7*
- ID_OUI_FROM_DATABASE=Seamless Internet
+OUI:000C58*
+ ID_OUI_FROM_DATABASE=M&S Systems
 
-OUI:001DA1*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000C5D*
+ ID_OUI_FROM_DATABASE=CHIC TECHNOLOGY (CHINA) CORP.
 
-OUI:001D9A*
- ID_OUI_FROM_DATABASE=GODEX INTERNATIONAL CO., LTD
+OUI:000C4A*
+ ID_OUI_FROM_DATABASE=Cygnus Microsystems (P) Limited
 
-OUI:001D95*
- ID_OUI_FROM_DATABASE=Flash, Inc.
+OUI:000CC8*
+ ID_OUI_FROM_DATABASE=Xytronix Research & Design, Inc.
 
-OUI:001D8E*
- ID_OUI_FROM_DATABASE=Alereon, Inc.
+OUI:000CBB*
+ ID_OUI_FROM_DATABASE=ISKRAEMECO
 
-OUI:001D87*
- ID_OUI_FROM_DATABASE=VigTech Labs Sdn Bhd
+OUI:000CB5*
+ ID_OUI_FROM_DATABASE=Premier Technolgies, Inc
 
-OUI:001D88*
- ID_OUI_FROM_DATABASE=Clearwire
+OUI:000CBC*
+ ID_OUI_FROM_DATABASE=Iscutum
 
-OUI:001D7E*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:000CA3*
+ ID_OUI_FROM_DATABASE=Rancho Technology, Inc.
 
-OUI:001D7D*
- ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
+OUI:000CAA*
+ ID_OUI_FROM_DATABASE=Cubic Transportation Systems Inc
 
-OUI:001D6C*
- ID_OUI_FROM_DATABASE=ClariPhy Communications, Inc.
+OUI:000A38*
+ ID_OUI_FROM_DATABASE=Apani Networks
 
-OUI:001D71*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000A3F*
+ ID_OUI_FROM_DATABASE=Data East Corporation
 
-OUI:001D78*
- ID_OUI_FROM_DATABASE=Invengo Information Technology Co.,Ltd
+OUI:000A44*
+ ID_OUI_FROM_DATABASE=Avery Dennison Deutschland GmbH
 
-OUI:001D65*
- ID_OUI_FROM_DATABASE=Microwave Radio Communications
+OUI:000A46*
+ ID_OUI_FROM_DATABASE=ARO WELDING TECHNOLOGIES SAS
 
-OUI:001D5E*
- ID_OUI_FROM_DATABASE=COMING MEDIA CORP.
+OUI:000A33*
+ ID_OUI_FROM_DATABASE=Emulex Corporation
 
-OUI:001D29*
- ID_OUI_FROM_DATABASE=Doro AB
+OUI:000A31*
+ ID_OUI_FROM_DATABASE=HCV Consulting
 
-OUI:001D22*
- ID_OUI_FROM_DATABASE=Foss Analytical A/S
+OUI:000A2C*
+ ID_OUI_FROM_DATABASE=Active Tchnology Corporation
 
-OUI:001D1D*
- ID_OUI_FROM_DATABASE=Inter-M Corporation
+OUI:004252*
+ ID_OUI_FROM_DATABASE=RLX Technologies
 
-OUI:001D16*
- ID_OUI_FROM_DATABASE=SFR
+OUI:000A2A*
+ ID_OUI_FROM_DATABASE=QSI Systems Inc.
 
-OUI:001D10*
- ID_OUI_FROM_DATABASE=LightHaus Logic, Inc.
+OUI:000A1E*
+ ID_OUI_FROM_DATABASE=Red-M Products Limited
 
-OUI:001D0A*
- ID_OUI_FROM_DATABASE=Davis Instruments, Inc.
+OUI:000A23*
+ ID_OUI_FROM_DATABASE=Parama Networks Inc
 
-OUI:001D03*
- ID_OUI_FROM_DATABASE=Design Solutions Inc.
+OUI:000A17*
+ ID_OUI_FROM_DATABASE=NESTAR COMMUNICATIONS, INC
 
-OUI:001CFE*
- ID_OUI_FROM_DATABASE=Quartics Inc
+OUI:000A1C*
+ ID_OUI_FROM_DATABASE=Bridge Information Co., Ltd.
 
-OUI:001CF7*
- ID_OUI_FROM_DATABASE=AudioScience
+OUI:000B19*
+ ID_OUI_FROM_DATABASE=Vernier Networks, Inc.
 
-OUI:001CE6*
- ID_OUI_FROM_DATABASE=INNES
+OUI:000B1E*
+ ID_OUI_FROM_DATABASE=KAPPA opto-electronics GmbH
 
-OUI:001CE1*
- ID_OUI_FROM_DATABASE=INDRA SISTEMAS, S.A.
+OUI:000B25*
+ ID_OUI_FROM_DATABASE=Aeluros
 
-OUI:001CDA*
- ID_OUI_FROM_DATABASE=Exegin Technologies Limited
+OUI:000B17*
+ ID_OUI_FROM_DATABASE=MKS Instruments
 
-OUI:001E07*
- ID_OUI_FROM_DATABASE=Winy Technology Co., Ltd.
+OUI:000B12*
+ ID_OUI_FROM_DATABASE=NURI Telecom Co., Ltd.
 
-OUI:001E02*
- ID_OUI_FROM_DATABASE=Sougou Keikaku Kougyou Co.,Ltd.
+OUI:000B0B*
+ ID_OUI_FROM_DATABASE=Corrent Corporation
 
-OUI:001E01*
- ID_OUI_FROM_DATABASE=Renesas Technology Sales Co., Ltd.
+OUI:000AFA*
+ ID_OUI_FROM_DATABASE=Traverse Technologies Australia
 
-OUI:001DFB*
- ID_OUI_FROM_DATABASE=NETCLEUS Systems Corporation
+OUI:000AFF*
+ ID_OUI_FROM_DATABASE=Kilchherr Elektronik AG
 
-OUI:001DF4*
- ID_OUI_FROM_DATABASE=Magellan Technology Pty Limited
+OUI:000AF3*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001DEF*
- ID_OUI_FROM_DATABASE=TRIMM, INC.
+OUI:000AF8*
+ ID_OUI_FROM_DATABASE=American Telecare Inc.
 
-OUI:001DE8*
- ID_OUI_FROM_DATABASE=Nikko Denki Tsushin Corporation(NDTC)
+OUI:000AEE*
+ ID_OUI_FROM_DATABASE=GCD Hard- & Software GmbH
 
-OUI:001DE3*
- ID_OUI_FROM_DATABASE=Intuicom
+OUI:000A06*
+ ID_OUI_FROM_DATABASE=Teledex LLC
 
-OUI:001DDD*
- ID_OUI_FROM_DATABASE=DAT H.K. LIMITED
+OUI:000A09*
+ ID_OUI_FROM_DATABASE=TaraCom Integrated Products, Inc.
 
-OUI:001AF8*
- ID_OUI_FROM_DATABASE=Copley Controls Corporation
+OUI:000A0B*
+ ID_OUI_FROM_DATABASE=Sealevel Systems, Inc.
 
-OUI:001AF3*
- ID_OUI_FROM_DATABASE=Samyoung Electronics
+OUI:000A10*
+ ID_OUI_FROM_DATABASE=FAST media integrations AG
 
-OUI:001AEE*
- ID_OUI_FROM_DATABASE=Shenztech Ltd
+OUI:0009F7*
+ ID_OUI_FROM_DATABASE=SED, a division of Calian
 
-OUI:001AE2*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000A01*
+ ID_OUI_FROM_DATABASE=SOHOware, Inc.
 
-OUI:001AE7*
- ID_OUI_FROM_DATABASE=Aztek Networks, Inc.
+OUI:0009E9*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001AD4*
- ID_OUI_FROM_DATABASE=iPOX Technology Co., Ltd.
+OUI:0009F0*
+ ID_OUI_FROM_DATABASE=Shimizu Technology Inc.
 
-OUI:001AD6*
- ID_OUI_FROM_DATABASE=JIAGNSU AETNA ELECTRIC CO.,LTD
+OUI:0009EA*
+ ID_OUI_FROM_DATABASE=YEM Inc.
 
-OUI:001B97*
- ID_OUI_FROM_DATABASE=Violin Technologies
+OUI:0009E4*
+ ID_OUI_FROM_DATABASE=K Tech Infosystem Inc.
 
-OUI:001B9C*
- ID_OUI_FROM_DATABASE=SATEL sp. z o.o.
+OUI:0009D8*
+ ID_OUI_FROM_DATABASE=Fält Communications AB
 
-OUI:001B90*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0009DD*
+ ID_OUI_FROM_DATABASE=Mavin Technology Inc.
 
-OUI:001B86*
- ID_OUI_FROM_DATABASE=Bosch Access Systems GmbH
+OUI:0009B1*
+ ID_OUI_FROM_DATABASE=Kanematsu Electronics, Ltd.
 
-OUI:001B8B*
- ID_OUI_FROM_DATABASE=NEC Platforms, Ltd.
+OUI:0009A3*
+ ID_OUI_FROM_DATABASE=Leadfly Techologies Corp. Ltd.
 
-OUI:001B7F*
- ID_OUI_FROM_DATABASE=TMN Technologies Telecomunicacoes Ltda
+OUI:0009AA*
+ ID_OUI_FROM_DATABASE=Data Comm for Business, Inc.
 
-OUI:001B81*
- ID_OUI_FROM_DATABASE=DATAQ Instruments, Inc.
+OUI:0009A4*
+ ID_OUI_FROM_DATABASE=HARTEC Corporation
 
-OUI:001B80*
- ID_OUI_FROM_DATABASE=LORD Corporation
+OUI:00099E*
+ ID_OUI_FROM_DATABASE=Testech, Inc.
 
-OUI:001B73*
- ID_OUI_FROM_DATABASE=DTL Broadcast Ltd
+OUI:000992*
+ ID_OUI_FROM_DATABASE=InterEpoch Technology,INC.
 
-OUI:001B6E*
- ID_OUI_FROM_DATABASE=Anue Systems, Inc.
+OUI:000991*
+ ID_OUI_FROM_DATABASE=GE Fanuc Automation Manufacturing, Inc.
 
-OUI:001B67*
- ID_OUI_FROM_DATABASE=Cisco Systems Inc
+OUI:00098B*
+ ID_OUI_FROM_DATABASE=Entropic Communications, Inc.
 
-OUI:001B60*
- ID_OUI_FROM_DATABASE=NAVIGON AG
+OUI:000AB0*
+ ID_OUI_FROM_DATABASE=LOYTEC electronics GmbH
 
-OUI:001B54*
+OUI:000AB7*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001B48*
- ID_OUI_FROM_DATABASE=Shenzhen Lantech Electronics Co., Ltd.
+OUI:000AA4*
+ ID_OUI_FROM_DATABASE=SHANGHAI SURVEILLANCE TECHNOLOGY CO,LTD
 
-OUI:001B4D*
- ID_OUI_FROM_DATABASE=Areca Technology Corporation
+OUI:000AA9*
+ ID_OUI_FROM_DATABASE=Brooks Automation GmbH
 
-OUI:001B41*
- ID_OUI_FROM_DATABASE=General Infinity Co.,Ltd.
+OUI:000A91*
+ ID_OUI_FROM_DATABASE=HemoCue AB
 
-OUI:001B3C*
- ID_OUI_FROM_DATABASE=Software Technologies Group,Inc.
+OUI:000A9D*
+ ID_OUI_FROM_DATABASE=King Young Technology Co. Ltd.
 
-OUI:001B35*
- ID_OUI_FROM_DATABASE=ChongQing JINOU Science & Technology Development CO.,Ltd
+OUI:000A8C*
+ ID_OUI_FROM_DATABASE=Guardware Systems Ltd.
 
-OUI:001B2E*
- ID_OUI_FROM_DATABASE=Sinkyo Electron Inc
+OUI:000A97*
+ ID_OUI_FROM_DATABASE=SONICblue, Inc.
 
-OUI:001B30*
- ID_OUI_FROM_DATABASE=Solitech Inc.
+OUI:000A7D*
+ ID_OUI_FROM_DATABASE=Valo, Inc.
 
-OUI:001BC7*
- ID_OUI_FROM_DATABASE=StarVedia Technology Inc.
+OUI:000A84*
+ ID_OUI_FROM_DATABASE=Rainsun Enterprise Co., Ltd.
 
-OUI:001BC6*
- ID_OUI_FROM_DATABASE=Strato Rechenzentrum AG
+OUI:000A89*
+ ID_OUI_FROM_DATABASE=Creval Systems, Inc.
 
-OUI:001BBB*
- ID_OUI_FROM_DATABASE=RFTech Co.,Ltd
+OUI:0009D7*
+ ID_OUI_FROM_DATABASE=DC Security Products
 
-OUI:001BB6*
- ID_OUI_FROM_DATABASE=Bird Electronic Corp.
+OUI:0009CA*
+ ID_OUI_FROM_DATABASE=iMaxNetworks(Shenzhen)Limited.
 
-OUI:001BAA*
- ID_OUI_FROM_DATABASE=XenICs nv
+OUI:0009D1*
+ ID_OUI_FROM_DATABASE=SERANOA NETWORKS INC
 
-OUI:001BA3*
- ID_OUI_FROM_DATABASE=Flexit Group GmbH
+OUI:0009C5*
+ ID_OUI_FROM_DATABASE=KINGENE Technology Corporation
 
-OUI:001C63*
- ID_OUI_FROM_DATABASE=TRUEN
+OUI:0009BD*
+ ID_OUI_FROM_DATABASE=Epygi Technologies, Ltd.
 
-OUI:001C57*
+OUI:0009B6*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001C5E*
- ID_OUI_FROM_DATABASE=ASTON France
+OUI:00097F*
+ ID_OUI_FROM_DATABASE=Vsecure 2000 LTD.
 
-OUI:001C46*
- ID_OUI_FROM_DATABASE=QTUM
+OUI:000984*
+ ID_OUI_FROM_DATABASE=MyCasa Network Inc.
 
-OUI:001C3A*
- ID_OUI_FROM_DATABASE=Element Labs, Inc.
+OUI:000971*
+ ID_OUI_FROM_DATABASE=Time Management, Inc.
 
-OUI:001C41*
- ID_OUI_FROM_DATABASE=scemtec Transponder Technology GmbH
+OUI:000978*
+ ID_OUI_FROM_DATABASE=AIJI System Co., Ltd.
 
-OUI:001C34*
- ID_OUI_FROM_DATABASE=HUEY CHIAO INTERNATIONAL CO., LTD.
+OUI:000972*
+ ID_OUI_FROM_DATABASE=Securebase,Inc
 
-OUI:001C33*
- ID_OUI_FROM_DATABASE=Sutron
+OUI:00096C*
+ ID_OUI_FROM_DATABASE=Imedia Semiconductor Corp.
 
-OUI:001BF7*
- ID_OUI_FROM_DATABASE=Lund IP Products AB
+OUI:000965*
+ ID_OUI_FROM_DATABASE=HyunJu Computer Co., Ltd.
 
-OUI:001BF9*
- ID_OUI_FROM_DATABASE=Intellitect Water Ltd
+OUI:000960*
+ ID_OUI_FROM_DATABASE=YOZAN Inc.
 
-OUI:001BF8*
- ID_OUI_FROM_DATABASE=Digitrax Inc.
+OUI:000956*
+ ID_OUI_FROM_DATABASE=Network Systems Group, Ltd. (NSG)
 
-OUI:001BF2*
- ID_OUI_FROM_DATABASE=KWORLD COMPUTER CO., LTD
+OUI:000955*
+ ID_OUI_FROM_DATABASE=Young Generation International Corp.
 
-OUI:001BEB*
- ID_OUI_FROM_DATABASE=DMP Electronics INC.
+OUI:000AE9*
+ ID_OUI_FROM_DATABASE=AirVast Technology Inc.
 
-OUI:001BE6*
- ID_OUI_FROM_DATABASE=VR AG
+OUI:000ADB*
+ ID_OUI_FROM_DATABASE=SkyPilot Network, Inc
 
-OUI:001BDF*
- ID_OUI_FROM_DATABASE=Iskra Sistemi d.d.
+OUI:000ADD*
+ ID_OUI_FROM_DATABASE=Allworx Corp.
 
-OUI:001BD3*
- ID_OUI_FROM_DATABASE=Panasonic Corp. AVC Company
+OUI:000AE2*
+ ID_OUI_FROM_DATABASE=Binatone Electronics International, Ltd
 
-OUI:001BD8*
- ID_OUI_FROM_DATABASE=DVTel LTD
+OUI:000ACA*
+ ID_OUI_FROM_DATABASE=YOKOYAMA SHOKAI CO.,Ltd.
 
-OUI:001BCC*
- ID_OUI_FROM_DATABASE=KINGTEK CCTV ALLIANCE CO., LTD.
+OUI:000ACF*
+ ID_OUI_FROM_DATABASE=PROVIDEO Multimedia Co. Ltd.
 
-OUI:001AC8*
- ID_OUI_FROM_DATABASE=ISL (Instrumentation Scientifique de Laboratoire)
+OUI:000AD6*
+ ID_OUI_FROM_DATABASE=BeamReach Networks
 
-OUI:001ACF*
- ID_OUI_FROM_DATABASE=C.T. ELETTRONICA
+OUI:000ABC*
+ ID_OUI_FROM_DATABASE=Seabridge Ltd.
 
-OUI:001AC3*
- ID_OUI_FROM_DATABASE=Scientific-Atlanta, Inc
+OUI:000ABE*
+ ID_OUI_FROM_DATABASE=OPNET Technologies CO., LTD.
 
-OUI:001AB9*
- ID_OUI_FROM_DATABASE=PMC
+OUI:000AC3*
+ ID_OUI_FROM_DATABASE=eM Technics Co., Ltd.
 
-OUI:001ABE*
- ID_OUI_FROM_DATABASE=COMPUTER HI-TECH INC.
+OUI:000A78*
+ ID_OUI_FROM_DATABASE=OLITEC
 
-OUI:001AAB*
- ID_OUI_FROM_DATABASE=eWings s.r.l.
+OUI:000A71*
+ ID_OUI_FROM_DATABASE=Avrio Technologies, Inc
 
-OUI:001AB2*
- ID_OUI_FROM_DATABASE=Cyber Solutions Inc.
+OUI:000A76*
+ ID_OUI_FROM_DATABASE=Beida Jade Bird Huaguang Technology Co.,Ltd
 
-OUI:001AB7*
- ID_OUI_FROM_DATABASE=Ethos Networks LTD.
+OUI:000A63*
+ ID_OUI_FROM_DATABASE=DHD GmbH
 
-OUI:001C2E*
- ID_OUI_FROM_DATABASE=HPN Supply Chain
+OUI:000A65*
+ ID_OUI_FROM_DATABASE=GentechMedia.co.,ltd.
 
-OUI:001C27*
- ID_OUI_FROM_DATABASE=Sunell Electronics Co.
+OUI:000A6A*
+ ID_OUI_FROM_DATABASE=SVM Microwaves s.r.o.
 
-OUI:001C22*
- ID_OUI_FROM_DATABASE=Aeris Elettronica s.r.l.
+OUI:000A5E*
+ ID_OUI_FROM_DATABASE=3COM Corporation
 
-OUI:001C1D*
- ID_OUI_FROM_DATABASE=CHENZHOU GOSPELL DIGITAL TECHNOLOGY CO.,LTD
+OUI:000A52*
+ ID_OUI_FROM_DATABASE=AsiaRF Ltd.
 
-OUI:001C18*
- ID_OUI_FROM_DATABASE=Sicert S.r.L.
+OUI:000A4B*
+ ID_OUI_FROM_DATABASE=DataPower Technology, Inc.
 
-OUI:001C0A*
- ID_OUI_FROM_DATABASE=Shenzhen AEE Technology Co.,Ltd.
+OUI:00075A*
+ ID_OUI_FROM_DATABASE=Air Products and Chemicals, Inc.
 
-OUI:001C05*
- ID_OUI_FROM_DATABASE=Nonin Medical Inc.
+OUI:000754*
+ ID_OUI_FROM_DATABASE=Xyterra Computing, Inc.
 
-OUI:001BFE*
- ID_OUI_FROM_DATABASE=Zavio Inc.
+OUI:00074E*
+ ID_OUI_FROM_DATABASE=IPFRONT Inc
 
-OUI:001B29*
- ID_OUI_FROM_DATABASE=Avantis.Co.,Ltd
+OUI:00074D*
+ ID_OUI_FROM_DATABASE=Zebra Technologies Corp.
 
-OUI:001B23*
- ID_OUI_FROM_DATABASE=SimpleComTools
+OUI:000742*
+ ID_OUI_FROM_DATABASE=Ormazabal
 
-OUI:001B1E*
- ID_OUI_FROM_DATABASE=HART Communication Foundation
+OUI:000748*
+ ID_OUI_FROM_DATABASE=The Imaging Source Europe
 
-OUI:001B12*
- ID_OUI_FROM_DATABASE=Apprion
+OUI:000736*
+ ID_OUI_FROM_DATABASE=Data Video Technologies Co., Ltd.
 
-OUI:001B17*
- ID_OUI_FROM_DATABASE=Palo Alto Networks
+OUI:00073D*
+ ID_OUI_FROM_DATABASE=Nanjing Postel Telecommunications Co., Ltd.
 
-OUI:001B0B*
- ID_OUI_FROM_DATABASE=Phidgets Inc.
+OUI:00073C*
+ ID_OUI_FROM_DATABASE=Telecom Design
 
-OUI:001B10*
- ID_OUI_FROM_DATABASE=ShenZhen Kang Hui Technology Co.,ltd
+OUI:00072A*
+ ID_OUI_FROM_DATABASE=Innovance Networks
+
+OUI:00072F*
+ ID_OUI_FROM_DATABASE=Intransa, Inc.
+
+OUI:000730*
+ ID_OUI_FROM_DATABASE=Hutchison OPTEL Telecom Technology Co., Ltd.
 
-OUI:001B04*
- ID_OUI_FROM_DATABASE=Affinity International S.p.a
+OUI:000725*
+ ID_OUI_FROM_DATABASE=Bematech International Corp.
 
-OUI:001AFF*
- ID_OUI_FROM_DATABASE=Wizyoung Tech.
+OUI:000818*
+ ID_OUI_FROM_DATABASE=Pixelworks, Inc.
 
-OUI:001AFD*
- ID_OUI_FROM_DATABASE=EVOLIS
+OUI:000812*
+ ID_OUI_FROM_DATABASE=GM-2 Corporation
 
-OUI:00191C*
- ID_OUI_FROM_DATABASE=Sensicast Systems
+OUI:000811*
+ ID_OUI_FROM_DATABASE=VOIX Corporation
 
-OUI:00191E*
- ID_OUI_FROM_DATABASE=Beyondwiz Co., Ltd.
+OUI:00080B*
+ ID_OUI_FROM_DATABASE=Birka BPA Informationssystem AB
 
-OUI:001923*
- ID_OUI_FROM_DATABASE=Phonex Korea Co., LTD.
+OUI:000805*
+ ID_OUI_FROM_DATABASE=Techno-Holon Corporation
 
-OUI:00192A*
- ID_OUI_FROM_DATABASE=Antiope Associates
+OUI:00080C*
+ ID_OUI_FROM_DATABASE=VDA Elettronica spa
 
-OUI:001910*
- ID_OUI_FROM_DATABASE=Knick Elektronische Messgeraete GmbH & Co. KG
+OUI:0007FB*
+ ID_OUI_FROM_DATABASE=Giga Stream UMTS Technologies GmbH
 
-OUI:001917*
- ID_OUI_FROM_DATABASE=Posiflex Inc.
+OUI:0007F5*
+ ID_OUI_FROM_DATABASE=Bridgeco Co AG
 
-OUI:001909*
- ID_OUI_FROM_DATABASE=DEVI - Danfoss A/S
+OUI:0007E8*
+ ID_OUI_FROM_DATABASE=EdgeWave
 
-OUI:00190B*
- ID_OUI_FROM_DATABASE=Southern Vision Systems, Inc.
+OUI:0007EF*
+ ID_OUI_FROM_DATABASE=Lockheed Martin Tactical Systems
 
-OUI:001904*
- ID_OUI_FROM_DATABASE=WB Electronics Sp. z o.o.
+OUI:0007E2*
+ ID_OUI_FROM_DATABASE=Bitworks, Inc.
 
-OUI:0018FF*
- ID_OUI_FROM_DATABASE=PowerQuattro Co.
+OUI:0007D6*
+ ID_OUI_FROM_DATABASE=Commil Ltd.
 
-OUI:0018FA*
- ID_OUI_FROM_DATABASE=Yushin Precision Equipment Co.,Ltd.
+OUI:0007DC*
+ ID_OUI_FROM_DATABASE=Atek Co, Ltd.
 
-OUI:001955*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000923*
+ ID_OUI_FROM_DATABASE=Heaman System Co., Ltd
 
-OUI:00194E*
- ID_OUI_FROM_DATABASE=Ultra Electronics - TCS (Tactical Communication Systems)
+OUI:00091D*
+ ID_OUI_FROM_DATABASE=Proteam Computer Corporation
 
-OUI:001950*
- ID_OUI_FROM_DATABASE=Harman Multimedia
+OUI:000924*
+ ID_OUI_FROM_DATABASE=Telebau GmbH
 
-OUI:001949*
- ID_OUI_FROM_DATABASE=TENTEL  COMTECH CO., LTD.
+OUI:000911*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001942*
- ID_OUI_FROM_DATABASE=ON SOFTWARE INTERNATIONAL LIMITED
+OUI:000916*
+ ID_OUI_FROM_DATABASE=Listman Home Technologies, Inc.
 
-OUI:00193D*
- ID_OUI_FROM_DATABASE=GMC Guardian Mobility Corp.
+OUI:00090A*
+ ID_OUI_FROM_DATABASE=SnedFar Technology Co., Ltd.
 
-OUI:001936*
- ID_OUI_FROM_DATABASE=STERLITE OPTICAL TECHNOLOGIES LIMITED
+OUI:000904*
+ ID_OUI_FROM_DATABASE=MONDIAL electronic
 
-OUI:00193B*
- ID_OUI_FROM_DATABASE=Wilibox Deliberant Group LLC
+OUI:000903*
+ ID_OUI_FROM_DATABASE=Panasas, Inc
 
-OUI:00192F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0008FE*
+ ID_OUI_FROM_DATABASE=UNIK C&C Co.,Ltd.
 
-OUI:001A20*
- ID_OUI_FROM_DATABASE=CMOTECH Co. Ltd.
+OUI:0008EE*
+ ID_OUI_FROM_DATABASE=Logic Product Development
 
-OUI:001A22*
- ID_OUI_FROM_DATABASE=eQ-3 Entwicklung GmbH
+OUI:0008F0*
+ ID_OUI_FROM_DATABASE=Next Generation Systems, Inc.
 
-OUI:001A14*
- ID_OUI_FROM_DATABASE=Xin Hua Control Engineering Co.,Ltd.
+OUI:000948*
+ ID_OUI_FROM_DATABASE=Vista Control Systems, Corp.
 
-OUI:001A0D*
- ID_OUI_FROM_DATABASE=HandHeld entertainment, Inc.
+OUI:00094F*
+ ID_OUI_FROM_DATABASE=elmegt GmbH & Co. KG
 
-OUI:001A0F*
- ID_OUI_FROM_DATABASE=Sistemas Avanzados de Control, S.A.
+OUI:000943*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001A08*
- ID_OUI_FROM_DATABASE=Simoco Ltd.
+OUI:00093C*
+ ID_OUI_FROM_DATABASE=Jacques Technologies P/L
 
-OUI:001A01*
- ID_OUI_FROM_DATABASE=Smiths Medical
+OUI:000936*
+ ID_OUI_FROM_DATABASE=Ipetronik GmbH & Co. KG
 
-OUI:0019FC*
- ID_OUI_FROM_DATABASE=PT. Ufoakses Sukses Luarbiasa
+OUI:000935*
+ ID_OUI_FROM_DATABASE=Sandvine Incorporated
 
-OUI:0019EF*
- ID_OUI_FROM_DATABASE=SHENZHEN LINNKING ELECTRONICS CO.,LTD
+OUI:000929*
+ ID_OUI_FROM_DATABASE=Sanyo Industries (UK) Limited
 
-OUI:0019F1*
- ID_OUI_FROM_DATABASE=Star Communication Network Technology Co.,Ltd
+OUI:000930*
+ ID_OUI_FROM_DATABASE=AeroConcierge Inc.
 
-OUI:0019F6*
- ID_OUI_FROM_DATABASE=Acconet (PTE) Ltd
+OUI:0008E9*
+ ID_OUI_FROM_DATABASE=NextGig
 
-OUI:001A76*
- ID_OUI_FROM_DATABASE=SDT information Technology Co.,LTD.
+OUI:0008DC*
+ ID_OUI_FROM_DATABASE=Wiznet
 
-OUI:001A6F*
- ID_OUI_FROM_DATABASE=MI.TEL s.r.l.
+OUI:0008E2*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001A6A*
- ID_OUI_FROM_DATABASE=Tranzas, Inc.
+OUI:0008DB*
+ ID_OUI_FROM_DATABASE=Corrigent Systems
 
-OUI:001A63*
- ID_OUI_FROM_DATABASE=Elster Solutions, LLC,
+OUI:0008D6*
+ ID_OUI_FROM_DATABASE=HASSNET Inc.
 
-OUI:001A5E*
- ID_OUI_FROM_DATABASE=Thincom Technology Co.,Ltd
+OUI:0008CF*
+ ID_OUI_FROM_DATABASE=Nippon Koei Power Systems Co., Ltd.
 
-OUI:001A57*
- ID_OUI_FROM_DATABASE=Matrix Design Group, LLC
+OUI:0008C0*
+ ID_OUI_FROM_DATABASE=ASA SYSTEMS
 
-OUI:001A5C*
- ID_OUI_FROM_DATABASE=Euchner GmbH+Co. KG
+OUI:0008C5*
+ ID_OUI_FROM_DATABASE=Liontech Co., Ltd.
 
-OUI:001A50*
- ID_OUI_FROM_DATABASE=PheeNet Technology Corp.
+OUI:0008CA*
+ ID_OUI_FROM_DATABASE=TwinHan Technology Co.,Ltd
 
-OUI:001A9D*
- ID_OUI_FROM_DATABASE=Skipper Wireless, Inc.
+OUI:0008BF*
+ ID_OUI_FROM_DATABASE=Aptus Elektronik AB
 
-OUI:001AA2*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0008B3*
+ ID_OUI_FROM_DATABASE=Fastwel
 
-OUI:001A91*
- ID_OUI_FROM_DATABASE=FusionDynamic Ltd.
+OUI:0008B2*
+ ID_OUI_FROM_DATABASE=SHENZHEN COMPASS TECHNOLOGY DEVELOPMENT CO.,LTD
 
-OUI:001A96*
- ID_OUI_FROM_DATABASE=ECLER S.A.
+OUI:0008A6*
+ ID_OUI_FROM_DATABASE=Multiware & Image Co., Ltd.
 
-OUI:001A90*
- ID_OUI_FROM_DATABASE=Trópico Sistemas e Telecomunicações da Amazônia LTDA.
+OUI:0008AD*
+ ID_OUI_FROM_DATABASE=Toyo-Linx Co., Ltd.
 
-OUI:001A8C*
- ID_OUI_FROM_DATABASE=Sophos Ltd
+OUI:00089A*
+ ID_OUI_FROM_DATABASE=Alcatel Microelectronics
 
-OUI:001A85*
- ID_OUI_FROM_DATABASE=NV Michel Van de Wiele
+OUI:0008A0*
+ ID_OUI_FROM_DATABASE=Stotz Feinmesstechnik GmbH
 
-OUI:001A87*
- ID_OUI_FROM_DATABASE=Canhold International Limited
+OUI:000892*
+ ID_OUI_FROM_DATABASE=EM Solutions
 
-OUI:001A86*
- ID_OUI_FROM_DATABASE=AdvancedIO Systems Inc
+OUI:000896*
+ ID_OUI_FROM_DATABASE=Printronix, Inc.
 
-OUI:0019B5*
- ID_OUI_FROM_DATABASE=Famar Fueguina S.A.
+OUI:00088C*
+ ID_OUI_FROM_DATABASE=Quanta Network Systems Inc.
 
-OUI:0019BA*
- ID_OUI_FROM_DATABASE=Paradox Security Systems Ltd
+OUI:000886*
+ ID_OUI_FROM_DATABASE=Hansung Teliann, Inc.
 
-OUI:0019A2*
- ID_OUI_FROM_DATABASE=ORDYN TECHNOLOGIES
+OUI:000873*
+ ID_OUI_FROM_DATABASE=DapTechnology B.V.
 
-OUI:0019AE*
- ID_OUI_FROM_DATABASE=Hopling Technologies b.v.
+OUI:00087A*
+ ID_OUI_FROM_DATABASE=Wipotec GmbH
 
-OUI:0019A7*
- ID_OUI_FROM_DATABASE=ITU-T
+OUI:00087F*
+ ID_OUI_FROM_DATABASE=SPAUN electronic GmbH & Co. KG
 
-OUI:001996*
- ID_OUI_FROM_DATABASE=TurboChef Technologies Inc.
+OUI:02608C*
+ ID_OUI_FROM_DATABASE=3COM CORPORATION
 
-OUI:00199B*
- ID_OUI_FROM_DATABASE=Diversified Technical Systems, Inc.
+OUI:0007D0*
+ ID_OUI_FROM_DATABASE=Automat Engenharia de Automação Ltda.
 
-OUI:001991*
- ID_OUI_FROM_DATABASE=avinfo
+OUI:0007CD*
+ ID_OUI_FROM_DATABASE=Kumoh Electronic Co, Ltd
 
-OUI:00198A*
- ID_OUI_FROM_DATABASE=Northrop Grumman Systems Corp.
+OUI:0007C7*
+ ID_OUI_FROM_DATABASE=Synectics Systems Limited
 
-OUI:00198C*
- ID_OUI_FROM_DATABASE=iXSea
+OUI:00047D*
+ ID_OUI_FROM_DATABASE=Pelco
 
-OUI:001985*
- ID_OUI_FROM_DATABASE=IT Watchdogs, Inc
+OUI:00047E*
+ ID_OUI_FROM_DATABASE=Siqura B.V.
 
-OUI:00196B*
- ID_OUI_FROM_DATABASE=Danpex Corporation
+OUI:0007C1*
+ ID_OUI_FROM_DATABASE=Overture Networks, Inc.
 
-OUI:001966*
- ID_OUI_FROM_DATABASE=Asiarock Technology Limited
+OUI:0007C0*
+ ID_OUI_FROM_DATABASE=NetZerver Inc.
 
-OUI:00195C*
- ID_OUI_FROM_DATABASE=Innotech Corporation
+OUI:0007AE*
+ ID_OUI_FROM_DATABASE=Britestream Networks, Inc.
 
-OUI:001961*
- ID_OUI_FROM_DATABASE=Blaupunkt  Embedded Systems GmbH
+OUI:0007B4*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0019DE*
- ID_OUI_FROM_DATABASE=MOBITEK
+OUI:00079A*
+ ID_OUI_FROM_DATABASE=Verint Systems Inc
 
-OUI:0019EA*
- ID_OUI_FROM_DATABASE=TeraMage Technologies Co., Ltd.
+OUI:0007A0*
+ ID_OUI_FROM_DATABASE=e-Watch Inc.
 
-OUI:0019D0*
- ID_OUI_FROM_DATABASE=Cathexis
+OUI:000794*
+ ID_OUI_FROM_DATABASE=Simple Devices, Inc.
 
-OUI:0019D7*
- ID_OUI_FROM_DATABASE=FORTUNETEK CO., LTD
+OUI:000793*
+ ID_OUI_FROM_DATABASE=Shin Satellite Public Company Limited
 
-OUI:0019B3*
- ID_OUI_FROM_DATABASE=Stanford Research Systems
+OUI:00078D*
+ ID_OUI_FROM_DATABASE=NetEngines Ltd.
 
-OUI:001A44*
- ID_OUI_FROM_DATABASE=JWTrading Co., Ltd
+OUI:00078E*
+ ID_OUI_FROM_DATABASE=Garz & Friche GmbH
 
-OUI:001A49*
- ID_OUI_FROM_DATABASE=Micro Vision Co.,LTD
+OUI:000781*
+ ID_OUI_FROM_DATABASE=Itron Inc.
 
-OUI:001A3D*
- ID_OUI_FROM_DATABASE=Ajin Vision Co.,Ltd
+OUI:000787*
+ ID_OUI_FROM_DATABASE=Idea System Co., Ltd.
 
-OUI:001A31*
- ID_OUI_FROM_DATABASE=SCAN COIN Industries AB
+OUI:000777*
+ ID_OUI_FROM_DATABASE=Motah Ltd.
 
-OUI:001A38*
- ID_OUI_FROM_DATABASE=Sanmina-SCI
+OUI:000771*
+ ID_OUI_FROM_DATABASE=Embedded System Corporation
 
-OUI:001A2C*
- ID_OUI_FROM_DATABASE=SATEC Co.,LTD
+OUI:00075B*
+ ID_OUI_FROM_DATABASE=Gibson Guitars
 
-OUI:001A27*
- ID_OUI_FROM_DATABASE=Ubistar
+OUI:000760*
+ ID_OUI_FROM_DATABASE=TOMIS Information & Telecom Corp.
 
-OUI:0017AE*
- ID_OUI_FROM_DATABASE=GAI-Tronics
+OUI:000767*
+ ID_OUI_FROM_DATABASE=Yuxing Electronics Company Limited
 
-OUI:0017A2*
- ID_OUI_FROM_DATABASE=Camrivox Ltd.
+OUI:000879*
+ ID_OUI_FROM_DATABASE=CEM Corporation
 
-OUI:0017A7*
- ID_OUI_FROM_DATABASE=Mobile Computing Promotion Consortium
+OUI:00086C*
+ ID_OUI_FROM_DATABASE=Plasmon LMS
 
-OUI:00179D*
- ID_OUI_FROM_DATABASE=Kelman Limited
+OUI:00086D*
+ ID_OUI_FROM_DATABASE=Missouri FreeNet
 
-OUI:001791*
- ID_OUI_FROM_DATABASE=LinTech GmbH
+OUI:000867*
+ ID_OUI_FROM_DATABASE=Uptime Devices
 
-OUI:001796*
- ID_OUI_FROM_DATABASE=Rittmeyer AG
+OUI:000860*
+ ID_OUI_FROM_DATABASE=LodgeNet Entertainment Corp.
 
-OUI:001798*
- ID_OUI_FROM_DATABASE=Azonic Technology Co., LTD
+OUI:000854*
+ ID_OUI_FROM_DATABASE=Netronix, Inc.
 
-OUI:00178A*
- ID_OUI_FROM_DATABASE=DARTS TECHNOLOGIES CORP.
+OUI:00085A*
+ ID_OUI_FROM_DATABASE=IntiGate Inc.
 
-OUI:00177E*
- ID_OUI_FROM_DATABASE=Meshcom Technologies Inc.
+OUI:00081E*
+ ID_OUI_FROM_DATABASE=Repeatit AB
 
-OUI:001785*
- ID_OUI_FROM_DATABASE=Sparr Electronics Ltd
+OUI:00082B*
+ ID_OUI_FROM_DATABASE=Wooksung Electronics, Inc.
 
-OUI:001809*
- ID_OUI_FROM_DATABASE=CRESYN
+OUI:000824*
+ ID_OUI_FROM_DATABASE=Nuance Document Imaging
 
-OUI:00180E*
- ID_OUI_FROM_DATABASE=Avega Systems
+OUI:0005BA*
+ ID_OUI_FROM_DATABASE=Area Netwoeks, Inc.
 
-OUI:001810*
- ID_OUI_FROM_DATABASE=IPTrade S.A.
+OUI:0005B9*
+ ID_OUI_FROM_DATABASE=Airvana, Inc.
 
-OUI:0017F6*
- ID_OUI_FROM_DATABASE=Pyramid Meriden Inc.
+OUI:0005C0*
+ ID_OUI_FROM_DATABASE=Digital Network Alacarte Co., Ltd.
 
-OUI:0017FB*
- ID_OUI_FROM_DATABASE=FA
+OUI:000599*
+ ID_OUI_FROM_DATABASE=DRS Test and Energy Management or DRS-TEM
 
-OUI:0017FD*
- ID_OUI_FROM_DATABASE=Amulet Hotkey
+OUI:0005A0*
+ ID_OUI_FROM_DATABASE=MOBILINE Kft.
 
-OUI:0017EF*
- ID_OUI_FROM_DATABASE=IBM Corp
+OUI:0005A9*
+ ID_OUI_FROM_DATABASE=Princeton Networks, Inc.
 
-OUI:0017D7*
- ID_OUI_FROM_DATABASE=ION Geophysical Corporation Inc.
+OUI:0005AA*
+ ID_OUI_FROM_DATABASE=Moore Industries International Inc.
 
-OUI:0017DC*
- ID_OUI_FROM_DATABASE=DAEMYUNG ZERO1
+OUI:0005AF*
+ ID_OUI_FROM_DATABASE=InnoScan Computing A/S
 
-OUI:0017DE*
- ID_OUI_FROM_DATABASE=Advantage Six Ltd
+OUI:0005B3*
+ ID_OUI_FROM_DATABASE=Asahi-Engineering Co., Ltd.
 
-OUI:0018C3*
- ID_OUI_FROM_DATABASE=CS Corporation
+OUI:00059F*
+ ID_OUI_FROM_DATABASE=Yotta Networks, Inc.
 
-OUI:0018CA*
- ID_OUI_FROM_DATABASE=Viprinet GmbH
+OUI:0005A6*
+ ID_OUI_FROM_DATABASE=Extron Electronics
 
-OUI:0018BE*
- ID_OUI_FROM_DATABASE=ANSA Corporation
+OUI:0005B4*
+ ID_OUI_FROM_DATABASE=Aceex Corporation
 
-OUI:0018B2*
- ID_OUI_FROM_DATABASE=ADEUNIS RF
+OUI:00058D*
+ ID_OUI_FROM_DATABASE=Lynx Photonic Networks, Inc.
 
-OUI:0018B7*
- ID_OUI_FROM_DATABASE=D3 LED, LLC
+OUI:000587*
+ ID_OUI_FROM_DATABASE=Locus, Incorporated
 
-OUI:0018AB*
- ID_OUI_FROM_DATABASE=BEIJING LHWT MICROELECTRONICS INC.
+OUI:000593*
+ ID_OUI_FROM_DATABASE=Grammar Engine Inc.
 
-OUI:0018A6*
- ID_OUI_FROM_DATABASE=Persistent Systems, LLC
+OUI:000586*
+ ID_OUI_FROM_DATABASE=Lucent Technologies
 
-OUI:001895*
- ID_OUI_FROM_DATABASE=Hansun Technologies Inc.
+OUI:00057A*
+ ID_OUI_FROM_DATABASE=Overture Networks
 
-OUI:00189A*
- ID_OUI_FROM_DATABASE=HANA Micron Inc.
+OUI:00063C*
+ ID_OUI_FROM_DATABASE=Intrinsyc Software International Inc.
 
-OUI:0018E7*
- ID_OUI_FROM_DATABASE=Cameo Communications, INC.
+OUI:00062F*
+ ID_OUI_FROM_DATABASE=Pivotech Systems Inc.
 
-OUI:0018EE*
- ID_OUI_FROM_DATABASE=Videology Imaging Solutions, Inc.
+OUI:000636*
+ ID_OUI_FROM_DATABASE=Jedai Broadband Networks
 
-OUI:0018E2*
- ID_OUI_FROM_DATABASE=Topdata Sistemas de Automacao Ltda
+OUI:000635*
+ ID_OUI_FROM_DATABASE=PacketAir Networks, Inc.
 
-OUI:0018DB*
- ID_OUI_FROM_DATABASE=EPL Technology Ltd
+OUI:000628*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0018E0*
- ID_OUI_FROM_DATABASE=ANAVEO
+OUI:00061F*
+ ID_OUI_FROM_DATABASE=Vision Components GmbH
 
-OUI:0018CF*
- ID_OUI_FROM_DATABASE=Baldor Electric Company
+OUI:000619*
+ ID_OUI_FROM_DATABASE=Connection Technology Systems
 
-OUI:0018D4*
- ID_OUI_FROM_DATABASE=Unified Display Interface SIG
+OUI:00060D*
+ ID_OUI_FROM_DATABASE=Wave7 Optics
 
-OUI:00184A*
- ID_OUI_FROM_DATABASE=Catcher, Inc.
+OUI:000613*
+ ID_OUI_FROM_DATABASE=Kawasaki Microelectronics Incorporated
 
-OUI:00184C*
- ID_OUI_FROM_DATABASE=Bogen Communications
+OUI:00060E*
+ ID_OUI_FROM_DATABASE=IGYS Systems, Inc.
 
-OUI:001845*
- ID_OUI_FROM_DATABASE=Pulsar-Telecom LLC.
+OUI:0005EC*
+ ID_OUI_FROM_DATABASE=Mosaic Systems Inc.
 
-OUI:00183E*
- ID_OUI_FROM_DATABASE=Digilent, Inc
+OUI:0005D3*
+ ID_OUI_FROM_DATABASE=eProduction Solutions, Inc.
 
-OUI:001828*
- ID_OUI_FROM_DATABASE=e2v technologies (UK) ltd.
+OUI:000608*
+ ID_OUI_FROM_DATABASE=At-Sky SAS
 
-OUI:00182D*
- ID_OUI_FROM_DATABASE=Artec Design
+OUI:000607*
+ ID_OUI_FROM_DATABASE=Omni Directional Control Technology Inc.
 
-OUI:001821*
- ID_OUI_FROM_DATABASE=SINDORICOH
+OUI:0005E6*
+ ID_OUI_FROM_DATABASE=Egenera, Inc.
 
-OUI:001815*
- ID_OUI_FROM_DATABASE=GZ Technologies, Inc.
+OUI:000580*
+ ID_OUI_FROM_DATABASE=FibroLAN Ltd.
 
-OUI:00181C*
- ID_OUI_FROM_DATABASE=Exterity Limited
+OUI:000576*
+ ID_OUI_FROM_DATABASE=NSM Technology Ltd.
 
-OUI:001772*
- ID_OUI_FROM_DATABASE=ASTRO Strobel Kommunikationssysteme GmbH
+OUI:000570*
+ ID_OUI_FROM_DATABASE=Baydel Ltd.
 
-OUI:001777*
- ID_OUI_FROM_DATABASE=Obsidian Research Corporation
+OUI:00056A*
+ ID_OUI_FROM_DATABASE=Heuft Systemtechnik GmbH
 
-OUI:00176E*
- ID_OUI_FROM_DATABASE=DUCATI SISTEMI
+OUI:000563*
+ ID_OUI_FROM_DATABASE=J-Works, Inc.
 
-OUI:001762*
- ID_OUI_FROM_DATABASE=Solar Technology, Inc.
+OUI:00055D*
+ ID_OUI_FROM_DATABASE=D-LINK SYSTEMS, INC.
 
-OUI:001769*
- ID_OUI_FROM_DATABASE=Cymphonix Corp
+OUI:000564*
+ ID_OUI_FROM_DATABASE=Tsinghua Bitway Co., Ltd.
 
-OUI:00175D*
- ID_OUI_FROM_DATABASE=Dongseo system.
+OUI:000557*
+ ID_OUI_FROM_DATABASE=Agile TV Corporation
 
-OUI:00175B*
- ID_OUI_FROM_DATABASE=ACS Solutions Switzerland Ltd.
+OUI:000551*
+ ID_OUI_FROM_DATABASE=F & S Elektronik Systeme GmbH
 
-OUI:001756*
- ID_OUI_FROM_DATABASE=Vinci Labs Oy
+OUI:00054B*
+ ID_OUI_FROM_DATABASE=Eaton Automation AG
 
-OUI:00174F*
- ID_OUI_FROM_DATABASE=iCatch Inc.
+OUI:00054A*
+ ID_OUI_FROM_DATABASE=Ario Data Networks, Inc.
 
-OUI:0017CD*
- ID_OUI_FROM_DATABASE=CEC Wireless R&D Ltd.
+OUI:000544*
+ ID_OUI_FROM_DATABASE=Valley Technologies, Inc.
 
-OUI:0017D2*
- ID_OUI_FROM_DATABASE=THINLINX PTY LTD
+OUI:00053E*
+ ID_OUI_FROM_DATABASE=KID Systeme GmbH
 
-OUI:0017C6*
- ID_OUI_FROM_DATABASE=Cross Match Technologies Inc
+OUI:000531*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0017BA*
- ID_OUI_FROM_DATABASE=SEDO CO., LTD.
+OUI:000538*
+ ID_OUI_FROM_DATABASE=Merilus, Inc.
 
-OUI:0017BF*
- ID_OUI_FROM_DATABASE=Coherent Research Limited
+OUI:000532*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0017C1*
- ID_OUI_FROM_DATABASE=CM Precision Technology LTD.
+OUI:000525*
+ ID_OUI_FROM_DATABASE=Puretek Industrial Co., Ltd.
 
-OUI:0017B3*
- ID_OUI_FROM_DATABASE=Aftek Infosys Limited
+OUI:00052B*
+ ID_OUI_FROM_DATABASE=HORIBA, Ltd.
 
-OUI:00186A*
- ID_OUI_FROM_DATABASE=Global Link Digital Technology Co,.LTD
+OUI:00051F*
+ ID_OUI_FROM_DATABASE=Taijin Media Co., Ltd.
 
-OUI:00186F*
- ID_OUI_FROM_DATABASE=Setha Industria Eletronica LTDA
+OUI:000519*
+ ID_OUI_FROM_DATABASE=Siemens Building Technologies AG,
 
-OUI:001876*
- ID_OUI_FROM_DATABASE=WowWee Ltd.
+OUI:000518*
+ ID_OUI_FROM_DATABASE=Jupiters Technology
 
-OUI:001869*
- ID_OUI_FROM_DATABASE=KINGJIM
+OUI:00050E*
+ ID_OUI_FROM_DATABASE=3ware, Inc.
 
-OUI:001864*
- ID_OUI_FROM_DATABASE=Eaton Corporation
+OUI:00050F*
+ ID_OUI_FROM_DATABASE=Tanaka S/S Ltd.
 
-OUI:00185D*
- ID_OUI_FROM_DATABASE=TAIGUEN TECHNOLOGY (SHEN-ZHEN) CO., LTD.
+OUI:000508*
+ ID_OUI_FROM_DATABASE=Inetcam, Inc.
 
-OUI:001851*
- ID_OUI_FROM_DATABASE=SWsoft
+OUI:0004FE*
+ ID_OUI_FROM_DATABASE=Pelago Networks
 
-OUI:001858*
- ID_OUI_FROM_DATABASE=TagMaster AB
+OUI:000671*
+ ID_OUI_FROM_DATABASE=Softing AG
 
-OUI:00189F*
- ID_OUI_FROM_DATABASE=Lenntek Corporation
+OUI:000672*
+ ID_OUI_FROM_DATABASE=Netezza
 
-OUI:00188E*
- ID_OUI_FROM_DATABASE=Ekahau, Inc.
+OUI:00067B*
+ ID_OUI_FROM_DATABASE=Toplink C&C Corporation
 
-OUI:001887*
- ID_OUI_FROM_DATABASE=Metasystem SpA
+OUI:000665*
+ ID_OUI_FROM_DATABASE=Sunny Giken, Inc.
 
-OUI:001889*
- ID_OUI_FROM_DATABASE=WinNet Solutions Limited
+OUI:00066B*
+ ID_OUI_FROM_DATABASE=Sysmex Corporation
 
-OUI:00187B*
- ID_OUI_FROM_DATABASE=4NSYS Co. Ltd.
+OUI:000652*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001661*
- ID_OUI_FROM_DATABASE=Novatium Solutions (P) Ltd
+OUI:000659*
+ ID_OUI_FROM_DATABASE=EAL (Apeldoorn) B.V.
 
-OUI:001663*
- ID_OUI_FROM_DATABASE=KBT Mobile
+OUI:000658*
+ ID_OUI_FROM_DATABASE=Helmut Fischer GmbH Institut für Elektronik und Messtechnik
 
-OUI:001668*
- ID_OUI_FROM_DATABASE=Eishin Electronics
+OUI:000646*
+ ID_OUI_FROM_DATABASE=ShenZhen XunBao Network Technology Co Ltd
 
-OUI:001662*
- ID_OUI_FROM_DATABASE=Liyuh Technology Ltd.
+OUI:000640*
+ ID_OUI_FROM_DATABASE=White Rock Networks
 
-OUI:00165C*
- ID_OUI_FROM_DATABASE=Trackflow Ltd
+OUI:00064C*
+ ID_OUI_FROM_DATABASE=Invicta Networks, Inc.
 
-OUI:001655*
- ID_OUI_FROM_DATABASE=FUHO TECHNOLOGY Co., LTD
+OUI:0006B5*
+ ID_OUI_FROM_DATABASE=Source Photonics, Inc.
 
-OUI:0015E4*
- ID_OUI_FROM_DATABASE=Zimmer Elektromedizin
+OUI:0006A8*
+ ID_OUI_FROM_DATABASE=KC Technology, Inc.
 
-OUI:0015DA*
- ID_OUI_FROM_DATABASE=IRITEL A.D.
+OUI:00069E*
+ ID_OUI_FROM_DATABASE=UNIQA, Inc.
 
-OUI:0015DF*
- ID_OUI_FROM_DATABASE=Clivet S.p.A.
+OUI:000698*
+ ID_OUI_FROM_DATABASE=egnite GmbH
 
-OUI:0015D3*
- ID_OUI_FROM_DATABASE=Pantech&Curitel Communications, Inc.
+OUI:000692*
+ ID_OUI_FROM_DATABASE=Intruvert Networks, Inc.
 
-OUI:0015C7*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00068C*
+ ID_OUI_FROM_DATABASE=3COM CORPORATION
 
-OUI:0015C0*
- ID_OUI_FROM_DATABASE=DIGITAL TELEMEDIA CO.,LTD.
+OUI:000685*
+ ID_OUI_FROM_DATABASE=NetNearU Corporation
 
-OUI:0015BA*
- ID_OUI_FROM_DATABASE=iba AG
+OUI:00068B*
+ ID_OUI_FROM_DATABASE=AirRunner Technologies, Inc.
 
-OUI:00174A*
- ID_OUI_FROM_DATABASE=SOCOMEC
+OUI:000686*
+ ID_OUI_FROM_DATABASE=ZARDCOM Co., Ltd.
 
-OUI:001743*
- ID_OUI_FROM_DATABASE=Deck Srl
+OUI:00067F*
+ ID_OUI_FROM_DATABASE=Digeo, Inc.
 
-OUI:00173D*
- ID_OUI_FROM_DATABASE=Neology
+OUI:0006DE*
+ ID_OUI_FROM_DATABASE=Flash Technology
 
-OUI:00173E*
- ID_OUI_FROM_DATABASE=LeucotronEquipamentos Ltda.
+OUI:0006E4*
+ ID_OUI_FROM_DATABASE=Citel Technologies Ltd.
 
-OUI:001738*
- ID_OUI_FROM_DATABASE=International Business Machines
+OUI:0006D1*
+ ID_OUI_FROM_DATABASE=Tahoe Networks, Inc.
 
-OUI:00172C*
- ID_OUI_FROM_DATABASE=TAEJIN INFOTECH
+OUI:0006DA*
+ ID_OUI_FROM_DATABASE=ITRAN Communications Ltd.
 
-OUI:001720*
- ID_OUI_FROM_DATABASE=Image Sensing Systems, Inc.
+OUI:0006CB*
+ ID_OUI_FROM_DATABASE=Jotron Electronics A/S
 
-OUI:001725*
- ID_OUI_FROM_DATABASE=Liquid Computing
+OUI:0006CC*
+ ID_OUI_FROM_DATABASE=JMI Electronics Co., Ltd.
 
-OUI:001701*
- ID_OUI_FROM_DATABASE=KDE, Inc.
+OUI:0006BB*
+ ID_OUI_FROM_DATABASE=ATI Technologies Inc.
 
-OUI:001703*
- ID_OUI_FROM_DATABASE=MOSDAN Internation Co.,Ltd
+OUI:0006C5*
+ ID_OUI_FROM_DATABASE=INNOVI Technologies Limited
 
-OUI:0016FC*
- ID_OUI_FROM_DATABASE=TOHKEN CO.,LTD.
+OUI:0006AF*
+ ID_OUI_FROM_DATABASE=Xalted Networks
 
-OUI:0016F0*
- ID_OUI_FROM_DATABASE=Dell
+OUI:000719*
+ ID_OUI_FROM_DATABASE=Mobiis Co., Ltd.
 
-OUI:0016F5*
- ID_OUI_FROM_DATABASE=Dalian Golden Hualu Digital Technology Co.,Ltd
+OUI:000720*
+ ID_OUI_FROM_DATABASE=Trutzschler GmbH & Co. KG
 
-OUI:0016E9*
- ID_OUI_FROM_DATABASE=Tiba Medical Inc
+OUI:000713*
+ ID_OUI_FROM_DATABASE=IP One, Inc.
 
-OUI:0016E4*
- ID_OUI_FROM_DATABASE=VANGUARD SECURITY ENGINEERING CORP.
+OUI:00070D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0016DD*
- ID_OUI_FROM_DATABASE=Gigabeam Corporation
+OUI:000714*
+ ID_OUI_FROM_DATABASE=Brightcom
 
-OUI:0016E2*
- ID_OUI_FROM_DATABASE=American Fibertek, Inc.
+OUI:0006F1*
+ ID_OUI_FROM_DATABASE=Optillion
 
-OUI:0016D8*
- ID_OUI_FROM_DATABASE=Senea AB
+OUI:0006F0*
+ ID_OUI_FROM_DATABASE=Digeo, Inc.
 
-OUI:00169C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0006FB*
+ ID_OUI_FROM_DATABASE=Hitachi Printing Solutions, Ltd.
 
-OUI:00169E*
- ID_OUI_FROM_DATABASE=TV One Ltd
+OUI:0006EB*
+ ID_OUI_FROM_DATABASE=Global Data
 
-OUI:0016A3*
- ID_OUI_FROM_DATABASE=Ingeteam Transmission&Distribution, S.A.
+OUI:0005F2*
+ ID_OUI_FROM_DATABASE=Power R, Inc.
 
-OUI:001690*
- ID_OUI_FROM_DATABASE=J-TEK INCORPORATION
+OUI:0005FE*
+ ID_OUI_FROM_DATABASE=Traficon N.V.
 
-OUI:001697*
- ID_OUI_FROM_DATABASE=NEC Corporation
+OUI:0005E5*
+ ID_OUI_FROM_DATABASE=Renishaw PLC
 
-OUI:001689*
- ID_OUI_FROM_DATABASE=Pilkor Electronics Co., Ltd
+OUI:0005F8*
+ ID_OUI_FROM_DATABASE=Real Time Access, Inc.
 
-OUI:00168B*
- ID_OUI_FROM_DATABASE=Paralan Corporation
+OUI:0005FF*
+ ID_OUI_FROM_DATABASE=SNS Solutions, Inc.
 
-OUI:001684*
- ID_OUI_FROM_DATABASE=Donjin Co.,Ltd.
+OUI:0005DD*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00167D*
- ID_OUI_FROM_DATABASE=Sky-Line Information Co., Ltd.
+OUI:0005D9*
+ ID_OUI_FROM_DATABASE=Techno Valley, Inc.
 
-OUI:001678*
- ID_OUI_FROM_DATABASE=SHENZHEN BAOAN GAOKE ELECTRONICS CO., LTD
+OUI:0005C6*
+ ID_OUI_FROM_DATABASE=Triz Communications
 
-OUI:001649*
- ID_OUI_FROM_DATABASE=SetOne GmbH
+OUI:0005CC*
+ ID_OUI_FROM_DATABASE=Sumtel Communications, Inc.
 
-OUI:00163F*
- ID_OUI_FROM_DATABASE=CReTE SYSTEMS Inc.
+OUI:00044C*
+ ID_OUI_FROM_DATABASE=JENOPTIK
 
-OUI:001638*
- ID_OUI_FROM_DATABASE=TECOM Co., Ltd.
+OUI:000448*
+ ID_OUI_FROM_DATABASE=Polaroid Corporation
 
-OUI:001633*
- ID_OUI_FROM_DATABASE=Oxford Diagnostics Ltd.
+OUI:00043C*
+ ID_OUI_FROM_DATABASE=SONOS Co., Ltd.
 
-OUI:00162C*
- ID_OUI_FROM_DATABASE=Xanboo
+OUI:000441*
+ ID_OUI_FROM_DATABASE=Half Dome Systems, Inc.
 
-OUI:001627*
- ID_OUI_FROM_DATABASE=embedded-logic DESIGN AND MORE GmbH
+OUI:00042F*
+ ID_OUI_FROM_DATABASE=International Communications Products, Inc.
 
-OUI:001619*
- ID_OUI_FROM_DATABASE=Lancelan Technologies S.L.
+OUI:000429*
+ ID_OUI_FROM_DATABASE=Pixord Corporation
 
-OUI:001614*
- ID_OUI_FROM_DATABASE=Picosecond Pulse Labs
+OUI:00041C*
+ ID_OUI_FROM_DATABASE=ipDialog, Inc.
 
-OUI:001719*
- ID_OUI_FROM_DATABASE=Audiocodes USA, Inc
+OUI:00041D*
+ ID_OUI_FROM_DATABASE=Corega of America
 
-OUI:00171E*
- ID_OUI_FROM_DATABASE=Theo Benning GmbH & Co. KG
+OUI:000416*
+ ID_OUI_FROM_DATABASE=Parks S/A Comunicacoes Digitais
 
-OUI:001712*
- ID_OUI_FROM_DATABASE=ISCO International
+OUI:000410*
+ ID_OUI_FROM_DATABASE=Spinnaker Networks, Inc.
 
-OUI:00170D*
- ID_OUI_FROM_DATABASE=Dust Networks Inc.
+OUI:00040F*
+ ID_OUI_FROM_DATABASE=Asus Network Technologies, Inc.
 
-OUI:00160F*
- ID_OUI_FROM_DATABASE=BADGER METER INC
+OUI:00040A*
+ ID_OUI_FROM_DATABASE=Sage Systems
 
-OUI:00160A*
- ID_OUI_FROM_DATABASE=SWEEX Europe BV
+OUI:000403*
+ ID_OUI_FROM_DATABASE=Nexsi Corporation
 
-OUI:001603*
- ID_OUI_FROM_DATABASE=COOLKSKY Co., LTD
+OUI:0004F8*
+ ID_OUI_FROM_DATABASE=QUALICABLE TV Industria E Com., Ltda
 
-OUI:0015FC*
- ID_OUI_FROM_DATABASE=Littelfuse Startco
+OUI:0004F2*
+ ID_OUI_FROM_DATABASE=Polycom
 
-OUI:0015F7*
- ID_OUI_FROM_DATABASE=Wintecronics Ltd.
+OUI:0004EB*
+ ID_OUI_FROM_DATABASE=Paxonet Communications, Inc.
 
-OUI:0015F0*
- ID_OUI_FROM_DATABASE=EGO BV
+OUI:0004EC*
+ ID_OUI_FROM_DATABASE=Memobox SA
 
-OUI:0015EA*
- ID_OUI_FROM_DATABASE=Tellumat (Pty) Ltd
+OUI:0004E6*
+ ID_OUI_FROM_DATABASE=Banyan Network Private Limited
 
-OUI:0016C5*
- ID_OUI_FROM_DATABASE=Shenzhen Xing Feng Industry Co.,Ltd
+OUI:0004E1*
+ ID_OUI_FROM_DATABASE=Infinior Microsystems
 
-OUI:0016C7*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0004DB*
+ ID_OUI_FROM_DATABASE=Tellus Group Corp.
 
-OUI:0016CC*
- ID_OUI_FROM_DATABASE=Xcute Mobile Corp.
+OUI:0004E2*
+ ID_OUI_FROM_DATABASE=SMC Networks, Inc.
 
-OUI:0016C0*
- ID_OUI_FROM_DATABASE=Semtech Corporation
+OUI:0004D5*
+ ID_OUI_FROM_DATABASE=Hitachi Information & Communication Engineering, Ltd.
 
-OUI:0016B4*
- ID_OUI_FROM_DATABASE=Private
+OUI:0004CF*
+ ID_OUI_FROM_DATABASE=Seagate Technology
 
-OUI:0016A8*
- ID_OUI_FROM_DATABASE=CWT CO., LTD.
+OUI:0004C9*
+ ID_OUI_FROM_DATABASE=Micro Electron Co., Ltd.
 
-OUI:0016AD*
- ID_OUI_FROM_DATABASE=BT-Links Company Limited
+OUI:000487*
+ ID_OUI_FROM_DATABASE=Cogency Semiconductor, Inc.
 
-OUI:001553*
- ID_OUI_FROM_DATABASE=Cytyc Corporation
+OUI:000482*
+ ID_OUI_FROM_DATABASE=Medialogic Corp.
 
-OUI:001555*
- ID_OUI_FROM_DATABASE=DFM GmbH
+OUI:000478*
+ ID_OUI_FROM_DATABASE=G. Star Technology Corporation
 
-OUI:00154E*
- ID_OUI_FROM_DATABASE=IEC
+OUI:000471*
+ ID_OUI_FROM_DATABASE=IPrad
 
-OUI:001547*
- ID_OUI_FROM_DATABASE=AiZen Solutions Inc.
+OUI:00046B*
+ ID_OUI_FROM_DATABASE=Palm Wireless, Inc.
 
-OUI:001542*
- ID_OUI_FROM_DATABASE=MICROHARD S.R.L.
+OUI:000465*
+ ID_OUI_FROM_DATABASE=i.s.t isdn-support technik GmbH
 
-OUI:00153B*
- ID_OUI_FROM_DATABASE=EMH metering GmbH & Co. KG
+OUI:000459*
+ ID_OUI_FROM_DATABASE=Veristar Corporation
 
-OUI:001534*
- ID_OUI_FROM_DATABASE=A Beltrónica-Companhia de Comunicações, Lda
+OUI:00045E*
+ ID_OUI_FROM_DATABASE=PolyTrax Information Technology AG
 
-OUI:001440*
- ID_OUI_FROM_DATABASE=ATOMIC Corporation
+OUI:000458*
+ ID_OUI_FROM_DATABASE=Fusion X Co., Ltd.
 
-OUI:001439*
- ID_OUI_FROM_DATABASE=Blonder Tongue Laboratories, Inc.
+OUI:000452*
+ ID_OUI_FROM_DATABASE=RocketLogix, Inc.
 
-OUI:001434*
- ID_OUI_FROM_DATABASE=Keri Systems, Inc
+OUI:000442*
+ ID_OUI_FROM_DATABASE=NACT
 
-OUI:00142D*
- ID_OUI_FROM_DATABASE=Toradex AG
+OUI:0003F9*
+ ID_OUI_FROM_DATABASE=Pleiades Communications, Inc.
 
-OUI:001426*
- ID_OUI_FROM_DATABASE=NL Technology
+OUI:0003E2*
+ ID_OUI_FROM_DATABASE=Comspace Corporation
 
-OUI:001421*
- ID_OUI_FROM_DATABASE=Total Wireless Technologies Pte. Ltd.
+OUI:0003F4*
+ ID_OUI_FROM_DATABASE=NetBurner
 
-OUI:00141C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0003F3*
+ ID_OUI_FROM_DATABASE=Dazzle Multimedia, Inc.
 
-OUI:001583*
- ID_OUI_FROM_DATABASE=IVT corporation
+OUI:0003ED*
+ ID_OUI_FROM_DATABASE=Shinkawa Electric Co., Ltd.
 
-OUI:00157E*
- ID_OUI_FROM_DATABASE=Weidmüller Interface GmbH & Co. KG
+OUI:0003E7*
+ ID_OUI_FROM_DATABASE=Logostek Co. Ltd.
 
-OUI:001579*
- ID_OUI_FROM_DATABASE=Lunatone Industrielle Elektronik GmbH
+OUI:0003DF*
+ ID_OUI_FROM_DATABASE=Desana Systems
 
-OUI:001574*
- ID_OUI_FROM_DATABASE=Horizon Semiconductors Ltd.
+OUI:0003DB*
+ ID_OUI_FROM_DATABASE=Apogee Electronics Corp.
 
-OUI:001566*
- ID_OUI_FROM_DATABASE=A-First Technology Co., Ltd.
+OUI:0003D6*
+ ID_OUI_FROM_DATABASE=RADVision, Ltd.
 
-OUI:001561*
- ID_OUI_FROM_DATABASE=JJPlus Corporation
+OUI:0003CF*
+ ID_OUI_FROM_DATABASE=Muxcom, Inc.
 
-OUI:00155A*
- ID_OUI_FROM_DATABASE=DAINIPPON PHARMACEUTICAL CO., LTD.
+OUI:0003C8*
+ ID_OUI_FROM_DATABASE=CML Emergency Services
 
-OUI:001554*
- ID_OUI_FROM_DATABASE=Atalum Wireless S.A.
+OUI:0003C3*
+ ID_OUI_FROM_DATABASE=Micronik Multimedia
 
-OUI:001528*
- ID_OUI_FROM_DATABASE=Beacon Medical Products LLC d.b.a. BeaconMedaes
+OUI:0003C0*
+ ID_OUI_FROM_DATABASE=RFTNC Co., Ltd.
 
-OUI:001521*
- ID_OUI_FROM_DATABASE=Horoquartz
+OUI:0003BC*
+ ID_OUI_FROM_DATABASE=COT GmbH
 
-OUI:001523*
- ID_OUI_FROM_DATABASE=Meteor Communications Corporation
+OUI:0003B1*
+ ID_OUI_FROM_DATABASE=Hospira Inc.
 
-OUI:001522*
- ID_OUI_FROM_DATABASE=Dea Security
+OUI:0003A5*
+ ID_OUI_FROM_DATABASE=Medea Corporation
 
-OUI:00151C*
- ID_OUI_FROM_DATABASE=LENECO
+OUI:0003AA*
+ ID_OUI_FROM_DATABASE=Watlow
 
-OUI:001512*
- ID_OUI_FROM_DATABASE=Zurich University of Applied Sciences
+OUI:0003A2*
+ ID_OUI_FROM_DATABASE=Catapult Communications
 
-OUI:00150B*
- ID_OUI_FROM_DATABASE=SAGE INFOTECH LTD.
+OUI:000397*
+ ID_OUI_FROM_DATABASE=Watchfront Limited
 
-OUI:001506*
- ID_OUI_FROM_DATABASE=Neo Photonics
+OUI:00039E*
+ ID_OUI_FROM_DATABASE=Tera System Co., Ltd.
 
-OUI:0014FF*
- ID_OUI_FROM_DATABASE=Precise Automation, Inc.
+OUI:000392*
+ ID_OUI_FROM_DATABASE=Hyundai Teletek Co., Ltd.
 
-OUI:0014F8*
- ID_OUI_FROM_DATABASE=Scientific Atlanta
+OUI:00038F*
+ ID_OUI_FROM_DATABASE=Weinschel Corporation
 
-OUI:0014F3*
- ID_OUI_FROM_DATABASE=ViXS Systems Inc
+OUI:00038B*
+ ID_OUI_FROM_DATABASE=PLUS-ONE I&T, Inc.
 
-OUI:0014E7*
- ID_OUI_FROM_DATABASE=Stolinx,. Inc
+OUI:000386*
+ ID_OUI_FROM_DATABASE=Ho Net, Inc.
 
-OUI:0014EC*
- ID_OUI_FROM_DATABASE=Acro Telecom
+OUI:00037D*
+ ID_OUI_FROM_DATABASE=Stellcom
 
-OUI:0014E2*
- ID_OUI_FROM_DATABASE=datacom systems inc.
+OUI:000382*
+ ID_OUI_FROM_DATABASE=A-One Co., Ltd.
 
-OUI:0014D6*
- ID_OUI_FROM_DATABASE=Jeongmin Electronics Co.,Ltd.
+OUI:00037A*
+ ID_OUI_FROM_DATABASE=Taiyo Yuden Co., Ltd.
 
-OUI:0014DB*
- ID_OUI_FROM_DATABASE=Elma Trenew Electronic GmbH
+OUI:000376*
+ ID_OUI_FROM_DATABASE=Graphtec Technology, Inc.
 
-OUI:0014DD*
- ID_OUI_FROM_DATABASE=Covergence Inc.
+OUI:000369*
+ ID_OUI_FROM_DATABASE=Nippon Antenna Co., Ltd.
 
-OUI:0014DC*
- ID_OUI_FROM_DATABASE=Communication System Design & Manufacturing (CSDM)
+OUI:00036F*
+ ID_OUI_FROM_DATABASE=Telsey SPA
 
-OUI:0014CF*
- ID_OUI_FROM_DATABASE=INVISIO Communications
+OUI:000363*
+ ID_OUI_FROM_DATABASE=Miraesys Co., Ltd.
 
-OUI:0014CA*
- ID_OUI_FROM_DATABASE=Key Radio Systems Limited
+OUI:00035E*
+ ID_OUI_FROM_DATABASE=Metropolitan Area Networks, Inc.
 
-OUI:0014C3*
- ID_OUI_FROM_DATABASE=Seagate Technology
+OUI:000357*
+ ID_OUI_FROM_DATABASE=Intervoice-Brite, Inc.
 
-OUI:0014BC*
- ID_OUI_FROM_DATABASE=SYNECTIC TELECOM EXPORTS PVT. LTD.
+OUI:00034C*
+ ID_OUI_FROM_DATABASE=Shanghai DigiVision Technology Co., Ltd.
 
-OUI:0014B7*
- ID_OUI_FROM_DATABASE=AR Infotek Inc.
+OUI:000351*
+ ID_OUI_FROM_DATABASE=Diebold, Inc.
 
-OUI:0014AD*
- ID_OUI_FROM_DATABASE=Gassner Wiege- und Meßtechnik GmbH
+OUI:000311*
+ ID_OUI_FROM_DATABASE=Micro Technology Co., Ltd.
 
-OUI:0014B2*
- ID_OUI_FROM_DATABASE=mCubelogics Corporation
+OUI:00030A*
+ ID_OUI_FROM_DATABASE=Argus Technologies
 
-OUI:0014A6*
- ID_OUI_FROM_DATABASE=Teranetics, Inc.
+OUI:000305*
+ ID_OUI_FROM_DATABASE=MSC Vertriebs GmbH
 
-OUI:00149F*
- ID_OUI_FROM_DATABASE=System and Chips, Inc.
+OUI:0002FE*
+ ID_OUI_FROM_DATABASE=Viditec, Inc.
 
-OUI:0014A1*
- ID_OUI_FROM_DATABASE=Synchronous Communication Corp
+OUI:0002F2*
+ ID_OUI_FROM_DATABASE=eDevice, Inc.
 
-OUI:001470*
- ID_OUI_FROM_DATABASE=Prokom Software SA
+OUI:0002F7*
+ ID_OUI_FROM_DATABASE=ARM
 
-OUI:001469*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0002EC*
+ ID_OUI_FROM_DATABASE=Maschoff Design Engineering
 
-OUI:001462*
- ID_OUI_FROM_DATABASE=Digiwell Technology, inc
+OUI:0002E4*
+ ID_OUI_FROM_DATABASE=JC HYUN Systems, Inc.
 
-OUI:00145D*
- ID_OUI_FROM_DATABASE=WJ Communications, Inc.
+OUI:0002E7*
+ ID_OUI_FROM_DATABASE=CAB GmbH & Co KG
 
-OUI:001450*
- ID_OUI_FROM_DATABASE=Heim Systems GmbH
+OUI:0002E0*
+ ID_OUI_FROM_DATABASE=ETAS GmbH
 
-OUI:001456*
- ID_OUI_FROM_DATABASE=Edge Products
+OUI:0002D9*
+ ID_OUI_FROM_DATABASE=Reliable Controls
 
-OUI:00144C*
- ID_OUI_FROM_DATABASE=General Meters Corp.
+OUI:0002D4*
+ ID_OUI_FROM_DATABASE=PDA Peripherals, Inc.
 
-OUI:001445*
- ID_OUI_FROM_DATABASE=Telefon-Gradnja d.o.o.
+OUI:0002D1*
+ ID_OUI_FROM_DATABASE=Vivotek, Inc.
 
-OUI:001447*
- ID_OUI_FROM_DATABASE=BOAZ Inc.
+OUI:0002CD*
+ ID_OUI_FROM_DATABASE=TeleDream, Inc.
 
-OUI:001446*
- ID_OUI_FROM_DATABASE=SuperVision Solutions LLC
+OUI:000349*
+ ID_OUI_FROM_DATABASE=Vidicode Datacommunicatie B.V.
 
-OUI:0015B3*
- ID_OUI_FROM_DATABASE=Caretech AB
+OUI:000340*
+ ID_OUI_FROM_DATABASE=Floware Wireless Systems, Ltd.
 
-OUI:0015A9*
- ID_OUI_FROM_DATABASE=KWANG WOO I&C CO.,LTD
+OUI:008037*
+ ID_OUI_FROM_DATABASE=Ericsson Group
 
-OUI:00159D*
- ID_OUI_FROM_DATABASE=Tripp Lite
+OUI:000332*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001591*
- ID_OUI_FROM_DATABASE=RLW Inc.
+OUI:000339*
+ ID_OUI_FROM_DATABASE=Eurologic Systems, Ltd.
 
-OUI:00158A*
- ID_OUI_FROM_DATABASE=SURECOM Technology Corp.
+OUI:00032A*
+ ID_OUI_FROM_DATABASE=UniData Communication Systems, Inc.
 
-OUI:00158F*
- ID_OUI_FROM_DATABASE=NTT Advanced Technology Corporation
+OUI:00032D*
+ ID_OUI_FROM_DATABASE=IBASE Technology, Inc.
 
-OUI:001590*
- ID_OUI_FROM_DATABASE=Hectronic GmbH
+OUI:000326*
+ ID_OUI_FROM_DATABASE=Iwasaki Information Systems Co., Ltd.
 
-OUI:0014A0*
- ID_OUI_FROM_DATABASE=Accsense, Inc.
+OUI:00031D*
+ ID_OUI_FROM_DATABASE=Taiwan Commate Computer, Inc.
 
-OUI:001493*
- ID_OUI_FROM_DATABASE=Systimax Solutions
+OUI:000318*
+ ID_OUI_FROM_DATABASE=Cyras Systems, Inc.
 
-OUI:00148E*
- ID_OUI_FROM_DATABASE=Tele Power Inc.
+OUI:0004C2*
+ ID_OUI_FROM_DATABASE=Magnipix, Inc.
 
-OUI:001487*
- ID_OUI_FROM_DATABASE=American Technology Integrators
+OUI:0004B6*
+ ID_OUI_FROM_DATABASE=Stratex Networks, Inc.
 
-OUI:001482*
- ID_OUI_FROM_DATABASE=Aurora Networks
+OUI:0004BC*
+ ID_OUI_FROM_DATABASE=Giantec, Inc.
 
-OUI:001481*
- ID_OUI_FROM_DATABASE=Multilink Inc
+OUI:0004B0*
+ ID_OUI_FROM_DATABASE=ELESIGN Co., Ltd.
 
-OUI:00147C*
- ID_OUI_FROM_DATABASE=3Com Ltd
+OUI:0004A9*
+ ID_OUI_FROM_DATABASE=SandStream Technologies, Inc.
 
-OUI:001475*
- ID_OUI_FROM_DATABASE=Wiline Networks, Inc.
+OUI:0004A8*
+ ID_OUI_FROM_DATABASE=Broadmax Technologies, Inc.
 
-OUI:0012E7*
- ID_OUI_FROM_DATABASE=Projectek Networking Electronics Corp.
+OUI:0004A2*
+ ID_OUI_FROM_DATABASE=L.S.I. Japan Co., Ltd.
 
-OUI:0012E8*
- ID_OUI_FROM_DATABASE=Fraunhofer IMS
+OUI:00049B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0012DB*
- ID_OUI_FROM_DATABASE=ZIEHL industrie-elektronik GmbH + Co KG
+OUI:00049C*
+ ID_OUI_FROM_DATABASE=Surgient Networks, Inc.
 
-OUI:0012E2*
- ID_OUI_FROM_DATABASE=ALAXALA Networks Corporation
+OUI:00048F*
+ ID_OUI_FROM_DATABASE=TD Systems Corporation
 
-OUI:0012D6*
- ID_OUI_FROM_DATABASE=Jiangsu Yitong High-Tech Co.,Ltd
+OUI:000488*
+ ID_OUI_FROM_DATABASE=Eurotherm Controls
 
-OUI:0012D5*
- ID_OUI_FROM_DATABASE=Motion Reality Inc.
+OUI:000281*
+ ID_OUI_FROM_DATABASE=Madge Ltd.
 
-OUI:0012C3*
- ID_OUI_FROM_DATABASE=WIT S.A.
+OUI:009064*
+ ID_OUI_FROM_DATABASE=Thomson Inc.
 
-OUI:0013E5*
- ID_OUI_FROM_DATABASE=TENOSYS, INC.
+OUI:00027F*
+ ID_OUI_FROM_DATABASE=ask-technologies.com
 
-OUI:0013EA*
- ID_OUI_FROM_DATABASE=Kamstrup A/S
+OUI:00027A*
+ ID_OUI_FROM_DATABASE=IOI Technology Corporation
 
-OUI:0013DE*
- ID_OUI_FROM_DATABASE=Adapt4, LLC
+OUI:000273*
+ ID_OUI_FROM_DATABASE=Coriolis Networks
 
-OUI:0013D7*
- ID_OUI_FROM_DATABASE=SPIDCOM Technologies SA
+OUI:00026E*
+ ID_OUI_FROM_DATABASE=NeGeN Access, Inc.
 
-OUI:0013D8*
- ID_OUI_FROM_DATABASE=Princeton Instruments
+OUI:000263*
+ ID_OUI_FROM_DATABASE=UPS Manufacturing SRL
 
-OUI:0013CF*
- ID_OUI_FROM_DATABASE=4Access Communications
+OUI:00025C*
+ ID_OUI_FROM_DATABASE=SCI Systems (Kunshan) Co., Ltd.
 
-OUI:0013D2*
- ID_OUI_FROM_DATABASE=PAGE IBERICA, S.A.
+OUI:000253*
+ ID_OUI_FROM_DATABASE=Televideo, Inc.
 
-OUI:0013C9*
- ID_OUI_FROM_DATABASE=Beyond Achieve Enterprises Ltd.
+OUI:00024C*
+ ID_OUI_FROM_DATABASE=SiByte, Inc.
 
-OUI:0013C2*
- ID_OUI_FROM_DATABASE=WACOM Co.,Ltd
+OUI:00024E*
+ ID_OUI_FROM_DATABASE=Datacard Group
 
-OUI:0013BD*
- ID_OUI_FROM_DATABASE=HYMATOM SA
+OUI:00012F*
+ ID_OUI_FROM_DATABASE=Twinhead International Corp
 
-OUI:0013B8*
- ID_OUI_FROM_DATABASE=RyCo Electronic Systems Limited
+OUI:00023C*
+ ID_OUI_FROM_DATABASE=Creative Technology, Ltd.
 
-OUI:00134E*
- ID_OUI_FROM_DATABASE=Valox Systems, Inc.
+OUI:000240*
+ ID_OUI_FROM_DATABASE=Seedek Co., Ltd.
 
-OUI:001353*
- ID_OUI_FROM_DATABASE=HYDAC Filtertechnik GMBH
+OUI:000247*
+ ID_OUI_FROM_DATABASE=Great Dragon Information Technology (Group) Co., Ltd.
 
-OUI:00134D*
- ID_OUI_FROM_DATABASE=Inepro BV
+OUI:000243*
+ ID_OUI_FROM_DATABASE=Raysis Co., Ltd.
 
-OUI:001347*
- ID_OUI_FROM_DATABASE=Red Lion Controls, LP
+OUI:000239*
+ ID_OUI_FROM_DATABASE=Visicom
 
-OUI:00133B*
- ID_OUI_FROM_DATABASE=Speed Dragon Multimedia Limited
+OUI:000236*
+ ID_OUI_FROM_DATABASE=INIT GmbH
 
-OUI:001340*
- ID_OUI_FROM_DATABASE=AD.EL s.r.l.
+OUI:000231*
+ ID_OUI_FROM_DATABASE=Ingersoll-Rand
 
-OUI:00132E*
- ID_OUI_FROM_DATABASE=ITian Coporation
+OUI:00022A*
+ ID_OUI_FROM_DATABASE=Asound Electronic
 
-OUI:001328*
- ID_OUI_FROM_DATABASE=Westech Korea Inc.,
+OUI:00022D*
+ ID_OUI_FROM_DATABASE=Agere Systems
 
-OUI:00132D*
- ID_OUI_FROM_DATABASE=iWise Communications
+OUI:000219*
+ ID_OUI_FROM_DATABASE=Paralon Technologies
 
-OUI:001334*
- ID_OUI_FROM_DATABASE=Arkados, Inc.
+OUI:000186*
+ ID_OUI_FROM_DATABASE=Uwe Disch
 
-OUI:0013B3*
- ID_OUI_FROM_DATABASE=Ecom Communications Technology Co., Ltd.
+OUI:00017B*
+ ID_OUI_FROM_DATABASE=Heidelberger Druckmaschinen AG
 
-OUI:0013AC*
- ID_OUI_FROM_DATABASE=Sunmyung Electronics Co., LTD
+OUI:000182*
+ ID_OUI_FROM_DATABASE=DICA TECHNOLOGIES AG
 
-OUI:0013A6*
- ID_OUI_FROM_DATABASE=Extricom Ltd
+OUI:00018E*
+ ID_OUI_FROM_DATABASE=Logitec Corporation
 
-OUI:0013A5*
- ID_OUI_FROM_DATABASE=General Solutions, LTD.
+OUI:00019B*
+ ID_OUI_FROM_DATABASE=Kyoto Microcomputer Co., Ltd.
 
-OUI:0013A0*
- ID_OUI_FROM_DATABASE=ALGOSYSTEM Co., Ltd.
+OUI:000194*
+ ID_OUI_FROM_DATABASE=Capital Equipment Corporation
 
-OUI:001399*
- ID_OUI_FROM_DATABASE=STAC Corporation.
+OUI:000197*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001393*
- ID_OUI_FROM_DATABASE=Panta Systems, Inc.
+OUI:0001A3*
+ ID_OUI_FROM_DATABASE=GENESYS LOGIC, INC.
 
-OUI:001394*
- ID_OUI_FROM_DATABASE=Infohand Co.,Ltd
+OUI:00014E*
+ ID_OUI_FROM_DATABASE=WIN Enterprises, Inc.
 
-OUI:00138D*
- ID_OUI_FROM_DATABASE=Kinghold
+OUI:0030AC*
+ ID_OUI_FROM_DATABASE=Systeme Lauer GmbH & Co., Ltd.
 
-OUI:0012C8*
- ID_OUI_FROM_DATABASE=Perfect tech
+OUI:00013E*
+ ID_OUI_FROM_DATABASE=Ascom Tateco AB
 
-OUI:0012B9*
- ID_OUI_FROM_DATABASE=Fusion Digital Technology
+OUI:000145*
+ ID_OUI_FROM_DATABASE=WINSYSTEMS, INC.
 
-OUI:0012BE*
- ID_OUI_FROM_DATABASE=Astek Corporation
+OUI:000126*
+ ID_OUI_FROM_DATABASE=PAC Labs
 
-OUI:0012AC*
- ID_OUI_FROM_DATABASE=ONTIMETEK INC.
+OUI:00011A*
+ ID_OUI_FROM_DATABASE=Hoffmann und Burmeister GbR
 
-OUI:0012AB*
- ID_OUI_FROM_DATABASE=WiLife, Inc.
+OUI:00011D*
+ ID_OUI_FROM_DATABASE=Centillium Communications
 
-OUI:0012B2*
- ID_OUI_FROM_DATABASE=AVOLITES LTD.
+OUI:000129*
+ ID_OUI_FROM_DATABASE=DFI Inc.
 
-OUI:0012A6*
- ID_OUI_FROM_DATABASE=Dolby Australia
+OUI:000107*
+ ID_OUI_FROM_DATABASE=Leiser GmbH
 
-OUI:001378*
- ID_OUI_FROM_DATABASE=Qsan Technology, Inc.
+OUI:00010E*
+ ID_OUI_FROM_DATABASE=Bri-Link Technologies Co., Ltd
 
-OUI:00137D*
- ID_OUI_FROM_DATABASE=Dynalab, Inc.
+OUI:000116*
+ ID_OUI_FROM_DATABASE=Netspect Technologies, Inc.
 
-OUI:001384*
- ID_OUI_FROM_DATABASE=Advanced Motion Controls
+OUI:000103*
+ ID_OUI_FROM_DATABASE=3COM CORPORATION
 
-OUI:00137E*
- ID_OUI_FROM_DATABASE=CorEdge Networks, Inc.
+OUI:00062B*
+ ID_OUI_FROM_DATABASE=INTRASERVER TECHNOLOGY
 
-OUI:00136C*
- ID_OUI_FROM_DATABASE=TomTom
+OUI:0002C1*
+ ID_OUI_FROM_DATABASE=Innovative Electronic Designs, Inc.
 
-OUI:00136B*
- ID_OUI_FROM_DATABASE=E-TEC
+OUI:0002C8*
+ ID_OUI_FROM_DATABASE=Technocom Communications Technology (pte) Ltd
 
-OUI:001359*
- ID_OUI_FROM_DATABASE=ProTelevision Technologies A/S
+OUI:0002A9*
+ ID_OUI_FROM_DATABASE=RACOM, s.r.o.
 
-OUI:00135E*
- ID_OUI_FROM_DATABASE=EAB/RWI/K
+OUI:0002B8*
+ ID_OUI_FROM_DATABASE=WHI KONSULT AB
 
-OUI:00129F*
- ID_OUI_FROM_DATABASE=RAE Systems
+OUI:0002AC*
+ ID_OUI_FROM_DATABASE=3PAR data
 
-OUI:001299*
- ID_OUI_FROM_DATABASE=Ktech Telecommunications Inc
+OUI:0002B1*
+ ID_OUI_FROM_DATABASE=Anritsu, Ltd.
 
-OUI:00129A*
- ID_OUI_FROM_DATABASE=IRT Electronics Pty Ltd
+OUI:00029A*
+ ID_OUI_FROM_DATABASE=Storage Apps
 
-OUI:00128C*
- ID_OUI_FROM_DATABASE=Woodward Governor
+OUI:0002A0*
+ ID_OUI_FROM_DATABASE=Flatstack Ltd.
 
-OUI:001293*
- ID_OUI_FROM_DATABASE=GE Energy
+OUI:000295*
+ ID_OUI_FROM_DATABASE=IP.Access Limited
 
-OUI:001287*
- ID_OUI_FROM_DATABASE=Digital Everywhere Unterhaltungselektronik GmbH
+OUI:000294*
+ ID_OUI_FROM_DATABASE=Tokyo Sokushin Co., Ltd.
 
-OUI:001280*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000290*
+ ID_OUI_FROM_DATABASE=Woorigisool, Inc.
 
-OUI:00131E*
- ID_OUI_FROM_DATABASE=Peiker acustic GmbH & Co. KG
+OUI:000286*
+ ID_OUI_FROM_DATABASE=Occam Networks
 
-OUI:001323*
- ID_OUI_FROM_DATABASE=Cap Co., Ltd.
+OUI:00028B*
+ ID_OUI_FROM_DATABASE=VDSL Systems OY
 
-OUI:00130B*
- ID_OUI_FROM_DATABASE=Mextal B.V.
+OUI:000222*
+ ID_OUI_FROM_DATABASE=Chromisys, Inc.
 
-OUI:001312*
- ID_OUI_FROM_DATABASE=Amedia Networks Inc.
+OUI:00021D*
+ ID_OUI_FROM_DATABASE=Data General Communication Ltd.
 
-OUI:0012F8*
- ID_OUI_FROM_DATABASE=WNI Resources, LLC
+OUI:00020A*
+ ID_OUI_FROM_DATABASE=Gefran Spa
 
-OUI:0012FF*
- ID_OUI_FROM_DATABASE=Lely Industries N.V.
+OUI:000216*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001304*
- ID_OUI_FROM_DATABASE=Flaircomm Technologies Co. LTD
+OUI:000206*
+ ID_OUI_FROM_DATABASE=Telital R&D Denmark A/S
 
-OUI:001410*
- ID_OUI_FROM_DATABASE=Suzhou Keda Technology CO.,Ltd
+OUI:000203*
+ ID_OUI_FROM_DATABASE=Woonsang Telecom, Inc.
 
-OUI:001417*
- ID_OUI_FROM_DATABASE=RSE Informations Technologie GmbH
+OUI:0001F7*
+ ID_OUI_FROM_DATABASE=Image Display Systems, Inc.
 
-OUI:001408*
- ID_OUI_FROM_DATABASE=Eka Systems Inc.
+OUI:0001EE*
+ ID_OUI_FROM_DATABASE=Comtrol Europe, Ltd.
 
-OUI:001402*
- ID_OUI_FROM_DATABASE=kk-electronic a/s
+OUI:0001E2*
+ ID_OUI_FROM_DATABASE=Ando Electric Corporation
 
-OUI:001401*
- ID_OUI_FROM_DATABASE=Rivertree Networks Corp.
+OUI:0001F1*
+ ID_OUI_FROM_DATABASE=Innovative Concepts, Inc.
 
-OUI:0013FB*
- ID_OUI_FROM_DATABASE=RKC INSTRUMENT INC.
+OUI:00B06D*
+ ID_OUI_FROM_DATABASE=Jones Futurex Inc.
 
-OUI:0013F4*
- ID_OUI_FROM_DATABASE=Psitek (Pty) Ltd
+OUI:0030FE*
+ ID_OUI_FROM_DATABASE=DSA GmbH
 
-OUI:0013EF*
- ID_OUI_FROM_DATABASE=Kingjon Digital Technology Co.,Ltd
+OUI:00305E*
+ ID_OUI_FROM_DATABASE=Abelko Innovation
 
-OUI:0011F7*
- ID_OUI_FROM_DATABASE=Shenzhen Forward Industry Co., Ltd
+OUI:00301E*
+ ID_OUI_FROM_DATABASE=3COM EUROPE LTD.
 
-OUI:0011F2*
- ID_OUI_FROM_DATABASE=Institute of Network Technologies
+OUI:00304D*
+ ID_OUI_FROM_DATABASE=ESI
 
-OUI:0011EB*
- ID_OUI_FROM_DATABASE=Innovative Integration
+OUI:003046*
+ ID_OUI_FROM_DATABASE=Controlled Electronic Manageme
 
-OUI:0011E6*
- ID_OUI_FROM_DATABASE=Scientific Atlanta
+OUI:00307B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0011E5*
- ID_OUI_FROM_DATABASE=KCodes Corporation
+OUI:0001D6*
+ ID_OUI_FROM_DATABASE=manroland AG
 
-OUI:0011DF*
- ID_OUI_FROM_DATABASE=Current Energy
+OUI:0001DB*
+ ID_OUI_FROM_DATABASE=Freecom Technologies GmbH
 
-OUI:0011D3*
- ID_OUI_FROM_DATABASE=NextGenTel Holding ASA
+OUI:0001DE*
+ ID_OUI_FROM_DATABASE=Trango Systems, Inc.
 
-OUI:00110E*
- ID_OUI_FROM_DATABASE=Tsurusaki Sealand Transportation Co. Ltd.
+OUI:0001CF*
+ ID_OUI_FROM_DATABASE=Alpha Data Parallel Systems, Ltd.
 
-OUI:001115*
- ID_OUI_FROM_DATABASE=EPIN Technologies, Inc.
+OUI:0001CB*
+ ID_OUI_FROM_DATABASE=EVR
 
-OUI:001114*
- ID_OUI_FROM_DATABASE=EverFocus Electronics Corp.
+OUI:0001C4*
+ ID_OUI_FROM_DATABASE=NeoWave, Inc.
 
-OUI:001107*
- ID_OUI_FROM_DATABASE=RGB Networks Inc.
+OUI:0001C0*
+ ID_OUI_FROM_DATABASE=CompuLab, Ltd.
 
-OUI:001108*
- ID_OUI_FROM_DATABASE=Orbital Data Corporation
+OUI:0001B9*
+ ID_OUI_FROM_DATABASE=SKF Condition Monitoring
 
-OUI:001102*
- ID_OUI_FROM_DATABASE=Aurora Multimedia Corp.
+OUI:0001B5*
+ ID_OUI_FROM_DATABASE=Turin Networks, Inc.
 
-OUI:000FFC*
- ID_OUI_FROM_DATABASE=Merit Li-Lin Ent.
+OUI:00017F*
+ ID_OUI_FROM_DATABASE=Experience Music Project
 
-OUI:000FDA*
- ID_OUI_FROM_DATABASE=YAZAKI CORPORATION
+OUI:00016C*
+ ID_OUI_FROM_DATABASE=FOXCONN
 
-OUI:000FF3*
- ID_OUI_FROM_DATABASE=Jung Myoung Communications&Technology
+OUI:000173*
+ ID_OUI_FROM_DATABASE=AMCC
 
-OUI:0011A2*
- ID_OUI_FROM_DATABASE=Manufacturing Technology Inc
+OUI:00015C*
+ ID_OUI_FROM_DATABASE=CADANT INC.
 
-OUI:00119B*
- ID_OUI_FROM_DATABASE=Telesynergy Research Inc.
+OUI:000163*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00118C*
- ID_OUI_FROM_DATABASE=Missouri Department of Transportation
+OUI:00010A*
+ ID_OUI_FROM_DATABASE=CIS TECHNOLOGY INC.
 
-OUI:001191*
- ID_OUI_FROM_DATABASE=CTS-Clima Temperatur Systeme GmbH
+OUI:00016F*
+ ID_OUI_FROM_DATABASE=Inkel Corp.
 
-OUI:00118B*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent, Enterprise Business Group
+OUI:000155*
+ ID_OUI_FROM_DATABASE=Promise Technology, Inc.
 
-OUI:001196*
- ID_OUI_FROM_DATABASE=Actuality Systems, Inc.
+OUI:000151*
+ ID_OUI_FROM_DATABASE=Ensemble Communications
 
-OUI:00117E*
- ID_OUI_FROM_DATABASE=Progeny, A division of Midmark Corp
+OUI:000142*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001179*
- ID_OUI_FROM_DATABASE=Singular Technology Co. Ltd.
+OUI:000132*
+ ID_OUI_FROM_DATABASE=Dranetz - BMI
 
-OUI:001172*
- ID_OUI_FROM_DATABASE=COTRON CORPORATION
+OUI:00D07D*
+ ID_OUI_FROM_DATABASE=COSINE COMMUNICATIONS
 
-OUI:001166*
- ID_OUI_FROM_DATABASE=Taelim Electronics Co., Ltd.
+OUI:00D0CA*
+ ID_OUI_FROM_DATABASE=Intrinsyc Software International Inc.
 
-OUI:00116B*
- ID_OUI_FROM_DATABASE=Digital Data Communications Asia Co.,Ltd
+OUI:00D058*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00116C*
- ID_OUI_FROM_DATABASE=Nanwang Multimedia Inc.,Ltd
+OUI:00D067*
+ ID_OUI_FROM_DATABASE=CAMPIO COMMUNICATIONS
 
-OUI:001162*
- ID_OUI_FROM_DATABASE=STAR MICRONICS CO.,LTD.
+OUI:00D023*
+ ID_OUI_FROM_DATABASE=INFORTREND TECHNOLOGY, INC.
 
-OUI:001161*
- ID_OUI_FROM_DATABASE=NetStreams, LLC
+OUI:00D02A*
+ ID_OUI_FROM_DATABASE=Voxent Systems Ltd.
 
-OUI:001155*
- ID_OUI_FROM_DATABASE=Sevis Systems
+OUI:00D068*
+ ID_OUI_FROM_DATABASE=IWILL CORPORATION
 
-OUI:00115C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00D09D*
+ ID_OUI_FROM_DATABASE=VERIS INDUSTRIES
 
-OUI:001147*
- ID_OUI_FROM_DATABASE=Secom-Industry co.LTD.
+OUI:00D09A*
+ ID_OUI_FROM_DATABASE=FILANET CORPORATION
 
-OUI:00114C*
- ID_OUI_FROM_DATABASE=caffeina applied research ltd.
+OUI:00D00A*
+ ID_OUI_FROM_DATABASE=LANACCESS TELECOM S.A.
 
-OUI:001274*
- ID_OUI_FROM_DATABASE=NIT lab
+OUI:00D04A*
+ ID_OUI_FROM_DATABASE=PRESENCE TECHNOLOGY GMBH
 
-OUI:00127A*
- ID_OUI_FROM_DATABASE=Sanyu Industry Co.,Ltd.
+OUI:00D0C3*
+ ID_OUI_FROM_DATABASE=VIVID TECHNOLOGY PTE, LTD.
 
-OUI:00126D*
- ID_OUI_FROM_DATABASE=University of California, Berkeley
+OUI:00D0F8*
+ ID_OUI_FROM_DATABASE=FUJIAN STAR TERMINAL
 
-OUI:001268*
- ID_OUI_FROM_DATABASE=IPS d.o.o.
+OUI:00D096*
+ ID_OUI_FROM_DATABASE=3COM EUROPE LTD.
 
-OUI:001267*
- ID_OUI_FROM_DATABASE=Panasonic Corporation
+OUI:00D003*
+ ID_OUI_FROM_DATABASE=COMDA ENTERPRISES CORP.
 
-OUI:001261*
- ID_OUI_FROM_DATABASE=Adaptix, Inc
+OUI:00D029*
+ ID_OUI_FROM_DATABASE=WAKEFERN FOOD CORPORATION
 
-OUI:001257*
- ID_OUI_FROM_DATABASE=LeapComm Communication Technologies Inc.
+OUI:00D0F5*
+ ID_OUI_FROM_DATABASE=ORANGE MICRO, INC.
 
-OUI:001222*
- ID_OUI_FROM_DATABASE=Skardin (UK) Ltd
+OUI:00D0F7*
+ ID_OUI_FROM_DATABASE=NEXT NETS CORPORATION
 
-OUI:001227*
- ID_OUI_FROM_DATABASE=Franklin Electric Co., Inc.
+OUI:00D078*
+ ID_OUI_FROM_DATABASE=Eltex of Sweden AB
 
-OUI:00121B*
- ID_OUI_FROM_DATABASE=Sound Devices, LLC
+OUI:00D0AF*
+ ID_OUI_FROM_DATABASE=CUTLER-HAMMER, INC.
 
-OUI:001221*
- ID_OUI_FROM_DATABASE=B.Braun Melsungen AG
+OUI:00D026*
+ ID_OUI_FROM_DATABASE=HIRSCHMANN AUSTRIA GMBH
 
-OUI:001214*
- ID_OUI_FROM_DATABASE=Koenig & Bauer AG
+OUI:00D010*
+ ID_OUI_FROM_DATABASE=CONVERGENT NETWORKS, INC.
 
-OUI:00120F*
- ID_OUI_FROM_DATABASE=IEEE 802.3
+OUI:00D074*
+ ID_OUI_FROM_DATABASE=TAQUA SYSTEMS, INC.
 
-OUI:001208*
- ID_OUI_FROM_DATABASE=Gantner Instruments GmbH
+OUI:00D0D5*
+ ID_OUI_FROM_DATABASE=GRUNDIG AG
 
-OUI:001201*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00D034*
+ ID_OUI_FROM_DATABASE=ORMEC SYSTEMS CORP.
 
-OUI:001202*
- ID_OUI_FROM_DATABASE=Decrane Aerospace - Audio International Inc.
+OUI:00D08C*
+ ID_OUI_FROM_DATABASE=GENOA TECHNOLOGY, INC.
 
-OUI:0011C7*
- ID_OUI_FROM_DATABASE=Raymarine UK Ltd
+OUI:00D059*
+ ID_OUI_FROM_DATABASE=AMBIT MICROSYSTEMS CORP.
 
-OUI:0011CC*
- ID_OUI_FROM_DATABASE=Guangzhou Jinpeng Group Co.,Ltd.
+OUI:005020*
+ ID_OUI_FROM_DATABASE=MEDIASTAR CO., LTD.
 
-OUI:0011B5*
- ID_OUI_FROM_DATABASE=Shenzhen Powercom Co.,Ltd
+OUI:00503E*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0011BA*
- ID_OUI_FROM_DATABASE=Elexol Pty Ltd
+OUI:00D02B*
+ ID_OUI_FROM_DATABASE=JETCELL, INC.
 
-OUI:0011C1*
- ID_OUI_FROM_DATABASE=4P MOBILE DATA PROCESSING
+OUI:005017*
+ ID_OUI_FROM_DATABASE=RSR S.R.L.
 
-OUI:0011A8*
- ID_OUI_FROM_DATABASE=Quest Technologies
+OUI:00D0CC*
+ ID_OUI_FROM_DATABASE=TECHNOLOGIES LYRE INC.
 
-OUI:0011A7*
- ID_OUI_FROM_DATABASE=Infilco Degremont Inc.
+OUI:00506D*
+ ID_OUI_FROM_DATABASE=VIDEOJET SYSTEMS
 
-OUI:001250*
- ID_OUI_FROM_DATABASE=Tokyo Aircaft Instrument Co., Ltd.
+OUI:005077*
+ ID_OUI_FROM_DATABASE=PROLIFIC TECHNOLOGY, INC.
 
-OUI:00124B*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:0050D4*
+ ID_OUI_FROM_DATABASE=JOOHONG INFORMATION &
 
-OUI:001244*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00505E*
+ ID_OUI_FROM_DATABASE=DIGITEK MICROLOGIC S.A.
 
-OUI:001238*
- ID_OUI_FROM_DATABASE=SetaBox Technology Co., Ltd.
+OUI:0050E7*
+ ID_OUI_FROM_DATABASE=PARADISE INNOVATIONS (ASIA)
 
-OUI:00123D*
- ID_OUI_FROM_DATABASE=GES Co, Ltd
+OUI:0050B9*
+ ID_OUI_FROM_DATABASE=XITRON TECHNOLOGIES, INC.
 
-OUI:00123E*
- ID_OUI_FROM_DATABASE=ERUNE technology Co., Ltd.
+OUI:00D049*
+ ID_OUI_FROM_DATABASE=IMPRESSTEK CO., LTD.
 
-OUI:00122C*
- ID_OUI_FROM_DATABASE=Soenen Controls N.V.
+OUI:00D04D*
+ ID_OUI_FROM_DATABASE=DIV OF RESEARCH & STATISTICS
 
-OUI:001231*
- ID_OUI_FROM_DATABASE=Motion Control Systems, Inc.
+OUI:00D035*
+ ID_OUI_FROM_DATABASE=BEHAVIOR TECH. COMPUTER CORP.
 
-OUI:001146*
- ID_OUI_FROM_DATABASE=Telecard-Pribor Ltd
+OUI:00D02D*
+ ID_OUI_FROM_DATABASE=ADEMCO
 
-OUI:001140*
- ID_OUI_FROM_DATABASE=Nanometrics Inc.
+OUI:00D07C*
+ ID_OUI_FROM_DATABASE=KOYO ELECTRONICS INC. CO.,LTD.
 
-OUI:001139*
- ID_OUI_FROM_DATABASE=STOEBER ANTRIEBSTECHNIK GmbH + Co. KG.
+OUI:00D05B*
+ ID_OUI_FROM_DATABASE=ACROLOOP MOTION CONTROL
 
-OUI:00113A*
- ID_OUI_FROM_DATABASE=SHINBORAM
+OUI:00D0C6*
+ ID_OUI_FROM_DATABASE=THOMAS & BETTS CORP.
 
-OUI:001134*
- ID_OUI_FROM_DATABASE=MediaCell, Inc.
+OUI:00D02E*
+ ID_OUI_FROM_DATABASE=COMMUNICATION AUTOMATION CORP.
 
-OUI:001127*
- ID_OUI_FROM_DATABASE=TASI, Inc
+OUI:00D0DA*
+ ID_OUI_FROM_DATABASE=TAICOM DATA SYSTEMS CO., LTD.
 
-OUI:00112A*
- ID_OUI_FROM_DATABASE=Niko NV
+OUI:00D0E8*
+ ID_OUI_FROM_DATABASE=MAC SYSTEM CO., LTD.
 
-OUI:001121*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00D03C*
+ ID_OUI_FROM_DATABASE=Vieo, Inc.
 
-OUI:000EBB*
- ID_OUI_FROM_DATABASE=Everbee Networks
+OUI:00D09F*
+ ID_OUI_FROM_DATABASE=NOVTEK TEST SYSTEMS
 
-OUI:000EB4*
- ID_OUI_FROM_DATABASE=GUANGZHOU GAOKE COMMUNICATIONS TECHNOLOGY CO.LTD.
+OUI:00D07E*
+ ID_OUI_FROM_DATABASE=KEYCORP LTD.
 
-OUI:000EAE*
- ID_OUI_FROM_DATABASE=GAWELL TECHNOLOGIES CORP.
+OUI:00D0EA*
+ ID_OUI_FROM_DATABASE=NEXTONE COMMUNICATIONS, INC.
 
-OUI:000EA8*
- ID_OUI_FROM_DATABASE=United Technologists Europe Limited
+OUI:00D020*
+ ID_OUI_FROM_DATABASE=AIM SYSTEM, INC.
 
-OUI:000EAD*
- ID_OUI_FROM_DATABASE=Metanoia Technologies, Inc.
+OUI:00D064*
+ ID_OUI_FROM_DATABASE=MULTITEL
 
-OUI:000EA1*
- ID_OUI_FROM_DATABASE=Formosa Teletek Corporation
+OUI:00D072*
+ ID_OUI_FROM_DATABASE=BROADLOGIC
 
-OUI:000E9C*
- ID_OUI_FROM_DATABASE=Benchmark Electronics
+OUI:00309B*
+ ID_OUI_FROM_DATABASE=Smartware
 
-OUI:000E9B*
- ID_OUI_FROM_DATABASE=Ambit Microsystems Corporation
+OUI:0030AF*
+ ID_OUI_FROM_DATABASE=Honeywell GmbH
 
-OUI:000E8E*
- ID_OUI_FROM_DATABASE=SparkLAN Communications, Inc.
+OUI:003074*
+ ID_OUI_FROM_DATABASE=EQUIINET LTD.
 
-OUI:000E95*
- ID_OUI_FROM_DATABASE=Fujiya Denki Seisakusho Co.,Ltd.
+OUI:003090*
+ ID_OUI_FROM_DATABASE=CYRA TECHNOLOGIES, INC.
 
-OUI:000FC1*
- ID_OUI_FROM_DATABASE=WAVE Corporation
+OUI:003030*
+ ID_OUI_FROM_DATABASE=HARMONIX CORPORATION
 
-OUI:000FC8*
- ID_OUI_FROM_DATABASE=Chantry Networks
+OUI:00307C*
+ ID_OUI_FROM_DATABASE=ADID SA
 
-OUI:000FC7*
- ID_OUI_FROM_DATABASE=Dionica R&D Ltd.
+OUI:003063*
+ ID_OUI_FROM_DATABASE=SANTERA SYSTEMS, INC.
 
-OUI:000FBA*
- ID_OUI_FROM_DATABASE=Tevebox AB
+OUI:00309F*
+ ID_OUI_FROM_DATABASE=AMBER NETWORKS
 
-OUI:000FA7*
- ID_OUI_FROM_DATABASE=Raptor Networks Technology
+OUI:0030A8*
+ ID_OUI_FROM_DATABASE=OL'E COMMUNICATIONS, INC.
 
-OUI:000FAE*
- ID_OUI_FROM_DATABASE=E2O Communications
+OUI:00304C*
+ ID_OUI_FROM_DATABASE=APPIAN COMMUNICATIONS, INC.
 
-OUI:000FA8*
- ID_OUI_FROM_DATABASE=Photometrics, Inc.
+OUI:0030EF*
+ ID_OUI_FROM_DATABASE=NEON TECHNOLOGY, INC.
 
-OUI:000F9A*
- ID_OUI_FROM_DATABASE=Synchrony, Inc.
+OUI:00306F*
+ ID_OUI_FROM_DATABASE=SEYEON TECH. CO., LTD.
 
-OUI:000FA2*
- ID_OUI_FROM_DATABASE=2xWireless
+OUI:003031*
+ ID_OUI_FROM_DATABASE=LIGHTWAVE COMMUNICATIONS, INC.
 
-OUI:000E89*
- ID_OUI_FROM_DATABASE=CLEMATIC
+OUI:003035*
+ ID_OUI_FROM_DATABASE=Corning Incorporated
 
-OUI:000E82*
- ID_OUI_FROM_DATABASE=Commtech Wireless
+OUI:00302B*
+ ID_OUI_FROM_DATABASE=INALP NETWORKS, INC.
 
-OUI:000E7C*
- ID_OUI_FROM_DATABASE=Televes S.A.
+OUI:00305F*
+ ID_OUI_FROM_DATABASE=Hasselblad
 
-OUI:000E76*
- ID_OUI_FROM_DATABASE=GEMSOC INNOVISION INC.
+OUI:00302D*
+ ID_OUI_FROM_DATABASE=QUANTUM BRIDGE COMMUNICATIONS
 
-OUI:000E6E*
- ID_OUI_FROM_DATABASE=MAT S.A. (Mircrelec Advanced Technology)
+OUI:003025*
+ ID_OUI_FROM_DATABASE=CHECKOUT COMPUTER SYSTEMS, LTD
 
-OUI:000E72*
- ID_OUI_FROM_DATABASE=CTS electronics
+OUI:003012*
+ ID_OUI_FROM_DATABASE=DIGITAL ENGINEERING LTD.
 
-OUI:000E68*
- ID_OUI_FROM_DATABASE=E-TOP Network Technology Inc.
+OUI:003077*
+ ID_OUI_FROM_DATABASE=ONPREM NETWORKS
 
-OUI:000E67*
- ID_OUI_FROM_DATABASE=Eltis Microelectronics Ltd.
+OUI:0030D4*
+ ID_OUI_FROM_DATABASE=AAE Systems, Inc.
 
-OUI:000FE7*
- ID_OUI_FROM_DATABASE=Lutron Electronics Co., Inc.
+OUI:00D00F*
+ ID_OUI_FROM_DATABASE=SPEECH DESIGN GMBH
 
-OUI:000FEC*
- ID_OUI_FROM_DATABASE=ARKUS Inc.
+OUI:00D0CF*
+ ID_OUI_FROM_DATABASE=MORETON BAY
 
-OUI:000FE0*
- ID_OUI_FROM_DATABASE=NComputing Co.,Ltd.
+OUI:00D073*
+ ID_OUI_FROM_DATABASE=ACN ADVANCED COMMUNICATIONS
 
-OUI:000FD4*
- ID_OUI_FROM_DATABASE=Soundcraft
+OUI:00D030*
+ ID_OUI_FROM_DATABASE=Safetran Systems Corp
 
-OUI:000FD9*
- ID_OUI_FROM_DATABASE=FlexDSL Telecommunications AG
+OUI:00D057*
+ ID_OUI_FROM_DATABASE=ULTRAK, INC.
 
-OUI:000EEA*
- ID_OUI_FROM_DATABASE=Shadong Luneng Jicheng Electronics,Co.,Ltd
+OUI:00D03B*
+ ID_OUI_FROM_DATABASE=VISION PRODUCTS PTY. LTD.
 
-OUI:000EDD*
- ID_OUI_FROM_DATABASE=SHURE INCORPORATED
+OUI:00D0BF*
+ ID_OUI_FROM_DATABASE=PIVOTAL TECHNOLOGIES
 
-OUI:000EE4*
- ID_OUI_FROM_DATABASE=BOE TECHNOLOGY GROUP CO.,LTD
+OUI:00D050*
+ ID_OUI_FROM_DATABASE=ISKRATEL
 
-OUI:000ED8*
- ID_OUI_FROM_DATABASE=Positron Access Solutions Corp
+OUI:00D0CB*
+ ID_OUI_FROM_DATABASE=DASAN CO., LTD.
 
-OUI:000ECD*
- ID_OUI_FROM_DATABASE=SKOV A/S
+OUI:00D0D3*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000ECE*
- ID_OUI_FROM_DATABASE=S.I.T.T.I. S.p.A.
+OUI:00D08E*
+ ID_OUI_FROM_DATABASE=Grass Valley, A Belden Brand
 
-OUI:000ED3*
- ID_OUI_FROM_DATABASE=Epicenter, Inc.
+OUI:00D0A3*
+ ID_OUI_FROM_DATABASE=VOCAL DATA, INC.
 
-OUI:000EC7*
- ID_OUI_FROM_DATABASE=Motorola Korea
+OUI:00D0E0*
+ ID_OUI_FROM_DATABASE=DOOIN ELECTRONICS CO.
 
-OUI:000F93*
- ID_OUI_FROM_DATABASE=Landis+Gyr Ltd.
+OUI:003054*
+ ID_OUI_FROM_DATABASE=CASTLENET TECHNOLOGY, INC.
 
-OUI:000F94*
- ID_OUI_FROM_DATABASE=Genexis BV
+OUI:003039*
+ ID_OUI_FROM_DATABASE=SOFTBOOK PRESS
 
-OUI:000F8E*
- ID_OUI_FROM_DATABASE=DONGYANG TELECOM CO.,LTD.
+OUI:003017*
+ ID_OUI_FROM_DATABASE=BlueArc UK Ltd
 
-OUI:000F87*
- ID_OUI_FROM_DATABASE=Maxcess International
+OUI:003076*
+ ID_OUI_FROM_DATABASE=Akamba Corporation
 
-OUI:000F82*
- ID_OUI_FROM_DATABASE=Mortara Instrument, Inc.
+OUI:00305D*
+ ID_OUI_FROM_DATABASE=DIGITRA SYSTEMS, INC.
 
-OUI:000F81*
- ID_OUI_FROM_DATABASE=PAL Pacific Inc.
+OUI:0030F7*
+ ID_OUI_FROM_DATABASE=RAMIX INC.
 
-OUI:000F74*
- ID_OUI_FROM_DATABASE=Qamcom Technology AB
+OUI:003033*
+ ID_OUI_FROM_DATABASE=ORIENT TELECOM CO., LTD.
 
-OUI:000F7B*
- ID_OUI_FROM_DATABASE=Arce Sistemas, S.A.
+OUI:003083*
+ ID_OUI_FROM_DATABASE=Ivron Systems
 
-OUI:000F68*
- ID_OUI_FROM_DATABASE=Vavic Network Technology, Inc.
+OUI:003007*
+ ID_OUI_FROM_DATABASE=OPTI, INC.
 
-OUI:000F6F*
- ID_OUI_FROM_DATABASE=FTA Communication Technologies
+OUI:0030DD*
+ ID_OUI_FROM_DATABASE=INDIGITA CORPORATION
 
-OUI:000F62*
- ID_OUI_FROM_DATABASE=Alcatel Bell Space N.V.
+OUI:0030F2*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000F5C*
- ID_OUI_FROM_DATABASE=Day One Digital Media Limited
+OUI:003020*
+ ID_OUI_FROM_DATABASE=TSI, Inc..
 
-OUI:000F55*
- ID_OUI_FROM_DATABASE=Datawire Communication Networks Inc.
+OUI:003089*
+ ID_OUI_FROM_DATABASE=Spectrapoint Wireless, LLC
 
-OUI:000F49*
- ID_OUI_FROM_DATABASE=Northover Solutions Limited
+OUI:003022*
+ ID_OUI_FROM_DATABASE=Fong Kai Industrial Co., Ltd.
 
-OUI:000F50*
- ID_OUI_FROM_DATABASE=StreamScale Limited
+OUI:0030F8*
+ ID_OUI_FROM_DATABASE=Dynapro Systems, Inc.
 
-OUI:000F42*
- ID_OUI_FROM_DATABASE=Xalyo Systems
+OUI:0030C2*
+ ID_OUI_FROM_DATABASE=COMONE
 
-OUI:000F1C*
- ID_OUI_FROM_DATABASE=DigitAll World Co., Ltd
+OUI:003056*
+ ID_OUI_FROM_DATABASE=Beck IPC GmbH
 
-OUI:000F0A*
- ID_OUI_FROM_DATABASE=Clear Edge Networks
+OUI:0030D2*
+ ID_OUI_FROM_DATABASE=WIN TECHNOLOGIES, CO., LTD.
 
-OUI:000F09*
- ID_OUI_FROM_DATABASE=Private
+OUI:003050*
+ ID_OUI_FROM_DATABASE=Versa Technology
 
-OUI:000F03*
- ID_OUI_FROM_DATABASE=COM&C CO., LTD
+OUI:0030B8*
+ ID_OUI_FROM_DATABASE=RiverDelta Networks
 
-OUI:000EF7*
- ID_OUI_FROM_DATABASE=Vulcan Portals Inc
+OUI:00904D*
+ ID_OUI_FROM_DATABASE=SPEC S.A.
 
-OUI:000EFC*
- ID_OUI_FROM_DATABASE=JTAG Technologies B.V.
+OUI:009079*
+ ID_OUI_FROM_DATABASE=ClearOne, Inc.
 
-OUI:000EE9*
- ID_OUI_FROM_DATABASE=WayTech Development, Inc.
+OUI:00908F*
+ ID_OUI_FROM_DATABASE=AUDIO CODES LTD.
 
-OUI:000EF0*
- ID_OUI_FROM_DATABASE=Festo AG & Co. KG
+OUI:0090D5*
+ ID_OUI_FROM_DATABASE=EUPHONIX, INC.
 
-OUI:000F4F*
- ID_OUI_FROM_DATABASE=Cadmus Technology Ltd
+OUI:0090A7*
+ ID_OUI_FROM_DATABASE=CLIENTEC CORPORATION
 
-OUI:000F35*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00907F*
+ ID_OUI_FROM_DATABASE=WatchGuard Technologies, Inc.
 
-OUI:000F2E*
- ID_OUI_FROM_DATABASE=Megapower International Corp.
+OUI:00907E*
+ ID_OUI_FROM_DATABASE=VETRONIX CORP.
 
-OUI:000F29*
- ID_OUI_FROM_DATABASE=Augmentix Corporation
+OUI:00902F*
+ ID_OUI_FROM_DATABASE=NETCORE SYSTEMS, INC.
 
-OUI:000F22*
- ID_OUI_FROM_DATABASE=Helius, Inc.
+OUI:00900D*
+ ID_OUI_FROM_DATABASE=Overland Storage Inc.
 
-OUI:000F0F*
- ID_OUI_FROM_DATABASE=Real ID Technology Co., Ltd.
+OUI:009044*
+ ID_OUI_FROM_DATABASE=ASSURED DIGITAL, INC.
 
-OUI:000F16*
- ID_OUI_FROM_DATABASE=JAY HOW TECHNOLOGY CO.,
+OUI:009078*
+ ID_OUI_FROM_DATABASE=MER TELEMANAGEMENT SOLUTIONS, LTD.
+
+OUI:009009*
+ ID_OUI_FROM_DATABASE=I Controls, Inc.
 
-OUI:000F1B*
- ID_OUI_FROM_DATABASE=Ego Systems Inc.
+OUI:009015*
+ ID_OUI_FROM_DATABASE=CENTIGRAM COMMUNICATIONS CORP.
 
-OUI:000D74*
- ID_OUI_FROM_DATABASE=Sand Network Systems, Inc.
+OUI:0090F3*
+ ID_OUI_FROM_DATABASE=ASPECT COMMUNICATIONS
 
-OUI:000D7B*
- ID_OUI_FROM_DATABASE=Consensys Computers Inc.
+OUI:0090A8*
+ ID_OUI_FROM_DATABASE=NineTiles Networks, Ltd.
 
-OUI:000D6E*
- ID_OUI_FROM_DATABASE=K-Patents Oy
+OUI:00507A*
+ ID_OUI_FROM_DATABASE=XPEED, INC.
 
-OUI:000D68*
- ID_OUI_FROM_DATABASE=Vinci Systems, Inc.
+OUI:005002*
+ ID_OUI_FROM_DATABASE=OMNISEC AG
 
-OUI:000D6D*
- ID_OUI_FROM_DATABASE=K-Tech Devices Corp.
+OUI:00508D*
+ ID_OUI_FROM_DATABASE=ABIT COMPUTER CORPORATION
 
-OUI:000D5B*
- ID_OUI_FROM_DATABASE=Smart Empire Investments Limited
+OUI:0050CD*
+ ID_OUI_FROM_DATABASE=DIGIANSWER A/S
 
-OUI:000D5C*
- ID_OUI_FROM_DATABASE=Robert Bosch GmbH, VT-ATMO
+OUI:0050C5*
+ ID_OUI_FROM_DATABASE=ADS Technologies, Inc
 
-OUI:000D61*
- ID_OUI_FROM_DATABASE=Giga-Byte Technology Co., Ltd.
+OUI:00502F*
+ ID_OUI_FROM_DATABASE=TollBridge Technologies, Inc.
 
-OUI:000D55*
- ID_OUI_FROM_DATABASE=SANYCOM Technology Co.,Ltd
+OUI:005028*
+ ID_OUI_FROM_DATABASE=AVAL COMMUNICATIONS
 
-OUI:000D49*
- ID_OUI_FROM_DATABASE=Triton Systems of Delaware, Inc.
+OUI:00505B*
+ ID_OUI_FROM_DATABASE=KAWASAKI LSI U.S.A., INC.
 
-OUI:000D4E*
- ID_OUI_FROM_DATABASE=NDR Co.,LTD.
+OUI:0050F8*
+ ID_OUI_FROM_DATABASE=ENTREGA TECHNOLOGIES, INC.
 
-OUI:000E5B*
- ID_OUI_FROM_DATABASE=ParkerVision - Direct2Data
+OUI:00506F*
+ ID_OUI_FROM_DATABASE=G-CONNECT
 
-OUI:000E55*
- ID_OUI_FROM_DATABASE=AUVITRAN
+OUI:0050CC*
+ ID_OUI_FROM_DATABASE=XYRATEX
 
-OUI:000E56*
- ID_OUI_FROM_DATABASE=4G Systems GmbH & Co. KG
+OUI:0050D5*
+ ID_OUI_FROM_DATABASE=AD SYSTEMS CORP.
 
-OUI:000E4F*
- ID_OUI_FROM_DATABASE=Trajet GmbH
+OUI:0050AA*
+ ID_OUI_FROM_DATABASE=KONICA MINOLTA HOLDINGS, INC.
 
-OUI:000E48*
- ID_OUI_FROM_DATABASE=Lipman TransAction Solutions
+OUI:00509C*
+ ID_OUI_FROM_DATABASE=BETA RESEARCH
 
-OUI:000E43*
- ID_OUI_FROM_DATABASE=G-Tek Electronics Sdn. Bhd.
+OUI:005027*
+ ID_OUI_FROM_DATABASE=GENICOM CORPORATION
 
-OUI:000E34*
- ID_OUI_FROM_DATABASE=NexGen City, LP
+OUI:005010*
+ ID_OUI_FROM_DATABASE=NovaNET Learning, Inc.
 
-OUI:000E3B*
- ID_OUI_FROM_DATABASE=Hawking Technologies, Inc.
+OUI:00509E*
+ ID_OUI_FROM_DATABASE=Les Technologies SoftAcoustik Inc.
 
-OUI:000E2F*
- ID_OUI_FROM_DATABASE=Roche Diagnostics GmbH
+OUI:00505F*
+ ID_OUI_FROM_DATABASE=BRAND INNOVATORS
 
-OUI:000DFB*
- ID_OUI_FROM_DATABASE=Komax AG
+OUI:005095*
+ ID_OUI_FROM_DATABASE=PERACOM NETWORKS
 
-OUI:000DE9*
- ID_OUI_FROM_DATABASE=Napatech Aps
+OUI:005026*
+ ID_OUI_FROM_DATABASE=COSYSTEMS, INC.
 
-OUI:000DEE*
- ID_OUI_FROM_DATABASE=Andrew RF Power Amplifier Group
+OUI:0050EF*
+ ID_OUI_FROM_DATABASE=SPE Systemhaus GmbH
 
-OUI:000DE2*
- ID_OUI_FROM_DATABASE=CMZ Sistemi Elettronici
+OUI:005093*
+ ID_OUI_FROM_DATABASE=BOEING
 
-OUI:000DDC*
- ID_OUI_FROM_DATABASE=VAC
+OUI:0050D8*
+ ID_OUI_FROM_DATABASE=UNICORN COMPUTER CORP.
 
-OUI:000DD6*
- ID_OUI_FROM_DATABASE=ITI    LTD
+OUI:009034*
+ ID_OUI_FROM_DATABASE=IMAGIC, INC.
 
-OUI:000DDB*
- ID_OUI_FROM_DATABASE=AIRWAVE TECHNOLOGIES INC.
+OUI:009073*
+ ID_OUI_FROM_DATABASE=GAIO TECHNOLOGY
 
-OUI:000DCA*
- ID_OUI_FROM_DATABASE=Tait Electronics
+OUI:0090C9*
+ ID_OUI_FROM_DATABASE=DPAC Technologies
 
-OUI:000DCF*
- ID_OUI_FROM_DATABASE=Cidra Corp.
+OUI:0090E7*
+ ID_OUI_FROM_DATABASE=HORSCH ELEKTRONIK AG
 
-OUI:000E28*
- ID_OUI_FROM_DATABASE=Dynamic Ratings P/L
+OUI:009001*
+ ID_OUI_FROM_DATABASE=NISHIMU ELECTRONICS INDUSTRIES CO., LTD.
 
-OUI:000E22*
- ID_OUI_FROM_DATABASE=Private
+OUI:0090FB*
+ ID_OUI_FROM_DATABASE=PORTWELL, INC.
 
-OUI:000E21*
- ID_OUI_FROM_DATABASE=MTU Friedrichshafen GmbH
+OUI:009070*
+ ID_OUI_FROM_DATABASE=NEO NETWORKS, INC.
 
-OUI:000E15*
- ID_OUI_FROM_DATABASE=Tadlys LTD
+OUI:0090EF*
+ ID_OUI_FROM_DATABASE=INTEGRIX, INC.
 
-OUI:000E1C*
- ID_OUI_FROM_DATABASE=Hach Company
+OUI:0090B0*
+ ID_OUI_FROM_DATABASE=VADEM
 
-OUI:000E0D*
- ID_OUI_FROM_DATABASE=Hesch Schröder GmbH
+OUI:0090D1*
+ ID_OUI_FROM_DATABASE=LEICHU ENTERPRISE CO., LTD.
 
-OUI:000E10*
- ID_OUI_FROM_DATABASE=C-guys, Inc.
+OUI:0050D7*
+ ID_OUI_FROM_DATABASE=TELSTRAT
 
-OUI:000DF5*
- ID_OUI_FROM_DATABASE=Teletronics International Inc.
+OUI:0050F1*
+ ID_OUI_FROM_DATABASE=Intel Corporation
 
-OUI:000DFC*
- ID_OUI_FROM_DATABASE=ITFOR Inc.
+OUI:00501B*
+ ID_OUI_FROM_DATABASE=ABL CANADA, INC.
 
-OUI:000E01*
- ID_OUI_FROM_DATABASE=ASIP Technologies Inc.
+OUI:005036*
+ ID_OUI_FROM_DATABASE=NETCAM, LTD.
 
-OUI:000CF0*
- ID_OUI_FROM_DATABASE=M & N GmbH
+OUI:0050C9*
+ ID_OUI_FROM_DATABASE=MASPRO DENKOH CORP.
 
-OUI:000CF5*
- ID_OUI_FROM_DATABASE=InfoExpress
+OUI:005009*
+ ID_OUI_FROM_DATABASE=PHILIPS BROADBAND NETWORKS
 
-OUI:000CE0*
- ID_OUI_FROM_DATABASE=Trek Diagnostics Inc.
+OUI:0050C4*
+ ID_OUI_FROM_DATABASE=IMD
 
-OUI:000CE4*
- ID_OUI_FROM_DATABASE=NeuroCom International, Inc.
+OUI:0050A3*
+ ID_OUI_FROM_DATABASE=TransMedia Communications, Inc.
 
-OUI:000CE9*
- ID_OUI_FROM_DATABASE=BLOOMBERG L.P.
+OUI:005099*
+ ID_OUI_FROM_DATABASE=3COM EUROPE, LTD.
 
-OUI:000CCE*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0050A4*
+ ID_OUI_FROM_DATABASE=IO TECH, INC.
 
-OUI:000CD4*
- ID_OUI_FROM_DATABASE=Positron Public Safety Systems inc.
+OUI:0050B3*
+ ID_OUI_FROM_DATABASE=VOICEBOARD CORPORATION
 
-OUI:000CCD*
- ID_OUI_FROM_DATABASE=IEC - TC57
+OUI:0050B7*
+ ID_OUI_FROM_DATABASE=BOSER TECHNOLOGY CO., LTD.
 
-OUI:000D15*
- ID_OUI_FROM_DATABASE=Voipac s.r.o.
+OUI:00908D*
+ ID_OUI_FROM_DATABASE=VICKERS ELECTRONICS SYSTEMS
 
-OUI:000D16*
- ID_OUI_FROM_DATABASE=UHS Systems Pty Ltd
+OUI:009042*
+ ID_OUI_FROM_DATABASE=ECCS, Inc.
 
-OUI:000D1B*
- ID_OUI_FROM_DATABASE=Kyoto Electronics Manufacturing Co., Ltd.
+OUI:009051*
+ ID_OUI_FROM_DATABASE=ULTIMATE TECHNOLOGY CORP.
 
-OUI:000D0F*
- ID_OUI_FROM_DATABASE=Finlux Ltd
+OUI:0090FF*
+ ID_OUI_FROM_DATABASE=TELLUS TECHNOLOGY INC.
 
-OUI:000D03*
- ID_OUI_FROM_DATABASE=Matrics, Inc.
+OUI:009018*
+ ID_OUI_FROM_DATABASE=ITO ELECTRIC INDUSTRY CO, LTD.
 
-OUI:000D08*
- ID_OUI_FROM_DATABASE=AboveCable, Inc.
+OUI:009002*
+ ID_OUI_FROM_DATABASE=ALLGON AB
 
-OUI:000CFC*
- ID_OUI_FROM_DATABASE=S2io Technologies Corp
+OUI:009016*
+ ID_OUI_FROM_DATABASE=ZAC
 
-OUI:000CF6*
- ID_OUI_FROM_DATABASE=Sitecom Europe BV
+OUI:009005*
+ ID_OUI_FROM_DATABASE=PROTECH SYSTEMS CO., LTD.
 
-OUI:000DA3*
- ID_OUI_FROM_DATABASE=Emerging Technologies Limited
+OUI:00901E*
+ ID_OUI_FROM_DATABASE=Selesta Ingegneria S.p.A.
 
-OUI:000D9C*
- ID_OUI_FROM_DATABASE=Elan GmbH & Co KG
+OUI:009090*
+ ID_OUI_FROM_DATABASE=I-BUS
 
-OUI:000D96*
- ID_OUI_FROM_DATABASE=Vtera Technology Inc.
+OUI:0090AA*
+ ID_OUI_FROM_DATABASE=INDIGO ACTIVE VISION SYSTEMS LIMITED
 
-OUI:000D95*
- ID_OUI_FROM_DATABASE=Opti-cell, Inc.
+OUI:00903A*
+ ID_OUI_FROM_DATABASE=NIHON MEDIA TOOL INC.
 
-OUI:000D90*
- ID_OUI_FROM_DATABASE=Factum Electronics AB
+OUI:009055*
+ ID_OUI_FROM_DATABASE=PARKER HANNIFIN CORPORATION COMPUMOTOR DIVISION
 
-OUI:000D89*
- ID_OUI_FROM_DATABASE=Bils Technology Inc
+OUI:00909F*
+ ID_OUI_FROM_DATABASE=DIGI-DATA CORPORATION
 
-OUI:000D80*
- ID_OUI_FROM_DATABASE=Online Development Inc
+OUI:0090E4*
+ ID_OUI_FROM_DATABASE=NEC AMERICA, INC.
 
-OUI:000DC9*
- ID_OUI_FROM_DATABASE=THALES Elektronik Systeme GmbH
+OUI:009013*
+ ID_OUI_FROM_DATABASE=SAMSAN CORP.
 
-OUI:000DC3*
- ID_OUI_FROM_DATABASE=First Communication, Inc.
+OUI:009004*
+ ID_OUI_FROM_DATABASE=3COM EUROPE LTD.
 
-OUI:000DBC*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0090E1*
+ ID_OUI_FROM_DATABASE=TELENA S.P.A.
 
-OUI:000DB7*
- ID_OUI_FROM_DATABASE=SANKO ELECTRIC CO,.LTD
+OUI:00504A*
+ ID_OUI_FROM_DATABASE=ELTECO A.S.
 
-OUI:000DB0*
- ID_OUI_FROM_DATABASE=Olym-tech Co.,Ltd.
+OUI:00504C*
+ ID_OUI_FROM_DATABASE=Galil Motion Control
 
-OUI:000DA8*
- ID_OUI_FROM_DATABASE=Teletronics Technology Corporation
+OUI:005021*
+ ID_OUI_FROM_DATABASE=EIS INTERNATIONAL, INC.
 
-OUI:000D41*
- ID_OUI_FROM_DATABASE=Siemens AG ICM MP UC RD IT KLF1
+OUI:00506E*
+ ID_OUI_FROM_DATABASE=CORDER ENGINEERING CORPORATION
 
-OUI:000D3A*
- ID_OUI_FROM_DATABASE=Microsoft Corp.
+OUI:00507E*
+ ID_OUI_FROM_DATABASE=NEWER TECHNOLOGY
 
-OUI:000D35*
- ID_OUI_FROM_DATABASE=PAC International Ltd
+OUI:0050E6*
+ ID_OUI_FROM_DATABASE=HAKUSAN CORPORATION
 
-OUI:000D2E*
- ID_OUI_FROM_DATABASE=Matsushita Avionics Systems Corporation
+OUI:0050AE*
+ ID_OUI_FROM_DATABASE=FDK Co., Ltd
 
-OUI:000D28*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00109D*
+ ID_OUI_FROM_DATABASE=CLARINET SYSTEMS, INC.
 
-OUI:000D22*
- ID_OUI_FROM_DATABASE=Unitronics LTD
+OUI:0010D2*
+ ID_OUI_FROM_DATABASE=NITTO TSUSHINKI CO., LTD
 
-OUI:000D27*
- ID_OUI_FROM_DATABASE=MICROPLEX Printware AG
+OUI:001045*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:000C21*
- ID_OUI_FROM_DATABASE=Faculty of Science and Technology, Keio University
+OUI:00106B*
+ ID_OUI_FROM_DATABASE=SONUS NETWORKS, INC.
 
-OUI:000C11*
- ID_OUI_FROM_DATABASE=NIPPON DEMPA CO.,LTD.
+OUI:0010EC*
+ ID_OUI_FROM_DATABASE=RPCG, LLC
 
-OUI:000C10*
- ID_OUI_FROM_DATABASE=PNI Corporation
+OUI:001092*
+ ID_OUI_FROM_DATABASE=NETCORE INC.
 
-OUI:000C12*
- ID_OUI_FROM_DATABASE=Micro-Optronic-Messtechnik GmbH
+OUI:0010E2*
+ ID_OUI_FROM_DATABASE=ArrayComm, Inc.
 
-OUI:000C17*
- ID_OUI_FROM_DATABASE=AJA Video Systems Inc
+OUI:001071*
+ ID_OUI_FROM_DATABASE=ADVANET INC.
 
-OUI:000C04*
- ID_OUI_FROM_DATABASE=Tecnova
+OUI:001069*
+ ID_OUI_FROM_DATABASE=HELIOSS COMMUNICATIONS, INC.
 
-OUI:000C0B*
- ID_OUI_FROM_DATABASE=Broadbus Technologies
+OUI:0010FD*
+ ID_OUI_FROM_DATABASE=COCOM A/S
 
-OUI:000BF8*
- ID_OUI_FROM_DATABASE=Infinera
+OUI:0010AC*
+ ID_OUI_FROM_DATABASE=IMCI TECHNOLOGIES
 
-OUI:000BFF*
- ID_OUI_FROM_DATABASE=Berkeley Camera Engineering
+OUI:0010EF*
+ ID_OUI_FROM_DATABASE=DBTEL INCORPORATED
 
-OUI:000BEC*
- ID_OUI_FROM_DATABASE=NIPPON ELECTRIC INSTRUMENT, INC.
+OUI:001017*
+ ID_OUI_FROM_DATABASE=Bosch Access Systems GmbH
 
-OUI:000BB8*
- ID_OUI_FROM_DATABASE=Kihoku Electronic Co.
+OUI:001024*
+ ID_OUI_FROM_DATABASE=NAGOYA ELECTRIC WORKS CO., LTD
 
-OUI:000BBD*
- ID_OUI_FROM_DATABASE=Connexionz Limited
+OUI:0010DD*
+ ID_OUI_FROM_DATABASE=ENABLE SEMICONDUCTOR, INC.
 
-OUI:000BAD*
- ID_OUI_FROM_DATABASE=PC-PoS Inc.
+OUI:0010C9*
+ ID_OUI_FROM_DATABASE=MITSUBISHI ELECTRONICS LOGISTIC SUPPORT CO.
 
-OUI:000BA0*
- ID_OUI_FROM_DATABASE=T&L Information Inc.
+OUI:001085*
+ ID_OUI_FROM_DATABASE=POLARIS COMMUNICATIONS, INC.
 
-OUI:000BA7*
- ID_OUI_FROM_DATABASE=Maranti Networks
+OUI:001044*
+ ID_OUI_FROM_DATABASE=InnoLabs Corporation
 
-OUI:000BAC*
- ID_OUI_FROM_DATABASE=3Com Ltd
+OUI:001056*
+ ID_OUI_FROM_DATABASE=SODICK CO., LTD.
 
-OUI:000B93*
- ID_OUI_FROM_DATABASE=Ritter Elektronik
+OUI:001099*
+ ID_OUI_FROM_DATABASE=InnoMedia, Inc.
 
-OUI:000B98*
- ID_OUI_FROM_DATABASE=NiceTechVision
+OUI:001061*
+ ID_OUI_FROM_DATABASE=HOSTLINK CORP.
 
-OUI:000B9B*
- ID_OUI_FROM_DATABASE=Sirius System Co, Ltd.
+OUI:001093*
+ ID_OUI_FROM_DATABASE=CMS COMPUTERS, LTD.
 
-OUI:000B8C*
- ID_OUI_FROM_DATABASE=Flextronics
+OUI:0010CD*
+ ID_OUI_FROM_DATABASE=INTERFACE CONCEPT
 
-OUI:000BF1*
- ID_OUI_FROM_DATABASE=LAP Laser Applikations
+OUI:0010F3*
+ ID_OUI_FROM_DATABASE=Nexcom International Co., Ltd.
 
-OUI:000BDF*
- ID_OUI_FROM_DATABASE=Shenzhen RouterD Networks Limited
+OUI:001005*
+ ID_OUI_FROM_DATABASE=UEC COMMERCIAL
 
-OUI:000BDE*
- ID_OUI_FROM_DATABASE=TELDIX GmbH
+OUI:001066*
+ ID_OUI_FROM_DATABASE=ADVANCED CONTROL SYSTEMS, INC.
 
-OUI:000BE0*
- ID_OUI_FROM_DATABASE=SercoNet Ltd.
+OUI:0010E4*
+ ID_OUI_FROM_DATABASE=NSI CORPORATION
 
-OUI:000BE5*
- ID_OUI_FROM_DATABASE=HIMS International Corporation
+OUI:001062*
+ ID_OUI_FROM_DATABASE=NX SERVER, ILNC.
 
-OUI:000BD9*
- ID_OUI_FROM_DATABASE=General Hydrogen
+OUI:0010B9*
+ ID_OUI_FROM_DATABASE=MAXTOR CORP.
 
-OUI:000BAE*
- ID_OUI_FROM_DATABASE=Vitals System Inc.
+OUI:00108B*
+ ID_OUI_FROM_DATABASE=LASERANIMATION SOLLINGER GMBH
 
-OUI:000BD0*
- ID_OUI_FROM_DATABASE=XiMeta Technology Americas Inc.
+OUI:00105C*
+ ID_OUI_FROM_DATABASE=QUANTUM DESIGNS (H.K.) LTD.
 
-OUI:000BD5*
- ID_OUI_FROM_DATABASE=Nvergence, Inc.
+OUI:001042*
+ ID_OUI_FROM_DATABASE=Alacritech, Inc.
 
-OUI:000BC4*
- ID_OUI_FROM_DATABASE=BIOTRONIK GmbH & Co
+OUI:001060*
+ ID_OUI_FROM_DATABASE=BILLIONTON SYSTEMS, INC.
 
-OUI:000BC9*
- ID_OUI_FROM_DATABASE=Electroline Equipment
+OUI:0010DE*
+ ID_OUI_FROM_DATABASE=INTERNATIONAL DATACASTING CORPORATION
 
-OUI:000BB1*
- ID_OUI_FROM_DATABASE=Super Star Technology Co., Ltd.
+OUI:00105D*
+ ID_OUI_FROM_DATABASE=Draeger Medical
 
-OUI:000BB6*
- ID_OUI_FROM_DATABASE=Metalligence Technology Corp.
+OUI:0010E1*
+ ID_OUI_FROM_DATABASE=S.I. TECH, INC.
 
-OUI:000B79*
- ID_OUI_FROM_DATABASE=X-COM, Inc.
+OUI:001091*
+ ID_OUI_FROM_DATABASE=NO WIRES NEEDED BV
 
-OUI:000B80*
- ID_OUI_FROM_DATABASE=Lycium Networks
+OUI:0010F5*
+ ID_OUI_FROM_DATABASE=AMHERST SYSTEMS, INC.
 
-OUI:000B87*
- ID_OUI_FROM_DATABASE=American Reliance Inc.
+OUI:001090*
+ ID_OUI_FROM_DATABASE=CIMETRICS, INC.
 
-OUI:000B6D*
- ID_OUI_FROM_DATABASE=SOLECTRON JAPAN NAKANIIDA
+OUI:001070*
+ ID_OUI_FROM_DATABASE=CARADON TREND LTD.
 
-OUI:000B74*
- ID_OUI_FROM_DATABASE=Kingwave Technology Co., Ltd.
+OUI:0010BA*
+ ID_OUI_FROM_DATABASE=MARTINHO-DAVIS SYSTEMS, INC.
 
-OUI:000B67*
- ID_OUI_FROM_DATABASE=Topview Technology Corporation
+OUI:00107C*
+ ID_OUI_FROM_DATABASE=P-COM, INC.
 
-OUI:000B61*
- ID_OUI_FROM_DATABASE=Friedrich Lütze GmbH & Co. KG
+OUI:0010AE*
+ ID_OUI_FROM_DATABASE=SHINKO ELECTRIC INDUSTRIES CO.
 
-OUI:000B66*
- ID_OUI_FROM_DATABASE=Teralink Communications
+OUI:001040*
+ ID_OUI_FROM_DATABASE=INTERMEC CORPORATION
 
-OUI:000B68*
- ID_OUI_FROM_DATABASE=Addvalue Communications Pte Ltd
+OUI:0010B0*
+ ID_OUI_FROM_DATABASE=MERIDIAN TECHNOLOGY CORP.
 
-OUI:000B58*
- ID_OUI_FROM_DATABASE=Astronautics C.A  LTD
+OUI:001077*
+ ID_OUI_FROM_DATABASE=SAF DRIVE SYSTEMS, LTD.
 
-OUI:000B50*
- ID_OUI_FROM_DATABASE=Oxygnet
+OUI:0010F4*
+ ID_OUI_FROM_DATABASE=Vertical Communications
 
-OUI:000B44*
- ID_OUI_FROM_DATABASE=Concord IDea Corp.
+OUI:001065*
+ ID_OUI_FROM_DATABASE=RADYNE CORPORATION
 
-OUI:000B49*
- ID_OUI_FROM_DATABASE=RF-Link System Inc.
+OUI:00104A*
+ ID_OUI_FROM_DATABASE=The Parvus Corporation
 
-OUI:000B4B*
- ID_OUI_FROM_DATABASE=VISIOWAVE SA
+OUI:0010B3*
+ ID_OUI_FROM_DATABASE=NOKIA MULTIMEDIA TERMINALS
 
-OUI:000B31*
- ID_OUI_FROM_DATABASE=Yantai ZhiYang Scientific and technology industry CO., LTD
+OUI:001037*
+ ID_OUI_FROM_DATABASE=CYQ've Technology Co., Ltd.
 
-OUI:000B3D*
- ID_OUI_FROM_DATABASE=CONTAL OK Ltd.
+OUI:001051*
+ ID_OUI_FROM_DATABASE=CMICRO CORPORATION
 
-OUI:000B38*
- ID_OUI_FROM_DATABASE=Knürr GmbH
+OUI:0010DC*
+ ID_OUI_FROM_DATABASE=MICRO-STAR INTERNATIONAL CO., LTD.
 
-OUI:000B2A*
- ID_OUI_FROM_DATABASE=HOWTEL Co., Ltd.
+OUI:0010EE*
+ ID_OUI_FROM_DATABASE=CTI PRODUCTS, INC.
 
-OUI:000B2C*
- ID_OUI_FROM_DATABASE=Eiki Industrial Co. Ltd.
+OUI:00101B*
+ ID_OUI_FROM_DATABASE=CORNET TECHNOLOGY, INC.
 
-OUI:000C97*
- ID_OUI_FROM_DATABASE=NV ADB TTV Technologies SA
+OUI:001032*
+ ID_OUI_FROM_DATABASE=ALTA TECHNOLOGY
 
-OUI:000C9C*
- ID_OUI_FROM_DATABASE=Chongho information & communications
+OUI:001025*
+ ID_OUI_FROM_DATABASE=Grayhill, Inc
 
-OUI:000C9E*
- ID_OUI_FROM_DATABASE=MemoryLink Corp.
+OUI:0010F8*
+ ID_OUI_FROM_DATABASE=TEXIO TECHNOLOGY CORPORATION
 
-OUI:000C89*
- ID_OUI_FROM_DATABASE=AC Electric Vehicles, Ltd.
+OUI:00104D*
+ ID_OUI_FROM_DATABASE=SURTEC INDUSTRIES, INC.
 
-OUI:000C8B*
- ID_OUI_FROM_DATABASE=Connect Tech Inc
+OUI:00E0E0*
+ ID_OUI_FROM_DATABASE=SI ELECTRONICS, LTD.
 
-OUI:000C90*
- ID_OUI_FROM_DATABASE=Octasic Inc.
+OUI:00E0D1*
+ ID_OUI_FROM_DATABASE=TELSIS LIMITED
 
-OUI:000C84*
- ID_OUI_FROM_DATABASE=Eazix, Inc.
+OUI:00E005*
+ ID_OUI_FROM_DATABASE=TECHNICAL CORP.
 
-OUI:000C75*
- ID_OUI_FROM_DATABASE=Oriental integrated electronics. LTD
+OUI:00E072*
+ ID_OUI_FROM_DATABASE=LYNK
 
-OUI:000C77*
- ID_OUI_FROM_DATABASE=Life Racing Ltd
+OUI:00E0C1*
+ ID_OUI_FROM_DATABASE=MEMOREX TELEX JAPAN, LTD.
 
-OUI:000C7C*
- ID_OUI_FROM_DATABASE=Internet Information Image Inc.
+OUI:00E0AD*
+ ID_OUI_FROM_DATABASE=EES TECHNOLOGY, LTD.
 
-OUI:000C43*
- ID_OUI_FROM_DATABASE=Ralink Technology, Corp.
+OUI:00E025*
+ ID_OUI_FROM_DATABASE=dit Co., Ltd.
 
-OUI:000C45*
- ID_OUI_FROM_DATABASE=Animation Technologies Inc.
+OUI:00E0E4*
+ ID_OUI_FROM_DATABASE=FANUC ROBOTICS NORTH AMERICA, Inc.
 
-OUI:000C3C*
- ID_OUI_FROM_DATABASE=MediaChorus, Inc.
+OUI:00E031*
+ ID_OUI_FROM_DATABASE=HAGIWARA ELECTRIC CO., LTD.
 
-OUI:000C32*
- ID_OUI_FROM_DATABASE=Avionic Design Development GmbH
+OUI:00E0A5*
+ ID_OUI_FROM_DATABASE=ComCore Semiconductor, Inc.
 
-OUI:000C35*
- ID_OUI_FROM_DATABASE=KaVo Dental GmbH & Co. KG
+OUI:00E044*
+ ID_OUI_FROM_DATABASE=LSICS CORPORATION
 
-OUI:000C2B*
- ID_OUI_FROM_DATABASE=ELIAS Technology, Inc.
+OUI:00E05D*
+ ID_OUI_FROM_DATABASE=UNITEC CO., LTD.
 
-OUI:000C28*
- ID_OUI_FROM_DATABASE=RIFATRON
+OUI:00E0B3*
+ ID_OUI_FROM_DATABASE=EtherWAN Systems, Inc.
 
-OUI:000C1C*
- ID_OUI_FROM_DATABASE=MicroWeb Co., Ltd.
+OUI:00E053*
+ ID_OUI_FROM_DATABASE=CELLPORT LABS, INC.
 
-OUI:000C64*
- ID_OUI_FROM_DATABASE=X2 MSA Group
+OUI:00E07D*
+ ID_OUI_FROM_DATABASE=NETRONIX, INC.
 
-OUI:000C69*
- ID_OUI_FROM_DATABASE=National Radio Astronomy Observatory
+OUI:00E0ED*
+ ID_OUI_FROM_DATABASE=SILICOM, LTD.
 
-OUI:000C70*
- ID_OUI_FROM_DATABASE=ACC GmbH
+OUI:00E0B4*
+ ID_OUI_FROM_DATABASE=TECHNO SCOPE CO., LTD.
 
-OUI:000C51*
- ID_OUI_FROM_DATABASE=Scientific Technologies Inc.
+OUI:00E0C6*
+ ID_OUI_FROM_DATABASE=LINK2IT, L.L.C.
 
-OUI:000C56*
- ID_OUI_FROM_DATABASE=Megatel Computer (1986) Corp.
+OUI:00E06D*
+ ID_OUI_FROM_DATABASE=COMPUWARE CORPORATION
 
-OUI:000C58*
- ID_OUI_FROM_DATABASE=M&S Systems
+OUI:00E074*
+ ID_OUI_FROM_DATABASE=TIERNAN COMMUNICATIONS, INC.
 
-OUI:000C5D*
- ID_OUI_FROM_DATABASE=CHIC TECHNOLOGY (CHINA) CORP.
+OUI:00E059*
+ ID_OUI_FROM_DATABASE=CONTROLLED ENVIRONMENTS, LTD.
 
-OUI:000C4A*
- ID_OUI_FROM_DATABASE=Cygnus Microsystems (P) Limited
+OUI:00E006*
+ ID_OUI_FROM_DATABASE=SILICON INTEGRATED SYS. CORP.
 
-OUI:000CC8*
- ID_OUI_FROM_DATABASE=Xytronix Research & Design, Inc.
+OUI:00E0F8*
+ ID_OUI_FROM_DATABASE=DICNA CONTROL AB
 
-OUI:000CBB*
- ID_OUI_FROM_DATABASE=ISKRAEMECO
+OUI:00E004*
+ ID_OUI_FROM_DATABASE=PMC-SIERRA, INC.
 
-OUI:000CB5*
- ID_OUI_FROM_DATABASE=Premier Technolgies, Inc
+OUI:00E0DE*
+ ID_OUI_FROM_DATABASE=DATAX NV
 
-OUI:000CBC*
- ID_OUI_FROM_DATABASE=Iscutum
+OUI:00E078*
+ ID_OUI_FROM_DATABASE=BERKELEY NETWORKS
 
-OUI:000CA3*
- ID_OUI_FROM_DATABASE=Rancho Technology, Inc.
+OUI:00E041*
+ ID_OUI_FROM_DATABASE=CSPI
 
-OUI:000CAA*
- ID_OUI_FROM_DATABASE=Cubic Transportation Systems Inc
+OUI:00E0E2*
+ ID_OUI_FROM_DATABASE=INNOVA CORP.
 
-OUI:000A38*
- ID_OUI_FROM_DATABASE=Apani Networks
+OUI:00E009*
+ ID_OUI_FROM_DATABASE=MARATHON TECHNOLOGIES CORP.
 
-OUI:000A3F*
- ID_OUI_FROM_DATABASE=Data East Corporation
+OUI:00E02F*
+ ID_OUI_FROM_DATABASE=MCNS HOLDINGS, L.P.
 
-OUI:000A44*
- ID_OUI_FROM_DATABASE=Avery Dennison Deutschland GmbH
+OUI:00E04C*
+ ID_OUI_FROM_DATABASE=REALTEK SEMICONDUCTOR CORP.
 
-OUI:000A46*
- ID_OUI_FROM_DATABASE=ARO WELDING TECHNOLOGIES SAS
+OUI:00E047*
+ ID_OUI_FROM_DATABASE=InFocus Corporation
 
-OUI:000A33*
- ID_OUI_FROM_DATABASE=Emulex Corporation
+OUI:00E092*
+ ID_OUI_FROM_DATABASE=ADMTEK INCORPORATED
 
-OUI:000A31*
- ID_OUI_FROM_DATABASE=HCV Consulting
+OUI:00E0FF*
+ ID_OUI_FROM_DATABASE=SECURITY DYNAMICS TECHNOLOGIES, Inc.
 
-OUI:000A2C*
- ID_OUI_FROM_DATABASE=Active Tchnology Corporation
+OUI:08BBCC*
+ ID_OUI_FROM_DATABASE=AK-NORD EDV VERTRIEBSGES. mbH
 
-OUI:004252*
- ID_OUI_FROM_DATABASE=RLX Technologies
+OUI:0060B2*
+ ID_OUI_FROM_DATABASE=PROCESS CONTROL CORP.
 
-OUI:000A2A*
- ID_OUI_FROM_DATABASE=QSI Systems Inc.
+OUI:006004*
+ ID_OUI_FROM_DATABASE=COMPUTADORES MODULARES SA
 
-OUI:000A1E*
- ID_OUI_FROM_DATABASE=Red-M Products Limited
+OUI:006000*
+ ID_OUI_FROM_DATABASE=XYCOM INC.
 
-OUI:000A23*
- ID_OUI_FROM_DATABASE=Parama Networks Inc
+OUI:00A019*
+ ID_OUI_FROM_DATABASE=NEBULA CONSULTANTS, INC.
 
-OUI:000A17*
- ID_OUI_FROM_DATABASE=NESTAR COMMUNICATIONS, INC
+OUI:00A0ED*
+ ID_OUI_FROM_DATABASE=Brooks Automation, Inc.
 
-OUI:000A1C*
- ID_OUI_FROM_DATABASE=Bridge Information Co., Ltd.
+OUI:00A0A9*
+ ID_OUI_FROM_DATABASE=NAVTEL COMMUNICATIONS INC.
 
-OUI:000B19*
- ID_OUI_FROM_DATABASE=Vernier Networks, Inc.
+OUI:00A0E1*
+ ID_OUI_FROM_DATABASE=WESTPORT RESEARCH ASSOCIATES, INC.
 
-OUI:000B1E*
- ID_OUI_FROM_DATABASE=KAPPA opto-electronics GmbH
+OUI:00A0D6*
+ ID_OUI_FROM_DATABASE=SBE, Inc.
 
-OUI:000B25*
- ID_OUI_FROM_DATABASE=Aeluros
+OUI:00A05E*
+ ID_OUI_FROM_DATABASE=MYRIAD LOGIC INC.
 
-OUI:000B17*
- ID_OUI_FROM_DATABASE=MKS Instruments
+OUI:00A078*
+ ID_OUI_FROM_DATABASE=Marconi Communications
 
-OUI:000B12*
- ID_OUI_FROM_DATABASE=NURI Telecom Co., Ltd.
+OUI:00A00B*
+ ID_OUI_FROM_DATABASE=COMPUTEX CO., LTD.
 
-OUI:000B0B*
- ID_OUI_FROM_DATABASE=Corrent Corporation
+OUI:00A09A*
+ ID_OUI_FROM_DATABASE=NIHON KOHDEN AMERICA
 
-OUI:000AFA*
- ID_OUI_FROM_DATABASE=Traverse Technologies Australia
+OUI:00A095*
+ ID_OUI_FROM_DATABASE=ACACIA NETWORKS, INC.
 
-OUI:000AFF*
- ID_OUI_FROM_DATABASE=Kilchherr Elektronik AG
+OUI:00A0F2*
+ ID_OUI_FROM_DATABASE=INFOTEK COMMUNICATIONS, INC.
 
-OUI:000AF3*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00A0EF*
+ ID_OUI_FROM_DATABASE=LUCIDATA LTD.
 
-OUI:000AF8*
- ID_OUI_FROM_DATABASE=American Telecare Inc.
+OUI:00A03F*
+ ID_OUI_FROM_DATABASE=COMPUTER SOCIETY MICROPROCESSOR & MICROPROCESSOR STANDARDS C
 
-OUI:000AEE*
- ID_OUI_FROM_DATABASE=GCD Hard- & Software GmbH
+OUI:00A067*
+ ID_OUI_FROM_DATABASE=NETWORK SERVICES GROUP
 
-OUI:000A06*
- ID_OUI_FROM_DATABASE=Teledex LLC
+OUI:00A0A7*
+ ID_OUI_FROM_DATABASE=VORAX CORPORATION
 
-OUI:000A09*
- ID_OUI_FROM_DATABASE=TaraCom Integrated Products, Inc.
+OUI:00A02D*
+ ID_OUI_FROM_DATABASE=1394 Trade Association
 
-OUI:000A0B*
- ID_OUI_FROM_DATABASE=Sealevel Systems, Inc.
+OUI:00A0E6*
+ ID_OUI_FROM_DATABASE=DIALOGIC CORPORATION
 
-OUI:000A10*
- ID_OUI_FROM_DATABASE=FAST media integrations AG
+OUI:00A04A*
+ ID_OUI_FROM_DATABASE=NISSHIN ELECTRIC CO., LTD.
 
-OUI:0009F7*
- ID_OUI_FROM_DATABASE=SED, a division of Calian
+OUI:00A05B*
+ ID_OUI_FROM_DATABASE=MARQUIP, INC.
 
-OUI:000A01*
- ID_OUI_FROM_DATABASE=SOHOware, Inc.
+OUI:00A08D*
+ ID_OUI_FROM_DATABASE=JACOMO CORPORATION
 
-OUI:0009E9*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00A08E*
+ ID_OUI_FROM_DATABASE=Check Point Software Technologies
 
-OUI:0009F0*
- ID_OUI_FROM_DATABASE=Shimizu Technology Inc.
+OUI:00E0AA*
+ ID_OUI_FROM_DATABASE=ELECTROSONIC LTD.
 
-OUI:0009EA*
- ID_OUI_FROM_DATABASE=YEM Inc.
+OUI:00E085*
+ ID_OUI_FROM_DATABASE=GLOBAL MAINTECH, INC.
 
-OUI:0009E4*
- ID_OUI_FROM_DATABASE=K Tech Infosystem Inc.
+OUI:00E05A*
+ ID_OUI_FROM_DATABASE=GALEA NETWORK SECURITY
 
-OUI:0009D8*
- ID_OUI_FROM_DATABASE=Fält Communications AB
+OUI:00E0E7*
+ ID_OUI_FROM_DATABASE=RAYTHEON E-SYSTEMS, INC.
 
-OUI:0009DD*
- ID_OUI_FROM_DATABASE=Mavin Technology Inc.
+OUI:00E00C*
+ ID_OUI_FROM_DATABASE=MOTOROLA
 
-OUI:0009B1*
- ID_OUI_FROM_DATABASE=Kanematsu Electronics, Ltd.
+OUI:00E04A*
+ ID_OUI_FROM_DATABASE=ZX Technologies, Inc
 
-OUI:0009A3*
- ID_OUI_FROM_DATABASE=Leadfly Techologies Corp. Ltd.
+OUI:00E00A*
+ ID_OUI_FROM_DATABASE=DIBA, INC.
 
-OUI:0009AA*
- ID_OUI_FROM_DATABASE=Data Comm for Business, Inc.
+OUI:00E0B9*
+ ID_OUI_FROM_DATABASE=BYAS SYSTEMS
 
-OUI:0009A4*
- ID_OUI_FROM_DATABASE=HARTEC Corporation
+OUI:00E054*
+ ID_OUI_FROM_DATABASE=KODAI HITEC CO., LTD.
 
-OUI:00099E*
- ID_OUI_FROM_DATABASE=Testech, Inc.
+OUI:00E0AF*
+ ID_OUI_FROM_DATABASE=GENERAL DYNAMICS INFORMATION SYSTEMS
 
-OUI:000992*
- ID_OUI_FROM_DATABASE=InterEpoch Technology,INC.
+OUI:00605B*
+ ID_OUI_FROM_DATABASE=IntraServer Technology, Inc.
 
-OUI:000991*
- ID_OUI_FROM_DATABASE=GE Fanuc Automation Manufacturing, Inc.
+OUI:00604B*
+ ID_OUI_FROM_DATABASE=Safe-com GmbH & Co. KG
 
-OUI:00098B*
- ID_OUI_FROM_DATABASE=Entropic Communications, Inc.
+OUI:00A0CD*
+ ID_OUI_FROM_DATABASE=DR. JOHANNES HEIDENHAIN GmbH
 
-OUI:000AB0*
- ID_OUI_FROM_DATABASE=LOYTEC electronics GmbH
+OUI:00A0DA*
+ ID_OUI_FROM_DATABASE=INTEGRATED SYSTEMS Technology, Inc.
 
-OUI:000AB7*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00A03C*
+ ID_OUI_FROM_DATABASE=EG&G NUCLEAR INSTRUMENTS
 
-OUI:000AA4*
- ID_OUI_FROM_DATABASE=SHANGHAI SURVEILLANCE TECHNOLOGY CO,LTD
+OUI:00A038*
+ ID_OUI_FROM_DATABASE=EMAIL ELECTRONICS
 
-OUI:000AA9*
- ID_OUI_FROM_DATABASE=Brooks Automation GmbH
+OUI:00A0BE*
+ ID_OUI_FROM_DATABASE=INTEGRATED CIRCUIT SYSTEMS, INC. COMMUNICATIONS GROUP
 
-OUI:000A91*
- ID_OUI_FROM_DATABASE=HemoCue AB
+OUI:00605D*
+ ID_OUI_FROM_DATABASE=SCANIVALVE CORP.
 
-OUI:000A9D*
- ID_OUI_FROM_DATABASE=King Young Technology Co. Ltd.
+OUI:0060E4*
+ ID_OUI_FROM_DATABASE=COMPUSERVE, INC.
 
-OUI:000A8C*
- ID_OUI_FROM_DATABASE=Guardware Systems Ltd.
+OUI:00600A*
+ ID_OUI_FROM_DATABASE=SORD COMPUTER CORPORATION
 
-OUI:000A97*
- ID_OUI_FROM_DATABASE=SONICblue, Inc.
+OUI:0060C4*
+ ID_OUI_FROM_DATABASE=SOLITON SYSTEMS K.K.
 
-OUI:000A7D*
- ID_OUI_FROM_DATABASE=Valo, Inc.
+OUI:0060C8*
+ ID_OUI_FROM_DATABASE=KUKA WELDING SYSTEMS & ROBOTS
 
-OUI:000A84*
- ID_OUI_FROM_DATABASE=Rainsun Enterprise Co., Ltd.
+OUI:006030*
+ ID_OUI_FROM_DATABASE=VILLAGE TRONIC ENTWICKLUNG
 
-OUI:000A89*
- ID_OUI_FROM_DATABASE=Creval Systems, Inc.
+OUI:0060E7*
+ ID_OUI_FROM_DATABASE=RANDATA
 
-OUI:0009D7*
- ID_OUI_FROM_DATABASE=DC Security Products
+OUI:00602A*
+ ID_OUI_FROM_DATABASE=SYMICRON COMPUTER COMMUNICATIONS, LTD.
 
-OUI:0009CA*
- ID_OUI_FROM_DATABASE=iMaxNetworks(Shenzhen)Limited.
+OUI:00601E*
+ ID_OUI_FROM_DATABASE=SOFTLAB, INC.
 
-OUI:0009D1*
- ID_OUI_FROM_DATABASE=SERANOA NETWORKS INC
+OUI:0060F8*
+ ID_OUI_FROM_DATABASE=Loran International Technologies Inc.
 
-OUI:0009C5*
- ID_OUI_FROM_DATABASE=KINGENE Technology Corporation
+OUI:00609A*
+ ID_OUI_FROM_DATABASE=NJK TECHNO CO.
 
-OUI:0009BD*
- ID_OUI_FROM_DATABASE=Epygi Technologies, Ltd.
+OUI:0060CC*
+ ID_OUI_FROM_DATABASE=EMTRAK, INCORPORATED
 
-OUI:0009B6*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:006036*
+ ID_OUI_FROM_DATABASE=AIT Austrian Institute of Technology GmbH
 
-OUI:00097F*
- ID_OUI_FROM_DATABASE=Vsecure 2000 LTD.
+OUI:0060B9*
+ ID_OUI_FROM_DATABASE=NEC Platforms, Ltd
 
-OUI:000984*
- ID_OUI_FROM_DATABASE=MyCasa Network Inc.
+OUI:0060CE*
+ ID_OUI_FROM_DATABASE=ACCLAIM COMMUNICATIONS
 
-OUI:000971*
- ID_OUI_FROM_DATABASE=Time Management, Inc.
+OUI:0060F5*
+ ID_OUI_FROM_DATABASE=ICON WEST, INC.
 
-OUI:000978*
- ID_OUI_FROM_DATABASE=AIJI System Co., Ltd.
+OUI:0060A4*
+ ID_OUI_FROM_DATABASE=GEW Technologies (PTY)Ltd
 
-OUI:000972*
- ID_OUI_FROM_DATABASE=Securebase,Inc
+OUI:0060CA*
+ ID_OUI_FROM_DATABASE=HARMONIC SYSTEMS INCORPORATED
 
-OUI:00096C*
- ID_OUI_FROM_DATABASE=Imedia Semiconductor Corp.
+OUI:006024*
+ ID_OUI_FROM_DATABASE=GRADIENT TECHNOLOGIES, INC.
 
-OUI:000965*
- ID_OUI_FROM_DATABASE=HyunJu Computer Co., Ltd.
+OUI:0060FB*
+ ID_OUI_FROM_DATABASE=PACKETEER, INC.
 
-OUI:000960*
- ID_OUI_FROM_DATABASE=YOZAN Inc.
+OUI:0060BC*
+ ID_OUI_FROM_DATABASE=KeunYoung Electronics & Communication Co., Ltd.
 
-OUI:000956*
- ID_OUI_FROM_DATABASE=Network Systems Group, Ltd. (NSG)
+OUI:0060B8*
+ ID_OUI_FROM_DATABASE=CORELIS Inc.
 
-OUI:000955*
- ID_OUI_FROM_DATABASE=Young Generation International Corp.
+OUI:0060FE*
+ ID_OUI_FROM_DATABASE=LYNX SYSTEM DEVELOPERS, INC.
 
-OUI:000AE9*
- ID_OUI_FROM_DATABASE=AirVast Technology Inc.
+OUI:006001*
+ ID_OUI_FROM_DATABASE=InnoSys, Inc.
 
-OUI:000ADB*
- ID_OUI_FROM_DATABASE=SkyPilot Network, Inc
+OUI:00607D*
+ ID_OUI_FROM_DATABASE=SENTIENT NETWORKS INC.
 
-OUI:000ADD*
- ID_OUI_FROM_DATABASE=Allworx Corp.
+OUI:00606E*
+ ID_OUI_FROM_DATABASE=DAVICOM SEMICONDUCTOR, INC.
 
-OUI:000AE2*
- ID_OUI_FROM_DATABASE=Binatone Electronics International, Ltd
+OUI:00607E*
+ ID_OUI_FROM_DATABASE=GIGALABS, INC.
 
-OUI:000ACA*
- ID_OUI_FROM_DATABASE=YOKOYAMA SHOKAI CO.,Ltd.
+OUI:0060CF*
+ ID_OUI_FROM_DATABASE=ALTEON NETWORKS, INC.
 
-OUI:000ACF*
- ID_OUI_FROM_DATABASE=PROVIDEO Multimedia Co. Ltd.
+OUI:006026*
+ ID_OUI_FROM_DATABASE=VIKING Modular Solutions
 
-OUI:000AD6*
- ID_OUI_FROM_DATABASE=BeamReach Networks
+OUI:006003*
+ ID_OUI_FROM_DATABASE=TERAOKA WEIGH SYSTEM PTE, LTD.
 
-OUI:000ABC*
- ID_OUI_FROM_DATABASE=Seabridge Ltd.
+OUI:006059*
+ ID_OUI_FROM_DATABASE=TECHNICAL COMMUNICATIONS CORP.
 
-OUI:000ABE*
- ID_OUI_FROM_DATABASE=OPNET Technologies CO., LTD.
+OUI:006066*
+ ID_OUI_FROM_DATABASE=LACROIX Trafic
 
-OUI:000AC3*
- ID_OUI_FROM_DATABASE=eM Technics Co., Ltd.
+OUI:0060DA*
+ ID_OUI_FROM_DATABASE=Red Lion Controls, LP
 
-OUI:000A78*
- ID_OUI_FROM_DATABASE=OLITEC
+OUI:006042*
+ ID_OUI_FROM_DATABASE=TKS (USA), INC.
 
-OUI:000A71*
- ID_OUI_FROM_DATABASE=Avrio Technologies, Inc
+OUI:00A023*
+ ID_OUI_FROM_DATABASE=APPLIED CREATIVE TECHNOLOGY, INC.
 
-OUI:000A76*
- ID_OUI_FROM_DATABASE=Beida Jade Bird Huaguang Technology Co.,Ltd
+OUI:00A00F*
+ ID_OUI_FROM_DATABASE=Broadband Technologies
 
-OUI:000A63*
- ID_OUI_FROM_DATABASE=DHD GmbH
+OUI:00A032*
+ ID_OUI_FROM_DATABASE=GES SINGAPORE PTE. LTD.
 
-OUI:000A65*
- ID_OUI_FROM_DATABASE=GentechMedia.co.,ltd.
+OUI:002034*
+ ID_OUI_FROM_DATABASE=ROTEC INDUSTRIEAUTOMATION GMBH
 
-OUI:000A6A*
- ID_OUI_FROM_DATABASE=SVM Microwaves s.r.o.
+OUI:0020B2*
+ ID_OUI_FROM_DATABASE=GKD Gesellschaft Fur Kommunikation Und Datentechnik
 
-OUI:000A5E*
- ID_OUI_FROM_DATABASE=3COM Corporation
+OUI:002004*
+ ID_OUI_FROM_DATABASE=YAMATAKE-HONEYWELL CO., LTD.
 
-OUI:000A52*
- ID_OUI_FROM_DATABASE=AsiaRF Ltd.
+OUI:0020FE*
+ ID_OUI_FROM_DATABASE=TOPWARE INC. / GRAND COMPUTER
 
-OUI:000A4B*
- ID_OUI_FROM_DATABASE=DataPower Technology, Inc.
+OUI:002073*
+ ID_OUI_FROM_DATABASE=FUSION SYSTEMS CORPORATION
 
-OUI:00075A*
- ID_OUI_FROM_DATABASE=Air Products and Chemicals, Inc.
+OUI:00207A*
+ ID_OUI_FROM_DATABASE=WiSE Communications, Inc.
 
-OUI:000754*
- ID_OUI_FROM_DATABASE=Xyterra Computing, Inc.
+OUI:00205C*
+ ID_OUI_FROM_DATABASE=InterNet Systems of Florida, Inc.
 
-OUI:00074E*
- ID_OUI_FROM_DATABASE=IPFRONT Inc
+OUI:00207E*
+ ID_OUI_FROM_DATABASE=FINECOM CO., LTD.
 
-OUI:00074D*
- ID_OUI_FROM_DATABASE=Zebra Technologies Corp.
+OUI:00205A*
+ ID_OUI_FROM_DATABASE=COMPUTER IDENTICS
 
-OUI:000742*
- ID_OUI_FROM_DATABASE=Ormazabal
+OUI:0020E4*
+ ID_OUI_FROM_DATABASE=HSING TECH ENTERPRISE CO., LTD
 
-OUI:000748*
- ID_OUI_FROM_DATABASE=The Imaging Source Europe
+OUI:00A000*
+ ID_OUI_FROM_DATABASE=CENTILLION NETWORKS, INC.
 
-OUI:000736*
- ID_OUI_FROM_DATABASE=Data Video Technologies Co., Ltd.
+OUI:00A07B*
+ ID_OUI_FROM_DATABASE=DAWN COMPUTER INCORPORATION
 
-OUI:00073D*
- ID_OUI_FROM_DATABASE=Nanjing Postel Telecommunications Co., Ltd.
+OUI:00A05C*
+ ID_OUI_FROM_DATABASE=INVENTORY CONVERSION, INC./
 
-OUI:00073C*
- ID_OUI_FROM_DATABASE=Telecom Design
+OUI:00206F*
+ ID_OUI_FROM_DATABASE=FLOWPOINT CORPORATION
 
-OUI:00072A*
- ID_OUI_FROM_DATABASE=Innovance Networks
+OUI:0020DF*
+ ID_OUI_FROM_DATABASE=KYOSAN ELECTRIC MFG. CO., LTD.
 
-OUI:00072F*
- ID_OUI_FROM_DATABASE=Intransa, Inc.
+OUI:002010*
+ ID_OUI_FROM_DATABASE=JEOL SYSTEM TECHNOLOGY CO. LTD
 
-OUI:000730*
- ID_OUI_FROM_DATABASE=Hutchison OPTEL Telecom Technology Co., Ltd.
+OUI:002020*
+ ID_OUI_FROM_DATABASE=MEGATRON COMPUTER INDUSTRIES PTY, LTD.
 
-OUI:000725*
- ID_OUI_FROM_DATABASE=Bematech International Corp.
+OUI:002037*
+ ID_OUI_FROM_DATABASE=SEAGATE TECHNOLOGY
 
-OUI:000818*
- ID_OUI_FROM_DATABASE=Pixelworks, Inc.
+OUI:0020A0*
+ ID_OUI_FROM_DATABASE=OA LABORATORY CO., LTD.
 
-OUI:000812*
- ID_OUI_FROM_DATABASE=GM-2 Corporation
+OUI:00C0A3*
+ ID_OUI_FROM_DATABASE=DUAL ENTERPRISES CORPORATION
 
-OUI:000811*
- ID_OUI_FROM_DATABASE=VOIX Corporation
+OUI:0070B0*
+ ID_OUI_FROM_DATABASE=M/A-COM INC. COMPANIES
 
-OUI:00080B*
- ID_OUI_FROM_DATABASE=Birka BPA Informationssystem AB
+OUI:009D8E*
+ ID_OUI_FROM_DATABASE=CARDIAC RECORDERS, INC.
 
-OUI:000805*
- ID_OUI_FROM_DATABASE=Techno-Holon Corporation
+OUI:006086*
+ ID_OUI_FROM_DATABASE=LOGIC REPLACEMENT TECH. LTD.
 
-OUI:00080C*
- ID_OUI_FROM_DATABASE=VDA Elettronica spa
+OUI:001C7C*
+ ID_OUI_FROM_DATABASE=PERQ SYSTEMS CORPORATION
 
-OUI:0007FB*
- ID_OUI_FROM_DATABASE=Giga Stream UMTS Technologies GmbH
+OUI:00C059*
+ ID_OUI_FROM_DATABASE=DENSO CORPORATION
 
-OUI:0007F5*
- ID_OUI_FROM_DATABASE=Bridgeco Co AG
+OUI:00C0A9*
+ ID_OUI_FROM_DATABASE=BARRON MCCANN LTD.
 
-OUI:0007E8*
- ID_OUI_FROM_DATABASE=EdgeWave
+OUI:00C069*
+ ID_OUI_FROM_DATABASE=Axxcelera Broadband Wireless
 
-OUI:0007EF*
- ID_OUI_FROM_DATABASE=Lockheed Martin Tactical Systems
+OUI:00C019*
+ ID_OUI_FROM_DATABASE=LEAP TECHNOLOGY, INC.
 
-OUI:0007E2*
- ID_OUI_FROM_DATABASE=Bitworks, Inc.
+OUI:00A062*
+ ID_OUI_FROM_DATABASE=AES PRODATA
 
-OUI:0007D6*
- ID_OUI_FROM_DATABASE=Commil Ltd.
+OUI:00A008*
+ ID_OUI_FROM_DATABASE=NETCORP
 
-OUI:0007DC*
- ID_OUI_FROM_DATABASE=Atek Co, Ltd.
+OUI:00A01B*
+ ID_OUI_FROM_DATABASE=PREMISYS COMMUNICATIONS, INC.
 
-OUI:000923*
- ID_OUI_FROM_DATABASE=Heaman System Co., Ltd
+OUI:00A04B*
+ ID_OUI_FROM_DATABASE=TFL LAN INC.
 
-OUI:00091D*
- ID_OUI_FROM_DATABASE=Proteam Computer Corporation
+OUI:00A015*
+ ID_OUI_FROM_DATABASE=WYLE
 
-OUI:000924*
- ID_OUI_FROM_DATABASE=Telebau GmbH
+OUI:00A011*
+ ID_OUI_FROM_DATABASE=MUTOH INDUSTRIES LTD.
 
-OUI:000911*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00A0B6*
+ ID_OUI_FROM_DATABASE=SANRITZ AUTOMATION CO., LTD.
 
-OUI:000916*
- ID_OUI_FROM_DATABASE=Listman Home Technologies, Inc.
+OUI:00A0DD*
+ ID_OUI_FROM_DATABASE=AZONIX CORPORATION
 
-OUI:00090A*
- ID_OUI_FROM_DATABASE=SnedFar Technology Co., Ltd.
+OUI:00A00A*
+ ID_OUI_FROM_DATABASE=Airspan
 
-OUI:000904*
- ID_OUI_FROM_DATABASE=MONDIAL electronic
+OUI:00A03B*
+ ID_OUI_FROM_DATABASE=TOSHIN ELECTRIC CO., LTD.
 
-OUI:000903*
- ID_OUI_FROM_DATABASE=Panasas, Inc
+OUI:00A0F3*
+ ID_OUI_FROM_DATABASE=STAUBLI
 
-OUI:0008FE*
- ID_OUI_FROM_DATABASE=UNIK C&C Co.,Ltd.
+OUI:00A097*
+ ID_OUI_FROM_DATABASE=JC INFORMATION SYSTEMS
 
-OUI:0008FA*
- ID_OUI_FROM_DATABASE=Karl E.Brinkmann GmbH
+OUI:00A082*
+ ID_OUI_FROM_DATABASE=NKT ELEKTRONIK A/S
 
-OUI:0008EE*
- ID_OUI_FROM_DATABASE=Logic Product Development
+OUI:00A072*
+ ID_OUI_FROM_DATABASE=OVATION SYSTEMS LTD.
 
-OUI:0008F0*
- ID_OUI_FROM_DATABASE=Next Generation Systems, Inc.
+OUI:00A0B2*
+ ID_OUI_FROM_DATABASE=SHIMA SEIKI
 
-OUI:000948*
- ID_OUI_FROM_DATABASE=Vista Control Systems, Corp.
+OUI:00A0E5*
+ ID_OUI_FROM_DATABASE=NHC COMMUNICATIONS
 
-OUI:00094F*
- ID_OUI_FROM_DATABASE=elmegt GmbH & Co. KG
+OUI:00A0D3*
+ ID_OUI_FROM_DATABASE=INSTEM COMPUTER SYSTEMS, LTD.
 
-OUI:000943*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00A0BA*
+ ID_OUI_FROM_DATABASE=PATTON ELECTRONICS CO.
 
-OUI:00093C*
- ID_OUI_FROM_DATABASE=Jacques Technologies P/L
+OUI:00A0B4*
+ ID_OUI_FROM_DATABASE=TEXAS MICROSYSTEMS, INC.
 
-OUI:000936*
- ID_OUI_FROM_DATABASE=Ipetronik GmbH & Co. KG
+OUI:00A0AF*
+ ID_OUI_FROM_DATABASE=WMS INDUSTRIES
 
-OUI:000935*
- ID_OUI_FROM_DATABASE=Sandvine Incorporated
+OUI:00A0FE*
+ ID_OUI_FROM_DATABASE=BOSTON TECHNOLOGY, INC.
 
-OUI:000929*
- ID_OUI_FROM_DATABASE=Sanyo Industries (UK) Limited
+OUI:00202F*
+ ID_OUI_FROM_DATABASE=ZETA COMMUNICATIONS, LTD.
 
-OUI:000930*
- ID_OUI_FROM_DATABASE=AeroConcierge Inc.
+OUI:002060*
+ ID_OUI_FROM_DATABASE=ALCATEL ITALIA S.p.A.
 
-OUI:0008E9*
- ID_OUI_FROM_DATABASE=NextGig
+OUI:00209A*
+ ID_OUI_FROM_DATABASE=THE 3DO COMPANY
 
-OUI:0008DC*
- ID_OUI_FROM_DATABASE=Wiznet
+OUI:00205E*
+ ID_OUI_FROM_DATABASE=CASTLE ROCK, INC.
 
-OUI:0008E2*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00207C*
+ ID_OUI_FROM_DATABASE=AUTEC GMBH
 
-OUI:0008DB*
- ID_OUI_FROM_DATABASE=Corrigent Systems
+OUI:002075*
+ ID_OUI_FROM_DATABASE=MOTOROLA COMMUNICATION ISRAEL
 
-OUI:0008D6*
- ID_OUI_FROM_DATABASE=HASSNET Inc.
+OUI:002015*
+ ID_OUI_FROM_DATABASE=ACTIS COMPUTER SA
 
-OUI:0008CF*
- ID_OUI_FROM_DATABASE=Nippon Koei Power Systems Co., Ltd.
+OUI:0020E9*
+ ID_OUI_FROM_DATABASE=DANTEL
 
-OUI:0008C0*
- ID_OUI_FROM_DATABASE=ASA SYSTEMS
+OUI:00204A*
+ ID_OUI_FROM_DATABASE=PRONET GMBH
 
-OUI:0008C5*
- ID_OUI_FROM_DATABASE=Liontech Co., Ltd.
+OUI:002029*
+ ID_OUI_FROM_DATABASE=TELEPROCESSING PRODUCTS, INC.
 
-OUI:0008C9*
- ID_OUI_FROM_DATABASE=TechniSat Digital GmbH
+OUI:002051*
+ ID_OUI_FROM_DATABASE=Verilink Corporation
 
-OUI:0008CA*
- ID_OUI_FROM_DATABASE=TwinHan Technology Co.,Ltd
+OUI:0020A1*
+ ID_OUI_FROM_DATABASE=DOVATRON
 
-OUI:0008BF*
- ID_OUI_FROM_DATABASE=Aptus Elektronik AB
+OUI:002024*
+ ID_OUI_FROM_DATABASE=PACIFIC COMMUNICATION SCIENCES
 
-OUI:0008B3*
- ID_OUI_FROM_DATABASE=Fastwel
+OUI:00209D*
+ ID_OUI_FROM_DATABASE=LIPPERT AUTOMATIONSTECHNIK
 
-OUI:0008B2*
- ID_OUI_FROM_DATABASE=SHENZHEN COMPASS TECHNOLOGY DEVELOPMENT CO.,LTD
+OUI:002041*
+ ID_OUI_FROM_DATABASE=DATA NET
 
-OUI:0008A6*
- ID_OUI_FROM_DATABASE=Multiware & Image Co., Ltd.
+OUI:002076*
+ ID_OUI_FROM_DATABASE=REUDO CORPORATION
 
-OUI:0008AD*
- ID_OUI_FROM_DATABASE=Toyo-Linx Co., Ltd.
+OUI:00206E*
+ ID_OUI_FROM_DATABASE=XACT, INC.
 
-OUI:00089A*
- ID_OUI_FROM_DATABASE=Alcatel Microelectronics
+OUI:0020CA*
+ ID_OUI_FROM_DATABASE=DIGITAL OCEAN
 
-OUI:0008A0*
- ID_OUI_FROM_DATABASE=Stotz Feinmesstechnik GmbH
+OUI:002085*
+ ID_OUI_FROM_DATABASE=Eaton Corporation
 
-OUI:000892*
- ID_OUI_FROM_DATABASE=EM Solutions
+OUI:0020CD*
+ ID_OUI_FROM_DATABASE=HYBRID NETWORKS, INC.
 
-OUI:000896*
- ID_OUI_FROM_DATABASE=Printronix, Inc.
+OUI:0020E7*
+ ID_OUI_FROM_DATABASE=B&W NUCLEAR SERVICE COMPANY
 
-OUI:00088C*
- ID_OUI_FROM_DATABASE=Quanta Network Systems Inc.
+OUI:0020AC*
+ ID_OUI_FROM_DATABASE=INTERFLEX DATENSYSTEME GMBH
 
-OUI:000886*
- ID_OUI_FROM_DATABASE=Hansung Teliann, Inc.
+OUI:0020F6*
+ ID_OUI_FROM_DATABASE=NET TEK  AND KARLNET, INC.
 
-OUI:000873*
- ID_OUI_FROM_DATABASE=DapTechnology B.V.
+OUI:0020D3*
+ ID_OUI_FROM_DATABASE=OST (OUEST STANDARD TELEMATIQU
 
-OUI:00087A*
- ID_OUI_FROM_DATABASE=Wipotec GmbH
+OUI:0020D8*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:00087F*
- ID_OUI_FROM_DATABASE=SPAUN electronic GmbH & Co. KG
+OUI:002017*
+ ID_OUI_FROM_DATABASE=ORBOTECH
 
-OUI:02608C*
- ID_OUI_FROM_DATABASE=3COM CORPORATION
+OUI:002025*
+ ID_OUI_FROM_DATABASE=CONTROL TECHNOLOGY, INC.
 
-OUI:0007D0*
- ID_OUI_FROM_DATABASE=Automat Engenharia de Automação Ltda.
+OUI:00C08B*
+ ID_OUI_FROM_DATABASE=RISQ MODULAR SYSTEMS, INC.
 
-OUI:0007CD*
- ID_OUI_FROM_DATABASE=Kumoh Electronic Co, Ltd
+OUI:00C0CD*
+ ID_OUI_FROM_DATABASE=COMELTA, S.A.
 
-OUI:0007C7*
- ID_OUI_FROM_DATABASE=Synectics Systems Limited
+OUI:00C04B*
+ ID_OUI_FROM_DATABASE=CREATIVE MICROSYSTEMS
 
-OUI:00047D*
- ID_OUI_FROM_DATABASE=Pelco
+OUI:00C0A1*
+ ID_OUI_FROM_DATABASE=TOKYO DENSHI SEKEI CO.
 
-OUI:00047E*
- ID_OUI_FROM_DATABASE=Siqura B.V.
+OUI:00C03E*
+ ID_OUI_FROM_DATABASE=FA. GEBR. HELLER GMBH
 
-OUI:0007C1*
- ID_OUI_FROM_DATABASE=Overture Networks, Inc.
+OUI:00C0E1*
+ ID_OUI_FROM_DATABASE=SONIC SOLUTIONS
 
-OUI:0007C0*
- ID_OUI_FROM_DATABASE=NetZerver Inc.
+OUI:00C047*
+ ID_OUI_FROM_DATABASE=UNIMICRO SYSTEMS, INC.
 
-OUI:0007AE*
- ID_OUI_FROM_DATABASE=Britestream Networks, Inc.
+OUI:00C046*
+ ID_OUI_FROM_DATABASE=Blue Chip Technology Ltd
 
-OUI:0007B4*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00C00D*
+ ID_OUI_FROM_DATABASE=ADVANCED LOGIC RESEARCH, INC.
 
-OUI:00079A*
- ID_OUI_FROM_DATABASE=Verint Systems Inc
+OUI:00C0FA*
+ ID_OUI_FROM_DATABASE=CANARY COMMUNICATIONS, INC.
 
-OUI:0007A0*
- ID_OUI_FROM_DATABASE=e-Watch Inc.
+OUI:00C0B7*
+ ID_OUI_FROM_DATABASE=AMERICAN POWER CONVERSION CORP
 
-OUI:000794*
- ID_OUI_FROM_DATABASE=Simple Devices, Inc.
+OUI:00C0BA*
+ ID_OUI_FROM_DATABASE=NETVANTAGE
 
-OUI:000793*
- ID_OUI_FROM_DATABASE=Shin Satellite Public Company Limited
+OUI:00C0B6*
+ ID_OUI_FROM_DATABASE=Overland Storage, Inc.
 
-OUI:00078D*
- ID_OUI_FROM_DATABASE=NetEngines Ltd.
+OUI:00C048*
+ ID_OUI_FROM_DATABASE=BAY TECHNICAL ASSOCIATES
 
-OUI:00078E*
- ID_OUI_FROM_DATABASE=Garz & Friche GmbH
+OUI:00C03F*
+ ID_OUI_FROM_DATABASE=STORES AUTOMATED SYSTEMS, INC.
 
-OUI:000781*
- ID_OUI_FROM_DATABASE=Itron Inc.
+OUI:00C00E*
+ ID_OUI_FROM_DATABASE=PSITECH, INC.
 
-OUI:000787*
- ID_OUI_FROM_DATABASE=Idea System Co., Ltd.
+OUI:00C036*
+ ID_OUI_FROM_DATABASE=RAYTECH ELECTRONIC CORP.
 
-OUI:000777*
- ID_OUI_FROM_DATABASE=Motah Ltd.
+OUI:00C009*
+ ID_OUI_FROM_DATABASE=KT TECHNOLOGY (S) PTE LTD
 
-OUI:000771*
- ID_OUI_FROM_DATABASE=Embedded System Corporation
+OUI:00C0EA*
+ ID_OUI_FROM_DATABASE=ARRAY TECHNOLOGY LTD.
 
-OUI:00075B*
- ID_OUI_FROM_DATABASE=Gibson Guitars
+OUI:00C03A*
+ ID_OUI_FROM_DATABASE=MEN-MIKRO ELEKTRONIK GMBH
 
-OUI:000760*
- ID_OUI_FROM_DATABASE=TOMIS Information & Telecom Corp.
+OUI:00C040*
+ ID_OUI_FROM_DATABASE=ECCI
 
-OUI:000767*
- ID_OUI_FROM_DATABASE=Yuxing Electronics Company Limited
+OUI:00C04C*
+ ID_OUI_FROM_DATABASE=DEPARTMENT OF FOREIGN AFFAIRS
 
-OUI:000879*
- ID_OUI_FROM_DATABASE=CEM Corporation
+OUI:00C01C*
+ ID_OUI_FROM_DATABASE=INTERLINK COMMUNICATIONS LTD.
 
-OUI:00086C*
- ID_OUI_FROM_DATABASE=Plasmon LMS
+OUI:00C086*
+ ID_OUI_FROM_DATABASE=THE LYNK CORPORATION
 
-OUI:00086D*
- ID_OUI_FROM_DATABASE=Missouri FreeNet
+OUI:00C08D*
+ ID_OUI_FROM_DATABASE=TRONIX PRODUCT DEVELOPMENT
 
-OUI:000867*
- ID_OUI_FROM_DATABASE=Uptime Devices
+OUI:00C0A2*
+ ID_OUI_FROM_DATABASE=INTERMEDIUM A/S
 
-OUI:000860*
- ID_OUI_FROM_DATABASE=LodgeNet Entertainment Corp.
+OUI:00C070*
+ ID_OUI_FROM_DATABASE=SECTRA SECURE-TRANSMISSION AB
 
-OUI:000854*
- ID_OUI_FROM_DATABASE=Netronix, Inc.
+OUI:00C057*
+ ID_OUI_FROM_DATABASE=MYCO ELECTRONICS
 
-OUI:00085A*
- ID_OUI_FROM_DATABASE=IntiGate Inc.
+OUI:00C0DF*
+ ID_OUI_FROM_DATABASE=KYE Systems Corp.
 
-OUI:00081E*
- ID_OUI_FROM_DATABASE=Repeatit AB
+OUI:00C0F6*
+ ID_OUI_FROM_DATABASE=CELAN TECHNOLOGY INC.
 
-OUI:00082B*
- ID_OUI_FROM_DATABASE=Wooksung Electronics, Inc.
+OUI:00C012*
+ ID_OUI_FROM_DATABASE=NETSPAN CORPORATION
 
-OUI:000824*
- ID_OUI_FROM_DATABASE=Nuance Document Imaging
+OUI:00C0C4*
+ ID_OUI_FROM_DATABASE=COMPUTER OPERATIONAL
 
-OUI:0005BA*
- ID_OUI_FROM_DATABASE=Area Netwoeks, Inc.
+OUI:00C0C2*
+ ID_OUI_FROM_DATABASE=INFINITE NETWORKS LTD.
 
-OUI:0005B9*
- ID_OUI_FROM_DATABASE=Airvana, Inc.
+OUI:00C0D3*
+ ID_OUI_FROM_DATABASE=OLYMPUS IMAGE SYSTEMS, INC.
 
-OUI:0005C0*
- ID_OUI_FROM_DATABASE=Digital Network Alacarte Co., Ltd.
+OUI:00C0B0*
+ ID_OUI_FROM_DATABASE=GCC TECHNOLOGIES,INC.
 
-OUI:000599*
- ID_OUI_FROM_DATABASE=DRS Test and Energy Management or DRS-TEM
+OUI:00C0F4*
+ ID_OUI_FROM_DATABASE=INTERLINK SYSTEM CO., LTD.
 
-OUI:0005A0*
- ID_OUI_FROM_DATABASE=MOBILINE Kft.
+OUI:00C0E2*
+ ID_OUI_FROM_DATABASE=CALCOMP, INC.
 
-OUI:0005A9*
- ID_OUI_FROM_DATABASE=Princeton Networks, Inc.
+OUI:00C0CA*
+ ID_OUI_FROM_DATABASE=ALFA, INC.
 
-OUI:0005AA*
- ID_OUI_FROM_DATABASE=Moore Industries International Inc.
+OUI:00C07B*
+ ID_OUI_FROM_DATABASE=ASCEND COMMUNICATIONS, INC.
 
-OUI:0005AF*
- ID_OUI_FROM_DATABASE=InnoScan Computing A/S
+OUI:00C052*
+ ID_OUI_FROM_DATABASE=BURR-BROWN
 
-OUI:0005B3*
- ID_OUI_FROM_DATABASE=Asahi-Engineering Co., Ltd.
+OUI:00C0BE*
+ ID_OUI_FROM_DATABASE=ALCATEL - SEL
 
-OUI:00059F*
- ID_OUI_FROM_DATABASE=Yotta Networks, Inc.
+OUI:00408F*
+ ID_OUI_FROM_DATABASE=WM-DATA MINFO AB
 
-OUI:0005A6*
- ID_OUI_FROM_DATABASE=Extron Electronics
+OUI:0040B7*
+ ID_OUI_FROM_DATABASE=STEALTH COMPUTER SYSTEMS
 
-OUI:0005B4*
- ID_OUI_FROM_DATABASE=Aceex Corporation
+OUI:004057*
+ ID_OUI_FROM_DATABASE=LOCKHEED - SANDERS
 
-OUI:00058D*
- ID_OUI_FROM_DATABASE=Lynx Photonic Networks, Inc.
+OUI:004017*
+ ID_OUI_FROM_DATABASE=Silex Technology America
 
-OUI:000587*
- ID_OUI_FROM_DATABASE=Locus, Incorporated
+OUI:004087*
+ ID_OUI_FROM_DATABASE=UBITREX CORPORATION
 
-OUI:000593*
- ID_OUI_FROM_DATABASE=Grammar Engine Inc.
+OUI:00400E*
+ ID_OUI_FROM_DATABASE=MEMOTEC, INC.
 
-OUI:000586*
- ID_OUI_FROM_DATABASE=Lucent Technologies
+OUI:00C09E*
+ ID_OUI_FROM_DATABASE=CACHE COMPUTERS, INC.
 
-OUI:00057A*
- ID_OUI_FROM_DATABASE=Overture Networks
+OUI:00C093*
+ ID_OUI_FROM_DATABASE=ALTA RESEARCH CORP.
 
-OUI:00063C*
- ID_OUI_FROM_DATABASE=Intrinsyc Software International Inc.
+OUI:00C034*
+ ID_OUI_FROM_DATABASE=TRANSACTION NETWORK
 
-OUI:00062F*
- ID_OUI_FROM_DATABASE=Pivotech Systems Inc.
+OUI:004034*
+ ID_OUI_FROM_DATABASE=BUSTEK CORPORATION
 
-OUI:000636*
- ID_OUI_FROM_DATABASE=Jedai Broadband Networks
+OUI:004097*
+ ID_OUI_FROM_DATABASE=DATEX DIVISION OF
 
-OUI:000635*
- ID_OUI_FROM_DATABASE=PacketAir Networks, Inc.
+OUI:00401E*
+ ID_OUI_FROM_DATABASE=ICC
 
-OUI:000628*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00407C*
+ ID_OUI_FROM_DATABASE=QUME CORPORATION
 
-OUI:00061F*
- ID_OUI_FROM_DATABASE=Vision Components GmbH
+OUI:004060*
+ ID_OUI_FROM_DATABASE=COMENDEC LTD
 
-OUI:000619*
- ID_OUI_FROM_DATABASE=Connection Technology Systems
+OUI:004056*
+ ID_OUI_FROM_DATABASE=MCM JAPAN LTD.
 
-OUI:00060D*
- ID_OUI_FROM_DATABASE=Wave7 Optics
+OUI:004095*
+ ID_OUI_FROM_DATABASE=R.P.T. INTERGROUPS INT'L LTD.
 
-OUI:000613*
- ID_OUI_FROM_DATABASE=Kawasaki Microelectronics Incorporated
+OUI:0040C3*
+ ID_OUI_FROM_DATABASE=FISCHER AND PORTER CO.
 
-OUI:00060E*
- ID_OUI_FROM_DATABASE=IGYS Systems, Inc.
+OUI:0040F1*
+ ID_OUI_FROM_DATABASE=CHUO ELECTRONICS CO., LTD.
 
-OUI:0005EC*
- ID_OUI_FROM_DATABASE=Mosaic Systems Inc.
+OUI:004061*
+ ID_OUI_FROM_DATABASE=DATATECH ENTERPRISES CO., LTD.
 
-OUI:0005D3*
- ID_OUI_FROM_DATABASE=eProduction Solutions, Inc.
+OUI:00408B*
+ ID_OUI_FROM_DATABASE=RAYLAN CORPORATION
 
-OUI:000608*
- ID_OUI_FROM_DATABASE=At-Sky SAS
+OUI:004020*
+ ID_OUI_FROM_DATABASE=CommScope Inc
 
-OUI:000607*
- ID_OUI_FROM_DATABASE=Omni Directional Control Technology Inc.
+OUI:00406E*
+ ID_OUI_FROM_DATABASE=COROLLARY, INC.
+
+OUI:004016*
+ ID_OUI_FROM_DATABASE=ADC - Global Connectivity Solutions Division
 
-OUI:0005E6*
- ID_OUI_FROM_DATABASE=Egenera, Inc.
+OUI:004086*
+ ID_OUI_FROM_DATABASE=MICHELS & KLEBERHOFF COMPUTER
 
-OUI:000580*
- ID_OUI_FROM_DATABASE=FibroLAN Ltd.
+OUI:0040DC*
+ ID_OUI_FROM_DATABASE=TRITEC ELECTRONIC GMBH
 
-OUI:000576*
- ID_OUI_FROM_DATABASE=NSM Technology Ltd.
+OUI:004074*
+ ID_OUI_FROM_DATABASE=CABLE AND WIRELESS
 
-OUI:000570*
- ID_OUI_FROM_DATABASE=Baydel Ltd.
+OUI:004084*
+ ID_OUI_FROM_DATABASE=HONEYWELL ACS
 
-OUI:00056A*
- ID_OUI_FROM_DATABASE=Heuft Systemtechnik GmbH
+OUI:0040B8*
+ ID_OUI_FROM_DATABASE=IDEA ASSOCIATES
 
-OUI:000563*
- ID_OUI_FROM_DATABASE=J-Works, Inc.
+OUI:004058*
+ ID_OUI_FROM_DATABASE=KRONOS, INC.
 
-OUI:00055D*
- ID_OUI_FROM_DATABASE=D-LINK SYSTEMS, INC.
+OUI:0040A8*
+ ID_OUI_FROM_DATABASE=IMF INTERNATIONAL LTD.
 
-OUI:000564*
- ID_OUI_FROM_DATABASE=Tsinghua Bitway Co., Ltd.
+OUI:0080BB*
+ ID_OUI_FROM_DATABASE=HUGHES LAN SYSTEMS
 
-OUI:000557*
- ID_OUI_FROM_DATABASE=Agile TV Corporation
+OUI:00C0A0*
+ ID_OUI_FROM_DATABASE=ADVANCE MICRO RESEARCH, INC.
 
-OUI:000551*
- ID_OUI_FROM_DATABASE=F & S Elektronik Systeme GmbH
+OUI:00C0D7*
+ ID_OUI_FROM_DATABASE=TAIWAN TRADING CENTER DBA
 
-OUI:00054B*
- ID_OUI_FROM_DATABASE=Eaton Automation AG
+OUI:00C037*
+ ID_OUI_FROM_DATABASE=DYNATEM
 
-OUI:00054A*
- ID_OUI_FROM_DATABASE=Ario Data Networks, Inc.
+OUI:00C05F*
+ ID_OUI_FROM_DATABASE=FINE-PAL COMPANY LIMITED
 
-OUI:000544*
- ID_OUI_FROM_DATABASE=Valley Technologies, Inc.
+OUI:0040CE*
+ ID_OUI_FROM_DATABASE=NET-SOURCE, INC.
 
-OUI:00053E*
- ID_OUI_FROM_DATABASE=KID Systeme GmbH
+OUI:004080*
+ ID_OUI_FROM_DATABASE=ATHENIX CORPORATION
 
-OUI:000531*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0040BB*
+ ID_OUI_FROM_DATABASE=GOLDSTAR CABLE CO., LTD.
 
-OUI:000538*
- ID_OUI_FROM_DATABASE=Merilus, Inc.
+OUI:0040B1*
+ ID_OUI_FROM_DATABASE=CODONICS INC.
 
-OUI:000532*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00402E*
+ ID_OUI_FROM_DATABASE=PRECISION SOFTWARE, INC.
 
-OUI:000525*
- ID_OUI_FROM_DATABASE=Puretek Industrial Co., Ltd.
+OUI:00C0CE*
+ ID_OUI_FROM_DATABASE=CEI SYSTEMS & ENGINEERING PTE
 
-OUI:00052B*
- ID_OUI_FROM_DATABASE=HORIBA, Ltd.
+OUI:00409B*
+ ID_OUI_FROM_DATABASE=HAL COMPUTER SYSTEMS INC.
 
-OUI:00051F*
- ID_OUI_FROM_DATABASE=Taijin Media Co., Ltd.
+OUI:004073*
+ ID_OUI_FROM_DATABASE=BASS ASSOCIATES
 
-OUI:000519*
- ID_OUI_FROM_DATABASE=Siemens Building Technologies AG,
+OUI:10005A*
+ ID_OUI_FROM_DATABASE=IBM Corp
 
-OUI:000518*
- ID_OUI_FROM_DATABASE=Jupiters Technology
+OUI:004005*
+ ID_OUI_FROM_DATABASE=ANI COMMUNICATIONS INC.
 
-OUI:00050E*
- ID_OUI_FROM_DATABASE=3ware, Inc.
+OUI:004099*
+ ID_OUI_FROM_DATABASE=NEWGEN SYSTEMS CORP.
 
-OUI:00050F*
- ID_OUI_FROM_DATABASE=Tanaka S/S Ltd.
+OUI:0040E1*
+ ID_OUI_FROM_DATABASE=MARNER INTERNATIONAL, INC.
 
-OUI:000508*
- ID_OUI_FROM_DATABASE=Inetcam, Inc.
+OUI:0080DD*
+ ID_OUI_FROM_DATABASE=GMX INC/GIMIX
 
-OUI:0004FE*
- ID_OUI_FROM_DATABASE=Pelago Networks
+OUI:0080B7*
+ ID_OUI_FROM_DATABASE=STELLAR COMPUTER
 
-OUI:000671*
- ID_OUI_FROM_DATABASE=Softing AG
+OUI:008002*
+ ID_OUI_FROM_DATABASE=SATELCOM (UK) LTD
 
-OUI:000672*
- ID_OUI_FROM_DATABASE=Netezza
+OUI:00805C*
+ ID_OUI_FROM_DATABASE=AGILIS CORPORATION
 
-OUI:00067B*
- ID_OUI_FROM_DATABASE=Toplink C&C Corporation
+OUI:008070*
+ ID_OUI_FROM_DATABASE=COMPUTADORAS MICRON
 
-OUI:000665*
- ID_OUI_FROM_DATABASE=Sunny Giken, Inc.
+OUI:00808F*
+ ID_OUI_FROM_DATABASE=C. ITOH ELECTRONICS, INC.
 
-OUI:00066B*
- ID_OUI_FROM_DATABASE=Sysmex Corporation
+OUI:000091*
+ ID_OUI_FROM_DATABASE=ANRITSU CORPORATION
 
-OUI:000652*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000094*
+ ID_OUI_FROM_DATABASE=ASANTE TECHNOLOGIES
 
-OUI:000659*
- ID_OUI_FROM_DATABASE=EAL (Apeldoorn) B.V.
+OUI:000090*
+ ID_OUI_FROM_DATABASE=MICROCOM
 
-OUI:000658*
- ID_OUI_FROM_DATABASE=Helmut Fischer GmbH Institut für Elektronik und Messtechnik
+OUI:000047*
+ ID_OUI_FROM_DATABASE=NICOLET INSTRUMENTS CORP.
 
-OUI:000646*
- ID_OUI_FROM_DATABASE=ShenZhen XunBao Network Technology Co Ltd
+OUI:0000FB*
+ ID_OUI_FROM_DATABASE=RECHNER ZUR KOMMUNIKATION
 
-OUI:000640*
- ID_OUI_FROM_DATABASE=White Rock Networks
+OUI:0000A3*
+ ID_OUI_FROM_DATABASE=NETWORK APPLICATION TECHNOLOGY
 
-OUI:00064C*
- ID_OUI_FROM_DATABASE=Invicta Networks, Inc.
+OUI:00008F*
+ ID_OUI_FROM_DATABASE=Raytheon
 
-OUI:0006B5*
- ID_OUI_FROM_DATABASE=Source Photonics, Inc.
+OUI:00007E*
+ ID_OUI_FROM_DATABASE=CLUSTRIX CORPORATION
 
-OUI:0006A8*
- ID_OUI_FROM_DATABASE=KC Technology, Inc.
+OUI:00000A*
+ ID_OUI_FROM_DATABASE=OMRON TATEISI ELECTRONICS CO.
 
-OUI:00069E*
- ID_OUI_FROM_DATABASE=UNIQA, Inc.
+OUI:000063*
+ ID_OUI_FROM_DATABASE=BARCO CONTROL ROOMS GMBH
 
-OUI:000698*
- ID_OUI_FROM_DATABASE=egnite GmbH
+OUI:00004E*
+ ID_OUI_FROM_DATABASE=AMPEX CORPORATION
 
-OUI:000692*
- ID_OUI_FROM_DATABASE=Intruvert Networks, Inc.
+OUI:0000C2*
+ ID_OUI_FROM_DATABASE=INFORMATION PRESENTATION TECH.
 
-OUI:00068C*
- ID_OUI_FROM_DATABASE=3COM CORPORATION
+OUI:000034*
+ ID_OUI_FROM_DATABASE=NETWORK RESOURCES CORPORATION
 
-OUI:000685*
- ID_OUI_FROM_DATABASE=NetNearU Corporation
+OUI:000049*
+ ID_OUI_FROM_DATABASE=APRICOT COMPUTERS, LTD
 
-OUI:00068B*
- ID_OUI_FROM_DATABASE=AirRunner Technologies, Inc.
+OUI:0000E2*
+ ID_OUI_FROM_DATABASE=ACER TECHNOLOGIES CORP.
 
-OUI:000686*
- ID_OUI_FROM_DATABASE=ZARDCOM Co., Ltd.
+OUI:000097*
+ ID_OUI_FROM_DATABASE=EMC Corporation
 
-OUI:00067F*
- ID_OUI_FROM_DATABASE=Digeo, Inc.
+OUI:0000D4*
+ ID_OUI_FROM_DATABASE=PURE DATA LTD.
 
-OUI:0006DE*
- ID_OUI_FROM_DATABASE=Flash Technology
+OUI:0000E1*
+ ID_OUI_FROM_DATABASE=GRID SYSTEMS
 
-OUI:0006E4*
- ID_OUI_FROM_DATABASE=Citel Technologies Ltd.
+OUI:000044*
+ ID_OUI_FROM_DATABASE=CASTELLE CORPORATION
 
-OUI:0006D1*
- ID_OUI_FROM_DATABASE=Tahoe Networks, Inc.
+OUI:000027*
+ ID_OUI_FROM_DATABASE=JAPAN RADIO COMPANY
 
-OUI:0006DA*
- ID_OUI_FROM_DATABASE=ITRAN Communications Ltd.
+OUI:004049*
+ ID_OUI_FROM_DATABASE=Roche Diagnostics International Ltd.
 
-OUI:0006CB*
- ID_OUI_FROM_DATABASE=Jotron Electronics A/S
+OUI:004029*
+ ID_OUI_FROM_DATABASE=Compex
 
-OUI:0006CC*
- ID_OUI_FROM_DATABASE=JMI Electronics Co., Ltd.
+OUI:008038*
+ ID_OUI_FROM_DATABASE=DATA RESEARCH & APPLICATIONS
 
-OUI:0006BB*
- ID_OUI_FROM_DATABASE=ATI Technologies Inc.
+OUI:008090*
+ ID_OUI_FROM_DATABASE=MICROTEK INTERNATIONAL, INC.
 
-OUI:0006C5*
- ID_OUI_FROM_DATABASE=INNOVI Technologies Limited
+OUI:0080C3*
+ ID_OUI_FROM_DATABASE=BICC INFORMATION SYSTEMS & SVC
 
-OUI:0006AF*
- ID_OUI_FROM_DATABASE=Xalted Networks
+OUI:00805A*
+ ID_OUI_FROM_DATABASE=TULIP COMPUTERS INTERNAT'L B.V
 
-OUI:000719*
- ID_OUI_FROM_DATABASE=Mobiis Co., Ltd.
+OUI:0080F0*
+ ID_OUI_FROM_DATABASE=Panasonic Communications Co., Ltd.
 
-OUI:000720*
- ID_OUI_FROM_DATABASE=Trutzschler GmbH & Co. KG
+OUI:008043*
+ ID_OUI_FROM_DATABASE=NETWORLD, INC.
 
-OUI:000713*
- ID_OUI_FROM_DATABASE=IP One, Inc.
+OUI:0080B0*
+ ID_OUI_FROM_DATABASE=ADVANCED INFORMATION
 
-OUI:00070D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:008066*
+ ID_OUI_FROM_DATABASE=ARCOM CONTROL SYSTEMS, LTD.
 
-OUI:000714*
- ID_OUI_FROM_DATABASE=Brightcom
+OUI:004051*
+ ID_OUI_FROM_DATABASE=GRACILIS, INC.
 
-OUI:0006F1*
- ID_OUI_FROM_DATABASE=Optillion
+OUI:004064*
+ ID_OUI_FROM_DATABASE=KLA INSTRUMENTS CORPORATION
 
-OUI:0006F0*
- ID_OUI_FROM_DATABASE=Digeo, Inc.
+OUI:004028*
+ ID_OUI_FROM_DATABASE=NETCOMM LIMITED
 
-OUI:0006FB*
- ID_OUI_FROM_DATABASE=Hitachi Printing Solutions, Ltd.
+OUI:004013*
+ ID_OUI_FROM_DATABASE=NTT DATA COMM. SYSTEMS CORP.
 
-OUI:0006EB*
- ID_OUI_FROM_DATABASE=Global Data
+OUI:0040A0*
+ ID_OUI_FROM_DATABASE=GOLDSTAR CO., LTD.
 
-OUI:0005F2*
- ID_OUI_FROM_DATABASE=Power R, Inc.
+OUI:0040B2*
+ ID_OUI_FROM_DATABASE=SYSTEMFORSCHUNG
 
-OUI:0005FE*
- ID_OUI_FROM_DATABASE=Traficon N.V.
+OUI:004071*
+ ID_OUI_FROM_DATABASE=ATM COMPUTER GMBH
 
-OUI:0005E5*
- ID_OUI_FROM_DATABASE=Renishaw PLC
+OUI:0080BF*
+ ID_OUI_FROM_DATABASE=TAKAOKA ELECTRIC MFG. CO. LTD.
 
-OUI:0005F8*
- ID_OUI_FROM_DATABASE=Real Time Access, Inc.
+OUI:0080F6*
+ ID_OUI_FROM_DATABASE=SYNERGY MICROSYSTEMS
 
-OUI:0005FF*
- ID_OUI_FROM_DATABASE=SNS Solutions, Inc.
+OUI:000058*
+ ID_OUI_FROM_DATABASE=RACORE COMPUTER PRODUCTS INC.
 
-OUI:0005DD*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000050*
+ ID_OUI_FROM_DATABASE=RADISYS CORPORATION
 
-OUI:0005D9*
- ID_OUI_FROM_DATABASE=Techno Valley, Inc.
+OUI:008082*
+ ID_OUI_FROM_DATABASE=PEP MODULAR COMPUTERS GMBH
 
-OUI:0005C6*
- ID_OUI_FROM_DATABASE=Triz Communications
+OUI:008096*
+ ID_OUI_FROM_DATABASE=HUMAN DESIGNED SYSTEMS, INC.
 
-OUI:0005CC*
- ID_OUI_FROM_DATABASE=Sumtel Communications, Inc.
+OUI:0080D5*
+ ID_OUI_FROM_DATABASE=CADRE TECHNOLOGIES
 
-OUI:00044C*
- ID_OUI_FROM_DATABASE=JENOPTIK
+OUI:00803E*
+ ID_OUI_FROM_DATABASE=SYNERNETICS
 
-OUI:000448*
- ID_OUI_FROM_DATABASE=Polaroid Corporation
+OUI:00809A*
+ ID_OUI_FROM_DATABASE=NOVUS NETWORKS LTD
 
-OUI:00043C*
- ID_OUI_FROM_DATABASE=SONOS Co., Ltd.
+OUI:0080B3*
+ ID_OUI_FROM_DATABASE=AVAL DATA CORPORATION
 
-OUI:000441*
- ID_OUI_FROM_DATABASE=Half Dome Systems, Inc.
+OUI:0080A3*
+ ID_OUI_FROM_DATABASE=Lantronix
 
-OUI:00042F*
- ID_OUI_FROM_DATABASE=International Communications Products, Inc.
+OUI:00803C*
+ ID_OUI_FROM_DATABASE=TVS ELECTRONICS LTD
 
-OUI:000429*
- ID_OUI_FROM_DATABASE=Pixord Corporation
+OUI:008061*
+ ID_OUI_FROM_DATABASE=LITTON SYSTEMS, INC.
 
-OUI:000422*
- ID_OUI_FROM_DATABASE=Gordon Kapes, Inc.
+OUI:0080AD*
+ ID_OUI_FROM_DATABASE=CNET TECHNOLOGY, INC.
 
-OUI:00041C*
- ID_OUI_FROM_DATABASE=ipDialog, Inc.
+OUI:008081*
+ ID_OUI_FROM_DATABASE=KENDALL SQUARE RESEARCH CORP.
 
-OUI:00041D*
- ID_OUI_FROM_DATABASE=Corega of America
+OUI:008019*
+ ID_OUI_FROM_DATABASE=DAYNA COMMUNICATIONS, INC.
 
-OUI:000416*
- ID_OUI_FROM_DATABASE=Parks S/A Comunicacoes Digitais
+OUI:00808B*
+ ID_OUI_FROM_DATABASE=DACOLL LIMITED
 
-OUI:000410*
- ID_OUI_FROM_DATABASE=Spinnaker Networks, Inc.
+OUI:008097*
+ ID_OUI_FROM_DATABASE=CENTRALP AUTOMATISMES
 
-OUI:00040F*
- ID_OUI_FROM_DATABASE=Asus Network Technologies, Inc.
+OUI:0080FC*
+ ID_OUI_FROM_DATABASE=AVATAR CORPORATION
 
-OUI:00040A*
- ID_OUI_FROM_DATABASE=Sage Systems
+OUI:008076*
+ ID_OUI_FROM_DATABASE=MCNC
 
-OUI:000403*
- ID_OUI_FROM_DATABASE=Nexsi Corporation
+OUI:008080*
+ ID_OUI_FROM_DATABASE=DATAMEDIA CORPORATION
 
-OUI:0004F8*
- ID_OUI_FROM_DATABASE=QUALICABLE TV Industria E Com., Ltda
+OUI:0000E6*
+ ID_OUI_FROM_DATABASE=APTOR PRODUITS DE COMM INDUST
 
-OUI:0004F2*
- ID_OUI_FROM_DATABASE=Polycom
+OUI:000084*
+ ID_OUI_FROM_DATABASE=SUPERNET
 
-OUI:0004EB*
- ID_OUI_FROM_DATABASE=Paxonet Communications, Inc.
+OUI:0000FF*
+ ID_OUI_FROM_DATABASE=CAMTEC ELECTRONICS LTD.
 
-OUI:0004EC*
- ID_OUI_FROM_DATABASE=Memobox SA
+OUI:00007B*
+ ID_OUI_FROM_DATABASE=RESEARCH MACHINES
 
-OUI:0004E6*
- ID_OUI_FROM_DATABASE=Banyan Network Private Limited
+OUI:000056*
+ ID_OUI_FROM_DATABASE=DR. B. STRUCK
 
-OUI:0004E1*
- ID_OUI_FROM_DATABASE=Infinior Microsystems
+OUI:0000BB*
+ ID_OUI_FROM_DATABASE=TRI-DATA
 
-OUI:0004DB*
- ID_OUI_FROM_DATABASE=Tellus Group Corp.
+OUI:080025*
+ ID_OUI_FROM_DATABASE=CONTROL DATA
 
-OUI:0004E2*
- ID_OUI_FROM_DATABASE=SMC Networks, Inc.
+OUI:080020*
+ ID_OUI_FROM_DATABASE=Oracle Corporation
 
-OUI:0004D5*
- ID_OUI_FROM_DATABASE=Hitachi Information & Communication Engineering, Ltd.
+OUI:027001*
+ ID_OUI_FROM_DATABASE=RACAL-DATACOM
 
-OUI:0004CF*
- ID_OUI_FROM_DATABASE=Seagate Technology
+OUI:080006*
+ ID_OUI_FROM_DATABASE=SIEMENS AG
 
-OUI:0004C9*
- ID_OUI_FROM_DATABASE=Micro Electron Co., Ltd.
+OUI:08007E*
+ ID_OUI_FROM_DATABASE=AMALGAMATED WIRELESS(AUS) LTD
 
-OUI:000487*
- ID_OUI_FROM_DATABASE=Cogency Semiconductor, Inc.
+OUI:080075*
+ ID_OUI_FROM_DATABASE=DANSK DATA ELECTRONIK
 
-OUI:000482*
- ID_OUI_FROM_DATABASE=Medialogic Corp.
+OUI:080073*
+ ID_OUI_FROM_DATABASE=TECMAR INC.
 
-OUI:000478*
- ID_OUI_FROM_DATABASE=G. Star Technology Corporation
+OUI:080069*
+ ID_OUI_FROM_DATABASE=SILICON GRAPHICS INC.
 
-OUI:000471*
- ID_OUI_FROM_DATABASE=IPrad
+OUI:080061*
+ ID_OUI_FROM_DATABASE=JAROGATE LTD.
 
-OUI:00046B*
- ID_OUI_FROM_DATABASE=Palm Wireless, Inc.
+OUI:08005D*
+ ID_OUI_FROM_DATABASE=GOULD INC.
 
-OUI:000465*
- ID_OUI_FROM_DATABASE=i.s.t isdn-support technik GmbH
+OUI:08004E*
+ ID_OUI_FROM_DATABASE=3COM EUROPE LTD.
 
-OUI:000459*
- ID_OUI_FROM_DATABASE=Veristar Corporation
+OUI:08004A*
+ ID_OUI_FROM_DATABASE=BANYAN SYSTEMS INC.
 
-OUI:00045E*
- ID_OUI_FROM_DATABASE=PolyTrax Information Technology AG
+OUI:08004C*
+ ID_OUI_FROM_DATABASE=HYDRA COMPUTER SYSTEMS INC.
 
-OUI:000458*
- ID_OUI_FROM_DATABASE=Fusion X Co., Ltd.
+OUI:080043*
+ ID_OUI_FROM_DATABASE=PIXEL COMPUTER INC.
 
-OUI:000452*
- ID_OUI_FROM_DATABASE=RocketLogix, Inc.
+OUI:08003A*
+ ID_OUI_FROM_DATABASE=ORCATECH INC.
 
-OUI:000442*
- ID_OUI_FROM_DATABASE=NACT
+OUI:080035*
+ ID_OUI_FROM_DATABASE=MICROFIVE CORPORATION
 
-OUI:0003F9*
- ID_OUI_FROM_DATABASE=Pleiades Communications, Inc.
+OUI:080036*
+ ID_OUI_FROM_DATABASE=INTERGRAPH CORPORATION
 
-OUI:0003E2*
- ID_OUI_FROM_DATABASE=Comspace Corporation
+OUI:08002D*
+ ID_OUI_FROM_DATABASE=LAN-TEC INC.
 
-OUI:0003F4*
- ID_OUI_FROM_DATABASE=NetBurner
+OUI:000025*
+ ID_OUI_FROM_DATABASE=RAMTEK CORP.
 
-OUI:0003F3*
- ID_OUI_FROM_DATABASE=Dazzle Multimedia, Inc.
+OUI:00003A*
+ ID_OUI_FROM_DATABASE=CHYRON CORPORATION
 
-OUI:0003ED*
- ID_OUI_FROM_DATABASE=Shinkawa Electric Co., Ltd.
+OUI:000077*
+ ID_OUI_FROM_DATABASE=INTERPHASE CORPORATION
 
-OUI:0003E7*
- ID_OUI_FROM_DATABASE=Logostek Co. Ltd.
+OUI:000096*
+ ID_OUI_FROM_DATABASE=MARCONI ELECTRONICS LTD.
 
-OUI:0003DF*
- ID_OUI_FROM_DATABASE=Desana Systems
+OUI:000076*
+ ID_OUI_FROM_DATABASE=ABEKAS VIDEO SYSTEM
 
-OUI:0003DB*
- ID_OUI_FROM_DATABASE=Apogee Electronics Corp.
+OUI:0000EA*
+ ID_OUI_FROM_DATABASE=UPNOD AB
 
-OUI:0003D6*
- ID_OUI_FROM_DATABASE=RADVision, Ltd.
+OUI:000074*
+ ID_OUI_FROM_DATABASE=RICOH COMPANY LTD.
 
-OUI:0003CF*
- ID_OUI_FROM_DATABASE=Muxcom, Inc.
+OUI:00006A*
+ ID_OUI_FROM_DATABASE=COMPUTER CONSOLES INC.
 
-OUI:0003C8*
- ID_OUI_FROM_DATABASE=CML Emergency Services
+OUI:0000C4*
+ ID_OUI_FROM_DATABASE=WATERS DIV. OF MILLIPORE
 
-OUI:0003C3*
- ID_OUI_FROM_DATABASE=Micronik Multimedia
+OUI:000006*
+ ID_OUI_FROM_DATABASE=XEROX CORPORATION
 
-OUI:0003C0*
- ID_OUI_FROM_DATABASE=RFTNC Co., Ltd.
+OUI:0001C8*
+ ID_OUI_FROM_DATABASE=THOMAS CONRAD CORP.
 
-OUI:0003BC*
- ID_OUI_FROM_DATABASE=COT GmbH
+OUI:00DD0E*
+ ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
 
-OUI:0003B1*
- ID_OUI_FROM_DATABASE=Hospira Inc.
+OUI:08008D*
+ ID_OUI_FROM_DATABASE=XYVISION INC.
 
-OUI:0003A5*
- ID_OUI_FROM_DATABASE=Medea Corporation
+OUI:080059*
+ ID_OUI_FROM_DATABASE=A/S MYCRON
 
-OUI:0003AA*
- ID_OUI_FROM_DATABASE=Watlow
+OUI:021C7C*
+ ID_OUI_FROM_DATABASE=PERQ SYSTEMS CORPORATION
 
-OUI:0003A2*
- ID_OUI_FROM_DATABASE=Catapult Communications
+OUI:100000*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:000397*
- ID_OUI_FROM_DATABASE=Watchfront Limited
+OUI:080004*
+ ID_OUI_FROM_DATABASE=CROMEMCO INCORPORATED
 
-OUI:00039E*
- ID_OUI_FROM_DATABASE=Tera System Co., Ltd.
+OUI:00DD07*
+ ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
 
-OUI:000392*
- ID_OUI_FROM_DATABASE=Hyundai Teletek Co., Ltd.
+OUI:00003E*
+ ID_OUI_FROM_DATABASE=SIMPACT
 
-OUI:00038F*
- ID_OUI_FROM_DATABASE=Weinschel Corporation
+OUI:04E0C4*
+ ID_OUI_FROM_DATABASE=TRIUMPH-ADLER AG
 
-OUI:00038B*
- ID_OUI_FROM_DATABASE=PLUS-ONE I&T, Inc.
+OUI:040AE0*
+ ID_OUI_FROM_DATABASE=XMIT AG COMPUTER NETWORKS
 
-OUI:000386*
- ID_OUI_FROM_DATABASE=Ho Net, Inc.
+OUI:080016*
+ ID_OUI_FROM_DATABASE=BARRISTER INFO SYS CORP
 
-OUI:00037D*
- ID_OUI_FROM_DATABASE=Stellcom
+OUI:080012*
+ ID_OUI_FROM_DATABASE=BELL ATLANTIC INTEGRATED SYST.
 
-OUI:000382*
- ID_OUI_FROM_DATABASE=A-One Co., Ltd.
+OUI:0001C8*
+ ID_OUI_FROM_DATABASE=CONRAD CORP.
 
-OUI:00037A*
- ID_OUI_FROM_DATABASE=Taiyo Yuden Co., Ltd.
+OUI:0000F9*
+ ID_OUI_FROM_DATABASE=QUOTRON SYSTEMS INC.
 
-OUI:000376*
- ID_OUI_FROM_DATABASE=Graphtec Technology, Inc.
+OUI:0000BF*
+ ID_OUI_FROM_DATABASE=SYMMETRIC COMPUTER SYSTEMS
 
-OUI:000369*
- ID_OUI_FROM_DATABASE=Nippon Antenna Co., Ltd.
+OUI:000085*
+ ID_OUI_FROM_DATABASE=CANON INC.
 
-OUI:00036F*
- ID_OUI_FROM_DATABASE=Telsey SPA
+OUI:000028*
+ ID_OUI_FROM_DATABASE=PRODIGY SYSTEMS CORPORATION
 
-OUI:000363*
- ID_OUI_FROM_DATABASE=Miraesys Co., Ltd.
+OUI:000012*
+ ID_OUI_FROM_DATABASE=INFORMATION TECHNOLOGY LIMITED
 
-OUI:00035E*
- ID_OUI_FROM_DATABASE=Metropolitan Area Networks, Inc.
+OUI:080085*
+ ID_OUI_FROM_DATABASE=ELXSI
 
-OUI:000357*
- ID_OUI_FROM_DATABASE=Intervoice-Brite, Inc.
+OUI:00005B*
+ ID_OUI_FROM_DATABASE=ELTEC ELEKTRONIK AG
 
-OUI:00034C*
- ID_OUI_FROM_DATABASE=Shanghai DigiVision Technology Co., Ltd.
+OUI:000054*
+ ID_OUI_FROM_DATABASE=Schneider Electric
 
-OUI:000351*
- ID_OUI_FROM_DATABASE=Diebold, Inc.
+OUI:0000A9*
+ ID_OUI_FROM_DATABASE=NETWORK SYSTEMS CORP.
 
-OUI:000311*
- ID_OUI_FROM_DATABASE=Micro Technology Co., Ltd.
+OUI:000059*
+ ID_OUI_FROM_DATABASE=Hellige GMBH
 
-OUI:00030A*
- ID_OUI_FROM_DATABASE=Argus Technologies
+OUI:000099*
+ ID_OUI_FROM_DATABASE=MTX, INC.
 
-OUI:000302*
- ID_OUI_FROM_DATABASE=Charles Industries, Ltd.
+OUI:0000E9*
+ ID_OUI_FROM_DATABASE=ISICAD, INC.
 
-OUI:000305*
- ID_OUI_FROM_DATABASE=MSC Vertriebs GmbH
+OUI:08003F*
+ ID_OUI_FROM_DATABASE=FRED KOSCHARA ENTERPRISES
 
-OUI:0002FE*
- ID_OUI_FROM_DATABASE=Viditec, Inc.
+OUI:080002*
+ ID_OUI_FROM_DATABASE=BRIDGE COMMUNICATIONS INC.
 
-OUI:0002F2*
- ID_OUI_FROM_DATABASE=eDevice, Inc.
+OUI:08008B*
+ ID_OUI_FROM_DATABASE=PYRAMID TECHNOLOGY CORP.
 
-OUI:0002F7*
- ID_OUI_FROM_DATABASE=ARM
+OUI:000002*
+ ID_OUI_FROM_DATABASE=XEROX CORPORATION
 
-OUI:0002EC*
- ID_OUI_FROM_DATABASE=Maschoff Design Engineering
+OUI:84F6FA*
+ ID_OUI_FROM_DATABASE=Miovision Technologies Incorporated
 
-OUI:0002E4*
- ID_OUI_FROM_DATABASE=JC HYUN Systems, Inc.
+OUI:CC3B3E*
+ ID_OUI_FROM_DATABASE=Lester Electrical
 
-OUI:0002E7*
- ID_OUI_FROM_DATABASE=CAB GmbH & Co KG
+OUI:C05627*
+ ID_OUI_FROM_DATABASE=Belkin International Inc.
 
-OUI:0002E0*
- ID_OUI_FROM_DATABASE=ETAS GmbH
+OUI:88074B*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:0002D9*
- ID_OUI_FROM_DATABASE=Reliable Controls
+OUI:4065A3*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:0002D4*
- ID_OUI_FROM_DATABASE=PDA Peripherals, Inc.
+OUI:00789E*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:0002D1*
- ID_OUI_FROM_DATABASE=Vivotek, Inc.
+OUI:44E9DD*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:0002CD*
- ID_OUI_FROM_DATABASE=TeleDream, Inc.
+OUI:B888E3*
+ ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
 
-OUI:000349*
- ID_OUI_FROM_DATABASE=Vidicode Datacommunicatie B.V.
+OUI:002622*
+ ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
 
-OUI:000340*
- ID_OUI_FROM_DATABASE=Floware Wireless Systems, Ltd.
+OUI:001EEC*
+ ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
 
-OUI:008037*
- ID_OUI_FROM_DATABASE=Ericsson Group
+OUI:DC0EA1*
+ ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
 
-OUI:000332*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:FC4596*
+ ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
 
-OUI:000339*
- ID_OUI_FROM_DATABASE=Eurologic Systems, Ltd.
+OUI:208984*
+ ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
 
-OUI:00032A*
- ID_OUI_FROM_DATABASE=UniData Communication Systems, Inc.
+OUI:247C4C*
+ ID_OUI_FROM_DATABASE=Herman Miller
 
-OUI:00032D*
- ID_OUI_FROM_DATABASE=IBASE Technology, Inc.
+OUI:180373*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:000326*
- ID_OUI_FROM_DATABASE=Iwasaki Information Systems Co., Ltd.
+OUI:F8B156*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00031D*
- ID_OUI_FROM_DATABASE=Taiwan Commate Computer, Inc.
+OUI:1C4024*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:000318*
- ID_OUI_FROM_DATABASE=Cyras Systems, Inc.
+OUI:F8BC12*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:0004C2*
- ID_OUI_FROM_DATABASE=Magnipix, Inc.
+OUI:001B5B*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:0004B6*
- ID_OUI_FROM_DATABASE=Stratex Networks, Inc.
+OUI:002456*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:0004BC*
- ID_OUI_FROM_DATABASE=Giantec, Inc.
+OUI:002351*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:0004B0*
- ID_OUI_FROM_DATABASE=ELESIGN Co., Ltd.
+OUI:00253C*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:0004A9*
- ID_OUI_FROM_DATABASE=SandStream Technologies, Inc.
+OUI:0022A4*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:0004A8*
- ID_OUI_FROM_DATABASE=Broadmax Technologies, Inc.
+OUI:C0830A*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:0004A2*
- ID_OUI_FROM_DATABASE=L.S.I. Japan Co., Ltd.
+OUI:D0431E*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00049B*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:246E96*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00049C*
- ID_OUI_FROM_DATABASE=Surgient Networks, Inc.
+OUI:204747*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:000496*
- ID_OUI_FROM_DATABASE=Extreme Networks
+OUI:4C7625*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00048F*
- ID_OUI_FROM_DATABASE=TD Systems Corporation
+OUI:B8AC6F*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:000488*
- ID_OUI_FROM_DATABASE=Eurotherm Controls
+OUI:001EC9*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:000281*
- ID_OUI_FROM_DATABASE=Madge Ltd.
+OUI:E09861*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:009064*
- ID_OUI_FROM_DATABASE=Thomson Inc.
+OUI:F4F1E1*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:00027F*
- ID_OUI_FROM_DATABASE=ask-technologies.com
+OUI:60BEB5*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:00027A*
- ID_OUI_FROM_DATABASE=IOI Technology Corporation
+OUI:7845C4*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:000273*
- ID_OUI_FROM_DATABASE=Coriolis Networks
+OUI:B4E1C4*
+ ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
 
-OUI:00026E*
- ID_OUI_FROM_DATABASE=NeGeN Access, Inc.
+OUI:D86C02*
+ ID_OUI_FROM_DATABASE=Huaqin Telecom Technology Co.,Ltd
 
-OUI:000263*
- ID_OUI_FROM_DATABASE=UPS Manufacturing SRL
+OUI:0019D2*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00025C*
- ID_OUI_FROM_DATABASE=SCI Systems (Kunshan) Co., Ltd.
+OUI:7C5CF8*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:000253*
- ID_OUI_FROM_DATABASE=Televideo, Inc.
+OUI:001E67*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00024C*
- ID_OUI_FROM_DATABASE=SiByte, Inc.
+OUI:001F3C*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00024E*
- ID_OUI_FROM_DATABASE=Datacard Group
+OUI:0022FA*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00012F*
- ID_OUI_FROM_DATABASE=Twinhead International Corp
+OUI:001517*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00023C*
- ID_OUI_FROM_DATABASE=Creative Technology, Ltd.
+OUI:00166F*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:000240*
- ID_OUI_FROM_DATABASE=Seedek Co., Ltd.
+OUI:A44E31*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:000247*
- ID_OUI_FROM_DATABASE=Great Dragon Information Technology (Group) Co., Ltd.
+OUI:6C8814*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:000243*
- ID_OUI_FROM_DATABASE=Raysis Co., Ltd.
+OUI:F81654*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:000239*
- ID_OUI_FROM_DATABASE=Visicom
+OUI:3413E8*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:000236*
- ID_OUI_FROM_DATABASE=INIT GmbH
+OUI:34E6AD*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:000231*
- ID_OUI_FROM_DATABASE=Ingersoll-Rand
+OUI:FCF8AE*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00022A*
- ID_OUI_FROM_DATABASE=Asound Electronic
+OUI:648099*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00022D*
- ID_OUI_FROM_DATABASE=Agere Systems
+OUI:002314*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:000219*
- ID_OUI_FROM_DATABASE=Paralon Technologies
+OUI:4025C2*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:000186*
- ID_OUI_FROM_DATABASE=Uwe Disch
+OUI:8CA982*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00017B*
- ID_OUI_FROM_DATABASE=Heidelberger Druckmaschinen AG
+OUI:D07E35*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:000182*
- ID_OUI_FROM_DATABASE=DICA TECHNOLOGIES AG
+OUI:685D43*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00018E*
- ID_OUI_FROM_DATABASE=Logitec Corporation
+OUI:90E2BA*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00019B*
- ID_OUI_FROM_DATABASE=Kyoto Microcomputer Co., Ltd.
+OUI:0026C7*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:000194*
- ID_OUI_FROM_DATABASE=Capital Equipment Corporation
+OUI:8086F2*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:000197*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:78FF57*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:0001A3*
- ID_OUI_FROM_DATABASE=GENESYS LOGIC, INC.
+OUI:20934D*
+ ID_OUI_FROM_DATABASE=FUJIAN STAR-NET COMMUNICATION CO.,LTD
 
-OUI:00014E*
- ID_OUI_FROM_DATABASE=WIN Enterprises, Inc.
+OUI:00AA00*
+ ID_OUI_FROM_DATABASE=Intel Corporation
 
-OUI:0030AC*
- ID_OUI_FROM_DATABASE=Systeme Lauer GmbH & Co., Ltd.
+OUI:6CF37F*
+ ID_OUI_FROM_DATABASE=Aruba Networks
 
-OUI:00013E*
- ID_OUI_FROM_DATABASE=Ascom Tateco AB
+OUI:605BB4*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:000145*
- ID_OUI_FROM_DATABASE=WINSYSTEMS, INC.
+OUI:9C0E4A*
+ ID_OUI_FROM_DATABASE=Shenzhen Vastking Electronic Co.,Ltd.
 
-OUI:000126*
- ID_OUI_FROM_DATABASE=PAC Labs
+OUI:ACE5F0*
+ ID_OUI_FROM_DATABASE=Doppler Labs
 
-OUI:00011A*
- ID_OUI_FROM_DATABASE=Hoffmann und Burmeister GbR
+OUI:00F28B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00011D*
- ID_OUI_FROM_DATABASE=Centillium Communications
+OUI:5414FD*
+ ID_OUI_FROM_DATABASE=Orbbec 3D Technology International
 
-OUI:000129*
- ID_OUI_FROM_DATABASE=DFI Inc.
+OUI:1C4BD6*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:000107*
- ID_OUI_FROM_DATABASE=Leiser GmbH
+OUI:94DBC9*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:00010E*
- ID_OUI_FROM_DATABASE=Bri-Link Technologies Co., Ltd
+OUI:40E230*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:000116*
- ID_OUI_FROM_DATABASE=Netspect Technologies, Inc.
+OUI:00006E*
+ ID_OUI_FROM_DATABASE=Artisoft Inc.
 
-OUI:000103*
- ID_OUI_FROM_DATABASE=3COM CORPORATION
+OUI:A0F459*
+ ID_OUI_FROM_DATABASE=FN-LINK TECHNOLOGY LIMITED
 
-OUI:00062B*
- ID_OUI_FROM_DATABASE=INTRASERVER TECHNOLOGY
+OUI:0C6AE6*
+ ID_OUI_FROM_DATABASE=Stanley Security Solutions
 
-OUI:0002C1*
- ID_OUI_FROM_DATABASE=Innovative Electronic Designs, Inc.
+OUI:E874E6*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:0002C8*
- ID_OUI_FROM_DATABASE=Technocom Communications Technology (pte) Ltd
+OUI:00247B*
+ ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
 
-OUI:0002A9*
- ID_OUI_FROM_DATABASE=RACOM, s.r.o.
+OUI:689C5E*
+ ID_OUI_FROM_DATABASE=AcSiP Technology Corp.
 
-OUI:0002B8*
- ID_OUI_FROM_DATABASE=WHI KONSULT AB
+OUI:0012CF*
+ ID_OUI_FROM_DATABASE=Accton Technology Corp
 
-OUI:0002AC*
- ID_OUI_FROM_DATABASE=3PAR data
+OUI:0030D3*
+ ID_OUI_FROM_DATABASE=Agilent Technologies, Inc.
 
-OUI:0002B1*
- ID_OUI_FROM_DATABASE=Anritsu, Ltd.
+OUI:38229D*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:00029A*
- ID_OUI_FROM_DATABASE=Storage Apps
+OUI:002233*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:0002A0*
- ID_OUI_FROM_DATABASE=Flatstack Ltd.
+OUI:D4D184*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:000295*
- ID_OUI_FROM_DATABASE=IP.Access Limited
+OUI:34C3D2*
+ ID_OUI_FROM_DATABASE=FN-LINK TECHNOLOGY LIMITED
 
-OUI:000294*
- ID_OUI_FROM_DATABASE=Tokyo Sokushin Co., Ltd.
+OUI:38E3C5*
+ ID_OUI_FROM_DATABASE=Taicang T&W Electronics
 
-OUI:000290*
- ID_OUI_FROM_DATABASE=Woorigisool, Inc.
+OUI:D0E44A*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:000286*
- ID_OUI_FROM_DATABASE=Occam Networks
+OUI:9433DD*
+ ID_OUI_FROM_DATABASE=Taco Inc
 
-OUI:00028B*
- ID_OUI_FROM_DATABASE=VDSL Systems OY
+OUI:948815*
+ ID_OUI_FROM_DATABASE=Infinique Worldwide Inc
 
-OUI:000222*
- ID_OUI_FROM_DATABASE=Chromisys, Inc.
+OUI:3010B3*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:00021D*
- ID_OUI_FROM_DATABASE=Data General Communication Ltd.
+OUI:001802*
+ ID_OUI_FROM_DATABASE=Alpha Networks Inc.
 
-OUI:00020A*
- ID_OUI_FROM_DATABASE=Gefran Spa
+OUI:ECCD6D*
+ ID_OUI_FROM_DATABASE=Allied Telesis, Inc.
 
-OUI:000216*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00225F*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:000206*
- ID_OUI_FROM_DATABASE=Telital R&D Denmark A/S
+OUI:983B16*
+ ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
 
-OUI:000203*
- ID_OUI_FROM_DATABASE=Woonsang Telecom, Inc.
+OUI:402BA1*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:0001F7*
- ID_OUI_FROM_DATABASE=Image Display Systems, Inc.
+OUI:0025E7*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:0001EE*
- ID_OUI_FROM_DATABASE=Comtrol Europe, Ltd.
+OUI:D05162*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:0001E2*
- ID_OUI_FROM_DATABASE=Ando Electric Corporation
+OUI:94CE2C*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:0001F1*
- ID_OUI_FROM_DATABASE=Innovative Concepts, Inc.
+OUI:001A80*
+ ID_OUI_FROM_DATABASE=Sony Corporation
 
-OUI:00B06D*
- ID_OUI_FROM_DATABASE=Jones Futurex Inc.
+OUI:0024BE*
+ ID_OUI_FROM_DATABASE=Sony Corporation
 
-OUI:0030FE*
- ID_OUI_FROM_DATABASE=DSA GmbH
+OUI:001620*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:00305E*
- ID_OUI_FROM_DATABASE=Abelko Innovation
+OUI:0012EE*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:00301E*
- ID_OUI_FROM_DATABASE=3COM EUROPE LTD.
+OUI:20689D*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:00304D*
- ID_OUI_FROM_DATABASE=ESI
+OUI:446D57*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:003046*
- ID_OUI_FROM_DATABASE=Controlled Electronic Manageme
+OUI:44EE02*
+ ID_OUI_FROM_DATABASE=MTI Ltd.
 
-OUI:00307B*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0026B6*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
-OUI:0001D6*
- ID_OUI_FROM_DATABASE=manroland AG
+OUI:B4EEB4*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
-OUI:0001DB*
- ID_OUI_FROM_DATABASE=Freecom Technologies GmbH
+OUI:FCB4E6*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
-OUI:0001DE*
- ID_OUI_FROM_DATABASE=Trango Systems, Inc.
+OUI:F05C19*
+ ID_OUI_FROM_DATABASE=Aruba Networks
 
-OUI:0001CF*
- ID_OUI_FROM_DATABASE=Alpha Data Parallel Systems, Ltd.
+OUI:70AAB2*
+ ID_OUI_FROM_DATABASE=BlackBerry RTS
 
-OUI:0001CB*
- ID_OUI_FROM_DATABASE=EVR
+OUI:0026FF*
+ ID_OUI_FROM_DATABASE=BlackBerry RTS
 
-OUI:0001C4*
- ID_OUI_FROM_DATABASE=NeoWave, Inc.
+OUI:406F2A*
+ ID_OUI_FROM_DATABASE=BlackBerry RTS
 
-OUI:0001C0*
- ID_OUI_FROM_DATABASE=CompuLab, Ltd.
+OUI:002557*
+ ID_OUI_FROM_DATABASE=BlackBerry RTS
 
-OUI:0001B9*
- ID_OUI_FROM_DATABASE=SKF Condition Monitoring
+OUI:0024FE*
+ ID_OUI_FROM_DATABASE=AVM GmbH
 
-OUI:0001B5*
- ID_OUI_FROM_DATABASE=Turin Networks, Inc.
+OUI:745AAA*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00017F*
- ID_OUI_FROM_DATABASE=Experience Music Project
+OUI:7C1CF1*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00016C*
- ID_OUI_FROM_DATABASE=FOXCONN
+OUI:00264D*
+ ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
 
-OUI:000173*
- ID_OUI_FROM_DATABASE=AMCC
+OUI:74A528*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00015C*
- ID_OUI_FROM_DATABASE=CADANT INC.
+OUI:30A220*
+ ID_OUI_FROM_DATABASE=ARG Telecom
 
-OUI:000163*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:783E53*
+ ID_OUI_FROM_DATABASE=BSkyB Ltd
 
-OUI:00010A*
- ID_OUI_FROM_DATABASE=CIS TECHNOLOGY INC.
+OUI:4CF2BF*
+ ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
 
-OUI:00016F*
- ID_OUI_FROM_DATABASE=Inkel Corp.
+OUI:70D931*
+ ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
 
-OUI:000155*
- ID_OUI_FROM_DATABASE=Promise Technology, Inc.
+OUI:00E063*
+ ID_OUI_FROM_DATABASE=Cabletron Systems, Inc.
 
-OUI:000151*
- ID_OUI_FROM_DATABASE=Ensemble Communications
+OUI:E01D3B*
+ ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
 
-OUI:000142*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D476EA*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:000132*
- ID_OUI_FROM_DATABASE=Dranetz - BMI
+OUI:0040FB*
+ ID_OUI_FROM_DATABASE=CASCADE COMMUNICATIONS
 
-OUI:00D07D*
- ID_OUI_FROM_DATABASE=COSINE COMMUNICATIONS
+OUI:F05A09*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D0CA*
- ID_OUI_FROM_DATABASE=Intrinsyc Software International Inc.
+OUI:503275*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D058*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:28CC01*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D067*
- ID_OUI_FROM_DATABASE=CAMPIO COMMUNICATIONS
+OUI:B46293*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D023*
- ID_OUI_FROM_DATABASE=INFORTREND TECHNOLOGY, INC.
+OUI:04FE31*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D02A*
- ID_OUI_FROM_DATABASE=Voxent Systems Ltd.
+OUI:845181*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D068*
- ID_OUI_FROM_DATABASE=IWILL CORPORATION
+OUI:D831CF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D09D*
- ID_OUI_FROM_DATABASE=VERIS INDUSTRIES
+OUI:F8D0BD*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D09A*
- ID_OUI_FROM_DATABASE=FILANET CORPORATION
+OUI:FCC734*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D00A*
- ID_OUI_FROM_DATABASE=LANACCESS TELECOM S.A.
+OUI:E4B021*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D04A*
- ID_OUI_FROM_DATABASE=PRESENCE TECHNOLOGY GMBH
+OUI:B0EC71*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D0C3*
- ID_OUI_FROM_DATABASE=VIVID TECHNOLOGY PTE, LTD.
+OUI:3CBBFD*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D0F8*
- ID_OUI_FROM_DATABASE=FUJIAN STAR TERMINAL
+OUI:2CAE2B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D096*
- ID_OUI_FROM_DATABASE=3COM EUROPE LTD.
+OUI:C488E5*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D003*
- ID_OUI_FROM_DATABASE=COMDA ENTERPRISES CORP.
+OUI:7C9122*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D029*
- ID_OUI_FROM_DATABASE=WAKEFERN FOOD CORPORATION
+OUI:E8B4C8*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D0F5*
- ID_OUI_FROM_DATABASE=ORANGE MICRO, INC.
+OUI:18895B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D0F7*
- ID_OUI_FROM_DATABASE=NEXT NETS CORPORATION
+OUI:E0DB10*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D078*
- ID_OUI_FROM_DATABASE=Eltex of Sweden AB
+OUI:E09971*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D0AF*
- ID_OUI_FROM_DATABASE=CUTLER-HAMMER, INC.
+OUI:6077E2*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D026*
- ID_OUI_FROM_DATABASE=HIRSCHMANN AUSTRIA GMBH
+OUI:680571*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D010*
- ID_OUI_FROM_DATABASE=CONVERGENT NETWORKS, INC.
+OUI:6C2F2C*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D074*
- ID_OUI_FROM_DATABASE=TAQUA SYSTEMS, INC.
+OUI:000136*
+ ID_OUI_FROM_DATABASE=CyberTAN Technology Inc.
 
-OUI:00D0D5*
- ID_OUI_FROM_DATABASE=GRUNDIG AG
+OUI:F88E85*
+ ID_OUI_FROM_DATABASE=Comtrend Corporation
 
-OUI:00D034*
- ID_OUI_FROM_DATABASE=ORMEC SYSTEMS CORP.
+OUI:300D43*
+ ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
 
-OUI:00D08C*
- ID_OUI_FROM_DATABASE=GENOA TECHNOLOGY, INC.
+OUI:6C2779*
+ ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
 
-OUI:00D059*
- ID_OUI_FROM_DATABASE=AMBIT MICROSYSTEMS CORP.
+OUI:607EDD*
+ ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
 
-OUI:005020*
- ID_OUI_FROM_DATABASE=MEDIASTAR CO., LTD.
+OUI:F88096*
+ ID_OUI_FROM_DATABASE=Elsys Equipamentos Eletrônicos Ltda
 
-OUI:00503E*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:E0B9E5*
+ ID_OUI_FROM_DATABASE=Technicolor
 
-OUI:00D02B*
- ID_OUI_FROM_DATABASE=JETCELL, INC.
+OUI:0CBF15*
+ ID_OUI_FROM_DATABASE=Genetec Inc.
 
-OUI:005017*
- ID_OUI_FROM_DATABASE=RSR S.R.L.
+OUI:000B5D*
+ ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
-OUI:00D0CC*
- ID_OUI_FROM_DATABASE=TECHNOLOGIES LYRE INC.
+OUI:F4CAE5*
+ ID_OUI_FROM_DATABASE=FREEBOX SAS
 
-OUI:00506D*
- ID_OUI_FROM_DATABASE=VIDEOJET SYSTEMS
+OUI:002100*
+ ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
 
-OUI:005077*
- ID_OUI_FROM_DATABASE=PROLIFIC TECHNOLOGY, INC.
+OUI:002147*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:0050D4*
- ID_OUI_FROM_DATABASE=JOOHONG INFORMATION &
+OUI:0022AA*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:00505E*
- ID_OUI_FROM_DATABASE=DIGITEK MICROLOGIC S.A.
+OUI:0022D7*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:0050E7*
- ID_OUI_FROM_DATABASE=PARADISE INNOVATIONS (ASIA)
+OUI:002331*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:0050B9*
- ID_OUI_FROM_DATABASE=XITRON TECHNOLOGIES, INC.
+OUI:00241E*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:00D049*
- ID_OUI_FROM_DATABASE=IMPRESSTEK CO., LTD.
+OUI:78A2A0*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:00D04D*
- ID_OUI_FROM_DATABASE=DIV OF RESEARCH & STATISTICS
+OUI:001B7A*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:00D035*
- ID_OUI_FROM_DATABASE=BEHAVIOR TECH. COMPUTER CORP.
+OUI:40F407*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:00D02D*
- ID_OUI_FROM_DATABASE=ADEMCO
+OUI:B8AE6E*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:00D07C*
- ID_OUI_FROM_DATABASE=KOYO ELECTRONICS INC. CO.,LTD.
+OUI:60A8FE*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:00D05B*
- ID_OUI_FROM_DATABASE=ACROLOOP MOTION CONTROL
+OUI:546751*
+ ID_OUI_FROM_DATABASE=Compal Broadband Networks, Inc.
 
-OUI:00D0C6*
- ID_OUI_FROM_DATABASE=THOMAS & BETTS CORP.
+OUI:84BA3B*
+ ID_OUI_FROM_DATABASE=CANON INC.
 
-OUI:00D02E*
- ID_OUI_FROM_DATABASE=COMMUNICATION AUTOMATION CORP.
+OUI:0018C5*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00D0DA*
- ID_OUI_FROM_DATABASE=TAICOM DATA SYSTEMS CO., LTD.
+OUI:80501B*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:00D0E8*
- ID_OUI_FROM_DATABASE=MAC SYSTEM CO., LTD.
+OUI:347E39*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00D03C*
- ID_OUI_FROM_DATABASE=Vieo, Inc.
+OUI:A87E33*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00D09F*
- ID_OUI_FROM_DATABASE=NOVTEK TEST SYSTEMS
+OUI:00247D*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00D07E*
- ID_OUI_FROM_DATABASE=KEYCORP LTD.
+OUI:001BAF*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00D0EA*
- ID_OUI_FROM_DATABASE=NEXTONE COMMUNICATIONS, INC.
+OUI:001C35*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00D020*
- ID_OUI_FROM_DATABASE=AIM SYSTEM, INC.
+OUI:001CD4*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00D064*
- ID_OUI_FROM_DATABASE=MULTITEL
+OUI:001979*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00D072*
- ID_OUI_FROM_DATABASE=BROADLOGIC
+OUI:9C1874*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00309B*
- ID_OUI_FROM_DATABASE=Smartware
+OUI:0021FC*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:0030AF*
- ID_OUI_FROM_DATABASE=Honeywell GmbH
+OUI:001F5D*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:003074*
- ID_OUI_FROM_DATABASE=EQUIINET LTD.
+OUI:0025CF*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:003090*
- ID_OUI_FROM_DATABASE=CYRA TECHNOLOGIES, INC.
+OUI:0025D0*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:003030*
- ID_OUI_FROM_DATABASE=HARMONIX CORPORATION
+OUI:001FDE*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00307C*
- ID_OUI_FROM_DATABASE=ADID SA
+OUI:907282*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:003063*
- ID_OUI_FROM_DATABASE=SANTERA SYSTEMS, INC.
+OUI:006CFD*
+ ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
 
-OUI:00309F*
- ID_OUI_FROM_DATABASE=AMBER NETWORKS
+OUI:1C234F*
+ ID_OUI_FROM_DATABASE=EDMI  Europe Ltd
 
-OUI:0030A8*
- ID_OUI_FROM_DATABASE=OL'E COMMUNICATIONS, INC.
+OUI:A444D1*
+ ID_OUI_FROM_DATABASE=Wingtech Group (HongKong)Limited
 
-OUI:00304C*
- ID_OUI_FROM_DATABASE=APPIAN COMMUNICATIONS, INC.
+OUI:1C9E46*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0030EF*
- ID_OUI_FROM_DATABASE=NEON TECHNOLOGY, INC.
+OUI:005058*
+ ID_OUI_FROM_DATABASE=Sangoma Technologies
 
-OUI:00306F*
- ID_OUI_FROM_DATABASE=SEYEON TECH. CO., LTD.
+OUI:3482DE*
+ ID_OUI_FROM_DATABASE=Kiio Inc
 
-OUI:003031*
- ID_OUI_FROM_DATABASE=LIGHTWAVE COMMUNICATIONS, INC.
+OUI:0008F6*
+ ID_OUI_FROM_DATABASE=Sumitomo Electric Industries,Ltd
 
-OUI:003035*
- ID_OUI_FROM_DATABASE=Corning Incorporated
+OUI:00005F*
+ ID_OUI_FROM_DATABASE=Sumitomo Electric Industries,Ltd
 
-OUI:00302B*
- ID_OUI_FROM_DATABASE=INALP NETWORKS, INC.
+OUI:A0C589*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00305F*
- ID_OUI_FROM_DATABASE=Hasselblad
+OUI:74BFB7*
+ ID_OUI_FROM_DATABASE=Nusoft Corporation
 
-OUI:00302D*
- ID_OUI_FROM_DATABASE=QUANTUM BRIDGE COMMUNICATIONS
+OUI:50DA00*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:003025*
- ID_OUI_FROM_DATABASE=CHECKOUT COMPUTER SYSTEMS, LTD
+OUI:9C2A83*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00D01F*
- ID_OUI_FROM_DATABASE=Senetas Security
+OUI:E45D75*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:003012*
- ID_OUI_FROM_DATABASE=DIGITAL ENGINEERING LTD.
+OUI:3CBEE1*
+ ID_OUI_FROM_DATABASE=NIKON CORPORATION
 
-OUI:003077*
- ID_OUI_FROM_DATABASE=ONPREM NETWORKS
+OUI:047E4A*
+ ID_OUI_FROM_DATABASE=moobox CO., Ltd.
 
-OUI:0030D4*
- ID_OUI_FROM_DATABASE=AAE Systems, Inc.
+OUI:E0C767*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00D00F*
- ID_OUI_FROM_DATABASE=SPEECH DESIGN GMBH
+OUI:2C09CB*
+ ID_OUI_FROM_DATABASE=COBS AB
 
-OUI:00D0CF*
- ID_OUI_FROM_DATABASE=MORETON BAY
+OUI:60ACC8*
+ ID_OUI_FROM_DATABASE=KunTeng Inc.
 
-OUI:00D073*
- ID_OUI_FROM_DATABASE=ACN ADVANCED COMMUNICATIONS
+OUI:0404EA*
+ ID_OUI_FROM_DATABASE=Valens Semiconductor Ltd.
 
-OUI:00D030*
- ID_OUI_FROM_DATABASE=Safetran Systems Corp
+OUI:800DD7*
+ ID_OUI_FROM_DATABASE=Latticework, Inc
 
-OUI:00D057*
- ID_OUI_FROM_DATABASE=ULTRAK, INC.
+OUI:402E28*
+ ID_OUI_FROM_DATABASE=MiXTelematics
 
-OUI:00D03B*
- ID_OUI_FROM_DATABASE=VISION PRODUCTS PTY. LTD.
+OUI:18C501*
+ ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
 
-OUI:00D0BF*
- ID_OUI_FROM_DATABASE=PIVOTAL TECHNOLOGIES
+OUI:546D52*
+ ID_OUI_FROM_DATABASE=TOPVIEW OPTRONICS CORP.
 
-OUI:00D050*
- ID_OUI_FROM_DATABASE=ISKRATEL
+OUI:CCB3AB*
+ ID_OUI_FROM_DATABASE=shenzhen Biocare Bio-Medical Equipment Co.,Ltd.
 
-OUI:00D0CB*
- ID_OUI_FROM_DATABASE=DASAN CO., LTD.
+OUI:E4B318*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00D0D3*
+OUI:00C88B*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00D08E*
- ID_OUI_FROM_DATABASE=Grass Valley, A Belden Brand
-
-OUI:00D0A3*
- ID_OUI_FROM_DATABASE=VOCAL DATA, INC.
+OUI:A85EE4*
+ ID_OUI_FROM_DATABASE=12Sided Technology, LLC
 
-OUI:00D0E0*
- ID_OUI_FROM_DATABASE=DOOIN ELECTRONICS CO.
+OUI:000CC1*
+ ID_OUI_FROM_DATABASE=Eaton Corporation
 
-OUI:003054*
- ID_OUI_FROM_DATABASE=CASTLENET TECHNOLOGY, INC.
+OUI:0090F9*
+ ID_OUI_FROM_DATABASE=Imagine Communications
 
-OUI:003039*
- ID_OUI_FROM_DATABASE=SOFTBOOK PRESS
+OUI:04C103*
+ ID_OUI_FROM_DATABASE=Clover Network, Inc.
 
-OUI:003017*
- ID_OUI_FROM_DATABASE=BlueArc UK Ltd
+OUI:1C553A*
+ ID_OUI_FROM_DATABASE=QianGua Corp.
 
-OUI:003076*
- ID_OUI_FROM_DATABASE=Akamba Corporation
+OUI:E4A7A0*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00305D*
- ID_OUI_FROM_DATABASE=DIGITRA SYSTEMS, INC.
+OUI:E4FAED*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0030F7*
- ID_OUI_FROM_DATABASE=RAMIX INC.
+OUI:789682*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:003033*
- ID_OUI_FROM_DATABASE=ORIENT TELECOM CO., LTD.
+OUI:F02745*
+ ID_OUI_FROM_DATABASE=F-Secure Corporation
 
-OUI:003083*
- ID_OUI_FROM_DATABASE=Ivron Systems
+OUI:54D0B4*
+ ID_OUI_FROM_DATABASE=Xiamen Four-Faith Communication Technology Co.,Ltd
 
-OUI:003007*
- ID_OUI_FROM_DATABASE=OPTI, INC.
+OUI:D017C2*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:0030DD*
- ID_OUI_FROM_DATABASE=INDIGITA CORPORATION
+OUI:001625*
+ ID_OUI_FROM_DATABASE=Impinj, Inc.
 
-OUI:0030F2*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:60EE5C*
+ ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
 
-OUI:003020*
- ID_OUI_FROM_DATABASE=TSI, Inc..
+OUI:58D67A*
+ ID_OUI_FROM_DATABASE=TCPlink
 
-OUI:003089*
- ID_OUI_FROM_DATABASE=Spectrapoint Wireless, LLC
+OUI:00A0DE*
+ ID_OUI_FROM_DATABASE=YAMAHA CORPORATION
 
-OUI:003022*
- ID_OUI_FROM_DATABASE=Fong Kai Industrial Co., Ltd.
+OUI:081F71*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:0030F8*
- ID_OUI_FROM_DATABASE=Dynapro Systems, Inc.
+OUI:2C2D48*
+ ID_OUI_FROM_DATABASE=bct electronic GesmbH
 
-OUI:0030C2*
- ID_OUI_FROM_DATABASE=COMONE
+OUI:E4A471*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:003056*
- ID_OUI_FROM_DATABASE=Beck IPC GmbH
+OUI:00A0F4*
+ ID_OUI_FROM_DATABASE=GE
 
-OUI:0030D2*
- ID_OUI_FROM_DATABASE=WIN TECHNOLOGIES, CO., LTD.
+OUI:00CAE5*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:003050*
- ID_OUI_FROM_DATABASE=Versa Technology
+OUI:4883C7*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:0030B8*
- ID_OUI_FROM_DATABASE=RiverDelta Networks
+OUI:7050AF*
+ ID_OUI_FROM_DATABASE=BSkyB Ltd
 
-OUI:00904D*
- ID_OUI_FROM_DATABASE=SPEC S.A.
+OUI:F4EF9E*
+ ID_OUI_FROM_DATABASE=SGSG SCIENCE & TECHNOLOGY CO. LTD
 
-OUI:009079*
- ID_OUI_FROM_DATABASE=ClearOne, Inc.
+OUI:DC9C9F*
+ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
 
-OUI:00908F*
- ID_OUI_FROM_DATABASE=AUDIO CODES LTD.
+OUI:0CBF3F*
+ ID_OUI_FROM_DATABASE=Shenzhen Lencotion Technology Co.,Ltd
 
-OUI:0090D5*
- ID_OUI_FROM_DATABASE=EUPHONIX, INC.
+OUI:84FEDC*
+ ID_OUI_FROM_DATABASE=Borqs Beijing Ltd.
 
-OUI:0090A7*
- ID_OUI_FROM_DATABASE=CLIENTEC CORPORATION
+OUI:D8D723*
+ ID_OUI_FROM_DATABASE=IDS, Inc
 
-OUI:00907F*
- ID_OUI_FROM_DATABASE=WatchGuard Technologies, Inc.
+OUI:703A0E*
+ ID_OUI_FROM_DATABASE=Aruba Networks
 
-OUI:00907E*
- ID_OUI_FROM_DATABASE=VETRONIX CORP.
+OUI:7054D2*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
-OUI:00902F*
- ID_OUI_FROM_DATABASE=NETCORE SYSTEMS, INC.
+OUI:7C0507*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
-OUI:00900D*
- ID_OUI_FROM_DATABASE=Overland Storage Inc.
+OUI:C07CD1*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
-OUI:009044*
- ID_OUI_FROM_DATABASE=ASSURED DIGITAL, INC.
+OUI:94DBDA*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:009078*
- ID_OUI_FROM_DATABASE=MER TELEMANAGEMENT SOLUTIONS, LTD.
+OUI:384C4F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:009009*
- ID_OUI_FROM_DATABASE=I Controls, Inc.
+OUI:E4A8B6*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:009015*
- ID_OUI_FROM_DATABASE=CENTIGRAM COMMUNICATIONS CORP.
+OUI:244C07*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0090F3*
- ID_OUI_FROM_DATABASE=ASPECT COMMUNICATIONS
+OUI:E840F2*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
-OUI:0090A8*
- ID_OUI_FROM_DATABASE=NineTiles Networks, Ltd.
+OUI:F0D1B8*
+ ID_OUI_FROM_DATABASE=LEDVANCE
 
-OUI:00507A*
- ID_OUI_FROM_DATABASE=XPEED, INC.
+OUI:60B387*
+ ID_OUI_FROM_DATABASE=Synergics Technologies GmbH
 
-OUI:005002*
- ID_OUI_FROM_DATABASE=OMNISEC AG
+OUI:7085C2*
+ ID_OUI_FROM_DATABASE=ASRock Incorporation
 
-OUI:00508D*
- ID_OUI_FROM_DATABASE=ABIT COMPUTER CORPORATION
+OUI:C825E1*
+ ID_OUI_FROM_DATABASE=Lemobile Information Technology (Beijing) Co., Ltd
 
-OUI:0050CD*
- ID_OUI_FROM_DATABASE=DIGIANSWER A/S
+OUI:0022B1*
+ ID_OUI_FROM_DATABASE=Elbit Systems Ltd.
 
-OUI:0050C5*
- ID_OUI_FROM_DATABASE=ADS Technologies, Inc
+OUI:0000B4*
+ ID_OUI_FROM_DATABASE=Edimax Technology Co. Ltd.
 
-OUI:00502F*
- ID_OUI_FROM_DATABASE=TollBridge Technologies, Inc.
+OUI:00065F*
+ ID_OUI_FROM_DATABASE=ECI Telecom Ltd.
 
-OUI:005028*
- ID_OUI_FROM_DATABASE=AVAL COMMUNICATIONS
+OUI:001F45*
+ ID_OUI_FROM_DATABASE=Enterasys
 
-OUI:00505B*
- ID_OUI_FROM_DATABASE=KAWASAKI LSI U.S.A., INC.
+OUI:0090FA*
+ ID_OUI_FROM_DATABASE=Emulex Corporation
 
-OUI:0050F8*
- ID_OUI_FROM_DATABASE=ENTREGA TECHNOLOGIES, INC.
+OUI:50C971*
+ ID_OUI_FROM_DATABASE=GN Netcom A/S
 
-OUI:00506F*
- ID_OUI_FROM_DATABASE=G-CONNECT
+OUI:001D82*
+ ID_OUI_FROM_DATABASE=GN Netcom A/S
 
-OUI:0050CC*
- ID_OUI_FROM_DATABASE=XYRATEX
+OUI:001317*
+ ID_OUI_FROM_DATABASE=GN Netcom A/S
 
-OUI:0050D5*
- ID_OUI_FROM_DATABASE=AD SYSTEMS CORP.
+OUI:749781*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:0050AA*
- ID_OUI_FROM_DATABASE=KONICA MINOLTA HOLDINGS, INC.
+OUI:B4B15A*
+ ID_OUI_FROM_DATABASE=Siemens AG Energy Management Division
 
-OUI:00509C*
- ID_OUI_FROM_DATABASE=BETA RESEARCH
+OUI:A8D828*
+ ID_OUI_FROM_DATABASE=Ascensia Diabetes Care
 
-OUI:005027*
- ID_OUI_FROM_DATABASE=GENICOM CORPORATION
+OUI:FCBC9C*
+ ID_OUI_FROM_DATABASE=Vimar Spa
 
-OUI:005010*
- ID_OUI_FROM_DATABASE=NovaNET Learning, Inc.
+OUI:149ECF*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00509E*
- ID_OUI_FROM_DATABASE=Les Technologies SoftAcoustik Inc.
+OUI:AC620D*
+ ID_OUI_FROM_DATABASE=Jabil Circuit(Wuxi) Co.,Ltd
 
-OUI:00505F*
- ID_OUI_FROM_DATABASE=BRAND INNOVATORS
+OUI:008CFA*
+ ID_OUI_FROM_DATABASE=INVENTEC Corporation
 
-OUI:005095*
- ID_OUI_FROM_DATABASE=PERACOM NETWORKS
+OUI:0008B9*
+ ID_OUI_FROM_DATABASE=Kaonmedia CO., LTD.
 
-OUI:005026*
- ID_OUI_FROM_DATABASE=COSYSTEMS, INC.
+OUI:C83F26*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
 
-OUI:0050EF*
- ID_OUI_FROM_DATABASE=SPE Systemhaus GmbH
+OUI:00E0E6*
+ ID_OUI_FROM_DATABASE=INCAA Computers
 
-OUI:005093*
- ID_OUI_FROM_DATABASE=BOEING
+OUI:5C5EAB*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:0050D8*
- ID_OUI_FROM_DATABASE=UNICORN COMPUTER CORP.
+OUI:7819F7*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:009034*
- ID_OUI_FROM_DATABASE=IMAGIC, INC.
+OUI:2C2172*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:009073*
- ID_OUI_FROM_DATABASE=GAIO TECHNOLOGY
+OUI:88E0F3*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:0090C9*
- ID_OUI_FROM_DATABASE=DPAC Technologies
+OUI:4C9614*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:0090E7*
- ID_OUI_FROM_DATABASE=HORSCH ELEKTRONIK AG
+OUI:3C8AB0*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:009001*
- ID_OUI_FROM_DATABASE=NISHIMU ELECTRONICS INDUSTRIES CO., LTD.
+OUI:B0C69A*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:0090FB*
- ID_OUI_FROM_DATABASE=PORTWELL, INC.
+OUI:009069*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:009070*
- ID_OUI_FROM_DATABASE=NEO NETWORKS, INC.
+OUI:204E71*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:0090EF*
- ID_OUI_FROM_DATABASE=INTEGRIX, INC.
+OUI:F4B52F*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:0090B0*
- ID_OUI_FROM_DATABASE=VADEM
+OUI:88A25E*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:0090D1*
- ID_OUI_FROM_DATABASE=LEICHU ENTERPRISE CO., LTD.
+OUI:001BC0*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:0050D7*
- ID_OUI_FROM_DATABASE=TELSTRAT
+OUI:F49EEF*
+ ID_OUI_FROM_DATABASE=Taicang T&W Electronics
 
-OUI:0050F1*
- ID_OUI_FROM_DATABASE=Intel Corporation
+OUI:F4911E*
+ ID_OUI_FROM_DATABASE=ZHUHAI EWPE INFORMATION TECHNOLOGY INC
 
-OUI:00501B*
- ID_OUI_FROM_DATABASE=ABL CANADA, INC.
+OUI:94FE22*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:005036*
- ID_OUI_FROM_DATABASE=NETCAM, LTD.
+OUI:F823B2*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0050C9*
- ID_OUI_FROM_DATABASE=MASPRO DENKOH CORP.
+OUI:DCD916*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:005009*
- ID_OUI_FROM_DATABASE=PHILIPS BROADBAND NETWORKS
+OUI:002552*
+ ID_OUI_FROM_DATABASE=VXi Corporation
 
-OUI:0050C4*
- ID_OUI_FROM_DATABASE=IMD
+OUI:006CBC*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0050A3*
- ID_OUI_FROM_DATABASE=TransMedia Communications, Inc.
+OUI:DC3752*
+ ID_OUI_FROM_DATABASE=GE
 
-OUI:005099*
- ID_OUI_FROM_DATABASE=3COM EUROPE, LTD.
+OUI:B4D5BD*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:0050A4*
- ID_OUI_FROM_DATABASE=IO TECH, INC.
+OUI:7CB0C2*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:0050B3*
- ID_OUI_FROM_DATABASE=VOICEBOARD CORPORATION
+OUI:98AA3C*
+ ID_OUI_FROM_DATABASE=Will i-tech Co., Ltd.
 
-OUI:0050B7*
- ID_OUI_FROM_DATABASE=BOSER TECHNOLOGY CO., LTD.
+OUI:449F7F*
+ ID_OUI_FROM_DATABASE=DataCore Software Corporation
 
-OUI:00908D*
- ID_OUI_FROM_DATABASE=VICKERS ELECTRONICS SYSTEMS
+OUI:0011FC*
+ ID_OUI_FROM_DATABASE=HARTING Electronics GmbH
 
-OUI:009042*
- ID_OUI_FROM_DATABASE=ECCS, Inc.
+OUI:5CDD70*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:009051*
- ID_OUI_FROM_DATABASE=ULTIMATE TECHNOLOGY CORP.
+OUI:24BF74*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:0090FF*
- ID_OUI_FROM_DATABASE=TELLUS TECHNOLOGY INC.
+OUI:B8E779*
+ ID_OUI_FROM_DATABASE=9Solutions Oy
 
-OUI:009018*
- ID_OUI_FROM_DATABASE=ITO ELECTRIC INDUSTRY CO, LTD.
+OUI:240A11*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:009002*
- ID_OUI_FROM_DATABASE=ALLGON AB
+OUI:C84544*
+ ID_OUI_FROM_DATABASE=Asia Pacific CIS (Wuxi) Co, Ltd
 
-OUI:009016*
- ID_OUI_FROM_DATABASE=ZAC
+OUI:E8A7F2*
+ ID_OUI_FROM_DATABASE=sTraffic
 
-OUI:009005*
- ID_OUI_FROM_DATABASE=PROTECH SYSTEMS CO., LTD.
+OUI:D8209F*
+ ID_OUI_FROM_DATABASE=Cubro Acronet GesmbH
 
-OUI:00901E*
- ID_OUI_FROM_DATABASE=Selesta Ingegneria S.p.A.
+OUI:A860B6*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:009090*
- ID_OUI_FROM_DATABASE=I-BUS
+OUI:24F094*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0090AA*
- ID_OUI_FROM_DATABASE=INDIGO ACTIVE VISION SYSTEMS LIMITED
+OUI:90B0ED*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00903A*
- ID_OUI_FROM_DATABASE=NIHON MEDIA TOOL INC.
+OUI:C4B301*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:009055*
- ID_OUI_FROM_DATABASE=PARKER HANNIFIN CORPORATION COMPUMOTOR DIVISION
+OUI:E05F45*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00909F*
- ID_OUI_FROM_DATABASE=DIGI-DATA CORPORATION
+OUI:483B38*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0090E4*
- ID_OUI_FROM_DATABASE=NEC AMERICA, INC.
+OUI:E47B3F*
+ ID_OUI_FROM_DATABASE=BEIJING CO-CLOUD TECHNOLOGY LTD.
 
-OUI:009013*
- ID_OUI_FROM_DATABASE=SAMSAN CORP.
+OUI:A0415E*
+ ID_OUI_FROM_DATABASE=Opsens Solution Inc.
 
-OUI:009004*
- ID_OUI_FROM_DATABASE=3COM EUROPE LTD.
+OUI:1C6E76*
+ ID_OUI_FROM_DATABASE=Quarion Technology Inc
 
-OUI:0090E1*
- ID_OUI_FROM_DATABASE=TELENA S.P.A.
+OUI:000AAB*
+ ID_OUI_FROM_DATABASE=Toyota Technical Development Corporation
 
-OUI:00504A*
- ID_OUI_FROM_DATABASE=ELTECO A.S.
+OUI:44D1FA*
+ ID_OUI_FROM_DATABASE=Shenzhen Yunlink Technology Co., Ltd
 
-OUI:00504C*
- ID_OUI_FROM_DATABASE=Galil Motion Control
+OUI:08C021*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:005021*
- ID_OUI_FROM_DATABASE=EIS INTERNATIONAL, INC.
+OUI:48435A*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00506E*
- ID_OUI_FROM_DATABASE=CORDER ENGINEERING CORPORATION
+OUI:9CE374*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00507E*
- ID_OUI_FROM_DATABASE=NEWER TECHNOLOGY
+OUI:6C0EE6*
+ ID_OUI_FROM_DATABASE=Chengdu Xiyida Electronic Technology Co,.Ltd
 
-OUI:0050E6*
- ID_OUI_FROM_DATABASE=HAKUSAN CORPORATION
+OUI:78FFCA*
+ ID_OUI_FROM_DATABASE=TECNO MOBILE LIMITED
 
-OUI:0050AE*
- ID_OUI_FROM_DATABASE=FDK Co., Ltd
+OUI:F03EBF*
+ ID_OUI_FROM_DATABASE=GOGORO TAIWAN LIMITED
 
-OUI:00109D*
- ID_OUI_FROM_DATABASE=CLARINET SYSTEMS, INC.
+OUI:50AB3E*
+ ID_OUI_FROM_DATABASE=Qibixx AG
 
-OUI:0010D2*
- ID_OUI_FROM_DATABASE=NITTO TSUSHINKI CO., LTD
+OUI:A8BB50*
+ ID_OUI_FROM_DATABASE=WiZ IoT Company Limited
 
-OUI:001045*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:005F86*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00106B*
- ID_OUI_FROM_DATABASE=SONUS NETWORKS, INC.
+OUI:E46251*
+ ID_OUI_FROM_DATABASE=HAO CHENG GROUP LIMITED
 
-OUI:0010EC*
- ID_OUI_FROM_DATABASE=RPCG, LLC
+OUI:8850DD*
+ ID_OUI_FROM_DATABASE=Infiniband Trade Association
 
-OUI:001092*
- ID_OUI_FROM_DATABASE=NETCORE INC.
+OUI:DC7834*
+ ID_OUI_FROM_DATABASE=LOGICOM SA
 
-OUI:0010E2*
- ID_OUI_FROM_DATABASE=ArrayComm, Inc.
+OUI:54F201*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001071*
- ID_OUI_FROM_DATABASE=ADVANET INC.
+OUI:A06090*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001069*
- ID_OUI_FROM_DATABASE=HELIOSS COMMUNICATIONS, INC.
+OUI:3876CA*
+ ID_OUI_FROM_DATABASE=Shenzhen Smart Intelligent Technology Co.Ltd
 
-OUI:0010FD*
- ID_OUI_FROM_DATABASE=COCOM A/S
+OUI:D0577B*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:0010AC*
- ID_OUI_FROM_DATABASE=IMCI TECHNOLOGIES
+OUI:B824F0*
+ ID_OUI_FROM_DATABASE=SOYO Technology Development Co., Ltd.
 
-OUI:0010EF*
- ID_OUI_FROM_DATABASE=DBTEL INCORPORATED
+OUI:B456B9*
+ ID_OUI_FROM_DATABASE=Teraspek Technologies Co.,Ltd
 
-OUI:001017*
- ID_OUI_FROM_DATABASE=Bosch Access Systems GmbH
+OUI:68B35E*
+ ID_OUI_FROM_DATABASE=Shenzhen Neostra Technology Co.Ltd
 
-OUI:001024*
- ID_OUI_FROM_DATABASE=NAGOYA ELECTRIC WORKS CO., LTD
+OUI:24E271*
+ ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
 
-OUI:0010DD*
- ID_OUI_FROM_DATABASE=ENABLE SEMICONDUCTOR, INC.
+OUI:BC6010*
+ ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
 
-OUI:0010C9*
- ID_OUI_FROM_DATABASE=MITSUBISHI ELECTRONICS LOGISTIC SUPPORT CO.
+OUI:AC3743*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:001085*
- ID_OUI_FROM_DATABASE=POLARIS COMMUNICATIONS, INC.
+OUI:603197*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:001044*
- ID_OUI_FROM_DATABASE=InnoLabs Corporation
+OUI:0019CB*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:001056*
- ID_OUI_FROM_DATABASE=SODICK CO., LTD.
+OUI:FCF528*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:001099*
- ID_OUI_FROM_DATABASE=InnoMedia, Inc.
+OUI:588BF3*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:001061*
- ID_OUI_FROM_DATABASE=HOSTLINK CORP.
+OUI:D8B02E*
+ ID_OUI_FROM_DATABASE=Guangzhou Zonerich Business Machine Co., LTD.
 
-OUI:001093*
- ID_OUI_FROM_DATABASE=CMS COMPUTERS, LTD.
+OUI:849D64*
+ ID_OUI_FROM_DATABASE=SMC Corporation
 
-OUI:0010CD*
- ID_OUI_FROM_DATABASE=INTERFACE CONCEPT
+OUI:A020A6*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
 
-OUI:0010F3*
- ID_OUI_FROM_DATABASE=Nexcom International Co., Ltd.
+OUI:88F7C7*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:001005*
- ID_OUI_FROM_DATABASE=UEC COMMERCIAL
+OUI:08952A*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:001066*
- ID_OUI_FROM_DATABASE=ADVANCED CONTROL SYSTEMS, INC.
+OUI:C4BB4C*
+ ID_OUI_FROM_DATABASE=Zebra Information Tech Co. Ltd
 
-OUI:0010E4*
- ID_OUI_FROM_DATABASE=NSI CORPORATION
+OUI:8C04FF*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:001062*
- ID_OUI_FROM_DATABASE=NX SERVER, ILNC.
+OUI:001972*
+ ID_OUI_FROM_DATABASE=Plexus (Xiamen) Co.,ltd.
 
-OUI:0010B9*
- ID_OUI_FROM_DATABASE=MAXTOR CORP.
+OUI:6488FF*
+ ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
 
-OUI:00108B*
- ID_OUI_FROM_DATABASE=LASERANIMATION SOLLINGER GMBH
+OUI:005979*
+ ID_OUI_FROM_DATABASE=Networked Energy Services
 
-OUI:00105C*
- ID_OUI_FROM_DATABASE=QUANTUM DESIGNS (H.K.) LTD.
+OUI:000997*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:001042*
- ID_OUI_FROM_DATABASE=Alacritech, Inc.
+OUI:000E62*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:001060*
- ID_OUI_FROM_DATABASE=BILLIONTON SYSTEMS, INC.
+OUI:000EC0*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:0010DE*
- ID_OUI_FROM_DATABASE=INTERNATIONAL DATACASTING CORPORATION
+OUI:000FCD*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:00105D*
- ID_OUI_FROM_DATABASE=Draeger Medical
+OUI:0004DC*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:0010E1*
- ID_OUI_FROM_DATABASE=S.I. TECH, INC.
+OUI:02E6D3*
+ ID_OUI_FROM_DATABASE=NIXDORF COMPUTER CORP.
 
-OUI:001091*
- ID_OUI_FROM_DATABASE=NO WIRES NEEDED BV
+OUI:0016B9*
+ ID_OUI_FROM_DATABASE=ProCurve Networking by HP
 
-OUI:0010F5*
- ID_OUI_FROM_DATABASE=AMHERST SYSTEMS, INC.
+OUI:0024A8*
+ ID_OUI_FROM_DATABASE=ProCurve Networking by HP
 
-OUI:001090*
- ID_OUI_FROM_DATABASE=CIMETRICS, INC.
+OUI:CC3ADF*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:001070*
- ID_OUI_FROM_DATABASE=CARADON TREND LTD.
+OUI:141F78*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0010BA*
- ID_OUI_FROM_DATABASE=MARTINHO-DAVIS SYSTEMS, INC.
+OUI:006F64*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00107C*
- ID_OUI_FROM_DATABASE=P-COM, INC.
+OUI:DC6672*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0010AE*
- ID_OUI_FROM_DATABASE=SHINKO ELECTRIC INDUSTRIES CO.
+OUI:0025C3*
+ ID_OUI_FROM_DATABASE=21168
 
-OUI:001040*
- ID_OUI_FROM_DATABASE=INTERMEC CORPORATION
+OUI:001365*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:0010B0*
- ID_OUI_FROM_DATABASE=MERIDIAN TECHNOLOGY CORP.
+OUI:001ECA*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:001077*
- ID_OUI_FROM_DATABASE=SAF DRIVE SYSTEMS, LTD.
+OUI:001D42*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:0010F4*
- ID_OUI_FROM_DATABASE=Vertical Communications
+OUI:001CEB*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:001065*
- ID_OUI_FROM_DATABASE=RADYNE CORPORATION
+OUI:002363*
+ ID_OUI_FROM_DATABASE=Zhuhai Raysharp Technology Co.,Ltd
 
-OUI:00104A*
- ID_OUI_FROM_DATABASE=The Parvus Corporation
+OUI:D03742*
+ ID_OUI_FROM_DATABASE=Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd
 
-OUI:0010B3*
- ID_OUI_FROM_DATABASE=NOKIA MULTIMEDIA TERMINALS
+OUI:001CFD*
+ ID_OUI_FROM_DATABASE=Universal Electronics, Inc.
 
-OUI:001037*
- ID_OUI_FROM_DATABASE=CYQ've Technology Co., Ltd.
+OUI:080051*
+ ID_OUI_FROM_DATABASE=ExperData
 
-OUI:001051*
- ID_OUI_FROM_DATABASE=CMICRO CORPORATION
+OUI:0080C7*
+ ID_OUI_FROM_DATABASE=XIRCOM
 
-OUI:0010DC*
- ID_OUI_FROM_DATABASE=MICRO-STAR INTERNATIONAL CO., LTD.
+OUI:049FCA*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0010EE*
- ID_OUI_FROM_DATABASE=CTI PRODUCTS, INC.
+OUI:C81FBE*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00101B*
- ID_OUI_FROM_DATABASE=CORNET TECHNOLOGY, INC.
+OUI:203DB2*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001032*
- ID_OUI_FROM_DATABASE=ALTA TECHNOLOGY
+OUI:48D539*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001025*
- ID_OUI_FROM_DATABASE=Grayhill, Inc
+OUI:10E68F*
+ ID_OUI_FROM_DATABASE=KWANGSUNG ELECTRONICS KOREA CO.,LTD.
 
-OUI:001009*
- ID_OUI_FROM_DATABASE=HORO QUARTZ
+OUI:1899F5*
+ ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
 
-OUI:0010F8*
- ID_OUI_FROM_DATABASE=TEXIO TECHNOLOGY CORPORATION
+OUI:E41D2D*
+ ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
 
-OUI:00104D*
- ID_OUI_FROM_DATABASE=SURTEC INDUSTRIES, INC.
+OUI:B80018*
+ ID_OUI_FROM_DATABASE=Htel
 
-OUI:00E0E0*
- ID_OUI_FROM_DATABASE=SI ELECTRONICS, LTD.
+OUI:0081C4*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00E0D1*
- ID_OUI_FROM_DATABASE=TELSIS LIMITED
+OUI:E8FD90*
+ ID_OUI_FROM_DATABASE=Turbostor
 
-OUI:00E005*
- ID_OUI_FROM_DATABASE=TECHNICAL CORP.
+OUI:0017EA*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E072*
- ID_OUI_FROM_DATABASE=LYNK
+OUI:0017E3*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E0C1*
- ID_OUI_FROM_DATABASE=MEMOREX TELEX JAPAN, LTD.
+OUI:001834*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E0AD*
- ID_OUI_FROM_DATABASE=EES TECHNOLOGY, LTD.
+OUI:00182F*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E025*
- ID_OUI_FROM_DATABASE=dit Co., Ltd.
+OUI:78DEE4*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E0B1*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent, Enterprise Business Group
+OUI:B8FFFE*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E0E4*
- ID_OUI_FROM_DATABASE=FANUC ROBOTICS NORTH AMERICA, Inc.
+OUI:E0D7BA*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E031*
- ID_OUI_FROM_DATABASE=HAGIWARA ELECTRIC CO., LTD.
+OUI:405FC2*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E0A5*
- ID_OUI_FROM_DATABASE=ComCore Semiconductor, Inc.
+OUI:8030DC*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E044*
- ID_OUI_FROM_DATABASE=LSICS CORPORATION
+OUI:CC78AB*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E05D*
- ID_OUI_FROM_DATABASE=UNITEC CO., LTD.
+OUI:A4D578*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E0B3*
- ID_OUI_FROM_DATABASE=EtherWAN Systems, Inc.
+OUI:544A16*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E053*
- ID_OUI_FROM_DATABASE=CELLPORT LABS, INC.
+OUI:D8DDFD*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E07D*
- ID_OUI_FROM_DATABASE=NETRONIX, INC.
+OUI:20CD39*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E0ED*
- ID_OUI_FROM_DATABASE=SILICOM, LTD.
+OUI:987BF3*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E0B4*
- ID_OUI_FROM_DATABASE=TECHNO SCOPE CO., LTD.
+OUI:247189*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E0C6*
- ID_OUI_FROM_DATABASE=LINK2IT, L.L.C.
+OUI:EC1127*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E06D*
- ID_OUI_FROM_DATABASE=COMPUWARE CORPORATION
+OUI:F0C77F*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E074*
- ID_OUI_FROM_DATABASE=TIERNAN COMMUNICATIONS, INC.
+OUI:F45EAB*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E059*
- ID_OUI_FROM_DATABASE=CONTROLLED ENVIRONMENTS, LTD.
+OUI:001783*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E006*
- ID_OUI_FROM_DATABASE=SILICON INTEGRATED SYS. CORP.
+OUI:A81B6A*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E0F8*
- ID_OUI_FROM_DATABASE=DICNA CONTROL AB
+OUI:9884E3*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E004*
- ID_OUI_FROM_DATABASE=PMC-SIERRA, INC.
+OUI:38D269*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E0DE*
- ID_OUI_FROM_DATABASE=DATAX NV
+OUI:C8FD19*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E078*
- ID_OUI_FROM_DATABASE=BERKELEY NETWORKS
+OUI:508CB1*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00E041*
- ID_OUI_FROM_DATABASE=CSPI
+OUI:04BBF9*
+ ID_OUI_FROM_DATABASE=Pavilion Data Systems Inc
 
-OUI:00E0E2*
- ID_OUI_FROM_DATABASE=INNOVA CORP.
+OUI:B0F893*
+ ID_OUI_FROM_DATABASE=Shanghai MXCHIP Information Technology Co., Ltd.
 
-OUI:00E009*
- ID_OUI_FROM_DATABASE=MARATHON TECHNOLOGIES CORP.
+OUI:00C017*
+ ID_OUI_FROM_DATABASE=NetScout Systems, Inc.
 
-OUI:00E02F*
- ID_OUI_FROM_DATABASE=MCNS HOLDINGS, L.P.
+OUI:D49B5C*
+ ID_OUI_FROM_DATABASE=Chongqing Miedu Technology Co., Ltd.
 
-OUI:00E04C*
- ID_OUI_FROM_DATABASE=REALTEK SEMICONDUCTOR CORP.
+OUI:C411E0*
+ ID_OUI_FROM_DATABASE=Bull Group Co., Ltd
 
-OUI:00E047*
- ID_OUI_FROM_DATABASE=InFocus Corporation
+OUI:90842B*
+ ID_OUI_FROM_DATABASE=LEGO System A/S
 
-OUI:00E092*
- ID_OUI_FROM_DATABASE=ADMTEK INCORPORATED
+OUI:84C7EA*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:00E0FF*
- ID_OUI_FROM_DATABASE=SECURITY DYNAMICS TECHNOLOGIES, Inc.
+OUI:8C6102*
+ ID_OUI_FROM_DATABASE=Beijing Baofengmojing Technologies Co., Ltd
 
-OUI:08BBCC*
- ID_OUI_FROM_DATABASE=AK-NORD EDV VERTRIEBSGES. mbH
+OUI:FC9114*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:0060B2*
- ID_OUI_FROM_DATABASE=PROCESS CONTROL CORP.
+OUI:1C25E1*
+ ID_OUI_FROM_DATABASE=China Mobile IOT Company Limited
 
-OUI:006004*
- ID_OUI_FROM_DATABASE=COMPUTADORES MODULARES SA
+OUI:C0F636*
+ ID_OUI_FROM_DATABASE=Hangzhou Kuaiyue Technologies, Ltd.
 
-OUI:006000*
- ID_OUI_FROM_DATABASE=XYCOM INC.
+OUI:F0038C*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:00A019*
- ID_OUI_FROM_DATABASE=NEBULA CONSULTANTS, INC.
+OUI:B45D50*
+ ID_OUI_FROM_DATABASE=Aruba Networks
 
-OUI:00A0ED*
- ID_OUI_FROM_DATABASE=Brooks Automation, Inc.
+OUI:001E7D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00A0A9*
- ID_OUI_FROM_DATABASE=NAVTEL COMMUNICATIONS INC.
+OUI:3C6200*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00A0E1*
- ID_OUI_FROM_DATABASE=WESTPORT RESEARCH ASSOCIATES, INC.
+OUI:0024E9*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00A0D6*
- ID_OUI_FROM_DATABASE=SBE, Inc.
+OUI:002399*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00A05E*
- ID_OUI_FROM_DATABASE=MYRIAD LOGIC INC.
+OUI:E4E0C5*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00A078*
- ID_OUI_FROM_DATABASE=Marconi Communications
+OUI:E8039A*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00A00B*
- ID_OUI_FROM_DATABASE=COMPUTEX CO., LTD.
+OUI:C4731E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00A09A*
- ID_OUI_FROM_DATABASE=NIHON KOHDEN AMERICA
+OUI:78D6F0*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
-OUI:00A095*
- ID_OUI_FROM_DATABASE=ACACIA NETWORKS, INC.
+OUI:B407F9*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
-OUI:00A0F2*
- ID_OUI_FROM_DATABASE=INFOTEK COMMUNICATIONS, INC.
+OUI:40B89A*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00A0EF*
- ID_OUI_FROM_DATABASE=LUCIDATA LTD.
+OUI:A8A795*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00A03F*
- ID_OUI_FROM_DATABASE=COMPUTER SOCIETY MICROPROCESSOR & MICROPROCESSOR STANDARDS C
+OUI:8096CA*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00A067*
- ID_OUI_FROM_DATABASE=NETWORK SERVICES GROUP
+OUI:9CD21E*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00A0A7*
- ID_OUI_FROM_DATABASE=VORAX CORPORATION
+OUI:D87988*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00A02D*
- ID_OUI_FROM_DATABASE=1394 Trade Association
+OUI:00242B*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00A0E6*
- ID_OUI_FROM_DATABASE=DIALOGIC CORPORATION
+OUI:00242C*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00A04A*
- ID_OUI_FROM_DATABASE=NISSHIN ELECTRIC CO., LTD.
+OUI:945330*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00A05B*
- ID_OUI_FROM_DATABASE=MARQUIP, INC.
+OUI:EC0EC4*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00A08D*
- ID_OUI_FROM_DATABASE=JACOMO CORPORATION
+OUI:7429AF*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00A06F*
- ID_OUI_FROM_DATABASE=THE APPCON GROUP, INC.
+OUI:346895*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00A08E*
- ID_OUI_FROM_DATABASE=Check Point Software Technologies
+OUI:A86BAD*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00E0AA*
- ID_OUI_FROM_DATABASE=ELECTROSONIC LTD.
+OUI:D80F99*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00E085*
- ID_OUI_FROM_DATABASE=GLOBAL MAINTECH, INC.
+OUI:78DD08*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00E05A*
- ID_OUI_FROM_DATABASE=GALEA NETWORK SECURITY
+OUI:00197E*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00E022*
- ID_OUI_FROM_DATABASE=Analog Devices Inc.
+OUI:A0AB1B*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:00E0E7*
- ID_OUI_FROM_DATABASE=RAYTHEON E-SYSTEMS, INC.
+OUI:5C4979*
+ ID_OUI_FROM_DATABASE=AVM Audiovisuelles Marketing und Computersysteme GmbH
 
-OUI:00E00C*
- ID_OUI_FROM_DATABASE=MOTOROLA
+OUI:086A0A*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
-OUI:00E04A*
- ID_OUI_FROM_DATABASE=ZX Technologies, Inc
+OUI:101250*
+ ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
-OUI:00E00A*
- ID_OUI_FROM_DATABASE=DIBA, INC.
+OUI:8C7712*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E0B9*
- ID_OUI_FROM_DATABASE=BYAS SYSTEMS
+OUI:2013E0*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E054*
- ID_OUI_FROM_DATABASE=KODAI HITEC CO., LTD.
+OUI:0007AB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E0AF*
- ID_OUI_FROM_DATABASE=GENERAL DYNAMICS INFORMATION SYSTEMS
+OUI:0021D2*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00605B*
- ID_OUI_FROM_DATABASE=IntraServer Technology, Inc.
+OUI:BC4760*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00604B*
- ID_OUI_FROM_DATABASE=Safe-com GmbH & Co. KG
+OUI:D0176A*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00A0CD*
- ID_OUI_FROM_DATABASE=DR. JOHANNES HEIDENHAIN GmbH
+OUI:F0D9B2*
+ ID_OUI_FROM_DATABASE=EXO S.A.
 
-OUI:00A0DA*
- ID_OUI_FROM_DATABASE=INTEGRATED SYSTEMS Technology, Inc.
+OUI:2CBABA*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00A03C*
- ID_OUI_FROM_DATABASE=EG&G NUCLEAR INSTRUMENTS
+OUI:24920E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00A038*
- ID_OUI_FROM_DATABASE=EMAIL ELECTRONICS
+OUI:40D3AE*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00A0BE*
- ID_OUI_FROM_DATABASE=INTEGRATED CIRCUIT SYSTEMS, INC. COMMUNICATIONS GROUP
+OUI:802AA8*
+ ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
 
-OUI:00605D*
- ID_OUI_FROM_DATABASE=SCANIVALVE CORP.
+OUI:00156D*
+ ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
 
-OUI:0060E4*
- ID_OUI_FROM_DATABASE=COMPUSERVE, INC.
+OUI:787D48*
+ ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
 
-OUI:00600A*
- ID_OUI_FROM_DATABASE=SORD COMPUTER CORPORATION
+OUI:D46E0E*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:0060C4*
- ID_OUI_FROM_DATABASE=SOLITON SYSTEMS K.K.
+OUI:049790*
+ ID_OUI_FROM_DATABASE=Lartech telecom LLC
 
-OUI:0060C8*
- ID_OUI_FROM_DATABASE=KUKA WELDING SYSTEMS & ROBOTS
+OUI:8CEA1B*
+ ID_OUI_FROM_DATABASE=Edgecore Networks Corporation
 
-OUI:006030*
- ID_OUI_FROM_DATABASE=VILLAGE TRONIC ENTWICKLUNG
+OUI:001650*
+ ID_OUI_FROM_DATABASE=Kratos EPD
 
-OUI:0060E7*
- ID_OUI_FROM_DATABASE=RANDATA
+OUI:583112*
+ ID_OUI_FROM_DATABASE=DRUST
 
-OUI:00602A*
- ID_OUI_FROM_DATABASE=SYMICRON COMPUTER COMMUNICATIONS, LTD.
+OUI:58696C*
+ ID_OUI_FROM_DATABASE=Ruijie Networks Co.,LTD
 
-OUI:00601E*
- ID_OUI_FROM_DATABASE=SOFTLAB, INC.
+OUI:A0B8F8*
+ ID_OUI_FROM_DATABASE=Amgen U.S.A. Inc.
 
-OUI:0060F8*
- ID_OUI_FROM_DATABASE=Loran International Technologies Inc.
+OUI:14A51A*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:006088*
- ID_OUI_FROM_DATABASE=WHITE MOUNTAIN DSP, INC.
+OUI:C816A5*
+ ID_OUI_FROM_DATABASE=Masimo Corporation
 
-OUI:00609A*
- ID_OUI_FROM_DATABASE=NJK TECHNO CO.
+OUI:9002A9*
+ ID_OUI_FROM_DATABASE=Zhejiang Dahua Technology Co., Ltd.
 
-OUI:0060CC*
- ID_OUI_FROM_DATABASE=EMTRAK, INCORPORATED
+OUI:ACD657*
+ ID_OUI_FROM_DATABASE=Shaanxi GuoLian Digital TV Technology Co.,Ltd.
 
-OUI:006036*
- ID_OUI_FROM_DATABASE=AIT Austrian Institute of Technology GmbH
+OUI:E80945*
+ ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
-OUI:0060B9*
- ID_OUI_FROM_DATABASE=NEC Platforms, Ltd
+OUI:98FD74*
+ ID_OUI_FROM_DATABASE=ACT.CO.LTD
 
-OUI:0060CE*
- ID_OUI_FROM_DATABASE=ACCLAIM COMMUNICATIONS
+OUI:60C798*
+ ID_OUI_FROM_DATABASE=Verifone
 
-OUI:0060F5*
- ID_OUI_FROM_DATABASE=ICON WEST, INC.
+OUI:A46011*
+ ID_OUI_FROM_DATABASE=Verifone
 
-OUI:0060A4*
- ID_OUI_FROM_DATABASE=GEW Technologies (PTY)Ltd
+OUI:2C2131*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:0060CA*
- ID_OUI_FROM_DATABASE=HARMONIC SYSTEMS INCORPORATED
+OUI:0CC47A*
+ ID_OUI_FROM_DATABASE=Super Micro Computer, Inc.
 
-OUI:006024*
- ID_OUI_FROM_DATABASE=GRADIENT TECHNOLOGIES, INC.
+OUI:60427F*
+ ID_OUI_FROM_DATABASE=SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD
 
-OUI:0060FB*
- ID_OUI_FROM_DATABASE=PACKETEER, INC.
+OUI:F8461C*
+ ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
 
-OUI:0060BC*
- ID_OUI_FROM_DATABASE=KeunYoung Electronics & Communication Co., Ltd.
+OUI:40B93C*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:0060B8*
- ID_OUI_FROM_DATABASE=CORELIS Inc.
+OUI:4C7487*
+ ID_OUI_FROM_DATABASE=Leader Phone Communication Technology Co., Ltd.
 
-OUI:0060FE*
- ID_OUI_FROM_DATABASE=LYNX SYSTEM DEVELOPERS, INC.
+OUI:F48C50*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:006001*
- ID_OUI_FROM_DATABASE=InnoSys, Inc.
+OUI:E8E875*
+ ID_OUI_FROM_DATABASE=iS5 Communications Inc.
 
-OUI:00607D*
- ID_OUI_FROM_DATABASE=SENTIENT NETWORKS INC.
+OUI:000422*
+ ID_OUI_FROM_DATABASE=Studio Technologies, Inc
 
-OUI:00606E*
- ID_OUI_FROM_DATABASE=DAVICOM SEMICONDUCTOR, INC.
+OUI:ACC662*
+ ID_OUI_FROM_DATABASE=MitraStar Technology Corp.
 
-OUI:00607E*
- ID_OUI_FROM_DATABASE=GIGALABS, INC.
+OUI:B8ECA3*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:0060CF*
- ID_OUI_FROM_DATABASE=ALTEON NETWORKS, INC.
+OUI:F01DBC*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
 
-OUI:006026*
- ID_OUI_FROM_DATABASE=VIKING Modular Solutions
+OUI:404D7F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:006003*
- ID_OUI_FROM_DATABASE=TERAOKA WEIGH SYSTEM PTE, LTD.
+OUI:7C04D0*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:006059*
- ID_OUI_FROM_DATABASE=TECHNICAL COMMUNICATIONS CORP.
+OUI:BC9FEF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:006066*
- ID_OUI_FROM_DATABASE=LACROIX Trafic
+OUI:8866A5*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0060DA*
- ID_OUI_FROM_DATABASE=Red Lion Controls, LP
+OUI:ACDCE5*
+ ID_OUI_FROM_DATABASE=Procter & Gamble Company
 
-OUI:006042*
- ID_OUI_FROM_DATABASE=TKS (USA), INC.
+OUI:784F43*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00A023*
- ID_OUI_FROM_DATABASE=APPLIED CREATIVE TECHNOLOGY, INC.
+OUI:98D293*
+ ID_OUI_FROM_DATABASE=Google, Inc.
 
-OUI:00A00F*
- ID_OUI_FROM_DATABASE=Broadband Technologies
+OUI:5CCCA0*
+ ID_OUI_FROM_DATABASE=Gridwiz Inc.
 
-OUI:00A032*
- ID_OUI_FROM_DATABASE=GES SINGAPORE PTE. LTD.
+OUI:104FA8*
+ ID_OUI_FROM_DATABASE=Sony Corporation
 
-OUI:002034*
- ID_OUI_FROM_DATABASE=ROTEC INDUSTRIEAUTOMATION GMBH
+OUI:6C25B9*
+ ID_OUI_FROM_DATABASE=BBK EDUCATIONAL ELECTRONICS CORP.,LTD.
 
-OUI:0020B2*
- ID_OUI_FROM_DATABASE=GKD Gesellschaft Fur Kommunikation Und Datentechnik
+OUI:486B2C*
+ ID_OUI_FROM_DATABASE=BBK EDUCATIONAL ELECTRONICS CORP.,LTD.
 
-OUI:002004*
- ID_OUI_FROM_DATABASE=YAMATAKE-HONEYWELL CO., LTD.
+OUI:00001F*
+ ID_OUI_FROM_DATABASE=Telco Systems, Inc.
 
-OUI:0020FE*
- ID_OUI_FROM_DATABASE=TOPWARE INC. / GRAND COMPUTER
+OUI:BC307E*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
-OUI:002073*
- ID_OUI_FROM_DATABASE=FUSION SYSTEMS CORPORATION
+OUI:00C0AB*
+ ID_OUI_FROM_DATABASE=Telco Systems, Inc.
 
-OUI:00207A*
- ID_OUI_FROM_DATABASE=WiSE Communications, Inc.
+OUI:0010CA*
+ ID_OUI_FROM_DATABASE=Telco Systems, Inc.
 
-OUI:00205C*
- ID_OUI_FROM_DATABASE=InterNet Systems of Florida, Inc.
+OUI:0C2576*
+ ID_OUI_FROM_DATABASE=LONGCHEER TELECOMMUNICATION LIMITED
 
-OUI:00207E*
- ID_OUI_FROM_DATABASE=FINECOM CO., LTD.
+OUI:0007A6*
+ ID_OUI_FROM_DATABASE=Leviton Manufacturing Co., Inc.
 
-OUI:00205A*
- ID_OUI_FROM_DATABASE=COMPUTER IDENTICS
+OUI:208756*
+ ID_OUI_FROM_DATABASE=SIEMENS AG
 
-OUI:0020E4*
- ID_OUI_FROM_DATABASE=HSING TECH ENTERPRISE CO., LTD
+OUI:B08900*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00A000*
- ID_OUI_FROM_DATABASE=CENTILLION NETWORKS, INC.
+OUI:640DCE*
+ ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
 
-OUI:00A07B*
- ID_OUI_FROM_DATABASE=DAWN COMPUTER INCORPORATION
+OUI:6063F9*
+ ID_OUI_FROM_DATABASE=Ciholas, Inc.
 
-OUI:00A05C*
- ID_OUI_FROM_DATABASE=INVENTORY CONVERSION, INC./
+OUI:F0421C*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00206F*
- ID_OUI_FROM_DATABASE=FLOWPOINT CORPORATION
+OUI:C0E42D*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:0020DF*
- ID_OUI_FROM_DATABASE=KYOSAN ELECTRIC MFG. CO., LTD.
+OUI:18D6C7*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:002010*
- ID_OUI_FROM_DATABASE=JEOL SYSTEM TECHNOLOGY CO. LTD
+OUI:B8BB23*
+ ID_OUI_FROM_DATABASE=Guangdong Nufront CSC Co., Ltd
 
-OUI:002020*
- ID_OUI_FROM_DATABASE=MEGATRON COMPUTER INDUSTRIES PTY, LTD.
+OUI:EC26FB*
+ ID_OUI_FROM_DATABASE=TECC CO.,LTD.
 
-OUI:002037*
- ID_OUI_FROM_DATABASE=SEAGATE TECHNOLOGY
+OUI:10683F*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:0020A0*
- ID_OUI_FROM_DATABASE=OA LABORATORY CO., LTD.
+OUI:A039F7*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:00C0A3*
- ID_OUI_FROM_DATABASE=DUAL ENTERPRISES CORPORATION
+OUI:64BC0C*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:0070B0*
- ID_OUI_FROM_DATABASE=M/A-COM INC. COMPANIES
+OUI:0090CC*
+ ID_OUI_FROM_DATABASE=PLANEX COMMUNICATIONS INC.
 
-OUI:009D8E*
- ID_OUI_FROM_DATABASE=CARDIAC RECORDERS, INC.
+OUI:E09DB8*
+ ID_OUI_FROM_DATABASE=PLANEX COMMUNICATIONS INC.
 
-OUI:006086*
- ID_OUI_FROM_DATABASE=LOGIC REPLACEMENT TECH. LTD.
+OUI:64899A*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:001C7C*
- ID_OUI_FROM_DATABASE=PERQ SYSTEMS CORPORATION
+OUI:58A2B5*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:00C059*
- ID_OUI_FROM_DATABASE=DENSO CORPORATION
+OUI:74A722*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:00C0A9*
- ID_OUI_FROM_DATABASE=BARRON MCCANN LTD.
+OUI:001F6B*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:00C069*
- ID_OUI_FROM_DATABASE=Axxcelera Broadband Wireless
+OUI:903AE6*
+ ID_OUI_FROM_DATABASE=PARROT SA
 
-OUI:00C019*
- ID_OUI_FROM_DATABASE=LEAP TECHNOLOGY, INC.
+OUI:00E00F*
+ ID_OUI_FROM_DATABASE=Shanghai Baud Data Communication Co.,Ltd.
 
-OUI:00A062*
- ID_OUI_FROM_DATABASE=AES PRODATA
+OUI:3C404F*
+ ID_OUI_FROM_DATABASE=GUANGDONG PISEN ELECTRONICS CO.,LTD
 
-OUI:00A008*
- ID_OUI_FROM_DATABASE=NETCORP
+OUI:00233E*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent IPD
 
-OUI:00A01B*
- ID_OUI_FROM_DATABASE=PREMISYS COMMUNICATIONS, INC.
+OUI:6CBEE9*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent IPD
 
-OUI:00A04B*
- ID_OUI_FROM_DATABASE=TFL LAN INC.
+OUI:0080F7*
+ ID_OUI_FROM_DATABASE=Zenith Electronics Corporation
 
-OUI:00A015*
- ID_OUI_FROM_DATABASE=WYLE
+OUI:00C095*
+ ID_OUI_FROM_DATABASE=ZNYX Networks, Inc.
 
-OUI:00A011*
- ID_OUI_FROM_DATABASE=MUTOH INDUSTRIES LTD.
+OUI:60EB69*
+ ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
 
-OUI:00A0B6*
- ID_OUI_FROM_DATABASE=SANRITZ AUTOMATION CO., LTD.
+OUI:C80AA9*
+ ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
 
-OUI:00A0DD*
- ID_OUI_FROM_DATABASE=AZONIX CORPORATION
+OUI:00238B*
+ ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
 
-OUI:00A00A*
- ID_OUI_FROM_DATABASE=Airspan
+OUI:0007BA*
+ ID_OUI_FROM_DATABASE=UTStarcom Inc
 
-OUI:00A03B*
- ID_OUI_FROM_DATABASE=TOSHIN ELECTRIC CO., LTD.
+OUI:4439C4*
+ ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
 
-OUI:00A0F3*
- ID_OUI_FROM_DATABASE=STAUBLI
+OUI:70F395*
+ ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
 
-OUI:00A097*
- ID_OUI_FROM_DATABASE=JC INFORMATION SYSTEMS
+OUI:001E37*
+ ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
 
-OUI:00A082*
- ID_OUI_FROM_DATABASE=NKT ELEKTRONIK A/S
+OUI:002713*
+ ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
 
-OUI:00A072*
- ID_OUI_FROM_DATABASE=OVATION SYSTEMS LTD.
+OUI:002186*
+ ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
 
-OUI:00A0B2*
- ID_OUI_FROM_DATABASE=SHIMA SEIKI
+OUI:8CFDF0*
+ ID_OUI_FROM_DATABASE=Qualcomm Inc.
 
-OUI:00A0E5*
- ID_OUI_FROM_DATABASE=NHC COMMUNICATIONS
+OUI:000031*
+ ID_OUI_FROM_DATABASE=QPSX COMMUNICATIONS, LTD.
 
-OUI:00A0D3*
- ID_OUI_FROM_DATABASE=INSTEM COMPUTER SYSTEMS, LTD.
+OUI:000E7B*
+ ID_OUI_FROM_DATABASE=Toshiba
 
-OUI:00A0BA*
- ID_OUI_FROM_DATABASE=PATTON ELECTRONICS CO.
+OUI:B86B23*
+ ID_OUI_FROM_DATABASE=Toshiba
 
-OUI:00A0B4*
- ID_OUI_FROM_DATABASE=TEXAS MICROSYSTEMS, INC.
+OUI:000C29*
+ ID_OUI_FROM_DATABASE=VMware, Inc.
 
-OUI:00A0AF*
- ID_OUI_FROM_DATABASE=WMS INDUSTRIES
+OUI:005056*
+ ID_OUI_FROM_DATABASE=VMware, Inc.
 
-OUI:00A0FE*
- ID_OUI_FROM_DATABASE=BOSTON TECHNOLOGY, INC.
+OUI:001C4D*
+ ID_OUI_FROM_DATABASE=Aplix IP Holdings Corporation
 
-OUI:00202F*
- ID_OUI_FROM_DATABASE=ZETA COMMUNICATIONS, LTD.
+OUI:D0052A*
+ ID_OUI_FROM_DATABASE=Arcadyan Corporation
 
-OUI:002060*
- ID_OUI_FROM_DATABASE=ALCATEL ITALIA S.p.A.
+OUI:F485C6*
+ ID_OUI_FROM_DATABASE=FDT Technologies
 
-OUI:00209A*
- ID_OUI_FROM_DATABASE=THE 3DO COMPANY
+OUI:BC60A7*
+ ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
 
-OUI:00205E*
- ID_OUI_FROM_DATABASE=CASTLE ROCK, INC.
+OUI:08D833*
+ ID_OUI_FROM_DATABASE=Shenzhen RF Technology Co., Ltd
 
-OUI:00207C*
- ID_OUI_FROM_DATABASE=AUTEC GMBH
+OUI:94D469*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:002075*
- ID_OUI_FROM_DATABASE=MOTOROLA COMMUNICATION ISRAEL
+OUI:385610*
+ ID_OUI_FROM_DATABASE=CANDY HOUSE, Inc.
 
-OUI:002015*
- ID_OUI_FROM_DATABASE=ACTIS COMPUTER SA
+OUI:20F543*
+ ID_OUI_FROM_DATABASE=Hui Zhou Gaoshengda Technology Co.,LTD
 
-OUI:0020E9*
- ID_OUI_FROM_DATABASE=DANTEL
+OUI:685388*
+ ID_OUI_FROM_DATABASE=P&S Technology
 
-OUI:00204A*
- ID_OUI_FROM_DATABASE=PRONET GMBH
+OUI:54A619*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
 
-OUI:002029*
- ID_OUI_FROM_DATABASE=TELEPROCESSING PRODUCTS, INC.
+OUI:1880F5*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
 
-OUI:002051*
- ID_OUI_FROM_DATABASE=Verilink Corporation
+OUI:24DBED*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0020A1*
- ID_OUI_FROM_DATABASE=DOVATRON
+OUI:AC3613*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:002024*
- ID_OUI_FROM_DATABASE=PACIFIC COMMUNICATION SCIENCES
+OUI:1449E0*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:00209D*
- ID_OUI_FROM_DATABASE=LIPPERT AUTOMATIONSTECHNIK
+OUI:C0BDD1*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:002041*
- ID_OUI_FROM_DATABASE=DATA NET
+OUI:E8508B*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:002076*
- ID_OUI_FROM_DATABASE=REUDO CORPORATION
+OUI:F025B7*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:00206E*
- ID_OUI_FROM_DATABASE=XACT, INC.
+OUI:C8BA94*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:0020CA*
- ID_OUI_FROM_DATABASE=DIGITAL OCEAN
+OUI:EC1F72*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:002085*
- ID_OUI_FROM_DATABASE=Eaton Corporation
+OUI:9852B1*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0020CD*
- ID_OUI_FROM_DATABASE=HYBRID NETWORKS, INC.
+OUI:1489FD*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0020E7*
- ID_OUI_FROM_DATABASE=B&W NUCLEAR SERVICE COMPANY
+OUI:CCFE3C*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0020AC*
- ID_OUI_FROM_DATABASE=INTERFLEX DATENSYSTEME GMBH
+OUI:789ED0*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0020F6*
- ID_OUI_FROM_DATABASE=NET TEK  AND KARLNET, INC.
+OUI:E440E2*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0020D3*
- ID_OUI_FROM_DATABASE=OST (OUEST STANDARD TELEMATIQU
+OUI:1CAF05*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0020D8*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:E492FB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:002017*
- ID_OUI_FROM_DATABASE=ORBOTECH
+OUI:247F20*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:002025*
- ID_OUI_FROM_DATABASE=CONTROL TECHNOLOGY, INC.
+OUI:0073E0*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C08B*
- ID_OUI_FROM_DATABASE=RISQ MODULAR SYSTEMS, INC.
+OUI:BC4486*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C0CD*
- ID_OUI_FROM_DATABASE=COMELTA, S.A.
+OUI:380B40*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C04B*
- ID_OUI_FROM_DATABASE=CREATIVE MICROSYSTEMS
+OUI:8C0D76*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00C0A1*
- ID_OUI_FROM_DATABASE=TOKYO DENSHI SEKEI CO.
+OUI:005A13*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00C03E*
- ID_OUI_FROM_DATABASE=FA. GEBR. HELLER GMBH
+OUI:002490*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C0E1*
- ID_OUI_FROM_DATABASE=SONIC SOLUTIONS
+OUI:0023D7*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C047*
- ID_OUI_FROM_DATABASE=UNIMICRO SYSTEMS, INC.
+OUI:FCA13E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C046*
- ID_OUI_FROM_DATABASE=Blue Chip Technology Ltd
+OUI:A00798*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C00D*
- ID_OUI_FROM_DATABASE=ADVANCED LOGIC RESEARCH, INC.
+OUI:945103*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C0FA*
- ID_OUI_FROM_DATABASE=CANARY COMMUNICATIONS, INC.
+OUI:C819F7*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C0B7*
- ID_OUI_FROM_DATABASE=AMERICAN POWER CONVERSION CORP
+OUI:2C4401*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C0BA*
- ID_OUI_FROM_DATABASE=NETVANTAGE
+OUI:08C6B3*
+ ID_OUI_FROM_DATABASE=QTECH LLC
 
-OUI:00C0B6*
- ID_OUI_FROM_DATABASE=Overland Storage, Inc.
+OUI:64DAA0*
+ ID_OUI_FROM_DATABASE=Robert Bosch Smart Home GmbH
 
-OUI:00C048*
- ID_OUI_FROM_DATABASE=BAY TECHNICAL ASSOCIATES
+OUI:14B837*
+ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
 
-OUI:00C03F*
- ID_OUI_FROM_DATABASE=STORES AUTOMATED SYSTEMS, INC.
+OUI:8056F2*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00C00E*
- ID_OUI_FROM_DATABASE=PSITECH, INC.
+OUI:70188B*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00C036*
- ID_OUI_FROM_DATABASE=RAYTECH ELECTRONIC CORP.
+OUI:3C77E6*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00C009*
- ID_OUI_FROM_DATABASE=KT TECHNOLOGY (S) PTE LTD
+OUI:0C84DC*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00C0EA*
- ID_OUI_FROM_DATABASE=ARRAY TECHNOLOGY LTD.
+OUI:844BF5*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00C03A*
- ID_OUI_FROM_DATABASE=MEN-MIKRO ELEKTRONIK GMBH
+OUI:E006E6*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00C040*
- ID_OUI_FROM_DATABASE=ECCI
+OUI:60F494*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00C04C*
- ID_OUI_FROM_DATABASE=DEPARTMENT OF FOREIGN AFFAIRS
+OUI:A41731*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00C01C*
- ID_OUI_FROM_DATABASE=INTERLINK COMMUNICATIONS LTD.
+OUI:C0143D*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00C086*
- ID_OUI_FROM_DATABASE=THE LYNK CORPORATION
+OUI:642737*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00C08D*
- ID_OUI_FROM_DATABASE=TRONIX PRODUCT DEVELOPMENT
+OUI:60D819*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00C0A2*
- ID_OUI_FROM_DATABASE=INTERMEDIUM A/S
+OUI:6474F6*
+ ID_OUI_FROM_DATABASE=Shooter Detection Systems
 
-OUI:00C070*
- ID_OUI_FROM_DATABASE=SECTRA SECURE-TRANSMISSION AB
+OUI:604BAA*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:00C057*
- ID_OUI_FROM_DATABASE=MYCO ELECTRONICS
+OUI:CC7314*
+ ID_OUI_FROM_DATABASE=HONG KONG WHEATEK TECHNOLOGY LIMITED
 
-OUI:00C0DF*
- ID_OUI_FROM_DATABASE=KYE Systems Corp.
+OUI:C0CB38*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00C0F6*
- ID_OUI_FROM_DATABASE=CELAN TECHNOLOGY INC.
+OUI:98E7F4*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:00C08F*
- ID_OUI_FROM_DATABASE=Panasonic Electric Works Co., Ltd.
+OUI:D42C44*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00C012*
- ID_OUI_FROM_DATABASE=NETSPAN CORPORATION
+OUI:D842E2*
+ ID_OUI_FROM_DATABASE=Canary Connect, Inc.
 
-OUI:00C0C4*
- ID_OUI_FROM_DATABASE=COMPUTER OPERATIONAL
+OUI:500959*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:00C0C2*
- ID_OUI_FROM_DATABASE=INFINITE NETWORKS LTD.
+OUI:143365*
+ ID_OUI_FROM_DATABASE=TEM Mobile Limited
 
-OUI:00C0D3*
- ID_OUI_FROM_DATABASE=OLYMPUS IMAGE SYSTEMS, INC.
+OUI:C0F945*
+ ID_OUI_FROM_DATABASE=Toshiba Toko Meter Systems Co., LTD.
 
-OUI:00C0B0*
- ID_OUI_FROM_DATABASE=GCC TECHNOLOGIES,INC.
+OUI:ACAB2E*
+ ID_OUI_FROM_DATABASE=Beijing LasNubes Technology Co., Ltd.
 
-OUI:00C0F4*
- ID_OUI_FROM_DATABASE=INTERLINK SYSTEM CO., LTD.
+OUI:10E878*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:00C0E2*
- ID_OUI_FROM_DATABASE=CALCOMP, INC.
+OUI:48F7F1*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:00C0CA*
- ID_OUI_FROM_DATABASE=ALFA, INC.
+OUI:4CC94F*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:00C07B*
- ID_OUI_FROM_DATABASE=ASCEND COMMUNICATIONS, INC.
+OUI:1CEA1B*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:00C052*
- ID_OUI_FROM_DATABASE=BURR-BROWN
+OUI:B4F81E*
+ ID_OUI_FROM_DATABASE=Kinova
 
-OUI:00C0BE*
- ID_OUI_FROM_DATABASE=ALCATEL - SEL
+OUI:28CA09*
+ ID_OUI_FROM_DATABASE=ThyssenKrupp Elevators (Shanghai) Co.,Ltd
 
-OUI:00408F*
- ID_OUI_FROM_DATABASE=WM-DATA MINFO AB
+OUI:E0B94D*
+ ID_OUI_FROM_DATABASE=SHENZHEN BILIAN ELECTRONIC CO.,LTD
 
-OUI:0040B7*
- ID_OUI_FROM_DATABASE=STEALTH COMPUTER SYSTEMS
+OUI:D8380D*
+ ID_OUI_FROM_DATABASE=SHENZHEN IP-COM Network Co.,Ltd
 
-OUI:004057*
- ID_OUI_FROM_DATABASE=LOCKHEED - SANDERS
+OUI:A4C64F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:004017*
- ID_OUI_FROM_DATABASE=Silex Technology America
+OUI:C83DD4*
+ ID_OUI_FROM_DATABASE=CyberTAN Technology Inc.
 
-OUI:004087*
- ID_OUI_FROM_DATABASE=UBITREX CORPORATION
+OUI:487B6B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00400E*
- ID_OUI_FROM_DATABASE=MEMOTEC, INC.
+OUI:9C62AB*
+ ID_OUI_FROM_DATABASE=Sumavision Technologies Co.,Ltd
 
-OUI:00C09E*
- ID_OUI_FROM_DATABASE=CACHE COMPUTERS, INC.
+OUI:487A55*
+ ID_OUI_FROM_DATABASE=ALE International
 
-OUI:00C093*
- ID_OUI_FROM_DATABASE=ALTA RESEARCH CORP.
+OUI:000435*
+ ID_OUI_FROM_DATABASE=InfiNet LLC
 
-OUI:00C034*
- ID_OUI_FROM_DATABASE=TRANSACTION NETWORK
+OUI:BC39D9*
+ ID_OUI_FROM_DATABASE=Z-TEC
 
-OUI:004034*
- ID_OUI_FROM_DATABASE=BUSTEK CORPORATION
+OUI:88E87F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:004097*
- ID_OUI_FROM_DATABASE=DATEX DIVISION OF
+OUI:B853AC*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00401E*
- ID_OUI_FROM_DATABASE=ICC
+OUI:B04BBF*
+ ID_OUI_FROM_DATABASE=PT HAN SUNG ELECTORONICS INDONESIA
 
-OUI:00407C*
- ID_OUI_FROM_DATABASE=QUME CORPORATION
+OUI:0060D6*
+ ID_OUI_FROM_DATABASE=NovAtel Inc.
 
-OUI:004060*
- ID_OUI_FROM_DATABASE=COMENDEC LTD
+OUI:2C3361*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:004056*
- ID_OUI_FROM_DATABASE=MCM JAPAN LTD.
+OUI:78B84B*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
 
-OUI:004095*
- ID_OUI_FROM_DATABASE=R.P.T. INTERGROUPS INT'L LTD.
+OUI:40F420*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
 
-OUI:0040C3*
- ID_OUI_FROM_DATABASE=FISCHER AND PORTER CO.
+OUI:9C6121*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
 
-OUI:0040F1*
- ID_OUI_FROM_DATABASE=CHUO ELECTRONICS CO., LTD.
+OUI:8C8ABB*
+ ID_OUI_FROM_DATABASE=Beijing Orient View Technology Co., Ltd.
 
-OUI:004061*
- ID_OUI_FROM_DATABASE=DATATECH ENTERPRISES CO., LTD.
+OUI:88366C*
+ ID_OUI_FROM_DATABASE=EFM Networks
 
-OUI:00408B*
- ID_OUI_FROM_DATABASE=RAYLAN CORPORATION
+OUI:F074E4*
+ ID_OUI_FROM_DATABASE=Thundercomm Technology Co., Ltd
 
-OUI:004020*
- ID_OUI_FROM_DATABASE=CommScope Inc
+OUI:A0722C*
+ ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
 
-OUI:00406E*
- ID_OUI_FROM_DATABASE=COROLLARY, INC.
+OUI:FCECDA*
+ ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
 
-OUI:004066*
- ID_OUI_FROM_DATABASE=Hitachi Metals, Ltd.
+OUI:E07C13*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:004016*
- ID_OUI_FROM_DATABASE=ADC - Global Connectivity Solutions Division
+OUI:58E16C*
+ ID_OUI_FROM_DATABASE=Ying Hua Information Technology (Shanghai)Co., LTD
 
-OUI:004086*
- ID_OUI_FROM_DATABASE=MICHELS & KLEBERHOFF COMPUTER
+OUI:24C1BD*
+ ID_OUI_FROM_DATABASE=CRRC DALIAN R&D CO.,LTD.
 
-OUI:0040DC*
- ID_OUI_FROM_DATABASE=TRITEC ELECTRONIC GMBH
+OUI:A81E84*
+ ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
 
-OUI:004074*
- ID_OUI_FROM_DATABASE=CABLE AND WIRELESS
+OUI:C82158*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:004084*
- ID_OUI_FROM_DATABASE=HONEYWELL ACS
+OUI:2420C7*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:0040B8*
- ID_OUI_FROM_DATABASE=IDEA ASSOCIATES
+OUI:703D15*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:004058*
- ID_OUI_FROM_DATABASE=KRONOS, INC.
+OUI:4018B1*
+ ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
 
-OUI:0040A8*
- ID_OUI_FROM_DATABASE=IMF INTERNATIONAL LTD.
+OUI:001977*
+ ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
 
-OUI:0080BB*
- ID_OUI_FROM_DATABASE=HUGHES LAN SYSTEMS
+OUI:C8665D*
+ ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
 
-OUI:00C0A0*
- ID_OUI_FROM_DATABASE=ADVANCE MICRO RESEARCH, INC.
+OUI:3CEF8C*
+ ID_OUI_FROM_DATABASE=Zhejiang Dahua Technology Co., Ltd.
 
-OUI:00C0D7*
- ID_OUI_FROM_DATABASE=TAIWAN TRADING CENTER DBA
+OUI:A0CC2B*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:00C037*
- ID_OUI_FROM_DATABASE=DYNATEM
+OUI:00234A*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:00C05F*
- ID_OUI_FROM_DATABASE=FINE-PAL COMPANY LIMITED
+OUI:88C626*
+ ID_OUI_FROM_DATABASE=Logitech, Inc
 
-OUI:0040CE*
- ID_OUI_FROM_DATABASE=NET-SOURCE, INC.
+OUI:28E31F*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:004080*
- ID_OUI_FROM_DATABASE=ATHENIX CORPORATION
+OUI:0C1DAF*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:0040BB*
- ID_OUI_FROM_DATABASE=GOLDSTAR CABLE CO., LTD.
+OUI:14F65A*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:0040B1*
- ID_OUI_FROM_DATABASE=CODONICS INC.
+OUI:742344*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:00402E*
- ID_OUI_FROM_DATABASE=PRECISION SOFTWARE, INC.
+OUI:F0B429*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:00C0CE*
- ID_OUI_FROM_DATABASE=CEI SYSTEMS & ENGINEERING PTE
+OUI:94E979*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:00409B*
- ID_OUI_FROM_DATABASE=HAL COMPUTER SYSTEMS INC.
+OUI:AC1F6B*
+ ID_OUI_FROM_DATABASE=Super Micro Computer, Inc.
 
-OUI:004073*
- ID_OUI_FROM_DATABASE=BASS ASSOCIATES
+OUI:80D4A5*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:10005A*
- ID_OUI_FROM_DATABASE=IBM Corp
+OUI:38BC01*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:004005*
- ID_OUI_FROM_DATABASE=ANI COMMUNICATIONS INC.
+OUI:04B0E7*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:004099*
- ID_OUI_FROM_DATABASE=NEWGEN SYSTEMS CORP.
+OUI:446A2E*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0040E1*
- ID_OUI_FROM_DATABASE=MARNER INTERNATIONAL, INC.
+OUI:0026AB*
+ ID_OUI_FROM_DATABASE=Seiko Epson Corporation
 
-OUI:0080DD*
- ID_OUI_FROM_DATABASE=GMX INC/GIMIX
+OUI:64EB8C*
+ ID_OUI_FROM_DATABASE=Seiko Epson Corporation
 
-OUI:0080B7*
- ID_OUI_FROM_DATABASE=STELLAR COMPUTER
+OUI:A06FAA*
+ ID_OUI_FROM_DATABASE=LG Innotek
 
-OUI:008002*
- ID_OUI_FROM_DATABASE=SATELCOM (UK) LTD
+OUI:0015FC*
+ ID_OUI_FROM_DATABASE=Littelfuse Startco
 
-OUI:00805C*
- ID_OUI_FROM_DATABASE=AGILIS CORPORATION
+OUI:504B5B*
+ ID_OUI_FROM_DATABASE=CONTROLtronic GmbH
 
-OUI:0080E7*
- ID_OUI_FROM_DATABASE=LYNWOOD SCIENTIFIC DEV. LTD.
+OUI:A0E0AF*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:008070*
- ID_OUI_FROM_DATABASE=COMPUTADORAS MICRON
+OUI:603E7B*
+ ID_OUI_FROM_DATABASE=Gafachi, Inc.
 
-OUI:00808F*
- ID_OUI_FROM_DATABASE=C. ITOH ELECTRONICS, INC.
+OUI:98F199*
+ ID_OUI_FROM_DATABASE=NEC Platforms, Ltd.
 
-OUI:000091*
- ID_OUI_FROM_DATABASE=ANRITSU CORPORATION
+OUI:78FC14*
+ ID_OUI_FROM_DATABASE=Family Zone Cyber Safety Ltd
 
-OUI:000094*
- ID_OUI_FROM_DATABASE=ASANTE TECHNOLOGIES
+OUI:1062EB*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:000090*
- ID_OUI_FROM_DATABASE=MICROCOM
+OUI:E0A700*
+ ID_OUI_FROM_DATABASE=Verkada Inc
 
-OUI:000047*
- ID_OUI_FROM_DATABASE=NICOLET INSTRUMENTS CORP.
+OUI:901711*
+ ID_OUI_FROM_DATABASE=Hagenuk Marinekommunikation GmbH
 
-OUI:0000FB*
- ID_OUI_FROM_DATABASE=RECHNER ZUR KOMMUNIKATION
+OUI:D825B0*
+ ID_OUI_FROM_DATABASE=Rockeetech Systems Co.,Ltd.
 
-OUI:0000A3*
- ID_OUI_FROM_DATABASE=NETWORK APPLICATION TECHNOLOGY
+OUI:74614B*
+ ID_OUI_FROM_DATABASE=Chongqing Huijiatong Information Technology Co., Ltd.
 
-OUI:00008F*
- ID_OUI_FROM_DATABASE=Raytheon
+OUI:C0D9F7*
+ ID_OUI_FROM_DATABASE=ShanDong Domor Intelligent S&T CO.,Ltd
 
-OUI:00007E*
- ID_OUI_FROM_DATABASE=CLUSTRIX CORPORATION
+OUI:94FB29*
+ ID_OUI_FROM_DATABASE=Zebra Technologies Inc.
 
-OUI:00000A*
- ID_OUI_FROM_DATABASE=OMRON TATEISI ELECTRONICS CO.
+OUI:64DBA0*
+ ID_OUI_FROM_DATABASE=Select Comfort
 
-OUI:000063*
- ID_OUI_FROM_DATABASE=BARCO CONTROL ROOMS GMBH
+OUI:5800E3*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:00004E*
- ID_OUI_FROM_DATABASE=AMPEX CORPORATION
+OUI:64777D*
+ ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
 
-OUI:0000C2*
- ID_OUI_FROM_DATABASE=INFORMATION PRESENTATION TECH.
+OUI:0495E6*
+ ID_OUI_FROM_DATABASE=Tenda Technology Co.,Ltd.Dongguan branch
 
-OUI:000034*
- ID_OUI_FROM_DATABASE=NETWORK RESOURCES CORPORATION
+OUI:0016D3*
+ ID_OUI_FROM_DATABASE=Wistron Corporation
 
-OUI:000049*
- ID_OUI_FROM_DATABASE=APRICOT COMPUTERS, LTD
+OUI:001F16*
+ ID_OUI_FROM_DATABASE=Wistron Corporation
 
-OUI:0000E2*
- ID_OUI_FROM_DATABASE=ACER TECHNOLOGIES CORP.
+OUI:4C4E03*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:000097*
- ID_OUI_FROM_DATABASE=EMC Corporation
+OUI:50E666*
+ ID_OUI_FROM_DATABASE=Shenzhen Techtion Electronics Co., Ltd.
 
-OUI:0000D4*
- ID_OUI_FROM_DATABASE=PURE DATA LTD.
+OUI:6831FE*
+ ID_OUI_FROM_DATABASE=Teladin Co.,Ltd.
 
-OUI:0000E1*
- ID_OUI_FROM_DATABASE=GRID SYSTEMS
+OUI:EC43F6*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:000044*
- ID_OUI_FROM_DATABASE=CASTELLE CORPORATION
+OUI:D4B169*
+ ID_OUI_FROM_DATABASE=Le Shi Zhi Xin Electronic Technology (Tianjin) Limited
 
-OUI:000027*
- ID_OUI_FROM_DATABASE=JAPAN RADIO COMPANY
+OUI:0C3CCD*
+ ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
 
-OUI:004049*
- ID_OUI_FROM_DATABASE=Roche Diagnostics International Ltd.
+OUI:B04089*
+ ID_OUI_FROM_DATABASE=Senient Systems LTD
 
-OUI:004029*
- ID_OUI_FROM_DATABASE=Compex
+OUI:002445*
+ ID_OUI_FROM_DATABASE=Adtran Inc
 
-OUI:008038*
- ID_OUI_FROM_DATABASE=DATA RESEARCH & APPLICATIONS
+OUI:689FF0*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:008090*
- ID_OUI_FROM_DATABASE=MICROTEK INTERNATIONAL, INC.
+OUI:7CC6C4*
+ ID_OUI_FROM_DATABASE=Kolff Computer Supplies b.v.
 
-OUI:0080C3*
- ID_OUI_FROM_DATABASE=BICC INFORMATION SYSTEMS & SVC
+OUI:14B7F8*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:00805A*
- ID_OUI_FROM_DATABASE=TULIP COMPUTERS INTERNAT'L B.V
+OUI:F06E32*
+ ID_OUI_FROM_DATABASE=MICROTEL INNOVATION S.R.L.
 
-OUI:0080F0*
- ID_OUI_FROM_DATABASE=Panasonic Communications Co., Ltd.
+OUI:00E022*
+ ID_OUI_FROM_DATABASE=Analog Devices, Inc.
 
-OUI:008043*
- ID_OUI_FROM_DATABASE=NETWORLD, INC.
+OUI:7C67A2*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:0080B0*
- ID_OUI_FROM_DATABASE=ADVANCED INFORMATION
+OUI:000302*
+ ID_OUI_FROM_DATABASE=Charles Industries, Ltd.
 
-OUI:008066*
- ID_OUI_FROM_DATABASE=ARCOM CONTROL SYSTEMS, LTD.
+OUI:0896AD*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:004051*
- ID_OUI_FROM_DATABASE=GRACILIS, INC.
+OUI:8CF5A3*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:004064*
- ID_OUI_FROM_DATABASE=KLA INSTRUMENTS CORPORATION
+OUI:B8EAAA*
+ ID_OUI_FROM_DATABASE=ICG NETWORKS CO.,ltd
 
-OUI:004028*
- ID_OUI_FROM_DATABASE=NETCOMM LIMITED
+OUI:B8F883*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:004013*
- ID_OUI_FROM_DATABASE=NTT DATA COMM. SYSTEMS CORP.
+OUI:DCFE18*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:0040A0*
- ID_OUI_FROM_DATABASE=GOLDSTAR CO., LTD.
+OUI:AC60B6*
+ ID_OUI_FROM_DATABASE=Ericsson AB
 
-OUI:0040B2*
- ID_OUI_FROM_DATABASE=SYSTEMFORSCHUNG
+OUI:3C197D*
+ ID_OUI_FROM_DATABASE=Ericsson AB
 
-OUI:004071*
- ID_OUI_FROM_DATABASE=ATM COMPUTER GMBH
+OUI:74C99A*
+ ID_OUI_FROM_DATABASE=Ericsson AB
 
-OUI:0080BF*
- ID_OUI_FROM_DATABASE=TAKAOKA ELECTRIC MFG. CO. LTD.
+OUI:000F4F*
+ ID_OUI_FROM_DATABASE=PCS Systemtechnik GmbH
 
-OUI:0080F6*
- ID_OUI_FROM_DATABASE=SYNERGY MICROSYSTEMS
+OUI:7C5A1C*
+ ID_OUI_FROM_DATABASE=Sophos Ltd
 
-OUI:000058*
- ID_OUI_FROM_DATABASE=RACORE COMPUTER PRODUCTS INC.
+OUI:00E400*
+ ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
 
-OUI:000050*
- ID_OUI_FROM_DATABASE=RADISYS CORPORATION
+OUI:00117E*
+ ID_OUI_FROM_DATABASE=Midmark Corp
 
-OUI:008082*
- ID_OUI_FROM_DATABASE=PEP MODULAR COMPUTERS GMBH
+OUI:703ACB*
+ ID_OUI_FROM_DATABASE=Google, Inc.
 
-OUI:008096*
- ID_OUI_FROM_DATABASE=HUMAN DESIGNED SYSTEMS, INC.
+OUI:105AF7*
+ ID_OUI_FROM_DATABASE=ADB Italia
 
-OUI:0080D5*
- ID_OUI_FROM_DATABASE=CADRE TECHNOLOGIES
+OUI:2C55D3*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00803E*
- ID_OUI_FROM_DATABASE=SYNERNETICS
+OUI:F44C7F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00809A*
- ID_OUI_FROM_DATABASE=NOVUS NETWORKS LTD
+OUI:143004*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0080B3*
- ID_OUI_FROM_DATABASE=AVAL DATA CORPORATION
+OUI:D481D7*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:0080A3*
- ID_OUI_FROM_DATABASE=Lantronix
+OUI:7C4685*
+ ID_OUI_FROM_DATABASE=Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.
 
-OUI:00803C*
- ID_OUI_FROM_DATABASE=TVS ELECTRONICS LTD
+OUI:E05163*
+ ID_OUI_FROM_DATABASE=Arcadyan Corporation
 
-OUI:008061*
- ID_OUI_FROM_DATABASE=LITTON SYSTEMS, INC.
+OUI:00A06F*
+ ID_OUI_FROM_DATABASE=Color Sentinel Systems, LLC
 
-OUI:0080AD*
- ID_OUI_FROM_DATABASE=CNET TECHNOLOGY, INC.
+OUI:0C5F35*
+ ID_OUI_FROM_DATABASE=Niagara Video Corporation
 
-OUI:008081*
- ID_OUI_FROM_DATABASE=KENDALL SQUARE RESEARCH CORP.
+OUI:7C3866*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:008019*
- ID_OUI_FROM_DATABASE=DAYNA COMMUNICATIONS, INC.
+OUI:50F14A*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00808B*
- ID_OUI_FROM_DATABASE=DACOLL LIMITED
+OUI:9C1D58*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:008097*
- ID_OUI_FROM_DATABASE=CENTRALP AUTOMATISMES
+OUI:B85001*
+ ID_OUI_FROM_DATABASE=Extreme Networks
 
-OUI:0080FC*
- ID_OUI_FROM_DATABASE=AVATAR CORPORATION
+OUI:000496*
+ ID_OUI_FROM_DATABASE=Extreme Networks
 
-OUI:008076*
- ID_OUI_FROM_DATABASE=MCNC
+OUI:500FF5*
+ ID_OUI_FROM_DATABASE=Tenda Technology Co.,Ltd.Dongguan branch
 
-OUI:008080*
- ID_OUI_FROM_DATABASE=DATAMEDIA CORPORATION
+OUI:1C1EE3*
+ ID_OUI_FROM_DATABASE=Hui Zhou Gaoshengda Technology Co.,LTD
 
-OUI:0000E6*
- ID_OUI_FROM_DATABASE=APTOR PRODUITS DE COMM INDUST
+OUI:F0272D*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:000084*
- ID_OUI_FROM_DATABASE=SUPERNET
+OUI:74C246*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:0000FF*
- ID_OUI_FROM_DATABASE=CAMTEC ELECTRONICS LTD.
+OUI:08B258*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:00007B*
- ID_OUI_FROM_DATABASE=RESEARCH MACHINES
+OUI:F4C4D6*
+ ID_OUI_FROM_DATABASE=Shenzhen Xinfa Electronic Co.,ltd
 
-OUI:000056*
- ID_OUI_FROM_DATABASE=DR. B. STRUCK
+OUI:C03D46*
+ ID_OUI_FROM_DATABASE=Shanghai Sango Network Technology Co.,Ltd
 
-OUI:0000BB*
- ID_OUI_FROM_DATABASE=TRI-DATA
+OUI:E89FEC*
+ ID_OUI_FROM_DATABASE=CHENGDU KT ELECTRONIC HI-TECH CO.,LTD
 
-OUI:080025*
- ID_OUI_FROM_DATABASE=CONTROL DATA
+OUI:D47DFC*
+ ID_OUI_FROM_DATABASE=TECNO MOBILE LIMITED
 
-OUI:080020*
- ID_OUI_FROM_DATABASE=Oracle Corporation
+OUI:BCA042*
+ ID_OUI_FROM_DATABASE=SHANGHAI FLYCO ELECTRICAL APPLIANCE CO.,LTD
 
-OUI:027001*
- ID_OUI_FROM_DATABASE=RACAL-DATACOM
+OUI:14568E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:080006*
- ID_OUI_FROM_DATABASE=SIEMENS AG
+OUI:6837E9*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:08007E*
- ID_OUI_FROM_DATABASE=AMALGAMATED WIRELESS(AUS) LTD
+OUI:8058F8*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:080075*
- ID_OUI_FROM_DATABASE=DANSK DATA ELECTRONIK
+OUI:443708*
+ ID_OUI_FROM_DATABASE=MRV Comunications
 
-OUI:080073*
- ID_OUI_FROM_DATABASE=TECMAR INC.
+OUI:F0D7AA*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:080069*
- ID_OUI_FROM_DATABASE=SILICON GRAPHICS INC.
+OUI:28FF3E*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:080061*
- ID_OUI_FROM_DATABASE=JAROGATE LTD.
+OUI:70F087*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:08005D*
- ID_OUI_FROM_DATABASE=GOULD INC.
+OUI:886B6E*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:08004E*
- ID_OUI_FROM_DATABASE=3COM EUROPE LTD.
+OUI:4C74BF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:08004A*
- ID_OUI_FROM_DATABASE=BANYAN SYSTEMS INC.
+OUI:285767*
+ ID_OUI_FROM_DATABASE=Echostar Technologies Corp
 
-OUI:08004C*
- ID_OUI_FROM_DATABASE=HYDRA COMPUTER SYSTEMS INC.
+OUI:0024AF*
+ ID_OUI_FROM_DATABASE=Echostar Technologies Corp
 
-OUI:080043*
- ID_OUI_FROM_DATABASE=PIXEL COMPUTER INC.
+OUI:04C9D9*
+ ID_OUI_FROM_DATABASE=Echostar Technologies Corp
 
-OUI:08003A*
- ID_OUI_FROM_DATABASE=ORCATECH INC.
+OUI:C49DED*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
 
-OUI:080035*
- ID_OUI_FROM_DATABASE=MICROFIVE CORPORATION
+OUI:98A40E*
+ ID_OUI_FROM_DATABASE=Snap, Inc.
 
-OUI:080036*
- ID_OUI_FROM_DATABASE=INTERGRAPH CORPORATION
+OUI:D0498B*
+ ID_OUI_FROM_DATABASE=ZOOM SERVER
 
-OUI:08002D*
- ID_OUI_FROM_DATABASE=LAN-TEC INC.
+OUI:AC7409*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:000025*
- ID_OUI_FROM_DATABASE=RAMTEK CORP.
+OUI:2C5A0F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00003A*
- ID_OUI_FROM_DATABASE=CHYRON CORPORATION
+OUI:4C8120*
+ ID_OUI_FROM_DATABASE=Taicang T&W Electronics
 
-OUI:000077*
- ID_OUI_FROM_DATABASE=INTERPHASE CORPORATION
+OUI:E8E732*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Enterprise
 
-OUI:000096*
- ID_OUI_FROM_DATABASE=MARCONI ELECTRONICS LTD.
+OUI:00118B*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Enterprise
 
-OUI:000076*
- ID_OUI_FROM_DATABASE=ABEKAS VIDEO SYSTEM
+OUI:00E0B1*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Enterprise
 
-OUI:0000EA*
- ID_OUI_FROM_DATABASE=UPNOD AB
+OUI:E037BF*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
-OUI:000074*
- ID_OUI_FROM_DATABASE=RICOH COMPANY LTD.
+OUI:6854ED*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent
 
-OUI:00006A*
- ID_OUI_FROM_DATABASE=COMPUTER CONSOLES INC.
+OUI:E8DE8E*
+ ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
-OUI:0000C4*
- ID_OUI_FROM_DATABASE=WATERS DIV. OF MILLIPORE
+OUI:B42A0E*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:000006*
- ID_OUI_FROM_DATABASE=XEROX CORPORATION
+OUI:40C8CB*
+ ID_OUI_FROM_DATABASE=AM Telecom co., Ltd.
 
-OUI:0001C8*
- ID_OUI_FROM_DATABASE=THOMAS CONRAD CORP.
+OUI:14A0F8*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00DD0E*
- ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
+OUI:28B448*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:08008D*
- ID_OUI_FROM_DATABASE=XYVISION INC.
+OUI:E442A6*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:080059*
- ID_OUI_FROM_DATABASE=A/S MYCRON
+OUI:6045CB*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:021C7C*
- ID_OUI_FROM_DATABASE=PERQ SYSTEMS CORPORATION
+OUI:84AFEC*
+ ID_OUI_FROM_DATABASE=BUFFALO.INC
 
-OUI:100000*
- ID_OUI_FROM_DATABASE=Private
+OUI:AC202E*
+ ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
 
-OUI:080004*
- ID_OUI_FROM_DATABASE=CROMEMCO INCORPORATED
+OUI:3C5282*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:00DD07*
- ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
+OUI:48A74E*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:00003E*
- ID_OUI_FROM_DATABASE=SIMPACT
+OUI:004066*
+ ID_OUI_FROM_DATABASE=APRESIA Systems Ltd
 
-OUI:04E0C4*
- ID_OUI_FROM_DATABASE=TRIUMPH-ADLER AG
+OUI:B0AA36*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:040AE0*
- ID_OUI_FROM_DATABASE=XMIT AG COMPUTER NETWORKS
+OUI:2C5BB8*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:080016*
- ID_OUI_FROM_DATABASE=BARRISTER INFO SYS CORP
+OUI:1C48CE*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:080012*
- ID_OUI_FROM_DATABASE=BELL ATLANTIC INTEGRATED SYST.
+OUI:9CAC6D*
+ ID_OUI_FROM_DATABASE=Universal Electronics, Inc.
 
-OUI:0001C8*
- ID_OUI_FROM_DATABASE=CONRAD CORP.
+OUI:B03D96*
+ ID_OUI_FROM_DATABASE=Vision Valley FZ LLC
 
-OUI:0000F9*
- ID_OUI_FROM_DATABASE=QUOTRON SYSTEMS INC.
+OUI:B02628*
+ ID_OUI_FROM_DATABASE=Broadcom Limited
 
-OUI:0000BF*
- ID_OUI_FROM_DATABASE=SYMMETRIC COMPUTER SYSTEMS
+OUI:0080E7*
+ ID_OUI_FROM_DATABASE=Leonardo Tactical Systems.
 
-OUI:000085*
- ID_OUI_FROM_DATABASE=CANON INC.
+OUI:44AA50*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:000028*
- ID_OUI_FROM_DATABASE=PRODIGY SYSTEMS CORPORATION
+OUI:E81363*
+ ID_OUI_FROM_DATABASE=Comstock RD, Inc.
 
-OUI:000012*
- ID_OUI_FROM_DATABASE=INFORMATION TECHNOLOGY LIMITED
+OUI:688DB6*
+ ID_OUI_FROM_DATABASE=AETEK INC.
 
-OUI:080085*
- ID_OUI_FROM_DATABASE=ELXSI
+OUI:481063*
+ ID_OUI_FROM_DATABASE=NTT Innovation Institute, Inc.
 
-OUI:00005B*
- ID_OUI_FROM_DATABASE=ELTEC ELEKTRONIK AG
+OUI:24F5AA*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:000054*
- ID_OUI_FROM_DATABASE=Schneider Electric
+OUI:F877B8*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0000A9*
- ID_OUI_FROM_DATABASE=NETWORK SYSTEMS CORP.
+OUI:5056BF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:000059*
- ID_OUI_FROM_DATABASE=Hellige GMBH
+OUI:682737*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:000099*
- ID_OUI_FROM_DATABASE=MTX, INC.
+OUI:D428D5*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:0000E9*
- ID_OUI_FROM_DATABASE=ISICAD, INC.
+OUI:405CFD*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:08003F*
- ID_OUI_FROM_DATABASE=FRED KOSCHARA ENTERPRISES
+OUI:041B6D*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:080002*
- ID_OUI_FROM_DATABASE=BRIDGE COMMUNICATIONS INC.
+OUI:FC6FB7*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:08008B*
- ID_OUI_FROM_DATABASE=PYRAMID TECHNOLOGY CORP.
+OUI:A0C562*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:000002*
- ID_OUI_FROM_DATABASE=XEROX CORPORATION
+OUI:A055DE*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:84F6FA*
- ID_OUI_FROM_DATABASE=Miovision Technologies Incorporated
+OUI:54E2E0*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+
+OUI:28C87A*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:CC3B3E*
- ID_OUI_FROM_DATABASE=Lester Electrical
+OUI:0026D9*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:C05627*
- ID_OUI_FROM_DATABASE=Belkin International Inc.
+OUI:C8AA21*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:88074B*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:2C9E5F*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:4065A3*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:002495*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:00789E*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:002642*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:44E9DD*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:A4ED4E*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:10F681*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+OUI:0024A1*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:B888E3*
- ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
+OUI:001D6B*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:002622*
- ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
+OUI:001E5A*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001EEC*
- ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
+OUI:001DBE*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:DC0EA1*
- ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
+OUI:001371*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:FC4596*
- ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
+OUI:00149A*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:208984*
- ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
+OUI:001A1B*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:247C4C*
- ID_OUI_FROM_DATABASE=Herman Miller
+OUI:0018A4*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:180373*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:002375*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:F8B156*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:001ADB*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:1C4024*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:001F7E*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:F8BC12*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:001C11*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001B5B*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:001CC1*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:002456*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:400D10*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:002351*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:341FE4*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:00253C*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:00D037*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0022A4*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:001DD6*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:C0830A*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:306023*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:D0431E*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:ACB313*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:246E96*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:14ABF0*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:204747*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:0CF893*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:4C7625*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:8461A0*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:B8AC6F*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:E83381*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001EC9*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:44E137*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:E09861*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:0015CE*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:F4F1E1*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:001311*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:74C99A*
- ID_OUI_FROM_DATABASE=Ericsson AB
+OUI:0015A2*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:3C197D*
- ID_OUI_FROM_DATABASE=Ericsson AB
+OUI:001596*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:60BEB5*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:0000CA*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:7845C4*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:601971*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:B4E1C4*
- ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
+OUI:001DD1*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:D86C02*
- ID_OUI_FROM_DATABASE=Huaqin Telecom Technology Co.,Ltd
+OUI:001626*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0019D2*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:00111A*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:7C5CF8*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:00152F*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001E67*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:000B06*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001F3C*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:000F9F*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0022FA*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:0011AE*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001517*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:002040*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:00166F*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:1C1B68*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:A44E31*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:10868C*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:6C8814*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:1005B1*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:F81654*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:7C2634*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:3413E8*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:A0094C*
+ ID_OUI_FROM_DATABASE=CenturyLink
 
-OUI:34E6AD*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:00A38E*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:FCF8AE*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:DCC8F5*
+ ID_OUI_FROM_DATABASE=Shanghai UMEinfo CO.,LTD.
 
-OUI:648099*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:64DFE9*
+ ID_OUI_FROM_DATABASE=ATEME
 
-OUI:002314*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:9097F3*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:4025C2*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:58C5CB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:8CA982*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:ACAFB9*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:D07E35*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:308976*
+ ID_OUI_FROM_DATABASE=DALIAN LAMBA TECHNOLOGY CO.,LTD
 
-OUI:685D43*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:447BBB*
+ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
 
-OUI:90E2BA*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:A4F4C2*
+ ID_OUI_FROM_DATABASE=VNPT TECHNOLOGY
 
-OUI:0026C7*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:C0A5DD*
+ ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
 
-OUI:8086F2*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:1835D1*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:78FF57*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:4C38D8*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:20934D*
- ID_OUI_FROM_DATABASE=FUJIAN STAR-NET COMMUNICATION CO.,LTD
+OUI:DCBE7A*
+ ID_OUI_FROM_DATABASE=Zhejiang Nurotron Biotechnology Co.
 
-OUI:00AA00*
- ID_OUI_FROM_DATABASE=Intel Corporation
+OUI:206BE7*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:6CF37F*
- ID_OUI_FROM_DATABASE=Aruba Networks
+OUI:4857DD*
+ ID_OUI_FROM_DATABASE=Facebook Inc
 
-OUI:605BB4*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:30074D*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:9C0E4A*
- ID_OUI_FROM_DATABASE=Shenzhen Vastking Electronic Co.,Ltd.
+OUI:681DEF*
+ ID_OUI_FROM_DATABASE=Shenzhen CYX Technology Co., Ltd.
 
-OUI:ACE5F0*
- ID_OUI_FROM_DATABASE=Doppler Labs
+OUI:AC203E*
+ ID_OUI_FROM_DATABASE=Wuhan Tianyu Information Industry Co., Ltd.
 
-OUI:00F28B*
+OUI:00A3D1*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:5414FD*
- ID_OUI_FROM_DATABASE=Orbbec 3D Technology International
+OUI:801DAA*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:1C4BD6*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:001B4F*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:94DBC9*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:7052C5*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:40E230*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:848371*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:00006E*
- ID_OUI_FROM_DATABASE=Artisoft Inc.
+OUI:24D921*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:A0F459*
- ID_OUI_FROM_DATABASE=FN-LINK TECHNOLOGY LIMITED
+OUI:A051C6*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:0C6AE6*
- ID_OUI_FROM_DATABASE=Stanley Security Solutions
+OUI:90EC50*
+ ID_OUI_FROM_DATABASE=C.O.B.O. SPA
 
-OUI:E874E6*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:B4475E*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:00247B*
- ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
+OUI:D4EA0E*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:689C5E*
- ID_OUI_FROM_DATABASE=AcSiP Technology Corp.
+OUI:A009ED*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:0012CF*
- ID_OUI_FROM_DATABASE=Accton Technology Corp
+OUI:90FB5B*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:0030D3*
- ID_OUI_FROM_DATABASE=Agilent Technologies, Inc.
+OUI:3C0CDB*
+ ID_OUI_FROM_DATABASE=UNIONMAN TECHNOLOGY CO.,LTD
 
-OUI:38229D*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:C81FEA*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:002233*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:10F681*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:D4D184*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:F01B6C*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:34C3D2*
- ID_OUI_FROM_DATABASE=FN-LINK TECHNOLOGY LIMITED
+OUI:DC1AC5*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:38E3C5*
- ID_OUI_FROM_DATABASE=Taicang T&W Electronics
+OUI:205D47*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:D0E44A*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:9CFBD5*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:9433DD*
- ID_OUI_FROM_DATABASE=Taco Inc
+OUI:886AE3*
+ ID_OUI_FROM_DATABASE=Alpha Networks Inc.
 
-OUI:948815*
- ID_OUI_FROM_DATABASE=Infinique Worldwide Inc
+OUI:9061AE*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:3010B3*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:A4F3E7*
+ ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
-OUI:001802*
- ID_OUI_FROM_DATABASE=Alpha Networks Inc.
+OUI:A0239F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:ECCD6D*
- ID_OUI_FROM_DATABASE=Allied Telesis, Inc.
+OUI:D8DF7A*
+ ID_OUI_FROM_DATABASE=Quest Software, Inc.
 
-OUI:74C246*
- ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+OUI:30B62D*
+ ID_OUI_FROM_DATABASE=Mojo Networks, Inc.
 
-OUI:F0272D*
- ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+OUI:001B17*
+ ID_OUI_FROM_DATABASE=Palo Alto Networks
 
-OUI:00225F*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:9828A6*
+ ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
 
-OUI:983B16*
- ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
+OUI:B0EABC*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
-OUI:402BA1*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:94C691*
+ ID_OUI_FROM_DATABASE=EliteGroup Computer Systems Co., LTD
 
-OUI:0025E7*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:9C6F52*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:D05162*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:A09D86*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
 
-OUI:94CE2C*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:E0CBBC*
+ ID_OUI_FROM_DATABASE=Cisco Meraki
 
-OUI:001A80*
- ID_OUI_FROM_DATABASE=Sony Corporation
+OUI:00D01F*
+ ID_OUI_FROM_DATABASE=Senetas Corporation Ltd
 
-OUI:0024BE*
- ID_OUI_FROM_DATABASE=Sony Corporation
+OUI:A40450*
+ ID_OUI_FROM_DATABASE=nFore Technology Inc.
 
-OUI:001620*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:4CB008*
+ ID_OUI_FROM_DATABASE=Shenzhen Gwelltimes Technology Co.,Ltd
 
-OUI:0012EE*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:58B633*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:20689D*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:D4684D*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:446D57*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:2CE6CC*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:44EE02*
- ID_OUI_FROM_DATABASE=MTI Ltd.
+OUI:8C0C90*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:0026B6*
- ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+OUI:842096*
+ ID_OUI_FROM_DATABASE=SHENZHEN RF-LINK TECHNOLOGY CO.,LTD.
 
-OUI:B4EEB4*
- ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+OUI:3087D9*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:FCB4E6*
- ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+OUI:24792A*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:F05C19*
- ID_OUI_FROM_DATABASE=Aruba Networks
+OUI:589396*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:C43DC7*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:74911A*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:000FB5*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:00227F*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:00095B*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:002482*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:F87394*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:F03E90*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:70AAB2*
- ID_OUI_FROM_DATABASE=BlackBerry RTS
+OUI:EC8CA2*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:0026FF*
- ID_OUI_FROM_DATABASE=BlackBerry RTS
+OUI:30F77F*
+ ID_OUI_FROM_DATABASE=S Mobile Devices Limited
 
-OUI:406F2A*
- ID_OUI_FROM_DATABASE=BlackBerry RTS
+OUI:38E595*
+ ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
 
-OUI:002557*
- ID_OUI_FROM_DATABASE=BlackBerry RTS
+OUI:5C5181*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0024FE*
- ID_OUI_FROM_DATABASE=AVM GmbH
+OUI:389AF6*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:745AAA*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:E0AA96*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:7C1CF1*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:507705*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:C0FFD4*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:C4CB6B*
+ ID_OUI_FROM_DATABASE=Airista Flow, Inc.
 
-OUI:405D82*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:B05508*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:803773*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:008BFC*
+ ID_OUI_FROM_DATABASE=mixi,Inc.
 
-OUI:00264D*
- ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+OUI:2C4053*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:74A528*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:ACDE48*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:30A220*
- ID_OUI_FROM_DATABASE=ARG Telecom
+OUI:00A085*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:783E53*
- ID_OUI_FROM_DATABASE=BSkyB Ltd
+OUI:D09466*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:4CF2BF*
- ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
+OUI:F0EFD2*
+ ID_OUI_FROM_DATABASE=TF PAYMENT SERVICE CO., LTD
 
-OUI:70D931*
- ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
+OUI:30C01B*
+ ID_OUI_FROM_DATABASE=Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd
 
-OUI:00E063*
- ID_OUI_FROM_DATABASE=Cabletron Systems, Inc.
+OUI:647C34*
+ ID_OUI_FROM_DATABASE=Ubee Interactive Co., Limited
 
-OUI:E01D3B*
- ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
+OUI:747D24*
+ ID_OUI_FROM_DATABASE=Phicomm (Shanghai) Co., Ltd.
 
-OUI:D476EA*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:E817FC*
+ ID_OUI_FROM_DATABASE=Fujitsu Cloud Technologies Limited
 
-OUI:0040FB*
- ID_OUI_FROM_DATABASE=CASCADE COMMUNICATIONS
+OUI:001009*
+ ID_OUI_FROM_DATABASE=HORANET
 
-OUI:F05A09*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:6432A8*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:503275*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:78BC1A*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:28CC01*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:E4F004*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:B46293*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:60F677*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:04FE31*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:288CB8*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:845181*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:0C72D9*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:D831CF*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:602E20*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:F8D0BD*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:E472E2*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:FCC734*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:E86819*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:E4B021*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:48BCA6*
+ ID_OUI_FROM_DATABASE=​ASUNG TECHNO CO.,Ltd
 
-OUI:B0EC71*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:8C7CFF*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:3CBBFD*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:C4F57C*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:24F5AA*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:00237F*
+ ID_OUI_FROM_DATABASE=PLANTRONICS, INC.
 
-OUI:2CAE2B*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:00095B*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:C488E5*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:000FB5*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:7C9122*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:006069*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:E8B4C8*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:000CDB*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:18895B*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:803773*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:E0DB10*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:405D82*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:E09971*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:C0FFD4*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:6077E2*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:10DA43*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:680571*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:B03956*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:6C2F2C*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:C43DC7*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:5056BF*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F87394*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:000136*
- ID_OUI_FROM_DATABASE=CyberTAN Technology Inc.
+OUI:401B5F*
+ ID_OUI_FROM_DATABASE=Weifang GoerTek Technology Co.,Ltd.
 
-OUI:F88E85*
- ID_OUI_FROM_DATABASE=Comtrend Corporation
+OUI:AC512C*
+ ID_OUI_FROM_DATABASE=Infinix mobility limited
 
-OUI:300D43*
- ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
+OUI:90B1E0*
+ ID_OUI_FROM_DATABASE=Beijing Nebula Link Technology Co., Ltd
 
-OUI:6C2779*
- ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
+OUI:6C090A*
+ ID_OUI_FROM_DATABASE=GEMATICA SRL
 
-OUI:607EDD*
- ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
+OUI:001439*
+ ID_OUI_FROM_DATABASE=Blonder Tongue Laboratories, Inc
 
-OUI:F88096*
- ID_OUI_FROM_DATABASE=Elsys Equipamentos Eletrônicos Ltda
+OUI:107B44*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:E0B9E5*
- ID_OUI_FROM_DATABASE=Technicolor
+OUI:9C4FCF*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:0CBF15*
- ID_OUI_FROM_DATABASE=Genetec Inc.
+OUI:001BD3*
+ ID_OUI_FROM_DATABASE=Panasonic Corporation AVC Networks Company
 
-OUI:000B5D*
- ID_OUI_FROM_DATABASE=FUJITSU LIMITED
+OUI:00C08F*
+ ID_OUI_FROM_DATABASE=Panasonic Electric Works Co., Ltd.
 
-OUI:F4CAE5*
- ID_OUI_FROM_DATABASE=FREEBOX SAS
+OUI:0008C9*
+ ID_OUI_FROM_DATABASE=TechniSat Digital GmbH Daun
 
-OUI:002100*
- ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
+OUI:20A6CD*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:002147*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:F4F3AA*
+ ID_OUI_FROM_DATABASE=JBL GmbH & Co. KG
 
-OUI:0022AA*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:38CD07*
+ ID_OUI_FROM_DATABASE=Beijing FaceCam Technology Co., Ltd.
 
-OUI:0022D7*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:B009DA*
+ ID_OUI_FROM_DATABASE=Ring Solutions
 
-OUI:002331*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:444AB0*
+ ID_OUI_FROM_DATABASE=Zhejiang Moorgen Intelligence Technology Co., Ltd
 
-OUI:00241E*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:844167*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:78A2A0*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:B4F61C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:001B7A*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:ECFA03*
+ ID_OUI_FROM_DATABASE=FCA
 
-OUI:40F407*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:78E103*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:B8AE6E*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:90324B*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:60A8FE*
- ID_OUI_FROM_DATABASE=Nokia
+OUI:78A6E1*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:546751*
- ID_OUI_FROM_DATABASE=Compal Broadband Networks, Inc.
+OUI:F4D7B2*
+ ID_OUI_FROM_DATABASE=LGS Innovations, LLC
 
-OUI:84BA3B*
- ID_OUI_FROM_DATABASE=CANON INC.
+OUI:20040F*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:0018C5*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:2C7360*
+ ID_OUI_FROM_DATABASE=Earda Technologies co Ltd
 
-OUI:80501B*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:048B42*
+ ID_OUI_FROM_DATABASE=Skspruce Technologies
 
-OUI:347E39*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:C421C8*
+ ID_OUI_FROM_DATABASE=KYOCERA CORPORATION
 
-OUI:A87E33*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:9C63ED*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:00247D*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:002692*
+ ID_OUI_FROM_DATABASE=Mitsubishi Electric Corporation
 
-OUI:001BAF*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:F03D03*
+ ID_OUI_FROM_DATABASE=TECNO MOBILE LIMITED
 
-OUI:001C35*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:006088*
+ ID_OUI_FROM_DATABASE=Analog Devices, Inc.
 
-OUI:001CD4*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:084ACF*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:001979*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:1CDDEA*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:9C1874*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:ECEBB8*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:0021FC*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:5CE8B7*
+ ID_OUI_FROM_DATABASE=Oraimo Technology Limited
 
-OUI:001F5D*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:D89EF3*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:0025CF*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:CC66B2*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:0025D0*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:C0742B*
+ ID_OUI_FROM_DATABASE=SHENZHEN XUNLONG SOFTWARE CO.,LIMITED
 
-OUI:001FDE*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:D8AFF1*
+ ID_OUI_FROM_DATABASE=Panasonic Appliances Company
 
-OUI:907282*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:7086C1*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:006CFD*
- ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
+OUI:A072E4*
+ ID_OUI_FROM_DATABASE=NJ SYSTEM CO.,LTD
 
-OUI:1C234F*
- ID_OUI_FROM_DATABASE=EDMI  Europe Ltd
+OUI:A8E824*
+ ID_OUI_FROM_DATABASE=INIM ELECTRONICS S.R.L.
 
-OUI:A444D1*
- ID_OUI_FROM_DATABASE=Wingtech Group (HongKong)Limited
+OUI:6CB749*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:1C9E46*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:A0FE61*
+ ID_OUI_FROM_DATABASE=Vivint Wireless Inc.
 
-OUI:005058*
- ID_OUI_FROM_DATABASE=Sangoma Technologies
+OUI:601803*
+ ID_OUI_FROM_DATABASE=Daikin Air-conditioning (Shanghai) Co., Ltd.
 
-OUI:3482DE*
- ID_OUI_FROM_DATABASE=Kiio Inc
+OUI:08152F*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co., Ltd. ARTIK
 
-OUI:0008F6*
- ID_OUI_FROM_DATABASE=Sumitomo Electric Industries,Ltd
+OUI:408BF6*
+ ID_OUI_FROM_DATABASE=Shenzhen TCL New Technology Co., Ltd
 
-OUI:00005F*
- ID_OUI_FROM_DATABASE=Sumitomo Electric Industries,Ltd
+OUI:F46E24*
+ ID_OUI_FROM_DATABASE=NEC Personal Computers, Ltd.
 
-OUI:A0C589*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:888279*
+ ID_OUI_FROM_DATABASE=Shenzhen RB-LINK Intelligent Technology Co.Ltd
 
-OUI:74BFB7*
- ID_OUI_FROM_DATABASE=Nusoft Corporation
+OUI:78321B*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:50DA00*
- ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+OUI:EC51BC*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:9C2A83*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F079E8*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:E45D75*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:741E93*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:3CBEE1*
- ID_OUI_FROM_DATABASE=NIKON CORPORATION
+OUI:18A3E8*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:047E4A*
- ID_OUI_FROM_DATABASE=moobox CO., Ltd.
+OUI:60B617*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:F01B6C*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+OUI:CC500A*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:E0C767*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:A8E705*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:2C09CB*
- ID_OUI_FROM_DATABASE=COBS AB
+OUI:74C9A3*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:60ACC8*
- ID_OUI_FROM_DATABASE=KunTeng Inc.
+OUI:A013CB*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:0404EA*
- ID_OUI_FROM_DATABASE=Valens Semiconductor Ltd.
+OUI:20896F*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:800DD7*
- ID_OUI_FROM_DATABASE=Latticework, Inc
+OUI:D8A534*
+ ID_OUI_FROM_DATABASE=Spectronix Corporation
 
-OUI:402E28*
- ID_OUI_FROM_DATABASE=MiXTelematics
+OUI:583879*
+ ID_OUI_FROM_DATABASE=RICOH COMPANY, LTD.
 
-OUI:18C501*
- ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
+OUI:94282E*
+ ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
 
-OUI:546D52*
- ID_OUI_FROM_DATABASE=TOPVIEW OPTRONICS CORP.
+OUI:887598*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:CCB3AB*
- ID_OUI_FROM_DATABASE=shenzhen Biocare Bio-Medical Equipment Co.,Ltd.
+OUI:D0B128*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:E4B318*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:FCEEE6*
+ ID_OUI_FROM_DATABASE=FORMIKE ELECTRONIC CO., LTD
 
-OUI:00C88B*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D843ED*
+ ID_OUI_FROM_DATABASE=Suzuken
 
-OUI:A85EE4*
- ID_OUI_FROM_DATABASE=12Sided Technology, LLC
+OUI:2C431A*
+ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
 
-OUI:000CC1*
- ID_OUI_FROM_DATABASE=Eaton Corporation
+OUI:A8D3C8*
+ ID_OUI_FROM_DATABASE=Topcon Electronics GmbH & Co. KG
 
-OUI:0090F9*
- ID_OUI_FROM_DATABASE=Imagine Communications
+OUI:389F5A*
+ ID_OUI_FROM_DATABASE=C-Kur TV Inc.
 
-OUI:04C103*
- ID_OUI_FROM_DATABASE=Clover Network, Inc.
+OUI:24B209*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:F877B8*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:24E124*
+ ID_OUI_FROM_DATABASE=Xiamen Ursaconn Technology Co. , Ltd.
 
-OUI:1C553A*
- ID_OUI_FROM_DATABASE=QianGua Corp.
+OUI:DC68EB*
+ ID_OUI_FROM_DATABASE=Nintendo Co.,Ltd
 
-OUI:E4A7A0*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:9441C1*
+ ID_OUI_FROM_DATABASE=Mini-Cam Limited
 
-OUI:E4FAED*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:E8D819*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:789682*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:0008FA*
+ ID_OUI_FROM_DATABASE=KEB Automation KG
 
-OUI:F02745*
- ID_OUI_FROM_DATABASE=F-Secure Corporation
+OUI:18396E*
+ ID_OUI_FROM_DATABASE=SUNSEA TELECOMMUNICATIONS CO.,LTD.
 
-OUI:54D0B4*
- ID_OUI_FROM_DATABASE=Xiamen Four-Faith Communication Technology Co.,Ltd
+OUI:E8DF70*
+ ID_OUI_FROM_DATABASE=AVM Audiovisuelles Marketing und Computersysteme GmbH
 
-OUI:D017C2*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:5846E1*
+ ID_OUI_FROM_DATABASE=Baxter International Inc
 
-OUI:10DA43*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:00D0BD*
+ ID_OUI_FROM_DATABASE=Lattice Semiconductor Corp. (LPA)
 
-OUI:001625*
- ID_OUI_FROM_DATABASE=Impinj, Inc.
+OUI:F08261*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:60EE5C*
- ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
+OUI:D084B0*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:58D67A*
- ID_OUI_FROM_DATABASE=TCPlink
+OUI:00FEC8*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00A0DE*
- ID_OUI_FROM_DATABASE=YAMAHA CORPORATION
+OUI:EC2280*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:081F71*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:047863*
+ ID_OUI_FROM_DATABASE=Shanghai MXCHIP Information Technology Co., Ltd.
 
-OUI:2C2D48*
- ID_OUI_FROM_DATABASE=bct electronic GesmbH
+OUI:24BA13*
+ ID_OUI_FROM_DATABASE=RISO KAGAKU CORPORATION
 
-OUI:E4A471*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:24DA11*
+ ID_OUI_FROM_DATABASE=NO NDA Inc
 
-OUI:60B617*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:70CA4D*
+ ID_OUI_FROM_DATABASE=Shenzhen lnovance Technology Co.,Ltd.
 
-OUI:18A3E8*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:DCC0EB*
+ ID_OUI_FROM_DATABASE=ASSA ABLOY CÔTE PICARDE
 
-OUI:741E93*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:001735*
+ ID_OUI_FROM_DATABASE=Intel Wireless Network Group
 
-OUI:00A0F4*
- ID_OUI_FROM_DATABASE=GE
+OUI:9CDFB1*
+ ID_OUI_FROM_DATABASE=Shenzhen Crave Communication Co., LTD
 
-OUI:00CAE5*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:5CF938*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:4883C7*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:3871DE*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:7050AF*
- ID_OUI_FROM_DATABASE=BSkyB Ltd
+OUI:BC5436*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:F4EF9E*
- ID_OUI_FROM_DATABASE=SGSG SCIENCE & TECHNOLOGY CO. LTD
+OUI:0CC731*
+ ID_OUI_FROM_DATABASE=Currant, Inc.
 
-OUI:DC9C9F*
- ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
+OUI:00142F*
+ ID_OUI_FROM_DATABASE=Savvius
 
-OUI:0CBF3F*
- ID_OUI_FROM_DATABASE=Shenzhen Lencotion Technology Co.,Ltd
+OUI:2CDDA3*
+ ID_OUI_FROM_DATABASE=Point Grey Research Inc.
 
-OUI:84FEDC*
- ID_OUI_FROM_DATABASE=Borqs Beijing Ltd.
+OUI:24FD5B*
+ ID_OUI_FROM_DATABASE=SmartThings, Inc.
 
-OUI:F03E90*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:2876CD*
+ ID_OUI_FROM_DATABASE=Funshion Online Technologies Co.,Ltd
 
-OUI:D8D723*
- ID_OUI_FROM_DATABASE=IDS, Inc
+OUI:F4F5D8*
+ ID_OUI_FROM_DATABASE=Google, Inc.
 
-OUI:703A0E*
- ID_OUI_FROM_DATABASE=Aruba Networks
+OUI:F4F5E8*
+ ID_OUI_FROM_DATABASE=Google, Inc.
 
-OUI:7054D2*
- ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
+OUI:F88FCA*
+ ID_OUI_FROM_DATABASE=Google, Inc.
 
-OUI:7C0507*
- ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
+OUI:BCD1D3*
+ ID_OUI_FROM_DATABASE=Shenzhen TINNO Mobile Technology Corp.
 
-OUI:C07CD1*
- ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
+OUI:BC4434*
+ ID_OUI_FROM_DATABASE=Shenzhen TINNO Mobile Technology Corp.
 
-OUI:94DBDA*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:0041D2*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:384C4F*
+OUI:4CFB45*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:E4A8B6*
+OUI:A4BA76*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:244C07*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:78E3B5*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:E840F2*
- ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
+OUI:984BE1*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:F0D1B8*
- ID_OUI_FROM_DATABASE=LEDVANCE
+OUI:68B599*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:60B387*
- ID_OUI_FROM_DATABASE=Synergics Technologies GmbH
+OUI:14D64D*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:7085C2*
- ID_OUI_FROM_DATABASE=ASRock Incorporation
+OUI:C8BE19*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:C825E1*
- ID_OUI_FROM_DATABASE=Lemobile Information Technology (Beijing) Co., Ltd
+OUI:BCF685*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:0022B1*
- ID_OUI_FROM_DATABASE=Elbit Systems Ltd.
+OUI:CCB255*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:0000B4*
- ID_OUI_FROM_DATABASE=Edimax Technology Co. Ltd.
+OUI:84C9B2*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:00065F*
- ID_OUI_FROM_DATABASE=ECI Telecom Ltd.
+OUI:DCD321*
+ ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
 
-OUI:001F45*
- ID_OUI_FROM_DATABASE=Enterasys
+OUI:CC4EEC*
+ ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
 
-OUI:0090FA*
- ID_OUI_FROM_DATABASE=Emulex Corporation
+OUI:DC330D*
+ ID_OUI_FROM_DATABASE=Qingdao Haier Telecom Co.,Ltd
 
-OUI:50C971*
- ID_OUI_FROM_DATABASE=GN Netcom A/S
+OUI:0080E1*
+ ID_OUI_FROM_DATABASE=STMicroelectronics SRL
 
-OUI:001D82*
- ID_OUI_FROM_DATABASE=GN Netcom A/S
+OUI:58DC6D*
+ ID_OUI_FROM_DATABASE=Exceptional Innovation, Inc.
 
-OUI:001317*
- ID_OUI_FROM_DATABASE=GN Netcom A/S
+OUI:00092D*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:749781*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:F8DB7F*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:B4B15A*
- ID_OUI_FROM_DATABASE=Siemens AG Energy Management Division
+OUI:E899C4*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:A8D828*
- ID_OUI_FROM_DATABASE=Ascensia Diabetes Care
+OUI:7CB15D*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:FCBC9C*
- ID_OUI_FROM_DATABASE=Vimar Spa
+OUI:18686A*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:149ECF*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:0C0535*
+ ID_OUI_FROM_DATABASE=Juniper Systems
 
-OUI:AC620D*
- ID_OUI_FROM_DATABASE=Jabil Circuit(Wuxi) Co.,Ltd
+OUI:8CF228*
+ ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
 
-OUI:008CFA*
- ID_OUI_FROM_DATABASE=INVENTEC Corporation
+OUI:78F882*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:0008B9*
- ID_OUI_FROM_DATABASE=Kaonmedia CO., LTD.
+OUI:8851FB*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:C83F26*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:AC162D*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:00E0E6*
- ID_OUI_FROM_DATABASE=INCAA Computers
+OUI:A0B3CC*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:5C5EAB*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:E4115B*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:7819F7*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:C8CBB8*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:2C2172*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:9457A5*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:88E0F3*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:0001E7*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:4C9614*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:080009*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:3C8AB0*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:0080A0*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:B0C69A*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:D48564*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:009069*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:3C4A92*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:204E71*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:780AC7*
+ ID_OUI_FROM_DATABASE=Baofeng TV Co., Ltd.
 
-OUI:F4B52F*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:001D73*
+ ID_OUI_FROM_DATABASE=BUFFALO.INC
 
-OUI:88A25E*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:001601*
+ ID_OUI_FROM_DATABASE=BUFFALO.INC
 
-OUI:001BC0*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:106F3F*
+ ID_OUI_FROM_DATABASE=BUFFALO.INC
 
-OUI:F49EEF*
- ID_OUI_FROM_DATABASE=Taicang T&W Electronics
+OUI:8857EE*
+ ID_OUI_FROM_DATABASE=BUFFALO.INC
+
+OUI:009C02*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:F4911E*
- ID_OUI_FROM_DATABASE=ZHUHAI EWPE INFORMATION TECHNOLOGY INC
+OUI:78E7D1*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:94FE22*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:001B78*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:F823B2*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:001E0B*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:DCD916*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:2C6E85*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:002552*
- ID_OUI_FROM_DATABASE=VXi Corporation
+OUI:00D0B7*
+ ID_OUI_FROM_DATABASE=Intel Corporation
 
-OUI:006CBC*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0002B3*
+ ID_OUI_FROM_DATABASE=Intel Corporation
 
-OUI:DC3752*
- ID_OUI_FROM_DATABASE=GE
+OUI:001111*
+ ID_OUI_FROM_DATABASE=Intel Corporation
 
-OUI:B4D5BD*
+OUI:001320*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:7CB0C2*
+OUI:0012F0*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:98AA3C*
- ID_OUI_FROM_DATABASE=Will i-tech Co., Ltd.
-
-OUI:449F7F*
- ID_OUI_FROM_DATABASE=DataCore Software Corporation
+OUI:9049FA*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:0011FC*
- ID_OUI_FROM_DATABASE=HARTING Electronics GmbH
+OUI:C8348E*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:5CDD70*
- ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+OUI:00508B*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:24BF74*
- ID_OUI_FROM_DATABASE=Private
+OUI:784859*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:B8E779*
- ID_OUI_FROM_DATABASE=9Solutions Oy
+OUI:1458D0*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:240A11*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:5065F3*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:C84544*
- ID_OUI_FROM_DATABASE=Asia Pacific CIS (Wuxi) Co, Ltd
+OUI:A0481C*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:E8A7F2*
- ID_OUI_FROM_DATABASE=sTraffic
+OUI:A01D48*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:D8209F*
- ID_OUI_FROM_DATABASE=Cubro Acronet GesmbH
+OUI:94B2CC*
+ ID_OUI_FROM_DATABASE=PIONEER CORPORATION
 
-OUI:CC500A*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:887F03*
+ ID_OUI_FROM_DATABASE=Comper Technology Investment Limited
 
-OUI:A860B6*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:E06066*
+ ID_OUI_FROM_DATABASE=Sercomm Corporation
 
-OUI:24F094*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:0019E0*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:90B0ED*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:0023CD*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:C4B301*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:002719*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:E05F45*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:40169F*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:483B38*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:940C6D*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:E47B3F*
- ID_OUI_FROM_DATABASE=BEIJING CO-CLOUD TECHNOLOGY LTD.
+OUI:74EA3A*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:A0415E*
- ID_OUI_FROM_DATABASE=Opsens Solution Inc.
+OUI:90F652*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:1C6E76*
- ID_OUI_FROM_DATABASE=Quarion Technology Inc
+OUI:10FEED*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:000AAB*
- ID_OUI_FROM_DATABASE=Toyota Technical Development Corporation
+OUI:C46E1F*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:44D1FA*
- ID_OUI_FROM_DATABASE=Shenzhen Yunlink Technology Co., Ltd
+OUI:50FA84*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:08C021*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:F483CD*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:48435A*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:882593*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:9CE374*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:808917*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:6C0EE6*
- ID_OUI_FROM_DATABASE=Chengdu Xiyida Electronic Technology Co,.Ltd
+OUI:5C899A*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:78FFCA*
- ID_OUI_FROM_DATABASE=TECNO MOBILE LIMITED
+OUI:1C994C*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:F03EBF*
- ID_OUI_FROM_DATABASE=GOGORO TAIWAN LIMITED
+OUI:F02765*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:50AB3E*
- ID_OUI_FROM_DATABASE=Qibixx AG
+OUI:20A783*
+ ID_OUI_FROM_DATABASE=miControl GmbH
 
-OUI:A8BB50*
- ID_OUI_FROM_DATABASE=WiZ IoT Company Limited
+OUI:005053*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:005F86*
+OUI:00500F*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:E46251*
- ID_OUI_FROM_DATABASE=HAO CHENG GROUP LIMITED
+OUI:D842AC*
+ ID_OUI_FROM_DATABASE=Shanghai Feixun Communication Co.,Ltd.
 
-OUI:8850DD*
- ID_OUI_FROM_DATABASE=Infiniband Trade Association
+OUI:34CDBE*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:DC7834*
- ID_OUI_FROM_DATABASE=LOGICOM SA
+OUI:D46AA8*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:54F201*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:5439DF*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:A06090*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:4846FB*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:3876CA*
- ID_OUI_FROM_DATABASE=Shenzhen Smart Intelligent Technology Co.Ltd
+OUI:200BC7*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:D0577B*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:104780*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:B824F0*
- ID_OUI_FROM_DATABASE=SOYO Technology Development Co., Ltd.
+OUI:88308A*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:B456B9*
- ID_OUI_FROM_DATABASE=Teraspek Technologies Co.,Ltd
+OUI:44A7CF*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:A009ED*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:0013E0*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:68B35E*
- ID_OUI_FROM_DATABASE=Shenzhen Neostra Technology Co.Ltd
+OUI:344B50*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:24E271*
- ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
+OUI:FCC897*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:BC6010*
- ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
+OUI:9CD24B*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:AC3743*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:C864C7*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:603197*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:D0154A*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:0019CB*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:88E3AB*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:FCF528*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:00664B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:588BF3*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:68A0F6*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:EC43F6*
- ID_OUI_FROM_DATABASE=5420
+OUI:5CF96A*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:D8B02E*
- ID_OUI_FROM_DATABASE=Guangzhou Zonerich Business Machine Co., LTD.
+OUI:B43052*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:DC1AC5*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+OUI:88CEFA*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:849D64*
- ID_OUI_FROM_DATABASE=SMC Corporation
+OUI:582AF7*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:A020A6*
- ID_OUI_FROM_DATABASE=Espressif Inc.
+OUI:F48E92*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:88F7C7*
- ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+OUI:40CBA8*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:08952A*
- ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+OUI:087A4C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:C4BB4C*
- ID_OUI_FROM_DATABASE=Zebra Information Tech Co. Ltd
+OUI:D46E5C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:8C04FF*
- ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+OUI:2469A5*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:104FA8*
- ID_OUI_FROM_DATABASE=Sony Corporation
+OUI:C8D15E*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:6C25B9*
- ID_OUI_FROM_DATABASE=BBK EDUCATIONAL ELECTRONICS CORP.,LTD.
+OUI:F83DFF*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:486B2C*
- ID_OUI_FROM_DATABASE=BBK EDUCATIONAL ELECTRONICS CORP.,LTD.
+OUI:308730*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00001F*
- ID_OUI_FROM_DATABASE=Telco Systems, Inc.
+OUI:002568*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0016D3*
- ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
+OUI:30D17E*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001F16*
- ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
+OUI:9C28EF*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:BC307E*
- ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
+OUI:7C6097*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00C0AB*
- ID_OUI_FROM_DATABASE=Telco Systems, Inc.
+OUI:60DE44*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0010CA*
- ID_OUI_FROM_DATABASE=Telco Systems, Inc.
+OUI:3400A3*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0C2576*
- ID_OUI_FROM_DATABASE=LONGCHEER TELECOMMUNICATION LIMITED
+OUI:643E8C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0007A6*
- ID_OUI_FROM_DATABASE=Leviton Manufacturing Co., Inc.
+OUI:00C610*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:208756*
- ID_OUI_FROM_DATABASE=SIEMENS AG
+OUI:70DEE2*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:B08900*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:182032*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:640DCE*
- ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
+OUI:6CC26B*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00A085*
- ID_OUI_FROM_DATABASE=Private
+OUI:1040F3*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:ACDE48*
- ID_OUI_FROM_DATABASE=Private
+OUI:FC253F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:6063F9*
- ID_OUI_FROM_DATABASE=Ciholas, Inc.
+OUI:183451*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:F0421C*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:C0847A*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:C0E42D*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:64200C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:18D6C7*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:74E1B6*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:B8BB23*
- ID_OUI_FROM_DATABASE=Guangdong Nufront CSC Co., Ltd
+OUI:0C771A*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:EC26FB*
- ID_OUI_FROM_DATABASE=TECC CO.,LTD.
+OUI:00F4B9*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:10683F*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:C8334B*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:A039F7*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:B8F6B1*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:64BC0C*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:C09F42*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0090CC*
- ID_OUI_FROM_DATABASE=PLANEX COMMUNICATIONS INC.
+OUI:189EFC*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:E09DB8*
- ID_OUI_FROM_DATABASE=PLANEX COMMUNICATIONS INC.
+OUI:6C3E6D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:64899A*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:0016FE*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
 
-OUI:58A2B5*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:0498F3*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
 
-OUI:74A722*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:38C096*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
 
-OUI:001F6B*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:E0750A*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
 
-OUI:903AE6*
- ID_OUI_FROM_DATABASE=PARROT SA
+OUI:B05947*
+ ID_OUI_FROM_DATABASE=Shenzhen Qihu Intelligent Technology Company Limited
 
-OUI:00E00F*
- ID_OUI_FROM_DATABASE=Shanghai Baud Data Communication Co.,Ltd.
+OUI:00E04F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:3C404F*
- ID_OUI_FROM_DATABASE=GUANGDONG PISEN ELECTRONICS CO.,LTD
+OUI:001011*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00233E*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent IPD
+OUI:0010F6*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:6CBEE9*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent IPD
+OUI:80E01D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0080F7*
- ID_OUI_FROM_DATABASE=Zenith Electronics Corporation
+OUI:80E86F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00C095*
- ID_OUI_FROM_DATABASE=ZNYX Networks, Inc.
+OUI:E4AA5D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:60EB69*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+OUI:B0AA77*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:C80AA9*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+OUI:78BAF9*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00238B*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+OUI:0016B6*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
-OUI:0007BA*
- ID_OUI_FROM_DATABASE=UTStarcom Inc
+OUI:0018F8*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
-OUI:4439C4*
- ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
+OUI:00252E*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:70F395*
- ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
+OUI:A4A24A*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:001E37*
- ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
+OUI:602AD0*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:002713*
- ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
+OUI:001BFB*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
 
-OUI:002186*
- ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
+OUI:00E08F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:8CFDF0*
- ID_OUI_FROM_DATABASE=Qualcomm Inc.
+OUI:203A07*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000031*
- ID_OUI_FROM_DATABASE=QPSX COMMUNICATIONS, LTD.
+OUI:34A84E*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000E7B*
- ID_OUI_FROM_DATABASE=Toshiba
+OUI:E4D3F1*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:B86B23*
- ID_OUI_FROM_DATABASE=Toshiba
+OUI:1CE6C7*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000C29*
- ID_OUI_FROM_DATABASE=VMware, Inc.
+OUI:E02F6D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:005056*
- ID_OUI_FROM_DATABASE=VMware, Inc.
+OUI:8478AC*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001C4D*
- ID_OUI_FROM_DATABASE=Aplix IP Holdings Corporation
+OUI:4403A7*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:D0052A*
- ID_OUI_FROM_DATABASE=Arcadyan Corporation
+OUI:6886A7*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:F485C6*
- ID_OUI_FROM_DATABASE=FDT Technologies
+OUI:B4E9B0*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:BC60A7*
- ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
+OUI:000832*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:08D833*
- ID_OUI_FROM_DATABASE=Shenzhen RF Technology Co., Ltd
+OUI:B0FAEB*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:94D469*
+OUI:500604*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:385610*
- ID_OUI_FROM_DATABASE=CANDY HOUSE, Inc.
+OUI:70105C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:20F543*
- ID_OUI_FROM_DATABASE=Hui Zhou Gaoshengda Technology Co.,LTD
+OUI:7CFADF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:685388*
- ID_OUI_FROM_DATABASE=P&S Technology
+OUI:101C0C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:001124*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:001D4F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:54A619*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
+OUI:001E52*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:1880F5*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
+OUI:001F5B*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:24DBED*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:001FF3*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:AC3613*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:0021E9*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:1449E0*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
+OUI:00236C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:C0BDD1*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
+OUI:002500*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:E8508B*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
+OUI:60FB42*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:F025B7*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
+OUI:14DAE9*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:C8BA94*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
+OUI:3C08F6*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:EC1F72*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
+OUI:D072DC*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:9852B1*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:28C7CE*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:1489FD*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:6CFA89*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:CCFE3C*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:58F39C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:789ED0*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:346288*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:E440E2*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:881DFC*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:1CAF05*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F81EDF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:E492FB*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:90840D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:247F20*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:D8A25E*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0073E0*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:C8BCC8*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:BC4486*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:28E7CF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:380B40*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:D89E3F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:8C0D76*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:040CCE*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:005A13*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:A4D1D2*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:002490*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:406C8F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0023D7*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:C067AF*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:FCA13E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:64E950*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:A00798*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:189C5D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:945103*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:000EA6*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:C819F7*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:0013D4*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:2C4401*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:002618*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:08C6B3*
- ID_OUI_FROM_DATABASE=QTECH LLC
+OUI:00248C*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:64DAA0*
- ID_OUI_FROM_DATABASE=Robert Bosch Smart Home GmbH
+OUI:0050A2*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:14B837*
- ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
+OUI:0050F0*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:8056F2*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:00905F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:70188B*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:00902B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:3C77E6*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:00100B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0C84DC*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:00100D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:844BF5*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:001014*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:E006E6*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:649ABE*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:60F494*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:94E96A*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:A41731*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:AC293A*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:C0143D*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:10417F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:642737*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:7014A6*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:60D819*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:A8667F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:6474F6*
- ID_OUI_FROM_DATABASE=Shooter Detection Systems
+OUI:D02598*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:604BAA*
- ID_OUI_FROM_DATABASE=Private
+OUI:CC29F5*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:CC7314*
- ID_OUI_FROM_DATABASE=HONG KONG WHEATEK TECHNOLOGY LIMITED
+OUI:6C709F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:C0CB38*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:0C3E9F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:98E7F4*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:34E2FD*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:D42C44*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:609217*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:D842E2*
- ID_OUI_FROM_DATABASE=Canary Connect, Inc.
+OUI:8863DF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:500959*
- ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+OUI:80E650*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:143365*
- ID_OUI_FROM_DATABASE=TEM Mobile Limited
+OUI:006171*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:205D47*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+OUI:90FD61*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:C0F945*
- ID_OUI_FROM_DATABASE=Toshiba Toko Meter Systems Co., LTD.
+OUI:5C97F3*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:ACAB2E*
- ID_OUI_FROM_DATABASE=Beijing LasNubes Technology Co., Ltd.
+OUI:6C4008*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:10E878*
- ID_OUI_FROM_DATABASE=Nokia
+OUI:24A074*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:48F7F1*
- ID_OUI_FROM_DATABASE=Nokia
+OUI:F02475*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:4CC94F*
- ID_OUI_FROM_DATABASE=Nokia
+OUI:20A2E4*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:1CEA1B*
- ID_OUI_FROM_DATABASE=Nokia
+OUI:5CF5DA*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:B4F81E*
- ID_OUI_FROM_DATABASE=Kinova
+OUI:D4B8FF*
+ ID_OUI_FROM_DATABASE=Home Control Singapore Pte Ltd
 
-OUI:A46011*
- ID_OUI_FROM_DATABASE=VeriFone Inc.
+OUI:28E14C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:28CA09*
- ID_OUI_FROM_DATABASE=ThyssenKrupp Elevators (Shanghai) Co.,Ltd
+OUI:54E43A*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:E0B94D*
- ID_OUI_FROM_DATABASE=SHENZHEN BILIAN ELECTRONIC CO.,LTD
+OUI:C8E0EB*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:D8380D*
- ID_OUI_FROM_DATABASE=SHENZHEN IP-COM Network Co.,Ltd
+OUI:A88808*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:A4C64F*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:907240*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:C83DD4*
- ID_OUI_FROM_DATABASE=CyberTAN Technology Inc.
+OUI:0C4DE9*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:487B6B*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:D89695*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:3087D9*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:0C3021*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:A8E705*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:F0F61C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:9C62AB*
- ID_OUI_FROM_DATABASE=Sumavision Technologies Co.,Ltd
+OUI:B03495*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:487A55*
- ID_OUI_FROM_DATABASE=ALE International
+OUI:848E0C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:000435*
- ID_OUI_FROM_DATABASE=InfiNet LLC
+OUI:8C2DAA*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:BC39D9*
- ID_OUI_FROM_DATABASE=Z-TEC
+OUI:444C0C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:88E87F*
+OUI:84FCFE*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:B853AC*
+OUI:E48B7F*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:B04BBF*
- ID_OUI_FROM_DATABASE=PT HAN SUNG ELECTORONICS INDONESIA
+OUI:5C969D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0060D6*
- ID_OUI_FROM_DATABASE=NovAtel Inc.
+OUI:A8FAD8*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:2C3361*
+OUI:949426*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:78B84B*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+OUI:E0F5C6*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:40F420*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+OUI:AC6462*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:9C6121*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+OUI:C08488*
+ ID_OUI_FROM_DATABASE=Finis Inc
 
-OUI:8C8ABB*
- ID_OUI_FROM_DATABASE=Beijing Orient View Technology Co., Ltd.
+OUI:68E8EB*
+ ID_OUI_FROM_DATABASE=Linktel Technologies Co.,Ltd
 
-OUI:88366C*
- ID_OUI_FROM_DATABASE=EFM Networks
+OUI:20C3A4*
+ ID_OUI_FROM_DATABASE=RetailNext
 
-OUI:F074E4*
- ID_OUI_FROM_DATABASE=Thundercomm Technology Co., Ltd
+OUI:780541*
+ ID_OUI_FROM_DATABASE=Queclink Wireless Solutions Co., Ltd
 
-OUI:A0722C*
- ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
+OUI:C02DEE*
+ ID_OUI_FROM_DATABASE=Cuff
 
-OUI:FCECDA*
- ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
+OUI:54A3FA*
+ ID_OUI_FROM_DATABASE=BQT Solutions (Australia)Pty Ltd
 
-OUI:E07C13*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:9023EC*
+ ID_OUI_FROM_DATABASE=Availink, Inc.
 
-OUI:58696C*
- ID_OUI_FROM_DATABASE=Ruijie Networks Co.,LTD.
+OUI:3891D5*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:001972*
- ID_OUI_FROM_DATABASE=Plexus (Xiamen) Co.,ltd.
+OUI:90DFFB*
+ ID_OUI_FROM_DATABASE=HOMERIDER SYSTEMS
 
-OUI:6488FF*
- ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
+OUI:3C831E*
+ ID_OUI_FROM_DATABASE=CKD Corporation
 
-OUI:005979*
- ID_OUI_FROM_DATABASE=Networked Energy Services
+OUI:381C23*
+ ID_OUI_FROM_DATABASE=Hilan Technology CO.,LTD
 
-OUI:000997*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:E03676*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:000E62*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:3CB72B*
+ ID_OUI_FROM_DATABASE=PLUMgrid Inc
 
-OUI:000EC0*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:243184*
+ ID_OUI_FROM_DATABASE=SHARP Corporation
 
-OUI:000FCD*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:24DA9B*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:0004DC*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:3052CB*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:02E6D3*
- ID_OUI_FROM_DATABASE=NIXDORF COMPUTER CORP.
+OUI:B8B2EB*
+ ID_OUI_FROM_DATABASE=Googol Technology (HK) Limited
 
-OUI:0016B9*
- ID_OUI_FROM_DATABASE=ProCurve Networking by HP
+OUI:C40049*
+ ID_OUI_FROM_DATABASE=Kamama
 
-OUI:0024A8*
- ID_OUI_FROM_DATABASE=ProCurve Networking by HP
+OUI:50A9DE*
+ ID_OUI_FROM_DATABASE=Smartcom - Bulgaria AD
 
-OUI:CC3ADF*
- ID_OUI_FROM_DATABASE=Private
+OUI:E8DED6*
+ ID_OUI_FROM_DATABASE=Intrising Networks, Inc.
 
-OUI:141F78*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:B844D9*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:006F64*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:DC2B2A*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:DC6672*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:8C10D4*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:0025C3*
- ID_OUI_FROM_DATABASE=21168
+OUI:089B4B*
+ ID_OUI_FROM_DATABASE=iKuai Networks
 
-OUI:001365*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:3C7873*
+ ID_OUI_FROM_DATABASE=Airsonics
 
-OUI:001ECA*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:BC5FF6*
+ ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
 
-OUI:001D42*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:C8F9C8*
+ ID_OUI_FROM_DATABASE=NewSharp Technology(SuZhou)Co,Ltd
 
-OUI:001CEB*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:3C5CC3*
+ ID_OUI_FROM_DATABASE=Shenzhen First Blue Chip Technology Ltd
 
-OUI:002363*
- ID_OUI_FROM_DATABASE=Zhuhai Raysharp Technology Co.,Ltd
+OUI:A8741D*
+ ID_OUI_FROM_DATABASE=PHOENIX CONTACT Electronics GmbH
 
-OUI:D03742*
- ID_OUI_FROM_DATABASE=Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd
+OUI:A4C138*
+ ID_OUI_FROM_DATABASE=Telink Semiconductor (Taipei) Co. Ltd.
 
-OUI:001CFD*
- ID_OUI_FROM_DATABASE=Universal Electronics, Inc.
+OUI:D8EFCD*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:080051*
- ID_OUI_FROM_DATABASE=ExperData
+OUI:EC0133*
+ ID_OUI_FROM_DATABASE=TRINUS SYSTEMS INC.
 
-OUI:0080C7*
- ID_OUI_FROM_DATABASE=XIRCOM
+OUI:1C56FE*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:049FCA*
+OUI:7CA23E*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:C81FBE*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:501AA5*
+ ID_OUI_FROM_DATABASE=GN Netcom A/S
 
-OUI:203DB2*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:F09A51*
+ ID_OUI_FROM_DATABASE=Shanghai Viroyal Electronic Technology Company Limited
 
-OUI:48D539*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:9870E8*
+ ID_OUI_FROM_DATABASE=INNATECH SDN BHD
 
-OUI:10E68F*
- ID_OUI_FROM_DATABASE=KWANGSUNG ELECTRONICS KOREA CO.,LTD.
+OUI:50DF95*
+ ID_OUI_FROM_DATABASE=Lytx
 
-OUI:1899F5*
- ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
+OUI:584925*
+ ID_OUI_FROM_DATABASE=E3 Enterprise
 
-OUI:E41D2D*
- ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
+OUI:94F278*
+ ID_OUI_FROM_DATABASE=Elma Electronic
 
-OUI:B80018*
- ID_OUI_FROM_DATABASE=Htel
+OUI:E8BDD1*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0081C4*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:3481F4*
+ ID_OUI_FROM_DATABASE=SST Taiwan Ltd.
 
-OUI:E8FD90*
- ID_OUI_FROM_DATABASE=Turbostor
+OUI:F4B8A7*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:0017EA*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:58F102*
+ ID_OUI_FROM_DATABASE=BLU Products Inc.
 
-OUI:0017E3*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:B869C2*
+ ID_OUI_FROM_DATABASE=Sunitec Enterprise Co., Ltd.
 
-OUI:001834*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:2CC548*
+ ID_OUI_FROM_DATABASE=IAdea Corporation
 
-OUI:00182F*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:307CB2*
+ ID_OUI_FROM_DATABASE=ANOV FRANCE
 
-OUI:78DEE4*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:90D8F3*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:B8FFFE*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:444CA8*
+ ID_OUI_FROM_DATABASE=Arista Networks
+
+OUI:FCE33C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:E0D7BA*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:BC6A2F*
+ ID_OUI_FROM_DATABASE=Henge Docks LLC
 
-OUI:405FC2*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:E4907E*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:8030DC*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:48066A*
+ ID_OUI_FROM_DATABASE=Tempered Networks, Inc.
 
-OUI:CC78AB*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:1CF03E*
+ ID_OUI_FROM_DATABASE=Wearhaus Inc.
 
-OUI:A4D578*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:DCDB70*
+ ID_OUI_FROM_DATABASE=Tonfunk Systementwicklung und Service GmbH
 
-OUI:544A16*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:C47D46*
+ ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
-OUI:D8DDFD*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:68EDA4*
+ ID_OUI_FROM_DATABASE=Shenzhen Seavo Technology Co.,Ltd
 
-OUI:20CD39*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:B899B0*
+ ID_OUI_FROM_DATABASE=Cohere Technologies
 
-OUI:987BF3*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:80C5E6*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
 
-OUI:247189*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:D85DEF*
+ ID_OUI_FROM_DATABASE=Busch-Jaeger Elektro GmbH
 
-OUI:EC1127*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:10DF8B*
+ ID_OUI_FROM_DATABASE=Shenzhen CareDear Communication Technology Co.,Ltd
 
-OUI:F0C77F*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:00A784*
+ ID_OUI_FROM_DATABASE=ITX security
 
-OUI:F45EAB*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:800184*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:001783*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:38FACA*
+ ID_OUI_FROM_DATABASE=Skyworth Digital Technology(Shenzhen) Co.,Ltd
 
-OUI:A81B6A*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:44C69B*
+ ID_OUI_FROM_DATABASE=Wuhan Feng Tian Information Network CO.,LTD
 
-OUI:9884E3*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:C02567*
+ ID_OUI_FROM_DATABASE=Nexxt Solutions
 
-OUI:38D269*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:B46D35*
+ ID_OUI_FROM_DATABASE=Dalian Seasky Automation Co;Ltd
 
-OUI:C8FD19*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:B89ACD*
+ ID_OUI_FROM_DATABASE=ELITE OPTOELECTRONIC(ASIA)CO.,LTD
 
-OUI:508CB1*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:241C04*
+ ID_OUI_FROM_DATABASE=SHENZHEN JEHE TECHNOLOGY DEVELOPMENT CO., LTD.
 
-OUI:04BBF9*
- ID_OUI_FROM_DATABASE=Pavilion Data Systems Inc
+OUI:F8CFC5*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:B0F893*
- ID_OUI_FROM_DATABASE=Shanghai MXCHIP Information Technology Co., Ltd.
+OUI:BCF811*
+ ID_OUI_FROM_DATABASE=Xiamen DNAKE Technology Co.,Ltd
 
-OUI:00C017*
- ID_OUI_FROM_DATABASE=NetScout Systems, Inc.
+OUI:A8827F*
+ ID_OUI_FROM_DATABASE=CIBN Oriental Network(Beijing) CO.,Ltd
 
-OUI:D49B5C*
- ID_OUI_FROM_DATABASE=Chongqing Miedu Technology Co., Ltd.
+OUI:900A39*
+ ID_OUI_FROM_DATABASE=Wiio, Inc.
 
-OUI:EC8CA2*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:C4693E*
+ ID_OUI_FROM_DATABASE=Turbulence Design Inc.
 
-OUI:C411E0*
- ID_OUI_FROM_DATABASE=Bull Group Co., Ltd
+OUI:1C8341*
+ ID_OUI_FROM_DATABASE=Hefei Bitland Information Technology Co.Ltd
 
-OUI:90842B*
- ID_OUI_FROM_DATABASE=LEGO System A/S
+OUI:4011DC*
+ ID_OUI_FROM_DATABASE=Sonance
 
-OUI:84C7EA*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:249EAB*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:8C6102*
- ID_OUI_FROM_DATABASE=Beijing Baofengmojing Technologies Co., Ltd
+OUI:DC56E6*
+ ID_OUI_FROM_DATABASE=Shenzhen Bococom Technology Co.,LTD
 
-OUI:1005B1*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:5CA178*
+ ID_OUI_FROM_DATABASE=TableTop Media (dba Ziosk)
 
-OUI:10868C*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:702A7D*
+ ID_OUI_FROM_DATABASE=EpSpot AB
 
-OUI:1C1B68*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:B8B3DC*
+ ID_OUI_FROM_DATABASE=DEREK (SHAOGUAN) LIMITED
 
-OUI:44E137*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:6C1E70*
+ ID_OUI_FROM_DATABASE=Guangzhou YBDS IT Co.,Ltd
 
-OUI:E83381*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:C8E130*
+ ID_OUI_FROM_DATABASE=Milkyway Group Ltd
 
-OUI:8461A0*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:8833BE*
+ ID_OUI_FROM_DATABASE=Ivenix, Inc.
 
-OUI:0CF893*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:34CC28*
+ ID_OUI_FROM_DATABASE=Nexpring Co. LTD.,
 
-OUI:14ABF0*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:144146*
+ ID_OUI_FROM_DATABASE=Honeywell (China) Co., LTD
 
-OUI:ACB313*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:F41563*
+ ID_OUI_FROM_DATABASE=F5 Networks, Inc.
 
-OUI:0026D9*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:C4EA1D*
+ ID_OUI_FROM_DATABASE=Technicolor
 
-OUI:28C87A*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:20E407*
+ ID_OUI_FROM_DATABASE=Spark srl
 
-OUI:54E2E0*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:887384*
+ ID_OUI_FROM_DATABASE=Toshiba
 
-OUI:A055DE*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:584704*
+ ID_OUI_FROM_DATABASE=Shenzhen Webridge Technology Co.,Ltd
 
-OUI:A0C562*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:B856BD*
+ ID_OUI_FROM_DATABASE=ITT LLC
 
-OUI:FC6FB7*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:107873*
+ ID_OUI_FROM_DATABASE=Shenzhen Jinkeyi Communication Co., Ltd.
 
-OUI:001A1B*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:D45556*
+ ID_OUI_FROM_DATABASE=Fiber Mountain Inc.
 
-OUI:00149A*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:F01E34*
+ ID_OUI_FROM_DATABASE=ORICO Technologies Co., Ltd
 
-OUI:001371*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:74A063*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001DBE*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:A89008*
+ ID_OUI_FROM_DATABASE=Beijing Yuecheng Technology Co. Ltd.
 
-OUI:001E5A*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:183864*
+ ID_OUI_FROM_DATABASE=CAP-TECH INTERNATIONAL CO., LTD.
 
-OUI:001D6B*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:08D34B*
+ ID_OUI_FROM_DATABASE=Techman Electronics (Changshu) Co., Ltd.
 
-OUI:001CC1*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:C808E9*
+ ID_OUI_FROM_DATABASE=LG Electronics
 
-OUI:001C11*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:78ACBF*
+ ID_OUI_FROM_DATABASE=Igneous Systems
 
-OUI:001F7E*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:206274*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
 
-OUI:002495*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:5CCCFF*
+ ID_OUI_FROM_DATABASE=Techroutes Network Pvt Ltd
 
-OUI:2C9E5F*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:844BB7*
+ ID_OUI_FROM_DATABASE=Beijing Sankuai Online Technology Co.,Ltd
 
-OUI:C8AA21*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:148F21*
+ ID_OUI_FROM_DATABASE=Garmin International
 
-OUI:341FE4*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:3C6A9D*
+ ID_OUI_FROM_DATABASE=Dexatek Technology LTD.
 
-OUI:400D10*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:14893E*
+ ID_OUI_FROM_DATABASE=VIXTEL TECHNOLOGIES LIMTED
 
-OUI:001596*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:60F189*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:0015A2*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:74A34A*
+ ID_OUI_FROM_DATABASE=ZIMI CORPORATION
 
-OUI:001311*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:D89341*
+ ID_OUI_FROM_DATABASE=General Electric Global Research
 
-OUI:0015CE*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:F4645D*
+ ID_OUI_FROM_DATABASE=Toshiba
 
-OUI:002040*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:30D587*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0011AE*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:1436C6*
+ ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
 
-OUI:000F9F*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:04C09C*
+ ID_OUI_FROM_DATABASE=Tellabs Inc.
 
-OUI:306023*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:844464*
+ ID_OUI_FROM_DATABASE=ServerU Inc
 
-OUI:001DD6*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:589B0B*
+ ID_OUI_FROM_DATABASE=Shineway Technologies, Inc.
 
-OUI:001DD1*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:A48CDB*
+ ID_OUI_FROM_DATABASE=Lenovo
 
-OUI:601971*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:4062B6*
+ ID_OUI_FROM_DATABASE=Tele system communication
 
-OUI:0000CA*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:3C2C94*
+ ID_OUI_FROM_DATABASE=杭州德澜科技有限公司(HangZhou Delan Technology Co.,Ltd)
 
-OUI:001ADB*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:78312B*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:002375*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:C035C5*
+ ID_OUI_FROM_DATABASE=Prosoft Systems LTD
 
-OUI:0024A1*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:F8B2F3*
+ ID_OUI_FROM_DATABASE=GUANGZHOU BOSMA TECHNOLOGY CO.,LTD
 
-OUI:A4ED4E*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:1C7D22*
+ ID_OUI_FROM_DATABASE=Fuji Xerox Co., Ltd.
 
-OUI:002642*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:7C11CD*
+ ID_OUI_FROM_DATABASE=QianTang Technology
 
-OUI:000B06*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:0492EE*
+ ID_OUI_FROM_DATABASE=iway AG
 
-OUI:00152F*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:F02A23*
+ ID_OUI_FROM_DATABASE=Creative Next Design
 
-OUI:00111A*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:8C9109*
+ ID_OUI_FROM_DATABASE=Toyoshima Electric Technoeogy(Suzhou) Co.,Ltd.
 
-OUI:001626*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:307350*
+ ID_OUI_FROM_DATABASE=Inpeco SA
 
-OUI:0018A4*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:E8CC18*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:00D037*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:B09137*
+ ID_OUI_FROM_DATABASE=ISis ImageStream Internet Solutions, Inc
 
-OUI:FC9114*
- ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+OUI:3C1E13*
+ ID_OUI_FROM_DATABASE=HANGZHOU SUNRISE TECHNOLOGY CO., LTD
 
-OUI:1C25E1*
- ID_OUI_FROM_DATABASE=China Mobile IOT Company Limited
+OUI:B4A828*
+ ID_OUI_FROM_DATABASE=Shenzhen Concox Information Technology Co., Ltd
 
-OUI:C0F636*
- ID_OUI_FROM_DATABASE=Hangzhou Kuaiyue Technologies, Ltd.
+OUI:A41242*
+ ID_OUI_FROM_DATABASE=NEC Platforms, Ltd.
 
-OUI:F0038C*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:404EEB*
+ ID_OUI_FROM_DATABASE=Higher Way Electronic Co., Ltd.
 
-OUI:B45D50*
- ID_OUI_FROM_DATABASE=Aruba Networks
+OUI:50BD5F*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:742344*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:147590*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:001E7D*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:ECB907*
+ ID_OUI_FROM_DATABASE=CloudGenix Inc
 
-OUI:3C6200*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:5CF9F0*
+ ID_OUI_FROM_DATABASE=Atomos Engineering P/L
 
-OUI:0024E9*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:FCDBB3*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:002399*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:B8186F*
+ ID_OUI_FROM_DATABASE=ORIENTAL MOTOR CO., LTD.
 
-OUI:E4E0C5*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:1C9C26*
+ ID_OUI_FROM_DATABASE=Zoovel Technologies
 
-OUI:E8039A*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:9C3583*
+ ID_OUI_FROM_DATABASE=Nipro Diagnostics, Inc
 
-OUI:C4731E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:C456FE*
+ ID_OUI_FROM_DATABASE=Lava International Ltd.
 
-OUI:78D6F0*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
+OUI:B89BE4*
+ ID_OUI_FROM_DATABASE=ABB Power Systems Power Generation
 
-OUI:B407F9*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
+OUI:C0EEFB*
+ ID_OUI_FROM_DATABASE=OnePlus Tech (Shenzhen) Ltd
 
-OUI:40B89A*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:108A1B*
+ ID_OUI_FROM_DATABASE=RAONIX Inc.
 
-OUI:A8A795*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:8CF813*
+ ID_OUI_FROM_DATABASE=ORANGE POLSKA
 
-OUI:8096CA*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:B8F317*
+ ID_OUI_FROM_DATABASE=iSun Smasher Communications Private Limited
 
-OUI:9CD21E*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:2442BC*
+ ID_OUI_FROM_DATABASE=Alinco,incorporated
 
-OUI:D87988*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:C401CE*
+ ID_OUI_FROM_DATABASE=PRESITION (2000) CO., LTD.
 
-OUI:00242B*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:D01242*
+ ID_OUI_FROM_DATABASE=BIOS Corporation
 
-OUI:00242C*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:50F43C*
+ ID_OUI_FROM_DATABASE=Leeo Inc
 
-OUI:945330*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:B43934*
+ ID_OUI_FROM_DATABASE=Pen Generations, Inc.
 
-OUI:EC0EC4*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:DCC622*
+ ID_OUI_FROM_DATABASE=BUHEUNG SYSTEM
 
-OUI:7429AF*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:D062A0*
+ ID_OUI_FROM_DATABASE=China Essence Technology (Zhumadian) Co., Ltd.
 
-OUI:346895*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:CC10A3*
+ ID_OUI_FROM_DATABASE=Beijing Nan Bao Technology Co., Ltd.
 
-OUI:A86BAD*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:2CA30E*
+ ID_OUI_FROM_DATABASE=POWER DRAGON DEVELOPMENT LIMITED
 
-OUI:D80F99*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:4CF5A0*
+ ID_OUI_FROM_DATABASE=Scalable Network Technologies Inc
 
-OUI:78DD08*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:084656*
+ ID_OUI_FROM_DATABASE=VEO-LABS
 
-OUI:00197E*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:4488CB*
+ ID_OUI_FROM_DATABASE=Camco Technologies NV
 
-OUI:A0AB1B*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:5014B5*
+ ID_OUI_FROM_DATABASE=Richfit Information Technology Co., Ltd
 
-OUI:5C4979*
- ID_OUI_FROM_DATABASE=AVM Audiovisuelles Marketing und Computersysteme GmbH
+OUI:CC3080*
+ ID_OUI_FROM_DATABASE=VAIO Corporation
 
-OUI:086A0A*
- ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+OUI:F82441*
+ ID_OUI_FROM_DATABASE=Yeelink
 
-OUI:101250*
- ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
+OUI:6CBFB5*
+ ID_OUI_FROM_DATABASE=Noon Technology Co., Ltd
 
-OUI:8C7712*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:489D18*
+ ID_OUI_FROM_DATABASE=Flashbay Limited
 
-OUI:2013E0*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:8CB094*
+ ID_OUI_FROM_DATABASE=Airtech I&C Co., Ltd
 
-OUI:0007AB*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:70F196*
+ ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
 
-OUI:0021D2*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:6C6EFE*
+ ID_OUI_FROM_DATABASE=Core Logic Inc.
 
-OUI:BC4760*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:E4C62B*
+ ID_OUI_FROM_DATABASE=Airware
 
-OUI:D0176A*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:80F8EB*
+ ID_OUI_FROM_DATABASE=RayTight
 
-OUI:F0D9B2*
- ID_OUI_FROM_DATABASE=EXO S.A.
+OUI:94B40F*
+ ID_OUI_FROM_DATABASE=Aruba Networks
 
-OUI:2CBABA*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:4C2C83*
+ ID_OUI_FROM_DATABASE=Zhejiang KaNong Network Technology Co.,Ltd.
 
-OUI:24920E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:E89606*
+ ID_OUI_FROM_DATABASE=testo Instruments (Shenzhen) Co., Ltd.
 
-OUI:40D3AE*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:CC3F1D*
+ ID_OUI_FROM_DATABASE=Intesis Software SL
 
-OUI:802AA8*
- ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
+OUI:902181*
+ ID_OUI_FROM_DATABASE=Shanghai Huaqin Telecom Technology Co.,Ltd
 
-OUI:00156D*
- ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
+OUI:600417*
+ ID_OUI_FROM_DATABASE=POSBANK CO.,LTD
 
-OUI:787D48*
- ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
+OUI:A44AD3*
+ ID_OUI_FROM_DATABASE=ST Electronics(Shanghai) Co.,Ltd
 
-OUI:D46E0E*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:2497ED*
+ ID_OUI_FROM_DATABASE=Techvision Intelligent Technology Limited
 
-OUI:049790*
- ID_OUI_FROM_DATABASE=Lartech telecom LLC
+OUI:104E07*
+ ID_OUI_FROM_DATABASE=Shanghai Genvision Industries Co.,Ltd
 
-OUI:8CEA1B*
- ID_OUI_FROM_DATABASE=Edgecore Networks Corporation
+OUI:FCD5D9*
+ ID_OUI_FROM_DATABASE=Shenzhen SDMC Technology Co., Ltd.
 
-OUI:001650*
- ID_OUI_FROM_DATABASE=Kratos EPD
+OUI:007532*
+ ID_OUI_FROM_DATABASE=INID BV
 
-OUI:58E16C*
- ID_OUI_FROM_DATABASE=Ying Hua Information Technology (Shanghai)Co., LTD
+OUI:907EBA*
+ ID_OUI_FROM_DATABASE=UTEK TECHNOLOGY (SHENZHEN) CO.,LTD
 
-OUI:5846E1*
- ID_OUI_FROM_DATABASE=Baxter International Inc
+OUI:488244*
+ ID_OUI_FROM_DATABASE=Life Fitness / Div. of Brunswick
 
-OUI:00D0BD*
- ID_OUI_FROM_DATABASE=Lattice Semiconductor Corp. (LPA)
+OUI:A8F7E0*
+ ID_OUI_FROM_DATABASE=PLANET Technology Corporation
 
-OUI:F08261*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:2C5BE1*
+ ID_OUI_FROM_DATABASE=Centripetal Networks, Inc
 
-OUI:D084B0*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:D87EB1*
+ ID_OUI_FROM_DATABASE=x.o.ware, inc.
 
-OUI:00FEC8*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:4045DA*
+ ID_OUI_FROM_DATABASE=Spreadtrum Communications (Shanghai) Co., Ltd.
 
-OUI:0030C5*
- ID_OUI_FROM_DATABASE=CADENCE DESIGN SYSTEMS, INC.
+OUI:98BE94*
+ ID_OUI_FROM_DATABASE=IBM
 
-OUI:EC2280*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:D4B43E*
+ ID_OUI_FROM_DATABASE=Messcomp Datentechnik GmbH
 
-OUI:047863*
- ID_OUI_FROM_DATABASE=Shanghai MXCHIP Information Technology Co., Ltd.
+OUI:A8E539*
+ ID_OUI_FROM_DATABASE=Moimstone Co.,Ltd
 
-OUI:24BA13*
- ID_OUI_FROM_DATABASE=RISO KAGAKU CORPORATION
+OUI:98F170*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:24DA11*
- ID_OUI_FROM_DATABASE=NO NDA Inc
+OUI:04C991*
+ ID_OUI_FROM_DATABASE=Phistek INC.
 
-OUI:70CA4D*
- ID_OUI_FROM_DATABASE=Shenzhen lnovance Technology Co.,Ltd.
+OUI:581F67*
+ ID_OUI_FROM_DATABASE=Open-m technology limited
 
-OUI:DCC0EB*
- ID_OUI_FROM_DATABASE=ASSA ABLOY CÔTE PICARDE
+OUI:BC25F0*
+ ID_OUI_FROM_DATABASE=3D Display Technologies Co., Ltd.
 
-OUI:001735*
- ID_OUI_FROM_DATABASE=Intel Wireless Network Group
+OUI:7CE524*
+ ID_OUI_FROM_DATABASE=Quirky, Inc.
 
-OUI:9CDFB1*
- ID_OUI_FROM_DATABASE=Shenzhen Crave Communication Co., LTD
+OUI:D85DFB*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:5CF938*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:7CC4EF*
+ ID_OUI_FROM_DATABASE=Devialet
 
-OUI:3871DE*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:94AEE3*
+ ID_OUI_FROM_DATABASE=Belden Hirschmann Industries (Suzhou) Ltd.
 
-OUI:BC5436*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:44666E*
+ ID_OUI_FROM_DATABASE=IP-LINE
 
-OUI:0CC731*
- ID_OUI_FROM_DATABASE=Currant, Inc.
+OUI:705B2E*
+ ID_OUI_FROM_DATABASE=M2Communication Inc.
 
-OUI:00142F*
- ID_OUI_FROM_DATABASE=Savvius
+OUI:0C8C8F*
+ ID_OUI_FROM_DATABASE=Kamo Technology Limited
 
-OUI:2CDDA3*
- ID_OUI_FROM_DATABASE=Point Grey Research Inc.
+OUI:F4FD2B*
+ ID_OUI_FROM_DATABASE=ZOYI Company
 
-OUI:24FD5B*
- ID_OUI_FROM_DATABASE=SmartThings, Inc.
+OUI:FCAA14*
+ ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
 
-OUI:2876CD*
- ID_OUI_FROM_DATABASE=Funshion Online Technologies Co.,Ltd
+OUI:50FEF2*
+ ID_OUI_FROM_DATABASE=Sify Technologies Ltd
 
-OUI:F4F5D8*
- ID_OUI_FROM_DATABASE=Google, Inc.
+OUI:3CD9CE*
+ ID_OUI_FROM_DATABASE=Eclipse WiFi
 
-OUI:F4F5E8*
- ID_OUI_FROM_DATABASE=Google, Inc.
+OUI:C80210*
+ ID_OUI_FROM_DATABASE=LG Innotek
 
-OUI:F88FCA*
- ID_OUI_FROM_DATABASE=Google, Inc.
+OUI:702DD1*
+ ID_OUI_FROM_DATABASE=Newings Communication CO., LTD.
 
-OUI:BCD1D3*
- ID_OUI_FROM_DATABASE=Shenzhen TINNO Mobile Technology Corp.
+OUI:44746C*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:BC4434*
- ID_OUI_FROM_DATABASE=Shenzhen TINNO Mobile Technology Corp.
+OUI:F4F646*
+ ID_OUI_FROM_DATABASE=Dediprog Technology Co. Ltd.
 
-OUI:0041D2*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:ECD9D1*
+ ID_OUI_FROM_DATABASE=Shenzhen TG-NET Botone Technology Co.,Ltd.
 
-OUI:4CFB45*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:748F4D*
+ ID_OUI_FROM_DATABASE=MEN Mikro Elektronik GmbH
 
-OUI:A4BA76*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:A47E39*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:78E3B5*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:0C63FC*
+ ID_OUI_FROM_DATABASE=Nanjing Signway Technology Co., Ltd
 
-OUI:984BE1*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:ACA9A0*
+ ID_OUI_FROM_DATABASE=Audioengine, Ltd.
 
-OUI:68B599*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:A8A668*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:0C47C9*
- ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+OUI:60E327*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:14D64D*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:E4D332*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:C8BE19*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:A0DA92*
+ ID_OUI_FROM_DATABASE=Nanjing Glarun Atten Technology Co. Ltd.
 
-OUI:BCF685*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:6828BA*
+ ID_OUI_FROM_DATABASE=Dejai
 
-OUI:CCB255*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:48D18E*
+ ID_OUI_FROM_DATABASE=Metis Communication Co.,Ltd
 
-OUI:84C9B2*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:A49F85*
+ ID_OUI_FROM_DATABASE=Lyve Minds, Inc
 
-OUI:DCD321*
- ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
+OUI:7CD30A*
+ ID_OUI_FROM_DATABASE=INVENTEC Corporation
 
-OUI:CC4EEC*
- ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
+OUI:3481C4*
+ ID_OUI_FROM_DATABASE=AVM GmbH
 
-OUI:DC330D*
- ID_OUI_FROM_DATABASE=Qingdao Haier Telecom Co.,Ltd
+OUI:085700*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:0080E1*
- ID_OUI_FROM_DATABASE=STMicroelectronics SRL
+OUI:888914*
+ ID_OUI_FROM_DATABASE=All Components Incorporated
 
-OUI:58DC6D*
- ID_OUI_FROM_DATABASE=Exceptional Innovation, Inc.
+OUI:D8150D*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:00092D*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:A06518*
+ ID_OUI_FROM_DATABASE=VNPT TECHNOLOGY
 
-OUI:F8DB7F*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:748F1B*
+ ID_OUI_FROM_DATABASE=MasterImage 3D
 
-OUI:E899C4*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:F03A4B*
+ ID_OUI_FROM_DATABASE=Bloombase, Inc.
 
-OUI:7CB15D*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:D82A15*
+ ID_OUI_FROM_DATABASE=Leitner SpA
 
-OUI:18686A*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:C4291D*
+ ID_OUI_FROM_DATABASE=KLEMSAN ELEKTRIK ELEKTRONIK SAN.VE TIC.AS.
 
-OUI:0C0535*
- ID_OUI_FROM_DATABASE=Juniper Systems
+OUI:704E01*
+ ID_OUI_FROM_DATABASE=KWANGWON TECH CO., LTD.
 
-OUI:8CF228*
- ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
+OUI:848433*
+ ID_OUI_FROM_DATABASE=Paradox Engineering SA
 
-OUI:08EA44*
- ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
+OUI:D4319D*
+ ID_OUI_FROM_DATABASE=Sinwatec
 
-OUI:78F882*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:DC052F*
+ ID_OUI_FROM_DATABASE=National Products Inc.
 
-OUI:8851FB*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:CC398C*
+ ID_OUI_FROM_DATABASE=Shiningtek
 
-OUI:AC162D*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:6C5F1C*
+ ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
 
-OUI:A0B3CC*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:B42C92*
+ ID_OUI_FROM_DATABASE=Zhejiang Weirong Electronic Co., Ltd
 
-OUI:E4115B*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:FC1349*
+ ID_OUI_FROM_DATABASE=Global Apps Corp.
 
-OUI:C8CBB8*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:8C41F2*
+ ID_OUI_FROM_DATABASE=RDA Technologies Ltd.
 
-OUI:9457A5*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:FC07A0*
+ ID_OUI_FROM_DATABASE=LRE Medical GmbH
 
-OUI:0001E7*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:AC02CA*
+ ID_OUI_FROM_DATABASE=HI Solutions, Inc.
 
-OUI:080009*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:F490CA*
+ ID_OUI_FROM_DATABASE=Tensorcom
 
-OUI:0080A0*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:2C534A*
+ ID_OUI_FROM_DATABASE=Shenzhen Winyao Electronic Limited
 
-OUI:D48564*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:CC856C*
+ ID_OUI_FROM_DATABASE=SHENZHEN MDK DIGITAL TECHNOLOGY CO.,LTD
 
-OUI:3C4A92*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:60FFDD*
+ ID_OUI_FROM_DATABASE=C.E. ELECTRONICS, INC
 
-OUI:780AC7*
- ID_OUI_FROM_DATABASE=Baofeng TV Co., Ltd.
+OUI:FCBBA1*
+ ID_OUI_FROM_DATABASE=Shenzhen Minicreate Technology Co.,Ltd
 
-OUI:001D73*
- ID_OUI_FROM_DATABASE=BUFFALO.INC
+OUI:50B695*
+ ID_OUI_FROM_DATABASE=Micropoint Biotechnologies,Inc.
 
-OUI:001601*
- ID_OUI_FROM_DATABASE=BUFFALO.INC
+OUI:B48547*
+ ID_OUI_FROM_DATABASE=Amptown System Company GmbH
 
-OUI:106F3F*
- ID_OUI_FROM_DATABASE=BUFFALO.INC
+OUI:3C25D7*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:8857EE*
- ID_OUI_FROM_DATABASE=BUFFALO.INC
+OUI:1889DF*
+ ID_OUI_FROM_DATABASE=CerebrEX Inc.
 
-OUI:009C02*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:30A8DB*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:78E7D1*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:CC9F35*
+ ID_OUI_FROM_DATABASE=Transbit Sp. z o.o.
 
-OUI:001B78*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:407875*
+ ID_OUI_FROM_DATABASE=IMBEL - Industria de Material Belico do Brasil
 
-OUI:001E0B*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:0C4F5A*
+ ID_OUI_FROM_DATABASE=ASA-RT s.r.l.
 
-OUI:2C6E85*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:B4B542*
+ ID_OUI_FROM_DATABASE=Hubbell Power Systems, Inc.
 
-OUI:00D0B7*
- ID_OUI_FROM_DATABASE=Intel Corporation
+OUI:54CDEE*
+ ID_OUI_FROM_DATABASE=ShenZhen Apexis Electronic Co.,Ltd
 
-OUI:0002B3*
- ID_OUI_FROM_DATABASE=Intel Corporation
+OUI:F8F005*
+ ID_OUI_FROM_DATABASE=Newport Media Inc.
 
-OUI:001111*
- ID_OUI_FROM_DATABASE=Intel Corporation
+OUI:98C0EB*
+ ID_OUI_FROM_DATABASE=Global Regency Ltd
 
-OUI:001320*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:D4224E*
+ ID_OUI_FROM_DATABASE=Alcatel Lucent
 
-OUI:0012F0*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:28DEF6*
+ ID_OUI_FROM_DATABASE=bioMerieux Inc.
 
-OUI:9049FA*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:88E8F8*
+ ID_OUI_FROM_DATABASE=YONG TAI ELECTRONIC (DONGGUAN) LTD.
 
-OUI:C8348E*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:2C073C*
+ ID_OUI_FROM_DATABASE=DEVLINE LIMITED
 
-OUI:00508B*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:7CE4AA*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:784859*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:1820A6*
+ ID_OUI_FROM_DATABASE=Sage Co., Ltd.
 
-OUI:1458D0*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:BCF61C*
+ ID_OUI_FROM_DATABASE=Geomodeling Wuxi Technology Co. Ltd.
 
-OUI:5065F3*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:083F3E*
+ ID_OUI_FROM_DATABASE=WSH GmbH
 
-OUI:A0481C*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:6C09D6*
+ ID_OUI_FROM_DATABASE=Digiquest Electronics LTD
 
-OUI:A01D48*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:8C569D*
+ ID_OUI_FROM_DATABASE=Imaging Solutions Group
 
-OUI:94B2CC*
- ID_OUI_FROM_DATABASE=PIONEER CORPORATION
+OUI:A43A69*
+ ID_OUI_FROM_DATABASE=Vers Inc
 
-OUI:887F03*
- ID_OUI_FROM_DATABASE=Comper Technology Investment Limited
+OUI:387B47*
+ ID_OUI_FROM_DATABASE=AKELA, Inc.
 
-OUI:E06066*
- ID_OUI_FROM_DATABASE=Sercomm Corporation
+OUI:7CCD11*
+ ID_OUI_FROM_DATABASE=MS-Magnet
 
-OUI:0019E0*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:4CE1BB*
+ ID_OUI_FROM_DATABASE=Zhuhai HiFocus Technology Co., Ltd.
 
-OUI:0023CD*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:8CDE99*
+ ID_OUI_FROM_DATABASE=Comlab Inc.
 
-OUI:002719*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:B46698*
+ ID_OUI_FROM_DATABASE=Zealabs srl
 
-OUI:40169F*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:283B96*
+ ID_OUI_FROM_DATABASE=Cool Control LTD
 
-OUI:940C6D*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:80D433*
+ ID_OUI_FROM_DATABASE=LzLabs GmbH
 
-OUI:74EA3A*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:085AE0*
+ ID_OUI_FROM_DATABASE=Recovision Technology Co., Ltd.
 
-OUI:90F652*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:BCEE7B*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:10FEED*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:FC09D8*
+ ID_OUI_FROM_DATABASE=ACTEON Group
 
-OUI:C46E1F*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:0C1262*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:50FA84*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:687CC8*
+ ID_OUI_FROM_DATABASE=Measurement Systems S. de R.L.
 
-OUI:F483CD*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:F015A0*
+ ID_OUI_FROM_DATABASE=KyungDong One Co., Ltd.
 
-OUI:882593*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:ECF72B*
+ ID_OUI_FROM_DATABASE=HD DIGITAL TECH CO., LTD.
 
-OUI:808917*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:D8B6D6*
+ ID_OUI_FROM_DATABASE=Blu Tether Limited
 
-OUI:5C899A*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:847207*
+ ID_OUI_FROM_DATABASE=I&C Technology
 
-OUI:A81B5A*
- ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+OUI:E0AEB2*
+ ID_OUI_FROM_DATABASE=Bender GmbH &amp; Co.KG
 
-OUI:E422A5*
- ID_OUI_FROM_DATABASE=PLANTRONICS, INC.
+OUI:2C553C*
+ ID_OUI_FROM_DATABASE=Gainspeed, Inc.
 
-OUI:1C994C*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:B43E3B*
+ ID_OUI_FROM_DATABASE=Viableware, Inc
 
-OUI:F02765*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:F854AF*
+ ID_OUI_FROM_DATABASE=ECI Telecom Ltd.
 
-OUI:D4970B*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:2464EF*
+ ID_OUI_FROM_DATABASE=CYG SUNRI CO.,LTD.
 
-OUI:F48B32*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:50B888*
+ ID_OUI_FROM_DATABASE=wi2be Tecnologia S/A
 
-OUI:20A783*
- ID_OUI_FROM_DATABASE=miControl GmbH
+OUI:B8C1A2*
+ ID_OUI_FROM_DATABASE=Dragon Path Technologies Co., Limited
 
-OUI:005053*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:50ED78*
+ ID_OUI_FROM_DATABASE=Changzhou Yongse Infotech Co.,Ltd
 
-OUI:00500F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:8CB7F7*
+ ID_OUI_FROM_DATABASE=Shenzhen UniStrong Science & Technology Co., Ltd
 
-OUI:048A15*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:085240*
+ ID_OUI_FROM_DATABASE=EbV Elektronikbau- und Vertriebs GmbH
 
-OUI:44322A*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:80F25E*
+ ID_OUI_FROM_DATABASE=Kyynel
 
-OUI:FC8399*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:844F03*
+ ID_OUI_FROM_DATABASE=Ablelink Electronics Ltd
 
-OUI:00040D*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:94B9B4*
+ ID_OUI_FROM_DATABASE=Aptos Technology
 
-OUI:D842AC*
- ID_OUI_FROM_DATABASE=Shanghai Feixun Communication Co.,Ltd.
+OUI:D0B523*
+ ID_OUI_FROM_DATABASE=Bestcare Cloucal Corp.
 
-OUI:34CDBE*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:783D5B*
+ ID_OUI_FROM_DATABASE=TELNET Redes Inteligentes S.A.
 
-OUI:D46AA8*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:D0C42F*
+ ID_OUI_FROM_DATABASE=Tamagawa Seiki Co.,Ltd.
 
-OUI:5439DF*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:5CFFFF*
+ ID_OUI_FROM_DATABASE=Shenzhen Kezhonglong Optoelectronic Technology Co., Ltd
 
-OUI:4846FB*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:F0D3A7*
+ ID_OUI_FROM_DATABASE=CobaltRay Co., Ltd
 
-OUI:200BC7*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:847616*
+ ID_OUI_FROM_DATABASE=Addat s.r.o.
 
-OUI:104780*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:D46867*
+ ID_OUI_FROM_DATABASE=Neoventus Design Group
 
-OUI:88308A*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:68692E*
+ ID_OUI_FROM_DATABASE=Zycoo Co.,Ltd
 
-OUI:44A7CF*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:38BF2F*
+ ID_OUI_FROM_DATABASE=Espec Corp.
 
-OUI:0013E0*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:182012*
+ ID_OUI_FROM_DATABASE=Aztech Associates Inc.
 
-OUI:748EF8*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:C0F991*
+ ID_OUI_FROM_DATABASE=GME Standard Communications P/L
 
-OUI:00E052*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:14EDA5*
+ ID_OUI_FROM_DATABASE=Wächter GmbH Sicherheitssysteme
 
-OUI:000480*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:E056F4*
+ ID_OUI_FROM_DATABASE=AxesNetwork Solutions inc.
 
-OUI:000088*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:385AA8*
+ ID_OUI_FROM_DATABASE=Beijing Zhongdun Security Technology Development Co.
 
-OUI:344B50*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:FC3FAB*
+ ID_OUI_FROM_DATABASE=Henan Lanxin Technology Co., Ltd
 
-OUI:FCC897*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:F8FF5F*
+ ID_OUI_FROM_DATABASE=Shenzhen Communication Technology Co.,Ltd
 
-OUI:9CD24B*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:DCC422*
+ ID_OUI_FROM_DATABASE=Systembase Limited
 
-OUI:C864C7*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:F4BD7C*
+ ID_OUI_FROM_DATABASE=Chengdu jinshi communication Co., LTD
 
-OUI:D0154A*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:C8F36B*
+ ID_OUI_FROM_DATABASE=Yamato Scale Co.,Ltd.
 
-OUI:88E3AB*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:6C90B1*
+ ID_OUI_FROM_DATABASE=SanLogic Inc
 
-OUI:00664B*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:845C93*
+ ID_OUI_FROM_DATABASE=Chabrier Services
 
-OUI:68A0F6*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:D44C9C*
+ ID_OUI_FROM_DATABASE=Shenzhen YOOBAO Technology Co.Ltd
 
-OUI:5CF96A*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:A88D7B*
+ ID_OUI_FROM_DATABASE=SunDroid Global limited.
 
-OUI:B43052*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:A03B1B*
+ ID_OUI_FROM_DATABASE=Inspire Tech
 
-OUI:88CEFA*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:3C6E63*
+ ID_OUI_FROM_DATABASE=Mitron OY
 
-OUI:582AF7*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:502E5C*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:F48E92*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:20D21F*
+ ID_OUI_FROM_DATABASE=Wincal Technology Corp.
 
-OUI:40CBA8*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:FC1E16*
+ ID_OUI_FROM_DATABASE=IPEVO corp
 
-OUI:087A4C*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:6C4B7F*
+ ID_OUI_FROM_DATABASE=Vossloh-Schwabe Deutschland GmbH
 
-OUI:D46E5C*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:0CCB8D*
+ ID_OUI_FROM_DATABASE=ASCO Numatics GmbH
 
-OUI:2469A5*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:2847AA*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:C8D15E*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:682DDC*
+ ID_OUI_FROM_DATABASE=Wuhan Changjiang Electro-Communication Equipment CO.,LTD
 
-OUI:F83DFF*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:1C63B7*
+ ID_OUI_FROM_DATABASE=OpenProducts 237 AB
 
-OUI:308730*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:A0A23C*
+ ID_OUI_FROM_DATABASE=GPMS
 
-OUI:002568*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:708D09*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:D47856*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:FCE1D9*
+ ID_OUI_FROM_DATABASE=Stable Imaging Solutions LLC
 
-OUI:C057BC*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:38B74D*
+ ID_OUI_FROM_DATABASE=Fijowave Limited
 
-OUI:38BB3C*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:A0E5E9*
+ ID_OUI_FROM_DATABASE=enimai Inc
 
-OUI:E45D52*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:9CBB98*
+ ID_OUI_FROM_DATABASE=Shen Zhen RND Electronic Co.,LTD
 
-OUI:A4251B*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:345C40*
+ ID_OUI_FROM_DATABASE=Cargt Holdings LLC
 
-OUI:6CA849*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:34885D*
+ ID_OUI_FROM_DATABASE=Logitech Far East
 
-OUI:30D17E*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:6064A1*
+ ID_OUI_FROM_DATABASE=RADiflow Ltd.
 
-OUI:9C28EF*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:8079AE*
+ ID_OUI_FROM_DATABASE=ShanDong Tecsunrise  Co.,Ltd
 
-OUI:7C6097*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:2C7155*
+ ID_OUI_FROM_DATABASE=HiveMotion
 
-OUI:60DE44*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:909916*
+ ID_OUI_FROM_DATABASE=ELVEES NeoTek OJSC
 
-OUI:3400A3*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:FC1BFF*
+ ID_OUI_FROM_DATABASE=V-ZUG AG
 
-OUI:643E8C*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:AC5036*
+ ID_OUI_FROM_DATABASE=Pi-Coral Inc
 
-OUI:00C610*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:FC019E*
+ ID_OUI_FROM_DATABASE=VIEVU
 
-OUI:70DEE2*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:F45F69*
+ ID_OUI_FROM_DATABASE=Matsufu Electronics distribution Company
 
-OUI:182032*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:F4A294*
+ ID_OUI_FROM_DATABASE=EAGLE WORLD DEVELOPMENT CO., LIMITED
 
-OUI:6CC26B*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:2CCD69*
+ ID_OUI_FROM_DATABASE=Aqavi.com
 
-OUI:1040F3*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:947C3E*
+ ID_OUI_FROM_DATABASE=Polewall Norge AS
 
-OUI:FC253F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:E0D1E6*
+ ID_OUI_FROM_DATABASE=Aliph dba Jawbone
 
-OUI:183451*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:28C671*
+ ID_OUI_FROM_DATABASE=Yota Devices OY
 
-OUI:C0847A*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:DC1792*
+ ID_OUI_FROM_DATABASE=Captivate Network
 
-OUI:64200C*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:7C8306*
+ ID_OUI_FROM_DATABASE=Glen Dimplex Nordic as
 
-OUI:74E1B6*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:907A0A*
+ ID_OUI_FROM_DATABASE=Gebr. Bode GmbH & Co KG
 
-OUI:0C771A*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:306112*
+ ID_OUI_FROM_DATABASE=PAV GmbH
 
-OUI:00F4B9*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:A0C6EC*
+ ID_OUI_FROM_DATABASE=ShenZhen ANYK Technology Co.,LTD
 
-OUI:C8334B*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:C80258*
+ ID_OUI_FROM_DATABASE=ITW GSE ApS
 
-OUI:B8F6B1*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:1001CA*
+ ID_OUI_FROM_DATABASE=Ashley Butterworth
 
-OUI:C09F42*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:246AAB*
+ ID_OUI_FROM_DATABASE=IT-IS International
 
-OUI:189EFC*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:28F532*
+ ID_OUI_FROM_DATABASE=ADD-Engineering BV
 
-OUI:6C3E6D*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:FC4BBC*
+ ID_OUI_FROM_DATABASE=Sunplus Technology Co., Ltd.
 
-OUI:0016FE*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:142D8B*
+ ID_OUI_FROM_DATABASE=Incipio Technologies, Inc
 
-OUI:0498F3*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:CCE8AC*
+ ID_OUI_FROM_DATABASE=SOYEA Technology Co.,Ltd.
 
-OUI:38C096*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:78D38D*
+ ID_OUI_FROM_DATABASE=HONGKONG YUNLINK TECHNOLOGY LIMITED
 
-OUI:E0750A*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:1C48F9*
+ ID_OUI_FROM_DATABASE=GN Netcom A/S
 
-OUI:B05947*
- ID_OUI_FROM_DATABASE=Shenzhen Qihu Intelligent Technology Company Limited
+OUI:744BE9*
+ ID_OUI_FROM_DATABASE=EXPLORER HYPERTECH CO.,LTD
 
-OUI:00E04F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:B836D8*
+ ID_OUI_FROM_DATABASE=Videoswitch
 
-OUI:001011*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:F835DD*
+ ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
 
-OUI:0010F6*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0CF019*
+ ID_OUI_FROM_DATABASE=Malgn Technology Co., Ltd.
 
-OUI:80E01D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D46A91*
+ ID_OUI_FROM_DATABASE=Snap AV
 
-OUI:80E86F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:E8519D*
+ ID_OUI_FROM_DATABASE=Yeonhab Precision Co.,LTD
 
-OUI:E4AA5D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00B78D*
+ ID_OUI_FROM_DATABASE=Nanjing Shining Electric Automation Co., Ltd
 
-OUI:000389*
- ID_OUI_FROM_DATABASE=PLANTRONICS, INC.
+OUI:68E166*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:0CE0E4*
- ID_OUI_FROM_DATABASE=PLANTRONICS, INC.
+OUI:60FEF9*
+ ID_OUI_FROM_DATABASE=Thomas & Betts
 
-OUI:B0AA77*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:78FE41*
+ ID_OUI_FROM_DATABASE=Socus networks
 
-OUI:78BAF9*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:083571*
+ ID_OUI_FROM_DATABASE=CASwell INC.
 
-OUI:0016B6*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:DCF755*
+ ID_OUI_FROM_DATABASE=SITRONIK
 
-OUI:0018F8*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:ACCA8E*
+ ID_OUI_FROM_DATABASE=ODA Technologies
 
-OUI:00252E*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:6405BE*
+ ID_OUI_FROM_DATABASE=NEW LIGHT LED
 
-OUI:A4A24A*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:E03E4A*
+ ID_OUI_FROM_DATABASE=Cavanagh Group International
 
-OUI:602AD0*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:6CB350*
+ ID_OUI_FROM_DATABASE=Anhui comhigher tech co.,ltd
 
-OUI:001BFB*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:A42305*
+ ID_OUI_FROM_DATABASE=Open Networking Laboratory
 
-OUI:00E08F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:1C86AD*
+ ID_OUI_FROM_DATABASE=MCT CO., LTD.
 
-OUI:203A07*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:28D93E*
+ ID_OUI_FROM_DATABASE=Telecor Inc.
 
-OUI:34A84E*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:882364*
+ ID_OUI_FROM_DATABASE=Watchnet DVR Inc
 
-OUI:E4D3F1*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:A05B21*
+ ID_OUI_FROM_DATABASE=ENVINET GmbH
 
-OUI:1CE6C7*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:50B8A2*
+ ID_OUI_FROM_DATABASE=ImTech Technologies LLC,
 
-OUI:E02F6D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:B04C05*
+ ID_OUI_FROM_DATABASE=Fresenius Medical Care Deutschland GmbH
 
-OUI:8478AC*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:A0EC80*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:4403A7*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:9046B7*
+ ID_OUI_FROM_DATABASE=Vadaro Pte Ltd
 
-OUI:6886A7*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:1C08C1*
+ ID_OUI_FROM_DATABASE=Lg Innotek
 
-OUI:B4E9B0*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:201D03*
+ ID_OUI_FROM_DATABASE=Elatec GmbH
 
-OUI:000832*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:C06C6D*
+ ID_OUI_FROM_DATABASE=MagneMotion, Inc.
 
-OUI:B0FAEB*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:74CA25*
+ ID_OUI_FROM_DATABASE=Calxeda, Inc.
 
-OUI:500604*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:CCBD35*
+ ID_OUI_FROM_DATABASE=Steinel GmbH
 
-OUI:70105C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:788DF7*
+ ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
 
-OUI:7CFADF*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:6CECA1*
+ ID_OUI_FROM_DATABASE=SHENZHEN CLOU ELECTRONICS CO. LTD.
 
-OUI:101C0C*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:D862DB*
+ ID_OUI_FROM_DATABASE=Eno Inc.
 
-OUI:001124*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:68DB67*
+ ID_OUI_FROM_DATABASE=Nantong Coship Electronics Co., Ltd
 
-OUI:001D4F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:BC261D*
+ ID_OUI_FROM_DATABASE=HONG KONG TECON TECHNOLOGY
 
-OUI:001E52*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:888964*
+ ID_OUI_FROM_DATABASE=GSI Electronics Inc.
 
-OUI:001F5B*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:9CA577*
+ ID_OUI_FROM_DATABASE=Osorno Enterprises Inc.
 
-OUI:001FF3*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:C0C3B6*
+ ID_OUI_FROM_DATABASE=Automatic Systems
 
-OUI:0021E9*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:A8294C*
+ ID_OUI_FROM_DATABASE=Precision Optical Transceivers, Inc.
 
-OUI:00236C*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:D0EB03*
+ ID_OUI_FROM_DATABASE=Zhehua technology limited
 
-OUI:002500*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:A0861D*
+ ID_OUI_FROM_DATABASE=Chengdu Fuhuaxin Technology co.,Ltd
 
-OUI:60FB42*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:9498A2*
+ ID_OUI_FROM_DATABASE=Shanghai LISTEN TECH.LTD
 
-OUI:14DAE9*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:2CB693*
+ ID_OUI_FROM_DATABASE=Radware
 
-OUI:3C08F6*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:88685C*
+ ID_OUI_FROM_DATABASE=Shenzhen ChuangDao & Perpetual Eternal Technology Co.,Ltd
 
-OUI:D072DC*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:B4FE8C*
+ ID_OUI_FROM_DATABASE=Centro Sicurezza Italia SpA
 
-OUI:28C7CE*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D82916*
+ ID_OUI_FROM_DATABASE=Ascent Communication Technology
 
-OUI:6CFA89*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:6472D8*
+ ID_OUI_FROM_DATABASE=GooWi Technology Co.,Limited
 
-OUI:58F39C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:84ACA4*
+ ID_OUI_FROM_DATABASE=Beijing Novel Super Digital TV Technology Co., Ltd
 
-OUI:346288*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:3C6FF7*
+ ID_OUI_FROM_DATABASE=EnTek Systems, Inc.
 
-OUI:881DFC*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:B838CA*
+ ID_OUI_FROM_DATABASE=Kyokko Tsushin System CO.,LTD
 
-OUI:F81EDF*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:380FE4*
+ ID_OUI_FROM_DATABASE=Dedicated Network Partners Oy
 
-OUI:90840D*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:847A88*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:D8A25E*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:5461EA*
+ ID_OUI_FROM_DATABASE=Zaplox AB
 
-OUI:C8BCC8*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:78324F*
+ ID_OUI_FROM_DATABASE=Millennium Group, Inc.
 
-OUI:28E7CF*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:F05DC8*
+ ID_OUI_FROM_DATABASE=Duracell Powermat
 
-OUI:D89E3F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:48F925*
+ ID_OUI_FROM_DATABASE=Maestronic
 
-OUI:040CCE*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:C0885B*
+ ID_OUI_FROM_DATABASE=SnD Tech Co., Ltd.
 
-OUI:A4D1D2*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:64C667*
+ ID_OUI_FROM_DATABASE=Barnes&Noble
 
-OUI:406C8F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:C47DCC*
+ ID_OUI_FROM_DATABASE=Zebra Technologies Inc
 
-OUI:C067AF*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:64535D*
+ ID_OUI_FROM_DATABASE=Frauscher Sensortechnik
 
-OUI:64E950*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:105F06*
+ ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
 
-OUI:189C5D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:841715*
+ ID_OUI_FROM_DATABASE=GP Electronics (HK) Ltd.
 
-OUI:000EA6*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:087999*
+ ID_OUI_FROM_DATABASE=AIM GmbH
 
-OUI:0013D4*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:84C2E4*
+ ID_OUI_FROM_DATABASE=Jiangsu Qinheng Co., Ltd.
 
-OUI:002618*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:C0B8B1*
+ ID_OUI_FROM_DATABASE=BitBox Ltd
 
-OUI:00248C*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:0C722C*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:0050A2*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:B01408*
+ ID_OUI_FROM_DATABASE=LIGHTSPEED INTERNATIONAL CO.
 
-OUI:0050F0*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:F8FEA8*
+ ID_OUI_FROM_DATABASE=Technico Japan Corporation
 
-OUI:00905F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:A8154D*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:00902B*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D05099*
+ ID_OUI_FROM_DATABASE=ASRock Incorporation
 
-OUI:00100B*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:78A106*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:00100D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:A49EDB*
+ ID_OUI_FROM_DATABASE=AutoCrib, Inc.
 
-OUI:001014*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:282CB2*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:649ABE*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:D43A65*
+ ID_OUI_FROM_DATABASE=IGRS Engineering Lab Ltd.
 
-OUI:94E96A*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:10B9FE*
+ ID_OUI_FROM_DATABASE=Lika srl
 
-OUI:AC293A*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:D42751*
+ ID_OUI_FROM_DATABASE=Infopia Co., Ltd
 
-OUI:10417F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:A895B0*
+ ID_OUI_FROM_DATABASE=Aker Subsea Ltd
 
-OUI:7014A6*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:5C20D0*
+ ID_OUI_FROM_DATABASE=Asoni Communication Co., Ltd.
 
-OUI:A8667F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:E0C3F3*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:D02598*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:104D77*
+ ID_OUI_FROM_DATABASE=Innovative Computer Engineering
 
-OUI:CC29F5*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:3C081E*
+ ID_OUI_FROM_DATABASE=Beijing Yupont Electric Power Technology Co.,Ltd
 
-OUI:6C709F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:7CA15D*
+ ID_OUI_FROM_DATABASE=GN ReSound A/S
 
-OUI:0C3E9F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B4DD15*
+ ID_OUI_FROM_DATABASE=ControlThings Oy Ab
 
-OUI:34E2FD*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:3C86A8*
+ ID_OUI_FROM_DATABASE=Sangshin elecom .co,, LTD
 
-OUI:609217*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:FCDD55*
+ ID_OUI_FROM_DATABASE=Shenzhen WeWins wireless Co.,Ltd
 
-OUI:8863DF*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:CC0DEC*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:80E650*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:68B094*
+ ID_OUI_FROM_DATABASE=INESA ELECTRON CO.,LTD
 
-OUI:006171*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:40E730*
+ ID_OUI_FROM_DATABASE=DEY Storage Systems, Inc.
 
-OUI:90FD61*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:A8D236*
+ ID_OUI_FROM_DATABASE=Lightware Visual Engineering
 
-OUI:5C97F3*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:6C8686*
+ ID_OUI_FROM_DATABASE=Technonia
 
-OUI:6C4008*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:84E714*
+ ID_OUI_FROM_DATABASE=Liang Herng Enterprise,Co.Ltd.
 
-OUI:24A074*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:303D08*
+ ID_OUI_FROM_DATABASE=GLINTT TES S.A.
 
-OUI:F02475*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:9C541C*
+ ID_OUI_FROM_DATABASE=Shenzhen My-power Technology Co.,Ltd
 
-OUI:20A2E4*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:E496AE*
+ ID_OUI_FROM_DATABASE=ALTOGRAPHICS Inc.
 
-OUI:5CF5DA*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:F80BD0*
+ ID_OUI_FROM_DATABASE=Datang Telecom communication terminal (Tianjin) Co., Ltd.
 
-OUI:D4B8FF*
- ID_OUI_FROM_DATABASE=Home Control Singapore Pte Ltd
+OUI:48B9C2*
+ ID_OUI_FROM_DATABASE=Teletics Inc.
 
-OUI:28E14C*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:D046DC*
+ ID_OUI_FROM_DATABASE=Southwest Research Institute
 
-OUI:54E43A*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:046E49*
+ ID_OUI_FROM_DATABASE=TaiYear Electronic Technology (Suzhou) Co., Ltd
 
-OUI:C8E0EB*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:08606E*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:A88808*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:BC39A6*
+ ID_OUI_FROM_DATABASE=CSUN System Technology Co.,LTD
 
-OUI:907240*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:ECB541*
+ ID_OUI_FROM_DATABASE=SHINANO E and E Co.Ltd.
 
-OUI:0C4DE9*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:D40057*
+ ID_OUI_FROM_DATABASE=MC Technologies GmbH
 
-OUI:D89695*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:48B8DE*
+ ID_OUI_FROM_DATABASE=HOMEWINS TECHNOLOGY CO.,LTD.
 
-OUI:0C3021*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:1065CF*
+ ID_OUI_FROM_DATABASE=IQSIM
 
-OUI:F0F61C*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:849DC5*
+ ID_OUI_FROM_DATABASE=Centera Photonics Inc.
 
-OUI:B03495*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:580943*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:848E0C*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:547FA8*
+ ID_OUI_FROM_DATABASE=TELCO systems, s.r.o.
 
-OUI:8C2DAA*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:5474E6*
+ ID_OUI_FROM_DATABASE=Webtech Wireless
 
-OUI:444C0C*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:AC5D10*
+ ID_OUI_FROM_DATABASE=Pace Americas
 
-OUI:84FCFE*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:88F490*
+ ID_OUI_FROM_DATABASE=Jetmobile Pte Ltd
 
-OUI:E48B7F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:E8A364*
+ ID_OUI_FROM_DATABASE=Signal Path International / Peachtree Audio
 
-OUI:5C969D*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:D0D6CC*
+ ID_OUI_FROM_DATABASE=Wintop
 
-OUI:A8FAD8*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:101D51*
+ ID_OUI_FROM_DATABASE=ON-Q LLC dba ON-Q Mesh Networks
 
-OUI:949426*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:34C99D*
+ ID_OUI_FROM_DATABASE=EIDOLON COMMUNICATIONS TECHNOLOGY CO. LTD.
 
-OUI:E0F5C6*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:8C4AEE*
+ ID_OUI_FROM_DATABASE=GIGA TMS INC
 
-OUI:AC6462*
+OUI:F46DE2*
  ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:C08488*
- ID_OUI_FROM_DATABASE=Finis Inc
+OUI:04F8C2*
+ ID_OUI_FROM_DATABASE=Flaircomm Microelectronics, Inc.
 
-OUI:68E8EB*
- ID_OUI_FROM_DATABASE=Linktel Technologies Co.,Ltd
+OUI:0C93FB*
+ ID_OUI_FROM_DATABASE=BNS Solutions
 
-OUI:20C3A4*
- ID_OUI_FROM_DATABASE=RetailNext
+OUI:38B5BD*
+ ID_OUI_FROM_DATABASE=E.G.O. Elektro-Ger
 
-OUI:780541*
- ID_OUI_FROM_DATABASE=Queclink Wireless Solutions Co., Ltd
+OUI:B85AF7*
+ ID_OUI_FROM_DATABASE=Ouya, Inc
 
-OUI:C02DEE*
- ID_OUI_FROM_DATABASE=Cuff
+OUI:E0D9A2*
+ ID_OUI_FROM_DATABASE=Hippih aps
 
-OUI:54A3FA*
- ID_OUI_FROM_DATABASE=BQT Solutions (Australia)Pty Ltd
+OUI:F0F669*
+ ID_OUI_FROM_DATABASE=Motion Analysis Corporation
 
-OUI:9023EC*
- ID_OUI_FROM_DATABASE=Availink, Inc.
+OUI:F8D7BF*
+ ID_OUI_FROM_DATABASE=REV Ritter GmbH
 
-OUI:7467F7*
- ID_OUI_FROM_DATABASE=Zebra Technologoes
+OUI:00B56D*
+ ID_OUI_FROM_DATABASE=David Electronics Co., LTD.
 
-OUI:3891D5*
- ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+OUI:B461FF*
+ ID_OUI_FROM_DATABASE=Lumigon A/S
 
-OUI:90DFFB*
- ID_OUI_FROM_DATABASE=HOMERIDER SYSTEMS
+OUI:9038DF*
+ ID_OUI_FROM_DATABASE=Changzhou Tiannengbo System Co. Ltd.
 
-OUI:3C831E*
- ID_OUI_FROM_DATABASE=CKD Corporation
+OUI:CC593E*
+ ID_OUI_FROM_DATABASE=TOUMAZ LTD
 
-OUI:381C23*
- ID_OUI_FROM_DATABASE=Hilan Technology CO.,LTD
+OUI:AC8D14*
+ ID_OUI_FROM_DATABASE=Smartrove Inc
 
-OUI:E03676*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:18673F*
+ ID_OUI_FROM_DATABASE=Hanover Displays Limited
 
-OUI:3CB72B*
- ID_OUI_FROM_DATABASE=PLUMgrid Inc
+OUI:A00ABF*
+ ID_OUI_FROM_DATABASE=Wieson Technologies Co., Ltd.
 
-OUI:243184*
- ID_OUI_FROM_DATABASE=SHARP Corporation
+OUI:2091D9*
+ ID_OUI_FROM_DATABASE=I'M SPA
 
-OUI:24DA9B*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:744D79*
+ ID_OUI_FROM_DATABASE=Arrive Systems Inc.
 
-OUI:3052CB*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:C83D97*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:B8B2EB*
- ID_OUI_FROM_DATABASE=Googol Technology (HK) Limited
+OUI:38192F*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:C40049*
- ID_OUI_FROM_DATABASE=Kamama
+OUI:141BF0*
+ ID_OUI_FROM_DATABASE=Intellimedia Systems Ltd
 
-OUI:50A9DE*
- ID_OUI_FROM_DATABASE=Smartcom - Bulgaria AD
+OUI:E45614*
+ ID_OUI_FROM_DATABASE=Suttle Apparatus
 
-OUI:8809AF*
- ID_OUI_FROM_DATABASE=Masimo Corp.
+OUI:842BBC*
+ ID_OUI_FROM_DATABASE=Modelleisenbahn GmbH
 
-OUI:E8DED6*
- ID_OUI_FROM_DATABASE=Intrising Networks, Inc.
+OUI:E856D6*
+ ID_OUI_FROM_DATABASE=NCTech Ltd
 
-OUI:B844D9*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:4088E0*
+ ID_OUI_FROM_DATABASE=Beijing Ereneben Information Technology Limited Shenzhen Branch
 
-OUI:DC2B2A*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:1CF4CA*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:8C10D4*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:F490EA*
+ ID_OUI_FROM_DATABASE=Deciso B.V.
 
-OUI:089B4B*
- ID_OUI_FROM_DATABASE=iKuai Networks
+OUI:942197*
+ ID_OUI_FROM_DATABASE=Stalmart Technology Limited
 
-OUI:3C7873*
- ID_OUI_FROM_DATABASE=Airsonics
+OUI:AC9403*
+ ID_OUI_FROM_DATABASE=Envision Peripherals Inc
 
-OUI:BC5FF6*
- ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
+OUI:A865B2*
+ ID_OUI_FROM_DATABASE=DONGGUAN YISHANG ELECTRONIC TECHNOLOGY CO., LIMITED
 
-OUI:C8F9C8*
- ID_OUI_FROM_DATABASE=NewSharp Technology(SuZhou)Co,Ltd
+OUI:60B982*
+ ID_OUI_FROM_DATABASE=RO.VE.R. Laboratories S.p.A.
 
-OUI:3C5CC3*
- ID_OUI_FROM_DATABASE=Shenzhen First Blue Chip Technology Ltd
+OUI:B46238*
+ ID_OUI_FROM_DATABASE=Exablox
 
-OUI:A8741D*
- ID_OUI_FROM_DATABASE=PHOENIX CONTACT Electronics GmbH
+OUI:40704A*
+ ID_OUI_FROM_DATABASE=Power Idea Technology Limited
 
-OUI:A4C138*
- ID_OUI_FROM_DATABASE=Telink Semiconductor (Taipei) Co. Ltd.
+OUI:A40BED*
+ ID_OUI_FROM_DATABASE=Carry Technology Co.,Ltd
 
-OUI:D8EFCD*
- ID_OUI_FROM_DATABASE=Nokia
+OUI:0CD996*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:EC0133*
- ID_OUI_FROM_DATABASE=TRINUS SYSTEMS INC.
+OUI:D82DE1*
+ ID_OUI_FROM_DATABASE=Tricascade Inc.
 
-OUI:1C56FE*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:C438D3*
+ ID_OUI_FROM_DATABASE=TAGATEC CO.,LTD
 
-OUI:7CA23E*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:547398*
+ ID_OUI_FROM_DATABASE=Toyo Electronics Corporation
 
-OUI:501AA5*
- ID_OUI_FROM_DATABASE=GN Netcom A/S
+OUI:E0AAB0*
+ ID_OUI_FROM_DATABASE=GENERAL VISION ELECTRONICS CO. LTD.
 
-OUI:F09A51*
- ID_OUI_FROM_DATABASE=Shanghai Viroyal Electronic Technology Company Limited
+OUI:68B43A*
+ ID_OUI_FROM_DATABASE=WaterFurnace International, Inc.
 
-OUI:9870E8*
- ID_OUI_FROM_DATABASE=INNATECH SDN BHD
+OUI:543968*
+ ID_OUI_FROM_DATABASE=Edgewater Networks Inc
 
-OUI:50DF95*
- ID_OUI_FROM_DATABASE=Lytx
+OUI:985E1B*
+ ID_OUI_FROM_DATABASE=ConversDigital Co., Ltd.
 
-OUI:584925*
- ID_OUI_FROM_DATABASE=E3 Enterprise
+OUI:B8B7D7*
+ ID_OUI_FROM_DATABASE=2GIG Technologies
 
-OUI:94F278*
- ID_OUI_FROM_DATABASE=Elma Electronic
+OUI:1048B1*
+ ID_OUI_FROM_DATABASE=Beijing Duokan Technology Limited
 
-OUI:E8BDD1*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:005D03*
+ ID_OUI_FROM_DATABASE=Xilinx, Inc
 
-OUI:3481F4*
- ID_OUI_FROM_DATABASE=SST Taiwan Ltd.
+OUI:24EE3A*
+ ID_OUI_FROM_DATABASE=Chengdu Yingji Electronic Hi-tech Co Ltd
 
-OUI:F4B8A7*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:F82285*
+ ID_OUI_FROM_DATABASE=Cypress Technology CO., LTD.
 
-OUI:58F102*
- ID_OUI_FROM_DATABASE=BLU Products Inc.
+OUI:8482F4*
+ ID_OUI_FROM_DATABASE=Beijing Huasun Unicreate Technology Co., Ltd
 
-OUI:B869C2*
- ID_OUI_FROM_DATABASE=Sunitec Enterprise Co., Ltd.
+OUI:0CC47E*
+ ID_OUI_FROM_DATABASE=EUCAST Co., Ltd.
 
-OUI:2CC548*
- ID_OUI_FROM_DATABASE=IAdea Corporation
+OUI:CCE798*
+ ID_OUI_FROM_DATABASE=My Social Stuff
 
-OUI:307CB2*
- ID_OUI_FROM_DATABASE=ANOV FRANCE
+OUI:50724D*
+ ID_OUI_FROM_DATABASE=BEG Brueck Electronic GmbH
 
-OUI:90D8F3*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:B898B0*
+ ID_OUI_FROM_DATABASE=Atlona Inc.
 
-OUI:444CA8*
- ID_OUI_FROM_DATABASE=Arista Networks
+OUI:2C625A*
+ ID_OUI_FROM_DATABASE=Finest Security Systems Co., Ltd
 
-OUI:FCE33C*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:2074CF*
+ ID_OUI_FROM_DATABASE=Shenzhen Voxtech Co.,Ltd
 
-OUI:BC6A2F*
- ID_OUI_FROM_DATABASE=Henge Docks LLC
+OUI:ACBD0B*
+ ID_OUI_FROM_DATABASE=IMAC CO.,LTD
 
-OUI:E4907E*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:D8D27C*
+ ID_OUI_FROM_DATABASE=JEMA ENERGY, SA
 
-OUI:48066A*
- ID_OUI_FROM_DATABASE=Tempered Networks, Inc.
+OUI:10F3DB*
+ ID_OUI_FROM_DATABASE=Gridco Systems, Inc.
 
-OUI:1CF03E*
- ID_OUI_FROM_DATABASE=Wearhaus Inc.
+OUI:B01203*
+ ID_OUI_FROM_DATABASE=Dynamics Hong Kong Limited
 
-OUI:DCDB70*
- ID_OUI_FROM_DATABASE=Tonfunk Systementwicklung und Service GmbH
+OUI:7093F8*
+ ID_OUI_FROM_DATABASE=Space Monkey, Inc.
 
-OUI:C47D46*
- ID_OUI_FROM_DATABASE=FUJITSU LIMITED
+OUI:305D38*
+ ID_OUI_FROM_DATABASE=Beissbarth
 
-OUI:68EDA4*
- ID_OUI_FROM_DATABASE=Shenzhen Seavo Technology Co.,Ltd
+OUI:044A50*
+ ID_OUI_FROM_DATABASE=Ramaxel Technology (Shenzhen) limited company
 
-OUI:B899B0*
- ID_OUI_FROM_DATABASE=Cohere Technologies
+OUI:A4466B*
+ ID_OUI_FROM_DATABASE=EOC Technology
 
-OUI:2CC5D3*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:3CF392*
+ ID_OUI_FROM_DATABASE=Virtualtek. Co. Ltd
 
-OUI:80C5E6*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:889676*
+ ID_OUI_FROM_DATABASE=TTC MARCONI s.r.o.
 
-OUI:D85DEF*
- ID_OUI_FROM_DATABASE=Busch-Jaeger Elektro GmbH
+OUI:149FE8*
+ ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
 
-OUI:10DF8B*
- ID_OUI_FROM_DATABASE=Shenzhen CareDear Communication Technology Co.,Ltd
+OUI:70B599*
+ ID_OUI_FROM_DATABASE=Embedded Technologies s.r.o.
 
-OUI:00A784*
- ID_OUI_FROM_DATABASE=ITX security
+OUI:EC4C4D*
+ ID_OUI_FROM_DATABASE=ZAO NPK RoTeK
 
-OUI:800184*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:E8D483*
+ ID_OUI_FROM_DATABASE=ULTIMATE Europe Transportation Equipment GmbH
 
-OUI:38FACA*
- ID_OUI_FROM_DATABASE=Skyworth Digital Technology(Shenzhen) Co.,Ltd
+OUI:ACD9D6*
+ ID_OUI_FROM_DATABASE=tci GmbH
 
-OUI:44C69B*
- ID_OUI_FROM_DATABASE=Wuhan Feng Tian Information Network CO.,LTD
+OUI:7493A4*
+ ID_OUI_FROM_DATABASE=Zebra Technologies Corp.
 
-OUI:C02567*
- ID_OUI_FROM_DATABASE=Nexxt Solutions
+OUI:9C0DAC*
+ ID_OUI_FROM_DATABASE=Tymphany HK Limited
 
-OUI:B46D35*
- ID_OUI_FROM_DATABASE=Dalian Seasky Automation Co;Ltd
+OUI:8CD3A2*
+ ID_OUI_FROM_DATABASE=VisSim AS
 
-OUI:B89ACD*
- ID_OUI_FROM_DATABASE=ELITE OPTOELECTRONIC(ASIA)CO.,LTD
+OUI:647657*
+ ID_OUI_FROM_DATABASE=Innovative Security Designs
 
-OUI:241C04*
- ID_OUI_FROM_DATABASE=SHENZHEN JEHE TECHNOLOGY DEVELOPMENT CO., LTD.
+OUI:60455E*
+ ID_OUI_FROM_DATABASE=Liptel s.r.o.
 
-OUI:F8CFC5*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:944A09*
+ ID_OUI_FROM_DATABASE=BitWise Controls
 
-OUI:BCF811*
- ID_OUI_FROM_DATABASE=Xiamen DNAKE Technology Co.,Ltd
+OUI:E8102E*
+ ID_OUI_FROM_DATABASE=Really Simple Software, Inc
 
-OUI:A8827F*
- ID_OUI_FROM_DATABASE=CIBN Oriental Network(Beijing) CO.,Ltd
+OUI:D48CB5*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:609C9F*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:D41E35*
+ ID_OUI_FROM_DATABASE=TOHO Electronics INC.
 
-OUI:900A39*
- ID_OUI_FROM_DATABASE=Wiio, Inc.
+OUI:700BC0*
+ ID_OUI_FROM_DATABASE=Dewav Technology Company
 
-OUI:C4693E*
- ID_OUI_FROM_DATABASE=Turbulence Design Inc.
+OUI:2CD444*
+ ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
-OUI:1C8341*
- ID_OUI_FROM_DATABASE=Hefei Bitland Information Technology Co.Ltd
+OUI:EC1A59*
+ ID_OUI_FROM_DATABASE=Belkin International Inc.
+
+OUI:60CBFB*
+ ID_OUI_FROM_DATABASE=AirScape Inc.
 
-OUI:4011DC*
- ID_OUI_FROM_DATABASE=Sonance
+OUI:4C5427*
+ ID_OUI_FROM_DATABASE=Linepro Sp. z o.o.
 
-OUI:249EAB*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:3CEAFB*
+ ID_OUI_FROM_DATABASE=NSE AG
 
-OUI:DC56E6*
- ID_OUI_FROM_DATABASE=Shenzhen Bococom Technology Co.,LTD
+OUI:3476C5*
+ ID_OUI_FROM_DATABASE=I-O DATA DEVICE, INC.
 
-OUI:5CA178*
- ID_OUI_FROM_DATABASE=TableTop Media (dba Ziosk)
+OUI:407074*
+ ID_OUI_FROM_DATABASE=Life Technology (China) Co., Ltd
 
-OUI:702A7D*
- ID_OUI_FROM_DATABASE=EpSpot AB
+OUI:58BFEA*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:B8B3DC*
- ID_OUI_FROM_DATABASE=DEREK (SHAOGUAN) LIMITED
+OUI:7C386C*
+ ID_OUI_FROM_DATABASE=Real Time Logic
 
-OUI:6C1E70*
- ID_OUI_FROM_DATABASE=Guangzhou YBDS IT Co.,Ltd
+OUI:D8AF3B*
+ ID_OUI_FROM_DATABASE=Hangzhou Bigbright Integrated communications system Co.,Ltd
 
-OUI:C8E130*
- ID_OUI_FROM_DATABASE=Milkyway Group Ltd
+OUI:78D34F*
+ ID_OUI_FROM_DATABASE=Pace-O-Matic, Inc.
 
-OUI:8833BE*
- ID_OUI_FROM_DATABASE=Ivenix, Inc.
+OUI:784405*
+ ID_OUI_FROM_DATABASE=FUJITU(HONG KONG) ELECTRONIC Co.,LTD.
 
-OUI:34CC28*
- ID_OUI_FROM_DATABASE=Nexpring Co. LTD.,
+OUI:C03F2A*
+ ID_OUI_FROM_DATABASE=Biscotti, Inc.
 
-OUI:144146*
- ID_OUI_FROM_DATABASE=Honeywell (China) Co., LTD
+OUI:44B382*
+ ID_OUI_FROM_DATABASE=Kuang-chi Institute of Advanced Technology
 
-OUI:F41563*
- ID_OUI_FROM_DATABASE=F5 Networks, Inc.
+OUI:D80DE3*
+ ID_OUI_FROM_DATABASE=FXI TECHNOLOGIES AS
 
-OUI:C4EA1D*
- ID_OUI_FROM_DATABASE=Technicolor
+OUI:1CE165*
+ ID_OUI_FROM_DATABASE=Marshal Corporation
 
-OUI:20E407*
- ID_OUI_FROM_DATABASE=Spark srl
+OUI:0CC0C0*
+ ID_OUI_FROM_DATABASE=MAGNETI MARELLI SISTEMAS ELECTRONICOS MEXICO
 
-OUI:887384*
- ID_OUI_FROM_DATABASE=Toshiba
+OUI:AC40EA*
+ ID_OUI_FROM_DATABASE=C&T Solution Inc.
 
-OUI:584704*
- ID_OUI_FROM_DATABASE=Shenzhen Webridge Technology Co.,Ltd
+OUI:BC8B55*
+ ID_OUI_FROM_DATABASE=NPP ELIKS America Inc. DBA T&M Atlantic
 
-OUI:749CE3*
- ID_OUI_FROM_DATABASE=Art2Wave Canada Inc.
+OUI:202598*
+ ID_OUI_FROM_DATABASE=Teleview
 
-OUI:B856BD*
- ID_OUI_FROM_DATABASE=ITT LLC
+OUI:844915*
+ ID_OUI_FROM_DATABASE=vArmour Networks, Inc.
 
-OUI:107873*
- ID_OUI_FROM_DATABASE=Shenzhen Jinkeyi Communication Co., Ltd.
+OUI:A04CC1*
+ ID_OUI_FROM_DATABASE=Helixtech Corp.
 
-OUI:D45556*
- ID_OUI_FROM_DATABASE=Fiber Mountain Inc.
+OUI:1CB243*
+ ID_OUI_FROM_DATABASE=TDC A/S
 
-OUI:F01E34*
- ID_OUI_FROM_DATABASE=ORICO Technologies Co., Ltd
+OUI:1C51B5*
+ ID_OUI_FROM_DATABASE=Techaya LTD
 
-OUI:74A063*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:80DB31*
+ ID_OUI_FROM_DATABASE=Power Quotient International Co., Ltd.
 
-OUI:A89008*
- ID_OUI_FROM_DATABASE=Beijing Yuecheng Technology Co. Ltd.
+OUI:AC0142*
+ ID_OUI_FROM_DATABASE=Uriel Technologies SIA
 
-OUI:183864*
- ID_OUI_FROM_DATABASE=CAP-TECH INTERNATIONAL CO., LTD.
+OUI:A007B6*
+ ID_OUI_FROM_DATABASE=Advanced Technical Support, Inc.
 
-OUI:08D34B*
- ID_OUI_FROM_DATABASE=Techman Electronics (Changshu) Co., Ltd.
+OUI:542A9C*
+ ID_OUI_FROM_DATABASE=LSY Defense, LLC.
 
-OUI:C808E9*
- ID_OUI_FROM_DATABASE=LG Electronics
+OUI:F89955*
+ ID_OUI_FROM_DATABASE=Fortress Technology Inc
 
-OUI:78ACBF*
- ID_OUI_FROM_DATABASE=Igneous Systems
+OUI:B827EB*
+ ID_OUI_FROM_DATABASE=Raspberry Pi Foundation
 
-OUI:206274*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:E88DF5*
+ ID_OUI_FROM_DATABASE=ZNYX Networks, Inc.
 
-OUI:5CCCFF*
- ID_OUI_FROM_DATABASE=Techroutes Network Pvt Ltd
+OUI:48EA63*
+ ID_OUI_FROM_DATABASE=Zhejiang Uniview Technologies Co., Ltd.
 
-OUI:844BB7*
- ID_OUI_FROM_DATABASE=Beijing Sankuai Online Technology Co.,Ltd
+OUI:0CE5D3*
+ ID_OUI_FROM_DATABASE=DH electronics GmbH
 
-OUI:148F21*
- ID_OUI_FROM_DATABASE=Garmin International
+OUI:C47130*
+ ID_OUI_FROM_DATABASE=Fon Technology S.L.
 
-OUI:3C6A9D*
- ID_OUI_FROM_DATABASE=Dexatek Technology LTD.
+OUI:48D7FF*
+ ID_OUI_FROM_DATABASE=BLANKOM Antennentechnik GmbH
 
-OUI:14893E*
- ID_OUI_FROM_DATABASE=VIXTEL TECHNOLOGIES LIMTED
+OUI:F47F35*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:60F189*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:A0F419*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:74A34A*
- ID_OUI_FROM_DATABASE=ZIMI CORPORATION
+OUI:BCC168*
+ ID_OUI_FROM_DATABASE=DinBox Sverige AB
 
-OUI:98F5A9*
- ID_OUI_FROM_DATABASE=OHSUNG ELECTRONICS CO.,LTD.
+OUI:6CAE8B*
+ ID_OUI_FROM_DATABASE=IBM Corporation
 
-OUI:D89341*
- ID_OUI_FROM_DATABASE=General Electric Global Research
+OUI:A4F7D0*
+ ID_OUI_FROM_DATABASE=LAN Accessories Co., Ltd.
 
-OUI:F4645D*
- ID_OUI_FROM_DATABASE=Toshiba
+OUI:D4EC0C*
+ ID_OUI_FROM_DATABASE=Harley-Davidson Motor Company
 
-OUI:30D587*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:6CA96F*
+ ID_OUI_FROM_DATABASE=TransPacket AS
 
-OUI:1436C6*
- ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
+OUI:48ED80*
+ ID_OUI_FROM_DATABASE=daesung eltec
 
-OUI:04C09C*
- ID_OUI_FROM_DATABASE=Tellabs Inc.
+OUI:A086EC*
+ ID_OUI_FROM_DATABASE=SAEHAN HITEC Co., Ltd
 
-OUI:844464*
- ID_OUI_FROM_DATABASE=ServerU Inc
+OUI:BC4B79*
+ ID_OUI_FROM_DATABASE=SensingTek
 
-OUI:589B0B*
- ID_OUI_FROM_DATABASE=Shineway Technologies, Inc.
+OUI:2818FD*
+ ID_OUI_FROM_DATABASE=Aditya Infotech Ltd.
 
-OUI:A48CDB*
- ID_OUI_FROM_DATABASE=Lenovo
+OUI:E42C56*
+ ID_OUI_FROM_DATABASE=Lilee Systems, Ltd.
 
-OUI:4062B6*
- ID_OUI_FROM_DATABASE=Tele system communication
+OUI:50008C*
+ ID_OUI_FROM_DATABASE=Hong Kong Telecommunications (HKT) Limited
 
-OUI:3C2C94*
- ID_OUI_FROM_DATABASE=杭州德澜科技有限公司(HangZhou Delan Technology Co.,Ltd)
+OUI:DCA8CF*
+ ID_OUI_FROM_DATABASE=New Spin Golf, LLC.
 
-OUI:78312B*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:34BA9A*
+ ID_OUI_FROM_DATABASE=Asiatelco Technologies Co.
 
-OUI:C035C5*
- ID_OUI_FROM_DATABASE=Prosoft Systems LTD
+OUI:642DB7*
+ ID_OUI_FROM_DATABASE=SEUNGIL ELECTRONICS
 
-OUI:F8B2F3*
- ID_OUI_FROM_DATABASE=GUANGZHOU BOSMA TECHNOLOGY CO.,LTD
+OUI:008DDA*
+ ID_OUI_FROM_DATABASE=Link One Co., Ltd.
 
-OUI:1C7D22*
- ID_OUI_FROM_DATABASE=Fuji Xerox Co., Ltd.
+OUI:08B4CF*
+ ID_OUI_FROM_DATABASE=Abicom International
 
-OUI:7C11CD*
- ID_OUI_FROM_DATABASE=QianTang Technology
+OUI:445F7A*
+ ID_OUI_FROM_DATABASE=Shihlin Electric & Engineering Corp.
 
-OUI:0492EE*
- ID_OUI_FROM_DATABASE=iway AG
+OUI:28BA18*
+ ID_OUI_FROM_DATABASE=NextNav, LLC
 
-OUI:F02A23*
- ID_OUI_FROM_DATABASE=Creative Next Design
+OUI:2C36F8*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:8C9109*
- ID_OUI_FROM_DATABASE=Toyoshima Electric Technoeogy(Suzhou) Co.,Ltd.
+OUI:AC3D05*
+ ID_OUI_FROM_DATABASE=Instorescreen Aisa
 
-OUI:307350*
- ID_OUI_FROM_DATABASE=Inpeco SA
+OUI:F48E09*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:E8CC18*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:D443A8*
+ ID_OUI_FROM_DATABASE=Changzhou Haojie Electric Co., Ltd.
 
-OUI:B09137*
- ID_OUI_FROM_DATABASE=ISis ImageStream Internet Solutions, Inc
+OUI:BCB852*
+ ID_OUI_FROM_DATABASE=Cybera, Inc.
 
-OUI:3C1E13*
- ID_OUI_FROM_DATABASE=HANGZHOU SUNRISE TECHNOLOGY CO., LTD
+OUI:70D6B6*
+ ID_OUI_FROM_DATABASE=Metrum Technologies
 
-OUI:B4A828*
- ID_OUI_FROM_DATABASE=Shenzhen Concox Information Technology Co., Ltd
+OUI:28D576*
+ ID_OUI_FROM_DATABASE=Premier Wireless, Inc.
 
-OUI:A41242*
- ID_OUI_FROM_DATABASE=NEC Platforms, Ltd.
+OUI:6CE907*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:404EEB*
- ID_OUI_FROM_DATABASE=Higher Way Electronic Co., Ltd.
+OUI:94DF58*
+ ID_OUI_FROM_DATABASE=IJ Electron CO.,Ltd.
 
-OUI:50BD5F*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:8C0CA3*
+ ID_OUI_FROM_DATABASE=Amper
 
-OUI:147590*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:28940F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:ECB907*
- ID_OUI_FROM_DATABASE=CloudGenix Inc
+OUI:5CEB4E*
+ ID_OUI_FROM_DATABASE=R. STAHL HMI Systems GmbH
 
-OUI:5CF9F0*
- ID_OUI_FROM_DATABASE=Atomos Engineering P/L
+OUI:B8DAF7*
+ ID_OUI_FROM_DATABASE=Advanced Photonics, Inc.
 
-OUI:FCDBB3*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:2C36A0*
+ ID_OUI_FROM_DATABASE=Capisco Limited
 
-OUI:B8186F*
- ID_OUI_FROM_DATABASE=ORIENTAL MOTOR CO., LTD.
+OUI:800A06*
+ ID_OUI_FROM_DATABASE=COMTEC co.,ltd
 
-OUI:1C9C26*
- ID_OUI_FROM_DATABASE=Zoovel Technologies
+OUI:20FABB*
+ ID_OUI_FROM_DATABASE=Cambridge Executive Limited
 
-OUI:9C3583*
- ID_OUI_FROM_DATABASE=Nipro Diagnostics, Inc
+OUI:1C0B52*
+ ID_OUI_FROM_DATABASE=EPICOM S.A
 
-OUI:C456FE*
- ID_OUI_FROM_DATABASE=Lava International Ltd.
+OUI:747E2D*
+ ID_OUI_FROM_DATABASE=Beijing Thomson CITIC Digital Technology Co. LTD.
 
-OUI:B89BE4*
- ID_OUI_FROM_DATABASE=ABB Power Systems Power Generation
+OUI:E80C75*
+ ID_OUI_FROM_DATABASE=Syncbak, Inc.
 
-OUI:C0EEFB*
- ID_OUI_FROM_DATABASE=OnePlus Tech (Shenzhen) Ltd
+OUI:18D66A*
+ ID_OUI_FROM_DATABASE=Inmarsat
 
-OUI:108A1B*
- ID_OUI_FROM_DATABASE=RAONIX Inc.
+OUI:C85645*
+ ID_OUI_FROM_DATABASE=Intermas France
 
-OUI:8CF813*
- ID_OUI_FROM_DATABASE=ORANGE POLSKA
+OUI:8C604F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:B8F317*
- ID_OUI_FROM_DATABASE=iSun Smasher Communications Private Limited
+OUI:74FF7D*
+ ID_OUI_FROM_DATABASE=Wren Sound Systems, LLC
 
-OUI:2442BC*
- ID_OUI_FROM_DATABASE=Alinco,incorporated
+OUI:30B216*
+ ID_OUI_FROM_DATABASE=Hytec Geraetebau GmbH
 
-OUI:C401CE*
- ID_OUI_FROM_DATABASE=PRESITION (2000) CO., LTD.
+OUI:34FC6F*
+ ID_OUI_FROM_DATABASE=ALCEA
 
-OUI:D01242*
- ID_OUI_FROM_DATABASE=BIOS Corporation
+OUI:C0B357*
+ ID_OUI_FROM_DATABASE=Yoshiki Electronics Industry Ltd.
 
-OUI:50F43C*
- ID_OUI_FROM_DATABASE=Leeo Inc
+OUI:D8BF4C*
+ ID_OUI_FROM_DATABASE=Victory Concept Electronics Limited
 
-OUI:B43934*
- ID_OUI_FROM_DATABASE=Pen Generations, Inc.
+OUI:C0DF77*
+ ID_OUI_FROM_DATABASE=Conrad Electronic SE
 
-OUI:DCC622*
- ID_OUI_FROM_DATABASE=BUHEUNG SYSTEM
+OUI:C86000*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:5C2BF5*
- ID_OUI_FROM_DATABASE=Vivint
+OUI:645299*
+ ID_OUI_FROM_DATABASE=The Chamberlain Group, Inc
 
-OUI:D062A0*
- ID_OUI_FROM_DATABASE=China Essence Technology (Zhumadian) Co., Ltd.
+OUI:BC125E*
+ ID_OUI_FROM_DATABASE=Beijing  WisVideo  INC.
 
-OUI:CC10A3*
- ID_OUI_FROM_DATABASE=Beijing Nan Bao Technology Co., Ltd.
+OUI:C80718*
+ ID_OUI_FROM_DATABASE=TDSi
 
-OUI:2CA30E*
- ID_OUI_FROM_DATABASE=POWER DRAGON DEVELOPMENT LIMITED
+OUI:B4944E*
+ ID_OUI_FROM_DATABASE=WeTelecom Co., Ltd.
 
-OUI:4CF5A0*
- ID_OUI_FROM_DATABASE=Scalable Network Technologies Inc
+OUI:345B11*
+ ID_OUI_FROM_DATABASE=EVI HEAT AB
 
-OUI:084656*
- ID_OUI_FROM_DATABASE=VEO-LABS
+OUI:988BAD*
+ ID_OUI_FROM_DATABASE=Corintech Ltd.
 
-OUI:4488CB*
- ID_OUI_FROM_DATABASE=Camco Technologies NV
+OUI:4050E0*
+ ID_OUI_FROM_DATABASE=Milton Security Group LLC
 
-OUI:5014B5*
- ID_OUI_FROM_DATABASE=Richfit Information Technology Co., Ltd
+OUI:C87CBC*
+ ID_OUI_FROM_DATABASE=Valink Co., Ltd.
 
-OUI:CC3080*
- ID_OUI_FROM_DATABASE=VAIO Corporation
+OUI:409FC7*
+ ID_OUI_FROM_DATABASE=BAEKCHUN I&C Co., Ltd.
 
-OUI:F82441*
- ID_OUI_FROM_DATABASE=Yeelink
+OUI:C87D77*
+ ID_OUI_FROM_DATABASE=Shenzhen Kingtech Communication Equipment Co.,Ltd
 
-OUI:6CBFB5*
- ID_OUI_FROM_DATABASE=Noon Technology Co., Ltd
+OUI:A078BA*
+ ID_OUI_FROM_DATABASE=Pantech Co., Ltd.
 
-OUI:489D18*
- ID_OUI_FROM_DATABASE=Flashbay Limited
+OUI:D4507A*
+ ID_OUI_FROM_DATABASE=CEIVA Logic, Inc
 
-OUI:8CB094*
- ID_OUI_FROM_DATABASE=Airtech I&C Co., Ltd
+OUI:9CC7D1*
+ ID_OUI_FROM_DATABASE=SHARP Corporation
 
-OUI:70F196*
- ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
+OUI:00B9F6*
+ ID_OUI_FROM_DATABASE=Shenzhen Super Rich Electronics Co.,Ltd
 
-OUI:6C6EFE*
- ID_OUI_FROM_DATABASE=Core Logic Inc.
+OUI:9C5C8D*
+ ID_OUI_FROM_DATABASE=FIREMAX INDÚSTRIA E COMÉRCIO DE PRODUTOS ELETRÔNICOS  LTDA
 
-OUI:E4C62B*
- ID_OUI_FROM_DATABASE=Airware
+OUI:E01E07*
+ ID_OUI_FROM_DATABASE=Anite Telecoms  US. Inc
 
-OUI:80F8EB*
- ID_OUI_FROM_DATABASE=RayTight
+OUI:B06CBF*
+ ID_OUI_FROM_DATABASE=3ality Digital Systems GmbH
 
-OUI:94B40F*
- ID_OUI_FROM_DATABASE=Aruba Networks
+OUI:20AA4B*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
-OUI:4C2C83*
- ID_OUI_FROM_DATABASE=Zhejiang KaNong Network Technology Co.,Ltd.
+OUI:080D84*
+ ID_OUI_FROM_DATABASE=GECO, Inc.
 
-OUI:BCC342*
- ID_OUI_FROM_DATABASE=Panasonic System Networks Co., Ltd.
+OUI:88E712*
+ ID_OUI_FROM_DATABASE=Whirlpool Corporation
 
-OUI:E89606*
- ID_OUI_FROM_DATABASE=testo Instruments (Shenzhen) Co., Ltd.
+OUI:644BF0*
+ ID_OUI_FROM_DATABASE=CalDigit, Inc
 
-OUI:CC3F1D*
- ID_OUI_FROM_DATABASE=Intesis Software SL
+OUI:2838CF*
+ ID_OUI_FROM_DATABASE=Gen2wave
 
-OUI:902181*
- ID_OUI_FROM_DATABASE=Shanghai Huaqin Telecom Technology Co.,Ltd
+OUI:50FC30*
+ ID_OUI_FROM_DATABASE=Treehouse Labs
 
-OUI:600417*
- ID_OUI_FROM_DATABASE=POSBANK CO.,LTD
+OUI:70704C*
+ ID_OUI_FROM_DATABASE=Purple Communications, Inc
 
-OUI:A44AD3*
- ID_OUI_FROM_DATABASE=ST Electronics(Shanghai) Co.,Ltd
+OUI:F47ACC*
+ ID_OUI_FROM_DATABASE=SolidFire, Inc.
 
-OUI:2497ED*
- ID_OUI_FROM_DATABASE=Techvision Intelligent Technology Limited
+OUI:24BC82*
+ ID_OUI_FROM_DATABASE=Dali Wireless, Inc.
 
-OUI:104E07*
- ID_OUI_FROM_DATABASE=Shanghai Genvision Industries Co.,Ltd
+OUI:64C5AA*
+ ID_OUI_FROM_DATABASE=South African Broadcasting Corporation
 
-OUI:4C11BF*
- ID_OUI_FROM_DATABASE=ZHEJIANG DAHUA TECHNOLOGY CO.,LTD.
+OUI:64ED62*
+ ID_OUI_FROM_DATABASE=WOORI SYSTEMS Co., Ltd
 
-OUI:FCD5D9*
- ID_OUI_FROM_DATABASE=Shenzhen SDMC Technology Co., Ltd.
+OUI:C4237A*
+ ID_OUI_FROM_DATABASE=WhizNets Inc.
 
-OUI:007532*
- ID_OUI_FROM_DATABASE=INID BV
+OUI:8430E5*
+ ID_OUI_FROM_DATABASE=SkyHawke Technologies, LLC
 
-OUI:A002DC*
- ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+OUI:2C002C*
+ ID_OUI_FROM_DATABASE=UNOWHY
 
-OUI:907EBA*
- ID_OUI_FROM_DATABASE=UTEK TECHNOLOGY (SHENZHEN) CO.,LTD
+OUI:0481AE*
+ ID_OUI_FROM_DATABASE=Clack Corporation
 
-OUI:488244*
- ID_OUI_FROM_DATABASE=Life Fitness / Div. of Brunswick
+OUI:C09132*
+ ID_OUI_FROM_DATABASE=Patriot Memory
 
-OUI:A8F7E0*
- ID_OUI_FROM_DATABASE=PLANET Technology Corporation
+OUI:A898C6*
+ ID_OUI_FROM_DATABASE=Shinbo Co., Ltd.
 
-OUI:2C5BE1*
- ID_OUI_FROM_DATABASE=Centripetal Networks, Inc
+OUI:006BA0*
+ ID_OUI_FROM_DATABASE=SHENZHEN UNIVERSAL INTELLISYS PTE LTD
 
-OUI:D87EB1*
- ID_OUI_FROM_DATABASE=x.o.ware, inc.
+OUI:502690*
+ ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
-OUI:4045DA*
- ID_OUI_FROM_DATABASE=Spreadtrum Communications (Shanghai) Co., Ltd.
+OUI:B4211D*
+ ID_OUI_FROM_DATABASE=Beijing GuangXin Technology Co., Ltd
 
-OUI:98BE94*
- ID_OUI_FROM_DATABASE=IBM
+OUI:E039D7*
+ ID_OUI_FROM_DATABASE=Plexxi, Inc.
 
-OUI:D4B43E*
- ID_OUI_FROM_DATABASE=Messcomp Datentechnik GmbH
+OUI:FC946C*
+ ID_OUI_FROM_DATABASE=UBIVELOX
 
-OUI:A8E539*
- ID_OUI_FROM_DATABASE=Moimstone Co.,Ltd
+OUI:38DE60*
+ ID_OUI_FROM_DATABASE=Mohlenhoff GmbH
 
-OUI:98F170*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:2839E7*
+ ID_OUI_FROM_DATABASE=Preceno Technology Pte.Ltd.
 
-OUI:04C991*
- ID_OUI_FROM_DATABASE=Phistek INC.
+OUI:28D997*
+ ID_OUI_FROM_DATABASE=Yuduan Mobile Co., Ltd.
 
-OUI:581F67*
- ID_OUI_FROM_DATABASE=Open-m technology limited
+OUI:886B76*
+ ID_OUI_FROM_DATABASE=CHINA HOPEFUL GROUP HOPEFUL ELECTRIC CO.,LTD
 
-OUI:BC25F0*
- ID_OUI_FROM_DATABASE=3D Display Technologies Co., Ltd.
+OUI:A0CF5B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:7CE524*
- ID_OUI_FROM_DATABASE=Quirky, Inc.
+OUI:18C451*
+ ID_OUI_FROM_DATABASE=Tucson Embedded Systems
 
-OUI:D85DFB*
- ID_OUI_FROM_DATABASE=Private
+OUI:582EFE*
+ ID_OUI_FROM_DATABASE=Lighting Science Group
 
-OUI:7CC4EF*
- ID_OUI_FROM_DATABASE=Devialet
+OUI:F8D3A9*
+ ID_OUI_FROM_DATABASE=AXAN Networks
 
-OUI:94AEE3*
- ID_OUI_FROM_DATABASE=Belden Hirschmann Industries (Suzhou) Ltd.
+OUI:5CD4AB*
+ ID_OUI_FROM_DATABASE=Zektor
 
-OUI:44666E*
- ID_OUI_FROM_DATABASE=IP-LINE
+OUI:F8462D*
+ ID_OUI_FROM_DATABASE=SYNTEC Incorporation
 
-OUI:705B2E*
- ID_OUI_FROM_DATABASE=M2Communication Inc.
+OUI:58677F*
+ ID_OUI_FROM_DATABASE=Clare Controls Inc.
 
-OUI:0C8C8F*
- ID_OUI_FROM_DATABASE=Kamo Technology Limited
+OUI:CCA374*
+ ID_OUI_FROM_DATABASE=Guangdong Guanglian Electronic Technology Co.Ltd
 
-OUI:F4FD2B*
- ID_OUI_FROM_DATABASE=ZOYI Company
+OUI:50F61A*
+ ID_OUI_FROM_DATABASE=Kunshan JADE Technologies co., Ltd.
 
-OUI:FCAA14*
- ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
+OUI:20BBC6*
+ ID_OUI_FROM_DATABASE=Jabil Circuit Hungary Ltd.
 
-OUI:50FEF2*
- ID_OUI_FROM_DATABASE=Sify Technologies Ltd
+OUI:2C9717*
+ ID_OUI_FROM_DATABASE=I.C.Y. B.V.
 
-OUI:3CD9CE*
- ID_OUI_FROM_DATABASE=Eclipse WiFi
+OUI:64E84F*
+ ID_OUI_FROM_DATABASE=Serialway Communication Technology Co. Ltd
 
-OUI:C80210*
- ID_OUI_FROM_DATABASE=LG Innotek
+OUI:941D1C*
+ ID_OUI_FROM_DATABASE=TLab West Systems AB
 
-OUI:702DD1*
- ID_OUI_FROM_DATABASE=Newings Communication CO., LTD.
+OUI:40667A*
+ ID_OUI_FROM_DATABASE=mediola - connected living AG
 
-OUI:44746C*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:64808B*
+ ID_OUI_FROM_DATABASE=VG Controls, Inc.
 
-OUI:F4F646*
- ID_OUI_FROM_DATABASE=Dediprog Technology Co. Ltd.
+OUI:7C6B52*
+ ID_OUI_FROM_DATABASE=Tigaro Wireless
 
-OUI:ECD9D1*
- ID_OUI_FROM_DATABASE=Shenzhen TG-NET Botone Technology Co.,Ltd.
+OUI:046D42*
+ ID_OUI_FROM_DATABASE=Bryston Ltd.
 
-OUI:748F4D*
- ID_OUI_FROM_DATABASE=MEN Mikro Elektronik GmbH
+OUI:D0CF5E*
+ ID_OUI_FROM_DATABASE=Energy Micro AS
 
-OUI:A47E39*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:644D70*
+ ID_OUI_FROM_DATABASE=dSPACE GmbH
 
-OUI:0C63FC*
- ID_OUI_FROM_DATABASE=Nanjing Signway Technology Co., Ltd
+OUI:807693*
+ ID_OUI_FROM_DATABASE=Newag SA
 
-OUI:ACA9A0*
- ID_OUI_FROM_DATABASE=Audioengine, Ltd.
+OUI:FC1794*
+ ID_OUI_FROM_DATABASE=InterCreative Co., Ltd
 
-OUI:A8A668*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:181420*
+ ID_OUI_FROM_DATABASE=TEB SAS
 
-OUI:60E327*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:D03110*
+ ID_OUI_FROM_DATABASE=Ingenic Semiconductor Co.,Ltd
 
-OUI:E4D332*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:AC81F3*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:A0DA92*
- ID_OUI_FROM_DATABASE=Nanjing Glarun Atten Technology Co. Ltd.
+OUI:94C6EB*
+ ID_OUI_FROM_DATABASE=NOVA electronics, Inc.
 
-OUI:6828BA*
- ID_OUI_FROM_DATABASE=Dejai
+OUI:10F9EE*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:48D18E*
- ID_OUI_FROM_DATABASE=Metis Communication Co.,Ltd
+OUI:80971B*
+ ID_OUI_FROM_DATABASE=Altenergy Power System,Inc.
 
-OUI:A49F85*
- ID_OUI_FROM_DATABASE=Lyve Minds, Inc
+OUI:1071F9*
+ ID_OUI_FROM_DATABASE=Cloud Telecomputers, LLC
 
-OUI:7CD30A*
- ID_OUI_FROM_DATABASE=INVENTEC Corporation
+OUI:C47B2F*
+ ID_OUI_FROM_DATABASE=Beijing JoinHope Image Technology Ltd.
 
-OUI:3481C4*
- ID_OUI_FROM_DATABASE=AVM GmbH
+OUI:18F650*
+ ID_OUI_FROM_DATABASE=Multimedia Pacific Limited
 
-OUI:885BDD*
- ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
+OUI:704AAE*
+ ID_OUI_FROM_DATABASE=Xstream Flow (Pty) Ltd
 
-OUI:085700*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:9C934E*
+ ID_OUI_FROM_DATABASE=Xerox Corporation
 
-OUI:888914*
- ID_OUI_FROM_DATABASE=All Components Incorporated
+OUI:3C26D5*
+ ID_OUI_FROM_DATABASE=Sotera Wireless
 
-OUI:D8150D*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:FC2E2D*
+ ID_OUI_FROM_DATABASE=Lorom Industrial Co.LTD.
 
-OUI:A06518*
- ID_OUI_FROM_DATABASE=VNPT TECHNOLOGY
+OUI:E84E06*
+ ID_OUI_FROM_DATABASE=EDUP INTERNATIONAL (HK) CO., LTD
 
-OUI:748F1B*
- ID_OUI_FROM_DATABASE=MasterImage 3D
+OUI:E8C320*
+ ID_OUI_FROM_DATABASE=Austco Communication Systems Pty Ltd
 
-OUI:F03A4B*
- ID_OUI_FROM_DATABASE=Bloombase, Inc.
+OUI:D8973B*
+ ID_OUI_FROM_DATABASE=Artesyn Embedded Technologies
 
-OUI:D82A15*
- ID_OUI_FROM_DATABASE=Leitner SpA
+OUI:008D4E*
+ ID_OUI_FROM_DATABASE=CJSC NII STT
 
-OUI:C4291D*
- ID_OUI_FROM_DATABASE=KLEMSAN ELEKTRIK ELEKTRONIK SAN.VE TIC.AS.
+OUI:10C586*
+ ID_OUI_FROM_DATABASE=BIO SOUND LAB CO., LTD.
 
-OUI:704E01*
- ID_OUI_FROM_DATABASE=KWANGWON TECH CO., LTD.
+OUI:E8BA70*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:848433*
- ID_OUI_FROM_DATABASE=Paradox Engineering SA
+OUI:6473E2*
+ ID_OUI_FROM_DATABASE=Arbiter Systems, Inc.
 
-OUI:D4319D*
- ID_OUI_FROM_DATABASE=Sinwatec
+OUI:00A1DE*
+ ID_OUI_FROM_DATABASE=ShenZhen ShiHua Technology CO.,LTD
 
-OUI:DC052F*
- ID_OUI_FROM_DATABASE=National Products Inc.
+OUI:04E1C8*
+ ID_OUI_FROM_DATABASE=IMS Soluções em Energia Ltda.
 
-OUI:CC398C*
- ID_OUI_FROM_DATABASE=Shiningtek
+OUI:E4DD79*
+ ID_OUI_FROM_DATABASE=En-Vision America, Inc.
 
-OUI:6C5F1C*
- ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
+OUI:60190C*
+ ID_OUI_FROM_DATABASE=RRAMAC
 
-OUI:B42C92*
- ID_OUI_FROM_DATABASE=Zhejiang Weirong Electronic Co., Ltd
+OUI:34A709*
+ ID_OUI_FROM_DATABASE=Trevil srl
 
-OUI:FC1349*
- ID_OUI_FROM_DATABASE=Global Apps Corp.
+OUI:F80332*
+ ID_OUI_FROM_DATABASE=Khomp
 
-OUI:8C41F2*
- ID_OUI_FROM_DATABASE=RDA Technologies Ltd.
+OUI:C40F09*
+ ID_OUI_FROM_DATABASE=Hermes electronic GmbH
 
-OUI:FC07A0*
- ID_OUI_FROM_DATABASE=LRE Medical GmbH
+OUI:908D1D*
+ ID_OUI_FROM_DATABASE=GH Technologies
 
-OUI:AC02CA*
- ID_OUI_FROM_DATABASE=HI Solutions, Inc.
+OUI:CCB55A*
+ ID_OUI_FROM_DATABASE=Fraunhofer ITWM
 
-OUI:F490CA*
- ID_OUI_FROM_DATABASE=Tensorcom
+OUI:587521*
+ ID_OUI_FROM_DATABASE=CJSC RTSoft
 
-OUI:2C534A*
- ID_OUI_FROM_DATABASE=Shenzhen Winyao Electronic Limited
+OUI:64D989*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:CC856C*
- ID_OUI_FROM_DATABASE=SHENZHEN MDK DIGITAL TECHNOLOGY CO.,LTD
+OUI:44D3CA*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:60FFDD*
- ID_OUI_FROM_DATABASE=C.E. ELECTRONICS, INC
+OUI:24DAB6*
+ ID_OUI_FROM_DATABASE=Sistemas de Gestión Energética S.A. de C.V
 
-OUI:FCBBA1*
- ID_OUI_FROM_DATABASE=Shenzhen Minicreate Technology Co.,Ltd
+OUI:B8F5E7*
+ ID_OUI_FROM_DATABASE=WayTools, LLC
 
-OUI:50B695*
- ID_OUI_FROM_DATABASE=Micropoint Biotechnologies,Inc.
+OUI:148A70*
+ ID_OUI_FROM_DATABASE=ADS GmbH
 
-OUI:B48547*
- ID_OUI_FROM_DATABASE=Amptown System Company GmbH
+OUI:FC0012*
+ ID_OUI_FROM_DATABASE=Toshiba Samsung Storage Technolgoy Korea Corporation
 
-OUI:3C25D7*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:F44450*
+ ID_OUI_FROM_DATABASE=BND Co., Ltd.
 
-OUI:1889DF*
- ID_OUI_FROM_DATABASE=CerebrEX Inc.
+OUI:644346*
+ ID_OUI_FROM_DATABASE=GuangDong Quick Network Computer CO.,LTD
 
-OUI:30A8DB*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:FCE892*
+ ID_OUI_FROM_DATABASE=Hangzhou Lancable Technology Co.,Ltd
 
-OUI:CC9F35*
- ID_OUI_FROM_DATABASE=Transbit Sp. z o.o.
+OUI:B8B42E*
+ ID_OUI_FROM_DATABASE=Gionee Communication Equipment Co,Ltd.ShenZhen
 
-OUI:407875*
- ID_OUI_FROM_DATABASE=IMBEL - Industria de Material Belico do Brasil
+OUI:A84041*
+ ID_OUI_FROM_DATABASE=Dragino Technology Co., Limited
 
-OUI:0C4F5A*
- ID_OUI_FROM_DATABASE=ASA-RT s.r.l.
+OUI:DCF05D*
+ ID_OUI_FROM_DATABASE=Letta Teknoloji
 
-OUI:B4B542*
- ID_OUI_FROM_DATABASE=Hubbell Power Systems, Inc.
+OUI:D05A0F*
+ ID_OUI_FROM_DATABASE=I-BT DIGITAL CO.,LTD
 
-OUI:54CDEE*
- ID_OUI_FROM_DATABASE=ShenZhen Apexis Electronic Co.,Ltd
+OUI:7CDD20*
+ ID_OUI_FROM_DATABASE=IOXOS Technologies S.A.
 
-OUI:F8F005*
- ID_OUI_FROM_DATABASE=Newport Media Inc.
+OUI:A0E9DB*
+ ID_OUI_FROM_DATABASE=Ningbo FreeWings Technologies Co.,Ltd
 
-OUI:98C0EB*
- ID_OUI_FROM_DATABASE=Global Regency Ltd
+OUI:9C7BD2*
+ ID_OUI_FROM_DATABASE=NEOLAB Convergence
 
-OUI:D4224E*
- ID_OUI_FROM_DATABASE=Alcatel Lucent
+OUI:900D66*
+ ID_OUI_FROM_DATABASE=Digimore Electronics Co., Ltd
 
-OUI:28DEF6*
- ID_OUI_FROM_DATABASE=bioMerieux Inc.
+OUI:48C862*
+ ID_OUI_FROM_DATABASE=Simo Wireless,Inc.
 
-OUI:88E8F8*
- ID_OUI_FROM_DATABASE=YONG TAI ELECTRONIC (DONGGUAN) LTD.
+OUI:0CF3EE*
+ ID_OUI_FROM_DATABASE=EM Microelectronic
 
-OUI:2C073C*
- ID_OUI_FROM_DATABASE=DEVLINE LIMITED
+OUI:F0C27C*
+ ID_OUI_FROM_DATABASE=Mianyang Netop Telecom Equipment Co.,Ltd.
 
-OUI:7CE4AA*
- ID_OUI_FROM_DATABASE=Private
+OUI:BC35E5*
+ ID_OUI_FROM_DATABASE=Hydro Systems Company
 
-OUI:1820A6*
- ID_OUI_FROM_DATABASE=Sage Co., Ltd.
+OUI:283410*
+ ID_OUI_FROM_DATABASE=Enigma Diagnostics Limited
 
-OUI:BCF61C*
- ID_OUI_FROM_DATABASE=Geomodeling Wuxi Technology Co. Ltd.
+OUI:28CCFF*
+ ID_OUI_FROM_DATABASE=Corporacion Empresarial Altra SL
 
-OUI:083F3E*
- ID_OUI_FROM_DATABASE=WSH GmbH
+OUI:14B73D*
+ ID_OUI_FROM_DATABASE=ARCHEAN Technologies
 
-OUI:6C09D6*
- ID_OUI_FROM_DATABASE=Digiquest Electronics LTD
+OUI:A433D1*
+ ID_OUI_FROM_DATABASE=Fibrlink Communications Co.,Ltd.
 
-OUI:8C569D*
- ID_OUI_FROM_DATABASE=Imaging Solutions Group
+OUI:84DE3D*
+ ID_OUI_FROM_DATABASE=Crystal Vision Ltd
 
-OUI:A43A69*
- ID_OUI_FROM_DATABASE=Vers Inc
+OUI:B4AA4D*
+ ID_OUI_FROM_DATABASE=Ensequence, Inc.
 
-OUI:387B47*
- ID_OUI_FROM_DATABASE=AKELA, Inc.
+OUI:040A83*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent
 
-OUI:7CCD11*
- ID_OUI_FROM_DATABASE=MS-Magnet
+OUI:B42A39*
+ ID_OUI_FROM_DATABASE=ORBIT MERRET, spol. s r. o.
 
-OUI:94FBB2*
- ID_OUI_FROM_DATABASE=Shenzhen Gongjin Electronics Co.,Ltd
+OUI:18AEBB*
+ ID_OUI_FROM_DATABASE=Siemens Convergence Creators GmbH&Co.KG
 
-OUI:4CE1BB*
- ID_OUI_FROM_DATABASE=Zhuhai HiFocus Technology Co., Ltd.
+OUI:3891FB*
+ ID_OUI_FROM_DATABASE=Xenox Holding BV
 
-OUI:8CDE99*
- ID_OUI_FROM_DATABASE=Comlab Inc.
+OUI:50FAAB*
+ ID_OUI_FROM_DATABASE=L-tek d.o.o.
 
-OUI:2C9AA4*
- ID_OUI_FROM_DATABASE=NGI SpA
+OUI:A8E018*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:B46698*
- ID_OUI_FROM_DATABASE=Zealabs srl
+OUI:44AAE8*
+ ID_OUI_FROM_DATABASE=Nanotec Electronic GmbH & Co. KG
 
-OUI:283B96*
- ID_OUI_FROM_DATABASE=Cool Control LTD
+OUI:D8DF0D*
+ ID_OUI_FROM_DATABASE=beroNet GmbH
 
-OUI:80D433*
- ID_OUI_FROM_DATABASE=LzLabs GmbH
+OUI:D8C068*
+ ID_OUI_FROM_DATABASE=Netgenetech.co.,ltd.
 
-OUI:085AE0*
- ID_OUI_FROM_DATABASE=Recovision Technology Co., Ltd.
+OUI:50E549*
+ ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
 
-OUI:BCEE7B*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:A8FCB7*
+ ID_OUI_FROM_DATABASE=Consolidated Resource Imaging
 
-OUI:FC09D8*
- ID_OUI_FROM_DATABASE=ACTEON Group
+OUI:F87B8C*
+ ID_OUI_FROM_DATABASE=Amped Wireless
 
-OUI:0C1262*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:44D2CA*
+ ID_OUI_FROM_DATABASE=Anvia TV Oy
 
-OUI:687CC8*
- ID_OUI_FROM_DATABASE=Measurement Systems S. de R.L.
+OUI:4C1A3A*
+ ID_OUI_FROM_DATABASE=PRIMA Research And Production Enterprise Ltd.
 
-OUI:F015A0*
- ID_OUI_FROM_DATABASE=KyungDong One Co., Ltd.
+OUI:AC0613*
+ ID_OUI_FROM_DATABASE=Senselogix Ltd
 
-OUI:ECF72B*
- ID_OUI_FROM_DATABASE=HD DIGITAL TECH CO., LTD.
+OUI:CCF67A*
+ ID_OUI_FROM_DATABASE=Ayecka Communication Systems LTD
 
-OUI:D8B6D6*
- ID_OUI_FROM_DATABASE=Blu Tether Limited
+OUI:00BB8E*
+ ID_OUI_FROM_DATABASE=HME Co., Ltd.
 
-OUI:847207*
- ID_OUI_FROM_DATABASE=I&C Technology
+OUI:C0A26D*
+ ID_OUI_FROM_DATABASE=Abbott Point of Care
 
-OUI:E0AEB2*
- ID_OUI_FROM_DATABASE=Bender GmbH &amp; Co.KG
+OUI:205B2A*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:2C553C*
- ID_OUI_FROM_DATABASE=Gainspeed, Inc.
+OUI:F8769B*
+ ID_OUI_FROM_DATABASE=Neopis Co., Ltd.
 
-OUI:B43E3B*
- ID_OUI_FROM_DATABASE=Viableware, Inc
+OUI:08E672*
+ ID_OUI_FROM_DATABASE=JEBSEE ELECTRONICS CO.,LTD.
 
-OUI:F854AF*
- ID_OUI_FROM_DATABASE=ECI Telecom Ltd.
+OUI:58E476*
+ ID_OUI_FROM_DATABASE=CENTRON COMMUNICATIONS TECHNOLOGIES FUJIAN CO.,LTD
 
-OUI:2464EF*
- ID_OUI_FROM_DATABASE=CYG SUNRI CO.,LTD.
+OUI:B435F7*
+ ID_OUI_FROM_DATABASE=Zhejiang Pearmain Electronics Co.ltd.
 
-OUI:50B888*
- ID_OUI_FROM_DATABASE=wi2be Tecnologia S/A
+OUI:0C6E4F*
+ ID_OUI_FROM_DATABASE=PrimeVOLT Co., Ltd.
 
-OUI:B8C1A2*
- ID_OUI_FROM_DATABASE=Dragon Path Technologies Co., Limited
+OUI:685B36*
+ ID_OUI_FROM_DATABASE=POWERTECH INDUSTRIAL CO., LTD.
 
-OUI:50ED78*
- ID_OUI_FROM_DATABASE=Changzhou Yongse Infotech Co.,Ltd
+OUI:983000*
+ ID_OUI_FROM_DATABASE=Beijing KEMACOM Technologies Co., Ltd.
 
-OUI:8CB7F7*
- ID_OUI_FROM_DATABASE=Shenzhen UniStrong Science & Technology Co., Ltd
+OUI:F81D93*
+ ID_OUI_FROM_DATABASE=Longdhua(Beijing) Controls Technology Co.,Ltd
 
-OUI:085240*
- ID_OUI_FROM_DATABASE=EbV Elektronikbau- und Vertriebs GmbH
+OUI:D0EB9E*
+ ID_OUI_FROM_DATABASE=Seowoo Inc.
 
-OUI:80F25E*
- ID_OUI_FROM_DATABASE=Kyynel
+OUI:8C5FDF*
+ ID_OUI_FROM_DATABASE=Beijing Railway Signal Factory
 
-OUI:844F03*
- ID_OUI_FROM_DATABASE=Ablelink Electronics Ltd
+OUI:586D8F*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
-OUI:94B9B4*
- ID_OUI_FROM_DATABASE=Aptos Technology
+OUI:14C21D*
+ ID_OUI_FROM_DATABASE=Sabtech Industries
 
-OUI:D0B523*
- ID_OUI_FROM_DATABASE=Bestcare Cloucal Corp.
+OUI:74B00C*
+ ID_OUI_FROM_DATABASE=Network Video Technologies, Inc
 
-OUI:783D5B*
- ID_OUI_FROM_DATABASE=TELNET Redes Inteligentes S.A.
+OUI:C88439*
+ ID_OUI_FROM_DATABASE=Sunrise Technologies
 
-OUI:D0C42F*
- ID_OUI_FROM_DATABASE=Tamagawa Seiki Co.,Ltd.
+OUI:44E4D9*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:5CFFFF*
- ID_OUI_FROM_DATABASE=Shenzhen Kezhonglong Optoelectronic Technology Co., Ltd
+OUI:0054AF*
+ ID_OUI_FROM_DATABASE=Continental Automotive Systems Inc.
 
-OUI:F0D3A7*
- ID_OUI_FROM_DATABASE=CobaltRay Co., Ltd
+OUI:EC7D9D*
+ ID_OUI_FROM_DATABASE=MEI
 
-OUI:847616*
- ID_OUI_FROM_DATABASE=Addat s.r.o.
+OUI:9C95F8*
+ ID_OUI_FROM_DATABASE=SmartDoor Systems, LLC
 
-OUI:D46867*
- ID_OUI_FROM_DATABASE=Neoventus Design Group
+OUI:D075BE*
+ ID_OUI_FROM_DATABASE=Reno A&E
 
-OUI:68692E*
- ID_OUI_FROM_DATABASE=Zycoo Co.,Ltd
+OUI:7C6C39*
+ ID_OUI_FROM_DATABASE=PIXSYS SRL
 
-OUI:A875E2*
- ID_OUI_FROM_DATABASE=Aventura Technologies, Inc.
+OUI:9C5D95*
+ ID_OUI_FROM_DATABASE=VTC Electronics Corp.
 
-OUI:38BF2F*
- ID_OUI_FROM_DATABASE=Espec Corp.
+OUI:DC05ED*
+ ID_OUI_FROM_DATABASE=Nabtesco  Corporation
 
-OUI:182012*
- ID_OUI_FROM_DATABASE=Aztech Associates Inc.
+OUI:FC8329*
+ ID_OUI_FROM_DATABASE=Trei technics
 
-OUI:C0F991*
- ID_OUI_FROM_DATABASE=GME Standard Communications P/L
+OUI:94E848*
+ ID_OUI_FROM_DATABASE=FYLDE MICRO LTD
 
-OUI:14EDA5*
- ID_OUI_FROM_DATABASE=Wächter GmbH Sicherheitssysteme
+OUI:AC5E8C*
+ ID_OUI_FROM_DATABASE=Utillink
 
-OUI:E056F4*
- ID_OUI_FROM_DATABASE=AxesNetwork Solutions inc.
+OUI:BC99BC*
+ ID_OUI_FROM_DATABASE=FonSee Technology Inc.
 
-OUI:385AA8*
- ID_OUI_FROM_DATABASE=Beijing Zhongdun Security Technology Development Co.
+OUI:986022*
+ ID_OUI_FROM_DATABASE=EMW Co., Ltd.
 
-OUI:FC3FAB*
- ID_OUI_FROM_DATABASE=Henan Lanxin Technology Co., Ltd
+OUI:80B32A*
+ ID_OUI_FROM_DATABASE=Alstom Grid
 
-OUI:F8FF5F*
- ID_OUI_FROM_DATABASE=Shenzhen Communication Technology Co.,Ltd
+OUI:803457*
+ ID_OUI_FROM_DATABASE=OT Systems Limited
 
-OUI:DCC422*
- ID_OUI_FROM_DATABASE=Systembase Limited
+OUI:B83D4E*
+ ID_OUI_FROM_DATABASE=Shenzhen Cultraview Digital Technology Co.,Ltd Shanghai Branch
 
-OUI:F4BD7C*
- ID_OUI_FROM_DATABASE=Chengdu jinshi communication Co., LTD
+OUI:CCF3A5*
+ ID_OUI_FROM_DATABASE=Chi Mei Communication Systems, Inc
 
-OUI:C8F36B*
- ID_OUI_FROM_DATABASE=Yamato Scale Co.,Ltd.
+OUI:C4242E*
+ ID_OUI_FROM_DATABASE=Galvanic Applied Sciences Inc
 
-OUI:6C90B1*
- ID_OUI_FROM_DATABASE=SanLogic Inc
+OUI:6400F1*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:845C93*
- ID_OUI_FROM_DATABASE=Chabrier Services
+OUI:04C5A4*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:D44C9C*
- ID_OUI_FROM_DATABASE=Shenzhen YOOBAO Technology Co.Ltd
+OUI:3CA72B*
+ ID_OUI_FROM_DATABASE=MRV Communications (Networks) LTD
 
-OUI:A88D7B*
- ID_OUI_FROM_DATABASE=SunDroid Global limited.
+OUI:584C19*
+ ID_OUI_FROM_DATABASE=Chongqing Guohong Technology Development Company Limited
 
-OUI:A03B1B*
- ID_OUI_FROM_DATABASE=Inspire Tech
+OUI:D0A311*
+ ID_OUI_FROM_DATABASE=Neuberger Gebäudeautomation GmbH
 
-OUI:3C6E63*
- ID_OUI_FROM_DATABASE=Mitron OY
+OUI:10A13B*
+ ID_OUI_FROM_DATABASE=FUJIKURA RUBBER LTD.
 
-OUI:502E5C*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:F4E142*
+ ID_OUI_FROM_DATABASE=Delta Elektronika BV
 
-OUI:20D21F*
- ID_OUI_FROM_DATABASE=Wincal Technology Corp.
+OUI:F00248*
+ ID_OUI_FROM_DATABASE=SmarteBuilding
 
-OUI:FC1E16*
- ID_OUI_FROM_DATABASE=IPEVO corp
+OUI:2CDD0C*
+ ID_OUI_FROM_DATABASE=Discovergy GmbH
 
-OUI:6C4B7F*
- ID_OUI_FROM_DATABASE=Vossloh-Schwabe Deutschland GmbH
+OUI:40B2C8*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:0CCB8D*
- ID_OUI_FROM_DATABASE=ASCO Numatics GmbH
+OUI:486B91*
+ ID_OUI_FROM_DATABASE=Fleetwood Group Inc.
 
-OUI:2847AA*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:F43814*
+ ID_OUI_FROM_DATABASE=Shanghai Howell Electronic Co.,Ltd
 
-OUI:682DDC*
- ID_OUI_FROM_DATABASE=Wuhan Changjiang Electro-Communication Equipment CO.,LTD
+OUI:20AA25*
+ ID_OUI_FROM_DATABASE=IP-NET LLC
 
-OUI:1C63B7*
- ID_OUI_FROM_DATABASE=OpenProducts 237 AB
+OUI:ECBBAE*
+ ID_OUI_FROM_DATABASE=Digivoice Tecnologia em Eletronica Ltda
 
-OUI:A0A23C*
- ID_OUI_FROM_DATABASE=GPMS
+OUI:DC2008*
+ ID_OUI_FROM_DATABASE=ASD Electronics Ltd
 
-OUI:708D09*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:088DC8*
+ ID_OUI_FROM_DATABASE=Ryowa Electronics Co.,Ltd
 
-OUI:FCE1D9*
- ID_OUI_FROM_DATABASE=Stable Imaging Solutions LLC
+OUI:D491AF*
+ ID_OUI_FROM_DATABASE=Electroacustica General Iberica, S.A.
 
-OUI:38B74D*
- ID_OUI_FROM_DATABASE=Fijowave Limited
+OUI:1CDF0F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:A0E5E9*
- ID_OUI_FROM_DATABASE=enimai Inc
+OUI:34DF2A*
+ ID_OUI_FROM_DATABASE=Fujikon Industrial Co.,Limited
 
-OUI:9CBB98*
- ID_OUI_FROM_DATABASE=Shen Zhen RND Electronic Co.,LTD
+OUI:C88447*
+ ID_OUI_FROM_DATABASE=Beautiful Enterprise Co., Ltd
 
-OUI:345C40*
- ID_OUI_FROM_DATABASE=Cargt Holdings LLC
+OUI:C88B47*
+ ID_OUI_FROM_DATABASE=Nolangroup S.P.A con Socio Unico
 
-OUI:34885D*
- ID_OUI_FROM_DATABASE=Logitech Far East
+OUI:24BA30*
+ ID_OUI_FROM_DATABASE=Technical Consumer Products, Inc.
 
-OUI:6064A1*
- ID_OUI_FROM_DATABASE=RADiflow Ltd.
+OUI:74D675*
+ ID_OUI_FROM_DATABASE=WYMA Tecnologia
 
-OUI:8079AE*
- ID_OUI_FROM_DATABASE=ShanDong Tecsunrise  Co.,Ltd
+OUI:D01CBB*
+ ID_OUI_FROM_DATABASE=Beijing Ctimes Digital Technology Co., Ltd.
 
-OUI:2C7155*
- ID_OUI_FROM_DATABASE=HiveMotion
+OUI:9481A4*
+ ID_OUI_FROM_DATABASE=Azuray Technologies
 
-OUI:909916*
- ID_OUI_FROM_DATABASE=ELVEES NeoTek OJSC
+OUI:BCE09D*
+ ID_OUI_FROM_DATABASE=Eoslink
 
-OUI:FC1BFF*
- ID_OUI_FROM_DATABASE=V-ZUG AG
+OUI:346F92*
+ ID_OUI_FROM_DATABASE=White Rodgers Division
 
-OUI:AC5036*
- ID_OUI_FROM_DATABASE=Pi-Coral Inc
+OUI:8CDB25*
+ ID_OUI_FROM_DATABASE=ESG Solutions
 
-OUI:FC019E*
- ID_OUI_FROM_DATABASE=VIEVU
+OUI:641A22*
+ ID_OUI_FROM_DATABASE=Heliospectra AB
 
-OUI:F45F69*
- ID_OUI_FROM_DATABASE=Matsufu Electronics distribution Company
+OUI:30142D*
+ ID_OUI_FROM_DATABASE=Piciorgros GmbH
 
-OUI:F4A294*
- ID_OUI_FROM_DATABASE=EAGLE WORLD DEVELOPMENT CO., LIMITED
+OUI:E441E6*
+ ID_OUI_FROM_DATABASE=Ottec Technology GmbH
 
-OUI:2CCD69*
- ID_OUI_FROM_DATABASE=Aqavi.com
+OUI:10E2D5*
+ ID_OUI_FROM_DATABASE=Qi Hardware Inc.
 
-OUI:947C3E*
- ID_OUI_FROM_DATABASE=Polewall Norge AS
+OUI:7CDA84*
+ ID_OUI_FROM_DATABASE=Dongnian Networks Inc.
 
-OUI:E0D1E6*
- ID_OUI_FROM_DATABASE=Aliph dba Jawbone
+OUI:A036FA*
+ ID_OUI_FROM_DATABASE=Ettus Research LLC
 
-OUI:28C671*
- ID_OUI_FROM_DATABASE=Yota Devices OY
+OUI:EC836C*
+ ID_OUI_FROM_DATABASE=RM Tech Co., Ltd.
 
-OUI:DC1792*
- ID_OUI_FROM_DATABASE=Captivate Network
+OUI:6083B2*
+ ID_OUI_FROM_DATABASE=GkWare e.K.
 
-OUI:7C8306*
- ID_OUI_FROM_DATABASE=Glen Dimplex Nordic as
+OUI:80D019*
+ ID_OUI_FROM_DATABASE=Embed, Inc
 
-OUI:84253F*
- ID_OUI_FROM_DATABASE=Silex Technology, Inc
+OUI:D41296*
+ ID_OUI_FROM_DATABASE=Anobit Technologies Ltd.
 
-OUI:907A0A*
- ID_OUI_FROM_DATABASE=Gebr. Bode GmbH & Co KG
+OUI:B8FF6F*
+ ID_OUI_FROM_DATABASE=Shanghai Typrotech Technology Co.Ltd
 
-OUI:306112*
- ID_OUI_FROM_DATABASE=PAV GmbH
+OUI:DC9C52*
+ ID_OUI_FROM_DATABASE=Sapphire Technology Limited.
 
-OUI:A0C6EC*
- ID_OUI_FROM_DATABASE=ShenZhen ANYK Technology Co.,LTD
+OUI:68122D*
+ ID_OUI_FROM_DATABASE=Special Instrument Development Co., Ltd.
 
-OUI:C80258*
- ID_OUI_FROM_DATABASE=ITW GSE ApS
+OUI:649B24*
+ ID_OUI_FROM_DATABASE=V Technology Co., Ltd.
 
-OUI:1001CA*
- ID_OUI_FROM_DATABASE=Ashley Butterworth
+OUI:0475F5*
+ ID_OUI_FROM_DATABASE=CSST
 
-OUI:246AAB*
- ID_OUI_FROM_DATABASE=IT-IS International
+OUI:BC20BA*
+ ID_OUI_FROM_DATABASE=Inspur (Shandong) Electronic Information Co., Ltd
 
-OUI:28F532*
- ID_OUI_FROM_DATABASE=ADD-Engineering BV
+OUI:249442*
+ ID_OUI_FROM_DATABASE=OPEN ROAD SOLUTIONS , INC.
 
-OUI:FC4BBC*
- ID_OUI_FROM_DATABASE=Sunplus Technology Co., Ltd.
+OUI:E0F379*
+ ID_OUI_FROM_DATABASE=Vaddio
 
-OUI:142D8B*
- ID_OUI_FROM_DATABASE=Incipio Technologies, Inc
+OUI:B09AE2*
+ ID_OUI_FROM_DATABASE=STEMMER IMAGING GmbH
 
-OUI:CCE8AC*
- ID_OUI_FROM_DATABASE=SOYEA Technology Co.,Ltd.
+OUI:CCD811*
+ ID_OUI_FROM_DATABASE=Aiconn Technology Corporation
 
-OUI:78D38D*
- ID_OUI_FROM_DATABASE=HONGKONG YUNLINK TECHNOLOGY LIMITED
+OUI:78D004*
+ ID_OUI_FROM_DATABASE=Neousys Technology Inc.
 
-OUI:1C48F9*
- ID_OUI_FROM_DATABASE=GN Netcom A/S
+OUI:78A051*
+ ID_OUI_FROM_DATABASE=iiNet Labs Pty Ltd
 
-OUI:744BE9*
- ID_OUI_FROM_DATABASE=EXPLORER HYPERTECH CO.,LTD
+OUI:58A76F*
+ ID_OUI_FROM_DATABASE=iD corporation
 
-OUI:B836D8*
- ID_OUI_FROM_DATABASE=Videoswitch
+OUI:44599F*
+ ID_OUI_FROM_DATABASE=Criticare Systems, Inc
 
-OUI:F835DD*
- ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
+OUI:3C2F3A*
+ ID_OUI_FROM_DATABASE=SFORZATO Corp.
 
-OUI:0CF019*
- ID_OUI_FROM_DATABASE=Malgn Technology Co., Ltd.
+OUI:EC9233*
+ ID_OUI_FROM_DATABASE=Eddyfi NDT Inc
 
-OUI:D46A91*
- ID_OUI_FROM_DATABASE=Snap AV
+OUI:ECE90B*
+ ID_OUI_FROM_DATABASE=SISTEMA SOLUCOES ELETRONICAS LTDA - EASYTECH
 
-OUI:E8519D*
- ID_OUI_FROM_DATABASE=Yeonhab Precision Co.,LTD
+OUI:A08C9B*
+ ID_OUI_FROM_DATABASE=Xtreme Technologies Corp
 
-OUI:00B78D*
- ID_OUI_FROM_DATABASE=Nanjing Shining Electric Automation Co., Ltd
+OUI:607688*
+ ID_OUI_FROM_DATABASE=Velodyne
 
-OUI:68E166*
+OUI:980EE4*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:60FEF9*
- ID_OUI_FROM_DATABASE=Thomas & Betts
+OUI:E828D5*
+ ID_OUI_FROM_DATABASE=Cots Technology
 
-OUI:78FE41*
- ID_OUI_FROM_DATABASE=Socus networks
+OUI:08D5C0*
+ ID_OUI_FROM_DATABASE=Seers Technology Co., Ltd
 
-OUI:083571*
- ID_OUI_FROM_DATABASE=CASwell INC.
+OUI:8CB64F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:DCF755*
- ID_OUI_FROM_DATABASE=SITRONIK
+OUI:6C33A9*
+ ID_OUI_FROM_DATABASE=Magicjack LP
 
-OUI:ACCA8E*
- ID_OUI_FROM_DATABASE=ODA Technologies
+OUI:08B7EC*
+ ID_OUI_FROM_DATABASE=Wireless Seismic
 
-OUI:6405BE*
- ID_OUI_FROM_DATABASE=NEW LIGHT LED
+OUI:BC71C1*
+ ID_OUI_FROM_DATABASE=XTrillion, Inc.
 
-OUI:E03E4A*
- ID_OUI_FROM_DATABASE=Cavanagh Group International
+OUI:0C469D*
+ ID_OUI_FROM_DATABASE=MS Sedco
 
-OUI:6CB350*
- ID_OUI_FROM_DATABASE=Anhui comhigher tech co.,ltd
+OUI:E0E8E8*
+ ID_OUI_FROM_DATABASE=Olive Telecommunication Pvt. Ltd
 
-OUI:A42305*
- ID_OUI_FROM_DATABASE=Open Networking Laboratory
+OUI:0C3C65*
+ ID_OUI_FROM_DATABASE=Dome Imaging Inc
 
-OUI:1C86AD*
- ID_OUI_FROM_DATABASE=MCT CO., LTD.
+OUI:942053*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:28D93E*
- ID_OUI_FROM_DATABASE=Telecor Inc.
+OUI:D49C8E*
+ ID_OUI_FROM_DATABASE=University of FUKUI
 
-OUI:882364*
- ID_OUI_FROM_DATABASE=Watchnet DVR Inc
+OUI:2CB0DF*
+ ID_OUI_FROM_DATABASE=Soliton Technologies Pvt Ltd
 
-OUI:A05B21*
- ID_OUI_FROM_DATABASE=ENVINET GmbH
+OUI:5CF3FC*
+ ID_OUI_FROM_DATABASE=IBM Corp
 
-OUI:50B8A2*
- ID_OUI_FROM_DATABASE=ImTech Technologies LLC,
+OUI:D43D67*
+ ID_OUI_FROM_DATABASE=Carma Industries Inc.
 
-OUI:A41566*
- ID_OUI_FROM_DATABASE=Wei Fang Goertek Electronics Co.,Ltd
+OUI:00BD27*
+ ID_OUI_FROM_DATABASE=Exar Corp.
 
-OUI:B04C05*
- ID_OUI_FROM_DATABASE=Fresenius Medical Care Deutschland GmbH
+OUI:C8A729*
+ ID_OUI_FROM_DATABASE=SYStronics Co., Ltd.
 
-OUI:A0EC80*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:6C9CE9*
+ ID_OUI_FROM_DATABASE=Nimble Storage
 
-OUI:9046B7*
- ID_OUI_FROM_DATABASE=Vadaro Pte Ltd
+OUI:700258*
+ ID_OUI_FROM_DATABASE=01DB-METRAVIB
 
-OUI:1C08C1*
- ID_OUI_FROM_DATABASE=Lg Innotek
+OUI:20FDF1*
+ ID_OUI_FROM_DATABASE=3COM EUROPE LTD
 
-OUI:201D03*
- ID_OUI_FROM_DATABASE=Elatec GmbH
+OUI:389592*
+ ID_OUI_FROM_DATABASE=Beijing Tendyron Corporation
 
-OUI:C06C6D*
- ID_OUI_FROM_DATABASE=MagneMotion, Inc.
+OUI:705EAA*
+ ID_OUI_FROM_DATABASE=Action Target, Inc.
 
-OUI:74CA25*
- ID_OUI_FROM_DATABASE=Calxeda, Inc.
+OUI:0C8D98*
+ ID_OUI_FROM_DATABASE=TOP EIGHT IND CORP
 
-OUI:CCBD35*
- ID_OUI_FROM_DATABASE=Steinel GmbH
+OUI:30493B*
+ ID_OUI_FROM_DATABASE=Nanjing Z-Com Wireless Co.,Ltd
 
-OUI:788DF7*
- ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
+OUI:68DB96*
+ ID_OUI_FROM_DATABASE=OPWILL Technologies CO .,LTD
 
-OUI:6CECA1*
- ID_OUI_FROM_DATABASE=SHENZHEN CLOU ELECTRONICS CO. LTD.
+OUI:00F860*
+ ID_OUI_FROM_DATABASE=PT. Panggung Electric Citrabuana
 
-OUI:D862DB*
- ID_OUI_FROM_DATABASE=Eno Inc.
+OUI:FCEDB9*
+ ID_OUI_FROM_DATABASE=Arrayent
 
-OUI:68DB67*
- ID_OUI_FROM_DATABASE=Nantong Coship Electronics Co., Ltd
+OUI:44ED57*
+ ID_OUI_FROM_DATABASE=Longicorn, inc.
 
-OUI:BC261D*
- ID_OUI_FROM_DATABASE=HONG KONG TECON TECHNOLOGY
+OUI:C8A1B6*
+ ID_OUI_FROM_DATABASE=Shenzhen Longway Technologies Co., Ltd
 
-OUI:888964*
- ID_OUI_FROM_DATABASE=GSI Electronics Inc.
+OUI:641E81*
+ ID_OUI_FROM_DATABASE=Dowslake Microsystems
 
-OUI:4C82CF*
- ID_OUI_FROM_DATABASE=Echostar Technologies
+OUI:88ACC1*
+ ID_OUI_FROM_DATABASE=Generiton Co., Ltd.
 
-OUI:9CA577*
- ID_OUI_FROM_DATABASE=Osorno Enterprises Inc.
+OUI:785712*
+ ID_OUI_FROM_DATABASE=Mobile Integration Workgroup
 
-OUI:C0C3B6*
- ID_OUI_FROM_DATABASE=Automatic Systems
+OUI:380A0A*
+ ID_OUI_FROM_DATABASE=Sky-City Communication and Electronics Limited Company
 
-OUI:A8294C*
- ID_OUI_FROM_DATABASE=Precision Optical Transceivers, Inc.
+OUI:141BBD*
+ ID_OUI_FROM_DATABASE=Volex Inc.
 
-OUI:D0EB03*
- ID_OUI_FROM_DATABASE=Zhehua technology limited
+OUI:78C6BB*
+ ID_OUI_FROM_DATABASE=Innovasic, Inc.
 
-OUI:A0861D*
- ID_OUI_FROM_DATABASE=Chengdu Fuhuaxin Technology co.,Ltd
+OUI:DC4EDE*
+ ID_OUI_FROM_DATABASE=SHINYEI TECHNOLOGY CO., LTD.
 
-OUI:9498A2*
- ID_OUI_FROM_DATABASE=Shanghai LISTEN TECH.LTD
+OUI:888B5D*
+ ID_OUI_FROM_DATABASE=Storage Appliance Corporation
 
-OUI:2CB693*
- ID_OUI_FROM_DATABASE=Radware
+OUI:F0F842*
+ ID_OUI_FROM_DATABASE=KEEBOX, Inc.
 
-OUI:88685C*
- ID_OUI_FROM_DATABASE=Shenzhen ChuangDao & Perpetual Eternal Technology Co.,Ltd
+OUI:78A714*
+ ID_OUI_FROM_DATABASE=Amphenol
 
-OUI:B4FE8C*
- ID_OUI_FROM_DATABASE=Centro Sicurezza Italia SpA
+OUI:F450EB*
+ ID_OUI_FROM_DATABASE=Telechips Inc
 
-OUI:D82916*
- ID_OUI_FROM_DATABASE=Ascent Communication Technology
+OUI:988EDD*
+ ID_OUI_FROM_DATABASE=TE Connectivity Limerick
 
-OUI:6472D8*
- ID_OUI_FROM_DATABASE=GooWi Technology Co.,Limited
+OUI:98FC11*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
-OUI:84ACA4*
- ID_OUI_FROM_DATABASE=Beijing Novel Super Digital TV Technology Co., Ltd
+OUI:180C77*
+ ID_OUI_FROM_DATABASE=Westinghouse Electric Company, LLC
 
-OUI:3C6FF7*
- ID_OUI_FROM_DATABASE=EnTek Systems, Inc.
+OUI:ACA016*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:B838CA*
- ID_OUI_FROM_DATABASE=Kyokko Tsushin System CO.,LTD
+OUI:E4AD7D*
+ ID_OUI_FROM_DATABASE=SCL Elements
 
-OUI:380FE4*
- ID_OUI_FROM_DATABASE=Dedicated Network Partners Oy
+OUI:40D40E*
+ ID_OUI_FROM_DATABASE=Biodata Ltd
 
-OUI:847A88*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:7C051E*
+ ID_OUI_FROM_DATABASE=RAFAEL LTD.
 
-OUI:5461EA*
- ID_OUI_FROM_DATABASE=Zaplox AB
+OUI:58570D*
+ ID_OUI_FROM_DATABASE=Danfoss Solar Inverters
 
-OUI:78324F*
- ID_OUI_FROM_DATABASE=Millennium Group, Inc.
+OUI:0C826A*
+ ID_OUI_FROM_DATABASE=Wuhan Huagong Genuine Optics Technology Co., Ltd
 
-OUI:F05DC8*
- ID_OUI_FROM_DATABASE=Duracell Powermat
+OUI:38C7BA*
+ ID_OUI_FROM_DATABASE=CS Services Co.,Ltd.
 
-OUI:48F925*
- ID_OUI_FROM_DATABASE=Maestronic
+OUI:70D57E*
+ ID_OUI_FROM_DATABASE=Scalar Corporation
 
-OUI:C0885B*
- ID_OUI_FROM_DATABASE=SnD Tech Co., Ltd.
+OUI:7866AE*
+ ID_OUI_FROM_DATABASE=ZTEC Instruments, Inc.
 
-OUI:64C667*
- ID_OUI_FROM_DATABASE=Barnes&Noble
+OUI:78818F*
+ ID_OUI_FROM_DATABASE=Server Racks Australia Pty Ltd
 
-OUI:C47DCC*
- ID_OUI_FROM_DATABASE=Zebra Technologies Inc
+OUI:E0589E*
+ ID_OUI_FROM_DATABASE=Laerdal Medical
 
-OUI:64535D*
- ID_OUI_FROM_DATABASE=Frauscher Sensortechnik
+OUI:44D63D*
+ ID_OUI_FROM_DATABASE=Talari Networks
 
-OUI:105F06*
- ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
+OUI:58FD20*
+ ID_OUI_FROM_DATABASE=Bravida Sakerhet AB
 
-OUI:841715*
- ID_OUI_FROM_DATABASE=GP Electronics (HK) Ltd.
+OUI:9835B8*
+ ID_OUI_FROM_DATABASE=Assembled Products Corporation
 
-OUI:087999*
- ID_OUI_FROM_DATABASE=AIM GmbH
+OUI:240B2A*
+ ID_OUI_FROM_DATABASE=Viettel Group
 
-OUI:84C2E4*
- ID_OUI_FROM_DATABASE=Jiangsu Qinheng Co., Ltd.
+OUI:68E41F*
+ ID_OUI_FROM_DATABASE=Unglaube Identech GmbH
 
-OUI:C0B8B1*
- ID_OUI_FROM_DATABASE=BitBox Ltd
+OUI:84F64C*
+ ID_OUI_FROM_DATABASE=Cross Point BV
 
-OUI:0C722C*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:90513F*
+ ID_OUI_FROM_DATABASE=Elettronica Santerno SpA
 
-OUI:B01408*
- ID_OUI_FROM_DATABASE=LIGHTSPEED INTERNATIONAL CO.
+OUI:7CA29B*
+ ID_OUI_FROM_DATABASE=D.SignT GmbH & Co. KG
 
-OUI:F8FEA8*
- ID_OUI_FROM_DATABASE=Technico Japan Corporation
+OUI:34AAEE*
+ ID_OUI_FROM_DATABASE=Mikrovisatos Servisas UAB
 
-OUI:A8154D*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:A40CC3*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:D05099*
- ID_OUI_FROM_DATABASE=ASRock Incorporation
+OUI:34E0D7*
+ ID_OUI_FROM_DATABASE=DONGGUAN QISHENG ELECTRONICS INDUSTRIAL CO., LTD
 
-OUI:78A106*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:40520D*
+ ID_OUI_FROM_DATABASE=Pico Technology
 
-OUI:A49EDB*
- ID_OUI_FROM_DATABASE=AutoCrib, Inc.
+OUI:543131*
+ ID_OUI_FROM_DATABASE=Raster Vision Ltd
 
-OUI:282CB2*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:90E0F0*
+ ID_OUI_FROM_DATABASE=IEEE 1722a Working Group
 
-OUI:D43A65*
- ID_OUI_FROM_DATABASE=IGRS Engineering Lab Ltd.
+OUI:1C6F65*
+ ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
 
-OUI:10B9FE*
- ID_OUI_FROM_DATABASE=Lika srl
+OUI:F0AD4E*
+ ID_OUI_FROM_DATABASE=Globalscale Technologies, Inc.
 
-OUI:D42751*
- ID_OUI_FROM_DATABASE=Infopia Co., Ltd
+OUI:903D5A*
+ ID_OUI_FROM_DATABASE=Shenzhen Wision Technology Holding Limited
 
-OUI:A895B0*
- ID_OUI_FROM_DATABASE=Aker Subsea Ltd
+OUI:609AA4*
+ ID_OUI_FROM_DATABASE=GVI SECURITY INC.
 
-OUI:5C20D0*
- ID_OUI_FROM_DATABASE=Asoni Communication Co., Ltd.
+OUI:F0ED1E*
+ ID_OUI_FROM_DATABASE=Bilkon Bilgisayar Kontrollu Cih. Im.Ltd.
 
-OUI:E0C3F3*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:24A937*
+ ID_OUI_FROM_DATABASE=PURE Storage
 
-OUI:104D77*
- ID_OUI_FROM_DATABASE=Innovative Computer Engineering
+OUI:348302*
+ ID_OUI_FROM_DATABASE=iFORCOM Co., Ltd
 
-OUI:3C081E*
- ID_OUI_FROM_DATABASE=Beijing Yupont Electric Power Technology Co.,Ltd
+OUI:949C55*
+ ID_OUI_FROM_DATABASE=Alta Data Technologies
+
+OUI:389F83*
+ ID_OUI_FROM_DATABASE=OTN Systems N.V.
 
-OUI:7CA15D*
- ID_OUI_FROM_DATABASE=GN ReSound A/S
+OUI:8C541D*
+ ID_OUI_FROM_DATABASE=LGE
 
-OUI:B4DD15*
- ID_OUI_FROM_DATABASE=ControlThings Oy Ab
+OUI:003A9D*
+ ID_OUI_FROM_DATABASE=NEC Platforms, Ltd.
 
-OUI:3C86A8*
- ID_OUI_FROM_DATABASE=Sangshin elecom .co,, LTD
+OUI:905446*
+ ID_OUI_FROM_DATABASE=TES ELECTRONIC SOLUTIONS
 
-OUI:FCDD55*
- ID_OUI_FROM_DATABASE=Shenzhen WeWins wireless Co.,Ltd
+OUI:DC7B94*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:CC0DEC*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:68234B*
+ ID_OUI_FROM_DATABASE=Nihon Dengyo Kousaku
 
-OUI:68B094*
- ID_OUI_FROM_DATABASE=INESA ELECTRON CO.,LTD
+OUI:18422F*
+ ID_OUI_FROM_DATABASE=Alcatel Lucent
 
-OUI:40E730*
- ID_OUI_FROM_DATABASE=DEY Storage Systems, Inc.
+OUI:A4BE61*
+ ID_OUI_FROM_DATABASE=EutroVision System, Inc.
 
-OUI:A8D236*
- ID_OUI_FROM_DATABASE=Lightware Visual Engineering
+OUI:E06290*
+ ID_OUI_FROM_DATABASE=Jinan Jovision Science & Technology Co., Ltd.
 
-OUI:6C8686*
- ID_OUI_FROM_DATABASE=Technonia
+OUI:A01859*
+ ID_OUI_FROM_DATABASE=Shenzhen Yidashi Electronics Co Ltd
 
-OUI:84E714*
- ID_OUI_FROM_DATABASE=Liang Herng Enterprise,Co.Ltd.
+OUI:042234*
+ ID_OUI_FROM_DATABASE=Wireless Standard Extensions
 
-OUI:303D08*
- ID_OUI_FROM_DATABASE=GLINTT TES S.A.
+OUI:7812B8*
+ ID_OUI_FROM_DATABASE=ORANTEK LIMITED
 
-OUI:9C541C*
- ID_OUI_FROM_DATABASE=Shenzhen My-power Technology Co.,Ltd
+OUI:F0B6EB*
+ ID_OUI_FROM_DATABASE=Poslab Technology Co., Ltd.
 
-OUI:E496AE*
- ID_OUI_FROM_DATABASE=ALTOGRAPHICS Inc.
+OUI:FCCCE4*
+ ID_OUI_FROM_DATABASE=Ascon Ltd.
 
-OUI:F80BD0*
- ID_OUI_FROM_DATABASE=Datang Telecom communication terminal (Tianjin) Co., Ltd.
+OUI:34862A*
+ ID_OUI_FROM_DATABASE=Heinz Lackmann GmbH & Co KG
 
-OUI:48B9C2*
- ID_OUI_FROM_DATABASE=Teletics Inc.
+OUI:842141*
+ ID_OUI_FROM_DATABASE=Shenzhen Ginwave Technologies Ltd.
 
-OUI:D046DC*
- ID_OUI_FROM_DATABASE=Southwest Research Institute
+OUI:B4ED54*
+ ID_OUI_FROM_DATABASE=Wohler Technologies
 
-OUI:046E49*
- ID_OUI_FROM_DATABASE=TaiYear Electronic Technology (Suzhou) Co., Ltd
+OUI:544249*
+ ID_OUI_FROM_DATABASE=Sony Corporation
 
-OUI:08606E*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:24DBAD*
+ ID_OUI_FROM_DATABASE=ShopperTrak RCT Corporation
 
-OUI:BC39A6*
- ID_OUI_FROM_DATABASE=CSUN System Technology Co.,LTD
+OUI:CC69B0*
+ ID_OUI_FROM_DATABASE=Global Traffic Technologies, LLC
 
-OUI:ECB541*
- ID_OUI_FROM_DATABASE=SHINANO E and E Co.Ltd.
+OUI:2872C5*
+ ID_OUI_FROM_DATABASE=Smartmatic Corp
 
-OUI:D40057*
- ID_OUI_FROM_DATABASE=MC Technologies GmbH
+OUI:B8A3E0*
+ ID_OUI_FROM_DATABASE=BenRui Technology Co.,Ltd
 
-OUI:48B8DE*
- ID_OUI_FROM_DATABASE=HOMEWINS TECHNOLOGY CO.,LTD.
+OUI:B8F732*
+ ID_OUI_FROM_DATABASE=Aryaka Networks Inc
 
-OUI:1065CF*
- ID_OUI_FROM_DATABASE=IQSIM
+OUI:70828E*
+ ID_OUI_FROM_DATABASE=OleumTech Corporation
 
-OUI:B877C3*
- ID_OUI_FROM_DATABASE=Decagon Devices, Inc.
+OUI:502A7E*
+ ID_OUI_FROM_DATABASE=Smart electronic GmbH
 
-OUI:849DC5*
- ID_OUI_FROM_DATABASE=Centera Photonics Inc.
+OUI:F0264C*
+ ID_OUI_FROM_DATABASE=Dr. Sigrist AG
 
-OUI:580943*
- ID_OUI_FROM_DATABASE=Private
+OUI:3C1CBE*
+ ID_OUI_FROM_DATABASE=JADAK LLC
 
-OUI:547FA8*
- ID_OUI_FROM_DATABASE=TELCO systems, s.r.o.
+OUI:A8995C*
+ ID_OUI_FROM_DATABASE=aizo ag
 
-OUI:5474E6*
- ID_OUI_FROM_DATABASE=Webtech Wireless
+OUI:F445ED*
+ ID_OUI_FROM_DATABASE=Portable Innovation Technology Ltd.
 
-OUI:AC5D10*
- ID_OUI_FROM_DATABASE=Pace Americas
+OUI:6C32DE*
+ ID_OUI_FROM_DATABASE=Indieon Technologies Pvt. Ltd.
 
-OUI:88F490*
- ID_OUI_FROM_DATABASE=Jetmobile Pte Ltd
+OUI:FCCF62*
+ ID_OUI_FROM_DATABASE=IBM Corp
 
-OUI:E8A364*
- ID_OUI_FROM_DATABASE=Signal Path International / Peachtree Audio
+OUI:B09074*
+ ID_OUI_FROM_DATABASE=Fulan Electronics Limited
 
-OUI:D0D6CC*
- ID_OUI_FROM_DATABASE=Wintop
+OUI:2CA835*
+ ID_OUI_FROM_DATABASE=RIM
 
-OUI:101D51*
- ID_OUI_FROM_DATABASE=ON-Q LLC dba ON-Q Mesh Networks
+OUI:94F692*
+ ID_OUI_FROM_DATABASE=Geminico co.,Ltd.
 
-OUI:34C99D*
- ID_OUI_FROM_DATABASE=EIDOLON COMMUNICATIONS TECHNOLOGY CO. LTD.
+OUI:8C736E*
+ ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
-OUI:8C4AEE*
- ID_OUI_FROM_DATABASE=GIGA TMS INC
+OUI:30EFD1*
+ ID_OUI_FROM_DATABASE=Alstom Strongwish (Shenzhen) Co., Ltd.
 
-OUI:F46DE2*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:C835B8*
+ ID_OUI_FROM_DATABASE=Ericsson, EAB/RWI/K
 
-OUI:04F8C2*
- ID_OUI_FROM_DATABASE=Flaircomm Microelectronics, Inc.
+OUI:243C20*
+ ID_OUI_FROM_DATABASE=Dynamode Group
 
-OUI:0C93FB*
- ID_OUI_FROM_DATABASE=BNS Solutions
+OUI:70D5E7*
+ ID_OUI_FROM_DATABASE=Wellcore Corporation
 
-OUI:38B5BD*
- ID_OUI_FROM_DATABASE=E.G.O. Elektro-Ger
+OUI:3CF72A*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:B85AF7*
- ID_OUI_FROM_DATABASE=Ouya, Inc
+OUI:FCE192*
+ ID_OUI_FROM_DATABASE=Sichuan Jinwangtong Electronic Science&Technology Co,.Ltd
 
-OUI:E0D9A2*
- ID_OUI_FROM_DATABASE=Hippih aps
+OUI:F8912A*
+ ID_OUI_FROM_DATABASE=GLP German Light Products GmbH
 
-OUI:F0F669*
- ID_OUI_FROM_DATABASE=Motion Analysis Corporation
+OUI:E02630*
+ ID_OUI_FROM_DATABASE=Intrigue Technologies, Inc.
 
-OUI:F0219D*
- ID_OUI_FROM_DATABASE=Cal-Comp Electronics & Communications Company Ltd.
+OUI:8C9236*
+ ID_OUI_FROM_DATABASE=Aus.Linx Technology Co., Ltd.
 
-OUI:F8D7BF*
- ID_OUI_FROM_DATABASE=REV Ritter GmbH
+OUI:4012E4*
+ ID_OUI_FROM_DATABASE=Compass-EOS
 
-OUI:00B56D*
- ID_OUI_FROM_DATABASE=David Electronics Co., LTD.
+OUI:F8DC7A*
+ ID_OUI_FROM_DATABASE=Variscite LTD
 
-OUI:B461FF*
- ID_OUI_FROM_DATABASE=Lumigon A/S
+OUI:003A9C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:9038DF*
- ID_OUI_FROM_DATABASE=Changzhou Tiannengbo System Co. Ltd.
+OUI:E8E776*
+ ID_OUI_FROM_DATABASE=Shenzhen Kootion Technology Co., Ltd
 
-OUI:CC593E*
- ID_OUI_FROM_DATABASE=TOUMAZ LTD
+OUI:702F97*
+ ID_OUI_FROM_DATABASE=Aava Mobile Oy
 
-OUI:AC8D14*
- ID_OUI_FROM_DATABASE=Smartrove Inc
+OUI:9018AE*
+ ID_OUI_FROM_DATABASE=Shanghai Meridian Technologies, Co. Ltd.
 
-OUI:18673F*
- ID_OUI_FROM_DATABASE=Hanover Displays Limited
+OUI:0494A1*
+ ID_OUI_FROM_DATABASE=CATCH THE WIND INC
 
-OUI:A00ABF*
- ID_OUI_FROM_DATABASE=Wieson Technologies Co., Ltd.
+OUI:2C3427*
+ ID_OUI_FROM_DATABASE=ERCO & GENER
 
-OUI:2091D9*
- ID_OUI_FROM_DATABASE=I'M SPA
+OUI:B42CBE*
+ ID_OUI_FROM_DATABASE=Direct Payment Solutions Limited
 
-OUI:744D79*
- ID_OUI_FROM_DATABASE=Arrive Systems Inc.
+OUI:F47626*
+ ID_OUI_FROM_DATABASE=Viltechmeda UAB
 
-OUI:C83D97*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:EC4476*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:38192F*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:9CEBE8*
+ ID_OUI_FROM_DATABASE=BizLink (Kunshan) Co.,Ltd
 
-OUI:141BF0*
- ID_OUI_FROM_DATABASE=Intellimedia Systems Ltd
+OUI:88ED1C*
+ ID_OUI_FROM_DATABASE=Cudo Communication Co., Ltd.
 
-OUI:E45614*
- ID_OUI_FROM_DATABASE=Suttle Apparatus
+OUI:B05B1F*
+ ID_OUI_FROM_DATABASE=THERMO FISHER SCIENTIFIC S.P.A.
 
-OUI:842BBC*
- ID_OUI_FROM_DATABASE=Modelleisenbahn GmbH
+OUI:743256*
+ ID_OUI_FROM_DATABASE=NT-ware Systemprg GmbH
 
-OUI:E856D6*
- ID_OUI_FROM_DATABASE=NCTech Ltd
+OUI:003AAF*
+ ID_OUI_FROM_DATABASE=BlueBit Ltd.
 
-OUI:4088E0*
- ID_OUI_FROM_DATABASE=Beijing Ereneben Information Technology Limited Shenzhen Branch
+OUI:C0BAE6*
+ ID_OUI_FROM_DATABASE=Application Solutions (Electronics and Vision) Ltd
 
-OUI:1CF4CA*
- ID_OUI_FROM_DATABASE=Private
+OUI:20BFDB*
+ ID_OUI_FROM_DATABASE=DVL
 
-OUI:F490EA*
- ID_OUI_FROM_DATABASE=Deciso B.V.
+OUI:889821*
+ ID_OUI_FROM_DATABASE=TERAON
 
-OUI:942197*
- ID_OUI_FROM_DATABASE=Stalmart Technology Limited
+OUI:CC5076*
+ ID_OUI_FROM_DATABASE=Ocom Communications, Inc.
 
-OUI:AC9403*
- ID_OUI_FROM_DATABASE=Envision Peripherals Inc
+OUI:7C2CF3*
+ ID_OUI_FROM_DATABASE=Secure Electrans Ltd
 
-OUI:A865B2*
- ID_OUI_FROM_DATABASE=DONGGUAN YISHANG ELECTRONIC TECHNOLOGY CO., LIMITED
+OUI:304174*
+ ID_OUI_FROM_DATABASE=ALTEC LANSING LLC
 
-OUI:60B982*
- ID_OUI_FROM_DATABASE=RO.VE.R. Laboratories S.p.A.
+OUI:7830E1*
+ ID_OUI_FROM_DATABASE=UltraClenz, LLC
 
-OUI:B46238*
- ID_OUI_FROM_DATABASE=Exablox
+OUI:FCFBFB*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:40704A*
- ID_OUI_FROM_DATABASE=Power Idea Technology Limited
+OUI:1C129D*
+ ID_OUI_FROM_DATABASE=IEEE PES PSRC/SUB
 
-OUI:A40BED*
- ID_OUI_FROM_DATABASE=Carry Technology Co.,Ltd
+OUI:B40832*
+ ID_OUI_FROM_DATABASE=TC Communications
 
-OUI:0CD996*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:002720*
+ ID_OUI_FROM_DATABASE=NEW-SOL COM
 
-OUI:D82DE1*
- ID_OUI_FROM_DATABASE=Tricascade Inc.
+OUI:002712*
+ ID_OUI_FROM_DATABASE=MaxVision LLC
 
-OUI:C438D3*
- ID_OUI_FROM_DATABASE=TAGATEC CO.,LTD
+OUI:00270F*
+ ID_OUI_FROM_DATABASE=Envisionnovation Inc
 
-OUI:547398*
- ID_OUI_FROM_DATABASE=Toyo Electronics Corporation
+OUI:0026D7*
+ ID_OUI_FROM_DATABASE=KM Electornic Technology Co., Ltd.
 
-OUI:E0AAB0*
- ID_OUI_FROM_DATABASE=GENERAL VISION ELECTRONICS CO. LTD.
+OUI:0026D1*
+ ID_OUI_FROM_DATABASE=S Squared Innovations Inc.
 
-OUI:68B43A*
- ID_OUI_FROM_DATABASE=WaterFurnace International, Inc.
+OUI:0026CB*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:543968*
- ID_OUI_FROM_DATABASE=Edgewater Networks Inc
+OUI:0026C4*
+ ID_OUI_FROM_DATABASE=Cadmos microsystems S.r.l.
 
-OUI:985E1B*
- ID_OUI_FROM_DATABASE=ConversDigital Co., Ltd.
+OUI:0026BE*
+ ID_OUI_FROM_DATABASE=Schoonderbeek Elektronica Systemen B.V.
 
-OUI:B8B7D7*
- ID_OUI_FROM_DATABASE=2GIG Technologies
+OUI:0026B2*
+ ID_OUI_FROM_DATABASE=Setrix GmbH
 
-OUI:1048B1*
- ID_OUI_FROM_DATABASE=Beijing Duokan Technology Limited
+OUI:0026AC*
+ ID_OUI_FROM_DATABASE=Shanghai LUSTER Teraband photonic Co., Ltd.
 
-OUI:005D03*
- ID_OUI_FROM_DATABASE=Xilinx, Inc
+OUI:0026B1*
+ ID_OUI_FROM_DATABASE=Navis Auto Motive Systems, Inc.
 
-OUI:24EE3A*
- ID_OUI_FROM_DATABASE=Chengdu Yingji Electronic Hi-tech Co Ltd
+OUI:0026A8*
+ ID_OUI_FROM_DATABASE=DAEHAP HYPER-TECH
 
-OUI:F82285*
- ID_OUI_FROM_DATABASE=Cypress Technology CO., LTD.
+OUI:0026A7*
+ ID_OUI_FROM_DATABASE=CONNECT SRL
 
-OUI:8482F4*
- ID_OUI_FROM_DATABASE=Beijing Huasun Unicreate Technology Co., Ltd
+OUI:0026A1*
+ ID_OUI_FROM_DATABASE=Megger
 
-OUI:0CC47E*
- ID_OUI_FROM_DATABASE=EUCAST Co., Ltd.
+OUI:0026A2*
+ ID_OUI_FROM_DATABASE=Instrumentation Technology Systems
 
-OUI:CCE798*
- ID_OUI_FROM_DATABASE=My Social Stuff
+OUI:00269B*
+ ID_OUI_FROM_DATABASE=SOKRAT Ltd.
 
-OUI:50724D*
- ID_OUI_FROM_DATABASE=BEG Brueck Electronic GmbH
+OUI:002695*
+ ID_OUI_FROM_DATABASE=ZT Group Int'l Inc
 
-OUI:B898B0*
- ID_OUI_FROM_DATABASE=Atlona Inc.
+OUI:00268F*
+ ID_OUI_FROM_DATABASE=MTA SpA
 
-OUI:2C625A*
- ID_OUI_FROM_DATABASE=Finest Security Systems Co., Ltd
+OUI:6C8CDB*
+ ID_OUI_FROM_DATABASE=Otus Technologies Ltd
 
-OUI:2074CF*
- ID_OUI_FROM_DATABASE=Shenzhen Voxtech Co.,Ltd
+OUI:401597*
+ ID_OUI_FROM_DATABASE=Protect America, Inc.
 
-OUI:ACBD0B*
- ID_OUI_FROM_DATABASE=IMAC CO.,LTD
+OUI:60391F*
+ ID_OUI_FROM_DATABASE=ABB Ltd
 
-OUI:D8D27C*
- ID_OUI_FROM_DATABASE=JEMA ENERGY, SA
+OUI:A07332*
+ ID_OUI_FROM_DATABASE=Cashmaster International Limited
 
-OUI:10F3DB*
- ID_OUI_FROM_DATABASE=Gridco Systems, Inc.
+OUI:7C7BE4*
+ ID_OUI_FROM_DATABASE=Z'SEDAI KENKYUSHO CORPORATION
 
-OUI:B01203*
- ID_OUI_FROM_DATABASE=Dynamics Hong Kong Limited
+OUI:40EF4C*
+ ID_OUI_FROM_DATABASE=Fihonest communication co.,Ltd
 
-OUI:7093F8*
- ID_OUI_FROM_DATABASE=Space Monkey, Inc.
+OUI:24CF21*
+ ID_OUI_FROM_DATABASE=Shenzhen State Micro Technology Co., Ltd
 
-OUI:305D38*
- ID_OUI_FROM_DATABASE=Beissbarth
+OUI:04B3B6*
+ ID_OUI_FROM_DATABASE=Seamap (UK) Ltd
 
-OUI:FCD6BD*
- ID_OUI_FROM_DATABASE=Robert Bosch GmbH
+OUI:10BAA5*
+ ID_OUI_FROM_DATABASE=GANA I&C CO., LTD
 
-OUI:044A50*
- ID_OUI_FROM_DATABASE=Ramaxel Technology (Shenzhen) limited company
+OUI:586ED6*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:A4466B*
- ID_OUI_FROM_DATABASE=EOC Technology
+OUI:E09153*
+ ID_OUI_FROM_DATABASE=XAVi Technologies Corp.
 
-OUI:3CF392*
- ID_OUI_FROM_DATABASE=Virtualtek. Co. Ltd
+OUI:CC0080*
+ ID_OUI_FROM_DATABASE=BETTINI SRL
 
-OUI:889676*
- ID_OUI_FROM_DATABASE=TTC MARCONI s.r.o.
+OUI:644BC3*
+ ID_OUI_FROM_DATABASE=Shanghai WOASiS Telecommunications Ltd., Co.
 
-OUI:149FE8*
- ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
+OUI:0CE709*
+ ID_OUI_FROM_DATABASE=Fox Crypto B.V.
 
-OUI:70B599*
- ID_OUI_FROM_DATABASE=Embedded Technologies s.r.o.
+OUI:002703*
+ ID_OUI_FROM_DATABASE=Testech Electronics Pte Ltd
 
-OUI:EC4C4D*
- ID_OUI_FROM_DATABASE=ZAO NPK RoTeK
+OUI:0026FD*
+ ID_OUI_FROM_DATABASE=Interactive Intelligence
 
-OUI:E8D483*
- ID_OUI_FROM_DATABASE=ULTIMATE Europe Transportation Equipment GmbH
+OUI:0026F6*
+ ID_OUI_FROM_DATABASE=Military Communication Institute
 
-OUI:ACD9D6*
- ID_OUI_FROM_DATABASE=tci GmbH
+OUI:0026F0*
+ ID_OUI_FROM_DATABASE=cTrixs International GmbH.
 
-OUI:7493A4*
- ID_OUI_FROM_DATABASE=Zebra Technologies Corp.
+OUI:0026EA*
+ ID_OUI_FROM_DATABASE=Cheerchip Electronic Technology (ShangHai) Co., Ltd.
 
-OUI:9C0DAC*
- ID_OUI_FROM_DATABASE=Tymphany HK Limited
+OUI:0026E3*
+ ID_OUI_FROM_DATABASE=DTI
 
-OUI:8CD3A2*
- ID_OUI_FROM_DATABASE=VisSim AS
+OUI:0026DD*
+ ID_OUI_FROM_DATABASE=Fival Science & Technology Co.,Ltd.
 
-OUI:647657*
- ID_OUI_FROM_DATABASE=Innovative Security Designs
+OUI:0026DE*
+ ID_OUI_FROM_DATABASE=FDI MATELEC
 
-OUI:60455E*
- ID_OUI_FROM_DATABASE=Liptel s.r.o.
+OUI:54B620*
+ ID_OUI_FROM_DATABASE=SUHDOL E&C Co.Ltd.
 
-OUI:944A09*
- ID_OUI_FROM_DATABASE=BitWise Controls
+OUI:C4AAA1*
+ ID_OUI_FROM_DATABASE=SUMMIT DEVELOPMENT, spol.s r.o.
 
-OUI:E8102E*
- ID_OUI_FROM_DATABASE=Really Simple Software, Inc
+OUI:78C40E*
+ ID_OUI_FROM_DATABASE=H&D Wireless
 
-OUI:D48CB5*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:9C5B96*
+ ID_OUI_FROM_DATABASE=NMR Corporation
 
-OUI:D41E35*
- ID_OUI_FROM_DATABASE=TOHO Electronics INC.
+OUI:E4FFDD*
+ ID_OUI_FROM_DATABASE=ELECTRON INDIA
 
-OUI:700BC0*
- ID_OUI_FROM_DATABASE=Dewav Technology Company
+OUI:F852DF*
+ ID_OUI_FROM_DATABASE=VNL Europe AB
 
-OUI:2CD444*
- ID_OUI_FROM_DATABASE=FUJITSU LIMITED
+OUI:1CF061*
+ ID_OUI_FROM_DATABASE=SCAPS GmbH
 
-OUI:EC1A59*
- ID_OUI_FROM_DATABASE=Belkin International Inc.
+OUI:A893E6*
+ ID_OUI_FROM_DATABASE=JIANGXI JINGGANGSHAN CKING COMMUNICATION TECHNOLOGY CO.,LTD
 
-OUI:60CBFB*
- ID_OUI_FROM_DATABASE=AirScape Inc.
+OUI:00267C*
+ ID_OUI_FROM_DATABASE=Metz-Werke GmbH & Co KG
 
-OUI:4C5427*
- ID_OUI_FROM_DATABASE=Linepro Sp. z o.o.
+OUI:002676*
+ ID_OUI_FROM_DATABASE=COMMidt AS
 
-OUI:3CEAFB*
- ID_OUI_FROM_DATABASE=NSE AG
+OUI:00266F*
+ ID_OUI_FROM_DATABASE=Coordiwise Technology Corp.
 
-OUI:3476C5*
- ID_OUI_FROM_DATABASE=I-O DATA DEVICE, INC.
+OUI:002670*
+ ID_OUI_FROM_DATABASE=Cinch Connectors
 
-OUI:407074*
- ID_OUI_FROM_DATABASE=Life Technology (China) Co., Ltd
+OUI:002663*
+ ID_OUI_FROM_DATABASE=Shenzhen Huitaiwei Tech. Ltd, co.
 
-OUI:58BFEA*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0025CD*
+ ID_OUI_FROM_DATABASE=Skylane Optics
 
-OUI:7C386C*
- ID_OUI_FROM_DATABASE=Real Time Logic
+OUI:0025C8*
+ ID_OUI_FROM_DATABASE=S-Access GmbH
 
-OUI:D8AF3B*
- ID_OUI_FROM_DATABASE=Hangzhou Bigbright Integrated communications system Co.,Ltd
+OUI:0025C7*
+ ID_OUI_FROM_DATABASE=altek Corporation
 
-OUI:78D34F*
- ID_OUI_FROM_DATABASE=Pace-O-Matic, Inc.
+OUI:0025C1*
+ ID_OUI_FROM_DATABASE=Nawoo Korea Corp.
 
-OUI:784405*
- ID_OUI_FROM_DATABASE=FUJITU(HONG KONG) ELECTRONIC Co.,LTD.
+OUI:0025BA*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent IPD
 
-OUI:C03F2A*
- ID_OUI_FROM_DATABASE=Biscotti, Inc.
+OUI:0025B5*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:0025AE*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
 
-OUI:44B382*
- ID_OUI_FROM_DATABASE=Kuang-chi Institute of Advanced Technology
+OUI:0025A8*
+ ID_OUI_FROM_DATABASE=Kontron (BeiJing) Technology Co.,Ltd
 
-OUI:D80DE3*
- ID_OUI_FROM_DATABASE=FXI TECHNOLOGIES AS
+OUI:0025A7*
+ ID_OUI_FROM_DATABASE=Comverge, Inc.
 
-OUI:1CE165*
- ID_OUI_FROM_DATABASE=Marshal Corporation
+OUI:00262B*
+ ID_OUI_FROM_DATABASE=Wongs Electronics Co. Ltd.
 
-OUI:0CC0C0*
- ID_OUI_FROM_DATABASE=MAGNETI MARELLI SISTEMAS ELECTRONICOS MEXICO
+OUI:002625*
+ ID_OUI_FROM_DATABASE=MediaSputnik
 
-OUI:AC40EA*
- ID_OUI_FROM_DATABASE=C&T Solution Inc.
+OUI:00261E*
+ ID_OUI_FROM_DATABASE=QINGBANG ELEC(SZ) CO., LTD
 
-OUI:BC8B55*
- ID_OUI_FROM_DATABASE=NPP ELIKS America Inc. DBA T&M Atlantic
+OUI:002619*
+ ID_OUI_FROM_DATABASE=FRC
 
-OUI:202598*
- ID_OUI_FROM_DATABASE=Teleview
+OUI:002612*
+ ID_OUI_FROM_DATABASE=Space Exploration Technologies
 
-OUI:844915*
- ID_OUI_FROM_DATABASE=vArmour Networks, Inc.
+OUI:00260B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:A04CC1*
- ID_OUI_FROM_DATABASE=Helixtech Corp.
+OUI:00260C*
+ ID_OUI_FROM_DATABASE=Dataram
 
-OUI:1CB243*
- ID_OUI_FROM_DATABASE=TDC A/S
+OUI:0025FF*
+ ID_OUI_FROM_DATABASE=CreNova Multimedia Co., Ltd
 
-OUI:1C51B5*
- ID_OUI_FROM_DATABASE=Techaya LTD
+OUI:002606*
+ ID_OUI_FROM_DATABASE=RAUMFELD GmbH
 
-OUI:80DB31*
- ID_OUI_FROM_DATABASE=Power Quotient International Co., Ltd.
+OUI:0025F9*
+ ID_OUI_FROM_DATABASE=GMK electronic design GmbH
 
-OUI:AC0142*
- ID_OUI_FROM_DATABASE=Uriel Technologies SIA
+OUI:0025A2*
+ ID_OUI_FROM_DATABASE=Alta Definicion LINCEO S.L.
 
-OUI:A007B6*
- ID_OUI_FROM_DATABASE=Advanced Technical Support, Inc.
+OUI:002596*
+ ID_OUI_FROM_DATABASE=GIGAVISION srl
 
-OUI:542A9C*
- ID_OUI_FROM_DATABASE=LSY Defense, LLC.
+OUI:00259B*
+ ID_OUI_FROM_DATABASE=Beijing PKUNITY Microsystems Technology Co., Ltd
 
-OUI:F89955*
- ID_OUI_FROM_DATABASE=Fortress Technology Inc
+OUI:002595*
+ ID_OUI_FROM_DATABASE=Northwest Signal Supply, Inc
 
-OUI:B827EB*
- ID_OUI_FROM_DATABASE=Raspberry Pi Foundation
+OUI:00258F*
+ ID_OUI_FROM_DATABASE=Trident Microsystems, Inc.
 
-OUI:E88DF5*
- ID_OUI_FROM_DATABASE=ZNYX Networks, Inc.
+OUI:002585*
+ ID_OUI_FROM_DATABASE=KOKUYO S&T Co., Ltd.
 
-OUI:48EA63*
- ID_OUI_FROM_DATABASE=Zhejiang Uniview Technologies Co., Ltd.
+OUI:00257B*
+ ID_OUI_FROM_DATABASE=STJ  ELECTRONICS  PVT  LTD
 
-OUI:0CE5D3*
- ID_OUI_FROM_DATABASE=DH electronics GmbH
+OUI:002574*
+ ID_OUI_FROM_DATABASE=KUNIMI MEDIA DEVICE Co., Ltd.
 
-OUI:C47130*
- ID_OUI_FROM_DATABASE=Fon Technology S.L.
+OUI:00264F*
+ ID_OUI_FROM_DATABASE=Krüger &Gothe GmbH
 
-OUI:48D7FF*
- ID_OUI_FROM_DATABASE=BLANKOM Antennentechnik GmbH
+OUI:002648*
+ ID_OUI_FROM_DATABASE=Emitech Corp.
 
-OUI:F47F35*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:002644*
+ ID_OUI_FROM_DATABASE=Thomson Telecom Belgium
 
-OUI:A0F419*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:00263E*
+ ID_OUI_FROM_DATABASE=Trapeze Networks
 
-OUI:BCC168*
- ID_OUI_FROM_DATABASE=DinBox Sverige AB
+OUI:002638*
+ ID_OUI_FROM_DATABASE=Xia Men Joyatech Co., Ltd.
 
-OUI:6CAE8B*
- ID_OUI_FROM_DATABASE=IBM Corporation
+OUI:00263D*
+ ID_OUI_FROM_DATABASE=MIA Corporation
 
-OUI:A4F7D0*
- ID_OUI_FROM_DATABASE=LAN Accessories Co., Ltd.
+OUI:002631*
+ ID_OUI_FROM_DATABASE=COMMTACT LTD
 
-OUI:D4EC0C*
- ID_OUI_FROM_DATABASE=Harley-Davidson Motor Company
+OUI:00256F*
+ ID_OUI_FROM_DATABASE=Dantherm Power
 
-OUI:6CA96F*
- ID_OUI_FROM_DATABASE=TransPacket AS
+OUI:002562*
+ ID_OUI_FROM_DATABASE=interbro Co. Ltd.
 
-OUI:48ED80*
- ID_OUI_FROM_DATABASE=daesung eltec
+OUI:00255C*
+ ID_OUI_FROM_DATABASE=NEC Corporation
 
-OUI:A086EC*
- ID_OUI_FROM_DATABASE=SAEHAN HITEC Co., Ltd
+OUI:00254F*
+ ID_OUI_FROM_DATABASE=ELETTROLAB Srl
 
-OUI:BC4B79*
- ID_OUI_FROM_DATABASE=SensingTek
+OUI:002518*
+ ID_OUI_FROM_DATABASE=Power PLUS Communications AG
 
-OUI:2818FD*
- ID_OUI_FROM_DATABASE=Aditya Infotech Ltd.
+OUI:002513*
+ ID_OUI_FROM_DATABASE=CXP DIGITAL BV
 
-OUI:E42C56*
- ID_OUI_FROM_DATABASE=Lilee Systems, Ltd.
+OUI:00250C*
+ ID_OUI_FROM_DATABASE=Enertrac
 
-OUI:50008C*
- ID_OUI_FROM_DATABASE=Hong Kong Telecommunications (HKT) Limited
+OUI:002505*
+ ID_OUI_FROM_DATABASE=eks Engel GmbH & Co. KG
 
-OUI:DCA8CF*
- ID_OUI_FROM_DATABASE=New Spin Golf, LLC.
+OUI:0024F9*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:34BA9A*
- ID_OUI_FROM_DATABASE=Asiatelco Technologies Co.
+OUI:0024F2*
+ ID_OUI_FROM_DATABASE=Uniphone Telecommunication Co., Ltd.
 
-OUI:642DB7*
- ID_OUI_FROM_DATABASE=SEUNGIL ELECTRONICS
+OUI:0024ED*
+ ID_OUI_FROM_DATABASE=YT Elec. Co,.Ltd.
 
-OUI:008DDA*
- ID_OUI_FROM_DATABASE=Link One Co., Ltd.
+OUI:0024E6*
+ ID_OUI_FROM_DATABASE=In Motion Technology Inc.
 
-OUI:08B4CF*
- ID_OUI_FROM_DATABASE=Abicom International
+OUI:0024E1*
+ ID_OUI_FROM_DATABASE=Convey Computer Corp.
 
-OUI:445F7A*
- ID_OUI_FROM_DATABASE=Shihlin Electric & Engineering Corp.
+OUI:0024DF*
+ ID_OUI_FROM_DATABASE=Digitalbox Europe GmbH
 
-OUI:28BA18*
- ID_OUI_FROM_DATABASE=NextNav, LLC
+OUI:0024DA*
+ ID_OUI_FROM_DATABASE=Innovar Systems Limited
 
-OUI:2C36F8*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:002549*
+ ID_OUI_FROM_DATABASE=Jeorich Tech. Co.,Ltd.
 
-OUI:AC3D05*
- ID_OUI_FROM_DATABASE=Instorescreen Aisa
+OUI:002538*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co., Ltd., Memory Division
 
-OUI:F48E09*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:002542*
+ ID_OUI_FROM_DATABASE=Pittasoft
 
-OUI:D443A8*
- ID_OUI_FROM_DATABASE=Changzhou Haojie Electric Co., Ltd.
+OUI:002530*
+ ID_OUI_FROM_DATABASE=Aetas Systems Inc.
 
-OUI:BCB852*
- ID_OUI_FROM_DATABASE=Cybera, Inc.
+OUI:002529*
+ ID_OUI_FROM_DATABASE=COMELIT GROUP S.P.A
 
-OUI:70D6B6*
- ID_OUI_FROM_DATABASE=Metrum Technologies
+OUI:002522*
+ ID_OUI_FROM_DATABASE=ASRock Incorporation
 
-OUI:28D576*
- ID_OUI_FROM_DATABASE=Premier Wireless, Inc.
+OUI:00251D*
+ ID_OUI_FROM_DATABASE=DSA Encore, LLC
 
-OUI:6CE907*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:0025F5*
+ ID_OUI_FROM_DATABASE=DVS Korea, Co., Ltd
 
-OUI:94DF58*
- ID_OUI_FROM_DATABASE=IJ Electron CO.,Ltd.
+OUI:0025F0*
+ ID_OUI_FROM_DATABASE=Suga Electronics Limited
 
-OUI:8C0CA3*
- ID_OUI_FROM_DATABASE=Amper
+OUI:0025EA*
+ ID_OUI_FROM_DATABASE=Iphion BV
 
-OUI:28940F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0025E4*
+ ID_OUI_FROM_DATABASE=OMNI-WiFi, LLC
 
-OUI:5CEB4E*
- ID_OUI_FROM_DATABASE=R. STAHL HMI Systems GmbH
+OUI:0025E0*
+ ID_OUI_FROM_DATABASE=CeedTec Sdn Bhd
 
-OUI:B8DAF7*
- ID_OUI_FROM_DATABASE=Advanced Photonics, Inc.
+OUI:0025DA*
+ ID_OUI_FROM_DATABASE=Secura Key
 
-OUI:2C36A0*
- ID_OUI_FROM_DATABASE=Capisco Limited
+OUI:0025D9*
+ ID_OUI_FROM_DATABASE=DataFab Systems Inc.
 
-OUI:800A06*
- ID_OUI_FROM_DATABASE=COMTEC co.,ltd
+OUI:002410*
+ ID_OUI_FROM_DATABASE=NUETEQ Technology,Inc.
 
-OUI:20FABB*
- ID_OUI_FROM_DATABASE=Cambridge Executive Limited
+OUI:002409*
+ ID_OUI_FROM_DATABASE=The Toro Company
 
-OUI:1C0B52*
- ID_OUI_FROM_DATABASE=EPICOM S.A
+OUI:0023FD*
+ ID_OUI_FROM_DATABASE=AFT Atlas Fahrzeugtechnik GmbH
 
-OUI:747E2D*
- ID_OUI_FROM_DATABASE=Beijing Thomson CITIC Digital Technology Co. LTD.
+OUI:0023F6*
+ ID_OUI_FROM_DATABASE=Softwell Technology Co., Ltd.
 
-OUI:E80C75*
- ID_OUI_FROM_DATABASE=Syncbak, Inc.
+OUI:0023EC*
+ ID_OUI_FROM_DATABASE=Algorithmix GmbH
 
-OUI:18D66A*
- ID_OUI_FROM_DATABASE=Inmarsat
+OUI:0023E7*
+ ID_OUI_FROM_DATABASE=Hinke A/S
 
-OUI:C85645*
- ID_OUI_FROM_DATABASE=Intermas France
+OUI:002387*
+ ID_OUI_FROM_DATABASE=ThinkFlood, Inc.
 
-OUI:8C604F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:002381*
+ ID_OUI_FROM_DATABASE=Lengda Technology(Xiamen) Co.,Ltd.
 
-OUI:74FF7D*
- ID_OUI_FROM_DATABASE=Wren Sound Systems, LLC
+OUI:00237B*
+ ID_OUI_FROM_DATABASE=WHDI LLC
 
-OUI:30B216*
- ID_OUI_FROM_DATABASE=Hytec Geraetebau GmbH
+OUI:002372*
+ ID_OUI_FROM_DATABASE=MORE STAR INDUSTRIAL GROUP LIMITED
 
-OUI:34FC6F*
- ID_OUI_FROM_DATABASE=ALCEA
+OUI:0024CE*
+ ID_OUI_FROM_DATABASE=Exeltech Inc
 
-OUI:C0B357*
- ID_OUI_FROM_DATABASE=Yoshiki Electronics Industry Ltd.
+OUI:0024D3*
+ ID_OUI_FROM_DATABASE=QUALICA Inc.
 
-OUI:D8BF4C*
- ID_OUI_FROM_DATABASE=Victory Concept Electronics Limited
+OUI:0024C7*
+ ID_OUI_FROM_DATABASE=Mobilarm Ltd
 
-OUI:C0DF77*
- ID_OUI_FROM_DATABASE=Conrad Electronic SE
+OUI:0024C2*
+ ID_OUI_FROM_DATABASE=Asumo Co.,Ltd.
 
-OUI:C86000*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:0024BC*
+ ID_OUI_FROM_DATABASE=HuRob Co.,Ltd
 
-OUI:645299*
- ID_OUI_FROM_DATABASE=The Chamberlain Group, Inc
+OUI:0024B7*
+ ID_OUI_FROM_DATABASE=GridPoint, Inc.
 
-OUI:BC125E*
- ID_OUI_FROM_DATABASE=Beijing  WisVideo  INC.
+OUI:0024AB*
+ ID_OUI_FROM_DATABASE=A7 Engineering, Inc.
 
-OUI:C80718*
- ID_OUI_FROM_DATABASE=TDSi
+OUI:0024A6*
+ ID_OUI_FROM_DATABASE=TELESTAR DIGITAL GmbH
 
-OUI:B4944E*
- ID_OUI_FROM_DATABASE=WeTelecom Co., Ltd.
+OUI:00249A*
+ ID_OUI_FROM_DATABASE=Beijing Zhongchuang Telecommunication Test Co., Ltd.
 
-OUI:345B11*
- ID_OUI_FROM_DATABASE=EVI HEAT AB
+OUI:00249F*
+ ID_OUI_FROM_DATABASE=RIM Testing Services
 
-OUI:988BAD*
- ID_OUI_FROM_DATABASE=Corintech Ltd.
+OUI:002487*
+ ID_OUI_FROM_DATABASE=Blackboard Inc.
 
-OUI:4050E0*
- ID_OUI_FROM_DATABASE=Milton Security Group LLC
+OUI:002498*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:C87CBC*
- ID_OUI_FROM_DATABASE=Valink Co., Ltd.
+OUI:002485*
+ ID_OUI_FROM_DATABASE=ConteXtream Ltd
 
-OUI:409FC7*
- ID_OUI_FROM_DATABASE=BAEKCHUN I&C Co., Ltd.
+OUI:002480*
+ ID_OUI_FROM_DATABASE=Meteocontrol GmbH
 
-OUI:C87D77*
- ID_OUI_FROM_DATABASE=Shenzhen Kingtech Communication Equipment Co.,Ltd
+OUI:00244A*
+ ID_OUI_FROM_DATABASE=Voyant International
 
-OUI:A078BA*
- ID_OUI_FROM_DATABASE=Pantech Co., Ltd.
+OUI:002449*
+ ID_OUI_FROM_DATABASE=Shen Zhen Lite Star Electronics Technology Co., Ltd
 
-OUI:D4507A*
- ID_OUI_FROM_DATABASE=CEIVA Logic, Inc
+OUI:002443*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:9CC7D1*
- ID_OUI_FROM_DATABASE=SHARP Corporation
+OUI:002439*
+ ID_OUI_FROM_DATABASE=Digital Barriers Advanced Technologies
 
-OUI:00B9F6*
- ID_OUI_FROM_DATABASE=Shenzhen Super Rich Electronics Co.,Ltd
+OUI:002479*
+ ID_OUI_FROM_DATABASE=Optec Displays, Inc.
 
-OUI:9C5C8D*
- ID_OUI_FROM_DATABASE=FIREMAX INDÚSTRIA E COMÉRCIO DE PRODUTOS ELETRÔNICOS  LTDA
+OUI:00246D*
+ ID_OUI_FROM_DATABASE=Weinzierl Engineering GmbH
 
-OUI:E01E07*
- ID_OUI_FROM_DATABASE=Anite Telecoms  US. Inc
+OUI:002474*
+ ID_OUI_FROM_DATABASE=Autronica Fire And Securirty
 
-OUI:B06CBF*
- ID_OUI_FROM_DATABASE=3ality Digital Systems GmbH
+OUI:002468*
+ ID_OUI_FROM_DATABASE=Sumavision Technologies Co.,Ltd
 
-OUI:20AA4B*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:002466*
+ ID_OUI_FROM_DATABASE=Unitron nv
 
-OUI:080D84*
- ID_OUI_FROM_DATABASE=GECO, Inc.
+OUI:002461*
+ ID_OUI_FROM_DATABASE=Shin Wang Tech.
 
-OUI:88E712*
- ID_OUI_FROM_DATABASE=Whirlpool Corporation
+OUI:00245C*
+ ID_OUI_FROM_DATABASE=Design-Com Technologies Pty. Ltd.
 
-OUI:644BF0*
- ID_OUI_FROM_DATABASE=CalDigit, Inc
+OUI:00244F*
+ ID_OUI_FROM_DATABASE=Asantron Technologies Ltd.
 
-OUI:2838CF*
- ID_OUI_FROM_DATABASE=Gen2wave
+OUI:0023BB*
+ ID_OUI_FROM_DATABASE=Schmitt Industries
 
-OUI:50FC30*
- ID_OUI_FROM_DATABASE=Treehouse Labs
+OUI:0023BA*
+ ID_OUI_FROM_DATABASE=Chroma
 
-OUI:70704C*
- ID_OUI_FROM_DATABASE=Purple Communications, Inc
+OUI:0023B5*
+ ID_OUI_FROM_DATABASE=ORTANA LTD
 
-OUI:F47ACC*
- ID_OUI_FROM_DATABASE=SolidFire, Inc.
+OUI:0023A8*
+ ID_OUI_FROM_DATABASE=Marshall Electronics
 
-OUI:24BC82*
- ID_OUI_FROM_DATABASE=Dali Wireless, Inc.
+OUI:00239B*
+ ID_OUI_FROM_DATABASE=Elster Solutions, LLC
 
-OUI:64C5AA*
- ID_OUI_FROM_DATABASE=South African Broadcasting Corporation
+OUI:002396*
+ ID_OUI_FROM_DATABASE=ANDES TECHNOLOGY CORPORATION
 
-OUI:64ED62*
- ID_OUI_FROM_DATABASE=WOORI SYSTEMS Co., Ltd
+OUI:002391*
+ ID_OUI_FROM_DATABASE=Maxian
 
-OUI:C4237A*
- ID_OUI_FROM_DATABASE=WhizNets Inc.
+OUI:00238C*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:8430E5*
- ID_OUI_FROM_DATABASE=SkyHawke Technologies, LLC
+OUI:002432*
+ ID_OUI_FROM_DATABASE=Neostar Technology Co.,LTD
 
-OUI:2C002C*
- ID_OUI_FROM_DATABASE=UNOWHY
+OUI:002429*
+ ID_OUI_FROM_DATABASE=MK MASTER INC.
 
-OUI:0481AE*
- ID_OUI_FROM_DATABASE=Clack Corporation
+OUI:00241C*
+ ID_OUI_FROM_DATABASE=FuGang Electronic (DG) Co.,Ltd
 
-OUI:C09132*
- ID_OUI_FROM_DATABASE=Patriot Memory
+OUI:002428*
+ ID_OUI_FROM_DATABASE=EnergyICT
 
-OUI:A898C6*
- ID_OUI_FROM_DATABASE=Shinbo Co., Ltd.
+OUI:002416*
+ ID_OUI_FROM_DATABASE=Any Use
 
-OUI:006BA0*
- ID_OUI_FROM_DATABASE=SHENZHEN UNIVERSAL INTELLISYS PTE LTD
+OUI:0023E0*
+ ID_OUI_FROM_DATABASE=INO Therapeutics LLC
 
-OUI:502690*
- ID_OUI_FROM_DATABASE=FUJITSU LIMITED
+OUI:0023DA*
+ ID_OUI_FROM_DATABASE=Industrial Computer Source (Deutschland)GmbH
 
-OUI:B4211D*
- ID_OUI_FROM_DATABASE=Beijing GuangXin Technology Co., Ltd
+OUI:0023C8*
+ ID_OUI_FROM_DATABASE=TEAM-R
 
-OUI:E039D7*
- ID_OUI_FROM_DATABASE=Plexxi, Inc.
+OUI:0023C7*
+ ID_OUI_FROM_DATABASE=AVSystem
 
-OUI:FC946C*
- ID_OUI_FROM_DATABASE=UBIVELOX
+OUI:0023C1*
+ ID_OUI_FROM_DATABASE=Securitas Direct AB
 
-OUI:38DE60*
- ID_OUI_FROM_DATABASE=Mohlenhoff GmbH
+OUI:0021DC*
+ ID_OUI_FROM_DATABASE=TECNOALARM S.r.l.
 
-OUI:2839E7*
- ID_OUI_FROM_DATABASE=Preceno Technology Pte.Ltd.
+OUI:0021D6*
+ ID_OUI_FROM_DATABASE=LXI Consortium
 
-OUI:28D997*
- ID_OUI_FROM_DATABASE=Yuduan Mobile Co., Ltd.
+OUI:0021CF*
+ ID_OUI_FROM_DATABASE=The Crypto Group
 
-OUI:886B76*
- ID_OUI_FROM_DATABASE=CHINA HOPEFUL GROUP HOPEFUL ELECTRIC CO.,LTD
+OUI:0021C9*
+ ID_OUI_FROM_DATABASE=Wavecom Asia Pacific Limited
 
-OUI:A0CF5B*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0021CA*
+ ID_OUI_FROM_DATABASE=ART System Co., Ltd.
 
-OUI:18C451*
- ID_OUI_FROM_DATABASE=Tucson Embedded Systems
+OUI:0021C3*
+ ID_OUI_FROM_DATABASE=CORNELL Communications, Inc.
 
-OUI:582EFE*
- ID_OUI_FROM_DATABASE=Lighting Science Group
+OUI:002334*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:F8D3A9*
- ID_OUI_FROM_DATABASE=AXAN Networks
+OUI:00232E*
+ ID_OUI_FROM_DATABASE=Kedah Electronics Engineering, LLC
 
-OUI:5CD4AB*
- ID_OUI_FROM_DATABASE=Zektor
+OUI:002329*
+ ID_OUI_FROM_DATABASE=DDRdrive LLC
 
-OUI:F8462D*
- ID_OUI_FROM_DATABASE=SYNTEC Incorporation
+OUI:002322*
+ ID_OUI_FROM_DATABASE=KISS Teknical Solutions, Inc.
 
-OUI:58677F*
- ID_OUI_FROM_DATABASE=Clare Controls Inc.
+OUI:002325*
+ ID_OUI_FROM_DATABASE=IOLAN Holding
 
-OUI:CCA374*
- ID_OUI_FROM_DATABASE=Guangdong Guanglian Electronic Technology Co.Ltd
+OUI:002319*
+ ID_OUI_FROM_DATABASE=Sielox LLC
 
-OUI:50F61A*
- ID_OUI_FROM_DATABASE=Kunshan JADE Technologies co., Ltd.
+OUI:002270*
+ ID_OUI_FROM_DATABASE=ABK North America, LLC
 
-OUI:20BBC6*
- ID_OUI_FROM_DATABASE=Jabil Circuit Hungary Ltd.
+OUI:002317*
+ ID_OUI_FROM_DATABASE=Lasercraft Inc
 
-OUI:2C9717*
- ID_OUI_FROM_DATABASE=I.C.Y. B.V.
+OUI:002310*
+ ID_OUI_FROM_DATABASE=LNC Technology Co., Ltd.
 
-OUI:64E84F*
- ID_OUI_FROM_DATABASE=Serialway Communication Technology Co. Ltd
+OUI:002273*
+ ID_OUI_FROM_DATABASE=Techway
 
-OUI:941D1C*
- ID_OUI_FROM_DATABASE=TLab West Systems AB
+OUI:002274*
+ ID_OUI_FROM_DATABASE=FamilyPhone AB
 
-OUI:40667A*
- ID_OUI_FROM_DATABASE=mediola - connected living AG
+OUI:00226F*
+ ID_OUI_FROM_DATABASE=3onedata Technology Co. Ltd.
 
-OUI:64808B*
- ID_OUI_FROM_DATABASE=VG Controls, Inc.
+OUI:00226A*
+ ID_OUI_FROM_DATABASE=Honeywell
 
-OUI:7C6B52*
- ID_OUI_FROM_DATABASE=Tigaro Wireless
+OUI:002260*
+ ID_OUI_FROM_DATABASE=AFREEY Inc.
 
-OUI:48C1AC*
- ID_OUI_FROM_DATABASE=PLANTRONICS, INC.
+OUI:00225B*
+ ID_OUI_FROM_DATABASE=Teradici Corporation
 
-OUI:046D42*
- ID_OUI_FROM_DATABASE=Bryston Ltd.
+OUI:002256*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:D0CF5E*
- ID_OUI_FROM_DATABASE=Energy Micro AS
+OUI:002255*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:644D70*
- ID_OUI_FROM_DATABASE=dSPACE GmbH
+OUI:00224D*
+ ID_OUI_FROM_DATABASE=MITAC INTERNATIONAL CORP.
 
-OUI:807693*
- ID_OUI_FROM_DATABASE=Newag SA
+OUI:002252*
+ ID_OUI_FROM_DATABASE=ZOLL Lifecor Corporation
 
-OUI:FC1794*
- ID_OUI_FROM_DATABASE=InterCreative Co., Ltd
+OUI:002246*
+ ID_OUI_FROM_DATABASE=Evoc Intelligent Technology Co.,Ltd.
 
-OUI:181420*
- ID_OUI_FROM_DATABASE=TEB SAS
+OUI:002366*
+ ID_OUI_FROM_DATABASE=Beijing Siasun Electronic System Co.,Ltd.
 
-OUI:D03110*
- ID_OUI_FROM_DATABASE=Ingenic Semiconductor Co.,Ltd
+OUI:00236B*
+ ID_OUI_FROM_DATABASE=Xembedded, Inc.
 
-OUI:AC81F3*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:002359*
+ ID_OUI_FROM_DATABASE=Benchmark Electronics ( Thailand ) Public Company Limited
 
-OUI:94C6EB*
- ID_OUI_FROM_DATABASE=NOVA electronics, Inc.
+OUI:00235F*
+ ID_OUI_FROM_DATABASE=Silicon Micro Sensors GmbH
 
-OUI:10F9EE*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:002353*
+ ID_OUI_FROM_DATABASE=F E T Elettronica snc
 
-OUI:80971B*
- ID_OUI_FROM_DATABASE=Altenergy Power System,Inc.
+OUI:00234C*
+ ID_OUI_FROM_DATABASE=KTC AB
 
-OUI:1071F9*
- ID_OUI_FROM_DATABASE=Cloud Telecomputers, LLC
+OUI:002304*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:C47B2F*
- ID_OUI_FROM_DATABASE=Beijing JoinHope Image Technology Ltd.
+OUI:0022F3*
+ ID_OUI_FROM_DATABASE=SHARP Corporation
 
-OUI:18F650*
- ID_OUI_FROM_DATABASE=Multimedia Pacific Limited
+OUI:0022EE*
+ ID_OUI_FROM_DATABASE=Algo Communication Products Ltd
 
-OUI:704AAE*
- ID_OUI_FROM_DATABASE=Xstream Flow (Pty) Ltd
+OUI:0022E7*
+ ID_OUI_FROM_DATABASE=WPS Parking Systems
 
-OUI:9C934E*
- ID_OUI_FROM_DATABASE=Xerox Corporation
+OUI:0022E1*
+ ID_OUI_FROM_DATABASE=ZORT Labs, LLC.
 
-OUI:3C26D5*
- ID_OUI_FROM_DATABASE=Sotera Wireless
+OUI:0022E2*
+ ID_OUI_FROM_DATABASE=WABTEC Transit Division
 
-OUI:FC2E2D*
- ID_OUI_FROM_DATABASE=Lorom Industrial Co.LTD.
+OUI:0022DB*
+ ID_OUI_FROM_DATABASE=Translogic Corporation
 
-OUI:E84E06*
- ID_OUI_FROM_DATABASE=EDUP INTERNATIONAL (HK) CO., LTD
+OUI:0022A1*
+ ID_OUI_FROM_DATABASE=Huawei Symantec Technologies Co.,Ltd.
 
-OUI:B4C799*
- ID_OUI_FROM_DATABASE=Zebra Technologies Inc
+OUI:00229B*
+ ID_OUI_FROM_DATABASE=AverLogic Technologies, Inc.
 
-OUI:70B921*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:00229C*
+ ID_OUI_FROM_DATABASE=Verismo Networks Inc
 
-OUI:948FEE*
- ID_OUI_FROM_DATABASE=Hughes Telematics, Inc.
+OUI:002295*
+ ID_OUI_FROM_DATABASE=SGM Technology for lighting spa
 
-OUI:E8C320*
- ID_OUI_FROM_DATABASE=Austco Communication Systems Pty Ltd
+OUI:00228E*
+ ID_OUI_FROM_DATABASE=TV-NUMERIC
 
-OUI:D8973B*
- ID_OUI_FROM_DATABASE=Artesyn Embedded Technologies
+OUI:002289*
+ ID_OUI_FROM_DATABASE=Optosecurity Inc.
 
-OUI:008D4E*
- ID_OUI_FROM_DATABASE=CJSC NII STT
+OUI:002282*
+ ID_OUI_FROM_DATABASE=8086 Consultancy
 
-OUI:10C586*
- ID_OUI_FROM_DATABASE=BIO SOUND LAB CO., LTD.
+OUI:00227C*
+ ID_OUI_FROM_DATABASE=Woori SMT Co.,ltd
 
-OUI:E8BA70*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:002279*
+ ID_OUI_FROM_DATABASE=Nippon Conlux Co., Ltd.
 
-OUI:6473E2*
- ID_OUI_FROM_DATABASE=Arbiter Systems, Inc.
+OUI:00223C*
+ ID_OUI_FROM_DATABASE=RATIO Entwicklungen GmbH
 
-OUI:00A1DE*
- ID_OUI_FROM_DATABASE=ShenZhen ShiHua Technology CO.,LTD
+OUI:002236*
+ ID_OUI_FROM_DATABASE=VECTOR SP. Z O.O.
 
-OUI:04E1C8*
- ID_OUI_FROM_DATABASE=IMS Soluções em Energia Ltda.
+OUI:002230*
+ ID_OUI_FROM_DATABASE=FutureLogic Inc.
 
-OUI:E4DD79*
- ID_OUI_FROM_DATABASE=En-Vision America, Inc.
+OUI:002229*
+ ID_OUI_FROM_DATABASE=Compumedics Ltd
 
-OUI:60190C*
- ID_OUI_FROM_DATABASE=RRAMAC
+OUI:00221D*
+ ID_OUI_FROM_DATABASE=Freegene Technology LTD
 
-OUI:34A709*
- ID_OUI_FROM_DATABASE=Trevil srl
+OUI:002224*
+ ID_OUI_FROM_DATABASE=Good Will Instrument Co., Ltd.
 
-OUI:F80332*
- ID_OUI_FROM_DATABASE=Khomp
+OUI:002223*
+ ID_OUI_FROM_DATABASE=TimeKeeping Systems, Inc.
 
-OUI:C40F09*
- ID_OUI_FROM_DATABASE=Hermes electronic GmbH
+OUI:002216*
+ ID_OUI_FROM_DATABASE=SHIBAURA VENDING MACHINE CORPORATION
 
-OUI:908D1D*
- ID_OUI_FROM_DATABASE=GH Technologies
+OUI:002217*
+ ID_OUI_FROM_DATABASE=Neat Electronics
 
-OUI:CCB55A*
- ID_OUI_FROM_DATABASE=Fraunhofer ITWM
+OUI:002211*
+ ID_OUI_FROM_DATABASE=Rohati Systems
 
-OUI:587521*
- ID_OUI_FROM_DATABASE=CJSC RTSoft
+OUI:00220A*
+ ID_OUI_FROM_DATABASE=OnLive, Inc
 
-OUI:64D989*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:002204*
+ ID_OUI_FROM_DATABASE=KORATEK
 
-OUI:44D3CA*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0021FF*
+ ID_OUI_FROM_DATABASE=Cyfrowy Polsat SA
 
-OUI:24DAB6*
- ID_OUI_FROM_DATABASE=Sistemas de Gestión Energética S.A. de C.V
+OUI:0021F5*
+ ID_OUI_FROM_DATABASE=Western Engravers Supply, Inc.
 
-OUI:B8F5E7*
- ID_OUI_FROM_DATABASE=WayTools, LLC
+OUI:0021EF*
+ ID_OUI_FROM_DATABASE=Kapsys
 
-OUI:148A70*
- ID_OUI_FROM_DATABASE=ADS GmbH
+OUI:0021EE*
+ ID_OUI_FROM_DATABASE=Full Spectrum Inc.
 
-OUI:FC0012*
- ID_OUI_FROM_DATABASE=Toshiba Samsung Storage Technolgoy Korea Corporation
+OUI:0022D4*
+ ID_OUI_FROM_DATABASE=ComWorth Co., Ltd.
 
-OUI:F44450*
- ID_OUI_FROM_DATABASE=BND Co., Ltd.
+OUI:0022CA*
+ ID_OUI_FROM_DATABASE=Anviz Biometric Tech. Co., Ltd.
 
-OUI:644346*
- ID_OUI_FROM_DATABASE=GuangDong Quick Network Computer CO.,LTD
+OUI:0022C5*
+ ID_OUI_FROM_DATABASE=INFORSON Co,Ltd.
 
-OUI:FCE892*
- ID_OUI_FROM_DATABASE=Hangzhou Lancable Technology Co.,Ltd
+OUI:0022C0*
+ ID_OUI_FROM_DATABASE=Shenzhen Forcelink Electronic Co, Ltd
 
-OUI:B8B42E*
- ID_OUI_FROM_DATABASE=Gionee Communication Equipment Co,Ltd.ShenZhen
+OUI:0022BB*
+ ID_OUI_FROM_DATABASE=beyerdynamic GmbH & Co. KG
 
-OUI:A84041*
- ID_OUI_FROM_DATABASE=Dragino Technology Co., Limited
+OUI:0022AE*
+ ID_OUI_FROM_DATABASE=Mattel Inc.
 
-OUI:DCF05D*
- ID_OUI_FROM_DATABASE=Letta Teknoloji
+OUI:0022AD*
+ ID_OUI_FROM_DATABASE=TELESIS TECHNOLOGIES, INC.
 
-OUI:D05A0F*
- ID_OUI_FROM_DATABASE=I-BT DIGITAL CO.,LTD
+OUI:0022A8*
+ ID_OUI_FROM_DATABASE=Ouman Oy
 
-OUI:7CDD20*
- ID_OUI_FROM_DATABASE=IOXOS Technologies S.A.
+OUI:002132*
+ ID_OUI_FROM_DATABASE=Masterclock, Inc.
 
-OUI:A0E9DB*
- ID_OUI_FROM_DATABASE=Ningbo FreeWings Technologies Co.,Ltd
+OUI:00212C*
+ ID_OUI_FROM_DATABASE=SemIndia System Private Limited
 
-OUI:9C7BD2*
- ID_OUI_FROM_DATABASE=NEOLAB Convergence
+OUI:002131*
+ ID_OUI_FROM_DATABASE=Blynke Inc.
 
-OUI:900D66*
- ID_OUI_FROM_DATABASE=Digimore Electronics Co., Ltd
+OUI:00211F*
+ ID_OUI_FROM_DATABASE=SHINSUNG DELTATECH CO.,LTD.
 
-OUI:48C862*
- ID_OUI_FROM_DATABASE=Simo Wireless,Inc.
+OUI:002120*
+ ID_OUI_FROM_DATABASE=Sequel Technologies
 
-OUI:0CF3EE*
- ID_OUI_FROM_DATABASE=EM Microelectronic
+OUI:002125*
+ ID_OUI_FROM_DATABASE=KUK JE TONG SHIN Co.,LTD
 
-OUI:F0C27C*
- ID_OUI_FROM_DATABASE=Mianyang Netop Telecom Equipment Co.,Ltd.
+OUI:002112*
+ ID_OUI_FROM_DATABASE=WISCOM SYSTEM CO.,LTD
 
-OUI:BC35E5*
- ID_OUI_FROM_DATABASE=Hydro Systems Company
+OUI:001FB9*
+ ID_OUI_FROM_DATABASE=Paltronics
 
-OUI:283410*
- ID_OUI_FROM_DATABASE=Enigma Diagnostics Limited
+OUI:001FB7*
+ ID_OUI_FROM_DATABASE=WiMate Technologies Corp.
 
-OUI:28CCFF*
- ID_OUI_FROM_DATABASE=Corporacion Empresarial Altra SL
+OUI:001FB8*
+ ID_OUI_FROM_DATABASE=Universal Remote Control, Inc.
 
-OUI:14B73D*
- ID_OUI_FROM_DATABASE=ARCHEAN Technologies
+OUI:001FB2*
+ ID_OUI_FROM_DATABASE=Sontheim Industrie Elektronik GmbH
 
-OUI:A433D1*
- ID_OUI_FROM_DATABASE=Fibrlink Communications Co.,Ltd.
+OUI:001FAB*
+ ID_OUI_FROM_DATABASE=I.S HIGH TECH.INC
 
-OUI:84DE3D*
- ID_OUI_FROM_DATABASE=Crystal Vision Ltd
+OUI:001FA6*
+ ID_OUI_FROM_DATABASE=Stilo srl
 
-OUI:B4AA4D*
- ID_OUI_FROM_DATABASE=Ensequence, Inc.
+OUI:001FA1*
+ ID_OUI_FROM_DATABASE=Gtran Inc
 
-OUI:040A83*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent
+OUI:001F9C*
+ ID_OUI_FROM_DATABASE=LEDCO
 
-OUI:B42A39*
- ID_OUI_FROM_DATABASE=ORBIT MERRET, spol. s r. o.
+OUI:00215E*
+ ID_OUI_FROM_DATABASE=IBM Corp
 
-OUI:B80B9D*
- ID_OUI_FROM_DATABASE=ROPEX Industrie-Elektronik GmbH
+OUI:002151*
+ ID_OUI_FROM_DATABASE=Millinet Co., Ltd.
 
-OUI:18AEBB*
- ID_OUI_FROM_DATABASE=Siemens Convergence Creators GmbH&Co.KG
+OUI:002152*
+ ID_OUI_FROM_DATABASE=General Satellite Research & Development Limited
 
-OUI:3891FB*
- ID_OUI_FROM_DATABASE=Xenox Holding BV
+OUI:002157*
+ ID_OUI_FROM_DATABASE=National Datacast, Inc.
 
-OUI:50FAAB*
- ID_OUI_FROM_DATABASE=L-tek d.o.o.
+OUI:00214B*
+ ID_OUI_FROM_DATABASE=Shenzhen HAMP Science & Technology Co.,Ltd
 
-OUI:A8E018*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:002145*
+ ID_OUI_FROM_DATABASE=Semptian Technologies Ltd.
 
-OUI:44AAE8*
- ID_OUI_FROM_DATABASE=Nanotec Electronic GmbH & Co. KG
+OUI:002144*
+ ID_OUI_FROM_DATABASE=SS Telecoms
 
-OUI:D8DF0D*
- ID_OUI_FROM_DATABASE=beroNet GmbH
+OUI:00213C*
+ ID_OUI_FROM_DATABASE=AliphCom
 
-OUI:D8C068*
- ID_OUI_FROM_DATABASE=Netgenetech.co.,ltd.
+OUI:00213B*
+ ID_OUI_FROM_DATABASE=Berkshire Products, Inc
 
-OUI:50E549*
- ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
+OUI:002190*
+ ID_OUI_FROM_DATABASE=Goliath Solutions
 
-OUI:A8FCB7*
- ID_OUI_FROM_DATABASE=Consolidated Resource Imaging
+OUI:002189*
+ ID_OUI_FROM_DATABASE=AppTech, Inc.
 
-OUI:F87B8C*
- ID_OUI_FROM_DATABASE=Amped Wireless
+OUI:002184*
+ ID_OUI_FROM_DATABASE=POWERSOFT SRL
 
-OUI:44D2CA*
- ID_OUI_FROM_DATABASE=Anvia TV Oy
+OUI:00217D*
+ ID_OUI_FROM_DATABASE=PYXIS S.R.L.
 
-OUI:4C1A3A*
- ID_OUI_FROM_DATABASE=PRIMA Research And Production Enterprise Ltd.
+OUI:002177*
+ ID_OUI_FROM_DATABASE=W. L. Gore & Associates
 
-OUI:AC0613*
- ID_OUI_FROM_DATABASE=Senselogix Ltd
+OUI:002176*
+ ID_OUI_FROM_DATABASE=YMax Telecom Ltd.
 
-OUI:CCF67A*
- ID_OUI_FROM_DATABASE=Ayecka Communication Systems LTD
+OUI:002171*
+ ID_OUI_FROM_DATABASE=Wesung TNC Co., Ltd.
 
-OUI:00BB8E*
- ID_OUI_FROM_DATABASE=HME Co., Ltd.
+OUI:002164*
+ ID_OUI_FROM_DATABASE=Special Design Bureau for Seismic Instrumentation
 
-OUI:C0A26D*
- ID_OUI_FROM_DATABASE=Abbott Point of Care
+OUI:002103*
+ ID_OUI_FROM_DATABASE=GHI Electronics, LLC
 
-OUI:205B2A*
- ID_OUI_FROM_DATABASE=Private
+OUI:001FFA*
+ ID_OUI_FROM_DATABASE=Coretree, Co, Ltd
 
-OUI:18B430*
- ID_OUI_FROM_DATABASE=Nest Labs Inc.
+OUI:001FF5*
+ ID_OUI_FROM_DATABASE=Kongsberg Defence & Aerospace
 
-OUI:F8769B*
- ID_OUI_FROM_DATABASE=Neopis Co., Ltd.
+OUI:001FF4*
+ ID_OUI_FROM_DATABASE=Power Monitors, Inc.
 
-OUI:08E672*
- ID_OUI_FROM_DATABASE=JEBSEE ELECTRONICS CO.,LTD.
+OUI:001FEE*
+ ID_OUI_FROM_DATABASE=ubisys technologies GmbH
 
-OUI:58E476*
- ID_OUI_FROM_DATABASE=CENTRON COMMUNICATIONS TECHNOLOGIES FUJIAN CO.,LTD
+OUI:001FE7*
+ ID_OUI_FROM_DATABASE=Simet
 
-OUI:B435F7*
- ID_OUI_FROM_DATABASE=Zhejiang Pearmain Electronics Co.ltd.
+OUI:001FDB*
+ ID_OUI_FROM_DATABASE=Network Supply Corp.,
 
-OUI:0C6E4F*
- ID_OUI_FROM_DATABASE=PrimeVOLT Co., Ltd.
+OUI:001FD1*
+ ID_OUI_FROM_DATABASE=OPTEX CO.,LTD.
 
-OUI:685B36*
- ID_OUI_FROM_DATABASE=POWERTECH INDUSTRIAL CO., LTD.
+OUI:001FCA*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:983000*
- ID_OUI_FROM_DATABASE=Beijing KEMACOM Technologies Co., Ltd.
+OUI:001FBE*
+ ID_OUI_FROM_DATABASE=Shenzhen Mopnet Industrial Co.,Ltd
 
-OUI:F81D93*
- ID_OUI_FROM_DATABASE=Longdhua(Beijing) Controls Technology Co.,Ltd
+OUI:001F62*
+ ID_OUI_FROM_DATABASE=JSC Stilsoft
 
-OUI:D0EB9E*
- ID_OUI_FROM_DATABASE=Seowoo Inc.
+OUI:001F67*
+ ID_OUI_FROM_DATABASE=Hitachi,Ltd.
 
-OUI:8C5FDF*
- ID_OUI_FROM_DATABASE=Beijing Railway Signal Factory
+OUI:001F55*
+ ID_OUI_FROM_DATABASE=Honeywell Security (China) Co., Ltd.
 
-OUI:586D8F*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:001F56*
+ ID_OUI_FROM_DATABASE=DIGITAL FORECAST
 
-OUI:14C21D*
- ID_OUI_FROM_DATABASE=Sabtech Industries
+OUI:001F4F*
+ ID_OUI_FROM_DATABASE=Thinkware Co. Ltd.
 
-OUI:74B00C*
- ID_OUI_FROM_DATABASE=Network Video Technologies, Inc
+OUI:001F48*
+ ID_OUI_FROM_DATABASE=Mojix Inc.
 
-OUI:C88439*
- ID_OUI_FROM_DATABASE=Sunrise Technologies
+OUI:001F43*
+ ID_OUI_FROM_DATABASE=ENTES ELEKTRONIK
 
-OUI:44E4D9*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001F8E*
+ ID_OUI_FROM_DATABASE=Metris USA Inc.
 
-OUI:0054AF*
- ID_OUI_FROM_DATABASE=Continental Automotive Systems Inc.
+OUI:001F88*
+ ID_OUI_FROM_DATABASE=FMS Force Measuring Systems AG
 
-OUI:EC7D9D*
- ID_OUI_FROM_DATABASE=MEI
+OUI:001F81*
+ ID_OUI_FROM_DATABASE=Accel Semiconductor Corp
 
-OUI:9C95F8*
- ID_OUI_FROM_DATABASE=SmartDoor Systems, LLC
+OUI:001B58*
+ ID_OUI_FROM_DATABASE=ACE CAD Enterprise Co., Ltd.
 
-OUI:D075BE*
- ID_OUI_FROM_DATABASE=Reno A&E
+OUI:001F78*
+ ID_OUI_FROM_DATABASE=Blue Fox Porini Textile
 
-OUI:7C6C39*
- ID_OUI_FROM_DATABASE=PIXSYS SRL
+OUI:001F6E*
+ ID_OUI_FROM_DATABASE=Vtech Engineering Corporation
 
-OUI:9C5D95*
- ID_OUI_FROM_DATABASE=VTC Electronics Corp.
+OUI:001F68*
+ ID_OUI_FROM_DATABASE=Martinsson Elektronik AB
 
-OUI:DC05ED*
- ID_OUI_FROM_DATABASE=Nabtesco  Corporation
+OUI:0021BC*
+ ID_OUI_FROM_DATABASE=ZALA COMPUTER
 
-OUI:FC8329*
- ID_OUI_FROM_DATABASE=Trei technics
+OUI:0021B7*
+ ID_OUI_FROM_DATABASE=Lexmark International Inc.
 
-OUI:94E848*
- ID_OUI_FROM_DATABASE=FYLDE MICRO LTD
+OUI:0021B0*
+ ID_OUI_FROM_DATABASE=Tyco Telecommunications
 
-OUI:AC5E8C*
- ID_OUI_FROM_DATABASE=Utillink
+OUI:0021A4*
+ ID_OUI_FROM_DATABASE=Dbii Networks
 
-OUI:CC7EE7*
- ID_OUI_FROM_DATABASE=Panasonic AVC Networks Company
+OUI:00219A*
+ ID_OUI_FROM_DATABASE=Cambridge Visual Networks Ltd
 
-OUI:BC99BC*
- ID_OUI_FROM_DATABASE=FonSee Technology Inc.
+OUI:002196*
+ ID_OUI_FROM_DATABASE=Telsey  S.p.A.
 
-OUI:986022*
- ID_OUI_FROM_DATABASE=EMW Co., Ltd.
+OUI:001E4B*
+ ID_OUI_FROM_DATABASE=City Theatrical
 
-OUI:80B32A*
- ID_OUI_FROM_DATABASE=Alstom Grid
+OUI:001E47*
+ ID_OUI_FROM_DATABASE=PT. Hariff Daya Tunggal Engineering
 
-OUI:803457*
- ID_OUI_FROM_DATABASE=OT Systems Limited
+OUI:001E41*
+ ID_OUI_FROM_DATABASE=Microwave Communication & Component, Inc.
 
-OUI:B83D4E*
- ID_OUI_FROM_DATABASE=Shenzhen Cultraview Digital Technology Co.,Ltd Shanghai Branch
+OUI:001E2E*
+ ID_OUI_FROM_DATABASE=SIRTI S.p.A.
 
-OUI:CCF3A5*
- ID_OUI_FROM_DATABASE=Chi Mei Communication Systems, Inc
+OUI:001E27*
+ ID_OUI_FROM_DATABASE=SBN TECH Co.,Ltd.
 
-OUI:C4242E*
- ID_OUI_FROM_DATABASE=Galvanic Applied Sciences Inc
+OUI:001E28*
+ ID_OUI_FROM_DATABASE=Lumexis Corporation
 
-OUI:6400F1*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001DF2*
+ ID_OUI_FROM_DATABASE=Netflix, Inc.
 
-OUI:04C5A4*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001DEB*
+ ID_OUI_FROM_DATABASE=DINEC International
 
-OUI:3CA72B*
- ID_OUI_FROM_DATABASE=MRV Communications (Networks) LTD
+OUI:001DEC*
+ ID_OUI_FROM_DATABASE=Marusys
 
-OUI:584C19*
- ID_OUI_FROM_DATABASE=Chongqing Guohong Technology Development Company Limited
+OUI:001DE6*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:D0A311*
- ID_OUI_FROM_DATABASE=Neuberger Gebäudeautomation GmbH
+OUI:001DDA*
+ ID_OUI_FROM_DATABASE=Mikroelektronika spol. s r. o.
 
-OUI:10A13B*
- ID_OUI_FROM_DATABASE=FUJIKURA RUBBER LTD.
+OUI:001DDF*
+ ID_OUI_FROM_DATABASE=Sunitec Enterprise Co., Ltd.
 
-OUI:F4E142*
- ID_OUI_FROM_DATABASE=Delta Elektronika BV
+OUI:001DC7*
+ ID_OUI_FROM_DATABASE=L-3 Communications Geneva Aerospace
 
-OUI:F00248*
- ID_OUI_FROM_DATABASE=SmarteBuilding
+OUI:001DC0*
+ ID_OUI_FROM_DATABASE=Enphase Energy
 
-OUI:2CDD0C*
- ID_OUI_FROM_DATABASE=Discovergy GmbH
+OUI:001ED8*
+ ID_OUI_FROM_DATABASE=Digital United Inc.
 
-OUI:40B2C8*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:001ED2*
+ ID_OUI_FROM_DATABASE=Ray Shine Video Technology Inc
 
-OUI:486B91*
- ID_OUI_FROM_DATABASE=Fleetwood Group Inc.
+OUI:001ED1*
+ ID_OUI_FROM_DATABASE=Keyprocessor B.V.
 
-OUI:F43814*
- ID_OUI_FROM_DATABASE=Shanghai Howell Electronic Co.,Ltd
+OUI:001ECC*
+ ID_OUI_FROM_DATABASE=CDVI
 
-OUI:20AA25*
- ID_OUI_FROM_DATABASE=IP-NET LLC
+OUI:001EC5*
+ ID_OUI_FROM_DATABASE=Middle Atlantic Products Inc
 
-OUI:ECBBAE*
- ID_OUI_FROM_DATABASE=Digivoice Tecnologia em Eletronica Ltda
+OUI:001EBF*
+ ID_OUI_FROM_DATABASE=Haas Automation Inc.
 
-OUI:DC2008*
- ID_OUI_FROM_DATABASE=ASD Electronics Ltd
+OUI:001EB9*
+ ID_OUI_FROM_DATABASE=Sing Fai Technology Limited
 
-OUI:088DC8*
- ID_OUI_FROM_DATABASE=Ryowa Electronics Co.,Ltd
+OUI:001EB2*
+ ID_OUI_FROM_DATABASE=LG innotek
 
-OUI:D491AF*
- ID_OUI_FROM_DATABASE=Electroacustica General Iberica, S.A.
+OUI:001F2E*
+ ID_OUI_FROM_DATABASE=Triangle Research Int'l Pte Ltd
 
-OUI:1CDF0F*
+OUI:001F2D*
+ ID_OUI_FROM_DATABASE=Electro-Optical Imaging, Inc.
+
+OUI:001F27*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:34DF2A*
- ID_OUI_FROM_DATABASE=Fujikon Industrial Co.,Limited
+OUI:001F14*
+ ID_OUI_FROM_DATABASE=NexG
 
-OUI:C88447*
- ID_OUI_FROM_DATABASE=Beautiful Enterprise Co., Ltd
+OUI:001F1B*
+ ID_OUI_FROM_DATABASE=RoyalTek Company Ltd.
 
-OUI:C88B47*
- ID_OUI_FROM_DATABASE=Nolangroup S.P.A con Socio Unico
+OUI:001F0D*
+ ID_OUI_FROM_DATABASE=L3 Communications - Telemetry West
 
-OUI:24BA30*
- ID_OUI_FROM_DATABASE=Technical Consumer Products, Inc.
+OUI:001F0E*
+ ID_OUI_FROM_DATABASE=Japan Kyastem Co., Ltd
 
-OUI:74D675*
- ID_OUI_FROM_DATABASE=WYMA Tecnologia
+OUI:001E22*
+ ID_OUI_FROM_DATABASE=ARVOO Imaging Products BV
 
-OUI:D01CBB*
- ID_OUI_FROM_DATABASE=Beijing Ctimes Digital Technology Co., Ltd.
+OUI:001E1B*
+ ID_OUI_FROM_DATABASE=Digital Stream Technology, Inc.
 
-OUI:9481A4*
- ID_OUI_FROM_DATABASE=Azuray Technologies
+OUI:001E16*
+ ID_OUI_FROM_DATABASE=Keytronix
 
-OUI:BCE09D*
- ID_OUI_FROM_DATABASE=Eoslink
+OUI:001E15*
+ ID_OUI_FROM_DATABASE=Beech Hill Electronics
 
-OUI:346F92*
- ID_OUI_FROM_DATABASE=White Rodgers Division
+OUI:001E11*
+ ID_OUI_FROM_DATABASE=ELELUX INTERNATIONAL LTD
 
-OUI:8CDB25*
- ID_OUI_FROM_DATABASE=ESG Solutions
+OUI:001E05*
+ ID_OUI_FROM_DATABASE=Xseed Technologies & Computing
 
-OUI:641A22*
- ID_OUI_FROM_DATABASE=Heliospectra AB
+OUI:001E0C*
+ ID_OUI_FROM_DATABASE=Sherwood Information Partners, Inc.
 
-OUI:30142D*
- ID_OUI_FROM_DATABASE=Piciorgros GmbH
+OUI:001DFE*
+ ID_OUI_FROM_DATABASE=Palm, Inc
 
-OUI:E441E6*
- ID_OUI_FROM_DATABASE=Ottec Technology GmbH
+OUI:001DF9*
+ ID_OUI_FROM_DATABASE=Cybiotronics (Far East) Limited
 
-OUI:10E2D5*
- ID_OUI_FROM_DATABASE=Qi Hardware Inc.
+OUI:001EAD*
+ ID_OUI_FROM_DATABASE=Wingtech Group Limited
 
-OUI:7CDA84*
- ID_OUI_FROM_DATABASE=Dongnian Networks Inc.
+OUI:001EA2*
+ ID_OUI_FROM_DATABASE=Symx Systems, Inc.
 
-OUI:A036FA*
- ID_OUI_FROM_DATABASE=Ettus Research LLC
+OUI:001EA7*
+ ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
 
-OUI:EC836C*
- ID_OUI_FROM_DATABASE=RM Tech Co., Ltd.
+OUI:001EA1*
+ ID_OUI_FROM_DATABASE=Brunata a/s
 
-OUI:C0C520*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:001E9B*
+ ID_OUI_FROM_DATABASE=San-Eisha, Ltd.
 
-OUI:6083B2*
- ID_OUI_FROM_DATABASE=GkWare e.K.
+OUI:001E94*
+ ID_OUI_FROM_DATABASE=SUPERCOM TECHNOLOGY CORPORATION
 
-OUI:80D019*
- ID_OUI_FROM_DATABASE=Embed, Inc
+OUI:001E8F*
+ ID_OUI_FROM_DATABASE=CANON INC.
 
-OUI:D41296*
- ID_OUI_FROM_DATABASE=Anobit Technologies Ltd.
+OUI:001E87*
+ ID_OUI_FROM_DATABASE=Realease Limited
 
-OUI:B8FF6F*
- ID_OUI_FROM_DATABASE=Shanghai Typrotech Technology Co.Ltd
+OUI:001E80*
+ ID_OUI_FROM_DATABASE=Last Mile Ltd.
 
-OUI:DC9C52*
- ID_OUI_FROM_DATABASE=Sapphire Technology Limited.
+OUI:001EFC*
+ ID_OUI_FROM_DATABASE=JSC MASSA-K
 
-OUI:68122D*
- ID_OUI_FROM_DATABASE=Special Instrument Development Co., Ltd.
+OUI:001F08*
+ ID_OUI_FROM_DATABASE=RISCO LTD
 
-OUI:649B24*
- ID_OUI_FROM_DATABASE=V Technology Co., Ltd.
+OUI:001EF5*
+ ID_OUI_FROM_DATABASE=Hitek Automated Inc.
 
-OUI:0475F5*
- ID_OUI_FROM_DATABASE=CSST
+OUI:001EFB*
+ ID_OUI_FROM_DATABASE=Trio Motion Technology Ltd
 
-OUI:BC20BA*
- ID_OUI_FROM_DATABASE=Inspur (Shandong) Electronic Information Co., Ltd
+OUI:001EE9*
+ ID_OUI_FROM_DATABASE=Stoneridge Electronics AB
 
-OUI:249442*
- ID_OUI_FROM_DATABASE=OPEN ROAD SOLUTIONS , INC.
+OUI:001EEE*
+ ID_OUI_FROM_DATABASE=ETL Systems Ltd
 
-OUI:E0F379*
- ID_OUI_FROM_DATABASE=Vaddio
+OUI:001E7B*
+ ID_OUI_FROM_DATABASE=R.I.CO. S.r.l.
 
-OUI:B09AE2*
- ID_OUI_FROM_DATABASE=STEMMER IMAGING GmbH
+OUI:001E76*
+ ID_OUI_FROM_DATABASE=Thermo Fisher Scientific
 
-OUI:CCD811*
- ID_OUI_FROM_DATABASE=Aiconn Technology Corporation
+OUI:001E6A*
+ ID_OUI_FROM_DATABASE=Beijing Bluexon Technology Co.,Ltd
 
-OUI:78D004*
- ID_OUI_FROM_DATABASE=Neousys Technology Inc.
+OUI:001E71*
+ ID_OUI_FROM_DATABASE=MIrcom Group of Companies
 
-OUI:78A051*
- ID_OUI_FROM_DATABASE=iiNet Labs Pty Ltd
+OUI:001E63*
+ ID_OUI_FROM_DATABASE=Vibro-Meter SA
 
-OUI:58A76F*
- ID_OUI_FROM_DATABASE=iD corporation
+OUI:001E5E*
+ ID_OUI_FROM_DATABASE=COmputime Ltd.
 
-OUI:44599F*
- ID_OUI_FROM_DATABASE=Criticare Systems, Inc
+OUI:001E57*
+ ID_OUI_FROM_DATABASE=ALCOMA, spol. s r.o.
 
-OUI:3C2F3A*
- ID_OUI_FROM_DATABASE=SFORZATO Corp.
+OUI:001E51*
+ ID_OUI_FROM_DATABASE=Converter Industry Srl
 
-OUI:EC9233*
- ID_OUI_FROM_DATABASE=Eddyfi NDT Inc
+OUI:001DB9*
+ ID_OUI_FROM_DATABASE=Wellspring Wireless
 
-OUI:ECE90B*
- ID_OUI_FROM_DATABASE=SISTEMA SOLUCOES ELETRONICAS LTDA - EASYTECH
+OUI:001DB4*
+ ID_OUI_FROM_DATABASE=KUMHO ENG CO.,LTD
 
-OUI:A08C9B*
- ID_OUI_FROM_DATABASE=Xtreme Technologies Corp
+OUI:001D9E*
+ ID_OUI_FROM_DATABASE=AXION TECHNOLOGIES
 
-OUI:607688*
- ID_OUI_FROM_DATABASE=Velodyne
+OUI:001DA3*
+ ID_OUI_FROM_DATABASE=SabiOso
 
-OUI:980EE4*
- ID_OUI_FROM_DATABASE=Private
+OUI:001D9D*
+ ID_OUI_FROM_DATABASE=ARTJOY INTERNATIONAL LIMITED
 
-OUI:E828D5*
- ID_OUI_FROM_DATABASE=Cots Technology
+OUI:001D45*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:08D5C0*
- ID_OUI_FROM_DATABASE=Seers Technology Co., Ltd
+OUI:001D3E*
+ ID_OUI_FROM_DATABASE=SAKA TECHNO SCIENCE CO.,LTD
 
-OUI:8CB64F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001D37*
+ ID_OUI_FROM_DATABASE=Thales-Panda Transportation System
 
-OUI:6C33A9*
- ID_OUI_FROM_DATABASE=Magicjack LP
+OUI:001D38*
+ ID_OUI_FROM_DATABASE=Seagate Technology
 
-OUI:08B7EC*
- ID_OUI_FROM_DATABASE=Wireless Seismic
+OUI:001D32*
+ ID_OUI_FROM_DATABASE=Longkay Communication & Technology (Shanghai) Co. Ltd
 
-OUI:BC71C1*
- ID_OUI_FROM_DATABASE=XTrillion, Inc.
+OUI:001D2B*
+ ID_OUI_FROM_DATABASE=Wuhan Pont Technology CO. , LTD
 
-OUI:0C469D*
- ID_OUI_FROM_DATABASE=MS Sedco
+OUI:001D1F*
+ ID_OUI_FROM_DATABASE=Siauliu Tauro Televizoriai, JSC
 
-OUI:E0E8E8*
- ID_OUI_FROM_DATABASE=Olive Telecommunication Pvt. Ltd
+OUI:001D26*
+ ID_OUI_FROM_DATABASE=Rockridgesound Technology Co.
 
-OUI:0C3C65*
- ID_OUI_FROM_DATABASE=Dome Imaging Inc
+OUI:001D1A*
+ ID_OUI_FROM_DATABASE=OvisLink S.A.
 
-OUI:942053*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:001D7A*
+ ID_OUI_FROM_DATABASE=Wideband Semiconductor, Inc.
 
-OUI:D49C8E*
- ID_OUI_FROM_DATABASE=University of FUKUI
+OUI:001D74*
+ ID_OUI_FROM_DATABASE=Tianjin China-Silicon Microelectronics Co., Ltd.
 
-OUI:2CB0DF*
- ID_OUI_FROM_DATABASE=Soliton Technologies Pvt Ltd
+OUI:001D62*
+ ID_OUI_FROM_DATABASE=InPhase Technologies
 
-OUI:5CF3FC*
- ID_OUI_FROM_DATABASE=IBM Corp
+OUI:001D61*
+ ID_OUI_FROM_DATABASE=BIJ Corporation
 
-OUI:D43D67*
- ID_OUI_FROM_DATABASE=Carma Industries Inc.
+OUI:001D5B*
+ ID_OUI_FROM_DATABASE=Tecvan Informática Ltda
 
-OUI:00BD27*
- ID_OUI_FROM_DATABASE=Exar Corp.
+OUI:001D54*
+ ID_OUI_FROM_DATABASE=Sunnic Technology & Merchandise INC.
 
-OUI:C8A729*
- ID_OUI_FROM_DATABASE=SYStronics Co., Ltd.
+OUI:001D4A*
+ ID_OUI_FROM_DATABASE=Carestream Health, Inc.
 
-OUI:6C9CE9*
- ID_OUI_FROM_DATABASE=Nimble Storage
+OUI:001CE8*
+ ID_OUI_FROM_DATABASE=Cummins Inc
 
-OUI:700258*
- ID_OUI_FROM_DATABASE=01DB-METRAVIB
+OUI:001CE4*
+ ID_OUI_FROM_DATABASE=EleSy JSC
 
-OUI:20FDF1*
- ID_OUI_FROM_DATABASE=3COM EUROPE LTD
+OUI:001CDD*
+ ID_OUI_FROM_DATABASE=COWBELL ENGINEERING CO., LTD.
 
-OUI:389592*
- ID_OUI_FROM_DATABASE=Beijing Tendyron Corporation
+OUI:001CDE*
+ ID_OUI_FROM_DATABASE=Interactive Multimedia eXchange Inc.
 
-OUI:705EAA*
- ID_OUI_FROM_DATABASE=Action Target, Inc.
+OUI:001CD8*
+ ID_OUI_FROM_DATABASE=BlueAnt Wireless
 
-OUI:0C8D98*
- ID_OUI_FROM_DATABASE=TOP EIGHT IND CORP
+OUI:001CD1*
+ ID_OUI_FROM_DATABASE=Waves Audio LTD
 
-OUI:30493B*
- ID_OUI_FROM_DATABASE=Nanjing Z-Com Wireless Co.,Ltd
+OUI:001CCB*
+ ID_OUI_FROM_DATABASE=Forth Corporation Public Company Limited
 
-OUI:68DB96*
- ID_OUI_FROM_DATABASE=OPWILL Technologies CO .,LTD
+OUI:001CC5*
+ ID_OUI_FROM_DATABASE=3Com Ltd
 
-OUI:00F860*
- ID_OUI_FROM_DATABASE=PT. Panggung Electric Citrabuana
+OUI:001D14*
+ ID_OUI_FROM_DATABASE=SPERADTONE INFORMATION TECHNOLOGY LIMITED
 
-OUI:FCEDB9*
- ID_OUI_FROM_DATABASE=Arrayent
+OUI:001D07*
+ ID_OUI_FROM_DATABASE=Shenzhen Sang Fei Consumer Communications Co.,Ltd
 
-OUI:44ED57*
- ID_OUI_FROM_DATABASE=Longicorn, inc.
+OUI:001D01*
+ ID_OUI_FROM_DATABASE=Neptune Digital
 
-OUI:C8A1B6*
- ID_OUI_FROM_DATABASE=Shenzhen Longway Technologies Co., Ltd
+OUI:001CEE*
+ ID_OUI_FROM_DATABASE=SHARP Corporation
 
-OUI:641E81*
- ID_OUI_FROM_DATABASE=Dowslake Microsystems
+OUI:001CF5*
+ ID_OUI_FROM_DATABASE=Wiseblue Technology Limited
 
-OUI:88ACC1*
- ID_OUI_FROM_DATABASE=Generiton Co., Ltd.
+OUI:001CB9*
+ ID_OUI_FROM_DATABASE=KWANG SUNG ELECTRONICS CO., LTD.
 
-OUI:785712*
- ID_OUI_FROM_DATABASE=Mobile Integration Workgroup
+OUI:001CAF*
+ ID_OUI_FROM_DATABASE=Plato Networks Inc.
 
-OUI:380A0A*
- ID_OUI_FROM_DATABASE=Sky-City Communication and Electronics Limited Company
+OUI:001CB4*
+ ID_OUI_FROM_DATABASE=Iridium Satellite LLC
 
-OUI:141BBD*
- ID_OUI_FROM_DATABASE=Volex Inc.
+OUI:001C9F*
+ ID_OUI_FROM_DATABASE=Razorstream, LLC
 
-OUI:78C6BB*
- ID_OUI_FROM_DATABASE=Innovasic, Inc.
+OUI:001C99*
+ ID_OUI_FROM_DATABASE=Shunra Software Ltd.
 
-OUI:DC4EDE*
- ID_OUI_FROM_DATABASE=SHINYEI TECHNOLOGY CO., LTD.
+OUI:001C8C*
+ ID_OUI_FROM_DATABASE=DIAL TECHNOLOGY LTD.
 
-OUI:888B5D*
- ID_OUI_FROM_DATABASE=Storage Appliance Corporation
+OUI:001C93*
+ ID_OUI_FROM_DATABASE=ExaDigm Inc
 
-OUI:F0F842*
- ID_OUI_FROM_DATABASE=KEEBOX, Inc.
+OUI:001C87*
+ ID_OUI_FROM_DATABASE=Uriver Inc.
 
-OUI:78A714*
- ID_OUI_FROM_DATABASE=Amphenol
+OUI:001C82*
+ ID_OUI_FROM_DATABASE=Genew Technologies
 
-OUI:F450EB*
- ID_OUI_FROM_DATABASE=Telechips Inc
+OUI:001C1A*
+ ID_OUI_FROM_DATABASE=Thomas Instrumentation, Inc
 
-OUI:988EDD*
- ID_OUI_FROM_DATABASE=TE Connectivity Limerick
+OUI:001C0E*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:98FC11*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:001C13*
+ ID_OUI_FROM_DATABASE=OPTSYS TECHNOLOGY CO., LTD.
 
-OUI:180C77*
- ID_OUI_FROM_DATABASE=Westinghouse Electric Company, LLC
+OUI:001C07*
+ ID_OUI_FROM_DATABASE=Cwlinux Limited
 
-OUI:ACA016*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001C00*
+ ID_OUI_FROM_DATABASE=Entry Point, LLC
 
-OUI:E4AD7D*
- ID_OUI_FROM_DATABASE=SCL Elements
+OUI:001BF4*
+ ID_OUI_FROM_DATABASE=KENWIN INDUSTRIAL(HK) LTD.
 
-OUI:40D40E*
- ID_OUI_FROM_DATABASE=Biodata Ltd
+OUI:001BEF*
+ ID_OUI_FROM_DATABASE=Blossoms Digital Technology Co.,Ltd.
 
-OUI:7C051E*
- ID_OUI_FROM_DATABASE=RAFAEL LTD.
+OUI:001BE2*
+ ID_OUI_FROM_DATABASE=AhnLab,Inc.
 
-OUI:58570D*
- ID_OUI_FROM_DATABASE=Danfoss Solar Inverters
+OUI:001C7D*
+ ID_OUI_FROM_DATABASE=Excelpoint Manufacturing Pte Ltd
 
-OUI:0C826A*
- ID_OUI_FROM_DATABASE=Wuhan Huagong Genuine Optics Technology Co., Ltd
+OUI:001C73*
+ ID_OUI_FROM_DATABASE=Arista Networks, Inc.
 
-OUI:5C0E8B*
- ID_OUI_FROM_DATABASE=Zebra Technologies Inc
+OUI:001C78*
+ ID_OUI_FROM_DATABASE=WYPLAY SAS
 
-OUI:38C7BA*
- ID_OUI_FROM_DATABASE=CS Services Co.,Ltd.
+OUI:001C65*
+ ID_OUI_FROM_DATABASE=JoeScan, Inc.
 
-OUI:70D57E*
- ID_OUI_FROM_DATABASE=Scalar Corporation
+OUI:001C67*
+ ID_OUI_FROM_DATABASE=Pumpkin Networks, Inc.
 
-OUI:7866AE*
- ID_OUI_FROM_DATABASE=ZTEC Instruments, Inc.
+OUI:001C66*
+ ID_OUI_FROM_DATABASE=UCAMP CO.,LTD
 
-OUI:78818F*
- ID_OUI_FROM_DATABASE=Server Racks Australia Pty Ltd
+OUI:001C60*
+ ID_OUI_FROM_DATABASE=CSP Frontier Technologies,Inc.
 
-OUI:E0589E*
- ID_OUI_FROM_DATABASE=Laerdal Medical
+OUI:001C54*
+ ID_OUI_FROM_DATABASE=Hillstone Networks Inc
 
-OUI:44D63D*
- ID_OUI_FROM_DATABASE=Talari Networks
+OUI:001C59*
+ ID_OUI_FROM_DATABASE=DEVON IT
 
-OUI:58FD20*
- ID_OUI_FROM_DATABASE=Bravida Sakerhet AB
+OUI:001C4F*
+ ID_OUI_FROM_DATABASE=MACAB AB
 
-OUI:9835B8*
- ID_OUI_FROM_DATABASE=Assembled Products Corporation
+OUI:001C37*
+ ID_OUI_FROM_DATABASE=Callpod, Inc.
 
-OUI:240B2A*
- ID_OUI_FROM_DATABASE=Viettel Group
+OUI:001C3C*
+ ID_OUI_FROM_DATABASE=Seon Design Inc.
 
-OUI:68E41F*
- ID_OUI_FROM_DATABASE=Unglaube Identech GmbH
+OUI:001C30*
+ ID_OUI_FROM_DATABASE=Mode Lighting (UK ) Ltd.
 
-OUI:84F64C*
- ID_OUI_FROM_DATABASE=Cross Point BV
+OUI:001C2B*
+ ID_OUI_FROM_DATABASE=Alertme.com Limited
 
-OUI:90513F*
- ID_OUI_FROM_DATABASE=Elettronica Santerno SpA
+OUI:001C2A*
+ ID_OUI_FROM_DATABASE=Envisacor Technologies Inc.
 
-OUI:7CA29B*
- ID_OUI_FROM_DATABASE=D.SignT GmbH & Co. KG
+OUI:001C29*
+ ID_OUI_FROM_DATABASE=CORE DIGITAL ELECTRONICS CO., LTD
 
-OUI:34AAEE*
- ID_OUI_FROM_DATABASE=Mikrovisatos Servisas UAB
+OUI:001C24*
+ ID_OUI_FROM_DATABASE=Formosa Wireless Systems Corp.
 
-OUI:A40CC3*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001C1F*
+ ID_OUI_FROM_DATABASE=Quest Retail Technology Pty Ltd
 
-OUI:34E0D7*
- ID_OUI_FROM_DATABASE=DONGGUAN QISHENG ELECTRONICS INDUSTRIAL CO., LTD
+OUI:001D97*
+ ID_OUI_FROM_DATABASE=Alertus Technologies LLC
 
-OUI:40520D*
- ID_OUI_FROM_DATABASE=Pico Technology
+OUI:001D90*
+ ID_OUI_FROM_DATABASE=EMCO Flow Systems
 
-OUI:543131*
- ID_OUI_FROM_DATABASE=Raster Vision Ltd
+OUI:001D84*
+ ID_OUI_FROM_DATABASE=Gateway, Inc.
 
-OUI:90E0F0*
- ID_OUI_FROM_DATABASE=IEEE 1722a Working Group
+OUI:001D67*
+ ID_OUI_FROM_DATABASE=AMEC
 
-OUI:1C6F65*
- ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
+OUI:001A93*
+ ID_OUI_FROM_DATABASE=ERCO Leuchten GmbH
 
-OUI:F0AD4E*
- ID_OUI_FROM_DATABASE=Globalscale Technologies, Inc.
+OUI:001A98*
+ ID_OUI_FROM_DATABASE=Asotel Communication Limited Taiwan Branch
 
-OUI:903D5A*
- ID_OUI_FROM_DATABASE=Shenzhen Wision Technology Holding Limited
+OUI:001A8E*
+ ID_OUI_FROM_DATABASE=3Way Networks Ltd
 
-OUI:609AA4*
- ID_OUI_FROM_DATABASE=GVI SECURITY INC.
+OUI:001A7D*
+ ID_OUI_FROM_DATABASE=cyber-blue(HK)Ltd
 
-OUI:F0ED1E*
- ID_OUI_FROM_DATABASE=Bilkon Bilgisayar Kontrollu Cih. Im.Ltd.
+OUI:001A82*
+ ID_OUI_FROM_DATABASE=PROBA Building Automation Co.,LTD
 
-OUI:24A937*
- ID_OUI_FROM_DATABASE=PURE Storage
+OUI:001A7C*
+ ID_OUI_FROM_DATABASE=Hirschmann Multimedia B.V.
+
+OUI:001A78*
+ ID_OUI_FROM_DATABASE=ubtos
 
-OUI:348302*
- ID_OUI_FROM_DATABASE=iFORCOM Co., Ltd
+OUI:001A7B*
+ ID_OUI_FROM_DATABASE=Teleco, Inc.
 
-OUI:949C55*
- ID_OUI_FROM_DATABASE=Alta Data Technologies
+OUI:001A71*
+ ID_OUI_FROM_DATABASE=Diostech Co., Ltd.
 
-OUI:389F83*
- ID_OUI_FROM_DATABASE=OTN Systems N.V.
+OUI:001A6C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:8C541D*
- ID_OUI_FROM_DATABASE=LGE
+OUI:001A65*
+ ID_OUI_FROM_DATABASE=Seluxit
 
-OUI:601283*
- ID_OUI_FROM_DATABASE=Soluciones Tecnologicas para la Salud y el Bienestar SA
+OUI:001B7D*
+ ID_OUI_FROM_DATABASE=CXR Anderson Jacobson
 
-OUI:003A9D*
- ID_OUI_FROM_DATABASE=NEC Platforms, Ltd.
+OUI:001B71*
+ ID_OUI_FROM_DATABASE=Telular Corp.
 
-OUI:905446*
- ID_OUI_FROM_DATABASE=TES ELECTRONIC SOLUTIONS
+OUI:001B6A*
+ ID_OUI_FROM_DATABASE=Powerwave Technologies Sweden AB
 
-OUI:DC7B94*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001B65*
+ ID_OUI_FROM_DATABASE=China Gridcom Co., Ltd
 
-OUI:68234B*
- ID_OUI_FROM_DATABASE=Nihon Dengyo Kousaku
+OUI:001B5E*
+ ID_OUI_FROM_DATABASE=BPL Limited
 
-OUI:18422F*
- ID_OUI_FROM_DATABASE=Alcatel Lucent
+OUI:001B57*
+ ID_OUI_FROM_DATABASE=SEMINDIA SYSTEMS PRIVATE LIMITED
 
-OUI:A4BE61*
- ID_OUI_FROM_DATABASE=EutroVision System, Inc.
+OUI:001B46*
+ ID_OUI_FROM_DATABASE=Blueone Technology Co.,Ltd
 
-OUI:E06290*
- ID_OUI_FROM_DATABASE=Jinan Jovision Science & Technology Co., Ltd.
+OUI:001B4B*
+ ID_OUI_FROM_DATABASE=SANION Co., Ltd.
 
-OUI:A01859*
- ID_OUI_FROM_DATABASE=Shenzhen Yidashi Electronics Co Ltd
+OUI:001BAD*
+ ID_OUI_FROM_DATABASE=iControl Incorporated
 
-OUI:042234*
- ID_OUI_FROM_DATABASE=Wireless Standard Extensions
+OUI:001BA6*
+ ID_OUI_FROM_DATABASE=intotech inc.
 
-OUI:7812B8*
- ID_OUI_FROM_DATABASE=ORANTEK LIMITED
+OUI:001BA1*
+ ID_OUI_FROM_DATABASE=Åmic AB
 
-OUI:F0B6EB*
- ID_OUI_FROM_DATABASE=Poslab Technology Co., Ltd.
+OUI:001B93*
+ ID_OUI_FROM_DATABASE=JC Decaux SA DNT
 
-OUI:FCCCE4*
- ID_OUI_FROM_DATABASE=Ascon Ltd.
+OUI:001B95*
+ ID_OUI_FROM_DATABASE=VIDEO SYSTEMS SRL
 
-OUI:34862A*
- ID_OUI_FROM_DATABASE=Heinz Lackmann GmbH & Co KG
+OUI:001B9A*
+ ID_OUI_FROM_DATABASE=Apollo Fire Detectors Ltd
 
-OUI:842141*
- ID_OUI_FROM_DATABASE=Shenzhen Ginwave Technologies Ltd.
+OUI:001B94*
+ ID_OUI_FROM_DATABASE=T.E.M.A. S.p.A.
 
-OUI:B4ED54*
- ID_OUI_FROM_DATABASE=Wohler Technologies
+OUI:001B8E*
+ ID_OUI_FROM_DATABASE=Hulu Sweden AB
 
-OUI:544249*
- ID_OUI_FROM_DATABASE=Sony Corporation
+OUI:001B89*
+ ID_OUI_FROM_DATABASE=EMZA Visual Sense Ltd.
 
-OUI:24DBAD*
- ID_OUI_FROM_DATABASE=ShopperTrak RCT Corporation
+OUI:001B8A*
+ ID_OUI_FROM_DATABASE=2M Electronic A/S
 
-OUI:CC69B0*
- ID_OUI_FROM_DATABASE=Global Traffic Technologies, LLC
+OUI:001B84*
+ ID_OUI_FROM_DATABASE=Scan Engineering Telecom
 
-OUI:2872C5*
- ID_OUI_FROM_DATABASE=Smartmatic Corp
+OUI:001BD1*
+ ID_OUI_FROM_DATABASE=SOGESTMATIC
 
-OUI:B8A3E0*
- ID_OUI_FROM_DATABASE=BenRui Technology Co.,Ltd
+OUI:001BD6*
+ ID_OUI_FROM_DATABASE=Kelvin Hughes Ltd
 
-OUI:B8F732*
- ID_OUI_FROM_DATABASE=Aryaka Networks Inc
+OUI:001BCF*
+ ID_OUI_FROM_DATABASE=Dataupia Corporation
 
-OUI:70828E*
- ID_OUI_FROM_DATABASE=OleumTech Corporation
+OUI:001BD0*
+ ID_OUI_FROM_DATABASE=IDENTEC SOLUTIONS
 
-OUI:502A7E*
- ID_OUI_FROM_DATABASE=Smart electronic GmbH
+OUI:001BCA*
+ ID_OUI_FROM_DATABASE=Beijing Run Technology LTD. Company
 
-OUI:F0264C*
- ID_OUI_FROM_DATABASE=Dr. Sigrist AG
+OUI:001BC3*
+ ID_OUI_FROM_DATABASE=Mobisolution Co.,Ltd
 
-OUI:3C1CBE*
- ID_OUI_FROM_DATABASE=JADAK LLC
+OUI:001BBE*
+ ID_OUI_FROM_DATABASE=ICOP Digital
 
-OUI:A8995C*
- ID_OUI_FROM_DATABASE=aizo ag
+OUI:001BB4*
+ ID_OUI_FROM_DATABASE=Airvod Limited
 
-OUI:F445ED*
- ID_OUI_FROM_DATABASE=Portable Innovation Technology Ltd.
+OUI:001B14*
+ ID_OUI_FROM_DATABASE=Carex Lighting Equipment Factory
 
-OUI:6C32DE*
- ID_OUI_FROM_DATABASE=Indieon Technologies Pvt. Ltd.
+OUI:001B0D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:FCCF62*
- ID_OUI_FROM_DATABASE=IBM Corp
+OUI:001B06*
+ ID_OUI_FROM_DATABASE=Ateliers R. LAUMONIER
 
-OUI:B09074*
- ID_OUI_FROM_DATABASE=Fulan Electronics Limited
+OUI:001B08*
+ ID_OUI_FROM_DATABASE=Danfoss Drives A/S
 
-OUI:2CA835*
- ID_OUI_FROM_DATABASE=RIM
+OUI:001B01*
+ ID_OUI_FROM_DATABASE=Applied Radio Technologies
 
-OUI:94F692*
- ID_OUI_FROM_DATABASE=Geminico co.,Ltd.
+OUI:001AF5*
+ ID_OUI_FROM_DATABASE=PENTAONE. CO., LTD.
 
-OUI:8C736E*
- ID_OUI_FROM_DATABASE=FUJITSU LIMITED
+OUI:001AFA*
+ ID_OUI_FROM_DATABASE=Welch Allyn, Inc.
 
-OUI:30EFD1*
- ID_OUI_FROM_DATABASE=Alstom Strongwish (Shenzhen) Co., Ltd.
+OUI:001AE4*
+ ID_OUI_FROM_DATABASE=Medicis Technologies Corporation
 
-OUI:C835B8*
- ID_OUI_FROM_DATABASE=Ericsson, EAB/RWI/K
+OUI:001ADD*
+ ID_OUI_FROM_DATABASE=PePWave Ltd
 
-OUI:243C20*
- ID_OUI_FROM_DATABASE=Dynamode Group
+OUI:001AD1*
+ ID_OUI_FROM_DATABASE=FARGO CO., LTD.
 
-OUI:70D5E7*
- ID_OUI_FROM_DATABASE=Wellcore Corporation
+OUI:001AD8*
+ ID_OUI_FROM_DATABASE=AlsterAero GmbH
 
-OUI:3CF72A*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:001ACA*
+ ID_OUI_FROM_DATABASE=Tilera Corporation
 
-OUI:FCE192*
- ID_OUI_FROM_DATABASE=Sichuan Jinwangtong Electronic Science&Technology Co,.Ltd
+OUI:001ACC*
+ ID_OUI_FROM_DATABASE=Celestial Semiconductor, Ltd
 
-OUI:F8912A*
- ID_OUI_FROM_DATABASE=GLP German Light Products GmbH
+OUI:001AC5*
+ ID_OUI_FROM_DATABASE=BreakingPoint Systems, Inc.
 
-OUI:E02630*
- ID_OUI_FROM_DATABASE=Intrigue Technologies, Inc.
+OUI:001ABB*
+ ID_OUI_FROM_DATABASE=Fontal Technology Incorporation
 
-OUI:8C9236*
- ID_OUI_FROM_DATABASE=Aus.Linx Technology Co., Ltd.
+OUI:001AC0*
+ ID_OUI_FROM_DATABASE=JOYBIEN TECHNOLOGIES CO., LTD.
 
-OUI:4012E4*
- ID_OUI_FROM_DATABASE=Compass-EOS
+OUI:001A60*
+ ID_OUI_FROM_DATABASE=Wave Electronics Co.,Ltd.
 
-OUI:F8DC7A*
- ID_OUI_FROM_DATABASE=Variscite LTD
+OUI:001A55*
+ ID_OUI_FROM_DATABASE=ACA-Digital Corporation
 
-OUI:003A9C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001A5A*
+ ID_OUI_FROM_DATABASE=Korea Electric Power Data Network  (KDN) Co., Ltd
 
-OUI:E8E776*
- ID_OUI_FROM_DATABASE=Shenzhen Kootion Technology Co., Ltd
+OUI:001A4E*
+ ID_OUI_FROM_DATABASE=NTI AG / LinMot
 
-OUI:702F97*
- ID_OUI_FROM_DATABASE=Aava Mobile Oy
+OUI:001A53*
+ ID_OUI_FROM_DATABASE=Zylaya
 
-OUI:9018AE*
- ID_OUI_FROM_DATABASE=Shanghai Meridian Technologies, Co. Ltd.
+OUI:001A42*
+ ID_OUI_FROM_DATABASE=Techcity Technology co., Ltd.
 
-OUI:0494A1*
- ID_OUI_FROM_DATABASE=CATCH THE WIND INC
+OUI:001A47*
+ ID_OUI_FROM_DATABASE=Agami Systems, Inc.
 
-OUI:2C3427*
- ID_OUI_FROM_DATABASE=ERCO & GENER
+OUI:001A3B*
+ ID_OUI_FROM_DATABASE=Doah Elecom Inc.
 
-OUI:B42CBE*
- ID_OUI_FROM_DATABASE=Direct Payment Solutions Limited
+OUI:001B3F*
+ ID_OUI_FROM_DATABASE=ProCurve Networking by HP
 
-OUI:F47626*
- ID_OUI_FROM_DATABASE=Viltechmeda UAB
+OUI:001B3A*
+ ID_OUI_FROM_DATABASE=SIMS Corp.
 
-OUI:EC4476*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001B2C*
+ ID_OUI_FROM_DATABASE=ATRON electronic GmbH
 
-OUI:9CEBE8*
- ID_OUI_FROM_DATABASE=BizLink (Kunshan) Co.,Ltd
+OUI:001B27*
+ ID_OUI_FROM_DATABASE=Merlin CSI
 
-OUI:88ED1C*
- ID_OUI_FROM_DATABASE=Cudo Communication Co., Ltd.
+OUI:001B20*
+ ID_OUI_FROM_DATABASE=TPine Technology
 
-OUI:B05B1F*
- ID_OUI_FROM_DATABASE=THERMO FISHER SCIENTIFIC S.P.A.
+OUI:001B19*
+ ID_OUI_FROM_DATABASE=IEEE I&M Society TC9
 
-OUI:743256*
- ID_OUI_FROM_DATABASE=NT-ware Systemprg GmbH
+OUI:001AB4*
+ ID_OUI_FROM_DATABASE=FFEI Ltd.
 
-OUI:003AAF*
- ID_OUI_FROM_DATABASE=BlueBit Ltd.
+OUI:001AAF*
+ ID_OUI_FROM_DATABASE=BLUSENS TECHNOLOGY
 
-OUI:C0BAE6*
- ID_OUI_FROM_DATABASE=Application Solutions (Electronics and Vision) Ltd
+OUI:001AA8*
+ ID_OUI_FROM_DATABASE=Mamiya Digital Imaging Co., Ltd.
 
-OUI:20BFDB*
- ID_OUI_FROM_DATABASE=DVL
+OUI:001A9F*
+ ID_OUI_FROM_DATABASE=A-Link Ltd
 
-OUI:889821*
- ID_OUI_FROM_DATABASE=TERAON
+OUI:001AA6*
+ ID_OUI_FROM_DATABASE=Telefunken Radio Communication Systems GmbH &CO.KG
 
-OUI:CC5076*
- ID_OUI_FROM_DATABASE=Ocom Communications, Inc.
+OUI:00193F*
+ ID_OUI_FROM_DATABASE=RDI technology(Shenzhen) Co.,LTD
 
-OUI:705812*
- ID_OUI_FROM_DATABASE=Panasonic AVC Networks Company
+OUI:001933*
+ ID_OUI_FROM_DATABASE=Strix Systems, Inc.
 
-OUI:7C2CF3*
- ID_OUI_FROM_DATABASE=Secure Electrans Ltd
+OUI:001938*
+ ID_OUI_FROM_DATABASE=UMB Communications Co., Ltd.
 
-OUI:304174*
- ID_OUI_FROM_DATABASE=ALTEC LANSING LLC
+OUI:00192D*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:7830E1*
- ID_OUI_FROM_DATABASE=UltraClenz, LLC
+OUI:001926*
+ ID_OUI_FROM_DATABASE=BitsGen Co., Ltd.
 
-OUI:FCFBFB*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001928*
+ ID_OUI_FROM_DATABASE=Siemens AG, Transportation Systems
 
-OUI:1C129D*
- ID_OUI_FROM_DATABASE=IEEE PES PSRC/SUB
+OUI:00190E*
+ ID_OUI_FROM_DATABASE=Atech Technology Co., Ltd.
 
-OUI:B40832*
- ID_OUI_FROM_DATABASE=TC Communications
+OUI:001913*
+ ID_OUI_FROM_DATABASE=Chuang-Yi Network Equipment Co.Ltd.
 
-OUI:002720*
- ID_OUI_FROM_DATABASE=NEW-SOL COM
+OUI:001915*
+ ID_OUI_FROM_DATABASE=TECOM Co., Ltd.
 
-OUI:00271C*
- ID_OUI_FROM_DATABASE=MERCURY CORPORATION
+OUI:00191A*
+ ID_OUI_FROM_DATABASE=IRLINK
 
-OUI:002712*
- ID_OUI_FROM_DATABASE=MaxVision LLC
+OUI:001993*
+ ID_OUI_FROM_DATABASE=Changshu Switchgear MFG. Co.,Ltd. (Former Changshu Switchgea
 
-OUI:00270F*
- ID_OUI_FROM_DATABASE=Envisionnovation Inc
+OUI:001998*
+ ID_OUI_FROM_DATABASE=SATO CORPORATION
 
-OUI:0026D7*
- ID_OUI_FROM_DATABASE=KM Electornic Technology Co., Ltd.
+OUI:00198E*
+ ID_OUI_FROM_DATABASE=Oticon A/S
 
-OUI:0026D1*
- ID_OUI_FROM_DATABASE=S Squared Innovations Inc.
+OUI:001980*
+ ID_OUI_FROM_DATABASE=Gridpoint Systems
 
-OUI:0026CB*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00197B*
+ ID_OUI_FROM_DATABASE=Picotest Corp.
 
-OUI:0026C4*
- ID_OUI_FROM_DATABASE=Cadmos microsystems S.r.l.
+OUI:001968*
+ ID_OUI_FROM_DATABASE=Digital Video Networks(Shanghai) CO. LTD.
 
-OUI:0026BE*
- ID_OUI_FROM_DATABASE=Schoonderbeek Elektronica Systemen B.V.
+OUI:00196D*
+ ID_OUI_FROM_DATABASE=Raybit Systems Korea, Inc
 
-OUI:0026B2*
- ID_OUI_FROM_DATABASE=Setrix GmbH
+OUI:00196F*
+ ID_OUI_FROM_DATABASE=SensoPart GmbH
 
-OUI:0026AC*
- ID_OUI_FROM_DATABASE=Shanghai LUSTER Teraband photonic Co., Ltd.
+OUI:001952*
+ ID_OUI_FROM_DATABASE=ACOGITO Co., Ltd
 
-OUI:0026B1*
- ID_OUI_FROM_DATABASE=Navis Auto Motive Systems, Inc.
+OUI:001957*
+ ID_OUI_FROM_DATABASE=Saafnet Canada Inc.
 
-OUI:0026A8*
- ID_OUI_FROM_DATABASE=DAEHAP HYPER-TECH
+OUI:001946*
+ ID_OUI_FROM_DATABASE=Cianet Industria e Comercio S/A
 
-OUI:0026A7*
- ID_OUI_FROM_DATABASE=CONNECT SRL
+OUI:001944*
+ ID_OUI_FROM_DATABASE=Fossil Partners, L.P.
 
-OUI:0026A1*
- ID_OUI_FROM_DATABASE=Megger
+OUI:001A2F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0026A2*
- ID_OUI_FROM_DATABASE=Instrumentation Technology Systems
+OUI:001A36*
+ ID_OUI_FROM_DATABASE=Aipermon GmbH & Co. KG
 
-OUI:00269B*
- ID_OUI_FROM_DATABASE=SOKRAT Ltd.
+OUI:001A25*
+ ID_OUI_FROM_DATABASE=DELTA DORE
 
-OUI:002695*
- ID_OUI_FROM_DATABASE=ZT Group Int'l Inc
+OUI:001A17*
+ ID_OUI_FROM_DATABASE=Teak Technologies, Inc.
 
-OUI:00268F*
- ID_OUI_FROM_DATABASE=MTA SpA
+OUI:001A19*
+ ID_OUI_FROM_DATABASE=Computer Engineering Limited
 
-OUI:6C8CDB*
- ID_OUI_FROM_DATABASE=Otus Technologies Ltd
+OUI:001A12*
+ ID_OUI_FROM_DATABASE=Essilor
 
-OUI:B4417A*
- ID_OUI_FROM_DATABASE=ShenZhen Gongjin Electronics Co.,Ltd
+OUI:001A0B*
+ ID_OUI_FROM_DATABASE=BONA TECHNOLOGY INC.
 
-OUI:401597*
- ID_OUI_FROM_DATABASE=Protect America, Inc.
+OUI:001A06*
+ ID_OUI_FROM_DATABASE=OpVista, Inc.
 
-OUI:60391F*
- ID_OUI_FROM_DATABASE=ABB Ltd
+OUI:0018CD*
+ ID_OUI_FROM_DATABASE=Erae Electronics Industry Co., Ltd
 
-OUI:A07332*
- ID_OUI_FROM_DATABASE=Cashmaster International Limited
+OUI:0018D2*
+ ID_OUI_FROM_DATABASE=High-Gain Antennas LLC
 
-OUI:7C7BE4*
- ID_OUI_FROM_DATABASE=Z'SEDAI KENKYUSHO CORPORATION
+OUI:0018D9*
+ ID_OUI_FROM_DATABASE=Santosha Internatonal, Inc
 
-OUI:40EF4C*
- ID_OUI_FROM_DATABASE=Fihonest communication co.,Ltd
+OUI:0018C1*
+ ID_OUI_FROM_DATABASE=Almitec Informática e Comércio
 
-OUI:24CF21*
- ID_OUI_FROM_DATABASE=Shenzhen State Micro Technology Co., Ltd
+OUI:0018C8*
+ ID_OUI_FROM_DATABASE=ISONAS Inc.
 
-OUI:04B3B6*
- ID_OUI_FROM_DATABASE=Seamap (UK) Ltd
+OUI:0018BC*
+ ID_OUI_FROM_DATABASE=ZAO NVP Bolid
 
-OUI:10BAA5*
- ID_OUI_FROM_DATABASE=GANA I&C CO., LTD
+OUI:0018B5*
+ ID_OUI_FROM_DATABASE=Magna Carta
 
-OUI:586ED6*
- ID_OUI_FROM_DATABASE=Private
+OUI:0018AE*
+ ID_OUI_FROM_DATABASE=TVT CO.,LTD
 
-OUI:E09153*
- ID_OUI_FROM_DATABASE=XAVi Technologies Corp.
+OUI:001902*
+ ID_OUI_FROM_DATABASE=Cambridge Consultants Ltd
 
-OUI:CC0080*
- ID_OUI_FROM_DATABASE=BETTINI SRL
+OUI:001907*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:644BC3*
- ID_OUI_FROM_DATABASE=Shanghai WOASiS Telecommunications Ltd., Co.
+OUI:0018FD*
+ ID_OUI_FROM_DATABASE=Optimal Technologies International Inc.
 
-OUI:0CE709*
- ID_OUI_FROM_DATABASE=Fox Crypto B.V.
+OUI:0018F1*
+ ID_OUI_FROM_DATABASE=Chunichi Denshi Co.,LTD.
 
-OUI:002703*
- ID_OUI_FROM_DATABASE=Testech Electronics Pte Ltd
+OUI:0018EA*
+ ID_OUI_FROM_DATABASE=Alltec GmbH
 
-OUI:0026FD*
- ID_OUI_FROM_DATABASE=Interactive Intelligence
+OUI:0018EC*
+ ID_OUI_FROM_DATABASE=Welding Technology Corporation
 
-OUI:0026F6*
- ID_OUI_FROM_DATABASE=Military Communication Institute
+OUI:0018E5*
+ ID_OUI_FROM_DATABASE=Adhoco AG
 
-OUI:0026F0*
- ID_OUI_FROM_DATABASE=cTrixs International GmbH.
+OUI:0018A2*
+ ID_OUI_FROM_DATABASE=XIP Technology AB
 
-OUI:0026EA*
- ID_OUI_FROM_DATABASE=Cheerchip Electronic Technology (ShangHai) Co., Ltd.
+OUI:0018A9*
+ ID_OUI_FROM_DATABASE=Ethernet Direct Corporation
 
-OUI:0026E3*
- ID_OUI_FROM_DATABASE=DTI
+OUI:00189D*
+ ID_OUI_FROM_DATABASE=Navcast Inc.
 
-OUI:0026DD*
- ID_OUI_FROM_DATABASE=Fival Science & Technology Co.,Ltd.
+OUI:001893*
+ ID_OUI_FROM_DATABASE=SHENZHEN PHOTON BROADBAND TECHNOLOGY CO.,LTD
 
-OUI:0026DE*
- ID_OUI_FROM_DATABASE=FDI MATELEC
+OUI:001898*
+ ID_OUI_FROM_DATABASE=KINGSTATE ELECTRONICS CORPORATION
 
-OUI:54B620*
- ID_OUI_FROM_DATABASE=SUHDOL E&C Co.Ltd.
+OUI:001891*
+ ID_OUI_FROM_DATABASE=Zhongshan General K-mate Electronics Co., Ltd
 
-OUI:C4AAA1*
- ID_OUI_FROM_DATABASE=SUMMIT DEVELOPMENT, spol.s r.o.
+OUI:00188C*
+ ID_OUI_FROM_DATABASE=Mobile Action Technology Inc.
 
-OUI:78C40E*
- ID_OUI_FROM_DATABASE=H&D Wireless
+OUI:0019C8*
+ ID_OUI_FROM_DATABASE=AnyDATA Corporation
 
-OUI:9C5B96*
- ID_OUI_FROM_DATABASE=NMR Corporation
+OUI:0019C3*
+ ID_OUI_FROM_DATABASE=Qualitrol
 
-OUI:E4FFDD*
- ID_OUI_FROM_DATABASE=ELECTRON INDIA
+OUI:0019BE*
+ ID_OUI_FROM_DATABASE=Altai Technologies Limited
 
-OUI:F852DF*
- ID_OUI_FROM_DATABASE=VNL Europe AB
+OUI:0019BC*
+ ID_OUI_FROM_DATABASE=ELECTRO CHANCE SRL
 
-OUI:1CF061*
- ID_OUI_FROM_DATABASE=SCAPS GmbH
+OUI:0019A4*
+ ID_OUI_FROM_DATABASE=Austar Technology (hang zhou) Co.,Ltd
 
-OUI:A893E6*
- ID_OUI_FROM_DATABASE=JIANGXI JINGGANGSHAN CKING COMMUNICATION TECHNOLOGY CO.,LTD
+OUI:0019A9*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00267C*
- ID_OUI_FROM_DATABASE=Metz-Werke GmbH & Co KG
+OUI:0019AB*
+ ID_OUI_FROM_DATABASE=Raycom CO ., LTD
 
-OUI:002676*
- ID_OUI_FROM_DATABASE=COMMidt AS
+OUI:0019B0*
+ ID_OUI_FROM_DATABASE=HanYang System
 
-OUI:00266F*
- ID_OUI_FROM_DATABASE=Coordiwise Technology Corp.
+OUI:0019FA*
+ ID_OUI_FROM_DATABASE=Cable Vision Electronics CO., LTD.
 
-OUI:002670*
- ID_OUI_FROM_DATABASE=Cinch Connectors
+OUI:0019FF*
+ ID_OUI_FROM_DATABASE=Finnzymes
+
+OUI:0019EC*
+ ID_OUI_FROM_DATABASE=Sagamore Systems, Inc.
 
-OUI:002663*
- ID_OUI_FROM_DATABASE=Shenzhen Huitaiwei Tech. Ltd, co.
+OUI:0019F3*
+ ID_OUI_FROM_DATABASE=Cetis, Inc
 
-OUI:0025CD*
- ID_OUI_FROM_DATABASE=Skylane Optics
+OUI:0019F8*
+ ID_OUI_FROM_DATABASE=Embedded Systems Design, Inc.
 
-OUI:0025C8*
- ID_OUI_FROM_DATABASE=S-Access GmbH
+OUI:0019E5*
+ ID_OUI_FROM_DATABASE=Lynx Studio Technology, Inc.
 
-OUI:0025C7*
- ID_OUI_FROM_DATABASE=altek Corporation
+OUI:0019E7*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0025C1*
- ID_OUI_FROM_DATABASE=Nawoo Korea Corp.
+OUI:0019CD*
+ ID_OUI_FROM_DATABASE=Chengdu ethercom information technology Ltd.
 
-OUI:0025BA*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent IPD
+OUI:0019D4*
+ ID_OUI_FROM_DATABASE=ICX Technologies
 
-OUI:0025B5*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0019D9*
+ ID_OUI_FROM_DATABASE=Zeutschel GmbH
 
-OUI:0025AE*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:001823*
+ ID_OUI_FROM_DATABASE=Delta Electronics, Inc.
 
-OUI:0025A8*
- ID_OUI_FROM_DATABASE=Kontron (BeiJing) Technology Co.,Ltd
+OUI:001817*
+ ID_OUI_FROM_DATABASE=D. E. Shaw Research, LLC
 
-OUI:0025A7*
- ID_OUI_FROM_DATABASE=Comverge, Inc.
+OUI:00181E*
+ ID_OUI_FROM_DATABASE=GDX Technologies Ltd.
 
-OUI:00262B*
- ID_OUI_FROM_DATABASE=Wongs Electronics Co. Ltd.
+OUI:001812*
+ ID_OUI_FROM_DATABASE=Beijing Xinwei Telecom Technology Co., Ltd.
 
-OUI:002625*
- ID_OUI_FROM_DATABASE=MediaSputnik
+OUI:001806*
+ ID_OUI_FROM_DATABASE=Hokkei Industries Co., Ltd.
 
-OUI:00261E*
- ID_OUI_FROM_DATABASE=QINGBANG ELEC(SZ) CO., LTD
+OUI:00180B*
+ ID_OUI_FROM_DATABASE=Brilliant Telecommunications
 
-OUI:002619*
- ID_OUI_FROM_DATABASE=FRC
+OUI:001805*
+ ID_OUI_FROM_DATABASE=Beijing InHand Networking Technology Co.,Ltd.
 
-OUI:002612*
- ID_OUI_FROM_DATABASE=Space Exploration Technologies
+OUI:0017B8*
+ ID_OUI_FROM_DATABASE=NOVATRON CO., LTD.
 
-OUI:00260B*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0017BD*
+ ID_OUI_FROM_DATABASE=Tibetsystem
 
-OUI:00260C*
- ID_OUI_FROM_DATABASE=Dataram
+OUI:0017B1*
+ ID_OUI_FROM_DATABASE=ACIST Medical Systems, Inc.
 
-OUI:0025FF*
- ID_OUI_FROM_DATABASE=CreNova Multimedia Co., Ltd
+OUI:0017AA*
+ ID_OUI_FROM_DATABASE=elab-experience inc.
 
-OUI:002606*
- ID_OUI_FROM_DATABASE=RAUMFELD GmbH
+OUI:0017AC*
+ ID_OUI_FROM_DATABASE=O'Neil Product Development Inc.
 
-OUI:0025F9*
- ID_OUI_FROM_DATABASE=GMK electronic design GmbH
+OUI:0017A5*
+ ID_OUI_FROM_DATABASE=Ralink Technology Corp
 
-OUI:0025A2*
- ID_OUI_FROM_DATABASE=Alta Definicion LINCEO S.L.
+OUI:0017A0*
+ ID_OUI_FROM_DATABASE=RoboTech srl
 
-OUI:002596*
- ID_OUI_FROM_DATABASE=GIGAVISION srl
+OUI:00170F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00259B*
- ID_OUI_FROM_DATABASE=Beijing PKUNITY Microsystems Technology Co., Ltd
+OUI:001705*
+ ID_OUI_FROM_DATABASE=Methode Electronics
 
-OUI:002595*
- ID_OUI_FROM_DATABASE=Northwest Signal Supply, Inc
+OUI:00170A*
+ ID_OUI_FROM_DATABASE=INEW DIGITAL COMPANY
 
-OUI:00258F*
- ID_OUI_FROM_DATABASE=Trident Microsystems, Inc.
+OUI:0016F9*
+ ID_OUI_FROM_DATABASE=CETRTA POT, d.o.o., Kranj
 
-OUI:002585*
- ID_OUI_FROM_DATABASE=KOKUYO S&T Co., Ltd.
+OUI:0016F7*
+ ID_OUI_FROM_DATABASE=L-3 Communications, Aviation Recorders
 
-OUI:00257B*
- ID_OUI_FROM_DATABASE=STJ  ELECTRONICS  PVT  LTD
+OUI:0016E6*
+ ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
 
-OUI:002574*
- ID_OUI_FROM_DATABASE=KUNIMI MEDIA DEVICE Co., Ltd.
+OUI:00178F*
+ ID_OUI_FROM_DATABASE=NINGBO YIDONG ELECTRONIC CO.,LTD.
 
-OUI:00264F*
- ID_OUI_FROM_DATABASE=Krüger &Gothe GmbH
+OUI:001794*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:002648*
- ID_OUI_FROM_DATABASE=Emitech Corp.
+OUI:00178D*
+ ID_OUI_FROM_DATABASE=Checkpoint Systems, Inc.
 
-OUI:002644*
- ID_OUI_FROM_DATABASE=Thomson Telecom Belgium
+OUI:00177C*
+ ID_OUI_FROM_DATABASE=Smartlink Network Systems Limited
 
-OUI:00263E*
- ID_OUI_FROM_DATABASE=Trapeze Networks
+OUI:001781*
+ ID_OUI_FROM_DATABASE=Greystone Data System, Inc.
 
-OUI:002638*
- ID_OUI_FROM_DATABASE=Xia Men Joyatech Co., Ltd.
+OUI:001788*
+ ID_OUI_FROM_DATABASE=Philips Lighting BV
 
-OUI:00263D*
- ID_OUI_FROM_DATABASE=MIA Corporation
+OUI:00176C*
+ ID_OUI_FROM_DATABASE=Pivot3, Inc.
 
-OUI:002631*
- ID_OUI_FROM_DATABASE=COMMTACT LTD
+OUI:001770*
+ ID_OUI_FROM_DATABASE=Arti Industrial Electronics Ltd.
 
-OUI:00256F*
- ID_OUI_FROM_DATABASE=Dantherm Power
+OUI:001775*
+ ID_OUI_FROM_DATABASE=TTE Germany GmbH
 
-OUI:002562*
- ID_OUI_FROM_DATABASE=interbro Co. Ltd.
+OUI:001760*
+ ID_OUI_FROM_DATABASE=Naito Densei Machida MFG.CO.,LTD
 
-OUI:00255C*
- ID_OUI_FROM_DATABASE=NEC Corporation
+OUI:001767*
+ ID_OUI_FROM_DATABASE=Earforce AS
 
-OUI:00254F*
- ID_OUI_FROM_DATABASE=ELETTROLAB Srl
+OUI:00185A*
+ ID_OUI_FROM_DATABASE=uControl, Inc.
 
-OUI:002518*
- ID_OUI_FROM_DATABASE=Power PLUS Communications AG
+OUI:00185F*
+ ID_OUI_FROM_DATABASE=TAC Inc.
 
-OUI:002513*
- ID_OUI_FROM_DATABASE=CXP DIGITAL BV
+OUI:001861*
+ ID_OUI_FROM_DATABASE=Ooma, Inc.
 
-OUI:00250C*
- ID_OUI_FROM_DATABASE=Enertrac
+OUI:001866*
+ ID_OUI_FROM_DATABASE=Leutron Vision
 
-OUI:002505*
- ID_OUI_FROM_DATABASE=eks Engel GmbH & Co. KG
+OUI:001853*
+ ID_OUI_FROM_DATABASE=Atera Networks LTD.
 
-OUI:0024F9*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00184E*
+ ID_OUI_FROM_DATABASE=Lianhe Technologies, Inc.
 
-OUI:0024F2*
- ID_OUI_FROM_DATABASE=Uniphone Telecommunication Co., Ltd.
+OUI:001847*
+ ID_OUI_FROM_DATABASE=AceNet Technology Inc.
 
-OUI:0024ED*
- ID_OUI_FROM_DATABASE=YT Elec. Co,.Ltd.
+OUI:00183B*
+ ID_OUI_FROM_DATABASE=CENITS Co., Ltd.
 
-OUI:0024E6*
- ID_OUI_FROM_DATABASE=In Motion Technology Inc.
+OUI:001840*
+ ID_OUI_FROM_DATABASE=3 Phoenix, Inc.
 
-OUI:0024E1*
- ID_OUI_FROM_DATABASE=Convey Computer Corp.
+OUI:001842*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:0024DF*
- ID_OUI_FROM_DATABASE=Digitalbox Europe GmbH
+OUI:001825*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:0024DA*
- ID_OUI_FROM_DATABASE=Innovar Systems Limited
+OUI:00182A*
+ ID_OUI_FROM_DATABASE=Taiwan Video & Monitor
 
-OUI:002549*
- ID_OUI_FROM_DATABASE=Jeorich Tech. Co.,Ltd.
+OUI:001836*
+ ID_OUI_FROM_DATABASE=Reliance Electric Limited
 
-OUI:002538*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co., Ltd., Memory Division
+OUI:001759*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:002542*
- ID_OUI_FROM_DATABASE=Pittasoft
+OUI:001754*
+ ID_OUI_FROM_DATABASE=Arkino HiTOP Corporation Limited
 
-OUI:002530*
- ID_OUI_FROM_DATABASE=Aetas Systems Inc.
+OUI:001746*
+ ID_OUI_FROM_DATABASE=Freedom9 Inc.
 
-OUI:002529*
- ID_OUI_FROM_DATABASE=COMELIT GROUP S.P.A
+OUI:001748*
+ ID_OUI_FROM_DATABASE=Neokoros Brasil Ltda
 
-OUI:002522*
- ID_OUI_FROM_DATABASE=ASRock Incorporation
+OUI:00174D*
+ ID_OUI_FROM_DATABASE=DYNAMIC NETWORK FACTORY, INC.
 
-OUI:00251D*
- ID_OUI_FROM_DATABASE=DSA Encore, LLC
+OUI:001741*
+ ID_OUI_FROM_DATABASE=DEFIDEV
 
-OUI:0025F5*
- ID_OUI_FROM_DATABASE=DVS Korea, Co., Ltd
+OUI:001733*
+ ID_OUI_FROM_DATABASE=SFR
 
-OUI:0025F0*
- ID_OUI_FROM_DATABASE=Suga Electronics Limited
+OUI:00172E*
+ ID_OUI_FROM_DATABASE=FXC Inc.
 
-OUI:0025EA*
- ID_OUI_FROM_DATABASE=Iphion BV
+OUI:001727*
+ ID_OUI_FROM_DATABASE=Thermo Ramsey Italia s.r.l.
 
-OUI:0025E4*
- ID_OUI_FROM_DATABASE=OMNI-WiFi, LLC
+OUI:001722*
+ ID_OUI_FROM_DATABASE=Hanazeder Electronic GmbH
 
-OUI:0025E0*
- ID_OUI_FROM_DATABASE=CeedTec Sdn Bhd
+OUI:00171B*
+ ID_OUI_FROM_DATABASE=Innovation Lab Corp.
 
-OUI:0025DA*
- ID_OUI_FROM_DATABASE=Secura Key
+OUI:001714*
+ ID_OUI_FROM_DATABASE=BR Controls Nederland bv
 
-OUI:0025D9*
- ID_OUI_FROM_DATABASE=DataFab Systems Inc.
+OUI:001716*
+ ID_OUI_FROM_DATABASE=Qno Technology Inc.
 
-OUI:002410*
- ID_OUI_FROM_DATABASE=NUETEQ Technology,Inc.
+OUI:0017F4*
+ ID_OUI_FROM_DATABASE=ZERON ALLIANCE
 
-OUI:002409*
- ID_OUI_FROM_DATABASE=The Toro Company
+OUI:0017F9*
+ ID_OUI_FROM_DATABASE=Forcom Sp. z o.o.
 
-OUI:0023F7*
- ID_OUI_FROM_DATABASE=Private
+OUI:001800*
+ ID_OUI_FROM_DATABASE=UNIGRAND LTD
 
-OUI:0023FD*
- ID_OUI_FROM_DATABASE=AFT Atlas Fahrzeugtechnik GmbH
+OUI:0017ED*
+ ID_OUI_FROM_DATABASE=WooJooIT Ltd.
 
-OUI:0023F6*
- ID_OUI_FROM_DATABASE=Softwell Technology Co., Ltd.
+OUI:0017DA*
+ ID_OUI_FROM_DATABASE=Spans Logic
 
-OUI:0023EC*
- ID_OUI_FROM_DATABASE=Algorithmix GmbH
+OUI:0017E1*
+ ID_OUI_FROM_DATABASE=DACOS Technologies Co., Ltd.
 
-OUI:0023E7*
- ID_OUI_FROM_DATABASE=Hinke A/S
+OUI:0017D0*
+ ID_OUI_FROM_DATABASE=Opticom Communications, LLC
 
-OUI:002387*
- ID_OUI_FROM_DATABASE=ThinkFlood, Inc.
+OUI:0017C4*
+ ID_OUI_FROM_DATABASE=Quanta Microsystems, INC.
 
-OUI:002381*
- ID_OUI_FROM_DATABASE=Lengda Technology(Xiamen) Co.,Ltd.
+OUI:001880*
+ ID_OUI_FROM_DATABASE=Maxim Integrated Products
 
-OUI:00237B*
- ID_OUI_FROM_DATABASE=WHDI LLC
+OUI:00186D*
+ ID_OUI_FROM_DATABASE=Zhenjiang Sapphire Electronic Industry CO.
 
-OUI:002372*
- ID_OUI_FROM_DATABASE=MORE STAR INDUSTRIAL GROUP LIMITED
+OUI:001872*
+ ID_OUI_FROM_DATABASE=Expertise Engineering
 
-OUI:0024CE*
- ID_OUI_FROM_DATABASE=Exeltech Inc
+OUI:001874*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0024D3*
- ID_OUI_FROM_DATABASE=QUALICA Inc.
+OUI:001879*
+ ID_OUI_FROM_DATABASE=dSys
 
-OUI:0024C7*
- ID_OUI_FROM_DATABASE=Mobilarm Ltd
+OUI:001686*
+ ID_OUI_FROM_DATABASE=Karl Storz Imaging
 
-OUI:0024C2*
- ID_OUI_FROM_DATABASE=Asumo Co.,Ltd.
+OUI:00167F*
+ ID_OUI_FROM_DATABASE=Bluebird Soft Inc.
 
-OUI:0024BC*
- ID_OUI_FROM_DATABASE=HuRob Co.,Ltd
+OUI:001681*
+ ID_OUI_FROM_DATABASE=Vector Informatik GmbH
 
-OUI:0024B7*
- ID_OUI_FROM_DATABASE=GridPoint, Inc.
+OUI:001674*
+ ID_OUI_FROM_DATABASE=EuroCB (Phils.), Inc.
 
-OUI:0024AB*
- ID_OUI_FROM_DATABASE=A7 Engineering, Inc.
+OUI:001672*
+ ID_OUI_FROM_DATABASE=Zenway enterprise ltd
 
-OUI:0024A6*
- ID_OUI_FROM_DATABASE=TELESTAR DIGITAL GmbH
+OUI:001666*
+ ID_OUI_FROM_DATABASE=Quantier Communication Inc.
 
-OUI:00249A*
- ID_OUI_FROM_DATABASE=Beijing Zhongchuang Telecommunication Test Co., Ltd.
+OUI:00165F*
+ ID_OUI_FROM_DATABASE=Fairmount Automation
 
-OUI:00249F*
- ID_OUI_FROM_DATABASE=RIM Testing Services
+OUI:0016AA*
+ ID_OUI_FROM_DATABASE=Kei Communication Technology Inc.
 
-OUI:002487*
- ID_OUI_FROM_DATABASE=Blackboard Inc.
+OUI:0016AF*
+ ID_OUI_FROM_DATABASE=Shenzhen Union Networks Equipment Co.,Ltd.
 
-OUI:002498*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0016A5*
+ ID_OUI_FROM_DATABASE=Tandberg Storage ASA
 
-OUI:002485*
- ID_OUI_FROM_DATABASE=ConteXtream Ltd
+OUI:001699*
+ ID_OUI_FROM_DATABASE=Tonic DVB Marketing Ltd
 
-OUI:002480*
- ID_OUI_FROM_DATABASE=Meteocontrol GmbH
+OUI:0016A0*
+ ID_OUI_FROM_DATABASE=Auto-Maskin
 
-OUI:002448*
- ID_OUI_FROM_DATABASE=SpiderCloud Wireless, Inc
+OUI:001692*
+ ID_OUI_FROM_DATABASE=Scientific-Atlanta, Inc.
 
-OUI:00244A*
- ID_OUI_FROM_DATABASE=Voyant International
+OUI:001694*
+ ID_OUI_FROM_DATABASE=Sennheiser Communications A/S
 
-OUI:002449*
- ID_OUI_FROM_DATABASE=Shen Zhen Lite Star Electronics Technology Co., Ltd
+OUI:00168D*
+ ID_OUI_FROM_DATABASE=KORWIN CO., Ltd.
 
-OUI:002443*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:00165A*
+ ID_OUI_FROM_DATABASE=Harman Specialty Group
 
-OUI:002439*
- ID_OUI_FROM_DATABASE=Digital Barriers Advanced Technologies
+OUI:001653*
+ ID_OUI_FROM_DATABASE=LEGO System A/S IE Electronics Division
 
-OUI:002479*
- ID_OUI_FROM_DATABASE=Optec Displays, Inc.
+OUI:00164C*
+ ID_OUI_FROM_DATABASE=PLANET INT Co., Ltd
 
-OUI:00246D*
- ID_OUI_FROM_DATABASE=Weinzierl Engineering GmbH
+OUI:001647*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:002474*
- ID_OUI_FROM_DATABASE=Autronica Fire And Securirty
+OUI:001642*
+ ID_OUI_FROM_DATABASE=Pangolin
 
-OUI:002468*
- ID_OUI_FROM_DATABASE=Sumavision Technologies Co.,Ltd
+OUI:00163D*
+ ID_OUI_FROM_DATABASE=Tsinghua Tongfang Legend Silicon Tech. Co., Ltd.
 
-OUI:002466*
- ID_OUI_FROM_DATABASE=Unitron nv
+OUI:001631*
+ ID_OUI_FROM_DATABASE=Xteam
 
-OUI:002461*
- ID_OUI_FROM_DATABASE=Shin Wang Tech.
+OUI:00162F*
+ ID_OUI_FROM_DATABASE=Geutebrück GmbH
 
-OUI:00245C*
- ID_OUI_FROM_DATABASE=Design-Com Technologies Pty. Ltd.
+OUI:001630*
+ ID_OUI_FROM_DATABASE=Vativ Technologies
 
-OUI:00244F*
- ID_OUI_FROM_DATABASE=Asantron Technologies Ltd.
+OUI:0015F5*
+ ID_OUI_FROM_DATABASE=Sustainable Energy Systems
 
-OUI:0023BB*
- ID_OUI_FROM_DATABASE=Schmitt Industries
+OUI:0015F4*
+ ID_OUI_FROM_DATABASE=Eventide
 
-OUI:0023BA*
- ID_OUI_FROM_DATABASE=Chroma
+OUI:0015EE*
+ ID_OUI_FROM_DATABASE=Omnex Control Systems
 
-OUI:0023B5*
- ID_OUI_FROM_DATABASE=ORTANA LTD
+OUI:0015F3*
+ ID_OUI_FROM_DATABASE=PELTOR AB
 
-OUI:0023A8*
- ID_OUI_FROM_DATABASE=Marshall Electronics
+OUI:0015E7*
+ ID_OUI_FROM_DATABASE=Quantec Tontechnik
 
-OUI:00239B*
- ID_OUI_FROM_DATABASE=Elster Solutions, LLC
+OUI:0015E2*
+ ID_OUI_FROM_DATABASE=Dr.Ing. Herbert Knauer GmbH
 
-OUI:002396*
- ID_OUI_FROM_DATABASE=ANDES TECHNOLOGY CORPORATION
+OUI:0015DD*
+ ID_OUI_FROM_DATABASE=IP Control Systems Ltd.
 
-OUI:002391*
- ID_OUI_FROM_DATABASE=Maxian
+OUI:0015D8*
+ ID_OUI_FROM_DATABASE=Interlink Electronics
 
-OUI:00238C*
- ID_OUI_FROM_DATABASE=Private
+OUI:0015CA*
+ ID_OUI_FROM_DATABASE=TeraRecon, Inc.
 
-OUI:002432*
- ID_OUI_FROM_DATABASE=Neostar Technology Co.,LTD
+OUI:001598*
+ ID_OUI_FROM_DATABASE=Kolektor group
 
-OUI:002429*
- ID_OUI_FROM_DATABASE=MK MASTER INC.
+OUI:001593*
+ ID_OUI_FROM_DATABASE=U4EA Technologies Inc.
 
-OUI:00241C*
- ID_OUI_FROM_DATABASE=FuGang Electronic (DG) Co.,Ltd
+OUI:00158C*
+ ID_OUI_FROM_DATABASE=Liab ApS
 
-OUI:002428*
- ID_OUI_FROM_DATABASE=EnergyICT
+OUI:001586*
+ ID_OUI_FROM_DATABASE=Xiamen Overseas Chinese Electronic Co., Ltd.
 
-OUI:002416*
- ID_OUI_FROM_DATABASE=Any Use
+OUI:001585*
+ ID_OUI_FROM_DATABASE=Aonvision Technolopy Corp.
 
-OUI:0023E0*
- ID_OUI_FROM_DATABASE=INO Therapeutics LLC
+OUI:001587*
+ ID_OUI_FROM_DATABASE=Takenaka Seisakusho Co.,Ltd
 
-OUI:0023DA*
- ID_OUI_FROM_DATABASE=Industrial Computer Source (Deutschland)GmbH
+OUI:001580*
+ ID_OUI_FROM_DATABASE=U-WAY CORPORATION
 
-OUI:0023C8*
- ID_OUI_FROM_DATABASE=TEAM-R
+OUI:00157B*
+ ID_OUI_FROM_DATABASE=Leuze electronic GmbH + Co. KG
 
-OUI:0023C7*
- ID_OUI_FROM_DATABASE=AVSystem
+OUI:001576*
+ ID_OUI_FROM_DATABASE=LABiTec - Labor Biomedical Technologies GmbH
 
-OUI:0023C1*
- ID_OUI_FROM_DATABASE=Securitas Direct AB
+OUI:00156A*
+ ID_OUI_FROM_DATABASE=DG2L Technologies Pvt. Ltd.
 
-OUI:0021DC*
- ID_OUI_FROM_DATABASE=TECNOALARM S.r.l.
+OUI:00156F*
+ ID_OUI_FROM_DATABASE=Xiranet Communications GmbH
 
-OUI:0021D6*
- ID_OUI_FROM_DATABASE=LXI Consortium
+OUI:0016DF*
+ ID_OUI_FROM_DATABASE=Lundinova AB
 
-OUI:0021CF*
- ID_OUI_FROM_DATABASE=The Crypto Group
+OUI:0016DA*
+ ID_OUI_FROM_DATABASE=Futronic Technology Co. Ltd.
 
-OUI:0021C9*
- ID_OUI_FROM_DATABASE=Wavecom Asia Pacific Limited
+OUI:0016D5*
+ ID_OUI_FROM_DATABASE=Synccom Co., Ltd
 
-OUI:0021CA*
- ID_OUI_FROM_DATABASE=ART System Co., Ltd.
+OUI:0016C9*
+ ID_OUI_FROM_DATABASE=NAT Seattle, Inc.
 
-OUI:0021C3*
- ID_OUI_FROM_DATABASE=CORNELL Communications, Inc.
+OUI:0016D0*
+ ID_OUI_FROM_DATABASE=ATech elektronika d.o.o.
 
-OUI:002334*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0016BD*
+ ID_OUI_FROM_DATABASE=ATI Industrial Automation
 
-OUI:00232E*
- ID_OUI_FROM_DATABASE=Kedah Electronics Engineering, LLC
+OUI:0016C2*
+ ID_OUI_FROM_DATABASE=Avtec Systems Inc
 
-OUI:002329*
- ID_OUI_FROM_DATABASE=DDRdrive LLC
+OUI:0016BB*
+ ID_OUI_FROM_DATABASE=Law-Chain Computer Technology Co Ltd
 
-OUI:002322*
- ID_OUI_FROM_DATABASE=KISS Teknical Solutions, Inc.
+OUI:00162A*
+ ID_OUI_FROM_DATABASE=Antik computers & communications s.r.o.
 
-OUI:002325*
- ID_OUI_FROM_DATABASE=IOLAN Holding
+OUI:001623*
+ ID_OUI_FROM_DATABASE=Interval Media
 
-OUI:002319*
- ID_OUI_FROM_DATABASE=Sielox LLC
+OUI:001617*
+ ID_OUI_FROM_DATABASE=MSI
 
-OUI:002270*
- ID_OUI_FROM_DATABASE=ABK North America, LLC
+OUI:00161E*
+ ID_OUI_FROM_DATABASE=Woojinnet
 
-OUI:002317*
- ID_OUI_FROM_DATABASE=Lasercraft Inc
+OUI:00160D*
+ ID_OUI_FROM_DATABASE=Be Here Corporation
 
-OUI:002310*
- ID_OUI_FROM_DATABASE=LNC Technology Co., Ltd.
+OUI:001606*
+ ID_OUI_FROM_DATABASE=Ideal Industries
 
-OUI:002273*
- ID_OUI_FROM_DATABASE=Techway
+OUI:0015FA*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:002274*
- ID_OUI_FROM_DATABASE=FamilyPhone AB
+OUI:001563*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00226F*
- ID_OUI_FROM_DATABASE=3onedata Technology Co. Ltd.
+OUI:001557*
+ ID_OUI_FROM_DATABASE=Olivetti
 
-OUI:00226A*
- ID_OUI_FROM_DATABASE=Honeywell
+OUI:00155C*
+ ID_OUI_FROM_DATABASE=Dresser Wayne
 
-OUI:002260*
- ID_OUI_FROM_DATABASE=AFREEY Inc.
+OUI:00154B*
+ ID_OUI_FROM_DATABASE=Wonde Proud Technology Co., Ltd
 
-OUI:00225B*
- ID_OUI_FROM_DATABASE=Teradici Corporation
+OUI:001550*
+ ID_OUI_FROM_DATABASE=Nits Technology Inc
 
-OUI:002256*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001545*
+ ID_OUI_FROM_DATABASE=SEECODE Co., Ltd.
 
-OUI:002255*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00153E*
+ ID_OUI_FROM_DATABASE=Q-Matic Sweden AB
 
-OUI:00224D*
- ID_OUI_FROM_DATABASE=MITAC INTERNATIONAL CORP.
+OUI:0015BC*
+ ID_OUI_FROM_DATABASE=Develco
 
-OUI:002252*
- ID_OUI_FROM_DATABASE=ZOLL Lifecor Corporation
+OUI:0015B5*
+ ID_OUI_FROM_DATABASE=CI Network Corp.
 
-OUI:002246*
- ID_OUI_FROM_DATABASE=Evoc Intelligent Technology Co.,Ltd.
+OUI:0015B0*
+ ID_OUI_FROM_DATABASE=AUTOTELENET CO.,LTD
 
-OUI:002366*
- ID_OUI_FROM_DATABASE=Beijing Siasun Electronic System Co.,Ltd.
+OUI:0015AB*
+ ID_OUI_FROM_DATABASE=PRO CO SOUND INC
 
-OUI:00236B*
- ID_OUI_FROM_DATABASE=Xembedded, Inc.
+OUI:0015A6*
+ ID_OUI_FROM_DATABASE=Digital Electronics Products Ltd.
 
-OUI:002359*
- ID_OUI_FROM_DATABASE=Benchmark Electronics ( Thailand ) Public Company Limited
+OUI:00159F*
+ ID_OUI_FROM_DATABASE=Terascala, Inc.
 
-OUI:00235F*
- ID_OUI_FROM_DATABASE=Silicon Micro Sensors GmbH
+OUI:001532*
+ ID_OUI_FROM_DATABASE=Consumer Technologies Group, LLC
 
-OUI:002353*
- ID_OUI_FROM_DATABASE=F E T Elettronica snc
+OUI:001539*
+ ID_OUI_FROM_DATABASE=Technodrive srl
 
-OUI:00234C*
- ID_OUI_FROM_DATABASE=KTC AB
+OUI:00152B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:002304*
+OUI:00152D*
+ ID_OUI_FROM_DATABASE=TenX Networks, LLC
+
+OUI:00152C*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0022F3*
- ID_OUI_FROM_DATABASE=SHARP Corporation
+OUI:00151F*
+ ID_OUI_FROM_DATABASE=Multivision Intelligent Surveillance (Hong Kong) Ltd
 
-OUI:0022EE*
- ID_OUI_FROM_DATABASE=Algo Communication Products Ltd
+OUI:00151A*
+ ID_OUI_FROM_DATABASE=Hunter Engineering Company
 
-OUI:0022E7*
- ID_OUI_FROM_DATABASE=WPS Parking Systems
+OUI:001515*
+ ID_OUI_FROM_DATABASE=Leipold+Co.GmbH
 
-OUI:0022E1*
- ID_OUI_FROM_DATABASE=ZORT Labs, LLC.
+OUI:001510*
+ ID_OUI_FROM_DATABASE=Techsphere Co., Ltd
 
-OUI:0022E2*
- ID_OUI_FROM_DATABASE=WABTEC Transit Division
+OUI:001453*
+ ID_OUI_FROM_DATABASE=ADVANTECH TECHNOLOGIES CO.,LTD
 
-OUI:0022DB*
- ID_OUI_FROM_DATABASE=Translogic Corporation
+OUI:00144E*
+ ID_OUI_FROM_DATABASE=SRISA
 
-OUI:0022A1*
- ID_OUI_FROM_DATABASE=Huawei Symantec Technologies Co.,Ltd.
+OUI:001442*
+ ID_OUI_FROM_DATABASE=ATTO CORPORATION
 
-OUI:00229B*
- ID_OUI_FROM_DATABASE=AverLogic Technologies, Inc.
+OUI:001449*
+ ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
 
-OUI:00229C*
- ID_OUI_FROM_DATABASE=Verismo Networks Inc
+OUI:00143D*
+ ID_OUI_FROM_DATABASE=Aevoe Inc.
 
-OUI:002295*
- ID_OUI_FROM_DATABASE=SGM Technology for lighting spa
+OUI:00143C*
+ ID_OUI_FROM_DATABASE=Rheinmetall Canada Inc.
 
-OUI:00228E*
- ID_OUI_FROM_DATABASE=TV-NUMERIC
+OUI:00143B*
+ ID_OUI_FROM_DATABASE=Sensovation AG
 
-OUI:002289*
- ID_OUI_FROM_DATABASE=Optosecurity Inc.
+OUI:001436*
+ ID_OUI_FROM_DATABASE=Qwerty Elektronik AB
 
-OUI:002282*
- ID_OUI_FROM_DATABASE=8086 Consultancy
+OUI:0014AB*
+ ID_OUI_FROM_DATABASE=Senhai Electronic Technology Co., Ltd.
 
-OUI:00227C*
- ID_OUI_FROM_DATABASE=Woori SMT Co.,ltd
+OUI:0014B0*
+ ID_OUI_FROM_DATABASE=Naeil Community
 
-OUI:002279*
- ID_OUI_FROM_DATABASE=Nippon Conlux Co., Ltd.
+OUI:0014A9*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00223C*
- ID_OUI_FROM_DATABASE=RATIO Entwicklungen GmbH
+OUI:0014AA*
+ ID_OUI_FROM_DATABASE=Ashly Audio, Inc.
 
-OUI:002236*
- ID_OUI_FROM_DATABASE=VECTOR SP. Z O.O.
+OUI:00149D*
+ ID_OUI_FROM_DATABASE=Sound ID Inc.
 
-OUI:002230*
- ID_OUI_FROM_DATABASE=FutureLogic Inc.
+OUI:001498*
+ ID_OUI_FROM_DATABASE=Viking Design Technology
 
-OUI:002229*
- ID_OUI_FROM_DATABASE=Compumedics Ltd
+OUI:00148A*
+ ID_OUI_FROM_DATABASE=Elin Ebg Traction Gmbh
 
-OUI:00221D*
- ID_OUI_FROM_DATABASE=Freegene Technology LTD
+OUI:001491*
+ ID_OUI_FROM_DATABASE=Daniels Electronics Ltd. dbo Codan Rado Communications
 
-OUI:002224*
- ID_OUI_FROM_DATABASE=Good Will Instrument Co., Ltd.
+OUI:001485*
+ ID_OUI_FROM_DATABASE=Giga-Byte
 
-OUI:002223*
- ID_OUI_FROM_DATABASE=TimeKeeping Systems, Inc.
+OUI:00147E*
+ ID_OUI_FROM_DATABASE=InnerWireless
 
-OUI:002216*
- ID_OUI_FROM_DATABASE=SHIBAURA VENDING MACHINE CORPORATION
+OUI:001477*
+ ID_OUI_FROM_DATABASE=Nertec  Inc.
 
-OUI:002217*
- ID_OUI_FROM_DATABASE=Neat Electronics
+OUI:001472*
+ ID_OUI_FROM_DATABASE=China Broadband Wireless IP Standard Group
 
-OUI:002211*
- ID_OUI_FROM_DATABASE=Rohati Systems
+OUI:001466*
+ ID_OUI_FROM_DATABASE=Kleinhenz Elektronik GmbH
 
-OUI:00220A*
- ID_OUI_FROM_DATABASE=OnLive, Inc
+OUI:00146B*
+ ID_OUI_FROM_DATABASE=Anagran, Inc.
 
-OUI:002204*
- ID_OUI_FROM_DATABASE=KORATEK
+OUI:00145F*
+ ID_OUI_FROM_DATABASE=ADITEC CO. LTD
 
-OUI:0021FF*
- ID_OUI_FROM_DATABASE=Cyfrowy Polsat SA
+OUI:001458*
+ ID_OUI_FROM_DATABASE=HS Automatic ApS
 
-OUI:0021F5*
- ID_OUI_FROM_DATABASE=Western Engravers Supply, Inc.
+OUI:0014E6*
+ ID_OUI_FROM_DATABASE=AIM Infrarotmodule GmbH
 
-OUI:0021EF*
- ID_OUI_FROM_DATABASE=Kapsys
+OUI:0014E0*
+ ID_OUI_FROM_DATABASE=LET'S Corporation
 
-OUI:0021EE*
- ID_OUI_FROM_DATABASE=Full Spectrum Inc.
+OUI:0014D4*
+ ID_OUI_FROM_DATABASE=K Technology Corporation
 
-OUI:0022D4*
- ID_OUI_FROM_DATABASE=ComWorth Co., Ltd.
+OUI:0014D9*
+ ID_OUI_FROM_DATABASE=IP Fabrics, Inc.
 
-OUI:0022CA*
- ID_OUI_FROM_DATABASE=Anviz Biometric Tech. Co., Ltd.
+OUI:0014CD*
+ ID_OUI_FROM_DATABASE=DigitalZone Co., Ltd.
 
-OUI:0022C5*
- ID_OUI_FROM_DATABASE=INFORSON Co,Ltd.
+OUI:0014C1*
+ ID_OUI_FROM_DATABASE=U.S. Robotics Corporation
 
-OUI:0022C0*
- ID_OUI_FROM_DATABASE=Shenzhen Forcelink Electronic Co, Ltd
+OUI:0014C6*
+ ID_OUI_FROM_DATABASE=Quixant Ltd
 
-OUI:0022BB*
- ID_OUI_FROM_DATABASE=beyerdynamic GmbH & Co. KG
+OUI:0014BA*
+ ID_OUI_FROM_DATABASE=Carvers SA de CV
 
-OUI:0022AE*
- ID_OUI_FROM_DATABASE=Mattel Inc.
+OUI:0014B5*
+ ID_OUI_FROM_DATABASE=PHYSIOMETRIX,INC
 
-OUI:0022AD*
- ID_OUI_FROM_DATABASE=TELESIS TECHNOLOGIES, INC.
+OUI:0013C7*
+ ID_OUI_FROM_DATABASE=IONOS Co.,Ltd.
 
-OUI:0022A8*
- ID_OUI_FROM_DATABASE=Ouman Oy
+OUI:0013C0*
+ ID_OUI_FROM_DATABASE=Trix Tecnologia Ltda.
 
-OUI:002132*
- ID_OUI_FROM_DATABASE=Masterclock, Inc.
+OUI:0013B6*
+ ID_OUI_FROM_DATABASE=Sling Media, Inc.
 
-OUI:00212C*
- ID_OUI_FROM_DATABASE=SemIndia System Private Limited
+OUI:0013AF*
+ ID_OUI_FROM_DATABASE=NUMA Technology,Inc.
 
-OUI:002131*
- ID_OUI_FROM_DATABASE=Blynke Inc.
+OUI:0013B0*
+ ID_OUI_FROM_DATABASE=Jablotron
 
-OUI:00211F*
- ID_OUI_FROM_DATABASE=SHINSUNG DELTATECH CO.,LTD.
+OUI:0013AA*
+ ID_OUI_FROM_DATABASE=ALS  & TEC Ltd.
 
-OUI:002120*
- ID_OUI_FROM_DATABASE=Sequel Technologies
+OUI:0013A3*
+ ID_OUI_FROM_DATABASE=Siemens Com CPE Devices
 
-OUI:002125*
- ID_OUI_FROM_DATABASE=KUK JE TONG SHIN Co.,LTD
+OUI:00139E*
+ ID_OUI_FROM_DATABASE=Ciara Technologies Inc.
 
-OUI:002112*
- ID_OUI_FROM_DATABASE=WISCOM SYSTEM CO.,LTD
+OUI:001502*
+ ID_OUI_FROM_DATABASE=BETA tech
 
-OUI:001FB9*
- ID_OUI_FROM_DATABASE=Paltronics
+OUI:001509*
+ ID_OUI_FROM_DATABASE=Plus Technology Co., Ltd
 
-OUI:001FB7*
- ID_OUI_FROM_DATABASE=WiMate Technologies Corp.
+OUI:0014FD*
+ ID_OUI_FROM_DATABASE=Thecus Technology Corp.
 
-OUI:001FB8*
- ID_OUI_FROM_DATABASE=Universal Remote Control, Inc.
+OUI:0014EF*
+ ID_OUI_FROM_DATABASE=TZero Technologies, Inc.
 
-OUI:001FB2*
- ID_OUI_FROM_DATABASE=Sontheim Industrie Elektronik GmbH
+OUI:0014F1*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001FAB*
- ID_OUI_FROM_DATABASE=I.S HIGH TECH.INC
+OUI:0014F0*
+ ID_OUI_FROM_DATABASE=Business Security OL AB
 
-OUI:001FA6*
- ID_OUI_FROM_DATABASE=Stilo srl
+OUI:0014EA*
+ ID_OUI_FROM_DATABASE=S Digm Inc. (Safe Paradigm Inc.)
 
-OUI:001FA1*
- ID_OUI_FROM_DATABASE=Gtran Inc
+OUI:0014E5*
+ ID_OUI_FROM_DATABASE=Alticast
 
-OUI:001F9C*
- ID_OUI_FROM_DATABASE=LEDCO
+OUI:001423*
+ ID_OUI_FROM_DATABASE=J-S Co. NEUROCOM
 
-OUI:00215E*
- ID_OUI_FROM_DATABASE=IBM Corp
+OUI:001419*
+ ID_OUI_FROM_DATABASE=SIDSA
 
-OUI:002151*
- ID_OUI_FROM_DATABASE=Millinet Co., Ltd.
+OUI:001412*
+ ID_OUI_FROM_DATABASE=S-TEC electronics AG
 
-OUI:002152*
- ID_OUI_FROM_DATABASE=General Satellite Research & Development Limited
+OUI:001409*
+ ID_OUI_FROM_DATABASE=MAGNETI MARELLI   S.E. S.p.A.
 
-OUI:002157*
- ID_OUI_FROM_DATABASE=National Datacast, Inc.
+OUI:00140A*
+ ID_OUI_FROM_DATABASE=WEPIO Co., Ltd.
 
-OUI:00214B*
- ID_OUI_FROM_DATABASE=Shenzhen HAMP Science & Technology Co.,Ltd
+OUI:0013FD*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:002145*
- ID_OUI_FROM_DATABASE=Semptian Technologies Ltd.
+OUI:0013F8*
+ ID_OUI_FROM_DATABASE=Dex Security Solutions
 
-OUI:002144*
- ID_OUI_FROM_DATABASE=SS Telecoms
+OUI:0013F1*
+ ID_OUI_FROM_DATABASE=AMOD Technology Co., Ltd.
 
-OUI:00213C*
- ID_OUI_FROM_DATABASE=AliphCom
+OUI:0013F7*
+ ID_OUI_FROM_DATABASE=SMC Networks, Inc.
 
-OUI:00213B*
- ID_OUI_FROM_DATABASE=Berkshire Products, Inc
+OUI:0013E7*
+ ID_OUI_FROM_DATABASE=Halcro
 
-OUI:002190*
- ID_OUI_FROM_DATABASE=Goliath Solutions
+OUI:0013DB*
+ ID_OUI_FROM_DATABASE=SHOEI Electric Co.,Ltd
 
-OUI:002189*
- ID_OUI_FROM_DATABASE=AppTech, Inc.
+OUI:0013CC*
+ ID_OUI_FROM_DATABASE=Tall Maple Systems
 
-OUI:002184*
- ID_OUI_FROM_DATABASE=POWERSOFT SRL
+OUI:001284*
+ ID_OUI_FROM_DATABASE=Lab33 Srl
 
-OUI:002183*
- ID_OUI_FROM_DATABASE=VATECH HYDRO
+OUI:00127E*
+ ID_OUI_FROM_DATABASE=Digital Lifestyles Group, Inc.
 
-OUI:00217D*
- ID_OUI_FROM_DATABASE=PYXIS S.R.L.
+OUI:001277*
+ ID_OUI_FROM_DATABASE=Korenix Technologies Co., Ltd.
 
-OUI:002177*
- ID_OUI_FROM_DATABASE=W. L. Gore & Associates
+OUI:001272*
+ ID_OUI_FROM_DATABASE=Redux Communications Ltd.
 
-OUI:002176*
- ID_OUI_FROM_DATABASE=YMax Telecom Ltd.
+OUI:001271*
+ ID_OUI_FROM_DATABASE=Measurement Computing Corp
 
-OUI:002171*
- ID_OUI_FROM_DATABASE=Wesung TNC Co., Ltd.
+OUI:00126B*
+ ID_OUI_FROM_DATABASE=Ascalade Communications Limited
 
-OUI:002164*
- ID_OUI_FROM_DATABASE=Special Design Bureau for Seismic Instrumentation
+OUI:001264*
+ ID_OUI_FROM_DATABASE=daum electronic gmbh
 
-OUI:002103*
- ID_OUI_FROM_DATABASE=GHI Electronics, LLC
+OUI:00125A*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
 
-OUI:001FFA*
- ID_OUI_FROM_DATABASE=Coretree, Co, Ltd
+OUI:00125F*
+ ID_OUI_FROM_DATABASE=AWIND Inc.
 
-OUI:001FF5*
- ID_OUI_FROM_DATABASE=Kongsberg Defence & Aerospace
+OUI:001255*
+ ID_OUI_FROM_DATABASE=NetEffect Incorporated
 
-OUI:001FF4*
- ID_OUI_FROM_DATABASE=Power Monitors, Inc.
+OUI:00124E*
+ ID_OUI_FROM_DATABASE=XAC AUTOMATION CORP.
 
-OUI:001FEE*
- ID_OUI_FROM_DATABASE=ubisys technologies GmbH
+OUI:001248*
+ ID_OUI_FROM_DATABASE=EMC Corporation (Kashya)
 
-OUI:001FE7*
- ID_OUI_FROM_DATABASE=Simet
+OUI:001242*
+ ID_OUI_FROM_DATABASE=Millennial Net
 
-OUI:001FDB*
- ID_OUI_FROM_DATABASE=Network Supply Corp.,
+OUI:001236*
+ ID_OUI_FROM_DATABASE=ConSentry Networks
 
-OUI:001FD1*
- ID_OUI_FROM_DATABASE=OPTEX CO.,LTD.
+OUI:00123B*
+ ID_OUI_FROM_DATABASE=KeRo Systems ApS
 
-OUI:001FCA*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001368*
+ ID_OUI_FROM_DATABASE=Saab Danmark A/S
 
-OUI:001FBE*
- ID_OUI_FROM_DATABASE=Shenzhen Mopnet Industrial Co.,Ltd
+OUI:00135C*
+ ID_OUI_FROM_DATABASE=OnSite Systems, Inc.
 
-OUI:001F62*
- ID_OUI_FROM_DATABASE=JSC Stilsoft
+OUI:001355*
+ ID_OUI_FROM_DATABASE=TOMEN Cyber-business Solutions, Inc.
 
-OUI:001F67*
- ID_OUI_FROM_DATABASE=Hitachi,Ltd.
+OUI:001356*
+ ID_OUI_FROM_DATABASE=FLIR Radiation Inc
 
-OUI:001F55*
- ID_OUI_FROM_DATABASE=Honeywell Security (China) Co., Ltd.
+OUI:001350*
+ ID_OUI_FROM_DATABASE=Silver Spring Networks, Inc
 
-OUI:001F56*
- ID_OUI_FROM_DATABASE=DIGITAL FORECAST
+OUI:001344*
+ ID_OUI_FROM_DATABASE=Fargo Electronics Inc.
 
-OUI:001F4F*
- ID_OUI_FROM_DATABASE=Thinkware Co. Ltd.
+OUI:001343*
+ ID_OUI_FROM_DATABASE=Matsushita Electronic Components (Europe) GmbH
 
-OUI:001F48*
- ID_OUI_FROM_DATABASE=Mojix Inc.
+OUI:00133D*
+ ID_OUI_FROM_DATABASE=Micro Memory Curtiss Wright Co
 
-OUI:001F43*
- ID_OUI_FROM_DATABASE=ENTES ELEKTRONIK
+OUI:00138B*
+ ID_OUI_FROM_DATABASE=Phantom Technologies LLC
 
-OUI:001F8E*
- ID_OUI_FROM_DATABASE=Metris USA Inc.
+OUI:001390*
+ ID_OUI_FROM_DATABASE=Termtek Computer Co., Ltd
 
-OUI:001F88*
- ID_OUI_FROM_DATABASE=FMS Force Measuring Systems AG
+OUI:001376*
+ ID_OUI_FROM_DATABASE=Tabor Electronics Ltd.
 
-OUI:001F81*
- ID_OUI_FROM_DATABASE=Accel Semiconductor Corp
+OUI:00137B*
+ ID_OUI_FROM_DATABASE=Movon Corporation
 
-OUI:001B58*
- ID_OUI_FROM_DATABASE=ACE CAD Enterprise Co., Ltd.
+OUI:001382*
+ ID_OUI_FROM_DATABASE=Cetacea Networks Corporation
 
-OUI:001F78*
- ID_OUI_FROM_DATABASE=Blue Fox Porini Textile
+OUI:001387*
+ ID_OUI_FROM_DATABASE=27M Technologies AB
 
-OUI:001F6E*
- ID_OUI_FROM_DATABASE=Vtech Engineering Corporation
+OUI:00136F*
+ ID_OUI_FROM_DATABASE=PacketMotion, Inc.
 
-OUI:001F68*
- ID_OUI_FROM_DATABASE=Martinsson Elektronik AB
+OUI:001375*
+ ID_OUI_FROM_DATABASE=American Security Products Co.
 
-OUI:0021BC*
- ID_OUI_FROM_DATABASE=ZALA COMPUTER
+OUI:001363*
+ ID_OUI_FROM_DATABASE=Verascape, Inc.
 
-OUI:0021B7*
- ID_OUI_FROM_DATABASE=Lexmark International Inc.
+OUI:0012FA*
+ ID_OUI_FROM_DATABASE=THX LTD
 
-OUI:0021B0*
- ID_OUI_FROM_DATABASE=Tyco Telecommunications
+OUI:001301*
+ ID_OUI_FROM_DATABASE=IronGate S.L.
 
-OUI:0021A4*
- ID_OUI_FROM_DATABASE=Dbii Networks
+OUI:001307*
+ ID_OUI_FROM_DATABASE=Paravirtual Corporation
 
-OUI:00219A*
- ID_OUI_FROM_DATABASE=Cambridge Visual Networks Ltd
+OUI:0012F5*
+ ID_OUI_FROM_DATABASE=Imarda New Zealand Limited
 
-OUI:002196*
- ID_OUI_FROM_DATABASE=Telsey  S.p.A.
+OUI:0012EB*
+ ID_OUI_FROM_DATABASE=PDH Solutions, LLC
+
+OUI:0012DE*
+ ID_OUI_FROM_DATABASE=Radio Components Sweden AB
+
+OUI:0012DD*
+ ID_OUI_FROM_DATABASE=Shengqu Information Technology (Shanghai) Co., Ltd.
 
-OUI:001E4B*
- ID_OUI_FROM_DATABASE=City Theatrical
+OUI:0012E4*
+ ID_OUI_FROM_DATABASE=ZIEHL industrie-electronik GmbH + Co KG
 
-OUI:001E47*
- ID_OUI_FROM_DATABASE=PT. Hariff Daya Tunggal Engineering
+OUI:0012AF*
+ ID_OUI_FROM_DATABASE=ELPRO Technologies
 
-OUI:001E41*
- ID_OUI_FROM_DATABASE=Microwave Communication & Component, Inc.
+OUI:0012A8*
+ ID_OUI_FROM_DATABASE=intec GmbH
 
-OUI:001E2E*
- ID_OUI_FROM_DATABASE=SIRTI S.p.A.
+OUI:0012A2*
+ ID_OUI_FROM_DATABASE=VITA
 
-OUI:001E27*
- ID_OUI_FROM_DATABASE=SBN TECH Co.,Ltd.
+OUI:0012A1*
+ ID_OUI_FROM_DATABASE=BluePacket Communications Co., Ltd.
 
-OUI:001E28*
- ID_OUI_FROM_DATABASE=Lumexis Corporation
+OUI:00129C*
+ ID_OUI_FROM_DATABASE=Yulinet
 
-OUI:001DF2*
- ID_OUI_FROM_DATABASE=Netflix, Inc.
+OUI:001290*
+ ID_OUI_FROM_DATABASE=KYOWA Electric & Machinery Corp.
 
-OUI:001DEB*
- ID_OUI_FROM_DATABASE=DINEC International
+OUI:001295*
+ ID_OUI_FROM_DATABASE=Aiware Inc.
 
-OUI:001DEC*
- ID_OUI_FROM_DATABASE=Marusys
+OUI:00132A*
+ ID_OUI_FROM_DATABASE=Sitronics Telecom Solutions
 
-OUI:001DE6*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001331*
+ ID_OUI_FROM_DATABASE=CellPoint Connect
 
-OUI:001DDA*
- ID_OUI_FROM_DATABASE=Mikroelektronika spol. s r. o.
+OUI:001336*
+ ID_OUI_FROM_DATABASE=Tianjin 712 Communication Broadcasting co., ltd.
 
-OUI:001DDF*
- ID_OUI_FROM_DATABASE=Sunitec Enterprise Co., Ltd.
+OUI:001324*
+ ID_OUI_FROM_DATABASE=Schneider Electric Ultra Terminal
 
-OUI:001DCC*
- ID_OUI_FROM_DATABASE=Hetra Secure Solutions
+OUI:001314*
+ ID_OUI_FROM_DATABASE=Asiamajor Inc.
 
-OUI:001DC7*
- ID_OUI_FROM_DATABASE=L-3 Communications Geneva Aerospace
+OUI:001319*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001DC0*
- ID_OUI_FROM_DATABASE=Enphase Energy
+OUI:00131A*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001ED8*
- ID_OUI_FROM_DATABASE=Digital United Inc.
+OUI:00130D*
+ ID_OUI_FROM_DATABASE=GALILEO AVIONICA
 
-OUI:001ED2*
- ID_OUI_FROM_DATABASE=Ray Shine Video Technology Inc
+OUI:001308*
+ ID_OUI_FROM_DATABASE=Nuvera Fuel Cells
 
-OUI:001ED1*
- ID_OUI_FROM_DATABASE=Keyprocessor B.V.
+OUI:00122F*
+ ID_OUI_FROM_DATABASE=Sanei Electric Inc.
 
-OUI:001ECC*
- ID_OUI_FROM_DATABASE=CDVI
+OUI:001235*
+ ID_OUI_FROM_DATABASE=Andrew Corporation
 
-OUI:001EC5*
- ID_OUI_FROM_DATABASE=Middle Atlantic Products Inc
+OUI:00122B*
+ ID_OUI_FROM_DATABASE=Virbiage Pty Ltd
 
-OUI:001EBF*
- ID_OUI_FROM_DATABASE=Haas Automation Inc.
+OUI:001212*
+ ID_OUI_FROM_DATABASE=PLUS  Corporation
 
-OUI:001EB9*
- ID_OUI_FROM_DATABASE=Sing Fai Technology Limited
+OUI:0012D8*
+ ID_OUI_FROM_DATABASE=International Games System Co., Ltd.
 
-OUI:001EB2*
- ID_OUI_FROM_DATABASE=LG innotek
+OUI:0012CB*
+ ID_OUI_FROM_DATABASE=CSS Inc.
 
-OUI:001F2E*
- ID_OUI_FROM_DATABASE=Triangle Research Int'l Pte Ltd
+OUI:0012C5*
+ ID_OUI_FROM_DATABASE=V-Show  Technology (China) Co.,Ltd
 
-OUI:001F2D*
- ID_OUI_FROM_DATABASE=Electro-Optical Imaging, Inc.
+OUI:0012CC*
+ ID_OUI_FROM_DATABASE=Bitatek CO., LTD
 
-OUI:001F27*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0012B4*
+ ID_OUI_FROM_DATABASE=Work Microwave GmbH
 
-OUI:001F14*
- ID_OUI_FROM_DATABASE=NexG
+OUI:0012BB*
+ ID_OUI_FROM_DATABASE=Telecommunications Industry Association TR-41 Committee
 
-OUI:001F1B*
- ID_OUI_FROM_DATABASE=RoyalTek Company Ltd.
+OUI:001206*
+ ID_OUI_FROM_DATABASE=iQuest (NZ) Ltd
 
-OUI:001F0D*
- ID_OUI_FROM_DATABASE=L3 Communications - Telemetry West
+OUI:00120B*
+ ID_OUI_FROM_DATABASE=Chinasys Technologies Limited
 
-OUI:001F0E*
- ID_OUI_FROM_DATABASE=Japan Kyastem Co., Ltd
+OUI:00120C*
+ ID_OUI_FROM_DATABASE=CE-Infosys Pte Ltd
 
-OUI:001E22*
- ID_OUI_FROM_DATABASE=ARVOO Imaging Products BV
+OUI:0011FF*
+ ID_OUI_FROM_DATABASE=Digitro Tecnologia Ltda
 
-OUI:001E1B*
- ID_OUI_FROM_DATABASE=Digital Stream Technology, Inc.
+OUI:0011FA*
+ ID_OUI_FROM_DATABASE=Rane Corporation
 
-OUI:001E16*
- ID_OUI_FROM_DATABASE=Keytronix
+OUI:0011F0*
+ ID_OUI_FROM_DATABASE=Wideful Limited
 
-OUI:001E15*
- ID_OUI_FROM_DATABASE=Beech Hill Electronics
+OUI:0011EF*
+ ID_OUI_FROM_DATABASE=Conitec Datensysteme GmbH
 
-OUI:001E11*
- ID_OUI_FROM_DATABASE=ELELUX INTERNATIONAL LTD
+OUI:0011E9*
+ ID_OUI_FROM_DATABASE=STARNEX CO., LTD.
 
-OUI:001E05*
- ID_OUI_FROM_DATABASE=Xseed Technologies & Computing
+OUI:001187*
+ ID_OUI_FROM_DATABASE=Category Solutions, Inc
 
-OUI:001E0C*
- ID_OUI_FROM_DATABASE=Sherwood Information Partners, Inc.
+OUI:001182*
+ ID_OUI_FROM_DATABASE=IMI Norgren Ltd
 
-OUI:001DFE*
- ID_OUI_FROM_DATABASE=Palm, Inc
+OUI:001181*
+ ID_OUI_FROM_DATABASE=InterEnergy Co.Ltd,
 
-OUI:001DF9*
- ID_OUI_FROM_DATABASE=Cybiotronics (Far East) Limited
+OUI:00117B*
+ ID_OUI_FROM_DATABASE=Büchi  Labortechnik AG
 
-OUI:001EAD*
- ID_OUI_FROM_DATABASE=Wingtech Group Limited
+OUI:00116F*
+ ID_OUI_FROM_DATABASE=Netforyou Co., LTD.
 
-OUI:001EA2*
- ID_OUI_FROM_DATABASE=Symx Systems, Inc.
+OUI:001168*
+ ID_OUI_FROM_DATABASE=HomeLogic LLC
 
-OUI:001EA7*
- ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
+OUI:00115E*
+ ID_OUI_FROM_DATABASE=ProMinent Dosiertechnik GmbH
 
-OUI:001EA1*
- ID_OUI_FROM_DATABASE=Brunata a/s
+OUI:001157*
+ ID_OUI_FROM_DATABASE=Oki Electric Industry Co., Ltd.
 
-OUI:001E9B*
- ID_OUI_FROM_DATABASE=San-Eisha, Ltd.
+OUI:000FB2*
+ ID_OUI_FROM_DATABASE=Broadband Pacenet (India) Pvt. Ltd.
 
-OUI:001E94*
- ID_OUI_FROM_DATABASE=SUPERCOM TECHNOLOGY CORPORATION
+OUI:000FA5*
+ ID_OUI_FROM_DATABASE=BWA Technology GmbH
 
-OUI:001E8F*
- ID_OUI_FROM_DATABASE=CANON INC.
+OUI:000FB1*
+ ID_OUI_FROM_DATABASE=Cognio Inc.
 
-OUI:001E87*
- ID_OUI_FROM_DATABASE=Realease Limited
+OUI:000FAC*
+ ID_OUI_FROM_DATABASE=IEEE 802.11
 
-OUI:001E80*
- ID_OUI_FROM_DATABASE=Last Mile Ltd.
+OUI:000F9C*
+ ID_OUI_FROM_DATABASE=Panduit Corp
 
-OUI:001EFC*
- ID_OUI_FROM_DATABASE=JSC MASSA-K
+OUI:000FA0*
+ ID_OUI_FROM_DATABASE=CANON KOREA BUSINESS SOLUTIONS INC.
 
-OUI:001F08*
- ID_OUI_FROM_DATABASE=RISCO LTD
+OUI:000F97*
+ ID_OUI_FROM_DATABASE=Avanex Corporation
 
-OUI:001EF5*
- ID_OUI_FROM_DATABASE=Hitek Automated Inc.
+OUI:000F8A*
+ ID_OUI_FROM_DATABASE=WideView
 
-OUI:001EFB*
- ID_OUI_FROM_DATABASE=Trio Motion Technology Ltd
+OUI:000F89*
+ ID_OUI_FROM_DATABASE=Winnertec System Co., Ltd.
 
-OUI:001EE9*
- ID_OUI_FROM_DATABASE=Stoneridge Electronics AB
+OUI:000F90*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001EEE*
- ID_OUI_FROM_DATABASE=ETL Systems Ltd
+OUI:000FD7*
+ ID_OUI_FROM_DATABASE=Harman Music Group
 
-OUI:001E7B*
- ID_OUI_FROM_DATABASE=R.I.CO. S.r.l.
+OUI:000FD1*
+ ID_OUI_FROM_DATABASE=Applied Wireless Identifications Group, Inc.
 
-OUI:001E76*
- ID_OUI_FROM_DATABASE=Thermo Fisher Scientific
+OUI:000FD2*
+ ID_OUI_FROM_DATABASE=EWA Technologies, Inc.
 
-OUI:001E6A*
- ID_OUI_FROM_DATABASE=Beijing Bluexon Technology Co.,Ltd
+OUI:000FC4*
+ ID_OUI_FROM_DATABASE=NST co.,LTD.
 
-OUI:001E71*
- ID_OUI_FROM_DATABASE=MIrcom Group of Companies
+OUI:000FCB*
+ ID_OUI_FROM_DATABASE=3Com Ltd
 
-OUI:001E63*
- ID_OUI_FROM_DATABASE=Vibro-Meter SA
+OUI:000FBF*
+ ID_OUI_FROM_DATABASE=DGT Sp. z o.o.
 
-OUI:001E5E*
- ID_OUI_FROM_DATABASE=COmputime Ltd.
+OUI:000FB8*
+ ID_OUI_FROM_DATABASE=CallURL Inc.
 
-OUI:001E57*
- ID_OUI_FROM_DATABASE=ALCOMA, spol. s r.o.
+OUI:0011DD*
+ ID_OUI_FROM_DATABASE=FROMUS TEC. Co., Ltd.
 
-OUI:001E51*
- ID_OUI_FROM_DATABASE=Converter Industry Srl
+OUI:0011E2*
+ ID_OUI_FROM_DATABASE=Hua Jung Components Co., Ltd.
 
-OUI:001DB9*
- ID_OUI_FROM_DATABASE=Wellspring Wireless
+OUI:0011CF*
+ ID_OUI_FROM_DATABASE=Thrane & Thrane A/S
 
-OUI:001DB4*
- ID_OUI_FROM_DATABASE=KUMHO ENG CO.,LTD
+OUI:0011D6*
+ ID_OUI_FROM_DATABASE=HandEra, Inc.
 
-OUI:001D9E*
- ID_OUI_FROM_DATABASE=AXION TECHNOLOGIES
+OUI:0011D0*
+ ID_OUI_FROM_DATABASE=Tandberg Data ASA
 
-OUI:001DA3*
- ID_OUI_FROM_DATABASE=SabiOso
+OUI:0011CA*
+ ID_OUI_FROM_DATABASE=Long Range Systems, Inc.
 
-OUI:001D9D*
- ID_OUI_FROM_DATABASE=ARTJOY INTERNATIONAL LIMITED
+OUI:0011C3*
+ ID_OUI_FROM_DATABASE=Transceiving System Technology Corporation
 
-OUI:001D45*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0011B7*
+ ID_OUI_FROM_DATABASE=Octalix B.V.
 
-OUI:001D3E*
- ID_OUI_FROM_DATABASE=SAKA TECHNO SCIENCE CO.,LTD
+OUI:0011BE*
+ ID_OUI_FROM_DATABASE=AGP Telecom Co. Ltd
 
-OUI:001D37*
- ID_OUI_FROM_DATABASE=Thales-Panda Transportation System
+OUI:0011BD*
+ ID_OUI_FROM_DATABASE=Bombardier Transportation
 
-OUI:001D38*
- ID_OUI_FROM_DATABASE=Seagate Technology
+OUI:001105*
+ ID_OUI_FROM_DATABASE=Sunplus Technology Co., Ltd.
 
-OUI:001D32*
- ID_OUI_FROM_DATABASE=Longkay Communication & Technology (Shanghai) Co. Ltd
+OUI:00110C*
+ ID_OUI_FROM_DATABASE=Atmark Techno, Inc.
 
-OUI:001D2B*
- ID_OUI_FROM_DATABASE=Wuhan Pont Technology CO. , LTD
+OUI:000FF9*
+ ID_OUI_FROM_DATABASE=Valcretec, Inc.
 
-OUI:001D1F*
- ID_OUI_FROM_DATABASE=Siauliu Tauro Televizoriai, JSC
+OUI:000FFA*
+ ID_OUI_FROM_DATABASE=Optinel Systems, Inc.
 
-OUI:001D26*
- ID_OUI_FROM_DATABASE=Rockridgesound Technology Co.
+OUI:000FFF*
+ ID_OUI_FROM_DATABASE=Control4
 
-OUI:001D1A*
- ID_OUI_FROM_DATABASE=OvisLink S.A.
+OUI:000FF1*
+ ID_OUI_FROM_DATABASE=nex-G Systems Pte.Ltd
 
-OUI:001D7A*
- ID_OUI_FROM_DATABASE=Wideband Semiconductor, Inc.
+OUI:000FE4*
+ ID_OUI_FROM_DATABASE=Pantech Co.,Ltd
 
-OUI:001D74*
- ID_OUI_FROM_DATABASE=Tianjin China-Silicon Microelectronics Co., Ltd.
+OUI:000FEA*
+ ID_OUI_FROM_DATABASE=Giga-Byte Technology Co.,LTD.
 
-OUI:001D62*
- ID_OUI_FROM_DATABASE=InPhase Technologies
+OUI:000FE3*
+ ID_OUI_FROM_DATABASE=Damm Cellular Systems A/S
 
-OUI:001D61*
- ID_OUI_FROM_DATABASE=BIJ Corporation
+OUI:0011AB*
+ ID_OUI_FROM_DATABASE=TRUSTABLE TECHNOLOGY CO.,LTD.
 
-OUI:001D5B*
- ID_OUI_FROM_DATABASE=Tecvan Informática Ltda
+OUI:0011B0*
+ ID_OUI_FROM_DATABASE=Fortelink Inc.
 
-OUI:001D54*
- ID_OUI_FROM_DATABASE=Sunnic Technology & Merchandise INC.
+OUI:0011A4*
+ ID_OUI_FROM_DATABASE=JStream Technologies Inc.
 
-OUI:001D4A*
- ID_OUI_FROM_DATABASE=Carestream Health, Inc.
+OUI:001198*
+ ID_OUI_FROM_DATABASE=Prism Media Products Limited
 
-OUI:001CE8*
- ID_OUI_FROM_DATABASE=Cummins Inc
+OUI:00119D*
+ ID_OUI_FROM_DATABASE=Diginfo Technology Corporation
 
-OUI:001CE4*
- ID_OUI_FROM_DATABASE=EleSy JSC
+OUI:00119E*
+ ID_OUI_FROM_DATABASE=Solectron Brazil
 
-OUI:001CDD*
- ID_OUI_FROM_DATABASE=COWBELL ENGINEERING CO., LTD.
+OUI:00118E*
+ ID_OUI_FROM_DATABASE=Halytech Mace
 
-OUI:001CDE*
- ID_OUI_FROM_DATABASE=Interactive Multimedia eXchange Inc.
+OUI:001193*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001CD8*
- ID_OUI_FROM_DATABASE=BlueAnt Wireless
+OUI:001152*
+ ID_OUI_FROM_DATABASE=Eidsvoll Electronics AS
 
-OUI:001CD1*
- ID_OUI_FROM_DATABASE=Waves Audio LTD
+OUI:00114F*
+ ID_OUI_FROM_DATABASE=US Digital Television, Inc
 
-OUI:001CCB*
- ID_OUI_FROM_DATABASE=Forth Corporation Public Company Limited
+OUI:001149*
+ ID_OUI_FROM_DATABASE=Proliphix Inc.
 
-OUI:001CC5*
- ID_OUI_FROM_DATABASE=3Com Ltd
+OUI:001142*
+ ID_OUI_FROM_DATABASE=e-SMARTCOM  INC.
 
-OUI:001D14*
- ID_OUI_FROM_DATABASE=SPERADTONE INFORMATION TECHNOLOGY LIMITED
+OUI:00113D*
+ ID_OUI_FROM_DATABASE=KN SOLTEC CO.,LTD.
 
-OUI:001D07*
- ID_OUI_FROM_DATABASE=Shenzhen Sang Fei Consumer Communications Co.,Ltd
+OUI:00113C*
+ ID_OUI_FROM_DATABASE=Micronas GmbH
 
-OUI:001D01*
- ID_OUI_FROM_DATABASE=Neptune Digital
+OUI:001136*
+ ID_OUI_FROM_DATABASE=Goodrich Sensor Systems
 
-OUI:001CFA*
- ID_OUI_FROM_DATABASE=Alarm.com
+OUI:00112C*
+ ID_OUI_FROM_DATABASE=IZT GmbH
 
-OUI:001CEE*
- ID_OUI_FROM_DATABASE=SHARP Corporation
+OUI:001130*
+ ID_OUI_FROM_DATABASE=Allied Telesis (Hong Kong) Ltd.
 
-OUI:001CF5*
- ID_OUI_FROM_DATABASE=Wiseblue Technology Limited
+OUI:00111E*
+ ID_OUI_FROM_DATABASE=EPSG (Ethernet Powerlink Standardization Group)
 
-OUI:001CB9*
- ID_OUI_FROM_DATABASE=KWANG SUNG ELECTRONICS CO., LTD.
+OUI:00111F*
+ ID_OUI_FROM_DATABASE=Doremi Labs, Inc.
 
-OUI:001CAF*
- ID_OUI_FROM_DATABASE=Plato Networks Inc.
+OUI:001112*
+ ID_OUI_FROM_DATABASE=Honeywell CMSS
 
-OUI:001CB4*
- ID_OUI_FROM_DATABASE=Iridium Satellite LLC
+OUI:001118*
+ ID_OUI_FROM_DATABASE=BLX IC Design Corp., Ltd.
 
-OUI:001C9F*
- ID_OUI_FROM_DATABASE=Razorstream, LLC
+OUI:000F58*
+ ID_OUI_FROM_DATABASE=Adder Technology Limited
 
-OUI:001C99*
- ID_OUI_FROM_DATABASE=Shunra Software Ltd.
+OUI:000F52*
+ ID_OUI_FROM_DATABASE=YORK Refrigeration, Marine & Controls
 
-OUI:001C8C*
- ID_OUI_FROM_DATABASE=DIAL TECHNOLOGY LTD.
+OUI:000F57*
+ ID_OUI_FROM_DATABASE=CABLELOGIC Co., Ltd.
 
-OUI:001C93*
- ID_OUI_FROM_DATABASE=ExaDigm Inc
+OUI:000F45*
+ ID_OUI_FROM_DATABASE=Stretch, Inc.
 
-OUI:001C87*
- ID_OUI_FROM_DATABASE=Uriver Inc.
+OUI:000F46*
+ ID_OUI_FROM_DATABASE=SINAR AG
 
-OUI:001C82*
- ID_OUI_FROM_DATABASE=Genew Technologies
+OUI:000F4B*
+ ID_OUI_FROM_DATABASE=Oracle Corporation
 
-OUI:001C1A*
- ID_OUI_FROM_DATABASE=Thomas Instrumentation, Inc
+OUI:000F37*
+ ID_OUI_FROM_DATABASE=Xambala Incorporated
 
-OUI:001C0E*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000F3F*
+ ID_OUI_FROM_DATABASE=Big Bear Networks
 
-OUI:001C13*
- ID_OUI_FROM_DATABASE=OPTSYS TECHNOLOGY CO., LTD.
+OUI:000F3B*
+ ID_OUI_FROM_DATABASE=Fuji System Machines Co., Ltd.
 
-OUI:001C07*
- ID_OUI_FROM_DATABASE=Cwlinux Limited
+OUI:000F31*
+ ID_OUI_FROM_DATABASE=Allied Vision Technologies Canada Inc
 
-OUI:001C00*
- ID_OUI_FROM_DATABASE=Entry Point, LLC
+OUI:000F32*
+ ID_OUI_FROM_DATABASE=Lootom Telcovideo Network Wuxi Co Ltd
 
-OUI:001BF4*
- ID_OUI_FROM_DATABASE=KENWIN INDUSTRIAL(HK) LTD.
+OUI:000F2B*
+ ID_OUI_FROM_DATABASE=GREENBELL SYSTEMS
 
-OUI:001BEF*
- ID_OUI_FROM_DATABASE=Blossoms Digital Technology Co.,Ltd.
+OUI:000E98*
+ ID_OUI_FROM_DATABASE=HME Clear-Com LTD.
 
-OUI:001BE2*
- ID_OUI_FROM_DATABASE=AhnLab,Inc.
+OUI:000E93*
+ ID_OUI_FROM_DATABASE=Milénio 3 Sistemas Electrónicos, Lda.
 
-OUI:001C7D*
- ID_OUI_FROM_DATABASE=Excelpoint Manufacturing Pte Ltd
+OUI:000E8C*
+ ID_OUI_FROM_DATABASE=Siemens AG A&D ET
 
-OUI:001C73*
- ID_OUI_FROM_DATABASE=Arista Networks, Inc.
+OUI:000E86*
+ ID_OUI_FROM_DATABASE=Alcatel North America
 
-OUI:001C78*
- ID_OUI_FROM_DATABASE=WYPLAY SAS
+OUI:000E80*
+ ID_OUI_FROM_DATABASE=Thomson Technology Inc
 
-OUI:001C65*
- ID_OUI_FROM_DATABASE=JoeScan, Inc.
+OUI:000E85*
+ ID_OUI_FROM_DATABASE=Catalyst Enterprises, Inc.
 
-OUI:001C67*
- ID_OUI_FROM_DATABASE=Pumpkin Networks, Inc.
+OUI:000E74*
+ ID_OUI_FROM_DATABASE=Solar Telecom. Tech
 
-OUI:001C66*
- ID_OUI_FROM_DATABASE=UCAMP CO.,LTD
+OUI:000E79*
+ ID_OUI_FROM_DATABASE=Ample Communications Inc.
 
-OUI:001C60*
- ID_OUI_FROM_DATABASE=CSP Frontier Technologies,Inc.
+OUI:000F24*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001C54*
- ID_OUI_FROM_DATABASE=Hillstone Networks Inc
+OUI:000F12*
+ ID_OUI_FROM_DATABASE=Panasonic Europe Ltd.
 
-OUI:001C59*
- ID_OUI_FROM_DATABASE=DEVON IT
+OUI:000F18*
+ ID_OUI_FROM_DATABASE=Industrial Control Systems
 
-OUI:001C4F*
- ID_OUI_FROM_DATABASE=MACAB AB
+OUI:000F11*
+ ID_OUI_FROM_DATABASE=Prodrive B.V.
 
-OUI:001C37*
- ID_OUI_FROM_DATABASE=Callpod, Inc.
+OUI:000F0C*
+ ID_OUI_FROM_DATABASE=SYNCHRONIC ENGINEERING
 
-OUI:001C3C*
- ID_OUI_FROM_DATABASE=Seon Design Inc.
+OUI:000EFF*
+ ID_OUI_FROM_DATABASE=Megasolution,Inc.
 
-OUI:001C30*
- ID_OUI_FROM_DATABASE=Mode Lighting (UK ) Ltd.
+OUI:000F00*
+ ID_OUI_FROM_DATABASE=Legra Systems, Inc.
 
-OUI:001C2B*
- ID_OUI_FROM_DATABASE=Alertme.com Limited
+OUI:000F05*
+ ID_OUI_FROM_DATABASE=3B SYSTEM INC.
 
-OUI:001C2A*
- ID_OUI_FROM_DATABASE=Envisacor Technologies Inc.
+OUI:000F7D*
+ ID_OUI_FROM_DATABASE=Xirrus
 
-OUI:001C29*
- ID_OUI_FROM_DATABASE=CORE DIGITAL ELECTRONICS CO., LTD
+OUI:000F84*
+ ID_OUI_FROM_DATABASE=Astute Networks, Inc.
 
-OUI:001C24*
- ID_OUI_FROM_DATABASE=Formosa Wireless Systems Corp.
+OUI:000F77*
+ ID_OUI_FROM_DATABASE=DENTUM CO.,LTD
 
-OUI:001C1F*
- ID_OUI_FROM_DATABASE=Quest Retail Technology Pty Ltd
+OUI:000F71*
+ ID_OUI_FROM_DATABASE=Sanmei Electronics Co.,Ltd
 
-OUI:001D97*
- ID_OUI_FROM_DATABASE=Alertus Technologies LLC
+OUI:000F78*
+ ID_OUI_FROM_DATABASE=Datacap Systems Inc
 
-OUI:001D90*
- ID_OUI_FROM_DATABASE=EMCO Flow Systems
+OUI:000F65*
+ ID_OUI_FROM_DATABASE=icube Corp.
 
-OUI:001D84*
- ID_OUI_FROM_DATABASE=Gateway, Inc.
+OUI:000F5E*
+ ID_OUI_FROM_DATABASE=Veo
 
-OUI:001D67*
- ID_OUI_FROM_DATABASE=AMEC
+OUI:000E71*
+ ID_OUI_FROM_DATABASE=Gemstar Technology Development Ltd.
 
-OUI:001A93*
- ID_OUI_FROM_DATABASE=ERCO Leuchten GmbH
+OUI:000E6C*
+ ID_OUI_FROM_DATABASE=Device Drivers Limited
 
-OUI:001A98*
- ID_OUI_FROM_DATABASE=Asotel Communication Limited Taiwan Branch
+OUI:000E65*
+ ID_OUI_FROM_DATABASE=TransCore
 
-OUI:001A8E*
- ID_OUI_FROM_DATABASE=3Way Networks Ltd
+OUI:000E5F*
+ ID_OUI_FROM_DATABASE=activ-net GmbH & Co. KG
 
-OUI:001A7D*
- ID_OUI_FROM_DATABASE=cyber-blue(HK)Ltd
+OUI:000E60*
+ ID_OUI_FROM_DATABASE=360SUN Digital Broadband Corporation
 
-OUI:001A82*
- ID_OUI_FROM_DATABASE=PROBA Building Automation Co.,LTD
+OUI:000E52*
+ ID_OUI_FROM_DATABASE=Optium Corporation
 
-OUI:001A7C*
- ID_OUI_FROM_DATABASE=Hirschmann Multimedia B.V.
+OUI:000E46*
+ ID_OUI_FROM_DATABASE=Niigata Seimitsu Co.,Ltd.
 
-OUI:001A78*
- ID_OUI_FROM_DATABASE=ubtos
+OUI:000E4D*
+ ID_OUI_FROM_DATABASE=Numesa Inc.
 
-OUI:001A7B*
- ID_OUI_FROM_DATABASE=Teleco, Inc.
+OUI:000E3F*
+ ID_OUI_FROM_DATABASE=Soronti, Inc.
 
-OUI:001A71*
- ID_OUI_FROM_DATABASE=Diostech Co., Ltd.
+OUI:000EC5*
+ ID_OUI_FROM_DATABASE=Digital Multitools Inc
 
-OUI:001A6C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000EB8*
+ ID_OUI_FROM_DATABASE=Iiga co.,Ltd
 
-OUI:001A65*
- ID_OUI_FROM_DATABASE=Seluxit
+OUI:000EB7*
+ ID_OUI_FROM_DATABASE=Knovative, Inc.
 
-OUI:001B7D*
- ID_OUI_FROM_DATABASE=CXR Anderson Jacobson
+OUI:000EBE*
+ ID_OUI_FROM_DATABASE=B&B Electronics Manufacturing Co.
 
-OUI:001B71*
- ID_OUI_FROM_DATABASE=Telular Corp.
+OUI:000EB2*
+ ID_OUI_FROM_DATABASE=Micro-Research Finland Oy
 
-OUI:001B6A*
- ID_OUI_FROM_DATABASE=Powerwave Technologies Sweden AB
+OUI:000EAB*
+ ID_OUI_FROM_DATABASE=Cray Inc
 
-OUI:001B65*
- ID_OUI_FROM_DATABASE=China Gridcom Co., Ltd
+OUI:000EA5*
+ ID_OUI_FROM_DATABASE=BLIP Systems
 
-OUI:001B5E*
- ID_OUI_FROM_DATABASE=BPL Limited
+OUI:000E9F*
+ ID_OUI_FROM_DATABASE=TEMIC SDS GmbH
 
-OUI:001B57*
- ID_OUI_FROM_DATABASE=SEMINDIA SYSTEMS PRIVATE LIMITED
+OUI:000E0A*
+ ID_OUI_FROM_DATABASE=SAKUMA DESIGN OFFICE
 
-OUI:001B46*
- ID_OUI_FROM_DATABASE=Blueone Technology Co.,Ltd
+OUI:000E12*
+ ID_OUI_FROM_DATABASE=Adaptive Micro Systems Inc.
 
-OUI:001B4B*
- ID_OUI_FROM_DATABASE=SANION Co., Ltd.
+OUI:000E04*
+ ID_OUI_FROM_DATABASE=CMA/Microdialysis AB
 
-OUI:001BAD*
- ID_OUI_FROM_DATABASE=iControl Incorporated
+OUI:000DF7*
+ ID_OUI_FROM_DATABASE=Space Dynamics Lab
 
-OUI:001BA6*
- ID_OUI_FROM_DATABASE=intotech inc.
+OUI:000DFE*
+ ID_OUI_FROM_DATABASE=Hauppauge Computer Works, Inc.
 
-OUI:001BA1*
- ID_OUI_FROM_DATABASE=Åmic AB
+OUI:000DF1*
+ ID_OUI_FROM_DATABASE=IONIX INC.
 
-OUI:001B93*
- ID_OUI_FROM_DATABASE=JC Decaux SA DNT
+OUI:000DEB*
+ ID_OUI_FROM_DATABASE=CompXs Limited
 
-OUI:001B95*
- ID_OUI_FROM_DATABASE=VIDEO SYSTEMS SRL
+OUI:000DF2*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:001B9A*
- ID_OUI_FROM_DATABASE=Apollo Fire Detectors Ltd
+OUI:000DE4*
+ ID_OUI_FROM_DATABASE=DIGINICS, Inc.
 
-OUI:001B94*
- ID_OUI_FROM_DATABASE=T.E.M.A. S.p.A.
+OUI:000EF9*
+ ID_OUI_FROM_DATABASE=REA Elektronik GmbH
 
-OUI:001B8E*
- ID_OUI_FROM_DATABASE=Hulu Sweden AB
+OUI:000EF2*
+ ID_OUI_FROM_DATABASE=Infinico Corporation
 
-OUI:001B89*
- ID_OUI_FROM_DATABASE=EMZA Visual Sense Ltd.
+OUI:000EE0*
+ ID_OUI_FROM_DATABASE=Mcharge
 
-OUI:001B8A*
- ID_OUI_FROM_DATABASE=2M Electronic A/S
+OUI:000EDF*
+ ID_OUI_FROM_DATABASE=PLX Technology
 
-OUI:001B84*
- ID_OUI_FROM_DATABASE=Scan Engineering Telecom
+OUI:000EE6*
+ ID_OUI_FROM_DATABASE=Adimos Systems LTD
 
-OUI:001BD1*
- ID_OUI_FROM_DATABASE=SOGESTMATIC
+OUI:000ECA*
+ ID_OUI_FROM_DATABASE=WTSS Inc
 
-OUI:001BD6*
- ID_OUI_FROM_DATABASE=Kelvin Hughes Ltd
+OUI:000ED1*
+ ID_OUI_FROM_DATABASE=Osaka Micro Computer.
 
-OUI:001BCF*
- ID_OUI_FROM_DATABASE=Dataupia Corporation
+OUI:000EDA*
+ ID_OUI_FROM_DATABASE=C-TECH UNITED CORP.
 
-OUI:001BD0*
- ID_OUI_FROM_DATABASE=IDENTEC SOLUTIONS
+OUI:000ED6*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001BCA*
- ID_OUI_FROM_DATABASE=Beijing Run Technology LTD. Company
+OUI:000E37*
+ ID_OUI_FROM_DATABASE=Harms & Wende GmbH & Co.KG
 
-OUI:001BC3*
- ID_OUI_FROM_DATABASE=Mobisolution Co.,Ltd
+OUI:000E38*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001BBE*
- ID_OUI_FROM_DATABASE=ICOP Digital
+OUI:000E31*
+ ID_OUI_FROM_DATABASE=Olympus Soft Imaging Solutions GmbH
 
-OUI:001BB4*
- ID_OUI_FROM_DATABASE=Airvod Limited
+OUI:000E2A*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:001B14*
- ID_OUI_FROM_DATABASE=Carex Lighting Equipment Factory
+OUI:000E25*
+ ID_OUI_FROM_DATABASE=Hannae Technology Co., Ltd
 
-OUI:001B0D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000E18*
+ ID_OUI_FROM_DATABASE=MyA Technology
 
-OUI:001B06*
- ID_OUI_FROM_DATABASE=Ateliers R. LAUMONIER
+OUI:000E17*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:001B08*
- ID_OUI_FROM_DATABASE=Danfoss Drives A/S
+OUI:000E0E*
+ ID_OUI_FROM_DATABASE=ESA elettronica S.P.A.
 
-OUI:001B01*
- ID_OUI_FROM_DATABASE=Applied Radio Technologies
+OUI:000C7E*
+ ID_OUI_FROM_DATABASE=Tellium Incorporated
 
-OUI:001AF5*
- ID_OUI_FROM_DATABASE=PENTAONE. CO., LTD.
+OUI:000C86*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001AFA*
- ID_OUI_FROM_DATABASE=Welch Allyn, Inc.
+OUI:000C81*
+ ID_OUI_FROM_DATABASE=Schneider Electric (Australia)
 
-OUI:001AE4*
- ID_OUI_FROM_DATABASE=Medicis Technologies Corporation
+OUI:000C72*
+ ID_OUI_FROM_DATABASE=Tempearl Industrial Co., Ltd.
 
-OUI:001ADD*
- ID_OUI_FROM_DATABASE=PePWave Ltd
+OUI:000C79*
+ ID_OUI_FROM_DATABASE=Extel Communications P/L
 
-OUI:001AD1*
- ID_OUI_FROM_DATABASE=FARGO CO., LTD.
+OUI:000C66*
+ ID_OUI_FROM_DATABASE=Pronto Networks Inc
 
-OUI:001AD8*
- ID_OUI_FROM_DATABASE=AlsterAero GmbH
+OUI:000C6B*
+ ID_OUI_FROM_DATABASE=Kurz Industrie-Elektronik GmbH
 
-OUI:001ACA*
- ID_OUI_FROM_DATABASE=Tilera Corporation
+OUI:000C6D*
+ ID_OUI_FROM_DATABASE=Edwards Ltd.
 
-OUI:001ACC*
- ID_OUI_FROM_DATABASE=Celestial Semiconductor, Ltd
+OUI:000DDF*
+ ID_OUI_FROM_DATABASE=Japan Image & Network Inc.
 
-OUI:001AC5*
- ID_OUI_FROM_DATABASE=BreakingPoint Systems, Inc.
+OUI:000DD2*
+ ID_OUI_FROM_DATABASE=Simrad Optronics ASA
 
-OUI:001ABB*
- ID_OUI_FROM_DATABASE=Fontal Technology Incorporation
+OUI:000DD1*
+ ID_OUI_FROM_DATABASE=Stryker Corporation
 
-OUI:001AC0*
- ID_OUI_FROM_DATABASE=JOYBIEN TECHNOLOGIES CO., LTD.
+OUI:000DD8*
+ ID_OUI_FROM_DATABASE=BBN
 
-OUI:001A60*
- ID_OUI_FROM_DATABASE=Wave Electronics Co.,Ltd.
+OUI:000DCC*
+ ID_OUI_FROM_DATABASE=NEOSMART Corp.
 
-OUI:001A55*
- ID_OUI_FROM_DATABASE=ACA-Digital Corporation
+OUI:000DBF*
+ ID_OUI_FROM_DATABASE=TekTone Sound & Signal Mfg., Inc.
 
-OUI:001A5A*
- ID_OUI_FROM_DATABASE=Korea Electric Power Data Network  (KDN) Co., Ltd
+OUI:000DC0*
+ ID_OUI_FROM_DATABASE=Spagat AS
 
-OUI:001A4E*
- ID_OUI_FROM_DATABASE=NTI AG / LinMot
+OUI:000DC5*
+ ID_OUI_FROM_DATABASE=EchoStar Global B.V.
 
-OUI:001A53*
- ID_OUI_FROM_DATABASE=Zylaya
+OUI:000DB9*
+ ID_OUI_FROM_DATABASE=PC Engines GmbH
 
-OUI:001A42*
- ID_OUI_FROM_DATABASE=Techcity Technology co., Ltd.
+OUI:000D8C*
+ ID_OUI_FROM_DATABASE=Shanghai Wedone Digital Ltd. CO.
 
-OUI:001A47*
- ID_OUI_FROM_DATABASE=Agami Systems, Inc.
+OUI:000D8B*
+ ID_OUI_FROM_DATABASE=T&D Corporation
 
-OUI:001A3B*
- ID_OUI_FROM_DATABASE=Doah Elecom Inc.
+OUI:000D85*
+ ID_OUI_FROM_DATABASE=Tapwave, Inc.
 
-OUI:001B3F*
- ID_OUI_FROM_DATABASE=ProCurve Networking by HP
+OUI:000D86*
+ ID_OUI_FROM_DATABASE=Huber + Suhner AG
 
-OUI:001B3A*
- ID_OUI_FROM_DATABASE=SIMS Corp.
+OUI:000D7E*
+ ID_OUI_FROM_DATABASE=Axiowave Networks, Inc.
 
-OUI:001B2C*
- ID_OUI_FROM_DATABASE=ATRON electronic GmbH
+OUI:000D78*
+ ID_OUI_FROM_DATABASE=Engineering & Security
 
-OUI:001B27*
- ID_OUI_FROM_DATABASE=Merlin CSI
+OUI:000D77*
+ ID_OUI_FROM_DATABASE=FalconStor Software
 
-OUI:001B20*
- ID_OUI_FROM_DATABASE=TPine Technology
+OUI:000D6B*
+ ID_OUI_FROM_DATABASE=Mita-Teknik A/S
 
-OUI:001B19*
- ID_OUI_FROM_DATABASE=IEEE I&M Society TC9
+OUI:000D65*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001AB4*
- ID_OUI_FROM_DATABASE=FFEI Ltd.
+OUI:000D5F*
+ ID_OUI_FROM_DATABASE=Minds Inc
 
-OUI:001AAF*
- ID_OUI_FROM_DATABASE=BLUSENS TECHNOLOGY
+OUI:000D66*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001AA8*
- ID_OUI_FROM_DATABASE=Mamiya Digital Imaging Co., Ltd.
+OUI:000CB1*
+ ID_OUI_FROM_DATABASE=Salland Engineering (Europe) BV
 
-OUI:001A9F*
- ID_OUI_FROM_DATABASE=A-Link Ltd
+OUI:000CB7*
+ ID_OUI_FROM_DATABASE=Nanjing Huazhuo Electronics Co., Ltd.
 
-OUI:001AA6*
- ID_OUI_FROM_DATABASE=Telefunken Radio Communication Systems GmbH &CO.KG
+OUI:000CBE*
+ ID_OUI_FROM_DATABASE=Innominate Security Technologies AG
 
-OUI:00193F*
- ID_OUI_FROM_DATABASE=RDI technology(Shenzhen) Co.,LTD
+OUI:000CC3*
+ ID_OUI_FROM_DATABASE=BeWAN systems
 
-OUI:001933*
- ID_OUI_FROM_DATABASE=Strix Systems, Inc.
+OUI:000CB2*
+ ID_OUI_FROM_DATABASE=UNION co., ltd.
 
-OUI:001938*
- ID_OUI_FROM_DATABASE=UMB Communications Co., Ltd.
+OUI:000CA5*
+ ID_OUI_FROM_DATABASE=Naman NZ LTd
 
-OUI:00192D*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:000CAC*
+ ID_OUI_FROM_DATABASE=Citizen Watch Co., Ltd.
 
-OUI:001926*
- ID_OUI_FROM_DATABASE=BitsGen Co., Ltd.
+OUI:000C94*
+ ID_OUI_FROM_DATABASE=United Electronic Industries, Inc. (EUI)
 
-OUI:001928*
- ID_OUI_FROM_DATABASE=Siemens AG, Transportation Systems
+OUI:000C99*
+ ID_OUI_FROM_DATABASE=HITEL LINK Co.,Ltd
 
-OUI:00190E*
- ID_OUI_FROM_DATABASE=Atech Technology Co., Ltd.
+OUI:000CA0*
+ ID_OUI_FROM_DATABASE=StorCase Technology, Inc.
 
-OUI:001913*
- ID_OUI_FROM_DATABASE=Chuang-Yi Network Equipment Co.Ltd.
+OUI:000C8D*
+ ID_OUI_FROM_DATABASE=MATRIX VISION GmbH
 
-OUI:001915*
- ID_OUI_FROM_DATABASE=TECOM Co., Ltd.
+OUI:000C92*
+ ID_OUI_FROM_DATABASE=WolfVision Gmbh
 
-OUI:00191A*
- ID_OUI_FROM_DATABASE=IRLINK
+OUI:000D32*
+ ID_OUI_FROM_DATABASE=DispenseSource, Inc.
 
-OUI:001993*
- ID_OUI_FROM_DATABASE=Changshu Switchgear MFG. Co.,Ltd. (Former Changshu Switchgea
+OUI:000D31*
+ ID_OUI_FROM_DATABASE=Compellent Technologies, Inc.
 
-OUI:001998*
- ID_OUI_FROM_DATABASE=SATO CORPORATION
+OUI:000D25*
+ ID_OUI_FROM_DATABASE=SANDEN CORPORATION
 
-OUI:00198E*
- ID_OUI_FROM_DATABASE=Oticon A/S
+OUI:000D1F*
+ ID_OUI_FROM_DATABASE=AV Digital
 
-OUI:001980*
- ID_OUI_FROM_DATABASE=Gridpoint Systems
+OUI:000D19*
+ ID_OUI_FROM_DATABASE=ROBE Show lighting
 
-OUI:001987*
- ID_OUI_FROM_DATABASE=Panasonic Mobile Communications Co., Ltd.
+OUI:000D20*
+ ID_OUI_FROM_DATABASE=ASAHIKASEI TECHNOSYSTEM CO.,LTD.
 
-OUI:00197B*
- ID_OUI_FROM_DATABASE=Picotest Corp.
+OUI:000D0D*
+ ID_OUI_FROM_DATABASE=ITSupported, LLC
 
-OUI:001968*
- ID_OUI_FROM_DATABASE=Digital Video Networks(Shanghai) CO. LTD.
+OUI:000D12*
+ ID_OUI_FROM_DATABASE=AXELL Corporation
 
-OUI:00196D*
- ID_OUI_FROM_DATABASE=Raybit Systems Korea, Inc
+OUI:000DB2*
+ ID_OUI_FROM_DATABASE=Ammasso, Inc.
 
-OUI:00196F*
- ID_OUI_FROM_DATABASE=SensoPart GmbH
+OUI:000DAD*
+ ID_OUI_FROM_DATABASE=Dataprobe, Inc.
 
-OUI:001952*
- ID_OUI_FROM_DATABASE=ACOGITO Co., Ltd
+OUI:000D9E*
+ ID_OUI_FROM_DATABASE=TOKUDEN OHIZUMI SEISAKUSYO Co.,Ltd.
 
-OUI:001957*
- ID_OUI_FROM_DATABASE=Saafnet Canada Inc.
+OUI:000DA5*
+ ID_OUI_FROM_DATABASE=Fabric7 Systems, Inc
 
-OUI:001946*
- ID_OUI_FROM_DATABASE=Cianet Industria e Comercio S/A
+OUI:000D99*
+ ID_OUI_FROM_DATABASE=Orbital Sciences Corp.; Launch Systems Group
 
-OUI:001944*
- ID_OUI_FROM_DATABASE=Fossil Partners, L.P.
+OUI:000D58*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:001A2F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000D4C*
+ ID_OUI_FROM_DATABASE=Outline Electronics Ltd.
 
-OUI:001A36*
- ID_OUI_FROM_DATABASE=Aipermon GmbH & Co. KG
+OUI:000D53*
+ ID_OUI_FROM_DATABASE=Beijing 5w Communication Corp.
 
-OUI:001A25*
- ID_OUI_FROM_DATABASE=DELTA DORE
+OUI:000D3F*
+ ID_OUI_FROM_DATABASE=VTI Instruments Corporation
 
-OUI:001A17*
- ID_OUI_FROM_DATABASE=Teak Technologies, Inc.
+OUI:000D44*
+ ID_OUI_FROM_DATABASE=Audio BU - Logitech
 
-OUI:001A19*
- ID_OUI_FROM_DATABASE=Computer Engineering Limited
+OUI:000D38*
+ ID_OUI_FROM_DATABASE=NISSIN INC.
 
-OUI:001A12*
- ID_OUI_FROM_DATABASE=Essilor
+OUI:000CD1*
+ ID_OUI_FROM_DATABASE=SFOM Technology Corp.
 
-OUI:001A0B*
- ID_OUI_FROM_DATABASE=BONA TECHNOLOGY INC.
+OUI:000CD6*
+ ID_OUI_FROM_DATABASE=PARTNER TECH
 
-OUI:001A06*
- ID_OUI_FROM_DATABASE=OpVista, Inc.
+OUI:000CDD*
+ ID_OUI_FROM_DATABASE=AOS technologies AG
 
-OUI:0018CD*
- ID_OUI_FROM_DATABASE=Erae Electronics Industry Co., Ltd
+OUI:000CCA*
+ ID_OUI_FROM_DATABASE=HGST a Western Digital Company
 
-OUI:0018D2*
- ID_OUI_FROM_DATABASE=High-Gain Antennas LLC
+OUI:000CC4*
+ ID_OUI_FROM_DATABASE=Tiptel AG
 
-OUI:0018D9*
- ID_OUI_FROM_DATABASE=Santosha Internatonal, Inc
+OUI:000D00*
+ ID_OUI_FROM_DATABASE=Seaway Networks Inc.
 
-OUI:0018C1*
- ID_OUI_FROM_DATABASE=Almitec Informática e Comércio
+OUI:000D06*
+ ID_OUI_FROM_DATABASE=Compulogic Limited
 
-OUI:0018C8*
- ID_OUI_FROM_DATABASE=ISONAS Inc.
+OUI:000CFA*
+ ID_OUI_FROM_DATABASE=Digital Systems Corp
 
-OUI:0018BC*
- ID_OUI_FROM_DATABASE=ZAO NVP Bolid
+OUI:000CFF*
+ ID_OUI_FROM_DATABASE=MRO-TEK LIMITED
 
-OUI:0018B5*
- ID_OUI_FROM_DATABASE=Magna Carta
+OUI:000CED*
+ ID_OUI_FROM_DATABASE=Real Digital Media
 
-OUI:0018AE*
- ID_OUI_FROM_DATABASE=TVT CO.,LTD
+OUI:000CEE*
+ ID_OUI_FROM_DATABASE=jp-embedded
 
-OUI:001902*
- ID_OUI_FROM_DATABASE=Cambridge Consultants Ltd
+OUI:000CF3*
+ ID_OUI_FROM_DATABASE=CALL IMAGE SA
 
-OUI:001907*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000CE7*
+ ID_OUI_FROM_DATABASE=MediaTek Inc.
 
-OUI:0018FD*
- ID_OUI_FROM_DATABASE=Optimal Technologies International Inc.
+OUI:000CE3*
+ ID_OUI_FROM_DATABASE=Option International N.V.
 
-OUI:0018F1*
- ID_OUI_FROM_DATABASE=Chunichi Denshi Co.,LTD.
+OUI:000B01*
+ ID_OUI_FROM_DATABASE=DAIICHI ELECTRONICS CO., LTD.
 
-OUI:0018EA*
- ID_OUI_FROM_DATABASE=Alltec GmbH
+OUI:000AF0*
+ ID_OUI_FROM_DATABASE=SHIN-OH ELECTRONICS CO., LTD. R&D
 
-OUI:0018EC*
- ID_OUI_FROM_DATABASE=Welding Technology Corporation
+OUI:000AF5*
+ ID_OUI_FROM_DATABASE=Airgo Networks, Inc.
 
-OUI:0018E5*
- ID_OUI_FROM_DATABASE=Adhoco AG
+OUI:000AEC*
+ ID_OUI_FROM_DATABASE=Koatsu Gas Kogyo Co., Ltd.
 
-OUI:0018A2*
- ID_OUI_FROM_DATABASE=XIP Technology AB
+OUI:000AE5*
+ ID_OUI_FROM_DATABASE=ScottCare Corporation
 
-OUI:0018A9*
- ID_OUI_FROM_DATABASE=Ethernet Direct Corporation
+OUI:000AE7*
+ ID_OUI_FROM_DATABASE=ELIOP S.A.
 
-OUI:00189D*
- ID_OUI_FROM_DATABASE=Navcast Inc.
+OUI:000AE0*
+ ID_OUI_FROM_DATABASE=Fujitsu Softek
 
-OUI:001893*
- ID_OUI_FROM_DATABASE=SHENZHEN PHOTON BROADBAND TECHNOLOGY CO.,LTD
+OUI:000AC8*
+ ID_OUI_FROM_DATABASE=ZPSYS CO.,LTD. (Planning&Management)
 
-OUI:001898*
- ID_OUI_FROM_DATABASE=KINGSTATE ELECTRONICS CORPORATION
+OUI:000ACD*
+ ID_OUI_FROM_DATABASE=Sunrich Technology Limited
 
-OUI:001891*
- ID_OUI_FROM_DATABASE=Zhongshan General K-mate Electronics Co., Ltd
+OUI:000AD4*
+ ID_OUI_FROM_DATABASE=CoreBell Systems Inc.
 
-OUI:001885*
- ID_OUI_FROM_DATABASE=Avigilon Corporation
+OUI:000B5E*
+ ID_OUI_FROM_DATABASE=Audio Engineering Society Inc.
 
-OUI:00188C*
- ID_OUI_FROM_DATABASE=Mobile Action Technology Inc.
+OUI:000B63*
+ ID_OUI_FROM_DATABASE=Kaleidescape
 
-OUI:0019C8*
- ID_OUI_FROM_DATABASE=AnyDATA Corporation
+OUI:000B55*
+ ID_OUI_FROM_DATABASE=ADInstruments
 
-OUI:0019C3*
- ID_OUI_FROM_DATABASE=Qualitrol
+OUI:000B5A*
+ ID_OUI_FROM_DATABASE=HyperEdge
 
-OUI:0019BE*
- ID_OUI_FROM_DATABASE=Altai Technologies Limited
+OUI:000B52*
+ ID_OUI_FROM_DATABASE=JOYMAX ELECTRONICS CO. LTD.
 
-OUI:0019BC*
- ID_OUI_FROM_DATABASE=ELECTRO CHANCE SRL
+OUI:000B4D*
+ ID_OUI_FROM_DATABASE=Emuzed
 
-OUI:0019A4*
- ID_OUI_FROM_DATABASE=Austar Technology (hang zhou) Co.,Ltd
+OUI:000B41*
+ ID_OUI_FROM_DATABASE=Ing. Büro Dr. Beutlhauser
 
-OUI:0019A9*
+OUI:000B46*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0019AB*
- ID_OUI_FROM_DATABASE=Raycom CO ., LTD
+OUI:000B33*
+ ID_OUI_FROM_DATABASE=Vivato Technologies
 
-OUI:0019B0*
- ID_OUI_FROM_DATABASE=HanYang System
+OUI:000B3A*
+ ID_OUI_FROM_DATABASE=QuStream Corporation
 
-OUI:0019FA*
- ID_OUI_FROM_DATABASE=Cable Vision Electronics CO., LTD.
+OUI:000B3F*
+ ID_OUI_FROM_DATABASE=Anthology Solutions Inc.
 
-OUI:0019FF*
- ID_OUI_FROM_DATABASE=Finnzymes
+OUI:000B95*
+ ID_OUI_FROM_DATABASE=eBet Gaming Systems Pty Ltd
 
-OUI:0019EC*
- ID_OUI_FROM_DATABASE=Sagamore Systems, Inc.
+OUI:000B8F*
+ ID_OUI_FROM_DATABASE=AKITA ELECTRONICS SYSTEMS CO.,LTD.
 
-OUI:0019F3*
- ID_OUI_FROM_DATABASE=Cetis, Inc
+OUI:000B89*
+ ID_OUI_FROM_DATABASE=Top Global Technology, Ltd.
 
-OUI:0019F8*
- ID_OUI_FROM_DATABASE=Embedded Systems Design, Inc.
+OUI:000B8E*
+ ID_OUI_FROM_DATABASE=Ascent Corporation
 
-OUI:0019E5*
- ID_OUI_FROM_DATABASE=Lynx Studio Technology, Inc.
+OUI:000B90*
+ ID_OUI_FROM_DATABASE=ADVA Optical Networking Ltd.
 
-OUI:0019E7*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000B7D*
+ ID_OUI_FROM_DATABASE=SOLOMON EXTREME INTERNATIONAL LTD.
 
-OUI:0019CD*
- ID_OUI_FROM_DATABASE=Chengdu ethercom information technology Ltd.
+OUI:000B82*
+ ID_OUI_FROM_DATABASE=Grandstream Networks, Inc.
 
-OUI:0019D4*
- ID_OUI_FROM_DATABASE=ICX Technologies
+OUI:000B6F*
+ ID_OUI_FROM_DATABASE=Media Streaming Networks Inc
 
-OUI:0019D9*
- ID_OUI_FROM_DATABASE=Zeutschel GmbH
+OUI:000B76*
+ ID_OUI_FROM_DATABASE=ET&T Technology Co. Ltd.
 
-OUI:001823*
- ID_OUI_FROM_DATABASE=Delta Electronics, Inc.
+OUI:000AC1*
+ ID_OUI_FROM_DATABASE=Futuretel
 
-OUI:001817*
- ID_OUI_FROM_DATABASE=D. E. Shaw Research, LLC
+OUI:000AC6*
+ ID_OUI_FROM_DATABASE=Overture Networks.
 
-OUI:00181E*
- ID_OUI_FROM_DATABASE=GDX Technologies Ltd.
+OUI:000AAE*
+ ID_OUI_FROM_DATABASE=Rosemount Process Analytical
 
-OUI:001812*
- ID_OUI_FROM_DATABASE=Beijing Xinwei Telecom Technology Co., Ltd.
+OUI:000AB3*
+ ID_OUI_FROM_DATABASE=Fa. GIRA
 
-OUI:001806*
- ID_OUI_FROM_DATABASE=Hokkei Industries Co., Ltd.
+OUI:000AB5*
+ ID_OUI_FROM_DATABASE=Digital Electronic Network
 
-OUI:00180B*
- ID_OUI_FROM_DATABASE=Brilliant Telecommunications
+OUI:000ABA*
+ ID_OUI_FROM_DATABASE=Arcon Technology Limited
 
-OUI:001805*
- ID_OUI_FROM_DATABASE=Beijing InHand Networking Technology Co.,Ltd.
+OUI:000AA2*
+ ID_OUI_FROM_DATABASE=SYSTEK INC.
 
-OUI:0017B8*
- ID_OUI_FROM_DATABASE=NOVATRON CO., LTD.
+OUI:000AA7*
+ ID_OUI_FROM_DATABASE=FEI Electron Optics
 
-OUI:0017BD*
- ID_OUI_FROM_DATABASE=Tibetsystem
+OUI:000A8F*
+ ID_OUI_FROM_DATABASE=Aska International Inc.
 
-OUI:0017B1*
- ID_OUI_FROM_DATABASE=ACIST Medical Systems, Inc.
+OUI:000A94*
+ ID_OUI_FROM_DATABASE=ShangHai cellink CO., LTD
 
-OUI:0017AA*
- ID_OUI_FROM_DATABASE=elab-experience inc.
+OUI:000C4E*
+ ID_OUI_FROM_DATABASE=Winbest Technology CO,LT
 
-OUI:0017AC*
- ID_OUI_FROM_DATABASE=O'Neil Product Development Inc.
+OUI:000C53*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:0017A5*
- ID_OUI_FROM_DATABASE=Ralink Technology Corp
+OUI:000C5A*
+ ID_OUI_FROM_DATABASE=IBSmm Embedded Electronics Consulting
 
-OUI:0017A0*
- ID_OUI_FROM_DATABASE=RoboTech srl
+OUI:000C5F*
+ ID_OUI_FROM_DATABASE=Avtec, Inc.
 
-OUI:00179B*
- ID_OUI_FROM_DATABASE=Chant Sincere CO., LTD.
+OUI:000C47*
+ ID_OUI_FROM_DATABASE=SK Teletech(R&D Planning Team)
 
-OUI:00170F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000C4C*
+ ID_OUI_FROM_DATABASE=Arcor AG&Co.
 
-OUI:001705*
- ID_OUI_FROM_DATABASE=Methode Electronics
+OUI:000C3E*
+ ID_OUI_FROM_DATABASE=Crest Audio
 
-OUI:00170A*
- ID_OUI_FROM_DATABASE=INEW DIGITAL COMPANY
+OUI:000C37*
+ ID_OUI_FROM_DATABASE=Geomation, Inc.
 
-OUI:0016F9*
- ID_OUI_FROM_DATABASE=CETRTA POT, d.o.o., Kranj
+OUI:000C2D*
+ ID_OUI_FROM_DATABASE=FullWave Technology Co., Ltd.
 
-OUI:0016F7*
- ID_OUI_FROM_DATABASE=L-3 Communications, Aviation Recorders
+OUI:000C1A*
+ ID_OUI_FROM_DATABASE=Quest Technical Solutions Inc.
 
-OUI:0016E6*
- ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
+OUI:000C1E*
+ ID_OUI_FROM_DATABASE=Global Cache
 
-OUI:00178F*
- ID_OUI_FROM_DATABASE=NINGBO YIDONG ELECTRONIC CO.,LTD.
+OUI:000C23*
+ ID_OUI_FROM_DATABASE=Beijing Lanchuan Tech. Co., Ltd.
 
-OUI:001794*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000C0E*
+ ID_OUI_FROM_DATABASE=XtremeSpectrum, Inc.
 
-OUI:00178D*
- ID_OUI_FROM_DATABASE=Checkpoint Systems, Inc.
+OUI:000C15*
+ ID_OUI_FROM_DATABASE=CyberPower Systems, Inc.
 
-OUI:00177C*
- ID_OUI_FROM_DATABASE=Smartlink Network Systems Limited
+OUI:000C09*
+ ID_OUI_FROM_DATABASE=Hitachi IE Systems Co., Ltd
 
-OUI:001781*
- ID_OUI_FROM_DATABASE=Greystone Data System, Inc.
+OUI:000BD3*
+ ID_OUI_FROM_DATABASE=cd3o
 
-OUI:001788*
- ID_OUI_FROM_DATABASE=Philips Lighting BV
+OUI:000BC7*
+ ID_OUI_FROM_DATABASE=ICET S.p.A.
 
-OUI:00176C*
- ID_OUI_FROM_DATABASE=Pivot3, Inc.
+OUI:000BCE*
+ ID_OUI_FROM_DATABASE=Free2move AB
 
-OUI:001770*
- ID_OUI_FROM_DATABASE=Arti Industrial Electronics Ltd.
+OUI:000BC2*
+ ID_OUI_FROM_DATABASE=Corinex Communication Corp.
 
-OUI:001775*
- ID_OUI_FROM_DATABASE=TTE Germany GmbH
+OUI:000BBB*
+ ID_OUI_FROM_DATABASE=Etin Systems Co., Ltd
 
-OUI:001760*
- ID_OUI_FROM_DATABASE=Naito Densei Machida MFG.CO.,LTD
+OUI:000BC0*
+ ID_OUI_FROM_DATABASE=China IWNComm Co., Ltd.
 
-OUI:001767*
- ID_OUI_FROM_DATABASE=Earforce AS
+OUI:000BAF*
+ ID_OUI_FROM_DATABASE=WOOJU COMMUNICATIONS Co,.Ltd
 
-OUI:00185A*
- ID_OUI_FROM_DATABASE=uControl, Inc.
+OUI:000BB4*
+ ID_OUI_FROM_DATABASE=RDC Semiconductor Inc.,
 
-OUI:00185F*
- ID_OUI_FROM_DATABASE=TAC Inc.
+OUI:000BA5*
+ ID_OUI_FROM_DATABASE=Quasar Cipta Mandiri, PT
 
-OUI:001861*
- ID_OUI_FROM_DATABASE=Ooma, Inc.
+OUI:000BAA*
+ ID_OUI_FROM_DATABASE=Aiphone co.,Ltd
 
-OUI:001866*
- ID_OUI_FROM_DATABASE=Leutron Vision
+OUI:000B9E*
+ ID_OUI_FROM_DATABASE=Yasing Technology Corp.
 
-OUI:001853*
- ID_OUI_FROM_DATABASE=Atera Networks LTD.
+OUI:000B27*
+ ID_OUI_FROM_DATABASE=Scion Corporation
 
-OUI:00184E*
- ID_OUI_FROM_DATABASE=Lianhe Technologies, Inc.
+OUI:000B1B*
+ ID_OUI_FROM_DATABASE=Systronix, Inc.
 
-OUI:001847*
- ID_OUI_FROM_DATABASE=AceNet Technology Inc.
+OUI:000B20*
+ ID_OUI_FROM_DATABASE=Hirata corporation
 
-OUI:00183B*
- ID_OUI_FROM_DATABASE=CENITS Co., Ltd.
+OUI:000B22*
+ ID_OUI_FROM_DATABASE=Environmental Systems and Services
 
-OUI:001840*
- ID_OUI_FROM_DATABASE=3 Phoenix, Inc.
+OUI:000B14*
+ ID_OUI_FROM_DATABASE=ViewSonic Corporation
 
-OUI:001842*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:000B0D*
+ ID_OUI_FROM_DATABASE=Air2U, Inc.
 
-OUI:001825*
- ID_OUI_FROM_DATABASE=Private
+OUI:000B0F*
+ ID_OUI_FROM_DATABASE=Bosch Rexroth
 
-OUI:00182A*
- ID_OUI_FROM_DATABASE=Taiwan Video & Monitor
+OUI:000B08*
+ ID_OUI_FROM_DATABASE=Pillar Data Systems
 
-OUI:001836*
- ID_OUI_FROM_DATABASE=Reliance Electric Limited
+OUI:000AFC*
+ ID_OUI_FROM_DATABASE=Core Tec Communications, LLC
 
-OUI:001759*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000BF6*
+ ID_OUI_FROM_DATABASE=Nitgen Co., Ltd
 
-OUI:001754*
- ID_OUI_FROM_DATABASE=Arkino HiTOP Corporation Limited
+OUI:000BFB*
+ ID_OUI_FROM_DATABASE=D-NET International Corporation
 
-OUI:001746*
- ID_OUI_FROM_DATABASE=Freedom9 Inc.
+OUI:000C02*
+ ID_OUI_FROM_DATABASE=ABB Oy
 
-OUI:001748*
- ID_OUI_FROM_DATABASE=Neokoros Brasil Ltda
+OUI:000BEA*
+ ID_OUI_FROM_DATABASE=Zultys Technologies
 
-OUI:00174D*
- ID_OUI_FROM_DATABASE=DYNAMIC NETWORK FACTORY, INC.
+OUI:000BEF*
+ ID_OUI_FROM_DATABASE=Code Corporation
 
-OUI:001741*
- ID_OUI_FROM_DATABASE=DEFIDEV
+OUI:000BE3*
+ ID_OUI_FROM_DATABASE=Key Stream Co., Ltd.
 
-OUI:001733*
- ID_OUI_FROM_DATABASE=SFR
+OUI:000BE8*
+ ID_OUI_FROM_DATABASE=AOIP
 
-OUI:00173A*
- ID_OUI_FROM_DATABASE=Reach Systems Inc.
+OUI:000BE9*
+ ID_OUI_FROM_DATABASE=Actel Corporation
 
-OUI:00172E*
- ID_OUI_FROM_DATABASE=FXC Inc.
+OUI:000BD7*
+ ID_OUI_FROM_DATABASE=DORMA Time + Access GmbH
 
-OUI:001727*
- ID_OUI_FROM_DATABASE=Thermo Ramsey Italia s.r.l.
+OUI:000BDC*
+ ID_OUI_FROM_DATABASE=AKCP
 
-OUI:001722*
- ID_OUI_FROM_DATABASE=Hanazeder Electronic GmbH
+OUI:000994*
+ ID_OUI_FROM_DATABASE=Cronyx Engineering
 
-OUI:00171B*
- ID_OUI_FROM_DATABASE=Innovation Lab Corp.
+OUI:000999*
+ ID_OUI_FROM_DATABASE=CP GEORGES RENAULT
 
-OUI:001714*
- ID_OUI_FROM_DATABASE=BR Controls Nederland bv
+OUI:000987*
+ ID_OUI_FROM_DATABASE=NISHI NIPPON ELECTRIC WIRE & CABLE CO.,LTD.
 
-OUI:001716*
- ID_OUI_FROM_DATABASE=Qno Technology Inc.
+OUI:000988*
+ ID_OUI_FROM_DATABASE=Nudian Electron Co., Ltd.
 
-OUI:0017F4*
- ID_OUI_FROM_DATABASE=ZERON ALLIANCE
+OUI:00098D*
+ ID_OUI_FROM_DATABASE=Velocity Semiconductor
 
-OUI:0017F9*
- ID_OUI_FROM_DATABASE=Forcom Sp. z o.o.
+OUI:000981*
+ ID_OUI_FROM_DATABASE=Newport Networks
 
-OUI:001800*
- ID_OUI_FROM_DATABASE=UNIGRAND LTD
+OUI:000975*
+ ID_OUI_FROM_DATABASE=fSONA Communications Corporation
 
-OUI:0017ED*
- ID_OUI_FROM_DATABASE=WooJooIT Ltd.
+OUI:00097A*
+ ID_OUI_FROM_DATABASE=Louis Design Labs.
 
-OUI:0017DA*
- ID_OUI_FROM_DATABASE=Spans Logic
+OUI:000968*
+ ID_OUI_FROM_DATABASE=TECHNOVENTURE, INC.
 
-OUI:0017E1*
- ID_OUI_FROM_DATABASE=DACOS Technologies Co., Ltd.
+OUI:000962*
+ ID_OUI_FROM_DATABASE=Sonitor Technologies AS
 
-OUI:0017D0*
- ID_OUI_FROM_DATABASE=Opticom Communications, LLC
+OUI:000A9B*
+ ID_OUI_FROM_DATABASE=TB Group Inc
 
-OUI:0017C4*
- ID_OUI_FROM_DATABASE=Quanta Microsystems, INC.
+OUI:000A9A*
+ ID_OUI_FROM_DATABASE=Aiptek International Inc
 
-OUI:001880*
- ID_OUI_FROM_DATABASE=Maxim Integrated Products
+OUI:000A80*
+ ID_OUI_FROM_DATABASE=Telkonet Inc.
 
-OUI:00186D*
- ID_OUI_FROM_DATABASE=Zhenjiang Sapphire Electronic Industry CO.
+OUI:000A82*
+ ID_OUI_FROM_DATABASE=TATSUTA SYSTEM ELECTRONICS CO.,LTD.
 
-OUI:001872*
- ID_OUI_FROM_DATABASE=Expertise Engineering
+OUI:000A87*
+ ID_OUI_FROM_DATABASE=Integrated Micromachines Inc.
 
-OUI:001874*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000A7B*
+ ID_OUI_FROM_DATABASE=Cornelius Consult
 
-OUI:001879*
- ID_OUI_FROM_DATABASE=dSys
+OUI:000A6D*
+ ID_OUI_FROM_DATABASE=EKS Elektronikservice GmbH
 
-OUI:001686*
- ID_OUI_FROM_DATABASE=Karl Storz Imaging
+OUI:000A6F*
+ ID_OUI_FROM_DATABASE=ZyFLEX Technologies Inc
 
-OUI:00167F*
- ID_OUI_FROM_DATABASE=Bluebird Soft Inc.
+OUI:000A74*
+ ID_OUI_FROM_DATABASE=Manticom Networks Inc.
 
-OUI:001681*
- ID_OUI_FROM_DATABASE=Vector Informatik GmbH
+OUI:000A61*
+ ID_OUI_FROM_DATABASE=Cellinx Systems Inc.
 
-OUI:001674*
- ID_OUI_FROM_DATABASE=EuroCB (Phils.), Inc.
+OUI:0009C3*
+ ID_OUI_FROM_DATABASE=NETAS
 
-OUI:001672*
- ID_OUI_FROM_DATABASE=Zenway enterprise ltd
+OUI:0009B9*
+ ID_OUI_FROM_DATABASE=Action Imaging Solutions
 
-OUI:001666*
- ID_OUI_FROM_DATABASE=Quantier Communication Inc.
+OUI:0009BA*
+ ID_OUI_FROM_DATABASE=MAKU Informationstechik GmbH
 
-OUI:00165F*
- ID_OUI_FROM_DATABASE=Fairmount Automation
+OUI:0009AC*
+ ID_OUI_FROM_DATABASE=LANVOICE
 
-OUI:0016AA*
- ID_OUI_FROM_DATABASE=Kei Communication Technology Inc.
+OUI:0009B3*
+ ID_OUI_FROM_DATABASE=MCM Systems Ltd
 
-OUI:0016AF*
- ID_OUI_FROM_DATABASE=Shenzhen Union Networks Equipment Co.,Ltd.
+OUI:0009A7*
+ ID_OUI_FROM_DATABASE=Bang & Olufsen A/S
 
-OUI:0016A5*
- ID_OUI_FROM_DATABASE=Tandberg Storage ASA
+OUI:00099A*
+ ID_OUI_FROM_DATABASE=ELMO COMPANY, LIMITED
 
-OUI:001699*
- ID_OUI_FROM_DATABASE=Tonic DVB Marketing Ltd
+OUI:0009A0*
+ ID_OUI_FROM_DATABASE=Microtechno Corporation
 
-OUI:0016A0*
- ID_OUI_FROM_DATABASE=Auto-Maskin
+OUI:0009ED*
+ ID_OUI_FROM_DATABASE=CipherOptics
 
-OUI:001692*
- ID_OUI_FROM_DATABASE=Scientific-Atlanta, Inc.
+OUI:0009F2*
+ ID_OUI_FROM_DATABASE=Cohu, Inc., Electronics Division
 
-OUI:001694*
- ID_OUI_FROM_DATABASE=Sennheiser Communications A/S
+OUI:0009E6*
+ ID_OUI_FROM_DATABASE=Cyber Switching Inc.
 
-OUI:00168D*
- ID_OUI_FROM_DATABASE=KORWIN CO., Ltd.
+OUI:0009E0*
+ ID_OUI_FROM_DATABASE=XEMICS S.A.
 
-OUI:00165A*
- ID_OUI_FROM_DATABASE=Harman Specialty Group
+OUI:0009DA*
+ ID_OUI_FROM_DATABASE=Control Module Inc.
 
-OUI:001653*
- ID_OUI_FROM_DATABASE=LEGO System A/S IE Electronics Division
+OUI:0009DF*
+ ID_OUI_FROM_DATABASE=Vestel Komunikasyon Sanayi ve Ticaret A.S.
 
-OUI:00164C*
- ID_OUI_FROM_DATABASE=PLANET INT Co., Ltd
+OUI:0009CD*
+ ID_OUI_FROM_DATABASE=HUDSON SOFT CO.,LTD.
 
-OUI:001647*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0009C7*
+ ID_OUI_FROM_DATABASE=Movistec
 
-OUI:001642*
- ID_OUI_FROM_DATABASE=Pangolin
+OUI:0009CE*
+ ID_OUI_FROM_DATABASE=SpaceBridge Semiconductor Corp.
 
-OUI:00163D*
- ID_OUI_FROM_DATABASE=Tsinghua Tongfang Legend Silicon Tech. Co., Ltd.
+OUI:0009D3*
+ ID_OUI_FROM_DATABASE=Western DataCom Co., Inc.
 
-OUI:001631*
- ID_OUI_FROM_DATABASE=Xteam
+OUI:000901*
+ ID_OUI_FROM_DATABASE=Shenzhen Shixuntong Information & Technoligy Co
 
-OUI:00162F*
- ID_OUI_FROM_DATABASE=Geutebrück GmbH
+OUI:0008FC*
+ ID_OUI_FROM_DATABASE=Gigaphoton Inc.
 
-OUI:001630*
- ID_OUI_FROM_DATABASE=Vativ Technologies
+OUI:0008F9*
+ ID_OUI_FROM_DATABASE=Artesyn Embedded Technologies
 
-OUI:0015F5*
- ID_OUI_FROM_DATABASE=Sustainable Energy Systems
+OUI:0008F4*
+ ID_OUI_FROM_DATABASE=Bluetake Technology Co., Ltd.
 
-OUI:0015F4*
- ID_OUI_FROM_DATABASE=Eventide
+OUI:0008EB*
+ ID_OUI_FROM_DATABASE=ROMWin Co.,Ltd.
 
-OUI:0015EE*
- ID_OUI_FROM_DATABASE=Omnex Control Systems
+OUI:0008E4*
+ ID_OUI_FROM_DATABASE=Envenergy Inc
 
-OUI:0015F3*
- ID_OUI_FROM_DATABASE=PELTOR AB
+OUI:0008DF*
+ ID_OUI_FROM_DATABASE=Alistel Inc.
 
-OUI:0015E7*
- ID_OUI_FROM_DATABASE=Quantec Tontechnik
+OUI:0008D8*
+ ID_OUI_FROM_DATABASE=Dowkey Microwave
 
-OUI:0015E2*
- ID_OUI_FROM_DATABASE=Dr.Ing. Herbert Knauer GmbH
+OUI:0008D2*
+ ID_OUI_FROM_DATABASE=ZOOM Networks Inc.
+
+OUI:0008CC*
+ ID_OUI_FROM_DATABASE=Remotec, Inc.
+
+OUI:0008D1*
+ ID_OUI_FROM_DATABASE=KAREL INC.
+
+OUI:000967*
+ ID_OUI_FROM_DATABASE=Tachyon, Inc
 
-OUI:0015DD*
- ID_OUI_FROM_DATABASE=IP Control Systems Ltd.
+OUI:00096E*
+ ID_OUI_FROM_DATABASE=GIANT ELECTRONICS LTD.
 
-OUI:0015D8*
- ID_OUI_FROM_DATABASE=Interlink Electronics
+OUI:00095E*
+ ID_OUI_FROM_DATABASE=Masstech Group Inc.
 
-OUI:0015CA*
- ID_OUI_FROM_DATABASE=TeraRecon, Inc.
+OUI:000959*
+ ID_OUI_FROM_DATABASE=Sitecsoft
 
-OUI:001598*
- ID_OUI_FROM_DATABASE=Kolektor group
+OUI:00094D*
+ ID_OUI_FROM_DATABASE=Braintree Communications Pty Ltd
 
-OUI:001593*
- ID_OUI_FROM_DATABASE=U4EA Technologies Inc.
+OUI:000952*
+ ID_OUI_FROM_DATABASE=Auerswald GmbH & Co. KG
 
-OUI:00158C*
- ID_OUI_FROM_DATABASE=Liab ApS
+OUI:000946*
+ ID_OUI_FROM_DATABASE=Cluster Labs GmbH
 
-OUI:001586*
- ID_OUI_FROM_DATABASE=Xiamen Overseas Chinese Electronic Co., Ltd.
+OUI:000940*
+ ID_OUI_FROM_DATABASE=AGFEO GmbH & Co. KG
 
-OUI:001585*
- ID_OUI_FROM_DATABASE=Aonvision Technolopy Corp.
+OUI:00093F*
+ ID_OUI_FROM_DATABASE=Double-Win Enterpirse CO., LTD
 
-OUI:001587*
- ID_OUI_FROM_DATABASE=Takenaka Seisakusho Co.,Ltd
+OUI:000933*
+ ID_OUI_FROM_DATABASE=Ophit Co.Ltd.
 
-OUI:001580*
- ID_OUI_FROM_DATABASE=U-WAY CORPORATION
+OUI:000A5C*
+ ID_OUI_FROM_DATABASE=Carel s.p.a.
 
-OUI:00157B*
- ID_OUI_FROM_DATABASE=Leuze electronic GmbH + Co. KG
+OUI:000A50*
+ ID_OUI_FROM_DATABASE=REMOTEK CORPORATION
 
-OUI:001576*
- ID_OUI_FROM_DATABASE=LABiTec - Labor Biomedical Technologies GmbH
+OUI:000A55*
+ ID_OUI_FROM_DATABASE=MARKEM Corporation
 
-OUI:00156A*
- ID_OUI_FROM_DATABASE=DG2L Technologies Pvt. Ltd.
+OUI:000A4E*
+ ID_OUI_FROM_DATABASE=UNITEK Electronics INC.
 
-OUI:00156F*
- ID_OUI_FROM_DATABASE=Xiranet Communications GmbH
+OUI:000A42*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0016DF*
- ID_OUI_FROM_DATABASE=Lundinova AB
+OUI:000A49*
+ ID_OUI_FROM_DATABASE=F5 Networks, Inc.
 
-OUI:0016DA*
- ID_OUI_FROM_DATABASE=Futronic Technology Co. Ltd.
+OUI:000A36*
+ ID_OUI_FROM_DATABASE=Synelec Telecom Multimedia
 
-OUI:0016D5*
- ID_OUI_FROM_DATABASE=Synccom Co., Ltd
+OUI:000A3B*
+ ID_OUI_FROM_DATABASE=GCT Semiconductor, Inc
 
-OUI:0016C9*
- ID_OUI_FROM_DATABASE=NAT Seattle, Inc.
+OUI:000A3D*
+ ID_OUI_FROM_DATABASE=Elo Sistemas Eletronicos S.A.
 
-OUI:0016D0*
- ID_OUI_FROM_DATABASE=ATech elektronika d.o.o.
+OUI:000A2F*
+ ID_OUI_FROM_DATABASE=Artnix Inc.
 
-OUI:0016BD*
- ID_OUI_FROM_DATABASE=ATI Industrial Automation
+OUI:000927*
+ ID_OUI_FROM_DATABASE=TOYOKEIKI CO.,LTD.
 
-OUI:0016C2*
- ID_OUI_FROM_DATABASE=Avtec Systems Inc
+OUI:00092E*
+ ID_OUI_FROM_DATABASE=B&Tech System Inc.
 
-OUI:0016BB*
- ID_OUI_FROM_DATABASE=Law-Chain Computer Technology Co Ltd
+OUI:000920*
+ ID_OUI_FROM_DATABASE=EpoX COMPUTER CO.,LTD.
 
-OUI:00162A*
- ID_OUI_FROM_DATABASE=Antik computers & communications s.r.o.
+OUI:00091B*
+ ID_OUI_FROM_DATABASE=Digital Generation Inc.
 
-OUI:001623*
- ID_OUI_FROM_DATABASE=Interval Media
+OUI:000914*
+ ID_OUI_FROM_DATABASE=COMPUTROLS INC.
 
-OUI:001617*
- ID_OUI_FROM_DATABASE=MSI
+OUI:00090E*
+ ID_OUI_FROM_DATABASE=Helix Technology Inc.
 
-OUI:00161E*
- ID_OUI_FROM_DATABASE=Woojinnet
+OUI:000908*
+ ID_OUI_FROM_DATABASE=VTech Technology Corp.
 
-OUI:00160D*
- ID_OUI_FROM_DATABASE=Be Here Corporation
+OUI:00090D*
+ ID_OUI_FROM_DATABASE=LEADER ELECTRONICS CORP.
 
-OUI:001606*
- ID_OUI_FROM_DATABASE=Ideal Industries
+OUI:000A20*
+ ID_OUI_FROM_DATABASE=SVA Networks, Inc.
 
-OUI:0015FA*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000A25*
+ ID_OUI_FROM_DATABASE=CERAGON NETWORKS
 
-OUI:001563*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000A14*
+ ID_OUI_FROM_DATABASE=TECO a.s.
 
-OUI:001557*
- ID_OUI_FROM_DATABASE=Olivetti
+OUI:000A19*
+ ID_OUI_FROM_DATABASE=Valere Power, Inc.
 
-OUI:00155C*
- ID_OUI_FROM_DATABASE=Dresser Wayne
+OUI:000A0D*
+ ID_OUI_FROM_DATABASE=FCI Deutschland GmbH
 
-OUI:00154B*
- ID_OUI_FROM_DATABASE=Wonde Proud Technology Co., Ltd
+OUI:000A12*
+ ID_OUI_FROM_DATABASE=Azylex Technology, Inc
 
-OUI:001550*
- ID_OUI_FROM_DATABASE=Nits Technology Inc
+OUI:0009F9*
+ ID_OUI_FROM_DATABASE=ART JAPAN CO., LTD.
 
-OUI:001545*
- ID_OUI_FROM_DATABASE=SEECODE Co., Ltd.
+OUI:0009FC*
+ ID_OUI_FROM_DATABASE=IPFLEX Inc.
 
-OUI:00153E*
- ID_OUI_FROM_DATABASE=Q-Matic Sweden AB
+OUI:000A03*
+ ID_OUI_FROM_DATABASE=ENDESA SERVICIOS, S.L.
 
-OUI:0015BC*
- ID_OUI_FROM_DATABASE=Develco
+OUI:000705*
+ ID_OUI_FROM_DATABASE=Endress & Hauser GmbH & Co
 
-OUI:0015B5*
- ID_OUI_FROM_DATABASE=CI Network Corp.
+OUI:0006F8*
+ ID_OUI_FROM_DATABASE=The Boeing Company
 
-OUI:0015B0*
- ID_OUI_FROM_DATABASE=AUTOTELENET CO.,LTD
+OUI:0006FF*
+ ID_OUI_FROM_DATABASE=Sheba Systems Co., Ltd.
 
-OUI:0015AB*
- ID_OUI_FROM_DATABASE=PRO CO SOUND INC
+OUI:0006FD*
+ ID_OUI_FROM_DATABASE=Comjet Information Systems Corp.
 
-OUI:0015A6*
- ID_OUI_FROM_DATABASE=Digital Electronics Products Ltd.
+OUI:0006E7*
+ ID_OUI_FROM_DATABASE=Bit Blitz Communications Inc.
 
-OUI:00159F*
- ID_OUI_FROM_DATABASE=Terascala, Inc.
+OUI:0006ED*
+ ID_OUI_FROM_DATABASE=Inara Networks
 
-OUI:001532*
- ID_OUI_FROM_DATABASE=Consumer Technologies Group, LLC
+OUI:0006DC*
+ ID_OUI_FROM_DATABASE=Syabas Technology (Amquest)
 
-OUI:001539*
- ID_OUI_FROM_DATABASE=Technodrive srl
+OUI:0006E1*
+ ID_OUI_FROM_DATABASE=Techno Trade s.a
 
-OUI:00152B*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0006E6*
+ ID_OUI_FROM_DATABASE=DongYang Telecom Co., Ltd.
 
-OUI:00152D*
- ID_OUI_FROM_DATABASE=TenX Networks, LLC
+OUI:0006CF*
+ ID_OUI_FROM_DATABASE=Thales Avionics In-Flight Systems, LLC
 
-OUI:00152C*
+OUI:0006D6*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00151F*
- ID_OUI_FROM_DATABASE=Multivision Intelligent Surveillance (Hong Kong) Ltd
-
-OUI:001526*
- ID_OUI_FROM_DATABASE=Remote Technologies Inc
+OUI:0006D5*
+ ID_OUI_FROM_DATABASE=Diamond Systems Corp.
 
-OUI:00151A*
- ID_OUI_FROM_DATABASE=Hunter Engineering Company
+OUI:0006C9*
+ ID_OUI_FROM_DATABASE=Technical Marketing Research, Inc.
 
-OUI:001515*
- ID_OUI_FROM_DATABASE=Leipold+Co.GmbH
+OUI:0007B1*
+ ID_OUI_FROM_DATABASE=Equator Technologies
 
-OUI:001510*
- ID_OUI_FROM_DATABASE=Techsphere Co., Ltd
+OUI:0007B8*
+ ID_OUI_FROM_DATABASE=Corvalent Corporation
 
-OUI:001453*
- ID_OUI_FROM_DATABASE=ADVANTECH TECHNOLOGIES CO.,LTD
+OUI:0007B2*
+ ID_OUI_FROM_DATABASE=Transaccess S.A.
 
-OUI:00144E*
- ID_OUI_FROM_DATABASE=SRISA
+OUI:0007A4*
+ ID_OUI_FROM_DATABASE=GN Netcom Ltd.
 
-OUI:001442*
- ID_OUI_FROM_DATABASE=ATTO CORPORATION
+OUI:0007AA*
+ ID_OUI_FROM_DATABASE=Quantum Data Inc.
 
-OUI:001449*
- ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
+OUI:00079D*
+ ID_OUI_FROM_DATABASE=Musashi Co., Ltd.
 
-OUI:00143D*
- ID_OUI_FROM_DATABASE=Aevoe Inc.
+OUI:00079E*
+ ID_OUI_FROM_DATABASE=Ilinx Co., Ltd.
 
-OUI:00143C*
- ID_OUI_FROM_DATABASE=Rheinmetall Canada Inc.
+OUI:000774*
+ ID_OUI_FROM_DATABASE=GuangZhou Thinker Technology Co. Ltd.
 
-OUI:00143B*
- ID_OUI_FROM_DATABASE=Sensovation AG
+OUI:000791*
+ ID_OUI_FROM_DATABASE=International Data Communications, Inc.
 
-OUI:001436*
- ID_OUI_FROM_DATABASE=Qwerty Elektronik AB
+OUI:000798*
+ ID_OUI_FROM_DATABASE=Selea SRL
 
-OUI:0014AB*
- ID_OUI_FROM_DATABASE=Senhai Electronic Technology Co., Ltd.
+OUI:000797*
+ ID_OUI_FROM_DATABASE=Netpower Co., Ltd.
 
-OUI:0014B0*
- ID_OUI_FROM_DATABASE=Naeil Community
+OUI:00078B*
+ ID_OUI_FROM_DATABASE=Wegener Communications, Inc.
 
-OUI:0014A9*
+OUI:000785*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0014AA*
- ID_OUI_FROM_DATABASE=Ashly Audio, Inc.
+OUI:00077B*
+ ID_OUI_FROM_DATABASE=Millimetrix Broadband Networks
 
-OUI:00149D*
- ID_OUI_FROM_DATABASE=Sound ID Inc.
+OUI:000856*
+ ID_OUI_FROM_DATABASE=Gamatronic Electronic Industries Ltd.
 
-OUI:001498*
- ID_OUI_FROM_DATABASE=Viking Design Technology
+OUI:00082D*
+ ID_OUI_FROM_DATABASE=Indus Teqsite Private Limited
 
-OUI:00148A*
- ID_OUI_FROM_DATABASE=Elin Ebg Traction Gmbh
+OUI:000821*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001491*
- ID_OUI_FROM_DATABASE=Daniels Electronics Ltd. dbo Codan Rado Communications
+OUI:000814*
+ ID_OUI_FROM_DATABASE=TIL Technologies
 
-OUI:001485*
- ID_OUI_FROM_DATABASE=Giga-Byte
+OUI:00081A*
+ ID_OUI_FROM_DATABASE=Sanrad Intelligence Storage Communications (2000) Ltd.
 
-OUI:00147E*
- ID_OUI_FROM_DATABASE=InnerWireless
+OUI:00080F*
+ ID_OUI_FROM_DATABASE=Proximion Fiber Optics AB
 
-OUI:001477*
- ID_OUI_FROM_DATABASE=Nertec  Inc.
+OUI:000809*
+ ID_OUI_FROM_DATABASE=Systemonic AG
 
-OUI:001472*
- ID_OUI_FROM_DATABASE=China Broadband Wireless IP Standard Group
+OUI:000803*
+ ID_OUI_FROM_DATABASE=Cos Tron
 
-OUI:001466*
- ID_OUI_FROM_DATABASE=Kleinhenz Elektronik GmbH
+OUI:0007FF*
+ ID_OUI_FROM_DATABASE=Gluon Networks
 
-OUI:00146B*
- ID_OUI_FROM_DATABASE=Anagran, Inc.
+OUI:0007F9*
+ ID_OUI_FROM_DATABASE=Sensaphone
 
-OUI:00145F*
- ID_OUI_FROM_DATABASE=ADITEC CO. LTD
+OUI:000894*
+ ID_OUI_FROM_DATABASE=InnoVISION Multimedia Ltd.
 
-OUI:001458*
- ID_OUI_FROM_DATABASE=HS Automatic ApS
+OUI:00088F*
+ ID_OUI_FROM_DATABASE=ADVANCED DIGITAL TECHNOLOGY
 
-OUI:0014E6*
- ID_OUI_FROM_DATABASE=AIM Infrarotmodule GmbH
+OUI:000888*
+ ID_OUI_FROM_DATABASE=OULLIM Information Technology Inc,.
 
-OUI:0014E0*
- ID_OUI_FROM_DATABASE=LET'S Corporation
+OUI:000882*
+ ID_OUI_FROM_DATABASE=SIGMA CORPORATION
 
-OUI:0014D4*
- ID_OUI_FROM_DATABASE=K Technology Corporation
+OUI:00087C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0014D9*
- ID_OUI_FROM_DATABASE=IP Fabrics, Inc.
+OUI:000875*
+ ID_OUI_FROM_DATABASE=Acorp Electronics Corp.
 
-OUI:0014CD*
- ID_OUI_FROM_DATABASE=DigitalZone Co., Ltd.
+OUI:000870*
+ ID_OUI_FROM_DATABASE=Rasvia Systems, Inc.
 
-OUI:0014C1*
- ID_OUI_FROM_DATABASE=U.S. Robotics Corporation
+OUI:00086F*
+ ID_OUI_FROM_DATABASE=Resources Computer Network Ltd.
 
-OUI:0014C6*
- ID_OUI_FROM_DATABASE=Quixant Ltd
+OUI:000869*
+ ID_OUI_FROM_DATABASE=Command-e Technology Co.,Ltd.
 
-OUI:0014BA*
- ID_OUI_FROM_DATABASE=Carvers SA de CV
+OUI:000863*
+ ID_OUI_FROM_DATABASE=Entrisphere Inc.
 
-OUI:0014B5*
- ID_OUI_FROM_DATABASE=PHYSIOMETRIX,INC
+OUI:00085D*
+ ID_OUI_FROM_DATABASE=Aastra
 
-OUI:0013C7*
- ID_OUI_FROM_DATABASE=IONOS Co.,Ltd.
+OUI:000862*
+ ID_OUI_FROM_DATABASE=NEC Eluminant Technologies, Inc.
 
-OUI:0013C0*
- ID_OUI_FROM_DATABASE=Trix Tecnologia Ltda.
+OUI:000850*
+ ID_OUI_FROM_DATABASE=Arizona Instrument Corp.
 
-OUI:0013B6*
- ID_OUI_FROM_DATABASE=Sling Media, Inc.
+OUI:000738*
+ ID_OUI_FROM_DATABASE=Young Technology Co., Ltd.
 
-OUI:0013AF*
- ID_OUI_FROM_DATABASE=NUMA Technology,Inc.
+OUI:00073F*
+ ID_OUI_FROM_DATABASE=Woojyun Systec Co., Ltd.
 
-OUI:0013B0*
- ID_OUI_FROM_DATABASE=Jablotron
+OUI:00072C*
+ ID_OUI_FROM_DATABASE=Fabricom
 
-OUI:0013AA*
- ID_OUI_FROM_DATABASE=ALS  & TEC Ltd.
+OUI:000733*
+ ID_OUI_FROM_DATABASE=DANCONTROL Engineering
 
-OUI:0013A3*
- ID_OUI_FROM_DATABASE=Siemens Com CPE Devices
+OUI:000732*
+ ID_OUI_FROM_DATABASE=AAEON Technology Inc.
 
-OUI:00139E*
- ID_OUI_FROM_DATABASE=Ciara Technologies Inc.
+OUI:000716*
+ ID_OUI_FROM_DATABASE=J & S Marine Ltd.
 
-OUI:001502*
- ID_OUI_FROM_DATABASE=BETA tech
+OUI:00071B*
+ ID_OUI_FROM_DATABASE=CDVI Americas Ltd
 
-OUI:001509*
- ID_OUI_FROM_DATABASE=Plus Technology Co., Ltd
+OUI:000722*
+ ID_OUI_FROM_DATABASE=The Nielsen Company
 
-OUI:0014FD*
- ID_OUI_FROM_DATABASE=Thecus Technology Corp.
+OUI:00070A*
+ ID_OUI_FROM_DATABASE=Unicom Automation Co., Ltd.
 
-OUI:0014EF*
- ID_OUI_FROM_DATABASE=TZero Technologies, Inc.
+OUI:00070F*
+ ID_OUI_FROM_DATABASE=Fujant, Inc.
 
-OUI:0014F1*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000709*
+ ID_OUI_FROM_DATABASE=Westerstrand Urfabrik AB
 
-OUI:0014F0*
- ID_OUI_FROM_DATABASE=Business Security OL AB
+OUI:000702*
+ ID_OUI_FROM_DATABASE=Varian Medical Systems
 
-OUI:0014EA*
- ID_OUI_FROM_DATABASE=S Digm Inc. (Safe Paradigm Inc.)
+OUI:0006F3*
+ ID_OUI_FROM_DATABASE=AcceLight Networks
 
-OUI:0014E5*
- ID_OUI_FROM_DATABASE=Alticast
+OUI:0006C3*
+ ID_OUI_FROM_DATABASE=Schindler Elevator Ltd.
 
-OUI:001423*
- ID_OUI_FROM_DATABASE=J-S Co. NEUROCOM
+OUI:0006C8*
+ ID_OUI_FROM_DATABASE=Sumitomo Metal Micro Devices, Inc.
 
-OUI:001419*
- ID_OUI_FROM_DATABASE=SIDSA
+OUI:0006BF*
+ ID_OUI_FROM_DATABASE=Accella Technologies Co., Ltd.
 
-OUI:001412*
- ID_OUI_FROM_DATABASE=S-TEC electronics AG
+OUI:0006B9*
+ ID_OUI_FROM_DATABASE=A5TEK Corp.
 
-OUI:001409*
- ID_OUI_FROM_DATABASE=MAGNETI MARELLI   S.E. S.p.A.
+OUI:0006B2*
+ ID_OUI_FROM_DATABASE=Linxtek Co.
 
-OUI:00140A*
- ID_OUI_FROM_DATABASE=WEPIO Co., Ltd.
+OUI:0006AC*
+ ID_OUI_FROM_DATABASE=Intersoft Co.
 
-OUI:0013FD*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:0006A6*
+ ID_OUI_FROM_DATABASE=Artistic Licence Engineering Ltd
 
-OUI:0013F8*
- ID_OUI_FROM_DATABASE=Dex Security Solutions
+OUI:0006A2*
+ ID_OUI_FROM_DATABASE=Microtune, Inc.
 
-OUI:0013F1*
- ID_OUI_FROM_DATABASE=AMOD Technology Co., Ltd.
+OUI:000695*
+ ID_OUI_FROM_DATABASE=Ensure Technologies, Inc.
 
-OUI:0013F7*
- ID_OUI_FROM_DATABASE=SMC Networks, Inc.
+OUI:00069C*
+ ID_OUI_FROM_DATABASE=Transmode Systems AB
 
-OUI:0013E7*
- ID_OUI_FROM_DATABASE=Halcro
+OUI:000696*
+ ID_OUI_FROM_DATABASE=Advent Networks
 
-OUI:0013DB*
- ID_OUI_FROM_DATABASE=SHOEI Electric Co.,Ltd
+OUI:0007F3*
+ ID_OUI_FROM_DATABASE=Thinkengine Networks
 
-OUI:0013CC*
- ID_OUI_FROM_DATABASE=Tall Maple Systems
+OUI:0007EC*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001284*
- ID_OUI_FROM_DATABASE=Lab33 Srl
+OUI:0007F2*
+ ID_OUI_FROM_DATABASE=IOA Corporation
 
-OUI:00127E*
- ID_OUI_FROM_DATABASE=Digital Lifestyles Group, Inc.
+OUI:0007E6*
+ ID_OUI_FROM_DATABASE=edgeflow Canada Inc.
 
-OUI:001277*
- ID_OUI_FROM_DATABASE=Korenix Technologies Co., Ltd.
+OUI:0007E0*
+ ID_OUI_FROM_DATABASE=Palm Inc.
 
-OUI:001272*
- ID_OUI_FROM_DATABASE=Redux Communications Ltd.
+OUI:0007D9*
+ ID_OUI_FROM_DATABASE=Splicecom
 
-OUI:001271*
- ID_OUI_FROM_DATABASE=Measurement Computing Corp
+OUI:0007DA*
+ ID_OUI_FROM_DATABASE=Neuro Telecom Co., Ltd.
 
-OUI:00126B*
- ID_OUI_FROM_DATABASE=Ascalade Communications Limited
+OUI:0007D3*
+ ID_OUI_FROM_DATABASE=SPGPrints B.V.
 
-OUI:001264*
- ID_OUI_FROM_DATABASE=daum electronic gmbh
+OUI:0007CA*
+ ID_OUI_FROM_DATABASE=Creatix Polymedia Ges Fur Kommunikaitonssysteme
 
-OUI:00125A*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:0007C4*
+ ID_OUI_FROM_DATABASE=JEAN Co. Ltd.
 
-OUI:00125F*
- ID_OUI_FROM_DATABASE=AWIND Inc.
+OUI:0007BE*
+ ID_OUI_FROM_DATABASE=DataLogic SpA
 
-OUI:001255*
- ID_OUI_FROM_DATABASE=NetEffect Incorporated
+OUI:00077E*
+ ID_OUI_FROM_DATABASE=Elrest GmbH
 
-OUI:00124E*
- ID_OUI_FROM_DATABASE=XAC AUTOMATION CORP.
+OUI:00076F*
+ ID_OUI_FROM_DATABASE=Synoptics Limited
 
-OUI:001248*
- ID_OUI_FROM_DATABASE=EMC Corporation (Kashya)
+OUI:00076E*
+ ID_OUI_FROM_DATABASE=Sinetica Corporation Limited
 
-OUI:001242*
- ID_OUI_FROM_DATABASE=Millennial Net
+OUI:00076A*
+ ID_OUI_FROM_DATABASE=NEXTEYE Co., Ltd.
 
-OUI:001236*
- ID_OUI_FROM_DATABASE=ConSentry Networks
+OUI:00075E*
+ ID_OUI_FROM_DATABASE=Ametek Power Instruments
 
-OUI:00123B*
- ID_OUI_FROM_DATABASE=KeRo Systems ApS
+OUI:000765*
+ ID_OUI_FROM_DATABASE=Jade Quantum Technologies, Inc.
 
-OUI:001368*
- ID_OUI_FROM_DATABASE=Saab Danmark A/S
+OUI:000764*
+ ID_OUI_FROM_DATABASE=YoungWoo Telecom Co. Ltd.
 
-OUI:00135C*
- ID_OUI_FROM_DATABASE=OnSite Systems, Inc.
+OUI:000757*
+ ID_OUI_FROM_DATABASE=Topcall International AG
 
-OUI:001355*
- ID_OUI_FROM_DATABASE=TOMEN Cyber-business Solutions, Inc.
+OUI:000758*
+ ID_OUI_FROM_DATABASE=Dragonwave
 
-OUI:001356*
- ID_OUI_FROM_DATABASE=FLIR Radiation Inc
+OUI:000752*
+ ID_OUI_FROM_DATABASE=Rhythm Watch Co., Ltd.
 
-OUI:001350*
- ID_OUI_FROM_DATABASE=Silver Spring Networks, Inc
+OUI:00074B*
+ ID_OUI_FROM_DATABASE=Daihen Corporation
 
-OUI:001344*
- ID_OUI_FROM_DATABASE=Fargo Electronics Inc.
+OUI:000745*
+ ID_OUI_FROM_DATABASE=Radlan Computer Communications Ltd.
 
-OUI:001343*
- ID_OUI_FROM_DATABASE=Matsushita Electronic Components (Europe) GmbH
+OUI:0008C2*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00133D*
- ID_OUI_FROM_DATABASE=Micro Memory Curtiss Wright Co
+OUI:0008BB*
+ ID_OUI_FROM_DATABASE=NetExcell
 
-OUI:00139D*
- ID_OUI_FROM_DATABASE=Marvell Hispana S.L.
+OUI:0008B5*
+ ID_OUI_FROM_DATABASE=TAI GUEN ENTERPRISE CO., LTD
 
-OUI:00138B*
- ID_OUI_FROM_DATABASE=Phantom Technologies LLC
+OUI:0008B6*
+ ID_OUI_FROM_DATABASE=RouteFree, Inc.
 
-OUI:001390*
- ID_OUI_FROM_DATABASE=Termtek Computer Co., Ltd
+OUI:0008AF*
+ ID_OUI_FROM_DATABASE=Novatec Corporation
 
-OUI:001376*
- ID_OUI_FROM_DATABASE=Tabor Electronics Ltd.
+OUI:0008A9*
+ ID_OUI_FROM_DATABASE=SangSang Technology, Inc.
 
-OUI:00137B*
- ID_OUI_FROM_DATABASE=Movon Corporation
+OUI:0008A8*
+ ID_OUI_FROM_DATABASE=Systec Co., Ltd.
 
-OUI:001382*
- ID_OUI_FROM_DATABASE=Cetacea Networks Corporation
+OUI:0008A3*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001387*
- ID_OUI_FROM_DATABASE=27M Technologies AB
+OUI:00089C*
+ ID_OUI_FROM_DATABASE=Elecs Industry Co., Ltd.
 
-OUI:00136F*
- ID_OUI_FROM_DATABASE=PacketMotion, Inc.
+OUI:000690*
+ ID_OUI_FROM_DATABASE=Euracom Communication GmbH
 
-OUI:001375*
- ID_OUI_FROM_DATABASE=American Security Products Co.
+OUI:00068F*
+ ID_OUI_FROM_DATABASE=Telemonitor, Inc.
 
-OUI:001363*
- ID_OUI_FROM_DATABASE=Verascape, Inc.
+OUI:000689*
+ ID_OUI_FROM_DATABASE=yLez Technologies Pte Ltd
 
-OUI:0012FA*
- ID_OUI_FROM_DATABASE=THX LTD
+OUI:000683*
+ ID_OUI_FROM_DATABASE=Bravara Communications, Inc.
 
-OUI:001301*
- ID_OUI_FROM_DATABASE=IronGate S.L.
+OUI:00D0B9*
+ ID_OUI_FROM_DATABASE=MICROTEK INTERNATIONAL, INC.
 
-OUI:001307*
- ID_OUI_FROM_DATABASE=Paravirtual Corporation
+OUI:00067D*
+ ID_OUI_FROM_DATABASE=Takasago Ltd.
 
-OUI:0012F5*
- ID_OUI_FROM_DATABASE=Imarda New Zealand Limited
+OUI:000675*
+ ID_OUI_FROM_DATABASE=Banderacom, Inc.
 
-OUI:0012EB*
- ID_OUI_FROM_DATABASE=PDH Solutions, LLC
+OUI:000679*
+ ID_OUI_FROM_DATABASE=Konami Corporation
 
-OUI:0012DE*
- ID_OUI_FROM_DATABASE=Radio Components Sweden AB
+OUI:000663*
+ ID_OUI_FROM_DATABASE=Human Technology Co., Ltd.
 
-OUI:0012DD*
- ID_OUI_FROM_DATABASE=Shengqu Information Technology (Shanghai) Co., Ltd.
+OUI:00066F*
+ ID_OUI_FROM_DATABASE=Korea Data Systems
 
-OUI:0012E4*
- ID_OUI_FROM_DATABASE=ZIEHL industrie-electronik GmbH + Co KG
+OUI:000662*
+ ID_OUI_FROM_DATABASE=MBM Technology Ltd.
 
-OUI:0012AF*
- ID_OUI_FROM_DATABASE=ELPRO Technologies
+OUI:000669*
+ ID_OUI_FROM_DATABASE=Datasound Laboratories Ltd
 
-OUI:0012A8*
- ID_OUI_FROM_DATABASE=intec GmbH
+OUI:00055A*
+ ID_OUI_FROM_DATABASE=Power Dsine Ltd.
 
-OUI:0012A2*
- ID_OUI_FROM_DATABASE=VITA
+OUI:00065C*
+ ID_OUI_FROM_DATABASE=Malachite Technologies, Inc.
 
-OUI:0012A1*
- ID_OUI_FROM_DATABASE=BluePacket Communications Co., Ltd.
+OUI:000610*
+ ID_OUI_FROM_DATABASE=Abeona Networks Inc
 
-OUI:00129C*
- ID_OUI_FROM_DATABASE=Yulinet
+OUI:000616*
+ ID_OUI_FROM_DATABASE=Tel Net Co., Ltd.
 
-OUI:001290*
- ID_OUI_FROM_DATABASE=KYOWA Electric & Machinery Corp.
+OUI:00060A*
+ ID_OUI_FROM_DATABASE=Blue2space
 
-OUI:001295*
- ID_OUI_FROM_DATABASE=Aiware Inc.
+OUI:000604*
+ ID_OUI_FROM_DATABASE=@Track Communications, Inc.
 
-OUI:00132A*
- ID_OUI_FROM_DATABASE=Sitronics Telecom Solutions
+OUI:00CBBD*
+ ID_OUI_FROM_DATABASE=Cambridge Broadband Networks Ltd.
 
-OUI:001331*
- ID_OUI_FROM_DATABASE=CellPoint Connect
+OUI:000603*
+ ID_OUI_FROM_DATABASE=Baker Hughes Inc.
 
-OUI:001336*
- ID_OUI_FROM_DATABASE=Tianjin 712 Communication Broadcasting co., ltd.
+OUI:A06A00*
+ ID_OUI_FROM_DATABASE=Verilink Corporation
 
-OUI:001324*
- ID_OUI_FROM_DATABASE=Schneider Electric Ultra Terminal
+OUI:0005F5*
+ ID_OUI_FROM_DATABASE=Geospace Technologies
 
-OUI:001314*
- ID_OUI_FROM_DATABASE=Asiamajor Inc.
+OUI:000601*
+ ID_OUI_FROM_DATABASE=Otanikeiki Co., Ltd.
 
-OUI:001319*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0005E8*
+ ID_OUI_FROM_DATABASE=TurboWave, Inc.
 
-OUI:00131A*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0005F4*
+ ID_OUI_FROM_DATABASE=System Base Co., Ltd.
 
-OUI:00130D*
- ID_OUI_FROM_DATABASE=GALILEO AVIONICA
+OUI:0005FB*
+ ID_OUI_FROM_DATABASE=ShareGate, Inc.
 
-OUI:001308*
- ID_OUI_FROM_DATABASE=Nuvera Fuel Cells
+OUI:0005DB*
+ ID_OUI_FROM_DATABASE=PSI Nentec GmbH
 
-OUI:00122F*
- ID_OUI_FROM_DATABASE=Sanei Electric Inc.
+OUI:0005DF*
+ ID_OUI_FROM_DATABASE=Electronic Innovation, Inc.
 
-OUI:001235*
- ID_OUI_FROM_DATABASE=Andrew Corporation
+OUI:0005CF*
+ ID_OUI_FROM_DATABASE=Thunder River Technologies, Inc.
 
-OUI:00122B*
- ID_OUI_FROM_DATABASE=Virbiage Pty Ltd
+OUI:0005C9*
+ ID_OUI_FROM_DATABASE=LG Innotek Co., Ltd.
 
-OUI:001212*
- ID_OUI_FROM_DATABASE=PLUS  Corporation
+OUI:0005D5*
+ ID_OUI_FROM_DATABASE=Speedcom Wireless
 
-OUI:001219*
- ID_OUI_FROM_DATABASE=Ahead Communication Systems Inc
+OUI:0005BC*
+ ID_OUI_FROM_DATABASE=Resource Data Management Ltd
 
-OUI:0012D8*
- ID_OUI_FROM_DATABASE=International Games System Co., Ltd.
+OUI:0005C2*
+ ID_OUI_FROM_DATABASE=Soronti, Inc.
 
-OUI:0012CB*
- ID_OUI_FROM_DATABASE=CSS Inc.
+OUI:0005B0*
+ ID_OUI_FROM_DATABASE=Korea Computer Technology Co., Ltd.
 
-OUI:0012C5*
- ID_OUI_FROM_DATABASE=V-Show  Technology (China) Co.,Ltd
+OUI:00059C*
+ ID_OUI_FROM_DATABASE=Kleinknecht GmbH, Ing. Büro
 
-OUI:0012CC*
- ID_OUI_FROM_DATABASE=Bitatek CO., LTD
+OUI:0005B6*
+ ID_OUI_FROM_DATABASE=INSYS Microelectronics GmbH
 
-OUI:0012B4*
- ID_OUI_FROM_DATABASE=Work Microwave GmbH
+OUI:0005A2*
+ ID_OUI_FROM_DATABASE=CELOX Networks
 
-OUI:0012BB*
- ID_OUI_FROM_DATABASE=Telecommunications Industry Association TR-41 Committee
+OUI:0005AC*
+ ID_OUI_FROM_DATABASE=Northern Digital, Inc.
 
-OUI:001206*
- ID_OUI_FROM_DATABASE=iQuest (NZ) Ltd
+OUI:0004E5*
+ ID_OUI_FROM_DATABASE=Glonet Systems, Inc.
 
-OUI:00120B*
- ID_OUI_FROM_DATABASE=Chinasys Technologies Limited
+OUI:0004D9*
+ ID_OUI_FROM_DATABASE=Titan Electronics, Inc.
 
-OUI:00120C*
- ID_OUI_FROM_DATABASE=CE-Infosys Pte Ltd
+OUI:0004D3*
+ ID_OUI_FROM_DATABASE=Toyokeiki Co., Ltd.
 
-OUI:0011FF*
- ID_OUI_FROM_DATABASE=Digitro Tecnologia Ltda
+OUI:0004CC*
+ ID_OUI_FROM_DATABASE=Peek Traffic B.V.
 
-OUI:0011FA*
- ID_OUI_FROM_DATABASE=Rane Corporation
+OUI:0004C0*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0011F0*
- ID_OUI_FROM_DATABASE=Wideful Limited
+OUI:0004B9*
+ ID_OUI_FROM_DATABASE=S.I. Soubou, Inc.
 
-OUI:0011EF*
- ID_OUI_FROM_DATABASE=Conitec Datensysteme GmbH
+OUI:0004BA*
+ ID_OUI_FROM_DATABASE=KDD Media Will Corporation
 
-OUI:0011E9*
- ID_OUI_FROM_DATABASE=STARNEX CO., LTD.
+OUI:0004AF*
+ ID_OUI_FROM_DATABASE=Digital Fountain, Inc.
 
-OUI:001187*
- ID_OUI_FROM_DATABASE=Category Solutions, Inc
+OUI:0004B4*
+ ID_OUI_FROM_DATABASE=CIAC
 
-OUI:001182*
- ID_OUI_FROM_DATABASE=IMI Norgren Ltd
+OUI:0004B3*
+ ID_OUI_FROM_DATABASE=Videotek, Inc.
 
-OUI:001181*
- ID_OUI_FROM_DATABASE=InterEnergy Co.Ltd,
+OUI:0004A6*
+ ID_OUI_FROM_DATABASE=SAF Tehnika Ltd.
 
-OUI:00117B*
- ID_OUI_FROM_DATABASE=Büchi  Labortechnik AG
+OUI:0004A0*
+ ID_OUI_FROM_DATABASE=Verity Instruments, Inc.
 
-OUI:00116F*
- ID_OUI_FROM_DATABASE=Netforyou Co., LTD.
+OUI:00050C*
+ ID_OUI_FROM_DATABASE=Network Photonics, Inc.
 
-OUI:001168*
- ID_OUI_FROM_DATABASE=HomeLogic LLC
+OUI:000512*
+ ID_OUI_FROM_DATABASE=Zebra Technologies Inc
 
-OUI:00115E*
- ID_OUI_FROM_DATABASE=ProMinent Dosiertechnik GmbH
+OUI:000506*
+ ID_OUI_FROM_DATABASE=Reddo Networks AB
 
-OUI:001157*
- ID_OUI_FROM_DATABASE=Oki Electric Industry Co., Ltd.
+OUI:0004FC*
+ ID_OUI_FROM_DATABASE=Stratus Computer (DE), Inc.
 
-OUI:000FB2*
- ID_OUI_FROM_DATABASE=Broadband Pacenet (India) Pvt. Ltd.
+OUI:0004F6*
+ ID_OUI_FROM_DATABASE=Amphus
 
-OUI:000FA5*
- ID_OUI_FROM_DATABASE=BWA Technology GmbH
+OUI:0004F5*
+ ID_OUI_FROM_DATABASE=SnowShore Networks, Inc.
 
-OUI:000FB1*
- ID_OUI_FROM_DATABASE=Cognio Inc.
+OUI:0004E9*
+ ID_OUI_FROM_DATABASE=Infiniswitch Corporation
 
-OUI:000FAC*
- ID_OUI_FROM_DATABASE=IEEE 802.11
+OUI:0004F0*
+ ID_OUI_FROM_DATABASE=International Computers, Ltd
 
-OUI:000F9C*
- ID_OUI_FROM_DATABASE=Panduit Corp
+OUI:0004EF*
+ ID_OUI_FROM_DATABASE=Polestar Corp.
 
-OUI:000FA0*
- ID_OUI_FROM_DATABASE=CANON KOREA BUSINESS SOLUTIONS INC.
+OUI:0004DF*
+ ID_OUI_FROM_DATABASE=Teracom Telematica Ltda.
 
-OUI:000F97*
- ID_OUI_FROM_DATABASE=Avanex Corporation
+OUI:000553*
+ ID_OUI_FROM_DATABASE=DVC Company, Inc.
 
-OUI:000F8A*
- ID_OUI_FROM_DATABASE=WideView
+OUI:000548*
+ ID_OUI_FROM_DATABASE=Disco Corporation
 
-OUI:000F89*
- ID_OUI_FROM_DATABASE=Winnertec System Co., Ltd.
+OUI:00054D*
+ ID_OUI_FROM_DATABASE=Brans Technologies, Inc.
 
-OUI:000F90*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000542*
+ ID_OUI_FROM_DATABASE=Otari, Inc.
 
-OUI:000FD7*
- ID_OUI_FROM_DATABASE=Harman Music Group
+OUI:00053C*
+ ID_OUI_FROM_DATABASE=XIRCOM
 
-OUI:000FD1*
- ID_OUI_FROM_DATABASE=Applied Wireless Identifications Group, Inc.
+OUI:00052F*
+ ID_OUI_FROM_DATABASE=Leviton Network Solutions
 
-OUI:000FD2*
- ID_OUI_FROM_DATABASE=EWA Technologies, Inc.
+OUI:00053B*
+ ID_OUI_FROM_DATABASE=Harbour Networks Ltd., Co. Beijing
 
-OUI:000FC4*
- ID_OUI_FROM_DATABASE=NST co.,LTD.
+OUI:000535*
+ ID_OUI_FROM_DATABASE=Chip PC Ltd.
 
-OUI:000FCB*
- ID_OUI_FROM_DATABASE=3Com Ltd
+OUI:000529*
+ ID_OUI_FROM_DATABASE=Shanghai Broadan Communication Technology Co., Ltd
 
-OUI:000FBF*
- ID_OUI_FROM_DATABASE=DGT Sp. z o.o.
+OUI:000523*
+ ID_OUI_FROM_DATABASE=AVL List GmbH
 
-OUI:000FB8*
- ID_OUI_FROM_DATABASE=CallURL Inc.
+OUI:000522*
+ ID_OUI_FROM_DATABASE=LEA*D Corporation, Inc.
 
-OUI:0011DD*
- ID_OUI_FROM_DATABASE=FROMUS TEC. Co., Ltd.
+OUI:00051C*
+ ID_OUI_FROM_DATABASE=Xnet Technology Corp.
 
-OUI:0011E2*
- ID_OUI_FROM_DATABASE=Hua Jung Components Co., Ltd.
+OUI:000516*
+ ID_OUI_FROM_DATABASE=SMART Modular Technologies
 
-OUI:0011CF*
- ID_OUI_FROM_DATABASE=Thrane & Thrane A/S
+OUI:000650*
+ ID_OUI_FROM_DATABASE=Tiburon Networks, Inc.
 
-OUI:0011D6*
- ID_OUI_FROM_DATABASE=HandEra, Inc.
+OUI:000656*
+ ID_OUI_FROM_DATABASE=Tactel AB
 
-OUI:0011D0*
- ID_OUI_FROM_DATABASE=Tandberg Data ASA
+OUI:00062D*
+ ID_OUI_FROM_DATABASE=TouchStar Technologies, L.L.C.
 
-OUI:0011CA*
- ID_OUI_FROM_DATABASE=Long Range Systems, Inc.
+OUI:000649*
+ ID_OUI_FROM_DATABASE=3M Deutschland GmbH
 
-OUI:0011C3*
- ID_OUI_FROM_DATABASE=Transceiving System Technology Corporation
+OUI:000643*
+ ID_OUI_FROM_DATABASE=SONO Computer Co., Ltd.
 
-OUI:0011B7*
- ID_OUI_FROM_DATABASE=Octalix B.V.
+OUI:00064A*
+ ID_OUI_FROM_DATABASE=Honeywell Co., Ltd. (KOREA)
 
-OUI:0011BE*
- ID_OUI_FROM_DATABASE=AGP Telecom Co. Ltd
+OUI:00063F*
+ ID_OUI_FROM_DATABASE=Everex Communications Inc.
 
-OUI:0011BD*
- ID_OUI_FROM_DATABASE=Bombardier Transportation
+OUI:000639*
+ ID_OUI_FROM_DATABASE=Newtec
 
-OUI:001105*
- ID_OUI_FROM_DATABASE=Sunplus Technology Co., Ltd.
+OUI:000633*
+ ID_OUI_FROM_DATABASE=Cross Match Technologies GmbH
 
-OUI:00110C*
- ID_OUI_FROM_DATABASE=Atmark Techno, Inc.
+OUI:000626*
+ ID_OUI_FROM_DATABASE=MWE GmbH
 
-OUI:000FF9*
- ID_OUI_FROM_DATABASE=Valcretec, Inc.
+OUI:00061D*
+ ID_OUI_FROM_DATABASE=MIP Telecom, Inc.
 
-OUI:000FFA*
- ID_OUI_FROM_DATABASE=Optinel Systems, Inc.
+OUI:000623*
+ ID_OUI_FROM_DATABASE=MGE UPS Systems France
 
-OUI:000FFF*
- ID_OUI_FROM_DATABASE=Control4
+OUI:000589*
+ ID_OUI_FROM_DATABASE=National Datacomputer
 
-OUI:000FF1*
- ID_OUI_FROM_DATABASE=nex-G Systems Pte.Ltd
+OUI:000595*
+ ID_OUI_FROM_DATABASE=Alesis Corporation
 
-OUI:000FE4*
- ID_OUI_FROM_DATABASE=Pantech Co.,Ltd
+OUI:00058F*
+ ID_OUI_FROM_DATABASE=CLCsoft co.
 
-OUI:000FEA*
- ID_OUI_FROM_DATABASE=Giga-Byte Technology Co.,LTD.
+OUI:000596*
+ ID_OUI_FROM_DATABASE=Genotech Co., Ltd.
 
-OUI:000FE3*
- ID_OUI_FROM_DATABASE=Damm Cellular Systems A/S
+OUI:00057D*
+ ID_OUI_FROM_DATABASE=Sun Communications, Inc.
 
-OUI:0011AB*
- ID_OUI_FROM_DATABASE=TRUSTABLE TECHNOLOGY CO.,LTD.
+OUI:00057C*
+ ID_OUI_FROM_DATABASE=RCO Security AB
 
-OUI:0011B0*
- ID_OUI_FROM_DATABASE=Fortelink Inc.
+OUI:000583*
+ ID_OUI_FROM_DATABASE=ImageCom Limited
 
-OUI:0011A4*
- ID_OUI_FROM_DATABASE=JStream Technologies Inc.
+OUI:000573*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001198*
- ID_OUI_FROM_DATABASE=Prism Media Products Limited
+OUI:000572*
+ ID_OUI_FROM_DATABASE=Deonet Co., Ltd.
 
-OUI:00119D*
- ID_OUI_FROM_DATABASE=Diginfo Technology Corporation
+OUI:00056C*
+ ID_OUI_FROM_DATABASE=Hung Chang Co., Ltd.
 
-OUI:00119E*
- ID_OUI_FROM_DATABASE=Solectron Brazil
+OUI:000566*
+ ID_OUI_FROM_DATABASE=Secui.com Corporation
 
-OUI:00118E*
- ID_OUI_FROM_DATABASE=Halytech Mace
+OUI:000560*
+ ID_OUI_FROM_DATABASE=LEADER COMM.CO., LTD
 
-OUI:001193*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000559*
+ ID_OUI_FROM_DATABASE=Intracom S.A.
 
-OUI:001152*
- ID_OUI_FROM_DATABASE=Eidsvoll Electronics AS
+OUI:0004A5*
+ ID_OUI_FROM_DATABASE=Barco Projection Systems NV
 
-OUI:00114F*
- ID_OUI_FROM_DATABASE=US Digital Television, Inc
+OUI:000499*
+ ID_OUI_FROM_DATABASE=Chino Corporation
 
-OUI:001149*
- ID_OUI_FROM_DATABASE=Proliphix Inc.
+OUI:00048D*
+ ID_OUI_FROM_DATABASE=Teo Technologies, Inc
 
-OUI:001142*
- ID_OUI_FROM_DATABASE=e-SMARTCOM  INC.
+OUI:000493*
+ ID_OUI_FROM_DATABASE=Tsinghua Unisplendour Co., Ltd.
 
-OUI:00113D*
- ID_OUI_FROM_DATABASE=KN SOLTEC CO.,LTD.
+OUI:000484*
+ ID_OUI_FROM_DATABASE=Amann GmbH
 
-OUI:00113C*
- ID_OUI_FROM_DATABASE=Micronas GmbH
+OUI:00048A*
+ ID_OUI_FROM_DATABASE=Temia Vertriebs GmbH
 
-OUI:001136*
- ID_OUI_FROM_DATABASE=Goodrich Sensor Systems
+OUI:00047A*
+ ID_OUI_FROM_DATABASE=AXXESSIT ASA
 
-OUI:00112C*
- ID_OUI_FROM_DATABASE=IZT GmbH
+OUI:000474*
+ ID_OUI_FROM_DATABASE=LEGRAND
 
-OUI:001130*
- ID_OUI_FROM_DATABASE=Allied Telesis (Hong Kong) Ltd.
+OUI:00046E*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00111E*
- ID_OUI_FROM_DATABASE=EPSG (Ethernet Powerlink Standardization Group)
+OUI:000473*
+ ID_OUI_FROM_DATABASE=Photonex Corporation
 
-OUI:00111F*
- ID_OUI_FROM_DATABASE=Doremi Labs, Inc.
+OUI:000467*
+ ID_OUI_FROM_DATABASE=Wuhan Research Institute of MII
 
-OUI:001112*
- ID_OUI_FROM_DATABASE=Honeywell CMSS
+OUI:000461*
+ ID_OUI_FROM_DATABASE=EPOX Computer Co., Ltd.
 
-OUI:001118*
- ID_OUI_FROM_DATABASE=BLX IC Design Corp., Ltd.
+OUI:0003D9*
+ ID_OUI_FROM_DATABASE=Secheron SA
 
-OUI:000F58*
- ID_OUI_FROM_DATABASE=Adder Technology Limited
+OUI:0003D2*
+ ID_OUI_FROM_DATABASE=Crossbeam Systems, Inc.
 
-OUI:000F52*
- ID_OUI_FROM_DATABASE=YORK Refrigeration, Marine & Controls
+OUI:0003CD*
+ ID_OUI_FROM_DATABASE=Clovertech, Inc.
 
-OUI:000F57*
- ID_OUI_FROM_DATABASE=CABLELOGIC Co., Ltd.
+OUI:0003CA*
+ ID_OUI_FROM_DATABASE=MTS Systems Corp.
 
-OUI:000F45*
- ID_OUI_FROM_DATABASE=Stretch, Inc.
+OUI:0003C6*
+ ID_OUI_FROM_DATABASE=ICUE Systems, Inc.
 
-OUI:000F46*
- ID_OUI_FROM_DATABASE=SINAR AG
+OUI:0003BF*
+ ID_OUI_FROM_DATABASE=Centerpoint Broadband Technologies, Inc.
 
-OUI:000F4B*
+OUI:0003BA*
  ID_OUI_FROM_DATABASE=Oracle Corporation
 
-OUI:000F37*
- ID_OUI_FROM_DATABASE=Xambala Incorporated
-
-OUI:000F3F*
- ID_OUI_FROM_DATABASE=Big Bear Networks
+OUI:0003AF*
+ ID_OUI_FROM_DATABASE=Paragea Communications
 
-OUI:000F3B*
- ID_OUI_FROM_DATABASE=Fuji System Machines Co., Ltd.
+OUI:0003B4*
+ ID_OUI_FROM_DATABASE=Macrotek International Corp.
 
-OUI:000F31*
- ID_OUI_FROM_DATABASE=Allied Vision Technologies Canada Inc
+OUI:0003AC*
+ ID_OUI_FROM_DATABASE=Fronius Schweissmaschinen
 
-OUI:000F32*
- ID_OUI_FROM_DATABASE=Lootom Telcovideo Network Wuxi Co Ltd
+OUI:0003A8*
+ ID_OUI_FROM_DATABASE=IDOT Computers, Inc.
 
-OUI:000F2B*
- ID_OUI_FROM_DATABASE=GREENBELL SYSTEMS
+OUI:0003A1*
+ ID_OUI_FROM_DATABASE=HIPER Information & Communication, Inc.
 
-OUI:000E98*
- ID_OUI_FROM_DATABASE=HME Clear-Com LTD.
+OUI:000399*
+ ID_OUI_FROM_DATABASE=Dongju Informations & Communications Co., Ltd.
 
-OUI:000E93*
- ID_OUI_FROM_DATABASE=Milénio 3 Sistemas Electrónicos, Lda.
+OUI:00039C*
+ ID_OUI_FROM_DATABASE=OptiMight Communications, Inc.
 
-OUI:000E8C*
- ID_OUI_FROM_DATABASE=Siemens AG A&D ET
+OUI:000390*
+ ID_OUI_FROM_DATABASE=Digital Video Communications, Inc.
 
-OUI:000E86*
- ID_OUI_FROM_DATABASE=Alcatel North America
+OUI:000395*
+ ID_OUI_FROM_DATABASE=California Amplifier
 
-OUI:000E80*
- ID_OUI_FROM_DATABASE=Thomson Technology Inc
+OUI:000380*
+ ID_OUI_FROM_DATABASE=SSH Communications Security Corp.
 
-OUI:000E85*
- ID_OUI_FROM_DATABASE=Catalyst Enterprises, Inc.
+OUI:000374*
+ ID_OUI_FROM_DATABASE=Control Microsystems
 
-OUI:000E74*
- ID_OUI_FROM_DATABASE=Solar Telecom. Tech
+OUI:0002F0*
+ ID_OUI_FROM_DATABASE=AME Optimedia Technology Co., Ltd.
 
-OUI:000E79*
- ID_OUI_FROM_DATABASE=Ample Communications Inc.
+OUI:000379*
+ ID_OUI_FROM_DATABASE=Proscend Communications, Inc.
 
-OUI:000F24*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000371*
+ ID_OUI_FROM_DATABASE=Acomz Networks Corp.
 
-OUI:000F12*
- ID_OUI_FROM_DATABASE=Panasonic Europe Ltd.
+OUI:00036D*
+ ID_OUI_FROM_DATABASE=Runtop, Inc.
 
-OUI:000F18*
- ID_OUI_FROM_DATABASE=Industrial Control Systems
+OUI:0002E3*
+ ID_OUI_FROM_DATABASE=LITE-ON Communications, Inc.
 
-OUI:000F11*
- ID_OUI_FROM_DATABASE=Prodrive B.V.
+OUI:0002DE*
+ ID_OUI_FROM_DATABASE=Astrodesign, Inc.
 
-OUI:000F0C*
- ID_OUI_FROM_DATABASE=SYNCHRONIC ENGINEERING
+OUI:0002DB*
+ ID_OUI_FROM_DATABASE=NETSEC
 
-OUI:000EFF*
- ID_OUI_FROM_DATABASE=Megasolution,Inc.
+OUI:0002D7*
+ ID_OUI_FROM_DATABASE=EMPEG Ltd
 
-OUI:000F00*
- ID_OUI_FROM_DATABASE=Legra Systems, Inc.
+OUI:0002D2*
+ ID_OUI_FROM_DATABASE=Workstation AG
 
-OUI:000F05*
- ID_OUI_FROM_DATABASE=3B SYSTEM INC.
+OUI:000223*
+ ID_OUI_FROM_DATABASE=ClickTV
 
-OUI:000F7D*
- ID_OUI_FROM_DATABASE=Xirrus
+OUI:0002CB*
+ ID_OUI_FROM_DATABASE=TriState Ltd.
 
-OUI:000F84*
- ID_OUI_FROM_DATABASE=Astute Networks, Inc.
+OUI:0002C4*
+ ID_OUI_FROM_DATABASE=Vector International BVBA
 
-OUI:000F77*
- ID_OUI_FROM_DATABASE=DENTUM CO.,LTD
+OUI:0002BF*
+ ID_OUI_FROM_DATABASE=dotRocket, Inc.
 
-OUI:000F71*
- ID_OUI_FROM_DATABASE=Sanmei Electronics Co.,Ltd
+OUI:0002BB*
+ ID_OUI_FROM_DATABASE=Continuous Computing Corp
 
-OUI:000F78*
- ID_OUI_FROM_DATABASE=Datacap Systems Inc
+OUI:0002BC*
+ ID_OUI_FROM_DATABASE=LVL 7 Systems, Inc.
 
-OUI:000F65*
- ID_OUI_FROM_DATABASE=icube Corp.
+OUI:0002B6*
+ ID_OUI_FROM_DATABASE=Acrosser Technology Co., Ltd.
 
-OUI:000F5E*
- ID_OUI_FROM_DATABASE=Veo
+OUI:0002AF*
+ ID_OUI_FROM_DATABASE=TeleCruz Technology, Inc.
 
-OUI:000E71*
- ID_OUI_FROM_DATABASE=Gemstar Technology Development Ltd.
+OUI:0002AA*
+ ID_OUI_FROM_DATABASE=PLcom Co., Ltd.
 
-OUI:000E6C*
- ID_OUI_FROM_DATABASE=Device Drivers Limited
+OUI:00045B*
+ ID_OUI_FROM_DATABASE=Techsan Electronics Co., Ltd.
 
-OUI:000E65*
- ID_OUI_FROM_DATABASE=TransCore
+OUI:00044E*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000E5F*
- ID_OUI_FROM_DATABASE=activ-net GmbH & Co. KG
+OUI:00044F*
+ ID_OUI_FROM_DATABASE=Schubert System Elektronik Gmbh
 
-OUI:000E60*
- ID_OUI_FROM_DATABASE=360SUN Digital Broadband Corporation
+OUI:000454*
+ ID_OUI_FROM_DATABASE=Quadriga UK
 
-OUI:000E52*
- ID_OUI_FROM_DATABASE=Optium Corporation
+OUI:000445*
+ ID_OUI_FROM_DATABASE=LMS Skalar Instruments GmbH
 
-OUI:000E46*
- ID_OUI_FROM_DATABASE=Niigata Seimitsu Co.,Ltd.
+OUI:00044A*
+ ID_OUI_FROM_DATABASE=iPolicy Networks, Inc.
 
-OUI:000E4D*
- ID_OUI_FROM_DATABASE=Numesa Inc.
+OUI:000444*
+ ID_OUI_FROM_DATABASE=Western Multiplex Corporation
 
-OUI:000E3F*
- ID_OUI_FROM_DATABASE=Soronti, Inc.
+OUI:00043E*
+ ID_OUI_FROM_DATABASE=Telencomm
 
-OUI:000EC5*
- ID_OUI_FROM_DATABASE=Digital Multitools Inc
+OUI:000432*
+ ID_OUI_FROM_DATABASE=Voyetra Turtle Beach, Inc.
 
-OUI:000EB8*
- ID_OUI_FROM_DATABASE=Iiga co.,Ltd
+OUI:000437*
+ ID_OUI_FROM_DATABASE=Powin Information Technology, Inc.
 
-OUI:000EB7*
- ID_OUI_FROM_DATABASE=Knovative, Inc.
+OUI:00042B*
+ ID_OUI_FROM_DATABASE=IT Access Co., Ltd.
 
-OUI:000EBE*
- ID_OUI_FROM_DATABASE=B&B Electronics Manufacturing Co.
+OUI:000361*
+ ID_OUI_FROM_DATABASE=Widcomm, Inc.
 
-OUI:000EB2*
- ID_OUI_FROM_DATABASE=Micro-Research Finland Oy
+OUI:00035A*
+ ID_OUI_FROM_DATABASE=Photron Limited
 
-OUI:000EAB*
- ID_OUI_FROM_DATABASE=Cray Inc
+OUI:000355*
+ ID_OUI_FROM_DATABASE=TeraBeam Internet Systems
 
-OUI:000EA5*
- ID_OUI_FROM_DATABASE=BLIP Systems
+OUI:000353*
+ ID_OUI_FROM_DATABASE=Mitac, Inc.
 
-OUI:000E9F*
- ID_OUI_FROM_DATABASE=TEMIC SDS GmbH
+OUI:00034F*
+ ID_OUI_FROM_DATABASE=Sur-Gard Security
 
-OUI:000E0A*
- ID_OUI_FROM_DATABASE=SAKUMA DESIGN OFFICE
+OUI:00034A*
+ ID_OUI_FROM_DATABASE=RIAS Corporation
 
-OUI:000E12*
- ID_OUI_FROM_DATABASE=Adaptive Micro Systems Inc.
+OUI:000346*
+ ID_OUI_FROM_DATABASE=Hitachi Kokusai Electric, Inc.
 
-OUI:000E04*
- ID_OUI_FROM_DATABASE=CMA/Microdialysis AB
+OUI:000344*
+ ID_OUI_FROM_DATABASE=Tietech.Co., Ltd.
 
-OUI:000DF7*
- ID_OUI_FROM_DATABASE=Space Dynamics Lab
+OUI:000343*
+ ID_OUI_FROM_DATABASE=Martin Professional A/S
 
-OUI:000DFE*
- ID_OUI_FROM_DATABASE=Hauppauge Computer Works, Inc.
+OUI:000334*
+ ID_OUI_FROM_DATABASE=Newport Electronics
 
-OUI:000DF1*
- ID_OUI_FROM_DATABASE=IONIX INC.
+OUI:000337*
+ ID_OUI_FROM_DATABASE=Vaone, Inc.
 
-OUI:000DEB*
- ID_OUI_FROM_DATABASE=CompXs Limited
+OUI:00033C*
+ ID_OUI_FROM_DATABASE=Daiden Co., Ltd.
 
-OUI:000DF2*
- ID_OUI_FROM_DATABASE=Private
+OUI:000329*
+ ID_OUI_FROM_DATABASE=F3, Inc.
 
-OUI:000DE4*
- ID_OUI_FROM_DATABASE=DIGINICS, Inc.
+OUI:000330*
+ ID_OUI_FROM_DATABASE=Imagenics, Co., Ltd.
 
-OUI:000EF9*
- ID_OUI_FROM_DATABASE=REA Elektronik GmbH
+OUI:000321*
+ ID_OUI_FROM_DATABASE=Reco Research Co., Ltd.
 
-OUI:000EF2*
- ID_OUI_FROM_DATABASE=Infinico Corporation
+OUI:000324*
+ ID_OUI_FROM_DATABASE=SANYO Consumer Electronics Co., Ltd.
 
-OUI:000EE0*
- ID_OUI_FROM_DATABASE=Mcharge
+OUI:00031B*
+ ID_OUI_FROM_DATABASE=Cellvision Systems, Inc.
 
-OUI:000EDF*
- ID_OUI_FROM_DATABASE=PLX Technology
+OUI:0001A8*
+ ID_OUI_FROM_DATABASE=Welltech Computer Co., Ltd.
 
-OUI:000EE6*
- ID_OUI_FROM_DATABASE=Adimos Systems LTD
+OUI:00030F*
+ ID_OUI_FROM_DATABASE=Digital China (Shanghai) Networks Ltd.
 
-OUI:000ECA*
- ID_OUI_FROM_DATABASE=WTSS Inc
+OUI:000314*
+ ID_OUI_FROM_DATABASE=Teleware Network Systems
 
-OUI:000ED1*
- ID_OUI_FROM_DATABASE=Osaka Micro Computer.
+OUI:00030C*
+ ID_OUI_FROM_DATABASE=Telesoft Technologies Ltd.
 
-OUI:000EDA*
- ID_OUI_FROM_DATABASE=C-TECH UNITED CORP.
+OUI:000308*
+ ID_OUI_FROM_DATABASE=AM Communications, Inc.
 
-OUI:000ED6*
+OUI:0002FC*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000E37*
- ID_OUI_FROM_DATABASE=Harms & Wende GmbH & Co.KG
+OUI:000301*
+ ID_OUI_FROM_DATABASE=EXFO
 
-OUI:000E38*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0002F9*
+ ID_OUI_FROM_DATABASE=MIMOS Berhad
 
-OUI:000E31*
- ID_OUI_FROM_DATABASE=Olympus Soft Imaging Solutions GmbH
+OUI:0002F5*
+ ID_OUI_FROM_DATABASE=VIVE Synergies, Inc.
 
-OUI:000E2A*
- ID_OUI_FROM_DATABASE=Private
+OUI:0002EA*
+ ID_OUI_FROM_DATABASE=Focus Enhancements
 
-OUI:000E25*
- ID_OUI_FROM_DATABASE=Hannae Technology Co., Ltd
+OUI:000269*
+ ID_OUI_FROM_DATABASE=Nadatel Co., Ltd
 
-OUI:000E18*
- ID_OUI_FROM_DATABASE=MyA Technology
+OUI:000265*
+ ID_OUI_FROM_DATABASE=Virditech Co. Ltd.
 
-OUI:000E17*
- ID_OUI_FROM_DATABASE=Private
+OUI:00025E*
+ ID_OUI_FROM_DATABASE=High Technology Ltd
 
-OUI:000E0E*
- ID_OUI_FROM_DATABASE=ESA elettronica S.P.A.
+OUI:000261*
+ ID_OUI_FROM_DATABASE=Tilgin AB
 
-OUI:000C7E*
- ID_OUI_FROM_DATABASE=Tellium Incorporated
+OUI:000259*
+ ID_OUI_FROM_DATABASE=Tsann Kuen China (Shanghai)Enterprise Co., Ltd. IT Group
 
-OUI:000C86*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000255*
+ ID_OUI_FROM_DATABASE=IBM Corp
 
-OUI:000C81*
- ID_OUI_FROM_DATABASE=Schneider Electric (Australia)
+OUI:000249*
+ ID_OUI_FROM_DATABASE=Aviv Infocom Co, Ltd.
 
-OUI:000C72*
- ID_OUI_FROM_DATABASE=Tempearl Industrial Co., Ltd.
+OUI:000250*
+ ID_OUI_FROM_DATABASE=Geyser Networks, Inc.
 
-OUI:000C79*
- ID_OUI_FROM_DATABASE=Extel Communications P/L
+OUI:000242*
+ ID_OUI_FROM_DATABASE=Videoframe Systems
 
-OUI:000C66*
- ID_OUI_FROM_DATABASE=Pronto Networks Inc
+OUI:000244*
+ ID_OUI_FROM_DATABASE=SURECOM Technology Co.
 
-OUI:000C6B*
- ID_OUI_FROM_DATABASE=Kurz Industrie-Elektronik GmbH
+OUI:00022C*
+ ID_OUI_FROM_DATABASE=ABB Bomem, Inc.
 
-OUI:000C6D*
- ID_OUI_FROM_DATABASE=Edwards Ltd.
+OUI:00023A*
+ ID_OUI_FROM_DATABASE=ZSK Stickmaschinen GmbH
 
-OUI:000DDF*
- ID_OUI_FROM_DATABASE=Japan Image & Network Inc.
+OUI:000425*
+ ID_OUI_FROM_DATABASE=Atmel Corporation
 
-OUI:000DD2*
- ID_OUI_FROM_DATABASE=Simrad Optronics ASA
+OUI:000419*
+ ID_OUI_FROM_DATABASE=Fibercycle Networks, Inc.
 
-OUI:000DD1*
- ID_OUI_FROM_DATABASE=Stryker Corporation
+OUI:00041A*
+ ID_OUI_FROM_DATABASE=Ines Test and Measurement GmbH & CoKG
 
-OUI:000DD8*
- ID_OUI_FROM_DATABASE=BBN
+OUI:000414*
+ ID_OUI_FROM_DATABASE=Umezawa Musen Denki Co., Ltd.
 
-OUI:000DCC*
- ID_OUI_FROM_DATABASE=NEOSMART Corp.
+OUI:000407*
+ ID_OUI_FROM_DATABASE=Topcon Positioning Systems, Inc.
 
-OUI:000DBF*
- ID_OUI_FROM_DATABASE=TekTone Sound & Signal Mfg., Inc.
+OUI:0003F7*
+ ID_OUI_FROM_DATABASE=Plast-Control GmbH
 
-OUI:000DC0*
- ID_OUI_FROM_DATABASE=Spagat AS
+OUI:0003FE*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000DC5*
- ID_OUI_FROM_DATABASE=EchoStar Global B.V.
+OUI:0003FD*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000DB9*
- ID_OUI_FROM_DATABASE=PC Engines GmbH
+OUI:000401*
+ ID_OUI_FROM_DATABASE=Osaki Electric Co., Ltd.
 
-OUI:000D8C*
- ID_OUI_FROM_DATABASE=Shanghai Wedone Digital Ltd. CO.
+OUI:0003F0*
+ ID_OUI_FROM_DATABASE=Redfern Broadband Networks
 
-OUI:000D8B*
- ID_OUI_FROM_DATABASE=T&D Corporation
+OUI:0003EB*
+ ID_OUI_FROM_DATABASE=Atrica
 
-OUI:000D85*
- ID_OUI_FROM_DATABASE=Tapwave, Inc.
+OUI:0003E5*
+ ID_OUI_FROM_DATABASE=Hermstedt SG
 
-OUI:000D86*
- ID_OUI_FROM_DATABASE=Huber + Suhner AG
+OUI:0002A3*
+ ID_OUI_FROM_DATABASE=ABB Switzerland Ltd, Power Systems
 
-OUI:000D7E*
- ID_OUI_FROM_DATABASE=Axiowave Networks, Inc.
+OUI:000298*
+ ID_OUI_FROM_DATABASE=Broadframe Corporation
 
-OUI:000D78*
- ID_OUI_FROM_DATABASE=Engineering & Security
+OUI:000292*
+ ID_OUI_FROM_DATABASE=Logic Innovations, Inc.
 
-OUI:000D77*
- ID_OUI_FROM_DATABASE=FalconStor Software
+OUI:00028D*
+ ID_OUI_FROM_DATABASE=Movita Technologies, Inc.
 
-OUI:000D6B*
- ID_OUI_FROM_DATABASE=Mita-Teknik A/S
+OUI:000283*
+ ID_OUI_FROM_DATABASE=Spectrum Controls, Inc.
 
-OUI:000D65*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000277*
+ ID_OUI_FROM_DATABASE=Cash Systemes Industrie
 
-OUI:000D5F*
- ID_OUI_FROM_DATABASE=Minds Inc
+OUI:00027C*
+ ID_OUI_FROM_DATABASE=Trilithic, Inc.
 
-OUI:000D66*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000275*
+ ID_OUI_FROM_DATABASE=SMART Technologies, Inc.
 
-OUI:000CB1*
- ID_OUI_FROM_DATABASE=Salland Engineering (Europe) BV
+OUI:000270*
+ ID_OUI_FROM_DATABASE=Crewave Co., Ltd.
 
-OUI:000CB7*
- ID_OUI_FROM_DATABASE=Nanjing Huazhuo Electronics Co., Ltd.
+OUI:000104*
+ ID_OUI_FROM_DATABASE=DVICO Co., Ltd.
 
-OUI:000CBE*
- ID_OUI_FROM_DATABASE=Innominate Security Technologies AG
+OUI:000110*
+ ID_OUI_FROM_DATABASE=Gotham Networks
 
-OUI:000CC3*
- ID_OUI_FROM_DATABASE=BeWAN systems
+OUI:00010C*
+ ID_OUI_FROM_DATABASE=System Talks Inc.
 
-OUI:000CB2*
- ID_OUI_FROM_DATABASE=UNION co., ltd.
+OUI:000113*
+ ID_OUI_FROM_DATABASE=OLYMPUS CORPORATION
 
-OUI:000CA5*
- ID_OUI_FROM_DATABASE=Naman NZ LTd
+OUI:000100*
+ ID_OUI_FROM_DATABASE=EQUIP'TRANS
 
-OUI:000CAC*
- ID_OUI_FROM_DATABASE=Citizen Watch Co., Ltd.
+OUI:00B0AC*
+ ID_OUI_FROM_DATABASE=SIAE-Microelettronica S.p.A.
 
-OUI:000C94*
- ID_OUI_FROM_DATABASE=United Electronic Industries, Inc. (EUI)
+OUI:00B017*
+ ID_OUI_FROM_DATABASE=InfoGear Technology Corp.
 
-OUI:000C99*
- ID_OUI_FROM_DATABASE=HITEL LINK Co.,Ltd
+OUI:0030F0*
+ ID_OUI_FROM_DATABASE=Uniform Industrial Corp.
 
-OUI:000CA0*
- ID_OUI_FROM_DATABASE=StorCase Technology, Inc.
+OUI:00B080*
+ ID_OUI_FROM_DATABASE=Mannesmann Ipulsys B.V.
 
-OUI:000C8D*
- ID_OUI_FROM_DATABASE=MATRIX VISION GmbH
+OUI:00B09A*
+ ID_OUI_FROM_DATABASE=Morrow Technologies Corp.
 
-OUI:000C92*
- ID_OUI_FROM_DATABASE=WolfVision Gmbh
+OUI:00B091*
+ ID_OUI_FROM_DATABASE=Transmeta Corp.
 
-OUI:000D32*
- ID_OUI_FROM_DATABASE=DispenseSource, Inc.
+OUI:0030BE*
+ ID_OUI_FROM_DATABASE=City-Net Technology, Inc.
 
-OUI:000D31*
- ID_OUI_FROM_DATABASE=Compellent Technologies, Inc.
+OUI:000233*
+ ID_OUI_FROM_DATABASE=Mantra Communications, Inc.
 
-OUI:000D2C*
- ID_OUI_FROM_DATABASE=Patapsco Designs Ltd
+OUI:00022F*
+ ID_OUI_FROM_DATABASE=P-Cube, Ltd.
 
-OUI:000D25*
- ID_OUI_FROM_DATABASE=SANDEN CORPORATION
+OUI:000227*
+ ID_OUI_FROM_DATABASE=ESD Electronic System Design GmbH
 
-OUI:000D1F*
- ID_OUI_FROM_DATABASE=AV Digital
+OUI:00021F*
+ ID_OUI_FROM_DATABASE=Aculab PLC
 
-OUI:000D19*
- ID_OUI_FROM_DATABASE=ROBE Show lighting
+OUI:00021B*
+ ID_OUI_FROM_DATABASE=Kollmorgen-Servotronix
 
-OUI:000D20*
- ID_OUI_FROM_DATABASE=ASAHIKASEI TECHNOSYSTEM CO.,LTD.
+OUI:00020C*
+ ID_OUI_FROM_DATABASE=Metro-Optix
 
-OUI:000D0D*
- ID_OUI_FROM_DATABASE=ITSupported, LLC
+OUI:000218*
+ ID_OUI_FROM_DATABASE=Advanced Scientific Corp
 
-OUI:000D12*
- ID_OUI_FROM_DATABASE=AXELL Corporation
+OUI:000213*
+ ID_OUI_FROM_DATABASE=S.D.E.L.
 
-OUI:000DB2*
- ID_OUI_FROM_DATABASE=Ammasso, Inc.
+OUI:00020F*
+ ID_OUI_FROM_DATABASE=AATR
 
-OUI:000DAD*
- ID_OUI_FROM_DATABASE=Dataprobe, Inc.
+OUI:0001F9*
+ ID_OUI_FROM_DATABASE=TeraGlobal Communications Corp.
 
-OUI:000D9E*
- ID_OUI_FROM_DATABASE=TOKUDEN OHIZUMI SEISAKUSYO Co.,Ltd.
+OUI:000200*
+ ID_OUI_FROM_DATABASE=Net & Sys Co., Ltd.
 
-OUI:000DA5*
- ID_OUI_FROM_DATABASE=Fabric7 Systems, Inc
+OUI:0001FC*
+ ID_OUI_FROM_DATABASE=Keyence Corporation
+
+OUI:0001F3*
+ ID_OUI_FROM_DATABASE=QPS, Inc.
+
+OUI:0001E4*
+ ID_OUI_FROM_DATABASE=Sitera, Inc.
+
+OUI:0001EB*
+ ID_OUI_FROM_DATABASE=C-COM Corporation
 
-OUI:000D99*
- ID_OUI_FROM_DATABASE=Orbital Sciences Corp.; Launch Systems Group
+OUI:0001F0*
+ ID_OUI_FROM_DATABASE=Tridium, Inc.
 
-OUI:000D58*
- ID_OUI_FROM_DATABASE=Private
+OUI:0001D4*
+ ID_OUI_FROM_DATABASE=Leisure Time, Inc.
 
-OUI:000D4C*
- ID_OUI_FROM_DATABASE=Outline Electronics Ltd.
+OUI:0001D8*
+ ID_OUI_FROM_DATABASE=Teltronics, Inc.
 
-OUI:000D53*
- ID_OUI_FROM_DATABASE=Beijing 5w Communication Corp.
+OUI:0001C6*
+ ID_OUI_FROM_DATABASE=Quarry Technologies
 
-OUI:000D3F*
- ID_OUI_FROM_DATABASE=VTI Instruments Corporation
+OUI:0001CC*
+ ID_OUI_FROM_DATABASE=Japan Total Design Communication Co., Ltd.
 
-OUI:000D44*
- ID_OUI_FROM_DATABASE=Audio BU - Logitech
+OUI:0001D1*
+ ID_OUI_FROM_DATABASE=CoNet Communications, Inc.
 
-OUI:000D38*
- ID_OUI_FROM_DATABASE=NISSIN INC.
+OUI:0001B3*
+ ID_OUI_FROM_DATABASE=Precision Electronic Manufacturing
 
-OUI:000CD1*
- ID_OUI_FROM_DATABASE=SFOM Technology Corp.
+OUI:000160*
+ ID_OUI_FROM_DATABASE=ELMEX Co., LTD.
 
-OUI:000CD6*
- ID_OUI_FROM_DATABASE=PARTNER TECH
+OUI:00015E*
+ ID_OUI_FROM_DATABASE=BEST TECHNOLOGY CO., LTD.
 
-OUI:000CDD*
- ID_OUI_FROM_DATABASE=AOS technologies AG
+OUI:000162*
+ ID_OUI_FROM_DATABASE=Cygnet Technologies, Inc.
 
-OUI:000CCA*
- ID_OUI_FROM_DATABASE=HGST a Western Digital Company
+OUI:000169*
+ ID_OUI_FROM_DATABASE=Celestix Networks Pte Ltd.
 
-OUI:000CC4*
- ID_OUI_FROM_DATABASE=Tiptel AG
+OUI:000175*
+ ID_OUI_FROM_DATABASE=Radiant Communications Corp.
 
-OUI:000D00*
- ID_OUI_FROM_DATABASE=Seaway Networks Inc.
+OUI:000159*
+ ID_OUI_FROM_DATABASE=S1 Corporation
 
-OUI:000D06*
- ID_OUI_FROM_DATABASE=Compulogic Limited
+OUI:000165*
+ ID_OUI_FROM_DATABASE=AirSwitch Corporation
 
-OUI:000CFA*
- ID_OUI_FROM_DATABASE=Digital Systems Corp
+OUI:000171*
+ ID_OUI_FROM_DATABASE=Allied Data Technologies
 
-OUI:000CFF*
- ID_OUI_FROM_DATABASE=MRO-TEK LIMITED
+OUI:000157*
+ ID_OUI_FROM_DATABASE=SYSWAVE CO., LTD
 
-OUI:000CED*
- ID_OUI_FROM_DATABASE=Real Digital Media
+OUI:000153*
+ ID_OUI_FROM_DATABASE=ARCHTEK TELECOM CORPORATION
 
-OUI:000CEE*
- ID_OUI_FROM_DATABASE=jp-embedded
+OUI:000144*
+ ID_OUI_FROM_DATABASE=EMC Corporation
 
-OUI:000CF3*
- ID_OUI_FROM_DATABASE=CALL IMAGE SA
+OUI:003038*
+ ID_OUI_FROM_DATABASE=XCP, INC.
 
-OUI:000CE7*
- ID_OUI_FROM_DATABASE=MediaTek Inc.
+OUI:0030DB*
+ ID_OUI_FROM_DATABASE=Mindready Solutions, Inc.
 
-OUI:000CE3*
- ID_OUI_FROM_DATABASE=Option International N.V.
+OUI:00306A*
+ ID_OUI_FROM_DATABASE=PENTA MEDIA CO., LTD.
 
-OUI:000B01*
- ID_OUI_FROM_DATABASE=DAIICHI ELECTRONICS CO., LTD.
+OUI:003021*
+ ID_OUI_FROM_DATABASE=HSING TECH. ENTERPRISE CO.,LTD
 
-OUI:000AF0*
- ID_OUI_FROM_DATABASE=SHIN-OH ELECTRONICS CO., LTD. R&D
+OUI:0030EA*
+ ID_OUI_FROM_DATABASE=TeraForce Technology Corporation
 
-OUI:000AF5*
- ID_OUI_FROM_DATABASE=Airgo Networks, Inc.
+OUI:0030F4*
+ ID_OUI_FROM_DATABASE=STARDOT TECHNOLOGIES
 
-OUI:000AEC*
- ID_OUI_FROM_DATABASE=Koatsu Gas Kogyo Co., Ltd.
+OUI:003087*
+ ID_OUI_FROM_DATABASE=VEGA GRIESHABER KG
 
-OUI:000AE5*
- ID_OUI_FROM_DATABASE=ScottCare Corporation
+OUI:003000*
+ ID_OUI_FROM_DATABASE=ALLWELL TECHNOLOGY CORP.
 
-OUI:000AE7*
- ID_OUI_FROM_DATABASE=ELIOP S.A.
+OUI:003034*
+ ID_OUI_FROM_DATABASE=SET ENGINEERING
 
-OUI:000AE0*
- ID_OUI_FROM_DATABASE=Fujitsu Softek
+OUI:00308D*
+ ID_OUI_FROM_DATABASE=Pinnacle Systems, Inc.
 
-OUI:000AC8*
- ID_OUI_FROM_DATABASE=ZPSYS CO.,LTD. (Planning&Management)
+OUI:00304B*
+ ID_OUI_FROM_DATABASE=ORBACOM SYSTEMS, INC.
 
-OUI:000ACD*
- ID_OUI_FROM_DATABASE=Sunrich Technology Limited
+OUI:0030FA*
+ ID_OUI_FROM_DATABASE=TELICA, INC.
 
-OUI:000AD4*
- ID_OUI_FROM_DATABASE=CoreBell Systems Inc.
+OUI:0001B1*
+ ID_OUI_FROM_DATABASE=General Bandwidth
 
-OUI:000B5E*
- ID_OUI_FROM_DATABASE=Audio Engineering Society Inc.
+OUI:0001BB*
+ ID_OUI_FROM_DATABASE=Frequentis
 
-OUI:000B63*
- ID_OUI_FROM_DATABASE=Kaleidescape
+OUI:0001B7*
+ ID_OUI_FROM_DATABASE=Centos, Inc.
 
-OUI:000B55*
- ID_OUI_FROM_DATABASE=ADInstruments
+OUI:0001AF*
+ ID_OUI_FROM_DATABASE=Artesyn Embedded Technologies
 
-OUI:000B5A*
- ID_OUI_FROM_DATABASE=HyperEdge
+OUI:0001AB*
+ ID_OUI_FROM_DATABASE=Main Street Networks
 
-OUI:000B52*
- ID_OUI_FROM_DATABASE=JOYMAX ELECTRONICS CO. LTD.
+OUI:000191*
+ ID_OUI_FROM_DATABASE=SYRED Data Systems
 
-OUI:000B4D*
- ID_OUI_FROM_DATABASE=Emuzed
+OUI:00019D*
+ ID_OUI_FROM_DATABASE=E-Control Systems, Inc.
 
-OUI:000B41*
- ID_OUI_FROM_DATABASE=Ing. Büro Dr. Beutlhauser
+OUI:0001A4*
+ ID_OUI_FROM_DATABASE=Microlink Corporation
 
-OUI:000B46*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000199*
+ ID_OUI_FROM_DATABASE=HeiSei Electronics
 
-OUI:000B33*
- ID_OUI_FROM_DATABASE=Vivato Technologies
+OUI:0001A0*
+ ID_OUI_FROM_DATABASE=Infinilink Corporation
 
-OUI:000B3A*
- ID_OUI_FROM_DATABASE=QuStream Corporation
+OUI:00017C*
+ ID_OUI_FROM_DATABASE=AG-E GmbH
 
-OUI:000B3F*
- ID_OUI_FROM_DATABASE=Anthology Solutions Inc.
+OUI:000188*
+ ID_OUI_FROM_DATABASE=LXCO Technologies ag
 
-OUI:000B95*
- ID_OUI_FROM_DATABASE=eBet Gaming Systems Pty Ltd
+OUI:000178*
+ ID_OUI_FROM_DATABASE=MARGI Systems, Inc.
 
-OUI:000B8F*
- ID_OUI_FROM_DATABASE=AKITA ELECTRONICS SYSTEMS CO.,LTD.
+OUI:00018B*
+ ID_OUI_FROM_DATABASE=NetLinks Co., Ltd.
 
-OUI:000B89*
- ID_OUI_FROM_DATABASE=Top Global Technology, Ltd.
+OUI:0030F5*
+ ID_OUI_FROM_DATABASE=Wild Lab. Ltd.
 
-OUI:000B8E*
- ID_OUI_FROM_DATABASE=Ascent Corporation
+OUI:000184*
+ ID_OUI_FROM_DATABASE=SIEB & MEYER AG
 
-OUI:000B90*
- ID_OUI_FROM_DATABASE=ADVA Optical Networking Ltd.
+OUI:00303E*
+ ID_OUI_FROM_DATABASE=Radcom Ltd.
 
-OUI:000B7D*
- ID_OUI_FROM_DATABASE=SOLOMON EXTREME INTERNATIONAL LTD.
+OUI:0030D7*
+ ID_OUI_FROM_DATABASE=Innovative Systems, L.L.C.
 
-OUI:000B82*
- ID_OUI_FROM_DATABASE=Grandstream Networks, Inc.
+OUI:0030FC*
+ ID_OUI_FROM_DATABASE=Terawave Communications, Inc.
 
-OUI:000B6F*
- ID_OUI_FROM_DATABASE=Media Streaming Networks Inc
+OUI:00300F*
+ ID_OUI_FROM_DATABASE=IMT - Information Management T
 
-OUI:000B76*
- ID_OUI_FROM_DATABASE=ET&T Technology Co. Ltd.
+OUI:003004*
+ ID_OUI_FROM_DATABASE=LEADTEK RESEARCH INC.
 
-OUI:000AC1*
- ID_OUI_FROM_DATABASE=Futuretel
+OUI:003018*
+ ID_OUI_FROM_DATABASE=Jetway Information Co., Ltd.
 
-OUI:000AC6*
- ID_OUI_FROM_DATABASE=Overture Networks.
+OUI:003088*
+ ID_OUI_FROM_DATABASE=Ericsson
 
-OUI:000AAE*
- ID_OUI_FROM_DATABASE=Rosemount Process Analytical
+OUI:0030CA*
+ ID_OUI_FROM_DATABASE=Discovery Com
 
-OUI:000AB3*
- ID_OUI_FROM_DATABASE=Fa. GIRA
+OUI:00304F*
+ ID_OUI_FROM_DATABASE=PLANET Technology Corporation
 
-OUI:000AB5*
- ID_OUI_FROM_DATABASE=Digital Electronic Network
+OUI:00014B*
+ ID_OUI_FROM_DATABASE=Ennovate Networks, Inc.
 
-OUI:000ABA*
- ID_OUI_FROM_DATABASE=Arcon Technology Limited
+OUI:00012C*
+ ID_OUI_FROM_DATABASE=Aravox Technologies, Inc.
 
-OUI:000AA2*
- ID_OUI_FROM_DATABASE=SYSTEK INC.
+OUI:000134*
+ ID_OUI_FROM_DATABASE=Selectron Systems AG
 
-OUI:000AA7*
- ID_OUI_FROM_DATABASE=FEI Electron Optics
+OUI:00013B*
+ ID_OUI_FROM_DATABASE=BNA SYSTEMS
 
-OUI:000A8F*
- ID_OUI_FROM_DATABASE=Aska International Inc.
+OUI:000147*
+ ID_OUI_FROM_DATABASE=Zhone Technologies
 
-OUI:000A94*
- ID_OUI_FROM_DATABASE=ShangHai cellink CO., LTD
+OUI:00012B*
+ ID_OUI_FROM_DATABASE=TELENET Co., Ltd.
 
-OUI:000C4E*
- ID_OUI_FROM_DATABASE=Winbest Technology CO,LT
+OUI:00011C*
+ ID_OUI_FROM_DATABASE=Universal Talkware Corporation
 
-OUI:000C53*
- ID_OUI_FROM_DATABASE=Private
+OUI:000123*
+ ID_OUI_FROM_DATABASE=DIGITAL ELECTRONICS CORP.
 
-OUI:000C5A*
- ID_OUI_FROM_DATABASE=IBSmm Embedded Electronics Consulting
+OUI:00011F*
+ ID_OUI_FROM_DATABASE=RC Networks, Inc.
 
-OUI:000C5F*
- ID_OUI_FROM_DATABASE=Avtec, Inc.
+OUI:003045*
+ ID_OUI_FROM_DATABASE=Village Networks, Inc. (VNI)
 
-OUI:000C47*
- ID_OUI_FROM_DATABASE=SK Teletech(R&D Planning Team)
+OUI:0030BB*
+ ID_OUI_FROM_DATABASE=CacheFlow, Inc.
 
-OUI:000C4C*
- ID_OUI_FROM_DATABASE=Arcor AG&Co.
+OUI:003053*
+ ID_OUI_FROM_DATABASE=Basler AG
 
-OUI:000C3E*
- ID_OUI_FROM_DATABASE=Crest Audio
+OUI:003072*
+ ID_OUI_FROM_DATABASE=Intellibyte Inc.
 
-OUI:000C37*
- ID_OUI_FROM_DATABASE=Geomation, Inc.
+OUI:0030B1*
+ ID_OUI_FROM_DATABASE=TrunkNet
 
-OUI:000C2D*
- ID_OUI_FROM_DATABASE=FullWave Technology Co., Ltd.
+OUI:0030A7*
+ ID_OUI_FROM_DATABASE=SCHWEITZER ENGINEERING
 
-OUI:000C1A*
- ID_OUI_FROM_DATABASE=Quest Technical Solutions Inc.
+OUI:00D086*
+ ID_OUI_FROM_DATABASE=FOVEON, INC.
 
-OUI:000C1E*
- ID_OUI_FROM_DATABASE=Global Cache
+OUI:00D05A*
+ ID_OUI_FROM_DATABASE=SYMBIONICS, LTD.
 
-OUI:000C23*
- ID_OUI_FROM_DATABASE=Beijing Lanchuan Tech. Co., Ltd.
+OUI:00D01A*
+ ID_OUI_FROM_DATABASE=URMET  TLC S.P.A.
 
-OUI:000C0E*
- ID_OUI_FROM_DATABASE=XtremeSpectrum, Inc.
+OUI:00D0F3*
+ ID_OUI_FROM_DATABASE=SOLARI DI UDINE SPA
 
-OUI:000C15*
- ID_OUI_FROM_DATABASE=CyberPower Systems, Inc.
+OUI:00D089*
+ ID_OUI_FROM_DATABASE=DYNACOLOR, INC.
 
-OUI:000C09*
- ID_OUI_FROM_DATABASE=Hitachi IE Systems Co., Ltd
+OUI:00D08D*
+ ID_OUI_FROM_DATABASE=PHOENIX GROUP, INC.
 
-OUI:000BD3*
- ID_OUI_FROM_DATABASE=cd3o
+OUI:00D09C*
+ ID_OUI_FROM_DATABASE=KAPADIA COMMUNICATIONS
 
-OUI:000BC7*
- ID_OUI_FROM_DATABASE=ICET S.p.A.
+OUI:00D0FE*
+ ID_OUI_FROM_DATABASE=ASTRAL POINT
 
-OUI:000BCE*
- ID_OUI_FROM_DATABASE=Free2move AB
+OUI:00D0DC*
+ ID_OUI_FROM_DATABASE=MODULAR MINING SYSTEMS, INC.
 
-OUI:000BC2*
- ID_OUI_FROM_DATABASE=Corinex Communication Corp.
+OUI:00D062*
+ ID_OUI_FROM_DATABASE=DIGIGRAM
 
-OUI:000BBB*
- ID_OUI_FROM_DATABASE=Etin Systems Co., Ltd
+OUI:00D0A7*
+ ID_OUI_FROM_DATABASE=TOKYO SOKKI KENKYUJO CO., LTD.
 
-OUI:000BC0*
- ID_OUI_FROM_DATABASE=China IWNComm Co., Ltd.
+OUI:00D032*
+ ID_OUI_FROM_DATABASE=YANO ELECTRIC CO., LTD.
 
-OUI:000BAF*
- ID_OUI_FROM_DATABASE=WOOJU COMMUNICATIONS Co,.Ltd
+OUI:00D054*
+ ID_OUI_FROM_DATABASE=SAS INSTITUTE INC.
 
-OUI:000BB4*
- ID_OUI_FROM_DATABASE=RDC Semiconductor Inc.,
+OUI:00D0EB*
+ ID_OUI_FROM_DATABASE=LIGHTERA NETWORKS, INC.
 
-OUI:000BA5*
- ID_OUI_FROM_DATABASE=Quasar Cipta Mandiri, PT
+OUI:00D01E*
+ ID_OUI_FROM_DATABASE=PINGTEL CORP.
 
-OUI:000BAA*
- ID_OUI_FROM_DATABASE=Aiphone co.,Ltd
+OUI:00D0A9*
+ ID_OUI_FROM_DATABASE=SHINANO KENSHI CO., LTD.
 
-OUI:000B9E*
- ID_OUI_FROM_DATABASE=Yasing Technology Corp.
+OUI:0030E9*
+ ID_OUI_FROM_DATABASE=GMA COMMUNICATION MANUFACT'G
 
-OUI:000B27*
- ID_OUI_FROM_DATABASE=Scion Corporation
+OUI:003027*
+ ID_OUI_FROM_DATABASE=KERBANGO, INC.
 
-OUI:000B2E*
- ID_OUI_FROM_DATABASE=Cal-Comp Electronics (Thailand) Public Company Limited Taipe
+OUI:0030F6*
+ ID_OUI_FROM_DATABASE=SECURELOGIX CORPORATION
 
-OUI:000B1B*
- ID_OUI_FROM_DATABASE=Systronix, Inc.
+OUI:0030B6*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000B20*
- ID_OUI_FROM_DATABASE=Hirata corporation
+OUI:0030B2*
+ ID_OUI_FROM_DATABASE=L-3 Sonoma EO
 
-OUI:000B22*
- ID_OUI_FROM_DATABASE=Environmental Systems and Services
+OUI:0030D6*
+ ID_OUI_FROM_DATABASE=MSC VERTRIEBS GMBH
 
-OUI:000B14*
- ID_OUI_FROM_DATABASE=ViewSonic Corporation
+OUI:003008*
+ ID_OUI_FROM_DATABASE=AVIO DIGITAL, INC.
 
-OUI:000B0D*
- ID_OUI_FROM_DATABASE=Air2U, Inc.
+OUI:00306D*
+ ID_OUI_FROM_DATABASE=LUCENT TECHNOLOGIES
 
-OUI:000B0F*
- ID_OUI_FROM_DATABASE=Bosch Rexroth
+OUI:0030E4*
+ ID_OUI_FROM_DATABASE=CHIYODA SYSTEM RIKEN
 
-OUI:000B08*
- ID_OUI_FROM_DATABASE=Pillar Data Systems
+OUI:00301A*
+ ID_OUI_FROM_DATABASE=SMARTBRIDGES PTE. LTD.
 
-OUI:000AFC*
- ID_OUI_FROM_DATABASE=Core Tec Communications, LLC
+OUI:0030CD*
+ ID_OUI_FROM_DATABASE=CONEXANT SYSTEMS, INC.
 
-OUI:000BF6*
- ID_OUI_FROM_DATABASE=Nitgen Co., Ltd
+OUI:003001*
+ ID_OUI_FROM_DATABASE=SMP
 
-OUI:000BFB*
- ID_OUI_FROM_DATABASE=D-NET International Corporation
+OUI:0030E1*
+ ID_OUI_FROM_DATABASE=Network Equipment Technologies, Inc.
 
-OUI:000C02*
- ID_OUI_FROM_DATABASE=ABB Oy
+OUI:0050A7*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000BEA*
- ID_OUI_FROM_DATABASE=Zultys Technologies
+OUI:00D0EE*
+ ID_OUI_FROM_DATABASE=DICTAPHONE CORPORATION
 
-OUI:000BEF*
- ID_OUI_FROM_DATABASE=Code Corporation
+OUI:00D0B8*
+ ID_OUI_FROM_DATABASE=Iomega Corporation
 
-OUI:000BE3*
- ID_OUI_FROM_DATABASE=Key Stream Co., Ltd.
+OUI:005045*
+ ID_OUI_FROM_DATABASE=RIOWORKS SOLUTIONS, INC.
 
-OUI:000BE8*
- ID_OUI_FROM_DATABASE=AOIP
+OUI:00507C*
+ ID_OUI_FROM_DATABASE=VIDEOCON AG
 
-OUI:000BE9*
- ID_OUI_FROM_DATABASE=Actel Corporation
+OUI:005065*
+ ID_OUI_FROM_DATABASE=TDK-Lambda Corporation
 
-OUI:000BD7*
- ID_OUI_FROM_DATABASE=DORMA Time + Access GmbH
+OUI:0050F4*
+ ID_OUI_FROM_DATABASE=SIGMATEK GMBH & CO. KG
 
-OUI:000BDC*
- ID_OUI_FROM_DATABASE=AKCP
+OUI:005076*
+ ID_OUI_FROM_DATABASE=IBM Corp
 
-OUI:000994*
- ID_OUI_FROM_DATABASE=Cronyx Engineering
+OUI:005075*
+ ID_OUI_FROM_DATABASE=KESTREL SOLUTIONS
 
-OUI:000999*
- ID_OUI_FROM_DATABASE=CP GEORGES RENAULT
+OUI:005090*
+ ID_OUI_FROM_DATABASE=DCTRI
 
-OUI:000987*
- ID_OUI_FROM_DATABASE=NISHI NIPPON ELECTRIC WIRE & CABLE CO.,LTD.
+OUI:0050ED*
+ ID_OUI_FROM_DATABASE=ANDA NETWORKS
 
-OUI:000988*
- ID_OUI_FROM_DATABASE=Nudian Electron Co., Ltd.
+OUI:005096*
+ ID_OUI_FROM_DATABASE=SALIX TECHNOLOGIES, INC.
 
-OUI:00098D*
- ID_OUI_FROM_DATABASE=Velocity Semiconductor
+OUI:00509B*
+ ID_OUI_FROM_DATABASE=SWITCHCORE AB
 
-OUI:000981*
- ID_OUI_FROM_DATABASE=Newport Networks
+OUI:0050A9*
+ ID_OUI_FROM_DATABASE=MOLDAT WIRELESS TECHNOLGIES
 
-OUI:000975*
- ID_OUI_FROM_DATABASE=fSONA Communications Corporation
+OUI:00503C*
+ ID_OUI_FROM_DATABASE=TSINGHUA NOVEL ELECTRONICS
 
-OUI:00097A*
- ID_OUI_FROM_DATABASE=Louis Design Labs.
+OUI:005030*
+ ID_OUI_FROM_DATABASE=FUTURE PLUS SYSTEMS
 
-OUI:000968*
- ID_OUI_FROM_DATABASE=TECHNOVENTURE, INC.
+OUI:005037*
+ ID_OUI_FROM_DATABASE=KOGA ELECTRONICS CO.
 
-OUI:000962*
- ID_OUI_FROM_DATABASE=Sonitor Technologies AS
+OUI:00501F*
+ ID_OUI_FROM_DATABASE=MRG SYSTEMS, LTD.
 
-OUI:000A9B*
- ID_OUI_FROM_DATABASE=TB Group Inc
+OUI:005092*
+ ID_OUI_FROM_DATABASE=Rigaku Corporation Osaka Plant
 
-OUI:000A9A*
- ID_OUI_FROM_DATABASE=Aiptek International Inc
+OUI:00501C*
+ ID_OUI_FROM_DATABASE=JATOM SYSTEMS, INC.
 
-OUI:000A80*
- ID_OUI_FROM_DATABASE=Telkonet Inc.
+OUI:00505C*
+ ID_OUI_FROM_DATABASE=TUNDO CORPORATION
 
-OUI:000A82*
- ID_OUI_FROM_DATABASE=TATSUTA SYSTEM ELECTRONICS CO.,LTD.
+OUI:005068*
+ ID_OUI_FROM_DATABASE=ELECTRONIC INDUSTRIES ASSOCIATION
 
-OUI:000A87*
- ID_OUI_FROM_DATABASE=Integrated Micromachines Inc.
+OUI:00501A*
+ ID_OUI_FROM_DATABASE=IQinVision
 
-OUI:000A7B*
- ID_OUI_FROM_DATABASE=Cornelius Consult
+OUI:005063*
+ ID_OUI_FROM_DATABASE=OY COMSEL SYSTEM AB
 
-OUI:000A6D*
- ID_OUI_FROM_DATABASE=EKS Elektronikservice GmbH
+OUI:0050DE*
+ ID_OUI_FROM_DATABASE=SIGNUM SYSTEMS CORP.
 
-OUI:000A6F*
- ID_OUI_FROM_DATABASE=ZyFLEX Technologies Inc
+OUI:00507B*
+ ID_OUI_FROM_DATABASE=MERLOT COMMUNICATIONS
 
-OUI:000A74*
- ID_OUI_FROM_DATABASE=Manticom Networks Inc.
+OUI:005078*
+ ID_OUI_FROM_DATABASE=MEGATON HOUSE, LTD.
 
-OUI:000A61*
- ID_OUI_FROM_DATABASE=Cellinx Systems Inc.
+OUI:00508F*
+ ID_OUI_FROM_DATABASE=ASITA TECHNOLOGIES INT'L LTD.
 
-OUI:0009C3*
- ID_OUI_FROM_DATABASE=NETAS
+OUI:005057*
+ ID_OUI_FROM_DATABASE=BROADBAND ACCESS SYSTEMS
 
-OUI:0009B9*
- ID_OUI_FROM_DATABASE=Action Imaging Solutions
+OUI:005087*
+ ID_OUI_FROM_DATABASE=TERASAKI ELECTRIC CO., LTD.
 
-OUI:0009BA*
- ID_OUI_FROM_DATABASE=MAKU Informationstechik GmbH
+OUI:00D03E*
+ ID_OUI_FROM_DATABASE=ROCKETCHIPS, INC.
 
-OUI:0009AC*
- ID_OUI_FROM_DATABASE=LANVOICE
+OUI:00D03F*
+ ID_OUI_FROM_DATABASE=AMERICAN COMMUNICATION
 
-OUI:0009B3*
- ID_OUI_FROM_DATABASE=MCM Systems Ltd
+OUI:00D033*
+ ID_OUI_FROM_DATABASE=DALIAN DAXIAN NETWORK
 
-OUI:0009A7*
- ID_OUI_FROM_DATABASE=Bang & Olufsen A/S
+OUI:00D0CE*
+ ID_OUI_FROM_DATABASE=ASYST ELECTRONIC
 
-OUI:00099A*
- ID_OUI_FROM_DATABASE=ELMO COMPANY, LIMITED
+OUI:00D090*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0009A0*
- ID_OUI_FROM_DATABASE=Microtechno Corporation
+OUI:00D0B6*
+ ID_OUI_FROM_DATABASE=CRESCENT NETWORKS, INC.
 
-OUI:0009ED*
- ID_OUI_FROM_DATABASE=CipherOptics
+OUI:00D0D2*
+ ID_OUI_FROM_DATABASE=EPILOG CORPORATION
 
-OUI:0009F2*
- ID_OUI_FROM_DATABASE=Cohu, Inc., Electronics Division
+OUI:0050B6*
+ ID_OUI_FROM_DATABASE=GOOD WAY IND. CO., LTD.
 
-OUI:0009E6*
- ID_OUI_FROM_DATABASE=Cyber Switching Inc.
+OUI:0050FF*
+ ID_OUI_FROM_DATABASE=HAKKO ELECTRONICS CO., LTD.
 
-OUI:0009E0*
- ID_OUI_FROM_DATABASE=XEMICS S.A.
+OUI:005032*
+ ID_OUI_FROM_DATABASE=PICAZO COMMUNICATIONS, INC.
 
-OUI:0009DA*
- ID_OUI_FROM_DATABASE=Control Module Inc.
+OUI:0050DA*
+ ID_OUI_FROM_DATABASE=3COM CORPORATION
 
-OUI:0009DF*
- ID_OUI_FROM_DATABASE=Vestel Komunikasyon Sanayi ve Ticaret A.S.
+OUI:0050F9*
+ ID_OUI_FROM_DATABASE=Sensormatic Electronics LLC
 
-OUI:0009CD*
- ID_OUI_FROM_DATABASE=HUDSON SOFT CO.,LTD.
+OUI:0050F6*
+ ID_OUI_FROM_DATABASE=PAN-INTERNATIONAL INDUSTRIAL CORP.
 
-OUI:0009C7*
- ID_OUI_FROM_DATABASE=Movistec
+OUI:00506C*
+ ID_OUI_FROM_DATABASE=Beijer Electronics Products AB
 
-OUI:0009CE*
- ID_OUI_FROM_DATABASE=SpaceBridge Semiconductor Corp.
+OUI:0050A5*
+ ID_OUI_FROM_DATABASE=CAPITOL BUSINESS SYSTEMS, LTD.
 
-OUI:0009D3*
- ID_OUI_FROM_DATABASE=Western DataCom Co., Inc.
+OUI:005000*
+ ID_OUI_FROM_DATABASE=NEXO COMMUNICATIONS, INC.
 
-OUI:000901*
- ID_OUI_FROM_DATABASE=Shenzhen Shixuntong Information & Technoligy Co
+OUI:00D066*
+ ID_OUI_FROM_DATABASE=WINTRISS ENGINEERING CORP.
 
-OUI:0008FC*
- ID_OUI_FROM_DATABASE=Gigaphoton Inc.
+OUI:00D06F*
+ ID_OUI_FROM_DATABASE=KMC CONTROLS
 
-OUI:0008F9*
- ID_OUI_FROM_DATABASE=Artesyn Embedded Technologies
+OUI:00D04B*
+ ID_OUI_FROM_DATABASE=LA CIE GROUP S.A.
 
-OUI:0008F4*
- ID_OUI_FROM_DATABASE=Bluetake Technology Co., Ltd.
+OUI:00D002*
+ ID_OUI_FROM_DATABASE=DITECH CORPORATION
 
-OUI:0008EB*
- ID_OUI_FROM_DATABASE=ROMWin Co.,Ltd.
+OUI:00D0A6*
+ ID_OUI_FROM_DATABASE=LANBIRD TECHNOLOGY CO., LTD.
 
-OUI:0008E4*
- ID_OUI_FROM_DATABASE=Envenergy Inc
+OUI:00D0DE*
+ ID_OUI_FROM_DATABASE=PHILIPS MULTIMEDIA NETWORK
 
-OUI:0008DF*
- ID_OUI_FROM_DATABASE=Alistel Inc.
+OUI:00D083*
+ ID_OUI_FROM_DATABASE=INVERTEX, INC.
 
-OUI:0008D8*
- ID_OUI_FROM_DATABASE=Dowkey Microwave
+OUI:00D038*
+ ID_OUI_FROM_DATABASE=FIVEMERE, LTD.
 
-OUI:0008D2*
- ID_OUI_FROM_DATABASE=ZOOM Networks Inc.
+OUI:00D00C*
+ ID_OUI_FROM_DATABASE=SNIJDER MICRO SYSTEMS
 
-OUI:0008CC*
- ID_OUI_FROM_DATABASE=Remotec, Inc.
+OUI:00D0F2*
+ ID_OUI_FROM_DATABASE=MONTEREY NETWORKS
 
-OUI:0008D1*
- ID_OUI_FROM_DATABASE=KAREL INC.
+OUI:00D07B*
+ ID_OUI_FROM_DATABASE=COMCAM INTERNATIONAL INC
 
-OUI:000967*
- ID_OUI_FROM_DATABASE=Tachyon, Inc
+OUI:00D05D*
+ ID_OUI_FROM_DATABASE=INTELLIWORXX, INC.
 
-OUI:00096E*
- ID_OUI_FROM_DATABASE=GIANT ELECTRONICS LTD.
+OUI:00D00D*
+ ID_OUI_FROM_DATABASE=MICROMERITICS INSTRUMENT
 
-OUI:00095E*
- ID_OUI_FROM_DATABASE=Masstech Group Inc.
+OUI:00D04C*
+ ID_OUI_FROM_DATABASE=EUROTEL TELECOM LTD.
 
-OUI:000959*
- ID_OUI_FROM_DATABASE=Sitecsoft
+OUI:00D0FD*
+ ID_OUI_FROM_DATABASE=OPTIMA TELE.COM, INC.
 
-OUI:00094D*
- ID_OUI_FROM_DATABASE=Braintree Communications Pty Ltd
+OUI:0030D8*
+ ID_OUI_FROM_DATABASE=SITEK
 
-OUI:000952*
- ID_OUI_FROM_DATABASE=Auerswald GmbH & Co. KG
+OUI:003062*
+ ID_OUI_FROM_DATABASE=IP Video Networks Inc
 
-OUI:000946*
- ID_OUI_FROM_DATABASE=Cluster Labs GmbH
+OUI:003081*
+ ID_OUI_FROM_DATABASE=ALTOS C&C
 
-OUI:000940*
- ID_OUI_FROM_DATABASE=AGFEO GmbH & Co. KG
+OUI:00D0B0*
+ ID_OUI_FROM_DATABASE=BITSWITCH LTD.
 
-OUI:00093F*
- ID_OUI_FROM_DATABASE=Double-Win Enterpirse CO., LTD
+OUI:00D044*
+ ID_OUI_FROM_DATABASE=ALIDIAN NETWORKS, INC.
 
-OUI:00093A*
- ID_OUI_FROM_DATABASE=Molex Fiber Optics
+OUI:00D004*
+ ID_OUI_FROM_DATABASE=PENTACOM LTD.
 
-OUI:000933*
- ID_OUI_FROM_DATABASE=Ophit Co.Ltd.
+OUI:00D045*
+ ID_OUI_FROM_DATABASE=KVASER AB
 
-OUI:000A5C*
- ID_OUI_FROM_DATABASE=Carel s.p.a.
+OUI:00D0D0*
+ ID_OUI_FROM_DATABASE=ZHONGXING TELECOM LTD.
 
-OUI:000A50*
- ID_OUI_FROM_DATABASE=REMOTEK CORPORATION
+OUI:00902C*
+ ID_OUI_FROM_DATABASE=DATA & CONTROL EQUIPMENT LTD.
 
-OUI:000A55*
- ID_OUI_FROM_DATABASE=MARKEM Corporation
+OUI:009049*
+ ID_OUI_FROM_DATABASE=ENTRIDIA CORPORATION
 
-OUI:000A4E*
- ID_OUI_FROM_DATABASE=UNITEK Electronics INC.
+OUI:009043*
+ ID_OUI_FROM_DATABASE=Tattile SRL
 
-OUI:000A42*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:009076*
+ ID_OUI_FROM_DATABASE=FMT AIRCRAFT GATE SUPPORT SYSTEMS AB
 
-OUI:000A49*
- ID_OUI_FROM_DATABASE=F5 Networks, Inc.
+OUI:009017*
+ ID_OUI_FROM_DATABASE=Zypcom, Inc
 
-OUI:000A36*
- ID_OUI_FROM_DATABASE=Synelec Telecom Multimedia
+OUI:00907B*
+ ID_OUI_FROM_DATABASE=E-TECH, INC.
 
-OUI:000A3B*
- ID_OUI_FROM_DATABASE=GCT Semiconductor, Inc
+OUI:00102A*
+ ID_OUI_FROM_DATABASE=ZF MICROSYSTEMS, INC.
 
-OUI:000A3D*
- ID_OUI_FROM_DATABASE=Elo Sistemas Eletronicos S.A.
+OUI:00107D*
+ ID_OUI_FROM_DATABASE=AURORA COMMUNICATIONS, LTD.
 
-OUI:000A2F*
- ID_OUI_FROM_DATABASE=Artnix Inc.
+OUI:00101C*
+ ID_OUI_FROM_DATABASE=OHM TECHNOLOGIES INTL, LLC
 
-OUI:000927*
- ID_OUI_FROM_DATABASE=TOYOKEIKI CO.,LTD.
+OUI:00106C*
+ ID_OUI_FROM_DATABASE=EDNT GmbH
 
-OUI:00092E*
- ID_OUI_FROM_DATABASE=B&Tech System Inc.
+OUI:0010D4*
+ ID_OUI_FROM_DATABASE=STORAGE COMPUTER CORPORATION
 
-OUI:000920*
- ID_OUI_FROM_DATABASE=EpoX COMPUTER CO.,LTD.
+OUI:0010BF*
+ ID_OUI_FROM_DATABASE=InterAir Wireless
 
-OUI:00091B*
- ID_OUI_FROM_DATABASE=Digital Generation Inc.
+OUI:001036*
+ ID_OUI_FROM_DATABASE=INTER-TEL INTEGRATED SYSTEMS
 
-OUI:000914*
- ID_OUI_FROM_DATABASE=COMPUTROLS INC.
+OUI:001026*
+ ID_OUI_FROM_DATABASE=ACCELERATED NETWORKS, INC.
 
-OUI:00090E*
- ID_OUI_FROM_DATABASE=Helix Technology Inc.
+OUI:00104B*
+ ID_OUI_FROM_DATABASE=3COM CORPORATION
 
-OUI:000908*
- ID_OUI_FROM_DATABASE=VTech Technology Corp.
+OUI:000629*
+ ID_OUI_FROM_DATABASE=IBM Corp
 
-OUI:00090D*
- ID_OUI_FROM_DATABASE=LEADER ELECTRONICS CORP.
+OUI:001004*
+ ID_OUI_FROM_DATABASE=THE BRANTLEY COILE COMPANY,INC
 
-OUI:000A20*
- ID_OUI_FROM_DATABASE=SVA Networks, Inc.
+OUI:00103A*
+ ID_OUI_FROM_DATABASE=DIAMOND NETWORK TECH
 
-OUI:000A25*
- ID_OUI_FROM_DATABASE=CERAGON NETWORKS
+OUI:0010D8*
+ ID_OUI_FROM_DATABASE=CALISTA
 
-OUI:000A14*
- ID_OUI_FROM_DATABASE=TECO a.s.
+OUI:001031*
+ ID_OUI_FROM_DATABASE=OBJECTIVE COMMUNICATIONS, INC.
 
-OUI:000A19*
- ID_OUI_FROM_DATABASE=Valere Power, Inc.
+OUI:00107E*
+ ID_OUI_FROM_DATABASE=BACHMANN ELECTRONIC GmbH
 
-OUI:000A0D*
- ID_OUI_FROM_DATABASE=FCI Deutschland GmbH
+OUI:0010C0*
+ ID_OUI_FROM_DATABASE=ARMA, Inc.
 
-OUI:000A12*
- ID_OUI_FROM_DATABASE=Azylex Technology, Inc
+OUI:001016*
+ ID_OUI_FROM_DATABASE=T.SQWARE
 
-OUI:0009F9*
- ID_OUI_FROM_DATABASE=ART JAPAN CO., LTD.
+OUI:00103D*
+ ID_OUI_FROM_DATABASE=PHASECOM, LTD.
 
-OUI:0009FC*
- ID_OUI_FROM_DATABASE=IPFLEX Inc.
+OUI:0010C2*
+ ID_OUI_FROM_DATABASE=WILLNET, INC.
 
-OUI:000A03*
- ID_OUI_FROM_DATABASE=ENDESA SERVICIOS, S.L.
+OUI:00107A*
+ ID_OUI_FROM_DATABASE=AmbiCom, Inc.
 
-OUI:000705*
- ID_OUI_FROM_DATABASE=Endress & Hauser GmbH & Co
+OUI:0010C4*
+ ID_OUI_FROM_DATABASE=MEDIA GLOBAL LINKS CO., LTD.
 
-OUI:0006F8*
- ID_OUI_FROM_DATABASE=The Boeing Company
+OUI:0010EB*
+ ID_OUI_FROM_DATABASE=SELSIUS SYSTEMS, INC.
 
-OUI:0006FF*
- ID_OUI_FROM_DATABASE=Sheba Systems Co., Ltd.
+OUI:0010FE*
+ ID_OUI_FROM_DATABASE=DIGITAL EQUIPMENT CORPORATION
 
-OUI:0006FD*
- ID_OUI_FROM_DATABASE=Comjet Information Systems Corp.
+OUI:00102E*
+ ID_OUI_FROM_DATABASE=NETWORK SYSTEMS & TECHNOLOGIES PVT. LTD.
 
-OUI:0006E7*
- ID_OUI_FROM_DATABASE=Bit Blitz Communications Inc.
+OUI:00103E*
+ ID_OUI_FROM_DATABASE=NETSCHOOLS CORPORATION
 
-OUI:0006ED*
- ID_OUI_FROM_DATABASE=Inara Networks
+OUI:001049*
+ ID_OUI_FROM_DATABASE=ShoreTel, Inc
 
-OUI:0006DC*
- ID_OUI_FROM_DATABASE=Syabas Technology (Amquest)
+OUI:00105E*
+ ID_OUI_FROM_DATABASE=Spirent plc, Service Assurance Broadband
 
-OUI:0006E1*
- ID_OUI_FROM_DATABASE=Techno Trade s.a
+OUI:005088*
+ ID_OUI_FROM_DATABASE=AMANO CORPORATION
 
-OUI:0006E6*
- ID_OUI_FROM_DATABASE=DongYang Telecom Co., Ltd.
+OUI:0050A8*
+ ID_OUI_FROM_DATABASE=OpenCon Systems, Inc.
 
-OUI:0006CF*
- ID_OUI_FROM_DATABASE=Thales Avionics In-Flight Systems, LLC
+OUI:005062*
+ ID_OUI_FROM_DATABASE=KOUWELL ELECTRONICS CORP.  **
 
-OUI:0006D6*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0050B1*
+ ID_OUI_FROM_DATABASE=GIDDINGS & LEWIS
 
-OUI:0006D5*
- ID_OUI_FROM_DATABASE=Diamond Systems Corp.
+OUI:00500C*
+ ID_OUI_FROM_DATABASE=e-Tek Labs, Inc.
 
-OUI:0006C9*
- ID_OUI_FROM_DATABASE=Technical Marketing Research, Inc.
+OUI:005091*
+ ID_OUI_FROM_DATABASE=NETACCESS, INC.
 
-OUI:0007B1*
- ID_OUI_FROM_DATABASE=Equator Technologies
+OUI:005097*
+ ID_OUI_FROM_DATABASE=MMC-EMBEDDED COMPUTERTECHNIK GmbH
 
-OUI:0007B8*
- ID_OUI_FROM_DATABASE=Corvalent Corporation
+OUI:0050AF*
+ ID_OUI_FROM_DATABASE=INTERGON, INC.
 
-OUI:0007B2*
- ID_OUI_FROM_DATABASE=Transaccess S.A.
+OUI:0050EB*
+ ID_OUI_FROM_DATABASE=ALPHA-TOP CORPORATION
 
-OUI:0007A4*
- ID_OUI_FROM_DATABASE=GN Netcom Ltd.
+OUI:0050BC*
+ ID_OUI_FROM_DATABASE=HAMMER STORAGE SOLUTIONS
 
-OUI:0007AA*
- ID_OUI_FROM_DATABASE=Quantum Data Inc.
+OUI:0090C3*
+ ID_OUI_FROM_DATABASE=TOPIC SEMICONDUCTOR CORP.
 
-OUI:00079D*
- ID_OUI_FROM_DATABASE=Musashi Co., Ltd.
+OUI:0090EC*
+ ID_OUI_FROM_DATABASE=PYRESCOM
 
-OUI:00079E*
- ID_OUI_FROM_DATABASE=Ilinx Co., Ltd.
+OUI:00903B*
+ ID_OUI_FROM_DATABASE=TriEMS Research Lab, Inc.
 
-OUI:000774*
- ID_OUI_FROM_DATABASE=GuangZhou Thinker Technology Co. Ltd.
+OUI:009074*
+ ID_OUI_FROM_DATABASE=ARGON NETWORKS, INC.
 
-OUI:000791*
- ID_OUI_FROM_DATABASE=International Data Communications, Inc.
+OUI:0090C1*
+ ID_OUI_FROM_DATABASE=Peco II, Inc.
 
-OUI:000798*
- ID_OUI_FROM_DATABASE=Selea SRL
+OUI:0010D3*
+ ID_OUI_FROM_DATABASE=GRIPS ELECTRONIC GMBH
 
-OUI:000797*
- ID_OUI_FROM_DATABASE=Netpower Co., Ltd.
+OUI:0010ED*
+ ID_OUI_FROM_DATABASE=SUNDANCE TECHNOLOGY, INC.
 
-OUI:00078B*
- ID_OUI_FROM_DATABASE=Wegener Communications, Inc.
+OUI:001023*
+ ID_OUI_FROM_DATABASE=Network Equipment Technologies
 
-OUI:000785*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00104E*
+ ID_OUI_FROM_DATABASE=CEOLOGIC
 
-OUI:00077B*
- ID_OUI_FROM_DATABASE=Millimetrix Broadband Networks
+OUI:0010FB*
+ ID_OUI_FROM_DATABASE=ZIDA TECHNOLOGIES LIMITED
 
-OUI:000856*
- ID_OUI_FROM_DATABASE=Gamatronic Electronic Industries Ltd.
+OUI:0010AD*
+ ID_OUI_FROM_DATABASE=SOFTRONICS USB, INC.
 
-OUI:00082D*
- ID_OUI_FROM_DATABASE=Indus Teqsite Private Limited
+OUI:0010D5*
+ ID_OUI_FROM_DATABASE=IMASDE CANARIAS, S.A.
 
-OUI:000821*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0010E5*
+ ID_OUI_FROM_DATABASE=SOLECTRON TEXAS
 
-OUI:000814*
- ID_OUI_FROM_DATABASE=TIL Technologies
+OUI:00909D*
+ ID_OUI_FROM_DATABASE=NovaTech Process Solutions, LLC
 
-OUI:00081A*
- ID_OUI_FROM_DATABASE=Sanrad Intelligence Storage Communications (2000) Ltd.
+OUI:009038*
+ ID_OUI_FROM_DATABASE=FOUNTAIN TECHNOLOGIES, INC.
 
-OUI:00080F*
- ID_OUI_FROM_DATABASE=Proximion Fiber Optics AB
+OUI:0090C5*
+ ID_OUI_FROM_DATABASE=INTERNET MAGIC, INC.
 
-OUI:000809*
- ID_OUI_FROM_DATABASE=Systemonic AG
+OUI:0090AD*
+ ID_OUI_FROM_DATABASE=ASPECT ELECTRONICS, INC.
 
-OUI:000803*
- ID_OUI_FROM_DATABASE=Cos Tron
+OUI:009097*
+ ID_OUI_FROM_DATABASE=Sycamore Networks
 
-OUI:0007FF*
- ID_OUI_FROM_DATABASE=Gluon Networks
+OUI:009008*
+ ID_OUI_FROM_DATABASE=HanA Systems Inc.
 
-OUI:0007F9*
- ID_OUI_FROM_DATABASE=Sensaphone
+OUI:0090D4*
+ ID_OUI_FROM_DATABASE=BindView Development Corp.
 
-OUI:000894*
- ID_OUI_FROM_DATABASE=InnoVISION Multimedia Ltd.
+OUI:009089*
+ ID_OUI_FROM_DATABASE=SOFTCOM MICROSYSTEMS, INC.
 
-OUI:00088F*
- ID_OUI_FROM_DATABASE=ADVANCED DIGITAL TECHNOLOGY
+OUI:0090C4*
+ ID_OUI_FROM_DATABASE=JAVELIN SYSTEMS, INC.
 
-OUI:000888*
- ID_OUI_FROM_DATABASE=OULLIM Information Technology Inc,.
+OUI:009014*
+ ID_OUI_FROM_DATABASE=ROTORK INSTRUMENTS, LTD.
 
-OUI:000882*
- ID_OUI_FROM_DATABASE=SIGMA CORPORATION
+OUI:0090B5*
+ ID_OUI_FROM_DATABASE=NIKON CORPORATION
 
-OUI:00087C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0090C6*
+ ID_OUI_FROM_DATABASE=OPTIM SYSTEMS, INC.
 
-OUI:000875*
- ID_OUI_FROM_DATABASE=Acorp Electronics Corp.
+OUI:00909B*
+ ID_OUI_FROM_DATABASE=MARKEM-IMAJE
 
-OUI:000870*
- ID_OUI_FROM_DATABASE=Rasvia Systems, Inc.
+OUI:00905B*
+ ID_OUI_FROM_DATABASE=RAYMOND AND LAE ENGINEERING
 
-OUI:00086F*
- ID_OUI_FROM_DATABASE=Resources Computer Network Ltd.
+OUI:0090E8*
+ ID_OUI_FROM_DATABASE=MOXA TECHNOLOGIES CORP., LTD.
 
-OUI:000869*
- ID_OUI_FROM_DATABASE=Command-e Technology Co.,Ltd.
+OUI:0090A1*
+ ID_OUI_FROM_DATABASE=Flying Pig Systems/High End Systems Inc.
 
-OUI:000863*
- ID_OUI_FROM_DATABASE=Entrisphere Inc.
+OUI:0090FD*
+ ID_OUI_FROM_DATABASE=CopperCom, Inc.
 
-OUI:00085D*
- ID_OUI_FROM_DATABASE=Aastra
+OUI:0090AC*
+ ID_OUI_FROM_DATABASE=OPTIVISION, INC.
 
-OUI:000862*
- ID_OUI_FROM_DATABASE=NEC Eluminant Technologies, Inc.
+OUI:00902A*
+ ID_OUI_FROM_DATABASE=COMMUNICATION DEVICES, INC.
 
-OUI:000850*
- ID_OUI_FROM_DATABASE=Arizona Instrument Corp.
+OUI:009098*
+ ID_OUI_FROM_DATABASE=SBC DESIGNS, INC.
 
-OUI:000738*
- ID_OUI_FROM_DATABASE=Young Technology Co., Ltd.
+OUI:0090CF*
+ ID_OUI_FROM_DATABASE=NORTEL
 
-OUI:00073F*
- ID_OUI_FROM_DATABASE=Woojyun Systec Co., Ltd.
+OUI:00900F*
+ ID_OUI_FROM_DATABASE=KAWASAKI HEAVY INDUSTRIES, LTD
 
-OUI:00072C*
- ID_OUI_FROM_DATABASE=Fabricom
+OUI:009036*
+ ID_OUI_FROM_DATABASE=ens, inc.
 
-OUI:000733*
- ID_OUI_FROM_DATABASE=DANCONTROL Engineering
+OUI:0090E9*
+ ID_OUI_FROM_DATABASE=JANZ COMPUTER AG
 
-OUI:000732*
- ID_OUI_FROM_DATABASE=AAEON Technology Inc.
+OUI:009032*
+ ID_OUI_FROM_DATABASE=PELCOMBE GROUP LTD.
 
-OUI:000716*
- ID_OUI_FROM_DATABASE=J & S Marine Ltd.
+OUI:0090B8*
+ ID_OUI_FROM_DATABASE=ROHDE & SCHWARZ GMBH & CO. KG
 
-OUI:00071B*
- ID_OUI_FROM_DATABASE=CDVI Americas Ltd
+OUI:0090BE*
+ ID_OUI_FROM_DATABASE=IBC/INTEGRATED BUSINESS COMPUTERS
 
-OUI:000722*
- ID_OUI_FROM_DATABASE=The Nielsen Company
+OUI:009062*
+ ID_OUI_FROM_DATABASE=ICP VORTEX COMPUTERSYSTEME GmbH
 
-OUI:00071C*
- ID_OUI_FROM_DATABASE=AT&T Fixed Wireless Services
+OUI:00108F*
+ ID_OUI_FROM_DATABASE=RAPTOR SYSTEMS
 
-OUI:00070A*
- ID_OUI_FROM_DATABASE=Unicom Automation Co., Ltd.
+OUI:001089*
+ ID_OUI_FROM_DATABASE=WebSonic
 
-OUI:00070F*
- ID_OUI_FROM_DATABASE=Fujant, Inc.
+OUI:001086*
+ ID_OUI_FROM_DATABASE=ATTO Technology, Inc.
 
-OUI:000709*
- ID_OUI_FROM_DATABASE=Westerstrand Urfabrik AB
+OUI:001027*
+ ID_OUI_FROM_DATABASE=L-3 COMMUNICATIONS EAST
+
+OUI:0010B8*
+ ID_OUI_FROM_DATABASE=ISHIGAKI COMPUTER SYSTEM CO.
 
-OUI:000702*
- ID_OUI_FROM_DATABASE=Varian Medical Systems
+OUI:00104C*
+ ID_OUI_FROM_DATABASE=Teledyne LeCroy, Inc
 
-OUI:0006F3*
- ID_OUI_FROM_DATABASE=AcceLight Networks
+OUI:001001*
+ ID_OUI_FROM_DATABASE=Citel
 
-OUI:0006C3*
- ID_OUI_FROM_DATABASE=Schindler Elevator Ltd.
+OUI:0010CF*
+ ID_OUI_FROM_DATABASE=FIBERLANE COMMUNICATIONS
 
-OUI:0006C8*
- ID_OUI_FROM_DATABASE=Sumitomo Metal Micro Devices, Inc.
+OUI:001068*
+ ID_OUI_FROM_DATABASE=COMOS TELECOM
 
-OUI:0006BF*
- ID_OUI_FROM_DATABASE=Accella Technologies Co., Ltd.
+OUI:001067*
+ ID_OUI_FROM_DATABASE=Ericsson
 
-OUI:0006B9*
- ID_OUI_FROM_DATABASE=A5TEK Corp.
+OUI:0010F1*
+ ID_OUI_FROM_DATABASE=I-O CORPORATION
 
-OUI:0006B2*
- ID_OUI_FROM_DATABASE=Linxtek Co.
+OUI:001073*
+ ID_OUI_FROM_DATABASE=TECHNOBOX, INC.
 
-OUI:0006AC*
- ID_OUI_FROM_DATABASE=Intersoft Co.
+OUI:00E0C0*
+ ID_OUI_FROM_DATABASE=SEIWA ELECTRIC MFG. CO., LTD.
 
-OUI:0006A6*
- ID_OUI_FROM_DATABASE=Artistic Licence Engineering Ltd
+OUI:00E046*
+ ID_OUI_FROM_DATABASE=BENTLY NEVADA CORP.
 
-OUI:0006A2*
- ID_OUI_FROM_DATABASE=Microtune, Inc.
+OUI:00E015*
+ ID_OUI_FROM_DATABASE=HEIWA CORPORATION
 
-OUI:000695*
- ID_OUI_FROM_DATABASE=Ensure Technologies, Inc.
+OUI:00E065*
+ ID_OUI_FROM_DATABASE=OPTICAL ACCESS INTERNATIONAL
 
-OUI:00069C*
- ID_OUI_FROM_DATABASE=Transmode Systems AB
+OUI:00E069*
+ ID_OUI_FROM_DATABASE=JAYCOR
 
-OUI:000696*
- ID_OUI_FROM_DATABASE=Advent Networks
+OUI:00E05C*
+ ID_OUI_FROM_DATABASE=Panasonic Healthcare Co., Ltd.
 
-OUI:0007F3*
- ID_OUI_FROM_DATABASE=Thinkengine Networks
+OUI:00E087*
+ ID_OUI_FROM_DATABASE=LeCroy - Networking Productions Division
 
-OUI:0007EC*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00E049*
+ ID_OUI_FROM_DATABASE=MICROWI ELECTRONIC GmbH
 
-OUI:0007F2*
- ID_OUI_FROM_DATABASE=IOA Corporation
+OUI:00E050*
+ ID_OUI_FROM_DATABASE=EXECUTONE INFORMATION SYSTEMS, INC.
 
-OUI:0007E6*
- ID_OUI_FROM_DATABASE=edgeflow Canada Inc.
+OUI:00E064*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRONICS
 
-OUI:0007E0*
- ID_OUI_FROM_DATABASE=Palm Inc.
+OUI:00E012*
+ ID_OUI_FROM_DATABASE=PLUTO TECHNOLOGIES INTERNATIONAL INC.
 
-OUI:0007D9*
- ID_OUI_FROM_DATABASE=Splicecom
+OUI:00E0D8*
+ ID_OUI_FROM_DATABASE=LANBit Computer, Inc.
 
-OUI:0007DA*
- ID_OUI_FROM_DATABASE=Neuro Telecom Co., Ltd.
+OUI:00E02D*
+ ID_OUI_FROM_DATABASE=InnoMediaLogic, Inc.
 
-OUI:0007D3*
- ID_OUI_FROM_DATABASE=SPGPrints B.V.
+OUI:00E0A9*
+ ID_OUI_FROM_DATABASE=FUNAI ELECTRIC CO., LTD.
 
-OUI:0007CA*
- ID_OUI_FROM_DATABASE=Creatix Polymedia Ges Fur Kommunikaitonssysteme
+OUI:00E035*
+ ID_OUI_FROM_DATABASE=Artesyn Embedded Technologies
 
-OUI:0007C4*
- ID_OUI_FROM_DATABASE=JEAN Co. Ltd.
+OUI:00E060*
+ ID_OUI_FROM_DATABASE=SHERWOOD
 
-OUI:0007BE*
- ID_OUI_FROM_DATABASE=DataLogic SpA
+OUI:00E0A2*
+ ID_OUI_FROM_DATABASE=MICROSLATE INC.
 
-OUI:00077E*
- ID_OUI_FROM_DATABASE=Elrest GmbH
+OUI:00E0CE*
+ ID_OUI_FROM_DATABASE=ARN
 
-OUI:00076F*
- ID_OUI_FROM_DATABASE=Synoptics Limited
+OUI:00E05F*
+ ID_OUI_FROM_DATABASE=e-Net, Inc.
 
-OUI:00076E*
- ID_OUI_FROM_DATABASE=Sinetica Corporation Limited
+OUI:00E0C7*
+ ID_OUI_FROM_DATABASE=EUROTECH SRL
 
-OUI:00076A*
- ID_OUI_FROM_DATABASE=NEXTEYE Co., Ltd.
+OUI:00E0C4*
+ ID_OUI_FROM_DATABASE=HORNER ELECTRIC, INC.
 
-OUI:00075E*
- ID_OUI_FROM_DATABASE=Ametek Power Instruments
+OUI:00E04D*
+ ID_OUI_FROM_DATABASE=INTERNET INITIATIVE JAPAN, INC
 
-OUI:000765*
- ID_OUI_FROM_DATABASE=Jade Quantum Technologies, Inc.
+OUI:00607F*
+ ID_OUI_FROM_DATABASE=AURORA TECHNOLOGIES, INC.
 
-OUI:000764*
- ID_OUI_FROM_DATABASE=YoungWoo Telecom Co. Ltd.
+OUI:00E039*
+ ID_OUI_FROM_DATABASE=PARADYNE CORP.
 
-OUI:000757*
- ID_OUI_FROM_DATABASE=Topcall International AG
+OUI:006091*
+ ID_OUI_FROM_DATABASE=FIRST PACIFIC NETWORKS, INC.
 
-OUI:000758*
- ID_OUI_FROM_DATABASE=Dragonwave
+OUI:006002*
+ ID_OUI_FROM_DATABASE=SCREEN SUBTITLING SYSTEMS, LTD
 
-OUI:000752*
- ID_OUI_FROM_DATABASE=Rhythm Watch Co., Ltd.
+OUI:006061*
+ ID_OUI_FROM_DATABASE=WHISTLE COMMUNICATIONS CORP.
 
-OUI:00074B*
- ID_OUI_FROM_DATABASE=Daihen Corporation
+OUI:00E0A1*
+ ID_OUI_FROM_DATABASE=HIMA PAUL HILDEBRANDT GmbH Co. KG
 
-OUI:000745*
- ID_OUI_FROM_DATABASE=Radlan Computer Communications Ltd.
+OUI:00E028*
+ ID_OUI_FROM_DATABASE=APTIX CORPORATION
 
-OUI:0008C2*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00E0F2*
+ ID_OUI_FROM_DATABASE=ARLOTTO COMNET, INC.
 
-OUI:0008BB*
- ID_OUI_FROM_DATABASE=NetExcell
+OUI:00E020*
+ ID_OUI_FROM_DATABASE=TECNOMEN OY
 
-OUI:0008B5*
- ID_OUI_FROM_DATABASE=TAI GUEN ENTERPRISE CO., LTD
+OUI:00E0C5*
+ ID_OUI_FROM_DATABASE=BCOM ELECTRONICS INC.
 
-OUI:0008B6*
- ID_OUI_FROM_DATABASE=RouteFree, Inc.
+OUI:00E0EE*
+ ID_OUI_FROM_DATABASE=MAREL HF
 
-OUI:0008AF*
- ID_OUI_FROM_DATABASE=Novatec Corporation
+OUI:00E0AC*
+ ID_OUI_FROM_DATABASE=MIDSCO, INC.
 
-OUI:0008A9*
- ID_OUI_FROM_DATABASE=SangSang Technology, Inc.
+OUI:00E002*
+ ID_OUI_FROM_DATABASE=CROSSROADS SYSTEMS, INC.
 
-OUI:0008A8*
- ID_OUI_FROM_DATABASE=Systec Co., Ltd.
+OUI:00E057*
+ ID_OUI_FROM_DATABASE=HAN MICROTELECOM. CO., LTD.
 
-OUI:0008A3*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00E0F0*
+ ID_OUI_FROM_DATABASE=ABLER TECHNOLOGY, INC.
 
-OUI:00089C*
- ID_OUI_FROM_DATABASE=Elecs Industry Co., Ltd.
+OUI:00E0B7*
+ ID_OUI_FROM_DATABASE=PI GROUP, LTD.
 
-OUI:000690*
- ID_OUI_FROM_DATABASE=Euracom Communication GmbH
+OUI:0010B1*
+ ID_OUI_FROM_DATABASE=FOR-A CO., LTD.
 
-OUI:00068F*
- ID_OUI_FROM_DATABASE=Telemonitor, Inc.
+OUI:001041*
+ ID_OUI_FROM_DATABASE=BRISTOL BABCOCK, INC.
 
-OUI:000689*
- ID_OUI_FROM_DATABASE=yLez Technologies Pte Ltd
+OUI:0010F7*
+ ID_OUI_FROM_DATABASE=IRIICHI TECHNOLOGIES Inc.
 
-OUI:000683*
- ID_OUI_FROM_DATABASE=Bravara Communications, Inc.
+OUI:0010E6*
+ ID_OUI_FROM_DATABASE=APPLIED INTELLIGENT SYSTEMS, INC.
 
-OUI:00D0B9*
- ID_OUI_FROM_DATABASE=MICROTEK INTERNATIONAL, INC.
+OUI:00101E*
+ ID_OUI_FROM_DATABASE=MATSUSHITA ELECTRONIC INSTRUMENTS CORP.
 
-OUI:00067D*
- ID_OUI_FROM_DATABASE=Takasago Ltd.
+OUI:0010F2*
+ ID_OUI_FROM_DATABASE=ANTEC
 
-OUI:000675*
- ID_OUI_FROM_DATABASE=Banderacom, Inc.
+OUI:0010BE*
+ ID_OUI_FROM_DATABASE=MARCH NETWORKS CORPORATION
 
-OUI:000679*
- ID_OUI_FROM_DATABASE=Konami Corporation
+OUI:006058*
+ ID_OUI_FROM_DATABASE=COPPER MOUNTAIN COMMUNICATIONS, INC.
 
-OUI:000663*
- ID_OUI_FROM_DATABASE=Human Technology Co., Ltd.
+OUI:00601B*
+ ID_OUI_FROM_DATABASE=MESA ELECTRONICS
 
-OUI:00066F*
- ID_OUI_FROM_DATABASE=Korea Data Systems
+OUI:0060FF*
+ ID_OUI_FROM_DATABASE=QuVis, Inc.
 
-OUI:000662*
- ID_OUI_FROM_DATABASE=MBM Technology Ltd.
+OUI:006056*
+ ID_OUI_FROM_DATABASE=NETWORK TOOLS, INC.
 
-OUI:000669*
- ID_OUI_FROM_DATABASE=Datasound Laboratories Ltd
+OUI:0060D8*
+ ID_OUI_FROM_DATABASE=ELMIC SYSTEMS, INC.
 
-OUI:00055A*
- ID_OUI_FROM_DATABASE=Power Dsine Ltd.
+OUI:00607A*
+ ID_OUI_FROM_DATABASE=DVS GMBH
 
-OUI:00065C*
- ID_OUI_FROM_DATABASE=Malachite Technologies, Inc.
+OUI:006097*
+ ID_OUI_FROM_DATABASE=3COM CORPORATION
 
-OUI:000610*
- ID_OUI_FROM_DATABASE=Abeona Networks Inc
+OUI:0060E3*
+ ID_OUI_FROM_DATABASE=ARBIN INSTRUMENTS
 
-OUI:000616*
- ID_OUI_FROM_DATABASE=Tel Net Co., Ltd.
+OUI:00E0FD*
+ ID_OUI_FROM_DATABASE=A-TREND TECHNOLOGY CO., LTD.
 
-OUI:00060A*
- ID_OUI_FROM_DATABASE=Blue2space
+OUI:00E0FB*
+ ID_OUI_FROM_DATABASE=LEIGHTRONIX, INC.
 
-OUI:000604*
- ID_OUI_FROM_DATABASE=@Track Communications, Inc.
+OUI:00E0D3*
+ ID_OUI_FROM_DATABASE=DATENTECHNIK GmbH
 
-OUI:00CBBD*
- ID_OUI_FROM_DATABASE=Cambridge Broadband Networks Ltd.
+OUI:00E05E*
+ ID_OUI_FROM_DATABASE=JAPAN AVIATION ELECTRONICS INDUSTRY, LTD.
 
-OUI:000603*
- ID_OUI_FROM_DATABASE=Baker Hughes Inc.
+OUI:00E0E5*
+ ID_OUI_FROM_DATABASE=CINCO NETWORKS, INC.
 
-OUI:A06A00*
- ID_OUI_FROM_DATABASE=Verilink Corporation
+OUI:00A0FD*
+ ID_OUI_FROM_DATABASE=SCITEX DIGITAL PRINTING, INC.
 
-OUI:0005F5*
- ID_OUI_FROM_DATABASE=Geospace Technologies
+OUI:00A0F5*
+ ID_OUI_FROM_DATABASE=RADGUARD LTD.
 
-OUI:000601*
- ID_OUI_FROM_DATABASE=Otanikeiki Co., Ltd.
+OUI:00A022*
+ ID_OUI_FROM_DATABASE=CENTRE FOR DEVELOPMENT OF ADVANCED COMPUTING
 
-OUI:0005E8*
- ID_OUI_FROM_DATABASE=TurboWave, Inc.
+OUI:00A087*
+ ID_OUI_FROM_DATABASE=Microsemi Corporation
 
-OUI:0005F4*
- ID_OUI_FROM_DATABASE=System Base Co., Ltd.
+OUI:00A007*
+ ID_OUI_FROM_DATABASE=APEXX TECHNOLOGY, INC.
 
-OUI:0005FB*
- ID_OUI_FROM_DATABASE=ShareGate, Inc.
+OUI:00A066*
+ ID_OUI_FROM_DATABASE=ISA CO., LTD.
 
-OUI:0005DB*
- ID_OUI_FROM_DATABASE=PSI Nentec GmbH
+OUI:00A0AB*
+ ID_OUI_FROM_DATABASE=NETCS INFORMATIONSTECHNIK GMBH
 
-OUI:0005DF*
- ID_OUI_FROM_DATABASE=Electronic Innovation, Inc.
+OUI:00A0D8*
+ ID_OUI_FROM_DATABASE=SPECTRA - TEK
 
-OUI:0005CF*
- ID_OUI_FROM_DATABASE=Thunder River Technologies, Inc.
+OUI:00A01A*
+ ID_OUI_FROM_DATABASE=BINAR ELEKTRONIK AB
 
-OUI:0005C9*
- ID_OUI_FROM_DATABASE=LG Innotek Co., Ltd.
+OUI:00A0E8*
+ ID_OUI_FROM_DATABASE=REUTERS HOLDINGS PLC
 
-OUI:0005D5*
- ID_OUI_FROM_DATABASE=Speedcom Wireless
+OUI:00A076*
+ ID_OUI_FROM_DATABASE=CARDWARE LAB, INC.
 
-OUI:0005BC*
- ID_OUI_FROM_DATABASE=Resource Data Management Ltd
+OUI:00A0A3*
+ ID_OUI_FROM_DATABASE=RELIABLE POWER METERS
 
-OUI:0005C2*
- ID_OUI_FROM_DATABASE=Soronti, Inc.
+OUI:00A055*
+ ID_OUI_FROM_DATABASE=Data Device Corporation
 
-OUI:0005B0*
- ID_OUI_FROM_DATABASE=Korea Computer Technology Co., Ltd.
+OUI:00A065*
+ ID_OUI_FROM_DATABASE=Symantec Corporation
 
-OUI:00059C*
- ID_OUI_FROM_DATABASE=Kleinknecht GmbH, Ing. Büro
+OUI:00A044*
+ ID_OUI_FROM_DATABASE=NTT IT CO., LTD.
 
-OUI:0005B6*
- ID_OUI_FROM_DATABASE=INSYS Microelectronics GmbH
+OUI:006008*
+ ID_OUI_FROM_DATABASE=3COM CORPORATION
 
-OUI:0005A2*
- ID_OUI_FROM_DATABASE=CELOX Networks
+OUI:0060EF*
+ ID_OUI_FROM_DATABASE=FLYTECH TECHNOLOGY CO., LTD.
 
-OUI:0005AC*
- ID_OUI_FROM_DATABASE=Northern Digital, Inc.
+OUI:006098*
+ ID_OUI_FROM_DATABASE=HT COMMUNICATIONS
 
-OUI:0004E5*
- ID_OUI_FROM_DATABASE=Glonet Systems, Inc.
+OUI:0060F7*
+ ID_OUI_FROM_DATABASE=DATAFUSION SYSTEMS
 
-OUI:0004D9*
- ID_OUI_FROM_DATABASE=Titan Electronics, Inc.
+OUI:0060DE*
+ ID_OUI_FROM_DATABASE=Kayser-Threde GmbH
 
-OUI:0004D3*
- ID_OUI_FROM_DATABASE=Toyokeiki Co., Ltd.
+OUI:0060D0*
+ ID_OUI_FROM_DATABASE=SNMP RESEARCH INCORPORATED
 
-OUI:0004CC*
- ID_OUI_FROM_DATABASE=Peek Traffic B.V.
+OUI:006079*
+ ID_OUI_FROM_DATABASE=Mainstream Data, Inc.
 
-OUI:0004C0*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:006020*
+ ID_OUI_FROM_DATABASE=PIVOTAL NETWORKING, INC.
 
-OUI:0004B9*
- ID_OUI_FROM_DATABASE=S.I. Soubou, Inc.
+OUI:0005A8*
+ ID_OUI_FROM_DATABASE=WYLE ELECTRONICS
 
-OUI:0004BA*
- ID_OUI_FROM_DATABASE=KDD Media Will Corporation
+OUI:0060B7*
+ ID_OUI_FROM_DATABASE=CHANNELMATIC, INC.
 
-OUI:0004AF*
- ID_OUI_FROM_DATABASE=Digital Fountain, Inc.
+OUI:0060A3*
+ ID_OUI_FROM_DATABASE=CONTINUUM TECHNOLOGY CORP.
 
-OUI:0004B4*
- ID_OUI_FROM_DATABASE=CIAC
+OUI:006050*
+ ID_OUI_FROM_DATABASE=INTERNIX INC.
 
-OUI:0004B3*
- ID_OUI_FROM_DATABASE=Videotek, Inc.
+OUI:0060E0*
+ ID_OUI_FROM_DATABASE=AXIOM TECHNOLOGY CO., LTD.
 
-OUI:0004A6*
- ID_OUI_FROM_DATABASE=SAF Tehnika Ltd.
+OUI:0060A8*
+ ID_OUI_FROM_DATABASE=TIDOMAT AB
 
-OUI:0004A0*
- ID_OUI_FROM_DATABASE=Verity Instruments, Inc.
+OUI:00A056*
+ ID_OUI_FROM_DATABASE=MICROPROSS
 
-OUI:00050C*
- ID_OUI_FROM_DATABASE=Network Photonics, Inc.
+OUI:00A051*
+ ID_OUI_FROM_DATABASE=ANGIA COMMUNICATIONS. INC.
 
-OUI:000512*
- ID_OUI_FROM_DATABASE=Zebra Technologies Inc
+OUI:00A0A6*
+ ID_OUI_FROM_DATABASE=M.I. SYSTEMS, K.K.
 
-OUI:000506*
- ID_OUI_FROM_DATABASE=Reddo Networks AB
+OUI:00A05F*
+ ID_OUI_FROM_DATABASE=BTG Electronics Design BV
 
-OUI:0004FC*
- ID_OUI_FROM_DATABASE=Stratus Computer (DE), Inc.
+OUI:00A094*
+ ID_OUI_FROM_DATABASE=COMSAT CORPORATION
 
-OUI:0004F6*
- ID_OUI_FROM_DATABASE=Amphus
+OUI:00A010*
+ ID_OUI_FROM_DATABASE=SYSLOGIC DATENTECHNIK AG
 
-OUI:0004F5*
- ID_OUI_FROM_DATABASE=SnowShore Networks, Inc.
+OUI:00A063*
+ ID_OUI_FROM_DATABASE=JRL SYSTEMS, INC.
 
-OUI:0004E9*
- ID_OUI_FROM_DATABASE=Infiniswitch Corporation
+OUI:00A08F*
+ ID_OUI_FROM_DATABASE=DESKNET SYSTEMS, INC.
 
-OUI:0004F0*
- ID_OUI_FROM_DATABASE=International Computers, Ltd
+OUI:00A0CC*
+ ID_OUI_FROM_DATABASE=LITE-ON COMMUNICATIONS, INC.
 
-OUI:0004EF*
- ID_OUI_FROM_DATABASE=Polestar Corp.
+OUI:00A090*
+ ID_OUI_FROM_DATABASE=TimeStep Corporation
 
-OUI:0004DF*
- ID_OUI_FROM_DATABASE=Teracom Telematica Ltda.
+OUI:00A0F7*
+ ID_OUI_FROM_DATABASE=V.I COMPUTER CORP.
 
-OUI:000553*
- ID_OUI_FROM_DATABASE=DVC Company, Inc.
+OUI:00A09C*
+ ID_OUI_FROM_DATABASE=Xyplex, Inc.
 
-OUI:000548*
- ID_OUI_FROM_DATABASE=Disco Corporation
+OUI:00A092*
+ ID_OUI_FROM_DATABASE=H. BOLLMANN MANUFACTURERS, LTD
 
-OUI:00054D*
- ID_OUI_FROM_DATABASE=Brans Technologies, Inc.
+OUI:00A04D*
+ ID_OUI_FROM_DATABASE=EDA INSTRUMENTS, INC.
 
-OUI:000542*
- ID_OUI_FROM_DATABASE=Otari, Inc.
+OUI:00A0DB*
+ ID_OUI_FROM_DATABASE=FISHER & PAYKEL PRODUCTION
 
-OUI:00053C*
- ID_OUI_FROM_DATABASE=XIRCOM
+OUI:00A0A5*
+ ID_OUI_FROM_DATABASE=TEKNOR MICROSYSTEME, INC.
 
-OUI:00052F*
- ID_OUI_FROM_DATABASE=Leviton Network Solutions
+OUI:00A018*
+ ID_OUI_FROM_DATABASE=CREATIVE CONTROLLERS, INC.
 
-OUI:00053B*
- ID_OUI_FROM_DATABASE=Harbour Networks Ltd., Co. Beijing
+OUI:00A09F*
+ ID_OUI_FROM_DATABASE=COMMVISION CORP.
 
-OUI:000535*
- ID_OUI_FROM_DATABASE=Chip PC Ltd.
+OUI:00A06B*
+ ID_OUI_FROM_DATABASE=DMS DORSCH MIKROSYSTEM GMBH
 
-OUI:000529*
- ID_OUI_FROM_DATABASE=Shanghai Broadan Communication Technology Co., Ltd
+OUI:006051*
+ ID_OUI_FROM_DATABASE=QUALITY SEMICONDUCTOR
 
-OUI:000523*
- ID_OUI_FROM_DATABASE=AVL List GmbH
+OUI:00605E*
+ ID_OUI_FROM_DATABASE=LIBERTY TECHNOLOGY NETWORKING
 
-OUI:000522*
- ID_OUI_FROM_DATABASE=LEA*D Corporation, Inc.
+OUI:0060C6*
+ ID_OUI_FROM_DATABASE=DCS AG
 
-OUI:00051C*
- ID_OUI_FROM_DATABASE=Xnet Technology Corp.
+OUI:00609E*
+ ID_OUI_FROM_DATABASE=ASC X3 - INFORMATION TECHNOLOGY STANDARDS SECRETARIATS
 
-OUI:000516*
- ID_OUI_FROM_DATABASE=SMART Modular Technologies
+OUI:006084*
+ ID_OUI_FROM_DATABASE=DIGITAL VIDEO
 
-OUI:000650*
- ID_OUI_FROM_DATABASE=Tiburon Networks, Inc.
+OUI:00602D*
+ ID_OUI_FROM_DATABASE=ALERTON TECHNOLOGIES, INC.
 
-OUI:000656*
- ID_OUI_FROM_DATABASE=Tactel AB
+OUI:006093*
+ ID_OUI_FROM_DATABASE=VARIAN
 
-OUI:00062D*
- ID_OUI_FROM_DATABASE=TouchStar Technologies, L.L.C.
+OUI:0060E2*
+ ID_OUI_FROM_DATABASE=QUEST ENGINEERING & DEVELOPMENT
 
-OUI:000649*
- ID_OUI_FROM_DATABASE=3M Deutschland GmbH
+OUI:00A039*
+ ID_OUI_FROM_DATABASE=ROSS TECHNOLOGY, INC.
 
-OUI:000643*
- ID_OUI_FROM_DATABASE=SONO Computer Co., Ltd.
+OUI:00A06D*
+ ID_OUI_FROM_DATABASE=MANNESMANN TALLY CORPORATION
 
-OUI:00064A*
- ID_OUI_FROM_DATABASE=Honeywell Co., Ltd. (KOREA)
+OUI:00608E*
+ ID_OUI_FROM_DATABASE=HE ELECTRONICS, TECHNOLOGIE & SYSTEMTECHNIK GmbH
 
-OUI:00063F*
- ID_OUI_FROM_DATABASE=Everex Communications Inc.
+OUI:0060F0*
+ ID_OUI_FROM_DATABASE=JOHNSON & JOHNSON MEDICAL, INC
 
-OUI:000639*
- ID_OUI_FROM_DATABASE=Newtec
+OUI:0060D2*
+ ID_OUI_FROM_DATABASE=LUCENT TECHNOLOGIES TAIWAN TELECOMMUNICATIONS CO., LTD.
 
-OUI:000633*
- ID_OUI_FROM_DATABASE=Cross Match Technologies GmbH
+OUI:006077*
+ ID_OUI_FROM_DATABASE=PRISA NETWORKS
 
-OUI:000626*
- ID_OUI_FROM_DATABASE=MWE GmbH
+OUI:0060AB*
+ ID_OUI_FROM_DATABASE=LARSCOM INCORPORATED
 
-OUI:00061D*
- ID_OUI_FROM_DATABASE=MIP Telecom, Inc.
+OUI:0060E9*
+ ID_OUI_FROM_DATABASE=ATOP TECHNOLOGIES, INC.
 
-OUI:000623*
- ID_OUI_FROM_DATABASE=MGE UPS Systems France
+OUI:00608B*
+ ID_OUI_FROM_DATABASE=ConferTech International
 
-OUI:000589*
- ID_OUI_FROM_DATABASE=National Datacomputer
+OUI:0060C3*
+ ID_OUI_FROM_DATABASE=NETVISION CORPORATION
 
-OUI:000595*
- ID_OUI_FROM_DATABASE=Alesis Corporation
+OUI:00A0A0*
+ ID_OUI_FROM_DATABASE=COMPACT DATA, LTD.
 
-OUI:00058F*
- ID_OUI_FROM_DATABASE=CLCsoft co.
+OUI:00A024*
+ ID_OUI_FROM_DATABASE=3COM CORPORATION
 
-OUI:000596*
- ID_OUI_FROM_DATABASE=Genotech Co., Ltd.
+OUI:00A08B*
+ ID_OUI_FROM_DATABASE=ASTON ELECTRONIC DESIGNS LTD.
 
-OUI:00057D*
- ID_OUI_FROM_DATABASE=Sun Communications, Inc.
+OUI:00A0AA*
+ ID_OUI_FROM_DATABASE=SPACELABS MEDICAL
 
-OUI:00057C*
- ID_OUI_FROM_DATABASE=RCO Security AB
+OUI:00A04F*
+ ID_OUI_FROM_DATABASE=AMERITEC CORP.
 
-OUI:000583*
- ID_OUI_FROM_DATABASE=ImageCom Limited
+OUI:00A073*
+ ID_OUI_FROM_DATABASE=COM21, INC.
 
-OUI:000573*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00A084*
+ ID_OUI_FROM_DATABASE=Dataplex Pty Ltd
 
-OUI:000572*
- ID_OUI_FROM_DATABASE=Deonet Co., Ltd.
+OUI:00A034*
+ ID_OUI_FROM_DATABASE=AXEL
 
-OUI:00056C*
- ID_OUI_FROM_DATABASE=Hung Chang Co., Ltd.
+OUI:00C0BC*
+ ID_OUI_FROM_DATABASE=TELECOM AUSTRALIA/CSSC
 
-OUI:000566*
- ID_OUI_FROM_DATABASE=Secui.com Corporation
+OUI:00C0EF*
+ ID_OUI_FROM_DATABASE=ABIT CORPORATION
 
-OUI:000560*
- ID_OUI_FROM_DATABASE=LEADER COMM.CO., LTD
+OUI:00C03C*
+ ID_OUI_FROM_DATABASE=TOWER TECH S.R.L.
 
-OUI:000559*
- ID_OUI_FROM_DATABASE=Intracom S.A.
+OUI:00C061*
+ ID_OUI_FROM_DATABASE=SOLECTEK CORPORATION
 
-OUI:0004A5*
- ID_OUI_FROM_DATABASE=Barco Projection Systems NV
+OUI:00C074*
+ ID_OUI_FROM_DATABASE=TOYODA AUTOMATIC LOOM
 
-OUI:000499*
- ID_OUI_FROM_DATABASE=Chino Corporation
+OUI:00C07F*
+ ID_OUI_FROM_DATABASE=NUPON COMPUTING CORP.
 
-OUI:00048D*
- ID_OUI_FROM_DATABASE=Teo Technologies, Inc
+OUI:00C027*
+ ID_OUI_FROM_DATABASE=CIPHER SYSTEMS, INC.
 
-OUI:000493*
- ID_OUI_FROM_DATABASE=Tsinghua Unisplendour Co., Ltd.
+OUI:00C025*
+ ID_OUI_FROM_DATABASE=DATAPRODUCTS CORPORATION
 
-OUI:000484*
- ID_OUI_FROM_DATABASE=Amann GmbH
+OUI:00C022*
+ ID_OUI_FROM_DATABASE=LASERMASTER TECHNOLOGIES, INC.
 
-OUI:00048A*
- ID_OUI_FROM_DATABASE=Temia Vertriebs GmbH
+OUI:00C0E6*
+ ID_OUI_FROM_DATABASE=Verilink Corporation
 
-OUI:00047A*
- ID_OUI_FROM_DATABASE=AXXESSIT ASA
+OUI:00C05C*
+ ID_OUI_FROM_DATABASE=ELONEX PLC
 
-OUI:000474*
- ID_OUI_FROM_DATABASE=LEGRAND
+OUI:00C0C1*
+ ID_OUI_FROM_DATABASE=QUAD/GRAPHICS, INC.
 
-OUI:00046E*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00C091*
+ ID_OUI_FROM_DATABASE=JABIL CIRCUIT, INC.
 
-OUI:000473*
- ID_OUI_FROM_DATABASE=Photonex Corporation
+OUI:00C002*
+ ID_OUI_FROM_DATABASE=SERCOMM CORPORATION
 
-OUI:000467*
- ID_OUI_FROM_DATABASE=Wuhan Research Institute of MII
+OUI:00C0F5*
+ ID_OUI_FROM_DATABASE=METACOMP, INC.
 
-OUI:000461*
- ID_OUI_FROM_DATABASE=EPOX Computer Co., Ltd.
+OUI:00C042*
+ ID_OUI_FROM_DATABASE=DATALUX CORP.
 
-OUI:0003D9*
- ID_OUI_FROM_DATABASE=Secheron SA
+OUI:00C089*
+ ID_OUI_FROM_DATABASE=TELINDUS DISTRIBUTION
 
-OUI:0003D2*
- ID_OUI_FROM_DATABASE=Crossbeam Systems, Inc.
+OUI:00C09D*
+ ID_OUI_FROM_DATABASE=DISTRIBUTED SYSTEMS INT'L, INC
 
-OUI:0003CD*
- ID_OUI_FROM_DATABASE=Clovertech, Inc.
+OUI:00C0A5*
+ ID_OUI_FROM_DATABASE=DICKENS DATA SYSTEMS
 
-OUI:0003CA*
- ID_OUI_FROM_DATABASE=MTS Systems Corp.
+OUI:00C0E3*
+ ID_OUI_FROM_DATABASE=OSITECH COMMUNICATIONS, INC.
 
-OUI:0003C6*
- ID_OUI_FROM_DATABASE=ICUE Systems, Inc.
+OUI:00C071*
+ ID_OUI_FROM_DATABASE=AREANEX COMMUNICATIONS, INC.
 
-OUI:0003BF*
- ID_OUI_FROM_DATABASE=Centerpoint Broadband Technologies, Inc.
+OUI:00C0AF*
+ ID_OUI_FROM_DATABASE=TEKLOGIX INC.
 
-OUI:0003BA*
- ID_OUI_FROM_DATABASE=Oracle Corporation
+OUI:00209F*
+ ID_OUI_FROM_DATABASE=MERCURY COMPUTER SYSTEMS, INC.
 
-OUI:0003AF*
- ID_OUI_FROM_DATABASE=Paragea Communications
+OUI:0020B7*
+ ID_OUI_FROM_DATABASE=NAMAQUA COMPUTERWARE
 
-OUI:0003B4*
- ID_OUI_FROM_DATABASE=Macrotek International Corp.
+OUI:00201B*
+ ID_OUI_FROM_DATABASE=NORTHERN TELECOM/NETWORK
 
-OUI:0003AC*
- ID_OUI_FROM_DATABASE=Fronius Schweissmaschinen
+OUI:0020C0*
+ ID_OUI_FROM_DATABASE=PULSE ELECTRONICS, INC.
 
-OUI:0003A8*
- ID_OUI_FROM_DATABASE=IDOT Computers, Inc.
+OUI:00208D*
+ ID_OUI_FROM_DATABASE=CMD TECHNOLOGY
 
-OUI:0003A1*
- ID_OUI_FROM_DATABASE=HIPER Information & Communication, Inc.
+OUI:0020DD*
+ ID_OUI_FROM_DATABASE=Cybertec Pty Ltd
 
-OUI:000399*
- ID_OUI_FROM_DATABASE=Dongju Informations & Communications Co., Ltd.
+OUI:0020BD*
+ ID_OUI_FROM_DATABASE=NIOBRARA R & D CORPORATION
 
-OUI:00039C*
- ID_OUI_FROM_DATABASE=OptiMight Communications, Inc.
+OUI:0020E6*
+ ID_OUI_FROM_DATABASE=LIDKOPING MACHINE TOOLS AB
 
-OUI:000390*
- ID_OUI_FROM_DATABASE=Digital Video Communications, Inc.
+OUI:002047*
+ ID_OUI_FROM_DATABASE=STEINBRECHER CORP.
 
-OUI:000395*
- ID_OUI_FROM_DATABASE=California Amplifier
+OUI:0020B5*
+ ID_OUI_FROM_DATABASE=YASKAWA ELECTRIC CORPORATION
 
-OUI:000380*
- ID_OUI_FROM_DATABASE=SSH Communications Security Corp.
+OUI:002072*
+ ID_OUI_FROM_DATABASE=WORKLINK INNOVATIONS
 
-OUI:000374*
- ID_OUI_FROM_DATABASE=Control Microsystems
+OUI:0020B8*
+ ID_OUI_FROM_DATABASE=PRIME OPTION, INC.
 
-OUI:0002F0*
- ID_OUI_FROM_DATABASE=AME Optimedia Technology Co., Ltd.
+OUI:002092*
+ ID_OUI_FROM_DATABASE=CHESS ENGINEERING B.V.
 
-OUI:000379*
- ID_OUI_FROM_DATABASE=Proscend Communications, Inc.
+OUI:0020B9*
+ ID_OUI_FROM_DATABASE=METRICOM, INC.
 
-OUI:000371*
- ID_OUI_FROM_DATABASE=Acomz Networks Corp.
+OUI:00206B*
+ ID_OUI_FROM_DATABASE=KONICA MINOLTA HOLDINGS, INC.
 
-OUI:00036D*
- ID_OUI_FROM_DATABASE=Runtop, Inc.
+OUI:0020FC*
+ ID_OUI_FROM_DATABASE=MATROX
 
-OUI:0002E3*
- ID_OUI_FROM_DATABASE=LITE-ON Communications, Inc.
+OUI:00C003*
+ ID_OUI_FROM_DATABASE=GLOBALNET COMMUNICATIONS
 
-OUI:0002DE*
- ID_OUI_FROM_DATABASE=Astrodesign, Inc.
+OUI:00C0C3*
+ ID_OUI_FROM_DATABASE=ACUSON COMPUTED SONOGRAPHY
 
-OUI:0002DB*
- ID_OUI_FROM_DATABASE=NETSEC
+OUI:00C04D*
+ ID_OUI_FROM_DATABASE=MITEC, INC.
 
-OUI:0002D7*
- ID_OUI_FROM_DATABASE=EMPEG Ltd
+OUI:00C055*
+ ID_OUI_FROM_DATABASE=MODULAR COMPUTING TECHNOLOGIES
 
-OUI:0002D2*
- ID_OUI_FROM_DATABASE=Workstation AG
+OUI:00C067*
+ ID_OUI_FROM_DATABASE=UNITED BARCODE INDUSTRIES
 
-OUI:000223*
- ID_OUI_FROM_DATABASE=ClickTV
+OUI:00C0B4*
+ ID_OUI_FROM_DATABASE=MYSON TECHNOLOGY, INC.
 
-OUI:0002CB*
- ID_OUI_FROM_DATABASE=TriState Ltd.
+OUI:00C080*
+ ID_OUI_FROM_DATABASE=NETSTAR, INC.
 
-OUI:0002C4*
- ID_OUI_FROM_DATABASE=Vector International BVBA
+OUI:00C015*
+ ID_OUI_FROM_DATABASE=NEW MEDIA CORPORATION
 
-OUI:0002BF*
- ID_OUI_FROM_DATABASE=dotRocket, Inc.
+OUI:0070B3*
+ ID_OUI_FROM_DATABASE=DATA RECALL LTD.
 
-OUI:0002BB*
- ID_OUI_FROM_DATABASE=Continuous Computing Corp
+OUI:00E6D3*
+ ID_OUI_FROM_DATABASE=NIXDORF COMPUTER CORP.
 
-OUI:0002BC*
- ID_OUI_FROM_DATABASE=LVL 7 Systems, Inc.
+OUI:00C083*
+ ID_OUI_FROM_DATABASE=TRACE MOUNTAIN PRODUCTS, INC.
 
-OUI:0002B6*
- ID_OUI_FROM_DATABASE=Acrosser Technology Co., Ltd.
+OUI:00C005*
+ ID_OUI_FROM_DATABASE=LIVINGSTON ENTERPRISES, INC.
 
-OUI:0002AF*
- ID_OUI_FROM_DATABASE=TeleCruz Technology, Inc.
+OUI:00C0C8*
+ ID_OUI_FROM_DATABASE=MICRO BYTE PTY. LTD.
 
-OUI:0002AA*
- ID_OUI_FROM_DATABASE=PLcom Co., Ltd.
+OUI:00C090*
+ ID_OUI_FROM_DATABASE=PRAIM S.R.L.
 
-OUI:00045B*
- ID_OUI_FROM_DATABASE=Techsan Electronics Co., Ltd.
+OUI:00C011*
+ ID_OUI_FROM_DATABASE=INTERACTIVE COMPUTING DEVICES
 
-OUI:00044E*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00C0FD*
+ ID_OUI_FROM_DATABASE=PROSUM
 
-OUI:00044F*
- ID_OUI_FROM_DATABASE=Schubert System Elektronik Gmbh
+OUI:00C041*
+ ID_OUI_FROM_DATABASE=DIGITAL TRANSMISSION SYSTEMS
 
-OUI:000454*
- ID_OUI_FROM_DATABASE=Quadriga UK
+OUI:00C00F*
+ ID_OUI_FROM_DATABASE=QUANTUM SOFTWARE SYSTEMS LTD.
 
-OUI:000445*
- ID_OUI_FROM_DATABASE=LMS Skalar Instruments GmbH
+OUI:00C076*
+ ID_OUI_FROM_DATABASE=I-DATA INTERNATIONAL A-S
 
-OUI:00044A*
- ID_OUI_FROM_DATABASE=iPolicy Networks, Inc.
+OUI:00C0C6*
+ ID_OUI_FROM_DATABASE=PERSONAL MEDIA CORP.
 
-OUI:000444*
- ID_OUI_FROM_DATABASE=Western Multiplex Corporation
+OUI:00C03B*
+ ID_OUI_FROM_DATABASE=MULTIACCESS COMPUTING CORP.
 
-OUI:00043E*
- ID_OUI_FROM_DATABASE=Telencomm
+OUI:0020F4*
+ ID_OUI_FROM_DATABASE=SPECTRIX CORPORATION
 
-OUI:000432*
- ID_OUI_FROM_DATABASE=Voyetra Turtle Beach, Inc.
+OUI:00204E*
+ ID_OUI_FROM_DATABASE=NETWORK SECURITY SYSTEMS, INC.
 
-OUI:000437*
- ID_OUI_FROM_DATABASE=Powin Information Technology, Inc.
+OUI:002027*
+ ID_OUI_FROM_DATABASE=MING FORTUNE INDUSTRY CO., LTD
 
-OUI:00042B*
- ID_OUI_FROM_DATABASE=IT Access Co., Ltd.
+OUI:0020ED*
+ ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO., LTD.
 
-OUI:000361*
- ID_OUI_FROM_DATABASE=Widcomm, Inc.
+OUI:00200E*
+ ID_OUI_FROM_DATABASE=SATELLITE TECHNOLOGY MGMT, INC
 
-OUI:00035A*
- ID_OUI_FROM_DATABASE=Photron Limited
+OUI:002096*
+ ID_OUI_FROM_DATABASE=Invensys
 
-OUI:000355*
- ID_OUI_FROM_DATABASE=TeraBeam Internet Systems
+OUI:0020BB*
+ ID_OUI_FROM_DATABASE=ZAX CORPORATION
 
-OUI:000353*
- ID_OUI_FROM_DATABASE=Mitac, Inc.
+OUI:00204D*
+ ID_OUI_FROM_DATABASE=INOVIS GMBH
 
-OUI:00034F*
- ID_OUI_FROM_DATABASE=Sur-Gard Security
+OUI:002089*
+ ID_OUI_FROM_DATABASE=T3PLUS NETWORKING, INC.
 
-OUI:00034A*
- ID_OUI_FROM_DATABASE=RIAS Corporation
+OUI:00205F*
+ ID_OUI_FROM_DATABASE=GAMMADATA COMPUTER GMBH
 
-OUI:000346*
- ID_OUI_FROM_DATABASE=Hitachi Kokusai Electric, Inc.
+OUI:002035*
+ ID_OUI_FROM_DATABASE=IBM Corp
 
-OUI:000344*
- ID_OUI_FROM_DATABASE=Tietech.Co., Ltd.
+OUI:0020E2*
+ ID_OUI_FROM_DATABASE=INFORMATION RESOURCE ENGINEERING
 
-OUI:000343*
- ID_OUI_FROM_DATABASE=Martin Professional A/S
+OUI:002058*
+ ID_OUI_FROM_DATABASE=ALLIED SIGNAL INC.
 
-OUI:000334*
- ID_OUI_FROM_DATABASE=Newport Electronics
+OUI:002081*
+ ID_OUI_FROM_DATABASE=TITAN ELECTRONICS
 
-OUI:000337*
- ID_OUI_FROM_DATABASE=Vaone, Inc.
+OUI:00201D*
+ ID_OUI_FROM_DATABASE=KATANA PRODUCTS
 
-OUI:00033C*
- ID_OUI_FROM_DATABASE=Daiden Co., Ltd.
+OUI:0020CF*
+ ID_OUI_FROM_DATABASE=TEST & MEASUREMENT SYSTEMS INC
 
-OUI:000329*
- ID_OUI_FROM_DATABASE=F3, Inc.
+OUI:002043*
+ ID_OUI_FROM_DATABASE=NEURON COMPANY LIMITED
 
-OUI:000330*
- ID_OUI_FROM_DATABASE=Imagenics, Co., Ltd.
+OUI:002018*
+ ID_OUI_FROM_DATABASE=CIS TECHNOLOGY INC.
 
-OUI:000321*
- ID_OUI_FROM_DATABASE=Reco Research Co., Ltd.
+OUI:002031*
+ ID_OUI_FROM_DATABASE=Tattile SRL
 
-OUI:000324*
- ID_OUI_FROM_DATABASE=SANYO Consumer Electronics Co., Ltd.
+OUI:0020DE*
+ ID_OUI_FROM_DATABASE=JAPAN DIGITAL LABORAT'Y CO.LTD
 
-OUI:00031B*
- ID_OUI_FROM_DATABASE=Cellvision Systems, Inc.
+OUI:0020F7*
+ ID_OUI_FROM_DATABASE=CYBERDATA CORPORATION
 
-OUI:0001A8*
- ID_OUI_FROM_DATABASE=Welltech Computer Co., Ltd.
+OUI:0020EE*
+ ID_OUI_FROM_DATABASE=GTECH CORPORATION
 
-OUI:00030F*
- ID_OUI_FROM_DATABASE=Digital China (Shanghai) Networks Ltd.
+OUI:00208C*
+ ID_OUI_FROM_DATABASE=GALAXY NETWORKS, INC.
 
-OUI:000314*
- ID_OUI_FROM_DATABASE=Teleware Network Systems
+OUI:002063*
+ ID_OUI_FROM_DATABASE=WIPRO INFOTECH LTD.
 
-OUI:00030C*
- ID_OUI_FROM_DATABASE=Telesoft Technologies Ltd.
+OUI:0020DC*
+ ID_OUI_FROM_DATABASE=DENSITRON TAIWAN LTD.
 
-OUI:000308*
- ID_OUI_FROM_DATABASE=AM Communications, Inc.
+OUI:002078*
+ ID_OUI_FROM_DATABASE=RUNTOP, INC.
 
-OUI:0002FC*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:002042*
+ ID_OUI_FROM_DATABASE=DATAMETRICS CORP.
 
-OUI:000301*
- ID_OUI_FROM_DATABASE=EXFO
+OUI:0020F8*
+ ID_OUI_FROM_DATABASE=CARRERA COMPUTERS, INC.
 
-OUI:0002F9*
- ID_OUI_FROM_DATABASE=MIMOS Berhad
+OUI:00200C*
+ ID_OUI_FROM_DATABASE=ADASTRA SYSTEMS CORP.
 
-OUI:0002F5*
- ID_OUI_FROM_DATABASE=VIVE Synergies, Inc.
+OUI:0020C4*
+ ID_OUI_FROM_DATABASE=INET,INC.
 
-OUI:0002EA*
- ID_OUI_FROM_DATABASE=Focus Enhancements
+OUI:00C099*
+ ID_OUI_FROM_DATABASE=YOSHIKI INDUSTRIAL CO.,LTD.
 
-OUI:000269*
- ID_OUI_FROM_DATABASE=Nadatel Co., Ltd
+OUI:00C0FC*
+ ID_OUI_FROM_DATABASE=ELASTIC REALITY, INC.
 
-OUI:000265*
- ID_OUI_FROM_DATABASE=Virditech Co. Ltd.
+OUI:00C0D0*
+ ID_OUI_FROM_DATABASE=RATOC SYSTEM INC.
 
-OUI:00025E*
- ID_OUI_FROM_DATABASE=High Technology Ltd
+OUI:00C07A*
+ ID_OUI_FROM_DATABASE=PRIVA B.V.
 
-OUI:000261*
- ID_OUI_FROM_DATABASE=Tilgin AB
+OUI:000701*
+ ID_OUI_FROM_DATABASE=RACAL-DATACOM
 
-OUI:000259*
- ID_OUI_FROM_DATABASE=Tsann Kuen China (Shanghai)Enterprise Co., Ltd. IT Group
+OUI:00C09C*
+ ID_OUI_FROM_DATABASE=HIOKI E.E. CORPORATION
 
-OUI:000255*
- ID_OUI_FROM_DATABASE=IBM Corp
+OUI:00C004*
+ ID_OUI_FROM_DATABASE=JAPAN BUSINESS COMPUTER CO.LTD
 
-OUI:000249*
- ID_OUI_FROM_DATABASE=Aviv Infocom Co, Ltd.
+OUI:00C062*
+ ID_OUI_FROM_DATABASE=IMPULSE TECHNOLOGY
 
-OUI:000250*
- ID_OUI_FROM_DATABASE=Geyser Networks, Inc.
+OUI:000267*
+ ID_OUI_FROM_DATABASE=NODE RUNNER, INC.
 
-OUI:000242*
- ID_OUI_FROM_DATABASE=Videoframe Systems
+OUI:002064*
+ ID_OUI_FROM_DATABASE=PROTEC MICROSYSTEMS, INC.
 
-OUI:000244*
- ID_OUI_FROM_DATABASE=SURECOM Technology Co.
+OUI:002032*
+ ID_OUI_FROM_DATABASE=ALCATEL TAISEL
 
-OUI:00022C*
- ID_OUI_FROM_DATABASE=ABB Bomem, Inc.
+OUI:00207F*
+ ID_OUI_FROM_DATABASE=KYOEI SANGYO CO., LTD.
 
-OUI:00023A*
- ID_OUI_FROM_DATABASE=ZSK Stickmaschinen GmbH
+OUI:002077*
+ ID_OUI_FROM_DATABASE=KARDIOS SYSTEMS CORP.
 
-OUI:000425*
- ID_OUI_FROM_DATABASE=Atmel Corporation
+OUI:002068*
+ ID_OUI_FROM_DATABASE=ISDYNE
 
-OUI:000419*
- ID_OUI_FROM_DATABASE=Fibercycle Networks, Inc.
+OUI:00202A*
+ ID_OUI_FROM_DATABASE=N.V. DZINE
 
-OUI:00041A*
- ID_OUI_FROM_DATABASE=Ines Test and Measurement GmbH & CoKG
+OUI:008006*
+ ID_OUI_FROM_DATABASE=COMPUADD CORPORATION
 
-OUI:000414*
- ID_OUI_FROM_DATABASE=Umezawa Musen Denki Co., Ltd.
+OUI:0080EF*
+ ID_OUI_FROM_DATABASE=RATIONAL
 
-OUI:000407*
- ID_OUI_FROM_DATABASE=Topcon Positioning Systems, Inc.
+OUI:0080C4*
+ ID_OUI_FROM_DATABASE=DOCUMENT TECHNOLOGIES, INC.
 
-OUI:0003F7*
- ID_OUI_FROM_DATABASE=Plast-Control GmbH
+OUI:008095*
+ ID_OUI_FROM_DATABASE=BASIC MERTON HANDELSGES.M.B.H.
 
-OUI:0003FE*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:008053*
+ ID_OUI_FROM_DATABASE=INTELLICOM, INC.
 
-OUI:0003FD*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:008026*
+ ID_OUI_FROM_DATABASE=NETWORK PRODUCTS CORPORATION
 
-OUI:000401*
- ID_OUI_FROM_DATABASE=Osaki Electric Co., Ltd.
+OUI:0080FE*
+ ID_OUI_FROM_DATABASE=AZURE TECHNOLOGIES, INC.
 
-OUI:0003F0*
- ID_OUI_FROM_DATABASE=Redfern Broadband Networks
+OUI:008028*
+ ID_OUI_FROM_DATABASE=TRADPOST (HK) LTD
 
-OUI:0003EB*
- ID_OUI_FROM_DATABASE=Atrica
+OUI:0080B6*
+ ID_OUI_FROM_DATABASE=THEMIS COMPUTER
 
-OUI:0003E5*
- ID_OUI_FROM_DATABASE=Hermstedt SG
+OUI:0080C0*
+ ID_OUI_FROM_DATABASE=PENRIL DATACOMM
 
-OUI:0002A3*
- ID_OUI_FROM_DATABASE=ABB Switzerland Ltd, Power Systems
+OUI:0080F5*
+ ID_OUI_FROM_DATABASE=Quantel Ltd
 
-OUI:000298*
- ID_OUI_FROM_DATABASE=Broadframe Corporation
+OUI:00401D*
+ ID_OUI_FROM_DATABASE=INVISIBLE SOFTWARE, INC.
 
-OUI:000292*
- ID_OUI_FROM_DATABASE=Logic Innovations, Inc.
+OUI:0040BD*
+ ID_OUI_FROM_DATABASE=STARLIGHT NETWORKS, INC.
 
-OUI:00028D*
- ID_OUI_FROM_DATABASE=Movita Technologies, Inc.
+OUI:00406D*
+ ID_OUI_FROM_DATABASE=LANCO, INC.
 
-OUI:000283*
- ID_OUI_FROM_DATABASE=Spectrum Controls, Inc.
+OUI:00404D*
+ ID_OUI_FROM_DATABASE=TELECOMMUNICATIONS TECHNIQUES
 
-OUI:000277*
- ID_OUI_FROM_DATABASE=Cash Systemes Industrie
+OUI:0040A5*
+ ID_OUI_FROM_DATABASE=CLINICOMP INTL.
 
-OUI:00027C*
- ID_OUI_FROM_DATABASE=Trilithic, Inc.
+OUI:004059*
+ ID_OUI_FROM_DATABASE=YOSHIDA KOGYO K. K.
 
-OUI:000275*
- ID_OUI_FROM_DATABASE=SMART Technologies, Inc.
+OUI:004021*
+ ID_OUI_FROM_DATABASE=RASTER GRAPHICS
 
-OUI:000270*
- ID_OUI_FROM_DATABASE=Crewave Co., Ltd.
+OUI:004081*
+ ID_OUI_FROM_DATABASE=MANNESMANN SCANGRAPHIC GMBH
 
-OUI:000104*
- ID_OUI_FROM_DATABASE=DVICO Co., Ltd.
+OUI:00806C*
+ ID_OUI_FROM_DATABASE=CEGELEC PROJECTS LTD
 
-OUI:000110*
- ID_OUI_FROM_DATABASE=Gotham Networks
+OUI:00404A*
+ ID_OUI_FROM_DATABASE=WEST AUSTRALIAN DEPARTMENT
 
-OUI:00010C*
- ID_OUI_FROM_DATABASE=System Talks Inc.
+OUI:00400A*
+ ID_OUI_FROM_DATABASE=PIVOTAL TECHNOLOGIES, INC.
 
-OUI:000113*
- ID_OUI_FROM_DATABASE=OLYMPUS CORPORATION
+OUI:004032*
+ ID_OUI_FROM_DATABASE=DIGITAL COMMUNICATIONS
 
-OUI:000100*
- ID_OUI_FROM_DATABASE=EQUIP'TRANS
+OUI:004042*
+ ID_OUI_FROM_DATABASE=N.A.T. GMBH
 
-OUI:00B0AC*
- ID_OUI_FROM_DATABASE=SIAE-Microelettronica S.p.A.
+OUI:0040C2*
+ ID_OUI_FROM_DATABASE=APPLIED COMPUTING DEVICES
 
-OUI:00B017*
- ID_OUI_FROM_DATABASE=InfoGear Technology Corp.
+OUI:00403C*
+ ID_OUI_FROM_DATABASE=FORKS, INC.
 
-OUI:0030F0*
- ID_OUI_FROM_DATABASE=Uniform Industrial Corp.
+OUI:0040C4*
+ ID_OUI_FROM_DATABASE=KINKEI SYSTEM CORPORATION
 
-OUI:00B080*
- ID_OUI_FROM_DATABASE=Mannesmann Ipulsys B.V.
+OUI:0040D1*
+ ID_OUI_FROM_DATABASE=FUKUDA DENSHI CO., LTD.
 
-OUI:00B09A*
- ID_OUI_FROM_DATABASE=Morrow Technologies Corp.
+OUI:004024*
+ ID_OUI_FROM_DATABASE=COMPAC INC.
 
-OUI:00B091*
- ID_OUI_FROM_DATABASE=Transmeta Corp.
+OUI:0040B6*
+ ID_OUI_FROM_DATABASE=COMPUTERM  CORPORATION
 
-OUI:0030BE*
- ID_OUI_FROM_DATABASE=City-Net Technology, Inc.
+OUI:00403F*
+ ID_OUI_FROM_DATABASE=SSANGYONG COMPUTER SYSTEMS
 
-OUI:000233*
- ID_OUI_FROM_DATABASE=Mantra Communications, Inc.
+OUI:004003*
+ ID_OUI_FROM_DATABASE=Emerson Process Management Power & Water Solutions, Inc.
 
-OUI:00022F*
- ID_OUI_FROM_DATABASE=P-Cube, Ltd.
+OUI:004090*
+ ID_OUI_FROM_DATABASE=ANSEL COMMUNICATIONS
 
-OUI:000227*
- ID_OUI_FROM_DATABASE=ESD Electronic System Design GmbH
+OUI:00409A*
+ ID_OUI_FROM_DATABASE=NETWORK EXPRESS, INC.
 
-OUI:00021F*
- ID_OUI_FROM_DATABASE=Aculab PLC
+OUI:0040DE*
+ ID_OUI_FROM_DATABASE=Elsag Datamat spa
 
-OUI:00021B*
- ID_OUI_FROM_DATABASE=Kollmorgen-Servotronix
+OUI:004063*
+ ID_OUI_FROM_DATABASE=VIA TECHNOLOGIES, INC.
 
-OUI:00020C*
- ID_OUI_FROM_DATABASE=Metro-Optix
+OUI:00406C*
+ ID_OUI_FROM_DATABASE=COPERNIQUE
 
-OUI:000218*
- ID_OUI_FROM_DATABASE=Advanced Scientific Corp
+OUI:0040DF*
+ ID_OUI_FROM_DATABASE=DIGALOG SYSTEMS, INC.
 
-OUI:000213*
- ID_OUI_FROM_DATABASE=S.D.E.L.
+OUI:004015*
+ ID_OUI_FROM_DATABASE=ASCOM INFRASYS AG
 
-OUI:00020F*
- ID_OUI_FROM_DATABASE=AATR
+OUI:008056*
+ ID_OUI_FROM_DATABASE=SPHINX Electronics GmbH & Co KG
 
-OUI:0001F9*
- ID_OUI_FROM_DATABASE=TeraGlobal Communications Corp.
+OUI:008060*
+ ID_OUI_FROM_DATABASE=NETWORK INTERFACE CORPORATION
 
-OUI:000200*
- ID_OUI_FROM_DATABASE=Net & Sys Co., Ltd.
+OUI:00805E*
+ ID_OUI_FROM_DATABASE=LSI LOGIC CORPORATION
 
-OUI:0001FC*
- ID_OUI_FROM_DATABASE=Keyence Corporation
+OUI:008093*
+ ID_OUI_FROM_DATABASE=XYRON CORPORATION
 
-OUI:0001F3*
- ID_OUI_FROM_DATABASE=QPS, Inc.
+OUI:00C05D*
+ ID_OUI_FROM_DATABASE=L&N TECHNOLOGIES
 
-OUI:0001E4*
- ID_OUI_FROM_DATABASE=Sitera, Inc.
+OUI:00C0E4*
+ ID_OUI_FROM_DATABASE=SIEMENS BUILDING
 
-OUI:0001EB*
- ID_OUI_FROM_DATABASE=C-COM Corporation
+OUI:00C01B*
+ ID_OUI_FROM_DATABASE=SOCKET COMMUNICATIONS, INC.
 
-OUI:0001F0*
- ID_OUI_FROM_DATABASE=Tridium, Inc.
+OUI:00C06E*
+ ID_OUI_FROM_DATABASE=HAFT TECHNOLOGY, INC.
 
-OUI:0001D4*
- ID_OUI_FROM_DATABASE=Leisure Time, Inc.
+OUI:00406F*
+ ID_OUI_FROM_DATABASE=SYNC RESEARCH INC.
 
-OUI:0001D8*
- ID_OUI_FROM_DATABASE=Teltronics, Inc.
+OUI:00401F*
+ ID_OUI_FROM_DATABASE=COLORGRAPH LTD
 
-OUI:0001C6*
- ID_OUI_FROM_DATABASE=Quarry Technologies
+OUI:0040CF*
+ ID_OUI_FROM_DATABASE=STRAWBERRY TREE, INC.
 
-OUI:0001CC*
- ID_OUI_FROM_DATABASE=Japan Total Design Communication Co., Ltd.
+OUI:0040F7*
+ ID_OUI_FROM_DATABASE=Polaroid Corporation
 
-OUI:0001D1*
- ID_OUI_FROM_DATABASE=CoNet Communications, Inc.
+OUI:004037*
+ ID_OUI_FROM_DATABASE=SEA-ILAN, INC.
 
-OUI:0001B3*
- ID_OUI_FROM_DATABASE=Precision Electronic Manufacturing
+OUI:0040CC*
+ ID_OUI_FROM_DATABASE=SILCOM MANUF'G TECHNOLOGY INC.
 
-OUI:000160*
- ID_OUI_FROM_DATABASE=ELMEX Co., LTD.
+OUI:004052*
+ ID_OUI_FROM_DATABASE=STAR TECHNOLOGIES, INC.
 
-OUI:00015E*
- ID_OUI_FROM_DATABASE=BEST TECHNOLOGY CO., LTD.
+OUI:00407A*
+ ID_OUI_FROM_DATABASE=SOCIETE D'EXPLOITATION DU CNIT
 
-OUI:000162*
- ID_OUI_FROM_DATABASE=Cygnet Technologies, Inc.
+OUI:004089*
+ ID_OUI_FROM_DATABASE=MEIDENSHA CORPORATION
 
-OUI:000169*
- ID_OUI_FROM_DATABASE=Celestix Networks Pte Ltd.
+OUI:00405A*
+ ID_OUI_FROM_DATABASE=GOLDSTAR INFORMATION & COMM.
 
-OUI:000175*
- ID_OUI_FROM_DATABASE=Radiant Communications Corp.
+OUI:00404C*
+ ID_OUI_FROM_DATABASE=HYPERTEC PTY LTD.
 
-OUI:000159*
- ID_OUI_FROM_DATABASE=S1 Corporation
+OUI:00C0CB*
+ ID_OUI_FROM_DATABASE=CONTROL TECHNOLOGY CORPORATION
 
-OUI:000165*
- ID_OUI_FROM_DATABASE=AirSwitch Corporation
+OUI:00C09A*
+ ID_OUI_FROM_DATABASE=PHOTONICS CORPORATION
 
-OUI:000171*
- ID_OUI_FROM_DATABASE=Allied Data Technologies
+OUI:00C01A*
+ ID_OUI_FROM_DATABASE=COROMETRICS MEDICAL SYSTEMS
 
-OUI:000157*
- ID_OUI_FROM_DATABASE=SYSWAVE CO., LTD
+OUI:00404B*
+ ID_OUI_FROM_DATABASE=MAPLE COMPUTER SYSTEMS
 
-OUI:000153*
- ID_OUI_FROM_DATABASE=ARCHTEK TELECOM CORPORATION
+OUI:004055*
+ ID_OUI_FROM_DATABASE=METRONIX GMBH
 
-OUI:000144*
- ID_OUI_FROM_DATABASE=EMC Corporation
+OUI:004045*
+ ID_OUI_FROM_DATABASE=TWINHEAD CORPORATION
 
-OUI:003038*
- ID_OUI_FROM_DATABASE=XCP, INC.
+OUI:00409D*
+ ID_OUI_FROM_DATABASE=DIGIBOARD, INC.
 
-OUI:0030DB*
- ID_OUI_FROM_DATABASE=Mindready Solutions, Inc.
+OUI:00401A*
+ ID_OUI_FROM_DATABASE=FUJI ELECTRIC CO., LTD.
 
-OUI:00306A*
- ID_OUI_FROM_DATABASE=PENTA MEDIA CO., LTD.
+OUI:0040B9*
+ ID_OUI_FROM_DATABASE=MACQ ELECTRONIQUE SA
 
-OUI:003021*
- ID_OUI_FROM_DATABASE=HSING TECH. ENTERPRISE CO.,LTD
+OUI:0040C7*
+ ID_OUI_FROM_DATABASE=RUBY TECH CORPORATION
 
-OUI:0030EA*
- ID_OUI_FROM_DATABASE=TeraForce Technology Corporation
+OUI:004004*
+ ID_OUI_FROM_DATABASE=ICM CO. LTD.
 
-OUI:0030F4*
- ID_OUI_FROM_DATABASE=STARDOT TECHNOLOGIES
+OUI:004070*
+ ID_OUI_FROM_DATABASE=INTERWARE CO., LTD.
 
-OUI:003087*
- ID_OUI_FROM_DATABASE=VEGA GRIESHABER KG
+OUI:008057*
+ ID_OUI_FROM_DATABASE=ADSOFT, LTD.
 
-OUI:003000*
- ID_OUI_FROM_DATABASE=ALLWELL TECHNOLOGY CORP.
+OUI:00807A*
+ ID_OUI_FROM_DATABASE=AITECH SYSTEMS LTD.
 
-OUI:003034*
- ID_OUI_FROM_DATABASE=SET ENGINEERING
+OUI:0080AA*
+ ID_OUI_FROM_DATABASE=MAXPEED
 
-OUI:00308D*
- ID_OUI_FROM_DATABASE=Pinnacle Systems, Inc.
+OUI:00C0E7*
+ ID_OUI_FROM_DATABASE=FIBERDATA AB
 
-OUI:00304B*
- ID_OUI_FROM_DATABASE=ORBACOM SYSTEMS, INC.
+OUI:00800A*
+ ID_OUI_FROM_DATABASE=JAPAN COMPUTER CORP.
 
-OUI:0030FA*
- ID_OUI_FROM_DATABASE=TELICA, INC.
+OUI:00806E*
+ ID_OUI_FROM_DATABASE=NIPPON STEEL CORPORATION
 
-OUI:0001B1*
- ID_OUI_FROM_DATABASE=General Bandwidth
+OUI:008010*
+ ID_OUI_FROM_DATABASE=COMMODORE INTERNATIONAL
 
-OUI:0001BB*
- ID_OUI_FROM_DATABASE=Frequentis
+OUI:0080DA*
+ ID_OUI_FROM_DATABASE=Bruel & Kjaer Sound & Vibration Measurement A/S
 
-OUI:0001B7*
- ID_OUI_FROM_DATABASE=Centos, Inc.
+OUI:0080BC*
+ ID_OUI_FROM_DATABASE=HITACHI ENGINEERING CO., LTD
 
-OUI:0001AF*
- ID_OUI_FROM_DATABASE=Artesyn Embedded Technologies
+OUI:008000*
+ ID_OUI_FROM_DATABASE=MULTITECH SYSTEMS, INC.
 
-OUI:0001AB*
- ID_OUI_FROM_DATABASE=Main Street Networks
+OUI:0080A1*
+ ID_OUI_FROM_DATABASE=MICROTEST, INC.
 
-OUI:000191*
- ID_OUI_FROM_DATABASE=SYRED Data Systems
+OUI:0080D0*
+ ID_OUI_FROM_DATABASE=COMPUTER PERIPHERALS, INC.
 
-OUI:00019D*
- ID_OUI_FROM_DATABASE=E-Control Systems, Inc.
+OUI:00807D*
+ ID_OUI_FROM_DATABASE=EQUINOX SYSTEMS INC.
 
-OUI:0001A4*
- ID_OUI_FROM_DATABASE=Microlink Corporation
+OUI:008063*
+ ID_OUI_FROM_DATABASE=Hirschmann Automation and Control GmbH
 
-OUI:000199*
- ID_OUI_FROM_DATABASE=HeiSei Electronics
+OUI:00608C*
+ ID_OUI_FROM_DATABASE=3COM CORPORATION
 
-OUI:0001A0*
- ID_OUI_FROM_DATABASE=Infinilink Corporation
+OUI:00804E*
+ ID_OUI_FROM_DATABASE=APEX COMPUTER COMPANY
 
-OUI:00017C*
- ID_OUI_FROM_DATABASE=AG-E GmbH
+OUI:00800E*
+ ID_OUI_FROM_DATABASE=ATLANTIX CORPORATION
 
-OUI:000188*
- ID_OUI_FROM_DATABASE=LXCO Technologies ag
+OUI:00806F*
+ ID_OUI_FROM_DATABASE=ONELAN LTD.
 
-OUI:000178*
- ID_OUI_FROM_DATABASE=MARGI Systems, Inc.
+OUI:008098*
+ ID_OUI_FROM_DATABASE=TDK CORPORATION
 
-OUI:00018B*
- ID_OUI_FROM_DATABASE=NetLinks Co., Ltd.
+OUI:00809C*
+ ID_OUI_FROM_DATABASE=LUXCOM, INC.
 
-OUI:0030F5*
- ID_OUI_FROM_DATABASE=Wild Lab. Ltd.
+OUI:008065*
+ ID_OUI_FROM_DATABASE=CYBERGRAPHIC SYSTEMS PTY LTD.
 
-OUI:000184*
- ID_OUI_FROM_DATABASE=SIEB & MEYER AG
+OUI:008016*
+ ID_OUI_FROM_DATABASE=WANDEL AND GOLTERMANN
 
-OUI:00303E*
- ID_OUI_FROM_DATABASE=Radcom Ltd.
+OUI:0080E6*
+ ID_OUI_FROM_DATABASE=PEER NETWORKS, INC.
 
-OUI:0030D7*
- ID_OUI_FROM_DATABASE=Innovative Systems, L.L.C.
+OUI:0080A2*
+ ID_OUI_FROM_DATABASE=CREATIVE ELECTRONIC SYSTEMS
 
-OUI:0030FC*
- ID_OUI_FROM_DATABASE=Terawave Communications, Inc.
+OUI:0080E0*
+ ID_OUI_FROM_DATABASE=XTP SYSTEMS, INC.
 
-OUI:00300F*
- ID_OUI_FROM_DATABASE=IMT - Information Management T
+OUI:008050*
+ ID_OUI_FROM_DATABASE=ZIATECH CORPORATION
 
-OUI:003004*
- ID_OUI_FROM_DATABASE=LEADTEK RESEARCH INC.
+OUI:0000E0*
+ ID_OUI_FROM_DATABASE=QUADRAM CORP.
 
-OUI:003018*
- ID_OUI_FROM_DATABASE=Jetway Information Co., Ltd.
+OUI:000057*
+ ID_OUI_FROM_DATABASE=SCITEX CORPORATION LTD.
 
-OUI:003088*
- ID_OUI_FROM_DATABASE=Ericsson
+OUI:0000D6*
+ ID_OUI_FROM_DATABASE=PUNCH LINE HOLDING
 
-OUI:0030CA*
- ID_OUI_FROM_DATABASE=Discovery Com
+OUI:0000C8*
+ ID_OUI_FROM_DATABASE=ALTOS COMPUTER SYSTEMS
 
-OUI:00304F*
- ID_OUI_FROM_DATABASE=PLANET Technology Corporation
+OUI:000098*
+ ID_OUI_FROM_DATABASE=CROSSCOMM CORPORATION
 
-OUI:00014B*
- ID_OUI_FROM_DATABASE=Ennovate Networks, Inc.
+OUI:00007D*
+ ID_OUI_FROM_DATABASE=Oracle Corporation
 
-OUI:00012C*
- ID_OUI_FROM_DATABASE=Aravox Technologies, Inc.
+OUI:0000A2*
+ ID_OUI_FROM_DATABASE=Bay Networks
 
-OUI:000134*
- ID_OUI_FROM_DATABASE=Selectron Systems AG
+OUI:000038*
+ ID_OUI_FROM_DATABASE=CSS LABS
 
-OUI:00013B*
- ID_OUI_FROM_DATABASE=BNA SYSTEMS
+OUI:000061*
+ ID_OUI_FROM_DATABASE=GATEWAY COMMUNICATIONS
 
-OUI:000147*
- ID_OUI_FROM_DATABASE=Zhone Technologies
+OUI:000043*
+ ID_OUI_FROM_DATABASE=MICRO TECHNOLOGY
 
-OUI:00012B*
- ID_OUI_FROM_DATABASE=TELENET Co., Ltd.
+OUI:0000E7*
+ ID_OUI_FROM_DATABASE=Star Gate Technologies
 
-OUI:00011C*
- ID_OUI_FROM_DATABASE=Universal Talkware Corporation
+OUI:0000F3*
+ ID_OUI_FROM_DATABASE=GANDALF DATA LIMITED
 
-OUI:000123*
- ID_OUI_FROM_DATABASE=DIGITAL ELECTRONICS CORP.
+OUI:00002C*
+ ID_OUI_FROM_DATABASE=AUTOTOTE LIMITED
 
-OUI:00011F*
- ID_OUI_FROM_DATABASE=RC Networks, Inc.
+OUI:00002A*
+ ID_OUI_FROM_DATABASE=TRW - SEDD/INP
 
-OUI:003045*
- ID_OUI_FROM_DATABASE=Village Networks, Inc. (VNI)
+OUI:0000F1*
+ ID_OUI_FROM_DATABASE=MAGNA COMPUTER CORPORATION
 
-OUI:0030BB*
- ID_OUI_FROM_DATABASE=CacheFlow, Inc.
+OUI:000083*
+ ID_OUI_FROM_DATABASE=TADPOLE TECHNOLOGY PLC
 
-OUI:003053*
- ID_OUI_FROM_DATABASE=Basler AG
+OUI:000020*
+ ID_OUI_FROM_DATABASE=DATAINDUSTRIER DIAB AB
 
-OUI:003072*
- ID_OUI_FROM_DATABASE=Intellibyte Inc.
+OUI:00007A*
+ ID_OUI_FROM_DATABASE=DANA COMPUTER INC.
 
-OUI:0030B1*
- ID_OUI_FROM_DATABASE=TrunkNet
+OUI:00007C*
+ ID_OUI_FROM_DATABASE=AMPERE INCORPORATED
 
-OUI:0030A7*
- ID_OUI_FROM_DATABASE=SCHWEITZER ENGINEERING
+OUI:00008A*
+ ID_OUI_FROM_DATABASE=DATAHOUSE INFORMATION SYSTEMS
 
-OUI:00D086*
- ID_OUI_FROM_DATABASE=FOVEON, INC.
+OUI:000068*
+ ID_OUI_FROM_DATABASE=ROSEMOUNT CONTROLS
 
-OUI:00D05A*
- ID_OUI_FROM_DATABASE=SYMBIONICS, LTD.
+OUI:0000A8*
+ ID_OUI_FROM_DATABASE=STRATUS COMPUTER INC.
 
-OUI:00D01A*
- ID_OUI_FROM_DATABASE=URMET  TLC S.P.A.
+OUI:0000DF*
+ ID_OUI_FROM_DATABASE=BELL & HOWELL PUB SYS DIV
 
-OUI:00D0F3*
- ID_OUI_FROM_DATABASE=SOLARI DI UDINE SPA
+OUI:000062*
+ ID_OUI_FROM_DATABASE=BULL HN INFORMATION SYSTEMS
 
-OUI:00D089*
- ID_OUI_FROM_DATABASE=DYNACOLOR, INC.
+OUI:0000AD*
+ ID_OUI_FROM_DATABASE=BRUKER INSTRUMENTS INC.
 
-OUI:00D08D*
- ID_OUI_FROM_DATABASE=PHOENIX GROUP, INC.
+OUI:0000D0*
+ ID_OUI_FROM_DATABASE=DEVELCON ELECTRONICS LTD.
 
-OUI:00D09C*
- ID_OUI_FROM_DATABASE=KAPADIA COMMUNICATIONS
+OUI:000093*
+ ID_OUI_FROM_DATABASE=PROTEON INC.
 
-OUI:00D0FE*
- ID_OUI_FROM_DATABASE=ASTRAL POINT
+OUI:008008*
+ ID_OUI_FROM_DATABASE=DYNATECH COMPUTER SYSTEMS
 
-OUI:00D0DC*
- ID_OUI_FROM_DATABASE=MODULAR MINING SYSTEMS, INC.
+OUI:0080FF*
+ ID_OUI_FROM_DATABASE=SOC. DE TELEINFORMATIQUE RTC
 
-OUI:00D062*
- ID_OUI_FROM_DATABASE=DIGIGRAM
+OUI:000070*
+ ID_OUI_FROM_DATABASE=HCL LIMITED
 
-OUI:00D0A7*
- ID_OUI_FROM_DATABASE=TOKYO SOKKI KENKYUJO CO., LTD.
+OUI:00008E*
+ ID_OUI_FROM_DATABASE=SOLBOURNE COMPUTER, INC.
 
-OUI:00D032*
- ID_OUI_FROM_DATABASE=YANO ELECTRIC CO., LTD.
+OUI:0000DC*
+ ID_OUI_FROM_DATABASE=HAYES MICROCOMPUTER PRODUCTS
 
-OUI:00D054*
- ID_OUI_FROM_DATABASE=SAS INSTITUTE INC.
+OUI:000024*
+ ID_OUI_FROM_DATABASE=CONNECT AS
 
-OUI:00D0EB*
- ID_OUI_FROM_DATABASE=LIGHTERA NETWORKS, INC.
+OUI:008030*
+ ID_OUI_FROM_DATABASE=NEXUS ELECTRONICS
 
-OUI:00D01E*
- ID_OUI_FROM_DATABASE=PINGTEL CORP.
+OUI:008022*
+ ID_OUI_FROM_DATABASE=SCAN-OPTICS
 
-OUI:00D0A9*
- ID_OUI_FROM_DATABASE=SHINANO KENSHI CO., LTD.
+OUI:000041*
+ ID_OUI_FROM_DATABASE=ICE CORPORATION
 
-OUI:0030E9*
- ID_OUI_FROM_DATABASE=GMA COMMUNICATION MANUFACT'G
+OUI:00001E*
+ ID_OUI_FROM_DATABASE=TELSIST INDUSTRIA ELECTRONICA
 
-OUI:003027*
- ID_OUI_FROM_DATABASE=KERBANGO, INC.
+OUI:00807B*
+ ID_OUI_FROM_DATABASE=ARTEL COMMUNICATIONS CORP.
 
-OUI:0030F6*
- ID_OUI_FROM_DATABASE=SECURELOGIX CORPORATION
+OUI:00802E*
+ ID_OUI_FROM_DATABASE=CASTLE ROCK COMPUTING
 
-OUI:0030B6*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0080F9*
+ ID_OUI_FROM_DATABASE=HEURIKON CORPORATION
 
-OUI:0030B2*
- ID_OUI_FROM_DATABASE=L-3 Sonoma EO
+OUI:008005*
+ ID_OUI_FROM_DATABASE=CACTUS COMPUTER INC.
 
-OUI:0030D6*
- ID_OUI_FROM_DATABASE=MSC VERTRIEBS GMBH
+OUI:00801D*
+ ID_OUI_FROM_DATABASE=INTEGRATED INFERENCE MACHINES
 
-OUI:003008*
- ID_OUI_FROM_DATABASE=AVIO DIGITAL, INC.
+OUI:008015*
+ ID_OUI_FROM_DATABASE=SEIKO SYSTEMS, INC.
 
-OUI:00306D*
- ID_OUI_FROM_DATABASE=LUCENT TECHNOLOGIES
+OUI:008034*
+ ID_OUI_FROM_DATABASE=SMT GOUPIL
 
-OUI:0030E4*
- ID_OUI_FROM_DATABASE=CHIYODA SYSTEM RIKEN
+OUI:0080C9*
+ ID_OUI_FROM_DATABASE=ALBERTA MICROELECTRONIC CENTRE
 
-OUI:00301A*
- ID_OUI_FROM_DATABASE=SMARTBRIDGES PTE. LTD.
+OUI:00800B*
+ ID_OUI_FROM_DATABASE=CSK CORPORATION
 
-OUI:0030CD*
- ID_OUI_FROM_DATABASE=CONEXANT SYSTEMS, INC.
+OUI:000016*
+ ID_OUI_FROM_DATABASE=DU PONT PIXEL SYSTEMS     .
 
-OUI:003001*
- ID_OUI_FROM_DATABASE=SMP
+OUI:00005C*
+ ID_OUI_FROM_DATABASE=TELEMATICS INTERNATIONAL INC.
 
-OUI:0030E1*
- ID_OUI_FROM_DATABASE=Network Equipment Technologies, Inc.
+OUI:0000AC*
+ ID_OUI_FROM_DATABASE=CONWARE COMPUTER CONSULTING
 
-OUI:0050A7*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0000F2*
+ ID_OUI_FROM_DATABASE=SPIDER COMMUNICATIONS
 
-OUI:00D0EE*
- ID_OUI_FROM_DATABASE=DICTAPHONE CORPORATION
+OUI:000030*
+ ID_OUI_FROM_DATABASE=VG LABORATORY SYSTEMS LTD
 
-OUI:00D0B8*
- ID_OUI_FROM_DATABASE=Iomega Corporation
+OUI:000035*
+ ID_OUI_FROM_DATABASE=SPECTRAGRAPHICS CORPORATION
 
-OUI:005045*
- ID_OUI_FROM_DATABASE=RIOWORKS SOLUTIONS, INC.
+OUI:020701*
+ ID_OUI_FROM_DATABASE=RACAL-DATACOM
 
-OUI:00507C*
- ID_OUI_FROM_DATABASE=VIDEOCON AG
+OUI:080011*
+ ID_OUI_FROM_DATABASE=TEKTRONIX INC.
 
-OUI:005065*
- ID_OUI_FROM_DATABASE=TDK-Lambda Corporation
+OUI:080040*
+ ID_OUI_FROM_DATABASE=FERRANTI COMPUTER SYS. LIMITED
 
-OUI:0050C7*
- ID_OUI_FROM_DATABASE=Private
+OUI:08003B*
+ ID_OUI_FROM_DATABASE=TORUS SYSTEMS LIMITED
 
-OUI:0050F4*
- ID_OUI_FROM_DATABASE=SIGMATEK GMBH & CO. KG
+OUI:08003D*
+ ID_OUI_FROM_DATABASE=CADNETIX CORPORATIONS
 
-OUI:005076*
- ID_OUI_FROM_DATABASE=IBM Corp
+OUI:080039*
+ ID_OUI_FROM_DATABASE=SPIDER SYSTEMS LIMITED
 
-OUI:005075*
- ID_OUI_FROM_DATABASE=KESTREL SOLUTIONS
+OUI:080030*
+ ID_OUI_FROM_DATABASE=NETWORK RESEARCH CORPORATION
 
-OUI:005090*
- ID_OUI_FROM_DATABASE=DCTRI
+OUI:00009B*
+ ID_OUI_FROM_DATABASE=INFORMATION INTERNATIONAL, INC
 
-OUI:0050ED*
- ID_OUI_FROM_DATABASE=ANDA NETWORKS
+OUI:00DD0F*
+ ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
 
-OUI:005096*
- ID_OUI_FROM_DATABASE=SALIX TECHNOLOGIES, INC.
+OUI:000001*
+ ID_OUI_FROM_DATABASE=XEROX CORPORATION
 
-OUI:00509B*
- ID_OUI_FROM_DATABASE=SWITCHCORE AB
+OUI:080021*
+ ID_OUI_FROM_DATABASE=3M COMPANY
 
-OUI:0050A9*
- ID_OUI_FROM_DATABASE=MOLDAT WIRELESS TECHNOLGIES
+OUI:AA0004*
+ ID_OUI_FROM_DATABASE=DIGITAL EQUIPMENT CORPORATION
 
-OUI:00503C*
- ID_OUI_FROM_DATABASE=TSINGHUA NOVEL ELECTRONICS
+OUI:08000C*
+ ID_OUI_FROM_DATABASE=MIKLYN DEVELOPMENT CO.
 
-OUI:005030*
- ID_OUI_FROM_DATABASE=FUTURE PLUS SYSTEMS
+OUI:00DD08*
+ ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
 
-OUI:005037*
- ID_OUI_FROM_DATABASE=KOGA ELECTRONICS CO.
+OUI:0000A0*
+ ID_OUI_FROM_DATABASE=SANYO Electric Co., Ltd.
 
-OUI:00501F*
- ID_OUI_FROM_DATABASE=MRG SYSTEMS, LTD.
+OUI:08007F*
+ ID_OUI_FROM_DATABASE=CARNEGIE-MELLON UNIVERSITY
 
-OUI:005092*
- ID_OUI_FROM_DATABASE=Rigaku Corporation Osaka Plant
+OUI:080082*
+ ID_OUI_FROM_DATABASE=VERITAS SOFTWARE
 
-OUI:00501C*
- ID_OUI_FROM_DATABASE=JATOM SYSTEMS, INC.
+OUI:08007B*
+ ID_OUI_FROM_DATABASE=SANYO ELECTRIC CO. LTD.
 
-OUI:00505C*
- ID_OUI_FROM_DATABASE=TUNDO CORPORATION
+OUI:00DD0C*
+ ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
 
-OUI:005068*
- ID_OUI_FROM_DATABASE=ELECTRONIC INDUSTRIES ASSOCIATION
+OUI:000005*
+ ID_OUI_FROM_DATABASE=XEROX CORPORATION
 
-OUI:00501A*
- ID_OUI_FROM_DATABASE=IQinVision
+OUI:0000AA*
+ ID_OUI_FROM_DATABASE=XEROX CORPORATION
 
-OUI:005063*
- ID_OUI_FROM_DATABASE=OY COMSEL SYSTEM AB
+OUI:00406B*
+ ID_OUI_FROM_DATABASE=SYSGEN
 
-OUI:0050DE*
- ID_OUI_FROM_DATABASE=SIGNUM SYSTEMS CORP.
+OUI:AA0001*
+ ID_OUI_FROM_DATABASE=DIGITAL EQUIPMENT CORPORATION
 
-OUI:00507B*
- ID_OUI_FROM_DATABASE=MERLOT COMMUNICATIONS
+OUI:080001*
+ ID_OUI_FROM_DATABASE=COMPUTERVISION CORPORATION
 
-OUI:005078*
- ID_OUI_FROM_DATABASE=MEGATON HOUSE, LTD.
+OUI:000053*
+ ID_OUI_FROM_DATABASE=COMPUCORP
 
-OUI:00508F*
- ID_OUI_FROM_DATABASE=ASITA TECHNOLOGIES INT'L LTD.
+OUI:08004B*
+ ID_OUI_FROM_DATABASE=Planning Research Corp.
 
-OUI:005057*
- ID_OUI_FROM_DATABASE=BROADBAND ACCESS SYSTEMS
+OUI:080003*
+ ID_OUI_FROM_DATABASE=ADVANCED COMPUTER COMM.
 
-OUI:005087*
- ID_OUI_FROM_DATABASE=TERASAKI ELECTRIC CO., LTD.
+OUI:080074*
+ ID_OUI_FROM_DATABASE=CASIO COMPUTER CO. LTD.
 
-OUI:00D03E*
- ID_OUI_FROM_DATABASE=ROCKETCHIPS, INC.
+OUI:08005E*
+ ID_OUI_FROM_DATABASE=COUNTERPOINT COMPUTER INC.
 
-OUI:00D03F*
- ID_OUI_FROM_DATABASE=AMERICAN COMMUNICATION
+OUI:08005A*
+ ID_OUI_FROM_DATABASE=IBM Corp
 
-OUI:00D033*
- ID_OUI_FROM_DATABASE=DALIAN DAXIAN NETWORK
+OUI:080056*
+ ID_OUI_FROM_DATABASE=STANFORD LINEAR ACCEL. CENTER
 
-OUI:00D0CE*
- ID_OUI_FROM_DATABASE=ASYST ELECTRONIC
+OUI:080053*
+ ID_OUI_FROM_DATABASE=MIDDLE EAST TECH. UNIVERSITY
 
-OUI:00D090*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:08004F*
+ ID_OUI_FROM_DATABASE=CYGNET SYSTEMS
 
-OUI:00D0B6*
- ID_OUI_FROM_DATABASE=CRESCENT NETWORKS, INC.
+OUI:00194B*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:00D0D2*
- ID_OUI_FROM_DATABASE=EPILOG CORPORATION
+OUI:001F95*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:0050B6*
- ID_OUI_FROM_DATABASE=GOOD WAY IND. CO., LTD.
+OUI:000E59*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:0050FF*
- ID_OUI_FROM_DATABASE=HAKKO ELECTRONICS CO., LTD.
+OUI:A01B29*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:005032*
- ID_OUI_FROM_DATABASE=PICAZO COMMUNICATIONS, INC.
+OUI:90013B*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:0050DA*
- ID_OUI_FROM_DATABASE=3COM CORPORATION
+OUI:00235A*
+ ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
 
-OUI:0050F9*
- ID_OUI_FROM_DATABASE=Sensormatic Electronics LLC
+OUI:001B38*
+ ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
 
-OUI:0050F6*
- ID_OUI_FROM_DATABASE=PAN-INTERNATIONAL INDUSTRIAL CORP.
+OUI:E46F13*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:00506C*
- ID_OUI_FROM_DATABASE=Beijer Electronics Products AB
+OUI:94C150*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:0050A5*
- ID_OUI_FROM_DATABASE=CAPITOL BUSINESS SYSTEMS, LTD.
+OUI:60FE20*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:005000*
- ID_OUI_FROM_DATABASE=NEXO COMMUNICATIONS, INC.
+OUI:989096*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00D071*
- ID_OUI_FROM_DATABASE=ECHELON CORP.
+OUI:B82A72*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00D066*
- ID_OUI_FROM_DATABASE=WINTRISS ENGINEERING CORP.
+OUI:00D09E*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:00D06F*
- ID_OUI_FROM_DATABASE=KMC CONTROLS
+OUI:000D72*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:00D04B*
- ID_OUI_FROM_DATABASE=LA CIE GROUP S.A.
+OUI:000F1F*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00D060*
- ID_OUI_FROM_DATABASE=Panasonic Europe Ltd.
+OUI:14FEB5*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00D002*
- ID_OUI_FROM_DATABASE=DITECH CORPORATION
+OUI:0015C5*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00D0A6*
- ID_OUI_FROM_DATABASE=LANBIRD TECHNOLOGY CO., LTD.
+OUI:D4AE52*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00D0DE*
- ID_OUI_FROM_DATABASE=PHILIPS MULTIMEDIA NETWORK
+OUI:B0E754*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:00D083*
- ID_OUI_FROM_DATABASE=INVERTEX, INC.
+OUI:B8E625*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:00D038*
- ID_OUI_FROM_DATABASE=FIVEMERE, LTD.
+OUI:549F35*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00D00C*
- ID_OUI_FROM_DATABASE=SNIJDER MICRO SYSTEMS
+OUI:64006A*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00D0F2*
- ID_OUI_FROM_DATABASE=MONTEREY NETWORKS
+OUI:B4E10F*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00D07B*
- ID_OUI_FROM_DATABASE=COMCAM INTERNATIONAL INC
+OUI:0023AE*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00D05D*
- ID_OUI_FROM_DATABASE=INTELLIWORXX, INC.
+OUI:9CD917*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:00D00D*
- ID_OUI_FROM_DATABASE=MICROMERITICS INSTRUMENT
+OUI:9068C3*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:00D04C*
- ID_OUI_FROM_DATABASE=EUROTEL TELECOM LTD.
+OUI:408805*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:00D0FD*
- ID_OUI_FROM_DATABASE=OPTIMA TELE.COM, INC.
+OUI:AC2B6E*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:0030D8*
- ID_OUI_FROM_DATABASE=SITEK
+OUI:F8F1B6*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:003062*
- ID_OUI_FROM_DATABASE=IP Video Networks Inc
+OUI:00216A*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:003081*
- ID_OUI_FROM_DATABASE=ALTOS C&C
+OUI:001E64*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00D0B0*
- ID_OUI_FROM_DATABASE=BITSWITCH LTD.
+OUI:0016EB*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00D044*
- ID_OUI_FROM_DATABASE=ALIDIAN NETWORKS, INC.
+OUI:0018DE*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00D004*
- ID_OUI_FROM_DATABASE=PENTACOM LTD.
+OUI:681729*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00D045*
- ID_OUI_FROM_DATABASE=KVASER AB
+OUI:5C514F*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00D0D0*
- ID_OUI_FROM_DATABASE=ZHONGXING TELECOM LTD.
+OUI:B808CF*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00902C*
- ID_OUI_FROM_DATABASE=DATA & CONTROL EQUIPMENT LTD.
+OUI:C8F733*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:009049*
- ID_OUI_FROM_DATABASE=ENTRIDIA CORPORATION
+OUI:4851B7*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:009043*
- ID_OUI_FROM_DATABASE=Tattile SRL
+OUI:5CC5D4*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:009076*
- ID_OUI_FROM_DATABASE=FMT AIRCRAFT GATE SUPPORT SYSTEMS AB
+OUI:7CCCB8*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:009017*
- ID_OUI_FROM_DATABASE=Zypcom, Inc
+OUI:F40669*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00907B*
- ID_OUI_FROM_DATABASE=E-TECH, INC.
+OUI:3CA9F4*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00102A*
- ID_OUI_FROM_DATABASE=ZF MICROSYSTEMS, INC.
+OUI:28B2BD*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00107D*
- ID_OUI_FROM_DATABASE=AURORA COMMUNICATIONS, LTD.
+OUI:08D40C*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00101C*
- ID_OUI_FROM_DATABASE=OHM TECHNOLOGIES INTL, LLC
+OUI:843A4B*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00106C*
- ID_OUI_FROM_DATABASE=EDNT GmbH
+OUI:0CD292*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:0010D4*
- ID_OUI_FROM_DATABASE=STORAGE COMPUTER CORPORATION
+OUI:78929C*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:0010BF*
- ID_OUI_FROM_DATABASE=InterAir Wireless
+OUI:6805CA*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:001036*
- ID_OUI_FROM_DATABASE=INTER-TEL INTEGRATED SYSTEMS
+OUI:ACA31E*
+ ID_OUI_FROM_DATABASE=Aruba Networks
 
-OUI:001026*
- ID_OUI_FROM_DATABASE=ACCELERATED NETWORKS, INC.
+OUI:9C1C12*
+ ID_OUI_FROM_DATABASE=Aruba Networks
 
-OUI:00104B*
- ID_OUI_FROM_DATABASE=3COM CORPORATION
+OUI:001A1E*
+ ID_OUI_FROM_DATABASE=Aruba Networks
 
-OUI:000629*
- ID_OUI_FROM_DATABASE=IBM Corp
+OUI:28C2DD*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:001004*
- ID_OUI_FROM_DATABASE=THE BRANTLEY COILE COMPANY,INC
+OUI:84D47E*
+ ID_OUI_FROM_DATABASE=Aruba Networks
 
-OUI:00103A*
- ID_OUI_FROM_DATABASE=DIAMOND NETWORK TECH
+OUI:A85840*
+ ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
 
-OUI:0010D8*
- ID_OUI_FROM_DATABASE=CALISTA
+OUI:002243*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:001031*
- ID_OUI_FROM_DATABASE=OBJECTIVE COMMUNICATIONS, INC.
+OUI:74F06D*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:00107E*
- ID_OUI_FROM_DATABASE=BACHMANN ELECTRONIC GmbH
+OUI:44D832*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:0010C0*
- ID_OUI_FROM_DATABASE=ARMA, Inc.
+OUI:781881*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:001016*
- ID_OUI_FROM_DATABASE=T.SQWARE
+OUI:B0EE45*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:00103D*
- ID_OUI_FROM_DATABASE=PHASECOM, LTD.
+OUI:240A64*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:0010C2*
- ID_OUI_FROM_DATABASE=WILLNET, INC.
+OUI:D0E782*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:00107A*
- ID_OUI_FROM_DATABASE=AmbiCom, Inc.
+OUI:0C4C39*
+ ID_OUI_FROM_DATABASE=MitraStar Technology Corp.
 
-OUI:0010C4*
- ID_OUI_FROM_DATABASE=MEDIA GLOBAL LINKS CO., LTD.
+OUI:002423*
+ ID_OUI_FROM_DATABASE=AzureWave Technologies (Shanghai) Inc.
 
-OUI:0010EB*
- ID_OUI_FROM_DATABASE=SELSIUS SYSTEMS, INC.
+OUI:A81D16*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:0010FE*
- ID_OUI_FROM_DATABASE=DIGITAL EQUIPMENT CORPORATION
+OUI:38A53C*
+ ID_OUI_FROM_DATABASE=COMECER Netherlands
 
-OUI:00102E*
- ID_OUI_FROM_DATABASE=NETWORK SYSTEMS & TECHNOLOGIES PVT. LTD.
+OUI:001D8B*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:00103E*
- ID_OUI_FROM_DATABASE=NETSCHOOLS CORPORATION
+OUI:A4526F*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:001049*
- ID_OUI_FROM_DATABASE=ShoreTel, Inc
+OUI:581243*
+ ID_OUI_FROM_DATABASE=AcSiP Technology Corp.
 
-OUI:00105E*
- ID_OUI_FROM_DATABASE=Spirent plc, Service Assurance Broadband
+OUI:0026B8*
+ ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
 
-OUI:005088*
- ID_OUI_FROM_DATABASE=AMANO CORPORATION
+OUI:0030F1*
+ ID_OUI_FROM_DATABASE=Accton Technology Corp
 
-OUI:0050A8*
- ID_OUI_FROM_DATABASE=OpenCon Systems, Inc.
+OUI:001974*
+ ID_OUI_FROM_DATABASE=16063
 
-OUI:005062*
- ID_OUI_FROM_DATABASE=KOUWELL ELECTRONICS CORP.  **
+OUI:ECF00E*
+ ID_OUI_FROM_DATABASE=AboCom
 
-OUI:0050B1*
- ID_OUI_FROM_DATABASE=GIDDINGS & LEWIS
+OUI:3039F2*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:00500C*
- ID_OUI_FROM_DATABASE=e-Tek Labs, Inc.
+OUI:000827*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:005091*
- ID_OUI_FROM_DATABASE=NETACCESS, INC.
+OUI:9097D5*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
 
-OUI:005097*
- ID_OUI_FROM_DATABASE=MMC-EMBEDDED COMPUTERTECHNIK GmbH
+OUI:18FE34*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
 
-OUI:0050AF*
- ID_OUI_FROM_DATABASE=INTERGON, INC.
+OUI:54F6C5*
+ ID_OUI_FROM_DATABASE=FUJIAN STAR-NET COMMUNICATION CO.,LTD
 
-OUI:0050EB*
- ID_OUI_FROM_DATABASE=ALPHA-TOP CORPORATION
+OUI:5C338E*
+ ID_OUI_FROM_DATABASE=Alpha Networks Inc.
 
-OUI:0050BC*
- ID_OUI_FROM_DATABASE=HAMMER STORAGE SOLUTIONS
+OUI:001AEB*
+ ID_OUI_FROM_DATABASE=Allied Telesis R&D Center K.K.
 
-OUI:0090C3*
- ID_OUI_FROM_DATABASE=TOPIC SEMICONDUCTOR CORP.
+OUI:A43111*
+ ID_OUI_FROM_DATABASE=ZIV
 
-OUI:0090EC*
- ID_OUI_FROM_DATABASE=PYRESCOM
+OUI:5C93A2*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:00903B*
- ID_OUI_FROM_DATABASE=TriEMS Research Lab, Inc.
+OUI:E8C74F*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:009074*
- ID_OUI_FROM_DATABASE=ARGON NETWORKS, INC.
+OUI:E8F724*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:0090C1*
- ID_OUI_FROM_DATABASE=Peco II, Inc.
+OUI:701A04*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:0010D3*
- ID_OUI_FROM_DATABASE=GRIPS ELECTRONIC GMBH
+OUI:48D224*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:0010ED*
- ID_OUI_FROM_DATABASE=SUNDANCE TECHNOLOGY, INC.
+OUI:2CD05A*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:001023*
- ID_OUI_FROM_DATABASE=Network Equipment Technologies
+OUI:74E543*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:00104E*
- ID_OUI_FROM_DATABASE=CEOLOGIC
+OUI:A4DB30*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:0010FB*
- ID_OUI_FROM_DATABASE=ZIDA TECHNOLOGIES LIMITED
+OUI:B8EE65*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:0010AD*
- ID_OUI_FROM_DATABASE=SOFTRONICS USB, INC.
+OUI:001DBA*
+ ID_OUI_FROM_DATABASE=Sony Corporation
 
-OUI:0010D5*
- ID_OUI_FROM_DATABASE=IMASDE CANARIAS, S.A.
+OUI:000AD9*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:0010E5*
- ID_OUI_FROM_DATABASE=SOLECTRON TEXAS
+OUI:000FDE*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:00909D*
- ID_OUI_FROM_DATABASE=NovaTech Process Solutions, LLC
+OUI:001EDC*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:009038*
- ID_OUI_FROM_DATABASE=FOUNTAIN TECHNOLOGIES, INC.
+OUI:001963*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:0090C5*
- ID_OUI_FROM_DATABASE=INTERNET MAGIC, INC.
+OUI:001B59*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:0090AD*
- ID_OUI_FROM_DATABASE=ASPECT ELECTRONICS, INC.
+OUI:78843C*
+ ID_OUI_FROM_DATABASE=Sony Corporation
 
-OUI:009097*
- ID_OUI_FROM_DATABASE=Sycamore Networks
+OUI:0023F1*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:009008*
- ID_OUI_FROM_DATABASE=HanA Systems Inc.
+OUI:3017C8*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:0090D4*
- ID_OUI_FROM_DATABASE=BindView Development Corp.
+OUI:18002D*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:009089*
- ID_OUI_FROM_DATABASE=SOFTCOM MICROSYSTEMS, INC.
+OUI:04E676*
+ ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
 
-OUI:0090C4*
- ID_OUI_FROM_DATABASE=JAVELIN SYSTEMS, INC.
+OUI:0022F4*
+ ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
 
-OUI:009014*
- ID_OUI_FROM_DATABASE=ROTORK INSTRUMENTS, LTD.
+OUI:080046*
+ ID_OUI_FROM_DATABASE=Sony Corporation
 
-OUI:0090B5*
- ID_OUI_FROM_DATABASE=NIKON CORPORATION
+OUI:000D92*
+ ID_OUI_FROM_DATABASE=ARIMA Communications Corp.
 
-OUI:0090C6*
- ID_OUI_FROM_DATABASE=OPTIM SYSTEMS, INC.
+OUI:009096*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
-OUI:00909B*
- ID_OUI_FROM_DATABASE=MARKEM-IMAJE
+OUI:0011F5*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
-OUI:00905B*
- ID_OUI_FROM_DATABASE=RAYMOND AND LAE ENGINEERING
+OUI:DCD87C*
+ ID_OUI_FROM_DATABASE=Beijing Jingdong Century Trading Co., LTD.
 
-OUI:0090E8*
- ID_OUI_FROM_DATABASE=MOXA TECHNOLOGIES CORP., LTD.
+OUI:001C4A*
+ ID_OUI_FROM_DATABASE=AVM GmbH
 
-OUI:0090A1*
- ID_OUI_FROM_DATABASE=Flying Pig Systems/High End Systems Inc.
+OUI:000B6A*
+ ID_OUI_FROM_DATABASE=Asiarock Technology Limited
 
-OUI:0090FD*
- ID_OUI_FROM_DATABASE=CopperCom, Inc.
+OUI:40BA61*
+ ID_OUI_FROM_DATABASE=ARIMA Communications Corp.
 
-OUI:0090AC*
- ID_OUI_FROM_DATABASE=OPTIVISION, INC.
+OUI:1883BF*
+ ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
 
-OUI:00902A*
- ID_OUI_FROM_DATABASE=COMMUNICATION DEVICES, INC.
+OUI:9C80DF*
+ ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
 
-OUI:009098*
- ID_OUI_FROM_DATABASE=SBC DESIGNS, INC.
+OUI:001CCC*
+ ID_OUI_FROM_DATABASE=BlackBerry RTS
 
-OUI:0090CF*
- ID_OUI_FROM_DATABASE=NORTEL
+OUI:94EBCD*
+ ID_OUI_FROM_DATABASE=BlackBerry RTS
 
-OUI:00900F*
- ID_OUI_FROM_DATABASE=KAWASAKI HEAVY INDUSTRIES, LTD
+OUI:644FB0*
+ ID_OUI_FROM_DATABASE=Hyunjin.com
 
-OUI:009036*
- ID_OUI_FROM_DATABASE=ens, inc.
+OUI:001A2A*
+ ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
 
-OUI:0090E9*
- ID_OUI_FROM_DATABASE=JANZ COMPUTER AG
+OUI:001D19*
+ ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
 
-OUI:009032*
- ID_OUI_FROM_DATABASE=PELCOMBE GROUP LTD.
+OUI:88252C*
+ ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
 
-OUI:0090B8*
- ID_OUI_FROM_DATABASE=ROHDE & SCHWARZ GMBH & CO. KG
+OUI:A4E4B8*
+ ID_OUI_FROM_DATABASE=BlackBerry RTS
 
-OUI:0090BE*
- ID_OUI_FROM_DATABASE=IBC/INTEGRATED BUSINESS COMPUTERS
+OUI:58671A*
+ ID_OUI_FROM_DATABASE=Barnes&Noble
 
-OUI:009062*
- ID_OUI_FROM_DATABASE=ICP VORTEX COMPUTERSYSTEME GmbH
+OUI:BC0543*
+ ID_OUI_FROM_DATABASE=AVM GmbH
 
-OUI:00108F*
- ID_OUI_FROM_DATABASE=RAPTOR SYSTEMS
+OUI:002675*
+ ID_OUI_FROM_DATABASE=Aztech Electronics Pte Ltd
 
-OUI:001089*
- ID_OUI_FROM_DATABASE=WebSonic
+OUI:001F3F*
+ ID_OUI_FROM_DATABASE=AVM GmbH
 
-OUI:001086*
- ID_OUI_FROM_DATABASE=ATTO Technology, Inc.
+OUI:0020D6*
+ ID_OUI_FROM_DATABASE=Breezecom, Ltd.
 
-OUI:001027*
- ID_OUI_FROM_DATABASE=L-3 COMMUNICATIONS EAST
+OUI:001018*
+ ID_OUI_FROM_DATABASE=Broadcom
 
-OUI:0010B8*
- ID_OUI_FROM_DATABASE=ISHIGAKI COMPUTER SYSTEM CO.
+OUI:001BE9*
+ ID_OUI_FROM_DATABASE=Broadcom
 
-OUI:00104C*
- ID_OUI_FROM_DATABASE=Teledyne LeCroy, Inc
+OUI:008077*
+ ID_OUI_FROM_DATABASE=Brother industries, LTD.
 
-OUI:001001*
- ID_OUI_FROM_DATABASE=Citel
+OUI:029D8E*
+ ID_OUI_FROM_DATABASE=CARDIAC RECORDERS, INC.
 
-OUI:0010CF*
- ID_OUI_FROM_DATABASE=FIBERLANE COMMUNICATIONS
+OUI:FC2F40*
+ ID_OUI_FROM_DATABASE=Calxeda, Inc.
 
-OUI:001068*
- ID_OUI_FROM_DATABASE=COMOS TELECOM
+OUI:0026E4*
+ ID_OUI_FROM_DATABASE=Canal +
 
-OUI:001067*
- ID_OUI_FROM_DATABASE=Ericsson
+OUI:389496*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0010F1*
- ID_OUI_FROM_DATABASE=I-O CORPORATION
+OUI:0CB319*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001073*
- ID_OUI_FROM_DATABASE=TECHNOBOX, INC.
+OUI:08EE8B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E0C0*
- ID_OUI_FROM_DATABASE=SEIWA ELECTRIC MFG. CO., LTD.
+OUI:A89FBA*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E046*
- ID_OUI_FROM_DATABASE=BENTLY NEVADA CORP.
+OUI:FC1910*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E015*
- ID_OUI_FROM_DATABASE=HEIWA CORPORATION
+OUI:083D88*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E065*
- ID_OUI_FROM_DATABASE=OPTICAL ACCESS INTERNATIONAL
+OUI:5C2E59*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E069*
- ID_OUI_FROM_DATABASE=JAYCOR
+OUI:646CB2*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E05C*
- ID_OUI_FROM_DATABASE=Panasonic Healthcare Co., Ltd.
+OUI:F884F2*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E087*
- ID_OUI_FROM_DATABASE=LeCroy - Networking Productions Division
+OUI:14B484*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E049*
- ID_OUI_FROM_DATABASE=MICROWI ELECTRONIC GmbH
+OUI:608F5C*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E050*
- ID_OUI_FROM_DATABASE=EXECUTONE INFORMATION SYSTEMS, INC.
+OUI:4CBCA5*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E064*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRONICS
+OUI:78595E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E012*
- ID_OUI_FROM_DATABASE=PLUTO TECHNOLOGIES INTERNATIONAL INC.
+OUI:B0D09C*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E0D8*
- ID_OUI_FROM_DATABASE=LANBit Computer, Inc.
+OUI:4CA56D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E02D*
- ID_OUI_FROM_DATABASE=InnoMediaLogic, Inc.
+OUI:A48431*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E0A9*
- ID_OUI_FROM_DATABASE=FUNAI ELECTRIC CO., LTD.
+OUI:E4F8EF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E035*
- ID_OUI_FROM_DATABASE=Artesyn Embedded Technologies
+OUI:1432D1*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E060*
- ID_OUI_FROM_DATABASE=SHERWOOD
+OUI:E458E7*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E0A2*
- ID_OUI_FROM_DATABASE=MICROSLATE INC.
+OUI:8CBFA6*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E06C*
- ID_OUI_FROM_DATABASE=Ultra Electronics Limited (AEP Networks)
+OUI:7840E4*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E0CE*
- ID_OUI_FROM_DATABASE=ARN
+OUI:9000DB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E05F*
- ID_OUI_FROM_DATABASE=e-Net, Inc.
+OUI:183A2D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E02B*
- ID_OUI_FROM_DATABASE=EXTREME NETWORKS
+OUI:08373D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E0C7*
- ID_OUI_FROM_DATABASE=EUROTECH SRL
+OUI:50F520*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E0C4*
- ID_OUI_FROM_DATABASE=HORNER ELECTRIC, INC.
+OUI:A4EBD3*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E04D*
- ID_OUI_FROM_DATABASE=INTERNET INITIATIVE JAPAN, INC
+OUI:28987B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00607F*
- ID_OUI_FROM_DATABASE=AURORA TECHNOLOGIES, INC.
+OUI:F40E22*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E039*
- ID_OUI_FROM_DATABASE=PARADYNE CORP.
+OUI:9C3AAF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:006091*
- ID_OUI_FROM_DATABASE=FIRST PACIFIC NETWORKS, INC.
+OUI:BCF2AF*
+ ID_OUI_FROM_DATABASE=devolo AG
 
-OUI:006002*
- ID_OUI_FROM_DATABASE=SCREEN SUBTITLING SYSTEMS, LTD
+OUI:0270B3*
+ ID_OUI_FROM_DATABASE=DATA RECALL LTD.
 
-OUI:006061*
- ID_OUI_FROM_DATABASE=WHISTLE COMMUNICATIONS CORP.
+OUI:000FF6*
+ ID_OUI_FROM_DATABASE=DARFON LIGHTING CORP
 
-OUI:0060BD*
- ID_OUI_FROM_DATABASE=HUBBELL-PULSECOM
+OUI:702559*
+ ID_OUI_FROM_DATABASE=CyberTAN Technology Inc.
 
-OUI:00E0A1*
- ID_OUI_FROM_DATABASE=HIMA PAUL HILDEBRANDT GmbH Co. KG
+OUI:0090D6*
+ ID_OUI_FROM_DATABASE=Crystal Group, Inc.
 
-OUI:00E028*
- ID_OUI_FROM_DATABASE=APTIX CORPORATION
+OUI:001DAA*
+ ID_OUI_FROM_DATABASE=DrayTek Corp.
 
-OUI:00E0F2*
- ID_OUI_FROM_DATABASE=ARLOTTO COMNET, INC.
+OUI:02CF1C*
+ ID_OUI_FROM_DATABASE=Communication Machinery Corporation
 
-OUI:00E020*
- ID_OUI_FROM_DATABASE=TECNOMEN OY
+OUI:0C75BD*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00E0C5*
- ID_OUI_FROM_DATABASE=BCOM ELECTRONICS INC.
+OUI:38F0C8*
+ ID_OUI_FROM_DATABASE=Livestream
 
-OUI:00E0EE*
- ID_OUI_FROM_DATABASE=MAREL HF
+OUI:0C1167*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00E0AC*
- ID_OUI_FROM_DATABASE=MIDSCO, INC.
+OUI:001982*
+ ID_OUI_FROM_DATABASE=SmarDTV
 
-OUI:00E002*
- ID_OUI_FROM_DATABASE=CROSSROADS SYSTEMS, INC.
+OUI:10C6FC*
+ ID_OUI_FROM_DATABASE=Garmin International
 
-OUI:00E057*
- ID_OUI_FROM_DATABASE=HAN MICROTELECOM. CO., LTD.
+OUI:00E000*
+ ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
-OUI:00E0F0*
- ID_OUI_FROM_DATABASE=ABLER TECHNOLOGY, INC.
+OUI:00000E*
+ ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
-OUI:00E0B7*
- ID_OUI_FROM_DATABASE=PI GROUP, LTD.
+OUI:002326*
+ ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
-OUI:0010B1*
- ID_OUI_FROM_DATABASE=FOR-A CO., LTD.
+OUI:0007CB*
+ ID_OUI_FROM_DATABASE=FREEBOX SAS
 
-OUI:001041*
- ID_OUI_FROM_DATABASE=BRISTOL BABCOCK, INC.
+OUI:3C591E*
+ ID_OUI_FROM_DATABASE=TCL King Electrical Appliances (Huizhou) Co., Ltd
 
-OUI:0010F7*
- ID_OUI_FROM_DATABASE=IRIICHI TECHNOLOGIES Inc.
+OUI:002682*
+ ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
 
-OUI:0010E6*
- ID_OUI_FROM_DATABASE=APPLIED INTELLIGENT SYSTEMS, INC.
+OUI:001A73*
+ ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
 
-OUI:00101E*
- ID_OUI_FROM_DATABASE=MATSUSHITA ELECTRONIC INSTRUMENTS CORP.
+OUI:00904B*
+ ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
 
-OUI:0010F2*
- ID_OUI_FROM_DATABASE=ANTEC
+OUI:D86BF7*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:0010BE*
- ID_OUI_FROM_DATABASE=MARCH NETWORKS CORPORATION
+OUI:A4C0E1*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:006058*
- ID_OUI_FROM_DATABASE=COPPER MOUNTAIN COMMUNICATIONS, INC.
+OUI:34AF2C*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:00601B*
- ID_OUI_FROM_DATABASE=MESA ELECTRONICS
+OUI:8CCDE8*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:0060FF*
- ID_OUI_FROM_DATABASE=QuVis, Inc.
+OUI:9CE635*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:006056*
- ID_OUI_FROM_DATABASE=NETWORK TOOLS, INC.
+OUI:600194*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
 
-OUI:0060D8*
- ID_OUI_FROM_DATABASE=ELMIC SYSTEMS, INC.
+OUI:F44D17*
+ ID_OUI_FROM_DATABASE=GOLDCARD HIGH-TECH CO.,LTD.
 
-OUI:00607A*
- ID_OUI_FROM_DATABASE=DVS GMBH
+OUI:001E35*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:006097*
- ID_OUI_FROM_DATABASE=3COM CORPORATION
+OUI:001FC5*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:0060E3*
- ID_OUI_FROM_DATABASE=ARBIN INSTRUMENTS
+OUI:0021BD*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:00E0FD*
- ID_OUI_FROM_DATABASE=A-TREND TECHNOLOGY CO., LTD.
+OUI:002709*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:00E0FB*
- ID_OUI_FROM_DATABASE=LEIGHTRONIX, INC.
+OUI:E84ECE*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:00E0D3*
- ID_OUI_FROM_DATABASE=DATENTECHNIK GmbH
+OUI:0009BF*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:00E05E*
- ID_OUI_FROM_DATABASE=JAPAN AVIATION ELECTRONICS INDUSTRY, LTD.
+OUI:001AE9*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:00E0E5*
- ID_OUI_FROM_DATABASE=CINCO NETWORKS, INC.
+OUI:001CBE*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:00A0FD*
- ID_OUI_FROM_DATABASE=SCITEX DIGITAL PRINTING, INC.
+OUI:002403*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00A0F5*
- ID_OUI_FROM_DATABASE=RADGUARD LTD.
+OUI:002265*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00A022*
- ID_OUI_FROM_DATABASE=CENTRE FOR DEVELOPMENT OF ADVANCED COMPUTING
+OUI:0019B7*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00A087*
- ID_OUI_FROM_DATABASE=Microsemi Corporation
+OUI:002404*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00A007*
- ID_OUI_FROM_DATABASE=APEXX TECHNOLOGY, INC.
+OUI:0002EE*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00A066*
- ID_OUI_FROM_DATABASE=ISA CO., LTD.
+OUI:001C9A*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00A0AB*
- ID_OUI_FROM_DATABASE=NETCS INFORMATIONSTECHNIK GMBH
+OUI:001F01*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00A0D8*
- ID_OUI_FROM_DATABASE=SPECTRA - TEK
+OUI:000EED*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00A01A*
- ID_OUI_FROM_DATABASE=BINAR ELEKTRONIK AB
+OUI:001E3A*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00A0E8*
- ID_OUI_FROM_DATABASE=REUTERS HOLDINGS PLC
+OUI:001A89*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00A076*
- ID_OUI_FROM_DATABASE=CARDWARE LAB, INC.
+OUI:0021AA*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00A0A3*
- ID_OUI_FROM_DATABASE=RELIABLE POWER METERS
+OUI:002669*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00A055*
- ID_OUI_FROM_DATABASE=Data Device Corporation
+OUI:0022FD*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00A065*
- ID_OUI_FROM_DATABASE=Symantec Corporation
+OUI:002109*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00A044*
- ID_OUI_FROM_DATABASE=NTT IT CO., LTD.
+OUI:002108*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:006008*
- ID_OUI_FROM_DATABASE=3COM CORPORATION
+OUI:001D6E*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:0060EF*
- ID_OUI_FROM_DATABASE=FLYTECH TECHNOLOGY CO., LTD.
+OUI:001B33*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:006098*
- ID_OUI_FROM_DATABASE=HT COMMUNICATIONS
+OUI:ECF35B*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:0060F7*
- ID_OUI_FROM_DATABASE=DATAFUSION SYSTEMS
+OUI:EC9B5B*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:0060DE*
- ID_OUI_FROM_DATABASE=Kayser-Threde GmbH
+OUI:BCC6DB*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:0060D0*
- ID_OUI_FROM_DATABASE=SNMP RESEARCH INCORPORATED
+OUI:B83241*
+ ID_OUI_FROM_DATABASE=Wuhan Tianyu Information Industry Co., Ltd.
 
-OUI:006079*
- ID_OUI_FROM_DATABASE=Mainstream Data, Inc.
+OUI:9897D1*
+ ID_OUI_FROM_DATABASE=MitraStar Technology Corp.
 
-OUI:006020*
- ID_OUI_FROM_DATABASE=PIVOTAL NETWORKING, INC.
+OUI:94C960*
+ ID_OUI_FROM_DATABASE=Zhongshan B&T technology.co.,ltd
 
-OUI:0005A8*
- ID_OUI_FROM_DATABASE=WYLE ELECTRONICS
+OUI:001479*
+ ID_OUI_FROM_DATABASE=NEC Magnus Communications,Ltd.
 
-OUI:0060B7*
- ID_OUI_FROM_DATABASE=CHANNELMATIC, INC.
+OUI:9C4FDA*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0060A3*
- ID_OUI_FROM_DATABASE=CONTINUUM TECHNOLOGY CORP.
+OUI:1C5CF2*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:006050*
- ID_OUI_FROM_DATABASE=INTERNIX INC.
+OUI:0821EF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0060E0*
- ID_OUI_FROM_DATABASE=AXIOM TECHNOLOGY CO., LTD.
+OUI:A0CBFD*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0060A8*
- ID_OUI_FROM_DATABASE=TIDOMAT AB
+OUI:34145F*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00A056*
- ID_OUI_FROM_DATABASE=MICROPROSS
+OUI:B462AD*
+ ID_OUI_FROM_DATABASE=Elysia Germany GmbH
 
-OUI:00A051*
- ID_OUI_FROM_DATABASE=ANGIA COMMUNICATIONS. INC.
+OUI:747818*
+ ID_OUI_FROM_DATABASE=Jurumani Solutions
 
-OUI:00A0A6*
- ID_OUI_FROM_DATABASE=M.I. SYSTEMS, K.K.
+OUI:803896*
+ ID_OUI_FROM_DATABASE=SHARP Corporation
 
-OUI:00A05F*
- ID_OUI_FROM_DATABASE=BTG Electronics Design BV
+OUI:80D160*
+ ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
-OUI:00A094*
- ID_OUI_FROM_DATABASE=COMSAT CORPORATION
+OUI:686E23*
+ ID_OUI_FROM_DATABASE=Wi3 Inc.
 
-OUI:00A010*
- ID_OUI_FROM_DATABASE=SYSLOGIC DATENTECHNIK AG
+OUI:B8A175*
+ ID_OUI_FROM_DATABASE=Roku, Inc.
 
-OUI:00A063*
- ID_OUI_FROM_DATABASE=JRL SYSTEMS, INC.
+OUI:0080E5*
+ ID_OUI_FROM_DATABASE=NetApp
 
-OUI:00A08F*
- ID_OUI_FROM_DATABASE=DESKNET SYSTEMS, INC.
+OUI:E49A79*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00A0CC*
- ID_OUI_FROM_DATABASE=LITE-ON COMMUNICATIONS, INC.
+OUI:28A02B*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00A090*
- ID_OUI_FROM_DATABASE=TimeStep Corporation
+OUI:B44BD2*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00A0F7*
- ID_OUI_FROM_DATABASE=V.I COMPUTER CORP.
+OUI:002340*
+ ID_OUI_FROM_DATABASE=MiXTelematics
 
-OUI:00A09C*
- ID_OUI_FROM_DATABASE=Xyplex, Inc.
+OUI:B48B19*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00A092*
- ID_OUI_FROM_DATABASE=H. BOLLMANN MANUFACTURERS, LTD
+OUI:00AF1F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00A04D*
- ID_OUI_FROM_DATABASE=EDA INSTRUMENTS, INC.
+OUI:4CCC6A*
+ ID_OUI_FROM_DATABASE=Micro-Star INTL CO., LTD.
 
-OUI:00A0DB*
- ID_OUI_FROM_DATABASE=FISHER & PAYKEL PRODUCTION
+OUI:985BB0*
+ ID_OUI_FROM_DATABASE=KMDATA INC.
 
-OUI:00A0A5*
- ID_OUI_FROM_DATABASE=TEKNOR MICROSYSTEME, INC.
+OUI:6C8FB5*
+ ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
 
-OUI:00A018*
- ID_OUI_FROM_DATABASE=CREATIVE CONTROLLERS, INC.
+OUI:245EBE*
+ ID_OUI_FROM_DATABASE=QNAP Systems, Inc.
 
-OUI:00A09F*
- ID_OUI_FROM_DATABASE=COMMVISION CORP.
+OUI:A89352*
+ ID_OUI_FROM_DATABASE=SHANGHAI ZHONGMI COMMUNICATION TECHNOLOGY CO.,LTD
 
-OUI:00A06B*
- ID_OUI_FROM_DATABASE=DMS DORSCH MIKROSYSTEM GMBH
+OUI:AC5F3E*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:006051*
- ID_OUI_FROM_DATABASE=QUALITY SEMICONDUCTOR
+OUI:70661B*
+ ID_OUI_FROM_DATABASE=Sonova AG
 
-OUI:00605E*
- ID_OUI_FROM_DATABASE=LIBERTY TECHNOLOGY NETWORKING
+OUI:1C98EC*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:0060C6*
- ID_OUI_FROM_DATABASE=DCS AG
+OUI:9C9D5D*
+ ID_OUI_FROM_DATABASE=Raden Inc
 
-OUI:00609E*
- ID_OUI_FROM_DATABASE=ASC X3 - INFORMATION TECHNOLOGY STANDARDS SECRETARIATS
+OUI:E8FD72*
+ ID_OUI_FROM_DATABASE=SHANGHAI LINGUO TECHNOLOGY CO., LTD.
 
-OUI:006084*
- ID_OUI_FROM_DATABASE=DIGITAL VIDEO
+OUI:98BB1E*
+ ID_OUI_FROM_DATABASE=BYD Precision Manufacture Company Ltd.
 
-OUI:00602D*
- ID_OUI_FROM_DATABASE=ALERTON TECHNOLOGIES, INC.
+OUI:EC438B*
+ ID_OUI_FROM_DATABASE=YAPTV
 
-OUI:006093*
- ID_OUI_FROM_DATABASE=VARIAN
+OUI:1866DA*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:0060E2*
- ID_OUI_FROM_DATABASE=QUEST ENGINEERING & DEVELOPMENT
+OUI:981FB1*
+ ID_OUI_FROM_DATABASE=Shenzhen Lemon Network Technology Co.,Ltd
 
-OUI:00A039*
- ID_OUI_FROM_DATABASE=ROSS TECHNOLOGY, INC.
+OUI:40476A*
+ ID_OUI_FROM_DATABASE=AG Acquisition Corp. d.b.a. ASTRO Gaming
 
-OUI:00A06D*
- ID_OUI_FROM_DATABASE=MANNESMANN TALLY CORPORATION
+OUI:A4BF01*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00608E*
- ID_OUI_FROM_DATABASE=HE ELECTRONICS, TECHNOLOGIE & SYSTEMTECHNIK GmbH
+OUI:509EA7*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0060F0*
- ID_OUI_FROM_DATABASE=JOHNSON & JOHNSON MEDICAL, INC
+OUI:DCCF96*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0060D2*
- ID_OUI_FROM_DATABASE=LUCENT TECHNOLOGIES TAIWAN TELECOMMUNICATIONS CO., LTD.
+OUI:0004C6*
+ ID_OUI_FROM_DATABASE=YAMAHA MOTOR CO.,LTD
 
-OUI:006077*
- ID_OUI_FROM_DATABASE=PRISA NETWORKS
+OUI:14D11F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0060AB*
- ID_OUI_FROM_DATABASE=LARSCOM INCORPORATED
+OUI:54511B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0060E9*
- ID_OUI_FROM_DATABASE=ATOP TECHNOLOGIES, INC.
+OUI:68536C*
+ ID_OUI_FROM_DATABASE=SPnS Co.,Ltd
 
-OUI:00608B*
- ID_OUI_FROM_DATABASE=ConferTech International
+OUI:005BA1*
+ ID_OUI_FROM_DATABASE=shanghai huayuan chuangxin software CO., LTD.
 
-OUI:0060C3*
- ID_OUI_FROM_DATABASE=NETVISION CORPORATION
+OUI:B07E70*
+ ID_OUI_FROM_DATABASE=Zadara Storage Ltd.
 
-OUI:00A0A0*
- ID_OUI_FROM_DATABASE=COMPACT DATA, LTD.
+OUI:405EE1*
+ ID_OUI_FROM_DATABASE=Shenzhen H&T Intelligent Control Co.,Ltd.
 
-OUI:00A024*
- ID_OUI_FROM_DATABASE=3COM CORPORATION
+OUI:10F005*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00A08B*
- ID_OUI_FROM_DATABASE=ASTON ELECTRONIC DESIGNS LTD.
+OUI:D463FE*
+ ID_OUI_FROM_DATABASE=Arcadyan Corporation
 
-OUI:00A0AA*
- ID_OUI_FROM_DATABASE=SPACELABS MEDICAL
+OUI:9466E7*
+ ID_OUI_FROM_DATABASE=WOM Engineering
 
-OUI:00A04F*
- ID_OUI_FROM_DATABASE=AMERITEC CORP.
+OUI:F8A188*
+ ID_OUI_FROM_DATABASE=LED Roadway Lighting
 
-OUI:00A073*
- ID_OUI_FROM_DATABASE=COM21, INC.
+OUI:001174*
+ ID_OUI_FROM_DATABASE=Mojo Networks, Inc.
 
-OUI:00A084*
- ID_OUI_FROM_DATABASE=Dataplex Pty Ltd
+OUI:BC15AC*
+ ID_OUI_FROM_DATABASE=Vodafone Italia S.p.A.
 
-OUI:00A034*
- ID_OUI_FROM_DATABASE=AXEL
+OUI:140C5B*
+ ID_OUI_FROM_DATABASE=PLNetworks
 
-OUI:00C0BC*
- ID_OUI_FROM_DATABASE=TELECOM AUSTRALIA/CSSC
+OUI:D0B0CD*
+ ID_OUI_FROM_DATABASE=Moen
 
-OUI:00C0EF*
- ID_OUI_FROM_DATABASE=ABIT CORPORATION
+OUI:0071C2*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
-OUI:00C03C*
- ID_OUI_FROM_DATABASE=TOWER TECH S.R.L.
+OUI:DCFE07*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
-OUI:00C061*
- ID_OUI_FROM_DATABASE=SOLECTEK CORPORATION
+OUI:E47E66*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00C074*
- ID_OUI_FROM_DATABASE=TOYODA AUTOMATIC LOOM
+OUI:9C741A*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00C07F*
- ID_OUI_FROM_DATABASE=NUPON COMPUTING CORP.
+OUI:EC93ED*
+ ID_OUI_FROM_DATABASE=DDoS-Guard LTD
 
-OUI:00C027*
- ID_OUI_FROM_DATABASE=CIPHER SYSTEMS, INC.
+OUI:4C72B9*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
-OUI:00C025*
- ID_OUI_FROM_DATABASE=DATAPRODUCTS CORPORATION
+OUI:F462D0*
+ ID_OUI_FROM_DATABASE=Not for Radio, LLC
 
-OUI:00C022*
- ID_OUI_FROM_DATABASE=LASERMASTER TECHNOLOGIES, INC.
+OUI:94513D*
+ ID_OUI_FROM_DATABASE=iSmart Alarm, Inc.
 
-OUI:00C0E6*
- ID_OUI_FROM_DATABASE=Verilink Corporation
+OUI:C89CDC*
+ ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
-OUI:00C05C*
- ID_OUI_FROM_DATABASE=ELONEX PLC
+OUI:002511*
+ ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
-OUI:00C0C1*
- ID_OUI_FROM_DATABASE=QUAD/GRAPHICS, INC.
+OUI:000E03*
+ ID_OUI_FROM_DATABASE=Emulex Corporation
 
-OUI:00C091*
- ID_OUI_FROM_DATABASE=JABIL CIRCUIT, INC.
+OUI:001BB9*
+ ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
-OUI:00C002*
- ID_OUI_FROM_DATABASE=SERCOMM CORPORATION
+OUI:001921*
+ ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
-OUI:00C0F5*
- ID_OUI_FROM_DATABASE=METACOMP, INC.
+OUI:00142A*
+ ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
-OUI:00C042*
- ID_OUI_FROM_DATABASE=DATALUX CORP.
+OUI:0001F4*
+ ID_OUI_FROM_DATABASE=Enterasys
 
-OUI:00C089*
- ID_OUI_FROM_DATABASE=TELINDUS DISTRIBUTION
+OUI:487ADA*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:00C09D*
- ID_OUI_FROM_DATABASE=DISTRIBUTED SYSTEMS INT'L, INC
+OUI:1C7370*
+ ID_OUI_FROM_DATABASE=Neotech
 
-OUI:00C0A5*
- ID_OUI_FROM_DATABASE=DICKENS DATA SYSTEMS
+OUI:0050FC*
+ ID_OUI_FROM_DATABASE=Edimax Technology Co. Ltd.
 
-OUI:00C0E3*
- ID_OUI_FROM_DATABASE=OSITECH COMMUNICATIONS, INC.
+OUI:200A5E*
+ ID_OUI_FROM_DATABASE=Xiangshan Giant Eagle Technology Developing Co., Ltd.
 
-OUI:00C071*
- ID_OUI_FROM_DATABASE=AREANEX COMMUNICATIONS, INC.
+OUI:30E37A*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00C0AF*
- ID_OUI_FROM_DATABASE=TEKLOGIX INC.
+OUI:4CA003*
+ ID_OUI_FROM_DATABASE=T-21 Technologies LLC
 
-OUI:00209F*
- ID_OUI_FROM_DATABASE=MERCURY COMPUTER SYSTEMS, INC.
+OUI:F0EE58*
+ ID_OUI_FROM_DATABASE=PACE Telematics GmbH
 
-OUI:0020B7*
- ID_OUI_FROM_DATABASE=NAMAQUA COMPUTERWARE
+OUI:A08CFD*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:00201B*
- ID_OUI_FROM_DATABASE=NORTHERN TELECOM/NETWORK
+OUI:4000E0*
+ ID_OUI_FROM_DATABASE=Derek(Shaoguan)Limited
 
-OUI:0020C0*
- ID_OUI_FROM_DATABASE=PULSE ELECTRONICS, INC.
+OUI:001397*
+ ID_OUI_FROM_DATABASE=Oracle Corporation
 
-OUI:00208D*
- ID_OUI_FROM_DATABASE=CMD TECHNOLOGY
+OUI:00A0A4*
+ ID_OUI_FROM_DATABASE=Oracle Corporation
 
-OUI:0020DD*
- ID_OUI_FROM_DATABASE=Cybertec Pty Ltd
+OUI:A4E597*
+ ID_OUI_FROM_DATABASE=Gessler GmbH
 
-OUI:0020BD*
- ID_OUI_FROM_DATABASE=NIOBRARA R & D CORPORATION
+OUI:0024F4*
+ ID_OUI_FROM_DATABASE=Kaminario, Ltd.
 
-OUI:0020E6*
- ID_OUI_FROM_DATABASE=LIDKOPING MACHINE TOOLS AB
+OUI:001D08*
+ ID_OUI_FROM_DATABASE=Jiangsu Yinhe  Electronics Co.,Ltd.
 
-OUI:002047*
- ID_OUI_FROM_DATABASE=STEINBRECHER CORP.
+OUI:0018D7*
+ ID_OUI_FROM_DATABASE=JAVAD GNSS, Inc.
 
-OUI:0020B5*
- ID_OUI_FROM_DATABASE=YASKAWA ELECTRIC CORPORATION
+OUI:001C6C*
+ ID_OUI_FROM_DATABASE=30805
 
-OUI:002072*
- ID_OUI_FROM_DATABASE=WORKLINK INNOVATIONS
+OUI:00A0B0*
+ ID_OUI_FROM_DATABASE=I-O DATA DEVICE, INC.
 
-OUI:0020B8*
- ID_OUI_FROM_DATABASE=PRIME OPTION, INC.
+OUI:00E0CF*
+ ID_OUI_FROM_DATABASE=INTEGRATED DEVICE
 
-OUI:002092*
- ID_OUI_FROM_DATABASE=CHESS ENGINEERING B.V.
+OUI:547F54*
+ ID_OUI_FROM_DATABASE=INGENICO
 
-OUI:0020B9*
- ID_OUI_FROM_DATABASE=METRICOM, INC.
+OUI:48C049*
+ ID_OUI_FROM_DATABASE=Broad Telecom SA
 
-OUI:00206B*
- ID_OUI_FROM_DATABASE=KONICA MINOLTA HOLDINGS, INC.
+OUI:DC38E1*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:0020FC*
- ID_OUI_FROM_DATABASE=MATROX
+OUI:40A677*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:00C003*
- ID_OUI_FROM_DATABASE=GLOBALNET COMMUNICATIONS
+OUI:0C8610*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:00C0C3*
- ID_OUI_FROM_DATABASE=ACUSON COMPUTED SONOGRAPHY
+OUI:EC3EF7*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:00C04D*
- ID_OUI_FROM_DATABASE=MITEC, INC.
+OUI:0014F6*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:00C055*
- ID_OUI_FROM_DATABASE=MODULAR COMPUTING TECHNOLOGIES
+OUI:00121E*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:00C067*
- ID_OUI_FROM_DATABASE=UNITED BARCODE INDUSTRIES
+OUI:0010DB*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:00C0B4*
- ID_OUI_FROM_DATABASE=MYSON TECHNOLOGY, INC.
+OUI:307C5E*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:00C080*
- ID_OUI_FROM_DATABASE=NETSTAR, INC.
+OUI:841888*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:00C015*
- ID_OUI_FROM_DATABASE=NEW MEDIA CORPORATION
+OUI:40B4F0*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:0070B3*
- ID_OUI_FROM_DATABASE=DATA RECALL LTD.
+OUI:002688*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:00E6D3*
- ID_OUI_FROM_DATABASE=NIXDORF COMPUTER CORP.
+OUI:0017CB*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:00C083*
- ID_OUI_FROM_DATABASE=TRACE MOUNTAIN PRODUCTS, INC.
+OUI:E0A3AC*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00C005*
- ID_OUI_FROM_DATABASE=LIVINGSTON ENTERPRISES, INC.
+OUI:E00EDA*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00C064*
- ID_OUI_FROM_DATABASE=GENERAL DATACOMM IND. INC.
+OUI:6C2483*
+ ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
 
-OUI:00C0C8*
- ID_OUI_FROM_DATABASE=MICRO BYTE PTY. LTD.
+OUI:848319*
+ ID_OUI_FROM_DATABASE=Hangzhou Zero Zero Technology Co., Ltd.
 
-OUI:00C090*
- ID_OUI_FROM_DATABASE=PRAIM S.R.L.
+OUI:001F20*
+ ID_OUI_FROM_DATABASE=Logitech Europe SA
 
-OUI:00C011*
- ID_OUI_FROM_DATABASE=INTERACTIVE COMPUTING DEVICES
+OUI:882012*
+ ID_OUI_FROM_DATABASE=LMI Technologies
 
-OUI:00C0FD*
- ID_OUI_FROM_DATABASE=PROSUM
+OUI:002382*
+ ID_OUI_FROM_DATABASE=Lih Rong electronic Enterprise Co., Ltd.
 
-OUI:00C041*
- ID_OUI_FROM_DATABASE=DIGITAL TRANSMISSION SYSTEMS
+OUI:88795B*
+ ID_OUI_FROM_DATABASE=Konka Group Co., Ltd.
 
-OUI:00C00F*
- ID_OUI_FROM_DATABASE=QUANTUM SOFTWARE SYSTEMS LTD.
+OUI:001A34*
+ ID_OUI_FROM_DATABASE=Konka Group Co., Ltd.
 
-OUI:00C076*
- ID_OUI_FROM_DATABASE=I-DATA INTERNATIONAL A-S
+OUI:20A90E*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:00C0C6*
- ID_OUI_FROM_DATABASE=PERSONAL MEDIA CORP.
+OUI:8C99E6*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:00C03B*
- ID_OUI_FROM_DATABASE=MULTIACCESS COMPUTING CORP.
+OUI:745C9F*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:0020F4*
- ID_OUI_FROM_DATABASE=SPECTRIX CORPORATION
+OUI:0CBD51*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:00204E*
- ID_OUI_FROM_DATABASE=NETWORK SECURITY SYSTEMS, INC.
+OUI:E42D02*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:002027*
- ID_OUI_FROM_DATABASE=MING FORTUNE INDUSTRY CO., LTD
+OUI:3CE5A6*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:0020ED*
- ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO., LTD.
+OUI:3C8C40*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:00200E*
- ID_OUI_FROM_DATABASE=SATELLITE TECHNOLOGY MGMT, INC
+OUI:B04519*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:002096*
- ID_OUI_FROM_DATABASE=Invensys
+OUI:A81559*
+ ID_OUI_FROM_DATABASE=Breathometer, Inc.
 
-OUI:0020BB*
- ID_OUI_FROM_DATABASE=ZAX CORPORATION
+OUI:ECADB8*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00204D*
- ID_OUI_FROM_DATABASE=INOVIS GMBH
+OUI:9801A7*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:002089*
- ID_OUI_FROM_DATABASE=T3PLUS NETWORKING, INC.
+OUI:2CF0A2*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00205F*
- ID_OUI_FROM_DATABASE=GAMMADATA COMPUTER GMBH
+OUI:C09727*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:002035*
- ID_OUI_FROM_DATABASE=IBM Corp
+OUI:2C5A8D*
+ ID_OUI_FROM_DATABASE=SYSTRONIK Elektronik u. Systemtechnik GmbH
 
-OUI:0020E2*
- ID_OUI_FROM_DATABASE=INFORMATION RESOURCE ENGINEERING
+OUI:8C897A*
+ ID_OUI_FROM_DATABASE=AUGTEK
 
-OUI:002058*
- ID_OUI_FROM_DATABASE=ALLIED SIGNAL INC.
+OUI:54EDA3*
+ ID_OUI_FROM_DATABASE=Navdy, Inc.
 
-OUI:002081*
- ID_OUI_FROM_DATABASE=TITAN ELECTRONICS
+OUI:046565*
+ ID_OUI_FROM_DATABASE=Testop
 
-OUI:00201D*
- ID_OUI_FROM_DATABASE=KATANA PRODUCTS
+OUI:042758*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0020CF*
- ID_OUI_FROM_DATABASE=TEST & MEASUREMENT SYSTEMS INC
+OUI:3C92DC*
+ ID_OUI_FROM_DATABASE=Octopod Technology Co. Ltd.
 
-OUI:002043*
- ID_OUI_FROM_DATABASE=NEURON COMPANY LIMITED
+OUI:6038E0*
+ ID_OUI_FROM_DATABASE=Belkin International Inc.
 
-OUI:002018*
- ID_OUI_FROM_DATABASE=CIS TECHNOLOGY INC.
+OUI:F0FDA0*
+ ID_OUI_FROM_DATABASE=Acurix Networks Pty Ltd
 
-OUI:002031*
- ID_OUI_FROM_DATABASE=Tattile SRL
+OUI:3876D1*
+ ID_OUI_FROM_DATABASE=Euronda SpA
 
-OUI:0020DE*
- ID_OUI_FROM_DATABASE=JAPAN DIGITAL LABORAT'Y CO.LTD
+OUI:C48F07*
+ ID_OUI_FROM_DATABASE=Shenzhen Yihao Hulian Science and Technology Co., Ltd.
 
-OUI:0020F7*
- ID_OUI_FROM_DATABASE=CYBERDATA CORPORATION
+OUI:009E1E*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0020EE*
- ID_OUI_FROM_DATABASE=GTECH CORPORATION
+OUI:002550*
+ ID_OUI_FROM_DATABASE=Riverbed Technology, Inc.
 
-OUI:00208C*
- ID_OUI_FROM_DATABASE=GALAXY NETWORKS, INC.
+OUI:D85B2A*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:002063*
- ID_OUI_FROM_DATABASE=WIPRO INFOTECH LTD.
+OUI:ACC33A*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0020DC*
- ID_OUI_FROM_DATABASE=DENSITRON TAIWAN LTD.
+OUI:F45B73*
+ ID_OUI_FROM_DATABASE=Wanjiaan Interconnected Technology Co., Ltd
 
-OUI:002078*
- ID_OUI_FROM_DATABASE=RUNTOP, INC.
+OUI:0021E2*
+ ID_OUI_FROM_DATABASE=visago Systems & Controls GmbH & Co. KG
 
-OUI:002042*
- ID_OUI_FROM_DATABASE=DATAMETRICS CORP.
+OUI:28F10E*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:0020F8*
- ID_OUI_FROM_DATABASE=CARRERA COMPUTERS, INC.
+OUI:C4A366*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:00200C*
- ID_OUI_FROM_DATABASE=ADASTRA SYSTEMS CORP.
+OUI:0014B4*
+ ID_OUI_FROM_DATABASE=General Dynamics United Kingdom Ltd
 
-OUI:0020C4*
- ID_OUI_FROM_DATABASE=INET,INC.
+OUI:A0B437*
+ ID_OUI_FROM_DATABASE=GD Mission Systems
 
-OUI:00C099*
- ID_OUI_FROM_DATABASE=YOSHIKI INDUSTRIAL CO.,LTD.
+OUI:5052D2*
+ ID_OUI_FROM_DATABASE=Hangzhou Telin Technologies Co., Limited
 
-OUI:00C0FC*
- ID_OUI_FROM_DATABASE=ELASTIC REALITY, INC.
+OUI:1CD6BD*
+ ID_OUI_FROM_DATABASE=LEEDARSON LIGHTING CO., LTD.
 
-OUI:00C0D0*
- ID_OUI_FROM_DATABASE=RATOC SYSTEM INC.
+OUI:9CDD1F*
+ ID_OUI_FROM_DATABASE=Intelligent Steward Co.,Ltd
 
-OUI:00C07A*
- ID_OUI_FROM_DATABASE=PRIVA B.V.
+OUI:00EBD5*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000701*
- ID_OUI_FROM_DATABASE=RACAL-DATACOM
+OUI:1C7B23*
+ ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
 
-OUI:00C09C*
- ID_OUI_FROM_DATABASE=HIOKI E.E. CORPORATION
+OUI:1C740D*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:00C004*
- ID_OUI_FROM_DATABASE=JAPAN BUSINESS COMPUTER CO.LTD
+OUI:001349*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:00C062*
- ID_OUI_FROM_DATABASE=IMPULSE TECHNOLOGY
+OUI:404A03*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:000267*
- ID_OUI_FROM_DATABASE=NODE RUNNER, INC.
+OUI:CC5D4E*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:002064*
- ID_OUI_FROM_DATABASE=PROTEC MICROSYSTEMS, INC.
+OUI:A0E4CB*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:002032*
- ID_OUI_FROM_DATABASE=ALCATEL TAISEL
+OUI:90CF7D*
+ ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
 
-OUI:00207F*
- ID_OUI_FROM_DATABASE=KYOEI SANGYO CO., LTD.
+OUI:F8F082*
+ ID_OUI_FROM_DATABASE=NAG LLC
 
-OUI:002077*
- ID_OUI_FROM_DATABASE=KARDIOS SYSTEMS CORP.
+OUI:40F413*
+ ID_OUI_FROM_DATABASE=Rubezh
 
-OUI:002068*
- ID_OUI_FROM_DATABASE=ISDYNE
+OUI:2C094D*
+ ID_OUI_FROM_DATABASE=Raptor Engineering, LLC
 
-OUI:00202A*
- ID_OUI_FROM_DATABASE=N.V. DZINE
+OUI:88797E*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:008006*
- ID_OUI_FROM_DATABASE=COMPUADD CORPORATION
+OUI:40C729*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:0080EF*
- ID_OUI_FROM_DATABASE=RATIONAL
+OUI:AC040B*
+ ID_OUI_FROM_DATABASE=Peloton Interactive, Inc
 
-OUI:0080C4*
- ID_OUI_FROM_DATABASE=DOCUMENT TECHNOLOGIES, INC.
+OUI:006074*
+ ID_OUI_FROM_DATABASE=QSC LLC
 
-OUI:008095*
- ID_OUI_FROM_DATABASE=BASIC MERTON HANDELSGES.M.B.H.
+OUI:34ED0B*
+ ID_OUI_FROM_DATABASE=Shanghai XZ-COM.CO.,Ltd.
 
-OUI:008053*
- ID_OUI_FROM_DATABASE=INTELLICOM, INC.
+OUI:0010C1*
+ ID_OUI_FROM_DATABASE=OI ELECTRIC CO.,LTD
 
-OUI:008026*
- ID_OUI_FROM_DATABASE=NETWORK PRODUCTS CORPORATION
+OUI:4432C8*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:0080FE*
- ID_OUI_FROM_DATABASE=AZURE TECHNOLOGIES, INC.
+OUI:E0885D*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:008028*
- ID_OUI_FROM_DATABASE=TRADPOST (HK) LTD
+OUI:802994*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:0080B6*
- ID_OUI_FROM_DATABASE=THEMIS COMPUTER
+OUI:206A8A*
+ ID_OUI_FROM_DATABASE=Wistron Infocomm (Zhongshan) Corporation
 
-OUI:0080C0*
- ID_OUI_FROM_DATABASE=PENRIL DATACOMM
+OUI:F0DEF1*
+ ID_OUI_FROM_DATABASE=Wistron Infocomm (Zhongshan) Corporation
 
-OUI:0080F5*
- ID_OUI_FROM_DATABASE=Quantel Ltd
+OUI:F80F41*
+ ID_OUI_FROM_DATABASE=Wistron Infocomm (Zhongshan) Corporation
 
-OUI:00401D*
- ID_OUI_FROM_DATABASE=INVISIBLE SOFTWARE, INC.
+OUI:94DF4E*
+ ID_OUI_FROM_DATABASE=Wistron InfoComm(Kunshan)Co.,Ltd.
 
-OUI:0040BD*
- ID_OUI_FROM_DATABASE=STARLIGHT NETWORKS, INC.
+OUI:48A9D2*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
-OUI:00406D*
- ID_OUI_FROM_DATABASE=LANCO, INC.
+OUI:683E34*
+ ID_OUI_FROM_DATABASE=MEIZU Technology Co., Ltd.
 
-OUI:00404D*
- ID_OUI_FROM_DATABASE=TELECOMMUNICATIONS TECHNIQUES
+OUI:001EC0*
+ ID_OUI_FROM_DATABASE=Microchip Technology Inc.
 
-OUI:0040A5*
- ID_OUI_FROM_DATABASE=CLINICOMP INTL.
+OUI:3C0771*
+ ID_OUI_FROM_DATABASE=Sony Corporation
 
-OUI:004059*
- ID_OUI_FROM_DATABASE=YOSHIDA KOGYO K. K.
+OUI:D8D43C*
+ ID_OUI_FROM_DATABASE=Sony Corporation
 
-OUI:004021*
- ID_OUI_FROM_DATABASE=RASTER GRAPHICS
+OUI:00A012*
+ ID_OUI_FROM_DATABASE=Telco Systems, Inc.
 
-OUI:004081*
- ID_OUI_FROM_DATABASE=MANNESMANN SCANGRAPHIC GMBH
+OUI:94611E*
+ ID_OUI_FROM_DATABASE=Wata Electronics Co.,Ltd.
 
-OUI:00806C*
- ID_OUI_FROM_DATABASE=CEGELEC PROJECTS LTD
+OUI:0025D4*
+ ID_OUI_FROM_DATABASE=General Dynamics Mission Systems
 
-OUI:00404A*
- ID_OUI_FROM_DATABASE=WEST AUSTRALIAN DEPARTMENT
+OUI:5CA86A*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00400A*
- ID_OUI_FROM_DATABASE=PIVOTAL TECHNOLOGIES, INC.
+OUI:C8778B*
+ ID_OUI_FROM_DATABASE=Themis Computer
 
-OUI:004032*
- ID_OUI_FROM_DATABASE=DIGITAL COMMUNICATIONS
+OUI:000A68*
+ ID_OUI_FROM_DATABASE=Solarflare Communications Inc
 
-OUI:004042*
- ID_OUI_FROM_DATABASE=N.A.T. GMBH
+OUI:0CD502*
+ ID_OUI_FROM_DATABASE=Westell Technologies Inc.
 
-OUI:0040C2*
- ID_OUI_FROM_DATABASE=APPLIED COMPUTING DEVICES
+OUI:001636*
+ ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
 
-OUI:00403C*
- ID_OUI_FROM_DATABASE=FORKS, INC.
+OUI:00C09F*
+ ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
 
-OUI:0040C4*
- ID_OUI_FROM_DATABASE=KINKEI SYSTEM CORPORATION
+OUI:54AB3A*
+ ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
 
-OUI:0040D1*
- ID_OUI_FROM_DATABASE=FUKUDA DENSHI CO., LTD.
+OUI:089E01*
+ ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
 
-OUI:004024*
- ID_OUI_FROM_DATABASE=COMPAC INC.
+OUI:00199D*
+ ID_OUI_FROM_DATABASE=Vizio, Inc
 
-OUI:0040B6*
- ID_OUI_FROM_DATABASE=COMPUTERM  CORPORATION
+OUI:6C0B84*
+ ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
 
-OUI:00403F*
- ID_OUI_FROM_DATABASE=SSANGYONG COMPUTER SYSTEMS
+OUI:E4509A*
+ ID_OUI_FROM_DATABASE=HW Communications Ltd
 
-OUI:004003*
- ID_OUI_FROM_DATABASE=Emerson Process Management Power & Water Solutions, Inc.
+OUI:702900*
+ ID_OUI_FROM_DATABASE=Shenzhen ChipTrip Technology Co,Ltd
 
-OUI:004090*
- ID_OUI_FROM_DATABASE=ANSEL COMMUNICATIONS
+OUI:204C03*
+ ID_OUI_FROM_DATABASE=Aruba Networks
 
-OUI:00409A*
- ID_OUI_FROM_DATABASE=NETWORK EXPRESS, INC.
+OUI:90F052*
+ ID_OUI_FROM_DATABASE=MEIZU Technology Co., Ltd.
 
-OUI:0040DE*
- ID_OUI_FROM_DATABASE=Elsag Datamat spa
+OUI:000E1E*
+ ID_OUI_FROM_DATABASE=QLogic Corporation
 
-OUI:004063*
- ID_OUI_FROM_DATABASE=VIA TECHNOLOGIES, INC.
+OUI:D8EB97*
+ ID_OUI_FROM_DATABASE=TRENDnet, Inc.
 
-OUI:00406C*
- ID_OUI_FROM_DATABASE=COPERNIQUE
+OUI:146102*
+ ID_OUI_FROM_DATABASE=Alpine Electronics, Inc.
 
-OUI:0040DF*
- ID_OUI_FROM_DATABASE=DIGALOG SYSTEMS, INC.
+OUI:9003B7*
+ ID_OUI_FROM_DATABASE=PARROT SA
 
-OUI:004015*
- ID_OUI_FROM_DATABASE=ASCOM INFRASYS AG
+OUI:0CFE45*
+ ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
 
-OUI:008056*
- ID_OUI_FROM_DATABASE=SPHINX Electronics GmbH & Co KG
+OUI:F8D0AC*
+ ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
 
-OUI:008060*
- ID_OUI_FROM_DATABASE=NETWORK INTERFACE CORPORATION
+OUI:00D9D1*
+ ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
 
-OUI:00805E*
- ID_OUI_FROM_DATABASE=LSI LOGIC CORPORATION
+OUI:00041F*
+ ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
 
-OUI:008093*
- ID_OUI_FROM_DATABASE=XYRON CORPORATION
+OUI:001D0D*
+ ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
 
-OUI:00C05D*
- ID_OUI_FROM_DATABASE=L&N TECHNOLOGIES
+OUI:7CC709*
+ ID_OUI_FROM_DATABASE=SHENZHEN RF-LINK TECHNOLOGY CO.,LTD.
 
-OUI:00C0E4*
- ID_OUI_FROM_DATABASE=SIEMENS BUILDING
+OUI:D455BE*
+ ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
 
-OUI:00C01B*
- ID_OUI_FROM_DATABASE=SOCKET COMMUNICATIONS, INC.
+OUI:8CA6DF*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:00C06E*
- ID_OUI_FROM_DATABASE=HAFT TECHNOLOGY, INC.
+OUI:00E091*
+ ID_OUI_FROM_DATABASE=LG Electronics
 
-OUI:00406F*
- ID_OUI_FROM_DATABASE=SYNC RESEARCH INC.
+OUI:6CD032*
+ ID_OUI_FROM_DATABASE=LG Electronics
 
-OUI:00401F*
- ID_OUI_FROM_DATABASE=COLORGRAPH LTD
+OUI:C041F6*
+ ID_OUI_FROM_DATABASE=LG ELECTRONICS INC
 
-OUI:0040CF*
- ID_OUI_FROM_DATABASE=STRAWBERRY TREE, INC.
+OUI:404AD4*
+ ID_OUI_FROM_DATABASE=Widex A/S
 
-OUI:0040F7*
- ID_OUI_FROM_DATABASE=Polaroid Corporation
+OUI:0021FB*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:004037*
- ID_OUI_FROM_DATABASE=SEA-ILAN, INC.
+OUI:8C3AE3*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:0040CC*
- ID_OUI_FROM_DATABASE=SILCOM MANUF'G TECHNOLOGY INC.
+OUI:30766F*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:004052*
- ID_OUI_FROM_DATABASE=STAR TECHNOLOGIES, INC.
+OUI:F80CF3*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:00407A*
- ID_OUI_FROM_DATABASE=SOCIETE D'EXPLOITATION DU CNIT
+OUI:0022CF*
+ ID_OUI_FROM_DATABASE=PLANEX COMMUNICATIONS INC.
 
-OUI:004089*
- ID_OUI_FROM_DATABASE=MEIDENSHA CORPORATION
+OUI:A84E3F*
+ ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
 
-OUI:00405A*
- ID_OUI_FROM_DATABASE=GOLDSTAR INFORMATION & COMM.
+OUI:00A742*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00404C*
- ID_OUI_FROM_DATABASE=HYPERTEC PTY LTD.
+OUI:001478*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:00C0EE*
- ID_OUI_FROM_DATABASE=KYOCERA CORPORATION
+OUI:00167A*
+ ID_OUI_FROM_DATABASE=Skyworth Overseas Development Ltd.
 
-OUI:00C0CB*
- ID_OUI_FROM_DATABASE=CONTROL TECHNOLOGY CORPORATION
+OUI:28BE03*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:00C09A*
- ID_OUI_FROM_DATABASE=PHOTONICS CORPORATION
+OUI:F4C613*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
 
-OUI:00C01A*
- ID_OUI_FROM_DATABASE=COROMETRICS MEDICAL SYSTEMS
+OUI:D826B9*
+ ID_OUI_FROM_DATABASE=Guangdong Coagent Electronics S&amp;T Co.,Ltd.
 
-OUI:00404B*
- ID_OUI_FROM_DATABASE=MAPLE COMPUTER SYSTEMS
+OUI:FCB0C4*
+ ID_OUI_FROM_DATABASE=Shanghai DareGlobal Technologies Co.,Ltd
 
-OUI:004055*
- ID_OUI_FROM_DATABASE=METRONIX GMBH
+OUI:24AF4A*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent IPD
 
-OUI:004045*
- ID_OUI_FROM_DATABASE=TWINHEAD CORPORATION
+OUI:001AF0*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent IPD
 
-OUI:00409D*
- ID_OUI_FROM_DATABASE=DIGIBOARD, INC.
+OUI:AC9CE4*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
 
-OUI:00401A*
- ID_OUI_FROM_DATABASE=FUJI ELECTRIC CO., LTD.
+OUI:D84710*
+ ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
 
-OUI:0040B9*
- ID_OUI_FROM_DATABASE=MACQ ELECTRONIQUE SA
+OUI:000E40*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:0040C7*
- ID_OUI_FROM_DATABASE=RUBY TECH CORPORATION
+OUI:001158*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:004004*
- ID_OUI_FROM_DATABASE=ICM CO. LTD.
+OUI:0011F9*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:004070*
- ID_OUI_FROM_DATABASE=INTERWARE CO., LTD.
+OUI:000F6A*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:008057*
- ID_OUI_FROM_DATABASE=ADSOFT, LTD.
+OUI:001283*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:00807A*
- ID_OUI_FROM_DATABASE=AITECH SYSTEMS LTD.
+OUI:000438*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:0080AA*
- ID_OUI_FROM_DATABASE=MAXPEED
+OUI:002347*
+ ID_OUI_FROM_DATABASE=ProCurve Networking by HP
 
-OUI:00C0E7*
- ID_OUI_FROM_DATABASE=FIBERDATA AB
+OUI:002561*
+ ID_OUI_FROM_DATABASE=ProCurve Networking by HP
 
-OUI:00800A*
- ID_OUI_FROM_DATABASE=JAPAN COMPUTER CORP.
+OUI:008058*
+ ID_OUI_FROM_DATABASE=PRINTER SYSTEMS CORP.
 
-OUI:00806E*
- ID_OUI_FROM_DATABASE=NIPPON STEEL CORPORATION
+OUI:00140D*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:008010*
- ID_OUI_FROM_DATABASE=COMMODORE INTERNATIONAL
+OUI:001765*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:0080DA*
- ID_OUI_FROM_DATABASE=Bruel & Kjaer Sound & Vibration Measurement A/S
+OUI:0018B0*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:0080BC*
- ID_OUI_FROM_DATABASE=HITACHI ENGINEERING CO., LTD
+OUI:001B25*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:008000*
- ID_OUI_FROM_DATABASE=MULTITECH SYSTEMS, INC.
+OUI:001DAF*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:0080A1*
- ID_OUI_FROM_DATABASE=MICROTEST, INC.
+OUI:00166D*
+ ID_OUI_FROM_DATABASE=Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd
 
-OUI:0080D0*
- ID_OUI_FROM_DATABASE=COMPUTER PERIPHERALS, INC.
+OUI:0016F2*
+ ID_OUI_FROM_DATABASE=Dmobile System Co., Ltd.
 
-OUI:00807D*
- ID_OUI_FROM_DATABASE=EQUINOX SYSTEMS INC.
+OUI:000138*
+ ID_OUI_FROM_DATABASE=XAVi Technologies Corp.
 
-OUI:008063*
- ID_OUI_FROM_DATABASE=Hirschmann Automation and Control GmbH
+OUI:3C9157*
+ ID_OUI_FROM_DATABASE=Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd
 
-OUI:00608C*
- ID_OUI_FROM_DATABASE=3COM CORPORATION
+OUI:0000D8*
+ ID_OUI_FROM_DATABASE=Novell, Inc.
 
-OUI:00804E*
- ID_OUI_FROM_DATABASE=APEX COMPUTER COMPANY
+OUI:001087*
+ ID_OUI_FROM_DATABASE=XSTREAMIS PLC
 
-OUI:00800E*
- ID_OUI_FROM_DATABASE=ATLANTIX CORPORATION
+OUI:7C0623*
+ ID_OUI_FROM_DATABASE=Ultra Electronics Sonar System Division
 
-OUI:00806F*
- ID_OUI_FROM_DATABASE=ONELAN LTD.
+OUI:002555*
+ ID_OUI_FROM_DATABASE=Visonic Technologies 1993 Ltd.
 
-OUI:008098*
- ID_OUI_FROM_DATABASE=TDK CORPORATION
+OUI:48FD8E*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00809C*
- ID_OUI_FROM_DATABASE=LUXCOM, INC.
+OUI:244427*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:008065*
- ID_OUI_FROM_DATABASE=CYBERGRAPHIC SYSTEMS PTY LTD.
+OUI:B4A984*
+ ID_OUI_FROM_DATABASE=Symantec Corporation
 
-OUI:008016*
- ID_OUI_FROM_DATABASE=WANDEL AND GOLTERMANN
+OUI:34074F*
+ ID_OUI_FROM_DATABASE=AccelStor, Inc.
 
-OUI:0080E6*
- ID_OUI_FROM_DATABASE=PEER NETWORKS, INC.
+OUI:248A07*
+ ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
 
-OUI:0080A2*
- ID_OUI_FROM_DATABASE=CREATIVE ELECTRONIC SYSTEMS
+OUI:00258B*
+ ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
 
-OUI:0080E0*
- ID_OUI_FROM_DATABASE=XTP SYSTEMS, INC.
+OUI:3C2DB7*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:008050*
- ID_OUI_FROM_DATABASE=ZIATECH CORPORATION
+OUI:0023D4*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0000E0*
- ID_OUI_FROM_DATABASE=QUADRAM CORP.
+OUI:001831*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:000057*
- ID_OUI_FROM_DATABASE=SCITEX CORPORATION LTD.
+OUI:D08CB5*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0000D6*
- ID_OUI_FROM_DATABASE=PUNCH LINE HOLDING
+OUI:B4EED4*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0000C8*
- ID_OUI_FROM_DATABASE=ALTOS COMPUTER SYSTEMS
+OUI:CC8CE3*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:000098*
- ID_OUI_FROM_DATABASE=CROSSCOMM CORPORATION
+OUI:102EAF*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00007D*
- ID_OUI_FROM_DATABASE=Oracle Corporation
+OUI:647BD4*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0000A2*
- ID_OUI_FROM_DATABASE=Bay Networks
+OUI:0017E8*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:000038*
- ID_OUI_FROM_DATABASE=CSS LABS
+OUI:0017E6*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:000061*
- ID_OUI_FROM_DATABASE=GATEWAY COMMUNICATIONS
+OUI:B0B448*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:000043*
- ID_OUI_FROM_DATABASE=MICRO TECHNOLOGY
+OUI:505663*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0000E7*
- ID_OUI_FROM_DATABASE=Star Gate Technologies
+OUI:3C7DB1*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0000F3*
- ID_OUI_FROM_DATABASE=GANDALF DATA LIMITED
+OUI:40984E*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:000064*
- ID_OUI_FROM_DATABASE=Yokogawa Electric Corporation
+OUI:0012D1*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00002C*
- ID_OUI_FROM_DATABASE=AUTOTOTE LIMITED
+OUI:88C255*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00002A*
- ID_OUI_FROM_DATABASE=TRW - SEDD/INP
+OUI:E0C79D*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0000F1*
- ID_OUI_FROM_DATABASE=MAGNA COMPUTER CORPORATION
+OUI:9059AF*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:000083*
- ID_OUI_FROM_DATABASE=TADPOLE TECHNOLOGY PLC
+OUI:B4994C*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:000020*
- ID_OUI_FROM_DATABASE=DATAINDUSTRIER DIAB AB
+OUI:70FF76*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00007A*
- ID_OUI_FROM_DATABASE=DANA COMPUTER INC.
+OUI:507224*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00007C*
- ID_OUI_FROM_DATABASE=AMPERE INCORPORATED
+OUI:506583*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00008A*
- ID_OUI_FROM_DATABASE=DATAHOUSE INFORMATION SYSTEMS
+OUI:BC282C*
+ ID_OUI_FROM_DATABASE=e-Smart Systems Pvt. Ltd
 
-OUI:000068*
- ID_OUI_FROM_DATABASE=ROSEMOUNT CONTROLS
+OUI:546C0E*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0000A8*
- ID_OUI_FROM_DATABASE=STRATUS COMPUTER INC.
+OUI:F85C4D*
+ ID_OUI_FROM_DATABASE=NOKIA
 
-OUI:0000DF*
- ID_OUI_FROM_DATABASE=BELL & HOWELL PUB SYS DIV
+OUI:D013FD*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:000062*
- ID_OUI_FROM_DATABASE=BULL HN INFORMATION SYSTEMS
+OUI:D8E72B*
+ ID_OUI_FROM_DATABASE=NetScout Systems, Inc.
 
-OUI:0000AD*
- ID_OUI_FROM_DATABASE=BRUKER INSTRUMENTS INC.
+OUI:04FEA1*
+ ID_OUI_FROM_DATABASE=Fihonest communication co.,Ltd
 
-OUI:0000D0*
- ID_OUI_FROM_DATABASE=DEVELCON ELECTRONICS LTD.
+OUI:2CAC44*
+ ID_OUI_FROM_DATABASE=CONEXTOP
 
-OUI:000093*
- ID_OUI_FROM_DATABASE=PROTEON INC.
+OUI:A8BD27*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:008008*
- ID_OUI_FROM_DATABASE=DYNATECH COMPUTER SYSTEMS
+OUI:981E0F*
+ ID_OUI_FROM_DATABASE=Jeelan (Shanghai Jeelan Technology Information Inc
 
-OUI:0080FF*
- ID_OUI_FROM_DATABASE=SOC. DE TELEINFORMATIQUE RTC
+OUI:548CA0*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:000070*
- ID_OUI_FROM_DATABASE=HCL LIMITED
+OUI:001CA8*
+ ID_OUI_FROM_DATABASE=AirTies Wireless Networks
 
-OUI:00008E*
- ID_OUI_FROM_DATABASE=SOLBOURNE COMPUTER, INC.
+OUI:0017D5*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0000DC*
- ID_OUI_FROM_DATABASE=HAYES MICROCOMPUTER PRODUCTS
+OUI:001247*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:000024*
- ID_OUI_FROM_DATABASE=CONNECT AS
+OUI:E4121D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:000048*
- ID_OUI_FROM_DATABASE=SEIKO EPSON CORPORATION
+OUI:684898*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:008030*
- ID_OUI_FROM_DATABASE=NEXUS ELECTRONICS
+OUI:F409D8*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:008022*
- ID_OUI_FROM_DATABASE=SCAN-OPTICS
+OUI:B479A7*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:000041*
- ID_OUI_FROM_DATABASE=ICE CORPORATION
+OUI:002339*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00001E*
- ID_OUI_FROM_DATABASE=TELSIST INDUSTRIA ELECTRONICA
+OUI:D487D8*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00807B*
- ID_OUI_FROM_DATABASE=ARTEL COMMUNICATIONS CORP.
+OUI:184617*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00802E*
- ID_OUI_FROM_DATABASE=CASTLE ROCK COMPUTING
+OUI:5001BB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0080F9*
- ID_OUI_FROM_DATABASE=HEURIKON CORPORATION
+OUI:380A94*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:008005*
- ID_OUI_FROM_DATABASE=CACTUS COMPUTER INC.
+OUI:D857EF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00801D*
- ID_OUI_FROM_DATABASE=INTEGRATED INFERENCE MACHINES
+OUI:1C66AA*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:008015*
- ID_OUI_FROM_DATABASE=SEIKO SYSTEMS, INC.
+OUI:58C38B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:008034*
- ID_OUI_FROM_DATABASE=SMT GOUPIL
+OUI:001EE2*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0080C9*
- ID_OUI_FROM_DATABASE=ALBERTA MICROELECTRONIC CENTRE
+OUI:001C43*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00800B*
- ID_OUI_FROM_DATABASE=CSK CORPORATION
+OUI:001D25*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:000016*
- ID_OUI_FROM_DATABASE=DU PONT PIXEL SYSTEMS     .
+OUI:3C5A37*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00005C*
- ID_OUI_FROM_DATABASE=TELEMATICS INTERNATIONAL INC.
+OUI:549B12*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0000AC*
- ID_OUI_FROM_DATABASE=CONWARE COMPUTER CONSULTING
+OUI:3C8BFE*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0000F2*
- ID_OUI_FROM_DATABASE=SPIDER COMMUNICATIONS
+OUI:00265D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:000030*
- ID_OUI_FROM_DATABASE=VG LABORATORY SYSTEMS LTD
+OUI:D4E8B2*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:000035*
- ID_OUI_FROM_DATABASE=SPECTRAGRAPHICS CORPORATION
+OUI:0808C2*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:020701*
- ID_OUI_FROM_DATABASE=RACAL-DATACOM
+OUI:B0C4E7*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:080011*
- ID_OUI_FROM_DATABASE=TEKTRONIX INC.
+OUI:D890E8*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:080040*
- ID_OUI_FROM_DATABASE=FERRANTI COMPUTER SYS. LIMITED
+OUI:34AA8B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:08003B*
- ID_OUI_FROM_DATABASE=TORUS SYSTEMS LIMITED
+OUI:24C696*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:08003D*
- ID_OUI_FROM_DATABASE=CADNETIX CORPORATIONS
+OUI:181EB0*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:080039*
- ID_OUI_FROM_DATABASE=SPIDER SYSTEMS LIMITED
+OUI:20D390*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:080030*
- ID_OUI_FROM_DATABASE=NETWORK RESEARCH CORPORATION
+OUI:343111*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:080027*
- ID_OUI_FROM_DATABASE=Cadmus Computer Systems
+OUI:34BE00*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00009B*
- ID_OUI_FROM_DATABASE=INFORMATION INTERNATIONAL, INC
+OUI:78521A*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00DD0F*
- ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
+OUI:18D276*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:000001*
- ID_OUI_FROM_DATABASE=XEROX CORPORATION
+OUI:7825AD*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:080021*
- ID_OUI_FROM_DATABASE=3M COMPANY
+OUI:F4D9FB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:AA0004*
- ID_OUI_FROM_DATABASE=DIGITAL EQUIPMENT CORPORATION
+OUI:0017C9*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:08000C*
- ID_OUI_FROM_DATABASE=MIKLYN DEVELOPMENT CO.
+OUI:00166B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00DD08*
- ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
+OUI:00166C*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0000A0*
- ID_OUI_FROM_DATABASE=SANYO Electric Co., Ltd.
+OUI:E47CF9*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:08007F*
- ID_OUI_FROM_DATABASE=CARNEGIE-MELLON UNIVERSITY
+OUI:90187C*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
-OUI:080082*
- ID_OUI_FROM_DATABASE=VERITAS SOFTWARE
+OUI:FC1F19*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
-OUI:08007B*
- ID_OUI_FROM_DATABASE=SANYO ELECTRIC CO. LTD.
+OUI:50CCF8*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
-OUI:00DD0C*
- ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
+OUI:980C82*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
-OUI:000005*
- ID_OUI_FROM_DATABASE=XEROX CORPORATION
+OUI:002119*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
-OUI:0000AA*
- ID_OUI_FROM_DATABASE=XEROX CORPORATION
+OUI:002454*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00406B*
- ID_OUI_FROM_DATABASE=SYSGEN
+OUI:20D5BF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:AA0001*
- ID_OUI_FROM_DATABASE=DIGITAL EQUIPMENT CORPORATION
+OUI:30CDA7*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:080001*
- ID_OUI_FROM_DATABASE=COMPUTERVISION CORPORATION
+OUI:5C0A5B*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
-OUI:000053*
- ID_OUI_FROM_DATABASE=COMPUCORP
+OUI:543530*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:08004B*
- ID_OUI_FROM_DATABASE=Planning Research Corp.
+OUI:300ED5*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:080003*
- ID_OUI_FROM_DATABASE=ADVANCED COMPUTER COMM.
+OUI:D02788*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:080074*
- ID_OUI_FROM_DATABASE=CASIO COMPUTER CO. LTD.
+OUI:0014A4*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:08005E*
- ID_OUI_FROM_DATABASE=COUNTERPOINT COMPUTER INC.
+OUI:0016CE*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:08005A*
- ID_OUI_FROM_DATABASE=IBM Corp
+OUI:001DD9*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:080056*
- ID_OUI_FROM_DATABASE=STANFORD LINEAR ACCEL. CENTER
+OUI:001FE2*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:080053*
- ID_OUI_FROM_DATABASE=MIDDLE EAST TECH. UNIVERSITY
+OUI:002269*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:08004F*
- ID_OUI_FROM_DATABASE=CYGNET SYSTEMS
+OUI:40490F*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:F8E71E*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:28565A*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00194B*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:001F3A*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:001F95*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:506313*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:000E59*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:78E400*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:A01B29*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:8C7CB5*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:90013B*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:EC55F9*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:ECDF3A*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+OUI:C03896*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:E45AA2*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+OUI:2C337A*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00235A*
- ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
+OUI:ACD1B8*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:001B38*
- ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
+OUI:48E244*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:E46F13*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:30F772*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:DC6DCD*
- ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+OUI:90489A*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:94C150*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:9439E5*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:60FE20*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:5C8613*
+ ID_OUI_FROM_DATABASE=Beijing Zhoenet Technology Co., Ltd
 
-OUI:989096*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:C8B21E*
+ ID_OUI_FROM_DATABASE=CHIPSEA TECHNOLOGIES (SHENZHEN) CORP.
 
-OUI:B82A72*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:503F98*
+ ID_OUI_FROM_DATABASE=CMITECH
 
-OUI:00D09E*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:B072BF*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:000D72*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:600B03*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:000F1F*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:A41437*
+ ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
 
-OUI:14FEB5*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:884CCF*
+ ID_OUI_FROM_DATABASE=Pulzze Systems, Inc
 
-OUI:0015C5*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:38521A*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:D4AE52*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:84DBFC*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:B0E754*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:143E60*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:B8E625*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:D4E33F*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:549F35*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:5454CF*
+ ID_OUI_FROM_DATABASE=PROBEDIGITAL CO.,LTD
 
-OUI:64006A*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:F0D5BF*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:B4E10F*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:C87E75*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0023AE*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:00233A*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:9CD917*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:1C9D3E*
+ ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
-OUI:9068C3*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:748A69*
+ ID_OUI_FROM_DATABASE=Korea Image Technology Co., Ltd
 
-OUI:408805*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:30B64F*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:A4A1C2*
- ID_OUI_FROM_DATABASE=Ericsson AB
+OUI:DC0D30*
+ ID_OUI_FROM_DATABASE=Shenzhen Feasycom Technology Co., Ltd.
 
-OUI:348446*
- ID_OUI_FROM_DATABASE=Ericsson AB
+OUI:008731*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:AC2B6E*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:B4EFFA*
+ ID_OUI_FROM_DATABASE=Lemobile Information Technology (Beijing) Co., Ltd.
 
-OUI:F8F1B6*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:9495A0*
+ ID_OUI_FROM_DATABASE=Google, Inc.
 
-OUI:00216A*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:0005EE*
+ ID_OUI_FROM_DATABASE=Vanderbilt International (SWE) AB
 
-OUI:001E64*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:38D547*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:0016EB*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:4CF95D*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0018DE*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:8421F1*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:681729*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:707990*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:5C514F*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:CCFD17*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:B808CF*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:3C8BCD*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
 
-OUI:C8F733*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:E43ED7*
+ ID_OUI_FROM_DATABASE=Arcadyan Corporation
 
-OUI:4851B7*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:248894*
+ ID_OUI_FROM_DATABASE=shenzhen lensun Communication Technology LTD
 
-OUI:5CC5D4*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:60A4D0*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:7CCCB8*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:00B0CE*
+ ID_OUI_FROM_DATABASE=Viveris Technologies
 
-OUI:F40669*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:E00DB9*
+ ID_OUI_FROM_DATABASE=Cree, Inc.
 
-OUI:3CA9F4*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:40FE0D*
+ ID_OUI_FROM_DATABASE=MAXIO
 
-OUI:28B2BD*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:609AC1*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:08D40C*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:F07960*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:843A4B*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:9C8BA0*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0CD292*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:9840BB*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:78929C*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:E04FBD*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
 
-OUI:6805CA*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:00B0E1*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:ACA31E*
- ID_OUI_FROM_DATABASE=Aruba Networks
+OUI:4C3275*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:9C1C12*
- ID_OUI_FROM_DATABASE=Aruba Networks
+OUI:0006F4*
+ ID_OUI_FROM_DATABASE=Prime Electronics & Satellitics Inc.
 
-OUI:001A1E*
- ID_OUI_FROM_DATABASE=Aruba Networks
+OUI:ACE77B*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
 
-OUI:28C2DD*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:24A43C*
+ ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
 
-OUI:84D47E*
- ID_OUI_FROM_DATABASE=Aruba Networks
+OUI:D4E90B*
+ ID_OUI_FROM_DATABASE=CVT CO.,LTD
 
-OUI:A85840*
- ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
+OUI:788A20*
+ ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
 
-OUI:002243*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:28EE52*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:74F06D*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:905C44*
+ ID_OUI_FROM_DATABASE=Compal Broadband Networks, Inc.
 
-OUI:44D832*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:FC372B*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
 
-OUI:781881*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:0CD86C*
+ ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
 
-OUI:B0EE45*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:8C60E7*
+ ID_OUI_FROM_DATABASE=MPGIO CO.,LTD
 
-OUI:240A64*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:2C0E3D*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:D0E782*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:24C44A*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:0C4C39*
- ID_OUI_FROM_DATABASE=MitraStar Technology Corp.
+OUI:B83A9D*
+ ID_OUI_FROM_DATABASE=Alarm.com
 
-OUI:002423*
- ID_OUI_FROM_DATABASE=AzureWave Technologies (Shanghai) Inc.
+OUI:00BBC1*
+ ID_OUI_FROM_DATABASE=CANON INC.
 
-OUI:A81D16*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:1C14B3*
+ ID_OUI_FROM_DATABASE=Airwire Technologies
 
-OUI:38A53C*
- ID_OUI_FROM_DATABASE=COMECER Netherlands
+OUI:2CC260*
+ ID_OUI_FROM_DATABASE=Oracle Corporation
 
-OUI:001D8B*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:407183*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:A4526F*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:0059DC*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:581243*
- ID_OUI_FROM_DATABASE=AcSiP Technology Corp.
+OUI:ACF85C*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:0026B8*
- ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
+OUI:00749C*
+ ID_OUI_FROM_DATABASE=Ruijie Networks Co.,LTD
 
-OUI:0030F1*
- ID_OUI_FROM_DATABASE=Accton Technology Corp
+OUI:00271C*
+ ID_OUI_FROM_DATABASE=MERCURY CORPORATION
 
-OUI:001974*
- ID_OUI_FROM_DATABASE=16063
+OUI:E0D9E3*
+ ID_OUI_FROM_DATABASE=Eltex Enterprise Ltd.
 
-OUI:ECF00E*
- ID_OUI_FROM_DATABASE=AboCom
+OUI:5098F3*
+ ID_OUI_FROM_DATABASE=Rheem Australia Pty Ltd
 
-OUI:3039F2*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:701CE7*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:000827*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:CC9470*
+ ID_OUI_FROM_DATABASE=Kinestral Technologies, Inc.
 
-OUI:9097D5*
- ID_OUI_FROM_DATABASE=Espressif Inc.
+OUI:F0219D*
+ ID_OUI_FROM_DATABASE=Cal-Comp Electronics & Communications Company Ltd.
 
-OUI:18FE34*
- ID_OUI_FROM_DATABASE=Espressif Inc.
+OUI:000B2E*
+ ID_OUI_FROM_DATABASE=Cal-Comp Electronics & Communications Company Ltd.
 
-OUI:54F6C5*
- ID_OUI_FROM_DATABASE=FUJIAN STAR-NET COMMUNICATION CO.,LTD
+OUI:885BDD*
+ ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
 
-OUI:28EF01*
- ID_OUI_FROM_DATABASE=Private
+OUI:08EA44*
+ ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
 
-OUI:5C338E*
- ID_OUI_FROM_DATABASE=Alpha Networks Inc.
+OUI:506B8D*
+ ID_OUI_FROM_DATABASE=Nutanix
 
-OUI:001AEB*
- ID_OUI_FROM_DATABASE=Allied Telesis R&D Center K.K.
+OUI:0038DF*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:747548*
- ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+OUI:006BF1*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:A43111*
- ID_OUI_FROM_DATABASE=ZIV
+OUI:CC81DA*
+ ID_OUI_FROM_DATABASE=SHANGHAI PHICOMM COMMUNICATION CO.,LTD
 
-OUI:5C93A2*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:20D25F*
+ ID_OUI_FROM_DATABASE=SmartCap Technologies
 
-OUI:E8C74F*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:3CFA43*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:E8F724*
- ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
+OUI:145F94*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:701A04*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:4C11BF*
+ ID_OUI_FROM_DATABASE=Zhejiang Dahua Technology Co., Ltd.
 
-OUI:48D224*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:EC0D9A*
+ ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
 
-OUI:2CD05A*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:000064*
+ ID_OUI_FROM_DATABASE=Yokogawa Digital Computer Corporation
 
-OUI:74E543*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:0023F7*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:A4DB30*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:90D7BE*
+ ID_OUI_FROM_DATABASE=Wavelab Global Inc.
 
-OUI:B8EE65*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:686975*
+ ID_OUI_FROM_DATABASE=Angler Labs Inc
 
-OUI:001DBA*
- ID_OUI_FROM_DATABASE=Sony Corporation
+OUI:002448*
+ ID_OUI_FROM_DATABASE=SpiderCloud Wireless, Inc
 
-OUI:000AD9*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:7C03C9*
+ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
 
-OUI:000FDE*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:64DB43*
+ ID_OUI_FROM_DATABASE=Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.
 
-OUI:001EDC*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:D058A8*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:001963*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:D071C4*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:001B59*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:48F07B*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
 
-OUI:78843C*
- ID_OUI_FROM_DATABASE=Sony Corporation
+OUI:3C80AA*
+ ID_OUI_FROM_DATABASE=Ransnet Singapore Pte Ltd
 
-OUI:0023F1*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:7CEBAE*
+ ID_OUI_FROM_DATABASE=Ridgeline Instruments
 
-OUI:3017C8*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:E89EB4*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:18002D*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:D4970B*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:04E676*
- ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
+OUI:64CC2E*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:0022F4*
- ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
+OUI:B0E235*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:080046*
- ID_OUI_FROM_DATABASE=Sony Corporation
+OUI:38A4ED*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:000D92*
- ID_OUI_FROM_DATABASE=ARIMA Communications Corp.
+OUI:F48B32*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:009096*
- ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+OUI:0060BD*
+ ID_OUI_FROM_DATABASE=Enginuity Communications
 
-OUI:0011F5*
- ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+OUI:AC83F3*
+ ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
 
-OUI:DCD87C*
- ID_OUI_FROM_DATABASE=Beijing Jingdong Century Trading Co., LTD.
+OUI:18DBF2*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:001C4A*
- ID_OUI_FROM_DATABASE=AVM GmbH
+OUI:000048*
+ ID_OUI_FROM_DATABASE=Seiko Epson Corporation
 
-OUI:000B6A*
- ID_OUI_FROM_DATABASE=Asiarock Technology Limited
+OUI:C0BFC0*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:40BA61*
- ID_OUI_FROM_DATABASE=ARIMA Communications Corp.
+OUI:A08CF8*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:841B5E*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:54B56C*
+ ID_OUI_FROM_DATABASE=Xi'an NovaStar Tech Co., Ltd
 
-OUI:204E7F*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:FC3CE9*
+ ID_OUI_FROM_DATABASE=Tsingtong Technologies Co, Ltd.
 
-OUI:A021B7*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:04B648*
+ ID_OUI_FROM_DATABASE=ZENNER
 
-OUI:0024B2*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:FC10C6*
+ ID_OUI_FROM_DATABASE=Taicang T&W Electronics
 
-OUI:C03F0E*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:344CC8*
+ ID_OUI_FROM_DATABASE=Echodyne Corp
 
-OUI:001F33*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:948FEE*
+ ID_OUI_FROM_DATABASE=Verizon Telematics
 
-OUI:1883BF*
- ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+OUI:5C4A1F*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
 
-OUI:9C80DF*
- ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+OUI:0C8DDB*
+ ID_OUI_FROM_DATABASE=Cisco Meraki
 
-OUI:001CCC*
- ID_OUI_FROM_DATABASE=BlackBerry RTS
+OUI:B0F963*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:94EBCD*
- ID_OUI_FROM_DATABASE=BlackBerry RTS
+OUI:E4E4AB*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:644FB0*
- ID_OUI_FROM_DATABASE=Hyunjin.com
+OUI:58404E*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:001A2A*
- ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+OUI:DC0C5C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:001D19*
- ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+OUI:2C200B*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:88252C*
- ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+OUI:98B6E9*
+ ID_OUI_FROM_DATABASE=Nintendo Co.,Ltd
 
-OUI:A4E4B8*
- ID_OUI_FROM_DATABASE=BlackBerry RTS
+OUI:8809AF*
+ ID_OUI_FROM_DATABASE=Masimo Corporation
 
-OUI:58671A*
- ID_OUI_FROM_DATABASE=Barnes&Noble
+OUI:00E06C*
+ ID_OUI_FROM_DATABASE=Ultra Electronics Command & Control Systems
 
-OUI:BC0543*
- ID_OUI_FROM_DATABASE=AVM GmbH
+OUI:009058*
+ ID_OUI_FROM_DATABASE=Ultra Electronics Command & Control Systems
 
-OUI:002675*
- ID_OUI_FROM_DATABASE=Aztech Electronics Pte Ltd
+OUI:F8983A*
+ ID_OUI_FROM_DATABASE=Leeman International (HongKong) Limited
 
-OUI:001F3F*
- ID_OUI_FROM_DATABASE=AVM GmbH
+OUI:4CECEF*
+ ID_OUI_FROM_DATABASE=Soraa, Inc.
 
-OUI:506A03*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:702D84*
+ ID_OUI_FROM_DATABASE=i4C Innovations
 
-OUI:6CB0CE*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:CC9F7A*
+ ID_OUI_FROM_DATABASE=Chiun Mai Communication Systems, Inc
 
-OUI:100D7F*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:446246*
+ ID_OUI_FROM_DATABASE=Comat AG
 
-OUI:0020D6*
- ID_OUI_FROM_DATABASE=Breezecom, Ltd.
+OUI:C8AA55*
+ ID_OUI_FROM_DATABASE=Hunan Comtom Electronic Incorporated Co.,Ltd
 
-OUI:001018*
- ID_OUI_FROM_DATABASE=Broadcom
+OUI:142FFD*
+ ID_OUI_FROM_DATABASE=LT SECURITY INC
 
-OUI:001BE9*
- ID_OUI_FROM_DATABASE=Broadcom
+OUI:000D2C*
+ ID_OUI_FROM_DATABASE=Net2Edge Limited
 
-OUI:008077*
- ID_OUI_FROM_DATABASE=Brother industries, LTD.
+OUI:ECE154*
+ ID_OUI_FROM_DATABASE=Beijing Unisound Information Technology Co.,Ltd.
 
-OUI:029D8E*
- ID_OUI_FROM_DATABASE=CARDIAC RECORDERS, INC.
+OUI:60C658*
+ ID_OUI_FROM_DATABASE=PHYTRONIX Co.,Ltd.
 
-OUI:FC2F40*
- ID_OUI_FROM_DATABASE=Calxeda, Inc.
+OUI:38454C*
+ ID_OUI_FROM_DATABASE=Light Labs, Inc.
 
-OUI:0026E4*
- ID_OUI_FROM_DATABASE=Canal +
+OUI:C894BB*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:389496*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:D0FF98*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0CB319*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:5004B8*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:08EE8B*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:10B1F8*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:84A466*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:14ABC5*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:981DFA*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:A462DF*
+ ID_OUI_FROM_DATABASE=DS Global. Co., LTD
 
-OUI:FCF136*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:50D213*
+ ID_OUI_FROM_DATABASE=CviLux Corporation
 
-OUI:0C8910*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:44D437*
+ ID_OUI_FROM_DATABASE=Inteno Broadband Technology AB
 
-OUI:54FA3E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:78AF58*
+ ID_OUI_FROM_DATABASE=GIMASI SA
 
-OUI:A89FBA*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:00071C*
+ ID_OUI_FROM_DATABASE=AT&T
 
-OUI:FC1910*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:2C9AA4*
+ ID_OUI_FROM_DATABASE=Eolo SpA
 
-OUI:083D88*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:002183*
+ ID_OUI_FROM_DATABASE=ANDRITZ HYDRO GmbH
 
-OUI:5C2E59*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:8404D2*
+ ID_OUI_FROM_DATABASE=Kirale Technologies SL
 
-OUI:646CB2*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:083E5D*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:F884F2*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:749CE3*
+ ID_OUI_FROM_DATABASE=KodaCloud Canada, Inc
 
-OUI:14B484*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:CC2D21*
+ ID_OUI_FROM_DATABASE=Tenda Technology Co.,Ltd.Dongguan branch
 
-OUI:608F5C*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:8C78D7*
+ ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
 
-OUI:4CBCA5*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:3CBD3E*
+ ID_OUI_FROM_DATABASE=Beijing Xiaomi Electronics Co., Ltd.
 
-OUI:78595E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:2C4D54*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:B0D09C*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:349672*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:4CA56D*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:00179B*
+ ID_OUI_FROM_DATABASE=CHANT SINCERE CO.,LTD
 
-OUI:A48431*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:080027*
+ ID_OUI_FROM_DATABASE=PCS Systemtechnik GmbH
 
-OUI:E4F8EF*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:348446*
+ ID_OUI_FROM_DATABASE=Ericsson AB
 
-OUI:1432D1*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:A4A1C2*
+ ID_OUI_FROM_DATABASE=Ericsson AB
 
-OUI:E458E7*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:B0F1EC*
+ ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
 
-OUI:8CBFA6*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:B0C46C*
+ ID_OUI_FROM_DATABASE=Senseit
 
-OUI:7840E4*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:148951*
+ ID_OUI_FROM_DATABASE=LCFC(HeFei) Electronics Technology co., ltd
 
-OUI:9000DB*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F87588*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:183A2D*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:BC3F8F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:08373D*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:04DEF2*
+ ID_OUI_FROM_DATABASE=Shenzhen ECOM Technology Co. Ltd
 
-OUI:50F520*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:00D071*
+ ID_OUI_FROM_DATABASE=ECHELON CORP.
 
-OUI:A4EBD3*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:504061*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:28987B*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:0030C5*
+ ID_OUI_FROM_DATABASE=CADENCE DESIGN SYSTEMS, INC.
 
-OUI:1867B0*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:54E3F6*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent
 
-OUI:F40E22*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:7467F7*
+ ID_OUI_FROM_DATABASE=Extreme Networks
 
-OUI:9C3AAF*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:B0C205*
+ ID_OUI_FROM_DATABASE=BIONIME
 
-OUI:BCF2AF*
- ID_OUI_FROM_DATABASE=devolo AG
+OUI:0C61CF*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0270B3*
- ID_OUI_FROM_DATABASE=DATA RECALL LTD.
+OUI:B4C799*
+ ID_OUI_FROM_DATABASE=Extreme Networks
 
-OUI:000FF6*
- ID_OUI_FROM_DATABASE=DARFON LIGHTING CORP
+OUI:5C0E8B*
+ ID_OUI_FROM_DATABASE=Extreme Networks
 
-OUI:702559*
- ID_OUI_FROM_DATABASE=CyberTAN Technology Inc.
+OUI:00E02B*
+ ID_OUI_FROM_DATABASE=Extreme Networks
 
-OUI:0090D6*
- ID_OUI_FROM_DATABASE=Crystal Group, Inc.
+OUI:7C2664*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:001DAA*
- ID_OUI_FROM_DATABASE=DrayTek Corp.
+OUI:A002DC*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:02CF1C*
- ID_OUI_FROM_DATABASE=Communication Machinery Corporation
+OUI:0C47C9*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:0C75BD*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:E47DEB*
+ ID_OUI_FROM_DATABASE=Shanghai Notion Information Technology CO.,LTD.
 
-OUI:38F0C8*
- ID_OUI_FROM_DATABASE=Livestream
+OUI:747548*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:0C1167*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:AC63BE*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:001982*
- ID_OUI_FROM_DATABASE=SmarDTV
+OUI:DCA4CA*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:10C6FC*
- ID_OUI_FROM_DATABASE=Garmin International
+OUI:8C8FE9*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00E000*
- ID_OUI_FROM_DATABASE=FUJITSU LIMITED
+OUI:40FA7F*
+ ID_OUI_FROM_DATABASE=Preh Car Connect GmbH
 
-OUI:00000E*
- ID_OUI_FROM_DATABASE=FUJITSU LIMITED
+OUI:F8AB05*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:002326*
- ID_OUI_FROM_DATABASE=FUJITSU LIMITED
+OUI:C0028D*
+ ID_OUI_FROM_DATABASE=WINSTAR Display CO.,Ltd
 
-OUI:0007CB*
- ID_OUI_FROM_DATABASE=FREEBOX SAS
+OUI:D83214*
+ ID_OUI_FROM_DATABASE=Tenda Technology Co.,Ltd.Dongguan branch
 
-OUI:3C591E*
- ID_OUI_FROM_DATABASE=TCL King Electrical Appliances (Huizhou) Co., Ltd
+OUI:7C787E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:002682*
- ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
+OUI:C0D3C0*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001A73*
- ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
+OUI:F097E5*
+ ID_OUI_FROM_DATABASE=TAMIO, INC
 
-OUI:00904B*
- ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
+OUI:F4E4AD*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:D86BF7*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:F85971*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:A4C0E1*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:9810E8*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:34AF2C*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:B49CDF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:8CCDE8*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:4C82CF*
+ ID_OUI_FROM_DATABASE=Echostar Technologies Corp
 
-OUI:9CE635*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:F49634*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:600194*
- ID_OUI_FROM_DATABASE=Espressif Inc.
+OUI:6C4B90*
+ ID_OUI_FROM_DATABASE=LiteON
 
-OUI:F44D17*
- ID_OUI_FROM_DATABASE=GOLDCARD HIGH-TECH CO.,LTD.
+OUI:F8FF0B*
+ ID_OUI_FROM_DATABASE=Electronic Technology Inc.
 
-OUI:001E35*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:38F135*
+ ID_OUI_FROM_DATABASE=SensorTec-Canada
 
-OUI:001FC5*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:90F305*
+ ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
 
-OUI:0021BD*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:00093A*
+ ID_OUI_FROM_DATABASE=Molex
 
-OUI:002709*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:C8F86D*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
 
-OUI:E84ECE*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:B8D50B*
+ ID_OUI_FROM_DATABASE=Sunitec Enterprise Co.,Ltd
 
-OUI:0009BF*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:28A6DB*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001AE9*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:D45F25*
+ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
 
-OUI:001CBE*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:9CE951*
+ ID_OUI_FROM_DATABASE=Shenzhen Sang Fei Consumer Communications Ltd., Co.
 
-OUI:002403*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:DC0856*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Enterprise
 
-OUI:002265*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:E8FDE8*
+ ID_OUI_FROM_DATABASE=CeLa Link Corporation
 
-OUI:0019B7*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:181212*
+ ID_OUI_FROM_DATABASE=Cepton Technologies
 
-OUI:002404*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:B4417A*
+ ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
 
-OUI:0002EE*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:F4DE0C*
+ ID_OUI_FROM_DATABASE=ESPOD Ltd.
 
-OUI:001C9A*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:BC8AE8*
+ ID_OUI_FROM_DATABASE=QING DAO HAIER TELECOM CO.,LTD.
 
-OUI:001F01*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:A81B5A*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:000EED*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:DC6DCD*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:001E3A*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:440444*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:001A89*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:C09F05*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:0021AA*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:CC2D83*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:002669*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:38295A*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:0022FD*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:4C1A3D*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:002109*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:185207*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
 
-OUI:002108*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:70D379*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001D6E*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:7C4F7D*
+ ID_OUI_FROM_DATABASE=Sawwave
 
-OUI:001B33*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:9874DA*
+ ID_OUI_FROM_DATABASE=Infinix mobility limited
 
-OUI:ECF35B*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:143F27*
+ ID_OUI_FROM_DATABASE=Noccela Oy
 
-OUI:EC9B5B*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:64351C*
+ ID_OUI_FROM_DATABASE=e-CON SYSTEMS INDIA PVT LTD
 
-OUI:BCC6DB*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:5C6A80*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:B83241*
- ID_OUI_FROM_DATABASE=Wuhan Tianyu Information Industry Co., Ltd.
+OUI:A8B86E*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:9897D1*
- ID_OUI_FROM_DATABASE=MitraStar Technology Corp.
+OUI:0CB912*
+ ID_OUI_FROM_DATABASE=JM-DATA GmbH
 
-OUI:94C960*
- ID_OUI_FROM_DATABASE=Zhongshan B&T technology.co.,ltd
+OUI:1893D7*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:001479*
- ID_OUI_FROM_DATABASE=NEC Magnus Communications,Ltd.
+OUI:EC363F*
+ ID_OUI_FROM_DATABASE=Markov Corporation
 
-OUI:9C4FDA*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:54FA3E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:1C5CF2*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B8BBAF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0821EF*
+OUI:60C5AD*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:A0CBFD*
+OUI:28395E*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:34145F*
+OUI:C4AE12*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:B462AD*
- ID_OUI_FROM_DATABASE=Elysia Germany GmbH
+OUI:10D07A*
+ ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
 
-OUI:747818*
- ID_OUI_FROM_DATABASE=Jurumani Solutions
+OUI:0C8910*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:803896*
- ID_OUI_FROM_DATABASE=SHARP Corporation
+OUI:FCF136*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:80D160*
- ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
+OUI:981DFA*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:686E23*
- ID_OUI_FROM_DATABASE=Wi3 Inc.
+OUI:84A466*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:B8A175*
- ID_OUI_FROM_DATABASE=Roku, Inc.
+OUI:1867B0*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0080E5*
- ID_OUI_FROM_DATABASE=NetApp
+OUI:CCB11A*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:E49A79*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:80B234*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:28A02B*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B877C3*
+ ID_OUI_FROM_DATABASE=METER Group
 
-OUI:B44BD2*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:F07485*
+ ID_OUI_FROM_DATABASE=NGD Systems, Inc.
 
-OUI:002340*
- ID_OUI_FROM_DATABASE=MiXTelematics
+OUI:BC644B*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:B48B19*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:F8A097*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:00AF1F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:94E8C5*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:4CCC6A*
- ID_OUI_FROM_DATABASE=Micro-Star INTL CO., LTD.
+OUI:044E5A*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:985BB0*
- ID_OUI_FROM_DATABASE=KMDATA INC.
+OUI:74EAE8*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:6C8FB5*
- ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
+OUI:A811FC*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:245EBE*
- ID_OUI_FROM_DATABASE=QNAP Systems, Inc.
+OUI:745612*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:A89352*
- ID_OUI_FROM_DATABASE=SHANGHAI ZHONGMI COMMUNICATION TECHNOLOGY CO.,LTD
+OUI:E46449*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:AC5F3E*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
+OUI:001BDD*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:B07FB9*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:001404*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:70661B*
- ID_OUI_FROM_DATABASE=Sonova AG
+OUI:00195E*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:1C98EC*
- ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
+OUI:001AAD*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:9C9D5D*
- ID_OUI_FROM_DATABASE=Raden Inc
+OUI:A47AA4*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:E8FD72*
- ID_OUI_FROM_DATABASE=SHANGHAI LINGUO TECHNOLOGY CO., LTD.
+OUI:1C1448*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:98BB1E*
- ID_OUI_FROM_DATABASE=BYD Precision Manufacture Company Ltd.
+OUI:002493*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:EC438B*
- ID_OUI_FROM_DATABASE=YAPTV
+OUI:40FC89*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:1866DA*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:3C754A*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:981FB1*
- ID_OUI_FROM_DATABASE=Shenzhen Lemon Network Technology Co.,Ltd
+OUI:0024C1*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:CCB11A*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:002136*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:40476A*
- ID_OUI_FROM_DATABASE=AG Acquisition Corp. d.b.a. ASTRO Gaming
+OUI:0022B4*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:A4BF01*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:002395*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:509EA7*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:0023ED*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:DCCF96*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:001B52*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0004C6*
- ID_OUI_FROM_DATABASE=YAMAHA MOTOR CO.,LTD
+OUI:00230B*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:14D11F*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:001E8D*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:54511B*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:0023A2*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:68536C*
- ID_OUI_FROM_DATABASE=SPnS Co.,Ltd
+OUI:0015D1*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:64CC2E*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:001DD3*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:005BA1*
- ID_OUI_FROM_DATABASE=shanghai huayuan chuangxin software CO., LTD.
+OUI:E8892C*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:B07E70*
- ID_OUI_FROM_DATABASE=Zadara Storage Ltd.
+OUI:E83EFC*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:405EE1*
- ID_OUI_FROM_DATABASE=Shenzhen H&T Intelligent Control Co.,Ltd.
+OUI:707E43*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:10F005*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:0003E0*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:BC9889*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:00128A*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:E42F26*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:001225*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:344B3D*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:083E0C*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:FCF647*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:8C09F4*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:1088CE*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:3CDFA9*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:D463FE*
- ID_OUI_FROM_DATABASE=Arcadyan Corporation
+OUI:003676*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:9466E7*
- ID_OUI_FROM_DATABASE=WOM Engineering
+OUI:84E058*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:F8A188*
- ID_OUI_FROM_DATABASE=LED Roadway Lighting
+OUI:347A60*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001174*
- ID_OUI_FROM_DATABASE=Mojo Networks, Inc.
+OUI:C005C2*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:BC15AC*
- ID_OUI_FROM_DATABASE=Vodafone Italia S.p.A.
+OUI:6455B1*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:140C5B*
- ID_OUI_FROM_DATABASE=PLNetworks
+OUI:203D66*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:D0B0CD*
- ID_OUI_FROM_DATABASE=Moen
+OUI:D404CD*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0071C2*
- ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
+OUI:446AB7*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:DCFE07*
- ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
+OUI:2C9924*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:E47E66*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:105611*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:9C741A*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:DC74A8*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:EC93ED*
- ID_OUI_FROM_DATABASE=DDoS-Guard LTD
+OUI:C087EB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:4C72B9*
- ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
+OUI:2C3AE8*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
 
-OUI:F462D0*
- ID_OUI_FROM_DATABASE=Not for Radio, LLC
+OUI:74F61C*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:94513D*
- ID_OUI_FROM_DATABASE=iSmart Alarm, Inc.
+OUI:E8B6C2*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:C89CDC*
- ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
+OUI:B0DAF9*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:002511*
- ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
+OUI:3438B7*
+ ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
 
-OUI:000E03*
- ID_OUI_FROM_DATABASE=Emulex Corporation
+OUI:5C1A6F*
+ ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
 
-OUI:001BB9*
- ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
+OUI:487D2E*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:001921*
- ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
+OUI:B089C2*
+ ID_OUI_FROM_DATABASE=Zyptonite
 
-OUI:00142A*
- ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
+OUI:F0D4F6*
+ ID_OUI_FROM_DATABASE=Lars Thrane A/S
 
-OUI:0001F4*
- ID_OUI_FROM_DATABASE=Enterasys
+OUI:0403D6*
+ ID_OUI_FROM_DATABASE=Nintendo Co.,Ltd
 
-OUI:487ADA*
- ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+OUI:A0AFBD*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:1C7370*
- ID_OUI_FROM_DATABASE=Neotech
+OUI:34D954*
+ ID_OUI_FROM_DATABASE=WiBotic Inc.
 
-OUI:0050FC*
- ID_OUI_FROM_DATABASE=Edimax Technology Co. Ltd.
+OUI:6C60EB*
+ ID_OUI_FROM_DATABASE=ZHI YUAN ELECTRONICS CO., LIMITED
 
-OUI:200A5E*
- ID_OUI_FROM_DATABASE=Xiangshan Giant Eagle Technology Developing Co., Ltd.
+OUI:AC4E2E*
+ ID_OUI_FROM_DATABASE=Shenzhen JingHanDa Electronics Co.Ltd
 
-OUI:30E37A*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:0027E3*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:4CA003*
- ID_OUI_FROM_DATABASE=T-21 Technologies LLC
+OUI:488D36*
+ ID_OUI_FROM_DATABASE=Arcadyan Corporation
 
-OUI:F0EE58*
- ID_OUI_FROM_DATABASE=PACE Telematics GmbH
+OUI:B40016*
+ ID_OUI_FROM_DATABASE=INGENICO TERMINALS SAS
 
-OUI:A08CFD*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:FCA667*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:4000E0*
- ID_OUI_FROM_DATABASE=Derek(Shaoguan)Limited
+OUI:784501*
+ ID_OUI_FROM_DATABASE=Biamp Systems
 
-OUI:001397*
- ID_OUI_FROM_DATABASE=Oracle Corporation
+OUI:A0341B*
+ ID_OUI_FROM_DATABASE=TrackR, Inc
 
-OUI:00A0A4*
- ID_OUI_FROM_DATABASE=Oracle Corporation
+OUI:986F60*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:A4E597*
- ID_OUI_FROM_DATABASE=Gessler GmbH
+OUI:4C189A*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:0024F4*
- ID_OUI_FROM_DATABASE=Kaminario, Ltd.
+OUI:6CA849*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:001D08*
- ID_OUI_FROM_DATABASE=Jiangsu Yinhe  Electronics Co.,Ltd.
+OUI:A4251B*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:0018D7*
- ID_OUI_FROM_DATABASE=JAVAD GNSS, Inc.
+OUI:E45D52*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:001C6C*
- ID_OUI_FROM_DATABASE=30805
+OUI:38BB3C*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:00A0B0*
- ID_OUI_FROM_DATABASE=I-O DATA DEVICE, INC.
+OUI:C057BC*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:00E0CF*
- ID_OUI_FROM_DATABASE=INTEGRATED DEVICE
+OUI:D47856*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:547F54*
- ID_OUI_FROM_DATABASE=INGENICO
+OUI:14612F*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:48C049*
- ID_OUI_FROM_DATABASE=Broad Telecom SA
+OUI:707C69*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:DC38E1*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:FC8399*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:40A677*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:44322A*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:0C8610*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:048A15*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:EC3EF7*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:00040D*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:0014F6*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:A47886*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:00121E*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:001CFA*
+ ID_OUI_FROM_DATABASE=Alarm.com
 
-OUI:0010DB*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:60313B*
+ ID_OUI_FROM_DATABASE=Sunnovo International Limited
 
-OUI:307C5E*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:B4E62A*
+ ID_OUI_FROM_DATABASE=LG Innotek
 
-OUI:841888*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:E45AA2*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:40B4F0*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:ECDF3A*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:002688*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:F470AB*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:0017CB*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:50184C*
+ ID_OUI_FROM_DATABASE=Platina Systems Inc.
 
-OUI:E0A3AC*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:E4A749*
+ ID_OUI_FROM_DATABASE=Palo Alto Networks
 
-OUI:E00EDA*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:786D94*
+ ID_OUI_FROM_DATABASE=Palo Alto Networks
 
-OUI:6C2483*
- ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
+OUI:CC4639*
+ ID_OUI_FROM_DATABASE=WAAV, Inc.
 
-OUI:848319*
- ID_OUI_FROM_DATABASE=Hangzhou Zero Zero Technology Co., Ltd.
+OUI:30B164*
+ ID_OUI_FROM_DATABASE=Power Electronics International Inc.
 
-OUI:001F20*
- ID_OUI_FROM_DATABASE=Logitech Europe SA
+OUI:18B430*
+ ID_OUI_FROM_DATABASE=Nest Labs Inc.
 
-OUI:882012*
- ID_OUI_FROM_DATABASE=LMI Technologies
+OUI:3CF591*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:002382*
- ID_OUI_FROM_DATABASE=Lih Rong electronic Enterprise Co., Ltd.
+OUI:602101*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:88795B*
- ID_OUI_FROM_DATABASE=Konka Group Co., Ltd.
+OUI:604762*
+ ID_OUI_FROM_DATABASE=Beijing Sensoro Technology Co.,Ltd.
 
-OUI:001A34*
- ID_OUI_FROM_DATABASE=Konka Group Co., Ltd.
+OUI:7CE2CA*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:20A90E*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:B0DFC1*
+ ID_OUI_FROM_DATABASE=Tenda Technology Co.,Ltd.Dongguan branch
 
-OUI:8C99E6*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:70788B*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:745C9F*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:001DCC*
+ ID_OUI_FROM_DATABASE=Ayon Cyber Security, Inc
 
-OUI:0CBD51*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:7065A3*
+ ID_OUI_FROM_DATABASE=Kandao lightforge Co., Ltd.
 
-OUI:E42D02*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:706E6D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:3CE5A6*
- ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+OUI:FC2F6B*
+ ID_OUI_FROM_DATABASE=Everspin Technologies, Inc.
 
-OUI:3C8C40*
- ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+OUI:B4C170*
+ ID_OUI_FROM_DATABASE=Yi chip Microelectronics (Hangzhou) Co., Ltd
 
-OUI:B04519*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:540237*
+ ID_OUI_FROM_DATABASE=Teltronic AG
 
-OUI:A81559*
- ID_OUI_FROM_DATABASE=Breathometer, Inc.
+OUI:2CC5D3*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:ECADB8*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:F8E71E*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
+
+OUI:1CB9C4*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
+
+OUI:C0C520*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:9801A7*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:A89675*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:2CF0A2*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:94F128*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:C09727*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
+OUI:94FBB2*
+ ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
 
-OUI:2C5A8D*
- ID_OUI_FROM_DATABASE=SYSTRONIK Elektronik u. Systemtechnik GmbH
+OUI:A47B9D*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
 
-OUI:B8BBAF*
+OUI:608E08*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:60C5AD*
+OUI:7C2EDD*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:8C897A*
- ID_OUI_FROM_DATABASE=AUGTEK
+OUI:3CF7A4*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:54EDA3*
- ID_OUI_FROM_DATABASE=Navdy, Inc.
+OUI:342D0D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:046565*
- ID_OUI_FROM_DATABASE=Testop
+OUI:EC3DFD*
+ ID_OUI_FROM_DATABASE=SHENZHEN BILIAN ELECTRONIC CO.,LTD
 
-OUI:042758*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:001885*
+ ID_OUI_FROM_DATABASE=Avigilon Corporation
 
-OUI:3C92DC*
- ID_OUI_FROM_DATABASE=Octopod Technology Co. Ltd.
+OUI:18742E*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:74CC39*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:8886C2*
+ ID_OUI_FROM_DATABASE=STABILO International GmbH
 
-OUI:6038E0*
- ID_OUI_FROM_DATABASE=Belkin International Inc.
+OUI:04FA3F*
+ ID_OUI_FROM_DATABASE=Opticore Inc.
 
-OUI:F0FDA0*
- ID_OUI_FROM_DATABASE=Acurix Networks Pty Ltd
+OUI:308454*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:1CB9C4*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:FC7F56*
+ ID_OUI_FROM_DATABASE=CoSyst Control Systems GmbH
 
-OUI:3876D1*
- ID_OUI_FROM_DATABASE=Euronda SpA
+OUI:8C2505*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:C48F07*
- ID_OUI_FROM_DATABASE=Shenzhen Yihao Hulian Science and Technology Co., Ltd.
+OUI:94D029*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:009E1E*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:4C49E3*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:002550*
- ID_OUI_FROM_DATABASE=Riverbed Technology, Inc.
+OUI:28D436*
+ ID_OUI_FROM_DATABASE=Jiangsu dewosi electric co., LTD
 
-OUI:D85B2A*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:149346*
+ ID_OUI_FROM_DATABASE=PNI sensor corporation
 
-OUI:ACC33A*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:18B81F*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:F45B73*
- ID_OUI_FROM_DATABASE=Wanjiaan Interconnected Technology Co., Ltd
+OUI:00C064*
+ ID_OUI_FROM_DATABASE=General Datacomm LLC
 
-OUI:0021E2*
- ID_OUI_FROM_DATABASE=visago Systems & Controls GmbH & Co. KG
+OUI:601283*
+ ID_OUI_FROM_DATABASE=TSB REAL TIME LOCATION SYSTEMS S.L.
 
-OUI:28F10E*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:E06089*
+ ID_OUI_FROM_DATABASE=Cloudleaf, Inc.
 
-OUI:C4A366*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:001219*
+ ID_OUI_FROM_DATABASE=General Datacomm LLC
 
-OUI:0014B4*
- ID_OUI_FROM_DATABASE=General Dynamics United Kingdom Ltd
+OUI:BC54FC*
+ ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
 
-OUI:A0B437*
- ID_OUI_FROM_DATABASE=GD Mission Systems
+OUI:547595*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:5052D2*
- ID_OUI_FROM_DATABASE=Hangzhou Telin Technologies Co., Limited
+OUI:18BC5A*
+ ID_OUI_FROM_DATABASE=Zhejiang Tmall Technology Co., Ltd.
 
-OUI:1CD6BD*
- ID_OUI_FROM_DATABASE=LEEDARSON LIGHTING CO., LTD.
+OUI:00869C*
+ ID_OUI_FROM_DATABASE=Palo Alto Networks
 
-OUI:9CDD1F*
- ID_OUI_FROM_DATABASE=Intelligent Steward Co.,Ltd
+OUI:00139D*
+ ID_OUI_FROM_DATABASE=MaxLinear Hispania S.L.U.
 
-OUI:00EBD5*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:4C16FC*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:1C7B23*
- ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
+OUI:609C9F*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:1C740D*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:000088*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:001349*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:000480*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:404A03*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:00E052*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:CC5D4E*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:748EF8*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:A0E4CB*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:48C1AC*
+ ID_OUI_FROM_DATABASE=PLANTRONICS, INC.
 
-OUI:90CF7D*
- ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
+OUI:0CE0E4*
+ ID_OUI_FROM_DATABASE=PLANTRONICS, INC.
 
-OUI:F8F082*
- ID_OUI_FROM_DATABASE=NAG LLC
+OUI:000389*
+ ID_OUI_FROM_DATABASE=PLANTRONICS, INC.
 
-OUI:40F413*
- ID_OUI_FROM_DATABASE=Rubezh
+OUI:E422A5*
+ ID_OUI_FROM_DATABASE=PLANTRONICS, INC.
 
-OUI:2C094D*
- ID_OUI_FROM_DATABASE=Raptor Engineering, LLC
+OUI:001F33*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:B0E235*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:C03F0E*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:88797E*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:0024B2*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:40C729*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:A021B7*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:AC040B*
- ID_OUI_FROM_DATABASE=Peloton Interactive, Inc
+OUI:204E7F*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:006074*
- ID_OUI_FROM_DATABASE=QSC LLC
+OUI:841B5E*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:34ED0B*
- ID_OUI_FROM_DATABASE=Shanghai XZ-COM.CO.,Ltd.
+OUI:100D7F*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:0010C1*
- ID_OUI_FROM_DATABASE=OI ELECTRIC CO.,LTD
+OUI:6CB0CE*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:4432C8*
- ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+OUI:506A03*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:E0885D*
- ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+OUI:B07FB9*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:802994*
- ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+OUI:08028E*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:206A8A*
- ID_OUI_FROM_DATABASE=Wistron Infocomm (Zhongshan) Corporation
+OUI:D8C497*
+ ID_OUI_FROM_DATABASE=Quanta Computer Inc.
 
-OUI:F0DEF1*
- ID_OUI_FROM_DATABASE=Wistron Infocomm (Zhongshan) Corporation
+OUI:444E6D*
+ ID_OUI_FROM_DATABASE=AVM Audiovisuelles Marketing und Computersysteme GmbH
 
-OUI:F80F41*
- ID_OUI_FROM_DATABASE=Wistron Infocomm (Zhongshan) Corporation
+OUI:A41566*
+ ID_OUI_FROM_DATABASE=Weifang GoerTek Technology Co.,Ltd.
 
-OUI:94DF4E*
- ID_OUI_FROM_DATABASE=Wistron InfoComm(Kunshan)Co.,Ltd.
+OUI:74E60F*
+ ID_OUI_FROM_DATABASE=TECNO MOBILE LIMITED
 
-OUI:48A9D2*
- ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
+OUI:0050C7*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:683E34*
- ID_OUI_FROM_DATABASE=MEIZU Technology Co., Ltd.
+OUI:B80B9D*
+ ID_OUI_FROM_DATABASE=ROPEX Industrie-Elektronik GmbH
 
-OUI:001EC0*
- ID_OUI_FROM_DATABASE=Microchip Technology Inc.
+OUI:001526*
+ ID_OUI_FROM_DATABASE=Remote Technologies Inc
 
-OUI:3C0771*
- ID_OUI_FROM_DATABASE=Sony Corporation
+OUI:409922*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:D8D43C*
- ID_OUI_FROM_DATABASE=Sony Corporation
+OUI:B8DB1C*
+ ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
-OUI:00A012*
- ID_OUI_FROM_DATABASE=Telco Systems, Inc.
+OUI:3C10E6*
+ ID_OUI_FROM_DATABASE=PHAZR Inc.
 
-OUI:94611E*
- ID_OUI_FROM_DATABASE=Wata Electronics Co.,Ltd.
+OUI:001987*
+ ID_OUI_FROM_DATABASE=Panasonic Mobile Communications Co.,Ltd.
 
-OUI:0025D4*
- ID_OUI_FROM_DATABASE=General Dynamics Mission Systems
+OUI:BCC342*
+ ID_OUI_FROM_DATABASE=Panasonic Communications Co., Ltd.
 
-OUI:5CA86A*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:705812*
+ ID_OUI_FROM_DATABASE=Panasonic Corporation AVC Networks Company
 
-OUI:C8778B*
- ID_OUI_FROM_DATABASE=Themis Computer
+OUI:CC7EE7*
+ ID_OUI_FROM_DATABASE=Panasonic Corporation AVC Networks Company
 
-OUI:000A68*
- ID_OUI_FROM_DATABASE=Solarflare Communications Inc
+OUI:00D060*
+ ID_OUI_FROM_DATABASE=Panasonic Europe Ltd.
 
-OUI:0CD502*
- ID_OUI_FROM_DATABASE=Westell Technologies Inc.
+OUI:84253F*
+ ID_OUI_FROM_DATABASE=silex technology, Inc.
 
-OUI:001636*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+OUI:40017A*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00C09F*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+OUI:40D63C*
+ ID_OUI_FROM_DATABASE=Equitech Industrial(DongGuan)Co.,Ltd
 
-OUI:54AB3A*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+OUI:A4E975*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:089E01*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+OUI:C0A53E*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00199D*
- ID_OUI_FROM_DATABASE=Vizio, Inc
+OUI:9800C6*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:6C0B84*
- ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
+OUI:787B8A*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:E4509A*
- ID_OUI_FROM_DATABASE=HW Communications Ltd
+OUI:3866F0*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:702900*
- ID_OUI_FROM_DATABASE=Shenzhen ChipTrip Technology Co,Ltd
+OUI:20EE28*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:204C03*
- ID_OUI_FROM_DATABASE=Aruba Networks
+OUI:08F4AB*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:90F052*
- ID_OUI_FROM_DATABASE=MEIZU Technology Co., Ltd.
+OUI:8C8590*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:000E1E*
- ID_OUI_FROM_DATABASE=QLogic Corporation
+OUI:FC017C*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:D8EB97*
- ID_OUI_FROM_DATABASE=TRENDnet, Inc.
+OUI:2CB21A*
+ ID_OUI_FROM_DATABASE=Phicomm (Shanghai) Co., Ltd.
 
-OUI:146102*
- ID_OUI_FROM_DATABASE=Alpine Electronics, Inc.
+OUI:00C0EE*
+ ID_OUI_FROM_DATABASE=KYOCERA Display Corporation
 
-OUI:9003B7*
- ID_OUI_FROM_DATABASE=PARROT SA
+OUI:28840E*
+ ID_OUI_FROM_DATABASE=silicon valley immigration service
 
-OUI:0CFE45*
- ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
+OUI:CC5A53*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:F8D0AC*
- ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
+OUI:BC2E48*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:00D9D1*
- ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
+OUI:940006*
+ ID_OUI_FROM_DATABASE=jinyoung
 
-OUI:00041F*
- ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
+OUI:5C6776*
+ ID_OUI_FROM_DATABASE=IDS Imaging Development Systems GmbH
 
-OUI:001D0D*
- ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
+OUI:28EF01*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:7CC709*
- ID_OUI_FROM_DATABASE=SHENZHEN RF-LINK TECHNOLOGY CO.,LTD.
+OUI:A875E2*
+ ID_OUI_FROM_DATABASE=Aventura Technologies, Inc.
 
-OUI:D455BE*
- ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
+OUI:DC0C2D*
+ ID_OUI_FROM_DATABASE=WEIFANG GOERTEK ELECTRONICS CO.,LTD
 
-OUI:8CA6DF*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:00173A*
+ ID_OUI_FROM_DATABASE=Cloudastructure Inc
 
-OUI:00E091*
- ID_OUI_FROM_DATABASE=LG Electronics
+OUI:38D620*
+ ID_OUI_FROM_DATABASE=Limidea Concept Pte. Ltd.
 
-OUI:6CD032*
- ID_OUI_FROM_DATABASE=LG Electronics
+OUI:745C4B*
+ ID_OUI_FROM_DATABASE=GN Audio A/S
 
-OUI:C041F6*
- ID_OUI_FROM_DATABASE=LG ELECTRONICS INC
+OUI:64FB50*
+ ID_OUI_FROM_DATABASE=RoomReady/Zdi, Inc.
 
-OUI:404AD4*
- ID_OUI_FROM_DATABASE=Widex A/S
+OUI:940E6B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0021FB*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:38378B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:8C3AE3*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:5C2BF5*
+ ID_OUI_FROM_DATABASE=Vivint Wireless Inc.
 
-OUI:30766F*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:00FC8B*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:F80CF3*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:10F163*
+ ID_OUI_FROM_DATABASE=TNK CO.,LTD
 
-OUI:0022CF*
- ID_OUI_FROM_DATABASE=PLANEX COMMUNICATIONS INC.
+OUI:98F5A9*
+ ID_OUI_FROM_DATABASE=OHSUNG
 
-OUI:A84E3F*
- ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
+OUI:5033F0*
+ ID_OUI_FROM_DATABASE=YICHEN (SHENZHEN) TECHNOLOGY CO.LTD
 
-OUI:00A742*
+OUI:50F722*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:6CA858*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
-
-OUI:001478*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
-
-OUI:00167A*
- ID_OUI_FROM_DATABASE=Skyworth Overseas Development Ltd.
+OUI:90FD9F*
+ ID_OUI_FROM_DATABASE=Silicon Laboratories
 
-OUI:28BE03*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:504EDC*
+ ID_OUI_FROM_DATABASE=Ping Communication
 
-OUI:F4C613*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
+OUI:344B3D*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:D826B9*
- ID_OUI_FROM_DATABASE=Guangdong Coagent Electronics S&amp;T Co.,Ltd.
+OUI:E42F26*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:FCB0C4*
- ID_OUI_FROM_DATABASE=Shanghai DareGlobal Technologies Co.,Ltd
+OUI:BC9889*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:24AF4A*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent IPD
+OUI:1088CE*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:001AF0*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent IPD
+OUI:FCF647*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:AC9CE4*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
+OUI:74CC39*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:D84710*
- ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
+OUI:6CA858*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:000E40*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:341A35*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:001158*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:18D225*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:0011F9*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:185282*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:000F6A*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:BC4101*
+ ID_OUI_FROM_DATABASE=Shenzhen TINNO Mobile Technology Corp.
 
-OUI:001283*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:5C8D2D*
+ ID_OUI_FROM_DATABASE=Shanghai Wellpay Information Technology Co., Ltd
 
-OUI:000438*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:70B921*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:002347*
- ID_OUI_FROM_DATABASE=ProCurve Networking by HP
+OUI:C850E9*
+ ID_OUI_FROM_DATABASE=Raisecom Technology CO., LTD
 
-OUI:002561*
- ID_OUI_FROM_DATABASE=ProCurve Networking by HP
+OUI:BC825D*
+ ID_OUI_FROM_DATABASE=MITSUMI ELECTRIC CO.,LTD.
 
-OUI:008058*
- ID_OUI_FROM_DATABASE=PRINTER SYSTEMS CORP.
+OUI:5CA176*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
 
-OUI:00140D*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:C8E7F0*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:001765*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:087808*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0018B0*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:D03169*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001B25*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:BC5451*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001DAF*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:24F5A2*
+ ID_OUI_FROM_DATABASE=Belkin International Inc.
 
-OUI:00166D*
- ID_OUI_FROM_DATABASE=Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd
+OUI:782D7E*
+ ID_OUI_FROM_DATABASE=TRENDnet, Inc.
 
-OUI:0016F2*
- ID_OUI_FROM_DATABASE=Dmobile System Co., Ltd.
+OUI:BCC31B*
+ ID_OUI_FROM_DATABASE=Kygo Life AS
 
-OUI:000138*
- ID_OUI_FROM_DATABASE=XAVi Technologies Corp.
+OUI:FCD6BD*
+ ID_OUI_FROM_DATABASE=Robert Bosch GmbH
 
-OUI:3C9157*
- ID_OUI_FROM_DATABASE=Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd
+OUI:48BA4E*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:0000D8*
- ID_OUI_FROM_DATABASE=Novell, Inc.
+OUI:FC65DE*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:001087*
- ID_OUI_FROM_DATABASE=XSTREAMIS PLC
+OUI:B06EBF*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:7C0623*
- ID_OUI_FROM_DATABASE=Ultra Electronics Sonar System Division
+OUI:28AD3E*
+ ID_OUI_FROM_DATABASE=Shenzhen TONG BO WEI Technology CO.,LTD
 
-OUI:002555*
- ID_OUI_FROM_DATABASE=Visonic Technologies 1993 Ltd.
+OUI:F092B4*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
 
-OUI:009058*
- ID_OUI_FROM_DATABASE=Ultra Electronics Limited (AEP Networks)
+OUI:D86CE9*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:48FD8E*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:3C81D8*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:244427*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:2CE412*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:B4A984*
- ID_OUI_FROM_DATABASE=Symantec Corporation
+OUI:181E78*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:34074F*
- ID_OUI_FROM_DATABASE=AccelStor, Inc.
+OUI:0037B7*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:248A07*
- ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
+OUI:0014BF*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
-OUI:00258B*
- ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
+OUI:6C8DC1*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:3C2DB7*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:38CADA*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0023D4*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:8C579B*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
-OUI:001831*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:B436A9*
+ ID_OUI_FROM_DATABASE=Fibocom Wireless Inc.
 
-OUI:D08CB5*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:6416F0*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:B4EED4*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:48DB50*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:CC8CE3*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:2400BA*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:102EAF*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:68DBCA*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:647BD4*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:044BED*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0017E8*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:3CBB73*
+ ID_OUI_FROM_DATABASE=Shenzhen Xinguodu Technology Co., Ltd.
 
-OUI:0017E6*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:3CCF5B*
+ ID_OUI_FROM_DATABASE=ICOMM HK LIMITED
 
-OUI:B0B448*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:F40304*
+ ID_OUI_FROM_DATABASE=Google, Inc.
 
-OUI:505663*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:78ACC0*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:3C7DB1*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:3C9066*
+ ID_OUI_FROM_DATABASE=SmartRG, Inc.
 
-OUI:40984E*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:00195B*
+ ID_OUI_FROM_DATABASE=D-Link Corporation
 
-OUI:0012D1*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:000D88*
+ ID_OUI_FROM_DATABASE=D-Link Corporation
 
-OUI:88C255*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:001346*
+ ID_OUI_FROM_DATABASE=D-Link Corporation
 
-OUI:E0C79D*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:205532*
+ ID_OUI_FROM_DATABASE=Gotech International Technology Limited
 
-OUI:9059AF*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:002401*
+ ID_OUI_FROM_DATABASE=D-Link Corporation
 
-OUI:B4994C*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:1CAFF7*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:70FF76*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:B8A386*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:507224*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:C8D3A3*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:440444*
- ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+OUI:4419B6*
+ ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
 
-OUI:506583*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:C056E3*
+ ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
 
-OUI:BC282C*
- ID_OUI_FROM_DATABASE=e-Smart Systems Pvt. Ltd
+OUI:C8E7D8*
+ ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
 
-OUI:546C0E*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:9CEFD5*
+ ID_OUI_FROM_DATABASE=Panda Wireless, Inc.
 
-OUI:F85C4D*
- ID_OUI_FROM_DATABASE=NOKIA
+OUI:C02C7A*
+ ID_OUI_FROM_DATABASE=Shenzhen Horn Audio Co.,Ltd.
 
-OUI:D013FD*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:88B8D0*
+ ID_OUI_FROM_DATABASE=Dongguan Koppo Electronic Co.,Ltd
 
-OUI:D8E72B*
- ID_OUI_FROM_DATABASE=NetScout Systems, Inc.
+OUI:38E7D8*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:04FEA1*
- ID_OUI_FROM_DATABASE=Fihonest communication co.,Ltd
+OUI:D8B377*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:2CAC44*
- ID_OUI_FROM_DATABASE=CONEXTOP
+OUI:B4CEF6*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:A8BD27*
- ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
+OUI:D40B1A*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:981E0F*
- ID_OUI_FROM_DATABASE=Jeelan (Shanghai Jeelan Technology Information Inc
+OUI:A08D16*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:548CA0*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:601888*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:707E43*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:8002DF*
+ ID_OUI_FROM_DATABASE=ORA Inc.
 
-OUI:1C1448*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:D8FC38*
+ ID_OUI_FROM_DATABASE=Giantec Semiconductor Inc
 
-OUI:A47AA4*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:2C6798*
+ ID_OUI_FROM_DATABASE=InTalTech Ltd.
 
-OUI:001AAD*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:D0BF9C*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:E83EFC*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:B05ADA*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:E8892C*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:001083*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:001DD3*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:0001E6*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:3CDFA9*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:C44044*
+ ID_OUI_FROM_DATABASE=RackTop Systems Inc.
 
-OUI:8C09F4*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:3898D8*
+ ID_OUI_FROM_DATABASE=MERITECH CO.,LTD
 
-OUI:083E0C*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:000CF1*
+ ID_OUI_FROM_DATABASE=Intel Corporation
 
-OUI:D404CD*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:000E0C*
+ ID_OUI_FROM_DATABASE=Intel Corporation
 
-OUI:203D66*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:BC0F64*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:6455B1*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:6CA100*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:C005C2*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:94659C*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:001225*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:1002B5*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00128A*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:441EA1*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:0003E0*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:D8D385*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:0015D1*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:18A905*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:E46449*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:00237D*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:745612*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:002655*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:74EAE8*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:001560*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:A811FC*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:288023*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:044E5A*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:645106*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:94E8C5*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:5CB901*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:F8A097*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:DC4A3E*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:BC644B*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:2C59E5*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:347A60*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:9CB654*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:0023ED*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:38EAA7*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:002395*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:E83935*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:0022B4*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:08EB74*
+ ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
 
-OUI:002136*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:6CB56B*
+ ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
 
-OUI:0024C1*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:940937*
+ ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
 
-OUI:3C754A*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:403DEC*
+ ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
 
-OUI:40FC89*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:E84DD0*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:002493*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:140467*
+ ID_OUI_FROM_DATABASE=SNK Technologies Co.,Ltd.
 
-OUI:00195E*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:EC5F23*
+ ID_OUI_FROM_DATABASE=Qinghai Kimascend Electronics Technology Co. Ltd.
 
-OUI:001404*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:047D50*
+ ID_OUI_FROM_DATABASE=Shenzhen Kang Ying Technology Co.Ltd.
 
-OUI:001BDD*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:54EFFE*
+ ID_OUI_FROM_DATABASE=Fullpower Technologies, Inc.
 
-OUI:0023A2*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:EC52DC*
+ ID_OUI_FROM_DATABASE=WORLD MEDIA AND TECHNOLOGY Corp.
 
-OUI:001E8D*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:A4D18C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00230B*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:CC25EF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:001B52*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:240995*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:84E058*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:247F3C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:003676*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:1C8E5C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001CA8*
- ID_OUI_FROM_DATABASE=AirTies Wireless Networks
+OUI:94772B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001EE2*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F4E3FB*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001C43*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:04021F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001D25*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:0034FE*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:3C5A37*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:D02DB3*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:549B12*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:086361*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:3C8BFE*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F80113*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00265D*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:70723C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:D4E8B2*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:5C7D5E*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0017D5*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:4C8BEF*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001247*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:20F3A3*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:78521A*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:ACE87B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:E4121D*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:688F84*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:684898*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:4CAC0A*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:F409D8*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
+OUI:0026ED*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:B479A7*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
+OUI:002293*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:18D276*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:FCD733*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:1C66AA*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:10A5D0*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:58C38B*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:D4C9B2*
+ ID_OUI_FROM_DATABASE=Quanergy Systems Inc
 
-OUI:0808C2*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:E4CE02*
+ ID_OUI_FROM_DATABASE=WyreStorm Technologies Ltd
 
-OUI:B0C4E7*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:2002AF*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:D890E8*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:0026E8*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:34AA8B*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:ECCB30*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:002339*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:786A89*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:D487D8*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:2008ED*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:184617*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:509F27*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:5001BB*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:CC96A0*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:380A94*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:54A51B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:D857EF*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F4C714*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:24C696*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:286ED4*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:181EB0*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:04F938*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:20D390*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:FC48EF*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:343111*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:80FB06*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:34BE00*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:D4B110*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:50CCF8*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
+OUI:CC53B5*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:980C82*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
+OUI:002127*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:002119*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
+OUI:54E6FC*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:7825AD*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:D85D4C*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:F4D9FB*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F81A67*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:0017C9*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F0F336*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:00166B*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:44B32D*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:00166C*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F07816*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:E47CF9*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:001310*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
-OUI:002454*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:0023BE*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:5C0A5B*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
+OUI:54D46F*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:90187C*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
+OUI:24374C*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:FC1F19*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
+OUI:BCC810*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:20D5BF*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:484487*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:30CDA7*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:445829*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:00749C*
- ID_OUI_FROM_DATABASE=RUIJIE NETWORKS CO., LTD.
+OUI:481D70*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:300ED5*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:00214F*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
 
-OUI:D02788*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:00E036*
+ ID_OUI_FROM_DATABASE=PIONEER CORPORATION
 
-OUI:0014A4*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:E0AE5E*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
 
-OUI:0016CE*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:34C731*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
 
-OUI:001DD9*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:60380E*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
 
-OUI:001FE2*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:64D4BD*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
 
-OUI:48E244*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:00000C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:30F772*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:004096*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:90489A*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:30F70D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:543530*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:B07D47*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:C03896*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:D8B190*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:2C337A*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:F0B2E5*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:ACD1B8*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:188B9D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:9439E5*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:38ED18*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:506313*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:ECBD1D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:78E400*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:DCCEC1*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:40490F*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:84B261*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:28565A*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:70E422*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001F3A*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:0050BD*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:002269*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:009086*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:5C8613*
- ID_OUI_FROM_DATABASE=Beijing Zhoenet Technology Co., Ltd
+OUI:005054*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:8C7CB5*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:3C0E23*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:EC55F9*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:90E6BA*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:C8B21E*
- ID_OUI_FROM_DATABASE=CHIPSEA TECHNOLOGIES (SHENZHEN) CORP.
+OUI:BCAEC5*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:B072BF*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:10BF48*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:600B03*
- ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+OUI:A80C0D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:503F98*
- ID_OUI_FROM_DATABASE=CMITECH
+OUI:B83861*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:C09F05*
- ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+OUI:6C9989*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:AC63BE*
- ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+OUI:580A20*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:38521A*
- ID_OUI_FROM_DATABASE=Nokia
+OUI:0050D1*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:A41437*
- ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
+OUI:00500B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:884CCF*
- ID_OUI_FROM_DATABASE=Pulzze Systems, Inc
+OUI:005073*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:84DBFC*
- ID_OUI_FROM_DATABASE=Nokia
+OUI:00603E*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:143E60*
- ID_OUI_FROM_DATABASE=Nokia
+OUI:00E034*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:D4E33F*
- ID_OUI_FROM_DATABASE=Nokia
+OUI:001868*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:00233A*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:887556*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:C87E75*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:60735C*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:5454CF*
- ID_OUI_FROM_DATABASE=PROBEDIGITAL CO.,LTD
+OUI:FC9947*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:F0D5BF*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:7CC537*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:748A69*
- ID_OUI_FROM_DATABASE=Korea Image Technology Co., Ltd
+OUI:70CD60*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:1C9D3E*
- ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
+OUI:24AB81*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:30B64F*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:581FAA*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:DC0D30*
- ID_OUI_FROM_DATABASE=Shenzhen Feasycom Technology Co., Ltd.
+OUI:A46706*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:008731*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:3C0754*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:B4EFFA*
- ID_OUI_FROM_DATABASE=Lemobile Information Technology (Beijing) Co., Ltd.
+OUI:E4CE8F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0005EE*
- ID_OUI_FROM_DATABASE=Vanderbilt International (SWE) AB
+OUI:E8040B*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:9495A0*
- ID_OUI_FROM_DATABASE=Google, Inc.
+OUI:B8C75D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:CCFD17*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:403CFC*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:4CF95D*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:286AB8*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:8421F1*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:7CC3A1*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:707990*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:00E16D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:38D547*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:F8C288*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:248894*
- ID_OUI_FROM_DATABASE=shenzhen lensun Communication Technology LTD
+OUI:E0ACF1*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:60A4D0*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:FC5B39*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:3C8BCD*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
+OUI:346F90*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:E43ED7*
- ID_OUI_FROM_DATABASE=Arcadyan Corporation
+OUI:E0D173*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:38A4ED*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:74A02F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00B0CE*
- ID_OUI_FROM_DATABASE=Viveris Technologies
+OUI:547C69*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:E00DB9*
- ID_OUI_FROM_DATABASE=Cree, Inc.
+OUI:689CE2*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:40FE0D*
- ID_OUI_FROM_DATABASE=MAXIO
+OUI:40A6E8*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:609AC1*
+OUI:B8782E*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:F07960*
+OUI:000502*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:9C8BA0*
+OUI:0010FA*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:9840BB*
- ID_OUI_FROM_DATABASE=Dell Inc.
-
-OUI:CC2D83*
- ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+OUI:000393*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:4C3275*
+OUI:0016CB*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:E04FBD*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+OUI:0017F2*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:ACE77B*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+OUI:001B63*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00B0E1*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001EC2*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0006F4*
- ID_OUI_FROM_DATABASE=Prime Electronics & Satellitics Inc.
+OUI:002608*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:24A43C*
- ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
+OUI:7C6D62*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:28EE52*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:40D32D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:D4E90B*
- ID_OUI_FROM_DATABASE=CVT CO.,LTD
+OUI:D83062*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:788A20*
- ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
+OUI:C42C03*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:905C44*
- ID_OUI_FROM_DATABASE=Compal Broadband Networks, Inc.
+OUI:6C2056*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:FC372B*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+OUI:BC1665*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0CD86C*
- ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
+OUI:44ADD9*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:8C60E7*
- ID_OUI_FROM_DATABASE=MPGIO CO.,LTD
+OUI:0C2724*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:2C0E3D*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
+OUI:6C416A*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:24C44A*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:F872EA*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:B83A9D*
- ID_OUI_FROM_DATABASE=Alarm.com
+OUI:0C6803*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00BBC1*
- ID_OUI_FROM_DATABASE=CANON INC.
+OUI:789F70*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:2CC260*
- ID_OUI_FROM_DATABASE=Oracle Corporation
+OUI:DC3714*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:1C14B3*
- ID_OUI_FROM_DATABASE=Airwire Technologies
+OUI:40331A*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:407183*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:94F6A3*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0059DC*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D81D72*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:14612F*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:70ECE4*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:D86CE9*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:38C986*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:3C81D8*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:FCFC48*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:2CE412*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:2857BE*
+ ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
 
-OUI:181E78*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:50D59C*
+ ID_OUI_FROM_DATABASE=Thai Habel Industrial Co., Ltd.
 
-OUI:0037B7*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:FCA386*
+ ID_OUI_FROM_DATABASE=SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD
 
-OUI:0014BF*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:F0F249*
+ ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
 
-OUI:6C8DC1*
+OUI:A4C361*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:38CADA*
+OUI:AC7F3E*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:8C579B*
- ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
+OUI:280B5C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:B436A9*
- ID_OUI_FROM_DATABASE=Fibocom Wireless Inc.
+OUI:90B931*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:6416F0*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:24A2E1*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:48DB50*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:80EA96*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:2400BA*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:600308*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:68DBCA*
+OUI:04F13E*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:044BED*
+OUI:54724F*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:3CBB73*
- ID_OUI_FROM_DATABASE=Shenzhen Xinguodu Technology Co., Ltd.
+OUI:48746E*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:3CCF5B*
- ID_OUI_FROM_DATABASE=ICOMM HK LIMITED
+OUI:3CAB8E*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:F40304*
- ID_OUI_FROM_DATABASE=Google, Inc.
+OUI:7C6DF8*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:78ACC0*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:48D705*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:3C9066*
- ID_OUI_FROM_DATABASE=SmartRG, Inc.
+OUI:3CD0F8*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00195B*
- ID_OUI_FROM_DATABASE=D-Link Corporation
+OUI:98D6BB*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:000D88*
- ID_OUI_FROM_DATABASE=D-Link Corporation
+OUI:4CB199*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:001346*
- ID_OUI_FROM_DATABASE=D-Link Corporation
+OUI:64E682*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:205532*
- ID_OUI_FROM_DATABASE=Gotech International Technology Limited
+OUI:804971*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:002401*
- ID_OUI_FROM_DATABASE=D-Link Corporation
+OUI:98FE94*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:1CAFF7*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:D8004D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:B8A386*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:98B8E3*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:C8D3A3*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:80929F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:4419B6*
- ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
+OUI:885395*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:C056E3*
- ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
+OUI:9C04EB*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:C8E7D8*
- ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
+OUI:78FD94*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:E01C41*
- ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
+OUI:C88550*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:D854A2*
- ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
+OUI:D4F46F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:9CEFD5*
- ID_OUI_FROM_DATABASE=Panda Wireless, Inc.
+OUI:787E61*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:C02C7A*
- ID_OUI_FROM_DATABASE=Shenzhen Horn Audio Co.,Ltd.
+OUI:60F81D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:88B8D0*
- ID_OUI_FROM_DATABASE=Dongguan Koppo Electronic Co.,Ltd
+OUI:4C7C5F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:38E7D8*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:48E9F1*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:D8B377*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:FCE998*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:B4CEF6*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:F099BF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:D40B1A*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:68644B*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:A08D16*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:A8968A*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:601888*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:4C8D79*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:8002DF*
- ID_OUI_FROM_DATABASE=ORA Inc.
+OUI:207D74*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:D8FC38*
- ID_OUI_FROM_DATABASE=Giantec Semiconductor Inc
+OUI:F4F15A*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:2C6798*
- ID_OUI_FROM_DATABASE=InTalTech Ltd.
+OUI:042665*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:D0BF9C*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:2CB43A*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:B05ADA*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:689C70*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:001083*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:087045*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0001E6*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:CCE0C3*
+ ID_OUI_FROM_DATABASE=Mangstor, Inc.
 
-OUI:C44044*
- ID_OUI_FROM_DATABASE=RackTop Systems Inc.
+OUI:84A423*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:3898D8*
- ID_OUI_FROM_DATABASE=MERITECH CO.,LTD
+OUI:346987*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:C8675E*
- ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
+OUI:58685D*
+ ID_OUI_FROM_DATABASE=Tempo Australia Pty Ltd
 
-OUI:000CF1*
- ID_OUI_FROM_DATABASE=Intel Corporation
+OUI:789C85*
+ ID_OUI_FROM_DATABASE=August Home, Inc.
 
-OUI:000E0C*
- ID_OUI_FROM_DATABASE=Intel Corporation
+OUI:FCCF43*
+ ID_OUI_FROM_DATABASE=HUIZHOU CITY HUIYANG DISTRICT MEISIQI INDUSTRY DEVELOPMENT CO,.LTD
 
-OUI:BC0F64*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:5882A8*
+ ID_OUI_FROM_DATABASE=Microsoft
 
-OUI:6CA100*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:B4EF04*
+ ID_OUI_FROM_DATABASE=DAIHAN Scientific Co., Ltd.
 
-OUI:94659C*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:049645*
+ ID_OUI_FROM_DATABASE=WUXI SKY CHIP INTERCONNECTION TECHNOLOGY CO.,LTD.
 
-OUI:1002B5*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:C8C2C6*
+ ID_OUI_FROM_DATABASE=Shanghai Airm2m Communication Technology Co., Ltd
 
-OUI:A468BC*
- ID_OUI_FROM_DATABASE=Private
+OUI:EC64E7*
+ ID_OUI_FROM_DATABASE=MOCACARE Corporation
 
-OUI:441EA1*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:D07C2D*
+ ID_OUI_FROM_DATABASE=Leie IOT technology Co., Ltd
 
-OUI:D8D385*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:40862E*
+ ID_OUI_FROM_DATABASE=JDM MOBILE INTERNET SOLUTION CO., LTD.
 
-OUI:18A905*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:EC388F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00237D*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:BC9C31*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:002655*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:90C99B*
+ ID_OUI_FROM_DATABASE=Recore Systems
 
-OUI:001560*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:5CB559*
+ ID_OUI_FROM_DATABASE=CNEX Labs
 
-OUI:288023*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:5CCF7F*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
 
-OUI:645106*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:380546*
+ ID_OUI_FROM_DATABASE=Foctek Photonics, Inc.
 
-OUI:5CB901*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:6858C5*
+ ID_OUI_FROM_DATABASE=ZF TRW Automotive
 
-OUI:DC4A3E*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:044169*
+ ID_OUI_FROM_DATABASE=GoPro
 
-OUI:2C59E5*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:ACC51B*
+ ID_OUI_FROM_DATABASE=Zhuhai Pantum Electronics Co., Ltd.
 
-OUI:9CB654*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:E80734*
+ ID_OUI_FROM_DATABASE=Champion Optical Network Engineering, LLC
 
-OUI:38EAA7*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:6CEBB2*
+ ID_OUI_FROM_DATABASE=Dongguan Sen DongLv Electronics Co.,Ltd
 
-OUI:E83935*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:A03299*
+ ID_OUI_FROM_DATABASE=Lenovo (Beijing) Co., Ltd.
 
-OUI:08EB74*
- ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
+OUI:A845CD*
+ ID_OUI_FROM_DATABASE=Siselectron Technology LTD.
 
-OUI:6CB56B*
- ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
+OUI:D0C193*
+ ID_OUI_FROM_DATABASE=SKYBELL, INC
 
-OUI:940937*
- ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
+OUI:209BCD*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:403DEC*
- ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
+OUI:F0B0E7*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:E84DD0*
+OUI:CC20E8*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:E435C8*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:D81FCC*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:D47208*
+ ID_OUI_FROM_DATABASE=Bragi GmbH
 
-OUI:140467*
- ID_OUI_FROM_DATABASE=SNK Technologies Co.,Ltd.
+OUI:489A42*
+ ID_OUI_FROM_DATABASE=Technomate Ltd
 
-OUI:EC5F23*
- ID_OUI_FROM_DATABASE=Qinghai Kimascend Electronics Technology Co. Ltd.
+OUI:B49D0B*
+ ID_OUI_FROM_DATABASE=BQ
 
-OUI:047D50*
- ID_OUI_FROM_DATABASE=Shenzhen Kang Ying Technology Co.Ltd.
+OUI:98CB27*
+ ID_OUI_FROM_DATABASE=Galore Networks Pvt. Ltd.
 
-OUI:54EFFE*
- ID_OUI_FROM_DATABASE=Fullpower Technologies, Inc.
+OUI:30D32D*
+ ID_OUI_FROM_DATABASE=devolo AG
 
-OUI:EC52DC*
- ID_OUI_FROM_DATABASE=WORLD MEDIA AND TECHNOLOGY Corp.
+OUI:CC794A*
+ ID_OUI_FROM_DATABASE=BLU Products Inc.
 
-OUI:A4D18C*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:60FD56*
+ ID_OUI_FROM_DATABASE=WOORISYSTEMS CO., Ltd
 
-OUI:CC25EF*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:483974*
+ ID_OUI_FROM_DATABASE=Proware Technologies Co., Ltd.
 
-OUI:240995*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:E855B4*
+ ID_OUI_FROM_DATABASE=SAI Technology Inc.
 
-OUI:247F3C*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:9CA69D*
+ ID_OUI_FROM_DATABASE=Whaley Technology Co.Ltd
 
-OUI:1C8E5C*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:342606*
+ ID_OUI_FROM_DATABASE=CarePredict, Inc.
 
-OUI:94772B*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:B4AE2B*
+ ID_OUI_FROM_DATABASE=Microsoft
 
-OUI:F4E3FB*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:80EB77*
+ ID_OUI_FROM_DATABASE=Wistron Corporation
 
-OUI:04021F*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:B88981*
+ ID_OUI_FROM_DATABASE=Chengdu InnoThings Technology Co., Ltd.
 
-OUI:0034FE*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:B4293D*
+ ID_OUI_FROM_DATABASE=Shenzhen Urovo Technology Co.,Ltd.
 
-OUI:D02DB3*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:906FA9*
+ ID_OUI_FROM_DATABASE=NANJING PUTIAN TELECOMMUNICATIONS TECHNOLOGY CO.,LTD.
 
-OUI:086361*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:14B370*
+ ID_OUI_FROM_DATABASE=Gigaset Digital Technology (Shenzhen) Co., Ltd.
 
-OUI:F80113*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:FC2FEF*
+ ID_OUI_FROM_DATABASE=UTT Technologies Co., Ltd.
 
-OUI:70723C*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:EC21E5*
+ ID_OUI_FROM_DATABASE=Toshiba
 
-OUI:5C7D5E*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:44FDA3*
+ ID_OUI_FROM_DATABASE=Everysight LTD.
 
-OUI:4C8BEF*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:84D4C8*
+ ID_OUI_FROM_DATABASE=Widex A/S
 
-OUI:20F3A3*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:247260*
+ ID_OUI_FROM_DATABASE=IOTTECH Corp
 
-OUI:ACE87B*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:44975A*
+ ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
 
-OUI:688F84*
+OUI:584822*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+
+OUI:F8BF09*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:ACF7F3*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:B4B265*
+ ID_OUI_FROM_DATABASE=DAEHO I&T
 
-OUI:889471*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:081FEB*
+ ID_OUI_FROM_DATABASE=BinCube
 
-OUI:CC4E24*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:785F4C*
+ ID_OUI_FROM_DATABASE=Argox Information Co., Ltd.
 
-OUI:50EB1A*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:5870C6*
+ ID_OUI_FROM_DATABASE=Shanghai Xiaoyi Technology Co., Ltd.
 
-OUI:0027F8*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:803B2A*
+ ID_OUI_FROM_DATABASE=ABB Xiamen Low Voltage Equipment Co.,Ltd.
 
-OUI:000533*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:A0A65C*
+ ID_OUI_FROM_DATABASE=Supercomputing Systems AG
 
-OUI:0060DF*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
+OUI:5CB395*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:4CAC0A*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:C412F5*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:0026ED*
+OUI:44F436*
  ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:002293*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:349B5B*
+ ID_OUI_FROM_DATABASE=Maquet GmbH
 
-OUI:FCD733*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:E861BE*
+ ID_OUI_FROM_DATABASE=Melec Inc.
 
-OUI:10A5D0*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:54B80A*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:D4C9B2*
- ID_OUI_FROM_DATABASE=Quanergy Systems Inc
+OUI:D8ADDD*
+ ID_OUI_FROM_DATABASE=Sonavation, Inc.
 
-OUI:E4CE02*
- ID_OUI_FROM_DATABASE=WyreStorm Technologies Ltd
+OUI:C09A71*
+ ID_OUI_FROM_DATABASE=XIAMEN MEITU MOBILE TECHNOLOGY CO.LTD
 
-OUI:2002AF*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:340B40*
+ ID_OUI_FROM_DATABASE=MIOS ELETTRONICA SRL
 
-OUI:0026E8*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:944A0C*
+ ID_OUI_FROM_DATABASE=Sercomm Corporation
 
-OUI:ECCB30*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:D02516*
+ ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
 
-OUI:786A89*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:D05C7A*
+ ID_OUI_FROM_DATABASE=Sartura d.o.o.
 
-OUI:2008ED*
+OUI:9C37F4*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:509F27*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:5CEB68*
+ ID_OUI_FROM_DATABASE=Cheerstar Technology Co., Ltd
 
-OUI:CC96A0*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:F46A92*
+ ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
 
-OUI:54A51B*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:14AEDB*
+ ID_OUI_FROM_DATABASE=VTech Telecommunications Ltd.
 
-OUI:F4C714*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:B8C3BF*
+ ID_OUI_FROM_DATABASE=Henan Chengshi NetWork Technology Co.,Ltd
 
-OUI:286ED4*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:C0EE40*
+ ID_OUI_FROM_DATABASE=Laird Technologies
 
-OUI:A01290*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:F0182B*
+ ID_OUI_FROM_DATABASE=LG Chem
 
-OUI:F81547*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:CC5FBF*
+ ID_OUI_FROM_DATABASE=Topwise 3G Communication Co., Ltd.
 
-OUI:506184*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:14DDA9*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:BCADAB*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:485D36*
+ ID_OUI_FROM_DATABASE=Verizon
 
-OUI:B4A95A*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:EC60E0*
+ ID_OUI_FROM_DATABASE=AVI-ON LABS
 
-OUI:3C3A73*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:145A83*
+ ID_OUI_FROM_DATABASE=Logi-D inc
 
-OUI:04F938*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:4CEEB0*
+ ID_OUI_FROM_DATABASE=SHC Netzwerktechnik GmbH
 
-OUI:FC48EF*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:188EF9*
+ ID_OUI_FROM_DATABASE=G2C Co. Ltd.
 
-OUI:80FB06*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:F4E9D4*
+ ID_OUI_FROM_DATABASE=QLogic Corporation
 
-OUI:D4B110*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:1422DB*
+ ID_OUI_FROM_DATABASE=eero inc.
 
-OUI:CC53B5*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:0C413E*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
 
-OUI:002127*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:007E56*
+ ID_OUI_FROM_DATABASE=China Dragon Technology Limited
 
-OUI:54E6FC*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:086266*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:D85D4C*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:346C0F*
+ ID_OUI_FROM_DATABASE=Pramod Telecom Pvt. Ltd
 
-OUI:F81A67*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:3C912B*
+ ID_OUI_FROM_DATABASE=Vexata Inc
 
-OUI:F0F336*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:54369B*
+ ID_OUI_FROM_DATABASE=1Verge Internet Technology (Beijing) Co., Ltd.
 
-OUI:44B32D*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:E4FED9*
+ ID_OUI_FROM_DATABASE=EDMI Europe Ltd
 
-OUI:F07816*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:2852E0*
+ ID_OUI_FROM_DATABASE=Layon international Electronic & Telecom Co.,Ltd
 
-OUI:001310*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:E48501*
+ ID_OUI_FROM_DATABASE=Geberit International AG
 
-OUI:0023BE*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:1C3947*
+ ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
 
-OUI:54D46F*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:2CAD13*
+ ID_OUI_FROM_DATABASE=SHENZHEN ZHILU TECHNOLOGY CO.,LTD
 
-OUI:24374C*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:68B983*
+ ID_OUI_FROM_DATABASE=b-plus GmbH
 
-OUI:BCC810*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:BC74D7*
+ ID_OUI_FROM_DATABASE=HangZhou JuRu Technology CO.,LTD
 
-OUI:484487*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:E88E60*
+ ID_OUI_FROM_DATABASE=NSD Corporation
 
-OUI:445829*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:545146*
+ ID_OUI_FROM_DATABASE=AMG Systems Ltd.
 
-OUI:481D70*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:84DDB7*
+ ID_OUI_FROM_DATABASE=Cilag GmbH International
 
-OUI:00214F*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:78EB14*
+ ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
 
-OUI:00E036*
- ID_OUI_FROM_DATABASE=PIONEER CORPORATION
+OUI:D05BA8*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:E0AE5E*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:8CE78C*
+ ID_OUI_FROM_DATABASE=DK Networks
 
-OUI:34C731*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:E4BAD9*
+ ID_OUI_FROM_DATABASE=360 Fly Inc.
 
-OUI:60380E*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:7C3CB6*
+ ID_OUI_FROM_DATABASE=Shenzhen Homecare Technology Co.,Ltd.
 
-OUI:64D4BD*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:BCE767*
+ ID_OUI_FROM_DATABASE=Quanzhou  TDX Electronics Co., Ltd
 
-OUI:00000C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:6CA7FA*
+ ID_OUI_FROM_DATABASE=YOUNGBO ENGINEERING INC.
 
-OUI:004096*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D0929E*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
 
-OUI:30F70D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:F4032F*
+ ID_OUI_FROM_DATABASE=Reduxio Systems
 
-OUI:B07D47*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:84CFBF*
+ ID_OUI_FROM_DATABASE=Fairphone
 
-OUI:D8B190*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:AC9E17*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:F0B2E5*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:ACC73F*
+ ID_OUI_FROM_DATABASE=VITSMO CO., LTD.
 
-OUI:188B9D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:18BDAD*
+ ID_OUI_FROM_DATABASE=L-TECH CORPORATION
 
-OUI:38ED18*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:10C07C*
+ ID_OUI_FROM_DATABASE=Blu-ray Disc Association
 
-OUI:ECBD1D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:B87879*
+ ID_OUI_FROM_DATABASE=Roche Diagnostics GmbH
 
-OUI:DCCEC1*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:4480EB*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:84B261*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D06F4A*
+ ID_OUI_FROM_DATABASE=TOPWELL INTERNATIONAL HOLDINGS LIMITED
 
-OUI:009EC8*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:BC54F9*
+ ID_OUI_FROM_DATABASE=Drogoo Technology Co., Ltd.
 
-OUI:7C1DD9*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:349E34*
+ ID_OUI_FROM_DATABASE=Evervictory Electronic Co.Ltd
 
-OUI:A086C6*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:A0C2DE*
+ ID_OUI_FROM_DATABASE=Costar Video Systems
 
-OUI:584498*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:3809A4*
+ ID_OUI_FROM_DATABASE=Firefly Integrations
 
-OUI:70E422*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00A509*
+ ID_OUI_FROM_DATABASE=WigWag Inc.
 
-OUI:0050BD*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:A86405*
+ ID_OUI_FROM_DATABASE=nimbus 9, Inc
 
-OUI:009086*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:7076FF*
+ ID_OUI_FROM_DATABASE=KERLINK
 
-OUI:005054*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:68F0BC*
+ ID_OUI_FROM_DATABASE=Shenzhen LiWiFi Technology Co., Ltd
 
-OUI:3C0E23*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:BCD165*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:90E6BA*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:4CA928*
+ ID_OUI_FROM_DATABASE=Insensi
 
-OUI:BCAEC5*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:2884FA*
+ ID_OUI_FROM_DATABASE=SHARP Corporation
 
-OUI:10BF48*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:3C1E04*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:A80C0D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:E0FFF7*
+ ID_OUI_FROM_DATABASE=Softiron Inc.
 
-OUI:B83861*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:DC60A1*
+ ID_OUI_FROM_DATABASE=Teledyne DALSA Professional Imaging
 
-OUI:6C9989*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:78E980*
+ ID_OUI_FROM_DATABASE=RainUs Co.,Ltd
 
-OUI:580A20*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:7C8274*
+ ID_OUI_FROM_DATABASE=Shenzhen Hikeen Technology CO.,LTD
 
-OUI:0050D1*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:B40566*
+ ID_OUI_FROM_DATABASE=SP Best Corporation Co., LTD.
 
-OUI:00500B*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:70AD54*
+ ID_OUI_FROM_DATABASE=Malvern Instruments Ltd
 
-OUI:005073*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:DCE026*
+ ID_OUI_FROM_DATABASE=Patrol Tag, Inc
 
-OUI:00603E*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:EC3C88*
+ ID_OUI_FROM_DATABASE=MCNEX Co.,Ltd.
 
-OUI:00E034*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:F07959*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:001868*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:E08E3C*
+ ID_OUI_FROM_DATABASE=Aztech Electronics Pte Ltd
 
-OUI:887556*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:78A351*
+ ID_OUI_FROM_DATABASE=SHENZHEN ZHIBOTONG ELECTRONICS CO.,LTD
 
-OUI:60735C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:94E2FD*
+ ID_OUI_FROM_DATABASE=Boge Kompressoren OTTO Boge GmbH & Co. KG
+
+OUI:E4695A*
+ ID_OUI_FROM_DATABASE=Dictum Health, Inc.
 
-OUI:FC9947*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D46132*
+ ID_OUI_FROM_DATABASE=Pro Concept Manufacturer Co.,Ltd.
 
-OUI:7CC537*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:54A050*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:70CD60*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:841826*
+ ID_OUI_FROM_DATABASE=Osram GmbH
 
-OUI:24AB81*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:14F893*
+ ID_OUI_FROM_DATABASE=Wuhan FiberHome Digital Technology Co.,Ltd.
 
-OUI:581FAA*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:9816EC*
+ ID_OUI_FROM_DATABASE=IC Intracom
 
-OUI:A46706*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:DCDA4F*
+ ID_OUI_FROM_DATABASE=GETCK TECHNOLOGY,  INC
 
-OUI:3C0754*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:30FAB7*
+ ID_OUI_FROM_DATABASE=Tunai Creative
 
-OUI:E4CE8F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:0809B6*
+ ID_OUI_FROM_DATABASE=Masimo Corp
 
-OUI:E8040B*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:14EDE4*
+ ID_OUI_FROM_DATABASE=Kaiam Corporation
 
-OUI:B8C75D*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:3438AF*
+ ID_OUI_FROM_DATABASE=Inlab Software GmbH
 
-OUI:403CFC*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:049B9C*
+ ID_OUI_FROM_DATABASE=Eadingcore  Intelligent Technology Co., Ltd.
 
-OUI:286AB8*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:842690*
+ ID_OUI_FROM_DATABASE=BEIJING THOUGHT SCIENCE CO.,LTD.
 
-OUI:7CC3A1*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B84FD5*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
 
-OUI:00E16D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:587BE9*
+ ID_OUI_FROM_DATABASE=AirPro Technology India Pvt. Ltd
 
-OUI:F8C288*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:FC1D84*
+ ID_OUI_FROM_DATABASE=Autobase
 
-OUI:E0ACF1*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:4CE933*
+ ID_OUI_FROM_DATABASE=RailComm, LLC
 
-OUI:FC5B39*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:6050C1*
+ ID_OUI_FROM_DATABASE=Kinetek Sports
 
-OUI:346F90*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:003560*
+ ID_OUI_FROM_DATABASE=Rosen Aviation
 
-OUI:E0D173*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:EC59E7*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
 
-OUI:74A02F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:08EFAB*
+ ID_OUI_FROM_DATABASE=SAYME WIRELESS SENSOR NETWORK
 
-OUI:547C69*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:C81B6B*
+ ID_OUI_FROM_DATABASE=Innova Security
 
-OUI:689CE2*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:5C966A*
+ ID_OUI_FROM_DATABASE=RTNET
 
-OUI:40A6E8*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:2C5089*
+ ID_OUI_FROM_DATABASE=Shenzhen Kaixuan Visual Technology Co.,Limited
 
-OUI:B8782E*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:EC13B2*
+ ID_OUI_FROM_DATABASE=Netonix
 
-OUI:000502*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:74BADB*
+ ID_OUI_FROM_DATABASE=Longconn Electornics(shenzhen)Co.,Ltd
 
-OUI:0010FA*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:4C7403*
+ ID_OUI_FROM_DATABASE=BQ
 
-OUI:000393*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:5876C5*
+ ID_OUI_FROM_DATABASE=DIGI I'S LTD
 
-OUI:0016CB*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:00A2F5*
+ ID_OUI_FROM_DATABASE=Guangzhou Yuanyun Network Technology Co.,Ltd
 
-OUI:0017F2*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:70FC8C*
+ ID_OUI_FROM_DATABASE=OneAccess SA
 
-OUI:001B63*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:902CC7*
+ ID_OUI_FROM_DATABASE=C-MAX Asia Limited
 
-OUI:001EC2*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:188219*
+ ID_OUI_FROM_DATABASE=Alibaba Cloud Computing Ltd.
 
-OUI:002608*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B41780*
+ ID_OUI_FROM_DATABASE=DTI Group Ltd
 
-OUI:7C6D62*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:D437D7*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:40D32D*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:AC3870*
+ ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
 
-OUI:D83062*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:80EACA*
+ ID_OUI_FROM_DATABASE=Dialog Semiconductor Hellas SA
 
-OUI:C42C03*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:4CBC42*
+ ID_OUI_FROM_DATABASE=Shenzhen Hangsheng Electronics Co.,Ltd.
 
-OUI:6C2056*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:987E46*
+ ID_OUI_FROM_DATABASE=Emizon Networks Limited
 
-OUI:BC1665*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:8432EA*
+ ID_OUI_FROM_DATABASE=ANHUI WANZTEN P&T CO., LTD
 
-OUI:44ADD9*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:90B686*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:0C2724*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:4C6E6E*
+ ID_OUI_FROM_DATABASE=Comnect Technology CO.,LTD
 
-OUI:6C416A*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:F4DD9E*
+ ID_OUI_FROM_DATABASE=GoPro
 
-OUI:F872EA*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:40B3CD*
+ ID_OUI_FROM_DATABASE=Chiyoda Electronics Co.,Ltd.
 
-OUI:0C6803*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:3451AA*
+ ID_OUI_FROM_DATABASE=JID GLOBAL
 
-OUI:789F70*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:04572F*
+ ID_OUI_FROM_DATABASE=Sertel Electronics UK Ltd
 
-OUI:DC3714*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:08B2A3*
+ ID_OUI_FROM_DATABASE=Cynny Italia S.r.L.
 
-OUI:40331A*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:D8977C*
+ ID_OUI_FROM_DATABASE=Grey Innovation
 
-OUI:94F6A3*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:80AD67*
+ ID_OUI_FROM_DATABASE=Kasda Networks Inc
 
-OUI:D81D72*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:30595B*
+ ID_OUI_FROM_DATABASE=streamnow AG
 
-OUI:70ECE4*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B8AD3E*
+ ID_OUI_FROM_DATABASE=BLUECOM
 
-OUI:38C986*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:10C37B*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:FCFC48*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:48D855*
+ ID_OUI_FROM_DATABASE=Telvent
 
-OUI:2857BE*
- ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
+OUI:284ED7*
+ ID_OUI_FROM_DATABASE=OutSmart Power Systems, Inc.
 
-OUI:50D59C*
- ID_OUI_FROM_DATABASE=Thai Habel Industrial Co., Ltd.
+OUI:5C5BC2*
+ ID_OUI_FROM_DATABASE=YIK Corporation
 
-OUI:FCA386*
- ID_OUI_FROM_DATABASE=SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD
+OUI:EC8A4C*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:F0F249*
- ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
+OUI:8014A8*
+ ID_OUI_FROM_DATABASE=Guangzhou V-SOLUTION Electronic Technology Co., Ltd.
 
-OUI:A4C361*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:908C63*
+ ID_OUI_FROM_DATABASE=GZ Weedong Networks Technology Co. , Ltd
 
-OUI:AC7F3E*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B49EAC*
+ ID_OUI_FROM_DATABASE=Imagik Int'l Corp
 
-OUI:280B5C*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:C8E42F*
+ ID_OUI_FROM_DATABASE=Technical Research Design and Development
 
-OUI:90B931*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:FC2325*
+ ID_OUI_FROM_DATABASE=EosTek (Shenzhen) Co., Ltd.
 
-OUI:24A2E1*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:A81374*
+ ID_OUI_FROM_DATABASE=Panasonic Corporation AVC Networks Company
 
-OUI:80EA96*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:4C83DE*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:600308*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:5CB6CC*
+ ID_OUI_FROM_DATABASE=NovaComm Technologies Inc.
 
-OUI:04F13E*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B4AE6F*
+ ID_OUI_FROM_DATABASE=Circle Reliance, Inc DBA Cranberry Networks
 
-OUI:54724F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B89919*
+ ID_OUI_FROM_DATABASE=7signal Solutions, Inc
 
-OUI:48746E*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:90DA6A*
+ ID_OUI_FROM_DATABASE=FOCUS H&S Co., Ltd.
 
-OUI:3CAB8E*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:A45DA1*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:7C6DF8*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:E8EF89*
+ ID_OUI_FROM_DATABASE=OPMEX Tech.
 
-OUI:48D705*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:F4C447*
+ ID_OUI_FROM_DATABASE=Coagent International Enterprise Limited
 
-OUI:3CD0F8*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:08DF1F*
+ ID_OUI_FROM_DATABASE=Bose Corporation
 
-OUI:98D6BB*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:542AA2*
+ ID_OUI_FROM_DATABASE=Alpha Networks Inc.
 
-OUI:4CB199*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:84948C*
+ ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
 
-OUI:64E682*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:CCA0E5*
+ ID_OUI_FROM_DATABASE=DZG Metering GmbH
 
-OUI:804971*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:3059B7*
+ ID_OUI_FROM_DATABASE=Microsoft
 
-OUI:98FE94*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:0874F6*
+ ID_OUI_FROM_DATABASE=Winterhalter Gastronom GmbH
 
-OUI:D8004D*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:FCC2DE*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:98B8E3*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:1C1CFD*
+ ID_OUI_FROM_DATABASE=Dalian Hi-Think Computer Technology, Corp
 
-OUI:80929F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:7062B8*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:885395*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B875C0*
+ ID_OUI_FROM_DATABASE=PayPal, Inc.
 
-OUI:9C04EB*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:E47FB2*
+ ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
-OUI:78FD94*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:38262B*
+ ID_OUI_FROM_DATABASE=UTran Technology
 
-OUI:C88550*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:20ED74*
+ ID_OUI_FROM_DATABASE=Ability enterprise co.,Ltd.
 
-OUI:D4F46F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:7824AF*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:787E61*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:0CAC05*
+ ID_OUI_FROM_DATABASE=Unitend Technologies Inc.
 
-OUI:60F81D*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B4B859*
+ ID_OUI_FROM_DATABASE=Texa Spa
 
-OUI:4C7C5F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:045C8E*
+ ID_OUI_FROM_DATABASE=gosund GROUP CO.,LTD
 
-OUI:48E9F1*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:54B753*
+ ID_OUI_FROM_DATABASE=Hunan Fenghui Yinjia Science And Technology Co.,Ltd
 
-OUI:FCE998*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:4826E8*
+ ID_OUI_FROM_DATABASE=Tek-Air Systems, Inc.
 
-OUI:F099BF*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:A012DB*
+ ID_OUI_FROM_DATABASE=TABUCHI ELECTRIC CO.,LTD
 
-OUI:68644B*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:ACB859*
+ ID_OUI_FROM_DATABASE=Uniband Electronic Corp,
 
-OUI:A8968A*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:100F18*
+ ID_OUI_FROM_DATABASE=Fu Gang Electronic(KunShan)CO.,LTD
 
-OUI:4C8D79*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:C8D590*
+ ID_OUI_FROM_DATABASE=FLIGHT DATA SYSTEMS
 
-OUI:207D74*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:709383*
+ ID_OUI_FROM_DATABASE=Intelligent Optical Network High Tech CO.,LTD.
 
-OUI:F4F15A*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:6047D4*
+ ID_OUI_FROM_DATABASE=FORICS Electronic Technology Co., Ltd.
 
-OUI:042665*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:C09D26*
+ ID_OUI_FROM_DATABASE=Topicon HK Lmd.
 
-OUI:2CB43A*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B061C7*
+ ID_OUI_FROM_DATABASE=Ericsson-LG Enterprise
 
-OUI:689C70*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:B05706*
+ ID_OUI_FROM_DATABASE=Vallox Oy
 
-OUI:087045*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:C8D429*
+ ID_OUI_FROM_DATABASE=Muehlbauer AG
 
-OUI:CCE0C3*
- ID_OUI_FROM_DATABASE=Mangstor, Inc.
+OUI:20EAC7*
+ ID_OUI_FROM_DATABASE=SHENZHEN RIOPINE ELECTRONICS CO., LTD
 
-OUI:84A423*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:80618F*
+ ID_OUI_FROM_DATABASE=Shenzhen sangfei consumer communications co.,ltd
 
-OUI:346987*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:5CF50D*
+ ID_OUI_FROM_DATABASE=Institute of microelectronic applications
 
-OUI:58685D*
- ID_OUI_FROM_DATABASE=Tempo Australia Pty Ltd
+OUI:10DEE4*
+ ID_OUI_FROM_DATABASE=automationNEXT GmbH
 
-OUI:789C85*
- ID_OUI_FROM_DATABASE=August Home, Inc.
+OUI:444891*
+ ID_OUI_FROM_DATABASE=HDMI Licensing, LLC
 
-OUI:FCCF43*
- ID_OUI_FROM_DATABASE=HUIZHOU CITY HUIYANG DISTRICT MEISIQI INDUSTRY DEVELOPMENT CO,.LTD
+OUI:FC923B*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:5882A8*
- ID_OUI_FROM_DATABASE=Microsoft
+OUI:38F708*
+ ID_OUI_FROM_DATABASE=National Resource Management, Inc.
 
-OUI:B4EF04*
- ID_OUI_FROM_DATABASE=DAIHAN Scientific Co., Ltd.
+OUI:C4C919*
+ ID_OUI_FROM_DATABASE=Energy Imports Ltd
 
-OUI:049645*
- ID_OUI_FROM_DATABASE=WUXI SKY CHIP INTERCONNECTION TECHNOLOGY CO.,LTD.
+OUI:88A73C*
+ ID_OUI_FROM_DATABASE=Ragentek Technology Group
 
-OUI:5CE3B6*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:B0D7C5*
+ ID_OUI_FROM_DATABASE=Logipix Ltd
 
-OUI:9C88AD*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:38C9A9*
+ ID_OUI_FROM_DATABASE=SMART High Reliability Solutions, Inc.
 
-OUI:C8C2C6*
- ID_OUI_FROM_DATABASE=Shanghai Airm2m Communication Technology Co., Ltd
+OUI:BC1A67*
+ ID_OUI_FROM_DATABASE=YF Technology Co., Ltd
 
-OUI:EC64E7*
- ID_OUI_FROM_DATABASE=MOCACARE Corporation
+OUI:B024F3*
+ ID_OUI_FROM_DATABASE=Progeny Systems
 
-OUI:D07C2D*
- ID_OUI_FROM_DATABASE=Leie IOT technology Co., Ltd
+OUI:8C4DB9*
+ ID_OUI_FROM_DATABASE=Unmonday Ltd
 
-OUI:40862E*
- ID_OUI_FROM_DATABASE=JDM MOBILE INTERNET SOLUTION CO., LTD.
+OUI:D87CDD*
+ ID_OUI_FROM_DATABASE=SANIX INCORPORATED
 
-OUI:EC388F*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:F8A2B4*
+ ID_OUI_FROM_DATABASE=RHEWA-WAAGENFABRIK August Freudewald GmbH &amp;Co. KG
 
-OUI:BC9C31*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:84FE9E*
+ ID_OUI_FROM_DATABASE=RTC Industries, Inc.
 
-OUI:90C99B*
- ID_OUI_FROM_DATABASE=Recore Systems
+OUI:403067*
+ ID_OUI_FROM_DATABASE=Conlog (Pty) Ltd
 
-OUI:5CB559*
- ID_OUI_FROM_DATABASE=CNEX Labs
+OUI:98DA92*
+ ID_OUI_FROM_DATABASE=Vuzix Corporation
 
-OUI:5CCF7F*
- ID_OUI_FROM_DATABASE=Espressif Inc.
+OUI:5C2AEF*
+ ID_OUI_FROM_DATABASE=Open Access Pty Ltd
 
-OUI:380546*
- ID_OUI_FROM_DATABASE=Foctek Photonics, Inc.
+OUI:E40439*
+ ID_OUI_FROM_DATABASE=TomTom Software Ltd
 
-OUI:6858C5*
- ID_OUI_FROM_DATABASE=ZF TRW Automotive
+OUI:90AE1B*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:044169*
- ID_OUI_FROM_DATABASE=GoPro
+OUI:441E91*
+ ID_OUI_FROM_DATABASE=ARVIDA Intelligent Electronics Technology  Co.,Ltd.
 
-OUI:ACC51B*
- ID_OUI_FROM_DATABASE=Zhuhai Pantum Electronics Co., Ltd.
+OUI:6C14F7*
+ ID_OUI_FROM_DATABASE=Erhardt+Leimer GmbH
 
-OUI:4473D6*
- ID_OUI_FROM_DATABASE=Logitech
+OUI:CC07E4*
+ ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
 
-OUI:E80734*
- ID_OUI_FROM_DATABASE=Champion Optical Network Engineering, LLC
+OUI:B4430D*
+ ID_OUI_FROM_DATABASE=Broadlink Pty Ltd
 
-OUI:6CEBB2*
- ID_OUI_FROM_DATABASE=Dongguan Sen DongLv Electronics Co.,Ltd
+OUI:A4BBAF*
+ ID_OUI_FROM_DATABASE=Lime Instruments
 
-OUI:A03299*
- ID_OUI_FROM_DATABASE=Lenovo (Beijing) Co., Ltd.
+OUI:7CE1FF*
+ ID_OUI_FROM_DATABASE=Computer Performance, Inc. DBA Digital Loggers, Inc.
 
-OUI:A845CD*
- ID_OUI_FROM_DATABASE=Siselectron Technology LTD.
+OUI:D069D0*
+ ID_OUI_FROM_DATABASE=Verto Medical Solutions, LLC
 
-OUI:D0C193*
- ID_OUI_FROM_DATABASE=SKYBELL, INC
+OUI:ACE069*
+ ID_OUI_FROM_DATABASE=ISAAC Instruments
 
-OUI:209BCD*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:E8EA6A*
+ ID_OUI_FROM_DATABASE=StarTech.com
 
-OUI:F0B0E7*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:C4E984*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:CC20E8*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:8059FD*
+ ID_OUI_FROM_DATABASE=Noviga
 
-OUI:E435C8*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:18FF2E*
+ ID_OUI_FROM_DATABASE=Shenzhen Rui Ying Da Technology Co., Ltd
 
-OUI:38FF36*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:1CAB01*
+ ID_OUI_FROM_DATABASE=Innovolt
 
-OUI:D47208*
- ID_OUI_FROM_DATABASE=Bragi GmbH
+OUI:68856A*
+ ID_OUI_FROM_DATABASE=OuterLink Corporation
 
-OUI:489A42*
- ID_OUI_FROM_DATABASE=Technomate Ltd
+OUI:30F42F*
+ ID_OUI_FROM_DATABASE=ESP
 
-OUI:B49D0B*
- ID_OUI_FROM_DATABASE=BQ
+OUI:746A8F*
+ ID_OUI_FROM_DATABASE=VS Vision Systems GmbH
 
-OUI:98CB27*
- ID_OUI_FROM_DATABASE=Galore Networks Pvt. Ltd.
+OUI:B068B6*
+ ID_OUI_FROM_DATABASE=Hangzhou OYE Technology Co. Ltd
 
-OUI:30D32D*
- ID_OUI_FROM_DATABASE=devolo AG
+OUI:9C65F9*
+ ID_OUI_FROM_DATABASE=AcSiP Technology Corp.
 
-OUI:CC794A*
- ID_OUI_FROM_DATABASE=BLU Products Inc.
+OUI:487604*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:60FD56*
- ID_OUI_FROM_DATABASE=WOORISYSTEMS CO., Ltd
+OUI:D057A1*
+ ID_OUI_FROM_DATABASE=Werma Signaltechnik GmbH & Co. KG
 
-OUI:483974*
- ID_OUI_FROM_DATABASE=Proware Technologies Co., Ltd.
+OUI:3C89A6*
+ ID_OUI_FROM_DATABASE=KAPELSE
 
-OUI:E855B4*
- ID_OUI_FROM_DATABASE=SAI Technology Inc.
+OUI:90F1B0*
+ ID_OUI_FROM_DATABASE=Hangzhou Anheng Info&Tech CO.,LTD
 
-OUI:9CA69D*
- ID_OUI_FROM_DATABASE=Whaley Technology Co.Ltd
+OUI:9C86DA*
+ ID_OUI_FROM_DATABASE=Phoenix Geophysics Ltd.
 
-OUI:342606*
- ID_OUI_FROM_DATABASE=CarePredict, Inc.
+OUI:48FEEA*
+ ID_OUI_FROM_DATABASE=HOMA B.V.
 
-OUI:B4AE2B*
- ID_OUI_FROM_DATABASE=Microsoft
+OUI:10DDF4*
+ ID_OUI_FROM_DATABASE=Maxway Electronics CO.,LTD
 
-OUI:80EB77*
- ID_OUI_FROM_DATABASE=Wistron Corporation
+OUI:080371*
+ ID_OUI_FROM_DATABASE=KRG CORPORATE
 
-OUI:B88981*
- ID_OUI_FROM_DATABASE=Chengdu InnoThings Technology Co., Ltd.
+OUI:ACC595*
+ ID_OUI_FROM_DATABASE=Graphite Systems
 
-OUI:B4293D*
- ID_OUI_FROM_DATABASE=Shenzhen Urovo Technology Co.,Ltd.
+OUI:3413A8*
+ ID_OUI_FROM_DATABASE=Mediplan Limited
 
-OUI:906FA9*
- ID_OUI_FROM_DATABASE=NANJING PUTIAN TELECOMMUNICATIONS TECHNOLOGY CO.,LTD.
+OUI:4CD9C4*
+ ID_OUI_FROM_DATABASE=Magneti Marelli Automotive Electronics (Guangzhou) Co. Ltd
 
-OUI:14B370*
- ID_OUI_FROM_DATABASE=Gigaset Digital Technology (Shenzhen) Co., Ltd.
+OUI:743ECB*
+ ID_OUI_FROM_DATABASE=Gentrice tech
 
-OUI:FC2FEF*
- ID_OUI_FROM_DATABASE=UTT Technologies Co., Ltd.
+OUI:7071B3*
+ ID_OUI_FROM_DATABASE=Brain Corporation
 
-OUI:EC21E5*
- ID_OUI_FROM_DATABASE=Toshiba
+OUI:208986*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:44FDA3*
- ID_OUI_FROM_DATABASE=Everysight LTD.
+OUI:3CD4D6*
+ ID_OUI_FROM_DATABASE=WirelessWERX, Inc
 
-OUI:84D4C8*
- ID_OUI_FROM_DATABASE=Widex A/S
+OUI:64E625*
+ ID_OUI_FROM_DATABASE=Woxu Wireless Co., Ltd
 
-OUI:247260*
- ID_OUI_FROM_DATABASE=IOTTECH Corp
+OUI:7C444C*
+ ID_OUI_FROM_DATABASE=Entertainment Solutions, S.L.
 
-OUI:44975A*
- ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
+OUI:501AC5*
+ ID_OUI_FROM_DATABASE=Microsoft
 
-OUI:584822*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:609620*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:F8BF09*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:F8572E*
+ ID_OUI_FROM_DATABASE=Core Brands, LLC
 
-OUI:B4B265*
- ID_OUI_FROM_DATABASE=DAEHO I&T
+OUI:E0E631*
+ ID_OUI_FROM_DATABASE=SNB TECHNOLOGIES LIMITED
 
-OUI:081FEB*
- ID_OUI_FROM_DATABASE=BinCube
+OUI:20C60D*
+ ID_OUI_FROM_DATABASE=Shanghai annijie Information technology Co.,LTD
 
-OUI:785F4C*
- ID_OUI_FROM_DATABASE=Argox Information Co., Ltd.
+OUI:7C9763*
+ ID_OUI_FROM_DATABASE=Openmatics s.r.o.
 
-OUI:5870C6*
- ID_OUI_FROM_DATABASE=Shanghai Xiaoyi Technology Co., Ltd.
+OUI:0444A1*
+ ID_OUI_FROM_DATABASE=TELECON GALICIA,S.A.
 
-OUI:803B2A*
- ID_OUI_FROM_DATABASE=ABB Xiamen Low Voltage Equipment Co.,Ltd.
+OUI:84569C*
+ ID_OUI_FROM_DATABASE=Coho Data, Inc.,
 
-OUI:A0A65C*
- ID_OUI_FROM_DATABASE=Supercomputing Systems AG
+OUI:78AE0C*
+ ID_OUI_FROM_DATABASE=Far South Networks
 
-OUI:5CB395*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:38CA97*
+ ID_OUI_FROM_DATABASE=Contour Design LLC
 
-OUI:C412F5*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:84A783*
+ ID_OUI_FROM_DATABASE=Alcatel Lucent
 
-OUI:44F436*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:1CC11A*
+ ID_OUI_FROM_DATABASE=Wavetronix
 
-OUI:349B5B*
- ID_OUI_FROM_DATABASE=Maquet GmbH
+OUI:4CF02E*
+ ID_OUI_FROM_DATABASE=Vifa Denmark A/S
 
-OUI:E861BE*
- ID_OUI_FROM_DATABASE=Melec Inc.
+OUI:3051F8*
+ ID_OUI_FROM_DATABASE=BYK-Gardner GmbH
 
-OUI:54B80A*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:94C3E4*
+ ID_OUI_FROM_DATABASE=SCA Schucker Gmbh & Co KG
 
-OUI:D8ADDD*
- ID_OUI_FROM_DATABASE=Sonavation, Inc.
+OUI:FC19D0*
+ ID_OUI_FROM_DATABASE=Cloud Vision Networks Technology Co.,Ltd.
 
-OUI:C09A71*
- ID_OUI_FROM_DATABASE=XIAMEN MEITU MOBILE TECHNOLOGY CO.LTD
+OUI:20E791*
+ ID_OUI_FROM_DATABASE=Siemens Healthcare Diagnostics, Inc
 
-OUI:340B40*
- ID_OUI_FROM_DATABASE=MIOS ELETTRONICA SRL
+OUI:68764F*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:944A0C*
- ID_OUI_FROM_DATABASE=Sercomm Corporation
+OUI:D4D919*
+ ID_OUI_FROM_DATABASE=GoPro
 
-OUI:D02516*
- ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
+OUI:50C9A0*
+ ID_OUI_FROM_DATABASE=SKIPPER Electronics AS
 
-OUI:D05C7A*
- ID_OUI_FROM_DATABASE=Sartura d.o.o.
+OUI:A49F89*
+ ID_OUI_FROM_DATABASE=Shanghai Rui Rui Communication Technology Co.Ltd.
 
-OUI:9C37F4*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:D850E6*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:5CEB68*
- ID_OUI_FROM_DATABASE=Cheerstar Technology Co., Ltd
+OUI:94103E*
+ ID_OUI_FROM_DATABASE=Belkin International Inc.
 
-OUI:F46A92*
- ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
+OUI:B4750E*
+ ID_OUI_FROM_DATABASE=Belkin International Inc.
 
-OUI:14AEDB*
- ID_OUI_FROM_DATABASE=VTech Telecommunications Ltd.
+OUI:346178*
+ ID_OUI_FROM_DATABASE=The Boeing Company
 
-OUI:EC4F82*
- ID_OUI_FROM_DATABASE=Calix Inc.
+OUI:187ED5*
+ ID_OUI_FROM_DATABASE=shenzhen kaism technology Co. Ltd
 
-OUI:B8C3BF*
- ID_OUI_FROM_DATABASE=Henan Chengshi NetWork Technology Co.,Ltd
+OUI:841B38*
+ ID_OUI_FROM_DATABASE=Shenzhen Excelsecu Data Technology Co.,Ltd
 
-OUI:C0EE40*
- ID_OUI_FROM_DATABASE=Laird Technologies
+OUI:EC2AF0*
+ ID_OUI_FROM_DATABASE=Ypsomed AG
 
-OUI:F0182B*
- ID_OUI_FROM_DATABASE=LG Chem
+OUI:044F8B*
+ ID_OUI_FROM_DATABASE=Adapteva, Inc.
 
-OUI:CC5FBF*
- ID_OUI_FROM_DATABASE=Topwise 3G Communication Co., Ltd.
+OUI:9CE7BD*
+ ID_OUI_FROM_DATABASE=Winduskorea co., Ltd
 
-OUI:14DDA9*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:A0BF50*
+ ID_OUI_FROM_DATABASE=S.C. ADD-PRODUCTION S.R.L.
 
-OUI:485D36*
- ID_OUI_FROM_DATABASE=Verizon
+OUI:7CB733*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
-OUI:EC60E0*
- ID_OUI_FROM_DATABASE=AVI-ON LABS
+OUI:705957*
+ ID_OUI_FROM_DATABASE=Medallion Instrumentation Systems
 
-OUI:145A83*
- ID_OUI_FROM_DATABASE=Logi-D inc
+OUI:6C8366*
+ ID_OUI_FROM_DATABASE=Nanjing SAC Power Grid Automation Co., Ltd.
 
-OUI:4CEEB0*
- ID_OUI_FROM_DATABASE=SHC Netzwerktechnik GmbH
+OUI:88576D*
+ ID_OUI_FROM_DATABASE=XTA Electronics Ltd
 
-OUI:188EF9*
- ID_OUI_FROM_DATABASE=G2C Co. Ltd.
+OUI:F83D4E*
+ ID_OUI_FROM_DATABASE=Softlink Automation System Co., Ltd
 
-OUI:809FAB*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:FCD817*
+ ID_OUI_FROM_DATABASE=Beijing Hesun Technologies Co.Ltd.
 
-OUI:D00492*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:909F43*
+ ID_OUI_FROM_DATABASE=Accutron Instruments Inc.
 
-OUI:F4E9D4*
- ID_OUI_FROM_DATABASE=QLogic Corporation
+OUI:50C006*
+ ID_OUI_FROM_DATABASE=Carmanah Signs
 
-OUI:1422DB*
- ID_OUI_FROM_DATABASE=eero inc.
+OUI:98FB12*
+ ID_OUI_FROM_DATABASE=Grand Electronics (HK) Ltd
 
-OUI:0C413E*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:3C1040*
+ ID_OUI_FROM_DATABASE=daesung network
 
-OUI:007E56*
- ID_OUI_FROM_DATABASE=China Dragon Technology Limited
+OUI:B04545*
+ ID_OUI_FROM_DATABASE=YACOUB Automation GmbH
 
-OUI:086266*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:701D7F*
+ ID_OUI_FROM_DATABASE=Comtech Technology Co., Ltd.
 
-OUI:346C0F*
- ID_OUI_FROM_DATABASE=Pramod Telecom Pvt. Ltd
+OUI:60DB2A*
+ ID_OUI_FROM_DATABASE=HNS
 
-OUI:3C912B*
- ID_OUI_FROM_DATABASE=Vexata Inc
+OUI:7CBF88*
+ ID_OUI_FROM_DATABASE=Mobilicom LTD
 
-OUI:54369B*
- ID_OUI_FROM_DATABASE=1Verge Internet Technology (Beijing) Co., Ltd.
+OUI:90028A*
+ ID_OUI_FROM_DATABASE=Shenzhen Shidean Legrand Electronic Products Co.,Ltd
 
-OUI:E4FED9*
- ID_OUI_FROM_DATABASE=EDMI Europe Ltd
+OUI:90356E*
+ ID_OUI_FROM_DATABASE=Vodafone Omnitel N.V.
 
-OUI:2852E0*
- ID_OUI_FROM_DATABASE=Layon international Electronic & Telecom Co.,Ltd
+OUI:3CCA87*
+ ID_OUI_FROM_DATABASE=Iders Incorporated
 
-OUI:E48501*
- ID_OUI_FROM_DATABASE=Geberit International AG
+OUI:08CA45*
+ ID_OUI_FROM_DATABASE=Toyou Feiji Electronics Co., Ltd.
 
-OUI:1C3947*
- ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
+OUI:9CA9E4*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:2CAD13*
- ID_OUI_FROM_DATABASE=SHENZHEN ZHILU TECHNOLOGY CO.,LTD
+OUI:E47723*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:68B983*
- ID_OUI_FROM_DATABASE=b-plus GmbH
+OUI:C098E5*
+ ID_OUI_FROM_DATABASE=University of Michigan
 
-OUI:BC74D7*
- ID_OUI_FROM_DATABASE=HangZhou JuRu Technology CO.,LTD
+OUI:B8DF6B*
+ ID_OUI_FROM_DATABASE=SpotCam Co., Ltd.
 
-OUI:E88E60*
- ID_OUI_FROM_DATABASE=NSD Corporation
+OUI:742B62*
+ ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
-OUI:545146*
- ID_OUI_FROM_DATABASE=AMG Systems Ltd.
+OUI:58BDF9*
+ ID_OUI_FROM_DATABASE=Sigrand
 
-OUI:84DDB7*
- ID_OUI_FROM_DATABASE=Cilag GmbH International
+OUI:344F3F*
+ ID_OUI_FROM_DATABASE=IO-Power Technology Co., Ltd.
 
-OUI:78EB14*
- ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
+OUI:C0C687*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:D05BA8*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:142BD2*
+ ID_OUI_FROM_DATABASE=Armtel Ltd.
 
-OUI:8CE78C*
- ID_OUI_FROM_DATABASE=DK Networks
+OUI:54A54B*
+ ID_OUI_FROM_DATABASE=NSC Communications Siberia Ltd
 
-OUI:E4BAD9*
- ID_OUI_FROM_DATABASE=360 Fly Inc.
+OUI:BC2B6B*
+ ID_OUI_FROM_DATABASE=Beijing Haier IC Design Co.,Ltd
 
-OUI:7C3CB6*
- ID_OUI_FROM_DATABASE=Shenzhen Homecare Technology Co.,Ltd.
+OUI:642184*
+ ID_OUI_FROM_DATABASE=Nippon Denki Kagaku Co.,LTD
 
-OUI:BCE767*
- ID_OUI_FROM_DATABASE=Quanzhou  TDX Electronics Co., Ltd
+OUI:EC3E09*
+ ID_OUI_FROM_DATABASE=PERFORMANCE DESIGNED PRODUCTS, LLC
 
-OUI:6CA7FA*
- ID_OUI_FROM_DATABASE=YOUNGBO ENGINEERING INC.
+OUI:EC219F*
+ ID_OUI_FROM_DATABASE=VidaBox LLC
 
-OUI:D0929E*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:98D331*
+ ID_OUI_FROM_DATABASE=Shenzhen Bolutek Technology Co.,Ltd.
 
-OUI:F4032F*
- ID_OUI_FROM_DATABASE=Reduxio Systems
+OUI:3C1A57*
+ ID_OUI_FROM_DATABASE=Cardiopulmonary Corp
 
-OUI:84CFBF*
- ID_OUI_FROM_DATABASE=Fairphone
+OUI:6CF97C*
+ ID_OUI_FROM_DATABASE=Nanoptix Inc.
 
-OUI:AC9E17*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:58E02C*
+ ID_OUI_FROM_DATABASE=Micro Technic A/S
 
-OUI:ACC73F*
- ID_OUI_FROM_DATABASE=VITSMO CO., LTD.
+OUI:E481B3*
+ ID_OUI_FROM_DATABASE=Shenzhen ACT Industrial Co.,Ltd.
 
-OUI:18BDAD*
- ID_OUI_FROM_DATABASE=L-TECH CORPORATION
+OUI:E4F3E3*
+ ID_OUI_FROM_DATABASE=Shanghai iComhome Co.,Ltd.
 
-OUI:44D244*
- ID_OUI_FROM_DATABASE=Seiko Epson Corporation
+OUI:04CF25*
+ ID_OUI_FROM_DATABASE=MANYCOLORS, INC.
 
-OUI:10C07C*
- ID_OUI_FROM_DATABASE=Blu-ray Disc Association
+OUI:D41090*
+ ID_OUI_FROM_DATABASE=iNFORM Systems AG
 
-OUI:B87879*
- ID_OUI_FROM_DATABASE=Roche Diagnostics GmbH
+OUI:3495DB*
+ ID_OUI_FROM_DATABASE=Logitec Corporation
 
-OUI:4480EB*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:88142B*
+ ID_OUI_FROM_DATABASE=Protonic Holland
 
-OUI:D06F4A*
- ID_OUI_FROM_DATABASE=TOPWELL INTERNATIONAL HOLDINGS LIMITED
+OUI:B8241A*
+ ID_OUI_FROM_DATABASE=SWEDA INFORMATICA LTDA
 
-OUI:BC54F9*
- ID_OUI_FROM_DATABASE=Drogoo Technology Co., Ltd.
+OUI:3806B4*
+ ID_OUI_FROM_DATABASE=A.D.C. GmbH
 
-OUI:349E34*
- ID_OUI_FROM_DATABASE=Evervictory Electronic Co.Ltd
+OUI:341B22*
+ ID_OUI_FROM_DATABASE=Grandbeing Technology Co., Ltd
 
-OUI:A0C2DE*
- ID_OUI_FROM_DATABASE=Costar Video Systems
+OUI:B4346C*
+ ID_OUI_FROM_DATABASE=MATSUNICHI DIGITAL TECHNOLOGY (HONG KONG) LIMITED
 
-OUI:3809A4*
- ID_OUI_FROM_DATABASE=Firefly Integrations
+OUI:9C1465*
+ ID_OUI_FROM_DATABASE=Edata Elektronik San. ve Tic. A.Ş.
 
-OUI:00A509*
- ID_OUI_FROM_DATABASE=WigWag Inc.
+OUI:587A4D*
+ ID_OUI_FROM_DATABASE=Stonesoft Corporation
 
-OUI:A86405*
- ID_OUI_FROM_DATABASE=nimbus 9, Inc
+OUI:E89218*
+ ID_OUI_FROM_DATABASE=Arcontia International AB
 
-OUI:7076FF*
- ID_OUI_FROM_DATABASE=KERLINK
+OUI:58F387*
+ ID_OUI_FROM_DATABASE=HCCP
 
-OUI:68F0BC*
- ID_OUI_FROM_DATABASE=Shenzhen LiWiFi Technology Co., Ltd
+OUI:B0793C*
+ ID_OUI_FROM_DATABASE=Revolv Inc
 
-OUI:BCD165*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:20CEC4*
+ ID_OUI_FROM_DATABASE=Peraso Technologies
 
-OUI:4CA928*
- ID_OUI_FROM_DATABASE=Insensi
+OUI:700FEC*
+ ID_OUI_FROM_DATABASE=Poindus Systems Corp.
 
-OUI:2884FA*
- ID_OUI_FROM_DATABASE=SHARP Corporation
+OUI:78D5B5*
+ ID_OUI_FROM_DATABASE=NAVIELEKTRO KY
 
-OUI:3C1E04*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:E067B3*
+ ID_OUI_FROM_DATABASE=C-Data Technology Co., Ltd
 
-OUI:E0FFF7*
- ID_OUI_FROM_DATABASE=Softiron Inc.
+OUI:B887A8*
+ ID_OUI_FROM_DATABASE=Step Ahead Innovations Inc.
 
-OUI:DC60A1*
- ID_OUI_FROM_DATABASE=Teledyne DALSA Professional Imaging
+OUI:140D4F*
+ ID_OUI_FROM_DATABASE=Flextronics International
 
-OUI:78E980*
- ID_OUI_FROM_DATABASE=RainUs Co.,Ltd
+OUI:B847C6*
+ ID_OUI_FROM_DATABASE=SanJet Technology Corp.
 
-OUI:7C8274*
- ID_OUI_FROM_DATABASE=Shenzhen Hikeen Technology CO.,LTD
+OUI:4CDF3D*
+ ID_OUI_FROM_DATABASE=TEAM ENGINEERS ADVANCE TECHNOLOGIES INDIA PVT LTD
 
-OUI:B40566*
- ID_OUI_FROM_DATABASE=SP Best Corporation Co., LTD.
+OUI:70F176*
+ ID_OUI_FROM_DATABASE=Data Modul AG
 
-OUI:70AD54*
- ID_OUI_FROM_DATABASE=Malvern Instruments Ltd
+OUI:205721*
+ ID_OUI_FROM_DATABASE=Salix Technology CO., Ltd.
 
-OUI:DCE026*
- ID_OUI_FROM_DATABASE=Patrol Tag, Inc
+OUI:704CED*
+ ID_OUI_FROM_DATABASE=TMRG, Inc.
 
-OUI:EC3C88*
- ID_OUI_FROM_DATABASE=MCNEX Co.,Ltd.
+OUI:E8516E*
+ ID_OUI_FROM_DATABASE=TSMART Inc.
 
-OUI:F07959*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:7C1AFC*
+ ID_OUI_FROM_DATABASE=Dalian Co-Edifice Video Technology Co., Ltd
 
-OUI:E08E3C*
- ID_OUI_FROM_DATABASE=Aztech Electronics Pte Ltd
+OUI:C034B4*
+ ID_OUI_FROM_DATABASE=Gigastone Corporation
 
-OUI:78A351*
- ID_OUI_FROM_DATABASE=SHENZHEN ZHIBOTONG ELECTRONICS CO.,LTD
+OUI:74ADB7*
+ ID_OUI_FROM_DATABASE=China Mobile Group Device Co.,Ltd.
 
-OUI:94E2FD*
- ID_OUI_FROM_DATABASE=Boge Kompressoren OTTO Boge GmbH & Co. KG
+OUI:DC6F00*
+ ID_OUI_FROM_DATABASE=Livescribe, Inc.
 
-OUI:E4695A*
- ID_OUI_FROM_DATABASE=Dictum Health, Inc.
+OUI:D0737F*
+ ID_OUI_FROM_DATABASE=Mini-Circuits
 
-OUI:D46132*
- ID_OUI_FROM_DATABASE=Pro Concept Manufacturer Co.,Ltd.
+OUI:A4D094*
+ ID_OUI_FROM_DATABASE=Erwin Peters Systemtechnik GmbH
 
-OUI:54A050*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:0488E2*
+ ID_OUI_FROM_DATABASE=Beats Electronics LLC
 
-OUI:841826*
- ID_OUI_FROM_DATABASE=Osram GmbH
+OUI:D00EA4*
+ ID_OUI_FROM_DATABASE=Porsche Cars North America
 
-OUI:14F893*
- ID_OUI_FROM_DATABASE=Wuhan FiberHome Digital Technology Co.,Ltd.
+OUI:F415FD*
+ ID_OUI_FROM_DATABASE=Shanghai Pateo Electronic Equipment Manufacturing Co., Ltd.
 
-OUI:9816EC*
- ID_OUI_FROM_DATABASE=IC Intracom
+OUI:2C9464*
+ ID_OUI_FROM_DATABASE=Cincoze Co., Ltd.
 
-OUI:DCDA4F*
- ID_OUI_FROM_DATABASE=GETCK TECHNOLOGY,  INC
+OUI:B050BC*
+ ID_OUI_FROM_DATABASE=SHENZHEN BASICOM ELECTRONIC CO.,LTD.
 
-OUI:30FAB7*
- ID_OUI_FROM_DATABASE=Tunai Creative
+OUI:DC7014*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:0809B6*
- ID_OUI_FROM_DATABASE=Masimo Corp
+OUI:40BC73*
+ ID_OUI_FROM_DATABASE=Cronoplast  S.L.
 
-OUI:14EDE4*
- ID_OUI_FROM_DATABASE=Kaiam Corporation
+OUI:78303B*
+ ID_OUI_FROM_DATABASE=Stephen Technologies Co.,Limited
 
-OUI:3438AF*
- ID_OUI_FROM_DATABASE=Inlab Software GmbH
+OUI:78F5E5*
+ ID_OUI_FROM_DATABASE=BEGA Gantenbrink-Leuchten KG
 
-OUI:049B9C*
- ID_OUI_FROM_DATABASE=Eadingcore  Intelligent Technology Co., Ltd.
+OUI:804B20*
+ ID_OUI_FROM_DATABASE=Ventilation Control
 
-OUI:842690*
- ID_OUI_FROM_DATABASE=BEIJING THOUGHT SCIENCE CO.,LTD.
+OUI:4007C0*
+ ID_OUI_FROM_DATABASE=Railtec Systems GmbH
 
-OUI:B84FD5*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:94B8C5*
+ ID_OUI_FROM_DATABASE=RuggedCom Inc.
 
-OUI:587BE9*
- ID_OUI_FROM_DATABASE=AirPro Technology India Pvt. Ltd
+OUI:8C3C07*
+ ID_OUI_FROM_DATABASE=Skiva Technologies, Inc.
 
-OUI:FC1D84*
- ID_OUI_FROM_DATABASE=Autobase
+OUI:784B08*
+ ID_OUI_FROM_DATABASE=f.robotics acquisitions ltd
 
-OUI:4CE933*
- ID_OUI_FROM_DATABASE=RailComm, LLC
+OUI:0C2D89*
+ ID_OUI_FROM_DATABASE=QiiQ Communications Inc.
 
-OUI:6050C1*
- ID_OUI_FROM_DATABASE=Kinetek Sports
+OUI:604A1C*
+ ID_OUI_FROM_DATABASE=SUYIN Corporation
 
-OUI:003560*
- ID_OUI_FROM_DATABASE=Rosen Aviation
+OUI:A4D3B5*
+ ID_OUI_FROM_DATABASE=GLITEL Stropkov, s.r.o.
 
-OUI:EC59E7*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:A4F3C1*
+ ID_OUI_FROM_DATABASE=Open Source Robotics Foundation, Inc.
 
-OUI:08EFAB*
- ID_OUI_FROM_DATABASE=SAYME WIRELESS SENSOR NETWORK
+OUI:6C8B2F*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:C81B6B*
- ID_OUI_FROM_DATABASE=Innova Security
+OUI:B863BC*
+ ID_OUI_FROM_DATABASE=ROBOTIS, Co, Ltd
 
-OUI:5C966A*
- ID_OUI_FROM_DATABASE=RTNET
+OUI:C8DDC9*
+ ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
 
-OUI:2C5089*
- ID_OUI_FROM_DATABASE=Shenzhen Kaixuan Visual Technology Co.,Limited
+OUI:CC1AFA*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:EC13B2*
- ID_OUI_FROM_DATABASE=Netonix
+OUI:8C5AF0*
+ ID_OUI_FROM_DATABASE=Exeltech Solar Products
 
-OUI:74BADB*
- ID_OUI_FROM_DATABASE=Longconn Electornics(shenzhen)Co.,Ltd
+OUI:F8DADF*
+ ID_OUI_FROM_DATABASE=EcoTech, Inc.
 
-OUI:4C7403*
- ID_OUI_FROM_DATABASE=BQ
+OUI:30AE7B*
+ ID_OUI_FROM_DATABASE=Deqing Dusun Electron CO., LTD
 
-OUI:5876C5*
- ID_OUI_FROM_DATABASE=DIGI I'S LTD
+OUI:1441E2*
+ ID_OUI_FROM_DATABASE=Monaco Enterprises, Inc.
 
-OUI:00A2F5*
- ID_OUI_FROM_DATABASE=Guangzhou Yuanyun Network Technology Co.,Ltd
+OUI:F07765*
+ ID_OUI_FROM_DATABASE=Sourcefire, Inc
 
-OUI:70FC8C*
- ID_OUI_FROM_DATABASE=OneAccess SA
+OUI:E4F7A1*
+ ID_OUI_FROM_DATABASE=Datafox GmbH
 
-OUI:902CC7*
- ID_OUI_FROM_DATABASE=C-MAX Asia Limited
+OUI:601E02*
+ ID_OUI_FROM_DATABASE=EltexAlatau
 
-OUI:1C965A*
- ID_OUI_FROM_DATABASE=Weifang goertek Electronics CO.,LTD
+OUI:E47D5A*
+ ID_OUI_FROM_DATABASE=Beijing Hanbang Technology Corp.
 
-OUI:188219*
- ID_OUI_FROM_DATABASE=Alibaba Cloud Computing Ltd.
+OUI:4C6255*
+ ID_OUI_FROM_DATABASE=SANMINA-SCI SYSTEM DE MEXICO S.A. DE C.V.
 
-OUI:B41780*
- ID_OUI_FROM_DATABASE=DTI Group Ltd
+OUI:381766*
+ ID_OUI_FROM_DATABASE=PROMZAKAZ LTD.
 
-OUI:D437D7*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:204C6D*
+ ID_OUI_FROM_DATABASE=Hugo Brennenstuhl Gmbh & Co. KG.
 
-OUI:AC3870*
- ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
+OUI:DC825B*
+ ID_OUI_FROM_DATABASE=JANUS, spol. s r.o.
 
-OUI:80EACA*
- ID_OUI_FROM_DATABASE=Dialog Semiconductor Hellas SA
+OUI:B08807*
+ ID_OUI_FROM_DATABASE=Strata Worldwide
 
-OUI:4CBC42*
- ID_OUI_FROM_DATABASE=Shenzhen Hangsheng Electronics Co.,Ltd.
+OUI:74D02B*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:987E46*
- ID_OUI_FROM_DATABASE=Emizon Networks Limited
+OUI:A4E0E6*
+ ID_OUI_FROM_DATABASE=FILIZOLA S.A. PESAGEM E AUTOMACAO
 
-OUI:8432EA*
- ID_OUI_FROM_DATABASE=ANHUI WANZTEN P&T CO., LTD
+OUI:60E00E*
+ ID_OUI_FROM_DATABASE=SHINSEI ELECTRONICS CO LTD
 
-OUI:90B686*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:30D46A*
+ ID_OUI_FROM_DATABASE=Autosales Incorporated
 
-OUI:4C6E6E*
- ID_OUI_FROM_DATABASE=Comnect Technology CO.,LTD
+OUI:30AABD*
+ ID_OUI_FROM_DATABASE=Shanghai Reallytek Information Technology Co.,Ltd
 
-OUI:F4DD9E*
- ID_OUI_FROM_DATABASE=GoPro
+OUI:A4B818*
+ ID_OUI_FROM_DATABASE=PENTA Gesellschaft für elektronische Industriedatenverarbeitung mbH
 
-OUI:40B3CD*
- ID_OUI_FROM_DATABASE=Chiyoda Electronics Co.,Ltd.
+OUI:106682*
+ ID_OUI_FROM_DATABASE=NEC Platforms, Ltd.
 
-OUI:3451AA*
- ID_OUI_FROM_DATABASE=JID GLOBAL
+OUI:102831*
+ ID_OUI_FROM_DATABASE=Morion Inc.
 
-OUI:04572F*
- ID_OUI_FROM_DATABASE=Sertel Electronics UK Ltd
+OUI:D81EDE*
+ ID_OUI_FROM_DATABASE=B&W Group Ltd
 
-OUI:08B2A3*
- ID_OUI_FROM_DATABASE=Cynny Italia S.r.L.
+OUI:6897E8*
+ ID_OUI_FROM_DATABASE=Society of Motion Picture &amp; Television Engineers
 
-OUI:D8977C*
- ID_OUI_FROM_DATABASE=Grey Innovation
+OUI:FC58FA*
+ ID_OUI_FROM_DATABASE=Shen Zhen Shi Xin Zhong Xin Technology Co.,Ltd.
 
-OUI:80AD67*
- ID_OUI_FROM_DATABASE=Kasda Networks Inc
+OUI:60601F*
+ ID_OUI_FROM_DATABASE=SZ DJI TECHNOLOGY CO.,LTD
 
-OUI:30595B*
- ID_OUI_FROM_DATABASE=streamnow AG
+OUI:E0C6B3*
+ ID_OUI_FROM_DATABASE=MilDef AB
 
-OUI:B8AD3E*
- ID_OUI_FROM_DATABASE=BLUECOM
+OUI:FCDB96*
+ ID_OUI_FROM_DATABASE=ENERVALLEY CO., LTD
 
-OUI:10C37B*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:882E5A*
+ ID_OUI_FROM_DATABASE=storONE
 
-OUI:48D855*
- ID_OUI_FROM_DATABASE=Telvent
+OUI:D429EA*
+ ID_OUI_FROM_DATABASE=Zimory GmbH
 
-OUI:284ED7*
- ID_OUI_FROM_DATABASE=OutSmart Power Systems, Inc.
+OUI:C80E95*
+ ID_OUI_FROM_DATABASE=OmniLync Inc.
 
-OUI:5C5BC2*
- ID_OUI_FROM_DATABASE=YIK Corporation
+OUI:50ABBF*
+ ID_OUI_FROM_DATABASE=Hoseo Telecom
 
-OUI:EC8A4C*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:C8EEA6*
+ ID_OUI_FROM_DATABASE=Shenzhen SHX Technology Co., Ltd
 
-OUI:8014A8*
- ID_OUI_FROM_DATABASE=Guangzhou V-SOLUTION Electronic Technology Co., Ltd.
+OUI:28CBEB*
+ ID_OUI_FROM_DATABASE=One
 
-OUI:908C63*
- ID_OUI_FROM_DATABASE=GZ Weedong Networks Technology Co. , Ltd
+OUI:18E8DD*
+ ID_OUI_FROM_DATABASE=MODULETEK
 
-OUI:B49EAC*
- ID_OUI_FROM_DATABASE=Imagik Int'l Corp
+OUI:4CCC34*
+ ID_OUI_FROM_DATABASE=Motorola Solutions Inc.
 
-OUI:C8E42F*
- ID_OUI_FROM_DATABASE=Technical Research Design and Development
+OUI:F084C9*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:FC2325*
- ID_OUI_FROM_DATABASE=EosTek (Shenzhen) Co., Ltd.
+OUI:E894F6*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:A81374*
- ID_OUI_FROM_DATABASE=Panasonic Corporation AVC Networks Company
+OUI:94ACCA*
+ ID_OUI_FROM_DATABASE=trivum technologies GmbH
 
-OUI:4C83DE*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:7CD844*
+ ID_OUI_FROM_DATABASE=Enmotus Inc
 
-OUI:5CB6CC*
- ID_OUI_FROM_DATABASE=NovaComm Technologies Inc.
+OUI:F4C6D7*
+ ID_OUI_FROM_DATABASE=blackned GmbH
 
-OUI:B4AE6F*
- ID_OUI_FROM_DATABASE=Circle Reliance, Inc DBA Cranberry Networks
+OUI:4CCA53*
+ ID_OUI_FROM_DATABASE=Skyera, Inc.
 
-OUI:B89919*
- ID_OUI_FROM_DATABASE=7signal Solutions, Inc
+OUI:081DFB*
+ ID_OUI_FROM_DATABASE=Shanghai Mexon Communication Technology Co.,Ltd
 
-OUI:90DA6A*
- ID_OUI_FROM_DATABASE=FOCUS H&S Co., Ltd.
+OUI:D0CDE1*
+ ID_OUI_FROM_DATABASE=Scientech Electronics
 
-OUI:A45DA1*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:94756E*
+ ID_OUI_FROM_DATABASE=QinetiQ North America
 
-OUI:A43D78*
- ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+OUI:0C5521*
+ ID_OUI_FROM_DATABASE=Axiros GmbH
 
-OUI:E8EF89*
- ID_OUI_FROM_DATABASE=OPMEX Tech.
+OUI:A4D856*
+ ID_OUI_FROM_DATABASE=Gimbal, Inc
 
-OUI:F4C447*
- ID_OUI_FROM_DATABASE=Coagent International Enterprise Limited
+OUI:10A743*
+ ID_OUI_FROM_DATABASE=SK Mtek Limited
 
-OUI:08DF1F*
- ID_OUI_FROM_DATABASE=Bose Corporation
+OUI:E4A7FD*
+ ID_OUI_FROM_DATABASE=Cellco Partnership
 
-OUI:542AA2*
- ID_OUI_FROM_DATABASE=Alpha Networks Inc.
+OUI:24F2DD*
+ ID_OUI_FROM_DATABASE=Radiant Zemax LLC
 
-OUI:84948C*
- ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
+OUI:80CF41*
+ ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
 
-OUI:CCA0E5*
- ID_OUI_FROM_DATABASE=DZG Metering GmbH
+OUI:7C9A9B*
+ ID_OUI_FROM_DATABASE=VSE valencia smart energy
 
-OUI:3059B7*
- ID_OUI_FROM_DATABASE=Microsoft
+OUI:A845E9*
+ ID_OUI_FROM_DATABASE=Firich Enterprises CO., LTD.
 
-OUI:0874F6*
- ID_OUI_FROM_DATABASE=Winterhalter Gastronom GmbH
+OUI:78995C*
+ ID_OUI_FROM_DATABASE=Nationz Technologies Inc
 
-OUI:FCC2DE*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:8CC5E1*
+ ID_OUI_FROM_DATABASE=ShenZhen Konka Telecommunication Technology Co.,Ltd
 
-OUI:1C1CFD*
- ID_OUI_FROM_DATABASE=Dalian Hi-Think Computer Technology, Corp
+OUI:6CB311*
+ ID_OUI_FROM_DATABASE=Shenzhen Lianrui Electronics Co.,Ltd
 
-OUI:7062B8*
- ID_OUI_FROM_DATABASE=D-Link International
+OUI:54115F*
+ ID_OUI_FROM_DATABASE=Atamo Pty Ltd
 
-OUI:B875C0*
- ID_OUI_FROM_DATABASE=PayPal, Inc.
+OUI:2411D0*
+ ID_OUI_FROM_DATABASE=Chongqing Ehs Science and Technology Development Co.,Ltd.
 
-OUI:E47FB2*
- ID_OUI_FROM_DATABASE=FUJITSU LIMITED
+OUI:6C9AC9*
+ ID_OUI_FROM_DATABASE=Valentine Research, Inc.
 
-OUI:38262B*
- ID_OUI_FROM_DATABASE=UTran Technology
+OUI:10F49A*
+ ID_OUI_FROM_DATABASE=T3 Innovation
 
-OUI:20ED74*
- ID_OUI_FROM_DATABASE=Ability enterprise co.,Ltd.
+OUI:5865E6*
+ ID_OUI_FROM_DATABASE=INFOMARK CO., LTD.
 
-OUI:7824AF*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:60BD91*
+ ID_OUI_FROM_DATABASE=Move Innovation
 
-OUI:0CAC05*
- ID_OUI_FROM_DATABASE=Unitend Technologies Inc.
+OUI:98473C*
+ ID_OUI_FROM_DATABASE=SHANGHAI SUNMON COMMUNICATION TECHNOGY CO.,LTD
 
-OUI:B4B859*
- ID_OUI_FROM_DATABASE=Texa Spa
+OUI:CC4BFB*
+ ID_OUI_FROM_DATABASE=Hellberg Safety AB
 
-OUI:045C8E*
- ID_OUI_FROM_DATABASE=gosund GROUP CO.,LTD
+OUI:ACA22C*
+ ID_OUI_FROM_DATABASE=Baycity Technologies Ltd
 
-OUI:54B753*
- ID_OUI_FROM_DATABASE=Hunan Fenghui Yinjia Science And Technology Co.,Ltd
+OUI:6CADEF*
+ ID_OUI_FROM_DATABASE=KZ Broadband Technologies, Ltd.
 
-OUI:4826E8*
- ID_OUI_FROM_DATABASE=Tek-Air Systems, Inc.
+OUI:044BFF*
+ ID_OUI_FROM_DATABASE=GuangZhou Hedy Digital Technology Co., Ltd
 
-OUI:A012DB*
- ID_OUI_FROM_DATABASE=TABUCHI ELECTRIC CO.,LTD
+OUI:949BFD*
+ ID_OUI_FROM_DATABASE=Trans New Technology, Inc.
 
-OUI:ACB859*
- ID_OUI_FROM_DATABASE=Uniband Electronic Corp,
+OUI:E4EEFD*
+ ID_OUI_FROM_DATABASE=MR&D Manufacturing
 
-OUI:100F18*
- ID_OUI_FROM_DATABASE=Fu Gang Electronic(KunShan)CO.,LTD
+OUI:105CBF*
+ ID_OUI_FROM_DATABASE=DuroByte Inc
 
-OUI:C8D590*
- ID_OUI_FROM_DATABASE=FLIGHT DATA SYSTEMS
+OUI:EC89F5*
+ ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
 
-OUI:709383*
- ID_OUI_FROM_DATABASE=Intelligent Optical Network High Tech CO.,LTD.
+OUI:083AB8*
+ ID_OUI_FROM_DATABASE=Shinoda Plasma Co., Ltd.
 
-OUI:6047D4*
- ID_OUI_FROM_DATABASE=FORICS Electronic Technology Co., Ltd.
+OUI:A0DD97*
+ ID_OUI_FROM_DATABASE=PolarLink Technologies, Ltd
 
-OUI:C09D26*
- ID_OUI_FROM_DATABASE=Topicon HK Lmd.
+OUI:E05597*
+ ID_OUI_FROM_DATABASE=Emergent Vision Technologies Inc.
 
-OUI:B061C7*
- ID_OUI_FROM_DATABASE=Ericsson-LG Enterprise
+OUI:A01917*
+ ID_OUI_FROM_DATABASE=Bertel S.p.a.
 
-OUI:B05706*
- ID_OUI_FROM_DATABASE=Vallox Oy
+OUI:FC9FAE*
+ ID_OUI_FROM_DATABASE=Fidus Systems Inc
 
-OUI:C8D429*
- ID_OUI_FROM_DATABASE=Muehlbauer AG
+OUI:FC0647*
+ ID_OUI_FROM_DATABASE=Cortland Research, LLC
 
-OUI:20EAC7*
- ID_OUI_FROM_DATABASE=SHENZHEN RIOPINE ELECTRONICS CO., LTD
+OUI:20918A*
+ ID_OUI_FROM_DATABASE=PROFALUX
 
-OUI:80618F*
- ID_OUI_FROM_DATABASE=Shenzhen sangfei consumer communications co.,ltd
+OUI:7C438F*
+ ID_OUI_FROM_DATABASE=E-Band Communications Corp.
 
-OUI:5CF50D*
- ID_OUI_FROM_DATABASE=Institute of microelectronic applications
+OUI:FC626E*
+ ID_OUI_FROM_DATABASE=Beijing MDC Telecom
 
-OUI:10DEE4*
- ID_OUI_FROM_DATABASE=automationNEXT GmbH
+OUI:C0B339*
+ ID_OUI_FROM_DATABASE=Comigo Ltd.
 
-OUI:444891*
- ID_OUI_FROM_DATABASE=HDMI Licensing, LLC
+OUI:DCC0DB*
+ ID_OUI_FROM_DATABASE=Shenzhen Kaiboer Technology Co., Ltd.
 
-OUI:FC923B*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:7076DD*
+ ID_OUI_FROM_DATABASE=Oxyguard International A/S
 
-OUI:38F708*
- ID_OUI_FROM_DATABASE=National Resource Management, Inc.
+OUI:E89AFF*
+ ID_OUI_FROM_DATABASE=Fujian Landi Commercial Equipment Co.,Ltd
 
-OUI:C4C919*
- ID_OUI_FROM_DATABASE=Energy Imports Ltd
+OUI:683B1E*
+ ID_OUI_FROM_DATABASE=Countwise LTD
 
-OUI:88A73C*
- ID_OUI_FROM_DATABASE=Ragentek Technology Group
+OUI:D4136F*
+ ID_OUI_FROM_DATABASE=Asia Pacific Brands
 
-OUI:B0D7C5*
- ID_OUI_FROM_DATABASE=Logipix Ltd
+OUI:A0A130*
+ ID_OUI_FROM_DATABASE=DLI Taiwan Branch office
 
-OUI:38C9A9*
- ID_OUI_FROM_DATABASE=SMART High Reliability Solutions, Inc.
+OUI:ECE915*
+ ID_OUI_FROM_DATABASE=STI Ltd
 
-OUI:BC1A67*
- ID_OUI_FROM_DATABASE=YF Technology Co., Ltd
+OUI:A81FAF*
+ ID_OUI_FROM_DATABASE=KRYPTON POLSKA
 
-OUI:B024F3*
- ID_OUI_FROM_DATABASE=Progeny Systems
+OUI:087BAA*
+ ID_OUI_FROM_DATABASE=SVYAZKOMPLEKTSERVICE, LLC
 
-OUI:8C4DB9*
- ID_OUI_FROM_DATABASE=Unmonday Ltd
+OUI:2C26C5*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:D87CDD*
- ID_OUI_FROM_DATABASE=SANIX INCORPORATED
+OUI:BC629F*
+ ID_OUI_FROM_DATABASE=Telenet Systems P. Ltd.
 
-OUI:F8A2B4*
- ID_OUI_FROM_DATABASE=RHEWA-WAAGENFABRIK August Freudewald GmbH &amp;Co. KG
+OUI:B47F5E*
+ ID_OUI_FROM_DATABASE=Foresight Manufacture (S) Pte Ltd
 
-OUI:84FE9E*
- ID_OUI_FROM_DATABASE=RTC Industries, Inc.
+OUI:785517*
+ ID_OUI_FROM_DATABASE=SankyuElectronics
 
-OUI:403067*
- ID_OUI_FROM_DATABASE=Conlog (Pty) Ltd
+OUI:848E96*
+ ID_OUI_FROM_DATABASE=Embertec Pty Ltd
 
-OUI:98DA92*
- ID_OUI_FROM_DATABASE=Vuzix Corporation
+OUI:CC3A61*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
-OUI:5C2AEF*
- ID_OUI_FROM_DATABASE=Open Access Pty Ltd
+OUI:A00363*
+ ID_OUI_FROM_DATABASE=Robert Bosch Healthcare GmbH
 
-OUI:E40439*
- ID_OUI_FROM_DATABASE=TomTom Software Ltd
+OUI:F0F644*
+ ID_OUI_FROM_DATABASE=Whitesky Science & Technology Co.,Ltd.
 
-OUI:90AE1B*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:30D357*
+ ID_OUI_FROM_DATABASE=Logosol, Inc.
 
-OUI:441E91*
- ID_OUI_FROM_DATABASE=ARVIDA Intelligent Electronics Technology  Co.,Ltd.
+OUI:2C441B*
+ ID_OUI_FROM_DATABASE=Spectrum Medical Limited
 
-OUI:6C14F7*
- ID_OUI_FROM_DATABASE=Erhardt+Leimer GmbH
+OUI:1C5A6B*
+ ID_OUI_FROM_DATABASE=Philips Electronics Nederland BV
 
-OUI:CC07E4*
- ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
+OUI:A875D6*
+ ID_OUI_FROM_DATABASE=FreeTek International Co., Ltd.
 
-OUI:B4430D*
- ID_OUI_FROM_DATABASE=Broadlink Pty Ltd
+OUI:58EB14*
+ ID_OUI_FROM_DATABASE=Proteus Digital Health
 
-OUI:A4BBAF*
- ID_OUI_FROM_DATABASE=Lime Instruments
+OUI:789F87*
+ ID_OUI_FROM_DATABASE=Siemens AG I IA PP PRM
 
-OUI:7CE1FF*
- ID_OUI_FROM_DATABASE=Computer Performance, Inc. DBA Digital Loggers, Inc.
+OUI:7C0A50*
+ ID_OUI_FROM_DATABASE=J-MEX Inc.
 
-OUI:D069D0*
- ID_OUI_FROM_DATABASE=Verto Medical Solutions, LLC
+OUI:40F2E9*
+ ID_OUI_FROM_DATABASE=IBM
 
-OUI:ACE069*
- ID_OUI_FROM_DATABASE=ISAAC Instruments
+OUI:9C0473*
+ ID_OUI_FROM_DATABASE=Tecmobile (International) Ltd.
 
-OUI:E8EA6A*
- ID_OUI_FROM_DATABASE=StarTech.com
+OUI:CC262D*
+ ID_OUI_FROM_DATABASE=Verifi, LLC
 
-OUI:C4E984*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:3C8AE5*
+ ID_OUI_FROM_DATABASE=Tensun Information Technology(Hangzhou) Co.,LTD
 
-OUI:8059FD*
- ID_OUI_FROM_DATABASE=Noviga
+OUI:7CB232*
+ ID_OUI_FROM_DATABASE=Hui Zhou Gaoshengda Technology Co.,LTD
 
-OUI:18FF2E*
- ID_OUI_FROM_DATABASE=Shenzhen Rui Ying Da Technology Co., Ltd
+OUI:54DF63*
+ ID_OUI_FROM_DATABASE=Intrakey technologies GmbH
 
-OUI:1CAB01*
- ID_OUI_FROM_DATABASE=Innovolt
+OUI:7C0187*
+ ID_OUI_FROM_DATABASE=Curtis Instruments, Inc.
 
-OUI:68856A*
- ID_OUI_FROM_DATABASE=OuterLink Corporation
+OUI:388EE7*
+ ID_OUI_FROM_DATABASE=Fanhattan LLC
 
-OUI:30F42F*
- ID_OUI_FROM_DATABASE=ESP
+OUI:54F666*
+ ID_OUI_FROM_DATABASE=Berthold Technologies GmbH and Co.KG
 
-OUI:746A8F*
- ID_OUI_FROM_DATABASE=VS Vision Systems GmbH
+OUI:802FDE*
+ ID_OUI_FROM_DATABASE=Zurich Instruments AG
 
-OUI:B068B6*
- ID_OUI_FROM_DATABASE=Hangzhou OYE Technology Co. Ltd
+OUI:08AF78*
+ ID_OUI_FROM_DATABASE=Totus Solutions, Inc.
 
-OUI:9C65F9*
- ID_OUI_FROM_DATABASE=AcSiP Technology Corp.
+OUI:5C38E0*
+ ID_OUI_FROM_DATABASE=Shanghai Super Electronics Technology Co.,LTD
 
-OUI:487604*
- ID_OUI_FROM_DATABASE=Private
+OUI:A0E534*
+ ID_OUI_FROM_DATABASE=Stratec Biomedical AG
 
-OUI:D057A1*
- ID_OUI_FROM_DATABASE=Werma Signaltechnik GmbH & Co. KG
+OUI:2891D0*
+ ID_OUI_FROM_DATABASE=Stage Tec Entwicklungsgesellschaft für professionelle Audiotechnik mbH
 
-OUI:3C89A6*
- ID_OUI_FROM_DATABASE=KAPELSE
+OUI:98291D*
+ ID_OUI_FROM_DATABASE=Jaguar de Mexico, SA de CV
 
-OUI:90F1B0*
- ID_OUI_FROM_DATABASE=Hangzhou Anheng Info&Tech CO.,LTD
+OUI:18863A*
+ ID_OUI_FROM_DATABASE=DIGITAL ART SYSTEM
 
-OUI:9C86DA*
- ID_OUI_FROM_DATABASE=Phoenix Geophysics Ltd.
+OUI:F4B72A*
+ ID_OUI_FROM_DATABASE=TIME INTERCONNECT LTD
 
-OUI:48FEEA*
- ID_OUI_FROM_DATABASE=HOMA B.V.
+OUI:34D7B4*
+ ID_OUI_FROM_DATABASE=Tributary Systems, Inc.
 
-OUI:10DDF4*
- ID_OUI_FROM_DATABASE=Maxway Electronics CO.,LTD
+OUI:F40F9B*
+ ID_OUI_FROM_DATABASE=WAVELINK
 
-OUI:080371*
- ID_OUI_FROM_DATABASE=KRG CORPORATE
+OUI:144319*
+ ID_OUI_FROM_DATABASE=Creative&Link Technology Limited
 
-OUI:ACC595*
- ID_OUI_FROM_DATABASE=Graphite Systems
+OUI:64F50E*
+ ID_OUI_FROM_DATABASE=Kinion Technology Company Limited
 
-OUI:3413A8*
- ID_OUI_FROM_DATABASE=Mediplan Limited
+OUI:28A186*
+ ID_OUI_FROM_DATABASE=enblink
 
-OUI:4CD9C4*
- ID_OUI_FROM_DATABASE=Magneti Marelli Automotive Electronics (Guangzhou) Co. Ltd
+OUI:1C9492*
+ ID_OUI_FROM_DATABASE=RUAG Schweiz AG
 
-OUI:743ECB*
- ID_OUI_FROM_DATABASE=Gentrice tech
+OUI:24694A*
+ ID_OUI_FROM_DATABASE=Jasmine Systems Inc.
 
-OUI:7071B3*
- ID_OUI_FROM_DATABASE=Brain Corporation
+OUI:C8C791*
+ ID_OUI_FROM_DATABASE=Zero1.tv GmbH
 
-OUI:208986*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:60748D*
+ ID_OUI_FROM_DATABASE=Atmaca Elektronik
 
-OUI:3CD4D6*
- ID_OUI_FROM_DATABASE=WirelessWERX, Inc
+OUI:78D129*
+ ID_OUI_FROM_DATABASE=Vicos
 
-OUI:64E625*
- ID_OUI_FROM_DATABASE=Woxu Wireless Co., Ltd
+OUI:78AB60*
+ ID_OUI_FROM_DATABASE=ABB Australia
 
-OUI:7C444C*
- ID_OUI_FROM_DATABASE=Entertainment Solutions, S.L.
+OUI:289A4B*
+ ID_OUI_FROM_DATABASE=SteelSeries ApS
 
-OUI:501AC5*
- ID_OUI_FROM_DATABASE=Microsoft
+OUI:0CC66A*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:609620*
- ID_OUI_FROM_DATABASE=Private
+OUI:3078C2*
+ ID_OUI_FROM_DATABASE=Innowireless, Co. Ltd.
 
-OUI:F8572E*
- ID_OUI_FROM_DATABASE=Core Brands, LLC
+OUI:7CFE28*
+ ID_OUI_FROM_DATABASE=Salutron Inc.
 
-OUI:E0E631*
- ID_OUI_FROM_DATABASE=SNB TECHNOLOGIES LIMITED
+OUI:109FA9*
+ ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
 
-OUI:20C60D*
- ID_OUI_FROM_DATABASE=Shanghai annijie Information technology Co.,LTD
+OUI:C0A364*
+ ID_OUI_FROM_DATABASE=3D Systems Massachusetts
 
-OUI:7C9763*
- ID_OUI_FROM_DATABASE=Openmatics s.r.o.
+OUI:98A7B0*
+ ID_OUI_FROM_DATABASE=MCST ZAO
 
-OUI:0444A1*
- ID_OUI_FROM_DATABASE=TELECON GALICIA,S.A.
+OUI:88DC96*
+ ID_OUI_FROM_DATABASE=SENAO Networks, Inc.
 
-OUI:84569C*
- ID_OUI_FROM_DATABASE=Coho Data, Inc.,
+OUI:C455C2*
+ ID_OUI_FROM_DATABASE=Bach-Simpson
 
-OUI:78AE0C*
- ID_OUI_FROM_DATABASE=Far South Networks
+OUI:ECA29B*
+ ID_OUI_FROM_DATABASE=Kemppi Oy
 
-OUI:38CA97*
- ID_OUI_FROM_DATABASE=Contour Design LLC
+OUI:04CE14*
+ ID_OUI_FROM_DATABASE=Wilocity LTD.
 
-OUI:84A783*
- ID_OUI_FROM_DATABASE=Alcatel Lucent
+OUI:802AFA*
+ ID_OUI_FROM_DATABASE=Germaneers GmbH
 
-OUI:2C5D93*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:1C8464*
+ ID_OUI_FROM_DATABASE=FORMOSA WIRELESS COMMUNICATION CORP.
 
-OUI:1CC11A*
- ID_OUI_FROM_DATABASE=Wavetronix
+OUI:D867D9*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:4CF02E*
- ID_OUI_FROM_DATABASE=Vifa Denmark A/S
+OUI:B4218A*
+ ID_OUI_FROM_DATABASE=Dog Hunter LLC
 
-OUI:3051F8*
- ID_OUI_FROM_DATABASE=BYK-Gardner GmbH
+OUI:F8A03D*
+ ID_OUI_FROM_DATABASE=Dinstar Technologies Co., Ltd.
 
-OUI:94C3E4*
- ID_OUI_FROM_DATABASE=SCA Schucker Gmbh & Co KG
+OUI:D08CFF*
+ ID_OUI_FROM_DATABASE=UPWIS AB
 
-OUI:FC19D0*
- ID_OUI_FROM_DATABASE=Cloud Vision Networks Technology Co.,Ltd.
+OUI:9C066E*
+ ID_OUI_FROM_DATABASE=Hytera Communications Corporation Limited
 
-OUI:20E791*
- ID_OUI_FROM_DATABASE=Siemens Healthcare Diagnostics, Inc
+OUI:746A89*
+ ID_OUI_FROM_DATABASE=Rezolt Corporation
 
-OUI:68764F*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:68D1FD*
+ ID_OUI_FROM_DATABASE=Shenzhen Trimax Technology Co.,Ltd
 
-OUI:D4D919*
- ID_OUI_FROM_DATABASE=GoPro
+OUI:241B13*
+ ID_OUI_FROM_DATABASE=Shanghai Nutshell Electronic Co., Ltd.
 
-OUI:50C9A0*
- ID_OUI_FROM_DATABASE=SKIPPER Electronics AS
+OUI:B43564*
+ ID_OUI_FROM_DATABASE=Fujian Tian Cheng Electron Science & Technical Development Co.,Ltd.
 
-OUI:A49F89*
- ID_OUI_FROM_DATABASE=Shanghai Rui Rui Communication Technology Co.Ltd.
+OUI:54D1B0*
+ ID_OUI_FROM_DATABASE=Universal Laser Systems, Inc
 
-OUI:D850E6*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:A497BB*
+ ID_OUI_FROM_DATABASE=Hitachi Industrial Equipment Systems Co.,Ltd
 
-OUI:94103E*
- ID_OUI_FROM_DATABASE=Belkin International Inc.
+OUI:FC52CE*
+ ID_OUI_FROM_DATABASE=Control iD
 
-OUI:B4750E*
- ID_OUI_FROM_DATABASE=Belkin International Inc.
+OUI:E804F3*
+ ID_OUI_FROM_DATABASE=Throughtek Co., Ltd.
 
-OUI:346178*
- ID_OUI_FROM_DATABASE=The Boeing Company
+OUI:B85810*
+ ID_OUI_FROM_DATABASE=NUMERA, INC.
 
-OUI:187ED5*
- ID_OUI_FROM_DATABASE=shenzhen kaism technology Co. Ltd
+OUI:9886B1*
+ ID_OUI_FROM_DATABASE=Flyaudio corporation (China)
 
-OUI:841B38*
- ID_OUI_FROM_DATABASE=Shenzhen Excelsecu Data Technology Co.,Ltd
+OUI:28B3AB*
+ ID_OUI_FROM_DATABASE=Genmark Automation
 
-OUI:EC2AF0*
- ID_OUI_FROM_DATABASE=Ypsomed AG
+OUI:44E8A5*
+ ID_OUI_FROM_DATABASE=Myreka Technologies Sdn. Bhd.
 
-OUI:044F8B*
- ID_OUI_FROM_DATABASE=Adapteva, Inc.
+OUI:AC14D2*
+ ID_OUI_FROM_DATABASE=wi-daq, inc.
 
-OUI:9CE7BD*
- ID_OUI_FROM_DATABASE=Winduskorea co., Ltd
+OUI:9C4CAE*
+ ID_OUI_FROM_DATABASE=Mesa Labs
 
-OUI:A0BF50*
- ID_OUI_FROM_DATABASE=S.C. ADD-PRODUCTION S.R.L.
+OUI:7CD9FE*
+ ID_OUI_FROM_DATABASE=New Cosmos Electric Co., Ltd.
 
-OUI:7CB733*
- ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+OUI:E49069*
+ ID_OUI_FROM_DATABASE=Rockwell Automation
 
-OUI:705957*
- ID_OUI_FROM_DATABASE=Medallion Instrumentation Systems
+OUI:B48910*
+ ID_OUI_FROM_DATABASE=Coster T.E. S.P.A.
 
-OUI:6C8366*
- ID_OUI_FROM_DATABASE=Nanjing SAC Power Grid Automation Co., Ltd.
+OUI:A4B1E9*
+ ID_OUI_FROM_DATABASE=Technicolor
 
-OUI:88576D*
- ID_OUI_FROM_DATABASE=XTA Electronics Ltd
+OUI:30AEF6*
+ ID_OUI_FROM_DATABASE=Radio Mobile Access
 
-OUI:F83D4E*
- ID_OUI_FROM_DATABASE=Softlink Automation System Co., Ltd
+OUI:58343B*
+ ID_OUI_FROM_DATABASE=Glovast Technology Ltd.
 
-OUI:FCD817*
- ID_OUI_FROM_DATABASE=Beijing Hesun Technologies Co.Ltd.
+OUI:54A04F*
+ ID_OUI_FROM_DATABASE=t-mac Technologies Ltd
 
-OUI:909F43*
- ID_OUI_FROM_DATABASE=Accutron Instruments Inc.
+OUI:E44F5F*
+ ID_OUI_FROM_DATABASE=EDS Elektronik Destek San.Tic.Ltd.Sti
 
-OUI:50C006*
- ID_OUI_FROM_DATABASE=Carmanah Signs
+OUI:08B738*
+ ID_OUI_FROM_DATABASE=Lite-On Technogy Corp.
 
-OUI:98FB12*
- ID_OUI_FROM_DATABASE=Grand Electronics (HK) Ltd
+OUI:9C6650*
+ ID_OUI_FROM_DATABASE=Glodio Technolies Co.,Ltd Tianjin Branch
 
-OUI:3C1040*
- ID_OUI_FROM_DATABASE=daesung network
+OUI:503955*
+ ID_OUI_FROM_DATABASE=Cisco SPVTG
 
-OUI:B04545*
- ID_OUI_FROM_DATABASE=YACOUB Automation GmbH
+OUI:90CF6F*
+ ID_OUI_FROM_DATABASE=Dlogixs Co Ltd
 
-OUI:701D7F*
- ID_OUI_FROM_DATABASE=Comtech Technology Co., Ltd.
+OUI:68AF13*
+ ID_OUI_FROM_DATABASE=Futura Mobility
 
-OUI:60DB2A*
- ID_OUI_FROM_DATABASE=HNS
+OUI:B82410*
+ ID_OUI_FROM_DATABASE=Magneti Marelli Slovakia s.r.o.
 
-OUI:7CBF88*
- ID_OUI_FROM_DATABASE=Mobilicom LTD
+OUI:A8EF26*
+ ID_OUI_FROM_DATABASE=Tritonwave
 
-OUI:90028A*
- ID_OUI_FROM_DATABASE=Shenzhen Shidean Legrand Electronic Products Co.,Ltd
+OUI:F0D3E7*
+ ID_OUI_FROM_DATABASE=Sensometrix SA
 
-OUI:90356E*
- ID_OUI_FROM_DATABASE=Vodafone Omnitel N.V.
+OUI:7CC8D0*
+ ID_OUI_FROM_DATABASE=TIANJIN YAAN TECHNOLOGY CO., LTD.
 
-OUI:3CCA87*
- ID_OUI_FROM_DATABASE=Iders Incorporated
+OUI:88E917*
+ ID_OUI_FROM_DATABASE=Tamaggo
 
-OUI:08CA45*
- ID_OUI_FROM_DATABASE=Toyou Feiji Electronics Co., Ltd.
+OUI:80AAA4*
+ ID_OUI_FROM_DATABASE=USAG
 
-OUI:9CA9E4*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:5C2479*
+ ID_OUI_FROM_DATABASE=Baltech AG
 
-OUI:E47723*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:E8CBA1*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:C098E5*
- ID_OUI_FROM_DATABASE=University of Michigan
+OUI:F85F2A*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:B8DF6B*
- ID_OUI_FROM_DATABASE=SpotCam Co., Ltd.
+OUI:286094*
+ ID_OUI_FROM_DATABASE=CAPELEC
 
-OUI:742B62*
- ID_OUI_FROM_DATABASE=FUJITSU LIMITED
+OUI:60E956*
+ ID_OUI_FROM_DATABASE=Ayla Networks, Inc
 
-OUI:58BDF9*
- ID_OUI_FROM_DATABASE=Sigrand
+OUI:287184*
+ ID_OUI_FROM_DATABASE=Spire Payments
 
-OUI:344F3F*
- ID_OUI_FROM_DATABASE=IO-Power Technology Co., Ltd.
+OUI:1CB094*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:C0C687*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:FC5090*
+ ID_OUI_FROM_DATABASE=SIMEX Sp. z o.o.
 
-OUI:142BD2*
- ID_OUI_FROM_DATABASE=Armtel Ltd.
+OUI:209BA5*
+ ID_OUI_FROM_DATABASE=JIAXING GLEAD Electronics Co.,Ltd
 
-OUI:54A54B*
- ID_OUI_FROM_DATABASE=NSC Communications Siberia Ltd
+OUI:60843B*
+ ID_OUI_FROM_DATABASE=Soladigm, Inc.
 
-OUI:BC2B6B*
- ID_OUI_FROM_DATABASE=Beijing Haier IC Design Co.,Ltd
+OUI:508C77*
+ ID_OUI_FROM_DATABASE=DIRMEIER Schanktechnik GmbH &Co KG
 
-OUI:642184*
- ID_OUI_FROM_DATABASE=Nippon Denki Kagaku Co.,LTD
+OUI:6089B1*
+ ID_OUI_FROM_DATABASE=Key Digital Systems
 
-OUI:EC3E09*
- ID_OUI_FROM_DATABASE=PERFORMANCE DESIGNED PRODUCTS, LLC
+OUI:080CC9*
+ ID_OUI_FROM_DATABASE=Mission Technology Group, dba Magma
 
-OUI:EC219F*
- ID_OUI_FROM_DATABASE=VidaBox LLC
+OUI:A0F450*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:98D331*
- ID_OUI_FROM_DATABASE=Shenzhen Bolutek Technology Co.,Ltd.
+OUI:44D15E*
+ ID_OUI_FROM_DATABASE=Shanghai Kingto Information Technology Ltd
 
-OUI:3C1A57*
- ID_OUI_FROM_DATABASE=Cardiopulmonary Corp
+OUI:545EBD*
+ ID_OUI_FROM_DATABASE=NL Technologies
 
-OUI:6CF97C*
- ID_OUI_FROM_DATABASE=Nanoptix Inc.
+OUI:C8BBD3*
+ ID_OUI_FROM_DATABASE=Embrane
 
-OUI:58E02C*
- ID_OUI_FROM_DATABASE=Micro Technic A/S
+OUI:ECD19A*
+ ID_OUI_FROM_DATABASE=Zhuhai Liming Industries Co., Ltd
 
-OUI:E481B3*
- ID_OUI_FROM_DATABASE=Shenzhen ACT Industrial Co.,Ltd.
+OUI:346E8A*
+ ID_OUI_FROM_DATABASE=Ecosense
 
-OUI:E4F3E3*
- ID_OUI_FROM_DATABASE=Shanghai iComhome Co.,Ltd.
+OUI:ACEE3B*
+ ID_OUI_FROM_DATABASE=6harmonics Inc
 
-OUI:04CF25*
- ID_OUI_FROM_DATABASE=MANYCOLORS, INC.
+OUI:681605*
+ ID_OUI_FROM_DATABASE=Systems And Electronic Development FZCO
 
-OUI:D41090*
- ID_OUI_FROM_DATABASE=iNFORM Systems AG
+OUI:04F17D*
+ ID_OUI_FROM_DATABASE=Tarana Wireless
 
-OUI:3495DB*
- ID_OUI_FROM_DATABASE=Logitec Corporation
+OUI:A0DC04*
+ ID_OUI_FROM_DATABASE=Becker-Antriebe GmbH
 
-OUI:88142B*
- ID_OUI_FROM_DATABASE=Protonic Holland
+OUI:2CBE97*
+ ID_OUI_FROM_DATABASE=Ingenieurbuero Bickele und Buehler GmbH
 
-OUI:B8241A*
- ID_OUI_FROM_DATABASE=SWEDA INFORMATICA LTDA
+OUI:045A95*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:3806B4*
- ID_OUI_FROM_DATABASE=A.D.C. GmbH
+OUI:B40E96*
+ ID_OUI_FROM_DATABASE=HERAN
 
-OUI:341B22*
- ID_OUI_FROM_DATABASE=Grandbeing Technology Co., Ltd
+OUI:0CAF5A*
+ ID_OUI_FROM_DATABASE=GENUS POWER INFRASTRUCTURES LIMITED
 
-OUI:B4346C*
- ID_OUI_FROM_DATABASE=MATSUNICHI DIGITAL TECHNOLOGY (HONG KONG) LIMITED
+OUI:D0699E*
+ ID_OUI_FROM_DATABASE=LUMINEX Lighting Control Equipment
 
-OUI:9C1465*
- ID_OUI_FROM_DATABASE=Edata Elektronik San. ve Tic. A.Ş.
+OUI:64AE88*
+ ID_OUI_FROM_DATABASE=Polytec GmbH
 
-OUI:587A4D*
- ID_OUI_FROM_DATABASE=Stonesoft Corporation
+OUI:2C542D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:E89218*
- ID_OUI_FROM_DATABASE=Arcontia International AB
+OUI:709E86*
+ ID_OUI_FROM_DATABASE=X6D Limited
 
-OUI:58F387*
- ID_OUI_FROM_DATABASE=HCCP
+OUI:946124*
+ ID_OUI_FROM_DATABASE=Pason Systems
 
-OUI:B0793C*
- ID_OUI_FROM_DATABASE=Revolv Inc
+OUI:DC309C*
+ ID_OUI_FROM_DATABASE=Heyrex Limited
 
-OUI:20CEC4*
- ID_OUI_FROM_DATABASE=Peraso Technologies
+OUI:E81324*
+ ID_OUI_FROM_DATABASE=GuangZhou Bonsoninfo System CO.,LTD
 
-OUI:04848A*
- ID_OUI_FROM_DATABASE=7INOVA TECHNOLOGY LIMITED
+OUI:0036F8*
+ ID_OUI_FROM_DATABASE=Conti Temic microelectronic GmbH
 
-OUI:20C6EB*
- ID_OUI_FROM_DATABASE=Panasonic Corporation AVC Networks Company
+OUI:443839*
+ ID_OUI_FROM_DATABASE=Cumulus Networks, inc
 
-OUI:700FEC*
- ID_OUI_FROM_DATABASE=Poindus Systems Corp.
+OUI:20F002*
+ ID_OUI_FROM_DATABASE=MTData Developments Pty. Ltd.
 
-OUI:78D5B5*
- ID_OUI_FROM_DATABASE=NAVIELEKTRO KY
+OUI:CC912B*
+ ID_OUI_FROM_DATABASE=TE Connectivity Touch Solutions
 
-OUI:E067B3*
- ID_OUI_FROM_DATABASE=C-Data Technology Co., Ltd
+OUI:785262*
+ ID_OUI_FROM_DATABASE=Shenzhen Hojy Software Co., Ltd.
 
-OUI:B887A8*
- ID_OUI_FROM_DATABASE=Step Ahead Innovations Inc.
+OUI:40336C*
+ ID_OUI_FROM_DATABASE=Godrej & Boyce Mfg. co. ltd
 
-OUI:140D4F*
- ID_OUI_FROM_DATABASE=Flextronics International
+OUI:FC1D59*
+ ID_OUI_FROM_DATABASE=I Smart Cities HK Ltd
 
-OUI:B847C6*
- ID_OUI_FROM_DATABASE=SanJet Technology Corp.
+OUI:EC0ED6*
+ ID_OUI_FROM_DATABASE=ITECH INSTRUMENTS SAS
 
-OUI:4CDF3D*
- ID_OUI_FROM_DATABASE=TEAM ENGINEERS ADVANCE TECHNOLOGIES INDIA PVT LTD
+OUI:D0D212*
+ ID_OUI_FROM_DATABASE=K2NET Co.,Ltd.
 
-OUI:70F176*
- ID_OUI_FROM_DATABASE=Data Modul AG
+OUI:9C8EDC*
+ ID_OUI_FROM_DATABASE=Teracom Limited
 
-OUI:205721*
- ID_OUI_FROM_DATABASE=Salix Technology CO., Ltd.
+OUI:146A0B*
+ ID_OUI_FROM_DATABASE=Cypress Electronics Limited
 
-OUI:704CED*
- ID_OUI_FROM_DATABASE=TMRG, Inc.
+OUI:B0750C*
+ ID_OUI_FROM_DATABASE=QA Cafe
 
-OUI:E8516E*
- ID_OUI_FROM_DATABASE=TSMART Inc.
+OUI:B4E1EB*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:7C1AFC*
- ID_OUI_FROM_DATABASE=Dalian Co-Edifice Video Technology Co., Ltd
+OUI:FC2A54*
+ ID_OUI_FROM_DATABASE=Connected Data, Inc.
 
-OUI:C034B4*
- ID_OUI_FROM_DATABASE=Gigastone Corporation
+OUI:A090DE*
+ ID_OUI_FROM_DATABASE=VEEDIMS,LLC
 
-OUI:74ADB7*
- ID_OUI_FROM_DATABASE=China Mobile Group Device Co.,Ltd.
+OUI:AC1461*
+ ID_OUI_FROM_DATABASE=ATAW  Co., Ltd.
 
-OUI:DC6F00*
- ID_OUI_FROM_DATABASE=Livescribe, Inc.
+OUI:508A42*
+ ID_OUI_FROM_DATABASE=Uptmate Technology Co., LTD
 
-OUI:D0737F*
- ID_OUI_FROM_DATABASE=Mini-Circuits
+OUI:8C57FD*
+ ID_OUI_FROM_DATABASE=LVX Western
 
-OUI:A4D094*
- ID_OUI_FROM_DATABASE=Erwin Peters Systemtechnik GmbH
+OUI:002A6A*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0488E2*
- ID_OUI_FROM_DATABASE=Beats Electronics LLC
+OUI:B88F14*
+ ID_OUI_FROM_DATABASE=Analytica GmbH
 
-OUI:D00EA4*
- ID_OUI_FROM_DATABASE=Porsche Cars North America
+OUI:94FAE8*
+ ID_OUI_FROM_DATABASE=Shenzhen Eycom Technology Co., Ltd
 
-OUI:F415FD*
- ID_OUI_FROM_DATABASE=Shanghai Pateo Electronic Equipment Manufacturing Co., Ltd.
+OUI:3CA315*
+ ID_OUI_FROM_DATABASE=Bless Information & Communications Co., Ltd
 
-OUI:2C9464*
- ID_OUI_FROM_DATABASE=Cincoze Co., Ltd.
+OUI:F8DB4C*
+ ID_OUI_FROM_DATABASE=PNY Technologies, INC.
 
-OUI:B050BC*
- ID_OUI_FROM_DATABASE=SHENZHEN BASICOM ELECTRONIC CO.,LTD.
+OUI:F83094*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Telecom Limited
 
-OUI:DC7014*
- ID_OUI_FROM_DATABASE=Private
+OUI:2817CE*
+ ID_OUI_FROM_DATABASE=Omnisense Ltd
 
-OUI:40BC73*
- ID_OUI_FROM_DATABASE=Cronoplast  S.L.
+OUI:28E608*
+ ID_OUI_FROM_DATABASE=Tokheim
 
-OUI:78303B*
- ID_OUI_FROM_DATABASE=Stephen Technologies Co.,Limited
+OUI:E477D4*
+ ID_OUI_FROM_DATABASE=Minrray Industry Co.,Ltd
 
-OUI:78F5E5*
- ID_OUI_FROM_DATABASE=BEGA Gantenbrink-Leuchten KG
+OUI:A4B980*
+ ID_OUI_FROM_DATABASE=Parking BOXX Inc.
 
-OUI:804B20*
- ID_OUI_FROM_DATABASE=Ventilation Control
+OUI:002D76*
+ ID_OUI_FROM_DATABASE=TITECH GmbH
 
-OUI:4007C0*
- ID_OUI_FROM_DATABASE=Railtec Systems GmbH
+OUI:78A183*
+ ID_OUI_FROM_DATABASE=Advidia
 
-OUI:94B8C5*
- ID_OUI_FROM_DATABASE=RuggedCom Inc.
+OUI:F85063*
+ ID_OUI_FROM_DATABASE=Verathon
 
-OUI:8C3C07*
- ID_OUI_FROM_DATABASE=Skiva Technologies, Inc.
+OUI:400E67*
+ ID_OUI_FROM_DATABASE=Tremol Ltd.
 
-OUI:784B08*
- ID_OUI_FROM_DATABASE=f.robotics acquisitions ltd
+OUI:901B0E*
+ ID_OUI_FROM_DATABASE=Fujitsu Technology Solutions GmbH
 
-OUI:0C2D89*
- ID_OUI_FROM_DATABASE=QiiQ Communications Inc.
+OUI:5C6F4F*
+ ID_OUI_FROM_DATABASE=S.A. SISTEL
 
-OUI:604A1C*
- ID_OUI_FROM_DATABASE=SUYIN Corporation
+OUI:B058C4*
+ ID_OUI_FROM_DATABASE=Broadcast Microwave Services, Inc
 
-OUI:A4D3B5*
- ID_OUI_FROM_DATABASE=GLITEL Stropkov, s.r.o.
+OUI:B820E7*
+ ID_OUI_FROM_DATABASE=Guangzhou Horizontal Information & Network Integration Co. Ltd
 
-OUI:A4F3C1*
- ID_OUI_FROM_DATABASE=Open Source Robotics Foundation, Inc.
+OUI:98588A*
+ ID_OUI_FROM_DATABASE=SYSGRATION Ltd.
 
-OUI:6C8B2F*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:842B50*
+ ID_OUI_FROM_DATABASE=Huria Co.,Ltd.
 
-OUI:B863BC*
- ID_OUI_FROM_DATABASE=ROBOTIS, Co, Ltd
+OUI:0C5A19*
+ ID_OUI_FROM_DATABASE=Axtion Sdn Bhd
 
-OUI:C8DDC9*
- ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
+OUI:A00CA1*
+ ID_OUI_FROM_DATABASE=SKTB SKiT
 
-OUI:CC1AFA*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:E09579*
+ ID_OUI_FROM_DATABASE=ORTHOsoft inc, d/b/a Zimmer CAS
 
-OUI:8C5AF0*
- ID_OUI_FROM_DATABASE=Exeltech Solar Products
+OUI:307ECB*
+ ID_OUI_FROM_DATABASE=SFR
 
-OUI:F8DADF*
- ID_OUI_FROM_DATABASE=EcoTech, Inc.
+OUI:90A783*
+ ID_OUI_FROM_DATABASE=JSW PACIFIC CORPORATION
 
-OUI:30AE7B*
- ID_OUI_FROM_DATABASE=Deqing Dusun Electron CO., LTD
+OUI:000830*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:1441E2*
- ID_OUI_FROM_DATABASE=Monaco Enterprises, Inc.
+OUI:CCEF48*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:F07765*
- ID_OUI_FROM_DATABASE=Sourcefire, Inc
+OUI:78A5DD*
+ ID_OUI_FROM_DATABASE=Shenzhen Smarteye Digital Electronics Co., Ltd
 
-OUI:E4F7A1*
- ID_OUI_FROM_DATABASE=Datafox GmbH
+OUI:28B0CC*
+ ID_OUI_FROM_DATABASE=Xenya d.o.o.
 
-OUI:601E02*
- ID_OUI_FROM_DATABASE=EltexAlatau
+OUI:ECE744*
+ ID_OUI_FROM_DATABASE=Omntec mfg. inc
 
-OUI:E47D5A*
- ID_OUI_FROM_DATABASE=Beijing Hanbang Technology Corp.
+OUI:80427C*
+ ID_OUI_FROM_DATABASE=Adolf Tedsen GmbH & Co. KG
 
-OUI:4C6255*
- ID_OUI_FROM_DATABASE=SANMINA-SCI SYSTEM DE MEXICO S.A. DE C.V.
+OUI:F8F7D3*
+ ID_OUI_FROM_DATABASE=International Communications Corporation
 
-OUI:381766*
- ID_OUI_FROM_DATABASE=PROMZAKAZ LTD.
+OUI:B89AED*
+ ID_OUI_FROM_DATABASE=OceanServer Technology, Inc
 
-OUI:204C6D*
- ID_OUI_FROM_DATABASE=Hugo Brennenstuhl Gmbh & Co. KG.
+OUI:E455EA*
+ ID_OUI_FROM_DATABASE=Dedicated Computing
 
-OUI:DC825B*
- ID_OUI_FROM_DATABASE=JANUS, spol. s r.o.
+OUI:00FC58*
+ ID_OUI_FROM_DATABASE=WebSilicon Ltd.
 
-OUI:B08807*
- ID_OUI_FROM_DATABASE=Strata Worldwide
+OUI:64A0E7*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:74D02B*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:18E80F*
+ ID_OUI_FROM_DATABASE=Viking Electronics Inc.
 
-OUI:A4E0E6*
- ID_OUI_FROM_DATABASE=FILIZOLA S.A. PESAGEM E AUTOMACAO
+OUI:EC6264*
+ ID_OUI_FROM_DATABASE=Global411 Internet Services, LLC
 
-OUI:60E00E*
- ID_OUI_FROM_DATABASE=SHINSEI ELECTRONICS CO LTD
+OUI:00F051*
+ ID_OUI_FROM_DATABASE=KWB Gmbh
 
-OUI:30D46A*
- ID_OUI_FROM_DATABASE=Autosales Incorporated
+OUI:F0DEB9*
+ ID_OUI_FROM_DATABASE=ShangHai Y&Y Electronics Co., Ltd
 
-OUI:30AABD*
- ID_OUI_FROM_DATABASE=Shanghai Reallytek Information Technology Co.,Ltd
+OUI:AC54EC*
+ ID_OUI_FROM_DATABASE=IEEE P1823 Standards Working Group
 
-OUI:A4B818*
- ID_OUI_FROM_DATABASE=PENTA Gesellschaft für elektronische Industriedatenverarbeitung mbH
+OUI:C8292A*
+ ID_OUI_FROM_DATABASE=Barun Electronics
 
-OUI:106682*
- ID_OUI_FROM_DATABASE=NEC Platforms, Ltd.
+OUI:E0DADC*
+ ID_OUI_FROM_DATABASE=JVC KENWOOD Corporation
 
-OUI:102831*
- ID_OUI_FROM_DATABASE=Morion Inc.
+OUI:C894D2*
+ ID_OUI_FROM_DATABASE=Jiangsu Datang  Electronic Products Co., Ltd
 
-OUI:D81EDE*
- ID_OUI_FROM_DATABASE=B&W Group Ltd
+OUI:A0423F*
+ ID_OUI_FROM_DATABASE=Tyan Computer Corp
 
-OUI:6897E8*
- ID_OUI_FROM_DATABASE=Society of Motion Picture &amp; Television Engineers
+OUI:5C18B5*
+ ID_OUI_FROM_DATABASE=Talon Communications
 
-OUI:24EA40*
- ID_OUI_FROM_DATABASE=Systeme Helmholz GmbH
+OUI:78BAD0*
+ ID_OUI_FROM_DATABASE=Shinybow Technology Co. Ltd.
 
-OUI:FC58FA*
- ID_OUI_FROM_DATABASE=Shen Zhen Shi Xin Zhong Xin Technology Co.,Ltd.
+OUI:306CBE*
+ ID_OUI_FROM_DATABASE=Skymotion Technology (HK) Limited
 
-OUI:60601F*
- ID_OUI_FROM_DATABASE=SZ DJI TECHNOLOGY CO.,LTD
+OUI:40D559*
+ ID_OUI_FROM_DATABASE=MICRO S.E.R.I.
 
-OUI:E0C6B3*
- ID_OUI_FROM_DATABASE=MilDef AB
+OUI:F82F5B*
+ ID_OUI_FROM_DATABASE=eGauge Systems LLC
 
-OUI:FCDB96*
- ID_OUI_FROM_DATABASE=ENERVALLEY CO., LTD
+OUI:3499D7*
+ ID_OUI_FROM_DATABASE=Universal Flow Monitors, Inc.
 
-OUI:FC8B97*
- ID_OUI_FROM_DATABASE=Shenzhen Gongjin Electronics Co.,Ltd
+OUI:7C336E*
+ ID_OUI_FROM_DATABASE=MEG Electronics Inc.
 
-OUI:882E5A*
- ID_OUI_FROM_DATABASE=storONE
+OUI:D4D249*
+ ID_OUI_FROM_DATABASE=Power Ethernet
 
-OUI:D429EA*
- ID_OUI_FROM_DATABASE=Zimory GmbH
+OUI:10C2BA*
+ ID_OUI_FROM_DATABASE=UTT Co., Ltd.
 
-OUI:C80E95*
- ID_OUI_FROM_DATABASE=OmniLync Inc.
+OUI:F0DA7C*
+ ID_OUI_FROM_DATABASE=RLH INDUSTRIES,INC.
 
-OUI:50ABBF*
- ID_OUI_FROM_DATABASE=Hoseo Telecom
+OUI:40984C*
+ ID_OUI_FROM_DATABASE=Casacom Solutions AG
 
-OUI:C8EEA6*
- ID_OUI_FROM_DATABASE=Shenzhen SHX Technology Co., Ltd
+OUI:B8975A*
+ ID_OUI_FROM_DATABASE=BIOSTAR Microtech Int'l Corp.
 
-OUI:28CBEB*
- ID_OUI_FROM_DATABASE=One
+OUI:4833DD*
+ ID_OUI_FROM_DATABASE=ZENNIO AVANCE Y TECNOLOGIA, S.L.
 
-OUI:18E8DD*
- ID_OUI_FROM_DATABASE=MODULETEK
+OUI:D4D748*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:4CCC34*
- ID_OUI_FROM_DATABASE=Motorola Solutions Inc.
+OUI:9CCAD9*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:F084C9*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:F8313E*
+ ID_OUI_FROM_DATABASE=endeavour GmbH
 
-OUI:E894F6*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:10FC54*
+ ID_OUI_FROM_DATABASE=Shany Electronic Co., Ltd.
 
-OUI:94ACCA*
- ID_OUI_FROM_DATABASE=trivum technologies GmbH
+OUI:D4CA6D*
+ ID_OUI_FROM_DATABASE=Routerboard.com
 
-OUI:7CD844*
- ID_OUI_FROM_DATABASE=Enmotus Inc
+OUI:D8E743*
+ ID_OUI_FROM_DATABASE=Wush, Inc
 
-OUI:F4C6D7*
- ID_OUI_FROM_DATABASE=blackned GmbH
+OUI:908FCF*
+ ID_OUI_FROM_DATABASE=UNO System Co., Ltd
 
-OUI:68A40E*
- ID_OUI_FROM_DATABASE=BSH Bosch and Siemens Home Appliances GmbH
+OUI:903CAE*
+ ID_OUI_FROM_DATABASE=Yunnan KSEC Digital Technology Co.,Ltd.
 
-OUI:4CCA53*
- ID_OUI_FROM_DATABASE=Skyera, Inc.
+OUI:000831*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:081DFB*
- ID_OUI_FROM_DATABASE=Shanghai Mexon Communication Technology Co.,Ltd
+OUI:F0620D*
+ ID_OUI_FROM_DATABASE=Shenzhen Egreat Tech Corp.,Ltd
 
-OUI:D0CDE1*
- ID_OUI_FROM_DATABASE=Scientech Electronics
+OUI:843611*
+ ID_OUI_FROM_DATABASE=hyungseul publishing networks
 
-OUI:94756E*
- ID_OUI_FROM_DATABASE=QinetiQ North America
+OUI:B8FD32*
+ ID_OUI_FROM_DATABASE=Zhejiang ROICX Microelectronics
 
-OUI:543D37*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:D8052E*
+ ID_OUI_FROM_DATABASE=Skyviia Corporation
 
-OUI:0C5521*
- ID_OUI_FROM_DATABASE=Axiros GmbH
+OUI:F83553*
+ ID_OUI_FROM_DATABASE=Magenta Research Ltd.
 
-OUI:A4D856*
- ID_OUI_FROM_DATABASE=Gimbal, Inc
+OUI:DC3C2E*
+ ID_OUI_FROM_DATABASE=Manufacturing System Insights, Inc.
 
-OUI:10A743*
- ID_OUI_FROM_DATABASE=SK Mtek Limited
+OUI:40BC8B*
+ ID_OUI_FROM_DATABASE=itelio GmbH
 
-OUI:E4A7FD*
- ID_OUI_FROM_DATABASE=Cellco Partnership
+OUI:88C36E*
+ ID_OUI_FROM_DATABASE=Beijing Ereneben lnformation Technology Limited
 
-OUI:24F2DD*
- ID_OUI_FROM_DATABASE=Radiant Zemax LLC
+OUI:8CDE52*
+ ID_OUI_FROM_DATABASE=ISSC Technologies Corp.
 
-OUI:80CF41*
- ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
+OUI:A8776F*
+ ID_OUI_FROM_DATABASE=Zonoff
 
-OUI:7C9A9B*
- ID_OUI_FROM_DATABASE=VSE valencia smart energy
+OUI:902B34*
+ ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
 
-OUI:A845E9*
- ID_OUI_FROM_DATABASE=Firich Enterprises CO., LTD.
+OUI:48E1AF*
+ ID_OUI_FROM_DATABASE=Vity
 
-OUI:78995C*
- ID_OUI_FROM_DATABASE=Nationz Technologies Inc
+OUI:C0A0DE*
+ ID_OUI_FROM_DATABASE=Multi Touch Oy
 
-OUI:8CC5E1*
- ID_OUI_FROM_DATABASE=ShenZhen Konka Telecommunication Technology Co.,Ltd
+OUI:943AF0*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:6CB311*
- ID_OUI_FROM_DATABASE=Shenzhen Lianrui Electronics Co.,Ltd
+OUI:B826D4*
+ ID_OUI_FROM_DATABASE=Furukawa Industrial S.A. Produtos Elétricos
 
-OUI:54115F*
- ID_OUI_FROM_DATABASE=Atamo Pty Ltd
+OUI:14E4EC*
+ ID_OUI_FROM_DATABASE=mLogic LLC
 
-OUI:2411D0*
- ID_OUI_FROM_DATABASE=Chongqing Ehs Science and Technology Development Co.,Ltd.
+OUI:AC0DFE*
+ ID_OUI_FROM_DATABASE=Ekon GmbH - myGEKKO
 
-OUI:6C9AC9*
- ID_OUI_FROM_DATABASE=Valentine Research, Inc.
+OUI:005CB1*
+ ID_OUI_FROM_DATABASE=Gospell DIGITAL TECHNOLOGY CO., LTD
 
-OUI:10F49A*
- ID_OUI_FROM_DATABASE=T3 Innovation
+OUI:186751*
+ ID_OUI_FROM_DATABASE=KOMEG Industrielle Messtechnik GmbH
 
-OUI:5865E6*
- ID_OUI_FROM_DATABASE=INFOMARK CO., LTD.
+OUI:B467E9*
+ ID_OUI_FROM_DATABASE=Qingdao GoerTek Technology Co., Ltd.
 
-OUI:60BD91*
- ID_OUI_FROM_DATABASE=Move Innovation
+OUI:B49EE6*
+ ID_OUI_FROM_DATABASE=SHENZHEN TECHNOLOGY CO LTD
 
-OUI:98473C*
- ID_OUI_FROM_DATABASE=SHANGHAI SUNMON COMMUNICATION TECHNOGY CO.,LTD
+OUI:7041B7*
+ ID_OUI_FROM_DATABASE=Edwards Lifesciences LLC
 
-OUI:CC4BFB*
- ID_OUI_FROM_DATABASE=Hellberg Safety AB
+OUI:A849A5*
+ ID_OUI_FROM_DATABASE=Lisantech Co., Ltd.
 
-OUI:ACA22C*
- ID_OUI_FROM_DATABASE=Baycity Technologies Ltd
+OUI:94DB49*
+ ID_OUI_FROM_DATABASE=SITCORP
 
-OUI:6CADEF*
- ID_OUI_FROM_DATABASE=KZ Broadband Technologies, Ltd.
+OUI:8CD17B*
+ ID_OUI_FROM_DATABASE=CG Mobile
 
-OUI:044BFF*
- ID_OUI_FROM_DATABASE=GuangZhou Hedy Digital Technology Co., Ltd
+OUI:144978*
+ ID_OUI_FROM_DATABASE=Digital Control Incorporated
 
-OUI:949BFD*
- ID_OUI_FROM_DATABASE=Trans New Technology, Inc.
+OUI:FC8FC4*
+ ID_OUI_FROM_DATABASE=Intelligent Technology Inc.
 
-OUI:E4EEFD*
- ID_OUI_FROM_DATABASE=MR&D Manufacturing
+OUI:F04A2B*
+ ID_OUI_FROM_DATABASE=PYRAMID Computer GmbH
 
-OUI:105CBF*
- ID_OUI_FROM_DATABASE=DuroByte Inc
+OUI:CC9093*
+ ID_OUI_FROM_DATABASE=Hansong Tehnologies
 
-OUI:88A3CC*
- ID_OUI_FROM_DATABASE=Amatis Controls
+OUI:78F7D0*
+ ID_OUI_FROM_DATABASE=Silverbrook Research
 
-OUI:EC89F5*
- ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
+OUI:F04B6A*
+ ID_OUI_FROM_DATABASE=Scientific Production Association Siberian Arsenal, Ltd.
 
-OUI:083AB8*
- ID_OUI_FROM_DATABASE=Shinoda Plasma Co., Ltd.
+OUI:30DE86*
+ ID_OUI_FROM_DATABASE=Cedac Software S.r.l.
 
-OUI:A0DD97*
- ID_OUI_FROM_DATABASE=PolarLink Technologies, Ltd
+OUI:F013C3*
+ ID_OUI_FROM_DATABASE=SHENZHEN FENDA TECHNOLOGY CO., LTD
 
-OUI:E05597*
- ID_OUI_FROM_DATABASE=Emergent Vision Technologies Inc.
+OUI:CCE7DF*
+ ID_OUI_FROM_DATABASE=American Magnetics, Inc.
 
-OUI:A01917*
- ID_OUI_FROM_DATABASE=Bertel S.p.a.
+OUI:E44E18*
+ ID_OUI_FROM_DATABASE=Gardasoft VisionLimited
 
-OUI:FC9FAE*
- ID_OUI_FROM_DATABASE=Fidus Systems Inc
+OUI:D41C1C*
+ ID_OUI_FROM_DATABASE=RCF S.P.A.
 
-OUI:FC0647*
- ID_OUI_FROM_DATABASE=Cortland Research, LLC
+OUI:8C94CF*
+ ID_OUI_FROM_DATABASE=Encell Technology, Inc.
 
-OUI:20918A*
- ID_OUI_FROM_DATABASE=PROFALUX
+OUI:149090*
+ ID_OUI_FROM_DATABASE=KongTop industrial(shen zhen)CO.,LTD
 
-OUI:7C438F*
- ID_OUI_FROM_DATABASE=E-Band Communications Corp.
+OUI:CCF8F0*
+ ID_OUI_FROM_DATABASE=Xi'an HISU Multimedia Technology Co.,Ltd.
 
-OUI:FC626E*
- ID_OUI_FROM_DATABASE=Beijing MDC Telecom
+OUI:30F9ED*
+ ID_OUI_FROM_DATABASE=Sony Corporation
 
-OUI:C0B339*
- ID_OUI_FROM_DATABASE=Comigo Ltd.
+OUI:28C718*
+ ID_OUI_FROM_DATABASE=Altierre
 
-OUI:DCC0DB*
- ID_OUI_FROM_DATABASE=Shenzhen Kaiboer Technology Co., Ltd.
+OUI:2046A1*
+ ID_OUI_FROM_DATABASE=VECOW Co., Ltd
 
-OUI:7076DD*
- ID_OUI_FROM_DATABASE=Oxyguard International A/S
+OUI:8C271D*
+ ID_OUI_FROM_DATABASE=QuantHouse
 
-OUI:E89AFF*
- ID_OUI_FROM_DATABASE=Fujian Landi Commercial Equipment Co.,Ltd
+OUI:9C8BF1*
+ ID_OUI_FROM_DATABASE=The Warehouse Limited
 
-OUI:683B1E*
- ID_OUI_FROM_DATABASE=Countwise LTD
+OUI:147DC5*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:D4136F*
- ID_OUI_FROM_DATABASE=Asia Pacific Brands
+OUI:944696*
+ ID_OUI_FROM_DATABASE=BaudTec Corporation
 
-OUI:A0A130*
- ID_OUI_FROM_DATABASE=DLI Taiwan Branch office
+OUI:90342B*
+ ID_OUI_FROM_DATABASE=Gatekeeper Systems, Inc.
 
-OUI:ECE915*
- ID_OUI_FROM_DATABASE=STI Ltd
+OUI:D45251*
+ ID_OUI_FROM_DATABASE=IBT Ingenieurbureau Broennimann Thun
 
-OUI:A81FAF*
- ID_OUI_FROM_DATABASE=KRYPTON POLSKA
+OUI:3071B2*
+ ID_OUI_FROM_DATABASE=Hangzhou Prevail Optoelectronic Equipment Co.,LTD.
 
-OUI:087BAA*
- ID_OUI_FROM_DATABASE=SVYAZKOMPLEKTSERVICE, LLC
+OUI:B82ADC*
+ ID_OUI_FROM_DATABASE=EFR Europäische Funk-Rundsteuerung GmbH
 
-OUI:2C26C5*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:B09BD4*
+ ID_OUI_FROM_DATABASE=GNH Software India Private Limited
 
-OUI:BC629F*
- ID_OUI_FROM_DATABASE=Telenet Systems P. Ltd.
+OUI:7CF429*
+ ID_OUI_FROM_DATABASE=NUUO Inc.
 
-OUI:B47F5E*
- ID_OUI_FROM_DATABASE=Foresight Manufacture (S) Pte Ltd
+OUI:B8CDA7*
+ ID_OUI_FROM_DATABASE=Maxeler Technologies Ltd.
 
-OUI:785517*
- ID_OUI_FROM_DATABASE=SankyuElectronics
+OUI:F49461*
+ ID_OUI_FROM_DATABASE=NexGen Storage
 
-OUI:848E96*
- ID_OUI_FROM_DATABASE=Embertec Pty Ltd
+OUI:804731*
+ ID_OUI_FROM_DATABASE=Packet Design, Inc.
 
-OUI:CC3A61*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
+OUI:ACCB09*
+ ID_OUI_FROM_DATABASE=Hefcom Metering (Pty) Ltd
 
-OUI:A00363*
- ID_OUI_FROM_DATABASE=Robert Bosch Healthcare GmbH
+OUI:10EED9*
+ ID_OUI_FROM_DATABASE=Canoga Perkins Corporation
 
-OUI:F0F644*
- ID_OUI_FROM_DATABASE=Whitesky Science & Technology Co.,Ltd.
+OUI:240BB1*
+ ID_OUI_FROM_DATABASE=KOSTAL Industrie Elektrik GmbH
 
-OUI:30D357*
- ID_OUI_FROM_DATABASE=Logosol, Inc.
+OUI:20EEC6*
+ ID_OUI_FROM_DATABASE=Elefirst Science & Tech Co ., ltd
 
-OUI:2C441B*
- ID_OUI_FROM_DATABASE=Spectrum Medical Limited
+OUI:807A7F*
+ ID_OUI_FROM_DATABASE=ABB Genway Xiamen Electrical Equipment CO., LTD
 
-OUI:1C5A6B*
- ID_OUI_FROM_DATABASE=Philips Electronics Nederland BV
+OUI:14373B*
+ ID_OUI_FROM_DATABASE=PROCOM Systems
 
-OUI:A875D6*
- ID_OUI_FROM_DATABASE=FreeTek International Co., Ltd.
+OUI:B81999*
+ ID_OUI_FROM_DATABASE=Nesys
 
-OUI:58EB14*
- ID_OUI_FROM_DATABASE=Proteus Digital Health
+OUI:4C5585*
+ ID_OUI_FROM_DATABASE=Hamilton Systems
 
-OUI:789F87*
- ID_OUI_FROM_DATABASE=Siemens AG I IA PP PRM
+OUI:8CCF5C*
+ ID_OUI_FROM_DATABASE=BEFEGA GmbH
 
-OUI:7C0A50*
- ID_OUI_FROM_DATABASE=J-MEX Inc.
+OUI:A0133B*
+ ID_OUI_FROM_DATABASE=HiTi Digital, Inc.
 
-OUI:40F2E9*
- ID_OUI_FROM_DATABASE=IBM
+OUI:448E12*
+ ID_OUI_FROM_DATABASE=DT Research, Inc.
 
-OUI:9C0473*
- ID_OUI_FROM_DATABASE=Tecmobile (International) Ltd.
+OUI:9C5711*
+ ID_OUI_FROM_DATABASE=Feitian Xunda(Beijing) Aeronautical Information Technology Co., Ltd.
 
-OUI:CC262D*
- ID_OUI_FROM_DATABASE=Verifi, LLC
+OUI:18AD4D*
+ ID_OUI_FROM_DATABASE=Polostar Technology Corporation
 
-OUI:3C8AE5*
- ID_OUI_FROM_DATABASE=Tensun Information Technology(Hangzhou) Co.,LTD
+OUI:4CA74B*
+ ID_OUI_FROM_DATABASE=Alcatel Lucent
 
-OUI:7CB232*
- ID_OUI_FROM_DATABASE=Hui Zhou Gaoshengda Technology Co.,LTD
+OUI:549478*
+ ID_OUI_FROM_DATABASE=Silvershore Technology Partners
 
-OUI:54DF63*
- ID_OUI_FROM_DATABASE=Intrakey technologies GmbH
+OUI:F4B164*
+ ID_OUI_FROM_DATABASE=Lightning Telecommunications Technology Co. Ltd
 
-OUI:7C0187*
- ID_OUI_FROM_DATABASE=Curtis Instruments, Inc.
+OUI:0CFC83*
+ ID_OUI_FROM_DATABASE=Airoha Technology Corp.,
 
-OUI:388EE7*
- ID_OUI_FROM_DATABASE=Fanhattan LLC
+OUI:0C51F7*
+ ID_OUI_FROM_DATABASE=CHAUVIN ARNOUX
 
-OUI:54F666*
- ID_OUI_FROM_DATABASE=Berthold Technologies GmbH and Co.KG
+OUI:70B035*
+ ID_OUI_FROM_DATABASE=Shenzhen Zowee Technology Co., Ltd
 
-OUI:802FDE*
- ID_OUI_FROM_DATABASE=Zurich Instruments AG
+OUI:708105*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:08AF78*
- ID_OUI_FROM_DATABASE=Totus Solutions, Inc.
+OUI:00082F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:5C38E0*
- ID_OUI_FROM_DATABASE=Shanghai Super Electronics Technology Co.,LTD
+OUI:542018*
+ ID_OUI_FROM_DATABASE=Tely Labs
 
-OUI:A0E534*
- ID_OUI_FROM_DATABASE=Stratec Biomedical AG
+OUI:581FEF*
+ ID_OUI_FROM_DATABASE=Tuttnaer LTD
 
-OUI:2891D0*
- ID_OUI_FROM_DATABASE=Stage Tec Entwicklungsgesellschaft für professionelle Audiotechnik mbH
+OUI:F8F25A*
+ ID_OUI_FROM_DATABASE=G-Lab GmbH
 
-OUI:98291D*
- ID_OUI_FROM_DATABASE=Jaguar de Mexico, SA de CV
+OUI:BC779F*
+ ID_OUI_FROM_DATABASE=SBM Co., Ltd.
 
-OUI:18863A*
- ID_OUI_FROM_DATABASE=DIGITAL ART SYSTEM
+OUI:C058A7*
+ ID_OUI_FROM_DATABASE=Pico Systems Co., Ltd.
 
-OUI:F4B72A*
- ID_OUI_FROM_DATABASE=TIME INTERCONNECT LTD
+OUI:04D783*
+ ID_OUI_FROM_DATABASE=Y&H E&C Co.,LTD.
 
-OUI:34D7B4*
- ID_OUI_FROM_DATABASE=Tributary Systems, Inc.
+OUI:00E175*
+ ID_OUI_FROM_DATABASE=AK-Systems Ltd
 
-OUI:F40F9B*
- ID_OUI_FROM_DATABASE=WAVELINK
+OUI:843F4E*
+ ID_OUI_FROM_DATABASE=Tri-Tech Manufacturing, Inc.
 
-OUI:144319*
- ID_OUI_FROM_DATABASE=Creative&Link Technology Limited
+OUI:C83232*
+ ID_OUI_FROM_DATABASE=Hunting Innova
 
-OUI:64F50E*
- ID_OUI_FROM_DATABASE=Kinion Technology Company Limited
+OUI:D059C3*
+ ID_OUI_FROM_DATABASE=CeraMicro Technology Corporation
 
-OUI:28A186*
- ID_OUI_FROM_DATABASE=enblink
+OUI:EC9681*
+ ID_OUI_FROM_DATABASE=2276427 Ontario Inc
 
-OUI:1C9492*
- ID_OUI_FROM_DATABASE=RUAG Schweiz AG
+OUI:B8288B*
+ ID_OUI_FROM_DATABASE=Parker Hannifin Manufacturing (UK) Ltd
 
-OUI:24694A*
- ID_OUI_FROM_DATABASE=Jasmine Systems Inc.
+OUI:5835D9*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:C8C791*
- ID_OUI_FROM_DATABASE=Zero1.tv GmbH
+OUI:802E14*
+ ID_OUI_FROM_DATABASE=azeti Networks AG
 
-OUI:60748D*
- ID_OUI_FROM_DATABASE=Atmaca Elektronik
+OUI:E8944C*
+ ID_OUI_FROM_DATABASE=Cogent Healthcare Systems Ltd
 
-OUI:78D129*
- ID_OUI_FROM_DATABASE=Vicos
+OUI:68F895*
+ ID_OUI_FROM_DATABASE=Redflow Limited
 
-OUI:78AB60*
- ID_OUI_FROM_DATABASE=ABB Australia
+OUI:A88792*
+ ID_OUI_FROM_DATABASE=Broadband Antenna Tracking Systems
 
-OUI:289A4B*
- ID_OUI_FROM_DATABASE=SteelSeries ApS
+OUI:901900*
+ ID_OUI_FROM_DATABASE=SCS SA
 
-OUI:0CC66A*
+OUI:AC932F*
  ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:3078C2*
- ID_OUI_FROM_DATABASE=Innowireless, Co. Ltd.
+OUI:1435B3*
+ ID_OUI_FROM_DATABASE=Future Designs, Inc.
 
-OUI:7CFE28*
- ID_OUI_FROM_DATABASE=Salutron Inc.
+OUI:FCF1CD*
+ ID_OUI_FROM_DATABASE=OPTEX-FA CO.,LTD.
 
-OUI:109FA9*
- ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
+OUI:B03829*
+ ID_OUI_FROM_DATABASE=Siliconware Precision Industries Co., Ltd.
 
-OUI:C0A364*
- ID_OUI_FROM_DATABASE=3D Systems Massachusetts
+OUI:BC0F2B*
+ ID_OUI_FROM_DATABASE=FORTUNE TECHGROUP CO.,LTD
 
-OUI:98A7B0*
- ID_OUI_FROM_DATABASE=MCST ZAO
+OUI:8CF9C9*
+ ID_OUI_FROM_DATABASE=MESADA Technology Co.,Ltd.
 
-OUI:88DC96*
- ID_OUI_FROM_DATABASE=SENAO Networks, Inc.
+OUI:E42AD3*
+ ID_OUI_FROM_DATABASE=Magneti Marelli S.p.A. Powertrain
 
-OUI:C455C2*
- ID_OUI_FROM_DATABASE=Bach-Simpson
+OUI:FC10BD*
+ ID_OUI_FROM_DATABASE=Control Sistematizado S.A.
 
-OUI:ECA29B*
- ID_OUI_FROM_DATABASE=Kemppi Oy
+OUI:443719*
+ ID_OUI_FROM_DATABASE=2 Save Energy Ltd
 
-OUI:04CE14*
- ID_OUI_FROM_DATABASE=Wilocity LTD.
+OUI:E83EB6*
+ ID_OUI_FROM_DATABASE=RIM
 
-OUI:802AFA*
- ID_OUI_FROM_DATABASE=Germaneers GmbH
+OUI:94FD1D*
+ ID_OUI_FROM_DATABASE=WhereWhen Corp
 
-OUI:1C8464*
- ID_OUI_FROM_DATABASE=FORMOSA WIRELESS COMMUNICATION CORP.
+OUI:0CE82F*
+ ID_OUI_FROM_DATABASE=Bonfiglioli Vectron GmbH
 
-OUI:D867D9*
+OUI:C0626B*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:B4218A*
- ID_OUI_FROM_DATABASE=Dog Hunter LLC
+OUI:B4B88D*
+ ID_OUI_FROM_DATABASE=Thuh Company
 
-OUI:F8A03D*
- ID_OUI_FROM_DATABASE=Dinstar Technologies Co., Ltd.
+OUI:60F59C*
+ ID_OUI_FROM_DATABASE=CRU-Dataport
 
-OUI:D08CFF*
- ID_OUI_FROM_DATABASE=UPWIS AB
+OUI:4C73A5*
+ ID_OUI_FROM_DATABASE=KOVE
 
-OUI:9C066E*
- ID_OUI_FROM_DATABASE=Hytera Communications Corporation Limited
+OUI:F86971*
+ ID_OUI_FROM_DATABASE=Seibu Electric Co.,
 
-OUI:746A89*
- ID_OUI_FROM_DATABASE=Rezolt Corporation
+OUI:44AA27*
+ ID_OUI_FROM_DATABASE=udworks Co., Ltd.
 
-OUI:68D1FD*
- ID_OUI_FROM_DATABASE=Shenzhen Trimax Technology Co.,Ltd
+OUI:6CAD3F*
+ ID_OUI_FROM_DATABASE=Hubbell Building Automation, Inc.
 
-OUI:241B13*
- ID_OUI_FROM_DATABASE=Shanghai Nutshell Electronic Co., Ltd.
+OUI:8427CE*
+ ID_OUI_FROM_DATABASE=Corporation of the Presiding Bishop of The Church of Jesus Christ of Latter-day Saints
 
-OUI:B43564*
- ID_OUI_FROM_DATABASE=Fujian Tian Cheng Electron Science & Technical Development Co.,Ltd.
+OUI:D428B2*
+ ID_OUI_FROM_DATABASE=ioBridge, Inc.
 
-OUI:54D1B0*
- ID_OUI_FROM_DATABASE=Universal Laser Systems, Inc
+OUI:90B8D0*
+ ID_OUI_FROM_DATABASE=Joyent, Inc.
 
-OUI:A497BB*
- ID_OUI_FROM_DATABASE=Hitachi Industrial Equipment Systems Co.,Ltd
+OUI:909060*
+ ID_OUI_FROM_DATABASE=RSI VIDEO TECHNOLOGIES
 
-OUI:FC52CE*
- ID_OUI_FROM_DATABASE=Control iD
+OUI:281471*
+ ID_OUI_FROM_DATABASE=Lantis co., LTD.
 
-OUI:E804F3*
- ID_OUI_FROM_DATABASE=Throughtek Co., Ltd.
+OUI:1407E0*
+ ID_OUI_FROM_DATABASE=Abrantix AG
 
-OUI:B85810*
- ID_OUI_FROM_DATABASE=NUMERA, INC.
+OUI:DCCF94*
+ ID_OUI_FROM_DATABASE=Beijing Rongcheng Hutong Technology Co., Ltd.
 
-OUI:2CAB25*
- ID_OUI_FROM_DATABASE=Shenzhen Gongjin Electronics Co.,Ltd
+OUI:18E288*
+ ID_OUI_FROM_DATABASE=STT Condigi
 
-OUI:AC6E1A*
- ID_OUI_FROM_DATABASE=Shenzhen Gongjin Electronics Co.,Ltd
+OUI:68876B*
+ ID_OUI_FROM_DATABASE=INQ Mobile Limited
 
-OUI:9886B1*
- ID_OUI_FROM_DATABASE=Flyaudio corporation (China)
+OUI:9866EA*
+ ID_OUI_FROM_DATABASE=Industrial Control Communications, Inc.
 
-OUI:28B3AB*
- ID_OUI_FROM_DATABASE=Genmark Automation
+OUI:F4A52A*
+ ID_OUI_FROM_DATABASE=Hawa Technologies Inc
 
-OUI:44E8A5*
- ID_OUI_FROM_DATABASE=Myreka Technologies Sdn. Bhd.
+OUI:90CF15*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:AC14D2*
- ID_OUI_FROM_DATABASE=wi-daq, inc.
+OUI:B8D49D*
+ ID_OUI_FROM_DATABASE=M Seven System Ltd.
 
-OUI:9C4CAE*
- ID_OUI_FROM_DATABASE=Mesa Labs
+OUI:B0A10A*
+ ID_OUI_FROM_DATABASE=Pivotal Systems Corporation
 
-OUI:7CD9FE*
- ID_OUI_FROM_DATABASE=New Cosmos Electric Co., Ltd.
+OUI:48F47D*
+ ID_OUI_FROM_DATABASE=TechVision Holding  Internation Limited
 
-OUI:E49069*
- ID_OUI_FROM_DATABASE=Rockwell Automation
+OUI:6C391D*
+ ID_OUI_FROM_DATABASE=Beijing ZhongHuaHun Network Information center
 
-OUI:B48910*
- ID_OUI_FROM_DATABASE=Coster T.E. S.P.A.
+OUI:64D241*
+ ID_OUI_FROM_DATABASE=Keith & Koep GmbH
 
-OUI:A4B1E9*
- ID_OUI_FROM_DATABASE=Technicolor
+OUI:101212*
+ ID_OUI_FROM_DATABASE=Vivo International Corporation Pty Ltd
 
-OUI:30AEF6*
- ID_OUI_FROM_DATABASE=Radio Mobile Access
+OUI:5087B8*
+ ID_OUI_FROM_DATABASE=Nuvyyo Inc
 
-OUI:58343B*
- ID_OUI_FROM_DATABASE=Glovast Technology Ltd.
+OUI:E41289*
+ ID_OUI_FROM_DATABASE=topsystem Systemhaus GmbH
 
-OUI:54A04F*
- ID_OUI_FROM_DATABASE=t-mac Technologies Ltd
+OUI:A4134E*
+ ID_OUI_FROM_DATABASE=Luxul
 
-OUI:E44F5F*
- ID_OUI_FROM_DATABASE=EDS Elektronik Destek San.Tic.Ltd.Sti
+OUI:B09928*
+ ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
-OUI:08B738*
- ID_OUI_FROM_DATABASE=Lite-On Technogy Corp.
+OUI:8C11CB*
+ ID_OUI_FROM_DATABASE=ABUS Security-Center GmbH & Co. KG
 
-OUI:9C6650*
- ID_OUI_FROM_DATABASE=Glodio Technolies Co.,Ltd Tianjin Branch
+OUI:806459*
+ ID_OUI_FROM_DATABASE=Nimbus Inc.
 
-OUI:503955*
- ID_OUI_FROM_DATABASE=Cisco SPVTG
+OUI:A45A1C*
+ ID_OUI_FROM_DATABASE=smart-electronic GmbH
 
-OUI:90CF6F*
- ID_OUI_FROM_DATABASE=Dlogixs Co Ltd
+OUI:8C89A5*
+ ID_OUI_FROM_DATABASE=Micro-Star INT'L CO., LTD
 
-OUI:68AF13*
- ID_OUI_FROM_DATABASE=Futura Mobility
+OUI:3C672C*
+ ID_OUI_FROM_DATABASE=Sciovid Inc.
 
-OUI:B82410*
- ID_OUI_FROM_DATABASE=Magneti Marelli Slovakia s.r.o.
+OUI:18D071*
+ ID_OUI_FROM_DATABASE=DASAN CO., LTD.
 
-OUI:A8EF26*
- ID_OUI_FROM_DATABASE=Tritonwave
+OUI:38D135*
+ ID_OUI_FROM_DATABASE=EasyIO Corporation Sdn. Bhd.
 
-OUI:F0D3E7*
- ID_OUI_FROM_DATABASE=Sensometrix SA
+OUI:184E94*
+ ID_OUI_FROM_DATABASE=MESSOA TECHNOLOGIES INC.
 
-OUI:7CC8D0*
- ID_OUI_FROM_DATABASE=TIANJIN YAAN TECHNOLOGY CO., LTD.
+OUI:94D93C*
+ ID_OUI_FROM_DATABASE=ENELPS
 
-OUI:88E917*
- ID_OUI_FROM_DATABASE=Tamaggo
+OUI:DC9B1E*
+ ID_OUI_FROM_DATABASE=Intercom, Inc.
 
-OUI:80AAA4*
- ID_OUI_FROM_DATABASE=USAG
+OUI:5C7757*
+ ID_OUI_FROM_DATABASE=Haivision Network Video
 
-OUI:5C2479*
- ID_OUI_FROM_DATABASE=Baltech AG
+OUI:E8B4AE*
+ ID_OUI_FROM_DATABASE=Shenzhen C&D Electronics Co.,Ltd
 
-OUI:E8CBA1*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:C45600*
+ ID_OUI_FROM_DATABASE=Galleon Embedded Computing
 
-OUI:F85F2A*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:E42FF6*
+ ID_OUI_FROM_DATABASE=Unicore communication Inc.
 
-OUI:286094*
- ID_OUI_FROM_DATABASE=CAPELEC
+OUI:B8F4D0*
+ ID_OUI_FROM_DATABASE=Herrmann Ultraschalltechnik GmbH & Co. Kg
 
-OUI:60E956*
- ID_OUI_FROM_DATABASE=Ayla Networks, Inc
+OUI:B4F323*
+ ID_OUI_FROM_DATABASE=PETATEL INC.
 
-OUI:287184*
- ID_OUI_FROM_DATABASE=Spire Payments
+OUI:C81E8E*
+ ID_OUI_FROM_DATABASE=ADV Security (S) Pte Ltd
 
-OUI:1CB094*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:ACCABA*
+ ID_OUI_FROM_DATABASE=Midokura Co., Ltd.
 
-OUI:FC5090*
- ID_OUI_FROM_DATABASE=SIMEX Sp. z o.o.
+OUI:9C417C*
+ ID_OUI_FROM_DATABASE=Hame  Technology Co.,  Limited
 
-OUI:209BA5*
- ID_OUI_FROM_DATABASE=JIAXING GLEAD Electronics Co.,Ltd
+OUI:10768A*
+ ID_OUI_FROM_DATABASE=EoCell
 
-OUI:60843B*
- ID_OUI_FROM_DATABASE=Soladigm, Inc.
+OUI:044665*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:508C77*
- ID_OUI_FROM_DATABASE=DIRMEIER Schanktechnik GmbH &Co KG
+OUI:D0131E*
+ ID_OUI_FROM_DATABASE=Sunrex Technology Corp
 
-OUI:6089B1*
- ID_OUI_FROM_DATABASE=Key Digital Systems
+OUI:380197*
+ ID_OUI_FROM_DATABASE=TSST Global,Inc
 
-OUI:080CC9*
- ID_OUI_FROM_DATABASE=Mission Technology Group, dba Magma
+OUI:B40142*
+ ID_OUI_FROM_DATABASE=GCI Science & Technology Co.,LTD
 
-OUI:A0F450*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:846EB1*
+ ID_OUI_FROM_DATABASE=Park Assist LLC
 
-OUI:44D15E*
- ID_OUI_FROM_DATABASE=Shanghai Kingto Information Technology Ltd
+OUI:6C504D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:545EBD*
- ID_OUI_FROM_DATABASE=NL Technologies
+OUI:C0C1C0*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
-OUI:C8BBD3*
- ID_OUI_FROM_DATABASE=Embrane
+OUI:1CBD0E*
+ ID_OUI_FROM_DATABASE=Amplified Engineering Pty Ltd
 
-OUI:ECD19A*
- ID_OUI_FROM_DATABASE=Zhuhai Liming Industries Co., Ltd
+OUI:F0A764*
+ ID_OUI_FROM_DATABASE=GST Co., Ltd.
 
-OUI:346E8A*
- ID_OUI_FROM_DATABASE=Ecosense
+OUI:A0F217*
+ ID_OUI_FROM_DATABASE=GE Medical System(China) Co., Ltd.
 
-OUI:ACEE3B*
- ID_OUI_FROM_DATABASE=6harmonics Inc
+OUI:643409*
+ ID_OUI_FROM_DATABASE=BITwave Pte Ltd
 
-OUI:681605*
- ID_OUI_FROM_DATABASE=Systems And Electronic Development FZCO
+OUI:20D5AB*
+ ID_OUI_FROM_DATABASE=Korea Infocom Co.,Ltd.
 
-OUI:04F17D*
- ID_OUI_FROM_DATABASE=Tarana Wireless
+OUI:F05849*
+ ID_OUI_FROM_DATABASE=CareView Communications
 
-OUI:A0DC04*
- ID_OUI_FROM_DATABASE=Becker-Antriebe GmbH
+OUI:BC15A6*
+ ID_OUI_FROM_DATABASE=Taiwan Jantek Electronics,Ltd.
 
-OUI:8CC121*
- ID_OUI_FROM_DATABASE=Panasonic Corporation AVC Networks Company
+OUI:241A8C*
+ ID_OUI_FROM_DATABASE=Squarehead Technology AS
 
-OUI:2CBE97*
- ID_OUI_FROM_DATABASE=Ingenieurbuero Bickele und Buehler GmbH
+OUI:1083D2*
+ ID_OUI_FROM_DATABASE=Microseven Systems, LLC
 
-OUI:045A95*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:F05D89*
+ ID_OUI_FROM_DATABASE=Dycon Limited
 
-OUI:B40E96*
- ID_OUI_FROM_DATABASE=HERAN
+OUI:AC02CF*
+ ID_OUI_FROM_DATABASE=RW Tecnologia Industria e Comercio Ltda
 
-OUI:0CAF5A*
- ID_OUI_FROM_DATABASE=GENUS POWER INFRASTRUCTURES LIMITED
+OUI:9067B5*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent
 
-OUI:D0699E*
- ID_OUI_FROM_DATABASE=LUMINEX Lighting Control Equipment
+OUI:40987B*
+ ID_OUI_FROM_DATABASE=Aisino Corporation
 
-OUI:64AE88*
- ID_OUI_FROM_DATABASE=Polytec GmbH
+OUI:6C2E33*
+ ID_OUI_FROM_DATABASE=Accelink Technologies Co.,Ltd.
 
-OUI:2C542D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:4CEDDE*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
-OUI:709E86*
- ID_OUI_FROM_DATABASE=X6D Limited
+OUI:E8E08F*
+ ID_OUI_FROM_DATABASE=GRAVOTECH MARKING SAS
 
-OUI:946124*
- ID_OUI_FROM_DATABASE=Pason Systems
+OUI:78B6C1*
+ ID_OUI_FROM_DATABASE=AOBO Telecom Co.,Ltd
 
-OUI:DC309C*
- ID_OUI_FROM_DATABASE=Heyrex Limited
+OUI:B8BA68*
+ ID_OUI_FROM_DATABASE=Xi'an Jizhong Digital Communication Co.,Ltd
 
-OUI:E81324*
- ID_OUI_FROM_DATABASE=GuangZhou Bonsoninfo System CO.,LTD
+OUI:BC38D2*
+ ID_OUI_FROM_DATABASE=Pandachip Limited
 
-OUI:0036F8*
- ID_OUI_FROM_DATABASE=Conti Temic microelectronic GmbH
+OUI:14EE9D*
+ ID_OUI_FROM_DATABASE=AirNav Systems LLC
 
-OUI:443839*
- ID_OUI_FROM_DATABASE=Cumulus Networks, inc
+OUI:48174C*
+ ID_OUI_FROM_DATABASE=MicroPower technologies
 
-OUI:20F002*
- ID_OUI_FROM_DATABASE=MTData Developments Pty. Ltd.
+OUI:F81037*
+ ID_OUI_FROM_DATABASE=Atopia Systems, LP
 
-OUI:CC912B*
- ID_OUI_FROM_DATABASE=TE Connectivity Touch Solutions
+OUI:64F987*
+ ID_OUI_FROM_DATABASE=Avvasi Inc.
 
-OUI:785262*
- ID_OUI_FROM_DATABASE=Shenzhen Hojy Software Co., Ltd.
+OUI:3C7437*
+ ID_OUI_FROM_DATABASE=RIM
 
-OUI:40336C*
- ID_OUI_FROM_DATABASE=Godrej & Boyce Mfg. co. ltd
+OUI:64DC01*
+ ID_OUI_FROM_DATABASE=Static Systems Group PLC
 
-OUI:FC1D59*
- ID_OUI_FROM_DATABASE=I Smart Cities HK Ltd
+OUI:1CF5E7*
+ ID_OUI_FROM_DATABASE=Turtle Industry Co., Ltd.
 
-OUI:EC0ED6*
- ID_OUI_FROM_DATABASE=ITECH INSTRUMENTS SAS
+OUI:2C8065*
+ ID_OUI_FROM_DATABASE=HARTING Inc. of North America
 
-OUI:D0D212*
- ID_OUI_FROM_DATABASE=K2NET Co.,Ltd.
+OUI:F8F014*
+ ID_OUI_FROM_DATABASE=RackWare Inc.
 
-OUI:9C8EDC*
- ID_OUI_FROM_DATABASE=Teracom Limited
+OUI:E41C4B*
+ ID_OUI_FROM_DATABASE=V2 TECHNOLOGY, INC.
+
+OUI:E0143E*
+ ID_OUI_FROM_DATABASE=Modoosis Inc.
+
+OUI:204AAA*
+ ID_OUI_FROM_DATABASE=Hanscan Spain S.A.
 
-OUI:146A0B*
- ID_OUI_FROM_DATABASE=Cypress Electronics Limited
+OUI:F02572*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:B0750C*
- ID_OUI_FROM_DATABASE=QA Cafe
+OUI:8091C0*
+ ID_OUI_FROM_DATABASE=AgileMesh, Inc.
 
-OUI:B4E1EB*
- ID_OUI_FROM_DATABASE=Private
+OUI:0CF0B4*
+ ID_OUI_FROM_DATABASE=Globalsat International Technology Ltd
 
-OUI:FC2A54*
- ID_OUI_FROM_DATABASE=Connected Data, Inc.
+OUI:BCC61A*
+ ID_OUI_FROM_DATABASE=SPECTRA EMBEDDED SYSTEMS
 
-OUI:A090DE*
- ID_OUI_FROM_DATABASE=VEEDIMS,LLC
+OUI:48DF1C*
+ ID_OUI_FROM_DATABASE=Wuhan NEC Fibre Optic Communications industry Co. Ltd
 
-OUI:AC1461*
- ID_OUI_FROM_DATABASE=ATAW  Co., Ltd.
+OUI:D0D3FC*
+ ID_OUI_FROM_DATABASE=Mios, Ltd.
 
-OUI:508A42*
- ID_OUI_FROM_DATABASE=Uptmate Technology Co., LTD
+OUI:989449*
+ ID_OUI_FROM_DATABASE=Skyworth Wireless Technology Ltd.
 
-OUI:8C57FD*
- ID_OUI_FROM_DATABASE=LVX Western
+OUI:C8DF7C*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:002A6A*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:F8C678*
+ ID_OUI_FROM_DATABASE=Carefusion
 
-OUI:B88F14*
- ID_OUI_FROM_DATABASE=Analytica GmbH
+OUI:FC3598*
+ ID_OUI_FROM_DATABASE=Favite Inc.
 
-OUI:94FAE8*
- ID_OUI_FROM_DATABASE=Shenzhen Eycom Technology Co., Ltd
+OUI:A0AAFD*
+ ID_OUI_FROM_DATABASE=EraThink Technologies Corp.
 
-OUI:3CA315*
- ID_OUI_FROM_DATABASE=Bless Information & Communications Co., Ltd
+OUI:801F02*
+ ID_OUI_FROM_DATABASE=Edimax Technology Co. Ltd.
 
-OUI:F8DB4C*
- ID_OUI_FROM_DATABASE=PNY Technologies, INC.
+OUI:E03E7D*
+ ID_OUI_FROM_DATABASE=data-complex GmbH
 
-OUI:F83094*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent Telecom Limited
+OUI:A4E32E*
+ ID_OUI_FROM_DATABASE=Silicon & Software Systems Ltd.
 
-OUI:2817CE*
- ID_OUI_FROM_DATABASE=Omnisense Ltd
+OUI:1C19DE*
+ ID_OUI_FROM_DATABASE=eyevis GmbH
 
-OUI:28E608*
- ID_OUI_FROM_DATABASE=Tokheim
+OUI:DC07C1*
+ ID_OUI_FROM_DATABASE=HangZhou QiYang Technology Co.,Ltd.
 
-OUI:E477D4*
- ID_OUI_FROM_DATABASE=Minrray Industry Co.,Ltd
+OUI:D8FE8F*
+ ID_OUI_FROM_DATABASE=IDFone Co., Ltd.
 
-OUI:A4B980*
- ID_OUI_FROM_DATABASE=Parking BOXX Inc.
+OUI:0006F6*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:002D76*
- ID_OUI_FROM_DATABASE=TITECH GmbH
+OUI:ACAB8D*
+ ID_OUI_FROM_DATABASE=Lyngso Marine A/S
 
-OUI:78A183*
- ID_OUI_FROM_DATABASE=Advidia
+OUI:E8995A*
+ ID_OUI_FROM_DATABASE=PiiGAB, Processinformation i Goteborg AB
 
-OUI:F85063*
- ID_OUI_FROM_DATABASE=Verathon
+OUI:D4E32C*
+ ID_OUI_FROM_DATABASE=S. Siedle & Sohne
 
-OUI:400E67*
- ID_OUI_FROM_DATABASE=Tremol Ltd.
+OUI:68DCE8*
+ ID_OUI_FROM_DATABASE=PacketStorm Communications
 
-OUI:901B0E*
- ID_OUI_FROM_DATABASE=Fujitsu Technology Solutions GmbH
+OUI:78223D*
+ ID_OUI_FROM_DATABASE=Affirmed Networks
 
-OUI:5C6F4F*
- ID_OUI_FROM_DATABASE=S.A. SISTEL
+OUI:60C980*
+ ID_OUI_FROM_DATABASE=Trymus
 
-OUI:B058C4*
- ID_OUI_FROM_DATABASE=Broadcast Microwave Services, Inc
+OUI:94CDAC*
+ ID_OUI_FROM_DATABASE=Creowave Oy
 
-OUI:B820E7*
- ID_OUI_FROM_DATABASE=Guangzhou Horizontal Information & Network Integration Co. Ltd
+OUI:F4DCDA*
+ ID_OUI_FROM_DATABASE=Zhuhai Jiahe Communication Technology Co., limited
 
-OUI:98588A*
- ID_OUI_FROM_DATABASE=SYSGRATION Ltd.
+OUI:100D32*
+ ID_OUI_FROM_DATABASE=Embedian, Inc.
 
-OUI:842B50*
- ID_OUI_FROM_DATABASE=Huria Co.,Ltd.
+OUI:D82986*
+ ID_OUI_FROM_DATABASE=Best Wish Technology LTD
 
-OUI:0C5A19*
- ID_OUI_FROM_DATABASE=Axtion Sdn Bhd
+OUI:C03B8F*
+ ID_OUI_FROM_DATABASE=Minicom Digital Signage
 
-OUI:A00CA1*
- ID_OUI_FROM_DATABASE=SKTB SKiT
+OUI:A4218A*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:E09579*
- ID_OUI_FROM_DATABASE=ORTHOsoft inc, d/b/a Zimmer CAS
+OUI:6C0460*
+ ID_OUI_FROM_DATABASE=RBH Access Technologies Inc.
 
-OUI:307ECB*
- ID_OUI_FROM_DATABASE=SFR
+OUI:5C864A*
+ ID_OUI_FROM_DATABASE=Secret Labs LLC
 
-OUI:90A783*
- ID_OUI_FROM_DATABASE=JSW PACIFIC CORPORATION
+OUI:B8BA72*
+ ID_OUI_FROM_DATABASE=Cynove
 
-OUI:000830*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:C00D7E*
+ ID_OUI_FROM_DATABASE=Additech, Inc.
 
-OUI:CCEF48*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:68784C*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:78A5DD*
- ID_OUI_FROM_DATABASE=Shenzhen Smarteye Digital Electronics Co., Ltd
+OUI:6C626D*
+ ID_OUI_FROM_DATABASE=Micro-Star INT'L CO., LTD
 
-OUI:28B0CC*
- ID_OUI_FROM_DATABASE=Xenya d.o.o.
+OUI:8841C1*
+ ID_OUI_FROM_DATABASE=ORBISAT DA AMAZONIA IND E AEROL SA
 
-OUI:ECE744*
- ID_OUI_FROM_DATABASE=Omntec mfg. inc
+OUI:18B209*
+ ID_OUI_FROM_DATABASE=Torrey Pines Logic, Inc
 
-OUI:80427C*
- ID_OUI_FROM_DATABASE=Adolf Tedsen GmbH & Co. KG
+OUI:3018CF*
+ ID_OUI_FROM_DATABASE=DEOS control systems GmbH
 
-OUI:F8F7D3*
- ID_OUI_FROM_DATABASE=International Communications Corporation
+OUI:4CF737*
+ ID_OUI_FROM_DATABASE=SamJi Electronics Co., Ltd
 
-OUI:B89AED*
- ID_OUI_FROM_DATABASE=OceanServer Technology, Inc
+OUI:40406B*
+ ID_OUI_FROM_DATABASE=Icomera
 
-OUI:E455EA*
- ID_OUI_FROM_DATABASE=Dedicated Computing
+OUI:1880CE*
+ ID_OUI_FROM_DATABASE=Barberry Solutions Ltd
 
-OUI:00FC58*
- ID_OUI_FROM_DATABASE=WebSilicon Ltd.
+OUI:CC43E3*
+ ID_OUI_FROM_DATABASE=Trump s.a.
 
-OUI:64A0E7*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:6C22AB*
+ ID_OUI_FROM_DATABASE=Ainsworth Game Technology
 
-OUI:18E80F*
- ID_OUI_FROM_DATABASE=Viking Electronics Inc.
+OUI:3C106F*
+ ID_OUI_FROM_DATABASE=ALBAHITH TECHNOLOGIES
 
-OUI:EC6264*
- ID_OUI_FROM_DATABASE=Global411 Internet Services, LLC
+OUI:7CE044*
+ ID_OUI_FROM_DATABASE=NEON Inc
 
-OUI:00F051*
- ID_OUI_FROM_DATABASE=KWB Gmbh
+OUI:64D02D*
+ ID_OUI_FROM_DATABASE=Next Generation Integration (NGI)
 
-OUI:F0DEB9*
- ID_OUI_FROM_DATABASE=ShangHai Y&Y Electronics Co., Ltd
+OUI:A04041*
+ ID_OUI_FROM_DATABASE=SAMWONFA Co.,Ltd.
 
-OUI:AC54EC*
- ID_OUI_FROM_DATABASE=IEEE P1823 Standards Working Group
+OUI:788C54*
+ ID_OUI_FROM_DATABASE=Eltek Technologies LTD
 
-OUI:C8292A*
- ID_OUI_FROM_DATABASE=Barun Electronics
+OUI:9411DA*
+ ID_OUI_FROM_DATABASE=ITF Fröschl GmbH
 
-OUI:E0DADC*
- ID_OUI_FROM_DATABASE=JVC KENWOOD Corporation
+OUI:10E8EE*
+ ID_OUI_FROM_DATABASE=PhaseSpace
 
-OUI:C894D2*
- ID_OUI_FROM_DATABASE=Jiangsu Datang  Electronic Products Co., Ltd
+OUI:A47C1F*
+ ID_OUI_FROM_DATABASE=Cobham plc
 
-OUI:A0423F*
- ID_OUI_FROM_DATABASE=Tyan Computer Corp
+OUI:8C1F94*
+ ID_OUI_FROM_DATABASE=RF Surgical System Inc.
 
-OUI:5C18B5*
- ID_OUI_FROM_DATABASE=Talon Communications
+OUI:74A4A7*
+ ID_OUI_FROM_DATABASE=QRS Music Technologies, Inc.
 
-OUI:78BAD0*
- ID_OUI_FROM_DATABASE=Shinybow Technology Co. Ltd.
+OUI:8039E5*
+ ID_OUI_FROM_DATABASE=PATLITE CORPORATION
 
-OUI:306CBE*
- ID_OUI_FROM_DATABASE=Skymotion Technology (HK) Limited
+OUI:BCFFAC*
+ ID_OUI_FROM_DATABASE=TOPCON CORPORATION
 
-OUI:40D559*
- ID_OUI_FROM_DATABASE=MICRO S.E.R.I.
+OUI:602A54*
+ ID_OUI_FROM_DATABASE=CardioTek B.V.
 
-OUI:F82F5B*
- ID_OUI_FROM_DATABASE=eGauge Systems LLC
+OUI:1C3DE7*
+ ID_OUI_FROM_DATABASE=Sigma Koki Co.,Ltd.
 
-OUI:3499D7*
- ID_OUI_FROM_DATABASE=Universal Flow Monitors, Inc.
+OUI:482CEA*
+ ID_OUI_FROM_DATABASE=Motorola Inc Business Light Radios
 
-OUI:7C336E*
- ID_OUI_FROM_DATABASE=MEG Electronics Inc.
+OUI:70E139*
+ ID_OUI_FROM_DATABASE=3view Ltd
 
-OUI:D4D249*
- ID_OUI_FROM_DATABASE=Power Ethernet
+OUI:AC6123*
+ ID_OUI_FROM_DATABASE=Drivven, Inc.
 
-OUI:10C2BA*
- ID_OUI_FROM_DATABASE=UTT Co., Ltd.
+OUI:3C04BF*
+ ID_OUI_FROM_DATABASE=PRAVIS SYSTEMS Co.Ltd.,
 
-OUI:F0DA7C*
- ID_OUI_FROM_DATABASE=RLH INDUSTRIES,INC.
+OUI:443D21*
+ ID_OUI_FROM_DATABASE=Nuvolt
 
-OUI:40984C*
- ID_OUI_FROM_DATABASE=Casacom Solutions AG
+OUI:749050*
+ ID_OUI_FROM_DATABASE=Renesas Electronics Corporation
 
-OUI:B8975A*
- ID_OUI_FROM_DATABASE=BIOSTAR Microtech Int'l Corp.
+OUI:7CBB6F*
+ ID_OUI_FROM_DATABASE=Cosco Electronics Co., Ltd.
 
-OUI:4833DD*
- ID_OUI_FROM_DATABASE=ZENNIO AVANCE Y TECNOLOGIA, S.L.
+OUI:D466A8*
+ ID_OUI_FROM_DATABASE=Riedo Networks GmbH
 
-OUI:D4D748*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:98E165*
+ ID_OUI_FROM_DATABASE=Accutome
 
-OUI:9CCAD9*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:EC66D1*
+ ID_OUI_FROM_DATABASE=B&W Group LTD
 
-OUI:F8313E*
- ID_OUI_FROM_DATABASE=endeavour GmbH
+OUI:385FC3*
+ ID_OUI_FROM_DATABASE=Yu Jeong System, Co.Ltd
 
-OUI:10FC54*
- ID_OUI_FROM_DATABASE=Shany Electronic Co., Ltd.
+OUI:94857A*
+ ID_OUI_FROM_DATABASE=Evantage Industries Corp
 
-OUI:D4CA6D*
- ID_OUI_FROM_DATABASE=Routerboard.com
+OUI:4451DB*
+ ID_OUI_FROM_DATABASE=Raytheon BBN Technologies
 
-OUI:D8E743*
- ID_OUI_FROM_DATABASE=Wush, Inc
+OUI:64995D*
+ ID_OUI_FROM_DATABASE=LGE
 
-OUI:908FCF*
- ID_OUI_FROM_DATABASE=UNO System Co., Ltd
+OUI:585076*
+ ID_OUI_FROM_DATABASE=Linear Equipamentos Eletronicos SA
 
-OUI:903CAE*
- ID_OUI_FROM_DATABASE=Yunnan KSEC Digital Technology Co.,Ltd.
+OUI:4083DE*
+ ID_OUI_FROM_DATABASE=Zebra Technologies Inc
 
-OUI:000831*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:8897DF*
+ ID_OUI_FROM_DATABASE=Entrypass Corporation Sdn. Bhd.
 
-OUI:F0620D*
- ID_OUI_FROM_DATABASE=Shenzhen Egreat Tech Corp.,Ltd
+OUI:0C15C5*
+ ID_OUI_FROM_DATABASE=SDTEC Co., Ltd.
 
-OUI:843611*
- ID_OUI_FROM_DATABASE=hyungseul publishing networks
+OUI:9803A0*
+ ID_OUI_FROM_DATABASE=ABB n.v. Power Quality Products
 
-OUI:B8FD32*
- ID_OUI_FROM_DATABASE=Zhejiang ROICX Microelectronics
+OUI:DCFAD5*
+ ID_OUI_FROM_DATABASE=STRONG Ges.m.b.H.
 
-OUI:D8052E*
- ID_OUI_FROM_DATABASE=Skyviia Corporation
+OUI:D84606*
+ ID_OUI_FROM_DATABASE=Silicon Valley Global Marketing
 
-OUI:F83553*
- ID_OUI_FROM_DATABASE=Magenta Research Ltd.
+OUI:D0E347*
+ ID_OUI_FROM_DATABASE=Yoga
 
-OUI:DC3C2E*
- ID_OUI_FROM_DATABASE=Manufacturing System Insights, Inc.
+OUI:84A991*
+ ID_OUI_FROM_DATABASE=Cyber Trans Japan Co.,Ltd.
 
-OUI:40BC8B*
- ID_OUI_FROM_DATABASE=itelio GmbH
+OUI:D81C14*
+ ID_OUI_FROM_DATABASE=Compacta International, Ltd.
 
-OUI:88C36E*
- ID_OUI_FROM_DATABASE=Beijing Ereneben lnformation Technology Limited
+OUI:9088A2*
+ ID_OUI_FROM_DATABASE=IONICS TECHNOLOGY ME LTDA
 
-OUI:8CDE52*
- ID_OUI_FROM_DATABASE=ISSC Technologies Corp.
+OUI:B0B8D5*
+ ID_OUI_FROM_DATABASE=Nanjing Nengrui Auto Equipment CO.,Ltd
 
-OUI:A8776F*
- ID_OUI_FROM_DATABASE=Zonoff
+OUI:8497B8*
+ ID_OUI_FROM_DATABASE=Memjet Inc.
 
-OUI:902B34*
- ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
+OUI:A8556A*
+ ID_OUI_FROM_DATABASE=Pocketnet Technology Inc.
 
-OUI:48E1AF*
- ID_OUI_FROM_DATABASE=Vity
+OUI:B081D8*
+ ID_OUI_FROM_DATABASE=I-sys Corp
 
-OUI:245FDF*
- ID_OUI_FROM_DATABASE=KYOCERA Corporation
+OUI:206AFF*
+ ID_OUI_FROM_DATABASE=Atlas Elektronik UK Limited
 
-OUI:C0A0DE*
- ID_OUI_FROM_DATABASE=Multi Touch Oy
+OUI:EC542E*
+ ID_OUI_FROM_DATABASE=Shanghai XiMei Electronic Technology Co. Ltd
 
-OUI:943AF0*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:B88E3A*
+ ID_OUI_FROM_DATABASE=Infinite Technologies JLT
 
-OUI:B826D4*
- ID_OUI_FROM_DATABASE=Furukawa Industrial S.A. Produtos Elétricos
+OUI:74BE08*
+ ID_OUI_FROM_DATABASE=ATEK Products, LLC
 
-OUI:14E4EC*
- ID_OUI_FROM_DATABASE=mLogic LLC
+OUI:E0EE1B*
+ ID_OUI_FROM_DATABASE=Panasonic Automotive Systems Company of America
 
-OUI:FC0A81*
- ID_OUI_FROM_DATABASE=Zebra Technologies Inc
+OUI:E80C38*
+ ID_OUI_FROM_DATABASE=DAEYOUNG INFORMATION SYSTEM CO., LTD
 
-OUI:AC0DFE*
- ID_OUI_FROM_DATABASE=Ekon GmbH - myGEKKO
+OUI:68597F*
+ ID_OUI_FROM_DATABASE=Alcatel Lucent
 
-OUI:005CB1*
- ID_OUI_FROM_DATABASE=Gospell DIGITAL TECHNOLOGY CO., LTD
+OUI:2C3068*
+ ID_OUI_FROM_DATABASE=Pantech Co.,Ltd
 
-OUI:186751*
- ID_OUI_FROM_DATABASE=KOMEG Industrielle Messtechnik GmbH
+OUI:5C4058*
+ ID_OUI_FROM_DATABASE=Jefferson Audio Video Systems, Inc.
 
-OUI:B467E9*
- ID_OUI_FROM_DATABASE=Qingdao GoerTek Technology Co., Ltd.
+OUI:64317E*
+ ID_OUI_FROM_DATABASE=Dexin Corporation
 
-OUI:B49EE6*
- ID_OUI_FROM_DATABASE=SHENZHEN TECHNOLOGY CO LTD
+OUI:AC9B84*
+ ID_OUI_FROM_DATABASE=Smak Tecnologia e Automacao
 
-OUI:7041B7*
- ID_OUI_FROM_DATABASE=Edwards Lifesciences LLC
+OUI:4C022E*
+ ID_OUI_FROM_DATABASE=CMR KOREA CO., LTD
 
-OUI:A849A5*
- ID_OUI_FROM_DATABASE=Lisantech Co., Ltd.
+OUI:24A42C*
+ ID_OUI_FROM_DATABASE=KOUKAAM a.s.
 
-OUI:94DB49*
- ID_OUI_FROM_DATABASE=SITCORP
+OUI:34F39B*
+ ID_OUI_FROM_DATABASE=WizLAN Ltd.
 
-OUI:8CD17B*
- ID_OUI_FROM_DATABASE=CG Mobile
+OUI:74B9EB*
+ ID_OUI_FROM_DATABASE=JinQianMao Technology Co.,Ltd.
 
-OUI:144978*
- ID_OUI_FROM_DATABASE=Digital Control Incorporated
+OUI:244597*
+ ID_OUI_FROM_DATABASE=GEMUE Gebr. Mueller Apparatebau
 
-OUI:FC8FC4*
- ID_OUI_FROM_DATABASE=Intelligent Technology Inc.
+OUI:30694B*
+ ID_OUI_FROM_DATABASE=RIM
 
-OUI:F04A2B*
- ID_OUI_FROM_DATABASE=PYRAMID Computer GmbH
+OUI:AC5135*
+ ID_OUI_FROM_DATABASE=MPI TECH
 
-OUI:CC9093*
- ID_OUI_FROM_DATABASE=Hansong Tehnologies
+OUI:00D38D*
+ ID_OUI_FROM_DATABASE=Hotel Technology Next Generation
 
-OUI:78F7D0*
- ID_OUI_FROM_DATABASE=Silverbrook Research
+OUI:3C6278*
+ ID_OUI_FROM_DATABASE=SHENZHEN JETNET TECHNOLOGY CO.,LTD.
 
-OUI:F04B6A*
- ID_OUI_FROM_DATABASE=Scientific Production Association Siberian Arsenal, Ltd.
+OUI:8081A5*
+ ID_OUI_FROM_DATABASE=TONGQING COMMUNICATION EQUIPMENT (SHENZHEN) Co.,Ltd
 
-OUI:30DE86*
- ID_OUI_FROM_DATABASE=Cedac Software S.r.l.
+OUI:EC8EAD*
+ ID_OUI_FROM_DATABASE=DLX
 
-OUI:F013C3*
- ID_OUI_FROM_DATABASE=SHENZHEN FENDA TECHNOLOGY CO., LTD
+OUI:ECDE3D*
+ ID_OUI_FROM_DATABASE=Lamprey Networks, Inc.
 
-OUI:CCE7DF*
- ID_OUI_FROM_DATABASE=American Magnetics, Inc.
+OUI:04FE7F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:E44E18*
- ID_OUI_FROM_DATABASE=Gardasoft VisionLimited
+OUI:E8056D*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:D41C1C*
- ID_OUI_FROM_DATABASE=RCF S.P.A.
+OUI:00D11C*
+ ID_OUI_FROM_DATABASE=ACETEL
 
-OUI:8C94CF*
- ID_OUI_FROM_DATABASE=Encell Technology, Inc.
+OUI:1056CA*
+ ID_OUI_FROM_DATABASE=Peplink International Ltd.
 
-OUI:149090*
- ID_OUI_FROM_DATABASE=KongTop industrial(shen zhen)CO.,LTD
+OUI:44A689*
+ ID_OUI_FROM_DATABASE=PROMAX ELECTRONICA SA
 
-OUI:CCF8F0*
- ID_OUI_FROM_DATABASE=Xi'an HISU Multimedia Technology Co.,Ltd.
+OUI:10CCDB*
+ ID_OUI_FROM_DATABASE=AXIMUM PRODUITS ELECTRONIQUES
 
-OUI:30F9ED*
- ID_OUI_FROM_DATABASE=Sony Corporation
+OUI:6C92BF*
+ ID_OUI_FROM_DATABASE=Inspur Electronic Information Industry Co.,Ltd.
 
-OUI:28C718*
- ID_OUI_FROM_DATABASE=Altierre
+OUI:E01CEE*
+ ID_OUI_FROM_DATABASE=Bravo Tech, Inc.
 
-OUI:2046A1*
- ID_OUI_FROM_DATABASE=VECOW Co., Ltd
+OUI:3C1915*
+ ID_OUI_FROM_DATABASE=GFI Chrono Time
 
-OUI:8C271D*
- ID_OUI_FROM_DATABASE=QuantHouse
+OUI:EC5C69*
+ ID_OUI_FROM_DATABASE=MITSUBISHI HEAVY INDUSTRIES MECHATRONICS SYSTEMS,LTD.
 
-OUI:9C8BF1*
- ID_OUI_FROM_DATABASE=The Warehouse Limited
+OUI:04E548*
+ ID_OUI_FROM_DATABASE=Cohda Wireless Pty Ltd
 
-OUI:147DC5*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:0C1DC2*
+ ID_OUI_FROM_DATABASE=SeAH Networks
 
-OUI:944696*
- ID_OUI_FROM_DATABASE=BaudTec Corporation
+OUI:28CD4C*
+ ID_OUI_FROM_DATABASE=Individual Computers GmbH
 
-OUI:90342B*
- ID_OUI_FROM_DATABASE=Gatekeeper Systems, Inc.
+OUI:8C53F7*
+ ID_OUI_FROM_DATABASE=A&D ENGINEERING CO., LTD.
 
-OUI:D45251*
- ID_OUI_FROM_DATABASE=IBT Ingenieurbureau Broennimann Thun
+OUI:781185*
+ ID_OUI_FROM_DATABASE=NBS Payment Solutions Inc.
 
-OUI:3071B2*
- ID_OUI_FROM_DATABASE=Hangzhou Prevail Optoelectronic Equipment Co.,LTD.
+OUI:2893FE*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:B82ADC*
- ID_OUI_FROM_DATABASE=EFR Europäische Funk-Rundsteuerung GmbH
+OUI:10B7F6*
+ ID_OUI_FROM_DATABASE=Plastoform Industries Ltd.
 
-OUI:B09BD4*
- ID_OUI_FROM_DATABASE=GNH Software India Private Limited
+OUI:2059A0*
+ ID_OUI_FROM_DATABASE=Paragon Technologies Inc.
 
-OUI:7CF429*
- ID_OUI_FROM_DATABASE=NUUO Inc.
+OUI:487119*
+ ID_OUI_FROM_DATABASE=SGB GROUP LTD.
 
-OUI:B8CDA7*
- ID_OUI_FROM_DATABASE=Maxeler Technologies Ltd.
+OUI:E0ABFE*
+ ID_OUI_FROM_DATABASE=Orb Networks, Inc.
 
-OUI:F49461*
- ID_OUI_FROM_DATABASE=NexGen Storage
+OUI:CCEA1C*
+ ID_OUI_FROM_DATABASE=DCONWORKS  Co., Ltd
 
-OUI:804731*
- ID_OUI_FROM_DATABASE=Packet Design, Inc.
+OUI:ACE348*
+ ID_OUI_FROM_DATABASE=MadgeTech, Inc
 
-OUI:ACCB09*
- ID_OUI_FROM_DATABASE=Hefcom Metering (Pty) Ltd
+OUI:687F74*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
-OUI:10EED9*
- ID_OUI_FROM_DATABASE=Canoga Perkins Corporation
+OUI:CCB888*
+ ID_OUI_FROM_DATABASE=AnB Securite s.a.
 
-OUI:240BB1*
- ID_OUI_FROM_DATABASE=KOSTAL Industrie Elektrik GmbH
+OUI:CC2218*
+ ID_OUI_FROM_DATABASE=InnoDigital Co., Ltd.
 
-OUI:20EEC6*
- ID_OUI_FROM_DATABASE=Elefirst Science & Tech Co ., ltd
+OUI:B86491*
+ ID_OUI_FROM_DATABASE=CK Telecom Ltd
 
-OUI:807A7F*
- ID_OUI_FROM_DATABASE=ABB Genway Xiamen Electrical Equipment CO., LTD
+OUI:80C862*
+ ID_OUI_FROM_DATABASE=Openpeak, Inc
 
-OUI:14373B*
- ID_OUI_FROM_DATABASE=PROCOM Systems
+OUI:E43593*
+ ID_OUI_FROM_DATABASE=Hangzhou GoTo technology Co.Ltd
 
-OUI:B81999*
- ID_OUI_FROM_DATABASE=Nesys
+OUI:E0BC43*
+ ID_OUI_FROM_DATABASE=C2 Microsystems, Inc.
 
-OUI:4C5585*
- ID_OUI_FROM_DATABASE=Hamilton Systems
+OUI:7884EE*
+ ID_OUI_FROM_DATABASE=INDRA ESPACIO S.A.
 
-OUI:8CCF5C*
- ID_OUI_FROM_DATABASE=BEFEGA GmbH
+OUI:2C3F3E*
+ ID_OUI_FROM_DATABASE=Alge-Timing GmbH
 
-OUI:A0133B*
- ID_OUI_FROM_DATABASE=HiTi Digital, Inc.
+OUI:C0CFA3*
+ ID_OUI_FROM_DATABASE=Creative Electronics & Software, Inc.
 
-OUI:448E12*
- ID_OUI_FROM_DATABASE=DT Research, Inc.
+OUI:D4823E*
+ ID_OUI_FROM_DATABASE=Argosy Technologies, Ltd.
 
-OUI:9C5711*
- ID_OUI_FROM_DATABASE=Feitian Xunda(Beijing) Aeronautical Information Technology Co., Ltd.
+OUI:844823*
+ ID_OUI_FROM_DATABASE=WOXTER TECHNOLOGY Co. Ltd
 
-OUI:18AD4D*
- ID_OUI_FROM_DATABASE=Polostar Technology Corporation
+OUI:D0F0DB*
+ ID_OUI_FROM_DATABASE=Ericsson
 
-OUI:4CA74B*
- ID_OUI_FROM_DATABASE=Alcatel Lucent
+OUI:7C1476*
+ ID_OUI_FROM_DATABASE=Damall Technologies SAS
 
-OUI:549478*
- ID_OUI_FROM_DATABASE=Silvershore Technology Partners
+OUI:D05875*
+ ID_OUI_FROM_DATABASE=Active Control Technology Inc.
 
-OUI:F4B164*
- ID_OUI_FROM_DATABASE=Lightning Telecommunications Technology Co. Ltd
+OUI:D81BFE*
+ ID_OUI_FROM_DATABASE=TWINLINX CORPORATION
 
-OUI:0CFC83*
- ID_OUI_FROM_DATABASE=Airoha Technology Corp.,
+OUI:D46CBF*
+ ID_OUI_FROM_DATABASE=Goodrich ISR
 
-OUI:0C51F7*
- ID_OUI_FROM_DATABASE=CHAUVIN ARNOUX
+OUI:5C57C8*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:70B035*
- ID_OUI_FROM_DATABASE=Shenzhen Zowee Technology Co., Ltd
+OUI:4CC602*
+ ID_OUI_FROM_DATABASE=Radios, Inc.
 
-OUI:708105*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:3C05AB*
+ ID_OUI_FROM_DATABASE=Product Creation Studio
 
-OUI:00082F*
+OUI:3C39C3*
+ ID_OUI_FROM_DATABASE=JW Electronics Co., Ltd.
+
+OUI:547FEE*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:542018*
- ID_OUI_FROM_DATABASE=Tely Labs
+OUI:A4C2AB*
+ ID_OUI_FROM_DATABASE=Hangzhou LEAD-IT Information & Technology Co.,Ltd
 
-OUI:581FEF*
- ID_OUI_FROM_DATABASE=Tuttnaer LTD
+OUI:48AA5D*
+ ID_OUI_FROM_DATABASE=Store Electronic Systems
 
-OUI:F8F25A*
- ID_OUI_FROM_DATABASE=G-Lab GmbH
+OUI:1062C9*
+ ID_OUI_FROM_DATABASE=Adatis GmbH & Co. KG
 
-OUI:BC779F*
- ID_OUI_FROM_DATABASE=SBM Co., Ltd.
+OUI:D8AE90*
+ ID_OUI_FROM_DATABASE=Itibia Technologies
 
-OUI:C058A7*
- ID_OUI_FROM_DATABASE=Pico Systems Co., Ltd.
+OUI:904716*
+ ID_OUI_FROM_DATABASE=RORZE CORPORATION
 
-OUI:04D783*
- ID_OUI_FROM_DATABASE=Y&H E&C Co.,LTD.
+OUI:28E794*
+ ID_OUI_FROM_DATABASE=Microtime Computer Inc.
 
-OUI:00E175*
- ID_OUI_FROM_DATABASE=AK-Systems Ltd
+OUI:8894F9*
+ ID_OUI_FROM_DATABASE=Gemicom Technology, Inc.
 
-OUI:843F4E*
- ID_OUI_FROM_DATABASE=Tri-Tech Manufacturing, Inc.
+OUI:0CA42A*
+ ID_OUI_FROM_DATABASE=OB Telecom Electronic Technology Co., Ltd
 
-OUI:C83232*
- ID_OUI_FROM_DATABASE=Hunting Innova
+OUI:5850E6*
+ ID_OUI_FROM_DATABASE=Best Buy Corporation
 
-OUI:D059C3*
- ID_OUI_FROM_DATABASE=CeraMicro Technology Corporation
+OUI:AC9A96*
+ ID_OUI_FROM_DATABASE=Lantiq Deutschland GmbH
 
-OUI:EC9681*
- ID_OUI_FROM_DATABASE=2276427 Ontario Inc
+OUI:E86CDA*
+ ID_OUI_FROM_DATABASE=Supercomputers and Neurocomputers Research Center
 
-OUI:B8288B*
- ID_OUI_FROM_DATABASE=Parker Hannifin Manufacturing (UK) Ltd
+OUI:24B6B8*
+ ID_OUI_FROM_DATABASE=FRIEM SPA
 
-OUI:5835D9*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:F86ECF*
+ ID_OUI_FROM_DATABASE=Arcx Inc
 
-OUI:802E14*
- ID_OUI_FROM_DATABASE=azeti Networks AG
+OUI:8C8401*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:E8944C*
- ID_OUI_FROM_DATABASE=Cogent Healthcare Systems Ltd
+OUI:6C7039*
+ ID_OUI_FROM_DATABASE=Novar GmbH
 
-OUI:68F895*
- ID_OUI_FROM_DATABASE=Redflow Limited
+OUI:A4561B*
+ ID_OUI_FROM_DATABASE=MCOT Corporation
 
-OUI:A88792*
- ID_OUI_FROM_DATABASE=Broadband Antenna Tracking Systems
+OUI:80EE73*
+ ID_OUI_FROM_DATABASE=Shuttle Inc.
 
-OUI:901900*
- ID_OUI_FROM_DATABASE=SCS SA
+OUI:10C73F*
+ ID_OUI_FROM_DATABASE=Midas Klark Teknik Ltd
 
-OUI:AC932F*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:408A9A*
+ ID_OUI_FROM_DATABASE=TITENG CO., Ltd.
 
-OUI:1435B3*
- ID_OUI_FROM_DATABASE=Future Designs, Inc.
+OUI:702B1D*
+ ID_OUI_FROM_DATABASE=E-Domus International Limited
 
-OUI:FCF1CD*
- ID_OUI_FROM_DATABASE=OPTEX-FA CO.,LTD.
+OUI:F077D0*
+ ID_OUI_FROM_DATABASE=Xcellen
 
-OUI:B03829*
- ID_OUI_FROM_DATABASE=Siliconware Precision Industries Co., Ltd.
+OUI:785C72*
+ ID_OUI_FROM_DATABASE=Hioso Technology Co., Ltd.
 
-OUI:BC0F2B*
- ID_OUI_FROM_DATABASE=FORTUNE TECHGROUP CO.,LTD
+OUI:94236E*
+ ID_OUI_FROM_DATABASE=Shenzhen Junlan Electronic Ltd
 
-OUI:8CF9C9*
- ID_OUI_FROM_DATABASE=MESADA Technology Co.,Ltd.
+OUI:88BA7F*
+ ID_OUI_FROM_DATABASE=Qfiednet Co., Ltd.
 
-OUI:E42AD3*
- ID_OUI_FROM_DATABASE=Magneti Marelli S.p.A. Powertrain
+OUI:E02636*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:FC10BD*
- ID_OUI_FROM_DATABASE=Control Sistematizado S.A.
+OUI:4456B7*
+ ID_OUI_FROM_DATABASE=Spawn Labs, Inc
 
-OUI:443719*
- ID_OUI_FROM_DATABASE=2 Save Energy Ltd
+OUI:A09805*
+ ID_OUI_FROM_DATABASE=OpenVox Communication Co Ltd
 
-OUI:E83EB6*
- ID_OUI_FROM_DATABASE=RIM
+OUI:00271D*
+ ID_OUI_FROM_DATABASE=Comba Telecom Systems (China) Ltd.
 
-OUI:94FD1D*
- ID_OUI_FROM_DATABASE=WhereWhen Corp
+OUI:002721*
+ ID_OUI_FROM_DATABASE=Shenzhen Baoan Fenda Industrial Co., Ltd
 
-OUI:0CE82F*
- ID_OUI_FROM_DATABASE=Bonfiglioli Vectron GmbH
+OUI:A09A5A*
+ ID_OUI_FROM_DATABASE=Time Domain
 
-OUI:C0626B*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:64A837*
+ ID_OUI_FROM_DATABASE=Juni Korea Co., Ltd
 
-OUI:74D0DC*
- ID_OUI_FROM_DATABASE=ERICSSON AB
+OUI:B4B5AF*
+ ID_OUI_FROM_DATABASE=Minsung Electronics
 
-OUI:B4B88D*
- ID_OUI_FROM_DATABASE=Thuh Company
+OUI:44568D*
+ ID_OUI_FROM_DATABASE=PNC Technologies  Co., Ltd.
 
-OUI:60F59C*
- ID_OUI_FROM_DATABASE=CRU-Dataport
+OUI:ACD180*
+ ID_OUI_FROM_DATABASE=Crexendo Business Solutions, Inc.
 
-OUI:C4108A*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:AC8317*
+ ID_OUI_FROM_DATABASE=Shenzhen Furtunetel Communication Co., Ltd
 
-OUI:4C73A5*
- ID_OUI_FROM_DATABASE=KOVE
+OUI:E80B13*
+ ID_OUI_FROM_DATABASE=Akib Systems Taiwan, INC
 
-OUI:F86971*
- ID_OUI_FROM_DATABASE=Seibu Electric Co.,
+OUI:44C9A2*
+ ID_OUI_FROM_DATABASE=Greenwald Industries
 
-OUI:44AA27*
- ID_OUI_FROM_DATABASE=udworks Co., Ltd.
+OUI:646E6C*
+ ID_OUI_FROM_DATABASE=Radio Datacom LLC
 
-OUI:6CAD3F*
- ID_OUI_FROM_DATABASE=Hubbell Building Automation, Inc.
+OUI:E4751E*
+ ID_OUI_FROM_DATABASE=Getinge Sterilization AB
 
-OUI:8427CE*
- ID_OUI_FROM_DATABASE=Corporation of the Presiding Bishop of The Church of Jesus Christ of Latter-day Saints
+OUI:F8811A*
+ ID_OUI_FROM_DATABASE=OVERKIZ
 
-OUI:D428B2*
- ID_OUI_FROM_DATABASE=ioBridge, Inc.
+OUI:042BBB*
+ ID_OUI_FROM_DATABASE=PicoCELA, Inc.
 
-OUI:90B8D0*
- ID_OUI_FROM_DATABASE=Joyent, Inc.
+OUI:FC0877*
+ ID_OUI_FROM_DATABASE=Prentke Romich Company
 
-OUI:909060*
- ID_OUI_FROM_DATABASE=RSI VIDEO TECHNOLOGIES
+OUI:ECD00E*
+ ID_OUI_FROM_DATABASE=MiraeRecognition Co., Ltd.
 
-OUI:281471*
- ID_OUI_FROM_DATABASE=Lantis co., LTD.
+OUI:747E1A*
+ ID_OUI_FROM_DATABASE=Red Embedded Design Limited
 
-OUI:1407E0*
- ID_OUI_FROM_DATABASE=Abrantix AG
+OUI:C47D4F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:DCCF94*
- ID_OUI_FROM_DATABASE=Beijing Rongcheng Hutong Technology Co., Ltd.
+OUI:4C9EE4*
+ ID_OUI_FROM_DATABASE=Hanyang Navicom Co.,Ltd.
 
-OUI:18E288*
- ID_OUI_FROM_DATABASE=STT Condigi
+OUI:3CDF1E*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:68876B*
- ID_OUI_FROM_DATABASE=INQ Mobile Limited
+OUI:BCB181*
+ ID_OUI_FROM_DATABASE=SHARP CORPORATION
 
-OUI:9866EA*
- ID_OUI_FROM_DATABASE=Industrial Control Communications, Inc.
+OUI:78B81A*
+ ID_OUI_FROM_DATABASE=INTER SALES A/S
 
-OUI:F4A52A*
- ID_OUI_FROM_DATABASE=Hawa Technologies Inc
+OUI:78192E*
+ ID_OUI_FROM_DATABASE=NASCENT Technology
 
-OUI:90CF15*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:2C0623*
+ ID_OUI_FROM_DATABASE=Win Leader Inc.
 
-OUI:B8D49D*
- ID_OUI_FROM_DATABASE=M Seven System Ltd.
+OUI:C82E94*
+ ID_OUI_FROM_DATABASE=Halfa Enterprise Co., Ltd.
 
-OUI:B0A10A*
- ID_OUI_FROM_DATABASE=Pivotal Systems Corporation
+OUI:0C2755*
+ ID_OUI_FROM_DATABASE=Valuable Techologies Limited
 
-OUI:48F47D*
- ID_OUI_FROM_DATABASE=TechVision Holding  Internation Limited
+OUI:C038F9*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:6C391D*
- ID_OUI_FROM_DATABASE=Beijing ZhongHuaHun Network Information center
+OUI:F46349*
+ ID_OUI_FROM_DATABASE=Diffon Corporation
 
-OUI:64D241*
- ID_OUI_FROM_DATABASE=Keith & Koep GmbH
+OUI:5C8778*
+ ID_OUI_FROM_DATABASE=Cybertelbridge co.,ltd
 
-OUI:101212*
- ID_OUI_FROM_DATABASE=Vivo International Corporation Pty Ltd
+OUI:9C5E73*
+ ID_OUI_FROM_DATABASE=Calibre UK LTD
 
-OUI:5087B8*
- ID_OUI_FROM_DATABASE=Nuvyyo Inc
+OUI:F06281*
+ ID_OUI_FROM_DATABASE=ProCurve Networking by HP
 
-OUI:E41289*
- ID_OUI_FROM_DATABASE=topsystem Systemhaus GmbH
+OUI:003A9B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:A4134E*
- ID_OUI_FROM_DATABASE=Luxul
+OUI:2C9127*
+ ID_OUI_FROM_DATABASE=Eintechno Corporation
 
-OUI:B09928*
- ID_OUI_FROM_DATABASE=FUJITSU LIMITED
+OUI:C09C92*
+ ID_OUI_FROM_DATABASE=COBY
 
-OUI:8C11CB*
- ID_OUI_FROM_DATABASE=ABUS Security-Center GmbH & Co. KG
+OUI:849000*
+ ID_OUI_FROM_DATABASE=Arnold & Richter Cine Technik
 
-OUI:806459*
- ID_OUI_FROM_DATABASE=Nimbus Inc.
+OUI:C87248*
+ ID_OUI_FROM_DATABASE=Aplicom Oy
 
-OUI:A45A1C*
- ID_OUI_FROM_DATABASE=smart-electronic GmbH
+OUI:74D850*
+ ID_OUI_FROM_DATABASE=Evrisko Systems
 
-OUI:8C89A5*
- ID_OUI_FROM_DATABASE=Micro-Star INT'L CO., LTD
+OUI:6CAC60*
+ ID_OUI_FROM_DATABASE=Venetex Corp
 
-OUI:3C672C*
- ID_OUI_FROM_DATABASE=Sciovid Inc.
+OUI:DC0265*
+ ID_OUI_FROM_DATABASE=Meditech Kft
 
-OUI:18D071*
- ID_OUI_FROM_DATABASE=DASAN CO., LTD.
+OUI:68A1B7*
+ ID_OUI_FROM_DATABASE=Honghao Mingchuan Technology (Beijing) CO.,Ltd.
 
-OUI:38D135*
- ID_OUI_FROM_DATABASE=EasyIO Corporation Sdn. Bhd.
+OUI:7CCFCF*
+ ID_OUI_FROM_DATABASE=Shanghai SEARI Intelligent System Co., Ltd
 
-OUI:184E94*
- ID_OUI_FROM_DATABASE=MESSOA TECHNOLOGIES INC.
+OUI:EC3091*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:94D93C*
- ID_OUI_FROM_DATABASE=ENELPS
+OUI:3032D4*
+ ID_OUI_FROM_DATABASE=Hanilstm Co., Ltd.
 
-OUI:DC9B1E*
- ID_OUI_FROM_DATABASE=Intercom, Inc.
+OUI:0026EE*
+ ID_OUI_FROM_DATABASE=TKM GmbH
 
-OUI:5C7757*
- ID_OUI_FROM_DATABASE=Haivision Network Video
+OUI:0026E7*
+ ID_OUI_FROM_DATABASE=Shanghai ONLAN Communication Tech. Co., Ltd.
 
-OUI:E8B4AE*
- ID_OUI_FROM_DATABASE=Shenzhen C&D Electronics Co.,Ltd
+OUI:0026E1*
+ ID_OUI_FROM_DATABASE=Stanford University, OpenFlow Group
 
-OUI:C45600*
- ID_OUI_FROM_DATABASE=Galleon Embedded Computing
+OUI:0026DB*
+ ID_OUI_FROM_DATABASE=Ionics EMS Inc.
 
-OUI:E42FF6*
- ID_OUI_FROM_DATABASE=Unicore communication Inc.
+OUI:0026CE*
+ ID_OUI_FROM_DATABASE=Kozumi USA Corp.
 
-OUI:B8F4D0*
- ID_OUI_FROM_DATABASE=Herrmann Ultraschalltechnik GmbH & Co. Kg
+OUI:0026D5*
+ ID_OUI_FROM_DATABASE=Ory Solucoes em Comercio de Informatica Ltda.
 
-OUI:B4F323*
- ID_OUI_FROM_DATABASE=PETATEL INC.
+OUI:0026C8*
+ ID_OUI_FROM_DATABASE=System Sensor
 
-OUI:C81E8E*
- ID_OUI_FROM_DATABASE=ADV Security (S) Pte Ltd
+OUI:002711*
+ ID_OUI_FROM_DATABASE=LanPro Inc
 
-OUI:ACCABA*
- ID_OUI_FROM_DATABASE=Midokura Co., Ltd.
+OUI:00270D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:9C417C*
- ID_OUI_FROM_DATABASE=Hame  Technology Co.,  Limited
+OUI:002707*
+ ID_OUI_FROM_DATABASE=Lift Complex DS, JSC
 
-OUI:10768A*
- ID_OUI_FROM_DATABASE=EoCell
+OUI:002700*
+ ID_OUI_FROM_DATABASE=Shenzhen Siglent Technology Co., Ltd.
 
-OUI:044665*
- ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+OUI:0026FA*
+ ID_OUI_FROM_DATABASE=BandRich Inc.
 
-OUI:D0131E*
- ID_OUI_FROM_DATABASE=Sunrex Technology Corp
+OUI:0026F4*
+ ID_OUI_FROM_DATABASE=Nesslab
 
-OUI:380197*
- ID_OUI_FROM_DATABASE=TSST Global,Inc
+OUI:0025D7*
+ ID_OUI_FROM_DATABASE=CEDO
 
-OUI:B40142*
- ID_OUI_FROM_DATABASE=GCI Science & Technology Co.,LTD
+OUI:0025D2*
+ ID_OUI_FROM_DATABASE=InpegVision Co., Ltd
 
-OUI:846EB1*
- ID_OUI_FROM_DATABASE=Park Assist LLC
+OUI:0025D1*
+ ID_OUI_FROM_DATABASE=Eastern Asia Technology Limited
 
-OUI:6C504D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0025CB*
+ ID_OUI_FROM_DATABASE=Reiner SCT
 
-OUI:C0C1C0*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:0025BF*
+ ID_OUI_FROM_DATABASE=Wireless Cables Inc.
 
-OUI:1CBD0E*
- ID_OUI_FROM_DATABASE=Amplified Engineering Pty Ltd
+OUI:0025B1*
+ ID_OUI_FROM_DATABASE=Maya-Creation Corporation
 
-OUI:F0A764*
- ID_OUI_FROM_DATABASE=GST Co., Ltd.
+OUI:0025B8*
+ ID_OUI_FROM_DATABASE=Agile Communications, Inc.
 
-OUI:A0F217*
- ID_OUI_FROM_DATABASE=GE Medical System(China) Co., Ltd.
+OUI:0025B2*
+ ID_OUI_FROM_DATABASE=MBDA Deutschland GmbH
 
-OUI:643409*
- ID_OUI_FROM_DATABASE=BITwave Pte Ltd
+OUI:0025AC*
+ ID_OUI_FROM_DATABASE=I-Tech corporation
 
-OUI:20D5AB*
- ID_OUI_FROM_DATABASE=Korea Infocom Co.,Ltd.
+OUI:0026C2*
+ ID_OUI_FROM_DATABASE=SCDI Co. LTD
 
-OUI:F05849*
- ID_OUI_FROM_DATABASE=CareView Communications
+OUI:0026BC*
+ ID_OUI_FROM_DATABASE=General Jack Technology Ltd.
 
-OUI:BC15A6*
- ID_OUI_FROM_DATABASE=Taiwan Jantek Electronics,Ltd.
+OUI:0026B4*
+ ID_OUI_FROM_DATABASE=Ford Motor Company
 
-OUI:241A8C*
- ID_OUI_FROM_DATABASE=Squarehead Technology AS
+OUI:0026AE*
+ ID_OUI_FROM_DATABASE=Wireless Measurement Ltd
 
-OUI:1083D2*
- ID_OUI_FROM_DATABASE=Microseven Systems, LLC
+OUI:0026AA*
+ ID_OUI_FROM_DATABASE=Kenmec Mechanical Engineering Co., Ltd.
 
-OUI:F05D89*
- ID_OUI_FROM_DATABASE=Dycon Limited
+OUI:0026A4*
+ ID_OUI_FROM_DATABASE=Novus Produtos Eletronicos Ltda
 
-OUI:AC02CF*
- ID_OUI_FROM_DATABASE=RW Tecnologia Industria e Comercio Ltda
+OUI:002698*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:9067B5*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent
+OUI:00269D*
+ ID_OUI_FROM_DATABASE=M2Mnet Co., Ltd.
 
-OUI:40987B*
- ID_OUI_FROM_DATABASE=Aisino Corporation
+OUI:00268B*
+ ID_OUI_FROM_DATABASE=Guangzhou Escene Computer Technology Limited
 
-OUI:6C2E33*
- ID_OUI_FROM_DATABASE=Accelink Technologies Co.,Ltd.
+OUI:002685*
+ ID_OUI_FROM_DATABASE=Digital Innovation
 
-OUI:4CEDDE*
- ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+OUI:002678*
+ ID_OUI_FROM_DATABASE=Logic Instrument SA
 
-OUI:E8E08F*
- ID_OUI_FROM_DATABASE=GRAVOTECH MARKING SAS
+OUI:002672*
+ ID_OUI_FROM_DATABASE=AAMP of America
 
-OUI:78B6C1*
- ID_OUI_FROM_DATABASE=AOBO Telecom Co.,Ltd
+OUI:00266B*
+ ID_OUI_FROM_DATABASE=SHINE UNION ENTERPRISE LIMITED
 
-OUI:B8BA68*
- ID_OUI_FROM_DATABASE=Xi'an Jizhong Digital Communication Co.,Ltd
+OUI:002666*
+ ID_OUI_FROM_DATABASE=EFM Networks
 
-OUI:BC38D2*
- ID_OUI_FROM_DATABASE=Pandachip Limited
+OUI:002665*
+ ID_OUI_FROM_DATABASE=ProtectedLogic Corporation
 
-OUI:14EE9D*
- ID_OUI_FROM_DATABASE=AirNav Systems LLC
+OUI:002651*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:48174C*
- ID_OUI_FROM_DATABASE=MicroPower technologies
+OUI:002652*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:F81037*
- ID_OUI_FROM_DATABASE=Atopia Systems, LP
+OUI:002646*
+ ID_OUI_FROM_DATABASE=SHENYANG TONGFANG MULTIMEDIA TECHNOLOGY COMPANY LIMITED
 
-OUI:64F987*
- ID_OUI_FROM_DATABASE=Avvasi Inc.
+OUI:002640*
+ ID_OUI_FROM_DATABASE=Baustem Broadband Technologies, Ltd.
 
-OUI:3C7437*
- ID_OUI_FROM_DATABASE=RIM
+OUI:00263A*
+ ID_OUI_FROM_DATABASE=Digitec Systems
 
-OUI:04209A*
- ID_OUI_FROM_DATABASE=Panasonic AVC Networks Company
+OUI:002634*
+ ID_OUI_FROM_DATABASE=Infineta Systems, Inc
 
-OUI:64DC01*
- ID_OUI_FROM_DATABASE=Static Systems Group PLC
+OUI:002633*
+ ID_OUI_FROM_DATABASE=MIR - Medical International Research
 
-OUI:1CF5E7*
- ID_OUI_FROM_DATABASE=Turtle Industry Co., Ltd.
+OUI:00262E*
+ ID_OUI_FROM_DATABASE=Chengdu Jiuzhou Electronic Technology Inc
 
-OUI:9C4A7B*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:002627*
+ ID_OUI_FROM_DATABASE=Truesell
 
-OUI:2C8065*
- ID_OUI_FROM_DATABASE=HARTING Inc. of North America
+OUI:002621*
+ ID_OUI_FROM_DATABASE=InteliCloud Technology Inc.
 
-OUI:F8F014*
- ID_OUI_FROM_DATABASE=RackWare Inc.
+OUI:00261B*
+ ID_OUI_FROM_DATABASE=LAUREL BANK MACHINES CO., LTD.
 
-OUI:E41C4B*
- ID_OUI_FROM_DATABASE=V2 TECHNOLOGY, INC.
+OUI:002614*
+ ID_OUI_FROM_DATABASE=KTNF
 
-OUI:E0143E*
- ID_OUI_FROM_DATABASE=Modoosis Inc.
+OUI:00260E*
+ ID_OUI_FROM_DATABASE=Ablaze Systems, LLC
 
-OUI:5C6984*
- ID_OUI_FROM_DATABASE=NUVICO
+OUI:002602*
+ ID_OUI_FROM_DATABASE=SMART Temps LLC
 
-OUI:204AAA*
- ID_OUI_FROM_DATABASE=Hanscan Spain S.A.
+OUI:002601*
+ ID_OUI_FROM_DATABASE=Cutera Inc
 
-OUI:F02572*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0025F7*
+ ID_OUI_FROM_DATABASE=Ansaldo STS USA
 
-OUI:8091C0*
- ID_OUI_FROM_DATABASE=AgileMesh, Inc.
+OUI:0025FC*
+ ID_OUI_FROM_DATABASE=ENDA ENDUSTRIYEL ELEKTRONIK LTD. STI.
 
-OUI:0CF0B4*
- ID_OUI_FROM_DATABASE=Globalsat International Technology Ltd
+OUI:0025ED*
+ ID_OUI_FROM_DATABASE=NuVo Technologies LLC
 
-OUI:BCC61A*
- ID_OUI_FROM_DATABASE=SPECTRA EMBEDDED SYSTEMS
+OUI:0025EE*
+ ID_OUI_FROM_DATABASE=Avtex Ltd
 
-OUI:48DF1C*
- ID_OUI_FROM_DATABASE=Wuhan NEC Fibre Optic Communications industry Co. Ltd
+OUI:0025E8*
+ ID_OUI_FROM_DATABASE=Idaho Technology
 
-OUI:D0D3FC*
- ID_OUI_FROM_DATABASE=Mios, Ltd.
+OUI:0025E3*
+ ID_OUI_FROM_DATABASE=Hanshinit Inc.
 
-OUI:989449*
- ID_OUI_FROM_DATABASE=Skyworth Wireless Technology Ltd.
+OUI:0025DE*
+ ID_OUI_FROM_DATABASE=Probits Co., LTD.
 
-OUI:C8DF7C*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:002579*
+ ID_OUI_FROM_DATABASE=J & F Labs
 
-OUI:F8C678*
- ID_OUI_FROM_DATABASE=Carefusion
+OUI:00257E*
+ ID_OUI_FROM_DATABASE=NEW POS Technology Limited
 
-OUI:FC3598*
- ID_OUI_FROM_DATABASE=Favite Inc.
+OUI:002572*
+ ID_OUI_FROM_DATABASE=Nemo-Q International AB
 
-OUI:A0AAFD*
- ID_OUI_FROM_DATABASE=EraThink Technologies Corp.
+OUI:00256B*
+ ID_OUI_FROM_DATABASE=ATENIX E.E. s.r.l.
 
-OUI:801F02*
- ID_OUI_FROM_DATABASE=Edimax Technology Co. Ltd.
+OUI:00256C*
+ ID_OUI_FROM_DATABASE=Azimut Production Association JSC
 
-OUI:E03E7D*
- ID_OUI_FROM_DATABASE=data-complex GmbH
+OUI:00255F*
+ ID_OUI_FROM_DATABASE=SenTec AG
 
-OUI:A4E32E*
- ID_OUI_FROM_DATABASE=Silicon & Software Systems Ltd.
+OUI:00255A*
+ ID_OUI_FROM_DATABASE=Tantalus Systems Corp.
 
-OUI:1C19DE*
- ID_OUI_FROM_DATABASE=eyevis GmbH
+OUI:002559*
+ ID_OUI_FROM_DATABASE=Syphan Technologies Ltd
 
-OUI:DC07C1*
- ID_OUI_FROM_DATABASE=HangZhou QiYang Technology Co.,Ltd.
+OUI:0025A5*
+ ID_OUI_FROM_DATABASE=Walnut Media Network
 
-OUI:D8FE8F*
- ID_OUI_FROM_DATABASE=IDFone Co., Ltd.
+OUI:00259F*
+ ID_OUI_FROM_DATABASE=TechnoDigital Technologies GmbH
 
-OUI:0006F6*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:002599*
+ ID_OUI_FROM_DATABASE=Hedon e.d. B.V.
 
-OUI:ACAB8D*
- ID_OUI_FROM_DATABASE=Lyngso Marine A/S
+OUI:002592*
+ ID_OUI_FROM_DATABASE=Guangzhou Shirui Electronic Co., Ltd
 
-OUI:181456*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:00258D*
+ ID_OUI_FROM_DATABASE=Haier
 
-OUI:E8995A*
- ID_OUI_FROM_DATABASE=PiiGAB, Processinformation i Goteborg AB
+OUI:002588*
+ ID_OUI_FROM_DATABASE=Genie Industries, Inc.
 
-OUI:D4E32C*
- ID_OUI_FROM_DATABASE=S. Siedle & Sohne
+OUI:002583*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:68DCE8*
- ID_OUI_FROM_DATABASE=PacketStorm Communications
+OUI:00254C*
+ ID_OUI_FROM_DATABASE=Videon Central, Inc.
 
-OUI:78223D*
- ID_OUI_FROM_DATABASE=Affirmed Networks
+OUI:002536*
+ ID_OUI_FROM_DATABASE=Oki Electric Industry Co., Ltd.
 
-OUI:60C980*
- ID_OUI_FROM_DATABASE=Trymus
+OUI:00253D*
+ ID_OUI_FROM_DATABASE=DRS Consolidated Controls
 
-OUI:94CDAC*
- ID_OUI_FROM_DATABASE=Creowave Oy
+OUI:002540*
+ ID_OUI_FROM_DATABASE=Quasar Technologies, Inc.
 
-OUI:F4DCDA*
- ID_OUI_FROM_DATABASE=Zhuhai Jiahe Communication Technology Co., limited
+OUI:002533*
+ ID_OUI_FROM_DATABASE=WITTENSTEIN AG
 
-OUI:100D32*
- ID_OUI_FROM_DATABASE=Embedian, Inc.
+OUI:00252C*
+ ID_OUI_FROM_DATABASE=Entourage Systems, Inc.
 
-OUI:D82986*
- ID_OUI_FROM_DATABASE=Best Wish Technology LTD
+OUI:002502*
+ ID_OUI_FROM_DATABASE=NaturalPoint
 
-OUI:C03B8F*
- ID_OUI_FROM_DATABASE=Minicom Digital Signage
+OUI:0024FB*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:A4218A*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:0024F6*
+ ID_OUI_FROM_DATABASE=MIYOSHI ELECTRONICS CORPORATION
 
-OUI:6C0460*
- ID_OUI_FROM_DATABASE=RBH Access Technologies Inc.
+OUI:0024EA*
+ ID_OUI_FROM_DATABASE=iris-GmbH infrared & intelligent sensors
 
-OUI:5C864A*
- ID_OUI_FROM_DATABASE=Secret Labs LLC
+OUI:0024E3*
+ ID_OUI_FROM_DATABASE=CAO Group
 
-OUI:B8BA72*
- ID_OUI_FROM_DATABASE=Cynove
+OUI:002527*
+ ID_OUI_FROM_DATABASE=Bitrode Corp.
 
-OUI:C00D7E*
- ID_OUI_FROM_DATABASE=Additech, Inc.
+OUI:002524*
+ ID_OUI_FROM_DATABASE=Lightcomm Technology Co., Ltd
 
-OUI:68784C*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:00251F*
+ ID_OUI_FROM_DATABASE=ZYNUS VISION INC.
 
-OUI:6C626D*
- ID_OUI_FROM_DATABASE=Micro-Star INT'L CO., LTD
+OUI:00251A*
+ ID_OUI_FROM_DATABASE=Psiber Data Systems Inc.
 
-OUI:8841C1*
- ID_OUI_FROM_DATABASE=ORBISAT DA AMAZONIA IND E AEROL SA
+OUI:002515*
+ ID_OUI_FROM_DATABASE=SFR
 
-OUI:18B209*
- ID_OUI_FROM_DATABASE=Torrey Pines Logic, Inc
+OUI:00250E*
+ ID_OUI_FROM_DATABASE=gt german telematics gmbh
 
-OUI:3018CF*
- ID_OUI_FROM_DATABASE=DEOS control systems GmbH
+OUI:002507*
+ ID_OUI_FROM_DATABASE=ASTAK Inc.
 
-OUI:4CF737*
- ID_OUI_FROM_DATABASE=SamJi Electronics Co., Ltd
+OUI:002509*
+ ID_OUI_FROM_DATABASE=SHARETRONIC Group LTD
 
-OUI:40406B*
- ID_OUI_FROM_DATABASE=Icomera
+OUI:002437*
+ ID_OUI_FROM_DATABASE=Motorola - BSG
 
-OUI:1880CE*
- ID_OUI_FROM_DATABASE=Barberry Solutions Ltd
+OUI:00243C*
+ ID_OUI_FROM_DATABASE=S.A.A.A.
 
-OUI:CC43E3*
- ID_OUI_FROM_DATABASE=Trump s.a.
+OUI:002430*
+ ID_OUI_FROM_DATABASE=Ruby Tech Corp.
 
-OUI:6C22AB*
- ID_OUI_FROM_DATABASE=Ainsworth Game Technology
+OUI:0023FB*
+ ID_OUI_FROM_DATABASE=IP Datatel, LLC.
 
-OUI:3C106F*
- ID_OUI_FROM_DATABASE=ALBAHITH TECHNOLOGIES
+OUI:0023F3*
+ ID_OUI_FROM_DATABASE=Glocom, Inc.
 
-OUI:7CE044*
- ID_OUI_FROM_DATABASE=NEON Inc
+OUI:0023EF*
+ ID_OUI_FROM_DATABASE=Zuend Systemtechnik AG
 
-OUI:64D02D*
- ID_OUI_FROM_DATABASE=Next Generation Integration (NGI)
+OUI:0023E9*
+ ID_OUI_FROM_DATABASE=F5 Networks, Inc.
 
-OUI:A04041*
- ID_OUI_FROM_DATABASE=SAMWONFA Co.,Ltd.
+OUI:0023E3*
+ ID_OUI_FROM_DATABASE=Microtronic AG
 
-OUI:788C54*
- ID_OUI_FROM_DATABASE=Eltek Technologies LTD
+OUI:0023E2*
+ ID_OUI_FROM_DATABASE=SEA Signalisation
 
-OUI:9411DA*
- ID_OUI_FROM_DATABASE=ITF Fröschl GmbH
+OUI:0023DD*
+ ID_OUI_FROM_DATABASE=ELGIN S.A.
 
-OUI:10E8EE*
- ID_OUI_FROM_DATABASE=PhaseSpace
+OUI:0023D0*
+ ID_OUI_FROM_DATABASE=Uniloc USA Inc.
 
-OUI:A47C1F*
- ID_OUI_FROM_DATABASE=Cobham plc
+OUI:0023CA*
+ ID_OUI_FROM_DATABASE=Behind The Set, LLC
 
-OUI:8C1F94*
- ID_OUI_FROM_DATABASE=RF Surgical System Inc.
+OUI:0024B0*
+ ID_OUI_FROM_DATABASE=ESAB AB
 
-OUI:74A4A7*
- ID_OUI_FROM_DATABASE=QRS Music Technologies, Inc.
+OUI:0024A9*
+ ID_OUI_FROM_DATABASE=Ag Leader Technology
 
-OUI:8039E5*
- ID_OUI_FROM_DATABASE=PATLITE CORPORATION
+OUI:0024A2*
+ ID_OUI_FROM_DATABASE=Hong Kong Middleware Technology Limited
 
-OUI:BCFFAC*
- ID_OUI_FROM_DATABASE=TOPCON CORPORATION
+OUI:0024A4*
+ ID_OUI_FROM_DATABASE=Siklu Communication
 
-OUI:602A54*
- ID_OUI_FROM_DATABASE=CardioTek B.V.
+OUI:00249D*
+ ID_OUI_FROM_DATABASE=NES Technology Inc.
 
-OUI:1C3DE7*
- ID_OUI_FROM_DATABASE=Sigma Koki Co.,Ltd.
+OUI:00248A*
+ ID_OUI_FROM_DATABASE=Kaga Electronics Co., Ltd.
 
-OUI:482CEA*
- ID_OUI_FROM_DATABASE=Motorola Inc Business Light Radios
+OUI:00248F*
+ ID_OUI_FROM_DATABASE=DO-MONIX
 
-OUI:70E139*
- ID_OUI_FROM_DATABASE=3view Ltd
+OUI:002496*
+ ID_OUI_FROM_DATABASE=Ginzinger electronic systems
 
-OUI:AC6123*
- ID_OUI_FROM_DATABASE=Drivven, Inc.
+OUI:002477*
+ ID_OUI_FROM_DATABASE=Tibbo Technology
 
-OUI:3C04BF*
- ID_OUI_FROM_DATABASE=PRAVIS SYSTEMS Co.Ltd.,
+OUI:002470*
+ ID_OUI_FROM_DATABASE=AUROTECH ultrasound AS.
 
-OUI:443D21*
- ID_OUI_FROM_DATABASE=Nuvolt
+OUI:002472*
+ ID_OUI_FROM_DATABASE=ReDriven Power Inc.
 
-OUI:749050*
- ID_OUI_FROM_DATABASE=Renesas Electronics Corporation
+OUI:00246B*
+ ID_OUI_FROM_DATABASE=Covia, Inc.
 
-OUI:7CBB6F*
- ID_OUI_FROM_DATABASE=Cosco Electronics Co., Ltd.
+OUI:002464*
+ ID_OUI_FROM_DATABASE=Bridge Technologies Co AS
 
-OUI:D466A8*
- ID_OUI_FROM_DATABASE=Riedo Networks GmbH
+OUI:00245F*
+ ID_OUI_FROM_DATABASE=Vine Telecom CO.,Ltd.
 
-OUI:98E165*
- ID_OUI_FROM_DATABASE=Accutome
+OUI:002420*
+ ID_OUI_FROM_DATABASE=NetUP Inc.
 
-OUI:EC66D1*
- ID_OUI_FROM_DATABASE=B&W Group LTD
+OUI:002426*
+ ID_OUI_FROM_DATABASE=NOHMI BOSAI LTD.
 
-OUI:385FC3*
- ID_OUI_FROM_DATABASE=Yu Jeong System, Co.Ltd
+OUI:00241A*
+ ID_OUI_FROM_DATABASE=Red Beetle Inc.
 
-OUI:94857A*
- ID_OUI_FROM_DATABASE=Evantage Industries Corp
+OUI:002413*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:4451DB*
- ID_OUI_FROM_DATABASE=Raytheon BBN Technologies
+OUI:00240D*
+ ID_OUI_FROM_DATABASE=OnePath Networks LTD.
 
-OUI:64995D*
- ID_OUI_FROM_DATABASE=LGE
+OUI:00240E*
+ ID_OUI_FROM_DATABASE=Inventec Besta Co., Ltd.
 
-OUI:585076*
- ID_OUI_FROM_DATABASE=Linear Equipamentos Eletronicos SA
+OUI:002407*
+ ID_OUI_FROM_DATABASE=TELEM SAS
 
-OUI:4083DE*
- ID_OUI_FROM_DATABASE=Zebra Technologies Inc
+OUI:002400*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:8897DF*
- ID_OUI_FROM_DATABASE=Entrypass Corporation Sdn. Bhd.
+OUI:0024D0*
+ ID_OUI_FROM_DATABASE=Shenzhen SOGOOD Industry CO.,LTD.
 
-OUI:0C15C5*
- ID_OUI_FROM_DATABASE=SDTEC Co., Ltd.
+OUI:0024D5*
+ ID_OUI_FROM_DATABASE=Winward Industrial Limited
 
-OUI:9803A0*
- ID_OUI_FROM_DATABASE=ABB n.v. Power Quality Products
+OUI:0024C9*
+ ID_OUI_FROM_DATABASE=Broadband Solutions Group
 
-OUI:DCFAD5*
- ID_OUI_FROM_DATABASE=STRONG Ges.m.b.H.
+OUI:0024C4*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:D84606*
- ID_OUI_FROM_DATABASE=Silicon Valley Global Marketing
+OUI:0024BF*
+ ID_OUI_FROM_DATABASE=CIAT
 
-OUI:689234*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:0024B5*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:D0E347*
- ID_OUI_FROM_DATABASE=Yoga
+OUI:00245A*
+ ID_OUI_FROM_DATABASE=Nanjing Panda Electronics Company Limited
 
-OUI:84A991*
- ID_OUI_FROM_DATABASE=Cyber Trans Japan Co.,Ltd.
+OUI:002453*
+ ID_OUI_FROM_DATABASE=Initra d.o.o.
 
-OUI:D81C14*
- ID_OUI_FROM_DATABASE=Compacta International, Ltd.
+OUI:00244D*
+ ID_OUI_FROM_DATABASE=Hokkaido Electronics Corporation
 
-OUI:9088A2*
- ID_OUI_FROM_DATABASE=IONICS TECHNOLOGY ME LTDA
+OUI:002452*
+ ID_OUI_FROM_DATABASE=Silicon Software GmbH
 
-OUI:B0B8D5*
- ID_OUI_FROM_DATABASE=Nanjing Nengrui Auto Equipment CO.,Ltd
+OUI:002446*
+ ID_OUI_FROM_DATABASE=MMB Research Inc.
 
-OUI:8497B8*
- ID_OUI_FROM_DATABASE=Memjet Inc.
+OUI:002441*
+ ID_OUI_FROM_DATABASE=Wanzl Metallwarenfabrik GmbH
 
-OUI:A8556A*
- ID_OUI_FROM_DATABASE=Pocketnet Technology Inc.
+OUI:002368*
+ ID_OUI_FROM_DATABASE=Zebra Technologies Inc
 
-OUI:B081D8*
- ID_OUI_FROM_DATABASE=I-sys Corp
+OUI:00236F*
+ ID_OUI_FROM_DATABASE=DAQ System
 
-OUI:206AFF*
- ID_OUI_FROM_DATABASE=Atlas Elektronik UK Limited
+OUI:002362*
+ ID_OUI_FROM_DATABASE=Goldline Controls
 
-OUI:EC542E*
- ID_OUI_FROM_DATABASE=Shanghai XiMei Electronic Technology Co. Ltd
+OUI:002361*
+ ID_OUI_FROM_DATABASE=Unigen Corporation
 
-OUI:B88E3A*
- ID_OUI_FROM_DATABASE=Infinite Technologies JLT
+OUI:00235C*
+ ID_OUI_FROM_DATABASE=Aprius, Inc.
 
-OUI:74BE08*
- ID_OUI_FROM_DATABASE=ATEK Products, LLC
+OUI:002355*
+ ID_OUI_FROM_DATABASE=Kinco Automation(Shanghai) Ltd.
 
-OUI:E0EE1B*
- ID_OUI_FROM_DATABASE=Panasonic Automotive Systems Company of America
+OUI:00234F*
+ ID_OUI_FROM_DATABASE=Luminous Power Technologies Pvt. Ltd.
 
-OUI:E80C38*
- ID_OUI_FROM_DATABASE=DAEYOUNG INFORMATION SYSTEM CO., LTD
+OUI:002350*
+ ID_OUI_FROM_DATABASE=LynTec
 
-OUI:68597F*
- ID_OUI_FROM_DATABASE=Alcatel Lucent
+OUI:002349*
+ ID_OUI_FROM_DATABASE=Helmholtz Centre Berlin for Material and Energy
 
-OUI:2C3068*
- ID_OUI_FROM_DATABASE=Pantech Co.,Ltd
+OUI:002244*
+ ID_OUI_FROM_DATABASE=Chengdu Linkon Communications Device Co., Ltd
 
-OUI:5C4058*
- ID_OUI_FROM_DATABASE=Jefferson Audio Video Systems, Inc.
+OUI:00224F*
+ ID_OUI_FROM_DATABASE=Byzoro Networks Ltd.
 
-OUI:64317E*
- ID_OUI_FROM_DATABASE=Dexin Corporation
+OUI:002248*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
 
-OUI:AC9B84*
- ID_OUI_FROM_DATABASE=Smak Tecnologia e Automacao
+OUI:00223E*
+ ID_OUI_FROM_DATABASE=IRTrans GmbH
 
-OUI:4C022E*
- ID_OUI_FROM_DATABASE=CMR KOREA CO., LTD
+OUI:002239*
+ ID_OUI_FROM_DATABASE=Indiana Life Sciences Incorporated
 
-OUI:24A42C*
- ID_OUI_FROM_DATABASE=KOUKAAM a.s.
+OUI:002232*
+ ID_OUI_FROM_DATABASE=Design Design Technology Ltd
 
-OUI:34F39B*
- ID_OUI_FROM_DATABASE=WizLAN Ltd.
+OUI:00222C*
+ ID_OUI_FROM_DATABASE=Ceton Corp
 
-OUI:74B9EB*
- ID_OUI_FROM_DATABASE=JinQianMao Technology Co.,Ltd.
+OUI:00230E*
+ ID_OUI_FROM_DATABASE=Gorba AG
 
-OUI:244597*
- ID_OUI_FROM_DATABASE=GEMUE Gebr. Mueller Apparatebau
+OUI:002307*
+ ID_OUI_FROM_DATABASE=FUTURE INNOVATION TECH CO.,LTD
 
-OUI:30694B*
- ID_OUI_FROM_DATABASE=RIM
+OUI:002302*
+ ID_OUI_FROM_DATABASE=Cobalt Digital, Inc.
 
-OUI:AC5135*
- ID_OUI_FROM_DATABASE=MPI TECH
+OUI:0022EB*
+ ID_OUI_FROM_DATABASE=Data Respons A/S
 
-OUI:E4EC10*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:0022EC*
+ ID_OUI_FROM_DATABASE=IDEALBT TECHNOLOGY CORPORATION
 
-OUI:00D38D*
- ID_OUI_FROM_DATABASE=Hotel Technology Next Generation
+OUI:0022F1*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:00239E*
+ ID_OUI_FROM_DATABASE=Jiangsu Lemote Technology Corporation Limited
 
-OUI:3C6278*
- ID_OUI_FROM_DATABASE=SHENZHEN JETNET TECHNOLOGY CO.,LTD.
+OUI:002398*
+ ID_OUI_FROM_DATABASE=Vutlan sro
 
-OUI:8081A5*
- ID_OUI_FROM_DATABASE=TONGQING COMMUNICATION EQUIPMENT (SHENZHEN) Co.,Ltd
+OUI:002384*
+ ID_OUI_FROM_DATABASE=GGH Engineering s.r.l.
 
-OUI:EC8EAD*
- ID_OUI_FROM_DATABASE=DLX
+OUI:002342*
+ ID_OUI_FROM_DATABASE=Coffee Equipment Company
 
-OUI:ECDE3D*
- ID_OUI_FROM_DATABASE=Lamprey Networks, Inc.
+OUI:002336*
+ ID_OUI_FROM_DATABASE=METEL s.r.o.
 
-OUI:04FE7F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00233D*
+ ID_OUI_FROM_DATABASE=Novero holding B.V.
 
-OUI:E8056D*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:002330*
+ ID_OUI_FROM_DATABASE=DIZIPIA, INC.
 
-OUI:00D11C*
- ID_OUI_FROM_DATABASE=ACETEL
+OUI:00232C*
+ ID_OUI_FROM_DATABASE=Senticare
 
-OUI:1056CA*
- ID_OUI_FROM_DATABASE=Peplink International Ltd.
+OUI:002320*
+ ID_OUI_FROM_DATABASE=Nicira Networks
 
-OUI:44A689*
- ID_OUI_FROM_DATABASE=PROMAX ELECTRONICA SA
+OUI:00231D*
+ ID_OUI_FROM_DATABASE=Deltacom Electronics Ltd
 
-OUI:10CCDB*
- ID_OUI_FROM_DATABASE=AXIMUM PRODUITS ELECTRONIQUES
+OUI:00231E*
+ ID_OUI_FROM_DATABASE=Cezzer Multimedia Technologies
 
-OUI:6C92BF*
- ID_OUI_FROM_DATABASE=Inspur Electronic Information Industry Co.,Ltd.
+OUI:0022B8*
+ ID_OUI_FROM_DATABASE=Norcott
 
-OUI:E01CEE*
- ID_OUI_FROM_DATABASE=Bravo Tech, Inc.
+OUI:0022B7*
+ ID_OUI_FROM_DATABASE=GSS Grundig SAT-Systems GmbH
 
-OUI:3C1915*
- ID_OUI_FROM_DATABASE=GFI Chrono Time
+OUI:0022B2*
+ ID_OUI_FROM_DATABASE=4RF Communications Ltd
 
-OUI:EC5C69*
- ID_OUI_FROM_DATABASE=MITSUBISHI HEAVY INDUSTRIES MECHATRONICS SYSTEMS,LTD.
+OUI:0022AB*
+ ID_OUI_FROM_DATABASE=Shenzhen Turbosight Technology Ltd
 
-OUI:04E548*
- ID_OUI_FROM_DATABASE=Cohda Wireless Pty Ltd
+OUI:0022A6*
+ ID_OUI_FROM_DATABASE=Sony Computer Entertainment America
 
-OUI:0C1DC2*
- ID_OUI_FROM_DATABASE=SeAH Networks
+OUI:00229F*
+ ID_OUI_FROM_DATABASE=Sensys Traffic AB
 
-OUI:28CD4C*
- ID_OUI_FROM_DATABASE=Individual Computers GmbH
+OUI:0022E5*
+ ID_OUI_FROM_DATABASE=Fisher-Rosemount Systems Inc.
 
-OUI:8C53F7*
- ID_OUI_FROM_DATABASE=A&D ENGINEERING CO., LTD.
+OUI:0022DE*
+ ID_OUI_FROM_DATABASE=OPPO Digital, Inc.
 
-OUI:781185*
- ID_OUI_FROM_DATABASE=NBS Payment Solutions Inc.
+OUI:0022D9*
+ ID_OUI_FROM_DATABASE=Fortex Industrial Ltd.
 
-OUI:2893FE*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0022D2*
+ ID_OUI_FROM_DATABASE=All Earth Comércio de Eletrônicos LTDA.
 
-OUI:10B7F6*
- ID_OUI_FROM_DATABASE=Plastoform Industries Ltd.
+OUI:0022CC*
+ ID_OUI_FROM_DATABASE=SciLog, Inc.
 
-OUI:2059A0*
- ID_OUI_FROM_DATABASE=Paragon Technologies Inc.
+OUI:0022C8*
+ ID_OUI_FROM_DATABASE=Applied Instruments B.V.
 
-OUI:487119*
- ID_OUI_FROM_DATABASE=SGB GROUP LTD.
+OUI:0022BE*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:E0ABFE*
- ID_OUI_FROM_DATABASE=Orb Networks, Inc.
+OUI:00228C*
+ ID_OUI_FROM_DATABASE=Photon Europe GmbH
 
-OUI:CCEA1C*
- ID_OUI_FROM_DATABASE=DCONWORKS  Co., Ltd
+OUI:002286*
+ ID_OUI_FROM_DATABASE=ASTRON
 
-OUI:ACE348*
- ID_OUI_FROM_DATABASE=MadgeTech, Inc
+OUI:002285*
+ ID_OUI_FROM_DATABASE=NOMUS COMM SYSTEMS
 
-OUI:687F74*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:002280*
+ ID_OUI_FROM_DATABASE=A2B Electronics AB
 
-OUI:CCB888*
- ID_OUI_FROM_DATABASE=AnB Securite s.a.
+OUI:002276*
+ ID_OUI_FROM_DATABASE=Triple EYE B.V.
 
-OUI:CC2218*
- ID_OUI_FROM_DATABASE=InnoDigital Co., Ltd.
+OUI:00227B*
+ ID_OUI_FROM_DATABASE=Apogee Labs, Inc.
 
-OUI:B86491*
- ID_OUI_FROM_DATABASE=CK Telecom Ltd
+OUI:002262*
+ ID_OUI_FROM_DATABASE=BEP Marine
 
-OUI:80C862*
- ID_OUI_FROM_DATABASE=Openpeak, Inc
+OUI:00226C*
+ ID_OUI_FROM_DATABASE=LinkSprite Technologies, Inc.
 
-OUI:E43593*
- ID_OUI_FROM_DATABASE=Hangzhou GoTo technology Co.Ltd
+OUI:00225E*
+ ID_OUI_FROM_DATABASE=Uwin Technologies Co.,LTD
 
-OUI:E0BC43*
- ID_OUI_FROM_DATABASE=C2 Microsystems, Inc.
+OUI:002258*
+ ID_OUI_FROM_DATABASE=Taiyo Yuden Co., Ltd.
 
-OUI:7884EE*
- ID_OUI_FROM_DATABASE=INDRA ESPACIO S.A.
+OUI:0023C3*
+ ID_OUI_FROM_DATABASE=LogMeIn, Inc.
 
-OUI:2C3F3E*
- ID_OUI_FROM_DATABASE=Alge-Timing GmbH
+OUI:0023BD*
+ ID_OUI_FROM_DATABASE=Digital Ally, Inc.
 
-OUI:C0CFA3*
- ID_OUI_FROM_DATABASE=Creative Electronics & Software, Inc.
+OUI:0023B7*
+ ID_OUI_FROM_DATABASE=Q-Light Co., Ltd.
 
-OUI:D4823E*
- ID_OUI_FROM_DATABASE=Argosy Technologies, Ltd.
+OUI:0023B1*
+ ID_OUI_FROM_DATABASE=Longcheer Technology (Singapore) Pte Ltd
 
-OUI:844823*
- ID_OUI_FROM_DATABASE=WOXTER TECHNOLOGY Co. Ltd
+OUI:0023B0*
+ ID_OUI_FROM_DATABASE=COMXION Technology Inc.
 
-OUI:D0F0DB*
- ID_OUI_FROM_DATABASE=Ericsson
+OUI:0023AB*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:7C1476*
- ID_OUI_FROM_DATABASE=Damall Technologies SAS
+OUI:0023A4*
+ ID_OUI_FROM_DATABASE=New Concepts Development Corp.
 
-OUI:D05875*
- ID_OUI_FROM_DATABASE=Active Control Technology Inc.
+OUI:001FC0*
+ ID_OUI_FROM_DATABASE=Control Express Finland Oy
 
-OUI:D81BFE*
- ID_OUI_FROM_DATABASE=TWINLINX CORPORATION
+OUI:001FBB*
+ ID_OUI_FROM_DATABASE=Xenatech Co.,LTD
 
-OUI:D46CBF*
- ID_OUI_FROM_DATABASE=Goodrich ISR
+OUI:001FB4*
+ ID_OUI_FROM_DATABASE=SmartShare Systems
 
-OUI:5C57C8*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:001FAD*
+ ID_OUI_FROM_DATABASE=Brown Innovations, Inc
 
-OUI:4CC602*
- ID_OUI_FROM_DATABASE=Radios, Inc.
+OUI:001FAF*
+ ID_OUI_FROM_DATABASE=NextIO, Inc.
 
-OUI:3C05AB*
- ID_OUI_FROM_DATABASE=Product Creation Studio
+OUI:001FAE*
+ ID_OUI_FROM_DATABASE=Blick South Africa (Pty) Ltd
 
-OUI:3C39C3*
- ID_OUI_FROM_DATABASE=JW Electronics Co., Ltd.
+OUI:001FA8*
+ ID_OUI_FROM_DATABASE=Smart Energy Instruments Inc.
 
-OUI:547FEE*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001FA3*
+ ID_OUI_FROM_DATABASE=T&W Electronics(Shenzhen)Co.,Ltd.
 
-OUI:A4C2AB*
- ID_OUI_FROM_DATABASE=Hangzhou LEAD-IT Information & Technology Co.,Ltd
+OUI:002142*
+ ID_OUI_FROM_DATABASE=Advanced Control Systems doo
 
-OUI:48AA5D*
- ID_OUI_FROM_DATABASE=Store Electronic Systems
+OUI:002140*
+ ID_OUI_FROM_DATABASE=EN Technologies Inc.
 
-OUI:1062C9*
- ID_OUI_FROM_DATABASE=Adatis GmbH & Co. KG
+OUI:002138*
+ ID_OUI_FROM_DATABASE=Cepheid
 
-OUI:D8AE90*
- ID_OUI_FROM_DATABASE=Itibia Technologies
+OUI:00212E*
+ ID_OUI_FROM_DATABASE=dresden-elektronik
 
-OUI:904716*
- ID_OUI_FROM_DATABASE=RORZE CORPORATION
+OUI:002128*
+ ID_OUI_FROM_DATABASE=Oracle Corporation
 
-OUI:28E794*
- ID_OUI_FROM_DATABASE=Microtime Computer Inc.
+OUI:002122*
+ ID_OUI_FROM_DATABASE=Chip-pro Ltd.
 
-OUI:8894F9*
- ID_OUI_FROM_DATABASE=Gemicom Technology, Inc.
+OUI:00211B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0CA42A*
- ID_OUI_FROM_DATABASE=OB Telecom Electronic Technology Co., Ltd
+OUI:002115*
+ ID_OUI_FROM_DATABASE=PHYWE Systeme GmbH & Co. KG
 
-OUI:5850E6*
- ID_OUI_FROM_DATABASE=Best Buy Corporation
+OUI:002116*
+ ID_OUI_FROM_DATABASE=Transcon Electronic Systems, spol. s r. o.
 
-OUI:AC9A96*
- ID_OUI_FROM_DATABASE=Lantiq Deutschland GmbH
+OUI:00210F*
+ ID_OUI_FROM_DATABASE=Cernium Corp
 
-OUI:E86CDA*
- ID_OUI_FROM_DATABASE=Supercomputers and Neurocomputers Research Center
+OUI:00210B*
+ ID_OUI_FROM_DATABASE=GEMINI TRAZE RFID PVT. LTD.
 
-OUI:24B6B8*
- ID_OUI_FROM_DATABASE=FRIEM SPA
+OUI:00210C*
+ ID_OUI_FROM_DATABASE=Cymtec Systems, Inc.
 
-OUI:F86ECF*
- ID_OUI_FROM_DATABASE=Arcx Inc
+OUI:001FFC*
+ ID_OUI_FROM_DATABASE=Riccius+Sohn GmbH
 
-OUI:8C8401*
- ID_OUI_FROM_DATABASE=Private
+OUI:001FF7*
+ ID_OUI_FROM_DATABASE=Nakajima All Precision Co., Ltd.
 
-OUI:6C7039*
- ID_OUI_FROM_DATABASE=Novar GmbH
+OUI:00216E*
+ ID_OUI_FROM_DATABASE=Function ATI (Huizhou) Telecommunications Co., Ltd.
 
-OUI:A4561B*
- ID_OUI_FROM_DATABASE=MCOT Corporation
+OUI:002168*
+ ID_OUI_FROM_DATABASE=iVeia, LLC
 
-OUI:80EE73*
- ID_OUI_FROM_DATABASE=Shuttle Inc.
+OUI:002161*
+ ID_OUI_FROM_DATABASE=Yournet Inc.
 
-OUI:10C73F*
- ID_OUI_FROM_DATABASE=Midas Klark Teknik Ltd
+OUI:002155*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:408A9A*
- ID_OUI_FROM_DATABASE=TITENG CO., Ltd.
+OUI:00214E*
+ ID_OUI_FROM_DATABASE=GS Yuasa Power Supply Ltd.
 
-OUI:702B1D*
- ID_OUI_FROM_DATABASE=E-Domus International Limited
+OUI:002149*
+ ID_OUI_FROM_DATABASE=China Daheng Group ,Inc.
 
-OUI:F077D0*
- ID_OUI_FROM_DATABASE=Xcellen
+OUI:001FF0*
+ ID_OUI_FROM_DATABASE=Audio Partnership
 
-OUI:785C72*
- ID_OUI_FROM_DATABASE=Hioso Technology Co., Ltd.
+OUI:001FE9*
+ ID_OUI_FROM_DATABASE=Printrex, Inc.
 
-OUI:94236E*
- ID_OUI_FROM_DATABASE=Shenzhen Junlan Electronic Ltd
+OUI:001FEB*
+ ID_OUI_FROM_DATABASE=Trio Datacom Pty Ltd
 
-OUI:88BA7F*
- ID_OUI_FROM_DATABASE=Qfiednet Co., Ltd.
+OUI:001FEA*
+ ID_OUI_FROM_DATABASE=Applied Media Technologies Corporation
 
-OUI:E02636*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:001FDD*
+ ID_OUI_FROM_DATABASE=GDI LLC
 
-OUI:4456B7*
- ID_OUI_FROM_DATABASE=Spawn Labs, Inc
+OUI:001FD8*
+ ID_OUI_FROM_DATABASE=A-TRUST COMPUTER CORPORATION
 
-OUI:A09805*
- ID_OUI_FROM_DATABASE=OpenVox Communication Co Ltd
+OUI:001FD3*
+ ID_OUI_FROM_DATABASE=RIVA Networks Inc.
 
-OUI:00271D*
- ID_OUI_FROM_DATABASE=Comba Telecom Systems (China) Ltd.
+OUI:001FCE*
+ ID_OUI_FROM_DATABASE=QTECH LLC
 
-OUI:002721*
- ID_OUI_FROM_DATABASE=Shenzhen Baoan Fenda Industrial Co., Ltd
+OUI:00219D*
+ ID_OUI_FROM_DATABASE=Adesys BV
 
-OUI:A09A5A*
- ID_OUI_FROM_DATABASE=Time Domain
+OUI:0021A1*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:64A837*
- ID_OUI_FROM_DATABASE=Juni Korea Co., Ltd
+OUI:002198*
+ ID_OUI_FROM_DATABASE=Thai Radio Co, LTD
 
-OUI:B4B5AF*
- ID_OUI_FROM_DATABASE=Minsung Electronics
+OUI:002193*
+ ID_OUI_FROM_DATABASE=Videofon MV
 
-OUI:044FAA*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:00218D*
+ ID_OUI_FROM_DATABASE=AP Router Ind. Eletronica LTDA
 
-OUI:44568D*
- ID_OUI_FROM_DATABASE=PNC Technologies  Co., Ltd.
+OUI:00218E*
+ ID_OUI_FROM_DATABASE=MEKICS CO., LTD.
 
-OUI:ACD180*
- ID_OUI_FROM_DATABASE=Crexendo Business Solutions, Inc.
+OUI:002187*
+ ID_OUI_FROM_DATABASE=Imacs GmbH
 
-OUI:AC8317*
- ID_OUI_FROM_DATABASE=Shenzhen Furtunetel Communication Co., Ltd
+OUI:002181*
+ ID_OUI_FROM_DATABASE=Si2 Microsystems Limited
 
-OUI:E80B13*
- ID_OUI_FROM_DATABASE=Akib Systems Taiwan, INC
+OUI:00217B*
+ ID_OUI_FROM_DATABASE=Bastec AB
 
-OUI:44C9A2*
- ID_OUI_FROM_DATABASE=Greenwald Industries
+OUI:002174*
+ ID_OUI_FROM_DATABASE=AvaLAN Wireless
 
-OUI:646E6C*
- ID_OUI_FROM_DATABASE=Radio Datacom LLC
+OUI:0021F8*
+ ID_OUI_FROM_DATABASE=Enseo, Inc.
 
-OUI:E4751E*
- ID_OUI_FROM_DATABASE=Getinge Sterilization AB
+OUI:0021F3*
+ ID_OUI_FROM_DATABASE=Si14 SpA
 
-OUI:F8811A*
- ID_OUI_FROM_DATABASE=OVERKIZ
+OUI:0021EC*
+ ID_OUI_FROM_DATABASE=Solutronic GmbH
 
-OUI:042BBB*
- ID_OUI_FROM_DATABASE=PicoCELA, Inc.
+OUI:0021E6*
+ ID_OUI_FROM_DATABASE=Starlight Video Limited
 
-OUI:FC0877*
- ID_OUI_FROM_DATABASE=Prentke Romich Company
+OUI:0021E0*
+ ID_OUI_FROM_DATABASE=CommAgility Ltd
 
-OUI:ECD00E*
- ID_OUI_FROM_DATABASE=MiraeRecognition Co., Ltd.
+OUI:0021D3*
+ ID_OUI_FROM_DATABASE=BOCOM SECURITY(ASIA PACIFIC) LIMITED
 
-OUI:747E1A*
- ID_OUI_FROM_DATABASE=Red Embedded Design Limited
+OUI:0021D4*
+ ID_OUI_FROM_DATABASE=Vollmer Werke GmbH
 
-OUI:C47D4F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0021D9*
+ ID_OUI_FROM_DATABASE=SEKONIC CORPORATION
 
-OUI:4C9EE4*
- ID_OUI_FROM_DATABASE=Hanyang Navicom Co.,Ltd.
+OUI:0021CD*
+ ID_OUI_FROM_DATABASE=LiveTV
 
-OUI:3CDF1E*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0021C7*
+ ID_OUI_FROM_DATABASE=Russound
 
-OUI:BCB181*
- ID_OUI_FROM_DATABASE=SHARP CORPORATION
+OUI:0021C6*
+ ID_OUI_FROM_DATABASE=CSJ Global, Inc.
 
-OUI:78B81A*
- ID_OUI_FROM_DATABASE=INTER SALES A/S
+OUI:0021C1*
+ ID_OUI_FROM_DATABASE=ABB Oy / Medium Voltage Products
 
-OUI:78192E*
- ID_OUI_FROM_DATABASE=NASCENT Technology
+OUI:0021B4*
+ ID_OUI_FROM_DATABASE=APRO MEDIA CO., LTD
 
-OUI:2C0623*
- ID_OUI_FROM_DATABASE=Win Leader Inc.
+OUI:0021AE*
+ ID_OUI_FROM_DATABASE=ALCATEL-LUCENT FRANCE - WTD
 
-OUI:C82E94*
- ID_OUI_FROM_DATABASE=Halfa Enterprise Co., Ltd.
+OUI:0021A2*
+ ID_OUI_FROM_DATABASE=EKE-Electronics Ltd.
 
-OUI:0C2755*
- ID_OUI_FROM_DATABASE=Valuable Techologies Limited
+OUI:0021A7*
+ ID_OUI_FROM_DATABASE=Hantle System Co., Ltd.
 
-OUI:C038F9*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:00221F*
+ ID_OUI_FROM_DATABASE=eSang Technologies Co., Ltd.
 
-OUI:F46349*
- ID_OUI_FROM_DATABASE=Diffon Corporation
+OUI:002226*
+ ID_OUI_FROM_DATABASE=Avaak, Inc.
 
-OUI:5C8778*
- ID_OUI_FROM_DATABASE=Cybertelbridge co.,ltd
+OUI:00221A*
+ ID_OUI_FROM_DATABASE=Audio Precision
 
-OUI:9C5E73*
- ID_OUI_FROM_DATABASE=Calibre UK LTD
+OUI:002213*
+ ID_OUI_FROM_DATABASE=PCI CORPORATION
 
-OUI:F06281*
- ID_OUI_FROM_DATABASE=ProCurve Networking by HP
+OUI:00220D*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:003A9B*
+OUI:00220C*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:2C9127*
- ID_OUI_FROM_DATABASE=Eintechno Corporation
+OUI:002202*
+ ID_OUI_FROM_DATABASE=Excito Elektronik i Skåne AB
 
-OUI:C09C92*
- ID_OUI_FROM_DATABASE=COBY
+OUI:0021F9*
+ ID_OUI_FROM_DATABASE=WIRECOM Technologies
 
-OUI:849000*
- ID_OUI_FROM_DATABASE=Arnold & Richter Cine Technik
+OUI:001F40*
+ ID_OUI_FROM_DATABASE=Speakercraft Inc.
 
-OUI:C87248*
- ID_OUI_FROM_DATABASE=Aplicom Oy
+OUI:001F38*
+ ID_OUI_FROM_DATABASE=POSITRON
 
-OUI:74D850*
- ID_OUI_FROM_DATABASE=Evrisko Systems
+OUI:001F3D*
+ ID_OUI_FROM_DATABASE=Qbit GmbH
 
-OUI:6CAC60*
- ID_OUI_FROM_DATABASE=Venetex Corp
+OUI:001F37*
+ ID_OUI_FROM_DATABASE=Genesis I&C
 
-OUI:DC0265*
- ID_OUI_FROM_DATABASE=Meditech Kft
+OUI:001F2A*
+ ID_OUI_FROM_DATABASE=ACCM
 
-OUI:986DC8*
- ID_OUI_FROM_DATABASE=TOSHIBA MITSUBISHI-ELECTRIC INDUSTRIAL SYSTEMS CORPORATION
+OUI:001F31*
+ ID_OUI_FROM_DATABASE=Radiocomp
 
-OUI:68A1B7*
- ID_OUI_FROM_DATABASE=Honghao Mingchuan Technology (Beijing) CO.,Ltd.
+OUI:001F25*
+ ID_OUI_FROM_DATABASE=MBS GmbH
 
-OUI:7CCFCF*
- ID_OUI_FROM_DATABASE=Shanghai SEARI Intelligent System Co., Ltd
+OUI:001F1E*
+ ID_OUI_FROM_DATABASE=Astec Technology Co., Ltd
 
-OUI:EC3091*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001F17*
+ ID_OUI_FROM_DATABASE=IDX Company, Ltd.
 
-OUI:3032D4*
- ID_OUI_FROM_DATABASE=Hanilstm Co., Ltd.
+OUI:001F18*
+ ID_OUI_FROM_DATABASE=Hakusan.Mfg.Co,.Ltd
 
-OUI:0026EE*
- ID_OUI_FROM_DATABASE=TKM GmbH
+OUI:001E61*
+ ID_OUI_FROM_DATABASE=ITEC GmbH
 
-OUI:0026E7*
- ID_OUI_FROM_DATABASE=Shanghai ONLAN Communication Tech. Co., Ltd.
+OUI:001E5C*
+ ID_OUI_FROM_DATABASE=RB GeneralEkonomik
 
-OUI:0026E1*
- ID_OUI_FROM_DATABASE=Stanford University, OpenFlow Group
+OUI:001E5B*
+ ID_OUI_FROM_DATABASE=Unitron Company, Inc.
 
-OUI:0026DB*
- ID_OUI_FROM_DATABASE=Ionics EMS Inc.
+OUI:001E55*
+ ID_OUI_FROM_DATABASE=COWON SYSTEMS,Inc.
 
-OUI:0026CE*
- ID_OUI_FROM_DATABASE=Kozumi USA Corp.
+OUI:001E4E*
+ ID_OUI_FROM_DATABASE=DAKO EDV-Ingenieur- und Systemhaus GmbH
 
-OUI:0026D5*
- ID_OUI_FROM_DATABASE=Ory Solucoes em Comercio de Informatica Ltda.
+OUI:001E49*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0026C8*
- ID_OUI_FROM_DATABASE=System Sensor
+OUI:001E44*
+ ID_OUI_FROM_DATABASE=SANTEC
 
-OUI:002711*
- ID_OUI_FROM_DATABASE=LanPro Inc
+OUI:001E3F*
+ ID_OUI_FROM_DATABASE=TrellisWare Technologies, Inc.
 
-OUI:00270D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001E38*
+ ID_OUI_FROM_DATABASE=Bluecard Software Technology Co., Ltd.
 
-OUI:002707*
- ID_OUI_FROM_DATABASE=Lift Complex DS, JSC
+OUI:001E31*
+ ID_OUI_FROM_DATABASE=INFOMARK CO.,LTD.
 
-OUI:002700*
- ID_OUI_FROM_DATABASE=Shenzhen Siglent Technology Co., Ltd.
+OUI:001E32*
+ ID_OUI_FROM_DATABASE=Zensys
 
-OUI:0026FA*
- ID_OUI_FROM_DATABASE=BandRich Inc.
+OUI:001E2C*
+ ID_OUI_FROM_DATABASE=CyVerse Corporation
 
-OUI:0026F4*
- ID_OUI_FROM_DATABASE=Nesslab
+OUI:001E20*
+ ID_OUI_FROM_DATABASE=Intertain Inc.
 
-OUI:0025D7*
- ID_OUI_FROM_DATABASE=CEDO
+OUI:001E19*
+ ID_OUI_FROM_DATABASE=GTRI
 
-OUI:0025D2*
- ID_OUI_FROM_DATABASE=InpegVision Co., Ltd
+OUI:001E0F*
+ ID_OUI_FROM_DATABASE=Briot International
 
-OUI:0025D1*
- ID_OUI_FROM_DATABASE=Eastern Asia Technology Limited
+OUI:001EE4*
+ ID_OUI_FROM_DATABASE=ACS Solutions France
 
-OUI:0025CB*
- ID_OUI_FROM_DATABASE=Reiner SCT
+OUI:001EEB*
+ ID_OUI_FROM_DATABASE=Talk-A-Phone Co.
 
-OUI:0025C4*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:001EDF*
+ ID_OUI_FROM_DATABASE=Master Industrialization Center Kista
 
-OUI:0025BF*
- ID_OUI_FROM_DATABASE=Wireless Cables Inc.
+OUI:001EDA*
+ ID_OUI_FROM_DATABASE=Wesemann Elektrotechniek B.V.
 
-OUI:0025B1*
- ID_OUI_FROM_DATABASE=Maya-Creation Corporation
+OUI:001ED5*
+ ID_OUI_FROM_DATABASE=Tekon-Automatics
 
-OUI:0025B8*
- ID_OUI_FROM_DATABASE=Agile Communications, Inc.
+OUI:001ECE*
+ ID_OUI_FROM_DATABASE=BISA Technologies (Hong Kong) Limited
 
-OUI:0025B2*
- ID_OUI_FROM_DATABASE=MBDA Deutschland GmbH
+OUI:001EC8*
+ ID_OUI_FROM_DATABASE=Rapid Mobile (Pty) Ltd
 
-OUI:0025AC*
- ID_OUI_FROM_DATABASE=I-Tech corporation
+OUI:001EBB*
+ ID_OUI_FROM_DATABASE=BLUELIGHT TECHNOLOGY INC.
 
-OUI:0026C2*
- ID_OUI_FROM_DATABASE=SCDI Co. LTD
+OUI:001EB6*
+ ID_OUI_FROM_DATABASE=TAG Heuer SA
 
-OUI:0026BC*
- ID_OUI_FROM_DATABASE=General Jack Technology Ltd.
+OUI:001EB5*
+ ID_OUI_FROM_DATABASE=Ever Sparkle Technologies Ltd
 
-OUI:0026B4*
- ID_OUI_FROM_DATABASE=Ford Motor Company
+OUI:001EAF*
+ ID_OUI_FROM_DATABASE=Ophir Optronics Ltd
 
-OUI:0026AE*
- ID_OUI_FROM_DATABASE=Wireless Measurement Ltd
+OUI:001EAA*
+ ID_OUI_FROM_DATABASE=E-Senza Technologies GmbH
 
-OUI:0026AA*
- ID_OUI_FROM_DATABASE=Kenmec Mechanical Engineering Co., Ltd.
+OUI:001E9D*
+ ID_OUI_FROM_DATABASE=Recall Technologies, Inc.
 
-OUI:0026A4*
- ID_OUI_FROM_DATABASE=Novus Produtos Eletronicos Ltda
+OUI:001E98*
+ ID_OUI_FROM_DATABASE=GreenLine Communications
 
-OUI:002698*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001E97*
+ ID_OUI_FROM_DATABASE=Medium Link System Technology CO., LTD,
 
-OUI:00269D*
- ID_OUI_FROM_DATABASE=M2Mnet Co., Ltd.
+OUI:001E91*
+ ID_OUI_FROM_DATABASE=KIMIN Electronic Co., Ltd.
 
-OUI:00268B*
- ID_OUI_FROM_DATABASE=Guangzhou Escene Computer Technology Limited
+OUI:001E8A*
+ ID_OUI_FROM_DATABASE=eCopy, Inc
 
-OUI:002685*
- ID_OUI_FROM_DATABASE=Digital Innovation
+OUI:001E85*
+ ID_OUI_FROM_DATABASE=Lagotek Corporation
 
-OUI:002678*
- ID_OUI_FROM_DATABASE=Logic Instrument SA
+OUI:001E78*
+ ID_OUI_FROM_DATABASE=Owitek Technology Ltd.,
 
-OUI:002672*
- ID_OUI_FROM_DATABASE=AAMP of America
+OUI:001E6D*
+ ID_OUI_FROM_DATABASE=IT R&D Center
 
-OUI:00266B*
- ID_OUI_FROM_DATABASE=SHINE UNION ENTERPRISE LIMITED
+OUI:001E6E*
+ ID_OUI_FROM_DATABASE=Shenzhen First Mile Communications Ltd
 
-OUI:002666*
- ID_OUI_FROM_DATABASE=EFM Networks
+OUI:001F71*
+ ID_OUI_FROM_DATABASE=xG Technology, Inc.
 
-OUI:002665*
- ID_OUI_FROM_DATABASE=ProtectedLogic Corporation
+OUI:001F72*
+ ID_OUI_FROM_DATABASE=QingDao Hiphone Technology Co,.Ltd
 
-OUI:002651*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001F76*
+ ID_OUI_FROM_DATABASE=AirLogic Systems Inc.
 
-OUI:002652*
+OUI:001F6C*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:002646*
- ID_OUI_FROM_DATABASE=SHENYANG TONGFANG MULTIMEDIA TECHNOLOGY COMPANY LIMITED
+OUI:001F60*
+ ID_OUI_FROM_DATABASE=COMPASS SYSTEMS CORP.
 
-OUI:002640*
- ID_OUI_FROM_DATABASE=Baustem Broadband Technologies, Ltd.
+OUI:001F65*
+ ID_OUI_FROM_DATABASE=KOREA ELECTRIC TERMINAL CO., LTD.
 
-OUI:00263A*
- ID_OUI_FROM_DATABASE=Digitec Systems
+OUI:001F5F*
+ ID_OUI_FROM_DATABASE=Blatand GmbH
 
-OUI:002634*
- ID_OUI_FROM_DATABASE=Infineta Systems, Inc
+OUI:001F59*
+ ID_OUI_FROM_DATABASE=Kronback Tracers
 
-OUI:002633*
- ID_OUI_FROM_DATABASE=MIR - Medical International Research
+OUI:001F4D*
+ ID_OUI_FROM_DATABASE=Segnetics LLC
 
-OUI:00262E*
- ID_OUI_FROM_DATABASE=Chengdu Jiuzhou Electronic Technology Inc
+OUI:001F52*
+ ID_OUI_FROM_DATABASE=UVT Unternehmensberatung fur Verkehr und Technik GmbH
 
-OUI:002627*
- ID_OUI_FROM_DATABASE=Truesell
+OUI:001F03*
+ ID_OUI_FROM_DATABASE=NUM AG
 
-OUI:002621*
- ID_OUI_FROM_DATABASE=InteliCloud Technology Inc.
+OUI:001EFE*
+ ID_OUI_FROM_DATABASE=LEVEL s.r.o.
 
-OUI:00261B*
- ID_OUI_FROM_DATABASE=LAUREL BANK MACHINES CO., LTD.
+OUI:001F04*
+ ID_OUI_FROM_DATABASE=Granch Ltd.
 
-OUI:002614*
- ID_OUI_FROM_DATABASE=KTNF
+OUI:001EF2*
+ ID_OUI_FROM_DATABASE=Micro Motion Inc
 
-OUI:00260E*
- ID_OUI_FROM_DATABASE=Ablaze Systems, LLC
+OUI:001EF7*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:002602*
- ID_OUI_FROM_DATABASE=SMART Temps LLC
+OUI:001EF1*
+ ID_OUI_FROM_DATABASE=Servimat
 
-OUI:002601*
- ID_OUI_FROM_DATABASE=Cutera Inc
+OUI:001F9E*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0025F7*
- ID_OUI_FROM_DATABASE=Ansaldo STS USA
+OUI:001F97*
+ ID_OUI_FROM_DATABASE=BERTANA srl
 
-OUI:0025FC*
- ID_OUI_FROM_DATABASE=ENDA ENDUSTRIYEL ELEKTRONIK LTD. STI.
+OUI:001F8B*
+ ID_OUI_FROM_DATABASE=Cache IQ
 
-OUI:0025ED*
- ID_OUI_FROM_DATABASE=NuVo Technologies LLC
+OUI:001F84*
+ ID_OUI_FROM_DATABASE=Gigle Semiconductor
 
-OUI:0025EE*
- ID_OUI_FROM_DATABASE=Avtex Ltd
+OUI:001F7F*
+ ID_OUI_FROM_DATABASE=Phabrix Limited
 
-OUI:0025E8*
- ID_OUI_FROM_DATABASE=Idaho Technology
+OUI:001CFF*
+ ID_OUI_FROM_DATABASE=Napera Networks Inc
 
-OUI:0025E3*
- ID_OUI_FROM_DATABASE=Hanshinit Inc.
+OUI:001CF8*
+ ID_OUI_FROM_DATABASE=Parade Technologies, Ltd.
 
-OUI:0025DE*
- ID_OUI_FROM_DATABASE=Probits Co., LTD.
+OUI:001CF1*
+ ID_OUI_FROM_DATABASE=SUPoX Technology Co. , LTD.
 
-OUI:002579*
- ID_OUI_FROM_DATABASE=J & F Labs
+OUI:001CF2*
+ ID_OUI_FROM_DATABASE=Tenlon Technology Co.,Ltd.
 
-OUI:00257E*
- ID_OUI_FROM_DATABASE=NEW POS Technology Limited
+OUI:001CEC*
+ ID_OUI_FROM_DATABASE=Mobilesoft (Aust.) Pty Ltd
 
-OUI:002572*
- ID_OUI_FROM_DATABASE=Nemo-Q International AB
+OUI:001CE7*
+ ID_OUI_FROM_DATABASE=Rocon PLC Research Centre
 
-OUI:00256B*
- ID_OUI_FROM_DATABASE=ATENIX E.E. s.r.l.
+OUI:001CE2*
+ ID_OUI_FROM_DATABASE=Attero Tech, LLC.
 
-OUI:00256C*
- ID_OUI_FROM_DATABASE=Azimut Production Association JSC
+OUI:001CDB*
+ ID_OUI_FROM_DATABASE=CARPOINT CO.,LTD
 
-OUI:00255F*
- ID_OUI_FROM_DATABASE=SenTec AG
+OUI:001CD5*
+ ID_OUI_FROM_DATABASE=ZeeVee, Inc.
 
-OUI:00255A*
- ID_OUI_FROM_DATABASE=Tantalus Systems Corp.
+OUI:001CCF*
+ ID_OUI_FROM_DATABASE=LIMETEK
 
-OUI:002559*
- ID_OUI_FROM_DATABASE=Syphan Technologies Ltd
+OUI:001E08*
+ ID_OUI_FROM_DATABASE=Centec Networks Inc
 
-OUI:0025A5*
- ID_OUI_FROM_DATABASE=Walnut Media Network
+OUI:001E03*
+ ID_OUI_FROM_DATABASE=LiComm Co., Ltd.
 
-OUI:00259F*
- ID_OUI_FROM_DATABASE=TechnoDigital Technologies GmbH
+OUI:001DFC*
+ ID_OUI_FROM_DATABASE=KSIC
 
-OUI:002599*
- ID_OUI_FROM_DATABASE=Hedon e.d. B.V.
+OUI:001DF5*
+ ID_OUI_FROM_DATABASE=Sunshine Co,LTD
 
-OUI:002592*
- ID_OUI_FROM_DATABASE=Guangzhou Shirui Electronic Co., Ltd
+OUI:001DF0*
+ ID_OUI_FROM_DATABASE=Vidient Systems, Inc.
 
-OUI:00258D*
- ID_OUI_FROM_DATABASE=Haier
+OUI:001DDC*
+ ID_OUI_FROM_DATABASE=HangZhou DeChangLong Tech&Info Co.,Ltd
 
-OUI:002588*
- ID_OUI_FROM_DATABASE=Genie Industries, Inc.
+OUI:001DE4*
+ ID_OUI_FROM_DATABASE=Visioneered Image Systems
 
-OUI:002583*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001DE2*
+ ID_OUI_FROM_DATABASE=Radionor Communications
 
-OUI:00254C*
- ID_OUI_FROM_DATABASE=Videon Central, Inc.
+OUI:001CC8*
+ ID_OUI_FROM_DATABASE=INDUSTRONIC Industrie-Electronic GmbH & Co. KG
 
-OUI:002536*
- ID_OUI_FROM_DATABASE=Oki Electric Industry Co., Ltd.
+OUI:001CBC*
+ ID_OUI_FROM_DATABASE=CastGrabber, LLC
 
-OUI:00253D*
- ID_OUI_FROM_DATABASE=DRS Consolidated Controls
+OUI:001CB2*
+ ID_OUI_FROM_DATABASE=BPT SPA
 
-OUI:002540*
- ID_OUI_FROM_DATABASE=Quasar Technologies, Inc.
+OUI:001CA6*
+ ID_OUI_FROM_DATABASE=Win4NET
 
-OUI:002533*
- ID_OUI_FROM_DATABASE=WITTENSTEIN AG
+OUI:001CAB*
+ ID_OUI_FROM_DATABASE=Meyer Sound Laboratories, Inc.
 
-OUI:00252C*
- ID_OUI_FROM_DATABASE=Entourage Systems, Inc.
+OUI:001CAC*
+ ID_OUI_FROM_DATABASE=Qniq Technology Corp.
 
-OUI:002502*
- ID_OUI_FROM_DATABASE=NaturalPoint
+OUI:001CA1*
+ ID_OUI_FROM_DATABASE=AKAMAI TECHNOLOGIES, INC.
 
-OUI:0024FB*
- ID_OUI_FROM_DATABASE=Private
+OUI:001C95*
+ ID_OUI_FROM_DATABASE=Opticomm Corporation
 
-OUI:0024F6*
- ID_OUI_FROM_DATABASE=MIYOSHI ELECTRONICS CORPORATION
+OUI:001C90*
+ ID_OUI_FROM_DATABASE=Empacket Corporation
 
-OUI:0024EA*
- ID_OUI_FROM_DATABASE=iris-GmbH infrared & intelligent sensors
+OUI:001C8F*
+ ID_OUI_FROM_DATABASE=Advanced Electronic Design, Inc.
 
-OUI:0024E3*
- ID_OUI_FROM_DATABASE=CAO Group
+OUI:001C89*
+ ID_OUI_FROM_DATABASE=Force Communications, Inc.
 
-OUI:002527*
- ID_OUI_FROM_DATABASE=Bitrode Corp.
+OUI:001C7F*
+ ID_OUI_FROM_DATABASE=Check Point Software Technologies
 
-OUI:002524*
- ID_OUI_FROM_DATABASE=Lightcomm Technology Co., Ltd
+OUI:001C75*
+ ID_OUI_FROM_DATABASE=Segnet Ltd.
 
-OUI:00251F*
- ID_OUI_FROM_DATABASE=ZYNUS VISION INC.
+OUI:001C6E*
+ ID_OUI_FROM_DATABASE=Newbury Networks, Inc.
 
-OUI:00251A*
- ID_OUI_FROM_DATABASE=Psiber Data Systems Inc.
+OUI:001C69*
+ ID_OUI_FROM_DATABASE=Packet Vision Ltd
 
-OUI:002515*
- ID_OUI_FROM_DATABASE=SFR
+OUI:001DA5*
+ ID_OUI_FROM_DATABASE=WB Electronics
 
-OUI:00250E*
- ID_OUI_FROM_DATABASE=gt german telematics gmbh
+OUI:001DA6*
+ ID_OUI_FROM_DATABASE=Media Numerics Limited
 
-OUI:002507*
- ID_OUI_FROM_DATABASE=ASTAK Inc.
+OUI:001DA0*
+ ID_OUI_FROM_DATABASE=Heng Yu Electronic Manufacturing Company Limited
 
-OUI:002509*
- ID_OUI_FROM_DATABASE=SHARETRONIC Group LTD
+OUI:001D99*
+ ID_OUI_FROM_DATABASE=Cyan Optic, Inc.
 
-OUI:002437*
- ID_OUI_FROM_DATABASE=Motorola - BSG
+OUI:001D94*
+ ID_OUI_FROM_DATABASE=Climax Technology Co., Ltd
 
-OUI:00243C*
- ID_OUI_FROM_DATABASE=S.A.A.A.
+OUI:001D93*
+ ID_OUI_FROM_DATABASE=Modacom
 
-OUI:002430*
- ID_OUI_FROM_DATABASE=Ruby Tech Corp.
+OUI:001D8D*
+ ID_OUI_FROM_DATABASE=Raytek GmbH
 
-OUI:0023FB*
- ID_OUI_FROM_DATABASE=IP Datatel, LLC.
+OUI:001D86*
+ ID_OUI_FROM_DATABASE=Shinwa Industries(China) Ltd.
 
-OUI:0023F3*
- ID_OUI_FROM_DATABASE=Glocom, Inc.
+OUI:001DC9*
+ ID_OUI_FROM_DATABASE=GainSpan Corp.
 
-OUI:0023EF*
- ID_OUI_FROM_DATABASE=Zuend Systemtechnik AG
+OUI:001DC2*
+ ID_OUI_FROM_DATABASE=XORTEC OY
 
-OUI:0023E9*
- ID_OUI_FROM_DATABASE=F5 Networks, Inc.
+OUI:001DBD*
+ ID_OUI_FROM_DATABASE=Versamed Inc.
 
-OUI:0023E3*
- ID_OUI_FROM_DATABASE=Microtronic AG
+OUI:001DB6*
+ ID_OUI_FROM_DATABASE=BestComm Networks, Inc.
 
-OUI:0023E2*
- ID_OUI_FROM_DATABASE=SEA Signalisation
+OUI:001DB0*
+ ID_OUI_FROM_DATABASE=FuJian HengTong Information Technology Co.,Ltd
 
-OUI:0023DD*
- ID_OUI_FROM_DATABASE=ELGIN S.A.
+OUI:001DAC*
+ ID_OUI_FROM_DATABASE=Gigamon Systems LLC
 
-OUI:0023D0*
- ID_OUI_FROM_DATABASE=Uniloc USA Inc.
+OUI:001D81*
+ ID_OUI_FROM_DATABASE=GUANGZHOU GATEWAY ELECTRONICS CO., LTD
 
-OUI:0023CA*
- ID_OUI_FROM_DATABASE=Behind The Set, LLC
+OUI:001D69*
+ ID_OUI_FROM_DATABASE=Knorr-Bremse IT-Services GmbH
 
-OUI:0024B0*
- ID_OUI_FROM_DATABASE=ESAB AB
+OUI:001D70*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0024A9*
- ID_OUI_FROM_DATABASE=Ag Leader Technology
+OUI:001D77*
+ ID_OUI_FROM_DATABASE=NSGate
 
-OUI:0024A2*
- ID_OUI_FROM_DATABASE=Hong Kong Middleware Technology Limited
+OUI:001D7C*
+ ID_OUI_FROM_DATABASE=ABE Elettronica S.p.A.
 
-OUI:0024A4*
- ID_OUI_FROM_DATABASE=Siklu Communication
+OUI:001D64*
+ ID_OUI_FROM_DATABASE=Adam Communications Systems Int Ltd
 
-OUI:00249D*
- ID_OUI_FROM_DATABASE=NES Technology Inc.
+OUI:001D5D*
+ ID_OUI_FROM_DATABASE=Control Dynamics Pty. Ltd.
 
-OUI:00248A*
- ID_OUI_FROM_DATABASE=Kaga Electronics Co., Ltd.
+OUI:001D21*
+ ID_OUI_FROM_DATABASE=Alcad SL
 
-OUI:00248F*
- ID_OUI_FROM_DATABASE=DO-MONIX
+OUI:001D1C*
+ ID_OUI_FROM_DATABASE=Gennet s.a.
 
-OUI:002496*
- ID_OUI_FROM_DATABASE=Ginzinger electronic systems
+OUI:001D17*
+ ID_OUI_FROM_DATABASE=Digital Sky Corporation
 
-OUI:002477*
- ID_OUI_FROM_DATABASE=Tibbo Technology
+OUI:001D12*
+ ID_OUI_FROM_DATABASE=ROHM CO., LTD.
 
-OUI:002470*
- ID_OUI_FROM_DATABASE=AUROTECH ultrasound AS.
+OUI:001D11*
+ ID_OUI_FROM_DATABASE=Analogue & Micro Ltd
 
-OUI:002472*
- ID_OUI_FROM_DATABASE=ReDriven Power Inc.
+OUI:001D0B*
+ ID_OUI_FROM_DATABASE=Power Standards Lab
 
-OUI:00246B*
- ID_OUI_FROM_DATABASE=Covia, Inc.
+OUI:001D04*
+ ID_OUI_FROM_DATABASE=Zipit Wireless, Inc.
 
-OUI:002464*
- ID_OUI_FROM_DATABASE=Bridge Technologies Co AS
+OUI:001D58*
+ ID_OUI_FROM_DATABASE=CQ Inc
 
-OUI:00245F*
- ID_OUI_FROM_DATABASE=Vine Telecom CO.,Ltd.
+OUI:001D57*
+ ID_OUI_FROM_DATABASE=CAETEC Messtechnik
 
-OUI:002420*
- ID_OUI_FROM_DATABASE=NetUP Inc.
+OUI:001D51*
+ ID_OUI_FROM_DATABASE=Babcock & Wilcox Power Generation Group, Inc
 
-OUI:002426*
- ID_OUI_FROM_DATABASE=NOHMI BOSAI LTD.
+OUI:001D47*
+ ID_OUI_FROM_DATABASE=Covote GmbH & Co KG
 
-OUI:00241A*
- ID_OUI_FROM_DATABASE=Red Beetle Inc.
+OUI:001D40*
+ ID_OUI_FROM_DATABASE=Intel – GE Care Innovations LLC
 
-OUI:002413*
+OUI:001D34*
+ ID_OUI_FROM_DATABASE=SYRIS Technology Corp
+
+OUI:001D2D*
+ ID_OUI_FROM_DATABASE=Pylone, Inc.
+
+OUI:001B2A*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00240D*
- ID_OUI_FROM_DATABASE=OnePath Networks LTD.
+OUI:001B1D*
+ ID_OUI_FROM_DATABASE=Phoenix International Co., Ltd
 
-OUI:00240E*
- ID_OUI_FROM_DATABASE=Inventec Besta Co., Ltd.
+OUI:001B22*
+ ID_OUI_FROM_DATABASE=Palit Microsystems ( H.K.) Ltd.
 
-OUI:002407*
- ID_OUI_FROM_DATABASE=TELEM SAS
+OUI:001B1B*
+ ID_OUI_FROM_DATABASE=Siemens AG,
 
-OUI:002400*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:001B16*
+ ID_OUI_FROM_DATABASE=Celtro Ltd.
 
-OUI:0024D0*
- ID_OUI_FROM_DATABASE=Shenzhen SOGOOD Industry CO.,LTD.
+OUI:001B0A*
+ ID_OUI_FROM_DATABASE=Intelligent Distributed Controls Ltd
 
-OUI:0024D5*
- ID_OUI_FROM_DATABASE=Winward Industrial Limited
+OUI:001B0F*
+ ID_OUI_FROM_DATABASE=Petratec
 
-OUI:0024C9*
- ID_OUI_FROM_DATABASE=Broadband Solutions Group
+OUI:001AFE*
+ ID_OUI_FROM_DATABASE=SOFACREAL
 
-OUI:0024C4*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001B03*
+ ID_OUI_FROM_DATABASE=Action Technology (SZ) Co., Ltd
 
-OUI:0024BF*
- ID_OUI_FROM_DATABASE=CIAT
+OUI:001B68*
+ ID_OUI_FROM_DATABASE=Modnnet Co., Ltd
 
-OUI:0024B5*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:001B62*
+ ID_OUI_FROM_DATABASE=JHT Optoelectronics Co.,Ltd.
 
-OUI:00245A*
- ID_OUI_FROM_DATABASE=Nanjing Panda Electronics Company Limited
+OUI:001B61*
+ ID_OUI_FROM_DATABASE=Digital Acoustics, LLC
+
+OUI:001B5C*
+ ID_OUI_FROM_DATABASE=Azuretec Co., Ltd.
 
-OUI:002453*
- ID_OUI_FROM_DATABASE=Initra d.o.o.
+OUI:001B55*
+ ID_OUI_FROM_DATABASE=Hurco Automation Ltd.
 
-OUI:00244D*
- ID_OUI_FROM_DATABASE=Hokkaido Electronics Corporation
+OUI:001B50*
+ ID_OUI_FROM_DATABASE=Nizhny Novgorod Factory named after M.Frunze, FSUE (NZiF)
 
-OUI:002452*
- ID_OUI_FROM_DATABASE=Silicon Software GmbH
+OUI:001B44*
+ ID_OUI_FROM_DATABASE=SanDisk Corporation
 
-OUI:002446*
- ID_OUI_FROM_DATABASE=MMB Research Inc.
+OUI:001B49*
+ ID_OUI_FROM_DATABASE=Roberts Radio limited
 
-OUI:002441*
- ID_OUI_FROM_DATABASE=Wanzl Metallwarenfabrik GmbH
+OUI:001B42*
+ ID_OUI_FROM_DATABASE=Wise & Blue
 
-OUI:002368*
- ID_OUI_FROM_DATABASE=Zebra Technologies Inc
+OUI:001B3D*
+ ID_OUI_FROM_DATABASE=EuroTel Spa
 
-OUI:00236F*
- ID_OUI_FROM_DATABASE=DAQ System
+OUI:001B36*
+ ID_OUI_FROM_DATABASE=Tsubata Engineering Co.,Ltd. (Head Office)
 
-OUI:002362*
- ID_OUI_FROM_DATABASE=Goldline Controls
+OUI:001B31*
+ ID_OUI_FROM_DATABASE=Neural Image. Co. Ltd.
 
-OUI:002361*
- ID_OUI_FROM_DATABASE=Unigen Corporation
+OUI:001C56*
+ ID_OUI_FROM_DATABASE=Pado Systems, Inc.
 
-OUI:00235C*
- ID_OUI_FROM_DATABASE=Aprius, Inc.
+OUI:001C5B*
+ ID_OUI_FROM_DATABASE=Chubb Electronic Security Systems Ltd
 
-OUI:002355*
- ID_OUI_FROM_DATABASE=Kinco Automation(Shanghai) Ltd.
+OUI:001C5D*
+ ID_OUI_FROM_DATABASE=Leica Microsystems
 
-OUI:00234F*
- ID_OUI_FROM_DATABASE=Luminous Power Technologies Pvt. Ltd.
+OUI:001C5C*
+ ID_OUI_FROM_DATABASE=Integrated Medical Systems, Inc.
 
-OUI:002350*
- ID_OUI_FROM_DATABASE=LynTec
+OUI:001C51*
+ ID_OUI_FROM_DATABASE=Celeno Communications
 
-OUI:002349*
- ID_OUI_FROM_DATABASE=Helmholtz Centre Berlin for Material and Energy
+OUI:001C52*
+ ID_OUI_FROM_DATABASE=VISIONEE SRL
 
-OUI:002244*
- ID_OUI_FROM_DATABASE=Chengdu Linkon Communications Device Co., Ltd
+OUI:001C45*
+ ID_OUI_FROM_DATABASE=Chenbro Micom Co., Ltd.
 
-OUI:00224F*
- ID_OUI_FROM_DATABASE=Byzoro Networks Ltd.
+OUI:001C4C*
+ ID_OUI_FROM_DATABASE=Petrotest Instruments
 
-OUI:002248*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:001C39*
+ ID_OUI_FROM_DATABASE=S Netsystems Inc.
 
-OUI:00223E*
- ID_OUI_FROM_DATABASE=IRTrans GmbH
+OUI:001C40*
+ ID_OUI_FROM_DATABASE=VDG-Security bv
 
-OUI:002239*
- ID_OUI_FROM_DATABASE=Indiana Life Sciences Incorporated
+OUI:001C32*
+ ID_OUI_FROM_DATABASE=Telian Corporation
 
-OUI:002232*
- ID_OUI_FROM_DATABASE=Design Design Technology Ltd
+OUI:001AC7*
+ ID_OUI_FROM_DATABASE=UNIPOINT
 
-OUI:00222C*
- ID_OUI_FROM_DATABASE=Ceton Corp
+OUI:001AC2*
+ ID_OUI_FROM_DATABASE=YEC Co.,Ltd.
 
-OUI:00230E*
- ID_OUI_FROM_DATABASE=Gorba AG
+OUI:001AB8*
+ ID_OUI_FROM_DATABASE=Anseri Corporation
 
-OUI:002307*
- ID_OUI_FROM_DATABASE=FUTURE INNOVATION TECH CO.,LTD
+OUI:001ABD*
+ ID_OUI_FROM_DATABASE=Impatica Inc.
 
-OUI:002302*
- ID_OUI_FROM_DATABASE=Cobalt Digital, Inc.
+OUI:001AB1*
+ ID_OUI_FROM_DATABASE=Asia Pacific Satellite Industries Co., Ltd.
 
-OUI:0022EB*
- ID_OUI_FROM_DATABASE=Data Respons A/S
+OUI:001B8C*
+ ID_OUI_FROM_DATABASE=JMicron Technology Corp.
 
-OUI:0022EC*
- ID_OUI_FROM_DATABASE=IDEALBT TECHNOLOGY CORPORATION
+OUI:001B91*
+ ID_OUI_FROM_DATABASE=EFKON AG
 
-OUI:0022F1*
- ID_OUI_FROM_DATABASE=Private
+OUI:001B87*
+ ID_OUI_FROM_DATABASE=Deepsound Tech. Co., Ltd
 
-OUI:00239E*
- ID_OUI_FROM_DATABASE=Jiangsu Lemote Technology Corporation Limited
+OUI:001B82*
+ ID_OUI_FROM_DATABASE=Taiwan Semiconductor Co., Ltd.
 
-OUI:002398*
- ID_OUI_FROM_DATABASE=Vutlan sro
+OUI:001B7B*
+ ID_OUI_FROM_DATABASE=The Tintometer Ltd
 
-OUI:00238A*
- ID_OUI_FROM_DATABASE=Ciena Corporation
+OUI:001B74*
+ ID_OUI_FROM_DATABASE=MiraLink Corporation
 
-OUI:002384*
- ID_OUI_FROM_DATABASE=GGH Engineering s.r.l.
+OUI:001B6F*
+ ID_OUI_FROM_DATABASE=Teletrak Ltd
 
-OUI:002342*
- ID_OUI_FROM_DATABASE=Coffee Equipment Company
+OUI:001AFC*
+ ID_OUI_FROM_DATABASE=ModusLink Corporation
 
-OUI:002336*
- ID_OUI_FROM_DATABASE=METEL s.r.o.
+OUI:001AF2*
+ ID_OUI_FROM_DATABASE=Dynavisions Schweiz AG
 
-OUI:00233D*
- ID_OUI_FROM_DATABASE=Novero holding B.V.
+OUI:001AF7*
+ ID_OUI_FROM_DATABASE=dataschalt e+a GmbH
 
-OUI:002330*
- ID_OUI_FROM_DATABASE=DIZIPIA, INC.
+OUI:001AED*
+ ID_OUI_FROM_DATABASE=INCOTEC GmbH
 
-OUI:00232C*
- ID_OUI_FROM_DATABASE=Senticare
+OUI:001ADF*
+ ID_OUI_FROM_DATABASE=Interactivetv Pty Limited
 
-OUI:002320*
- ID_OUI_FROM_DATABASE=Nicira Networks
+OUI:001AE1*
+ ID_OUI_FROM_DATABASE=EDGE ACCESS INC
 
-OUI:00231D*
- ID_OUI_FROM_DATABASE=Deltacom Electronics Ltd
+OUI:001AE6*
+ ID_OUI_FROM_DATABASE=Atlanta Advanced Communications Holdings Limited
 
-OUI:00231E*
- ID_OUI_FROM_DATABASE=Cezzer Multimedia Technologies
+OUI:001AD3*
+ ID_OUI_FROM_DATABASE=Vamp Ltd.
 
-OUI:0022B8*
- ID_OUI_FROM_DATABASE=Norcott
+OUI:001ADA*
+ ID_OUI_FROM_DATABASE=Biz-2-Me Inc.
 
-OUI:0022B7*
- ID_OUI_FROM_DATABASE=GSS Grundig SAT-Systems GmbH
+OUI:001ACE*
+ ID_OUI_FROM_DATABASE=YUPITERU CORPORATION
 
-OUI:0022B2*
- ID_OUI_FROM_DATABASE=4RF Communications Ltd
+OUI:001BC8*
+ ID_OUI_FROM_DATABASE=MIURA CO.,LTD
 
-OUI:0022AB*
- ID_OUI_FROM_DATABASE=Shenzhen Turbosight Technology Ltd
+OUI:001BC1*
+ ID_OUI_FROM_DATABASE=HOLUX Technology, Inc.
 
-OUI:0022A6*
- ID_OUI_FROM_DATABASE=Sony Computer Entertainment America
+OUI:001BB7*
+ ID_OUI_FROM_DATABASE=Alta Heights Technology Corp.
 
-OUI:00229F*
- ID_OUI_FROM_DATABASE=Sensys Traffic AB
+OUI:001BAB*
+ ID_OUI_FROM_DATABASE=Telchemy, Incorporated
 
-OUI:0022E5*
- ID_OUI_FROM_DATABASE=Fisher-Rosemount Systems Inc.
+OUI:001BB0*
+ ID_OUI_FROM_DATABASE=BHARAT ELECTRONICS
 
-OUI:0022DE*
- ID_OUI_FROM_DATABASE=OPPO Digital, Inc.
+OUI:001BA4*
+ ID_OUI_FROM_DATABASE=S.A.E Afikim
 
-OUI:0022D9*
- ID_OUI_FROM_DATABASE=Fortex Industrial Ltd.
+OUI:001B9F*
+ ID_OUI_FROM_DATABASE=Calyptech Pty Ltd
 
-OUI:0022D2*
- ID_OUI_FROM_DATABASE=All Earth Comércio de Eletrônicos LTDA.
+OUI:001B9D*
+ ID_OUI_FROM_DATABASE=Novus Security Sp. z o.o.
 
-OUI:0022CC*
- ID_OUI_FROM_DATABASE=SciLog, Inc.
+OUI:001BF6*
+ ID_OUI_FROM_DATABASE=CONWISE Technology Corporation Ltd.
 
-OUI:0022C8*
- ID_OUI_FROM_DATABASE=Applied Instruments B.V.
+OUI:001BF1*
+ ID_OUI_FROM_DATABASE=Nanjing SilverNet Software Co., Ltd.
 
-OUI:0022BE*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001BEC*
+ ID_OUI_FROM_DATABASE=Netio Technologies Co., Ltd
 
-OUI:00228C*
- ID_OUI_FROM_DATABASE=Photon Europe GmbH
+OUI:001BE7*
+ ID_OUI_FROM_DATABASE=Postek Electronics Co., Ltd.
 
-OUI:002286*
- ID_OUI_FROM_DATABASE=ASTRON
+OUI:001BE0*
+ ID_OUI_FROM_DATABASE=TELENOT ELECTRONIC GmbH
 
-OUI:002285*
- ID_OUI_FROM_DATABASE=NOMUS COMM SYSTEMS
+OUI:001BD9*
+ ID_OUI_FROM_DATABASE=Edgewater Computer Systems
 
-OUI:002280*
- ID_OUI_FROM_DATABASE=A2B Electronics AB
+OUI:001BDB*
+ ID_OUI_FROM_DATABASE=Valeo VECS
 
-OUI:002276*
- ID_OUI_FROM_DATABASE=Triple EYE B.V.
+OUI:001BD4*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00227B*
- ID_OUI_FROM_DATABASE=Apogee Labs, Inc.
+OUI:001BCD*
+ ID_OUI_FROM_DATABASE=DAVISCOMMS (S) PTE LTD
 
-OUI:002262*
- ID_OUI_FROM_DATABASE=BEP Marine
+OUI:001C2D*
+ ID_OUI_FROM_DATABASE=FlexRadio Systems
 
-OUI:00226C*
- ID_OUI_FROM_DATABASE=LinkSprite Technologies, Inc.
+OUI:001C1C*
+ ID_OUI_FROM_DATABASE=Center Communication Systems GmbH
 
-OUI:00225E*
- ID_OUI_FROM_DATABASE=Uwin Technologies Co.,LTD
+OUI:001C21*
+ ID_OUI_FROM_DATABASE=Nucsafe Inc.
 
-OUI:002258*
- ID_OUI_FROM_DATABASE=Taiyo Yuden Co., Ltd.
+OUI:001C20*
+ ID_OUI_FROM_DATABASE=CLB Benelux
 
-OUI:0023C3*
- ID_OUI_FROM_DATABASE=LogMeIn, Inc.
+OUI:001C15*
+ ID_OUI_FROM_DATABASE=iPhotonix LLC
 
-OUI:0023BD*
- ID_OUI_FROM_DATABASE=Digital Ally, Inc.
+OUI:001C16*
+ ID_OUI_FROM_DATABASE=ThyssenKrupp Elevator
 
-OUI:0023B7*
- ID_OUI_FROM_DATABASE=Q-Light Co., Ltd.
+OUI:001C10*
+ ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
-OUI:0023B1*
- ID_OUI_FROM_DATABASE=Longcheer Technology (Singapore) Pte Ltd
+OUI:001C09*
+ ID_OUI_FROM_DATABASE=SAE Electronic Co.,Ltd.
 
-OUI:0023B0*
- ID_OUI_FROM_DATABASE=COMXION Technology Inc.
+OUI:001C04*
+ ID_OUI_FROM_DATABASE=Airgain, Inc.
 
-OUI:0023AB*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001BFD*
+ ID_OUI_FROM_DATABASE=Dignsys Inc.
 
-OUI:0023A4*
- ID_OUI_FROM_DATABASE=New Concepts Development Corp.
+OUI:00192B*
+ ID_OUI_FROM_DATABASE=Aclara RF Systems Inc.
 
-OUI:001FC0*
- ID_OUI_FROM_DATABASE=Control Express Finland Oy
+OUI:001930*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001FBB*
- ID_OUI_FROM_DATABASE=Xenatech Co.,LTD
+OUI:00191F*
+ ID_OUI_FROM_DATABASE=Microlink communications Inc.
 
-OUI:001FB4*
- ID_OUI_FROM_DATABASE=SmartShare Systems
+OUI:001924*
+ ID_OUI_FROM_DATABASE=LBNL  Engineering
 
-OUI:001FAD*
- ID_OUI_FROM_DATABASE=Brown Innovations, Inc
+OUI:001911*
+ ID_OUI_FROM_DATABASE=Just In Mobile Information Technologies (Shanghai) Co., Ltd.
 
-OUI:001FAF*
- ID_OUI_FROM_DATABASE=NextIO, Inc.
+OUI:001918*
+ ID_OUI_FROM_DATABASE=Interactive Wear AG
 
-OUI:001FAE*
- ID_OUI_FROM_DATABASE=Blick South Africa (Pty) Ltd
+OUI:00190C*
+ ID_OUI_FROM_DATABASE=Encore Electronics, Inc.
 
-OUI:001FA8*
- ID_OUI_FROM_DATABASE=Smart Energy Instruments Inc.
+OUI:001900*
+ ID_OUI_FROM_DATABASE=Intelliverese - DBA Voicecom
 
-OUI:001FA3*
- ID_OUI_FROM_DATABASE=T&W Electronics(Shenzhen)Co.,Ltd.
+OUI:001905*
+ ID_OUI_FROM_DATABASE=SCHRACK Seconet AG
 
-OUI:002142*
- ID_OUI_FROM_DATABASE=Advanced Control Systems doo
+OUI:0018F4*
+ ID_OUI_FROM_DATABASE=EO TECHNICS Co., Ltd.
 
-OUI:002140*
- ID_OUI_FROM_DATABASE=EN Technologies Inc.
+OUI:0018F6*
+ ID_OUI_FROM_DATABASE=Thomson Telecom Belgium
 
-OUI:002138*
- ID_OUI_FROM_DATABASE=Cepheid
+OUI:0018FB*
+ ID_OUI_FROM_DATABASE=Compro Technology
 
-OUI:00212E*
- ID_OUI_FROM_DATABASE=dresden-elektronik
+OUI:0019EE*
+ ID_OUI_FROM_DATABASE=CARLO GAVAZZI CONTROLS SPA-Controls Division
 
-OUI:002128*
- ID_OUI_FROM_DATABASE=Oracle Corporation
+OUI:0019F5*
+ ID_OUI_FROM_DATABASE=Imagination Technologies Ltd
 
-OUI:002122*
- ID_OUI_FROM_DATABASE=Chip-pro Ltd.
+OUI:0019E9*
+ ID_OUI_FROM_DATABASE=S-Information Technolgy, Co., Ltd.
 
-OUI:00211B*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0019DB*
+ ID_OUI_FROM_DATABASE=MICRO-STAR INTERNATIONAL CO., LTD.
 
-OUI:002115*
- ID_OUI_FROM_DATABASE=PHYWE Systeme GmbH & Co. KG
+OUI:0019DD*
+ ID_OUI_FROM_DATABASE=FEI-Zyfer, Inc.
 
-OUI:002116*
- ID_OUI_FROM_DATABASE=Transcon Electronic Systems, spol. s r. o.
+OUI:0019CA*
+ ID_OUI_FROM_DATABASE=Broadata Communications, Inc
 
-OUI:00210F*
- ID_OUI_FROM_DATABASE=Cernium Corp
+OUI:0019CF*
+ ID_OUI_FROM_DATABASE=SALICRU, S.A.
 
-OUI:00210B*
- ID_OUI_FROM_DATABASE=GEMINI TRAZE RFID PVT. LTD.
+OUI:0019D6*
+ ID_OUI_FROM_DATABASE=LS Cable and System Ltd.
 
-OUI:00210C*
- ID_OUI_FROM_DATABASE=Cymtec Systems, Inc.
+OUI:0019B4*
+ ID_OUI_FROM_DATABASE=Intellio Ltd
 
-OUI:001FFC*
- ID_OUI_FROM_DATABASE=Riccius+Sohn GmbH
+OUI:001A6E*
+ ID_OUI_FROM_DATABASE=Impro Technologies
 
-OUI:001FF7*
- ID_OUI_FROM_DATABASE=Nakajima All Precision Co., Ltd.
+OUI:001A67*
+ ID_OUI_FROM_DATABASE=Infinite QL Sdn Bhd
 
-OUI:00216E*
- ID_OUI_FROM_DATABASE=Function ATI (Huizhou) Telecommunications Co., Ltd.
+OUI:001A69*
+ ID_OUI_FROM_DATABASE=Wuhan Yangtze Optical Technology CO.,Ltd.
 
-OUI:002168*
- ID_OUI_FROM_DATABASE=iVeia, LLC
+OUI:001A62*
+ ID_OUI_FROM_DATABASE=Data Robotics, Incorporated
 
-OUI:002161*
- ID_OUI_FROM_DATABASE=Yournet Inc.
+OUI:001A58*
+ ID_OUI_FROM_DATABASE=CCV Deutschland GmbH - Celectronic eHealth Div.
 
-OUI:002155*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001A5D*
+ ID_OUI_FROM_DATABASE=Mobinnova Corp.
 
-OUI:00214E*
- ID_OUI_FROM_DATABASE=GS Yuasa Power Supply Ltd.
+OUI:001A4C*
+ ID_OUI_FROM_DATABASE=Crossbow Technology, Inc
 
-OUI:002149*
- ID_OUI_FROM_DATABASE=China Daheng Group ,Inc.
+OUI:001A51*
+ ID_OUI_FROM_DATABASE=Alfred Mann Foundation
 
-OUI:001FF0*
- ID_OUI_FROM_DATABASE=Audio Partnership
+OUI:001AAA*
+ ID_OUI_FROM_DATABASE=Analogic Corp.
 
-OUI:001FE9*
- ID_OUI_FROM_DATABASE=Printrex, Inc.
+OUI:001AA1*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001FEB*
- ID_OUI_FROM_DATABASE=Trio Datacom Pty Ltd
+OUI:001A9C*
+ ID_OUI_FROM_DATABASE=RightHand Technologies, Inc.
 
-OUI:001FEA*
- ID_OUI_FROM_DATABASE=Applied Media Technologies Corporation
+OUI:001A8B*
+ ID_OUI_FROM_DATABASE=CHUNIL ELECTRIC IND., CO.
 
-OUI:001FDD*
- ID_OUI_FROM_DATABASE=GDI LLC
+OUI:001A95*
+ ID_OUI_FROM_DATABASE=Hisense Mobile Communications Technoligy Co.,Ltd.
 
-OUI:001FD8*
- ID_OUI_FROM_DATABASE=A-TRUST COMPUTER CORPORATION
+OUI:001A84*
+ ID_OUI_FROM_DATABASE=V One Multimedia Pte Ltd
 
-OUI:001FD3*
- ID_OUI_FROM_DATABASE=RIVA Networks Inc.
+OUI:0019A1*
+ ID_OUI_FROM_DATABASE=LG INFORMATION & COMM.
 
-OUI:001FCE*
- ID_OUI_FROM_DATABASE=QTECH LLC
+OUI:0019AD*
+ ID_OUI_FROM_DATABASE=BOBST SA
 
-OUI:00219D*
- ID_OUI_FROM_DATABASE=Adesys BV
+OUI:0019B2*
+ ID_OUI_FROM_DATABASE=XYnetsoft Co.,Ltd
 
-OUI:0021A1*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00199A*
+ ID_OUI_FROM_DATABASE=EDO-EVI
 
-OUI:002198*
- ID_OUI_FROM_DATABASE=Thai Radio Co, LTD
+OUI:00199F*
+ ID_OUI_FROM_DATABASE=DKT A/S
 
-OUI:002193*
- ID_OUI_FROM_DATABASE=Videofon MV
+OUI:001995*
+ ID_OUI_FROM_DATABASE=Jurong Hi-Tech (Suzhou)Co.ltd
 
-OUI:00218D*
- ID_OUI_FROM_DATABASE=AP Router Ind. Eletronica LTDA
+OUI:001990*
+ ID_OUI_FROM_DATABASE=ELM DATA Co., Ltd.
 
-OUI:00218E*
- ID_OUI_FROM_DATABASE=MEKICS CO., LTD.
+OUI:001989*
+ ID_OUI_FROM_DATABASE=Sonitrol Corporation
 
-OUI:002187*
- ID_OUI_FROM_DATABASE=Imacs GmbH
+OUI:001A3E*
+ ID_OUI_FROM_DATABASE=Faster Technology LLC
 
-OUI:002181*
- ID_OUI_FROM_DATABASE=Si2 Microsystems Limited
+OUI:001A40*
+ ID_OUI_FROM_DATABASE=A-FOUR TECH CO., LTD.
 
-OUI:00217B*
- ID_OUI_FROM_DATABASE=Bastec AB
+OUI:001A2D*
+ ID_OUI_FROM_DATABASE=The Navvo Group
 
-OUI:002174*
- ID_OUI_FROM_DATABASE=AvaLAN Wireless
+OUI:001A32*
+ ID_OUI_FROM_DATABASE=ACTIVA MULTIMEDIA
 
-OUI:0021F8*
- ID_OUI_FROM_DATABASE=Enseo, Inc.
+OUI:001A28*
+ ID_OUI_FROM_DATABASE=ASWT Co., LTD. Taiwan Branch H.K.
 
-OUI:0021F3*
- ID_OUI_FROM_DATABASE=Si14 SpA
+OUI:001A1C*
+ ID_OUI_FROM_DATABASE=GT&T Engineering Pte Ltd
 
-OUI:0021EC*
- ID_OUI_FROM_DATABASE=Solutronic GmbH
+OUI:001A23*
+ ID_OUI_FROM_DATABASE=Ice Qube, Inc
 
-OUI:0021E6*
- ID_OUI_FROM_DATABASE=Starlight Video Limited
+OUI:001A15*
+ ID_OUI_FROM_DATABASE=gemalto e-Payment
 
-OUI:0021E0*
- ID_OUI_FROM_DATABASE=CommAgility Ltd
+OUI:001A10*
+ ID_OUI_FROM_DATABASE=LUCENT TRANS ELECTRONICS CO.,LTD
 
-OUI:0021D3*
- ID_OUI_FROM_DATABASE=BOCOM SECURITY(ASIA PACIFIC) LIMITED
+OUI:001A09*
+ ID_OUI_FROM_DATABASE=Wayfarer Transit Systems Ltd
 
-OUI:0021D4*
- ID_OUI_FROM_DATABASE=Vollmer Werke GmbH
+OUI:001A02*
+ ID_OUI_FROM_DATABASE=SECURE CARE PRODUCTS, INC
 
-OUI:0021D9*
- ID_OUI_FROM_DATABASE=SEKONIC CORPORATION
+OUI:001A04*
+ ID_OUI_FROM_DATABASE=Interay Solutions BV
 
-OUI:0021CD*
- ID_OUI_FROM_DATABASE=LiveTV
+OUI:001984*
+ ID_OUI_FROM_DATABASE=ESTIC Corporation
 
-OUI:0021C7*
- ID_OUI_FROM_DATABASE=Russound
+OUI:001976*
+ ID_OUI_FROM_DATABASE=Xipher Technologies, LLC
 
-OUI:0021C6*
- ID_OUI_FROM_DATABASE=CSJ Global, Inc.
+OUI:001978*
+ ID_OUI_FROM_DATABASE=Datum Systems, Inc.
 
-OUI:0021C1*
- ID_OUI_FROM_DATABASE=ABB Oy / Medium Voltage Products
+OUI:00196A*
+ ID_OUI_FROM_DATABASE=MikroM GmbH
 
-OUI:0021B4*
- ID_OUI_FROM_DATABASE=APRO MEDIA CO., LTD
+OUI:001971*
+ ID_OUI_FROM_DATABASE=Guangzhou Unicomp Technology Co.,Ltd
 
-OUI:0021AE*
- ID_OUI_FROM_DATABASE=ALCATEL-LUCENT FRANCE - WTD
+OUI:001965*
+ ID_OUI_FROM_DATABASE=YuHua TelTech (ShangHai) Co., Ltd.
 
-OUI:0021A2*
- ID_OUI_FROM_DATABASE=EKE-Electronics Ltd.
+OUI:001960*
+ ID_OUI_FROM_DATABASE=DoCoMo Systems, Inc.
 
-OUI:0021A7*
- ID_OUI_FROM_DATABASE=Hantle System Co., Ltd.
+OUI:001954*
+ ID_OUI_FROM_DATABASE=Leaf Corporation.
 
-OUI:00221F*
- ID_OUI_FROM_DATABASE=eSang Technologies Co., Ltd.
+OUI:001959*
+ ID_OUI_FROM_DATABASE=Staccato Communications Inc.
 
-OUI:002226*
- ID_OUI_FROM_DATABASE=Avaak, Inc.
+OUI:00194D*
+ ID_OUI_FROM_DATABASE=Avago Technologies Sdn Bhd
 
-OUI:00221A*
- ID_OUI_FROM_DATABASE=Audio Precision
+OUI:001948*
+ ID_OUI_FROM_DATABASE=AireSpider Networks
 
-OUI:002213*
- ID_OUI_FROM_DATABASE=PCI CORPORATION
+OUI:001941*
+ ID_OUI_FROM_DATABASE=Pitney Bowes, Inc
 
-OUI:00220D*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001935*
+ ID_OUI_FROM_DATABASE=DUERR DENTAL AG
 
-OUI:00220C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00193A*
+ ID_OUI_FROM_DATABASE=OESOLUTIONS
 
-OUI:002207*
- ID_OUI_FROM_DATABASE=Inteno Broadband Technology AB
+OUI:00193C*
+ ID_OUI_FROM_DATABASE=HighPoint Technologies Incorporated
 
-OUI:002202*
- ID_OUI_FROM_DATABASE=Excito Elektronik i Skåne AB
+OUI:001773*
+ ID_OUI_FROM_DATABASE=Laketune Technologies Co. Ltd
 
-OUI:0021F9*
- ID_OUI_FROM_DATABASE=WIRECOM Technologies
+OUI:001778*
+ ID_OUI_FROM_DATABASE=Central Music Co.
 
-OUI:001F40*
- ID_OUI_FROM_DATABASE=Speakercraft Inc.
+OUI:00177A*
+ ID_OUI_FROM_DATABASE=ASSA ABLOY AB
 
-OUI:001F38*
- ID_OUI_FROM_DATABASE=POSITRON
+OUI:00176F*
+ ID_OUI_FROM_DATABASE=PAX Computer Technology(Shenzhen) Ltd.
 
-OUI:001F3D*
- ID_OUI_FROM_DATABASE=Qbit GmbH
+OUI:00176A*
+ ID_OUI_FROM_DATABASE=Avago Technologies
 
-OUI:001F37*
- ID_OUI_FROM_DATABASE=Genesis I&C
+OUI:001763*
+ ID_OUI_FROM_DATABASE=Essentia S.p.A.
 
-OUI:001F2A*
- ID_OUI_FROM_DATABASE=ACCM
+OUI:00175E*
+ ID_OUI_FROM_DATABASE=Zed-3
 
-OUI:001F31*
- ID_OUI_FROM_DATABASE=Radiocomp
+OUI:001750*
+ ID_OUI_FROM_DATABASE=GSI Group, MicroE Systems
 
-OUI:001F25*
- ID_OUI_FROM_DATABASE=MBS GmbH
+OUI:001752*
+ ID_OUI_FROM_DATABASE=DAGS, Inc
 
-OUI:001F1E*
- ID_OUI_FROM_DATABASE=Astec Technology Co., Ltd
+OUI:001757*
+ ID_OUI_FROM_DATABASE=RIX TECHNOLOGY LIMITED
 
-OUI:001F17*
- ID_OUI_FROM_DATABASE=IDX Company, Ltd.
+OUI:00183D*
+ ID_OUI_FROM_DATABASE=Vertex Link Corporation
 
-OUI:001F18*
- ID_OUI_FROM_DATABASE=Hakusan.Mfg.Co,.Ltd
+OUI:001844*
+ ID_OUI_FROM_DATABASE=Heads Up Technologies, Inc.
 
-OUI:001E61*
- ID_OUI_FROM_DATABASE=ITEC GmbH
+OUI:001838*
+ ID_OUI_FROM_DATABASE=PanAccess Communications,Inc.
 
-OUI:001E5C*
- ID_OUI_FROM_DATABASE=RB GeneralEkonomik
+OUI:001827*
+ ID_OUI_FROM_DATABASE=NEC UNIFIED SOLUTIONS NEDERLAND B.V.
 
-OUI:001E5B*
- ID_OUI_FROM_DATABASE=Unitron Company, Inc.
+OUI:00182C*
+ ID_OUI_FROM_DATABASE=Ascend Networks, Inc.
 
-OUI:001E55*
- ID_OUI_FROM_DATABASE=COWON SYSTEMS,Inc.
+OUI:00181B*
+ ID_OUI_FROM_DATABASE=TaiJin Metal Co., Ltd.
 
-OUI:001E4E*
- ID_OUI_FROM_DATABASE=DAKO EDV-Ingenieur- und Systemhaus GmbH
+OUI:001814*
+ ID_OUI_FROM_DATABASE=Mitutoyo Corporation
 
-OUI:001E49*
+OUI:001819*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001E44*
- ID_OUI_FROM_DATABASE=SANTEC
+OUI:001820*
+ ID_OUI_FROM_DATABASE=w5networks
 
-OUI:001E3F*
- ID_OUI_FROM_DATABASE=TrellisWare Technologies, Inc.
+OUI:001808*
+ ID_OUI_FROM_DATABASE=SightLogix, Inc.
 
-OUI:001E38*
- ID_OUI_FROM_DATABASE=Bluecard Software Technology Co., Ltd.
+OUI:00180D*
+ ID_OUI_FROM_DATABASE=Terabytes Server Storage Tech Corp
 
-OUI:001E31*
- ID_OUI_FROM_DATABASE=INFOMARK CO.,LTD.
+OUI:001803*
+ ID_OUI_FROM_DATABASE=ArcSoft Shanghai Co. LTD
 
-OUI:001E32*
- ID_OUI_FROM_DATABASE=Zensys
+OUI:0017F0*
+ ID_OUI_FROM_DATABASE=SZCOM Broadband Network Technology Co.,Ltd
 
-OUI:001E2C*
- ID_OUI_FROM_DATABASE=CyVerse Corporation
+OUI:0017F7*
+ ID_OUI_FROM_DATABASE=CEM Solutions Pvt Ltd
 
-OUI:001E20*
- ID_OUI_FROM_DATABASE=Intertain Inc.
+OUI:0017FE*
+ ID_OUI_FROM_DATABASE=TALOS SYSTEM INC.
 
-OUI:001E19*
- ID_OUI_FROM_DATABASE=GTRI
+OUI:0017D8*
+ ID_OUI_FROM_DATABASE=Magnum Semiconductor, Inc.
 
-OUI:001E0F*
- ID_OUI_FROM_DATABASE=Briot International
+OUI:0017DD*
+ ID_OUI_FROM_DATABASE=Clipsal Australia
 
-OUI:001EE4*
- ID_OUI_FROM_DATABASE=ACS Solutions France
+OUI:0017DF*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001EEB*
- ID_OUI_FROM_DATABASE=Talk-A-Phone Co.
+OUI:0018C6*
+ ID_OUI_FROM_DATABASE=OPW Fuel Management Systems
 
-OUI:001EDF*
- ID_OUI_FROM_DATABASE=Master Industrialization Center Kista
+OUI:0018CB*
+ ID_OUI_FROM_DATABASE=Tecobest Technology Limited
 
-OUI:001EDA*
- ID_OUI_FROM_DATABASE=Wesemann Elektrotechniek B.V.
+OUI:0018BF*
+ ID_OUI_FROM_DATABASE=Essence Technology Solution, Inc.
 
-OUI:001ED5*
- ID_OUI_FROM_DATABASE=Tekon-Automatics
+OUI:0018BA*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001ECE*
- ID_OUI_FROM_DATABASE=BISA Technologies (Hong Kong) Limited
+OUI:0018B8*
+ ID_OUI_FROM_DATABASE=New Voice International AG
 
-OUI:001EC8*
- ID_OUI_FROM_DATABASE=Rapid Mobile (Pty) Ltd
+OUI:0018B3*
+ ID_OUI_FROM_DATABASE=TEC WizHome Co., Ltd.
 
-OUI:001EBB*
- ID_OUI_FROM_DATABASE=BLUELIGHT TECHNOLOGY INC.
+OUI:0018AC*
+ ID_OUI_FROM_DATABASE=Shanghai Jiao Da HISYS Technology Co. Ltd.
 
-OUI:001EB6*
- ID_OUI_FROM_DATABASE=TAG Heuer SA
+OUI:0018A5*
+ ID_OUI_FROM_DATABASE=ADigit Technologies Corp.
 
-OUI:001EB5*
- ID_OUI_FROM_DATABASE=Ever Sparkle Technologies Ltd
+OUI:0018A7*
+ ID_OUI_FROM_DATABASE=Yoggie Security Systems LTD.
 
-OUI:001EAF*
- ID_OUI_FROM_DATABASE=Ophir Optronics Ltd
+OUI:001896*
+ ID_OUI_FROM_DATABASE=Great Well Electronic LTD
 
-OUI:001EAA*
- ID_OUI_FROM_DATABASE=E-Senza Technologies GmbH
+OUI:00189B*
+ ID_OUI_FROM_DATABASE=Thomson Inc.
 
-OUI:001E9D*
- ID_OUI_FROM_DATABASE=Recall Technologies, Inc.
+OUI:00179E*
+ ID_OUI_FROM_DATABASE=Sirit Inc
 
-OUI:001E98*
- ID_OUI_FROM_DATABASE=GreenLine Communications
+OUI:0017A3*
+ ID_OUI_FROM_DATABASE=MIX s.r.l.
 
-OUI:001E97*
- ID_OUI_FROM_DATABASE=Medium Link System Technology CO., LTD,
+OUI:0017A8*
+ ID_OUI_FROM_DATABASE=EDM Corporation
 
-OUI:001E91*
- ID_OUI_FROM_DATABASE=KIMIN Electronic Co., Ltd.
+OUI:001792*
+ ID_OUI_FROM_DATABASE=Falcom Wireless Comunications Gmbh
 
-OUI:001E8A*
- ID_OUI_FROM_DATABASE=eCopy, Inc
+OUI:001797*
+ ID_OUI_FROM_DATABASE=Telsy Elettronica S.p.A.
 
-OUI:001E85*
- ID_OUI_FROM_DATABASE=Lagotek Corporation
+OUI:001799*
+ ID_OUI_FROM_DATABASE=SmarTire Systems Inc.
 
-OUI:001E78*
- ID_OUI_FROM_DATABASE=Owitek Technology Ltd.,
+OUI:00178B*
+ ID_OUI_FROM_DATABASE=Teledyne Technologies Incorporated
 
-OUI:001E6D*
- ID_OUI_FROM_DATABASE=IT R&D Center
+OUI:00177F*
+ ID_OUI_FROM_DATABASE=Worldsmart Retech
 
-OUI:001E6E*
- ID_OUI_FROM_DATABASE=Shenzhen First Mile Communications Ltd
+OUI:001786*
+ ID_OUI_FROM_DATABASE=wisembed
 
-OUI:001F71*
- ID_OUI_FROM_DATABASE=xG Technology, Inc.
+OUI:001877*
+ ID_OUI_FROM_DATABASE=Amplex A/S
 
-OUI:001F72*
- ID_OUI_FROM_DATABASE=QingDao Hiphone Technology Co,.Ltd
+OUI:00186B*
+ ID_OUI_FROM_DATABASE=Sambu Communics CO., LTD.
 
-OUI:001F76*
- ID_OUI_FROM_DATABASE=AirLogic Systems Inc.
+OUI:001870*
+ ID_OUI_FROM_DATABASE=E28 Shanghai Limited
 
-OUI:001F6C*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001863*
+ ID_OUI_FROM_DATABASE=Veritech Electronics Limited
 
-OUI:001F60*
- ID_OUI_FROM_DATABASE=COMPASS SYSTEMS CORP.
+OUI:001850*
+ ID_OUI_FROM_DATABASE=Secfone Kft
 
-OUI:001F65*
- ID_OUI_FROM_DATABASE=KOREA ELECTRIC TERMINAL CO., LTD.
+OUI:001855*
+ ID_OUI_FROM_DATABASE=Aeromaritime Systembau GmbH
 
-OUI:001F5F*
- ID_OUI_FROM_DATABASE=Blatand GmbH
+OUI:001857*
+ ID_OUI_FROM_DATABASE=Unilever R&D
 
-OUI:001F59*
- ID_OUI_FROM_DATABASE=Kronback Tracers
+OUI:001849*
+ ID_OUI_FROM_DATABASE=Pigeon Point Systems LLC
 
-OUI:001F4D*
- ID_OUI_FROM_DATABASE=Segnetics LLC
+OUI:0017C7*
+ ID_OUI_FROM_DATABASE=MARA Systems Consulting AB
 
-OUI:001F52*
- ID_OUI_FROM_DATABASE=UVT Unternehmensberatung fur Verkehr und Technik GmbH
+OUI:0017CE*
+ ID_OUI_FROM_DATABASE=Screen Service Spa
 
-OUI:001F03*
- ID_OUI_FROM_DATABASE=NUM AG
+OUI:0017D3*
+ ID_OUI_FROM_DATABASE=Etymotic Research, Inc.
 
-OUI:001EFE*
- ID_OUI_FROM_DATABASE=LEVEL s.r.o.
+OUI:0017BB*
+ ID_OUI_FROM_DATABASE=Syrinx Industrial Electronics
 
-OUI:001F04*
- ID_OUI_FROM_DATABASE=Granch Ltd.
+OUI:0017B4*
+ ID_OUI_FROM_DATABASE=Remote Security Systems, LLC
 
-OUI:001EF2*
- ID_OUI_FROM_DATABASE=Micro Motion Inc
+OUI:0017B6*
+ ID_OUI_FROM_DATABASE=Aquantia
 
-OUI:001EF7*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0017AF*
+ ID_OUI_FROM_DATABASE=Enermet
 
-OUI:001EF1*
- ID_OUI_FROM_DATABASE=Servimat
+OUI:0018E8*
+ ID_OUI_FROM_DATABASE=Hacetron Corporation
 
-OUI:001F9E*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0018EF*
+ ID_OUI_FROM_DATABASE=Escape Communications, Inc.
 
-OUI:001F92*
- ID_OUI_FROM_DATABASE=VideoIQ, Inc.
+OUI:0018E3*
+ ID_OUI_FROM_DATABASE=Visualgate Systems, Inc.
 
-OUI:001F97*
- ID_OUI_FROM_DATABASE=BERTANA srl
+OUI:0018DC*
+ ID_OUI_FROM_DATABASE=Prostar Co., Ltd.
 
-OUI:001F8B*
- ID_OUI_FROM_DATABASE=Cache IQ
+OUI:0018E1*
+ ID_OUI_FROM_DATABASE=Verkerk Service Systemen
 
-OUI:001F84*
- ID_OUI_FROM_DATABASE=Gigle Semiconductor
+OUI:0018D0*
+ ID_OUI_FROM_DATABASE=AtRoad,  A Trimble Company
 
-OUI:001F7F*
- ID_OUI_FROM_DATABASE=Phabrix Limited
+OUI:0018D5*
+ ID_OUI_FROM_DATABASE=REIGNCOM
 
-OUI:001CFF*
- ID_OUI_FROM_DATABASE=Napera Networks Inc
+OUI:0018A0*
+ ID_OUI_FROM_DATABASE=Cierma Ascenseurs
 
-OUI:001CF8*
- ID_OUI_FROM_DATABASE=Parade Technologies, Ltd.
+OUI:001883*
+ ID_OUI_FROM_DATABASE=FORMOSA21 INC.
 
-OUI:001CF1*
- ID_OUI_FROM_DATABASE=SUPoX Technology Co. , LTD.
+OUI:00188A*
+ ID_OUI_FROM_DATABASE=Infinova LLC
 
-OUI:001CF2*
- ID_OUI_FROM_DATABASE=Tenlon Technology Co.,Ltd.
+OUI:00188F*
+ ID_OUI_FROM_DATABASE=Montgomery Technology, Inc.
 
-OUI:001CEC*
- ID_OUI_FROM_DATABASE=Mobilesoft (Aust.) Pty Ltd
+OUI:00187C*
+ ID_OUI_FROM_DATABASE=INTERCROSS, LLC
 
-OUI:001CE7*
- ID_OUI_FROM_DATABASE=Rocon PLC Research Centre
+OUI:00187E*
+ ID_OUI_FROM_DATABASE=RGB Spectrum
 
-OUI:001CE2*
- ID_OUI_FROM_DATABASE=Attero Tech, LLC.
+OUI:00164A*
+ ID_OUI_FROM_DATABASE=Vibration Technology Limited
 
-OUI:001CDB*
- ID_OUI_FROM_DATABASE=CARPOINT CO.,LTD
+OUI:001644*
+ ID_OUI_FROM_DATABASE=LITE-ON Technology Corp.
 
-OUI:001CD5*
- ID_OUI_FROM_DATABASE=ZeeVee, Inc.
+OUI:001645*
+ ID_OUI_FROM_DATABASE=Power Distribution, Inc.
 
-OUI:001CCF*
- ID_OUI_FROM_DATABASE=LIMETEK
+OUI:00163B*
+ ID_OUI_FROM_DATABASE=VertexRSI/General Dynamics
 
-OUI:001E08*
- ID_OUI_FROM_DATABASE=Centec Networks Inc
+OUI:001640*
+ ID_OUI_FROM_DATABASE=Asmobile Communication Inc.
 
-OUI:001E03*
- ID_OUI_FROM_DATABASE=LiComm Co., Ltd.
+OUI:00163A*
+ ID_OUI_FROM_DATABASE=YVES TECHNOLOGY CO., LTD.
 
-OUI:001DFC*
- ID_OUI_FROM_DATABASE=KSIC
+OUI:001634*
+ ID_OUI_FROM_DATABASE=Mathtech, Inc.
 
-OUI:001DF5*
- ID_OUI_FROM_DATABASE=Sunshine Co,LTD
+OUI:00162D*
+ ID_OUI_FROM_DATABASE=STNet Co., Ltd.
 
-OUI:001DF0*
- ID_OUI_FROM_DATABASE=Vidient Systems, Inc.
+OUI:001621*
+ ID_OUI_FROM_DATABASE=Colorado Vnet
 
-OUI:001DDC*
- ID_OUI_FROM_DATABASE=HangZhou DeChangLong Tech&Info Co.,Ltd
+OUI:00161A*
+ ID_OUI_FROM_DATABASE=Dametric AB
 
-OUI:001DE4*
- ID_OUI_FROM_DATABASE=Visioneered Image Systems
+OUI:001615*
+ ID_OUI_FROM_DATABASE=Nittan Company, Limited
 
-OUI:001DE2*
- ID_OUI_FROM_DATABASE=Radionor Communications
+OUI:0016C4*
+ ID_OUI_FROM_DATABASE=SiRF Technology, Inc.
 
-OUI:001CC8*
- ID_OUI_FROM_DATABASE=INDUSTRONIC Industrie-Electronic GmbH & Co. KG
+OUI:0016C6*
+ ID_OUI_FROM_DATABASE=North Atlantic Industries
 
-OUI:001CBC*
- ID_OUI_FROM_DATABASE=CastGrabber, LLC
+OUI:0016D2*
+ ID_OUI_FROM_DATABASE=Caspian
 
-OUI:001CB2*
- ID_OUI_FROM_DATABASE=BPT SPA
+OUI:0016BF*
+ ID_OUI_FROM_DATABASE=PaloDEx Group Oy
 
-OUI:001CA6*
- ID_OUI_FROM_DATABASE=Win4NET
+OUI:0016B3*
+ ID_OUI_FROM_DATABASE=Photonicbridges (China) Co., Ltd.
 
-OUI:001CAB*
- ID_OUI_FROM_DATABASE=Meyer Sound Laboratories, Inc.
+OUI:0016AC*
+ ID_OUI_FROM_DATABASE=Toho Technology Corp.
 
-OUI:001CAC*
- ID_OUI_FROM_DATABASE=Qniq Technology Corp.
+OUI:0016B1*
+ ID_OUI_FROM_DATABASE=KBS
 
-OUI:001CA1*
- ID_OUI_FROM_DATABASE=AKAMAI TECHNOLOGIES, INC.
+OUI:0016A7*
+ ID_OUI_FROM_DATABASE=AWETA G&P
 
-OUI:001C95*
- ID_OUI_FROM_DATABASE=Opticomm Corporation
+OUI:001724*
+ ID_OUI_FROM_DATABASE=Studer Professional Audio GmbH
 
-OUI:001C90*
- ID_OUI_FROM_DATABASE=Empacket Corporation
+OUI:001718*
+ ID_OUI_FROM_DATABASE=Vansco Electronics Oy
 
-OUI:001C8F*
- ID_OUI_FROM_DATABASE=Advanced Electronic Design, Inc.
+OUI:00171D*
+ ID_OUI_FROM_DATABASE=DIGIT
 
-OUI:001C89*
- ID_OUI_FROM_DATABASE=Force Communications, Inc.
+OUI:001711*
+ ID_OUI_FROM_DATABASE=GE Healthcare Bio-Sciences AB
 
-OUI:001C7F*
- ID_OUI_FROM_DATABASE=Check Point Software Technologies
+OUI:00170C*
+ ID_OUI_FROM_DATABASE=Twig Com Ltd.
 
-OUI:001C75*
- ID_OUI_FROM_DATABASE=Segnet Ltd.
+OUI:001707*
+ ID_OUI_FROM_DATABASE=InGrid, Inc
 
-OUI:001C6E*
- ID_OUI_FROM_DATABASE=Newbury Networks, Inc.
+OUI:001702*
+ ID_OUI_FROM_DATABASE=Osung Midicom Co., Ltd
 
-OUI:001C69*
- ID_OUI_FROM_DATABASE=Packet Vision Ltd
+OUI:001744*
+ ID_OUI_FROM_DATABASE=Araneo Ltd.
 
-OUI:001DA5*
- ID_OUI_FROM_DATABASE=WB Electronics
+OUI:00173C*
+ ID_OUI_FROM_DATABASE=Extreme Engineering Solutions
 
-OUI:001DA6*
- ID_OUI_FROM_DATABASE=Media Numerics Limited
+OUI:001737*
+ ID_OUI_FROM_DATABASE=Industrie Dial Face S.p.A.
 
-OUI:001DA0*
- ID_OUI_FROM_DATABASE=Heng Yu Electronic Manufacturing Company Limited
+OUI:00172B*
+ ID_OUI_FROM_DATABASE=Global Technologies Inc.
 
-OUI:001D99*
- ID_OUI_FROM_DATABASE=Cyan Optic, Inc.
+OUI:001730*
+ ID_OUI_FROM_DATABASE=Automation Electronics
 
-OUI:001D94*
- ID_OUI_FROM_DATABASE=Climax Technology Co., Ltd
+OUI:001729*
+ ID_OUI_FROM_DATABASE=Ubicod Co.LTD
 
-OUI:001D93*
- ID_OUI_FROM_DATABASE=Modacom
+OUI:00169B*
+ ID_OUI_FROM_DATABASE=Alstom Transport
 
-OUI:001D8D*
- ID_OUI_FROM_DATABASE=Raytek GmbH
+OUI:0016A2*
+ ID_OUI_FROM_DATABASE=CentraLite Systems, Inc.
 
-OUI:001D86*
- ID_OUI_FROM_DATABASE=Shinwa Industries(China) Ltd.
+OUI:001696*
+ ID_OUI_FROM_DATABASE=QDI Technology (H.K.) Limited
 
-OUI:001DC9*
- ID_OUI_FROM_DATABASE=GainSpan Corp.
+OUI:001688*
+ ID_OUI_FROM_DATABASE=ServerEngines LLC
 
-OUI:001DC2*
- ID_OUI_FROM_DATABASE=XORTEC OY
+OUI:00168A*
+ ID_OUI_FROM_DATABASE=id-Confirm Inc
 
-OUI:001DBD*
- ID_OUI_FROM_DATABASE=Versamed Inc.
+OUI:001683*
+ ID_OUI_FROM_DATABASE=WEBIO International Co.,.Ltd.
 
-OUI:001DB6*
- ID_OUI_FROM_DATABASE=BestComm Networks, Inc.
+OUI:00167C*
+ ID_OUI_FROM_DATABASE=iRex Technologies BV
 
-OUI:001DB0*
- ID_OUI_FROM_DATABASE=FuJian HengTong Information Technology Co.,Ltd
+OUI:001610*
+ ID_OUI_FROM_DATABASE=Carina Technology
 
-OUI:001DAC*
- ID_OUI_FROM_DATABASE=Gigamon Systems LLC
+OUI:00160B*
+ ID_OUI_FROM_DATABASE=TVWorks LLC
 
-OUI:001D81*
- ID_OUI_FROM_DATABASE=GUANGZHOU GATEWAY ELECTRONICS CO., LTD
+OUI:001604*
+ ID_OUI_FROM_DATABASE=Sigpro
 
-OUI:001D69*
- ID_OUI_FROM_DATABASE=Knorr-Bremse IT-Services GmbH
+OUI:0015FE*
+ ID_OUI_FROM_DATABASE=SCHILLING ROBOTICS LLC
 
-OUI:001D70*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0015FD*
+ ID_OUI_FROM_DATABASE=Complete Media Systems
 
-OUI:001D77*
- ID_OUI_FROM_DATABASE=NSGate
+OUI:0015F8*
+ ID_OUI_FROM_DATABASE=Kingtronics Industrial Co. Ltd.
 
-OUI:001D7C*
- ID_OUI_FROM_DATABASE=ABE Elettronica S.p.A.
+OUI:0015EC*
+ ID_OUI_FROM_DATABASE=Boca Devices LLC
 
-OUI:001D64*
- ID_OUI_FROM_DATABASE=Adam Communications Systems Int Ltd
+OUI:0015F1*
+ ID_OUI_FROM_DATABASE=KYLINK Communications Corp.
 
-OUI:001D5D*
- ID_OUI_FROM_DATABASE=Control Dynamics Pty. Ltd.
+OUI:001677*
+ ID_OUI_FROM_DATABASE=Bihl + Wiedemann GmbH
 
-OUI:001D2E*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:001670*
+ ID_OUI_FROM_DATABASE=SKNET Corporation
 
-OUI:001D21*
- ID_OUI_FROM_DATABASE=Alcad SL
+OUI:001664*
+ ID_OUI_FROM_DATABASE=Prod-El SpA
 
-OUI:001D1C*
- ID_OUI_FROM_DATABASE=Gennet s.a.
+OUI:001669*
+ ID_OUI_FROM_DATABASE=MRV Communication (Networks) LTD
 
-OUI:001D17*
- ID_OUI_FROM_DATABASE=Digital Sky Corporation
+OUI:00165D*
+ ID_OUI_FROM_DATABASE=AirDefense, Inc.
 
-OUI:001D12*
- ID_OUI_FROM_DATABASE=ROHM CO., LTD.
+OUI:001651*
+ ID_OUI_FROM_DATABASE=Exeo Systems
 
-OUI:001D11*
- ID_OUI_FROM_DATABASE=Analogue & Micro Ltd
+OUI:0015E5*
+ ID_OUI_FROM_DATABASE=Cheertek Inc.
 
-OUI:001D0B*
- ID_OUI_FROM_DATABASE=Power Standards Lab
+OUI:0015DB*
+ ID_OUI_FROM_DATABASE=Canesta Inc.
 
-OUI:001D04*
- ID_OUI_FROM_DATABASE=Zipit Wireless, Inc.
+OUI:0015D4*
+ ID_OUI_FROM_DATABASE=Emitor AB
 
-OUI:001D58*
- ID_OUI_FROM_DATABASE=CQ Inc
+OUI:0015C8*
+ ID_OUI_FROM_DATABASE=FlexiPanel Ltd
 
-OUI:001D57*
- ID_OUI_FROM_DATABASE=CAETEC Messtechnik
+OUI:0015C3*
+ ID_OUI_FROM_DATABASE=Ruf Telematik AG
 
-OUI:001D51*
- ID_OUI_FROM_DATABASE=Babcock & Wilcox Power Generation Group, Inc
+OUI:0015C2*
+ ID_OUI_FROM_DATABASE=3M Germany
 
-OUI:001D47*
- ID_OUI_FROM_DATABASE=Covote GmbH & Co KG
+OUI:0015BE*
+ ID_OUI_FROM_DATABASE=Iqua Ltd.
 
-OUI:001D40*
- ID_OUI_FROM_DATABASE=Intel – GE Care Innovations LLC
+OUI:0016EF*
+ ID_OUI_FROM_DATABASE=Koko Fitness, Inc.
 
-OUI:001D34*
- ID_OUI_FROM_DATABASE=SYRIS Technology Corp
+OUI:0016F4*
+ ID_OUI_FROM_DATABASE=Eidicom Co., Ltd.
 
-OUI:001D2D*
- ID_OUI_FROM_DATABASE=Pylone, Inc.
+OUI:0016E8*
+ ID_OUI_FROM_DATABASE=Sigma Designs, Inc.
 
-OUI:001B2A*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0016DC*
+ ID_OUI_FROM_DATABASE=ARCHOS
 
-OUI:001B1D*
- ID_OUI_FROM_DATABASE=Phoenix International Co., Ltd
+OUI:0016E1*
+ ID_OUI_FROM_DATABASE=SiliconStor, Inc.
 
-OUI:001B22*
- ID_OUI_FROM_DATABASE=Palit Microsystems ( H.K.) Ltd.
+OUI:0016D7*
+ ID_OUI_FROM_DATABASE=Sunways AG
 
-OUI:001B1B*
- ID_OUI_FROM_DATABASE=Siemens AG,
+OUI:0014CB*
+ ID_OUI_FROM_DATABASE=LifeSync Corporation
 
-OUI:001B16*
- ID_OUI_FROM_DATABASE=Celtro Ltd.
+OUI:0014D0*
+ ID_OUI_FROM_DATABASE=BTI Systems Inc.
 
-OUI:001B0A*
- ID_OUI_FROM_DATABASE=Intelligent Distributed Controls Ltd
+OUI:0014C4*
+ ID_OUI_FROM_DATABASE=Vitelcom Mobile Technology
 
-OUI:001B0F*
- ID_OUI_FROM_DATABASE=Petratec
+OUI:0014BE*
+ ID_OUI_FROM_DATABASE=Wink communication technology CO.LTD
 
-OUI:001AFE*
- ID_OUI_FROM_DATABASE=SOFACREAL
+OUI:0014BD*
+ ID_OUI_FROM_DATABASE=incNETWORKS, Inc
 
-OUI:001B03*
- ID_OUI_FROM_DATABASE=Action Technology (SZ) Co., Ltd
+OUI:0014B8*
+ ID_OUI_FROM_DATABASE=Hill-Rom
 
-OUI:001B68*
- ID_OUI_FROM_DATABASE=Modnnet Co., Ltd
+OUI:0014AE*
+ ID_OUI_FROM_DATABASE=Wizlogics Co., Ltd.
 
-OUI:001B62*
- ID_OUI_FROM_DATABASE=JHT Optoelectronics Co.,Ltd.
+OUI:0014B3*
+ ID_OUI_FROM_DATABASE=CoreStar International Corp
 
-OUI:001B61*
- ID_OUI_FROM_DATABASE=Digital Acoustics, LLC
+OUI:00149B*
+ ID_OUI_FROM_DATABASE=Nokota Communications, LLC
 
-OUI:001B5C*
- ID_OUI_FROM_DATABASE=Azuretec Co., Ltd.
+OUI:001431*
+ ID_OUI_FROM_DATABASE=PDL Electronics Ltd
 
-OUI:001B55*
- ID_OUI_FROM_DATABASE=Hurco Automation Ltd.
+OUI:001433*
+ ID_OUI_FROM_DATABASE=Empower Technologies(Canada) Inc.
 
-OUI:001B50*
- ID_OUI_FROM_DATABASE=Nizhny Novgorod Factory named after M.Frunze, FSUE (NZiF)
+OUI:001432*
+ ID_OUI_FROM_DATABASE=Tarallax Wireless, Inc.
 
-OUI:001B44*
- ID_OUI_FROM_DATABASE=SanDisk Corporation
+OUI:00142C*
+ ID_OUI_FROM_DATABASE=Koncept International, Inc.
 
-OUI:001B49*
- ID_OUI_FROM_DATABASE=Roberts Radio limited
+OUI:001425*
+ ID_OUI_FROM_DATABASE=Galactic Computing Corp.
 
-OUI:001B42*
- ID_OUI_FROM_DATABASE=Wise & Blue
+OUI:001420*
+ ID_OUI_FROM_DATABASE=G-Links networking company
 
-OUI:001B3D*
- ID_OUI_FROM_DATABASE=EuroTel Spa
+OUI:00141B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001B36*
- ID_OUI_FROM_DATABASE=Tsubata Engineering Co.,Ltd. (Head Office)
+OUI:00146D*
+ ID_OUI_FROM_DATABASE=RF Technologies
 
-OUI:001B31*
- ID_OUI_FROM_DATABASE=Neural Image. Co. Ltd.
+OUI:00146F*
+ ID_OUI_FROM_DATABASE=Kohler Co
 
-OUI:001C56*
- ID_OUI_FROM_DATABASE=Pado Systems, Inc.
+OUI:00146E*
+ ID_OUI_FROM_DATABASE=H. Stoll GmbH & Co. KG
 
-OUI:001C5B*
- ID_OUI_FROM_DATABASE=Chubb Electronic Security Systems Ltd
+OUI:001468*
+ ID_OUI_FROM_DATABASE=CelPlan International, Inc.
 
-OUI:001C5D*
- ID_OUI_FROM_DATABASE=Leica Microsystems
+OUI:001461*
+ ID_OUI_FROM_DATABASE=CORONA CORPORATION
 
-OUI:001C5C*
- ID_OUI_FROM_DATABASE=Integrated Medical Systems, Inc.
+OUI:00145C*
+ ID_OUI_FROM_DATABASE=Intronics B.V.
 
-OUI:001C51*
- ID_OUI_FROM_DATABASE=Celeno Communications
+OUI:001455*
+ ID_OUI_FROM_DATABASE=Coder Electronics Corporation
 
-OUI:001C52*
- ID_OUI_FROM_DATABASE=VISIONEE SRL
+OUI:001444*
+ ID_OUI_FROM_DATABASE=Grundfos Holding
 
-OUI:001C45*
- ID_OUI_FROM_DATABASE=Chenbro Micom Co., Ltd.
+OUI:00144B*
+ ID_OUI_FROM_DATABASE=Hifn, Inc.
 
-OUI:001C4C*
- ID_OUI_FROM_DATABASE=Petrotest Instruments
+OUI:001589*
+ ID_OUI_FROM_DATABASE=D-MAX Technology Co.,Ltd
 
-OUI:001C39*
- ID_OUI_FROM_DATABASE=S Netsystems Inc.
+OUI:001582*
+ ID_OUI_FROM_DATABASE=Pulse Eight Limited
 
-OUI:001C40*
- ID_OUI_FROM_DATABASE=VDG-Security bv
+OUI:00157C*
+ ID_OUI_FROM_DATABASE=Dave Networks, Inc.
 
-OUI:001C32*
- ID_OUI_FROM_DATABASE=Telian Corporation
+OUI:001578*
+ ID_OUI_FROM_DATABASE=Audio / Video Innovations
 
-OUI:001AC7*
- ID_OUI_FROM_DATABASE=UNIPOINT
+OUI:001573*
+ ID_OUI_FROM_DATABASE=NewSoft  Technology Corporation
 
-OUI:001AC2*
- ID_OUI_FROM_DATABASE=YEC Co.,Ltd.
+OUI:00156C*
+ ID_OUI_FROM_DATABASE=SANE SYSTEM CO., LTD
 
-OUI:001AB8*
- ID_OUI_FROM_DATABASE=Anseri Corporation
+OUI:001571*
+ ID_OUI_FROM_DATABASE=Nolan Systems
 
-OUI:001ABD*
- ID_OUI_FROM_DATABASE=Impatica Inc.
+OUI:001572*
+ ID_OUI_FROM_DATABASE=Red-Lemon
 
-OUI:001AB1*
- ID_OUI_FROM_DATABASE=Asia Pacific Satellite Industries Co., Ltd.
+OUI:001565*
+ ID_OUI_FROM_DATABASE=XIAMEN YEALINK NETWORK TECHNOLOGY CO.,LTD
 
-OUI:001B8C*
- ID_OUI_FROM_DATABASE=JMicron Technology Corp.
+OUI:001559*
+ ID_OUI_FROM_DATABASE=Securaplane Technologies, Inc.
 
-OUI:001B91*
- ID_OUI_FROM_DATABASE=EFKON AG
+OUI:0014A2*
+ ID_OUI_FROM_DATABASE=Core Micro Systems Inc.
 
-OUI:001B87*
- ID_OUI_FROM_DATABASE=Deepsound Tech. Co., Ltd
+OUI:001494*
+ ID_OUI_FROM_DATABASE=ESU AG
 
-OUI:001B82*
- ID_OUI_FROM_DATABASE=Taiwan Semiconductor Co., Ltd.
+OUI:00148F*
+ ID_OUI_FROM_DATABASE=Protronic (Far East) Ltd.
 
-OUI:001B7B*
- ID_OUI_FROM_DATABASE=The Tintometer Ltd
+OUI:001488*
+ ID_OUI_FROM_DATABASE=Akorri
 
-OUI:001B74*
- ID_OUI_FROM_DATABASE=MiraLink Corporation
+OUI:001483*
+ ID_OUI_FROM_DATABASE=eXS Inc.
 
-OUI:001B6F*
- ID_OUI_FROM_DATABASE=Teletrak Ltd
+OUI:001480*
+ ID_OUI_FROM_DATABASE=Hitachi-LG Data Storage Korea, Inc
 
-OUI:001AFC*
- ID_OUI_FROM_DATABASE=ModusLink Corporation
+OUI:00147B*
+ ID_OUI_FROM_DATABASE=Iteris, Inc.
 
-OUI:001AF2*
- ID_OUI_FROM_DATABASE=Dynavisions Schweiz AG
+OUI:001474*
+ ID_OUI_FROM_DATABASE=K40 Electronics
 
-OUI:001AF7*
- ID_OUI_FROM_DATABASE=dataschalt e+a GmbH
+OUI:0015B8*
+ ID_OUI_FROM_DATABASE=Tahoe
 
-OUI:001AED*
- ID_OUI_FROM_DATABASE=INCOTEC GmbH
+OUI:0015B2*
+ ID_OUI_FROM_DATABASE=Advanced Industrial Computer, Inc.
 
-OUI:001ADF*
- ID_OUI_FROM_DATABASE=Interactivetv Pty Limited
+OUI:0015AE*
+ ID_OUI_FROM_DATABASE=kyung il
 
-OUI:001AE1*
- ID_OUI_FROM_DATABASE=EDGE ACCESS INC
+OUI:0015AD*
+ ID_OUI_FROM_DATABASE=Accedian Networks
 
-OUI:001AE6*
- ID_OUI_FROM_DATABASE=Atlanta Advanced Communications Holdings Limited
+OUI:00E0A8*
+ ID_OUI_FROM_DATABASE=SAT GmbH & Co.
 
-OUI:001AD3*
- ID_OUI_FROM_DATABASE=Vamp Ltd.
+OUI:0015A1*
+ ID_OUI_FROM_DATABASE=ECA-SINTERS
 
-OUI:001ADA*
- ID_OUI_FROM_DATABASE=Biz-2-Me Inc.
+OUI:00159C*
+ ID_OUI_FROM_DATABASE=B-KYUNG SYSTEM Co.,Ltd.
 
-OUI:001ACE*
- ID_OUI_FROM_DATABASE=YUPITERU CORPORATION
+OUI:001595*
+ ID_OUI_FROM_DATABASE=Quester Tangent Corporation
 
-OUI:001BC8*
- ID_OUI_FROM_DATABASE=MIURA CO.,LTD
+OUI:00158E*
+ ID_OUI_FROM_DATABASE=Plustek.INC
 
-OUI:001BC1*
- ID_OUI_FROM_DATABASE=HOLUX Technology, Inc.
+OUI:001552*
+ ID_OUI_FROM_DATABASE=Wi-Gear Inc.
 
-OUI:001BB7*
- ID_OUI_FROM_DATABASE=Alta Heights Technology Corp.
+OUI:001548*
+ ID_OUI_FROM_DATABASE=CUBE TECHNOLOGIES
 
-OUI:001BAB*
- ID_OUI_FROM_DATABASE=Telchemy, Incorporated
+OUI:00154D*
+ ID_OUI_FROM_DATABASE=Netronome Systems, Inc.
 
-OUI:001BB0*
- ID_OUI_FROM_DATABASE=BHARAT ELECTRONICS
+OUI:00153C*
+ ID_OUI_FROM_DATABASE=Kprotech Co., Ltd.
 
-OUI:001BA4*
- ID_OUI_FROM_DATABASE=S.A.E Afikim
+OUI:001543*
+ ID_OUI_FROM_DATABASE=Aberdeen Test Center
 
-OUI:001B9F*
- ID_OUI_FROM_DATABASE=Calyptech Pty Ltd
+OUI:001535*
+ ID_OUI_FROM_DATABASE=OTE Spa
 
-OUI:001B9D*
- ID_OUI_FROM_DATABASE=Novus Security Sp. z o.o.
+OUI:001537*
+ ID_OUI_FROM_DATABASE=Ventus Networks
 
-OUI:001BF6*
- ID_OUI_FROM_DATABASE=CONWISE Technology Corporation Ltd.
+OUI:001536*
+ ID_OUI_FROM_DATABASE=Powertech co.,Ltd
 
-OUI:001BF1*
- ID_OUI_FROM_DATABASE=Nanjing SilverNet Software Co., Ltd.
+OUI:001530*
+ ID_OUI_FROM_DATABASE=EMC Corporation
 
-OUI:001BEC*
- ID_OUI_FROM_DATABASE=Netio Technologies Co., Ltd
+OUI:001529*
+ ID_OUI_FROM_DATABASE=N3 Corporation
 
-OUI:001BE7*
- ID_OUI_FROM_DATABASE=Postek Electronics Co., Ltd.
+OUI:0014F9*
+ ID_OUI_FROM_DATABASE=Vantage Controls
 
-OUI:001BE0*
- ID_OUI_FROM_DATABASE=TELENOT ELECTRONIC GmbH
+OUI:0014FB*
+ ID_OUI_FROM_DATABASE=Technical Solutions Inc.
 
-OUI:001BD9*
- ID_OUI_FROM_DATABASE=Edgewater Computer Systems
+OUI:0014FA*
+ ID_OUI_FROM_DATABASE=AsGa S.A.
 
-OUI:001BDB*
- ID_OUI_FROM_DATABASE=Valeo VECS
+OUI:0014F4*
+ ID_OUI_FROM_DATABASE=DekTec Digital Video B.V.
 
-OUI:001BD4*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0014ED*
+ ID_OUI_FROM_DATABASE=Airak, Inc.
 
-OUI:001BCD*
- ID_OUI_FROM_DATABASE=DAVISCOMMS (S) PTE LTD
+OUI:0014DE*
+ ID_OUI_FROM_DATABASE=Sage Instruments Inc.
 
-OUI:001C2D*
- ID_OUI_FROM_DATABASE=FlexRadio Systems
+OUI:0014E3*
+ ID_OUI_FROM_DATABASE=mm-lab GmbH
 
-OUI:001C1C*
- ID_OUI_FROM_DATABASE=Center Communication Systems GmbH
+OUI:0014D7*
+ ID_OUI_FROM_DATABASE=Datastore Technology Corp
 
-OUI:001C21*
- ID_OUI_FROM_DATABASE=Nucsafe Inc.
+OUI:001524*
+ ID_OUI_FROM_DATABASE=Numatics, Inc.
 
-OUI:001C20*
- ID_OUI_FROM_DATABASE=CLB Benelux
+OUI:00151D*
+ ID_OUI_FROM_DATABASE=M2I CORPORATION
 
-OUI:001C15*
- ID_OUI_FROM_DATABASE=iPhotonix LLC
+OUI:001513*
+ ID_OUI_FROM_DATABASE=EFS sas
 
-OUI:001C16*
- ID_OUI_FROM_DATABASE=ThyssenKrupp Elevator
+OUI:001507*
+ ID_OUI_FROM_DATABASE=Renaissance Learning Inc
 
-OUI:001C10*
- ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
+OUI:00129E*
+ ID_OUI_FROM_DATABASE=Surf Communications Inc.
 
-OUI:001C09*
- ID_OUI_FROM_DATABASE=SAE Electronic Co.,Ltd.
+OUI:001297*
+ ID_OUI_FROM_DATABASE=O2Micro, Inc.
 
-OUI:001C04*
- ID_OUI_FROM_DATABASE=Airgain, Inc.
+OUI:001298*
+ ID_OUI_FROM_DATABASE=MICO ELECTRIC(SHENZHEN) LIMITED
 
-OUI:001BFD*
- ID_OUI_FROM_DATABASE=Dignsys Inc.
+OUI:00128D*
+ ID_OUI_FROM_DATABASE=STB Datenservice GmbH
 
-OUI:00192B*
- ID_OUI_FROM_DATABASE=Aclara RF Systems Inc.
+OUI:00128E*
+ ID_OUI_FROM_DATABASE=Q-Free ASA
 
-OUI:001930*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:001292*
+ ID_OUI_FROM_DATABASE=Griffin Technology
 
-OUI:00191F*
- ID_OUI_FROM_DATABASE=Microlink communications Inc.
+OUI:00127C*
+ ID_OUI_FROM_DATABASE=SWEGON AB
 
-OUI:001924*
- ID_OUI_FROM_DATABASE=LBNL  Engineering
+OUI:001281*
+ ID_OUI_FROM_DATABASE=March Networks S.p.A.
 
-OUI:001911*
- ID_OUI_FROM_DATABASE=Just In Mobile Information Technologies (Shanghai) Co., Ltd.
+OUI:00127B*
+ ID_OUI_FROM_DATABASE=VIA Networking Technologies, Inc.
 
-OUI:001918*
- ID_OUI_FROM_DATABASE=Interactive Wear AG
+OUI:001327*
+ ID_OUI_FROM_DATABASE=Data Acquisitions limited
 
-OUI:00190C*
- ID_OUI_FROM_DATABASE=Encore Electronics, Inc.
+OUI:00131D*
+ ID_OUI_FROM_DATABASE=Scanvaegt International A/S
 
-OUI:001900*
- ID_OUI_FROM_DATABASE=Intelliverese - DBA Voicecom
+OUI:001322*
+ ID_OUI_FROM_DATABASE=DAQ Electronics, Inc.
 
-OUI:001905*
- ID_OUI_FROM_DATABASE=SCHRACK Seconet AG
+OUI:001316*
+ ID_OUI_FROM_DATABASE=L-S-B Broadcast Technologies GmbH
 
-OUI:0018F4*
- ID_OUI_FROM_DATABASE=EO TECHNICS Co., Ltd.
+OUI:00130F*
+ ID_OUI_FROM_DATABASE=EGEMEN Bilgisayar Muh San ve Tic LTD STI
 
-OUI:0018F6*
- ID_OUI_FROM_DATABASE=Thomson Telecom Belgium
+OUI:0012F7*
+ ID_OUI_FROM_DATABASE=Xiamen Xinglian Electronics Co., Ltd.
 
-OUI:0018FB*
- ID_OUI_FROM_DATABASE=Compro Technology
+OUI:0012FE*
+ ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
 
-OUI:0019EE*
- ID_OUI_FROM_DATABASE=CARLO GAVAZZI CONTROLS SPA-Controls Division
+OUI:001303*
+ ID_OUI_FROM_DATABASE=GateConnect
 
-OUI:0019F0*
- ID_OUI_FROM_DATABASE=UNIONMAN TECHNOLOGY CO.,LTD
+OUI:0012FD*
+ ID_OUI_FROM_DATABASE=OPTIMUS IC S.A.
 
-OUI:0019F5*
- ID_OUI_FROM_DATABASE=Imagination Technologies Ltd
+OUI:00140F*
+ ID_OUI_FROM_DATABASE=Federal State Unitary Enterprise Leningrad R&D Institute of
 
-OUI:0019E9*
- ID_OUI_FROM_DATABASE=S-Information Technolgy, Co., Ltd.
+OUI:001416*
+ ID_OUI_FROM_DATABASE=Scosche Industries, Inc.
 
-OUI:0019DB*
- ID_OUI_FROM_DATABASE=MICRO-STAR INTERNATIONAL CO., LTD.
+OUI:001406*
+ ID_OUI_FROM_DATABASE=Go Networks
 
-OUI:0019DD*
- ID_OUI_FROM_DATABASE=FEI-Zyfer, Inc.
+OUI:001407*
+ ID_OUI_FROM_DATABASE=Sperian Protection Instrumentation
 
-OUI:0019CA*
- ID_OUI_FROM_DATABASE=Broadata Communications, Inc
+OUI:00140C*
+ ID_OUI_FROM_DATABASE=GKB CCTV CO., LTD.
 
-OUI:0019CF*
- ID_OUI_FROM_DATABASE=SALICRU, S.A.
+OUI:0013FF*
+ ID_OUI_FROM_DATABASE=Dage-MTI of MC, Inc.
 
-OUI:0019D6*
- ID_OUI_FROM_DATABASE=LS Cable and System Ltd.
+OUI:001400*
+ ID_OUI_FROM_DATABASE=MINERVA KOREA CO., LTD
 
-OUI:0019B4*
- ID_OUI_FROM_DATABASE=Intellio Ltd
+OUI:0013FA*
+ ID_OUI_FROM_DATABASE=LifeSize Communications, Inc
 
-OUI:001A6E*
- ID_OUI_FROM_DATABASE=Impro Technologies
+OUI:0013F3*
+ ID_OUI_FROM_DATABASE=Giga-byte Communications Inc.
 
-OUI:001A67*
- ID_OUI_FROM_DATABASE=Infinite QL Sdn Bhd
+OUI:0013EE*
+ ID_OUI_FROM_DATABASE=JBX Designs Inc.
 
-OUI:001A69*
- ID_OUI_FROM_DATABASE=Wuhan Yangtze Optical Technology CO.,Ltd.
+OUI:0013ED*
+ ID_OUI_FROM_DATABASE=PSIA
 
-OUI:001A62*
- ID_OUI_FROM_DATABASE=Data Robotics, Incorporated
+OUI:00135A*
+ ID_OUI_FROM_DATABASE=Project T&E Limited
 
-OUI:001A58*
- ID_OUI_FROM_DATABASE=CCV Deutschland GmbH - Celectronic eHealth Div.
+OUI:00135F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001A5D*
- ID_OUI_FROM_DATABASE=Mobinnova Corp.
+OUI:001360*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001A4C*
- ID_OUI_FROM_DATABASE=Crossbow Technology, Inc
+OUI:001352*
+ ID_OUI_FROM_DATABASE=Naztec, Inc.
 
-OUI:001A51*
- ID_OUI_FROM_DATABASE=Alfred Mann Foundation
+OUI:00134B*
+ ID_OUI_FROM_DATABASE=ToGoldenNet Technology Inc.
 
-OUI:001AAA*
- ID_OUI_FROM_DATABASE=Analogic Corp.
+OUI:00134C*
+ ID_OUI_FROM_DATABASE=YDT Technology International
 
-OUI:001AA1*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00133A*
+ ID_OUI_FROM_DATABASE=VadaTech Inc.
 
-OUI:001A9C*
- ID_OUI_FROM_DATABASE=RightHand Technologies, Inc.
+OUI:00133F*
+ ID_OUI_FROM_DATABASE=Eppendorf Instrumente GmbH
 
-OUI:001A8B*
- ID_OUI_FROM_DATABASE=CHUNIL ELECTRIC IND., CO.
+OUI:00132C*
+ ID_OUI_FROM_DATABASE=MAZ Brandenburg GmbH
 
-OUI:001A95*
- ID_OUI_FROM_DATABASE=Hisense Mobile Communications Technoligy Co.,Ltd.
+OUI:001339*
+ ID_OUI_FROM_DATABASE=CCV Deutschland GmbH
 
-OUI:001A84*
- ID_OUI_FROM_DATABASE=V One Multimedia Pte Ltd
+OUI:0013AD*
+ ID_OUI_FROM_DATABASE=Sendo Ltd
 
-OUI:0019A1*
- ID_OUI_FROM_DATABASE=LG INFORMATION & COMM.
+OUI:0013B4*
+ ID_OUI_FROM_DATABASE=Appear TV
 
-OUI:0019AD*
- ID_OUI_FROM_DATABASE=BOBST SA
+OUI:0013A8*
+ ID_OUI_FROM_DATABASE=Tanisys Technology
 
-OUI:0019B2*
- ID_OUI_FROM_DATABASE=XYnetsoft Co.,Ltd
+OUI:0013A7*
+ ID_OUI_FROM_DATABASE=BATTELLE MEMORIAL INSTITUTE
 
-OUI:00199A*
- ID_OUI_FROM_DATABASE=EDO-EVI
+OUI:0013A1*
+ ID_OUI_FROM_DATABASE=Crow Electronic Engeneering
 
-OUI:00199F*
- ID_OUI_FROM_DATABASE=DKT A/S
+OUI:00139A*
+ ID_OUI_FROM_DATABASE=K-ubique ID Corp.
 
-OUI:001995*
- ID_OUI_FROM_DATABASE=Jurong Hi-Tech (Suzhou)Co.ltd
+OUI:001395*
+ ID_OUI_FROM_DATABASE=congatec AG
 
-OUI:001990*
- ID_OUI_FROM_DATABASE=ELM DATA Co., Ltd.
+OUI:00138E*
+ ID_OUI_FROM_DATABASE=FOAB Elektronik AB
 
-OUI:001989*
- ID_OUI_FROM_DATABASE=Sonitrol Corporation
+OUI:001388*
+ ID_OUI_FROM_DATABASE=WiMedia Alliance
 
-OUI:001A3E*
- ID_OUI_FROM_DATABASE=Faster Technology LLC
+OUI:0013E4*
+ ID_OUI_FROM_DATABASE=YANGJAE SYSTEMS CORP.
 
-OUI:001A40*
- ID_OUI_FROM_DATABASE=A-FOUR TECH CO., LTD.
+OUI:0013E9*
+ ID_OUI_FROM_DATABASE=VeriWave, Inc.
 
-OUI:001A2D*
- ID_OUI_FROM_DATABASE=The Navvo Group
+OUI:0013E3*
+ ID_OUI_FROM_DATABASE=CoVi Technologies, Inc.
 
-OUI:001A32*
- ID_OUI_FROM_DATABASE=ACTIVA MULTIMEDIA
+OUI:0013DD*
+ ID_OUI_FROM_DATABASE=Abbott Diagnostics
 
-OUI:001A28*
- ID_OUI_FROM_DATABASE=ASWT Co., LTD. Taiwan Branch H.K.
+OUI:0013D6*
+ ID_OUI_FROM_DATABASE=TII NETWORK TECHNOLOGIES, INC.
 
-OUI:001A1C*
- ID_OUI_FROM_DATABASE=GT&T Engineering Pte Ltd
+OUI:0013D1*
+ ID_OUI_FROM_DATABASE=KIRK telecom A/S
 
-OUI:001A23*
- ID_OUI_FROM_DATABASE=Ice Qube, Inc
+OUI:0013CA*
+ ID_OUI_FROM_DATABASE=Pico Digital
 
-OUI:001A15*
- ID_OUI_FROM_DATABASE=gemalto e-Payment
+OUI:0013C3*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001A10*
- ID_OUI_FROM_DATABASE=LUCENT TRANS ELECTRONICS CO.,LTD
+OUI:0013C4*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001A09*
- ID_OUI_FROM_DATABASE=Wayfarer Transit Systems Ltd
+OUI:0013BA*
+ ID_OUI_FROM_DATABASE=ReadyLinks Inc
 
-OUI:001A02*
- ID_OUI_FROM_DATABASE=SECURE CARE PRODUCTS, INC
+OUI:0013BE*
+ ID_OUI_FROM_DATABASE=Virtual Conexions
 
-OUI:001A04*
- ID_OUI_FROM_DATABASE=Interay Solutions BV
+OUI:0013B9*
+ ID_OUI_FROM_DATABASE=BM SPA
 
-OUI:001984*
- ID_OUI_FROM_DATABASE=ESTIC Corporation
+OUI:0012F3*
+ ID_OUI_FROM_DATABASE=connectBlue AB
 
-OUI:001976*
- ID_OUI_FROM_DATABASE=Xipher Technologies, LLC
+OUI:0012ED*
+ ID_OUI_FROM_DATABASE=AVG Advanced Technologies
 
-OUI:001978*
- ID_OUI_FROM_DATABASE=Datum Systems, Inc.
+OUI:0012E6*
+ ID_OUI_FROM_DATABASE=SPECTEC COMPUTER CO., LTD.
 
-OUI:00196A*
- ID_OUI_FROM_DATABASE=MikroM GmbH
+OUI:0012E1*
+ ID_OUI_FROM_DATABASE=Alliant Networks, Inc
 
-OUI:001971*
- ID_OUI_FROM_DATABASE=Guangzhou Unicomp Technology Co.,Ltd
+OUI:0012D3*
+ ID_OUI_FROM_DATABASE=Zetta Systems, Inc.
 
-OUI:001965*
- ID_OUI_FROM_DATABASE=YuHua TelTech (ShangHai) Co., Ltd.
+OUI:0012DA*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001960*
- ID_OUI_FROM_DATABASE=DoCoMo Systems, Inc.
+OUI:0012D4*
+ ID_OUI_FROM_DATABASE=Princeton Technology, Ltd
 
-OUI:001954*
- ID_OUI_FROM_DATABASE=Leaf Corporation.
+OUI:0012C7*
+ ID_OUI_FROM_DATABASE=SECURAY Technologies Ltd.Co.
 
-OUI:001959*
- ID_OUI_FROM_DATABASE=Staccato Communications Inc.
+OUI:0012CE*
+ ID_OUI_FROM_DATABASE=Advanced Cybernetics Group
 
-OUI:00194D*
- ID_OUI_FROM_DATABASE=Avago Technologies Sdn Bhd
+OUI:0012C2*
+ ID_OUI_FROM_DATABASE=Apex Electronics Factory
 
-OUI:001948*
- ID_OUI_FROM_DATABASE=AireSpider Networks
+OUI:0012C1*
+ ID_OUI_FROM_DATABASE=Check Point Software Technologies
 
-OUI:001941*
- ID_OUI_FROM_DATABASE=Pitney Bowes, Inc
+OUI:0012B8*
+ ID_OUI_FROM_DATABASE=G2 Microsystems
 
-OUI:001935*
- ID_OUI_FROM_DATABASE=DUERR DENTAL AG
+OUI:0012BD*
+ ID_OUI_FROM_DATABASE=Avantec Manufacturing Limited
 
-OUI:00193A*
- ID_OUI_FROM_DATABASE=OESOLUTIONS
+OUI:0012B7*
+ ID_OUI_FROM_DATABASE=PTW Freiburg
 
-OUI:00193C*
- ID_OUI_FROM_DATABASE=HighPoint Technologies Incorporated
+OUI:0012B1*
+ ID_OUI_FROM_DATABASE=Dai Nippon Printing Co., Ltd
 
-OUI:001773*
- ID_OUI_FROM_DATABASE=Laketune Technologies Co. Ltd
+OUI:0012A5*
+ ID_OUI_FROM_DATABASE=Stargen, Inc.
 
-OUI:001778*
- ID_OUI_FROM_DATABASE=Central Music Co.
+OUI:0012AA*
+ ID_OUI_FROM_DATABASE=IEE, Inc.
 
-OUI:00177A*
- ID_OUI_FROM_DATABASE=ASSA ABLOY AB
+OUI:001379*
+ ID_OUI_FROM_DATABASE=PONDER INFORMATION INDUSTRIES LTD.
 
-OUI:00176F*
- ID_OUI_FROM_DATABASE=PAX Computer Technology(Shenzhen) Ltd.
+OUI:001380*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00176A*
- ID_OUI_FROM_DATABASE=Avago Technologies
+OUI:001385*
+ ID_OUI_FROM_DATABASE=Add-On Technology Co., LTD.
 
-OUI:001763*
- ID_OUI_FROM_DATABASE=Essentia S.p.A.
+OUI:00137F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00175E*
- ID_OUI_FROM_DATABASE=Zed-3
+OUI:00136D*
+ ID_OUI_FROM_DATABASE=Tentaculus AB
 
-OUI:001750*
- ID_OUI_FROM_DATABASE=GSI Group, MicroE Systems
+OUI:001366*
+ ID_OUI_FROM_DATABASE=Neturity Technologies Inc.
 
-OUI:001752*
- ID_OUI_FROM_DATABASE=DAGS, Inc
+OUI:001258*
+ ID_OUI_FROM_DATABASE=Activis Polska
 
-OUI:001757*
- ID_OUI_FROM_DATABASE=RIX TECHNOLOGY LIMITED
+OUI:001251*
+ ID_OUI_FROM_DATABASE=SILINK
 
-OUI:00183D*
- ID_OUI_FROM_DATABASE=Vertex Link Corporation
+OUI:001252*
+ ID_OUI_FROM_DATABASE=Citronix, LLC
 
-OUI:001844*
- ID_OUI_FROM_DATABASE=Heads Up Technologies, Inc.
+OUI:001245*
+ ID_OUI_FROM_DATABASE=Zellweger Analytics, Inc.
 
-OUI:001838*
- ID_OUI_FROM_DATABASE=PanAccess Communications,Inc.
+OUI:00124C*
+ ID_OUI_FROM_DATABASE=BBWM Corporation
 
-OUI:001827*
- ID_OUI_FROM_DATABASE=NEC UNIFIED SOLUTIONS NEDERLAND B.V.
+OUI:001239*
+ ID_OUI_FROM_DATABASE=S Net Systems Inc.
 
-OUI:00182C*
- ID_OUI_FROM_DATABASE=Ascend Networks, Inc.
+OUI:001240*
+ ID_OUI_FROM_DATABASE=AMOI ELECTRONICS CO.,LTD
 
-OUI:00181B*
- ID_OUI_FROM_DATABASE=TaiJin Metal Co., Ltd.
+OUI:00122D*
+ ID_OUI_FROM_DATABASE=SiNett Corporation
 
-OUI:001814*
- ID_OUI_FROM_DATABASE=Mitutoyo Corporation
+OUI:001232*
+ ID_OUI_FROM_DATABASE=LeWiz Communications Inc.
 
-OUI:001819*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0011C5*
+ ID_OUI_FROM_DATABASE=TEN Technology
 
-OUI:001820*
- ID_OUI_FROM_DATABASE=w5networks
+OUI:0011C8*
+ ID_OUI_FROM_DATABASE=Powercom Co., Ltd.
 
-OUI:001808*
- ID_OUI_FROM_DATABASE=SightLogix, Inc.
+OUI:0011CD*
+ ID_OUI_FROM_DATABASE=Axsun Technologies
 
-OUI:00180D*
- ID_OUI_FROM_DATABASE=Terabytes Server Storage Tech Corp
+OUI:0011C6*
+ ID_OUI_FROM_DATABASE=Seagate Technology
 
-OUI:001803*
- ID_OUI_FROM_DATABASE=ArcSoft Shanghai Co. LTD
+OUI:0011B4*
+ ID_OUI_FROM_DATABASE=Westermo Teleindustri AB
 
-OUI:0017F0*
- ID_OUI_FROM_DATABASE=SZCOM Broadband Network Technology Co.,Ltd
+OUI:0011B9*
+ ID_OUI_FROM_DATABASE=Inner Range Pty. Ltd.
 
-OUI:0017F7*
- ID_OUI_FROM_DATABASE=CEM Solutions Pvt Ltd
+OUI:0011C0*
+ ID_OUI_FROM_DATABASE=Aday Technology Inc
 
-OUI:0017FE*
- ID_OUI_FROM_DATABASE=TALOS SYSTEM INC.
+OUI:0011B3*
+ ID_OUI_FROM_DATABASE=YOSHIMIYA CO.,LTD.
 
-OUI:0017D8*
- ID_OUI_FROM_DATABASE=Magnum Semiconductor, Inc.
+OUI:0011AD*
+ ID_OUI_FROM_DATABASE=Shanghai Ruijie Technology
 
-OUI:0017DD*
- ID_OUI_FROM_DATABASE=Clipsal Australia
+OUI:001138*
+ ID_OUI_FROM_DATABASE=TAISHIN CO., LTD.
 
-OUI:0017DF*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00113F*
+ ID_OUI_FROM_DATABASE=Alcatel DI
 
-OUI:0018C6*
- ID_OUI_FROM_DATABASE=OPW Fuel Management Systems
+OUI:001133*
+ ID_OUI_FROM_DATABASE=Siemens Austria SIMEA
 
-OUI:0018CB*
- ID_OUI_FROM_DATABASE=Tecobest Technology Limited
+OUI:001132*
+ ID_OUI_FROM_DATABASE=Synology Incorporated
 
-OUI:0018BF*
- ID_OUI_FROM_DATABASE=Essence Technology Solution, Inc.
+OUI:001129*
+ ID_OUI_FROM_DATABASE=Paradise Datacom Ltd.
 
-OUI:0018BA*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00112E*
+ ID_OUI_FROM_DATABASE=CEICOM
 
-OUI:0018B8*
- ID_OUI_FROM_DATABASE=New Voice International AG
+OUI:001128*
+ ID_OUI_FROM_DATABASE=Streamit
 
-OUI:0018B3*
- ID_OUI_FROM_DATABASE=TEC WizHome Co., Ltd.
+OUI:001122*
+ ID_OUI_FROM_DATABASE=CIMSYS Inc
 
-OUI:0018AC*
- ID_OUI_FROM_DATABASE=Shanghai Jiao Da HISYS Technology Co. Ltd.
+OUI:001171*
+ ID_OUI_FROM_DATABASE=DEXTER Communications, Inc.
 
-OUI:0018A5*
- ID_OUI_FROM_DATABASE=ADigit Technologies Corp.
+OUI:00116A*
+ ID_OUI_FROM_DATABASE=Domo Ltd
 
-OUI:0018A7*
- ID_OUI_FROM_DATABASE=Yoggie Security Systems LTD.
+OUI:001160*
+ ID_OUI_FROM_DATABASE=ARTDIO Company Co., LTD
 
-OUI:001896*
- ID_OUI_FROM_DATABASE=Great Well Electronic LTD
+OUI:001154*
+ ID_OUI_FROM_DATABASE=Webpro Technologies Inc.
 
-OUI:00189B*
- ID_OUI_FROM_DATABASE=Thomson Inc.
+OUI:00114B*
+ ID_OUI_FROM_DATABASE=Francotyp-Postalia GmbH
 
-OUI:00179E*
- ID_OUI_FROM_DATABASE=Sirit Inc
+OUI:001145*
+ ID_OUI_FROM_DATABASE=ValuePoint Networks
 
-OUI:0017A3*
- ID_OUI_FROM_DATABASE=MIX s.r.l.
+OUI:0011A1*
+ ID_OUI_FROM_DATABASE=VISION NETWARE CO.,LTD
 
-OUI:0017A8*
- ID_OUI_FROM_DATABASE=EDM Corporation
+OUI:0011A6*
+ ID_OUI_FROM_DATABASE=Sypixx Networks
 
-OUI:001792*
- ID_OUI_FROM_DATABASE=Falcom Wireless Comunications Gmbh
+OUI:00119A*
+ ID_OUI_FROM_DATABASE=Alkeria srl
 
-OUI:001797*
- ID_OUI_FROM_DATABASE=Telsy Elettronica S.p.A.
+OUI:001190*
+ ID_OUI_FROM_DATABASE=Digital Design Corporation
 
-OUI:001799*
- ID_OUI_FROM_DATABASE=SmarTire Systems Inc.
+OUI:00118A*
+ ID_OUI_FROM_DATABASE=Viewtran Technology Limited
 
-OUI:00178B*
- ID_OUI_FROM_DATABASE=Teledyne Technologies Incorporated
+OUI:001194*
+ ID_OUI_FROM_DATABASE=Chi Mei Communication Systems, Inc.
 
-OUI:00177F*
- ID_OUI_FROM_DATABASE=Worldsmart Retech
+OUI:001189*
+ ID_OUI_FROM_DATABASE=Aerotech Inc
 
-OUI:001786*
- ID_OUI_FROM_DATABASE=wisembed
+OUI:001184*
+ ID_OUI_FROM_DATABASE=Humo Laboratory,Ltd.
 
-OUI:001877*
- ID_OUI_FROM_DATABASE=Amplex A/S
+OUI:00117D*
+ ID_OUI_FROM_DATABASE=ZMD America, Inc.
 
-OUI:00186B*
- ID_OUI_FROM_DATABASE=Sambu Communics CO., LTD.
+OUI:001178*
+ ID_OUI_FROM_DATABASE=Chiron Technology Ltd
 
-OUI:001870*
- ID_OUI_FROM_DATABASE=E28 Shanghai Limited
+OUI:001177*
+ ID_OUI_FROM_DATABASE=Coaxial Networks, Inc.
 
-OUI:001863*
- ID_OUI_FROM_DATABASE=Veritech Electronics Limited
+OUI:001223*
+ ID_OUI_FROM_DATABASE=Pixim
 
-OUI:001850*
- ID_OUI_FROM_DATABASE=Secfone Kft
+OUI:001228*
+ ID_OUI_FROM_DATABASE=Data Ltd.
 
-OUI:001855*
- ID_OUI_FROM_DATABASE=Aeromaritime Systembau GmbH
+OUI:001210*
+ ID_OUI_FROM_DATABASE=WideRay Corp
 
-OUI:001857*
- ID_OUI_FROM_DATABASE=Unilever R&D
+OUI:001215*
+ ID_OUI_FROM_DATABASE=iStor Networks, Inc.
 
-OUI:001849*
- ID_OUI_FROM_DATABASE=Pigeon Point Systems LLC
+OUI:001216*
+ ID_OUI_FROM_DATABASE=ICP Internet Communication Payment AG
 
-OUI:0017C7*
- ID_OUI_FROM_DATABASE=MARA Systems Consulting AB
+OUI:001209*
+ ID_OUI_FROM_DATABASE=Fastrax Ltd
 
-OUI:0017CE*
- ID_OUI_FROM_DATABASE=Screen Service Spa
+OUI:001204*
+ ID_OUI_FROM_DATABASE=u10 Networks, Inc.
 
-OUI:0017D3*
- ID_OUI_FROM_DATABASE=Etymotic Research, Inc.
+OUI:0011FD*
+ ID_OUI_FROM_DATABASE=KORG INC.
 
-OUI:0017BB*
- ID_OUI_FROM_DATABASE=Syrinx Industrial Electronics
+OUI:001203*
+ ID_OUI_FROM_DATABASE=ActivNetworks
 
-OUI:0017B4*
- ID_OUI_FROM_DATABASE=Remote Security Systems, LLC
+OUI:0011F3*
+ ID_OUI_FROM_DATABASE=NeoMedia Europe AG
 
-OUI:0017B6*
- ID_OUI_FROM_DATABASE=Aquantia
+OUI:0011E7*
+ ID_OUI_FROM_DATABASE=WORLDSAT - Texas de France
 
-OUI:0017AF*
- ID_OUI_FROM_DATABASE=Enermet
+OUI:0011EC*
+ ID_OUI_FROM_DATABASE=AVIX INC.
 
-OUI:0018E8*
- ID_OUI_FROM_DATABASE=Hacetron Corporation
+OUI:0011E0*
+ ID_OUI_FROM_DATABASE=U-MEDIA Communications, Inc.
 
-OUI:0018EF*
- ID_OUI_FROM_DATABASE=Escape Communications, Inc.
+OUI:0011DA*
+ ID_OUI_FROM_DATABASE=Vivaas Technology Inc.
 
-OUI:0018E3*
- ID_OUI_FROM_DATABASE=Visualgate Systems, Inc.
+OUI:0011D4*
+ ID_OUI_FROM_DATABASE=NetEnrich, Inc
 
-OUI:0018DC*
- ID_OUI_FROM_DATABASE=Prostar Co., Ltd.
+OUI:0011D9*
+ ID_OUI_FROM_DATABASE=TiVo
 
-OUI:0018E1*
- ID_OUI_FROM_DATABASE=Verkerk Service Systemen
+OUI:00111C*
+ ID_OUI_FROM_DATABASE=Pleora Technologies Inc.
 
-OUI:0018D0*
- ID_OUI_FROM_DATABASE=AtRoad,  A Trimble Company
+OUI:00110F*
+ ID_OUI_FROM_DATABASE=netplat,Inc.
 
-OUI:0018D5*
- ID_OUI_FROM_DATABASE=REIGNCOM
+OUI:001116*
+ ID_OUI_FROM_DATABASE=COTEAU VERT CO., LTD.
 
-OUI:0018A0*
- ID_OUI_FROM_DATABASE=Cierma Ascenseurs
+OUI:001109*
+ ID_OUI_FROM_DATABASE=Micro-Star International
 
-OUI:001883*
- ID_OUI_FROM_DATABASE=FORMOSA21 INC.
+OUI:001103*
+ ID_OUI_FROM_DATABASE=kawamura electric inc.
 
-OUI:00188A*
- ID_OUI_FROM_DATABASE=Infinova LLC
+OUI:000FFD*
+ ID_OUI_FROM_DATABASE=Glorytek Network Inc.
 
-OUI:00188F*
- ID_OUI_FROM_DATABASE=Montgomery Technology, Inc.
+OUI:000FEE*
+ ID_OUI_FROM_DATABASE=XTec, Incorporated
 
-OUI:00187C*
- ID_OUI_FROM_DATABASE=INTERCROSS, LLC
+OUI:001275*
+ ID_OUI_FROM_DATABASE=Sentilla Corporation
 
-OUI:00187E*
- ID_OUI_FROM_DATABASE=RGB Spectrum
+OUI:00126E*
+ ID_OUI_FROM_DATABASE=Seidel Elektronik GmbH Nfg.KG
 
-OUI:00164A*
- ID_OUI_FROM_DATABASE=Vibration Technology Limited
+OUI:001269*
+ ID_OUI_FROM_DATABASE=Value Electronics
 
-OUI:001644*
- ID_OUI_FROM_DATABASE=LITE-ON Technology Corp.
+OUI:00125C*
+ ID_OUI_FROM_DATABASE=Green Hills Software, Inc.
 
-OUI:001645*
- ID_OUI_FROM_DATABASE=Power Distribution, Inc.
+OUI:000F15*
+ ID_OUI_FROM_DATABASE=Kjaerulff1 A/S
 
-OUI:00163B*
- ID_OUI_FROM_DATABASE=VertexRSI/General Dynamics
+OUI:000F1A*
+ ID_OUI_FROM_DATABASE=Gaming Support B.V.
 
-OUI:001640*
- ID_OUI_FROM_DATABASE=Asmobile Communication Inc.
+OUI:000F0E*
+ ID_OUI_FROM_DATABASE=WaveSplitter Technologies, Inc.
 
-OUI:00163A*
- ID_OUI_FROM_DATABASE=YVES TECHNOLOGY CO., LTD.
+OUI:000F08*
+ ID_OUI_FROM_DATABASE=Indagon Oy
 
-OUI:001634*
- ID_OUI_FROM_DATABASE=Mathtech, Inc.
+OUI:000F07*
+ ID_OUI_FROM_DATABASE=Mangrove Systems, Inc.
 
-OUI:00162D*
- ID_OUI_FROM_DATABASE=STNet Co., Ltd.
+OUI:000F02*
+ ID_OUI_FROM_DATABASE=Digicube Technology Co., Ltd
 
-OUI:001621*
- ID_OUI_FROM_DATABASE=Colorado Vnet
+OUI:000EFB*
+ ID_OUI_FROM_DATABASE=Macey Enterprises
 
-OUI:00161A*
- ID_OUI_FROM_DATABASE=Dametric AB
+OUI:000EF5*
+ ID_OUI_FROM_DATABASE=iPAC Technology Co., Ltd.
 
-OUI:001615*
- ID_OUI_FROM_DATABASE=Nittan Company, Limited
+OUI:000EF6*
+ ID_OUI_FROM_DATABASE=E-TEN Information Systems Co., Ltd.
 
-OUI:0016C4*
- ID_OUI_FROM_DATABASE=SiRF Technology, Inc.
+OUI:000E8A*
+ ID_OUI_FROM_DATABASE=Avara Technologies Pty. Ltd.
 
-OUI:0016C6*
- ID_OUI_FROM_DATABASE=North Atlantic Industries
+OUI:000E83*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0016D2*
- ID_OUI_FROM_DATABASE=Caspian
+OUI:000E73*
+ ID_OUI_FROM_DATABASE=Tpack A/S
 
-OUI:0016BF*
- ID_OUI_FROM_DATABASE=PaloDEx Group Oy
+OUI:000E7D*
+ ID_OUI_FROM_DATABASE=Electronics Line 3000 Ltd.
 
-OUI:0016B3*
- ID_OUI_FROM_DATABASE=Photonicbridges (China) Co., Ltd.
+OUI:000E77*
+ ID_OUI_FROM_DATABASE=Decru, Inc.
 
-OUI:0016AC*
- ID_OUI_FROM_DATABASE=Toho Technology Corp.
+OUI:000E7E*
+ ID_OUI_FROM_DATABASE=ionSign Oy
 
-OUI:0016B1*
- ID_OUI_FROM_DATABASE=KBS
+OUI:000E6F*
+ ID_OUI_FROM_DATABASE=IRIS Corporation Berhad
 
-OUI:0016A7*
- ID_OUI_FROM_DATABASE=AWETA G&P
+OUI:000E6A*
+ ID_OUI_FROM_DATABASE=3Com Ltd
 
-OUI:001724*
- ID_OUI_FROM_DATABASE=Studer Professional Audio GmbH
+OUI:000E69*
+ ID_OUI_FROM_DATABASE=China Electric Power Research Institute
 
-OUI:001718*
- ID_OUI_FROM_DATABASE=Vansco Electronics Oy
+OUI:000E63*
+ ID_OUI_FROM_DATABASE=Lemke Diagnostics GmbH
 
-OUI:00171D*
- ID_OUI_FROM_DATABASE=DIGIT
+OUI:000EBC*
+ ID_OUI_FROM_DATABASE=Paragon Fidelity GmbH
 
-OUI:001711*
- ID_OUI_FROM_DATABASE=GE Healthcare Bio-Sciences AB
+OUI:000EB0*
+ ID_OUI_FROM_DATABASE=Solutions Radio BV
 
-OUI:00170C*
- ID_OUI_FROM_DATABASE=Twig Com Ltd.
+OUI:000EB5*
+ ID_OUI_FROM_DATABASE=Ecastle Electronics Co., Ltd.
 
-OUI:001707*
- ID_OUI_FROM_DATABASE=InGrid, Inc
+OUI:000EAF*
+ ID_OUI_FROM_DATABASE=CASTEL
 
-OUI:001702*
- ID_OUI_FROM_DATABASE=Osung Midicom Co., Ltd
+OUI:000EA9*
+ ID_OUI_FROM_DATABASE=Shanghai Xun Shi Communications Equipment Ltd. Co.
 
-OUI:001744*
- ID_OUI_FROM_DATABASE=Araneo Ltd.
+OUI:000E9D*
+ ID_OUI_FROM_DATABASE=Tiscali UK Ltd
 
-OUI:00173C*
- ID_OUI_FROM_DATABASE=Extreme Engineering Solutions
+OUI:000EA2*
+ ID_OUI_FROM_DATABASE=McAfee, Inc
 
-OUI:001737*
- ID_OUI_FROM_DATABASE=Industrie Dial Face S.p.A.
+OUI:000E90*
+ ID_OUI_FROM_DATABASE=PONICO CORP.
 
-OUI:00172B*
- ID_OUI_FROM_DATABASE=Global Technologies Inc.
+OUI:000E8F*
+ ID_OUI_FROM_DATABASE=Sercomm Corp.
 
-OUI:001730*
- ID_OUI_FROM_DATABASE=Automation Electronics
+OUI:000E96*
+ ID_OUI_FROM_DATABASE=Cubic Defense Applications, Inc.
 
-OUI:001729*
- ID_OUI_FROM_DATABASE=Ubicod Co.LTD
+OUI:000F4E*
+ ID_OUI_FROM_DATABASE=Cellink
 
-OUI:00169B*
- ID_OUI_FROM_DATABASE=Alstom Transport
+OUI:000F41*
+ ID_OUI_FROM_DATABASE=Zipher Ltd
 
-OUI:0016A2*
- ID_OUI_FROM_DATABASE=CentraLite Systems, Inc.
+OUI:000F48*
+ ID_OUI_FROM_DATABASE=Polypix Inc.
 
-OUI:001696*
- ID_OUI_FROM_DATABASE=QDI Technology (H.K.) Limited
+OUI:000F4D*
+ ID_OUI_FROM_DATABASE=TalkSwitch
 
-OUI:001688*
- ID_OUI_FROM_DATABASE=ServerEngines LLC
+OUI:000F39*
+ ID_OUI_FROM_DATABASE=IRIS SENSORS
 
-OUI:00168A*
- ID_OUI_FROM_DATABASE=id-Confirm Inc
+OUI:000F3C*
+ ID_OUI_FROM_DATABASE=Endeleo Limited
 
-OUI:001683*
- ID_OUI_FROM_DATABASE=WEBIO International Co.,.Ltd.
+OUI:000F34*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00167C*
- ID_OUI_FROM_DATABASE=iRex Technologies BV
+OUI:000F2D*
+ ID_OUI_FROM_DATABASE=CHUNG-HSIN ELECTRIC & MACHINERY MFG.CORP.
 
-OUI:001610*
- ID_OUI_FROM_DATABASE=Carina Technology
+OUI:000F27*
+ ID_OUI_FROM_DATABASE=TEAL Electronics, Inc.
 
-OUI:00160B*
- ID_OUI_FROM_DATABASE=TVWorks LLC
+OUI:000F28*
+ ID_OUI_FROM_DATABASE=Itronix Corporation
 
-OUI:001604*
- ID_OUI_FROM_DATABASE=Sigpro
+OUI:000F21*
+ ID_OUI_FROM_DATABASE=Scientific Atlanta, Inc
 
-OUI:0015FE*
- ID_OUI_FROM_DATABASE=SCHILLING ROBOTICS LLC
+OUI:000EEF*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:0015FD*
- ID_OUI_FROM_DATABASE=Complete Media Systems
+OUI:000EDC*
+ ID_OUI_FROM_DATABASE=Tellion INC.
 
-OUI:0015F8*
- ID_OUI_FROM_DATABASE=Kingtronics Industrial Co. Ltd.
+OUI:000EE3*
+ ID_OUI_FROM_DATABASE=Chiyu Technology Co.,Ltd
 
-OUI:0015EC*
- ID_OUI_FROM_DATABASE=Boca Devices LLC
+OUI:000EC8*
+ ID_OUI_FROM_DATABASE=Zoran Corporation
 
-OUI:0015F1*
- ID_OUI_FROM_DATABASE=KYLINK Communications Corp.
+OUI:000ECF*
+ ID_OUI_FROM_DATABASE=PROFIBUS Nutzerorganisation e.V.
 
-OUI:001677*
- ID_OUI_FROM_DATABASE=Bihl + Wiedemann GmbH
+OUI:000ED4*
+ ID_OUI_FROM_DATABASE=CRESITT INDUSTRIE
 
-OUI:001670*
- ID_OUI_FROM_DATABASE=SKNET Corporation
+OUI:000EC2*
+ ID_OUI_FROM_DATABASE=Lowrance Electronics, Inc.
 
-OUI:001664*
- ID_OUI_FROM_DATABASE=Prod-El SpA
+OUI:000EC1*
+ ID_OUI_FROM_DATABASE=MYNAH Technologies
 
-OUI:001669*
- ID_OUI_FROM_DATABASE=MRV Communication (Networks) LTD
+OUI:000F92*
+ ID_OUI_FROM_DATABASE=Microhard Systems Inc.
 
-OUI:00165D*
- ID_OUI_FROM_DATABASE=AirDefense, Inc.
+OUI:000F99*
+ ID_OUI_FROM_DATABASE=APAC opto Electronics Inc.
 
-OUI:001651*
- ID_OUI_FROM_DATABASE=Exeo Systems
+OUI:000F8D*
+ ID_OUI_FROM_DATABASE=FAST TV-Server AG
 
-OUI:0015E5*
- ID_OUI_FROM_DATABASE=Cheertek Inc.
+OUI:000F80*
+ ID_OUI_FROM_DATABASE=Trinity Security Systems,Inc.
 
-OUI:0015DB*
- ID_OUI_FROM_DATABASE=Canesta Inc.
+OUI:000F7F*
+ ID_OUI_FROM_DATABASE=UBSTORAGE Co.,Ltd.
 
-OUI:0015D4*
- ID_OUI_FROM_DATABASE=Emitor AB
+OUI:000FC9*
+ ID_OUI_FROM_DATABASE=Allnet GmbH
 
-OUI:0015C8*
- ID_OUI_FROM_DATABASE=FlexiPanel Ltd
+OUI:000FBC*
+ ID_OUI_FROM_DATABASE=Onkey Technologies, Inc.
 
-OUI:0015C3*
- ID_OUI_FROM_DATABASE=Ruf Telematik AG
+OUI:000FBB*
+ ID_OUI_FROM_DATABASE=Nokia Siemens Networks GmbH & Co. KG.
 
-OUI:0015C2*
- ID_OUI_FROM_DATABASE=3M Germany
+OUI:000FB6*
+ ID_OUI_FROM_DATABASE=Europlex Technologies
 
-OUI:0015BE*
- ID_OUI_FROM_DATABASE=Iqua Ltd.
+OUI:000FA9*
+ ID_OUI_FROM_DATABASE=PC Fabrik
 
-OUI:0016EF*
- ID_OUI_FROM_DATABASE=Koko Fitness, Inc.
+OUI:000FAA*
+ ID_OUI_FROM_DATABASE=Nexus Technologies
 
-OUI:0016F4*
- ID_OUI_FROM_DATABASE=Eidicom Co., Ltd.
+OUI:000FAF*
+ ID_OUI_FROM_DATABASE=Dialog Inc.
 
-OUI:0016E8*
- ID_OUI_FROM_DATABASE=Sigma Designs, Inc.
+OUI:000FE8*
+ ID_OUI_FROM_DATABASE=Lobos, Inc.
 
-OUI:0016ED*
- ID_OUI_FROM_DATABASE=Digital Safety Technologies, Inc
+OUI:000FED*
+ ID_OUI_FROM_DATABASE=Anam Electronics Co., Ltd
 
-OUI:0016DC*
- ID_OUI_FROM_DATABASE=ARCHOS
+OUI:000FDC*
+ ID_OUI_FROM_DATABASE=Ueda Japan  Radio Co., Ltd.
 
-OUI:0016E1*
- ID_OUI_FROM_DATABASE=SiliconStor, Inc.
+OUI:000FE1*
+ ID_OUI_FROM_DATABASE=ID DIGITAL CORPORATION
 
-OUI:0016D7*
- ID_OUI_FROM_DATABASE=Sunways AG
+OUI:000FD5*
+ ID_OUI_FROM_DATABASE=Schwechat - RISE
 
-OUI:0014CB*
- ID_OUI_FROM_DATABASE=LifeSync Corporation
+OUI:000FCE*
+ ID_OUI_FROM_DATABASE=Kikusui Electronics Corp.
 
-OUI:0014D0*
- ID_OUI_FROM_DATABASE=BTI Systems Inc.
+OUI:000F73*
+ ID_OUI_FROM_DATABASE=RS Automation Co., Ltd
 
-OUI:0014C4*
- ID_OUI_FROM_DATABASE=Vitelcom Mobile Technology
+OUI:000F7A*
+ ID_OUI_FROM_DATABASE=BeiJing NuQX Technology CO.,LTD
 
-OUI:0014BE*
- ID_OUI_FROM_DATABASE=Wink communication technology CO.LTD
+OUI:000F6D*
+ ID_OUI_FROM_DATABASE=Midas Engineering
 
-OUI:0014BD*
- ID_OUI_FROM_DATABASE=incNETWORKS, Inc
+OUI:000F67*
+ ID_OUI_FROM_DATABASE=West Instruments
 
-OUI:0014B8*
- ID_OUI_FROM_DATABASE=Hill-Rom
+OUI:000F6E*
+ ID_OUI_FROM_DATABASE=BBox
 
-OUI:0014AE*
- ID_OUI_FROM_DATABASE=Wizlogics Co., Ltd.
+OUI:000F60*
+ ID_OUI_FROM_DATABASE=Lifetron Co.,Ltd
 
-OUI:0014B3*
- ID_OUI_FROM_DATABASE=CoreStar International Corp
+OUI:000F5B*
+ ID_OUI_FROM_DATABASE=Delta Information Systems, Inc.
 
-OUI:00149B*
- ID_OUI_FROM_DATABASE=Nokota Communications, LLC
+OUI:000F54*
+ ID_OUI_FROM_DATABASE=Entrelogic Corporation
 
-OUI:00143F*
- ID_OUI_FROM_DATABASE=Hotway Technology Corporation
+OUI:000D75*
+ ID_OUI_FROM_DATABASE=Kobian Pte Ltd - Taiwan Branch
 
-OUI:001431*
- ID_OUI_FROM_DATABASE=PDL Electronics Ltd
+OUI:000D7C*
+ ID_OUI_FROM_DATABASE=Codian Ltd
 
-OUI:001433*
- ID_OUI_FROM_DATABASE=Empower Technologies(Canada) Inc.
+OUI:000D6F*
+ ID_OUI_FROM_DATABASE=Ember Corporation
 
-OUI:001432*
- ID_OUI_FROM_DATABASE=Tarallax Wireless, Inc.
+OUI:000D69*
+ ID_OUI_FROM_DATABASE=TMT&D Corporation
 
-OUI:00142C*
- ID_OUI_FROM_DATABASE=Koncept International, Inc.
+OUI:000D70*
+ ID_OUI_FROM_DATABASE=Datamax Corporation
 
-OUI:001425*
- ID_OUI_FROM_DATABASE=Galactic Computing Corp.
+OUI:000D5D*
+ ID_OUI_FROM_DATABASE=Raritan Computer, Inc
 
-OUI:001420*
- ID_OUI_FROM_DATABASE=G-Links networking company
+OUI:000D62*
+ ID_OUI_FROM_DATABASE=Funkwerk Dabendorf GmbH
 
-OUI:00141B*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000D50*
+ ID_OUI_FROM_DATABASE=Galazar Networks
 
-OUI:00146D*
- ID_OUI_FROM_DATABASE=RF Technologies
+OUI:000D4A*
+ ID_OUI_FROM_DATABASE=Steag ETA-Optik
 
-OUI:00146F*
- ID_OUI_FROM_DATABASE=Kohler Co
+OUI:000DAB*
+ ID_OUI_FROM_DATABASE=Parker Hannifin GmbH Electromechanical Division Europe
 
-OUI:00146E*
- ID_OUI_FROM_DATABASE=H. Stoll GmbH & Co. KG
+OUI:000DA7*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:001468*
- ID_OUI_FROM_DATABASE=CelPlan International, Inc.
+OUI:000DA1*
+ ID_OUI_FROM_DATABASE=MIRAE ITS Co.,LTD.
 
-OUI:001461*
- ID_OUI_FROM_DATABASE=CORONA CORPORATION
+OUI:000DA2*
+ ID_OUI_FROM_DATABASE=Infrant Technologies, Inc.
 
-OUI:00145C*
- ID_OUI_FROM_DATABASE=Intronics B.V.
+OUI:000D9B*
+ ID_OUI_FROM_DATABASE=Heraeus Electro-Nite International N.V.
 
-OUI:001455*
- ID_OUI_FROM_DATABASE=Coder Electronics Corporation
+OUI:000D8F*
+ ID_OUI_FROM_DATABASE=King Tsushin Kogyo Co., LTD.
 
-OUI:001444*
- ID_OUI_FROM_DATABASE=Grundfos Holding
+OUI:000D94*
+ ID_OUI_FROM_DATABASE=AFAR Communications,Inc
 
-OUI:00144B*
- ID_OUI_FROM_DATABASE=Hifn, Inc.
+OUI:000D82*
+ ID_OUI_FROM_DATABASE=PHS srl
 
-OUI:001589*
- ID_OUI_FROM_DATABASE=D-MAX Technology Co.,Ltd
+OUI:000D81*
+ ID_OUI_FROM_DATABASE=Pepperl+Fuchs GmbH
 
-OUI:001582*
- ID_OUI_FROM_DATABASE=Pulse Eight Limited
+OUI:000DCE*
+ ID_OUI_FROM_DATABASE=Dynavac Technology Pte Ltd
 
-OUI:00157C*
- ID_OUI_FROM_DATABASE=Dave Networks, Inc.
+OUI:000DC8*
+ ID_OUI_FROM_DATABASE=AirMagnet, Inc
 
-OUI:001578*
- ID_OUI_FROM_DATABASE=Audio / Video Innovations
+OUI:000DC2*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:001573*
- ID_OUI_FROM_DATABASE=NewSoft  Technology Corporation
+OUI:000DC7*
+ ID_OUI_FROM_DATABASE=COSMIC ENGINEERING INC.
 
-OUI:00156C*
- ID_OUI_FROM_DATABASE=SANE SYSTEM CO., LTD
+OUI:000DBB*
+ ID_OUI_FROM_DATABASE=Nippon Dentsu Co.,Ltd.
 
-OUI:001571*
- ID_OUI_FROM_DATABASE=Nolan Systems
+OUI:000DB5*
+ ID_OUI_FROM_DATABASE=GLOBALSAT TECHNOLOGY CORPORATION
 
-OUI:001572*
- ID_OUI_FROM_DATABASE=Red-Lemon
+OUI:000DAF*
+ ID_OUI_FROM_DATABASE=Plexus Corp (UK) Ltd
 
-OUI:001565*
- ID_OUI_FROM_DATABASE=XIAMEN YEALINK NETWORK TECHNOLOGY CO.,LTD
+OUI:000D29*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001559*
- ID_OUI_FROM_DATABASE=Securaplane Technologies, Inc.
+OUI:000D23*
+ ID_OUI_FROM_DATABASE=Smart Solution, Inc
 
-OUI:0014A2*
- ID_OUI_FROM_DATABASE=Core Micro Systems Inc.
+OUI:000D17*
+ ID_OUI_FROM_DATABASE=Turbo Networks Co.Ltd
 
-OUI:001494*
- ID_OUI_FROM_DATABASE=ESU AG
+OUI:000D1C*
+ ID_OUI_FROM_DATABASE=Amesys Defense
 
-OUI:00148F*
- ID_OUI_FROM_DATABASE=Protronic (Far East) Ltd.
+OUI:000D0A*
+ ID_OUI_FROM_DATABASE=Projectiondesign as
 
-OUI:001488*
- ID_OUI_FROM_DATABASE=Akorri
+OUI:000D09*
+ ID_OUI_FROM_DATABASE=Yuehua(Zhuhai) Electronic CO. LTD
 
-OUI:001483*
- ID_OUI_FROM_DATABASE=eXS Inc.
+OUI:000D10*
+ ID_OUI_FROM_DATABASE=Embedtronics Oy
 
-OUI:001480*
- ID_OUI_FROM_DATABASE=Hitachi-LG Data Storage Korea, Inc
+OUI:000D04*
+ ID_OUI_FROM_DATABASE=Foxboro Eckardt Development GmbH
 
-OUI:00147B*
- ID_OUI_FROM_DATABASE=Iteris, Inc.
+OUI:000CFD*
+ ID_OUI_FROM_DATABASE=Hyundai ImageQuest Co.,Ltd.
 
-OUI:001474*
- ID_OUI_FROM_DATABASE=K40 Electronics
+OUI:000D4F*
+ ID_OUI_FROM_DATABASE=Kenwood Corporation
 
-OUI:0015B8*
- ID_OUI_FROM_DATABASE=Tahoe
+OUI:000D46*
+ ID_OUI_FROM_DATABASE=Parker SSD Drives
 
-OUI:0015B2*
- ID_OUI_FROM_DATABASE=Advanced Industrial Computer, Inc.
+OUI:000D42*
+ ID_OUI_FROM_DATABASE=Newbest Development Limited
 
-OUI:0015AE*
- ID_OUI_FROM_DATABASE=kyung il
+OUI:000D3C*
+ ID_OUI_FROM_DATABASE=i.Tech Dynamic Ltd
 
-OUI:0015AD*
- ID_OUI_FROM_DATABASE=Accedian Networks
+OUI:000D36*
+ ID_OUI_FROM_DATABASE=Wu Han Routon Electronic Co., Ltd
 
-OUI:00E0A8*
- ID_OUI_FROM_DATABASE=SAT GmbH & Co.
+OUI:000D3B*
+ ID_OUI_FROM_DATABASE=Microelectronics Technology Inc.
 
-OUI:0015A1*
- ID_OUI_FROM_DATABASE=ECA-SINTERS
+OUI:000D2A*
+ ID_OUI_FROM_DATABASE=Scanmatic AS
 
-OUI:00159C*
- ID_OUI_FROM_DATABASE=B-KYUNG SYSTEM Co.,Ltd.
+OUI:000D2F*
+ ID_OUI_FROM_DATABASE=AIN Comm.Tech.Co., LTD
 
-OUI:001595*
- ID_OUI_FROM_DATABASE=Quester Tangent Corporation
+OUI:000DFA*
+ ID_OUI_FROM_DATABASE=Micro Control Systems Ltd.
 
-OUI:00158E*
- ID_OUI_FROM_DATABASE=Plustek.INC
+OUI:000DF4*
+ ID_OUI_FROM_DATABASE=Watertek Co.
 
-OUI:001552*
- ID_OUI_FROM_DATABASE=Wi-Gear Inc.
+OUI:000DF9*
+ ID_OUI_FROM_DATABASE=NDS Limited
 
-OUI:001548*
- ID_OUI_FROM_DATABASE=CUBE TECHNOLOGIES
+OUI:000E00*
+ ID_OUI_FROM_DATABASE=Atrie
 
-OUI:00154D*
- ID_OUI_FROM_DATABASE=Netronome Systems, Inc.
+OUI:000DE7*
+ ID_OUI_FROM_DATABASE=Snap-on OEM Group
 
-OUI:00153C*
- ID_OUI_FROM_DATABASE=Kprotech Co., Ltd.
+OUI:000DE8*
+ ID_OUI_FROM_DATABASE=Nasaco Electronics Pte. Ltd
 
-OUI:001543*
- ID_OUI_FROM_DATABASE=Aberdeen Test Center
+OUI:000DED*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001535*
- ID_OUI_FROM_DATABASE=OTE Spa
+OUI:000DE1*
+ ID_OUI_FROM_DATABASE=Control Products, Inc.
 
-OUI:001537*
- ID_OUI_FROM_DATABASE=Ventus Networks
+OUI:000DD5*
+ ID_OUI_FROM_DATABASE=O'RITE TECHNOLOGY CO.,LTD
 
-OUI:001536*
- ID_OUI_FROM_DATABASE=Powertech co.,Ltd
+OUI:000DDA*
+ ID_OUI_FROM_DATABASE=ALLIED TELESIS K.K.
 
-OUI:001530*
- ID_OUI_FROM_DATABASE=EMC Corporation
+OUI:000E20*
+ ID_OUI_FROM_DATABASE=ACCESS Systems Americas, Inc.
 
-OUI:001529*
- ID_OUI_FROM_DATABASE=N3 Corporation
+OUI:000E27*
+ ID_OUI_FROM_DATABASE=Crere Networks, Inc.
 
-OUI:0014F9*
- ID_OUI_FROM_DATABASE=Vantage Controls
+OUI:000E14*
+ ID_OUI_FROM_DATABASE=Visionary Solutions, Inc.
 
-OUI:0014FB*
- ID_OUI_FROM_DATABASE=Technical Solutions Inc.
+OUI:000E1B*
+ ID_OUI_FROM_DATABASE=IAV GmbH
 
-OUI:0014FA*
- ID_OUI_FROM_DATABASE=AsGa S.A.
+OUI:000E57*
+ ID_OUI_FROM_DATABASE=Iworld Networking, Inc.
 
-OUI:0014F4*
- ID_OUI_FROM_DATABASE=DekTec Digital Video B.V.
+OUI:000E50*
+ ID_OUI_FROM_DATABASE=Thomson Telecom Belgium
 
-OUI:0014ED*
- ID_OUI_FROM_DATABASE=Airak, Inc.
+OUI:000E4A*
+ ID_OUI_FROM_DATABASE=Changchun Huayu WEBPAD Co.,LTD
 
-OUI:0014DE*
- ID_OUI_FROM_DATABASE=Sage Instruments Inc.
+OUI:000E49*
+ ID_OUI_FROM_DATABASE=Forsway Scandinavia AB
 
-OUI:0014E3*
- ID_OUI_FROM_DATABASE=mm-lab GmbH
+OUI:000E3D*
+ ID_OUI_FROM_DATABASE=Televic N.V.
 
-OUI:0014D7*
- ID_OUI_FROM_DATABASE=Datastore Technology Corp
+OUI:000E44*
+ ID_OUI_FROM_DATABASE=Digital 5, Inc.
 
-OUI:001524*
- ID_OUI_FROM_DATABASE=Numatics, Inc.
+OUI:000E33*
+ ID_OUI_FROM_DATABASE=Shuko Electronics Co.,Ltd
 
-OUI:00151D*
- ID_OUI_FROM_DATABASE=M2I CORPORATION
+OUI:000E3A*
+ ID_OUI_FROM_DATABASE=Cirrus Logic
 
-OUI:001513*
- ID_OUI_FROM_DATABASE=EFS sas
+OUI:000E2D*
+ ID_OUI_FROM_DATABASE=Hyundai Digital Technology Co.,Ltd.
 
-OUI:001507*
- ID_OUI_FROM_DATABASE=Renaissance Learning Inc
+OUI:000CEA*
+ ID_OUI_FROM_DATABASE=aphona Kommunikationssysteme
 
-OUI:00129E*
- ID_OUI_FROM_DATABASE=Surf Communications Inc.
+OUI:000CD9*
+ ID_OUI_FROM_DATABASE=Itcare Co., Ltd
 
-OUI:001297*
- ID_OUI_FROM_DATABASE=O2Micro, Inc.
+OUI:000CD3*
+ ID_OUI_FROM_DATABASE=Prettl Elektronik Radeberg GmbH
 
-OUI:001298*
- ID_OUI_FROM_DATABASE=MICO ELECTRIC(SHENZHEN) LIMITED
+OUI:000CDA*
+ ID_OUI_FROM_DATABASE=FreeHand Systems, Inc.
 
-OUI:00128D*
- ID_OUI_FROM_DATABASE=STB Datenservice GmbH
+OUI:000CDF*
+ ID_OUI_FROM_DATABASE=PULNiX America, Inc
 
-OUI:00128E*
- ID_OUI_FROM_DATABASE=Q-Free ASA
+OUI:000CC7*
+ ID_OUI_FROM_DATABASE=Intelligent Computer Solutions Inc.
 
-OUI:001292*
- ID_OUI_FROM_DATABASE=Griffin Technology
+OUI:000CCC*
+ ID_OUI_FROM_DATABASE=Aeroscout Ltd.
 
-OUI:00127C*
- ID_OUI_FROM_DATABASE=SWEGON AB
+OUI:000C13*
+ ID_OUI_FROM_DATABASE=MediaQ
 
-OUI:001281*
- ID_OUI_FROM_DATABASE=March Networks S.p.A.
+OUI:000C05*
+ ID_OUI_FROM_DATABASE=RPA Reserch Co., Ltd.
 
-OUI:00127B*
- ID_OUI_FROM_DATABASE=VIA Networking Technologies, Inc.
+OUI:000C0C*
+ ID_OUI_FROM_DATABASE=APPRO TECHNOLOGY INC.
 
-OUI:001327*
- ID_OUI_FROM_DATABASE=Data Acquisitions limited
+OUI:000BF4*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:00131D*
- ID_OUI_FROM_DATABASE=Scanvaegt International A/S
+OUI:000BF9*
+ ID_OUI_FROM_DATABASE=Gemstone Communications, Inc.
 
-OUI:001322*
- ID_OUI_FROM_DATABASE=DAQ Electronics, Inc.
+OUI:000C00*
+ ID_OUI_FROM_DATABASE=BEB Industrie-Elektronik AG
 
-OUI:001316*
- ID_OUI_FROM_DATABASE=L-S-B Broadcast Technologies GmbH
+OUI:000BF3*
+ ID_OUI_FROM_DATABASE=BAE SYSTEMS
 
-OUI:00130F*
- ID_OUI_FROM_DATABASE=EGEMEN Bilgisayar Muh San ve Tic LTD STI
+OUI:000C63*
+ ID_OUI_FROM_DATABASE=Zenith Electronics Corporation
 
-OUI:0012F7*
- ID_OUI_FROM_DATABASE=Xiamen Xinglian Electronics Co., Ltd.
+OUI:000C68*
+ ID_OUI_FROM_DATABASE=SigmaTel, Inc.
 
-OUI:0012FE*
- ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd.
+OUI:000C6F*
+ ID_OUI_FROM_DATABASE=Amtek system co.,LTD.
 
-OUI:001303*
- ID_OUI_FROM_DATABASE=GateConnect
+OUI:000C50*
+ ID_OUI_FROM_DATABASE=Seagate Technology
 
-OUI:0012FD*
- ID_OUI_FROM_DATABASE=OPTIMUS IC S.A.
+OUI:000C55*
+ ID_OUI_FROM_DATABASE=Microlink Communications Inc.
 
-OUI:00140F*
- ID_OUI_FROM_DATABASE=Federal State Unitary Enterprise Leningrad R&D Institute of
+OUI:000C5C*
+ ID_OUI_FROM_DATABASE=GTN Systems B.V.
 
-OUI:001416*
- ID_OUI_FROM_DATABASE=Scosche Industries, Inc.
+OUI:000C61*
+ ID_OUI_FROM_DATABASE=AC Tech corporation DBA Advanced Digital
 
-OUI:001406*
- ID_OUI_FROM_DATABASE=Go Networks
+OUI:000CBA*
+ ID_OUI_FROM_DATABASE=Jamex, Inc.
 
-OUI:001407*
- ID_OUI_FROM_DATABASE=Sperian Protection Instrumentation
+OUI:000CB9*
+ ID_OUI_FROM_DATABASE=LEA
 
-OUI:00140C*
- ID_OUI_FROM_DATABASE=GKB CCTV CO., LTD.
+OUI:000CC0*
+ ID_OUI_FROM_DATABASE=Genera Oy
 
-OUI:0013FF*
- ID_OUI_FROM_DATABASE=Dage-MTI of MC, Inc.
+OUI:000CB4*
+ ID_OUI_FROM_DATABASE=AutoCell Laboratories, Inc.
 
-OUI:001400*
- ID_OUI_FROM_DATABASE=MINERVA KOREA CO., LTD
+OUI:000C34*
+ ID_OUI_FROM_DATABASE=Vixen Co., Ltd.
 
-OUI:0013FA*
- ID_OUI_FROM_DATABASE=LifeSize Communications, Inc
+OUI:000CA2*
+ ID_OUI_FROM_DATABASE=Harmonic Video Network
 
-OUI:0013F3*
- ID_OUI_FROM_DATABASE=Giga-byte Communications Inc.
+OUI:000CA7*
+ ID_OUI_FROM_DATABASE=Metro (Suzhou) Technologies Co., Ltd.
 
-OUI:0013EE*
- ID_OUI_FROM_DATABASE=JBX Designs Inc.
+OUI:000CA9*
+ ID_OUI_FROM_DATABASE=Ebtron Inc.
 
-OUI:0013ED*
- ID_OUI_FROM_DATABASE=PSIA
+OUI:000CAE*
+ ID_OUI_FROM_DATABASE=Ailocom Oy
 
-OUI:00135A*
- ID_OUI_FROM_DATABASE=Project T&E Limited
+OUI:000C42*
+ ID_OUI_FROM_DATABASE=Routerboard.com
 
-OUI:00135F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000C44*
+ ID_OUI_FROM_DATABASE=Automated Interfaces, Inc.
 
-OUI:001360*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000C39*
+ ID_OUI_FROM_DATABASE=Sentinel Wireless Inc.
 
-OUI:001352*
- ID_OUI_FROM_DATABASE=Naztec, Inc.
+OUI:000C3B*
+ ID_OUI_FROM_DATABASE=Orion Electric Co., Ltd.
 
-OUI:00134B*
- ID_OUI_FROM_DATABASE=ToGoldenNet Technology Inc.
+OUI:000C40*
+ ID_OUI_FROM_DATABASE=Altech Controls
 
-OUI:00134C*
- ID_OUI_FROM_DATABASE=YDT Technology International
+OUI:000C3A*
+ ID_OUI_FROM_DATABASE=Oxance
 
-OUI:00133A*
- ID_OUI_FROM_DATABASE=VadaTech Inc.
+OUI:000C2F*
+ ID_OUI_FROM_DATABASE=SeorimTechnology Co.,Ltd.
 
-OUI:00133F*
- ID_OUI_FROM_DATABASE=Eppendorf Instrumente GmbH
+OUI:000C31*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00132C*
- ID_OUI_FROM_DATABASE=MAZ Brandenburg GmbH
+OUI:000C2A*
+ ID_OUI_FROM_DATABASE=OCTTEL Communication Co., Ltd.
 
-OUI:001339*
- ID_OUI_FROM_DATABASE=CCV Deutschland GmbH
+OUI:000C27*
+ ID_OUI_FROM_DATABASE=Sammy Corporation
 
-OUI:0013AD*
- ID_OUI_FROM_DATABASE=Sendo Ltd
+OUI:000C18*
+ ID_OUI_FROM_DATABASE=Zenisu Keisoku Inc.
 
-OUI:0013B4*
- ID_OUI_FROM_DATABASE=Appear TV
+OUI:000C20*
+ ID_OUI_FROM_DATABASE=Fi WIn, Inc.
 
-OUI:0013A8*
- ID_OUI_FROM_DATABASE=Tanisys Technology
+OUI:000BED*
+ ID_OUI_FROM_DATABASE=ELM Inc.
 
-OUI:0013A7*
- ID_OUI_FROM_DATABASE=BATTELLE MEMORIAL INSTITUTE
+OUI:000BF2*
+ ID_OUI_FROM_DATABASE=Chih-Kan Technology Co., Ltd.
 
-OUI:0013A1*
- ID_OUI_FROM_DATABASE=Crow Electronic Engeneering
+OUI:000BE1*
+ ID_OUI_FROM_DATABASE=Nokia NET Product Operations
 
-OUI:00139A*
- ID_OUI_FROM_DATABASE=K-ubique ID Corp.
+OUI:000BE6*
+ ID_OUI_FROM_DATABASE=Datel Electronics
 
-OUI:001395*
- ID_OUI_FROM_DATABASE=congatec AG
+OUI:000BDA*
+ ID_OUI_FROM_DATABASE=EyeCross Co.,Inc.
 
-OUI:00138E*
- ID_OUI_FROM_DATABASE=FOAB Elektronik AB
+OUI:000BD1*
+ ID_OUI_FROM_DATABASE=Aeronix, Inc.
 
-OUI:001388*
- ID_OUI_FROM_DATABASE=WiMedia Alliance
+OUI:000BC5*
+ ID_OUI_FROM_DATABASE=SMC Networks, Inc.
 
-OUI:0013E4*
- ID_OUI_FROM_DATABASE=YANGJAE SYSTEMS CORP.
+OUI:000BCC*
+ ID_OUI_FROM_DATABASE=JUSAN, S.A.
 
-OUI:0013E9*
- ID_OUI_FROM_DATABASE=VeriWave, Inc.
+OUI:000BB9*
+ ID_OUI_FROM_DATABASE=Imsys AB
 
-OUI:0013E3*
- ID_OUI_FROM_DATABASE=CoVi Technologies, Inc.
+OUI:000BBE*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0013DD*
- ID_OUI_FROM_DATABASE=Abbott Diagnostics
+OUI:000BB2*
+ ID_OUI_FROM_DATABASE=SMALLBIG TECHNOLOGY
 
-OUI:0013D6*
- ID_OUI_FROM_DATABASE=TII NETWORK TECHNOLOGIES, INC.
+OUI:000BB7*
+ ID_OUI_FROM_DATABASE=Micro Systems Co.,Ltd.
 
-OUI:0013D1*
- ID_OUI_FROM_DATABASE=KIRK telecom A/S
+OUI:000C96*
+ ID_OUI_FROM_DATABASE=OQO, Inc.
 
-OUI:0013CA*
- ID_OUI_FROM_DATABASE=Pico Digital
+OUI:000C9B*
+ ID_OUI_FROM_DATABASE=EE Solutions, Inc
 
-OUI:0013C3*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000C8A*
+ ID_OUI_FROM_DATABASE=Bose Corporation
 
-OUI:0013C4*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000C8F*
+ ID_OUI_FROM_DATABASE=Nergal s.r.l.
 
-OUI:0013BA*
- ID_OUI_FROM_DATABASE=ReadyLinks Inc
+OUI:000C83*
+ ID_OUI_FROM_DATABASE=Logical Solutions
 
-OUI:0013BE*
- ID_OUI_FROM_DATABASE=Virtual Conexions
+OUI:000C88*
+ ID_OUI_FROM_DATABASE=Apache Micro Peripherals, Inc.
 
-OUI:0013B9*
- ID_OUI_FROM_DATABASE=BM SPA
+OUI:000C74*
+ ID_OUI_FROM_DATABASE=RIVERTEC CORPORATION
 
-OUI:0012F3*
- ID_OUI_FROM_DATABASE=connectBlue AB
+OUI:000C76*
+ ID_OUI_FROM_DATABASE=MICRO-STAR INTERNATIONAL CO., LTD.
 
-OUI:0012ED*
- ID_OUI_FROM_DATABASE=AVG Advanced Technologies
+OUI:000C7B*
+ ID_OUI_FROM_DATABASE=ALPHA PROJECT Co.,Ltd.
 
-OUI:0012E6*
- ID_OUI_FROM_DATABASE=SPECTEC COMPUTER CO., LTD.
+OUI:000B85*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0012E1*
- ID_OUI_FROM_DATABASE=Alliant Networks, Inc
+OUI:000B7F*
+ ID_OUI_FROM_DATABASE=Align Engineering LLC
 
-OUI:0012D3*
- ID_OUI_FROM_DATABASE=Zetta Systems, Inc.
+OUI:000B84*
+ ID_OUI_FROM_DATABASE=BODET
 
-OUI:0012DA*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000B73*
+ ID_OUI_FROM_DATABASE=Kodeos Communications
 
-OUI:0012D4*
- ID_OUI_FROM_DATABASE=Princeton Technology, Ltd
+OUI:000B78*
+ ID_OUI_FROM_DATABASE=TAIFATECH INC.
 
-OUI:0012C7*
- ID_OUI_FROM_DATABASE=SECURAY Technologies Ltd.Co.
+OUI:000B6C*
+ ID_OUI_FROM_DATABASE=Sychip Inc.
 
-OUI:0012CE*
- ID_OUI_FROM_DATABASE=Advanced Cybernetics Group
+OUI:000B60*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0012C2*
- ID_OUI_FROM_DATABASE=Apex Electronics Factory
+OUI:000B65*
+ ID_OUI_FROM_DATABASE=Sy.A.C. srl
 
-OUI:0012C1*
- ID_OUI_FROM_DATABASE=Check Point Software Technologies
+OUI:000B57*
+ ID_OUI_FROM_DATABASE=Silicon Laboratories
 
-OUI:0012B8*
- ID_OUI_FROM_DATABASE=G2 Microsystems
+OUI:000B5C*
+ ID_OUI_FROM_DATABASE=Newtech Co.,Ltd
 
-OUI:0012BD*
- ID_OUI_FROM_DATABASE=Avantec Manufacturing Limited
+OUI:000B43*
+ ID_OUI_FROM_DATABASE=Microscan Systems, Inc.
 
-OUI:0012B7*
- ID_OUI_FROM_DATABASE=PTW Freiburg
+OUI:000B48*
+ ID_OUI_FROM_DATABASE=sofrel
 
-OUI:0012B1*
- ID_OUI_FROM_DATABASE=Dai Nippon Printing Co., Ltd
+OUI:000B4A*
+ ID_OUI_FROM_DATABASE=Visimetrics (UK) Ltd
 
-OUI:0012A5*
- ID_OUI_FROM_DATABASE=Stargen, Inc.
+OUI:000B35*
+ ID_OUI_FROM_DATABASE=Quad Bit System co., Ltd.
 
-OUI:0012AA*
- ID_OUI_FROM_DATABASE=IEE, Inc.
+OUI:000B37*
+ ID_OUI_FROM_DATABASE=MANUFACTURE DES MONTRES ROLEX SA
 
-OUI:001379*
- ID_OUI_FROM_DATABASE=PONDER INFORMATION INDUSTRIES LTD.
+OUI:000B3C*
+ ID_OUI_FROM_DATABASE=Cygnal Integrated Products, Inc.
 
-OUI:001380*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000B29*
+ ID_OUI_FROM_DATABASE=LS(LG) Industrial Systems co.,Ltd
 
-OUI:001385*
- ID_OUI_FROM_DATABASE=Add-On Technology Co., LTD.
+OUI:000B30*
+ ID_OUI_FROM_DATABASE=Beijing Gongye Science & Technology Co.,Ltd
 
-OUI:00137F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000BA8*
+ ID_OUI_FROM_DATABASE=HANBACK ELECTRONICS CO., LTD.
 
-OUI:00136D*
- ID_OUI_FROM_DATABASE=Tentaculus AB
+OUI:000B92*
+ ID_OUI_FROM_DATABASE=Ascom Danmark A/S
 
-OUI:001366*
- ID_OUI_FROM_DATABASE=Neturity Technologies Inc.
+OUI:000B97*
+ ID_OUI_FROM_DATABASE=Matsushita Electric Industrial Co.,Ltd.
 
-OUI:001258*
- ID_OUI_FROM_DATABASE=Activis Polska
+OUI:000B9C*
+ ID_OUI_FROM_DATABASE=TriBeam Technologies, Inc.
 
-OUI:001251*
- ID_OUI_FROM_DATABASE=SILINK
+OUI:000B8B*
+ ID_OUI_FROM_DATABASE=KERAJET, S.A.
 
-OUI:001252*
- ID_OUI_FROM_DATABASE=Citronix, LLC
+OUI:0009D6*
+ ID_OUI_FROM_DATABASE=KNC One GmbH
 
-OUI:001245*
- ID_OUI_FROM_DATABASE=Zellweger Analytics, Inc.
+OUI:0009D5*
+ ID_OUI_FROM_DATABASE=Signal Communication, Inc.
 
-OUI:00124C*
- ID_OUI_FROM_DATABASE=BBWM Corporation
+OUI:0009DC*
+ ID_OUI_FROM_DATABASE=Galaxis Technology AG
 
-OUI:001239*
- ID_OUI_FROM_DATABASE=S Net Systems Inc.
+OUI:0009C9*
+ ID_OUI_FROM_DATABASE=BlueWINC Co., Ltd.
 
-OUI:001240*
- ID_OUI_FROM_DATABASE=AMOI ELECTRONICS CO.,LTD
+OUI:0009D0*
+ ID_OUI_FROM_DATABASE=Solacom Technologies Inc.
 
-OUI:00122D*
- ID_OUI_FROM_DATABASE=SiNett Corporation
+OUI:0009C1*
+ ID_OUI_FROM_DATABASE=PROCES-DATA A/S
 
-OUI:001232*
- ID_OUI_FROM_DATABASE=LeWiz Communications Inc.
+OUI:0009C4*
+ ID_OUI_FROM_DATABASE=Medicore Co., Ltd
 
-OUI:0011C5*
- ID_OUI_FROM_DATABASE=TEN Technology
+OUI:00098F*
+ ID_OUI_FROM_DATABASE=Cetacean Networks
 
-OUI:0011C8*
- ID_OUI_FROM_DATABASE=Powercom Co., Ltd.
+OUI:00097D*
+ ID_OUI_FROM_DATABASE=SecWell Networks Oy
 
-OUI:0011CD*
- ID_OUI_FROM_DATABASE=Axsun Technologies
+OUI:00097E*
+ ID_OUI_FROM_DATABASE=IMI TECHNOLOGY CO., LTD
 
-OUI:0011C6*
- ID_OUI_FROM_DATABASE=Seagate Technology
+OUI:000983*
+ ID_OUI_FROM_DATABASE=GlobalTop Technology, Inc.
 
-OUI:0011B4*
- ID_OUI_FROM_DATABASE=Westermo Teleindustri AB
+OUI:000970*
+ ID_OUI_FROM_DATABASE=Vibration Research Corporation
 
-OUI:0011B9*
- ID_OUI_FROM_DATABASE=Inner Range Pty. Ltd.
+OUI:000977*
+ ID_OUI_FROM_DATABASE=Brunner Elektronik AG
 
-OUI:0011C0*
- ID_OUI_FROM_DATABASE=Aday Technology Inc
+OUI:000964*
+ ID_OUI_FROM_DATABASE=Hi-Techniques, Inc.
 
-OUI:0011B3*
- ID_OUI_FROM_DATABASE=YOSHIMIYA CO.,LTD.
+OUI:00096B*
+ ID_OUI_FROM_DATABASE=IBM Corp
 
-OUI:0011AD*
- ID_OUI_FROM_DATABASE=Shanghai Ruijie Technology
+OUI:000957*
+ ID_OUI_FROM_DATABASE=Supercaller, Inc.
 
-OUI:001138*
- ID_OUI_FROM_DATABASE=TAISHIN CO., LTD.
+OUI:00095C*
+ ID_OUI_FROM_DATABASE=Philips Medical Systems - Cardiac and Monitoring Systems (CM
 
-OUI:00113F*
- ID_OUI_FROM_DATABASE=Alcatel DI
+OUI:000AE3*
+ ID_OUI_FROM_DATABASE=YANG MEI TECHNOLOGY CO., LTD
 
-OUI:001133*
- ID_OUI_FROM_DATABASE=Siemens Austria SIMEA
+OUI:000AEA*
+ ID_OUI_FROM_DATABASE=ADAM ELEKTRONIK LTD. ŞTI
 
-OUI:001132*
- ID_OUI_FROM_DATABASE=Synology Incorporated
+OUI:000ADE*
+ ID_OUI_FROM_DATABASE=Happy Communication Co., Ltd.
 
-OUI:001129*
- ID_OUI_FROM_DATABASE=Paradise Datacom Ltd.
+OUI:000AD7*
+ ID_OUI_FROM_DATABASE=Origin ELECTRIC CO.,LTD.
 
-OUI:00112E*
- ID_OUI_FROM_DATABASE=CEICOM
+OUI:000ACB*
+ ID_OUI_FROM_DATABASE=XPAK MSA Group
 
-OUI:001128*
- ID_OUI_FROM_DATABASE=Streamit
+OUI:000AD0*
+ ID_OUI_FROM_DATABASE=Niigata Develoment Center,  F.I.T. Co., Ltd.
 
-OUI:00111B*
- ID_OUI_FROM_DATABASE=Targa Systems Div L-3 Communications Canada
+OUI:000AD2*
+ ID_OUI_FROM_DATABASE=JEPICO Corporation
 
-OUI:001122*
- ID_OUI_FROM_DATABASE=CIMSYS Inc
+OUI:000ABD*
+ ID_OUI_FROM_DATABASE=Rupprecht & Patashnick Co.
 
-OUI:001171*
- ID_OUI_FROM_DATABASE=DEXTER Communications, Inc.
+OUI:000ABF*
+ ID_OUI_FROM_DATABASE=HIROTA SS
 
-OUI:00116A*
- ID_OUI_FROM_DATABASE=Domo Ltd
+OUI:000AC4*
+ ID_OUI_FROM_DATABASE=Daewoo Teletech Co., Ltd
 
-OUI:001160*
- ID_OUI_FROM_DATABASE=ARTDIO Company Co., LTD
+OUI:000AAC*
+ ID_OUI_FROM_DATABASE=TerraTec Electronic GmbH
 
-OUI:001154*
- ID_OUI_FROM_DATABASE=Webpro Technologies Inc.
+OUI:000AB1*
+ ID_OUI_FROM_DATABASE=GENETEC Corporation
 
-OUI:00114B*
- ID_OUI_FROM_DATABASE=Francotyp-Postalia GmbH
+OUI:000AB8*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001145*
- ID_OUI_FROM_DATABASE=ValuePoint Networks
+OUI:000AA5*
+ ID_OUI_FROM_DATABASE=MAXLINK INDUSTRIES LIMITED
 
-OUI:0011A1*
- ID_OUI_FROM_DATABASE=VISION NETWARE CO.,LTD
+OUI:000A8D*
+ ID_OUI_FROM_DATABASE=EUROTHERM LIMITED
 
-OUI:0011A6*
- ID_OUI_FROM_DATABASE=Sypixx Networks
+OUI:000A9E*
+ ID_OUI_FROM_DATABASE=BroadWeb Corportation
 
-OUI:00119A*
- ID_OUI_FROM_DATABASE=Alkeria srl
+OUI:000AA0*
+ ID_OUI_FROM_DATABASE=Cedar Point Communications
 
-OUI:001190*
- ID_OUI_FROM_DATABASE=Digital Design Corporation
+OUI:000A98*
+ ID_OUI_FROM_DATABASE=M+F Gwinner GmbH & Co
 
-OUI:00118A*
- ID_OUI_FROM_DATABASE=Viewtran Technology Limited
+OUI:000A92*
+ ID_OUI_FROM_DATABASE=Presonus Corporation
 
-OUI:001194*
- ID_OUI_FROM_DATABASE=Chi Mei Communication Systems, Inc.
+OUI:000A7E*
+ ID_OUI_FROM_DATABASE=The Advantage Group
 
-OUI:001189*
- ID_OUI_FROM_DATABASE=Aerotech Inc
+OUI:000A85*
+ ID_OUI_FROM_DATABASE=PLAT'C2,Inc
 
-OUI:001184*
- ID_OUI_FROM_DATABASE=Humo Laboratory,Ltd.
+OUI:000A8A*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00117D*
- ID_OUI_FROM_DATABASE=ZMD America, Inc.
+OUI:0009B5*
+ ID_OUI_FROM_DATABASE=3J Tech. Co., Ltd.
 
-OUI:001178*
- ID_OUI_FROM_DATABASE=Chiron Technology Ltd
+OUI:0009AF*
+ ID_OUI_FROM_DATABASE=e-generis
 
-OUI:001177*
- ID_OUI_FROM_DATABASE=Coaxial Networks, Inc.
+OUI:0009B0*
+ ID_OUI_FROM_DATABASE=Onkyo Corporation
 
-OUI:001223*
- ID_OUI_FROM_DATABASE=Pixim
+OUI:0009A9*
+ ID_OUI_FROM_DATABASE=Ikanos Communications
 
-OUI:001228*
- ID_OUI_FROM_DATABASE=Data Ltd.
+OUI:00099D*
+ ID_OUI_FROM_DATABASE=Haliplex Communications
 
-OUI:001210*
- ID_OUI_FROM_DATABASE=WideRay Corp
+OUI:0009A2*
+ ID_OUI_FROM_DATABASE=Interface Co., Ltd.
 
-OUI:001215*
- ID_OUI_FROM_DATABASE=iStor Networks, Inc.
+OUI:000990*
+ ID_OUI_FROM_DATABASE=ACKSYS Communications & systems
 
-OUI:001216*
- ID_OUI_FROM_DATABASE=ICP Internet Communication Payment AG
+OUI:000996*
+ ID_OUI_FROM_DATABASE=RDI
 
-OUI:001209*
- ID_OUI_FROM_DATABASE=Fastrax Ltd
+OUI:00098A*
+ ID_OUI_FROM_DATABASE=EqualLogic Inc
 
-OUI:001204*
- ID_OUI_FROM_DATABASE=u10 Networks, Inc.
+OUI:000A77*
+ ID_OUI_FROM_DATABASE=Bluewire Technologies LLC
 
-OUI:0011FD*
- ID_OUI_FROM_DATABASE=KORG INC.
+OUI:000A79*
+ ID_OUI_FROM_DATABASE=corega K.K
 
-OUI:001203*
- ID_OUI_FROM_DATABASE=ActivNetworks
+OUI:000A72*
+ ID_OUI_FROM_DATABASE=STEC, INC.
 
-OUI:0011F3*
- ID_OUI_FROM_DATABASE=NeoMedia Europe AG
+OUI:000A5F*
+ ID_OUI_FROM_DATABASE=almedio inc.
 
-OUI:0011E7*
- ID_OUI_FROM_DATABASE=WORLDSAT - Texas de France
+OUI:000A66*
+ ID_OUI_FROM_DATABASE=MITSUBISHI ELECTRIC SYSTEM & SERVICE CO.,LTD.
 
-OUI:0011EC*
- ID_OUI_FROM_DATABASE=AVIX INC.
+OUI:000A6B*
+ ID_OUI_FROM_DATABASE=Tadiran Telecom Business Systems LTD
 
-OUI:0011E0*
- ID_OUI_FROM_DATABASE=U-MEDIA Communications, Inc.
+OUI:000A5A*
+ ID_OUI_FROM_DATABASE=GreenNET Technologies Co.,Ltd.
 
-OUI:0011DA*
- ID_OUI_FROM_DATABASE=Vivaas Technology Inc.
+OUI:000A53*
+ ID_OUI_FROM_DATABASE=Intronics, Incorporated
 
-OUI:0011D4*
- ID_OUI_FROM_DATABASE=NetEnrich, Inc
+OUI:000A58*
+ ID_OUI_FROM_DATABASE=Freyer & Siegel Elektronik GmbH & Co. KG
 
-OUI:0011D9*
- ID_OUI_FROM_DATABASE=TiVo
+OUI:000A4C*
+ ID_OUI_FROM_DATABASE=Molecular Devices Corporation
 
-OUI:00111C*
- ID_OUI_FROM_DATABASE=Pleora Technologies Inc.
+OUI:000B24*
+ ID_OUI_FROM_DATABASE=AirLogic
 
-OUI:00110F*
- ID_OUI_FROM_DATABASE=netplat,Inc.
+OUI:000B1D*
+ ID_OUI_FROM_DATABASE=LayerZero Power Systems, Inc.
 
-OUI:001116*
- ID_OUI_FROM_DATABASE=COTEAU VERT CO., LTD.
+OUI:000B16*
+ ID_OUI_FROM_DATABASE=Communication Machinery Corporation
 
-OUI:001109*
- ID_OUI_FROM_DATABASE=Micro-Star International
+OUI:000B18*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:001103*
- ID_OUI_FROM_DATABASE=kawamura electric inc.
+OUI:000B11*
+ ID_OUI_FROM_DATABASE=HIMEJI ABC TRADING CO.,LTD.
 
-OUI:000FFD*
- ID_OUI_FROM_DATABASE=Glorytek Network Inc.
+OUI:000B0A*
+ ID_OUI_FROM_DATABASE=dBm Optics
 
-OUI:000FEE*
- ID_OUI_FROM_DATABASE=XTec, Incorporated
+OUI:000B05*
+ ID_OUI_FROM_DATABASE=Pacific Broadband Networks
 
-OUI:000FF4*
- ID_OUI_FROM_DATABASE=Guntermann & Drunck GmbH
+OUI:000AFE*
+ ID_OUI_FROM_DATABASE=NovaPal Ltd
 
-OUI:001275*
- ID_OUI_FROM_DATABASE=Sentilla Corporation
+OUI:000B03*
+ ID_OUI_FROM_DATABASE=Taekwang Industrial Co., Ltd
 
-OUI:00126E*
- ID_OUI_FROM_DATABASE=Seidel Elektronik GmbH Nfg.KG
+OUI:000AEF*
+ ID_OUI_FROM_DATABASE=OTRUM ASA
 
-OUI:001269*
- ID_OUI_FROM_DATABASE=Value Electronics
+OUI:000AF2*
+ ID_OUI_FROM_DATABASE=NeoAxiom Corp.
 
-OUI:00125C*
- ID_OUI_FROM_DATABASE=Green Hills Software, Inc.
+OUI:000A05*
+ ID_OUI_FROM_DATABASE=Widax Corp.
 
-OUI:000F15*
- ID_OUI_FROM_DATABASE=Kjaerulff1 A/S
+OUI:000A0A*
+ ID_OUI_FROM_DATABASE=SUNIX Co., Ltd.
 
-OUI:000F1A*
- ID_OUI_FROM_DATABASE=Gaming Support B.V.
+OUI:000A0F*
+ ID_OUI_FROM_DATABASE=Ilryung Telesys, Inc
 
-OUI:000F0E*
- ID_OUI_FROM_DATABASE=WaveSplitter Technologies, Inc.
+OUI:0009FF*
+ ID_OUI_FROM_DATABASE=X.net 2000 GmbH
 
-OUI:000F08*
- ID_OUI_FROM_DATABASE=Indagon Oy
+OUI:0009FE*
+ ID_OUI_FROM_DATABASE=Daisy Technologies, Inc.
 
-OUI:000F07*
- ID_OUI_FROM_DATABASE=Mangrove Systems, Inc.
+OUI:000A00*
+ ID_OUI_FROM_DATABASE=Mediatek Corp.
 
-OUI:000F02*
- ID_OUI_FROM_DATABASE=Digicube Technology Co., Ltd
+OUI:0009F6*
+ ID_OUI_FROM_DATABASE=Shenzhen Eastern Digital Tech Ltd.
 
-OUI:000EFB*
- ID_OUI_FROM_DATABASE=Macey Enterprises
+OUI:0009F5*
+ ID_OUI_FROM_DATABASE=Emerson Network Power Co.,Ltd
 
-OUI:000EF5*
- ID_OUI_FROM_DATABASE=iPAC Technology Co., Ltd.
+OUI:0009E8*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000EF6*
- ID_OUI_FROM_DATABASE=E-TEN Information Systems Co., Ltd.
+OUI:0009EF*
+ ID_OUI_FROM_DATABASE=Vocera Communications
 
-OUI:000E8A*
- ID_OUI_FROM_DATABASE=Avara Technologies Pty. Ltd.
+OUI:0009E3*
+ ID_OUI_FROM_DATABASE=Angel Iglesias S.A.
 
-OUI:000E83*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000A39*
+ ID_OUI_FROM_DATABASE=LoPA Information Technology
 
-OUI:000E73*
- ID_OUI_FROM_DATABASE=Tpack A/S
+OUI:000A40*
+ ID_OUI_FROM_DATABASE=Crown Audio -- Harmanm International
 
-OUI:000E7D*
- ID_OUI_FROM_DATABASE=Electronics Line 3000 Ltd.
+OUI:000A45*
+ ID_OUI_FROM_DATABASE=Audio-Technica Corp.
 
-OUI:000E77*
- ID_OUI_FROM_DATABASE=Decru, Inc.
+OUI:000A47*
+ ID_OUI_FROM_DATABASE=Allied Vision Technologies
 
-OUI:000E7E*
- ID_OUI_FROM_DATABASE=ionSign Oy
+OUI:000A34*
+ ID_OUI_FROM_DATABASE=Identicard Systems Incorporated
 
-OUI:000E6F*
- ID_OUI_FROM_DATABASE=IRIS Corporation Berhad
+OUI:000A2D*
+ ID_OUI_FROM_DATABASE=Cabot Communications Limited
 
-OUI:000E6A*
- ID_OUI_FROM_DATABASE=3Com Ltd
+OUI:000A22*
+ ID_OUI_FROM_DATABASE=Amperion Inc
 
-OUI:000E69*
- ID_OUI_FROM_DATABASE=China Electric Power Research Institute
+OUI:000A16*
+ ID_OUI_FROM_DATABASE=Lassen Research
 
-OUI:000E63*
- ID_OUI_FROM_DATABASE=Lemke Diagnostics GmbH
+OUI:000A1B*
+ ID_OUI_FROM_DATABASE=Stream Labs
 
-OUI:000EBC*
- ID_OUI_FROM_DATABASE=Paragon Fidelity GmbH
+OUI:000878*
+ ID_OUI_FROM_DATABASE=Benchmark Storage Innovations
 
-OUI:000EB0*
- ID_OUI_FROM_DATABASE=Solutions Radio BV
+OUI:000872*
+ ID_OUI_FROM_DATABASE=Sorenson Communications
 
-OUI:000EB5*
- ID_OUI_FROM_DATABASE=Ecastle Electronics Co., Ltd.
+OUI:00087E*
+ ID_OUI_FROM_DATABASE=Bon Electro-Telecom Inc.
 
-OUI:000EAF*
- ID_OUI_FROM_DATABASE=CASTEL
+OUI:00086B*
+ ID_OUI_FROM_DATABASE=MIPSYS
 
-OUI:000EA9*
- ID_OUI_FROM_DATABASE=Shanghai Xun Shi Communications Equipment Ltd. Co.
+OUI:000865*
+ ID_OUI_FROM_DATABASE=JASCOM CO., LTD
 
-OUI:000E9D*
- ID_OUI_FROM_DATABASE=Tiscali UK Ltd
+OUI:000866*
+ ID_OUI_FROM_DATABASE=DSX Access Systems, Inc.
 
-OUI:000EA2*
- ID_OUI_FROM_DATABASE=McAfee, Inc
+OUI:00085F*
+ ID_OUI_FROM_DATABASE=Picanol N.V.
 
-OUI:000E90*
- ID_OUI_FROM_DATABASE=PONICO CORP.
+OUI:000859*
+ ID_OUI_FROM_DATABASE=ShenZhen Unitone Electronics Co., Ltd.
 
-OUI:000E8F*
- ID_OUI_FROM_DATABASE=Sercomm Corp.
+OUI:000853*
+ ID_OUI_FROM_DATABASE=Schleicher GmbH & Co. Relaiswerke KG
 
-OUI:000E96*
- ID_OUI_FROM_DATABASE=Cubic Defense Applications, Inc.
+OUI:000858*
+ ID_OUI_FROM_DATABASE=Novatechnology Inc.
 
-OUI:000F4E*
- ID_OUI_FROM_DATABASE=Cellink
+OUI:00081D*
+ ID_OUI_FROM_DATABASE=Ipsil, Incorporated
 
-OUI:000F41*
- ID_OUI_FROM_DATABASE=Zipher Ltd
+OUI:000829*
+ ID_OUI_FROM_DATABASE=Aval Nagasaki Corporation
 
-OUI:000F48*
- ID_OUI_FROM_DATABASE=Polypix Inc.
+OUI:000823*
+ ID_OUI_FROM_DATABASE=Texa Corp.
 
-OUI:000F4D*
- ID_OUI_FROM_DATABASE=TalkSwitch
+OUI:00082A*
+ ID_OUI_FROM_DATABASE=Powerwallz Network Security
 
-OUI:000F39*
- ID_OUI_FROM_DATABASE=IRIS SENSORS
+OUI:000817*
+ ID_OUI_FROM_DATABASE=EmergeCore Networks LLC
 
-OUI:000F3C*
- ID_OUI_FROM_DATABASE=Endeleo Limited
+OUI:00091E*
+ ID_OUI_FROM_DATABASE=Firstech Technology Corp.
 
-OUI:000F34*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000925*
+ ID_OUI_FROM_DATABASE=VSN Systemen BV
 
-OUI:000F2D*
- ID_OUI_FROM_DATABASE=CHUNG-HSIN ELECTRIC & MACHINERY MFG.CORP.
+OUI:000918*
+ ID_OUI_FROM_DATABASE=SAMSUNG TECHWIN CO.,LTD
 
-OUI:000F27*
- ID_OUI_FROM_DATABASE=TEAL Electronics, Inc.
+OUI:000917*
+ ID_OUI_FROM_DATABASE=WEM Technology Inc
 
-OUI:000F28*
- ID_OUI_FROM_DATABASE=Itronix Corporation
+OUI:000912*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000F21*
- ID_OUI_FROM_DATABASE=Scientific Atlanta, Inc
+OUI:00090B*
+ ID_OUI_FROM_DATABASE=MTL  Instruments PLC
 
-OUI:000EEF*
- ID_OUI_FROM_DATABASE=Private
+OUI:000905*
+ ID_OUI_FROM_DATABASE=iTEC Technologies Ltd.
 
-OUI:000EDC*
- ID_OUI_FROM_DATABASE=Tellion INC.
+OUI:0008FF*
+ ID_OUI_FROM_DATABASE=Trilogy Communications Ltd
 
-OUI:000EE3*
- ID_OUI_FROM_DATABASE=Chiyu Technology Co.,Ltd
+OUI:000906*
+ ID_OUI_FROM_DATABASE=Esteem Networks
 
-OUI:000EC8*
- ID_OUI_FROM_DATABASE=Zoran Corporation
+OUI:0008FB*
+ ID_OUI_FROM_DATABASE=SonoSite, Inc.
 
-OUI:000ECF*
- ID_OUI_FROM_DATABASE=PROFIBUS Nutzerorganisation e.V.
+OUI:0008F2*
+ ID_OUI_FROM_DATABASE=C&S Technology
 
-OUI:000ED4*
- ID_OUI_FROM_DATABASE=CRESITT INDUSTRIE
+OUI:0008F7*
+ ID_OUI_FROM_DATABASE=Hitachi Ltd, Semiconductor & Integrated Circuits Gr
 
-OUI:000EC2*
- ID_OUI_FROM_DATABASE=Lowrance Electronics, Inc.
+OUI:0008ED*
+ ID_OUI_FROM_DATABASE=ST&T Instrument Corp.
 
-OUI:000EC1*
- ID_OUI_FROM_DATABASE=MYNAH Technologies
+OUI:0007D1*
+ ID_OUI_FROM_DATABASE=Spectrum Signal Processing Inc.
 
-OUI:000F92*
- ID_OUI_FROM_DATABASE=Microhard Systems Inc.
+OUI:0007CE*
+ ID_OUI_FROM_DATABASE=Cabletime Limited
 
-OUI:000F99*
- ID_OUI_FROM_DATABASE=APAC opto Electronics Inc.
+OUI:0007C8*
+ ID_OUI_FROM_DATABASE=Brain21, Inc.
 
-OUI:000F8D*
- ID_OUI_FROM_DATABASE=FAST TV-Server AG
+OUI:0007BC*
+ ID_OUI_FROM_DATABASE=Identix Inc.
 
-OUI:000F80*
- ID_OUI_FROM_DATABASE=Trinity Security Systems,Inc.
+OUI:00047C*
+ ID_OUI_FROM_DATABASE=Skidata AG
 
-OUI:000F7F*
- ID_OUI_FROM_DATABASE=UBSTORAGE Co.,Ltd.
+OUI:0007BB*
+ ID_OUI_FROM_DATABASE=Candera Inc.
 
-OUI:000FC2*
- ID_OUI_FROM_DATABASE=Uniwell Corporation
+OUI:0007C2*
+ ID_OUI_FROM_DATABASE=Netsys Telecom
 
-OUI:000FC9*
- ID_OUI_FROM_DATABASE=Allnet GmbH
+OUI:0007B5*
+ ID_OUI_FROM_DATABASE=Any One Wireless Ltd.
 
-OUI:000FBC*
- ID_OUI_FROM_DATABASE=Onkey Technologies, Inc.
+OUI:0007AF*
+ ID_OUI_FROM_DATABASE=Red Lion Controls, LP
 
-OUI:000FBB*
- ID_OUI_FROM_DATABASE=Nokia Siemens Networks GmbH & Co. KG.
+OUI:0007A2*
+ ID_OUI_FROM_DATABASE=Opteon Corporation
 
-OUI:000FB6*
- ID_OUI_FROM_DATABASE=Europlex Technologies
+OUI:0007A7*
+ ID_OUI_FROM_DATABASE=A-Z Inc.
 
-OUI:000FA9*
- ID_OUI_FROM_DATABASE=PC Fabrik
+OUI:0007A1*
+ ID_OUI_FROM_DATABASE=VIASYS Healthcare GmbH
 
-OUI:000FAA*
- ID_OUI_FROM_DATABASE=Nexus Technologies
+OUI:0007A8*
+ ID_OUI_FROM_DATABASE=Haier Group Technologies Ltd.
 
-OUI:000FAF*
- ID_OUI_FROM_DATABASE=Dialog Inc.
+OUI:00094A*
+ ID_OUI_FROM_DATABASE=Homenet Communications
 
-OUI:000FE8*
- ID_OUI_FROM_DATABASE=Lobos, Inc.
+OUI:000949*
+ ID_OUI_FROM_DATABASE=Glyph Technologies Inc.
 
-OUI:000FED*
- ID_OUI_FROM_DATABASE=Anam Electronics Co., Ltd
+OUI:000950*
+ ID_OUI_FROM_DATABASE=Independent Storage Corporation
 
-OUI:000FDC*
- ID_OUI_FROM_DATABASE=Ueda Japan  Radio Co., Ltd.
+OUI:000944*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000FE1*
- ID_OUI_FROM_DATABASE=ID DIGITAL CORPORATION
+OUI:00093D*
+ ID_OUI_FROM_DATABASE=Newisys,Inc.
 
-OUI:000FD5*
- ID_OUI_FROM_DATABASE=Schwechat - RISE
+OUI:000937*
+ ID_OUI_FROM_DATABASE=Inventec Appliance Corp
 
-OUI:000FCE*
- ID_OUI_FROM_DATABASE=Kikusui Electronics Corp.
+OUI:000931*
+ ID_OUI_FROM_DATABASE=Future Internet, Inc.
 
-OUI:000F73*
- ID_OUI_FROM_DATABASE=RS Automation Co., Ltd
+OUI:000938*
+ ID_OUI_FROM_DATABASE=Allot Communications
 
-OUI:000F7A*
- ID_OUI_FROM_DATABASE=BeiJing NuQX Technology CO.,LTD
+OUI:00092A*
+ ID_OUI_FROM_DATABASE=MYTECS Co.,Ltd.
 
-OUI:000F6D*
- ID_OUI_FROM_DATABASE=Midas Engineering
+OUI:0008B1*
+ ID_OUI_FROM_DATABASE=ProQuent Systems
 
-OUI:000F67*
- ID_OUI_FROM_DATABASE=West Instruments
+OUI:0008AB*
+ ID_OUI_FROM_DATABASE=EnerLinx.com, Inc.
 
-OUI:000F6E*
- ID_OUI_FROM_DATABASE=BBox
+OUI:0008AC*
+ ID_OUI_FROM_DATABASE=Eltromat GmbH
 
-OUI:000F60*
- ID_OUI_FROM_DATABASE=Lifetron Co.,Ltd
+OUI:0008A5*
+ ID_OUI_FROM_DATABASE=Peninsula Systems Inc.
 
-OUI:000F5B*
- ID_OUI_FROM_DATABASE=Delta Information Systems, Inc.
+OUI:000899*
+ ID_OUI_FROM_DATABASE=Netbind, Inc.
 
-OUI:000F54*
- ID_OUI_FROM_DATABASE=Entrelogic Corporation
+OUI:00089E*
+ ID_OUI_FROM_DATABASE=Beijing Enter-Net co.LTD
 
-OUI:000D75*
- ID_OUI_FROM_DATABASE=Kobian Pte Ltd - Taiwan Branch
+OUI:000895*
+ ID_OUI_FROM_DATABASE=DIRC Technologie GmbH & Co.KG
 
-OUI:000D7C*
- ID_OUI_FROM_DATABASE=Codian Ltd
+OUI:000891*
+ ID_OUI_FROM_DATABASE=Lyan Inc.
 
-OUI:000D6F*
- ID_OUI_FROM_DATABASE=Ember Corporation
+OUI:00088B*
+ ID_OUI_FROM_DATABASE=Tropic Networks Inc.
 
-OUI:000D69*
- ID_OUI_FROM_DATABASE=TMT&D Corporation
+OUI:00088A*
+ ID_OUI_FROM_DATABASE=Minds@Work
 
-OUI:000D70*
- ID_OUI_FROM_DATABASE=Datamax Corporation
+OUI:000885*
+ ID_OUI_FROM_DATABASE=EMS Dr. Thomas Wünsche
 
-OUI:000D5D*
- ID_OUI_FROM_DATABASE=Raritan Computer, Inc
+OUI:0008E8*
+ ID_OUI_FROM_DATABASE=Excel Master Ltd.
 
-OUI:000D62*
- ID_OUI_FROM_DATABASE=Funkwerk Dabendorf GmbH
+OUI:0008E7*
+ ID_OUI_FROM_DATABASE=SHI ControlSystems,Ltd.
 
-OUI:000D50*
- ID_OUI_FROM_DATABASE=Galazar Networks
+OUI:0008E1*
+ ID_OUI_FROM_DATABASE=Barix AG
 
-OUI:000D4A*
- ID_OUI_FROM_DATABASE=Steag ETA-Optik
+OUI:0008DA*
+ ID_OUI_FROM_DATABASE=SofaWare Technologies Ltd.
 
-OUI:000DAB*
- ID_OUI_FROM_DATABASE=Parker Hannifin GmbH Electromechanical Division Europe
+OUI:0008D5*
+ ID_OUI_FROM_DATABASE=Vanguard Networks Solutions, LLC
 
-OUI:000DA7*
- ID_OUI_FROM_DATABASE=Private
+OUI:0008CE*
+ ID_OUI_FROM_DATABASE=IPMobileNet Inc.
 
-OUI:000DA1*
- ID_OUI_FROM_DATABASE=MIRAE ITS Co.,LTD.
+OUI:0008C8*
+ ID_OUI_FROM_DATABASE=Soneticom, Inc.
 
-OUI:000DA2*
- ID_OUI_FROM_DATABASE=Infrant Technologies, Inc.
+OUI:0008C4*
+ ID_OUI_FROM_DATABASE=Hikari Co.,Ltd.
 
-OUI:000D9B*
- ID_OUI_FROM_DATABASE=Heraeus Electro-Nite International N.V.
+OUI:0008BE*
+ ID_OUI_FROM_DATABASE=XENPAK MSA Group
 
-OUI:000D8F*
- ID_OUI_FROM_DATABASE=King Tsushin Kogyo Co., LTD.
+OUI:0008B8*
+ ID_OUI_FROM_DATABASE=E.F. Johnson
 
-OUI:000D94*
- ID_OUI_FROM_DATABASE=AFAR Communications,Inc
+OUI:00079B*
+ ID_OUI_FROM_DATABASE=Aurora Networks
 
-OUI:000D82*
- ID_OUI_FROM_DATABASE=PHS srl
+OUI:00078F*
+ ID_OUI_FROM_DATABASE=Emkay Innovative Products
 
-OUI:000D81*
- ID_OUI_FROM_DATABASE=Pepperl+Fuchs GmbH
+OUI:000788*
+ ID_OUI_FROM_DATABASE=Clipcomm, Inc.
 
-OUI:000DCE*
- ID_OUI_FROM_DATABASE=Dynavac Technology Pte Ltd
+OUI:000779*
+ ID_OUI_FROM_DATABASE=Sungil Telecom Co., Ltd.
 
-OUI:000DC8*
- ID_OUI_FROM_DATABASE=AirMagnet, Inc
+OUI:000778*
+ ID_OUI_FROM_DATABASE=GERSTEL GmbH & Co. KG
 
-OUI:000DC2*
- ID_OUI_FROM_DATABASE=Private
+OUI:00076C*
+ ID_OUI_FROM_DATABASE=Daehanet, Inc.
 
-OUI:000DC7*
- ID_OUI_FROM_DATABASE=COSMIC ENGINEERING INC.
+OUI:00075C*
+ ID_OUI_FROM_DATABASE=Eastman Kodak Company
 
-OUI:000DBB*
- ID_OUI_FROM_DATABASE=Nippon Dentsu Co.,Ltd.
+OUI:000768*
+ ID_OUI_FROM_DATABASE=Danfoss A/S
 
-OUI:000DB5*
- ID_OUI_FROM_DATABASE=GLOBALSAT TECHNOLOGY CORPORATION
+OUI:000762*
+ ID_OUI_FROM_DATABASE=Group Sense Limited
 
-OUI:000DAF*
- ID_OUI_FROM_DATABASE=Plexus Corp (UK) Ltd
+OUI:000755*
+ ID_OUI_FROM_DATABASE=Lafon
 
-OUI:000D29*
+OUI:00074F*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000D23*
- ID_OUI_FROM_DATABASE=Smart Solution, Inc
-
-OUI:000D17*
- ID_OUI_FROM_DATABASE=Turbo Networks Co.Ltd
+OUI:000741*
+ ID_OUI_FROM_DATABASE=Sierra Automated Systems
 
-OUI:000D1C*
- ID_OUI_FROM_DATABASE=Amesys Defense
+OUI:000749*
+ ID_OUI_FROM_DATABASE=CENiX Inc.
 
-OUI:000D0A*
- ID_OUI_FROM_DATABASE=Projectiondesign as
+OUI:000735*
+ ID_OUI_FROM_DATABASE=Flarion Technologies, Inc.
 
-OUI:000D09*
- ID_OUI_FROM_DATABASE=Yuehua(Zhuhai) Electronic CO. LTD
+OUI:00073B*
+ ID_OUI_FROM_DATABASE=Tenovis GmbH & Co KG
 
-OUI:000D10*
- ID_OUI_FROM_DATABASE=Embedtronics Oy
+OUI:000729*
+ ID_OUI_FROM_DATABASE=Kistler Instrumente AG
 
-OUI:000D04*
- ID_OUI_FROM_DATABASE=Foxboro Eckardt Development GmbH
+OUI:00072E*
+ ID_OUI_FROM_DATABASE=North Node AB
 
-OUI:000CFD*
- ID_OUI_FROM_DATABASE=Hyundai ImageQuest Co.,Ltd.
+OUI:000728*
+ ID_OUI_FROM_DATABASE=Neo Telecom
 
-OUI:000D4F*
- ID_OUI_FROM_DATABASE=Kenwood Corporation
+OUI:000718*
+ ID_OUI_FROM_DATABASE=iCanTek Co., Ltd.
 
-OUI:000D46*
- ID_OUI_FROM_DATABASE=Parker SSD Drives
+OUI:000806*
+ ID_OUI_FROM_DATABASE=Raonet Systems, Inc.
 
-OUI:000D42*
- ID_OUI_FROM_DATABASE=Newbest Development Limited
+OUI:0007FD*
+ ID_OUI_FROM_DATABASE=LANergy Ltd.
 
-OUI:000D3C*
- ID_OUI_FROM_DATABASE=i.Tech Dynamic Ltd
+OUI:0007F6*
+ ID_OUI_FROM_DATABASE=Qqest Software Systems
 
-OUI:000D36*
- ID_OUI_FROM_DATABASE=Wu Han Routon Electronic Co., Ltd
+OUI:0007FC*
+ ID_OUI_FROM_DATABASE=Adept Systems Inc.
 
-OUI:000D3B*
- ID_OUI_FROM_DATABASE=Microelectronics Technology Inc.
+OUI:0007EA*
+ ID_OUI_FROM_DATABASE=Massana, Inc.
 
-OUI:000D2A*
- ID_OUI_FROM_DATABASE=Scanmatic AS
+OUI:0007F0*
+ ID_OUI_FROM_DATABASE=LogiSync LLC
 
-OUI:000D2F*
- ID_OUI_FROM_DATABASE=AIN Comm.Tech.Co., LTD
+OUI:0007E3*
+ ID_OUI_FROM_DATABASE=Navcom Technology, Inc.
 
-OUI:000DFA*
- ID_OUI_FROM_DATABASE=Micro Control Systems Ltd.
+OUI:0007E4*
+ ID_OUI_FROM_DATABASE=SoftRadio Co., Ltd.
 
-OUI:000DF4*
- ID_OUI_FROM_DATABASE=Watertek Co.
+OUI:0007DD*
+ ID_OUI_FROM_DATABASE=Cradle Technologies
 
-OUI:000DF9*
- ID_OUI_FROM_DATABASE=NDS Limited
+OUI:0007D7*
+ ID_OUI_FROM_DATABASE=Caporis Networks AG
 
-OUI:000E00*
- ID_OUI_FROM_DATABASE=Atrie
+OUI:0006E3*
+ ID_OUI_FROM_DATABASE=Quantitative Imaging Corporation
 
-OUI:000DE7*
- ID_OUI_FROM_DATABASE=Snap-on OEM Group
+OUI:0006DD*
+ ID_OUI_FROM_DATABASE=AT & T Laboratories - Cambridge Ltd
 
-OUI:000DE8*
- ID_OUI_FROM_DATABASE=Nasaco Electronics Pte. Ltd
+OUI:0006A4*
+ ID_OUI_FROM_DATABASE=INNOWELL Corp.
 
-OUI:000DED*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0006D3*
+ ID_OUI_FROM_DATABASE=Alpha Telecom, Inc. U.S.A.
 
-OUI:000DE1*
- ID_OUI_FROM_DATABASE=Control Products, Inc.
+OUI:0006D2*
+ ID_OUI_FROM_DATABASE=Tundra Semiconductor Corp.
 
-OUI:000DD5*
- ID_OUI_FROM_DATABASE=O'RITE TECHNOLOGY CO.,LTD
+OUI:000647*
+ ID_OUI_FROM_DATABASE=Etrali S.A.
 
-OUI:000DDA*
- ID_OUI_FROM_DATABASE=ALLIED TELESIS K.K.
+OUI:0006D9*
+ ID_OUI_FROM_DATABASE=IPM-Net S.p.A.
 
-OUI:000E20*
- ID_OUI_FROM_DATABASE=ACCESS Systems Americas, Inc.
+OUI:0005EA*
+ ID_OUI_FROM_DATABASE=Rednix
 
-OUI:000E27*
- ID_OUI_FROM_DATABASE=Crere Networks, Inc.
+OUI:0006CD*
+ ID_OUI_FROM_DATABASE=Leaf Imaging Ltd.
 
-OUI:000E14*
- ID_OUI_FROM_DATABASE=Visionary Solutions, Inc.
+OUI:0006BC*
+ ID_OUI_FROM_DATABASE=Macrolink, Inc.
 
-OUI:000E1B*
- ID_OUI_FROM_DATABASE=IAV GmbH
+OUI:0006C6*
+ ID_OUI_FROM_DATABASE=lesswire AG
 
-OUI:000E57*
- ID_OUI_FROM_DATABASE=Iworld Networking, Inc.
+OUI:000654*
+ ID_OUI_FROM_DATABASE=Winpresa Building Automation Technologies GmbH
 
-OUI:000E50*
- ID_OUI_FROM_DATABASE=Thomson Telecom Belgium
+OUI:0006B6*
+ ID_OUI_FROM_DATABASE=Nir-Or Israel Ltd.
 
-OUI:000E4A*
- ID_OUI_FROM_DATABASE=Changchun Huayu WEBPAD Co.,LTD
+OUI:0006B0*
+ ID_OUI_FROM_DATABASE=Comtech EF Data Corp.
 
-OUI:000E49*
- ID_OUI_FROM_DATABASE=Forsway Scandinavia AB
+OUI:00071F*
+ ID_OUI_FROM_DATABASE=European Systems Integration
 
-OUI:000E3D*
- ID_OUI_FROM_DATABASE=Televic N.V.
+OUI:000724*
+ ID_OUI_FROM_DATABASE=Telemax Co., Ltd.
 
-OUI:000E44*
- ID_OUI_FROM_DATABASE=Digital 5, Inc.
+OUI:000707*
+ ID_OUI_FROM_DATABASE=Interalia Inc.
 
-OUI:000E33*
- ID_OUI_FROM_DATABASE=Shuko Electronics Co.,Ltd
+OUI:00070C*
+ ID_OUI_FROM_DATABASE=SVA-Intrusion.com Co. Ltd.
 
-OUI:000E3A*
- ID_OUI_FROM_DATABASE=Cirrus Logic
+OUI:000711*
+ ID_OUI_FROM_DATABASE=Acterna
 
-OUI:000E2D*
- ID_OUI_FROM_DATABASE=Hyundai Digital Technology Co.,Ltd.
+OUI:000712*
+ ID_OUI_FROM_DATABASE=JAL Information Technology
 
-OUI:000CEA*
- ID_OUI_FROM_DATABASE=aphona Kommunikationssysteme
+OUI:0006FA*
+ ID_OUI_FROM_DATABASE=IP SQUARE Co, Ltd.
 
-OUI:000CD9*
- ID_OUI_FROM_DATABASE=Itcare Co., Ltd
+OUI:0006EF*
+ ID_OUI_FROM_DATABASE=Maxxan Systems, Inc.
 
-OUI:000CD3*
- ID_OUI_FROM_DATABASE=Prettl Elektronik Radeberg GmbH
+OUI:0006EA*
+ ID_OUI_FROM_DATABASE=ELZET80 Mikrocomputer GmbH&Co. KG
 
-OUI:000CDA*
- ID_OUI_FROM_DATABASE=FreeHand Systems, Inc.
+OUI:0006E9*
+ ID_OUI_FROM_DATABASE=Intime Corp.
 
-OUI:000CDF*
- ID_OUI_FROM_DATABASE=PULNiX America, Inc
+OUI:0005EB*
+ ID_OUI_FROM_DATABASE=Blue Ridge Networks, Inc.
 
-OUI:000CC7*
- ID_OUI_FROM_DATABASE=Intelligent Computer Solutions Inc.
+OUI:0005E4*
+ ID_OUI_FROM_DATABASE=Red Lion Controls Inc.
 
-OUI:000CCC*
- ID_OUI_FROM_DATABASE=Aeroscout Ltd.
+OUI:0005F1*
+ ID_OUI_FROM_DATABASE=Vrcom, Inc.
 
-OUI:000C13*
- ID_OUI_FROM_DATABASE=MediaQ
+OUI:0005FD*
+ ID_OUI_FROM_DATABASE=PacketLight Networks Ltd.
 
-OUI:000C05*
- ID_OUI_FROM_DATABASE=RPA Reserch Co., Ltd.
+OUI:0005E2*
+ ID_OUI_FROM_DATABASE=Creativ Network Technologies
 
-OUI:000C0C*
- ID_OUI_FROM_DATABASE=APPRO TECHNOLOGY INC.
+OUI:0005DC*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000BF4*
- ID_OUI_FROM_DATABASE=Private
+OUI:0005E1*
+ ID_OUI_FROM_DATABASE=Trellis Photonics, Ltd.
 
-OUI:000BF9*
- ID_OUI_FROM_DATABASE=Gemstone Communications, Inc.
+OUI:0005D8*
+ ID_OUI_FROM_DATABASE=Arescom, Inc.
 
-OUI:000C00*
- ID_OUI_FROM_DATABASE=BEB Industrie-Elektronik AG
+OUI:0005D7*
+ ID_OUI_FROM_DATABASE=Vista Imaging, Inc.
 
-OUI:000BF3*
- ID_OUI_FROM_DATABASE=BAE SYSTEMS
+OUI:0005C5*
+ ID_OUI_FROM_DATABASE=Flaga HF
 
-OUI:000C63*
- ID_OUI_FROM_DATABASE=Zenith Electronics Corporation
+OUI:0005D1*
+ ID_OUI_FROM_DATABASE=Metavector Technologies
 
-OUI:000C68*
- ID_OUI_FROM_DATABASE=SigmaTel, Inc.
+OUI:0005D2*
+ ID_OUI_FROM_DATABASE=DAP Technologies
 
-OUI:000C6F*
- ID_OUI_FROM_DATABASE=Amtek system co.,LTD.
+OUI:0005CB*
+ ID_OUI_FROM_DATABASE=ROIS Technologies, Inc.
 
-OUI:000C50*
- ID_OUI_FROM_DATABASE=Seagate Technology
+OUI:00057F*
+ ID_OUI_FROM_DATABASE=Acqis Technology
 
-OUI:000C55*
- ID_OUI_FROM_DATABASE=Microlink Communications Inc.
+OUI:000579*
+ ID_OUI_FROM_DATABASE=Universal Control Solution Corp.
 
-OUI:000C5C*
- ID_OUI_FROM_DATABASE=GTN Systems B.V.
+OUI:000575*
+ ID_OUI_FROM_DATABASE=CDS-Electronics BV
 
-OUI:000C61*
- ID_OUI_FROM_DATABASE=AC Tech corporation DBA Advanced Digital
+OUI:00056F*
+ ID_OUI_FROM_DATABASE=Innomedia Technologies Pvt. Ltd.
 
-OUI:000CBA*
- ID_OUI_FROM_DATABASE=Jamex, Inc.
+OUI:000568*
+ ID_OUI_FROM_DATABASE=Piltofish Networks AB
 
-OUI:000CB9*
- ID_OUI_FROM_DATABASE=LEA
+OUI:000562*
+ ID_OUI_FROM_DATABASE=Digital View Limited
 
-OUI:000CC0*
- ID_OUI_FROM_DATABASE=Genera Oy
+OUI:00055C*
+ ID_OUI_FROM_DATABASE=Kowa Company, Ltd.
 
-OUI:000CB4*
- ID_OUI_FROM_DATABASE=AutoCell Laboratories, Inc.
+OUI:000556*
+ ID_OUI_FROM_DATABASE=360 Systems
 
-OUI:000C34*
- ID_OUI_FROM_DATABASE=Vixen Co., Ltd.
+OUI:000550*
+ ID_OUI_FROM_DATABASE=Vcomms Connect Limited
 
-OUI:000CA2*
- ID_OUI_FROM_DATABASE=Harmonic Video Network
+OUI:000545*
+ ID_OUI_FROM_DATABASE=Internet Photonics
 
-OUI:000CA7*
- ID_OUI_FROM_DATABASE=Metro (Suzhou) Technologies Co., Ltd.
+OUI:00053F*
+ ID_OUI_FROM_DATABASE=VisionTek, Inc.
 
-OUI:000CA9*
- ID_OUI_FROM_DATABASE=Ebtron Inc.
+OUI:000546*
+ ID_OUI_FROM_DATABASE=KDDI Network & Solultions Inc.
 
-OUI:000CAE*
- ID_OUI_FROM_DATABASE=Ailocom Oy
+OUI:0006AA*
+ ID_OUI_FROM_DATABASE=VT Miltope
 
-OUI:000C42*
- ID_OUI_FROM_DATABASE=Routerboard.com
+OUI:0006A9*
+ ID_OUI_FROM_DATABASE=Universal Instruments Corp.
 
-OUI:000C44*
- ID_OUI_FROM_DATABASE=Automated Interfaces, Inc.
+OUI:0006A0*
+ ID_OUI_FROM_DATABASE=Mx Imaging
 
-OUI:000C39*
- ID_OUI_FROM_DATABASE=Sentinel Wireless Inc.
+OUI:00069F*
+ ID_OUI_FROM_DATABASE=Kuokoa Networks
 
-OUI:000C3B*
- ID_OUI_FROM_DATABASE=Orion Electric Co., Ltd.
+OUI:000699*
+ ID_OUI_FROM_DATABASE=Vida Design Co.
 
-OUI:000C40*
- ID_OUI_FROM_DATABASE=Altech Controls
+OUI:000693*
+ ID_OUI_FROM_DATABASE=Flexus Computer Technology, Inc.
 
-OUI:000C3A*
- ID_OUI_FROM_DATABASE=Oxance
+OUI:00069A*
+ ID_OUI_FROM_DATABASE=e & Tel
 
-OUI:000C2F*
- ID_OUI_FROM_DATABASE=SeorimTechnology Co.,Ltd.
+OUI:00068D*
+ ID_OUI_FROM_DATABASE=SEPATON, Inc.
 
-OUI:000C31*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000687*
+ ID_OUI_FROM_DATABASE=Omnitron Systems Technology, Inc.
 
-OUI:000C2A*
- ID_OUI_FROM_DATABASE=OCTTEL Communication Co., Ltd.
+OUI:000680*
+ ID_OUI_FROM_DATABASE=Card Access, Inc.
 
-OUI:000C27*
- ID_OUI_FROM_DATABASE=Sammy Corporation
+OUI:000539*
+ ID_OUI_FROM_DATABASE=A Brand New World in Sweden AB
 
-OUI:000C18*
- ID_OUI_FROM_DATABASE=Zenisu Keisoku Inc.
+OUI:000526*
+ ID_OUI_FROM_DATABASE=IPAS GmbH
 
-OUI:000C20*
- ID_OUI_FROM_DATABASE=Fi WIn, Inc.
+OUI:00052D*
+ ID_OUI_FROM_DATABASE=Zoltrix International Limited
 
-OUI:000BED*
- ID_OUI_FROM_DATABASE=ELM Inc.
+OUI:00052C*
+ ID_OUI_FROM_DATABASE=Supreme Magic Corporation
 
-OUI:000BF2*
- ID_OUI_FROM_DATABASE=Chih-Kan Technology Co., Ltd.
+OUI:000520*
+ ID_OUI_FROM_DATABASE=Smartronix, Inc.
 
-OUI:000BE1*
- ID_OUI_FROM_DATABASE=Nokia NET Product Operations
+OUI:00051A*
+ ID_OUI_FROM_DATABASE=3COM EUROPE LTD.
 
-OUI:000BE6*
- ID_OUI_FROM_DATABASE=Datel Electronics
+OUI:000510*
+ ID_OUI_FROM_DATABASE=Infinite Shanghai Communication Terminals Ltd.
 
-OUI:000BDA*
- ID_OUI_FROM_DATABASE=EyeCross Co.,Inc.
+OUI:000514*
+ ID_OUI_FROM_DATABASE=KDT Systems Co., Ltd.
 
-OUI:000BD1*
- ID_OUI_FROM_DATABASE=Aeronix, Inc.
+OUI:000509*
+ ID_OUI_FROM_DATABASE=AVOC Nishimura Ltd.
 
-OUI:000BC5*
- ID_OUI_FROM_DATABASE=SMC Networks, Inc.
+OUI:000503*
+ ID_OUI_FROM_DATABASE=ICONAG
 
-OUI:000BCC*
- ID_OUI_FROM_DATABASE=JUSAN, S.A.
+OUI:00050A*
+ ID_OUI_FROM_DATABASE=ICS Spa
 
-OUI:000BB9*
- ID_OUI_FROM_DATABASE=Imsys AB
+OUI:0004FF*
+ ID_OUI_FROM_DATABASE=Acronet Co., Ltd.
 
-OUI:000BBE*
+OUI:000500*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000BB2*
- ID_OUI_FROM_DATABASE=SMALLBIG TECHNOLOGY
+OUI:000641*
+ ID_OUI_FROM_DATABASE=ITCN
 
-OUI:000BB7*
- ID_OUI_FROM_DATABASE=Micro Systems Co.,Ltd.
+OUI:00063D*
+ ID_OUI_FROM_DATABASE=Microwave Data Systems Inc.
 
-OUI:000C96*
- ID_OUI_FROM_DATABASE=OQO, Inc.
+OUI:000630*
+ ID_OUI_FROM_DATABASE=Adtranz Sweden
 
-OUI:000C9B*
- ID_OUI_FROM_DATABASE=EE Solutions, Inc
+OUI:000637*
+ ID_OUI_FROM_DATABASE=Toptrend-Meta Information (ShenZhen) Inc.
 
-OUI:000C8A*
- ID_OUI_FROM_DATABASE=Bose Corporation
+OUI:000620*
+ ID_OUI_FROM_DATABASE=Serial System Ltd.
 
-OUI:000C8F*
- ID_OUI_FROM_DATABASE=Nergal s.r.l.
+OUI:00061A*
+ ID_OUI_FROM_DATABASE=Zetari Inc.
 
-OUI:000C83*
- ID_OUI_FROM_DATABASE=Logical Solutions
+OUI:00060C*
+ ID_OUI_FROM_DATABASE=Melco Industries, Inc.
 
-OUI:000C88*
- ID_OUI_FROM_DATABASE=Apache Micro Peripherals, Inc.
+OUI:000614*
+ ID_OUI_FROM_DATABASE=Prism Holdings
 
-OUI:000C74*
- ID_OUI_FROM_DATABASE=RIVERTEC CORPORATION
+OUI:000606*
+ ID_OUI_FROM_DATABASE=RapidWAN, Inc.
 
-OUI:000C76*
- ID_OUI_FROM_DATABASE=MICRO-STAR INTERNATIONAL CO., LTD.
+OUI:000677*
+ ID_OUI_FROM_DATABASE=SICK AG
 
-OUI:000C7B*
- ID_OUI_FROM_DATABASE=ALPHA PROJECT Co.,Ltd.
+OUI:000673*
+ ID_OUI_FROM_DATABASE=TKH Security Solutions USA
 
-OUI:000B85*
+OUI:000666*
+ ID_OUI_FROM_DATABASE=Roving Networks
+
+OUI:00066D*
+ ID_OUI_FROM_DATABASE=Compuprint S.P.A.
+
+OUI:00066C*
+ ID_OUI_FROM_DATABASE=Robinson Corporation
+
+OUI:000653*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000B7F*
- ID_OUI_FROM_DATABASE=Align Engineering LLC
+OUI:00065A*
+ ID_OUI_FROM_DATABASE=Strix Systems
 
-OUI:000B84*
- ID_OUI_FROM_DATABASE=BODET
+OUI:00064D*
+ ID_OUI_FROM_DATABASE=Sencore
 
-OUI:000B73*
- ID_OUI_FROM_DATABASE=Kodeos Communications
+OUI:000660*
+ ID_OUI_FROM_DATABASE=NADEX Co., Ltd.
 
-OUI:000B78*
- ID_OUI_FROM_DATABASE=TAIFATECH INC.
+OUI:0005B8*
+ ID_OUI_FROM_DATABASE=Electronic Design Associates, Inc.
 
-OUI:000B6C*
- ID_OUI_FROM_DATABASE=Sychip Inc.
+OUI:0005BF*
+ ID_OUI_FROM_DATABASE=JustEzy Technology, Inc.
 
-OUI:000B60*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0005AE*
+ ID_OUI_FROM_DATABASE=Mediaport USA
 
-OUI:000B65*
- ID_OUI_FROM_DATABASE=Sy.A.C. srl
+OUI:0005B2*
+ ID_OUI_FROM_DATABASE=Medison Co., Ltd.
 
-OUI:000B57*
- ID_OUI_FROM_DATABASE=Silicon Laboratories
+OUI:00059E*
+ ID_OUI_FROM_DATABASE=Zinwell Corporation
 
-OUI:000B5C*
- ID_OUI_FROM_DATABASE=Newtech Co.,Ltd
+OUI:0005A5*
+ ID_OUI_FROM_DATABASE=KOTT
 
-OUI:000B4F*
- ID_OUI_FROM_DATABASE=Verifone, INC.
+OUI:000598*
+ ID_OUI_FROM_DATABASE=CRONOS S.r.l.
 
-OUI:000B43*
- ID_OUI_FROM_DATABASE=Microscan Systems, Inc.
+OUI:0005A4*
+ ID_OUI_FROM_DATABASE=Lucid Voice Ltd.
 
-OUI:000B48*
- ID_OUI_FROM_DATABASE=sofrel
+OUI:000592*
+ ID_OUI_FROM_DATABASE=Pultek Corp.
 
-OUI:000B4A*
- ID_OUI_FROM_DATABASE=Visimetrics (UK) Ltd
+OUI:00058B*
+ ID_OUI_FROM_DATABASE=IPmental, Inc.
 
-OUI:000B35*
- ID_OUI_FROM_DATABASE=Quad Bit System co., Ltd.
+OUI:00058C*
+ ID_OUI_FROM_DATABASE=Opentech Inc.
 
-OUI:000B37*
- ID_OUI_FROM_DATABASE=MANUFACTURE DES MONTRES ROLEX SA
+OUI:00037E*
+ ID_OUI_FROM_DATABASE=PORTech Communications, Inc.
 
-OUI:000B3C*
- ID_OUI_FROM_DATABASE=Cygnal Integrated Products, Inc.
+OUI:000383*
+ ID_OUI_FROM_DATABASE=Metera Networks, Inc.
 
-OUI:000B29*
- ID_OUI_FROM_DATABASE=LS(LG) Industrial Systems co.,Ltd
+OUI:000377*
+ ID_OUI_FROM_DATABASE=Gigabit Wireless
+
+OUI:00037B*
+ ID_OUI_FROM_DATABASE=IDEC IZUMI Corporation
+
+OUI:00036B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:000372*
+ ID_OUI_FROM_DATABASE=ULAN
 
-OUI:000B30*
- ID_OUI_FROM_DATABASE=Beijing Gongye Science & Technology Co.,Ltd
+OUI:000367*
+ ID_OUI_FROM_DATABASE=Jasmine Networks, Inc.
 
-OUI:000BA1*
- ID_OUI_FROM_DATABASE=SYSCOM Ltd.
+OUI:00036A*
+ ID_OUI_FROM_DATABASE=Mainnet, Ltd.
 
-OUI:000BA8*
- ID_OUI_FROM_DATABASE=HANBACK ELECTRONICS CO., LTD.
+OUI:000364*
+ ID_OUI_FROM_DATABASE=Scenix Semiconductor, Inc.
 
-OUI:000B92*
- ID_OUI_FROM_DATABASE=Ascom Danmark A/S
+OUI:00035F*
+ ID_OUI_FROM_DATABASE=Prüftechnik Condition Monitoring GmbH & Co. KG
 
-OUI:000B97*
- ID_OUI_FROM_DATABASE=Matsushita Electric Industrial Co.,Ltd.
+OUI:00035C*
+ ID_OUI_FROM_DATABASE=Saint Song Corp.
 
-OUI:000B9C*
- ID_OUI_FROM_DATABASE=TriBeam Technologies, Inc.
+OUI:00034D*
+ ID_OUI_FROM_DATABASE=Chiaro Networks, Ltd.
 
-OUI:000B8B*
- ID_OUI_FROM_DATABASE=KERAJET, S.A.
+OUI:0003FA*
+ ID_OUI_FROM_DATABASE=TiMetra Networks
 
-OUI:0009D6*
- ID_OUI_FROM_DATABASE=KNC One GmbH
+OUI:0003F5*
+ ID_OUI_FROM_DATABASE=Chip2Chip
 
-OUI:0009D5*
- ID_OUI_FROM_DATABASE=Signal Communication, Inc.
+OUI:0003EE*
+ ID_OUI_FROM_DATABASE=MKNet Corporation
 
-OUI:0009DC*
- ID_OUI_FROM_DATABASE=Galaxis Technology AG
+OUI:0003E8*
+ ID_OUI_FROM_DATABASE=Wavelength Digital Limited
 
-OUI:0009C9*
- ID_OUI_FROM_DATABASE=BlueWINC Co., Ltd.
+OUI:0003E3*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0009D0*
- ID_OUI_FROM_DATABASE=Solacom Technologies Inc.
+OUI:0003DC*
+ ID_OUI_FROM_DATABASE=Lexar Media, Inc.
 
-OUI:0009BC*
- ID_OUI_FROM_DATABASE=Digital Safety Technologies, Inc
+OUI:0003D7*
+ ID_OUI_FROM_DATABASE=NextNet Wireless, Inc.
 
-OUI:0009C1*
- ID_OUI_FROM_DATABASE=PROCES-DATA A/S
+OUI:0003D4*
+ ID_OUI_FROM_DATABASE=Alloptic, Inc.
 
-OUI:0009C4*
- ID_OUI_FROM_DATABASE=Medicore Co., Ltd
+OUI:00030B*
+ ID_OUI_FROM_DATABASE=Hunter Technology, Inc.
 
-OUI:00098F*
- ID_OUI_FROM_DATABASE=Cetacean Networks
+OUI:0003D0*
+ ID_OUI_FROM_DATABASE=KOANKEISO Co., Ltd.
 
-OUI:00097D*
- ID_OUI_FROM_DATABASE=SecWell Networks Oy
+OUI:0003C9*
+ ID_OUI_FROM_DATABASE=TECOM Co., Ltd.
 
-OUI:00097E*
- ID_OUI_FROM_DATABASE=IMI TECHNOLOGY CO., LTD
+OUI:0003C4*
+ ID_OUI_FROM_DATABASE=Tomra Systems ASA
 
-OUI:000983*
- ID_OUI_FROM_DATABASE=GlobalTop Technology, Inc.
+OUI:0004FA*
+ ID_OUI_FROM_DATABASE=NBS Technologies Inc.
 
-OUI:000970*
- ID_OUI_FROM_DATABASE=Vibration Research Corporation
+OUI:0004F9*
+ ID_OUI_FROM_DATABASE=Xtera Communications, Inc.
 
-OUI:000977*
- ID_OUI_FROM_DATABASE=Brunner Elektronik AG
+OUI:0004F3*
+ ID_OUI_FROM_DATABASE=FS FORTH-SYSTEME GmbH
 
-OUI:000964*
- ID_OUI_FROM_DATABASE=Hi-Techniques, Inc.
+OUI:0004E7*
+ ID_OUI_FROM_DATABASE=Lightpointe Communications, Inc
 
-OUI:00096B*
- ID_OUI_FROM_DATABASE=IBM Corp
+OUI:0004ED*
+ ID_OUI_FROM_DATABASE=Billion Electric Co., Ltd.
 
-OUI:000957*
- ID_OUI_FROM_DATABASE=Supercaller, Inc.
+OUI:0004DD*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00095C*
- ID_OUI_FROM_DATABASE=Philips Medical Systems - Cardiac and Monitoring Systems (CM
+OUI:0004D6*
+ ID_OUI_FROM_DATABASE=Takagi Industrial Co., Ltd.
 
-OUI:000AE3*
- ID_OUI_FROM_DATABASE=YANG MEI TECHNOLOGY CO., LTD
+OUI:0004D0*
+ ID_OUI_FROM_DATABASE=Softlink s.r.o.
 
-OUI:000AEA*
- ID_OUI_FROM_DATABASE=ADAM ELEKTRONIK LTD. ŞTI
+OUI:0004CA*
+ ID_OUI_FROM_DATABASE=FreeMs Corp.
 
-OUI:000ADE*
- ID_OUI_FROM_DATABASE=Happy Communication Co., Ltd.
+OUI:0004BE*
+ ID_OUI_FROM_DATABASE=OptXCon, Inc.
 
-OUI:000AD7*
- ID_OUI_FROM_DATABASE=Origin ELECTRIC CO.,LTD.
+OUI:0004C3*
+ ID_OUI_FROM_DATABASE=CASTOR Informatique
 
-OUI:000ACB*
- ID_OUI_FROM_DATABASE=XPAK MSA Group
+OUI:0004C4*
+ ID_OUI_FROM_DATABASE=Allen & Heath Limited
 
-OUI:000AD0*
- ID_OUI_FROM_DATABASE=Niigata Develoment Center,  F.I.T. Co., Ltd.
+OUI:0004B7*
+ ID_OUI_FROM_DATABASE=AMB i.t. Holding
 
-OUI:000AD2*
- ID_OUI_FROM_DATABASE=JEPICO Corporation
+OUI:0004B1*
+ ID_OUI_FROM_DATABASE=Signal Technology, Inc.
 
-OUI:000ABD*
- ID_OUI_FROM_DATABASE=Rupprecht & Patashnick Co.
+OUI:0004AD*
+ ID_OUI_FROM_DATABASE=Malibu Networks
 
-OUI:000ABF*
- ID_OUI_FROM_DATABASE=HIROTA SS
+OUI:0004AA*
+ ID_OUI_FROM_DATABASE=Jetstream Communications
 
-OUI:000AC4*
- ID_OUI_FROM_DATABASE=Daewoo Teletech Co., Ltd
+OUI:00049D*
+ ID_OUI_FROM_DATABASE=Ipanema Technologies
 
-OUI:000AAC*
- ID_OUI_FROM_DATABASE=TerraTec Electronic GmbH
+OUI:000497*
+ ID_OUI_FROM_DATABASE=MacroSystem Digital Video AG
 
-OUI:000AB1*
- ID_OUI_FROM_DATABASE=GENETEC Corporation
+OUI:000490*
+ ID_OUI_FROM_DATABASE=Optical Access
 
-OUI:000AB8*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00048B*
+ ID_OUI_FROM_DATABASE=Poscon Corporation
 
-OUI:000AA5*
- ID_OUI_FROM_DATABASE=MAXLINK INDUSTRIES LIMITED
+OUI:000341*
+ ID_OUI_FROM_DATABASE=Axon Digital Design
 
-OUI:000A8D*
- ID_OUI_FROM_DATABASE=EUROTHERM LIMITED
+OUI:00033E*
+ ID_OUI_FROM_DATABASE=Tateyama System Laboratory Co., Ltd.
 
-OUI:000A9E*
- ID_OUI_FROM_DATABASE=BroadWeb Corportation
+OUI:00033A*
+ ID_OUI_FROM_DATABASE=Silicon Wave, Inc.
 
-OUI:000AA0*
- ID_OUI_FROM_DATABASE=Cedar Point Communications
+OUI:000333*
+ ID_OUI_FROM_DATABASE=Digitel Co., Ltd.
 
-OUI:000A98*
- ID_OUI_FROM_DATABASE=M+F Gwinner GmbH & Co
+OUI:00032B*
+ ID_OUI_FROM_DATABASE=GAI Datenfunksysteme GmbH
 
-OUI:000A92*
- ID_OUI_FROM_DATABASE=Presonus Corporation
+OUI:000327*
+ ID_OUI_FROM_DATABASE=ACT'L
 
-OUI:000A7E*
- ID_OUI_FROM_DATABASE=The Advantage Group
+OUI:00032E*
+ ID_OUI_FROM_DATABASE=Scope Information Management, Ltd.
 
-OUI:000A85*
- ID_OUI_FROM_DATABASE=PLAT'C2,Inc
+OUI:000322*
+ ID_OUI_FROM_DATABASE=IDIS Co., Ltd.
 
-OUI:000A8A*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00031E*
+ ID_OUI_FROM_DATABASE=Optranet, Inc.
 
-OUI:0009B5*
- ID_OUI_FROM_DATABASE=3J Tech. Co., Ltd.
+OUI:00B052*
+ ID_OUI_FROM_DATABASE=Atheros Communications
 
-OUI:0009AF*
- ID_OUI_FROM_DATABASE=e-generis
+OUI:000319*
+ ID_OUI_FROM_DATABASE=Infineon AG
 
-OUI:0009B0*
- ID_OUI_FROM_DATABASE=Onkyo Corporation
+OUI:000316*
+ ID_OUI_FROM_DATABASE=Nobell Communications, Inc.
 
-OUI:0009A9*
- ID_OUI_FROM_DATABASE=Ikanos Communications
+OUI:000312*
+ ID_OUI_FROM_DATABASE=TR-Systemtechnik GmbH
 
-OUI:00099D*
- ID_OUI_FROM_DATABASE=Haliplex Communications
+OUI:000447*
+ ID_OUI_FROM_DATABASE=Acrowave Systems Co., Ltd.
 
-OUI:0009A2*
- ID_OUI_FROM_DATABASE=Interface Co., Ltd.
+OUI:00043B*
+ ID_OUI_FROM_DATABASE=Lava Computer Mfg., Inc.
 
-OUI:000990*
- ID_OUI_FROM_DATABASE=ACKSYS Communications & systems
+OUI:000440*
+ ID_OUI_FROM_DATABASE=cyberPIXIE, Inc.
 
-OUI:000996*
- ID_OUI_FROM_DATABASE=RDI
+OUI:00043A*
+ ID_OUI_FROM_DATABASE=Intelligent Telecommunications, Inc.
 
-OUI:00098A*
- ID_OUI_FROM_DATABASE=EqualLogic Inc
+OUI:000434*
+ ID_OUI_FROM_DATABASE=Accelent Systems, Inc.
 
-OUI:000A77*
- ID_OUI_FROM_DATABASE=Bluewire Technologies LLC
+OUI:00042D*
+ ID_OUI_FROM_DATABASE=Sarian Systems, Ltd.
 
-OUI:000A79*
- ID_OUI_FROM_DATABASE=corega K.K
+OUI:00042E*
+ ID_OUI_FROM_DATABASE=Netous Technologies, Ltd.
 
-OUI:000A72*
- ID_OUI_FROM_DATABASE=STEC, INC.
+OUI:000428*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000A5F*
- ID_OUI_FROM_DATABASE=almedio inc.
+OUI:000421*
+ ID_OUI_FROM_DATABASE=Ocular Networks
 
-OUI:000A66*
- ID_OUI_FROM_DATABASE=MITSUBISHI ELECTRIC SYSTEM & SERVICE CO.,LTD.
+OUI:000417*
+ ID_OUI_FROM_DATABASE=ELAU AG
 
-OUI:000A6B*
- ID_OUI_FROM_DATABASE=Tadiran Telecom Business Systems LTD
+OUI:000411*
+ ID_OUI_FROM_DATABASE=Inkra Networks, Inc.
 
-OUI:000A5A*
- ID_OUI_FROM_DATABASE=GreenNET Technologies Co.,Ltd.
+OUI:00040B*
+ ID_OUI_FROM_DATABASE=3COM EUROPE LTD.
 
-OUI:000A53*
- ID_OUI_FROM_DATABASE=Intronics, Incorporated
+OUI:000404*
+ ID_OUI_FROM_DATABASE=Makino Milling Machine Co., Ltd.
 
-OUI:000A58*
- ID_OUI_FROM_DATABASE=Freyer & Siegel Elektronik GmbH & Co. KG
+OUI:000481*
+ ID_OUI_FROM_DATABASE=Econolite Control Products, Inc.
 
-OUI:000A4C*
- ID_OUI_FROM_DATABASE=Molecular Devices Corporation
+OUI:000486*
+ ID_OUI_FROM_DATABASE=ITTC, University of Kansas
 
-OUI:000B24*
- ID_OUI_FROM_DATABASE=AirLogic
+OUI:000477*
+ ID_OUI_FROM_DATABASE=Scalant Systems, Inc.
 
-OUI:000B1D*
- ID_OUI_FROM_DATABASE=LayerZero Power Systems, Inc.
+OUI:000476*
+ ID_OUI_FROM_DATABASE=3 Com Corporation
 
-OUI:000B16*
- ID_OUI_FROM_DATABASE=Communication Machinery Corporation
+OUI:000469*
+ ID_OUI_FROM_DATABASE=Innocom, Inc.
 
-OUI:000B18*
- ID_OUI_FROM_DATABASE=Private
+OUI:000470*
+ ID_OUI_FROM_DATABASE=ipUnplugged AB
 
-OUI:000B11*
- ID_OUI_FROM_DATABASE=HIMEJI ABC TRADING CO.,LTD.
+OUI:00046A*
+ ID_OUI_FROM_DATABASE=Navini Networks
 
-OUI:000B0A*
- ID_OUI_FROM_DATABASE=dBm Optics
+OUI:000464*
+ ID_OUI_FROM_DATABASE=Pulse-Link Inc
 
-OUI:000B05*
- ID_OUI_FROM_DATABASE=Pacific Broadband Networks
+OUI:00045D*
+ ID_OUI_FROM_DATABASE=BEKA Elektronik
 
-OUI:000AFE*
- ID_OUI_FROM_DATABASE=NovaPal Ltd
+OUI:000457*
+ ID_OUI_FROM_DATABASE=Universal Access Technology, Inc.
 
-OUI:000B03*
- ID_OUI_FROM_DATABASE=Taekwang Industrial Co., Ltd
+OUI:000451*
+ ID_OUI_FROM_DATABASE=Medrad, Inc.
 
-OUI:000AEF*
- ID_OUI_FROM_DATABASE=OTRUM ASA
+OUI:0003C1*
+ ID_OUI_FROM_DATABASE=Packet Dynamics Ltd
 
-OUI:000AF2*
- ID_OUI_FROM_DATABASE=NeoAxiom Corp.
+OUI:0003BD*
+ ID_OUI_FROM_DATABASE=OmniCluster Technologies, Inc.
 
-OUI:000A05*
- ID_OUI_FROM_DATABASE=Widax Corp.
+OUI:0003B8*
+ ID_OUI_FROM_DATABASE=NetKit Solutions, LLC
 
-OUI:000A0A*
- ID_OUI_FROM_DATABASE=SUNIX Co., Ltd.
+OUI:0003B6*
+ ID_OUI_FROM_DATABASE=QSI Corporation
 
-OUI:000A0F*
- ID_OUI_FROM_DATABASE=Ilryung Telesys, Inc
+OUI:0003A6*
+ ID_OUI_FROM_DATABASE=Traxit Technology, Inc.
 
-OUI:0009FF*
- ID_OUI_FROM_DATABASE=X.net 2000 GmbH
+OUI:0003AB*
+ ID_OUI_FROM_DATABASE=Bridge Information Systems
 
-OUI:0009FE*
- ID_OUI_FROM_DATABASE=Daisy Technologies, Inc.
+OUI:0003A3*
+ ID_OUI_FROM_DATABASE=MAVIX, Ltd.
 
-OUI:000A00*
- ID_OUI_FROM_DATABASE=Mediatek Corp.
+OUI:00039F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0009F6*
- ID_OUI_FROM_DATABASE=Shenzhen Eastern Digital Tech Ltd.
+OUI:00039A*
+ ID_OUI_FROM_DATABASE=SiConnect
 
-OUI:0009F5*
- ID_OUI_FROM_DATABASE=Emerson Network Power Co.,Ltd
+OUI:00038C*
+ ID_OUI_FROM_DATABASE=Total Impact
 
-OUI:0009E8*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:000384*
+ ID_OUI_FROM_DATABASE=AETA
 
-OUI:0009EF*
- ID_OUI_FROM_DATABASE=Vocera Communications
+OUI:000387*
+ ID_OUI_FROM_DATABASE=Blaze Network Products
 
-OUI:0009E3*
- ID_OUI_FROM_DATABASE=Angel Iglesias S.A.
+OUI:000306*
+ ID_OUI_FROM_DATABASE=Fusion In Tech Co., Ltd.
 
-OUI:000A39*
- ID_OUI_FROM_DATABASE=LoPA Information Technology
+OUI:000303*
+ ID_OUI_FROM_DATABASE=JAMA Electronics Co., Ltd.
 
-OUI:000A40*
- ID_OUI_FROM_DATABASE=Crown Audio -- Harmanm International
+OUI:0002FF*
+ ID_OUI_FROM_DATABASE=Handan BroadInfoCom
 
-OUI:000A45*
- ID_OUI_FROM_DATABASE=Audio-Technica Corp.
+OUI:0002F3*
+ ID_OUI_FROM_DATABASE=Media Serve Co., Ltd.
 
-OUI:000A47*
- ID_OUI_FROM_DATABASE=Allied Vision Technologies
+OUI:0002FA*
+ ID_OUI_FROM_DATABASE=DX Antenna Co., Ltd.
 
-OUI:000A34*
- ID_OUI_FROM_DATABASE=Identicard Systems Incorporated
+OUI:0002ED*
+ ID_OUI_FROM_DATABASE=DXO Telecom Co., Ltd.
 
-OUI:000A2D*
- ID_OUI_FROM_DATABASE=Cabot Communications Limited
+OUI:0002E5*
+ ID_OUI_FROM_DATABASE=Timeware Ltd.
 
-OUI:000A22*
- ID_OUI_FROM_DATABASE=Amperion Inc
+OUI:0002E8*
+ ID_OUI_FROM_DATABASE=E.D.&A.
 
-OUI:000A16*
- ID_OUI_FROM_DATABASE=Lassen Research
+OUI:0002DC*
+ ID_OUI_FROM_DATABASE=Fujitsu General Limited
 
-OUI:000A1B*
- ID_OUI_FROM_DATABASE=Stream Labs
+OUI:0002E1*
+ ID_OUI_FROM_DATABASE=Integrated Network Corporation
 
-OUI:000878*
- ID_OUI_FROM_DATABASE=Benchmark Storage Innovations
+OUI:0002D5*
+ ID_OUI_FROM_DATABASE=ACR
 
-OUI:000872*
- ID_OUI_FROM_DATABASE=Sorenson Communications
+OUI:0002CE*
+ ID_OUI_FROM_DATABASE=FoxJet, Inc.
 
-OUI:00087E*
- ID_OUI_FROM_DATABASE=Bon Electro-Telecom Inc.
+OUI:00B0DB*
+ ID_OUI_FROM_DATABASE=Nextcell, Inc.
 
-OUI:00086B*
- ID_OUI_FROM_DATABASE=MIPSYS
+OUI:00B08E*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000865*
- ID_OUI_FROM_DATABASE=JASCOM CO., LTD
+OUI:00B01C*
+ ID_OUI_FROM_DATABASE=Westport Technologies
 
-OUI:000866*
- ID_OUI_FROM_DATABASE=DSX Access Systems, Inc.
+OUI:00B02D*
+ ID_OUI_FROM_DATABASE=ViaGate Technologies, Inc.
 
-OUI:00085F*
- ID_OUI_FROM_DATABASE=Picanol N.V.
+OUI:00B03B*
+ ID_OUI_FROM_DATABASE=HiQ Networks
 
-OUI:000859*
- ID_OUI_FROM_DATABASE=ShenZhen Unitone Electronics Co., Ltd.
+OUI:0030A9*
+ ID_OUI_FROM_DATABASE=Netiverse, Inc.
 
-OUI:000853*
- ID_OUI_FROM_DATABASE=Schleicher GmbH & Co. Relaiswerke KG
+OUI:00B0F0*
+ ID_OUI_FROM_DATABASE=CALY NETWORKS
 
-OUI:000858*
- ID_OUI_FROM_DATABASE=Novatechnology Inc.
+OUI:00B086*
+ ID_OUI_FROM_DATABASE=LocSoft Limited
 
-OUI:00081D*
- ID_OUI_FROM_DATABASE=Ipsil, Incorporated
+OUI:0030C4*
+ ID_OUI_FROM_DATABASE=Canon Imaging Systems Inc.
 
-OUI:000829*
- ID_OUI_FROM_DATABASE=Aval Nagasaki Corporation
+OUI:00309D*
+ ID_OUI_FROM_DATABASE=Nimble Microsystems, Inc.
 
-OUI:000823*
- ID_OUI_FROM_DATABASE=Texa Corp.
+OUI:003037*
+ ID_OUI_FROM_DATABASE=Packard Bell Nec Services
 
-OUI:00082A*
- ID_OUI_FROM_DATABASE=Powerwallz Network Security
+OUI:00302E*
+ ID_OUI_FROM_DATABASE=Hoft & Wessel AG
 
-OUI:000817*
- ID_OUI_FROM_DATABASE=EmergeCore Networks LLC
+OUI:00301B*
+ ID_OUI_FROM_DATABASE=SHUTTLE, INC.
 
-OUI:00091E*
- ID_OUI_FROM_DATABASE=Firstech Technology Corp.
+OUI:003028*
+ ID_OUI_FROM_DATABASE=FASE Saldatura srl
 
-OUI:000925*
- ID_OUI_FROM_DATABASE=VSN Systemen BV
+OUI:0030FB*
+ ID_OUI_FROM_DATABASE=AZS Technology AG
 
-OUI:000918*
- ID_OUI_FROM_DATABASE=SAMSUNG TECHWIN CO.,LTD
+OUI:0001DA*
+ ID_OUI_FROM_DATABASE=WINCOMM Corporation
 
-OUI:000917*
- ID_OUI_FROM_DATABASE=WEM Technology Inc
+OUI:0001DD*
+ ID_OUI_FROM_DATABASE=Avail Networks
 
-OUI:000912*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0001CE*
+ ID_OUI_FROM_DATABASE=Custom Micro Products, Ltd.
 
-OUI:00090B*
- ID_OUI_FROM_DATABASE=MTL  Instruments PLC
+OUI:0001CA*
+ ID_OUI_FROM_DATABASE=Geocast Network Systems, Inc.
 
-OUI:000905*
- ID_OUI_FROM_DATABASE=iTEC Technologies Ltd.
+OUI:0001B8*
+ ID_OUI_FROM_DATABASE=Netsensity, Inc.
 
-OUI:0008FF*
- ID_OUI_FROM_DATABASE=Trilogy Communications Ltd
+OUI:0001BD*
+ ID_OUI_FROM_DATABASE=Peterson Electro-Musical Products, Inc.
 
-OUI:000906*
- ID_OUI_FROM_DATABASE=Esteem Networks
+OUI:0001B4*
+ ID_OUI_FROM_DATABASE=Wayport, Inc.
 
-OUI:0008FB*
- ID_OUI_FROM_DATABASE=SonoSite, Inc.
+OUI:0001C3*
+ ID_OUI_FROM_DATABASE=Acromag, Inc.
 
-OUI:0008F2*
- ID_OUI_FROM_DATABASE=C&S Technology
+OUI:0001BF*
+ ID_OUI_FROM_DATABASE=Teleforce Co., Ltd.
 
-OUI:0008F7*
- ID_OUI_FROM_DATABASE=Hitachi Ltd, Semiconductor & Integrated Circuits Gr
+OUI:0001AD*
+ ID_OUI_FROM_DATABASE=Coach Master International  d.b.a. CMI Worldwide, Inc.
 
-OUI:0008ED*
- ID_OUI_FROM_DATABASE=ST&T Instrument Corp.
+OUI:00017E*
+ ID_OUI_FROM_DATABASE=ADTEK System Science Co., Ltd.
 
-OUI:0007D1*
- ID_OUI_FROM_DATABASE=Spectrum Signal Processing Inc.
+OUI:00018A*
+ ID_OUI_FROM_DATABASE=ROI COMPUTER AG
 
-OUI:0007CE*
- ID_OUI_FROM_DATABASE=Cabletime Limited
+OUI:000119*
+ ID_OUI_FROM_DATABASE=RTUnet (Australia)
 
-OUI:0007C8*
- ID_OUI_FROM_DATABASE=Brain21, Inc.
+OUI:000125*
+ ID_OUI_FROM_DATABASE=YAESU MUSEN CO., LTD.
 
-OUI:0007BC*
- ID_OUI_FROM_DATABASE=Identix Inc.
+OUI:000121*
+ ID_OUI_FROM_DATABASE=Watchguard Technologies, Inc.
 
-OUI:00047C*
- ID_OUI_FROM_DATABASE=Skidata AG
+OUI:000128*
+ ID_OUI_FROM_DATABASE=EnjoyWeb, Inc.
 
-OUI:0007BB*
- ID_OUI_FROM_DATABASE=Candera Inc.
+OUI:000106*
+ ID_OUI_FROM_DATABASE=Tews Datentechnik GmbH
 
-OUI:0007C2*
- ID_OUI_FROM_DATABASE=Netsys Telecom
+OUI:000112*
+ ID_OUI_FROM_DATABASE=Shark Multimedia Inc.
 
-OUI:0007B5*
- ID_OUI_FROM_DATABASE=Any One Wireless Ltd.
+OUI:000102*
+ ID_OUI_FROM_DATABASE=3COM CORPORATION
 
-OUI:0007AF*
- ID_OUI_FROM_DATABASE=Red Lion Controls, LP
+OUI:000115*
+ ID_OUI_FROM_DATABASE=EXTRATECH CORPORATION
 
-OUI:0007A2*
- ID_OUI_FROM_DATABASE=Opteon Corporation
+OUI:000109*
+ ID_OUI_FROM_DATABASE=Nagano Japan Radio Co., Ltd.
 
-OUI:0007A7*
- ID_OUI_FROM_DATABASE=A-Z Inc.
+OUI:081443*
+ ID_OUI_FROM_DATABASE=UNIBRAIN S.A.
 
-OUI:0007A1*
- ID_OUI_FROM_DATABASE=VIASYS Healthcare GmbH
+OUI:00B0F5*
+ ID_OUI_FROM_DATABASE=NetWorth Technologies, Inc.
 
-OUI:0007A8*
- ID_OUI_FROM_DATABASE=Haier Group Technologies Ltd.
+OUI:00B019*
+ ID_OUI_FROM_DATABASE=UTC CCS
 
-OUI:00094A*
- ID_OUI_FROM_DATABASE=Homenet Communications
+OUI:00B02A*
+ ID_OUI_FROM_DATABASE=ORSYS GmbH
 
-OUI:000949*
- ID_OUI_FROM_DATABASE=Glyph Technologies Inc.
+OUI:00B0AE*
+ ID_OUI_FROM_DATABASE=Symmetricom
 
-OUI:000950*
- ID_OUI_FROM_DATABASE=Independent Storage Corporation
+OUI:000181*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:000944*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00018D*
+ ID_OUI_FROM_DATABASE=AudeSi Technologies
 
-OUI:00093D*
- ID_OUI_FROM_DATABASE=Newisys,Inc.
+OUI:00019A*
+ ID_OUI_FROM_DATABASE=LEUNIG GmbH
 
-OUI:000937*
- ID_OUI_FROM_DATABASE=Inventec Appliance Corp
+OUI:000193*
+ ID_OUI_FROM_DATABASE=Hanbyul Telecom Co., Ltd.
 
-OUI:000931*
- ID_OUI_FROM_DATABASE=Future Internet, Inc.
+OUI:0001A2*
+ ID_OUI_FROM_DATABASE=Logical Co., Ltd.
 
-OUI:000938*
- ID_OUI_FROM_DATABASE=Allot Communications
+OUI:000196*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00092A*
- ID_OUI_FROM_DATABASE=MYTECS Co.,Ltd.
+OUI:0001A6*
+ ID_OUI_FROM_DATABASE=Scientific-Atlanta Arcodan A/S
 
-OUI:0008B1*
- ID_OUI_FROM_DATABASE=ProQuent Systems
+OUI:000172*
+ ID_OUI_FROM_DATABASE=TechnoLand Co., LTD.
 
-OUI:0008AB*
- ID_OUI_FROM_DATABASE=EnerLinx.com, Inc.
+OUI:00303F*
+ ID_OUI_FROM_DATABASE=TurboComm Tech Inc.
 
-OUI:0008AC*
- ID_OUI_FROM_DATABASE=Eltromat GmbH
+OUI:003073*
+ ID_OUI_FROM_DATABASE=International Microsystems, In
 
-OUI:0008A5*
- ID_OUI_FROM_DATABASE=Peninsula Systems Inc.
+OUI:00014D*
+ ID_OUI_FROM_DATABASE=Shin Kin Enterprises Co., Ltd
 
-OUI:000899*
- ID_OUI_FROM_DATABASE=Netbind, Inc.
+OUI:00016B*
+ ID_OUI_FROM_DATABASE=LightChip, Inc.
 
-OUI:00089E*
- ID_OUI_FROM_DATABASE=Beijing Enter-Net co.LTD
+OUI:000167*
+ ID_OUI_FROM_DATABASE=HIOKI E.E. CORPORATION
 
-OUI:000895*
- ID_OUI_FROM_DATABASE=DIRC Technologie GmbH & Co.KG
+OUI:000215*
+ ID_OUI_FROM_DATABASE=Cotas Computer Technology A/B
 
-OUI:000891*
- ID_OUI_FROM_DATABASE=Lyan Inc.
+OUI:000211*
+ ID_OUI_FROM_DATABASE=Nature Worldwide Technology Corp.
 
-OUI:00088B*
- ID_OUI_FROM_DATABASE=Tropic Networks Inc.
+OUI:000209*
+ ID_OUI_FROM_DATABASE=Shenzhen SED Information Technology Co., Ltd.
 
-OUI:00088A*
- ID_OUI_FROM_DATABASE=Minds@Work
+OUI:000205*
+ ID_OUI_FROM_DATABASE=Hitachi Denshi, Ltd.
 
-OUI:000885*
- ID_OUI_FROM_DATABASE=EMS Dr. Thomas Wünsche
+OUI:000202*
+ ID_OUI_FROM_DATABASE=Amino Communications, Ltd.
 
-OUI:0008E8*
- ID_OUI_FROM_DATABASE=Excel Master Ltd.
+OUI:0001F6*
+ ID_OUI_FROM_DATABASE=Association of Musical Electronics Industry
 
-OUI:0008E7*
- ID_OUI_FROM_DATABASE=SHI ControlSystems,Ltd.
+OUI:0001ED*
+ ID_OUI_FROM_DATABASE=SETA Corp.
 
-OUI:0008E1*
- ID_OUI_FROM_DATABASE=Barix AG
+OUI:0001E9*
+ ID_OUI_FROM_DATABASE=Litton Marine Systems B.V.
 
-OUI:0008DA*
- ID_OUI_FROM_DATABASE=SofaWare Technologies Ltd.
+OUI:0002C6*
+ ID_OUI_FROM_DATABASE=Data Track Technology PLC
 
-OUI:0008D5*
- ID_OUI_FROM_DATABASE=Vanguard Networks Solutions, LLC
+OUI:0002C2*
+ ID_OUI_FROM_DATABASE=Net Vision Telecom
 
-OUI:0008CE*
- ID_OUI_FROM_DATABASE=IPMobileNet Inc.
+OUI:0002B9*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0008C8*
- ID_OUI_FROM_DATABASE=Soneticom, Inc.
+OUI:0002B4*
+ ID_OUI_FROM_DATABASE=DAPHNE
 
-OUI:0008C4*
- ID_OUI_FROM_DATABASE=Hikari Co.,Ltd.
+OUI:0002AD*
+ ID_OUI_FROM_DATABASE=HOYA Corporation
 
-OUI:0008BE*
- ID_OUI_FROM_DATABASE=XENPAK MSA Group
+OUI:0002A6*
+ ID_OUI_FROM_DATABASE=Effinet Systems Co., Ltd.
 
-OUI:0008B8*
- ID_OUI_FROM_DATABASE=E.F. Johnson
+OUI:0002A1*
+ ID_OUI_FROM_DATABASE=World Wide Packets
 
-OUI:00079B*
- ID_OUI_FROM_DATABASE=Aurora Networks
+OUI:00029B*
+ ID_OUI_FROM_DATABASE=Kreatel Communications AB
 
-OUI:00078F*
- ID_OUI_FROM_DATABASE=Emkay Innovative Products
+OUI:00029E*
+ ID_OUI_FROM_DATABASE=Information Equipment Co., Ltd.
 
-OUI:000788*
- ID_OUI_FROM_DATABASE=Clipcomm, Inc.
+OUI:000296*
+ ID_OUI_FROM_DATABASE=Lectron Co,. Ltd.
 
-OUI:000779*
- ID_OUI_FROM_DATABASE=Sungil Telecom Co., Ltd.
+OUI:00028F*
+ ID_OUI_FROM_DATABASE=Globetek, Inc.
 
-OUI:000778*
- ID_OUI_FROM_DATABASE=GERSTEL GmbH & Co. KG
+OUI:000289*
+ ID_OUI_FROM_DATABASE=DNE Technologies
 
-OUI:00076C*
- ID_OUI_FROM_DATABASE=Daehanet, Inc.
+OUI:000285*
+ ID_OUI_FROM_DATABASE=Riverstone Networks
 
-OUI:00075C*
- ID_OUI_FROM_DATABASE=Eastman Kodak Company
+OUI:00027E*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000768*
- ID_OUI_FROM_DATABASE=Danfoss A/S
+OUI:000280*
+ ID_OUI_FROM_DATABASE=Mu Net, Inc.
 
-OUI:000762*
- ID_OUI_FROM_DATABASE=Group Sense Limited
+OUI:000279*
+ ID_OUI_FROM_DATABASE=Control Applications, Ltd.
 
-OUI:000755*
- ID_OUI_FROM_DATABASE=Lafon
+OUI:000272*
+ ID_OUI_FROM_DATABASE=CC&C Technologies, Inc.
 
-OUI:00074F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00026B*
+ ID_OUI_FROM_DATABASE=BCM Computers Co., Ltd.
 
-OUI:000741*
- ID_OUI_FROM_DATABASE=Sierra Automated Systems
+OUI:00026D*
+ ID_OUI_FROM_DATABASE=Adept Telecom
 
-OUI:000749*
- ID_OUI_FROM_DATABASE=CENiX Inc.
+OUI:000262*
+ ID_OUI_FROM_DATABASE=Soyo Group Soyo Com Tech Co., Ltd
 
-OUI:000735*
- ID_OUI_FROM_DATABASE=Flarion Technologies, Inc.
+OUI:000260*
+ ID_OUI_FROM_DATABASE=Accordion Networks, Inc.
 
-OUI:00073B*
- ID_OUI_FROM_DATABASE=Tenovis GmbH & Co KG
+OUI:00025B*
+ ID_OUI_FROM_DATABASE=Cambridge Silicon Radio
 
-OUI:000729*
- ID_OUI_FROM_DATABASE=Kistler Instrumente AG
+OUI:000087*
+ ID_OUI_FROM_DATABASE=HITACHI, LTD.
 
-OUI:00072E*
- ID_OUI_FROM_DATABASE=North Node AB
+OUI:000252*
+ ID_OUI_FROM_DATABASE=Carrier Corporation
 
-OUI:000728*
- ID_OUI_FROM_DATABASE=Neo Telecom
+OUI:00024B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000718*
- ID_OUI_FROM_DATABASE=iCanTek Co., Ltd.
+OUI:000246*
+ ID_OUI_FROM_DATABASE=All-Win Tech Co., Ltd.
 
-OUI:000806*
- ID_OUI_FROM_DATABASE=Raonet Systems, Inc.
+OUI:00017A*
+ ID_OUI_FROM_DATABASE=Chengdu Maipu Electric Industrial Co., Ltd.
 
-OUI:0007FD*
- ID_OUI_FROM_DATABASE=LANergy Ltd.
+OUI:000235*
+ ID_OUI_FROM_DATABASE=Paragon Networks International
 
-OUI:0007F6*
- ID_OUI_FROM_DATABASE=Qqest Software Systems
+OUI:000238*
+ ID_OUI_FROM_DATABASE=Serome Technology, Inc.
 
-OUI:0007FC*
- ID_OUI_FROM_DATABASE=Adept Systems Inc.
+OUI:000230*
+ ID_OUI_FROM_DATABASE=Intersoft Electronics
 
-OUI:0007EA*
- ID_OUI_FROM_DATABASE=Massana, Inc.
+OUI:000229*
+ ID_OUI_FROM_DATABASE=Adtec Corporation
 
-OUI:0007F0*
- ID_OUI_FROM_DATABASE=LogiSync LLC
+OUI:000225*
+ ID_OUI_FROM_DATABASE=One Stop Systems
 
-OUI:0007E3*
- ID_OUI_FROM_DATABASE=Navcom Technology, Inc.
+OUI:00021C*
+ ID_OUI_FROM_DATABASE=Network Elements, Inc.
 
-OUI:0007E4*
- ID_OUI_FROM_DATABASE=SoftRadio Co., Ltd.
+OUI:000221*
+ ID_OUI_FROM_DATABASE=DSP Application, Ltd.
 
-OUI:0007DD*
- ID_OUI_FROM_DATABASE=Cradle Technologies
+OUI:00016E*
+ ID_OUI_FROM_DATABASE=Conklin Corporation
 
-OUI:0007D7*
- ID_OUI_FROM_DATABASE=Caporis Networks AG
+OUI:00015B*
+ ID_OUI_FROM_DATABASE=ITALTEL S.p.A/RF-UP-I
 
-OUI:0006E3*
- ID_OUI_FROM_DATABASE=Quantitative Imaging Corporation
+OUI:000154*
+ ID_OUI_FROM_DATABASE=G3M Corporation
 
-OUI:0006DD*
- ID_OUI_FROM_DATABASE=AT & T Laboratories - Cambridge Ltd
+OUI:000150*
+ ID_OUI_FROM_DATABASE=GILAT COMMUNICATIONS, LTD.
 
-OUI:0006A4*
- ID_OUI_FROM_DATABASE=INNOWELL Corp.
+OUI:00012E*
+ ID_OUI_FROM_DATABASE=PC Partner Ltd.
 
-OUI:0006D3*
- ID_OUI_FROM_DATABASE=Alpha Telecom, Inc. U.S.A.
+OUI:00013A*
+ ID_OUI_FROM_DATABASE=SHELCAD COMMUNICATIONS, LTD.
 
-OUI:0006D2*
- ID_OUI_FROM_DATABASE=Tundra Semiconductor Corp.
+OUI:000141*
+ ID_OUI_FROM_DATABASE=CABLE PRINT
 
-OUI:000647*
- ID_OUI_FROM_DATABASE=Etrali S.A.
+OUI:000131*
+ ID_OUI_FROM_DATABASE=Bosch Security Systems, Inc.
 
-OUI:0006D9*
- ID_OUI_FROM_DATABASE=IPM-Net S.p.A.
+OUI:00013D*
+ ID_OUI_FROM_DATABASE=RiscStation Ltd.
 
-OUI:0005EA*
- ID_OUI_FROM_DATABASE=Rednix
+OUI:000149*
+ ID_OUI_FROM_DATABASE=T.D.T. Transfer Data Test GmbH
 
-OUI:0006CD*
- ID_OUI_FROM_DATABASE=Leaf Imaging Ltd.
+OUI:00D047*
+ ID_OUI_FROM_DATABASE=XN TECHNOLOGIES
 
-OUI:0006BC*
- ID_OUI_FROM_DATABASE=Macrolink, Inc.
+OUI:00D018*
+ ID_OUI_FROM_DATABASE=QWES. COM, INC.
 
-OUI:0006C6*
- ID_OUI_FROM_DATABASE=lesswire AG
+OUI:00D048*
+ ID_OUI_FROM_DATABASE=ECTON, INC.
 
-OUI:000654*
- ID_OUI_FROM_DATABASE=Winpresa Building Automation Technologies GmbH
+OUI:00D028*
+ ID_OUI_FROM_DATABASE=Harmonic, Inc
 
-OUI:0006B6*
- ID_OUI_FROM_DATABASE=Nir-Or Israel Ltd.
+OUI:00D02F*
+ ID_OUI_FROM_DATABASE=VLSI TECHNOLOGY INC.
 
-OUI:0006B0*
- ID_OUI_FROM_DATABASE=Comtech EF Data Corp.
+OUI:00D025*
+ ID_OUI_FROM_DATABASE=XROSSTECH, INC.
 
-OUI:00071F*
- ID_OUI_FROM_DATABASE=European Systems Integration
+OUI:00D085*
+ ID_OUI_FROM_DATABASE=OTIS ELEVATOR COMPANY
 
-OUI:000724*
- ID_OUI_FROM_DATABASE=Telemax Co., Ltd.
+OUI:00D077*
+ ID_OUI_FROM_DATABASE=LUCENT TECHNOLOGIES
 
-OUI:000707*
- ID_OUI_FROM_DATABASE=Interalia Inc.
+OUI:00D093*
+ ID_OUI_FROM_DATABASE=TQ - COMPONENTS GMBH
 
-OUI:00070C*
- ID_OUI_FROM_DATABASE=SVA-Intrusion.com Co. Ltd.
+OUI:00D013*
+ ID_OUI_FROM_DATABASE=PRIMEX AEROSPACE COMPANY
 
-OUI:000711*
- ID_OUI_FROM_DATABASE=Acterna
+OUI:00D056*
+ ID_OUI_FROM_DATABASE=SOMAT CORPORATION
 
-OUI:000712*
- ID_OUI_FROM_DATABASE=JAL Information Technology
+OUI:00D017*
+ ID_OUI_FROM_DATABASE=SYNTECH INFORMATION CO., LTD.
 
-OUI:0006FA*
- ID_OUI_FROM_DATABASE=IP SQUARE Co, Ltd.
+OUI:00D036*
+ ID_OUI_FROM_DATABASE=TECHNOLOGY ATLANTA CORP.
 
-OUI:0006EF*
- ID_OUI_FROM_DATABASE=Maxxan Systems, Inc.
+OUI:00D0D6*
+ ID_OUI_FROM_DATABASE=AETHRA TELECOMUNICAZIONI
 
-OUI:0006EA*
- ID_OUI_FROM_DATABASE=ELZET80 Mikrocomputer GmbH&Co. KG
+OUI:003078*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0006E9*
- ID_OUI_FROM_DATABASE=Intime Corp.
+OUI:003003*
+ ID_OUI_FROM_DATABASE=Phasys Ltd.
 
-OUI:0005EB*
- ID_OUI_FROM_DATABASE=Blue Ridge Networks, Inc.
+OUI:0030D5*
+ ID_OUI_FROM_DATABASE=DResearch GmbH
 
-OUI:0005F7*
- ID_OUI_FROM_DATABASE=Analog Devices, Inc.
+OUI:0030CE*
+ ID_OUI_FROM_DATABASE=Zaffire
 
-OUI:0005E4*
- ID_OUI_FROM_DATABASE=Red Lion Controls Inc.
+OUI:003095*
+ ID_OUI_FROM_DATABASE=Procomp Informatics, Ltd.
 
-OUI:0005F1*
- ID_OUI_FROM_DATABASE=Vrcom, Inc.
+OUI:003055*
+ ID_OUI_FROM_DATABASE=Renesas Technology America, Inc.
 
-OUI:0005FD*
- ID_OUI_FROM_DATABASE=PacketLight Networks Ltd.
+OUI:0030B0*
+ ID_OUI_FROM_DATABASE=Convergenet Technologies
 
-OUI:0005E2*
- ID_OUI_FROM_DATABASE=Creativ Network Technologies
+OUI:0030CC*
+ ID_OUI_FROM_DATABASE=Tenor Networks, Inc.
 
-OUI:0005DC*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:003013*
+ ID_OUI_FROM_DATABASE=NEC Corporation
 
-OUI:0005E1*
- ID_OUI_FROM_DATABASE=Trellis Photonics, Ltd.
+OUI:003061*
+ ID_OUI_FROM_DATABASE=MobyTEL
 
-OUI:0005D8*
- ID_OUI_FROM_DATABASE=Arescom, Inc.
+OUI:00D0AB*
+ ID_OUI_FROM_DATABASE=DELTAKABEL TELECOM CV
 
-OUI:0005D7*
- ID_OUI_FROM_DATABASE=Vista Imaging, Inc.
+OUI:00D0A8*
+ ID_OUI_FROM_DATABASE=NETWORK ENGINES, INC.
 
-OUI:0005C5*
- ID_OUI_FROM_DATABASE=Flaga HF
+OUI:00D01C*
+ ID_OUI_FROM_DATABASE=SBS TECHNOLOGIES,
 
-OUI:0005D1*
- ID_OUI_FROM_DATABASE=Metavector Technologies
+OUI:00D0C0*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0005D2*
- ID_OUI_FROM_DATABASE=DAP Technologies
+OUI:00D051*
+ ID_OUI_FROM_DATABASE=O2 MICRO, INC.
 
-OUI:0005CB*
- ID_OUI_FROM_DATABASE=ROIS Technologies, Inc.
+OUI:00D06D*
+ ID_OUI_FROM_DATABASE=ACRISON, INC.
 
-OUI:00057F*
- ID_OUI_FROM_DATABASE=Acqis Technology
+OUI:0050A1*
+ ID_OUI_FROM_DATABASE=CARLO GAVAZZI, INC.
 
-OUI:000579*
- ID_OUI_FROM_DATABASE=Universal Control Solution Corp.
+OUI:00D06C*
+ ID_OUI_FROM_DATABASE=SHAREWAVE, INC.
 
-OUI:000575*
- ID_OUI_FROM_DATABASE=CDS-Electronics BV
+OUI:00D03A*
+ ID_OUI_FROM_DATABASE=ZONEWORX, INC.
 
-OUI:00056F*
- ID_OUI_FROM_DATABASE=Innomedia Technologies Pvt. Ltd.
+OUI:0050C1*
+ ID_OUI_FROM_DATABASE=GEMFLEX NETWORKS, LTD.
 
-OUI:000568*
- ID_OUI_FROM_DATABASE=Piltofish Networks AB
+OUI:0050FB*
+ ID_OUI_FROM_DATABASE=VSK ELECTRONICS
 
-OUI:000562*
- ID_OUI_FROM_DATABASE=Digital View Limited
+OUI:005033*
+ ID_OUI_FROM_DATABASE=MAYAN NETWORKS
 
-OUI:00055C*
- ID_OUI_FROM_DATABASE=Kowa Company, Ltd.
+OUI:0030A0*
+ ID_OUI_FROM_DATABASE=TYCO SUBMARINE SYSTEMS, LTD.
 
-OUI:000556*
- ID_OUI_FROM_DATABASE=360 Systems
+OUI:0030CB*
+ ID_OUI_FROM_DATABASE=OMNI FLOW COMPUTERS, INC.
 
-OUI:000550*
- ID_OUI_FROM_DATABASE=Vcomms Connect Limited
+OUI:00306B*
+ ID_OUI_FROM_DATABASE=CMOS SYSTEMS, INC.
 
-OUI:000545*
- ID_OUI_FROM_DATABASE=Internet Photonics
+OUI:003068*
+ ID_OUI_FROM_DATABASE=CYBERNETICS TECH. CO., LTD.
 
-OUI:00053F*
- ID_OUI_FROM_DATABASE=VisionTek, Inc.
+OUI:0030E3*
+ ID_OUI_FROM_DATABASE=SEDONA NETWORKS CORP.
 
-OUI:000546*
- ID_OUI_FROM_DATABASE=KDDI Network & Solultions Inc.
+OUI:00D007*
+ ID_OUI_FROM_DATABASE=MIC ASSOCIATES, INC.
 
-OUI:0006AA*
- ID_OUI_FROM_DATABASE=VT Miltope
+OUI:00D07F*
+ ID_OUI_FROM_DATABASE=STRATEGY & TECHNOLOGY, LIMITED
 
-OUI:0006A9*
- ID_OUI_FROM_DATABASE=Universal Instruments Corp.
+OUI:003085*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0006A0*
- ID_OUI_FROM_DATABASE=Mx Imaging
+OUI:003026*
+ ID_OUI_FROM_DATABASE=HeiTel Digital Video GmbH
 
-OUI:00069F*
- ID_OUI_FROM_DATABASE=Kuokoa Networks
+OUI:0030A6*
+ ID_OUI_FROM_DATABASE=VIANET TECHNOLOGIES, LTD.
 
-OUI:000699*
- ID_OUI_FROM_DATABASE=Vida Design Co.
+OUI:003047*
+ ID_OUI_FROM_DATABASE=NISSEI ELECTRIC CO., LTD.
 
-OUI:000693*
- ID_OUI_FROM_DATABASE=Flexus Computer Technology, Inc.
+OUI:00D0FC*
+ ID_OUI_FROM_DATABASE=GRANITE MICROSYSTEMS
 
-OUI:00069A*
- ID_OUI_FROM_DATABASE=e & Tel
+OUI:00D042*
+ ID_OUI_FROM_DATABASE=MAHLO GMBH & CO. UG
 
-OUI:00068D*
- ID_OUI_FROM_DATABASE=SEPATON, Inc.
+OUI:00D046*
+ ID_OUI_FROM_DATABASE=DOLBY LABORATORIES, INC.
 
-OUI:000687*
- ID_OUI_FROM_DATABASE=Omnitron Systems Technology, Inc.
+OUI:00D0BA*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000680*
- ID_OUI_FROM_DATABASE=Card Access, Inc.
+OUI:00D0BC*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000539*
- ID_OUI_FROM_DATABASE=A Brand New World in Sweden AB
+OUI:00D0D8*
+ ID_OUI_FROM_DATABASE=3Com Corporation
 
-OUI:000526*
- ID_OUI_FROM_DATABASE=IPAS GmbH
+OUI:00D06B*
+ ID_OUI_FROM_DATABASE=SR TELECOM INC.
 
-OUI:00052D*
- ID_OUI_FROM_DATABASE=Zoltrix International Limited
+OUI:0030AA*
+ ID_OUI_FROM_DATABASE=AXUS MICROSYSTEMS, INC.
 
-OUI:00052C*
- ID_OUI_FROM_DATABASE=Supreme Magic Corporation
+OUI:003043*
+ ID_OUI_FROM_DATABASE=IDREAM TECHNOLOGIES, PTE. LTD.
 
-OUI:000520*
- ID_OUI_FROM_DATABASE=Smartronix, Inc.
+OUI:003010*
+ ID_OUI_FROM_DATABASE=VISIONETICS INTERNATIONAL
 
-OUI:00051A*
- ID_OUI_FROM_DATABASE=3COM EUROPE LTD.
+OUI:003096*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000510*
- ID_OUI_FROM_DATABASE=Infinite Shanghai Communication Terminals Ltd.
+OUI:003084*
+ ID_OUI_FROM_DATABASE=ALLIED TELESYN INTERNAIONAL
 
-OUI:000514*
- ID_OUI_FROM_DATABASE=KDT Systems Co., Ltd.
+OUI:0030CF*
+ ID_OUI_FROM_DATABASE=TWO TECHNOLOGIES, INC.
 
-OUI:000509*
- ID_OUI_FROM_DATABASE=AVOC Nishimura Ltd.
+OUI:00D0E3*
+ ID_OUI_FROM_DATABASE=ELE-CHEM ENGINEERING CO., LTD.
 
-OUI:000503*
- ID_OUI_FROM_DATABASE=ICONAG
+OUI:00D0ED*
+ ID_OUI_FROM_DATABASE=XIOX
 
-OUI:00050A*
- ID_OUI_FROM_DATABASE=ICS Spa
+OUI:00D0C2*
+ ID_OUI_FROM_DATABASE=BALTHAZAR TECHNOLOGY AB
 
-OUI:0004FF*
- ID_OUI_FROM_DATABASE=Acronet Co., Ltd.
+OUI:00D0FB*
+ ID_OUI_FROM_DATABASE=TEK MICROSYSTEMS, INCORPORATED
 
-OUI:000500*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00D082*
+ ID_OUI_FROM_DATABASE=IOWAVE INC.
 
-OUI:000641*
- ID_OUI_FROM_DATABASE=ITCN
+OUI:00D0AD*
+ ID_OUI_FROM_DATABASE=TL INDUSTRIES
 
-OUI:00063D*
- ID_OUI_FROM_DATABASE=Microwave Data Systems Inc.
+OUI:00D0DB*
+ ID_OUI_FROM_DATABASE=MCQUAY INTERNATIONAL
 
-OUI:000631*
- ID_OUI_FROM_DATABASE=Calix
+OUI:00D06A*
+ ID_OUI_FROM_DATABASE=LINKUP SYSTEMS CORPORATION
 
-OUI:000630*
- ID_OUI_FROM_DATABASE=Adtranz Sweden
+OUI:00D065*
+ ID_OUI_FROM_DATABASE=TOKO ELECTRIC
 
-OUI:000637*
- ID_OUI_FROM_DATABASE=Toptrend-Meta Information (ShenZhen) Inc.
+OUI:00D08F*
+ ID_OUI_FROM_DATABASE=ARDENT TECHNOLOGIES, INC.
 
-OUI:000620*
- ID_OUI_FROM_DATABASE=Serial System Ltd.
+OUI:00D0E7*
+ ID_OUI_FROM_DATABASE=VCON TELECOMMUNICATION LTD.
 
-OUI:00061A*
- ID_OUI_FROM_DATABASE=Zetari Inc.
+OUI:00D087*
+ ID_OUI_FROM_DATABASE=MICROFIRST INC.
 
-OUI:00060C*
- ID_OUI_FROM_DATABASE=Melco Industries, Inc.
+OUI:00D008*
+ ID_OUI_FROM_DATABASE=MACTELL CORPORATION
 
-OUI:000614*
- ID_OUI_FROM_DATABASE=Prism Holdings
+OUI:003005*
+ ID_OUI_FROM_DATABASE=Fujitsu Siemens Computers
 
-OUI:000606*
- ID_OUI_FROM_DATABASE=RapidWAN, Inc.
+OUI:00304E*
+ ID_OUI_FROM_DATABASE=BUSTEC PRODUCTION LTD.
 
-OUI:000677*
- ID_OUI_FROM_DATABASE=SICK AG
+OUI:0030E0*
+ ID_OUI_FROM_DATABASE=OXFORD SEMICONDUCTOR LTD.
 
-OUI:000673*
- ID_OUI_FROM_DATABASE=TKH Security Solutions USA
+OUI:0030A1*
+ ID_OUI_FROM_DATABASE=WEBGATE Inc.
 
-OUI:000666*
- ID_OUI_FROM_DATABASE=Roving Networks
+OUI:00303D*
+ ID_OUI_FROM_DATABASE=IVA CORPORATION
 
-OUI:00066D*
- ID_OUI_FROM_DATABASE=Compuprint S.P.A.
+OUI:0030C3*
+ ID_OUI_FROM_DATABASE=FLUECKIGER ELEKTRONIK AG
 
-OUI:00066C*
- ID_OUI_FROM_DATABASE=Robinson Corporation
+OUI:009047*
+ ID_OUI_FROM_DATABASE=GIGA FAST E. LTD.
 
-OUI:000653*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0090CB*
+ ID_OUI_FROM_DATABASE=Wireless OnLine, Inc.
 
-OUI:00065A*
- ID_OUI_FROM_DATABASE=Strix Systems
+OUI:00903F*
+ ID_OUI_FROM_DATABASE=AZTEC RADIOMEDIA
 
-OUI:00064D*
- ID_OUI_FROM_DATABASE=Sencore
+OUI:001043*
+ ID_OUI_FROM_DATABASE=A2 CORPORATION
 
-OUI:000660*
- ID_OUI_FROM_DATABASE=NADEX Co., Ltd.
+OUI:00108D*
+ ID_OUI_FROM_DATABASE=Johnson Controls, Inc.
 
-OUI:0005B8*
- ID_OUI_FROM_DATABASE=Electronic Design Associates, Inc.
+OUI:00108E*
+ ID_OUI_FROM_DATABASE=HUGH SYMONS CONCEPT Technologies Ltd.
 
-OUI:0005BF*
- ID_OUI_FROM_DATABASE=JustEzy Technology, Inc.
+OUI:001052*
+ ID_OUI_FROM_DATABASE=METTLER-TOLEDO (ALBSTADT) GMBH
 
-OUI:0005AE*
- ID_OUI_FROM_DATABASE=Mediaport USA
+OUI:00100E*
+ ID_OUI_FROM_DATABASE=MICRO LINEAR COPORATION
 
-OUI:0005B2*
- ID_OUI_FROM_DATABASE=Medison Co., Ltd.
+OUI:0010D7*
+ ID_OUI_FROM_DATABASE=ARGOSY RESEARCH INC.
 
-OUI:00059E*
- ID_OUI_FROM_DATABASE=Zinwell Corporation
+OUI:001059*
+ ID_OUI_FROM_DATABASE=DIABLO RESEARCH CO. LLC
 
-OUI:0005A5*
- ID_OUI_FROM_DATABASE=KOTT
+OUI:0010B6*
+ ID_OUI_FROM_DATABASE=ENTRATA COMMUNICATIONS CORP.
 
-OUI:000598*
- ID_OUI_FROM_DATABASE=CRONOS S.r.l.
+OUI:001019*
+ ID_OUI_FROM_DATABASE=SIRONA DENTAL SYSTEMS GmbH & Co. KG
 
-OUI:0005A4*
- ID_OUI_FROM_DATABASE=Lucid Voice Ltd.
+OUI:001013*
+ ID_OUI_FROM_DATABASE=Kontron America, Inc.
 
-OUI:000592*
- ID_OUI_FROM_DATABASE=Pultek Corp.
+OUI:0090A4*
+ ID_OUI_FROM_DATABASE=ALTIGA NETWORKS
 
-OUI:00058B*
- ID_OUI_FROM_DATABASE=IPmental, Inc.
+OUI:00906C*
+ ID_OUI_FROM_DATABASE=Sartorius Hamburg GmbH
 
-OUI:00058C*
- ID_OUI_FROM_DATABASE=Opentech Inc.
+OUI:0090FC*
+ ID_OUI_FROM_DATABASE=NETWORK COMPUTING DEVICES
 
-OUI:00037E*
- ID_OUI_FROM_DATABASE=PORTech Communications, Inc.
+OUI:0090A3*
+ ID_OUI_FROM_DATABASE=Corecess Inc.
 
-OUI:000383*
- ID_OUI_FROM_DATABASE=Metera Networks, Inc.
+OUI:009022*
+ ID_OUI_FROM_DATABASE=IVEX
 
-OUI:000377*
- ID_OUI_FROM_DATABASE=Gigabit Wireless
+OUI:0090A5*
+ ID_OUI_FROM_DATABASE=SPECTRA LOGIC
 
-OUI:00037B*
- ID_OUI_FROM_DATABASE=IDEC IZUMI Corporation
+OUI:0090BA*
+ ID_OUI_FROM_DATABASE=VALID NETWORKS, INC.
 
-OUI:00036B*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0090EE*
+ ID_OUI_FROM_DATABASE=PERSONAL COMMUNICATIONS TECHNOLOGIES
 
-OUI:000372*
- ID_OUI_FROM_DATABASE=ULAN
+OUI:0090CD*
+ ID_OUI_FROM_DATABASE=ENT-EMPRESA NACIONAL DE TELECOMMUNICACOES, S.A.
 
-OUI:000367*
- ID_OUI_FROM_DATABASE=Jasmine Networks, Inc.
+OUI:0090D0*
+ ID_OUI_FROM_DATABASE=Thomson Telecom Belgium
 
-OUI:00036A*
- ID_OUI_FROM_DATABASE=Mainnet, Ltd.
+OUI:009075*
+ ID_OUI_FROM_DATABASE=NEC DO BRASIL S.A.
 
-OUI:000364*
- ID_OUI_FROM_DATABASE=Scenix Semiconductor, Inc.
+OUI:00902E*
+ ID_OUI_FROM_DATABASE=NAMCO LIMITED
 
-OUI:00035F*
- ID_OUI_FROM_DATABASE=Prüftechnik Condition Monitoring GmbH & Co. KG
+OUI:0090A0*
+ ID_OUI_FROM_DATABASE=8X8 INC.
 
-OUI:00035C*
- ID_OUI_FROM_DATABASE=Saint Song Corp.
+OUI:00907C*
+ ID_OUI_FROM_DATABASE=DIGITALCAST, INC.
 
-OUI:00034D*
- ID_OUI_FROM_DATABASE=Chiaro Networks, Ltd.
+OUI:0090DF*
+ ID_OUI_FROM_DATABASE=MITSUBISHI CHEMICAL AMERICA, INC.
 
-OUI:0003FA*
- ID_OUI_FROM_DATABASE=TiMetra Networks
+OUI:009023*
+ ID_OUI_FROM_DATABASE=ZILOG INC.
 
-OUI:0003F5*
- ID_OUI_FROM_DATABASE=Chip2Chip
+OUI:00908A*
+ ID_OUI_FROM_DATABASE=BAYLY COMMUNICATIONS, INC.
 
-OUI:0003EE*
- ID_OUI_FROM_DATABASE=MKNet Corporation
+OUI:009063*
+ ID_OUI_FROM_DATABASE=COHERENT COMMUNICATIONS SYSTEMS CORPORATION
 
-OUI:0003E8*
- ID_OUI_FROM_DATABASE=Wavelength Digital Limited
+OUI:009041*
+ ID_OUI_FROM_DATABASE=APPLIED DIGITAL ACCESS
 
-OUI:0003E3*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0090D8*
+ ID_OUI_FROM_DATABASE=WHITECROSS SYSTEMS
 
-OUI:0003DC*
- ID_OUI_FROM_DATABASE=Lexar Media, Inc.
+OUI:009011*
+ ID_OUI_FROM_DATABASE=WAVTrace, Inc.
 
-OUI:0003D7*
- ID_OUI_FROM_DATABASE=NextNet Wireless, Inc.
+OUI:009040*
+ ID_OUI_FROM_DATABASE=Siemens Network Convergence LLC
 
-OUI:0003D4*
- ID_OUI_FROM_DATABASE=Alloptic, Inc.
+OUI:0090C7*
+ ID_OUI_FROM_DATABASE=ICOM INC.
 
-OUI:00030B*
- ID_OUI_FROM_DATABASE=Hunter Technology, Inc.
+OUI:009035*
+ ID_OUI_FROM_DATABASE=ALPHA TELECOM, INC.
 
-OUI:0003D0*
- ID_OUI_FROM_DATABASE=KOANKEISO Co., Ltd.
+OUI:009087*
+ ID_OUI_FROM_DATABASE=ITIS
 
-OUI:0003C9*
- ID_OUI_FROM_DATABASE=TECOM Co., Ltd.
+OUI:00906E*
+ ID_OUI_FROM_DATABASE=PRAXON, INC.
 
-OUI:0003C4*
- ID_OUI_FROM_DATABASE=Tomra Systems ASA
+OUI:009039*
+ ID_OUI_FROM_DATABASE=SHASTA NETWORKS
 
-OUI:0004FA*
- ID_OUI_FROM_DATABASE=NBS Technologies Inc.
+OUI:00909A*
+ ID_OUI_FROM_DATABASE=ONE WORLD SYSTEMS, INC.
 
-OUI:0004F9*
- ID_OUI_FROM_DATABASE=Xtera Communications, Inc.
+OUI:009053*
+ ID_OUI_FROM_DATABASE=DAEWOO ELECTRONICS CO., LTD.
 
-OUI:0004F3*
- ID_OUI_FROM_DATABASE=FS FORTH-SYSTEME GmbH
+OUI:00909E*
+ ID_OUI_FROM_DATABASE=Critical IO, LLC
 
-OUI:0004E7*
- ID_OUI_FROM_DATABASE=Lightpointe Communications, Inc
+OUI:0090C2*
+ ID_OUI_FROM_DATABASE=JK microsystems, Inc.
 
-OUI:0004ED*
- ID_OUI_FROM_DATABASE=Billion Electric Co., Ltd.
+OUI:009091*
+ ID_OUI_FROM_DATABASE=DigitalScape, Inc.
 
-OUI:0004DD*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0090ED*
+ ID_OUI_FROM_DATABASE=CENTRAL SYSTEM RESEARCH CO., LTD.
 
-OUI:0004D6*
- ID_OUI_FROM_DATABASE=Takagi Industrial Co., Ltd.
+OUI:00901B*
+ ID_OUI_FROM_DATABASE=DIGITAL CONTROLS
 
-OUI:0004D0*
- ID_OUI_FROM_DATABASE=Softlink s.r.o.
+OUI:00905C*
+ ID_OUI_FROM_DATABASE=EDMI
 
-OUI:0004CA*
- ID_OUI_FROM_DATABASE=FreeMs Corp.
+OUI:0090D2*
+ ID_OUI_FROM_DATABASE=ARTEL VIDEO SYSTEMS
 
-OUI:0004BE*
- ID_OUI_FROM_DATABASE=OptXCon, Inc.
+OUI:00508C*
+ ID_OUI_FROM_DATABASE=RSI SYSTEMS
 
-OUI:0004C3*
- ID_OUI_FROM_DATABASE=CASTOR Informatique
+OUI:00502D*
+ ID_OUI_FROM_DATABASE=ACCEL, INC.
 
-OUI:0004C4*
- ID_OUI_FROM_DATABASE=Allen & Heath Limited
+OUI:0050B8*
+ ID_OUI_FROM_DATABASE=INOVA COMPUTERS GMBH & CO. KG
 
-OUI:0004B7*
- ID_OUI_FROM_DATABASE=AMB i.t. Holding
+OUI:00503A*
+ ID_OUI_FROM_DATABASE=DATONG ELECTRONICS LTD.
 
-OUI:0004B1*
- ID_OUI_FROM_DATABASE=Signal Technology, Inc.
+OUI:00508E*
+ ID_OUI_FROM_DATABASE=OPTIMATION, INC.
 
-OUI:0004AD*
- ID_OUI_FROM_DATABASE=Malibu Networks
+OUI:0050BB*
+ ID_OUI_FROM_DATABASE=CMS TECHNOLOGIES
 
-OUI:0004AA*
- ID_OUI_FROM_DATABASE=Jetstream Communications
+OUI:005051*
+ ID_OUI_FROM_DATABASE=IWATSU ELECTRIC CO., LTD.
 
-OUI:00049D*
- ID_OUI_FROM_DATABASE=Ipanema Technologies
+OUI:0050BE*
+ ID_OUI_FROM_DATABASE=FAST MULTIMEDIA AG
 
-OUI:000497*
- ID_OUI_FROM_DATABASE=MacroSystem Digital Video AG
+OUI:0050AD*
+ ID_OUI_FROM_DATABASE=CommUnique Wireless Corp.
 
-OUI:000490*
- ID_OUI_FROM_DATABASE=Optical Access
+OUI:005003*
+ ID_OUI_FROM_DATABASE=Xrite Inc
 
-OUI:00048B*
- ID_OUI_FROM_DATABASE=Poscon Corporation
+OUI:005023*
+ ID_OUI_FROM_DATABASE=PG DESIGN ELECTRONICS, INC.
 
-OUI:000341*
- ID_OUI_FROM_DATABASE=Axon Digital Design
+OUI:005039*
+ ID_OUI_FROM_DATABASE=MARINER NETWORKS
 
-OUI:00033E*
- ID_OUI_FROM_DATABASE=Tateyama System Laboratory Co., Ltd.
+OUI:00505A*
+ ID_OUI_FROM_DATABASE=NETWORK ALCHEMY, INC.
 
-OUI:00033A*
- ID_OUI_FROM_DATABASE=Silicon Wave, Inc.
+OUI:005071*
+ ID_OUI_FROM_DATABASE=AIWA CO., LTD.
 
-OUI:000333*
- ID_OUI_FROM_DATABASE=Digitel Co., Ltd.
+OUI:009071*
+ ID_OUI_FROM_DATABASE=Applied Innovation Inc.
 
-OUI:00032B*
- ID_OUI_FROM_DATABASE=GAI Datenfunksysteme GmbH
+OUI:009031*
+ ID_OUI_FROM_DATABASE=MYSTICOM, LTD.
 
-OUI:000327*
- ID_OUI_FROM_DATABASE=ACT'L
+OUI:00901F*
+ ID_OUI_FROM_DATABASE=ADTEC PRODUCTIONS, INC.
 
-OUI:00032E*
- ID_OUI_FROM_DATABASE=Scope Information Management, Ltd.
+OUI:009081*
+ ID_OUI_FROM_DATABASE=ALOHA NETWORKS, INC.
 
-OUI:000322*
- ID_OUI_FROM_DATABASE=IDIS Co., Ltd.
+OUI:0090B3*
+ ID_OUI_FROM_DATABASE=AGRANAT SYSTEMS
 
-OUI:00031E*
- ID_OUI_FROM_DATABASE=Optranet, Inc.
+OUI:00500D*
+ ID_OUI_FROM_DATABASE=SATORI ELECTORIC CO., LTD.
 
-OUI:00B052*
- ID_OUI_FROM_DATABASE=Atheros Communications
+OUI:0050EC*
+ ID_OUI_FROM_DATABASE=OLICOM A/S
 
-OUI:000319*
- ID_OUI_FROM_DATABASE=Infineon AG
+OUI:005083*
+ ID_OUI_FROM_DATABASE=GILBARCO, INC.
 
-OUI:000316*
- ID_OUI_FROM_DATABASE=Nobell Communications, Inc.
+OUI:0050CF*
+ ID_OUI_FROM_DATABASE=VANLINK COMMUNICATION TECHNOLOGY RESEARCH INSTITUTE
 
-OUI:000312*
- ID_OUI_FROM_DATABASE=TR-Systemtechnik GmbH
+OUI:005008*
+ ID_OUI_FROM_DATABASE=TIVA MICROCOMPUTER CORP. (TMC)
 
-OUI:000447*
- ID_OUI_FROM_DATABASE=Acrowave Systems Co., Ltd.
+OUI:005001*
+ ID_OUI_FROM_DATABASE=YAMASHITA SYSTEMS CORP.
 
-OUI:00043B*
- ID_OUI_FROM_DATABASE=Lava Computer Mfg., Inc.
+OUI:0050B0*
+ ID_OUI_FROM_DATABASE=TECHNOLOGY ATLANTA CORPORATION
 
-OUI:000440*
- ID_OUI_FROM_DATABASE=cyberPIXIE, Inc.
+OUI:00504E*
+ ID_OUI_FROM_DATABASE=SIERRA MONITOR CORP.
 
-OUI:00043A*
- ID_OUI_FROM_DATABASE=Intelligent Telecommunications, Inc.
+OUI:00504D*
+ ID_OUI_FROM_DATABASE=Tokyo Electron Device Limited
 
-OUI:000434*
- ID_OUI_FROM_DATABASE=Accelent Systems, Inc.
+OUI:0050F7*
+ ID_OUI_FROM_DATABASE=VENTURE MANUFACTURING (SINGAPORE) LTD.
 
-OUI:00042D*
- ID_OUI_FROM_DATABASE=Sarian Systems, Ltd.
+OUI:005029*
+ ID_OUI_FROM_DATABASE=1394 PRINTER WORKING GROUP
 
-OUI:00042E*
- ID_OUI_FROM_DATABASE=Netous Technologies, Ltd.
+OUI:00E08D*
+ ID_OUI_FROM_DATABASE=PRESSURE SYSTEMS, INC.
 
-OUI:000428*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00E040*
+ ID_OUI_FROM_DATABASE=DeskStation Technology, Inc.
 
-OUI:000421*
- ID_OUI_FROM_DATABASE=Ocular Networks
+OUI:00E0D6*
+ ID_OUI_FROM_DATABASE=COMPUTER & COMMUNICATION RESEARCH LAB.
 
-OUI:000417*
- ID_OUI_FROM_DATABASE=ELAU AG
+OUI:00E07E*
+ ID_OUI_FROM_DATABASE=WALT DISNEY IMAGINEERING
 
-OUI:000411*
- ID_OUI_FROM_DATABASE=Inkra Networks, Inc.
+OUI:00E094*
+ ID_OUI_FROM_DATABASE=OSAI SRL
 
-OUI:00040B*
- ID_OUI_FROM_DATABASE=3COM EUROPE LTD.
+OUI:00E032*
+ ID_OUI_FROM_DATABASE=MISYS FINANCIAL SYSTEMS, LTD.
 
-OUI:000404*
- ID_OUI_FROM_DATABASE=Makino Milling Machine Co., Ltd.
+OUI:00E06B*
+ ID_OUI_FROM_DATABASE=W&G SPECIAL PRODUCTS
 
-OUI:000481*
- ID_OUI_FROM_DATABASE=Econolite Control Products, Inc.
+OUI:00E01C*
+ ID_OUI_FROM_DATABASE=Cradlepoint, Inc
 
-OUI:000486*
- ID_OUI_FROM_DATABASE=ITTC, University of Kansas
+OUI:00E076*
+ ID_OUI_FROM_DATABASE=DEVELOPMENT CONCEPTS, INC.
 
-OUI:000477*
- ID_OUI_FROM_DATABASE=Scalant Systems, Inc.
+OUI:00E0A7*
+ ID_OUI_FROM_DATABASE=IPC INFORMATION SYSTEMS, INC.
 
-OUI:000476*
- ID_OUI_FROM_DATABASE=3 Com Corporation
+OUI:00E0A4*
+ ID_OUI_FROM_DATABASE=ESAOTE S.p.A.
 
-OUI:000469*
- ID_OUI_FROM_DATABASE=Innocom, Inc.
+OUI:00E080*
+ ID_OUI_FROM_DATABASE=CONTROL RESOURCES CORPORATION
 
-OUI:000470*
- ID_OUI_FROM_DATABASE=ipUnplugged AB
+OUI:00E0CC*
+ ID_OUI_FROM_DATABASE=HERO SYSTEMS, LTD.
 
-OUI:00046A*
- ID_OUI_FROM_DATABASE=Navini Networks
+OUI:00E099*
+ ID_OUI_FROM_DATABASE=SAMSON AG
 
-OUI:000464*
- ID_OUI_FROM_DATABASE=Pulse-Link Inc
+OUI:0010E9*
+ ID_OUI_FROM_DATABASE=RAIDTEC LTD.
 
-OUI:00045D*
- ID_OUI_FROM_DATABASE=BEKA Elektronik
+OUI:001003*
+ ID_OUI_FROM_DATABASE=IMATRON, INC.
 
-OUI:000457*
- ID_OUI_FROM_DATABASE=Universal Access Technology, Inc.
+OUI:00105A*
+ ID_OUI_FROM_DATABASE=3COM CORPORATION
 
-OUI:000451*
- ID_OUI_FROM_DATABASE=Medrad, Inc.
+OUI:0010A9*
+ ID_OUI_FROM_DATABASE=ADHOC TECHNOLOGIES
 
-OUI:0003C1*
- ID_OUI_FROM_DATABASE=Packet Dynamics Ltd
+OUI:000400*
+ ID_OUI_FROM_DATABASE=LEXMARK INTERNATIONAL, INC.
 
-OUI:0003BD*
- ID_OUI_FROM_DATABASE=OmniCluster Technologies, Inc.
+OUI:00101A*
+ ID_OUI_FROM_DATABASE=PictureTel Corp.
 
-OUI:0003B8*
- ID_OUI_FROM_DATABASE=NetKit Solutions, LLC
+OUI:001097*
+ ID_OUI_FROM_DATABASE=WinNet Metropolitan Communications Systems, Inc.
+
+OUI:00106F*
+ ID_OUI_FROM_DATABASE=TRENTON TECHNOLOGY INC.
 
-OUI:0003B6*
- ID_OUI_FROM_DATABASE=QSI Corporation
+OUI:0010DA*
+ ID_OUI_FROM_DATABASE=Kollmorgen Corp
 
-OUI:0003A6*
- ID_OUI_FROM_DATABASE=Traxit Technology, Inc.
+OUI:0010DF*
+ ID_OUI_FROM_DATABASE=RISE COMPUTER INC.
 
-OUI:0003AB*
- ID_OUI_FROM_DATABASE=Bridge Information Systems
+OUI:00109E*
+ ID_OUI_FROM_DATABASE=AWARE, INC.
 
-OUI:0003A3*
- ID_OUI_FROM_DATABASE=MAVIX, Ltd.
+OUI:001072*
+ ID_OUI_FROM_DATABASE=GVN TECHNOLOGIES, INC.
 
-OUI:00039F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00E019*
+ ID_OUI_FROM_DATABASE=ING. GIORDANO ELETTRONICA
 
-OUI:00039A*
- ID_OUI_FROM_DATABASE=SiConnect
+OUI:00E0D7*
+ ID_OUI_FROM_DATABASE=SUNSHINE ELECTRONICS, INC.
 
-OUI:00038C*
- ID_OUI_FROM_DATABASE=Total Impact
+OUI:00E068*
+ ID_OUI_FROM_DATABASE=MERRIMAC SYSTEMS INC.
 
-OUI:000384*
- ID_OUI_FROM_DATABASE=AETA
+OUI:00E01D*
+ ID_OUI_FROM_DATABASE=WebTV NETWORKS, INC.
 
-OUI:000387*
- ID_OUI_FROM_DATABASE=Blaze Network Products
+OUI:00E01F*
+ ID_OUI_FROM_DATABASE=AVIDIA Systems, Inc.
 
-OUI:000306*
- ID_OUI_FROM_DATABASE=Fusion In Tech Co., Ltd.
+OUI:00E056*
+ ID_OUI_FROM_DATABASE=HOLONTECH CORPORATION
 
-OUI:000303*
- ID_OUI_FROM_DATABASE=JAMA Electronics Co., Ltd.
+OUI:00E0C9*
+ ID_OUI_FROM_DATABASE=AutomatedLogic Corporation
 
-OUI:0002FF*
- ID_OUI_FROM_DATABASE=Handan BroadInfoCom
+OUI:00E030*
+ ID_OUI_FROM_DATABASE=MELITA INTERNATIONAL CORP.
 
-OUI:0002F3*
- ID_OUI_FROM_DATABASE=Media Serve Co., Ltd.
+OUI:00E0BA*
+ ID_OUI_FROM_DATABASE=BERGHOF AUTOMATIONSTECHNIK GmbH
 
-OUI:0002FA*
- ID_OUI_FROM_DATABASE=DX Antenna Co., Ltd.
+OUI:00E0B2*
+ ID_OUI_FROM_DATABASE=TELMAX COMMUNICATIONS CORP.
 
-OUI:0002ED*
- ID_OUI_FROM_DATABASE=DXO Telecom Co., Ltd.
+OUI:00E0EF*
+ ID_OUI_FROM_DATABASE=DIONEX
 
-OUI:0002E5*
- ID_OUI_FROM_DATABASE=Timeware Ltd.
+OUI:00E0BD*
+ ID_OUI_FROM_DATABASE=INTERFACE SYSTEMS, INC.
 
-OUI:0002E8*
- ID_OUI_FROM_DATABASE=E.D.&A.
+OUI:00E071*
+ ID_OUI_FROM_DATABASE=EPIS MICROCOMPUTER
 
-OUI:0002DC*
- ID_OUI_FROM_DATABASE=Fujitsu General Limited
+OUI:00E0A6*
+ ID_OUI_FROM_DATABASE=TELOGY NETWORKS, INC.
 
-OUI:0002E1*
- ID_OUI_FROM_DATABASE=Integrated Network Corporation
+OUI:00E026*
+ ID_OUI_FROM_DATABASE=Redlake MASD LLC
 
-OUI:0002D5*
- ID_OUI_FROM_DATABASE=ACR
+OUI:00E0B8*
+ ID_OUI_FROM_DATABASE=GATEWAY 2000
 
-OUI:0002CE*
- ID_OUI_FROM_DATABASE=FoxJet, Inc.
+OUI:00E088*
+ ID_OUI_FROM_DATABASE=LTX-Credence CORPORATION
 
-OUI:00B0DB*
- ID_OUI_FROM_DATABASE=Nextcell, Inc.
+OUI:00E07C*
+ ID_OUI_FROM_DATABASE=METTLER-TOLEDO, INC.
 
-OUI:00B08E*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00E08C*
+ ID_OUI_FROM_DATABASE=NEOPARADIGM LABS, INC.
 
-OUI:00B01C*
- ID_OUI_FROM_DATABASE=Westport Technologies
+OUI:00E061*
+ ID_OUI_FROM_DATABASE=EdgePoint Networks, Inc.
 
-OUI:00B02D*
- ID_OUI_FROM_DATABASE=ViaGate Technologies, Inc.
+OUI:00E06E*
+ ID_OUI_FROM_DATABASE=FAR SYSTEMS S.p.A.
 
-OUI:00B03B*
- ID_OUI_FROM_DATABASE=HiQ Networks
+OUI:00E01B*
+ ID_OUI_FROM_DATABASE=SPHERE COMMUNICATIONS, INC.
 
-OUI:0030A9*
- ID_OUI_FROM_DATABASE=Netiverse, Inc.
+OUI:00E0AE*
+ ID_OUI_FROM_DATABASE=XAQTI CORPORATION
 
-OUI:00B0F0*
- ID_OUI_FROM_DATABASE=CALY NETWORKS
+OUI:00E0C8*
+ ID_OUI_FROM_DATABASE=VIRTUAL ACCESS, LTD.
 
-OUI:00B086*
- ID_OUI_FROM_DATABASE=LocSoft Limited
+OUI:00101D*
+ ID_OUI_FROM_DATABASE=WINBOND ELECTRONICS CORP.
 
-OUI:0030C4*
- ID_OUI_FROM_DATABASE=Canon Imaging Systems Inc.
+OUI:00105F*
+ ID_OUI_FROM_DATABASE=ZODIAC DATA SYSTEMS
 
-OUI:00309D*
- ID_OUI_FROM_DATABASE=Nimble Microsystems, Inc.
+OUI:0010CB*
+ ID_OUI_FROM_DATABASE=FACIT K.K.
 
-OUI:003037*
- ID_OUI_FROM_DATABASE=Packard Bell Nec Services
+OUI:001075*
+ ID_OUI_FROM_DATABASE=Segate Technology LLC
 
-OUI:00302E*
- ID_OUI_FROM_DATABASE=Hoft & Wessel AG
+OUI:001058*
+ ID_OUI_FROM_DATABASE=ArrowPoint Communications
 
-OUI:00301B*
- ID_OUI_FROM_DATABASE=SHUTTLE, INC.
+OUI:0010A8*
+ ID_OUI_FROM_DATABASE=RELIANCE COMPUTER CORP.
 
-OUI:003028*
- ID_OUI_FROM_DATABASE=FASE Saldatura srl
+OUI:0010AA*
+ ID_OUI_FROM_DATABASE=MEDIA4, INC.
 
-OUI:0030FB*
- ID_OUI_FROM_DATABASE=AZS Technology AG
+OUI:0010E8*
+ ID_OUI_FROM_DATABASE=TELOCITY, INCORPORATED
 
-OUI:003048*
- ID_OUI_FROM_DATABASE=Supermicro Computer, Inc.
+OUI:001010*
+ ID_OUI_FROM_DATABASE=INITIO CORPORATION
 
-OUI:0001DA*
- ID_OUI_FROM_DATABASE=WINCOMM Corporation
+OUI:00E007*
+ ID_OUI_FROM_DATABASE=Avaya ECS Ltd
 
-OUI:0001E1*
- ID_OUI_FROM_DATABASE=Kinpo Electronics, Inc.
+OUI:001022*
+ ID_OUI_FROM_DATABASE=SatCom Media Corporation
 
-OUI:0001DD*
- ID_OUI_FROM_DATABASE=Avail Networks
+OUI:0010C7*
+ ID_OUI_FROM_DATABASE=DATA TRANSMISSION NETWORK
 
-OUI:0001CE*
- ID_OUI_FROM_DATABASE=Custom Micro Products, Ltd.
+OUI:001098*
+ ID_OUI_FROM_DATABASE=STARNET TECHNOLOGIES, INC.
 
-OUI:0001CA*
- ID_OUI_FROM_DATABASE=Geocast Network Systems, Inc.
+OUI:001096*
+ ID_OUI_FROM_DATABASE=TRACEWELL SYSTEMS, INC.
 
-OUI:0001B8*
- ID_OUI_FROM_DATABASE=Netsensity, Inc.
+OUI:001082*
+ ID_OUI_FROM_DATABASE=JNA TELECOMMUNICATIONS LIMITED
 
-OUI:0001BD*
- ID_OUI_FROM_DATABASE=Peterson Electro-Musical Products, Inc.
+OUI:001021*
+ ID_OUI_FROM_DATABASE=ENCANTO NETWORKS, INC.
 
-OUI:0001B4*
- ID_OUI_FROM_DATABASE=Wayport, Inc.
+OUI:0010CE*
+ ID_OUI_FROM_DATABASE=VOLAMP, LTD.
 
-OUI:0001C3*
- ID_OUI_FROM_DATABASE=Acromag, Inc.
+OUI:0010B2*
+ ID_OUI_FROM_DATABASE=COACTIVE AESTHETICS
 
-OUI:0001BF*
- ID_OUI_FROM_DATABASE=Teleforce Co., Ltd.
+OUI:00109A*
+ ID_OUI_FROM_DATABASE=NETLINE
 
-OUI:0001AD*
- ID_OUI_FROM_DATABASE=Coach Master International  d.b.a. CMI Worldwide, Inc.
+OUI:0010EA*
+ ID_OUI_FROM_DATABASE=ADEPT TECHNOLOGY
 
-OUI:00017E*
- ID_OUI_FROM_DATABASE=ADTEK System Science Co., Ltd.
+OUI:0010BD*
+ ID_OUI_FROM_DATABASE=THE TELECOMMUNICATION TECHNOLOGY COMMITTEE (TTC)
 
-OUI:00018A*
- ID_OUI_FROM_DATABASE=ROI COMPUTER AG
+OUI:006099*
+ ID_OUI_FROM_DATABASE=SBE, Inc.
 
-OUI:000119*
- ID_OUI_FROM_DATABASE=RTUnet (Australia)
+OUI:0060FD*
+ ID_OUI_FROM_DATABASE=NetICs, Inc.
 
-OUI:000125*
- ID_OUI_FROM_DATABASE=YAESU MUSEN CO., LTD.
+OUI:0060B5*
+ ID_OUI_FROM_DATABASE=KEBA GmbH
 
-OUI:000121*
- ID_OUI_FROM_DATABASE=Watchguard Technologies, Inc.
+OUI:006027*
+ ID_OUI_FROM_DATABASE=Superior Modular Products
 
-OUI:000128*
- ID_OUI_FROM_DATABASE=EnjoyWeb, Inc.
+OUI:0060C1*
+ ID_OUI_FROM_DATABASE=WaveSpan Corporation
 
-OUI:000106*
- ID_OUI_FROM_DATABASE=Tews Datentechnik GmbH
+OUI:006005*
+ ID_OUI_FROM_DATABASE=FEEDBACK DATA LTD.
 
-OUI:000112*
- ID_OUI_FROM_DATABASE=Shark Multimedia Inc.
+OUI:00607B*
+ ID_OUI_FROM_DATABASE=FORE SYSTEMS, INC.
 
-OUI:000102*
- ID_OUI_FROM_DATABASE=3COM CORPORATION
+OUI:00609C*
+ ID_OUI_FROM_DATABASE=Perkin-Elmer Incorporated
 
-OUI:000115*
- ID_OUI_FROM_DATABASE=EXTRATECH CORPORATION
+OUI:006007*
+ ID_OUI_FROM_DATABASE=ACRES GAMING, INC.
 
-OUI:000109*
- ID_OUI_FROM_DATABASE=Nagano Japan Radio Co., Ltd.
+OUI:006035*
+ ID_OUI_FROM_DATABASE=DALLAS SEMICONDUCTOR, INC.
 
-OUI:081443*
- ID_OUI_FROM_DATABASE=UNIBRAIN S.A.
+OUI:0060F1*
+ ID_OUI_FROM_DATABASE=EXP COMPUTER, INC.
 
-OUI:00B0F5*
- ID_OUI_FROM_DATABASE=NetWorth Technologies, Inc.
+OUI:006040*
+ ID_OUI_FROM_DATABASE=NETRO CORP.
 
-OUI:00B019*
- ID_OUI_FROM_DATABASE=UTC CCS
+OUI:006034*
+ ID_OUI_FROM_DATABASE=ROBERT BOSCH GmbH
 
-OUI:00B02A*
- ID_OUI_FROM_DATABASE=ORSYS GmbH
+OUI:0060BA*
+ ID_OUI_FROM_DATABASE=SAHARA NETWORKS, INC.
 
-OUI:00B0AE*
- ID_OUI_FROM_DATABASE=Symmetricom
+OUI:006096*
+ ID_OUI_FROM_DATABASE=T.S. MICROTECH INC.
 
-OUI:000181*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:00603A*
+ ID_OUI_FROM_DATABASE=QUICK CONTROLS LTD.
 
-OUI:00018D*
- ID_OUI_FROM_DATABASE=AudeSi Technologies
+OUI:0060AC*
+ ID_OUI_FROM_DATABASE=RESILIENCE CORPORATION
 
-OUI:00019A*
- ID_OUI_FROM_DATABASE=LEUNIG GmbH
+OUI:0060EB*
+ ID_OUI_FROM_DATABASE=FOURTHTRACK SYSTEMS
 
-OUI:000193*
- ID_OUI_FROM_DATABASE=Hanbyul Telecom Co., Ltd.
+OUI:00606D*
+ ID_OUI_FROM_DATABASE=DIGITAL EQUIPMENT CORP.
 
-OUI:0001A2*
- ID_OUI_FROM_DATABASE=Logical Co., Ltd.
+OUI:006014*
+ ID_OUI_FROM_DATABASE=EDEC CO., LTD.
 
-OUI:000196*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0060E1*
+ ID_OUI_FROM_DATABASE=ORCKIT COMMUNICATIONS LTD.
 
-OUI:0001A6*
- ID_OUI_FROM_DATABASE=Scientific-Atlanta Arcodan A/S
+OUI:006062*
+ ID_OUI_FROM_DATABASE=TELESYNC, INC.
 
-OUI:000172*
- ID_OUI_FROM_DATABASE=TechnoLand Co., LTD.
+OUI:006038*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:00303F*
- ID_OUI_FROM_DATABASE=TurboComm Tech Inc.
+OUI:006095*
+ ID_OUI_FROM_DATABASE=ACCU-TIME SYSTEMS, INC.
 
-OUI:003073*
- ID_OUI_FROM_DATABASE=International Microsystems, In
+OUI:00A016*
+ ID_OUI_FROM_DATABASE=MICROPOLIS CORP.
 
-OUI:00014D*
- ID_OUI_FROM_DATABASE=Shin Kin Enterprises Co., Ltd
+OUI:00A01C*
+ ID_OUI_FROM_DATABASE=NASCENT NETWORKS CORPORATION
 
-OUI:00016B*
- ID_OUI_FROM_DATABASE=LightChip, Inc.
+OUI:00A0FC*
+ ID_OUI_FROM_DATABASE=IMAGE SCIENCES, INC.
 
-OUI:000167*
- ID_OUI_FROM_DATABASE=HIOKI E.E. CORPORATION
+OUI:00A0B7*
+ ID_OUI_FROM_DATABASE=CORDANT, INC.
 
-OUI:000215*
- ID_OUI_FROM_DATABASE=Cotas Computer Technology A/B
+OUI:00A037*
+ ID_OUI_FROM_DATABASE=Mindray DS USA, Inc.
 
-OUI:000211*
- ID_OUI_FROM_DATABASE=Nature Worldwide Technology Corp.
+OUI:00A04C*
+ ID_OUI_FROM_DATABASE=INNOVATIVE SYSTEMS & TECHNOLOGIES, INC.
 
-OUI:000209*
- ID_OUI_FROM_DATABASE=Shenzhen SED Information Technology Co., Ltd.
+OUI:00A0E9*
+ ID_OUI_FROM_DATABASE=ELECTRONIC RETAILING SYSTEMS INTERNATIONAL
 
-OUI:000205*
- ID_OUI_FROM_DATABASE=Hitachi Denshi, Ltd.
+OUI:006078*
+ ID_OUI_FROM_DATABASE=POWER MEASUREMENT LTD.
 
-OUI:000202*
- ID_OUI_FROM_DATABASE=Amino Communications, Ltd.
+OUI:00600D*
+ ID_OUI_FROM_DATABASE=Digital Logic GmbH
 
-OUI:0001F6*
- ID_OUI_FROM_DATABASE=Association of Musical Electronics Industry
+OUI:00608A*
+ ID_OUI_FROM_DATABASE=CITADEL COMPUTER
 
-OUI:0001ED*
- ID_OUI_FROM_DATABASE=SETA Corp.
+OUI:00A05D*
+ ID_OUI_FROM_DATABASE=CS COMPUTER SYSTEME GmbH
 
-OUI:0001E9*
- ID_OUI_FROM_DATABASE=Litton Marine Systems B.V.
+OUI:00A0BD*
+ ID_OUI_FROM_DATABASE=I-TECH CORP.
 
-OUI:0002C6*
- ID_OUI_FROM_DATABASE=Data Track Technology PLC
+OUI:00A0B9*
+ ID_OUI_FROM_DATABASE=EAGLE TECHNOLOGY, INC.
 
-OUI:0002C2*
- ID_OUI_FROM_DATABASE=Net Vision Telecom
+OUI:00A069*
+ ID_OUI_FROM_DATABASE=Symmetricom, Inc.
 
-OUI:0002B9*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00A07A*
+ ID_OUI_FROM_DATABASE=ADVANCED PERIPHERALS TECHNOLOGIES, INC.
 
-OUI:0002B4*
- ID_OUI_FROM_DATABASE=DAPHNE
+OUI:00A04E*
+ ID_OUI_FROM_DATABASE=VOELKER TECHNOLOGIES, INC.
 
-OUI:0002AD*
- ID_OUI_FROM_DATABASE=HOYA Corporation
+OUI:00A05A*
+ ID_OUI_FROM_DATABASE=KOFAX IMAGE PRODUCTS
 
-OUI:0002A6*
- ID_OUI_FROM_DATABASE=Effinet Systems Co., Ltd.
+OUI:00A093*
+ ID_OUI_FROM_DATABASE=B/E AEROSPACE, Inc.
 
-OUI:0002A1*
- ID_OUI_FROM_DATABASE=World Wide Packets
+OUI:00A0BF*
+ ID_OUI_FROM_DATABASE=WIRELESS DATA GROUP MOTOROLA
 
-OUI:00029B*
- ID_OUI_FROM_DATABASE=Kreatel Communications AB
+OUI:00609F*
+ ID_OUI_FROM_DATABASE=PHAST CORPORATION
 
-OUI:00029E*
- ID_OUI_FROM_DATABASE=Information Equipment Co., Ltd.
+OUI:006067*
+ ID_OUI_FROM_DATABASE=ACER NETXUS INC.
 
-OUI:000296*
- ID_OUI_FROM_DATABASE=Lectron Co,. Ltd.
+OUI:00600C*
+ ID_OUI_FROM_DATABASE=Eurotech Inc.
 
-OUI:00028F*
- ID_OUI_FROM_DATABASE=Globetek, Inc.
+OUI:006025*
+ ID_OUI_FROM_DATABASE=ACTIVE IMAGING PLC
 
-OUI:000289*
- ID_OUI_FROM_DATABASE=DNE Technologies
+OUI:006071*
+ ID_OUI_FROM_DATABASE=MIDAS LAB, INC.
 
-OUI:000285*
- ID_OUI_FROM_DATABASE=Riverstone Networks
+OUI:0060A7*
+ ID_OUI_FROM_DATABASE=MICROSENS GmbH & CO. KG
 
-OUI:00027E*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0060FC*
+ ID_OUI_FROM_DATABASE=CONSERVATION THROUGH INNOVATION LTD.
 
-OUI:000280*
- ID_OUI_FROM_DATABASE=Mu Net, Inc.
+OUI:0060D4*
+ ID_OUI_FROM_DATABASE=ELDAT COMMUNICATION LTD.
 
-OUI:000279*
- ID_OUI_FROM_DATABASE=Control Applications, Ltd.
+OUI:006085*
+ ID_OUI_FROM_DATABASE=Storage Concepts
 
-OUI:000272*
- ID_OUI_FROM_DATABASE=CC&C Technologies, Inc.
+OUI:006018*
+ ID_OUI_FROM_DATABASE=STELLAR ONE CORPORATION
 
-OUI:00026B*
- ID_OUI_FROM_DATABASE=BCM Computers Co., Ltd.
+OUI:00602B*
+ ID_OUI_FROM_DATABASE=PEAK AUDIO
 
-OUI:00026D*
- ID_OUI_FROM_DATABASE=Adept Telecom
+OUI:00606F*
+ ID_OUI_FROM_DATABASE=CLARION CORPORATION OF AMERICA
 
-OUI:000262*
- ID_OUI_FROM_DATABASE=Soyo Group Soyo Com Tech Co., Ltd
+OUI:0060ED*
+ ID_OUI_FROM_DATABASE=RICARDO TEST AUTOMATION LTD.
 
-OUI:000260*
- ID_OUI_FROM_DATABASE=Accordion Networks, Inc.
+OUI:0060F6*
+ ID_OUI_FROM_DATABASE=NEXTEST COMMUNICATIONS PRODUCTS, INC.
 
-OUI:00025B*
- ID_OUI_FROM_DATABASE=Cambridge Silicon Radio
+OUI:0060DD*
+ ID_OUI_FROM_DATABASE=MYRICOM, INC.
 
-OUI:000087*
- ID_OUI_FROM_DATABASE=HITACHI, LTD.
+OUI:006092*
+ ID_OUI_FROM_DATABASE=MICRO/SYS, INC.
 
-OUI:000252*
- ID_OUI_FROM_DATABASE=Carrier Corporation
+OUI:006080*
+ ID_OUI_FROM_DATABASE=MICROTRONIX DATACOM LTD.
 
-OUI:00024B*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:006068*
+ ID_OUI_FROM_DATABASE=Dialogic Corporation
 
-OUI:000246*
- ID_OUI_FROM_DATABASE=All-Win Tech Co., Ltd.
+OUI:0060DB*
+ ID_OUI_FROM_DATABASE=NTP ELEKTRONIK A/S
 
-OUI:00017A*
- ID_OUI_FROM_DATABASE=Chengdu Maipu Electric Industrial Co., Ltd.
+OUI:00A002*
+ ID_OUI_FROM_DATABASE=LEEDS & NORTHRUP AUSTRALIA PTY LTD
 
-OUI:000235*
- ID_OUI_FROM_DATABASE=Paragon Networks International
+OUI:00A0E4*
+ ID_OUI_FROM_DATABASE=OPTIQUEST
 
-OUI:000238*
- ID_OUI_FROM_DATABASE=Serome Technology, Inc.
+OUI:00A01F*
+ ID_OUI_FROM_DATABASE=TRICORD SYSTEMS, INC.
 
-OUI:000230*
- ID_OUI_FROM_DATABASE=Intersoft Electronics
+OUI:00A0C0*
+ ID_OUI_FROM_DATABASE=DIGITAL LINK CORP.
 
-OUI:000229*
- ID_OUI_FROM_DATABASE=Adtec Corporation
+OUI:00A043*
+ ID_OUI_FROM_DATABASE=AMERICAN TECHNOLOGY LABS, INC.
 
-OUI:000225*
- ID_OUI_FROM_DATABASE=One Stop Systems
+OUI:00A047*
+ ID_OUI_FROM_DATABASE=INTEGRATED FITNESS CORP.
 
-OUI:00021C*
- ID_OUI_FROM_DATABASE=Network Elements, Inc.
+OUI:00A07C*
+ ID_OUI_FROM_DATABASE=TONYANG NYLON CO., LTD.
 
-OUI:000221*
- ID_OUI_FROM_DATABASE=DSP Application, Ltd.
+OUI:00A0EC*
+ ID_OUI_FROM_DATABASE=TRANSMITTON LTD.
 
-OUI:00016E*
- ID_OUI_FROM_DATABASE=Conklin Corporation
+OUI:00A07E*
+ ID_OUI_FROM_DATABASE=AVID TECHNOLOGY, INC.
 
-OUI:00015B*
- ID_OUI_FROM_DATABASE=ITALTEL S.p.A/RF-UP-I
+OUI:00A035*
+ ID_OUI_FROM_DATABASE=CYLINK CORPORATION
 
-OUI:000154*
- ID_OUI_FROM_DATABASE=G3M Corporation
+OUI:00A028*
+ ID_OUI_FROM_DATABASE=CONNER PERIPHERALS
 
-OUI:000150*
- ID_OUI_FROM_DATABASE=GILAT COMMUNICATIONS, LTD.
+OUI:00A0C7*
+ ID_OUI_FROM_DATABASE=TADIRAN TELECOMMUNICATIONS
 
-OUI:00012E*
- ID_OUI_FROM_DATABASE=PC Partner Ltd.
+OUI:00E0BE*
+ ID_OUI_FROM_DATABASE=GENROCO INTERNATIONAL, INC.
 
-OUI:00013A*
- ID_OUI_FROM_DATABASE=SHELCAD COMMUNICATIONS, LTD.
+OUI:00E010*
+ ID_OUI_FROM_DATABASE=HESS SB-AUTOMATENBAU GmbH
 
-OUI:000141*
- ID_OUI_FROM_DATABASE=CABLE PRINT
+OUI:00E0E9*
+ ID_OUI_FROM_DATABASE=DATA LABS, INC.
 
-OUI:000131*
- ID_OUI_FROM_DATABASE=Bosch Security Systems, Inc.
+OUI:00E0A0*
+ ID_OUI_FROM_DATABASE=WILTRON CO.
 
-OUI:00013D*
- ID_OUI_FROM_DATABASE=RiscStation Ltd.
+OUI:00E024*
+ ID_OUI_FROM_DATABASE=GADZOOX NETWORKS
 
-OUI:000149*
- ID_OUI_FROM_DATABASE=T.D.T. Transfer Data Test GmbH
+OUI:00E017*
+ ID_OUI_FROM_DATABASE=EXXACT GmbH
 
-OUI:00D047*
- ID_OUI_FROM_DATABASE=XN TECHNOLOGIES
+OUI:00603B*
+ ID_OUI_FROM_DATABASE=AMTEC spa
 
-OUI:00D018*
- ID_OUI_FROM_DATABASE=QWES. COM, INC.
+OUI:0020E5*
+ ID_OUI_FROM_DATABASE=APEX DATA, INC.
 
-OUI:00D048*
- ID_OUI_FROM_DATABASE=ECTON, INC.
+OUI:00207D*
+ ID_OUI_FROM_DATABASE=ADVANCED COMPUTER APPLICATIONS
 
-OUI:00D028*
- ID_OUI_FROM_DATABASE=Harmonic, Inc
+OUI:0020D0*
+ ID_OUI_FROM_DATABASE=VERSALYNX CORPORATION
 
-OUI:00D02F*
- ID_OUI_FROM_DATABASE=VLSI TECHNOLOGY INC.
+OUI:00206C*
+ ID_OUI_FROM_DATABASE=EVERGREEN TECHNOLOGY CORP.
 
-OUI:00D025*
- ID_OUI_FROM_DATABASE=XROSSTECH, INC.
+OUI:002012*
+ ID_OUI_FROM_DATABASE=CAMTRONICS MEDICAL SYSTEMS
 
-OUI:00D085*
- ID_OUI_FROM_DATABASE=OTIS ELEVATOR COMPANY
+OUI:00200B*
+ ID_OUI_FROM_DATABASE=OCTAGON SYSTEMS CORP.
 
-OUI:00D077*
- ID_OUI_FROM_DATABASE=LUCENT TECHNOLOGIES
+OUI:00209E*
+ ID_OUI_FROM_DATABASE=BROWN'S OPERATING SYSTEM SERVICES, LTD.
 
-OUI:00D093*
- ID_OUI_FROM_DATABASE=TQ - COMPONENTS GMBH
+OUI:0020D7*
+ ID_OUI_FROM_DATABASE=JAPAN MINICOMPUTER SYSTEMS CO., Ltd.
 
-OUI:00D013*
- ID_OUI_FROM_DATABASE=PRIMEX AEROSPACE COMPANY
+OUI:0020FB*
+ ID_OUI_FROM_DATABASE=OCTEL COMMUNICATIONS CORP.
 
-OUI:00D056*
- ID_OUI_FROM_DATABASE=SOMAT CORPORATION
+OUI:0020B1*
+ ID_OUI_FROM_DATABASE=COMTECH RESEARCH INC.
 
-OUI:00D017*
- ID_OUI_FROM_DATABASE=SYNTECH INFORMATION CO., LTD.
+OUI:002033*
+ ID_OUI_FROM_DATABASE=SYNAPSE TECHNOLOGIES, INC.
 
-OUI:00D036*
- ID_OUI_FROM_DATABASE=TECHNOLOGY ATLANTA CORP.
+OUI:002099*
+ ID_OUI_FROM_DATABASE=BON ELECTRIC CO., LTD.
 
-OUI:00D0D6*
- ID_OUI_FROM_DATABASE=AETHRA TELECOMUNICAZIONI
+OUI:0020AE*
+ ID_OUI_FROM_DATABASE=ORNET DATA COMMUNICATION TECH.
 
-OUI:003078*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0020EA*
+ ID_OUI_FROM_DATABASE=EFFICIENT NETWORKS, INC.
 
-OUI:003003*
- ID_OUI_FROM_DATABASE=Phasys Ltd.
+OUI:0020FF*
+ ID_OUI_FROM_DATABASE=SYMMETRICAL TECHNOLOGIES
 
-OUI:0030D5*
- ID_OUI_FROM_DATABASE=DResearch GmbH
+OUI:00208B*
+ ID_OUI_FROM_DATABASE=LAPIS TECHNOLOGIES, INC.
 
-OUI:0030CE*
- ID_OUI_FROM_DATABASE=Zaffire
+OUI:002069*
+ ID_OUI_FROM_DATABASE=ISDN SYSTEMS CORPORATION
 
-OUI:003095*
- ID_OUI_FROM_DATABASE=Procomp Informatics, Ltd.
+OUI:0020BA*
+ ID_OUI_FROM_DATABASE=CENTER FOR HIGH PERFORMANCE
 
-OUI:003055*
- ID_OUI_FROM_DATABASE=Renesas Technology America, Inc.
+OUI:002006*
+ ID_OUI_FROM_DATABASE=GARRETT COMMUNICATIONS, INC.
 
-OUI:0030B0*
- ID_OUI_FROM_DATABASE=Convergenet Technologies
+OUI:00A0A2*
+ ID_OUI_FROM_DATABASE=DIGICOM S.P.A.
 
-OUI:0030CC*
- ID_OUI_FROM_DATABASE=Tenor Networks, Inc.
+OUI:00A054*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:003013*
- ID_OUI_FROM_DATABASE=NEC Corporation
+OUI:00A030*
+ ID_OUI_FROM_DATABASE=CAPTOR NV/SA
 
-OUI:003061*
- ID_OUI_FROM_DATABASE=MobyTEL
+OUI:00A0B1*
+ ID_OUI_FROM_DATABASE=FIRST VIRTUAL CORPORATION
 
-OUI:00D0AB*
- ID_OUI_FROM_DATABASE=DELTAKABEL TELECOM CV
+OUI:0020CB*
+ ID_OUI_FROM_DATABASE=PRETEC ELECTRONICS CORP.
 
-OUI:00D0A8*
- ID_OUI_FROM_DATABASE=NETWORK ENGINES, INC.
+OUI:0020AB*
+ ID_OUI_FROM_DATABASE=MICRO INDUSTRIES CORP.
 
-OUI:00D01C*
- ID_OUI_FROM_DATABASE=SBS TECHNOLOGIES,
+OUI:00202D*
+ ID_OUI_FROM_DATABASE=TAIYO CORPORATION
 
-OUI:00D0C0*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00A088*
+ ID_OUI_FROM_DATABASE=ESSENTIAL COMMUNICATIONS
 
-OUI:00D051*
- ID_OUI_FROM_DATABASE=O2 MICRO, INC.
+OUI:00A0FA*
+ ID_OUI_FROM_DATABASE=Marconi Communication GmbH
 
-OUI:00D06D*
- ID_OUI_FROM_DATABASE=ACRISON, INC.
+OUI:00A014*
+ ID_OUI_FROM_DATABASE=CSIR
 
-OUI:0050A1*
- ID_OUI_FROM_DATABASE=CARLO GAVAZZI, INC.
+OUI:00A064*
+ ID_OUI_FROM_DATABASE=KVB/ANALECT
 
-OUI:00D06C*
- ID_OUI_FROM_DATABASE=SHAREWAVE, INC.
+OUI:00A07F*
+ ID_OUI_FROM_DATABASE=GSM-SYNTEL, LTD.
 
-OUI:00D03A*
- ID_OUI_FROM_DATABASE=ZONEWORX, INC.
+OUI:00A03E*
+ ID_OUI_FROM_DATABASE=ATM FORUM
 
-OUI:0050C1*
- ID_OUI_FROM_DATABASE=GEMFLEX NETWORKS, LTD.
+OUI:00A098*
+ ID_OUI_FROM_DATABASE=NetApp
 
-OUI:0050FB*
- ID_OUI_FROM_DATABASE=VSK ELECTRONICS
+OUI:00A021*
+ ID_OUI_FROM_DATABASE=General Dynamics
 
-OUI:005033*
- ID_OUI_FROM_DATABASE=MAYAN NETWORKS
+OUI:00A0A8*
+ ID_OUI_FROM_DATABASE=RENEX CORPORATION
 
-OUI:0030A0*
- ID_OUI_FROM_DATABASE=TYCO SUBMARINE SYSTEMS, LTD.
+OUI:002049*
+ ID_OUI_FROM_DATABASE=COMTRON, INC.
 
-OUI:0030CB*
- ID_OUI_FROM_DATABASE=OMNI FLOW COMPUTERS, INC.
+OUI:002050*
+ ID_OUI_FROM_DATABASE=KOREA COMPUTER INC.
 
-OUI:00306B*
- ID_OUI_FROM_DATABASE=CMOS SYSTEMS, INC.
+OUI:00203C*
+ ID_OUI_FROM_DATABASE=EUROTIME AB
 
-OUI:003068*
- ID_OUI_FROM_DATABASE=CYBERNETICS TECH. CO., LTD.
+OUI:002028*
+ ID_OUI_FROM_DATABASE=WEST EGG SYSTEMS, INC.
 
-OUI:0030E3*
- ID_OUI_FROM_DATABASE=SEDONA NETWORKS CORP.
+OUI:002014*
+ ID_OUI_FROM_DATABASE=GLOBAL VIEW CO., LTD.
 
-OUI:00D007*
- ID_OUI_FROM_DATABASE=MIC ASSOCIATES, INC.
+OUI:002053*
+ ID_OUI_FROM_DATABASE=HUNTSVILLE MICROSYSTEMS, INC.
 
-OUI:00D07F*
- ID_OUI_FROM_DATABASE=STRATEGY & TECHNOLOGY, LIMITED
+OUI:002001*
+ ID_OUI_FROM_DATABASE=DSP SOLUTIONS, INC.
 
-OUI:003085*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00209C*
+ ID_OUI_FROM_DATABASE=PRIMARY ACCESS CORP.
 
-OUI:003026*
- ID_OUI_FROM_DATABASE=HeiTel Digital Video GmbH
+OUI:0020C5*
+ ID_OUI_FROM_DATABASE=EAGLE TECHNOLOGY
 
-OUI:0030A6*
- ID_OUI_FROM_DATABASE=VIANET TECHNOLOGIES, LTD.
+OUI:002009*
+ ID_OUI_FROM_DATABASE=PACKARD BELL ELEC., INC.
 
-OUI:003047*
- ID_OUI_FROM_DATABASE=NISSEI ELECTRIC CO., LTD.
+OUI:002095*
+ ID_OUI_FROM_DATABASE=RIVA ELECTRONICS
 
-OUI:00D0FC*
- ID_OUI_FROM_DATABASE=GRANITE MICROSYSTEMS
+OUI:00203F*
+ ID_OUI_FROM_DATABASE=JUKI CORPORATION
 
-OUI:00D042*
- ID_OUI_FROM_DATABASE=MAHLO GMBH & CO. UG
+OUI:00C014*
+ ID_OUI_FROM_DATABASE=TELEMATICS CALABASAS INT'L,INC
 
-OUI:00D046*
- ID_OUI_FROM_DATABASE=DOLBY LABORATORIES, INC.
+OUI:00C045*
+ ID_OUI_FROM_DATABASE=ISOLATION SYSTEMS, LTD.
 
-OUI:00D0BA*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00C000*
+ ID_OUI_FROM_DATABASE=LANOPTICS, LTD.
 
-OUI:00D0BC*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00AA3C*
+ ID_OUI_FROM_DATABASE=OLIVETTI TELECOM SPA (OLTECO)
 
-OUI:00D0D8*
- ID_OUI_FROM_DATABASE=3Com Corporation
+OUI:00C079*
+ ID_OUI_FROM_DATABASE=FONSYS CO.,LTD.
 
-OUI:00D06B*
- ID_OUI_FROM_DATABASE=SR TELECOM INC.
+OUI:002011*
+ ID_OUI_FROM_DATABASE=CANOPUS CO., LTD.
 
-OUI:0030AA*
- ID_OUI_FROM_DATABASE=AXUS MICROSYSTEMS, INC.
+OUI:00C00B*
+ ID_OUI_FROM_DATABASE=NORCONTROL A.S.
 
-OUI:003043*
- ID_OUI_FROM_DATABASE=IDREAM TECHNOLOGIES, PTE. LTD.
+OUI:00C0C0*
+ ID_OUI_FROM_DATABASE=SHORE MICROSYSTEMS, INC.
 
-OUI:003010*
- ID_OUI_FROM_DATABASE=VISIONETICS INTERNATIONAL
+OUI:00C00C*
+ ID_OUI_FROM_DATABASE=RELIA TECHNOLGIES
 
-OUI:003096*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:00A0E7*
+ ID_OUI_FROM_DATABASE=CENTRAL DATA CORPORATION
 
-OUI:003084*
- ID_OUI_FROM_DATABASE=ALLIED TELESYN INTERNAIONAL
+OUI:00A068*
+ ID_OUI_FROM_DATABASE=BHP LIMITED
 
-OUI:0030CF*
- ID_OUI_FROM_DATABASE=TWO TECHNOLOGIES, INC.
+OUI:00A0B3*
+ ID_OUI_FROM_DATABASE=ZYKRONIX
 
-OUI:00D0E3*
- ID_OUI_FROM_DATABASE=ELE-CHEM ENGINEERING CO., LTD.
+OUI:00A06E*
+ ID_OUI_FROM_DATABASE=AUSTRON, INC.
 
-OUI:00D0ED*
- ID_OUI_FROM_DATABASE=XIOX
+OUI:00A0BB*
+ ID_OUI_FROM_DATABASE=HILAN GMBH
 
-OUI:00D0C2*
- ID_OUI_FROM_DATABASE=BALTHAZAR TECHNOLOGY AB
+OUI:00A017*
+ ID_OUI_FROM_DATABASE=J B M CORPORATION
 
-OUI:00D0FB*
- ID_OUI_FROM_DATABASE=TEK MICROSYSTEMS, INCORPORATED
+OUI:0020D5*
+ ID_OUI_FROM_DATABASE=VIPA GMBH
 
-OUI:00D082*
- ID_OUI_FROM_DATABASE=IOWAVE INC.
+OUI:002079*
+ ID_OUI_FROM_DATABASE=MIKRON GMBH
 
-OUI:00D0AD*
- ID_OUI_FROM_DATABASE=TL INDUSTRIES
+OUI:0020FA*
+ ID_OUI_FROM_DATABASE=GDE SYSTEMS, INC.
 
-OUI:00D0DB*
- ID_OUI_FROM_DATABASE=MCQUAY INTERNATIONAL
+OUI:002007*
+ ID_OUI_FROM_DATABASE=SFA, INC.
 
-OUI:00D06A*
- ID_OUI_FROM_DATABASE=LINKUP SYSTEMS CORPORATION
+OUI:002062*
+ ID_OUI_FROM_DATABASE=SCORPION LOGIC, LTD.
 
-OUI:00D065*
- ID_OUI_FROM_DATABASE=TOKO ELECTRIC
+OUI:00200A*
+ ID_OUI_FROM_DATABASE=SOURCE-COMM CORP.
 
-OUI:00D08F*
- ID_OUI_FROM_DATABASE=ARDENT TECHNOLOGIES, INC.
+OUI:002000*
+ ID_OUI_FROM_DATABASE=LEXMARK INTERNATIONAL, INC.
 
-OUI:00D0E7*
- ID_OUI_FROM_DATABASE=VCON TELECOMMUNICATION LTD.
+OUI:002003*
+ ID_OUI_FROM_DATABASE=PIXEL POWER LTD.
 
-OUI:00D087*
- ID_OUI_FROM_DATABASE=MICROFIRST INC.
+OUI:0020B4*
+ ID_OUI_FROM_DATABASE=TERMA ELEKTRONIK AS
 
-OUI:00D008*
- ID_OUI_FROM_DATABASE=MACTELL CORPORATION
+OUI:00205B*
+ ID_OUI_FROM_DATABASE=Kentrox, LLC
 
-OUI:003005*
- ID_OUI_FROM_DATABASE=Fujitsu Siemens Computers
+OUI:002030*
+ ID_OUI_FROM_DATABASE=ANALOG & DIGITAL SYSTEMS
 
-OUI:00304E*
- ID_OUI_FROM_DATABASE=BUSTEC PRODUCTION LTD.
+OUI:0020A8*
+ ID_OUI_FROM_DATABASE=SAST TECHNOLOGY CORP.
 
-OUI:0030E0*
- ID_OUI_FROM_DATABASE=OXFORD SEMICONDUCTOR LTD.
+OUI:002066*
+ ID_OUI_FROM_DATABASE=GENERAL MAGIC, INC.
 
-OUI:0030A1*
- ID_OUI_FROM_DATABASE=WEBGATE Inc.
+OUI:002036*
+ ID_OUI_FROM_DATABASE=BMC SOFTWARE
 
-OUI:00303D*
- ID_OUI_FROM_DATABASE=IVA CORPORATION
+OUI:0040BE*
+ ID_OUI_FROM_DATABASE=BOEING DEFENSE & SPACE
 
-OUI:0030C3*
- ID_OUI_FROM_DATABASE=FLUECKIGER ELEKTRONIK AG
+OUI:004036*
+ ID_OUI_FROM_DATABASE=Zoom Telephonics, Inc
 
-OUI:009047*
- ID_OUI_FROM_DATABASE=GIGA FAST E. LTD.
+OUI:004046*
+ ID_OUI_FROM_DATABASE=UDC RESEARCH LIMITED
 
-OUI:0090CB*
- ID_OUI_FROM_DATABASE=Wireless OnLine, Inc.
+OUI:00406A*
+ ID_OUI_FROM_DATABASE=KENTEK INFORMATION SYSTEMS,INC
 
-OUI:00903F*
- ID_OUI_FROM_DATABASE=AZTEC RADIOMEDIA
+OUI:0040F2*
+ ID_OUI_FROM_DATABASE=JANICH & KLASS COMPUTERTECHNIK
 
-OUI:001043*
- ID_OUI_FROM_DATABASE=A2 CORPORATION
+OUI:004082*
+ ID_OUI_FROM_DATABASE=LABORATORY EQUIPMENT CORP.
 
-OUI:00108D*
- ID_OUI_FROM_DATABASE=Johnson Controls, Inc.
+OUI:004022*
+ ID_OUI_FROM_DATABASE=KLEVER COMPUTERS, INC.
 
-OUI:00108E*
- ID_OUI_FROM_DATABASE=HUGH SYMONS CONCEPT Technologies Ltd.
+OUI:0040A2*
+ ID_OUI_FROM_DATABASE=KINGSTAR TECHNOLOGY INC.
 
-OUI:001052*
- ID_OUI_FROM_DATABASE=METTLER-TOLEDO (ALBSTADT) GMBH
+OUI:0040B4*
+ ID_OUI_FROM_DATABASE=NEXTCOM K.K.
 
-OUI:00100E*
- ID_OUI_FROM_DATABASE=MICRO LINEAR COPORATION
+OUI:0040D4*
+ ID_OUI_FROM_DATABASE=GAGE TALKER CORP.
 
-OUI:0010D7*
- ID_OUI_FROM_DATABASE=ARGOSY RESEARCH INC.
+OUI:004038*
+ ID_OUI_FROM_DATABASE=TALENT ELECTRIC INCORPORATED
 
-OUI:001059*
- ID_OUI_FROM_DATABASE=DIABLO RESEARCH CO. LLC
+OUI:004018*
+ ID_OUI_FROM_DATABASE=ADOBE SYSTEMS, INC.
 
-OUI:0010B6*
- ID_OUI_FROM_DATABASE=ENTRATA COMMUNICATIONS CORP.
+OUI:0040B0*
+ ID_OUI_FROM_DATABASE=BYTEX CORPORATION, ENGINEERING
 
-OUI:001019*
- ID_OUI_FROM_DATABASE=SIRONA DENTAL SYSTEMS GmbH & Co. KG
+OUI:004040*
+ ID_OUI_FROM_DATABASE=RING ACCESS, INC.
 
-OUI:001013*
- ID_OUI_FROM_DATABASE=Kontron America, Inc.
+OUI:0080D7*
+ ID_OUI_FROM_DATABASE=Fantum Engineering
 
-OUI:0090A4*
- ID_OUI_FROM_DATABASE=ALTIGA NETWORKS
+OUI:0080D9*
+ ID_OUI_FROM_DATABASE=EMK Elektronik GmbH & Co. KG
 
-OUI:00906C*
- ID_OUI_FROM_DATABASE=Sartorius Hamburg GmbH
+OUI:00806A*
+ ID_OUI_FROM_DATABASE=ERI (EMPAC RESEARCH INC.)
 
-OUI:0090FC*
- ID_OUI_FROM_DATABASE=NETWORK COMPUTING DEVICES
+OUI:00403B*
+ ID_OUI_FROM_DATABASE=SYNERJET INTERNATIONAL CORP.
 
-OUI:0090A3*
- ID_OUI_FROM_DATABASE=Corecess Inc.
+OUI:0040AB*
+ ID_OUI_FROM_DATABASE=ROLAND DG CORPORATION
 
-OUI:009022*
- ID_OUI_FROM_DATABASE=IVEX
+OUI:0040D5*
+ ID_OUI_FROM_DATABASE=Sartorius Mechatronics T&H GmbH
 
-OUI:0090A5*
- ID_OUI_FROM_DATABASE=SPECTRA LOGIC
+OUI:004027*
+ ID_OUI_FROM_DATABASE=SMC MASSACHUSETTS, INC.
 
-OUI:0090BA*
- ID_OUI_FROM_DATABASE=VALID NETWORKS, INC.
+OUI:00409C*
+ ID_OUI_FROM_DATABASE=TRANSWARE
 
-OUI:0090EE*
- ID_OUI_FROM_DATABASE=PERSONAL COMMUNICATIONS TECHNOLOGIES
+OUI:00405C*
+ ID_OUI_FROM_DATABASE=FUTURE SYSTEMS, INC.
 
-OUI:0090CD*
- ID_OUI_FROM_DATABASE=ENT-EMPRESA NACIONAL DE TELECOMMUNICACOES, S.A.
+OUI:00008C*
+ ID_OUI_FROM_DATABASE=Alloy Computer Products (Australia) Pty Ltd
 
-OUI:0090D0*
- ID_OUI_FROM_DATABASE=Thomson Telecom Belgium
+OUI:004000*
+ ID_OUI_FROM_DATABASE=PCI COMPONENTES DA AMZONIA LTD
 
-OUI:009075*
- ID_OUI_FROM_DATABASE=NEC DO BRASIL S.A.
+OUI:0040C5*
+ ID_OUI_FROM_DATABASE=MICOM COMMUNICATIONS INC.
 
-OUI:00902E*
- ID_OUI_FROM_DATABASE=NAMCO LIMITED
+OUI:004023*
+ ID_OUI_FROM_DATABASE=LOGIC CORPORATION
 
-OUI:0090A0*
- ID_OUI_FROM_DATABASE=8X8 INC.
+OUI:0040A4*
+ ID_OUI_FROM_DATABASE=ROSE ELECTRONICS
 
-OUI:00907C*
- ID_OUI_FROM_DATABASE=DIGITALCAST, INC.
+OUI:004048*
+ ID_OUI_FROM_DATABASE=SMD INFORMATICA S.A.
 
-OUI:0090DF*
- ID_OUI_FROM_DATABASE=MITSUBISHI CHEMICAL AMERICA, INC.
+OUI:004025*
+ ID_OUI_FROM_DATABASE=MOLECULAR DYNAMICS
 
-OUI:009023*
- ID_OUI_FROM_DATABASE=ZILOG INC.
+OUI:004010*
+ ID_OUI_FROM_DATABASE=SONIC SYSTEMS, INC.
 
-OUI:00908A*
- ID_OUI_FROM_DATABASE=BAYLY COMMUNICATIONS, INC.
+OUI:0040CA*
+ ID_OUI_FROM_DATABASE=FIRST INTERNAT'L COMPUTER, INC
 
-OUI:009063*
- ID_OUI_FROM_DATABASE=COHERENT COMMUNICATIONS SYSTEMS CORPORATION
+OUI:004050*
+ ID_OUI_FROM_DATABASE=IRONICS, INCORPORATED
 
-OUI:009041*
- ID_OUI_FROM_DATABASE=APPLIED DIGITAL ACCESS
+OUI:00402B*
+ ID_OUI_FROM_DATABASE=TRIGEM COMPUTER, INC.
 
-OUI:0090D8*
- ID_OUI_FROM_DATABASE=WHITECROSS SYSTEMS
+OUI:00C08C*
+ ID_OUI_FROM_DATABASE=PERFORMANCE TECHNOLOGIES, INC.
 
-OUI:009011*
- ID_OUI_FROM_DATABASE=WAVTrace, Inc.
+OUI:00C02B*
+ ID_OUI_FROM_DATABASE=GERLOFF GESELLSCHAFT FUR
 
-OUI:009040*
- ID_OUI_FROM_DATABASE=Siemens Network Convergence LLC
+OUI:00C0A7*
+ ID_OUI_FROM_DATABASE=SEEL LTD.
 
-OUI:0090C7*
- ID_OUI_FROM_DATABASE=ICOM INC.
+OUI:0040B3*
+ ID_OUI_FROM_DATABASE=ParTech Inc.
 
-OUI:009035*
- ID_OUI_FROM_DATABASE=ALPHA TELECOM, INC.
+OUI:00407D*
+ ID_OUI_FROM_DATABASE=EXTENSION TECHNOLOGY CORP.
 
-OUI:009087*
- ID_OUI_FROM_DATABASE=ITIS
+OUI:004079*
+ ID_OUI_FROM_DATABASE=JUKO MANUFACTURE COMPANY, LTD.
 
-OUI:00906E*
- ID_OUI_FROM_DATABASE=PRAXON, INC.
+OUI:0040D9*
+ ID_OUI_FROM_DATABASE=AMERICAN MEGATRENDS INC.
 
-OUI:009039*
- ID_OUI_FROM_DATABASE=SHASTA NETWORKS
+OUI:004011*
+ ID_OUI_FROM_DATABASE=ANDOVER CONTROLS CORPORATION
 
-OUI:00909A*
- ID_OUI_FROM_DATABASE=ONE WORLD SYSTEMS, INC.
+OUI:0040C1*
+ ID_OUI_FROM_DATABASE=BIZERBA-WERKE WILHEIM KRAUT
 
-OUI:009053*
- ID_OUI_FROM_DATABASE=DAEWOO ELECTRONICS CO., LTD.
+OUI:00C06B*
+ ID_OUI_FROM_DATABASE=OSI PLUS CORPORATION
 
-OUI:00909E*
- ID_OUI_FROM_DATABASE=Critical IO, LLC
+OUI:00C06A*
+ ID_OUI_FROM_DATABASE=ZAHNER-ELEKTRIK GMBH & CO. KG
 
-OUI:0090C2*
- ID_OUI_FROM_DATABASE=JK microsystems, Inc.
+OUI:00C097*
+ ID_OUI_FROM_DATABASE=ARCHIPEL SA
 
-OUI:009091*
- ID_OUI_FROM_DATABASE=DigitalScape, Inc.
+OUI:00C072*
+ ID_OUI_FROM_DATABASE=KNX LTD.
 
-OUI:0090ED*
- ID_OUI_FROM_DATABASE=CENTRAL SYSTEM RESEARCH CO., LTD.
+OUI:00C0EC*
+ ID_OUI_FROM_DATABASE=DAUPHIN TECHNOLOGY
 
-OUI:00901B*
- ID_OUI_FROM_DATABASE=DIGITAL CONTROLS
+OUI:00C066*
+ ID_OUI_FROM_DATABASE=DOCUPOINT, INC.
 
-OUI:00905C*
- ID_OUI_FROM_DATABASE=EDMI
+OUI:00C028*
+ ID_OUI_FROM_DATABASE=JASCO CORPORATION
 
-OUI:0090D2*
- ID_OUI_FROM_DATABASE=ARTEL VIDEO SYSTEMS
+OUI:00C0DC*
+ ID_OUI_FROM_DATABASE=EOS TECHNOLOGIES, INC.
 
-OUI:00508C*
- ID_OUI_FROM_DATABASE=RSI SYSTEMS
+OUI:00C02D*
+ ID_OUI_FROM_DATABASE=FUJI PHOTO FILM CO., LTD.
 
-OUI:00502D*
- ID_OUI_FROM_DATABASE=ACCEL, INC.
+OUI:00C0BD*
+ ID_OUI_FROM_DATABASE=INEX TECHNOLOGIES, INC.
 
-OUI:0050B8*
- ID_OUI_FROM_DATABASE=INOVA COMPUTERS GMBH & CO. KG
+OUI:00C054*
+ ID_OUI_FROM_DATABASE=NETWORK PERIPHERALS, LTD.
 
-OUI:00503A*
- ID_OUI_FROM_DATABASE=DATONG ELECTRONICS LTD.
+OUI:00C0D5*
+ ID_OUI_FROM_DATABASE=Werbeagentur Jürgen Siebert
 
-OUI:00508E*
- ID_OUI_FROM_DATABASE=OPTIMATION, INC.
+OUI:00C044*
+ ID_OUI_FROM_DATABASE=EMCOM CORPORATION
 
-OUI:0050BB*
- ID_OUI_FROM_DATABASE=CMS TECHNOLOGIES
+OUI:00C050*
+ ID_OUI_FROM_DATABASE=TOYO DENKI SEIZO K.K.
 
-OUI:005051*
- ID_OUI_FROM_DATABASE=IWATSU ELECTRIC CO., LTD.
+OUI:00408A*
+ ID_OUI_FROM_DATABASE=TPS TELEPROCESSING SYS. GMBH
 
-OUI:0050BE*
- ID_OUI_FROM_DATABASE=FAST MULTIMEDIA AG
+OUI:0040FD*
+ ID_OUI_FROM_DATABASE=LXE
 
-OUI:0050AD*
- ID_OUI_FROM_DATABASE=CommUnique Wireless Corp.
+OUI:00403D*
+ ID_OUI_FROM_DATABASE=Teradata Corporation
 
-OUI:005016*
- ID_OUI_FROM_DATABASE=SST/WOODHEAD INDUSTRIES
+OUI:0040E0*
+ ID_OUI_FROM_DATABASE=ATOMWIDE LTD.
 
-OUI:005003*
- ID_OUI_FROM_DATABASE=Xrite Inc
+OUI:00408C*
+ ID_OUI_FROM_DATABASE=AXIS COMMUNICATIONS AB
 
-OUI:005023*
- ID_OUI_FROM_DATABASE=PG DESIGN ELECTRONICS, INC.
+OUI:004068*
+ ID_OUI_FROM_DATABASE=EXTENDED SYSTEMS
 
-OUI:005039*
- ID_OUI_FROM_DATABASE=MARINER NETWORKS
+OUI:0040BA*
+ ID_OUI_FROM_DATABASE=ALLIANT COMPUTER SYSTEMS CORP.
 
-OUI:00505A*
- ID_OUI_FROM_DATABASE=NETWORK ALCHEMY, INC.
+OUI:004069*
+ ID_OUI_FROM_DATABASE=LEMCOM SYSTEMS, INC.
 
-OUI:005071*
- ID_OUI_FROM_DATABASE=AIWA CO., LTD.
+OUI:0040F8*
+ ID_OUI_FROM_DATABASE=SYSTEMHAUS DISCOM
 
-OUI:009071*
- ID_OUI_FROM_DATABASE=Applied Innovation Inc.
+OUI:004077*
+ ID_OUI_FROM_DATABASE=MAXTON TECHNOLOGY CORPORATION
 
-OUI:009031*
- ID_OUI_FROM_DATABASE=MYSTICOM, LTD.
+OUI:0040E7*
+ ID_OUI_FROM_DATABASE=ARNOS INSTRUMENTS & COMPUTER
 
-OUI:00901F*
- ID_OUI_FROM_DATABASE=ADTEC PRODUCTIONS, INC.
+OUI:0040AC*
+ ID_OUI_FROM_DATABASE=SUPER WORKSTATION, INC.
 
-OUI:009081*
- ID_OUI_FROM_DATABASE=ALOHA NETWORKS, INC.
+OUI:00C0AC*
+ ID_OUI_FROM_DATABASE=GAMBIT COMPUTER COMMUNICATIONS
 
-OUI:0090B3*
- ID_OUI_FROM_DATABASE=AGRANAT SYSTEMS
+OUI:00C02C*
+ ID_OUI_FROM_DATABASE=CENTRUM COMMUNICATIONS, INC.
 
-OUI:00500D*
- ID_OUI_FROM_DATABASE=SATORI ELECTORIC CO., LTD.
+OUI:00C0ED*
+ ID_OUI_FROM_DATABASE=US ARMY ELECTRONIC
 
-OUI:0050EC*
- ID_OUI_FROM_DATABASE=OLICOM A/S
+OUI:00C0D1*
+ ID_OUI_FROM_DATABASE=COMTREE TECHNOLOGY CORPORATION
 
-OUI:005083*
- ID_OUI_FROM_DATABASE=GILBARCO, INC.
+OUI:00C0D2*
+ ID_OUI_FROM_DATABASE=SYNTELLECT, INC.
 
-OUI:0050CF*
- ID_OUI_FROM_DATABASE=VANLINK COMMUNICATION TECHNOLOGY RESEARCH INSTITUTE
+OUI:00C0FB*
+ ID_OUI_FROM_DATABASE=ADVANCED TECHNOLOGY LABS
 
-OUI:005008*
- ID_OUI_FROM_DATABASE=TIVA MICROCOMPUTER CORP. (TMC)
+OUI:00C092*
+ ID_OUI_FROM_DATABASE=MENNEN MEDICAL INC.
 
-OUI:005001*
- ID_OUI_FROM_DATABASE=YAMASHITA SYSTEMS CORP.
+OUI:00C06C*
+ ID_OUI_FROM_DATABASE=SVEC COMPUTER CORP.
 
-OUI:0050B5*
- ID_OUI_FROM_DATABASE=FICHET-BAUCHE
+OUI:00C02E*
+ ID_OUI_FROM_DATABASE=NETWIZ
 
-OUI:0050B0*
- ID_OUI_FROM_DATABASE=TECHNOLOGY ATLANTA CORPORATION
+OUI:00C05B*
+ ID_OUI_FROM_DATABASE=NETWORKS NORTHWEST, INC.
 
-OUI:00504E*
- ID_OUI_FROM_DATABASE=SIERRA MONITOR CORP.
+OUI:00C0BF*
+ ID_OUI_FROM_DATABASE=TECHNOLOGY CONCEPTS, LTD.
 
-OUI:00504D*
- ID_OUI_FROM_DATABASE=Tokyo Electron Device Limited
+OUI:00C0C9*
+ ID_OUI_FROM_DATABASE=ELSAG BAILEY PROCESS
 
-OUI:0050F7*
- ID_OUI_FROM_DATABASE=VENTURE MANUFACTURING (SINGAPORE) LTD.
+OUI:00809D*
+ ID_OUI_FROM_DATABASE=Commscraft Ltd.
 
-OUI:005029*
- ID_OUI_FROM_DATABASE=1394 PRINTER WORKING GROUP
+OUI:008017*
+ ID_OUI_FROM_DATABASE=PFU LIMITED
 
-OUI:00E08D*
- ID_OUI_FROM_DATABASE=PRESSURE SYSTEMS, INC.
+OUI:0080F8*
+ ID_OUI_FROM_DATABASE=MIZAR, INC.
 
-OUI:00E040*
- ID_OUI_FROM_DATABASE=DeskStation Technology, Inc.
+OUI:008024*
+ ID_OUI_FROM_DATABASE=KALPANA, INC.
 
-OUI:00E0D6*
- ID_OUI_FROM_DATABASE=COMPUTER & COMMUNICATION RESEARCH LAB.
+OUI:008074*
+ ID_OUI_FROM_DATABASE=FISHER CONTROLS
 
-OUI:00E07E*
- ID_OUI_FROM_DATABASE=WALT DISNEY IMAGINEERING
+OUI:008021*
+ ID_OUI_FROM_DATABASE=Alcatel Canada Inc.
 
-OUI:00E094*
- ID_OUI_FROM_DATABASE=OSAI SRL
+OUI:000055*
+ ID_OUI_FROM_DATABASE=COMMISSARIAT A L`ENERGIE ATOM.
 
-OUI:00E032*
- ID_OUI_FROM_DATABASE=MISYS FINANCIAL SYSTEMS, LTD.
+OUI:000086*
+ ID_OUI_FROM_DATABASE=MEGAHERTZ CORPORATION
 
-OUI:00E06B*
- ID_OUI_FROM_DATABASE=W&G SPECIAL PRODUCTS
+OUI:000092*
+ ID_OUI_FROM_DATABASE=COGENT DATA TECHNOLOGIES
 
-OUI:00E01C*
- ID_OUI_FROM_DATABASE=Cradlepoint, Inc
+OUI:008068*
+ ID_OUI_FROM_DATABASE=YAMATECH SCIENTIFIC LTD.
 
-OUI:00E076*
- ID_OUI_FROM_DATABASE=DEVELOPMENT CONCEPTS, INC.
+OUI:0080F2*
+ ID_OUI_FROM_DATABASE=RAYCOM SYSTEMS INC
 
-OUI:00E0A7*
- ID_OUI_FROM_DATABASE=IPC INFORMATION SYSTEMS, INC.
+OUI:0080EA*
+ ID_OUI_FROM_DATABASE=ADVA Optical Networking Ltd.
 
-OUI:00E0A4*
- ID_OUI_FROM_DATABASE=ESAOTE S.p.A.
+OUI:000067*
+ ID_OUI_FROM_DATABASE=SOFT * RITE, INC.
 
-OUI:00E080*
- ID_OUI_FROM_DATABASE=CONTROL RESOURCES CORPORATION
+OUI:0000E8*
+ ID_OUI_FROM_DATABASE=ACCTON TECHNOLOGY CORP.
 
-OUI:00E0CC*
- ID_OUI_FROM_DATABASE=HERO SYSTEMS, LTD.
+OUI:0000B2*
+ ID_OUI_FROM_DATABASE=TELEVIDEO SYSTEMS, INC.
 
-OUI:00E099*
- ID_OUI_FROM_DATABASE=SAMSON AG
+OUI:0000EE*
+ ID_OUI_FROM_DATABASE=NETWORK DESIGNERS, LTD.
 
-OUI:0010E9*
- ID_OUI_FROM_DATABASE=RAIDTEC LTD.
+OUI:000089*
+ ID_OUI_FROM_DATABASE=CAYMAN SYSTEMS INC.
 
-OUI:001003*
- ID_OUI_FROM_DATABASE=IMATRON, INC.
+OUI:000021*
+ ID_OUI_FROM_DATABASE=SUREMAN COMP. & COMMUN. CORP.
 
-OUI:00105A*
- ID_OUI_FROM_DATABASE=3COM CORPORATION
+OUI:0000CF*
+ ID_OUI_FROM_DATABASE=HAYES MICROCOMPUTER PRODUCTS
 
-OUI:0010A9*
- ID_OUI_FROM_DATABASE=ADHOC TECHNOLOGIES
+OUI:0000A4*
+ ID_OUI_FROM_DATABASE=ACORN COMPUTERS LIMITED
 
-OUI:000400*
- ID_OUI_FROM_DATABASE=LEXMARK INTERNATIONAL, INC.
+OUI:000018*
+ ID_OUI_FROM_DATABASE=WEBSTER COMPUTER CORPORATION
 
-OUI:00101A*
- ID_OUI_FROM_DATABASE=PictureTel Corp.
+OUI:008033*
+ ID_OUI_FROM_DATABASE=EMS Aviation, Inc.
 
-OUI:001097*
- ID_OUI_FROM_DATABASE=WinNet Metropolitan Communications Systems, Inc.
+OUI:008052*
+ ID_OUI_FROM_DATABASE=TECHNICALLY ELITE CONCEPTS
 
-OUI:00106F*
- ID_OUI_FROM_DATABASE=TRENTON TECHNOLOGY INC.
+OUI:00804F*
+ ID_OUI_FROM_DATABASE=DAIKIN INDUSTRIES, LTD.
 
-OUI:0010DA*
- ID_OUI_FROM_DATABASE=Kollmorgen Corp
+OUI:00806D*
+ ID_OUI_FROM_DATABASE=CENTURY SYSTEMS CORP.
 
-OUI:0010DF*
- ID_OUI_FROM_DATABASE=RISE COMPUTER INC.
+OUI:00802D*
+ ID_OUI_FROM_DATABASE=XYLOGICS INC
 
-OUI:00109E*
- ID_OUI_FROM_DATABASE=AWARE, INC.
+OUI:008048*
+ ID_OUI_FROM_DATABASE=COMPEX INCORPORATED
 
-OUI:001072*
- ID_OUI_FROM_DATABASE=GVN TECHNOLOGIES, INC.
+OUI:008085*
+ ID_OUI_FROM_DATABASE=H-THREE SYSTEMS CORPORATION
 
-OUI:00E019*
- ID_OUI_FROM_DATABASE=ING. GIORDANO ELETTRONICA
+OUI:008014*
+ ID_OUI_FROM_DATABASE=ESPRIT SYSTEMS
 
-OUI:00E0D7*
- ID_OUI_FROM_DATABASE=SUNSHINE ELECTRONICS, INC.
+OUI:0080B4*
+ ID_OUI_FROM_DATABASE=SOPHIA SYSTEMS
 
-OUI:00E0DA*
- ID_OUI_FROM_DATABASE=Alcatel North America ESD
+OUI:00807F*
+ ID_OUI_FROM_DATABASE=DY-4 INCORPORATED
 
-OUI:00E068*
- ID_OUI_FROM_DATABASE=MERRIMAC SYSTEMS INC.
+OUI:0000E4*
+ ID_OUI_FROM_DATABASE=IN2 GROUPE INTERTECHNIQUE
 
-OUI:00E01D*
- ID_OUI_FROM_DATABASE=WebTV NETWORKS, INC.
+OUI:000079*
+ ID_OUI_FROM_DATABASE=NETWORTH INCORPORATED
 
-OUI:00E01F*
- ID_OUI_FROM_DATABASE=AVIDIA Systems, Inc.
+OUI:000075*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:00E056*
- ID_OUI_FROM_DATABASE=HOLONTECH CORPORATION
+OUI:004009*
+ ID_OUI_FROM_DATABASE=TACHIBANA TECTRON CO., LTD.
 
-OUI:00E0C9*
- ID_OUI_FROM_DATABASE=AutomatedLogic Corporation
+OUI:00409E*
+ ID_OUI_FROM_DATABASE=CONCURRENT TECHNOLOGIES  LTD.
 
-OUI:00E030*
- ID_OUI_FROM_DATABASE=MELITA INTERNATIONAL CORP.
+OUI:008092*
+ ID_OUI_FROM_DATABASE=Silex Technology, Inc.
 
-OUI:00E0BA*
- ID_OUI_FROM_DATABASE=BERGHOF AUTOMATIONSTECHNIK GmbH
+OUI:008011*
+ ID_OUI_FROM_DATABASE=DIGITAL SYSTEMS INT'L. INC.
 
-OUI:00E0B2*
- ID_OUI_FROM_DATABASE=TELMAX COMMUNICATIONS CORP.
+OUI:008044*
+ ID_OUI_FROM_DATABASE=SYSTECH COMPUTER CORP.
 
-OUI:00E0EF*
- ID_OUI_FROM_DATABASE=DIONEX
+OUI:00808A*
+ ID_OUI_FROM_DATABASE=SUMMIT MICROSYSTEMS CORP.
 
-OUI:00E0BD*
- ID_OUI_FROM_DATABASE=INTERFACE SYSTEMS, INC.
+OUI:0080E3*
+ ID_OUI_FROM_DATABASE=CORAL NETWORK CORPORATION
 
-OUI:00E071*
- ID_OUI_FROM_DATABASE=EPIS MICROCOMPUTER
+OUI:008072*
+ ID_OUI_FROM_DATABASE=MICROPLEX SYSTEMS LTD.
 
-OUI:00E0A6*
- ID_OUI_FROM_DATABASE=TELOGY NETWORKS, INC.
+OUI:008054*
+ ID_OUI_FROM_DATABASE=FRONTIER TECHNOLOGIES CORP.
 
-OUI:00E026*
- ID_OUI_FROM_DATABASE=Redlake MASD LLC
+OUI:0080AE*
+ ID_OUI_FROM_DATABASE=HUGHES NETWORK SYSTEMS
 
-OUI:00E0B8*
- ID_OUI_FROM_DATABASE=GATEWAY 2000
+OUI:0080AF*
+ ID_OUI_FROM_DATABASE=ALLUMER CO., LTD.
 
-OUI:00E088*
- ID_OUI_FROM_DATABASE=LTX-Credence CORPORATION
+OUI:0080EC*
+ ID_OUI_FROM_DATABASE=SUPERCOMPUTING SOLUTIONS, INC.
 
-OUI:00E07C*
- ID_OUI_FROM_DATABASE=METTLER-TOLEDO, INC.
+OUI:0080A4*
+ ID_OUI_FROM_DATABASE=LIBERTY ELECTRONICS
 
-OUI:00E08C*
- ID_OUI_FROM_DATABASE=NEOPARADIGM LABS, INC.
+OUI:008073*
+ ID_OUI_FROM_DATABASE=DWB ASSOCIATES
 
-OUI:00E061*
- ID_OUI_FROM_DATABASE=EdgePoint Networks, Inc.
+OUI:00802B*
+ ID_OUI_FROM_DATABASE=INTEGRATED MARKETING CO
 
-OUI:00E06E*
- ID_OUI_FROM_DATABASE=FAR SYSTEMS S.p.A.
+OUI:0080BE*
+ ID_OUI_FROM_DATABASE=ARIES RESEARCH
 
-OUI:00E01B*
- ID_OUI_FROM_DATABASE=SPHERE COMMUNICATIONS, INC.
+OUI:008027*
+ ID_OUI_FROM_DATABASE=ADAPTIVE SYSTEMS, INC.
 
-OUI:00E0AE*
- ID_OUI_FROM_DATABASE=XAQTI CORPORATION
+OUI:0080E2*
+ ID_OUI_FROM_DATABASE=T.D.I. CO., LTD.
 
-OUI:00E0C8*
- ID_OUI_FROM_DATABASE=VIRTUAL ACCESS, LTD.
+OUI:0040EE*
+ ID_OUI_FROM_DATABASE=OPTIMEM
 
-OUI:00101D*
- ID_OUI_FROM_DATABASE=WINBOND ELECTRONICS CORP.
+OUI:00405E*
+ ID_OUI_FROM_DATABASE=NORTH HILLS ISRAEL
 
-OUI:00105F*
- ID_OUI_FROM_DATABASE=ZODIAC DATA SYSTEMS
+OUI:004072*
+ ID_OUI_FROM_DATABASE=Applied Innovation Inc.
 
-OUI:0010CB*
- ID_OUI_FROM_DATABASE=FACIT K.K.
+OUI:004031*
+ ID_OUI_FROM_DATABASE=KOKUSAI ELECTRIC CO., LTD
 
-OUI:00108C*
- ID_OUI_FROM_DATABASE=FUJITSU TELECOMMUNICATIONS EUROPE, LTD.
+OUI:00400C*
+ ID_OUI_FROM_DATABASE=GENERAL MICRO SYSTEMS, INC.
 
-OUI:001075*
- ID_OUI_FROM_DATABASE=Segate Technology LLC
+OUI:0040E6*
+ ID_OUI_FROM_DATABASE=C.A.E.N.
 
-OUI:001058*
- ID_OUI_FROM_DATABASE=ArrowPoint Communications
+OUI:0040FC*
+ ID_OUI_FROM_DATABASE=IBR COMPUTER TECHNIK GMBH
 
-OUI:0010A8*
- ID_OUI_FROM_DATABASE=RELIANCE COMPUTER CORP.
+OUI:004001*
+ ID_OUI_FROM_DATABASE=Zero One Technology Co. Ltd.
 
-OUI:0010AA*
- ID_OUI_FROM_DATABASE=MEDIA4, INC.
+OUI:004002*
+ ID_OUI_FROM_DATABASE=PERLE SYSTEMS LIMITED
 
-OUI:0010E8*
- ID_OUI_FROM_DATABASE=TELOCITY, INCORPORATED
+OUI:0080DB*
+ ID_OUI_FROM_DATABASE=GRAPHON CORPORATION
 
-OUI:001010*
- ID_OUI_FROM_DATABASE=INITIO CORPORATION
+OUI:0080B1*
+ ID_OUI_FROM_DATABASE=SOFTCOM A/S
 
-OUI:00E007*
- ID_OUI_FROM_DATABASE=Avaya ECS Ltd
+OUI:0080D8*
+ ID_OUI_FROM_DATABASE=NETWORK PERIPHERALS INC.
 
-OUI:001022*
- ID_OUI_FROM_DATABASE=SatCom Media Corporation
+OUI:0080AB*
+ ID_OUI_FROM_DATABASE=DUKANE NETWORK INTEGRATION
 
-OUI:0010C7*
- ID_OUI_FROM_DATABASE=DATA TRANSMISSION NETWORK
+OUI:00809B*
+ ID_OUI_FROM_DATABASE=JUSTSYSTEM CORPORATION
 
-OUI:001098*
- ID_OUI_FROM_DATABASE=STARNET TECHNOLOGIES, INC.
+OUI:008089*
+ ID_OUI_FROM_DATABASE=TECNETICS (PTY) LTD.
 
-OUI:001096*
- ID_OUI_FROM_DATABASE=TRACEWELL SYSTEMS, INC.
+OUI:000039*
+ ID_OUI_FROM_DATABASE=TOSHIBA CORPORATION
 
-OUI:001082*
- ID_OUI_FROM_DATABASE=JNA TELECOMMUNICATIONS LIMITED
+OUI:0000CB*
+ ID_OUI_FROM_DATABASE=COMPU-SHACK ELECTRONIC GMBH
 
-OUI:001021*
- ID_OUI_FROM_DATABASE=ENCANTO NETWORKS, INC.
+OUI:0000D1*
+ ID_OUI_FROM_DATABASE=ADAPTEC INCORPORATED
 
-OUI:0010CE*
- ID_OUI_FROM_DATABASE=VOLAMP, LTD.
+OUI:0000B6*
+ ID_OUI_FROM_DATABASE=MICRO-MATIC RESEARCH
 
-OUI:0010B2*
- ID_OUI_FROM_DATABASE=COACTIVE AESTHETICS
+OUI:000066*
+ ID_OUI_FROM_DATABASE=TALARIS SYSTEMS, INC.
 
-OUI:00109A*
- ID_OUI_FROM_DATABASE=NETLINE
+OUI:000014*
+ ID_OUI_FROM_DATABASE=NETRONIX
 
-OUI:0010EA*
- ID_OUI_FROM_DATABASE=ADEPT TECHNOLOGY
+OUI:000072*
+ ID_OUI_FROM_DATABASE=MINIWARE TECHNOLOGY
 
-OUI:0010BD*
- ID_OUI_FROM_DATABASE=THE TELECOMMUNICATION TECHNOLOGY COMMITTEE (TTC)
+OUI:0000AB*
+ ID_OUI_FROM_DATABASE=LOGIC MODELING CORPORATION
 
-OUI:006099*
- ID_OUI_FROM_DATABASE=SBE, Inc.
+OUI:000029*
+ ID_OUI_FROM_DATABASE=IMC NETWORKS CORP.
 
-OUI:0060FD*
- ID_OUI_FROM_DATABASE=NetICs, Inc.
+OUI:0080CD*
+ ID_OUI_FROM_DATABASE=MICRONICS COMPUTER, INC.
 
-OUI:0060B5*
- ID_OUI_FROM_DATABASE=KEBA GmbH
+OUI:008083*
+ ID_OUI_FROM_DATABASE=AMDAHL
 
-OUI:006027*
- ID_OUI_FROM_DATABASE=Superior Modular Products
+OUI:008003*
+ ID_OUI_FROM_DATABASE=HYTEC ELECTRONICS LTD.
 
-OUI:0060C1*
- ID_OUI_FROM_DATABASE=WaveSpan Corporation
+OUI:00801B*
+ ID_OUI_FROM_DATABASE=KODIAK TECHNOLOGY
 
-OUI:006041*
- ID_OUI_FROM_DATABASE=Yokogawa Electric Corporation
+OUI:0080CC*
+ ID_OUI_FROM_DATABASE=MICROWAVE BYPASS SYSTEMS
 
-OUI:006005*
- ID_OUI_FROM_DATABASE=FEEDBACK DATA LTD.
+OUI:080079*
+ ID_OUI_FROM_DATABASE=THE DROID WORKS
 
-OUI:00607B*
- ID_OUI_FROM_DATABASE=FORE SYSTEMS, INC.
+OUI:080077*
+ ID_OUI_FROM_DATABASE=TSL COMMUNICATIONS LTD.
 
-OUI:00609C*
- ID_OUI_FROM_DATABASE=Perkin-Elmer Incorporated
+OUI:080071*
+ ID_OUI_FROM_DATABASE=MATRA (DSIE)
 
-OUI:006007*
- ID_OUI_FROM_DATABASE=ACRES GAMING, INC.
+OUI:08005F*
+ ID_OUI_FROM_DATABASE=SABER TECHNOLOGY CORP.
 
-OUI:006035*
- ID_OUI_FROM_DATABASE=DALLAS SEMICONDUCTOR, INC.
+OUI:08005C*
+ ID_OUI_FROM_DATABASE=FOUR PHASE SYSTEMS
 
-OUI:0060F1*
- ID_OUI_FROM_DATABASE=EXP COMPUTER, INC.
+OUI:08005B*
+ ID_OUI_FROM_DATABASE=VTA TECHNOLOGIES INC.
 
-OUI:006040*
- ID_OUI_FROM_DATABASE=NETRO CORP.
+OUI:080058*
+ ID_OUI_FROM_DATABASE=SYSTEMS CONCEPTS
 
-OUI:006034*
- ID_OUI_FROM_DATABASE=ROBERT BOSCH GmbH
+OUI:080050*
+ ID_OUI_FROM_DATABASE=DAISY SYSTEMS CORP.
 
-OUI:0060BA*
- ID_OUI_FROM_DATABASE=SAHARA NETWORKS, INC.
+OUI:080052*
+ ID_OUI_FROM_DATABASE=INSYSTEC
 
-OUI:006096*
- ID_OUI_FROM_DATABASE=T.S. MICROTECH INC.
+OUI:080047*
+ ID_OUI_FROM_DATABASE=SEQUENT COMPUTER SYSTEMS INC.
 
-OUI:00603A*
- ID_OUI_FROM_DATABASE=QUICK CONTROLS LTD.
+OUI:080045*
+ ID_OUI_FROM_DATABASE=CONCURRENT COMPUTER CORP.
 
-OUI:0060AC*
- ID_OUI_FROM_DATABASE=RESILIENCE CORPORATION
+OUI:080044*
+ ID_OUI_FROM_DATABASE=DAVID SYSTEMS INC.
 
-OUI:0060EB*
- ID_OUI_FROM_DATABASE=FOURTHTRACK SYSTEMS
+OUI:080041*
+ ID_OUI_FROM_DATABASE=RACAL-MILGO INFORMATION SYS..
 
-OUI:00606D*
- ID_OUI_FROM_DATABASE=DIGITAL EQUIPMENT CORP.
+OUI:080038*
+ ID_OUI_FROM_DATABASE=BULL S.A.S.
 
-OUI:006014*
- ID_OUI_FROM_DATABASE=EDEC CO., LTD.
+OUI:08003C*
+ ID_OUI_FROM_DATABASE=SCHLUMBERGER WELL SERVICES
 
-OUI:0060E1*
- ID_OUI_FROM_DATABASE=ORCKIT COMMUNICATIONS LTD.
+OUI:080034*
+ ID_OUI_FROM_DATABASE=FILENET CORPORATION
 
-OUI:006062*
- ID_OUI_FROM_DATABASE=TELESYNC, INC.
+OUI:08002C*
+ ID_OUI_FROM_DATABASE=BRITTON LEE INC.
 
-OUI:006038*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:0000B9*
+ ID_OUI_FROM_DATABASE=MCDONNELL DOUGLAS COMPUTER SYS
 
-OUI:006095*
- ID_OUI_FROM_DATABASE=ACCU-TIME SYSTEMS, INC.
+OUI:00002D*
+ ID_OUI_FROM_DATABASE=CHROMATICS INC
 
-OUI:00A016*
- ID_OUI_FROM_DATABASE=MICROPOLIS CORP.
+OUI:00004A*
+ ID_OUI_FROM_DATABASE=ADC CODENOLL TECHNOLOGY CORP.
 
-OUI:00A01C*
- ID_OUI_FROM_DATABASE=NASCENT NETWORKS CORPORATION
+OUI:0000C0*
+ ID_OUI_FROM_DATABASE=WESTERN DIGITAL CORPORATION
 
-OUI:00A0FC*
- ID_OUI_FROM_DATABASE=IMAGE SCIENCES, INC.
+OUI:000040*
+ ID_OUI_FROM_DATABASE=APPLICON, INC.
 
-OUI:00A0B7*
- ID_OUI_FROM_DATABASE=CORDANT, INC.
+OUI:00005D*
+ ID_OUI_FROM_DATABASE=CS TELECOM
 
-OUI:00A037*
- ID_OUI_FROM_DATABASE=Mindray DS USA, Inc.
+OUI:08008E*
+ ID_OUI_FROM_DATABASE=Tandem Computers
 
-OUI:00A04C*
- ID_OUI_FROM_DATABASE=INNOVATIVE SYSTEMS & TECHNOLOGIES, INC.
+OUI:080086*
+ ID_OUI_FROM_DATABASE=KONICA MINOLTA HOLDINGS, INC.
 
-OUI:00A0E9*
- ID_OUI_FROM_DATABASE=ELECTRONIC RETAILING SYSTEMS INTERNATIONAL
+OUI:080083*
+ ID_OUI_FROM_DATABASE=Seiko Instruments Inc.
 
-OUI:006078*
- ID_OUI_FROM_DATABASE=POWER MEASUREMENT LTD.
+OUI:080080*
+ ID_OUI_FROM_DATABASE=AES DATA INC.
 
-OUI:00600D*
- ID_OUI_FROM_DATABASE=Digital Logic GmbH
+OUI:080030*
+ ID_OUI_FROM_DATABASE=ROYAL MELBOURNE INST OF TECH
 
-OUI:00608A*
- ID_OUI_FROM_DATABASE=CITADEL COMPUTER
+OUI:080064*
+ ID_OUI_FROM_DATABASE=Sitasys AG
 
-OUI:00A05D*
- ID_OUI_FROM_DATABASE=CS COMPUTER SYSTEME GmbH
+OUI:00DD09*
+ ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
 
-OUI:00A0BD*
- ID_OUI_FROM_DATABASE=I-TECH CORP.
+OUI:08008A*
+ ID_OUI_FROM_DATABASE=PerfTech, Inc.
 
-OUI:00A0B9*
- ID_OUI_FROM_DATABASE=EAGLE TECHNOLOGY, INC.
+OUI:00DD04*
+ ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
 
-OUI:00A069*
- ID_OUI_FROM_DATABASE=Symmetricom, Inc.
+OUI:080066*
+ ID_OUI_FROM_DATABASE=AGFA CORPORATION
 
-OUI:00A07A*
- ID_OUI_FROM_DATABASE=ADVANCED PERIPHERALS TECHNOLOGIES, INC.
+OUI:08001A*
+ ID_OUI_FROM_DATABASE=TIARA/ 10NET
 
-OUI:00A04E*
- ID_OUI_FROM_DATABASE=VOELKER TECHNOLOGIES, INC.
+OUI:080090*
+ ID_OUI_FROM_DATABASE=SONOMA SYSTEMS
 
-OUI:00A05A*
- ID_OUI_FROM_DATABASE=KOFAX IMAGE PRODUCTS
+OUI:08000B*
+ ID_OUI_FROM_DATABASE=UNISYS CORPORATION
 
-OUI:00A093*
- ID_OUI_FROM_DATABASE=B/E AEROSPACE, Inc.
+OUI:080017*
+ ID_OUI_FROM_DATABASE=NATIONAL SEMICONDUCTOR
 
-OUI:00A0BF*
- ID_OUI_FROM_DATABASE=WIRELESS DATA GROUP MOTOROLA
+OUI:00005E*
+ ID_OUI_FROM_DATABASE=ICANN, IANA Department
 
-OUI:00609F*
- ID_OUI_FROM_DATABASE=PHAST CORPORATION
+OUI:0000AF*
+ ID_OUI_FROM_DATABASE=Canberra Industries, Inc.
 
-OUI:006067*
- ID_OUI_FROM_DATABASE=ACER NETXUS INC.
+OUI:0000EC*
+ ID_OUI_FROM_DATABASE=MICROPROCESS
 
-OUI:00600C*
- ID_OUI_FROM_DATABASE=Eurotech Inc.
+OUI:00009E*
+ ID_OUI_FROM_DATABASE=MARLI S.A.
 
-OUI:006025*
- ID_OUI_FROM_DATABASE=ACTIVE IMAGING PLC
+OUI:000042*
+ ID_OUI_FROM_DATABASE=METIER MANAGEMENT SYSTEMS LTD.
 
-OUI:006071*
- ID_OUI_FROM_DATABASE=MIDAS LAB, INC.
+OUI:00008D*
+ ID_OUI_FROM_DATABASE=Cryptek Inc.
 
-OUI:0060A7*
- ID_OUI_FROM_DATABASE=MICROSENS GmbH & CO. KG
+OUI:000065*
+ ID_OUI_FROM_DATABASE=Network General Corporation
 
-OUI:0060FC*
- ID_OUI_FROM_DATABASE=CONSERVATION THROUGH INNOVATION LTD.
+OUI:00004D*
+ ID_OUI_FROM_DATABASE=DCI CORPORATION
 
-OUI:0060D4*
- ID_OUI_FROM_DATABASE=ELDAT COMMUNICATION LTD.
+OUI:080024*
+ ID_OUI_FROM_DATABASE=10NET COMMUNICATIONS/DCA
 
-OUI:006085*
- ID_OUI_FROM_DATABASE=Storage Concepts
+OUI:08001E*
+ ID_OUI_FROM_DATABASE=APOLLO COMPUTER INC.
 
-OUI:0060D3*
- ID_OUI_FROM_DATABASE=AT&T
+OUI:08001B*
+ ID_OUI_FROM_DATABASE=EMC Corporation
 
-OUI:006018*
- ID_OUI_FROM_DATABASE=STELLAR ONE CORPORATION
+OUI:00DD0D*
+ ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
 
-OUI:00602B*
- ID_OUI_FROM_DATABASE=PEAK AUDIO
+OUI:AA0002*
+ ID_OUI_FROM_DATABASE=DIGITAL EQUIPMENT CORPORATION
 
-OUI:00606F*
- ID_OUI_FROM_DATABASE=CLARION CORPORATION OF AMERICA
+OUI:080005*
+ ID_OUI_FROM_DATABASE=SYMBOLICS INC.
 
-OUI:0060ED*
- ID_OUI_FROM_DATABASE=RICARDO TEST AUTOMATION LTD.
+OUI:000000*
+ ID_OUI_FROM_DATABASE=XEROX CORPORATION
 
-OUI:0060F6*
- ID_OUI_FROM_DATABASE=NEXTEST COMMUNICATIONS PRODUCTS, INC.
+OUI:0040D6*
+ ID_OUI_FROM_DATABASE=LOCAMATION B.V.
 
-OUI:0060DD*
- ID_OUI_FROM_DATABASE=MYRICOM, INC.
+OUI:AA0003*
+ ID_OUI_FROM_DATABASE=DIGITAL EQUIPMENT CORPORATION
 
-OUI:006092*
- ID_OUI_FROM_DATABASE=MICRO/SYS, INC.
+OUI:080008*
+ ID_OUI_FROM_DATABASE=BOLT BERANEK AND NEWMAN INC.
 
-OUI:006080*
- ID_OUI_FROM_DATABASE=MICROTRONIX DATACOM LTD.
+OUI:08000E*
+ ID_OUI_FROM_DATABASE=NCR CORPORATION
 
-OUI:006068*
- ID_OUI_FROM_DATABASE=Dialogic Corporation
+OUI:00006F*
+ ID_OUI_FROM_DATABASE=Madge Ltd.
 
-OUI:0060DB*
- ID_OUI_FROM_DATABASE=NTP ELEKTRONIK A/S
+OUI:00005A*
+ ID_OUI_FROM_DATABASE=SysKonnect GmbH
 
-OUI:00A002*
- ID_OUI_FROM_DATABASE=LEEDS & NORTHRUP AUSTRALIA PTY LTD
+OUI:000023*
+ ID_OUI_FROM_DATABASE=ABB INDUSTRIAL SYSTEMS AB
 
-OUI:00A0E4*
- ID_OUI_FROM_DATABASE=OPTIQUEST
+OUI:000045*
+ ID_OUI_FROM_DATABASE=FORD AEROSPACE & COMM. CORP.
 
-OUI:00A01F*
- ID_OUI_FROM_DATABASE=TRICORD SYSTEMS, INC.
+OUI:0000BC*
+ ID_OUI_FROM_DATABASE=Rockwell Automation
 
-OUI:00A0C0*
- ID_OUI_FROM_DATABASE=DIGITAL LINK CORP.
+OUI:0000C3*
+ ID_OUI_FROM_DATABASE=HARRIS CORP COMPUTER SYS DIV
 
-OUI:00A043*
- ID_OUI_FROM_DATABASE=AMERICAN TECHNOLOGY LABS, INC.
+OUI:000004*
+ ID_OUI_FROM_DATABASE=XEROX CORPORATION
 
-OUI:00A047*
- ID_OUI_FROM_DATABASE=INTEGRATED FITNESS CORP.
+OUI:000009*
+ ID_OUI_FROM_DATABASE=XEROX CORPORATION
 
-OUI:00A07C*
- ID_OUI_FROM_DATABASE=TONYANG NYLON CO., LTD.
+OUI:00003D*
+ ID_OUI_FROM_DATABASE=UNISYS
 
-OUI:00A0EC*
- ID_OUI_FROM_DATABASE=TRANSMITTON LTD.
+OUI:F82C18*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:00A07E*
- ID_OUI_FROM_DATABASE=AVID TECHNOLOGY, INC.
+OUI:00173F*
+ ID_OUI_FROM_DATABASE=Belkin International Inc.
 
-OUI:00A035*
- ID_OUI_FROM_DATABASE=CYLINK CORPORATION
+OUI:388602*
+ ID_OUI_FROM_DATABASE=Flexoptix GmbH
 
-OUI:00A028*
- ID_OUI_FROM_DATABASE=CONNER PERIPHERALS
+OUI:F4EB38*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:00A0C7*
- ID_OUI_FROM_DATABASE=TADIRAN TELECOMMUNICATIONS
+OUI:001E74*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:00E0BE*
- ID_OUI_FROM_DATABASE=GENROCO INTERNATIONAL, INC.
+OUI:00604C*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:00E010*
- ID_OUI_FROM_DATABASE=HESS SB-AUTOMATENBAU GmbH
+OUI:002691*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:00E0E9*
- ID_OUI_FROM_DATABASE=DATA LABS, INC.
+OUI:C0D044*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:00E0A0*
- ID_OUI_FROM_DATABASE=WILTRON CO.
+OUI:6C2E85*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:00E024*
- ID_OUI_FROM_DATABASE=GADZOOX NETWORKS
+OUI:CC33BB*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:00E017*
- ID_OUI_FROM_DATABASE=EXXACT GmbH
+OUI:681590*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:00603B*
- ID_OUI_FROM_DATABASE=AMTEC spa
+OUI:5464D9*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:0020E5*
- ID_OUI_FROM_DATABASE=APEX DATA, INC.
+OUI:00023F*
+ ID_OUI_FROM_DATABASE=COMPAL ELECTRONICS, INC.
 
-OUI:00207D*
- ID_OUI_FROM_DATABASE=ADVANCED COMPUTER APPLICATIONS
+OUI:383BC8*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:0020D0*
- ID_OUI_FROM_DATABASE=VERSALYNX CORPORATION
+OUI:DC7FA4*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:00206C*
- ID_OUI_FROM_DATABASE=EVERGREEN TECHNOLOGY CORP.
+OUI:001288*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:002012*
- ID_OUI_FROM_DATABASE=CAMTRONICS MEDICAL SYSTEMS
+OUI:001EC7*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:00200B*
- ID_OUI_FROM_DATABASE=OCTAGON SYSTEMS CORP.
+OUI:28162E*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:00209E*
- ID_OUI_FROM_DATABASE=BROWN'S OPERATING SYSTEM SERVICES, LTD.
+OUI:3CEA4F*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:0020D7*
- ID_OUI_FROM_DATABASE=JAPAN MINICOMPUTER SYSTEMS CO., Ltd.
+OUI:848F69*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:0020FB*
- ID_OUI_FROM_DATABASE=OCTEL COMMUNICATIONS CORP.
+OUI:90B11C*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:0020B1*
- ID_OUI_FROM_DATABASE=COMTECH RESEARCH INC.
+OUI:F8CAB8*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:002033*
- ID_OUI_FROM_DATABASE=SYNAPSE TECHNOLOGIES, INC.
+OUI:24B6FD*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:002099*
- ID_OUI_FROM_DATABASE=BON ELECTRIC CO., LTD.
+OUI:000D56*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:0020AE*
- ID_OUI_FROM_DATABASE=ORNET DATA COMMUNICATION TECH.
+OUI:00123F*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:0020EA*
- ID_OUI_FROM_DATABASE=EFFICIENT NETWORKS, INC.
+OUI:001372*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:0020FF*
- ID_OUI_FROM_DATABASE=SYMMETRICAL TECHNOLOGIES
+OUI:74867A*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00208B*
- ID_OUI_FROM_DATABASE=LAPIS TECHNOLOGIES, INC.
+OUI:3417EB*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:002069*
- ID_OUI_FROM_DATABASE=ISDN SYSTEMS CORPORATION
+OUI:EC8892*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:0020BA*
- ID_OUI_FROM_DATABASE=CENTER FOR HIGH PERFORMANCE
+OUI:B07994*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:002006*
- ID_OUI_FROM_DATABASE=GARRETT COMMUNICATIONS, INC.
+OUI:141AA3*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:00A0A2*
- ID_OUI_FROM_DATABASE=DIGICOM S.P.A.
+OUI:CCC3EA*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:00A054*
- ID_OUI_FROM_DATABASE=Private
+OUI:34BB26*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:00A030*
- ID_OUI_FROM_DATABASE=CAPTOR NV/SA
+OUI:40786A*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:00A0B1*
- ID_OUI_FROM_DATABASE=FIRST VIRTUAL CORPORATION
+OUI:0019B9*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:0020CB*
- ID_OUI_FROM_DATABASE=PRETEC ELECTRONICS CORP.
+OUI:002219*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:0020AB*
- ID_OUI_FROM_DATABASE=MICRO INDUSTRIES CORP.
+OUI:00B0D0*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00202D*
- ID_OUI_FROM_DATABASE=TAIYO CORPORATION
+OUI:5C260A*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00A088*
- ID_OUI_FROM_DATABASE=ESSENTIAL COMMUNICATIONS
+OUI:B083FE*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00A0FA*
- ID_OUI_FROM_DATABASE=Marconi Communication GmbH
+OUI:141877*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00A014*
- ID_OUI_FROM_DATABASE=CSIR
+OUI:0024E8*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00A064*
- ID_OUI_FROM_DATABASE=KVB/ANALECT
+OUI:A48E0A*
+ ID_OUI_FROM_DATABASE=DeLaval International AB
 
-OUI:00A07F*
- ID_OUI_FROM_DATABASE=GSM-SYNTEL, LTD.
+OUI:00215C*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00A03E*
- ID_OUI_FROM_DATABASE=ATM FORUM
+OUI:002315*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00A050*
- ID_OUI_FROM_DATABASE=CYPRESS SEMICONDUCTOR
+OUI:001500*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00A098*
- ID_OUI_FROM_DATABASE=NetApp
+OUI:104A7D*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00A021*
- ID_OUI_FROM_DATABASE=General Dynamics
+OUI:A4C494*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00A0A8*
- ID_OUI_FROM_DATABASE=RENEX CORPORATION
+OUI:902E1C*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:002049*
- ID_OUI_FROM_DATABASE=COMTRON, INC.
+OUI:3CFDFE*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:002050*
- ID_OUI_FROM_DATABASE=KOREA COMPUTER INC.
+OUI:B8BF83*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00203C*
- ID_OUI_FROM_DATABASE=EUROTIME AB
+OUI:001DE1*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:002028*
- ID_OUI_FROM_DATABASE=WEST EGG SYSTEMS, INC.
+OUI:0022FB*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:002014*
- ID_OUI_FROM_DATABASE=GLOBAL VIEW CO., LTD.
+OUI:081196*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:002053*
- ID_OUI_FROM_DATABASE=HUNTSVILLE MICROSYSTEMS, INC.
+OUI:6036DD*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:002001*
- ID_OUI_FROM_DATABASE=DSP SOLUTIONS, INC.
+OUI:A0369F*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00209C*
- ID_OUI_FROM_DATABASE=PRIMARY ACCESS CORP.
+OUI:502DA2*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:0020C5*
- ID_OUI_FROM_DATABASE=EAGLE TECHNOLOGY
+OUI:4C79BA*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:002009*
- ID_OUI_FROM_DATABASE=PACKARD BELL ELEC., INC.
+OUI:4CEB42*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:002095*
- ID_OUI_FROM_DATABASE=RIVA ELECTRONICS
+OUI:606720*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00203F*
- ID_OUI_FROM_DATABASE=JUKI CORPORATION
+OUI:84A6C8*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00C014*
- ID_OUI_FROM_DATABASE=TELEMATICS CALABASAS INT'L,INC
+OUI:5891CF*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00C045*
- ID_OUI_FROM_DATABASE=ISOLATION SYSTEMS, LTD.
+OUI:88532E*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00C000*
- ID_OUI_FROM_DATABASE=LANOPTICS, LTD.
+OUI:0024D7*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00AA3C*
- ID_OUI_FROM_DATABASE=OLIVETTI TELECOM SPA (OLTECO)
+OUI:C40938*
+ ID_OUI_FROM_DATABASE=FUJIAN STAR-NET COMMUNICATION CO.,LTD
 
-OUI:00C079*
- ID_OUI_FROM_DATABASE=FONSYS CO.,LTD.
+OUI:00AA02*
+ ID_OUI_FROM_DATABASE=Intel Corporation
 
-OUI:002011*
- ID_OUI_FROM_DATABASE=CANOPUS CO., LTD.
+OUI:5CD2E4*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:00C00B*
- ID_OUI_FROM_DATABASE=NORCONTROL A.S.
+OUI:04BD88*
+ ID_OUI_FROM_DATABASE=Aruba Networks
 
-OUI:00C0C0*
- ID_OUI_FROM_DATABASE=SHORE MICROSYSTEMS, INC.
+OUI:000B86*
+ ID_OUI_FROM_DATABASE=Aruba Networks
 
-OUI:00C00C*
- ID_OUI_FROM_DATABASE=RELIA TECHNOLGIES
+OUI:8896F2*
+ ID_OUI_FROM_DATABASE=Valeo Schalter und Sensoren GmbH
 
-OUI:00A0E7*
- ID_OUI_FROM_DATABASE=CENTRAL DATA CORPORATION
+OUI:80A589*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:00A068*
- ID_OUI_FROM_DATABASE=BHP LIMITED
+OUI:0CCC26*
+ ID_OUI_FROM_DATABASE=Airenetworks
 
-OUI:00A0B3*
- ID_OUI_FROM_DATABASE=ZYKRONIX
+OUI:4CB0E8*
+ ID_OUI_FROM_DATABASE=Beijing RongZhi xinghua technology co., LTD
 
-OUI:00A06E*
- ID_OUI_FROM_DATABASE=AUSTRON, INC.
+OUI:4C14A3*
+ ID_OUI_FROM_DATABASE=TCL Technoly Electronics (Huizhou) Co., Ltd.
 
-OUI:00A0BB*
- ID_OUI_FROM_DATABASE=HILAN GMBH
+OUI:F48E38*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:00A0C8*
- ID_OUI_FROM_DATABASE=ADTRAN INC.
+OUI:D887D5*
+ ID_OUI_FROM_DATABASE=Leadcore Technology CO.,LTD
 
-OUI:00A017*
- ID_OUI_FROM_DATABASE=J B M CORPORATION
+OUI:00DA55*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0020D5*
- ID_OUI_FROM_DATABASE=VIPA GMBH
+OUI:80D21D*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:002079*
- ID_OUI_FROM_DATABASE=MIKRON GMBH
+OUI:705A0F*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:0020FA*
- ID_OUI_FROM_DATABASE=GDE SYSTEMS, INC.
+OUI:586356*
+ ID_OUI_FROM_DATABASE=FN-LINK TECHNOLOGY LIMITED
 
-OUI:002007*
- ID_OUI_FROM_DATABASE=SFA, INC.
+OUI:B046FC*
+ ID_OUI_FROM_DATABASE=MitraStar Technology Corp.
+
+OUI:08A95A*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:002062*
- ID_OUI_FROM_DATABASE=SCORPION LOGIC, LTD.
+OUI:6CADF8*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:00200A*
- ID_OUI_FROM_DATABASE=SOURCE-COMM CORP.
+OUI:54271E*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:002000*
- ID_OUI_FROM_DATABASE=LEXMARK INTERNATIONAL, INC.
+OUI:008C54*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:002003*
- ID_OUI_FROM_DATABASE=PIXEL POWER LTD.
+OUI:F0842F*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:0020B4*
- ID_OUI_FROM_DATABASE=TERMA ELEKTRONIK AS
+OUI:8CB864*
+ ID_OUI_FROM_DATABASE=AcSiP Technology Corp.
 
-OUI:00205B*
- ID_OUI_FROM_DATABASE=Kentrox, LLC
+OUI:0020E0*
+ ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
 
-OUI:002030*
- ID_OUI_FROM_DATABASE=ANALOG & DIGITAL SYSTEMS
+OUI:0004E3*
+ ID_OUI_FROM_DATABASE=Accton Technology Corp
 
-OUI:0020A8*
- ID_OUI_FROM_DATABASE=SAST TECHNOLOGY CORP.
+OUI:409558*
+ ID_OUI_FROM_DATABASE=Aisino Corporation
 
-OUI:002066*
- ID_OUI_FROM_DATABASE=GENERAL MAGIC, INC.
+OUI:00D0C9*
+ ID_OUI_FROM_DATABASE=ADVANTECH CO., LTD.
 
-OUI:002036*
- ID_OUI_FROM_DATABASE=BMC SOFTWARE
+OUI:002553*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:0040BE*
- ID_OUI_FROM_DATABASE=BOEING DEFENSE & SPACE
+OUI:00238E*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:004036*
- ID_OUI_FROM_DATABASE=Zoom Telephonics, Inc
+OUI:001CA2*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:004046*
- ID_OUI_FROM_DATABASE=UDC RESEARCH LIMITED
+OUI:0017C2*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:00406A*
- ID_OUI_FROM_DATABASE=KENTEK INFORMATION SYSTEMS,INC
+OUI:D0D412*
+ ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:0040F2*
- ID_OUI_FROM_DATABASE=JANICH & KLASS COMPUTERTECHNIK
+OUI:000FA3*
+ ID_OUI_FROM_DATABASE=Alpha Networks Inc.
 
-OUI:004082*
- ID_OUI_FROM_DATABASE=LABORATORY EQUIPMENT CORP.
+OUI:001D6A*
+ ID_OUI_FROM_DATABASE=Alpha Networks Inc.
 
-OUI:004022*
- ID_OUI_FROM_DATABASE=KLEVER COMPUTERS, INC.
+OUI:0000F4*
+ ID_OUI_FROM_DATABASE=Allied Telesis, Inc.
 
-OUI:0040A2*
- ID_OUI_FROM_DATABASE=KINGSTAR TECHNOLOGY INC.
+OUI:70F1A1*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:0040B4*
- ID_OUI_FROM_DATABASE=NEXTCOM K.K.
+OUI:6CFAA7*
+ ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
 
-OUI:0040D4*
- ID_OUI_FROM_DATABASE=GAGE TALKER CORP.
+OUI:0024EF*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:004038*
- ID_OUI_FROM_DATABASE=TALENT ELECTRIC INCORPORATED
+OUI:6C0E0D*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:004018*
- ID_OUI_FROM_DATABASE=ADOBE SYSTEMS, INC.
+OUI:B4527D*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:0040B0*
- ID_OUI_FROM_DATABASE=BYTEX CORPORATION, ENGINEERING
+OUI:E063E5*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:004040*
- ID_OUI_FROM_DATABASE=RING ACCESS, INC.
+OUI:000E07*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:0080D7*
- ID_OUI_FROM_DATABASE=Fantum Engineering
+OUI:001A75*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:0080D9*
- ID_OUI_FROM_DATABASE=EMK Elektronik GmbH & Co. KG
+OUI:0016B8*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:00806A*
- ID_OUI_FROM_DATABASE=ERI (EMPAC RESEARCH INC.)
+OUI:001D28*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:00403B*
- ID_OUI_FROM_DATABASE=SYNERJET INTERNATIONAL CORP.
+OUI:001FE4*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:0040AB*
- ID_OUI_FROM_DATABASE=ROLAND DG CORPORATION
+OUI:002298*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
 
-OUI:0040D5*
- ID_OUI_FROM_DATABASE=Sartorius Mechatronics T&H GmbH
+OUI:24FD52*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:004027*
- ID_OUI_FROM_DATABASE=SMC MASSACHUSETTS, INC.
+OUI:2016D8*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:00409C*
- ID_OUI_FROM_DATABASE=TRANSWARE
+OUI:9CB70D*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:00405C*
- ID_OUI_FROM_DATABASE=FUTURE SYSTEMS, INC.
+OUI:1C659D*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:00008C*
- ID_OUI_FROM_DATABASE=Alloy Computer Products (Australia) Pty Ltd
+OUI:001B9E*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
-OUI:004000*
- ID_OUI_FROM_DATABASE=PCI COMPONENTES DA AMZONIA LTD
+OUI:E0CA94*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
-OUI:0040C5*
- ID_OUI_FROM_DATABASE=MICOM COMMUNICATIONS INC.
+OUI:C0D962*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
-OUI:0040AA*
- ID_OUI_FROM_DATABASE=Metso Automation
+OUI:00150C*
+ ID_OUI_FROM_DATABASE=AVM GmbH
 
-OUI:004023*
- ID_OUI_FROM_DATABASE=LOGIC CORPORATION
+OUI:F40B93*
+ ID_OUI_FROM_DATABASE=BlackBerry RTS
 
-OUI:0040A4*
- ID_OUI_FROM_DATABASE=ROSE ELECTRONICS
+OUI:68ED43*
+ ID_OUI_FROM_DATABASE=BlackBerry RTS
 
-OUI:004048*
- ID_OUI_FROM_DATABASE=SMD INFORMATICA S.A.
+OUI:34BB1F*
+ ID_OUI_FROM_DATABASE=BlackBerry RTS
 
-OUI:004025*
- ID_OUI_FROM_DATABASE=MOLECULAR DYNAMICS
+OUI:489D24*
+ ID_OUI_FROM_DATABASE=BlackBerry RTS
 
-OUI:004010*
- ID_OUI_FROM_DATABASE=SONIC SYSTEMS, INC.
+OUI:000F86*
+ ID_OUI_FROM_DATABASE=BlackBerry RTS
 
-OUI:0040CA*
- ID_OUI_FROM_DATABASE=FIRST INTERNAT'L COMPUTER, INC
+OUI:001333*
+ ID_OUI_FROM_DATABASE=BaudTec Corporation
 
-OUI:004050*
- ID_OUI_FROM_DATABASE=IRONICS, INCORPORATED
+OUI:507E5D*
+ ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
 
-OUI:00402B*
- ID_OUI_FROM_DATABASE=TRIGEM COMPUTER, INC.
+OUI:849CA6*
+ ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
 
-OUI:00C08C*
- ID_OUI_FROM_DATABASE=PERFORMANCE TECHNOLOGIES, INC.
+OUI:1CC63C*
+ ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
 
-OUI:00C02B*
- ID_OUI_FROM_DATABASE=GERLOFF GESELLSCHAFT FUR
+OUI:C02506*
+ ID_OUI_FROM_DATABASE=AVM GmbH
 
-OUI:00C0A7*
- ID_OUI_FROM_DATABASE=SEEL LTD.
+OUI:0896D7*
+ ID_OUI_FROM_DATABASE=AVM GmbH
 
-OUI:0040B3*
- ID_OUI_FROM_DATABASE=ParTech Inc.
+OUI:4C09D4*
+ ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
 
-OUI:00407D*
- ID_OUI_FROM_DATABASE=EXTENSION TECHNOLOGY CORP.
+OUI:DC446D*
+ ID_OUI_FROM_DATABASE=Allwinner Technology Co., Ltd
 
-OUI:004079*
- ID_OUI_FROM_DATABASE=JUKO MANUFACTURE COMPANY, LTD.
+OUI:BC620E*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0040D9*
- ID_OUI_FROM_DATABASE=AMERICAN MEGATRENDS INC.
+OUI:78F557*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:004011*
- ID_OUI_FROM_DATABASE=ANDOVER CONTROLS CORPORATION
+OUI:E02861*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0040C1*
- ID_OUI_FROM_DATABASE=BIZERBA-WERKE WILHEIM KRAUT
+OUI:C4473F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00C06B*
- ID_OUI_FROM_DATABASE=OSI PLUS CORPORATION
+OUI:000AF7*
+ ID_OUI_FROM_DATABASE=Broadcom
 
-OUI:00C06A*
- ID_OUI_FROM_DATABASE=ZAHNER-ELEKTRIK GMBH & CO. KG
+OUI:000DB6*
+ ID_OUI_FROM_DATABASE=Broadcom
 
-OUI:00C097*
- ID_OUI_FROM_DATABASE=ARCHIPEL SA
+OUI:18C086*
+ ID_OUI_FROM_DATABASE=Broadcom
 
-OUI:00C072*
- ID_OUI_FROM_DATABASE=KNX LTD.
+OUI:C03E0F*
+ ID_OUI_FROM_DATABASE=BSkyB Ltd
 
-OUI:00C0EC*
- ID_OUI_FROM_DATABASE=DAUPHIN TECHNOLOGY
+OUI:0020D4*
+ ID_OUI_FROM_DATABASE=Cabletron Systems, Inc.
 
-OUI:00C066*
- ID_OUI_FROM_DATABASE=DOCUPOINT, INC.
+OUI:00001D*
+ ID_OUI_FROM_DATABASE=Cabletron Systems, Inc.
 
-OUI:00C028*
- ID_OUI_FROM_DATABASE=JASCO CORPORATION
+OUI:0060BB*
+ ID_OUI_FROM_DATABASE=Cabletron Systems, Inc.
 
-OUI:00C0DC*
- ID_OUI_FROM_DATABASE=EOS TECHNOLOGIES, INC.
+OUI:D0542D*
+ ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
 
-OUI:00C02D*
- ID_OUI_FROM_DATABASE=FUJI PHOTO FILM CO., LTD.
+OUI:001FC7*
+ ID_OUI_FROM_DATABASE=Casio Hitachi Mobile Communications Co., Ltd.
 
-OUI:00C0BD*
- ID_OUI_FROM_DATABASE=INEX TECHNOLOGIES, INC.
+OUI:ACEE9E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C054*
- ID_OUI_FROM_DATABASE=NETWORK PERIPHERALS, LTD.
+OUI:C08997*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C0D5*
- ID_OUI_FROM_DATABASE=Werbeagentur Jürgen Siebert
+OUI:2827BF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C044*
- ID_OUI_FROM_DATABASE=EMCOM CORPORATION
+OUI:F05B7B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C050*
- ID_OUI_FROM_DATABASE=TOYO DENKI SEIZO K.K.
+OUI:7CF90E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00408A*
- ID_OUI_FROM_DATABASE=TPS TELEPROCESSING SYS. GMBH
+OUI:AC5A14*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0040FD*
- ID_OUI_FROM_DATABASE=LXE
+OUI:B0C559*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00403D*
- ID_OUI_FROM_DATABASE=Teradata Corporation
+OUI:BCD11F*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0040E0*
- ID_OUI_FROM_DATABASE=ATOMWIDE LTD.
+OUI:A0B4A5*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00408C*
- ID_OUI_FROM_DATABASE=AXIS COMMUNICATIONS AB
+OUI:80656D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:004068*
- ID_OUI_FROM_DATABASE=EXTENDED SYSTEMS
+OUI:48137E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0040BA*
- ID_OUI_FROM_DATABASE=ALLIANT COMPUTER SYSTEMS CORP.
+OUI:E83A12*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:004069*
- ID_OUI_FROM_DATABASE=LEMCOM SYSTEMS, INC.
+OUI:9C0298*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0040F8*
- ID_OUI_FROM_DATABASE=SYSTEMHAUS DISCOM
+OUI:6C8336*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:004077*
- ID_OUI_FROM_DATABASE=MAXTON TECHNOLOGY CORPORATION
+OUI:B8C68E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0040E7*
- ID_OUI_FROM_DATABASE=ARNOS INSTRUMENTS & COMPUTER
+OUI:74458A*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0040AC*
- ID_OUI_FROM_DATABASE=SUPER WORKSTATION, INC.
+OUI:A49A58*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C0AC*
- ID_OUI_FROM_DATABASE=GAMBIT COMPUTER COMMUNICATIONS
+OUI:B4EF39*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C02C*
- ID_OUI_FROM_DATABASE=CENTRUM COMMUNICATIONS, INC.
+OUI:14A364*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C0ED*
- ID_OUI_FROM_DATABASE=US ARMY ELECTRONIC
+OUI:3CA10D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C0D1*
- ID_OUI_FROM_DATABASE=COMTREE TECHNOLOGY CORPORATION
+OUI:206E9C*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C0D2*
- ID_OUI_FROM_DATABASE=SYNTELLECT, INC.
+OUI:183F47*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C0FB*
- ID_OUI_FROM_DATABASE=ADVANCED TECHNOLOGY LABS
+OUI:0C715D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C092*
- ID_OUI_FROM_DATABASE=MENNEN MEDICAL INC.
+OUI:0C1420*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C06C*
- ID_OUI_FROM_DATABASE=SVEC COMPUTER CORP.
+OUI:A80600*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C02E*
- ID_OUI_FROM_DATABASE=NETWIZ
+OUI:6CF373*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00C05B*
- ID_OUI_FROM_DATABASE=NETWORKS NORTHWEST, INC.
+OUI:3872C0*
+ ID_OUI_FROM_DATABASE=Comtrend Corporation
 
-OUI:00C0BF*
- ID_OUI_FROM_DATABASE=TECHNOLOGY CONCEPTS, LTD.
+OUI:F4068D*
+ ID_OUI_FROM_DATABASE=devolo AG
 
-OUI:00C0C9*
- ID_OUI_FROM_DATABASE=ELSAG BAILEY PROCESS
+OUI:000BCA*
+ ID_OUI_FROM_DATABASE=DATAVAN TC
 
-OUI:00809D*
- ID_OUI_FROM_DATABASE=Commscraft Ltd.
+OUI:00507F*
+ ID_OUI_FROM_DATABASE=DrayTek Corp.
 
-OUI:008017*
- ID_OUI_FROM_DATABASE=PFU LIMITED
+OUI:3C8970*
+ ID_OUI_FROM_DATABASE=Neosfar
 
-OUI:0080F8*
- ID_OUI_FROM_DATABASE=MIZAR, INC.
+OUI:C43655*
+ ID_OUI_FROM_DATABASE=Shenzhen Fenglian Technology Co., Ltd.
 
-OUI:008024*
- ID_OUI_FROM_DATABASE=KALPANA, INC.
+OUI:78CB68*
+ ID_OUI_FROM_DATABASE=DAEHAP HYPER-TECH
 
-OUI:008074*
- ID_OUI_FROM_DATABASE=FISHER CONTROLS
+OUI:001A7F*
+ ID_OUI_FROM_DATABASE=GCI Science & Technology Co.,LTD
 
-OUI:008021*
- ID_OUI_FROM_DATABASE=Alcatel Canada Inc.
+OUI:D04D2C*
+ ID_OUI_FROM_DATABASE=Roku, Inc.
 
-OUI:000055*
- ID_OUI_FROM_DATABASE=COMMISSARIAT A L`ENERGIE ATOM.
+OUI:E00C7F*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:000086*
- ID_OUI_FROM_DATABASE=MEGAHERTZ CORPORATION
+OUI:58BDA3*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:000092*
- ID_OUI_FROM_DATABASE=COGENT DATA TECHNOLOGIES
+OUI:0025A0*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:008068*
- ID_OUI_FROM_DATABASE=YAMATECH SCIENTIFIC LTD.
+OUI:002659*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:0080F2*
- ID_OUI_FROM_DATABASE=RAYCOM SYSTEMS INC
+OUI:8C56C5*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:0080EA*
- ID_OUI_FROM_DATABASE=ADVA Optical Networking Ltd.
+OUI:CC9E00*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:008025*
- ID_OUI_FROM_DATABASE=STOLLMANN GMBH
+OUI:001656*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:000067*
- ID_OUI_FROM_DATABASE=SOFT * RITE, INC.
+OUI:00191D*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:0000E8*
- ID_OUI_FROM_DATABASE=ACCTON TECHNOLOGY CORP.
+OUI:0019FD*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:0000B2*
- ID_OUI_FROM_DATABASE=TELEVIDEO SYSTEMS, INC.
+OUI:001EA9*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
 
-OUI:0000EE*
- ID_OUI_FROM_DATABASE=NETWORK DESIGNERS, LTD.
+OUI:A84481*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:000089*
- ID_OUI_FROM_DATABASE=CAYMAN SYSTEMS INC.
+OUI:8844F6*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:000021*
- ID_OUI_FROM_DATABASE=SUREMAN COMP. & COMMUN. CORP.
+OUI:A87B39*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:0000CF*
- ID_OUI_FROM_DATABASE=HAYES MICROCOMPUTER PRODUCTS
+OUI:14C126*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:0000A4*
- ID_OUI_FROM_DATABASE=ACORN COMPUTERS LIMITED
+OUI:4C2578*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:000018*
- ID_OUI_FROM_DATABASE=WEBSTER COMPUTER CORPORATION
+OUI:001EA4*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:008033*
- ID_OUI_FROM_DATABASE=EMS Aviation, Inc.
+OUI:001262*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:008052*
- ID_OUI_FROM_DATABASE=TECHNICALLY ELITE CONCEPTS
+OUI:00174B*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00804F*
- ID_OUI_FROM_DATABASE=DAIKIN INDUSTRIES, LTD.
+OUI:002547*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00806D*
- ID_OUI_FROM_DATABASE=CENTURY SYSTEMS CORP.
+OUI:001DE9*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:00802D*
- ID_OUI_FROM_DATABASE=XYLOGICS INC
+OUI:001D3B*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:008048*
- ID_OUI_FROM_DATABASE=COMPEX INCORPORATED
+OUI:0014A7*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:008085*
- ID_OUI_FROM_DATABASE=H-THREE SYSTEMS CORPORATION
+OUI:001CD6*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
 
-OUI:008014*
- ID_OUI_FROM_DATABASE=ESPRIT SYSTEMS
+OUI:D099D5*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent
 
-OUI:0080B4*
- ID_OUI_FROM_DATABASE=SOPHIA SYSTEMS
+OUI:DC0077*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:00807F*
- ID_OUI_FROM_DATABASE=DY-4 INCORPORATED
+OUI:0060DC*
+ ID_OUI_FROM_DATABASE=NEC Magnus Communications,Ltd.
 
-OUI:0000E4*
- ID_OUI_FROM_DATABASE=IN2 GROUPE INTERTECHNIQUE
+OUI:F45C89*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:000079*
- ID_OUI_FROM_DATABASE=NETWORTH INCORPORATED
+OUI:0021FD*
+ ID_OUI_FROM_DATABASE=LACROIX TRAFFIC S.A.U
 
-OUI:000075*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:4CB44A*
+ ID_OUI_FROM_DATABASE=NANOWAVE Technologies Inc.
 
-OUI:004009*
- ID_OUI_FROM_DATABASE=TACHIBANA TECTRON CO., LTD.
+OUI:78C3E9*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00409E*
- ID_OUI_FROM_DATABASE=CONCURRENT TECHNOLOGIES  LTD.
+OUI:9C5C8E*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:008092*
- ID_OUI_FROM_DATABASE=Silex Technology, Inc.
+OUI:70884D*
+ ID_OUI_FROM_DATABASE=JAPAN RADIO CO., LTD.
 
-OUI:008011*
- ID_OUI_FROM_DATABASE=DIGITAL SYSTEMS INT'L. INC.
+OUI:4C55CC*
+ ID_OUI_FROM_DATABASE=Zentri Pty Ltd
 
-OUI:008044*
- ID_OUI_FROM_DATABASE=SYSTECH COMPUTER CORP.
+OUI:BCEC5D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00808A*
- ID_OUI_FROM_DATABASE=SUMMIT MICROSYSTEMS CORP.
+OUI:DC415F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0080E3*
- ID_OUI_FROM_DATABASE=CORAL NETWORK CORPORATION
+OUI:30636B*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:008072*
- ID_OUI_FROM_DATABASE=MICROPLEX SYSTEMS LTD.
+OUI:84683E*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:008054*
- ID_OUI_FROM_DATABASE=FRONTIER TECHNOLOGIES CORP.
+OUI:C88722*
+ ID_OUI_FROM_DATABASE=Lumenpulse
 
-OUI:0080AE*
- ID_OUI_FROM_DATABASE=HUGHES NETWORK SYSTEMS
+OUI:30A9DE*
+ ID_OUI_FROM_DATABASE=LG Innotek
 
-OUI:0080AF*
- ID_OUI_FROM_DATABASE=ALLUMER CO., LTD.
+OUI:E0CDFD*
+ ID_OUI_FROM_DATABASE=Beijing E3Control Technology Co, LTD
 
-OUI:0080EC*
- ID_OUI_FROM_DATABASE=SUPERCOMPUTING SOLUTIONS, INC.
+OUI:208B37*
+ ID_OUI_FROM_DATABASE=Skyworth Digital Technology(Shenzhen) Co.,Ltd
 
-OUI:0080A4*
- ID_OUI_FROM_DATABASE=LIBERTY ELECTRONICS
+OUI:08BE77*
+ ID_OUI_FROM_DATABASE=Green Electronics
 
-OUI:008073*
- ID_OUI_FROM_DATABASE=DWB ASSOCIATES
+OUI:280C28*
+ ID_OUI_FROM_DATABASE=Unigen DataStorage Corporation
 
-OUI:00802B*
- ID_OUI_FROM_DATABASE=INTEGRATED MARKETING CO
+OUI:980CA5*
+ ID_OUI_FROM_DATABASE=Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.
 
-OUI:0080BE*
- ID_OUI_FROM_DATABASE=ARIES RESEARCH
+OUI:1CC035*
+ ID_OUI_FROM_DATABASE=PLANEX COMMUNICATIONS INC.
 
-OUI:008027*
- ID_OUI_FROM_DATABASE=ADAPTIVE SYSTEMS, INC.
+OUI:34543C*
+ ID_OUI_FROM_DATABASE=TAKAOKA TOKO CO.,LTD.
 
-OUI:0080E2*
- ID_OUI_FROM_DATABASE=T.D.I. CO., LTD.
+OUI:D49524*
+ ID_OUI_FROM_DATABASE=Clover Network, Inc.
 
-OUI:0040EE*
- ID_OUI_FROM_DATABASE=OPTIMEM
+OUI:0034DA*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:00405E*
- ID_OUI_FROM_DATABASE=NORTH HILLS ISRAEL
+OUI:9046A2*
+ ID_OUI_FROM_DATABASE=Tedipay UK Ltd
 
-OUI:004072*
- ID_OUI_FROM_DATABASE=Applied Innovation Inc.
+OUI:6479A7*
+ ID_OUI_FROM_DATABASE=Phison Electronics Corp.
 
-OUI:004031*
- ID_OUI_FROM_DATABASE=KOKUSAI ELECTRIC CO., LTD
+OUI:C83870*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00400C*
- ID_OUI_FROM_DATABASE=GENERAL MICRO SYSTEMS, INC.
+OUI:288335*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0040E6*
- ID_OUI_FROM_DATABASE=C.A.E.N.
+OUI:44783E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0040FC*
- ID_OUI_FROM_DATABASE=IBR COMPUTER TECHNIK GMBH
+OUI:202D07*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:004001*
- ID_OUI_FROM_DATABASE=Zero One Technology Co. Ltd.
+OUI:0452C7*
+ ID_OUI_FROM_DATABASE=Bose Corporation
 
-OUI:004002*
- ID_OUI_FROM_DATABASE=PERLE SYSTEMS LIMITED
+OUI:D4612E*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0080DB*
- ID_OUI_FROM_DATABASE=GRAPHON CORPORATION
+OUI:1C6758*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0080B1*
- ID_OUI_FROM_DATABASE=SOFTCOM A/S
+OUI:E85659*
+ ID_OUI_FROM_DATABASE=Advanced-Connectek Inc.
 
-OUI:0080D8*
- ID_OUI_FROM_DATABASE=NETWORK PERIPHERALS INC.
+OUI:8801F2*
+ ID_OUI_FROM_DATABASE=Vitec System Engineering Inc.
 
-OUI:0080AB*
- ID_OUI_FROM_DATABASE=DUKANE NETWORK INTEGRATION
+OUI:FC084A*
+ ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
-OUI:00809B*
- ID_OUI_FROM_DATABASE=JUSTSYSTEM CORPORATION
+OUI:847BEB*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:008089*
- ID_OUI_FROM_DATABASE=TECNETICS (PTY) LTD.
+OUI:689361*
+ ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
-OUI:000039*
- ID_OUI_FROM_DATABASE=TOSHIBA CORPORATION
+OUI:A082AC*
+ ID_OUI_FROM_DATABASE=Linear DMS Solutions Sdn. Bhd.
 
-OUI:0000CB*
- ID_OUI_FROM_DATABASE=COMPU-SHACK ELECTRONIC GMBH
+OUI:002697*
+ ID_OUI_FROM_DATABASE=Alpha  Technologies Inc.
 
-OUI:0000D1*
- ID_OUI_FROM_DATABASE=ADAPTEC INCORPORATED
+OUI:4CB8B5*
+ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
 
-OUI:0000B6*
- ID_OUI_FROM_DATABASE=MICRO-MATIC RESEARCH
+OUI:1CABC0*
+ ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
 
-OUI:000066*
- ID_OUI_FROM_DATABASE=TALARIS SYSTEMS, INC.
+OUI:84E323*
+ ID_OUI_FROM_DATABASE=Green Wave Telecommunication SDN BHD
 
-OUI:000014*
- ID_OUI_FROM_DATABASE=NETRONIX
+OUI:D897BA*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
-OUI:000072*
- ID_OUI_FROM_DATABASE=MINIWARE TECHNOLOGY
+OUI:7071BC*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
-OUI:0000AB*
- ID_OUI_FROM_DATABASE=LOGIC MODELING CORPORATION
+OUI:E06995*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
-OUI:000029*
- ID_OUI_FROM_DATABASE=IMC NETWORKS CORP.
+OUI:54D9E4*
+ ID_OUI_FROM_DATABASE=BRILLIANTTS CO., LTD
 
-OUI:0080CD*
- ID_OUI_FROM_DATABASE=MICRONICS COMPUTER, INC.
+OUI:E4F3F5*
+ ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
 
-OUI:008083*
- ID_OUI_FROM_DATABASE=AMDAHL
+OUI:00089F*
+ ID_OUI_FROM_DATABASE=EFM Networks
 
-OUI:008003*
- ID_OUI_FROM_DATABASE=HYTEC ELECTRONICS LTD.
+OUI:00185C*
+ ID_OUI_FROM_DATABASE=EDSLAB Technologies
 
-OUI:00801B*
- ID_OUI_FROM_DATABASE=KODIAK TECHNOLOGY
+OUI:000E2E*
+ ID_OUI_FROM_DATABASE=Edimax Technology Co. Ltd.
 
-OUI:0080CC*
- ID_OUI_FROM_DATABASE=MICROWAVE BYPASS SYSTEMS
+OUI:00020E*
+ ID_OUI_FROM_DATABASE=ECI Telecom Ltd.
 
-OUI:080079*
- ID_OUI_FROM_DATABASE=THE DROID WORKS
+OUI:00115B*
+ ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
-OUI:080077*
- ID_OUI_FROM_DATABASE=TSL COMMUNICATIONS LTD.
+OUI:000795*
+ ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
-OUI:080071*
- ID_OUI_FROM_DATABASE=MATRA (DSIE)
+OUI:B8AEED*
+ ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
-OUI:08006A*
- ID_OUI_FROM_DATABASE=ATT BELL LABORATORIES
+OUI:C03FD5*
+ ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
-OUI:08005F*
- ID_OUI_FROM_DATABASE=SABER TECHNOLOGY CORP.
+OUI:7427EA*
+ ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
-OUI:08005C*
- ID_OUI_FROM_DATABASE=FOUR PHASE SYSTEMS
+OUI:0000C9*
+ ID_OUI_FROM_DATABASE=Emulex Corporation
 
-OUI:08005B*
- ID_OUI_FROM_DATABASE=VTA TECHNOLOGIES INC.
+OUI:001A45*
+ ID_OUI_FROM_DATABASE=GN Netcom A/S
 
-OUI:080058*
- ID_OUI_FROM_DATABASE=SYSTEMS CONCEPTS
+OUI:00168F*
+ ID_OUI_FROM_DATABASE=GN Netcom A/S
 
-OUI:080050*
- ID_OUI_FROM_DATABASE=DAISY SYSTEMS CORP.
+OUI:083FBC*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:080052*
- ID_OUI_FROM_DATABASE=INSYSTEC
+OUI:042AE2*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:080047*
- ID_OUI_FROM_DATABASE=SEQUENT COMPUTER SYSTEMS INC.
+OUI:1C1B0D*
+ ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
 
-OUI:080045*
- ID_OUI_FROM_DATABASE=CONCURRENT COMPUTER CORP.
+OUI:00104F*
+ ID_OUI_FROM_DATABASE=Oracle Corporation
 
-OUI:080044*
- ID_OUI_FROM_DATABASE=DAVID SYSTEMS INC.
+OUI:000782*
+ ID_OUI_FROM_DATABASE=Oracle Corporation
 
-OUI:080041*
- ID_OUI_FROM_DATABASE=RACAL-MILGO INFORMATION SYS..
+OUI:E42F56*
+ ID_OUI_FROM_DATABASE=OptoMET GmbH
 
-OUI:080038*
- ID_OUI_FROM_DATABASE=BULL S.A.S.
+OUI:00A045*
+ ID_OUI_FROM_DATABASE=PHOENIX CONTACT Electronics GmbH
 
-OUI:08003C*
- ID_OUI_FROM_DATABASE=SCHLUMBERGER WELL SERVICES
+OUI:00266C*
+ ID_OUI_FROM_DATABASE=INVENTEC Corporation
 
-OUI:080034*
- ID_OUI_FROM_DATABASE=FILENET CORPORATION
+OUI:001E25*
+ ID_OUI_FROM_DATABASE=INTEK DIGITAL
 
-OUI:08002C*
- ID_OUI_FROM_DATABASE=BRITTON LEE INC.
+OUI:A0B662*
+ ID_OUI_FROM_DATABASE=Acutvista Innovation Co., Ltd.
 
-OUI:0000B9*
- ID_OUI_FROM_DATABASE=MCDONNELL DOUGLAS COMPUTER SYS
+OUI:00C0F0*
+ ID_OUI_FROM_DATABASE=Kingston Technology Company, Inc.
 
-OUI:00002D*
- ID_OUI_FROM_DATABASE=CHROMATICS INC
+OUI:4C8FA5*
+ ID_OUI_FROM_DATABASE=Jastec
 
-OUI:00004A*
- ID_OUI_FROM_DATABASE=ADC CODENOLL TECHNOLOGY CORP.
+OUI:000C49*
+ ID_OUI_FROM_DATABASE=Dangaard Telecom Denmark A/S
 
-OUI:0000C0*
- ID_OUI_FROM_DATABASE=WESTERN DIGITAL CORPORATION
+OUI:CCE17F*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:000040*
- ID_OUI_FROM_DATABASE=APPLICON, INC.
+OUI:44F477*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:00005D*
- ID_OUI_FROM_DATABASE=CS TELECOM
+OUI:5C4527*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:08008E*
- ID_OUI_FROM_DATABASE=Tandem Computers
+OUI:F01C2D*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:080086*
- ID_OUI_FROM_DATABASE=KONICA MINOLTA HOLDINGS, INC.
+OUI:F8C001*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:080083*
- ID_OUI_FROM_DATABASE=Seiko Instruments Inc.
+OUI:78FE3D*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:080080*
- ID_OUI_FROM_DATABASE=AES DATA INC.
+OUI:54E032*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:080030*
- ID_OUI_FROM_DATABASE=ROYAL MELBOURNE INST OF TECH
+OUI:3C6104*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:080064*
- ID_OUI_FROM_DATABASE=Sitasys AG
+OUI:BC7574*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00DD09*
- ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
+OUI:20A680*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:08008A*
- ID_OUI_FROM_DATABASE=PerfTech, Inc.
+OUI:0019E2*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:00DD04*
- ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
+OUI:001F12*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:080066*
- ID_OUI_FROM_DATABASE=AGFA CORPORATION
+OUI:0024DC*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:08001A*
- ID_OUI_FROM_DATABASE=TIARA/ 10NET
+OUI:50C58D*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:080090*
- ID_OUI_FROM_DATABASE=SONOMA SYSTEMS
+OUI:000585*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:08000B*
- ID_OUI_FROM_DATABASE=UNISYS CORPORATION
+OUI:003146*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:080017*
- ID_OUI_FROM_DATABASE=NATIONAL SEMICONDUCTOR
+OUI:80ACAC*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:00005E*
- ID_OUI_FROM_DATABASE=ICANN, IANA Department
+OUI:50DD4F*
+ ID_OUI_FROM_DATABASE=Automation Components, Inc
 
-OUI:0000AF*
- ID_OUI_FROM_DATABASE=Canberra Industries, Inc.
+OUI:904D4A*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:0000EC*
- ID_OUI_FROM_DATABASE=MICROPROCESS
+OUI:7C79E8*
+ ID_OUI_FROM_DATABASE=PayRange Inc.
 
-OUI:00009E*
- ID_OUI_FROM_DATABASE=MARLI S.A.
+OUI:540593*
+ ID_OUI_FROM_DATABASE=WOORI ELEC Co.,Ltd
 
-OUI:000042*
- ID_OUI_FROM_DATABASE=METIER MANAGEMENT SYSTEMS LTD.
+OUI:A067BE*
+ ID_OUI_FROM_DATABASE=Sicon srl
 
-OUI:00008D*
- ID_OUI_FROM_DATABASE=Cryptek Inc.
+OUI:C4CAD9*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:000065*
- ID_OUI_FROM_DATABASE=Network General Corporation
+OUI:74258A*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:00004D*
- ID_OUI_FROM_DATABASE=DCI CORPORATION
+OUI:70F96D*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:080024*
- ID_OUI_FROM_DATABASE=10NET COMMUNICATIONS/DCA
+OUI:00260F*
+ ID_OUI_FROM_DATABASE=Linn Products Ltd
 
-OUI:08001E*
- ID_OUI_FROM_DATABASE=APOLLO COMPUTER INC.
+OUI:F845AD*
+ ID_OUI_FROM_DATABASE=Konka Group Co., Ltd.
 
-OUI:08001B*
- ID_OUI_FROM_DATABASE=EMC Corporation
+OUI:000358*
+ ID_OUI_FROM_DATABASE=Hanyang Digitech Co.Ltd
 
-OUI:00DD0D*
- ID_OUI_FROM_DATABASE=UNGERMANN-BASS INC.
+OUI:000761*
+ ID_OUI_FROM_DATABASE=29530
 
-OUI:AA0002*
- ID_OUI_FROM_DATABASE=DIGITAL EQUIPMENT CORPORATION
+OUI:60512C*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:080005*
- ID_OUI_FROM_DATABASE=SYMBOLICS INC.
+OUI:905F2E*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:000000*
- ID_OUI_FROM_DATABASE=XEROX CORPORATION
+OUI:4C0B3A*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:0040D6*
- ID_OUI_FROM_DATABASE=LOCAMATION B.V.
+OUI:C02FF1*
+ ID_OUI_FROM_DATABASE=Volta Networks
 
-OUI:800010*
- ID_OUI_FROM_DATABASE=ATT BELL LABORATORIES
+OUI:4882F2*
+ ID_OUI_FROM_DATABASE=Appel Elektronik GmbH
 
-OUI:AA0003*
- ID_OUI_FROM_DATABASE=DIGITAL EQUIPMENT CORPORATION
+OUI:0C5101*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:080008*
- ID_OUI_FROM_DATABASE=BOLT BERANEK AND NEWMAN INC.
+OUI:086D41*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:08000E*
- ID_OUI_FROM_DATABASE=NCR CORPORATION
+OUI:04D3CF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00006F*
- ID_OUI_FROM_DATABASE=Madge Ltd.
+OUI:30C82A*
+ ID_OUI_FROM_DATABASE=WI-BIZ srl
 
-OUI:00005A*
- ID_OUI_FROM_DATABASE=SysKonnect GmbH
+OUI:0062EC*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000023*
- ID_OUI_FROM_DATABASE=ABB INDUSTRIAL SYSTEMS AB
+OUI:0C8A87*
+ ID_OUI_FROM_DATABASE=AgLogica Holdings, Inc
 
-OUI:000045*
- ID_OUI_FROM_DATABASE=FORD AEROSPACE & COMM. CORP.
+OUI:34A2A2*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0000BC*
- ID_OUI_FROM_DATABASE=Rockwell Automation
+OUI:20F17C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0000C3*
- ID_OUI_FROM_DATABASE=HARRIS CORP COMPUTER SYS DIV
+OUI:34B354*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:000004*
- ID_OUI_FROM_DATABASE=XEROX CORPORATION
+OUI:749D8F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:000009*
- ID_OUI_FROM_DATABASE=XEROX CORPORATION
+OUI:346AC2*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00003D*
- ID_OUI_FROM_DATABASE=UNISYS
+OUI:C83DFC*
+ ID_OUI_FROM_DATABASE=Pioneer DJ Corporation
 
-OUI:F82C18*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:0016FB*
+ ID_OUI_FROM_DATABASE=SHENZHEN MTC CO LTD
 
-OUI:00173F*
- ID_OUI_FROM_DATABASE=Belkin International Inc.
+OUI:381DD9*
+ ID_OUI_FROM_DATABASE=FN-LINK TECHNOLOGY LIMITED
 
-OUI:388602*
- ID_OUI_FROM_DATABASE=Flexoptix GmbH
+OUI:6C9522*
+ ID_OUI_FROM_DATABASE=Scalys
 
-OUI:F4EB38*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:8C59C3*
+ ID_OUI_FROM_DATABASE=ADB Italia
 
-OUI:001E74*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:60C0BF*
+ ID_OUI_FROM_DATABASE=ON Semiconductor
 
-OUI:00604C*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:98398E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:002691*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:348A7B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:C0D044*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:BC765E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:6C2E85*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:E0A8B8*
+ ID_OUI_FROM_DATABASE=Le Shi Zhi Xin Electronic Technology (Tianjin) Limited
 
-OUI:CC33BB*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:B88198*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:681590*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:E4FB8F*
+ ID_OUI_FROM_DATABASE=MOBIWIRE MOBILES (NINGBO) CO.,LTD
 
-OUI:5464D9*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:78009E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00023F*
- ID_OUI_FROM_DATABASE=COMPAL ELECTRONICS, INC.
+OUI:C8AFE3*
+ ID_OUI_FROM_DATABASE=Hefei Radio Communication Technology Co., Ltd
 
-OUI:0080C2*
- ID_OUI_FROM_DATABASE=IEEE 802.1
+OUI:7C3548*
+ ID_OUI_FROM_DATABASE=Transcend Information
 
-OUI:C46699*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+OUI:E83A97*
+ ID_OUI_FROM_DATABASE=Toshiba Corporation
 
-OUI:383BC8*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:9C8ECD*
+ ID_OUI_FROM_DATABASE=Amcrest Technologies
 
-OUI:DC7FA4*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:282536*
+ ID_OUI_FROM_DATABASE=SHENZHEN HOLATEK CO.,LTD
 
-OUI:001288*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:FCA89A*
+ ID_OUI_FROM_DATABASE=Sunitec Enterprise Co.,Ltd
 
-OUI:001EC7*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:B8F8BE*
+ ID_OUI_FROM_DATABASE=BLUECOM
 
-OUI:28162E*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:6073BC*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:3CEA4F*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:90EED9*
+ ID_OUI_FROM_DATABASE=UNIVERSAL DE DESARROLLOS ELECTRÓNICOS, SA
 
-OUI:848F69*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:043110*
+ ID_OUI_FROM_DATABASE=Inspur Group Co., Ltd.
 
-OUI:90B11C*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:00215B*
+ ID_OUI_FROM_DATABASE=SenseAnywhere
 
-OUI:F8CAB8*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:C816BD*
+ ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
 
-OUI:24B6FD*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:587E61*
+ ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
 
-OUI:000D56*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:340AFF*
+ ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
 
-OUI:00123F*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:F85A00*
+ ID_OUI_FROM_DATABASE=Sanford LP
 
-OUI:001372*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:5067F0*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:74867A*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:C86C87*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:3417EB*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:D8E0B8*
+ ID_OUI_FROM_DATABASE=BULAT LLC
 
-OUI:EC8892*
+OUI:68C44D*
  ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:B07994*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:48FCB6*
+ ID_OUI_FROM_DATABASE=LAVA INTERNATIONAL(H.K) LIMITED
 
-OUI:141AA3*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:CC3540*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:CCC3EA*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:C42795*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:34BB26*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:58238C*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:40786A*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:705A9E*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:0019B9*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:80C6AB*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:002219*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:90A4DE*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
-OUI:00B0D0*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:3C970E*
+ ID_OUI_FROM_DATABASE=Wistron InfoComm(Kunshan)Co.,Ltd.
 
-OUI:5C260A*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:30144A*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
-OUI:B083FE*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:A854B2*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
-OUI:141877*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:38BC1A*
+ ID_OUI_FROM_DATABASE=MEIZU Technology Co., Ltd.
 
-OUI:0024E8*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:0004A3*
+ ID_OUI_FROM_DATABASE=Microchip Technology Inc.
 
-OUI:A48E0A*
- ID_OUI_FROM_DATABASE=DeLaval International AB
+OUI:982F3C*
+ ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
 
-OUI:00215C*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:380DD4*
+ ID_OUI_FROM_DATABASE=Primax Electronics Ltd.
 
-OUI:002315*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:98FDB4*
+ ID_OUI_FROM_DATABASE=Primax Electronics Ltd.
 
-OUI:001500*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:00157D*
+ ID_OUI_FROM_DATABASE=POSDATA
 
-OUI:104A7D*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:F8E61A*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:A4C494*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:888322*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:902E1C*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:84B541*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:3CFDFE*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:18DC56*
+ ID_OUI_FROM_DATABASE=Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd
 
-OUI:B8BF83*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:001F46*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:001DE1*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:001F0A*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:0022FB*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:00130A*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:081196*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:001E7E*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:6036DD*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:001C9C*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:A0369F*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:000CF8*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:502DA2*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:000CF7*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:4C79BA*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:001E1F*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:4CEB42*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:001C17*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:606720*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:00182E*
+ ID_OUI_FROM_DATABASE=XStreamHD
 
-OUI:84A6C8*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:50016B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:5891CF*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:58986F*
+ ID_OUI_FROM_DATABASE=Revolution Display
 
-OUI:88532E*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:28AC67*
+ ID_OUI_FROM_DATABASE=Mach Power, Rappresentanze Internazionali s.r.l.
 
-OUI:0024D7*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:B0B28F*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:C40938*
- ID_OUI_FROM_DATABASE=FUJIAN STAR-NET COMMUNICATION CO.,LTD
+OUI:DC1A01*
+ ID_OUI_FROM_DATABASE=Ecoliv Technology ( Shenzhen ) Ltd.
 
-OUI:00AA02*
- ID_OUI_FROM_DATABASE=Intel Corporation
+OUI:7CFE90*
+ ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
 
-OUI:5CD2E4*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:0002C9*
+ ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
 
-OUI:04BD88*
- ID_OUI_FROM_DATABASE=Aruba Networks
+OUI:D05FB8*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:000B86*
- ID_OUI_FROM_DATABASE=Aruba Networks
+OUI:C4BE84*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:8896F2*
- ID_OUI_FROM_DATABASE=Valeo Schalter und Sensoren GmbH
+OUI:78A504*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:80A589*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:7C669D*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0CCC26*
- ID_OUI_FROM_DATABASE=Airenetworks
+OUI:D03972*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:4CB0E8*
- ID_OUI_FROM_DATABASE=Beijing RongZhi xinghua technology co., LTD
+OUI:E0E5CF*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:4C14A3*
- ID_OUI_FROM_DATABASE=TCL Technoly Electronics (Huizhou) Co., Ltd.
+OUI:7CEC79*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:F48E38*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:74D6EA*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:D887D5*
- ID_OUI_FROM_DATABASE=Leadcore Technology CO.,LTD
+OUI:0017EB*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00DA55*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:883314*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:80D21D*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:84DD20*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:705A0F*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:1C4593*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:586356*
- ID_OUI_FROM_DATABASE=FN-LINK TECHNOLOGY LIMITED
+OUI:5C6B32*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:B046FC*
- ID_OUI_FROM_DATABASE=MitraStar Technology Corp.
+OUI:0017E4*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:08A95A*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:D03761*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:6CADF8*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:0024BA*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:54271E*
- ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+OUI:0022A5*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:008C54*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:0021BA*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:F0842F*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:001833*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:8CB864*
- ID_OUI_FROM_DATABASE=AcSiP Technology Corp.
+OUI:D8952F*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0020E0*
- ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
+OUI:649C8E*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0004E3*
- ID_OUI_FROM_DATABASE=Accton Technology Corp
+OUI:F4FC32*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:409558*
- ID_OUI_FROM_DATABASE=Aisino Corporation
+OUI:74DAEA*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00D0C9*
- ID_OUI_FROM_DATABASE=ADVANTECH CO., LTD.
+OUI:04A316*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:002553*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:98072D*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00238E*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:001AB6*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:001CA2*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:C8A030*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0017C2*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:34B1F7*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:D0D412*
- ID_OUI_FROM_DATABASE=ADB Broadband Italia
+OUI:C4EDBA*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:000FA3*
- ID_OUI_FROM_DATABASE=Alpha Networks Inc.
+OUI:A40DBC*
+ ID_OUI_FROM_DATABASE=Xiamen Intretech Inc.
 
-OUI:001D6A*
- ID_OUI_FROM_DATABASE=Alpha Networks Inc.
+OUI:EC8EAE*
+ ID_OUI_FROM_DATABASE=Nagravision SA
 
-OUI:0000F4*
- ID_OUI_FROM_DATABASE=Allied Telesis, Inc.
+OUI:606405*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:10AE60*
- ID_OUI_FROM_DATABASE=Private
+OUI:708BCD*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:F04F7C*
- ID_OUI_FROM_DATABASE=Private
+OUI:001A21*
+ ID_OUI_FROM_DATABASE=Brookhuis Applied Technologies BV
 
-OUI:70F1A1*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:00A00E*
+ ID_OUI_FROM_DATABASE=NetScout Systems, Inc.
 
-OUI:6CFAA7*
- ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
+OUI:1C330E*
+ ID_OUI_FROM_DATABASE=PernixData
 
-OUI:0024EF*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:345760*
+ ID_OUI_FROM_DATABASE=MitraStar Technology Corp.
 
-OUI:6C0E0D*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:343DC4*
+ ID_OUI_FROM_DATABASE=BUFFALO.INC
 
-OUI:B4527D*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:6CEFC6*
+ ID_OUI_FROM_DATABASE=SHENZHEN TWOWING TECHNOLOGIES CO.,LTD.
 
-OUI:E063E5*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:002A10*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:000E07*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:44D6E1*
+ ID_OUI_FROM_DATABASE=Snuza International Pty. Ltd.
 
-OUI:001A75*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:0015B9*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0016B8*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:001DF6*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001D28*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:ECE09B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001FE4*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:606BBD*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:002298*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:0000F0*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:24FD52*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:4844F7*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:2016D8*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:DC7144*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
-OUI:9CB70D*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:A00BBA*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
-OUI:1C659D*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:1C5A3E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001B9E*
- ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+OUI:F47B5E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:E0CA94*
- ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+OUI:C44619*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:C0D962*
- ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+OUI:F0F002*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00150C*
- ID_OUI_FROM_DATABASE=AVM GmbH
+OUI:889FFA*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:744401*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:5CAC4C*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:E091F5*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:18F46A*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:001B2F*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:3859F9*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00223F*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:BC8556*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:E0469A*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:9C2A70*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:F40B93*
- ID_OUI_FROM_DATABASE=BlackBerry RTS
+OUI:F82FA8*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:68ED43*
- ID_OUI_FROM_DATABASE=BlackBerry RTS
+OUI:0CEEE6*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:34BB1F*
- ID_OUI_FROM_DATABASE=BlackBerry RTS
+OUI:0C6076*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:489D24*
- ID_OUI_FROM_DATABASE=BlackBerry RTS
+OUI:90FBA6*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:000F86*
- ID_OUI_FROM_DATABASE=BlackBerry RTS
+OUI:00197D*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:001333*
- ID_OUI_FROM_DATABASE=BaudTec Corporation
+OUI:001C26*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:507E5D*
- ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+OUI:9CAD97*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:849CA6*
- ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+OUI:2C8158*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:1CC63C*
- ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+OUI:142D27*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:C02506*
- ID_OUI_FROM_DATABASE=AVM GmbH
+OUI:843DC6*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0896D7*
- ID_OUI_FROM_DATABASE=AVM GmbH
+OUI:407C7D*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:008EF2*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:BC52B4*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:4494FC*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:FC2FAA*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:20E52A*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:903AA0*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:9CD36D*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:702526*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:C40415*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:38F7B2*
+ ID_OUI_FROM_DATABASE=SEOJUN ELECTRIC
 
-OUI:08BD43*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:7802B7*
+ ID_OUI_FROM_DATABASE=ShenZhen Ultra Easy Technology CO.,LTD
+
+OUI:88AD43*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
-OUI:4C09D4*
- ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+OUI:E4186B*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:DC446D*
- ID_OUI_FROM_DATABASE=Allwinner Technology Co., Ltd
+OUI:6C71BD*
+ ID_OUI_FROM_DATABASE=EZELINK TELECOM
 
-OUI:BC620E*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:842519*
+ ID_OUI_FROM_DATABASE=Samsung Electronics
 
-OUI:78F557*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:88DEA9*
+ ID_OUI_FROM_DATABASE=Roku, Inc.
 
-OUI:E02861*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:FC83C6*
+ ID_OUI_FROM_DATABASE=N-Radio Technologies Co., Ltd.
 
-OUI:C4473F*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:B4E782*
+ ID_OUI_FROM_DATABASE=Vivalnk
 
-OUI:000AF7*
- ID_OUI_FROM_DATABASE=Broadcom
+OUI:008701*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:000DB6*
- ID_OUI_FROM_DATABASE=Broadcom
+OUI:FC4203*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:18C086*
- ID_OUI_FROM_DATABASE=Broadcom
+OUI:1C232C*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:C03E0F*
- ID_OUI_FROM_DATABASE=BSkyB Ltd
+OUI:08010F*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
 
-OUI:0020D4*
- ID_OUI_FROM_DATABASE=Cabletron Systems, Inc.
+OUI:CCA260*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
 
-OUI:00001D*
- ID_OUI_FROM_DATABASE=Cabletron Systems, Inc.
+OUI:203CAE*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0060BB*
- ID_OUI_FROM_DATABASE=Cabletron Systems, Inc.
+OUI:748D08*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:D0542D*
- ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
+OUI:00D78F*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001FC7*
- ID_OUI_FROM_DATABASE=Casio Hitachi Mobile Communications Co., Ltd.
+OUI:A03BE3*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:ACEE9E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:886B0F*
+ ID_OUI_FROM_DATABASE=Bluegiga Technologies OY
 
-OUI:C08997*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:98541B*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:2827BF*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:CC61E5*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:F05B7B*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:404E36*
+ ID_OUI_FROM_DATABASE=HTC Corporation
 
-OUI:7CF90E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:9CB206*
+ ID_OUI_FROM_DATABASE=PROCENTEC
 
-OUI:AC5A14*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:1C40E8*
+ ID_OUI_FROM_DATABASE=SHENZHEN PROGRESS&WIN TECHNOLOGY CO.,LTD
 
-OUI:B0C559*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:C8D3FF*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:BCD11F*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:805EC0*
+ ID_OUI_FROM_DATABASE=YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD.
 
-OUI:A0B4A5*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:307496*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:80656D*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:708A09*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:48137E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:149D09*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:E83A12*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:008025*
+ ID_OUI_FROM_DATABASE=Telit Wireless Solutions GmbH
 
-OUI:9C0298*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:0001E1*
+ ID_OUI_FROM_DATABASE=Kinpo Electronics, Inc.
 
-OUI:6C8336*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:006041*
+ ID_OUI_FROM_DATABASE=Yokogawa Digital Computer Corporation
 
-OUI:B8C68E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:14A78B*
+ ID_OUI_FROM_DATABASE=Zhejiang Dahua Technology Co., Ltd.
 
-OUI:74458A*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:D0608C*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:A49A58*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:009EC8*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:B4EF39*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:ACF7F3*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:14A364*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:102AB3*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:3CA10D*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:584498*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:206E9C*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:A086C6*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:183F47*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:7C1DD9*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:0C715D*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:C8662C*
+ ID_OUI_FROM_DATABASE=Beijing Haitai Fangyuan High Technology Co,.Ltd.
 
-OUI:0C1420*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:CC8CDA*
+ ID_OUI_FROM_DATABASE=Shenzhen Wei Da Intelligent Technology Go.,Ltd
 
-OUI:A80600*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:D436DB*
+ ID_OUI_FROM_DATABASE=Jiangsu Toppower Automotive Electronics Co., Ltd
 
-OUI:6CF373*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:64A68F*
+ ID_OUI_FROM_DATABASE=Zhongshan Readboy Electronics Co.,Ltd
 
-OUI:90F1AA*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:58EF68*
+ ID_OUI_FROM_DATABASE=Belkin International Inc.
 
-OUI:C4576E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:003048*
+ ID_OUI_FROM_DATABASE=Super Micro Computer, Inc.
 
-OUI:78BDBC*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:001438*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:3872C0*
- ID_OUI_FROM_DATABASE=Comtrend Corporation
+OUI:50D753*
+ ID_OUI_FROM_DATABASE=CONELCOM GmbH
 
-OUI:F4068D*
- ID_OUI_FROM_DATABASE=devolo AG
+OUI:4C38D5*
+ ID_OUI_FROM_DATABASE=MITAC COMPUTING TECHNOLOGY CORPORATION
 
-OUI:000BCA*
- ID_OUI_FROM_DATABASE=DATAVAN TC
+OUI:688AF0*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:00507F*
- ID_OUI_FROM_DATABASE=DrayTek Corp.
+OUI:000BA1*
+ ID_OUI_FROM_DATABASE=Fujikura Solutions Ltd.
 
-OUI:3C8970*
- ID_OUI_FROM_DATABASE=Neosfar
+OUI:AC587B*
+ ID_OUI_FROM_DATABASE=JCT Healthcare
 
-OUI:C43655*
- ID_OUI_FROM_DATABASE=Shenzhen Fenglian Technology Co., Ltd.
+OUI:30E171*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:78CB68*
- ID_OUI_FROM_DATABASE=DAEHAP HYPER-TECH
+OUI:8C3C4A*
+ ID_OUI_FROM_DATABASE=NAKAYO Inc
 
-OUI:001A7F*
- ID_OUI_FROM_DATABASE=GCI Science & Technology Co.,LTD
+OUI:98CF53*
+ ID_OUI_FROM_DATABASE=BBK EDUCATIONAL ELECTRONICS CORP.,LTD.
 
-OUI:00054F*
- ID_OUI_FROM_DATABASE=Private
+OUI:F4CB52*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:D04D2C*
- ID_OUI_FROM_DATABASE=Roku, Inc.
+OUI:446EE5*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:E00C7F*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:2C282D*
+ ID_OUI_FROM_DATABASE=BBK EDUCATIONAL ELECTRONICS CORP.,LTD.
 
-OUI:58BDA3*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:80414E*
+ ID_OUI_FROM_DATABASE=BBK EDUCATIONAL ELECTRONICS CORP.,LTD.
 
-OUI:0025A0*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:8C7716*
+ ID_OUI_FROM_DATABASE=LONGCHEER TELECOMMUNICATION LIMITED
 
-OUI:002659*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:000A08*
+ ID_OUI_FROM_DATABASE=Alpine Electronics, Inc.
 
-OUI:8C56C5*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:A0143D*
+ ID_OUI_FROM_DATABASE=PARROT SA
 
-OUI:CC9E00*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:00267E*
+ ID_OUI_FROM_DATABASE=PARROT SA
 
-OUI:001656*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:00121C*
+ ID_OUI_FROM_DATABASE=PARROT SA
 
-OUI:00191D*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:B85510*
+ ID_OUI_FROM_DATABASE=Zioncom Electronics (Shenzhen) Ltd.
 
-OUI:0019FD*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:000EE8*
+ ID_OUI_FROM_DATABASE=Zioncom Electronics (Shenzhen) Ltd.
 
-OUI:001EA9*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:001165*
+ ID_OUI_FROM_DATABASE=ZNYX Networks, Inc.
 
-OUI:A84481*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:0060D5*
+ ID_OUI_FROM_DATABASE=AMADA MIYACHI Co., Ltd
 
-OUI:8844F6*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:000FDB*
+ ID_OUI_FROM_DATABASE=Westell Technologies Inc.
 
-OUI:A87B39*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:D404FF*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:14C126*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:C45444*
+ ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
 
-OUI:4C2578*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:00269E*
+ ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
 
-OUI:001EA4*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:683563*
+ ID_OUI_FROM_DATABASE=SHENZHEN LIOWN ELECTRONICS CO.,LTD.
 
-OUI:001262*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:0003B2*
+ ID_OUI_FROM_DATABASE=Radware
 
-OUI:00174B*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:2C600C*
+ ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
 
-OUI:002547*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:001E68*
+ ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
 
-OUI:001DE9*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:00A09B*
+ ID_OUI_FROM_DATABASE=QPSX COMMUNICATIONS, LTD.
 
-OUI:001D3B*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:00E08B*
+ ID_OUI_FROM_DATABASE=QLogic Corporation
 
-OUI:0014A7*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:00080D*
+ ID_OUI_FROM_DATABASE=Toshiba
 
-OUI:001CD6*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:0015B7*
+ ID_OUI_FROM_DATABASE=Toshiba
 
-OUI:D099D5*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent
+OUI:000569*
+ ID_OUI_FROM_DATABASE=VMware, Inc.
 
-OUI:DC0077*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:0008F1*
+ ID_OUI_FROM_DATABASE=Voltaire
 
-OUI:0060DC*
- ID_OUI_FROM_DATABASE=NEC Magnus Communications,Ltd.
+OUI:001BDA*
+ ID_OUI_FROM_DATABASE=UTStarcom Inc
 
-OUI:9CAED3*
- ID_OUI_FROM_DATABASE=Seiko Epson Corporation
+OUI:FC4DD4*
+ ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
 
-OUI:F45C89*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:402CF4*
+ ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
 
-OUI:8C3C4A*
- ID_OUI_FROM_DATABASE=NAKAYO TELECOMMUNICATIONS,INC
+OUI:0010C6*
+ ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
 
-OUI:0021FD*
- ID_OUI_FROM_DATABASE=LACROIX TRAFFIC S.A.U
+OUI:00247E*
+ ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
 
-OUI:4CB44A*
- ID_OUI_FROM_DATABASE=NANOWAVE Technologies Inc.
+OUI:001639*
+ ID_OUI_FROM_DATABASE=Ubiquam Co., Ltd.
 
-OUI:78C3E9*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:183919*
+ ID_OUI_FROM_DATABASE=Unicoi Systems
 
-OUI:9C5C8E*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:90A46A*
+ ID_OUI_FROM_DATABASE=SISNET CO., LTD
 
-OUI:70884D*
- ID_OUI_FROM_DATABASE=JAPAN RADIO CO., LTD.
+OUI:14E7C8*
+ ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
-OUI:102AB3*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:280DFC*
+ ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
 
-OUI:4C55CC*
- ID_OUI_FROM_DATABASE=Zentri Pty Ltd
+OUI:0015C1*
+ ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
 
-OUI:BCEC5D*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:0019C5*
+ ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
 
-OUI:DC415F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:ACA213*
+ ID_OUI_FROM_DATABASE=Shenzhen Bilian electronic CO.,LTD
 
-OUI:30636B*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:38F8CA*
+ ID_OUI_FROM_DATABASE=OWIN Inc.
 
-OUI:84683E*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:54D272*
+ ID_OUI_FROM_DATABASE=Nuki Home Solutions GmbH
 
-OUI:C88722*
- ID_OUI_FROM_DATABASE=Lumenpulse
+OUI:9CA3A9*
+ ID_OUI_FROM_DATABASE=Guangzhou Juan Optical and Electronical Tech Joint Stock Co., Ltd
 
-OUI:FC1A11*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+OUI:9893CC*
+ ID_OUI_FROM_DATABASE=LG ELECTRONICS INC
 
-OUI:30A9DE*
- ID_OUI_FROM_DATABASE=LG Innotek
+OUI:3CCD93*
+ ID_OUI_FROM_DATABASE=LG ELECTRONICS INC
 
-OUI:E0CDFD*
- ID_OUI_FROM_DATABASE=Beijing E3Control Technology Co, LTD
+OUI:583F54*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:208B37*
- ID_OUI_FROM_DATABASE=Skyworth Digital Technology(Shenzhen) Co.,Ltd
+OUI:001C62*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:08BE77*
- ID_OUI_FROM_DATABASE=Green Electronics
+OUI:002483*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:280C28*
- ID_OUI_FROM_DATABASE=Unigen DataStorage Corporation
+OUI:E417D8*
+ ID_OUI_FROM_DATABASE=8BITDO TECHNOLOGY HK LIMITED
 
-OUI:980CA5*
- ID_OUI_FROM_DATABASE=Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.
+OUI:40B0FA*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:1CC035*
- ID_OUI_FROM_DATABASE=PLANEX COMMUNICATIONS INC.
+OUI:A09169*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:34543C*
- ID_OUI_FROM_DATABASE=TAKAOKA TOKO CO.,LTD.
+OUI:286C07*
+ ID_OUI_FROM_DATABASE=XIAOMI Electronics,CO.,LTD
 
-OUI:D49524*
- ID_OUI_FROM_DATABASE=Clover Network, Inc.
+OUI:84D931*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:0034DA*
+OUI:34FCEF*
  ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:9046A2*
- ID_OUI_FROM_DATABASE=Tedipay UK Ltd
-
-OUI:6479A7*
- ID_OUI_FROM_DATABASE=Phison Electronics Corp.
+OUI:485929*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:C83870*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:505527*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:288335*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:98D6F7*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:44783E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:A8922C*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:202D07*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:44DC91*
+ ID_OUI_FROM_DATABASE=PLANEX COMMUNICATIONS INC.
 
-OUI:0452C7*
- ID_OUI_FROM_DATABASE=Bose Corporation
+OUI:9CD332*
+ ID_OUI_FROM_DATABASE=PLC Technology Ltd
 
-OUI:D4612E*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:94D723*
+ ID_OUI_FROM_DATABASE=Shanghai DareGlobal Technologies Co.,Ltd
 
-OUI:1C6758*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:A89DD2*
+ ID_OUI_FROM_DATABASE=Shanghai DareGlobal Technologies Co.,Ltd
 
-OUI:E85659*
- ID_OUI_FROM_DATABASE=Advanced-Connectek Inc.
+OUI:184A6F*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
 
-OUI:34E70B*
- ID_OUI_FROM_DATABASE=Beijing HAN Networks Co., Ltd
+OUI:A0F3E4*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent IPD
 
-OUI:8801F2*
- ID_OUI_FROM_DATABASE=Vitec System Engineering Inc.
+OUI:002105*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent IPD
 
-OUI:FC084A*
- ID_OUI_FROM_DATABASE=FUJITSU LIMITED
+OUI:000772*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
 
-OUI:D4AD2D*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:F06BCA*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:48555F*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:3423BA*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:847BEB*
- ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:D022BE*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:F8C96C*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:D02544*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:34BF90*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:BC20A4*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:D467E7*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:14F42A*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:04C1B9*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:BC851F*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:689361*
- ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
+OUI:B85E7B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:A082AC*
- ID_OUI_FROM_DATABASE=Linear DMS Solutions Sdn. Bhd.
+OUI:C462EA*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:002697*
- ID_OUI_FROM_DATABASE=Alpha  Technologies Inc.
+OUI:0023D6*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:4CB8B5*
- ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
+OUI:002491*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:1CABC0*
- ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
+OUI:001B98*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:84E323*
- ID_OUI_FROM_DATABASE=Green Wave Telecommunication SDN BHD
+OUI:44F459*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:44650D*
- ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+OUI:34C3AC*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:D897BA*
- ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
+OUI:94D771*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:7071BC*
- ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
+OUI:4C3C16*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:E06995*
- ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
+OUI:9401C2*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:54D9E4*
- ID_OUI_FROM_DATABASE=BRILLIANTTS CO., LTD
+OUI:B43A28*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:E4F3F5*
- ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
+OUI:A8C83A*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00089F*
- ID_OUI_FROM_DATABASE=EFM Networks
+OUI:849FB5*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00185C*
- ID_OUI_FROM_DATABASE=EDSLAB Technologies
+OUI:D0C1B1*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:000E2E*
- ID_OUI_FROM_DATABASE=Edimax Technology Co. Ltd.
+OUI:F008F1*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00020E*
- ID_OUI_FROM_DATABASE=ECI Telecom Ltd.
+OUI:782079*
+ ID_OUI_FROM_DATABASE=ID Tech
 
-OUI:00115B*
- ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
+OUI:98234E*
+ ID_OUI_FROM_DATABASE=Micromedia AG
 
-OUI:000795*
- ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
+OUI:E80036*
+ ID_OUI_FROM_DATABASE=Befs co,. ltd
 
-OUI:B8AEED*
- ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
+OUI:24590B*
+ ID_OUI_FROM_DATABASE=White Sky Inc. Limited
 
-OUI:C03FD5*
- ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
+OUI:10C60C*
+ ID_OUI_FROM_DATABASE=Domino UK Ltd
 
-OUI:7427EA*
- ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
+OUI:3842A6*
+ ID_OUI_FROM_DATABASE=Ingenieurbuero Stahlkopf
 
-OUI:0000C9*
- ID_OUI_FROM_DATABASE=Emulex Corporation
+OUI:E866C4*
+ ID_OUI_FROM_DATABASE=Diamanti
 
-OUI:001A45*
- ID_OUI_FROM_DATABASE=GN Netcom A/S
+OUI:78471D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00168F*
- ID_OUI_FROM_DATABASE=GN Netcom A/S
+OUI:3816D1*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:083FBC*
+OUI:004A77*
  ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:042AE2*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:D48890*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:1C1B0D*
- ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
+OUI:002566*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:903809*
- ID_OUI_FROM_DATABASE=Ericsson AB
+OUI:00265F*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00104F*
- ID_OUI_FROM_DATABASE=Oracle Corporation
+OUI:001628*
+ ID_OUI_FROM_DATABASE=Magicard Ltd
 
-OUI:000782*
- ID_OUI_FROM_DATABASE=Oracle Corporation
+OUI:E4C801*
+ ID_OUI_FROM_DATABASE=BLU Products Inc
 
-OUI:E42F56*
- ID_OUI_FROM_DATABASE=OptoMET GmbH
+OUI:00A6CA*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00A045*
- ID_OUI_FROM_DATABASE=PHOENIX CONTACT Electronics GmbH
+OUI:9C7DA3*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00266C*
- ID_OUI_FROM_DATABASE=INVENTEC Corporation
+OUI:F02FA7*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001E25*
- ID_OUI_FROM_DATABASE=INTEK DIGITAL
+OUI:883FD3*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:A0B662*
- ID_OUI_FROM_DATABASE=Acutvista Innovation Co., Ltd.
+OUI:A04E01*
+ ID_OUI_FROM_DATABASE=CENTRAL ENGINEERING co.,ltd.
 
-OUI:00C0F0*
- ID_OUI_FROM_DATABASE=Kingston Technology Company, Inc.
+OUI:245CBF*
+ ID_OUI_FROM_DATABASE=NCSE
 
-OUI:4C8FA5*
- ID_OUI_FROM_DATABASE=Jastec
+OUI:84CD62*
+ ID_OUI_FROM_DATABASE=ShenZhen IDWELL Technology CO.,Ltd
 
-OUI:000C49*
- ID_OUI_FROM_DATABASE=Dangaard Telecom Denmark A/S
+OUI:DC9FDB*
+ ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
 
-OUI:CCE17F*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:B0958E*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:44F477*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:001A39*
+ ID_OUI_FROM_DATABASE=Merten GmbH&CoKG
 
-OUI:5C4527*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:007B18*
+ ID_OUI_FROM_DATABASE=SENTRY Co., LTD.
 
-OUI:F01C2D*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:144D67*
+ ID_OUI_FROM_DATABASE=Zioncom Electronics (Shenzhen) Ltd.
 
-OUI:F8C001*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:34F39A*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:78FE3D*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:20A8B9*
+ ID_OUI_FROM_DATABASE=Siemens
 
-OUI:54E032*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:C81B5C*
+ ID_OUI_FROM_DATABASE=BCTech
 
-OUI:3C6104*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:3C2AF4*
+ ID_OUI_FROM_DATABASE=Brother Industries, LTD.
 
-OUI:BC7574*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:20719E*
+ ID_OUI_FROM_DATABASE=SF Technology Co.,Ltd
 
-OUI:20A680*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:7C95B1*
+ ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
 
-OUI:0019E2*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:206C8A*
+ ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
 
-OUI:001F12*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:E49E12*
+ ID_OUI_FROM_DATABASE=FREEBOX SAS
 
-OUI:0024DC*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:D854A2*
+ ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
 
-OUI:50C58D*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:E01C41*
+ ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
 
-OUI:000585*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:C8675E*
+ ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
 
-OUI:003146*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:D4C8B0*
+ ID_OUI_FROM_DATABASE=Prime Electronics & Satellitics Inc.
 
-OUI:80ACAC*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:000FC2*
+ ID_OUI_FROM_DATABASE=Uniwell Corporation
 
-OUI:50DD4F*
- ID_OUI_FROM_DATABASE=Automation Components, Inc
+OUI:A4E6B1*
+ ID_OUI_FROM_DATABASE=Shanghai Joindata Technology Co.,Ltd.
 
-OUI:904D4A*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:B4B384*
+ ID_OUI_FROM_DATABASE=ShenZhen Figigantic Electronic Co.,Ltd
 
-OUI:7C79E8*
- ID_OUI_FROM_DATABASE=PayRange Inc.
+OUI:D46A6A*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:540593*
- ID_OUI_FROM_DATABASE=WOORI ELEC Co.,Ltd
+OUI:A8A5E2*
+ ID_OUI_FROM_DATABASE=MSF-Vathauer Antriebstechnik GmbH & Co KG
 
-OUI:A067BE*
- ID_OUI_FROM_DATABASE=Sicon srl
+OUI:00425A*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:C4CAD9*
- ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+OUI:000B4F*
+ ID_OUI_FROM_DATABASE=Verifone
 
-OUI:74258A*
- ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+OUI:007686*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:70F96D*
- ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+OUI:74FF4C*
+ ID_OUI_FROM_DATABASE=Skyworth Digital Technology(Shenzhen) Co.,Ltd
 
-OUI:00260F*
- ID_OUI_FROM_DATABASE=Linn Products Ltd
+OUI:A02C36*
+ ID_OUI_FROM_DATABASE=FN-LINK TECHNOLOGY LIMITED
 
-OUI:F845AD*
- ID_OUI_FROM_DATABASE=Konka Group Co., Ltd.
+OUI:F8D027*
+ ID_OUI_FROM_DATABASE=Seiko Epson Corporation
 
-OUI:000358*
- ID_OUI_FROM_DATABASE=Hanyang Digitech Co.Ltd
+OUI:44D244*
+ ID_OUI_FROM_DATABASE=Seiko Epson Corporation
 
-OUI:000761*
- ID_OUI_FROM_DATABASE=29530
+OUI:9CAED3*
+ ID_OUI_FROM_DATABASE=Seiko Epson Corporation
 
-OUI:60512C*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:341E6B*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:905F2E*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:B47447*
+ ID_OUI_FROM_DATABASE=CoreOS
 
-OUI:4C0B3A*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:ACC1EE*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:C02FF1*
- ID_OUI_FROM_DATABASE=Volta Networks
+OUI:CCA219*
+ ID_OUI_FROM_DATABASE=SHENZHEN ALONG INVESTMENT CO.,LTD
 
-OUI:4882F2*
- ID_OUI_FROM_DATABASE=Appel Elektronik GmbH
+OUI:94A04E*
+ ID_OUI_FROM_DATABASE=Bostex Technology Co., LTD
 
-OUI:0C5101*
+OUI:8CA5A1*
+ ID_OUI_FROM_DATABASE=Oregano Systems - Design & Consulting GmbH
+
+OUI:64B0A6*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:086D41*
+OUI:84FCAC*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:04D3CF*
+OUI:6C19C0*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:30C82A*
- ID_OUI_FROM_DATABASE=WI-BIZ srl
+OUI:20AB37*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0062EC*
+OUI:186590*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:2C0BE9*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0C8A87*
- ID_OUI_FROM_DATABASE=AgLogica Holdings, Inc
+OUI:2C6373*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
 
-OUI:34A2A2*
+OUI:9CCC83*
+ ID_OUI_FROM_DATABASE=Juniper Networks
+
+OUI:90505A*
+ ID_OUI_FROM_DATABASE=unGlue, Inc
+
+OUI:60D262*
+ ID_OUI_FROM_DATABASE=Tzukuri Pty Ltd
+
+OUI:34FCB9*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
+
+OUI:B0E5ED*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:20F17C*
+OUI:C81451*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:34B354*
+OUI:C486E9*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:749D8F*
+OUI:D8C771*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:346AC2*
+OUI:F0C850*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:50F5DA*
- ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+OUI:5425EA*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:8CD2E9*
- ID_OUI_FROM_DATABASE=NIPPON SMT Co.Ltd
+OUI:2816AD*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:C83DFC*
- ID_OUI_FROM_DATABASE=Pioneer DJ Corporation
+OUI:00A0C8*
+ ID_OUI_FROM_DATABASE=Adtran Inc
 
-OUI:0016FB*
- ID_OUI_FROM_DATABASE=SHENZHEN MTC CO LTD
+OUI:1CB857*
+ ID_OUI_FROM_DATABASE=Becon Technologies Co,.Ltd.
 
-OUI:381DD9*
- ID_OUI_FROM_DATABASE=FN-LINK TECHNOLOGY LIMITED
+OUI:70918F*
+ ID_OUI_FROM_DATABASE=Weber-Stephen Products LLC
 
-OUI:6C9522*
- ID_OUI_FROM_DATABASE=Scalys
+OUI:803A0A*
+ ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
-OUI:8C59C3*
- ID_OUI_FROM_DATABASE=ADB Italia
+OUI:002207*
+ ID_OUI_FROM_DATABASE=Inteno Broadband Technology AB
 
-OUI:60C0BF*
- ID_OUI_FROM_DATABASE=ON Semiconductor
+OUI:3C7F6F*
+ ID_OUI_FROM_DATABASE=Telechips, Inc.
 
-OUI:98398E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:0060D3*
+ ID_OUI_FROM_DATABASE=AT&T
 
-OUI:348A7B*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:800010*
+ ID_OUI_FROM_DATABASE=AT&T
 
-OUI:BC765E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:08006A*
+ ID_OUI_FROM_DATABASE=AT&T
 
-OUI:E0A8B8*
- ID_OUI_FROM_DATABASE=Le Shi Zhi Xin Electronic Technology (Tianjin) Limited
+OUI:48A380*
+ ID_OUI_FROM_DATABASE=Gionee Communication Equipment Co.,Ltd.
 
-OUI:B88198*
+OUI:5CBA37*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
+
+OUI:C4836F*
+ ID_OUI_FROM_DATABASE=Ciena Corporation
+
+OUI:C87324*
+ ID_OUI_FROM_DATABASE=Sow Cheng Technology Co. Ltd.
+
+OUI:3CF862*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:E4FB8F*
- ID_OUI_FROM_DATABASE=MOBIWIRE MOBILES (NINGBO) CO.,LTD
+OUI:88C3B3*
+ ID_OUI_FROM_DATABASE=SOVICO
 
-OUI:78009E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:54C415*
+ ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
 
-OUI:C8AFE3*
- ID_OUI_FROM_DATABASE=Hefei Radio Communication Technology Co., Ltd
+OUI:E05124*
+ ID_OUI_FROM_DATABASE=NXP Semiconductors
 
-OUI:7C3548*
- ID_OUI_FROM_DATABASE=Transcend Information
+OUI:005016*
+ ID_OUI_FROM_DATABASE=Molex Canada Ltd
 
-OUI:E83A97*
- ID_OUI_FROM_DATABASE=Toshiba Corporation
+OUI:0005F7*
+ ID_OUI_FROM_DATABASE=Analog Devices, Inc.
 
-OUI:9C8ECD*
- ID_OUI_FROM_DATABASE=Amcrest Technologies
+OUI:A084CB*
+ ID_OUI_FROM_DATABASE=SonicSensory,Inc.
 
-OUI:282536*
- ID_OUI_FROM_DATABASE=SHENZHEN HOLATEK CO.,LTD
+OUI:7802F8*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:FCA89A*
- ID_OUI_FROM_DATABASE=Sunitec Enterprise Co.,Ltd
+OUI:00238A*
+ ID_OUI_FROM_DATABASE=Ciena Corporation
 
-OUI:B8F8BE*
- ID_OUI_FROM_DATABASE=BLUECOM
+OUI:34E70B*
+ ID_OUI_FROM_DATABASE=HAN Networks Co., Ltd
 
-OUI:6073BC*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:903809*
+ ID_OUI_FROM_DATABASE=Ericsson AB
 
-OUI:90EED9*
- ID_OUI_FROM_DATABASE=UNIVERSAL DE DESARROLLOS ELECTRÓNICOS, SA
+OUI:542B57*
+ ID_OUI_FROM_DATABASE=Night Owl SP
 
-OUI:043110*
- ID_OUI_FROM_DATABASE=Inspur Group Co., Ltd.
+OUI:00111B*
+ ID_OUI_FROM_DATABASE=Targa Systems Div L-3 Communications
 
-OUI:00215B*
- ID_OUI_FROM_DATABASE=SenseAnywhere
+OUI:B8224F*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
 
-OUI:C816BD*
- ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
+OUI:702084*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co., Ltd.
 
-OUI:587E61*
- ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
+OUI:F42B48*
+ ID_OUI_FROM_DATABASE=Ubiqam
 
-OUI:340AFF*
- ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
+OUI:68CC6E*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:F85A00*
- ID_OUI_FROM_DATABASE=Sanford LP
+OUI:00108C*
+ ID_OUI_FROM_DATABASE=Fujitsu Services Ltd
 
-OUI:5067F0*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:98D3D2*
+ ID_OUI_FROM_DATABASE=MEKRA Lang GmbH & Co. KG
 
-OUI:C86C87*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:F4DC41*
+ ID_OUI_FROM_DATABASE=YOUNGZONE CULTURE (SHANGHAI) CORP
 
-OUI:D8E0B8*
- ID_OUI_FROM_DATABASE=BULAT LLC
+OUI:9800C1*
+ ID_OUI_FROM_DATABASE=GuangZhou CREATOR Technology Co.,Ltd.(CHINA)
 
-OUI:68C44D*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:3034D2*
+ ID_OUI_FROM_DATABASE=Availink, Inc.
 
-OUI:48FCB6*
- ID_OUI_FROM_DATABASE=LAVA INTERNATIONAL(H.K) LIMITED
+OUI:40B034*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:CC3540*
- ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+OUI:CCCE1E*
+ ID_OUI_FROM_DATABASE=AVM Audiovisuelles Marketing und Computersysteme GmbH
 
-OUI:C42795*
- ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+OUI:501E2D*
+ ID_OUI_FROM_DATABASE=StreamUnlimited Engineering GmbH
 
-OUI:58238C*
- ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+OUI:FC0A81*
+ ID_OUI_FROM_DATABASE=Extreme Networks
 
-OUI:705A9E*
- ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+OUI:C8B5AD*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:80C6AB*
- ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+OUI:88E628*
+ ID_OUI_FROM_DATABASE=Shenzhen Kezhonglong Optoelectronic Technology Co.,Ltd
 
-OUI:90A4DE*
- ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
+OUI:9CDA3E*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:3C970E*
- ID_OUI_FROM_DATABASE=Wistron InfoComm(Kunshan)Co.,Ltd.
+OUI:3CA067*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:30144A*
- ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
+OUI:D8325A*
+ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
 
-OUI:A854B2*
- ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
+OUI:F04F7C*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:38BC1A*
- ID_OUI_FROM_DATABASE=MEIZU Technology Co., Ltd.
+OUI:10AE60*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:0004A3*
- ID_OUI_FROM_DATABASE=Microchip Technology Inc.
+OUI:44650D*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:98CF53*
- ID_OUI_FROM_DATABASE=BBK EDUCATIONAL ELECTRONICS CORP.,LTD.
+OUI:50F5DA*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:F4CB52*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:6854FD*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:446EE5*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:40B4CD*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
 
-OUI:2C282D*
- ID_OUI_FROM_DATABASE=BBK EDUCATIONAL ELECTRONICS CORP.,LTD.
+OUI:2C86D2*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:80414E*
- ID_OUI_FROM_DATABASE=BBK EDUCATIONAL ELECTRONICS CORP.,LTD.
+OUI:802689*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:8C7716*
- ID_OUI_FROM_DATABASE=LONGCHEER TELECOMMUNICATION LIMITED
+OUI:409F38*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
 
-OUI:000A08*
- ID_OUI_FROM_DATABASE=Alpine Electronics, Inc.
+OUI:C4D197*
+ ID_OUI_FROM_DATABASE=Ventia Utility Services
 
-OUI:A0143D*
- ID_OUI_FROM_DATABASE=PARROT SA
+OUI:58821D*
+ ID_OUI_FROM_DATABASE=H. Schomäcker GmbH
 
-OUI:00267E*
- ID_OUI_FROM_DATABASE=PARROT SA
+OUI:B8D7AF*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:00121C*
- ID_OUI_FROM_DATABASE=PARROT SA
+OUI:3096FB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:B85510*
- ID_OUI_FROM_DATABASE=Zioncom Electronics (Shenzhen) Ltd.
+OUI:CCBE59*
+ ID_OUI_FROM_DATABASE=Calix Inc.
 
-OUI:000EE8*
- ID_OUI_FROM_DATABASE=Zioncom Electronics (Shenzhen) Ltd.
+OUI:EC4F82*
+ ID_OUI_FROM_DATABASE=Calix Inc.
 
-OUI:001165*
- ID_OUI_FROM_DATABASE=ZNYX Networks, Inc.
+OUI:000631*
+ ID_OUI_FROM_DATABASE=Calix Inc.
 
-OUI:0060D5*
- ID_OUI_FROM_DATABASE=AMADA MIYACHI Co., Ltd
+OUI:F0EE10*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:000FDB*
- ID_OUI_FROM_DATABASE=Westell Technologies Inc.
+OUI:107D1A*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:D404FF*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:A8A198*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:C45444*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+OUI:D4DCCD*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00269E*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+OUI:484BAA*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:683563*
- ID_OUI_FROM_DATABASE=SHENZHEN LIOWN ELECTRONICS CO.,LTD.
+OUI:F80377*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:0003B2*
- ID_OUI_FROM_DATABASE=Radware
+OUI:14BD61*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:2C600C*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+OUI:C0D012*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:001E68*
- ID_OUI_FROM_DATABASE=QUANTA COMPUTER INC.
+OUI:0827CE*
+ ID_OUI_FROM_DATABASE=NAGANO KEIKI CO., LTD.
 
-OUI:00A09B*
- ID_OUI_FROM_DATABASE=QPSX COMMUNICATIONS, LTD.
+OUI:00D318*
+ ID_OUI_FROM_DATABASE=SPG Controls
 
-OUI:00E08B*
- ID_OUI_FROM_DATABASE=QLogic Corporation
+OUI:2C3124*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00080D*
- ID_OUI_FROM_DATABASE=Toshiba
+OUI:F40343*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:0015B7*
- ID_OUI_FROM_DATABASE=Toshiba
+OUI:00143F*
+ ID_OUI_FROM_DATABASE=Hotway Technology Corporation
 
-OUI:000569*
- ID_OUI_FROM_DATABASE=VMware, Inc.
+OUI:F8BE0D*
+ ID_OUI_FROM_DATABASE=A2UICT Co.,Ltd.
 
-OUI:0008F1*
- ID_OUI_FROM_DATABASE=Voltaire
+OUI:5CC6E9*
+ ID_OUI_FROM_DATABASE=Edifier International
 
-OUI:001BDA*
- ID_OUI_FROM_DATABASE=UTStarcom Inc
+OUI:08EA40*
+ ID_OUI_FROM_DATABASE=SHENZHEN BILIAN ELECTRONIC CO.,LTD
 
-OUI:FC4DD4*
- ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
+OUI:00E0DA*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Enterprise
 
-OUI:402CF4*
- ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
+OUI:1868CB*
+ ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
 
-OUI:0010C6*
- ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
+OUI:E8C1D7*
+ ID_OUI_FROM_DATABASE=Philips
 
-OUI:00247E*
- ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
+OUI:F80BCB*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:001639*
- ID_OUI_FROM_DATABASE=Ubiquam Co., Ltd.
+OUI:24EA40*
+ ID_OUI_FROM_DATABASE=Helmholz GmbH & Co. KG
 
-OUI:183919*
- ID_OUI_FROM_DATABASE=Unicoi Systems
+OUI:9CC8AE*
+ ID_OUI_FROM_DATABASE=Becton, Dickinson  and Company
 
-OUI:90A46A*
- ID_OUI_FROM_DATABASE=SISNET CO., LTD
+OUI:B0359F*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:14E7C8*
- ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
+OUI:84A9C4*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:280DFC*
- ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
+OUI:A0F479*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:100501*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
+
+OUI:046E02*
+ ID_OUI_FROM_DATABASE=OpenRTLS Group
+
+OUI:000FF4*
+ ID_OUI_FROM_DATABASE=Guntermann & Drunck GmbH
+
+OUI:70DB98*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:A43D78*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+
+OUI:EC01EE*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+
+OUI:B83765*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+
+OUI:4448C1*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
+
+OUI:FC539E*
+ ID_OUI_FROM_DATABASE=Shanghai Wind Technologies Co.,Ltd
 
-OUI:0015C1*
- ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
+OUI:9CAF6F*
+ ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
 
-OUI:0019C5*
- ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
+OUI:907065*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:ACA213*
- ID_OUI_FROM_DATABASE=Shenzhen Bilian electronic CO.,LTD
+OUI:9C061B*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:38F8CA*
- ID_OUI_FROM_DATABASE=OWIN Inc.
+OUI:A08E78*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:54D272*
- ID_OUI_FROM_DATABASE=Nuki Home Solutions GmbH
+OUI:B8FFB3*
+ ID_OUI_FROM_DATABASE=MitraStar Technology Corp.
 
-OUI:9CA3A9*
- ID_OUI_FROM_DATABASE=Guangzhou Juan Optical and Electronical Tech Joint Stock Co., Ltd
+OUI:E0D55E*
+ ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
 
-OUI:1100AA*
- ID_OUI_FROM_DATABASE=Private
+OUI:C4576E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:002067*
- ID_OUI_FROM_DATABASE=Private
+OUI:90F1AA*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:9893CC*
- ID_OUI_FROM_DATABASE=LG ELECTRONICS INC
+OUI:78BDBC*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:3CCD93*
- ID_OUI_FROM_DATABASE=LG ELECTRONICS INC
+OUI:D47AE2*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:583F54*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:20F452*
+ ID_OUI_FROM_DATABASE=Shanghai IUV Software Development Co. Ltd
 
-OUI:001C62*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:88D274*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:002483*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:986DC8*
+ ID_OUI_FROM_DATABASE=TOSHIBA MITSUBISHI-ELECTRIC INDUSTRIAL SYSTEMS CORPORATION
 
-OUI:E417D8*
- ID_OUI_FROM_DATABASE=8BITDO TECHNOLOGY HK LIMITED
+OUI:0040AA*
+ ID_OUI_FROM_DATABASE=Valmet Automation
 
-OUI:40B0FA*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:982DBA*
+ ID_OUI_FROM_DATABASE=Fibergate Inc.
 
-OUI:A09169*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:0080C2*
+ ID_OUI_FROM_DATABASE=IEEE 802.1 Working Group
 
-OUI:286C07*
- ID_OUI_FROM_DATABASE=XIAOMI Electronics,CO.,LTD
+OUI:68A40E*
+ ID_OUI_FROM_DATABASE=BSH Hausgeräte GmbH
 
-OUI:84D931*
- ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+OUI:847933*
+ ID_OUI_FROM_DATABASE=profichip GmbH
 
-OUI:34FCEF*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:A0C9A0*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
 
-OUI:485929*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:001CC3*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:505527*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:641269*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:98D6F7*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:287AEE*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:A8922C*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:FC51A4*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:44DC91*
- ID_OUI_FROM_DATABASE=PLANEX COMMUNICATIONS INC.
+OUI:38700C*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:9CD332*
- ID_OUI_FROM_DATABASE=PLC Technology Ltd
+OUI:A41588*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:94D723*
- ID_OUI_FROM_DATABASE=Shanghai DareGlobal Technologies Co.,Ltd
+OUI:B81619*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:A89DD2*
- ID_OUI_FROM_DATABASE=Shanghai DareGlobal Technologies Co.,Ltd
+OUI:B077AC*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:184A6F*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
+OUI:145BD1*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:A0F3E4*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent IPD
+OUI:6CC1D2*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:002105*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent IPD
+OUI:D82522*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:000772*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
+OUI:70B14E*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:F06BCA*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:14D4FE*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:3423BA*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
+OUI:707630*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:D022BE*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
+OUI:90C792*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:D02544*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
+OUI:789684*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:BC20A4*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:CC65AD*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:14F42A*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:986B3D*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:BC851F*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:5CE30E*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:B85E7B*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:7823AE*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:C462EA*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F80BBE*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0023D6*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:DC4517*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:002491*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:74F612*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001B98*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:74E7C6*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:44F459*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:0025F2*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:34C3AC*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:0015A8*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:94D771*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:000E5C*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:4C3C16*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:000CE5*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:9401C2*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:0004BD*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:B43A28*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:00E06F*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:A8C83A*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:386BBB*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:849FB5*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:0015CF*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:D0C1B1*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:001DCF*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:F008F1*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:001DD5*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:782079*
- ID_OUI_FROM_DATABASE=ID Tech
+OUI:001DD0*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:98234E*
- ID_OUI_FROM_DATABASE=Micromedia AG
+OUI:5C571A*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:E80036*
- ID_OUI_FROM_DATABASE=Befs co,. ltd
+OUI:002374*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:24590B*
- ID_OUI_FROM_DATABASE=White Sky Inc. Limited
+OUI:002641*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:10C60C*
- ID_OUI_FROM_DATABASE=Domino UK Ltd
+OUI:0026BA*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:3842A6*
- ID_OUI_FROM_DATABASE=Ingenieurbuero Stahlkopf
+OUI:002180*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:E866C4*
- ID_OUI_FROM_DATABASE=Diamanti
+OUI:0019C0*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:78471D*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:0014E8*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:3816D1*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:0019A6*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:004A77*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:001700*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:D48890*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:901ACA*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:002566*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:E8ED05*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:00265F*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:2C7E81*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001628*
- ID_OUI_FROM_DATABASE=Magicard Ltd
+OUI:84C0EF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:E4C801*
- ID_OUI_FROM_DATABASE=BLU Products Inc
+OUI:447F77*
+ ID_OUI_FROM_DATABASE=Connected Home
 
-OUI:00A6CA*
+OUI:009AD2*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:9C7DA3*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
-
-OUI:F02FA7*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:7C1C68*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:883FD3*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:745427*
+ ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
 
-OUI:A04E01*
- ID_OUI_FROM_DATABASE=CENTRAL ENGINEERING co.,ltd.
+OUI:F40E83*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:245CBF*
- ID_OUI_FROM_DATABASE=NCSE
+OUI:7C8BCA*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:84CD62*
- ID_OUI_FROM_DATABASE=ShenZhen IDWELL Technology CO.,Ltd
+OUI:88B111*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:DC9FDB*
- ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
+OUI:D8F1F0*
+ ID_OUI_FROM_DATABASE=Pepxim International Limited
 
-OUI:B0958E*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:0019F0*
+ ID_OUI_FROM_DATABASE=UNIONMAN TECHNOLOGY CO.,LTD
 
-OUI:001A39*
- ID_OUI_FROM_DATABASE=Merten GmbH&CoKG
+OUI:54D751*
+ ID_OUI_FROM_DATABASE=Proximus
 
-OUI:007B18*
- ID_OUI_FROM_DATABASE=SENTRY Co., LTD.
+OUI:506E92*
+ ID_OUI_FROM_DATABASE=Innocent Technology Co., Ltd.
 
-OUI:144D67*
- ID_OUI_FROM_DATABASE=Zioncom Electronics (Shenzhen) Ltd.
+OUI:CC4B73*
+ ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
 
-OUI:34F39A*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:900A1A*
+ ID_OUI_FROM_DATABASE=Taicang T&W Electronics
 
-OUI:20A8B9*
- ID_OUI_FROM_DATABASE=Siemens
+OUI:CC03D9*
+ ID_OUI_FROM_DATABASE=Cisco Meraki
 
-OUI:C81B5C*
- ID_OUI_FROM_DATABASE=BCTech
+OUI:BCADAB*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:3C2AF4*
- ID_OUI_FROM_DATABASE=Brother Industries, LTD.
+OUI:506184*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:20719E*
- ID_OUI_FROM_DATABASE=SF Technology Co.,Ltd
+OUI:F81547*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:E0DDC0*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+OUI:A01290*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:982F3C*
- ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
+OUI:3C3A73*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:380DD4*
- ID_OUI_FROM_DATABASE=Primax Electronics Ltd.
+OUI:B4A95A*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:98FDB4*
- ID_OUI_FROM_DATABASE=Primax Electronics Ltd.
+OUI:6CB227*
+ ID_OUI_FROM_DATABASE=Sony Video & Sound Products Inc.
 
-OUI:00157D*
- ID_OUI_FROM_DATABASE=POSDATA
+OUI:60271C*
+ ID_OUI_FROM_DATABASE=VIDEOR E. Hartig GmbH
 
-OUI:F8E61A*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:C46699*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:888322*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:FC1A11*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:84B541*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:E0DDC0*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:18DC56*
- ID_OUI_FROM_DATABASE=Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd
+OUI:886AB1*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:001F46*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:18E29F*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:001F0A*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:F81D90*
+ ID_OUI_FROM_DATABASE=Solidwintech
 
-OUI:00130A*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:0823B2*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:001E7E*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:6091F3*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:001C9C*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:BC2F3D*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:000CF8*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:C4ABB2*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:000CF7*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:C8DB26*
+ ID_OUI_FROM_DATABASE=Logitech
 
-OUI:001E1F*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:4473D6*
+ ID_OUI_FROM_DATABASE=Logitech
 
-OUI:001C17*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:70F35A*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:00182E*
- ID_OUI_FROM_DATABASE=XStreamHD
+OUI:EC42B4*
+ ID_OUI_FROM_DATABASE=ADC Corporation
 
-OUI:50016B*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:10CDB6*
+ ID_OUI_FROM_DATABASE=Essential Products, Inc.
 
-OUI:58986F*
- ID_OUI_FROM_DATABASE=Revolution Display
+OUI:08306B*
+ ID_OUI_FROM_DATABASE=Palo Alto Networks
 
-OUI:28AC67*
- ID_OUI_FROM_DATABASE=Mach Power, Rappresentanze Internazionali s.r.l.
+OUI:6CF9D2*
+ ID_OUI_FROM_DATABASE=Chengdu Goods for the Road Electronic Technology C
 
-OUI:B0B28F*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:641666*
+ ID_OUI_FROM_DATABASE=Nest Labs Inc.
 
-OUI:DC1A01*
- ID_OUI_FROM_DATABASE=Ecoliv Technology ( Shenzhen ) Ltd.
+OUI:3817E1*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:7CFE90*
- ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
+OUI:94147A*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:0002C9*
- ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
+OUI:74D0DC*
+ ID_OUI_FROM_DATABASE=Ericsson AB
 
-OUI:D05FB8*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:88A3CC*
+ ID_OUI_FROM_DATABASE=Amatis Controls
 
-OUI:C4BE84*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:8C9F3B*
+ ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
 
-OUI:78A504*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:404229*
+ ID_OUI_FROM_DATABASE=Layer3TV, Inc
 
-OUI:7C669D*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:B090D4*
+ ID_OUI_FROM_DATABASE=Shenzhen Hoin Internet Technology Co., Ltd
 
-OUI:D03972*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:348F27*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:E0E5CF*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:001D2E*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:7CEC79*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:689234*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:74D6EA*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:044FAA*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:0017EB*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:0025C4*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:883314*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:38FF36*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:84DD20*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:2C5D93*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:1C4593*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:543D37*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:5C6B32*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:C4108A*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:0017E4*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:D463C6*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:D03761*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:00A050*
+ ID_OUI_FROM_DATABASE=CYPRESS SEMICONDUCTOR
 
-OUI:0024BA*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:54666C*
+ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
 
-OUI:0022A5*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:A44CC8*
+ ID_OUI_FROM_DATABASE=Dell Inc.
 
-OUI:0021BA*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:0840F3*
+ ID_OUI_FROM_DATABASE=Tenda Technology Co.,Ltd.Dongguan branch
 
-OUI:001833*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:103034*
+ ID_OUI_FROM_DATABASE=Cara Systems
 
-OUI:D8952F*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:FC8B97*
+ ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
 
-OUI:649C8E*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:2CAB25*
+ ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
 
-OUI:F4FC32*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:AC6E1A*
+ ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
 
-OUI:74DAEA*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:24A534*
+ ID_OUI_FROM_DATABASE=SynTrust Tech International Ltd.
 
-OUI:04A316*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:F844E3*
+ ID_OUI_FROM_DATABASE=Taicang T&W Electronics
 
-OUI:98072D*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:001F92*
+ ID_OUI_FROM_DATABASE=Avigilon Corporation
 
-OUI:001AB6*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:0C8FFF*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:C8A030*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:54B121*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:34B1F7*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:786256*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:C4EDBA*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:A80C63*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:A40DBC*
- ID_OUI_FROM_DATABASE=Xiamen Intretech Inc.
+OUI:5CC307*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:EC8EAE*
- ID_OUI_FROM_DATABASE=Nagravision SA
+OUI:08A8A1*
+ ID_OUI_FROM_DATABASE=Cyclotronics Power Concepts, Inc
 
-OUI:606405*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:887A31*
+ ID_OUI_FROM_DATABASE=Velankani Electronics Pvt. Ltd.
 
-OUI:708BCD*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:8C0F6F*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
-OUI:001A21*
- ID_OUI_FROM_DATABASE=Brookhuis Applied Technologies BV
+OUI:283545*
+ ID_OUI_FROM_DATABASE=SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD
 
-OUI:00A00E*
- ID_OUI_FROM_DATABASE=NetScout Systems, Inc.
+OUI:A82BB5*
+ ID_OUI_FROM_DATABASE=Edgecore Networks Corporation
 
-OUI:1C330E*
- ID_OUI_FROM_DATABASE=PernixData
+OUI:88365F*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:345760*
- ID_OUI_FROM_DATABASE=MitraStar Technology Corp.
+OUI:0015FF*
+ ID_OUI_FROM_DATABASE=Novatel Wireless Solutions, Inc.
 
-OUI:343DC4*
- ID_OUI_FROM_DATABASE=BUFFALO.INC
+OUI:788C4D*
+ ID_OUI_FROM_DATABASE=Indyme Solutions, LLC
 
-OUI:6CEFC6*
- ID_OUI_FROM_DATABASE=SHENZHEN TWOWING TECHNOLOGIES CO.,LTD.
+OUI:A8B2DA*
+ ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
-OUI:986B3D*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:0CB937*
+ ID_OUI_FROM_DATABASE=Ubee Interactive Co., Limited
 
-OUI:CC65AD*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:2880A2*
+ ID_OUI_FROM_DATABASE=Novatel Wireless Solutions, Inc.
 
-OUI:789684*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:0CB459*
+ ID_OUI_FROM_DATABASE=Marketech International Corp.
 
-OUI:90C792*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:84AA9C*
+ ID_OUI_FROM_DATABASE=MitraStar Technology Corp.
 
-OUI:0015CF*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:0C4B54*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:386BBB*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:C47154*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:00E06F*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:44EA4B*
+ ID_OUI_FROM_DATABASE=Actlas Inc.
 
-OUI:0004BD*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:5C6984*
+ ID_OUI_FROM_DATABASE=NUVICO
 
-OUI:5C571A*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:F86EEE*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001DD0*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:E4FB5D*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001DD5*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:5C546D*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001DCF*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:508F4C*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:E8ED05*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:0027F8*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:901ACA*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:50EB1A*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:002A10*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:CC4E24*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:74E7C6*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:889471*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:74F612*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:D81FCC*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:DC4517*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:002067*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:F80BBE*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:0060DF*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:6CC1D2*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:000533*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:145BD1*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:00223F*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:B077AC*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:001B2F*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:B81619*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:E091F5*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:A41588*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:744401*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:38700C*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:E0469A*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:FC51A4*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:08BD43*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:287AEE*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:C40415*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:641269*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:9CD36D*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:001CC3*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:20E52A*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:14D4FE*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:4494FC*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:70B14E*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:008EF2*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:D82522*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:B0B98A*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:707630*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:1100AA*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:000CE5*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:1C965A*
+ ID_OUI_FROM_DATABASE=Weifang GoerTek Technology Co.,Ltd.
 
-OUI:000E5C*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:104E89*
+ ID_OUI_FROM_DATABASE=Garmin International
 
-OUI:0015A8*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:30053F*
+ ID_OUI_FROM_DATABASE=JTI Co.,Ltd.
 
-OUI:001700*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:0050B5*
+ ID_OUI_FROM_DATABASE=FICHET SECURITE ELECTRONIQUE
 
-OUI:0019A6*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:04209A*
+ ID_OUI_FROM_DATABASE=Panasonic Corporation AVC Networks Company
 
-OUI:0014E8*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:8CC121*
+ ID_OUI_FROM_DATABASE=Panasonic Corporation AVC Networks Company
 
-OUI:002180*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:20C6EB*
+ ID_OUI_FROM_DATABASE=Panasonic Corporation AVC Networks Company
 
-OUI:0026BA*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:B0350B*
+ ID_OUI_FROM_DATABASE=MOBIWIRE MOBILES (NINGBO) CO.,LTD
 
-OUI:002641*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:28A6AC*
+ ID_OUI_FROM_DATABASE=seca gmbh & co. kg
 
-OUI:002374*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:00054F*
+ ID_OUI_FROM_DATABASE=Garmin International
 
-OUI:0025F2*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:40CE24*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:0019C0*
- ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:24C42F*
+ ID_OUI_FROM_DATABASE=Philips Lifeline
 
-OUI:886AB1*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+OUI:E048D3*
+ ID_OUI_FROM_DATABASE=MOBIWIRE MOBILES (NINGBO) CO.,LTD
 
-OUI:44D6E1*
- ID_OUI_FROM_DATABASE=Snuza International Pty. Ltd.
+OUI:B8EE0E*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:0015B9*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:78886D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:001DF6*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:A85C2C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:ECE09B*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:00DB70*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:606BBD*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:181456*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:0000F0*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:E4EC10*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:4844F7*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:9C4A7B*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:DC7144*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
+OUI:386EA2*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:A00BBA*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
+OUI:58B42D*
+ ID_OUI_FROM_DATABASE=YSTen Technology Co.,Ltd
 
-OUI:1C5A3E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:48EC5B*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:F47B5E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:D86162*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
-OUI:C44619*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:80615F*
+ ID_OUI_FROM_DATABASE=Beijing Sinead Technology Co., Ltd.
 
-OUI:F0F002*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:0009BC*
+ ID_OUI_FROM_DATABASE=Utility, Inc
 
-OUI:889FFA*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:0016ED*
+ ID_OUI_FROM_DATABASE=Utility, Inc
 
-OUI:5CAC4C*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:74F661*
+ ID_OUI_FROM_DATABASE=Schneider Electric Fire & Security Oy
 
-OUI:18F46A*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:245FDF*
+ ID_OUI_FROM_DATABASE=KYOCERA CORPORATION
 
-OUI:3859F9*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:885DFB*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:BC8556*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:608CE6*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:9C2A70*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:8CD2E9*
+ ID_OUI_FROM_DATABASE=YOKOTE SEIKO CO., LTD.
 
-OUI:F82FA8*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:186024*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:0CEEE6*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:74F91A*
+ ID_OUI_FROM_DATABASE=Onface
 
-OUI:0C6076*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:706BB9*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:90FBA6*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:6CC147*
+ ID_OUI_FROM_DATABASE=Xiamen Hanin Electronic Technology Co., Ltd
 
-OUI:00197D*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:8CFEB4*
+ ID_OUI_FROM_DATABASE=VSOONTECH ELECTRONICS CO., LIMITED
 
-OUI:001C26*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:CCF957*
+ ID_OUI_FROM_DATABASE=u-blox AG
 
-OUI:9CAD97*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:74373B*
+ ID_OUI_FROM_DATABASE=UNINET Co.,Ltd.
 
-OUI:2C8158*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:7C6456*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:142D27*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:448F17*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co., Ltd. ARTIK
 
-OUI:843DC6*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:0076B1*
+ ID_OUI_FROM_DATABASE=Somfy-Protect By Myfox SAS
 
-OUI:407C7D*
- ID_OUI_FROM_DATABASE=Nokia
+OUI:D0666D*
+ ID_OUI_FROM_DATABASE=Shenzhen Bus-Lan Technology Co., Ltd.
 
-OUI:BC52B4*
- ID_OUI_FROM_DATABASE=Nokia
+OUI:B8D94D*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:FC2FAA*
- ID_OUI_FROM_DATABASE=Nokia
+OUI:10FCB6*
+ ID_OUI_FROM_DATABASE=mirusystems CO.,LTD
 
-OUI:903AA0*
- ID_OUI_FROM_DATABASE=Nokia
+OUI:04D6AA*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS(THAILAND)
 
-OUI:702526*
- ID_OUI_FROM_DATABASE=Nokia
+OUI:08661F*
+ ID_OUI_FROM_DATABASE=Palo Alto Networks
 
-OUI:38F7B2*
- ID_OUI_FROM_DATABASE=SEOJUN ELECTRIC
+OUI:0C5842*
+ ID_OUI_FROM_DATABASE=DME Micro
 
-OUI:7802B7*
- ID_OUI_FROM_DATABASE=ShenZhen Ultra Easy Technology CO.,LTD
+OUI:A468BC*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:88AD43*
- ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
+OUI:80C755*
+ ID_OUI_FROM_DATABASE=Panasonic Appliances Company
 
-OUI:E4186B*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:A0648F*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
 
-OUI:6C71BD*
- ID_OUI_FROM_DATABASE=EZELINK TELECOM
+OUI:D467E7*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:842519*
- ID_OUI_FROM_DATABASE=Samsung Electronics
+OUI:34BF90*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:88DEA9*
- ID_OUI_FROM_DATABASE=Roku, Inc.
+OUI:F8C96C*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:FC83C6*
- ID_OUI_FROM_DATABASE=N-Radio Technologies Co., Ltd.
+OUI:48555F*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:B4E782*
- ID_OUI_FROM_DATABASE=Vivalnk
+OUI:D4AD2D*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:008701*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:D00492*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:FC4203*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:809FAB*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:1C232C*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:9C88AD*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:08010F*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+OUI:48F97C*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:CCA260*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+OUI:105887*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:0015FF*
- ID_OUI_FROM_DATABASE=Novatel Wireless Solutions, Inc.
+OUI:5CE3B6*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:203CAE*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:04C1B9*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
 
-OUI:748D08*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:04848A*
+ ID_OUI_FROM_DATABASE=7INOVA TECHNOLOGY LIMITED
 
-OUI:00D78F*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:E81DA8*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
 
-OUI:A03BE3*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:3CC079*
+ ID_OUI_FROM_DATABASE=Shenzhen One-Nine Intelligent Electronic Science and Technology Co., Ltd
 
-OUI:18E29F*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+OUI:746EE4*
+ ID_OUI_FROM_DATABASE=Asia Vital Components Co.,Ltd.
 
-OUI:886B0F*
- ID_OUI_FROM_DATABASE=Bluegiga Technologies OY
+OUI:F44C70*
+ ID_OUI_FROM_DATABASE=Skyworth Digital Technology(Shenzhen) Co.,Ltd
 
-OUI:001438*
- ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
+OUI:98C5DB*
+ ID_OUI_FROM_DATABASE=Ericsson AB
 
-OUI:98541B*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:043A0D*
+ ID_OUI_FROM_DATABASE=SM Optics S.r.l.
 
-OUI:CC61E5*
- ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:9CE063*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:404E36*
- ID_OUI_FROM_DATABASE=HTC Corporation
+OUI:9C9C40*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
 
-OUI:9CB206*
- ID_OUI_FROM_DATABASE=PROCENTEC
+OUI:D490E0*
+ ID_OUI_FROM_DATABASE=Topcon Electronics GmbH & Co. KG
 
-OUI:1C40E8*
- ID_OUI_FROM_DATABASE=SHENZHEN PROGRESS&WIN TECHNOLOGY CO.,LTD
+OUI:E8361D*
+ ID_OUI_FROM_DATABASE=Sense Labs, Inc.
 
-OUI:C8D3FF*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:EC7D11*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
 OUI:2C3996*
  ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
@@ -61397,9 +67835,6 @@ OUI:7081EB*
 OUI:086698*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:002926*
- ID_OUI_FROM_DATABASE=Applied Optoelectronics, Inc Taiwan Branch
-
 OUI:2CFD37*
  ID_OUI_FROM_DATABASE=Blue Calypso, Inc.
 
@@ -61445,9 +67880,6 @@ OUI:1CA770*
 OUI:C42F90*
  ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
 
-OUI:9C5D12*
- ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
-
 OUI:A42BB0*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
@@ -61616,15 +68048,9 @@ OUI:20906F*
 OUI:1C7839*
  ID_OUI_FROM_DATABASE=Shenzhen Tencent Computer System Co., Ltd.
 
-OUI:D837BE*
- ID_OUI_FROM_DATABASE=Shanghai Gongjing Telecom Technology Co,LTD
-
 OUI:A4516F*
  ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
 
-OUI:FC64BA*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
-
 OUI:246081*
  ID_OUI_FROM_DATABASE=razberi technologies
 
@@ -61637,9 +68063,6 @@ OUI:9060F1*
 OUI:EC26CA*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
-OUI:A09347*
- ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
-
 OUI:2C088C*
  ID_OUI_FROM_DATABASE=HUMAX Co., Ltd.
 
@@ -61670,18 +68093,6 @@ OUI:0C96BF*
 OUI:9CC172*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:0014C9*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
-
-OUI:00010F*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
-
-OUI:080088*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
-
-OUI:00051E*
- ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
-
 OUI:384608*
  ID_OUI_FROM_DATABASE=zte corporation
 
@@ -61697,12 +68108,6 @@ OUI:08181A*
 OUI:002512*
  ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:CCF954*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:703018*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
 OUI:B0A37E*
  ID_OUI_FROM_DATABASE=Qingdao Haier Telecom Co.,Ltd
 
@@ -61766,30 +68171,6 @@ OUI:84A8E4*
 OUI:202BC1*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:3475C7*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:6CFA58*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:64A7DD*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:646A52*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:F873A2*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:64C354*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:B4B017*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
-OUI:581626*
- ID_OUI_FROM_DATABASE=Avaya Inc
-
 OUI:741BB2*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
@@ -61877,21 +68258,6 @@ OUI:9017AC*
 OUI:94049C*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:C46AB7*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
-
-OUI:68DFDD*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
-
-OUI:64B473*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
-
-OUI:7451BA*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
-
-OUI:3480B3*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
-
 OUI:5006AB*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -62555,9 +68921,6 @@ OUI:9CB6D0*
 OUI:D0C0BF*
  ID_OUI_FROM_DATABASE=Actions Microelectronics Co., Ltd
 
-OUI:94F665*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
-
 OUI:E04B45*
  ID_OUI_FROM_DATABASE=Hi-P Electronics Pte Ltd
 
@@ -62735,9 +69098,6 @@ OUI:887033*
 OUI:8C7967*
  ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:D083D4*
- ID_OUI_FROM_DATABASE=XTel ApS
-
 OUI:78F944*
  ID_OUI_FROM_DATABASE=Private
 
@@ -62801,9 +69161,6 @@ OUI:6CF5E8*
 OUI:70FF5C*
  ID_OUI_FROM_DATABASE=Cheerzing Communication(Xiamen)Technology Co.,Ltd
 
-OUI:E0107F*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
-
 OUI:08115E*
  ID_OUI_FROM_DATABASE=Bitel Co., Ltd.
 
@@ -62852,9 +69209,6 @@ OUI:D4EC86*
 OUI:20A99B*
  ID_OUI_FROM_DATABASE=Microsoft Corporation
 
-OUI:6C7660*
- ID_OUI_FROM_DATABASE=KYOCERA Corporation
-
 OUI:A0A3E2*
  ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
 
@@ -62897,9 +69251,6 @@ OUI:7CB177*
 OUI:8C5D60*
  ID_OUI_FROM_DATABASE=UCI Corporation Co.,Ltd.
 
-OUI:104B46*
- ID_OUI_FROM_DATABASE=Mitsubishi Electric Corporation
-
 OUI:4C0BBE*
  ID_OUI_FROM_DATABASE=Microsoft
 
@@ -62975,9 +69326,6 @@ OUI:A8329A*
 OUI:B40AC6*
  ID_OUI_FROM_DATABASE=DEXON Systems Ltd.
 
-OUI:480C49*
- ID_OUI_FROM_DATABASE=NAKAYO TELECOMMUNICATIONS,INC
-
 OUI:5CB8CB*
  ID_OUI_FROM_DATABASE=Allis Communications
 
@@ -62987,9 +69335,6 @@ OUI:E85D6B*
 OUI:8C3357*
  ID_OUI_FROM_DATABASE=HiteVision Digital Media Technology Co.,Ltd.
 
-OUI:506787*
- ID_OUI_FROM_DATABASE=iTellus
-
 OUI:F4D261*
  ID_OUI_FROM_DATABASE=SEMOCON Co., Ltd
 
@@ -62999,9 +69344,6 @@ OUI:D05AF1*
 OUI:481A84*
  ID_OUI_FROM_DATABASE=Pointer Telocation Ltd
 
-OUI:E4F4C6*
- ID_OUI_FROM_DATABASE=NETGEAR
-
 OUI:DC663A*
  ID_OUI_FROM_DATABASE=Apacer Technology Inc.
 
@@ -63137,9 +69479,6 @@ OUI:4CF45B*
 OUI:B06971*
  ID_OUI_FROM_DATABASE=DEI Sales, Inc.
 
-OUI:58493B*
- ID_OUI_FROM_DATABASE=Palo Alto Networks
-
 OUI:580528*
  ID_OUI_FROM_DATABASE=LABRIS NETWORKS
 
@@ -63182,9 +69521,6 @@ OUI:90DFB7*
 OUI:B843E4*
  ID_OUI_FROM_DATABASE=Vlatacom
 
-OUI:8425A4*
- ID_OUI_FROM_DATABASE=Tariox Limited
-
 OUI:E07F53*
  ID_OUI_FROM_DATABASE=TECHBOARD SRL
 
@@ -63212,12 +69548,6 @@ OUI:D86194*
 OUI:589CFC*
  ID_OUI_FROM_DATABASE=FreeBSD Foundation
 
-OUI:602103*
- ID_OUI_FROM_DATABASE=STCUBE.INC
-
-OUI:085DDD*
- ID_OUI_FROM_DATABASE=Mercury Corporation
-
 OUI:98349D*
  ID_OUI_FROM_DATABASE=Krauss Maffei Technologies GmbH
 
@@ -63488,9 +69818,6 @@ OUI:C0A39E*
 OUI:088E4F*
  ID_OUI_FROM_DATABASE=SF Software Solutions
 
-OUI:E8EADA*
- ID_OUI_FROM_DATABASE=Denkovi Assembly Electroncs LTD
-
 OUI:DCAE04*
  ID_OUI_FROM_DATABASE=CELOXICA Ltd
 
@@ -63587,9 +69914,6 @@ OUI:90DA4E*
 OUI:7038B4*
  ID_OUI_FROM_DATABASE=Low Tech Solutions
 
-OUI:AC1826*
- ID_OUI_FROM_DATABASE=SEIKO EPSON CORPORATION
-
 OUI:4C804F*
  ID_OUI_FROM_DATABASE=Armstrong Monitoring Corp
 
@@ -63632,9 +69956,6 @@ OUI:D8DCE9*
 OUI:54112F*
  ID_OUI_FROM_DATABASE=Sulzer Pump Solutions Finland Oy
 
-OUI:E0DCA0*
- ID_OUI_FROM_DATABASE=Siemens Electrical Apparatus Ltd., Suzhou Chengdu Branch
-
 OUI:4C55B8*
  ID_OUI_FROM_DATABASE=Turkcell Teknoloji
 
@@ -63881,9 +70202,6 @@ OUI:20B5C6*
 OUI:AC3CB4*
  ID_OUI_FROM_DATABASE=Nilan A/S
 
-OUI:A830AD*
- ID_OUI_FROM_DATABASE=Wei Fang Goertek Electronics Co.,Ltd
-
 OUI:8007A2*
  ID_OUI_FROM_DATABASE=Esson Technology Inc.
 
@@ -64031,9 +70349,6 @@ OUI:2CEDEB*
 OUI:381C4A*
  ID_OUI_FROM_DATABASE=SIMCom Wireless Solutions Co.,Ltd.
 
-OUI:C8DE51*
- ID_OUI_FROM_DATABASE=Integra Networks, Inc.
-
 OUI:901EDD*
  ID_OUI_FROM_DATABASE=GREAT COMPUTER CORPORATION
 
@@ -64154,9 +70469,6 @@ OUI:64F242*
 OUI:60F281*
  ID_OUI_FROM_DATABASE=TRANWO TECHNOLOGY CO., LTD.
 
-OUI:B0E892*
- ID_OUI_FROM_DATABASE=SEIKO EPSON CORPORATION
-
 OUI:642400*
  ID_OUI_FROM_DATABASE=Xorcom Ltd.
 
@@ -64229,9 +70541,6 @@ OUI:78BEBD*
 OUI:3C9174*
  ID_OUI_FROM_DATABASE=ALONG COMMUNICATION TECHNOLOGY
 
-OUI:B8E937*
- ID_OUI_FROM_DATABASE=Sonos, Inc.
-
 OUI:E8D0FA*
  ID_OUI_FROM_DATABASE=MKS Instruments Deutschland GmbH
 
@@ -64349,9 +70658,6 @@ OUI:00E8AB*
 OUI:18421D*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:78617C*
- ID_OUI_FROM_DATABASE=MITSUMI ELECTRIC CO.,LTD
-
 OUI:C401B1*
  ID_OUI_FROM_DATABASE=SeekTech INC
 
@@ -64685,9 +70991,6 @@ OUI:D4F63F*
 OUI:4C0289*
  ID_OUI_FROM_DATABASE=LEX COMPUTECH CO., LTD
 
-OUI:C0E54E*
- ID_OUI_FROM_DATABASE=DENX Computer Systems GmbH
-
 OUI:E435FB*
  ID_OUI_FROM_DATABASE=Sabre Technology (Hull) Ltd
 
@@ -64844,9 +71147,6 @@ OUI:DCA6BD*
 OUI:58E808*
  ID_OUI_FROM_DATABASE=AUTONICS CORPORATION
 
-OUI:B8C716*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
-
 OUI:8058C5*
  ID_OUI_FROM_DATABASE=NovaTec Kommunikationstechnik GmbH
 
@@ -64982,9 +71282,6 @@ OUI:C4D489*
 OUI:1C7C11*
  ID_OUI_FROM_DATABASE=EID
 
-OUI:F43E61*
- ID_OUI_FROM_DATABASE=Shenzhen Gongjin Electronics Co., Ltd
-
 OUI:B0B32B*
  ID_OUI_FROM_DATABASE=Slican Sp. z o.o.
 
@@ -65084,9 +71381,6 @@ OUI:5C9AD8*
 OUI:144C1A*
  ID_OUI_FROM_DATABASE=Max Communication GmbH
 
-OUI:FCE557*
- ID_OUI_FROM_DATABASE=Nokia Corporation
-
 OUI:BC6E76*
  ID_OUI_FROM_DATABASE=Green Energy Options Ltd
 
@@ -65201,18 +71495,12 @@ OUI:7076F0*
 OUI:48C8B6*
  ID_OUI_FROM_DATABASE=SysTec GmbH
 
-OUI:303855*
- ID_OUI_FROM_DATABASE=Nokia Corporation
-
 OUI:9C4563*
  ID_OUI_FROM_DATABASE=DIMEP Sistemas
 
 OUI:E42771*
  ID_OUI_FROM_DATABASE=Smartlabs
 
-OUI:C4EEF5*
- ID_OUI_FROM_DATABASE=Oclaro, Inc.
-
 OUI:0876FF*
  ID_OUI_FROM_DATABASE=Thomson Telecom Belgium
 
@@ -65240,9 +71528,6 @@ OUI:64E8E6*
 OUI:34A183*
  ID_OUI_FROM_DATABASE=AWare, Inc
 
-OUI:740ABC*
- ID_OUI_FROM_DATABASE=JSJS Designs (Europe) Limited
-
 OUI:588D09*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
@@ -65426,9 +71711,6 @@ OUI:F0BDF1*
 OUI:288915*
  ID_OUI_FROM_DATABASE=CashGuard Sverige AB
 
-OUI:180675*
- ID_OUI_FROM_DATABASE=DILAX Intelcom GmbH
-
 OUI:40618E*
  ID_OUI_FROM_DATABASE=Stella-Green Co
 
@@ -65516,9 +71798,6 @@ OUI:0CC9C6*
 OUI:B45861*
  ID_OUI_FROM_DATABASE=CRemote, LLC
 
-OUI:AC6706*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
-
 OUI:B8653B*
  ID_OUI_FROM_DATABASE=Bolymin, Inc.
 
@@ -65930,9 +72209,6 @@ OUI:0025A3*
 OUI:00259C*
  ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC
 
-OUI:002590*
- ID_OUI_FROM_DATABASE=Super Micro Computer, Inc.
-
 OUI:002580*
  ID_OUI_FROM_DATABASE=Equipson S.A.
 
@@ -66431,9 +72707,6 @@ OUI:002377*
 OUI:002371*
  ID_OUI_FROM_DATABASE=SOAM Systel
 
-OUI:002365*
- ID_OUI_FROM_DATABASE=ELKA-Elektronik GmbH
-
 OUI:00236A*
  ID_OUI_FROM_DATABASE=SmartRG Inc
 
@@ -66629,9 +72902,6 @@ OUI:0021B8*
 OUI:0021B1*
  ID_OUI_FROM_DATABASE=DIGITAL SOLUTIONS LTD
 
-OUI:001F82*
- ID_OUI_FROM_DATABASE=Cal-Comp Electronics & Communications Co., Ltd
-
 OUI:001F7D*
  ID_OUI_FROM_DATABASE=embedded wireless GmbH
 
@@ -66689,9 +72959,6 @@ OUI:001FAA*
 OUI:001FA5*
  ID_OUI_FROM_DATABASE=Blue-White Industries
 
-OUI:001FA4*
- ID_OUI_FROM_DATABASE=ShenZhen Gongjin Electronics Co.,Ltd
-
 OUI:001FA0*
  ID_OUI_FROM_DATABASE=A10 Networks
 
@@ -66905,9 +73172,6 @@ OUI:001D4D*
 OUI:001D49*
  ID_OUI_FROM_DATABASE=Innovation Wireless Inc.
 
-OUI:001D44*
- ID_OUI_FROM_DATABASE=KROHNE Messtechnik GmbH
-
 OUI:001D3D*
  ID_OUI_FROM_DATABASE=Avidyne Corporation
 
@@ -67268,9 +73532,6 @@ OUI:001BCB*
 OUI:001BC4*
  ID_OUI_FROM_DATABASE=Ultratec, Inc.
 
-OUI:001BB5*
- ID_OUI_FROM_DATABASE=ZF Electronics GmbH
-
 OUI:001BAE*
  ID_OUI_FROM_DATABASE=Micro Control Systems, Inc
 
@@ -67382,9 +73643,6 @@ OUI:0019AA*
 OUI:0019AF*
  ID_OUI_FROM_DATABASE=Rigol Technologies, Inc.
 
-OUI:001992*
- ID_OUI_FROM_DATABASE=ADTRAN INC.
-
 OUI:001997*
  ID_OUI_FROM_DATABASE=Soft Device Sdn Bhd
 
@@ -67445,9 +73703,6 @@ OUI:00198B*
 OUI:00198D*
  ID_OUI_FROM_DATABASE=Ocean Optics, Inc.
 
-OUI:00197F*
- ID_OUI_FROM_DATABASE=PLANTRONICS, INC.
-
 OUI:001986*
  ID_OUI_FROM_DATABASE=Cheng Hongjian
 
@@ -67694,9 +73949,6 @@ OUI:00181D*
 OUI:001811*
  ID_OUI_FROM_DATABASE=Neuros Technology International, LLC.
 
-OUI:00180A*
- ID_OUI_FROM_DATABASE=Meraki, Inc.
-
 OUI:001801*
  ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
 
@@ -68333,9 +74585,6 @@ OUI:00139F*
 OUI:001398*
  ID_OUI_FROM_DATABASE=TrafficSim Co.,Ltd
 
-OUI:001392*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
-
 OUI:00138C*
  ID_OUI_FROM_DATABASE=Kumyoung.Co.Ltd
 
@@ -68762,9 +75011,6 @@ OUI:000F1D*
 OUI:000F10*
  ID_OUI_FROM_DATABASE=RDM Corporation
 
-OUI:000F17*
- ID_OUI_FROM_DATABASE=Insta Elektro GmbH
-
 OUI:000F1E*
  ID_OUI_FROM_DATABASE=Chengdu KT Electric Co.of High & New Technology
 
@@ -69119,15 +75365,9 @@ OUI:000BFC*
 OUI:000BFE*
  ID_OUI_FROM_DATABASE=CASTEL Broadband Limited
 
-OUI:000C03*
- ID_OUI_FROM_DATABASE=HDMI Licensing, LLC
-
 OUI:000CA4*
  ID_OUI_FROM_DATABASE=Prompttec Product Management GmbH
 
-OUI:000CAB*
- ID_OUI_FROM_DATABASE=COMMEND International
-
 OUI:000C98*
  ID_OUI_FROM_DATABASE=LETEK Communications Inc.
 
@@ -70736,9 +76976,6 @@ OUI:000232*
 OUI:00012A*
  ID_OUI_FROM_DATABASE=Telematica Sistems Inteligente
 
-OUI:000130*
- ID_OUI_FROM_DATABASE=Extreme Networks
-
 OUI:000137*
  ID_OUI_FROM_DATABASE=IT Farm Corporation
 
@@ -71597,9 +77834,6 @@ OUI:00A0AD*
 OUI:00A0F6*
  ID_OUI_FROM_DATABASE=AutoGas Systems Inc.
 
-OUI:00A096*
- ID_OUI_FROM_DATABASE=MITSUMI ELECTRIC CO., LTD.
-
 OUI:00A006*
  ID_OUI_FROM_DATABASE=IMAGE DATA PROCESSING SYSTEM GROUP
 
@@ -71903,9 +78137,6 @@ OUI:002054*
 OUI:0020A7*
  ID_OUI_FROM_DATABASE=PAIRGAIN TECHNOLOGIES, INC.
 
-OUI:0020DA*
- ID_OUI_FROM_DATABASE=Alcatel North America ESD
-
 OUI:002005*
  ID_OUI_FROM_DATABASE=SIMPLE TECHNOLOGY
 
@@ -72785,9 +79016,6 @@ OUI:944452*
 OUI:08863B*
  ID_OUI_FROM_DATABASE=Belkin International Inc.
 
-OUI:2082C0*
- ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
-
 OUI:001556*
  ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
@@ -72809,9 +79037,6 @@ OUI:88AE1D*
 OUI:5C353B*
  ID_OUI_FROM_DATABASE=Compal Broadband Networks, Inc.
 
-OUI:C8F230*
- ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
-
 OUI:1C4419*
  ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
 
@@ -72890,9 +79115,6 @@ OUI:F8E079*
 OUI:1430C6*
  ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
 
-OUI:044E06*
- ID_OUI_FROM_DATABASE=Ericsson AB
-
 OUI:000D67*
  ID_OUI_FROM_DATABASE=Ericsson
 
@@ -73055,854 +79277,1334 @@ OUI:DC0B1A*
 OUI:74888B*
  ID_OUI_FROM_DATABASE=ADB Broadband Italia
 
-OUI:84D6D0*
- ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
-
-OUI:E0CB1D*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:ACD074*
  ID_OUI_FROM_DATABASE=Espressif Inc.
 
 OUI:D05349*
  ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:00BB3A*
- ID_OUI_FROM_DATABASE=Private
+OUI:000941*
+ ID_OUI_FROM_DATABASE=Allied Telesis R&D Center K.K.
+
+OUI:00014A*
+ ID_OUI_FROM_DATABASE=Sony Corporation
+
+OUI:001CA4*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+
+OUI:002345*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+
+OUI:8C6422*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+
+OUI:90C115*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+
+OUI:8400D2*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+
+OUI:5CB524*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+
+OUI:94A1A2*
+ ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
+
+OUI:74DE2B*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+
+OUI:68A3C4*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+
+OUI:C8FF28*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+
+OUI:0024D2*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+
+OUI:DC64B8*
+ ID_OUI_FROM_DATABASE=Shenzhen JingHanDa Electronics Co.Ltd
+
+OUI:C4DA7D*
+ ID_OUI_FROM_DATABASE=Ivium Technologies B.V.
+
+OUI:9492BC*
+ ID_OUI_FROM_DATABASE=SYNTECH(HK) TECHNOLOGY LIMITED
+
+OUI:001A4F*
+ ID_OUI_FROM_DATABASE=AVM GmbH
+
+OUI:00040E*
+ ID_OUI_FROM_DATABASE=AVM GmbH
+
+OUI:0016E3*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+
+OUI:00300A*
+ ID_OUI_FROM_DATABASE=Aztech Electronics Pte Ltd
+
+OUI:9CC7A6*
+ ID_OUI_FROM_DATABASE=AVM GmbH
+
+OUI:743170*
+ ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+
+OUI:A8D3F7*
+ ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+
+OUI:7C4FB5*
+ ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+
+OUI:0012BF*
+ ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+
+OUI:04FE8D*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:480031*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:0019FB*
+ ID_OUI_FROM_DATABASE=BSkyB Ltd
+
+OUI:0CF9C0*
+ ID_OUI_FROM_DATABASE=BSkyB Ltd
+
+OUI:001BA9*
+ ID_OUI_FROM_DATABASE=Brother industries, LTD.
+
+OUI:0011B6*
+ ID_OUI_FROM_DATABASE=Open Systems International
+
+OUI:E03E44*
+ ID_OUI_FROM_DATABASE=Broadcom
+
+OUI:D40129*
+ ID_OUI_FROM_DATABASE=Broadcom
+
+OUI:FCB698*
+ ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
+
+OUI:00E03A*
+ ID_OUI_FROM_DATABASE=Cabletron Systems, Inc.
+
+OUI:000117*
+ ID_OUI_FROM_DATABASE=Canal +
+
+OUI:0019C7*
+ ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
+
+OUI:006DFB*
+ ID_OUI_FROM_DATABASE=Vutrix Technologies Ltd
+
+OUI:C81073*
+ ID_OUI_FROM_DATABASE=CENTURY OPTICOMM CO.,LTD
+
+OUI:744AA4*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:9CD35B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:60AF6D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:B85A73*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:103047*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:109266*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:B047BF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:7C0BC6*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:804E81*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:244B81*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:50A4C8*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:8425DB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:D8C4E9*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:50C8E5*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:446D6C*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:38D40B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:647791*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:781FDB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:08FC88*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:30C7AE*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:18227E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:00F46F*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:9CE6E7*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:0090A2*
+ ID_OUI_FROM_DATABASE=CyberTAN Technology Inc.
+
+OUI:0030DA*
+ ID_OUI_FROM_DATABASE=Comtrend Corporation
+
+OUI:64680C*
+ ID_OUI_FROM_DATABASE=Comtrend Corporation
+
+OUI:00CF1C*
+ ID_OUI_FROM_DATABASE=Communication Machinery Corporation
+
+OUI:0090F5*
+ ID_OUI_FROM_DATABASE=CLEVO CO.
+
+OUI:0030FF*
+ ID_OUI_FROM_DATABASE=DataFab Systems Inc.
+
+OUI:E498D1*
+ ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
+
+OUI:A8A089*
+ ID_OUI_FROM_DATABASE=Tactical Communications
+
+OUI:48365F*
+ ID_OUI_FROM_DATABASE=Wintecronics Ltd.
+
+OUI:005A39*
+ ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
+
+OUI:5CC6D0*
+ ID_OUI_FROM_DATABASE=Skyworth Digital Technology(Shenzhen) Co.,Ltd
+
+OUI:080581*
+ ID_OUI_FROM_DATABASE=Roku, Inc.
+
+OUI:B0A737*
+ ID_OUI_FROM_DATABASE=Roku, Inc.
+
+OUI:B83E59*
+ ID_OUI_FROM_DATABASE=Roku, Inc.
+
+OUI:DC3A5E*
+ ID_OUI_FROM_DATABASE=Roku, Inc.
+
+OUI:0014A5*
+ ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
+
+OUI:001742*
+ ID_OUI_FROM_DATABASE=FUJITSU LIMITED
+
+OUI:2C10C1*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+
+OUI:CCFB65*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+
+OUI:40D28A*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+
+OUI:7CBB8A*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+
+OUI:00224C*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+
+OUI:0023CC*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+
+OUI:002444*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+
+OUI:E0E751*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+
+OUI:0017AB*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+
+OUI:001BEA*
+ ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+
+OUI:0015DE*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:001370*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:00247C*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:0023B4*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:0021AB*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:001FDF*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:00194F*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:00188D*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:00180F*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:547975*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:2CCC15*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:00BD3A*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:0026CC*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:00164E*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:0016BC*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:001ADC*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:002668*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:001F5C*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:001F00*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:001E3B*
+ ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+
+OUI:A04E04*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
+OUI:240B0A*
+ ID_OUI_FROM_DATABASE=Palo Alto Networks
+
+OUI:C4E510*
+ ID_OUI_FROM_DATABASE=Mechatro, Inc.
+
+OUI:74C330*
+ ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
+
+OUI:403F8C*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:14C3C2*
+ ID_OUI_FROM_DATABASE=K.A. Schmersal GmbH & Co. KG
+
+OUI:10785B*
+ ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
+
+OUI:20768F*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:9C5CF9*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+
+OUI:88A084*
+ ID_OUI_FROM_DATABASE=Formation Data Systems
+
+OUI:0025DC*
+ ID_OUI_FROM_DATABASE=Sumitomo Electric Industries,Ltd
+
+OUI:001CFC*
+ ID_OUI_FROM_DATABASE=Sumitomo Electric Industries,Ltd
+
+OUI:8CC661*
+ ID_OUI_FROM_DATABASE=Current, powered by GE
+
+OUI:009050*
+ ID_OUI_FROM_DATABASE=Teleste Corporation
+
+OUI:BC44B0*
+ ID_OUI_FROM_DATABASE=Elastifile
+
+OUI:7864E6*
+ ID_OUI_FROM_DATABASE=Green Motive Technology Limited
+
+OUI:C0CCF8*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:80ED2C*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:E8B2AC*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:0080B8*
+ ID_OUI_FROM_DATABASE=DMG MORI B.U.G. CO., LTD.
+
+OUI:8489AD*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:40B688*
+ ID_OUI_FROM_DATABASE=LEGIC Identsystems AG
+
+OUI:A09D91*
+ ID_OUI_FROM_DATABASE=SoundBridge
+
+OUI:30785C*
+ ID_OUI_FROM_DATABASE=Partow Tamas Novin (Parman)
+
+OUI:441102*
+ ID_OUI_FROM_DATABASE=EDMI  Europe Ltd
+
+OUI:2C21D7*
+ ID_OUI_FROM_DATABASE=IMAX Corporation
+
+OUI:0026F7*
+ ID_OUI_FROM_DATABASE=Nivetti Systems Pvt. Ltd.
+
+OUI:24C3F9*
+ ID_OUI_FROM_DATABASE=Securitas Direct AB
+
+OUI:DC4D23*
+ ID_OUI_FROM_DATABASE=MRV Comunications
+
+OUI:085BDA*
+ ID_OUI_FROM_DATABASE=CliniCare LTD
+
+OUI:0C5A9E*
+ ID_OUI_FROM_DATABASE=Wi-SUN Alliance
+
+OUI:00C164*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:98E7F5*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:24BCF8*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:10D0AB*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:202DF8*
+ ID_OUI_FROM_DATABASE=Digital Media Cartridge Ltd.
+
+OUI:042DB4*
+ ID_OUI_FROM_DATABASE=First Property (Beijing) Co., Ltd Modern MOMA Branch
+
+OUI:008A96*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:007888*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:98DED0*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:30FC68*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
+OUI:5CCA1A*
+ ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
+
+OUI:000594*
+ ID_OUI_FROM_DATABASE=HMS Industrial Networks
+
+OUI:000AC2*
+ ID_OUI_FROM_DATABASE=Wuhan FiberHome Digital Technology Co.,Ltd.
+
+OUI:D4F207*
+ ID_OUI_FROM_DATABASE=DIAODIAO(Beijing)Technology CO.,Ltd
+
+OUI:FCF8B7*
+ ID_OUI_FROM_DATABASE=TRONTEQ Electronic
+
+OUI:D4883F*
+ ID_OUI_FROM_DATABASE=HDPRO CO., LTD.
+
+OUI:001BF3*
+ ID_OUI_FROM_DATABASE=TRANSRADIO SenderSysteme Berlin AG
+
+OUI:E0071B*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:000941*
- ID_OUI_FROM_DATABASE=Allied Telesis R&D Center K.K.
+OUI:A86AC1*
+ ID_OUI_FROM_DATABASE=HanbitEDS Co., Ltd.
 
-OUI:00014A*
- ID_OUI_FROM_DATABASE=Sony Corporation
+OUI:88B1E1*
+ ID_OUI_FROM_DATABASE=Mojo Networks, Inc.
 
-OUI:001CA4*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:74DFBF*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:002345*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:FC3F7C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:8C6422*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:608334*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:90C115*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:84AD58*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:8400D2*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:746FF7*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
-OUI:5CB524*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:B01BD2*
+ ID_OUI_FROM_DATABASE=Le Shi Zhi Xin Electronic Technology (Tianjin) Limited
 
-OUI:94A1A2*
- ID_OUI_FROM_DATABASE=AMPAK Technology, Inc.
+OUI:74852A*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
-OUI:74DE2B*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:386077*
+ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
 
-OUI:68A3C4*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:60B4F7*
+ ID_OUI_FROM_DATABASE=Plume Design Inc
 
-OUI:C8FF28*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:A4D8CA*
+ ID_OUI_FROM_DATABASE=HONG KONG WATER WORLD TECHNOLOGY CO. LIMITED
 
-OUI:0024D2*
- ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+OUI:00109B*
+ ID_OUI_FROM_DATABASE=Emulex Corporation
 
-OUI:DC64B8*
- ID_OUI_FROM_DATABASE=Shenzhen JingHanDa Electronics Co.Ltd
+OUI:00E0D5*
+ ID_OUI_FROM_DATABASE=Emulex Corporation
 
-OUI:C4DA7D*
- ID_OUI_FROM_DATABASE=Ivium Technologies B.V.
+OUI:001035*
+ ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
-OUI:9492BC*
- ID_OUI_FROM_DATABASE=SYNTECH(HK) TECHNOLOGY LIMITED
+OUI:ECA86B*
+ ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
-OUI:001A4F*
- ID_OUI_FROM_DATABASE=AVM GmbH
+OUI:4487FC*
+ ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
-OUI:00040E*
- ID_OUI_FROM_DATABASE=AVM GmbH
+OUI:002197*
+ ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
 
-OUI:0016E3*
- ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+OUI:649968*
+ ID_OUI_FROM_DATABASE=Elentec
 
-OUI:30469A*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:00208F*
+ ID_OUI_FROM_DATABASE=ECI Telecom Ltd.
 
-OUI:0026F2*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:9CDF03*
+ ID_OUI_FROM_DATABASE=Harman/Becker Automotive Systems GmbH
 
-OUI:00184D*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:94885E*
+ ID_OUI_FROM_DATABASE=Surfilter Network Technology Co., Ltd.
 
-OUI:001E2A*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:002378*
+ ID_OUI_FROM_DATABASE=GN Netcom A/S
 
-OUI:E8FCAF*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:002088*
+ ID_OUI_FROM_DATABASE=GLOBAL VILLAGE COMMUNICATION
 
-OUI:4C60DE*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:90C7D8*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:00300A*
- ID_OUI_FROM_DATABASE=Aztech Electronics Pte Ltd
+OUI:BC6A44*
+ ID_OUI_FROM_DATABASE=Commend International GmbH
 
-OUI:A06391*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:0020F2*
+ ID_OUI_FROM_DATABASE=Oracle Corporation
 
-OUI:9CC7A6*
- ID_OUI_FROM_DATABASE=AVM GmbH
+OUI:00015D*
+ ID_OUI_FROM_DATABASE=Oracle Corporation
 
-OUI:DCEF09*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:943BB1*
+ ID_OUI_FROM_DATABASE=Kaonmedia CO., LTD.
 
-OUI:743170*
- ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+OUI:146308*
+ ID_OUI_FROM_DATABASE=JABIL CIRCUIT (SHANGHAI) LTD.
 
-OUI:A8D3F7*
- ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+OUI:08000D*
+ ID_OUI_FROM_DATABASE=International Computers, Ltd
 
-OUI:7C4FB5*
- ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+OUI:00D0A2*
+ ID_OUI_FROM_DATABASE=INTEGRATED DEVICE
 
-OUI:0012BF*
- ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation
+OUI:0060B1*
+ ID_OUI_FROM_DATABASE=Input/Output, Inc.
 
-OUI:200CC8*
- ID_OUI_FROM_DATABASE=NETGEAR
+OUI:00177D*
+ ID_OUI_FROM_DATABASE=IDT Technology Limited
 
-OUI:04FE8D*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:288A1C*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:480031*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:100E7E*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:0019FB*
- ID_OUI_FROM_DATABASE=BSkyB Ltd
+OUI:84B59C*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:0CF9C0*
- ID_OUI_FROM_DATABASE=BSkyB Ltd
+OUI:544B8C*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:001BA9*
- ID_OUI_FROM_DATABASE=Brother industries, LTD.
+OUI:541E56*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:0011B6*
- ID_OUI_FROM_DATABASE=Open Systems International
+OUI:64649B*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:E03E44*
- ID_OUI_FROM_DATABASE=Broadcom
+OUI:2C6BF5*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:D40129*
- ID_OUI_FROM_DATABASE=Broadcom
+OUI:002283*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:FCB698*
- ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
+OUI:EC13DB*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:00E03A*
- ID_OUI_FROM_DATABASE=Cabletron Systems, Inc.
+OUI:AC4BC8*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:000117*
- ID_OUI_FROM_DATABASE=Canal +
+OUI:B0A86E*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:0019C7*
- ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
+OUI:3C94D5*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:006DFB*
- ID_OUI_FROM_DATABASE=Vutrix Technologies Ltd
+OUI:F4CC55*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:C81073*
- ID_OUI_FROM_DATABASE=CENTURY OPTICOMM CO.,LTD
+OUI:002159*
+ ID_OUI_FROM_DATABASE=Juniper Networks
 
-OUI:744AA4*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:5C70A3*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:9CD35B*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:3497F6*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
 
-OUI:60AF6D*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:50680A*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:B85A73*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:D89403*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:103047*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:9C8D7C*
+ ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
 
-OUI:109266*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:E04F43*
+ ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
 
-OUI:B047BF*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:B0E03C*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:7C0BC6*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:D09DAB*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:804E81*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:94D859*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:244B81*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:9471AC*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:50A4C8*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:70BAEF*
+ ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
 
-OUI:8425DB*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:009006*
+ ID_OUI_FROM_DATABASE=Hamamatsu Photonics K.K.
 
-OUI:D8C4E9*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:001AF4*
+ ID_OUI_FROM_DATABASE=Handreamnet
 
-OUI:50C8E5*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:000AED*
+ ID_OUI_FROM_DATABASE=HARTING Electronics GmbH
 
-OUI:446D6C*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:1CCB99*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:38D40B*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:18E3BC*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:647791*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:289AFA*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:781FDB*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:44A42D*
+ ID_OUI_FROM_DATABASE=TCT mobile ltd
 
-OUI:08FC88*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:8C8EF2*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:30C7AE*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F40F24*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:18227E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:A0D385*
+ ID_OUI_FROM_DATABASE=AUMA Riester GmbH & Co. KG
 
-OUI:00F46F*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:1414E6*
+ ID_OUI_FROM_DATABASE=Ningbo Sanhe Digital Co.,Ltd
 
-OUI:BC1485*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:84A134*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:9CE6E7*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:1C9148*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:380195*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:CC167E*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:5CF6DC*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:600810*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:1077B1*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:C85B76*
+ ID_OUI_FROM_DATABASE=LCFC(HeFei) Electronics Technology co., ltd
 
-OUI:508569*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:001AE8*
+ ID_OUI_FROM_DATABASE=Unify Software and Solutions GmbH & Co. KG
 
-OUI:0090A2*
- ID_OUI_FROM_DATABASE=CyberTAN Technology Inc.
+OUI:945907*
+ ID_OUI_FROM_DATABASE=Shanghai HITE-BELDEN Network Technology Co., Ltd.
 
-OUI:0030DA*
- ID_OUI_FROM_DATABASE=Comtrend Corporation
+OUI:48C663*
+ ID_OUI_FROM_DATABASE=GTO Access Systems LLC
 
-OUI:64680C*
- ID_OUI_FROM_DATABASE=Comtrend Corporation
+OUI:606453*
+ ID_OUI_FROM_DATABASE=AOD Co.,Ltd.
 
-OUI:00CF1C*
- ID_OUI_FROM_DATABASE=Communication Machinery Corporation
+OUI:6C98EB*
+ ID_OUI_FROM_DATABASE=Riverbed Technology, Inc.
 
-OUI:0090F5*
- ID_OUI_FROM_DATABASE=CLEVO CO.
+OUI:DC293A*
+ ID_OUI_FROM_DATABASE=Shenzhen Nuoshi Technology Co., LTD.
 
-OUI:0030FF*
- ID_OUI_FROM_DATABASE=DataFab Systems Inc.
+OUI:40562D*
+ ID_OUI_FROM_DATABASE=Smartron India Pvt ltd
 
-OUI:E498D1*
- ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
+OUI:70288B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:A8A089*
- ID_OUI_FROM_DATABASE=Tactical Communications
+OUI:00809F*
+ ID_OUI_FROM_DATABASE=ALE International
 
-OUI:48365F*
- ID_OUI_FROM_DATABASE=Wintecronics Ltd.
+OUI:B0D7CC*
+ ID_OUI_FROM_DATABASE=Tridonic GmbH & Co KG
 
-OUI:005A39*
- ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
+OUI:7C574E*
+ ID_OUI_FROM_DATABASE=COBI GmbH
 
-OUI:5CC6D0*
- ID_OUI_FROM_DATABASE=Skyworth Digital Technology(Shenzhen) Co.,Ltd
+OUI:34C0F9*
+ ID_OUI_FROM_DATABASE=Rockwell Automation
 
-OUI:080581*
- ID_OUI_FROM_DATABASE=Roku, Inc.
+OUI:20C047*
+ ID_OUI_FROM_DATABASE=Verizon
 
-OUI:B0A737*
- ID_OUI_FROM_DATABASE=Roku, Inc.
+OUI:AC0481*
+ ID_OUI_FROM_DATABASE=Jiangsu Huaxing Electronics Co., Ltd.
 
-OUI:B83E59*
- ID_OUI_FROM_DATABASE=Roku, Inc.
+OUI:FC2D5E*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:DC3A5E*
- ID_OUI_FROM_DATABASE=Roku, Inc.
+OUI:E811CA*
+ ID_OUI_FROM_DATABASE=SHANDONG KAER ELECTRIC.CO.,LTD
 
-OUI:0014A5*
- ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
+OUI:ECD68A*
+ ID_OUI_FROM_DATABASE=Shenzhen JMicron Intelligent Technology Developmen
 
-OUI:001742*
- ID_OUI_FROM_DATABASE=FUJITSU LIMITED
+OUI:08D0B7*
+ ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
 
-OUI:2C10C1*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:28285D*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:CCFB65*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:5CF4AB*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:40D28A*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:4C9EFF*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:7CBB8A*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:0023F8*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:00224C*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:B0B2DC*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:0023CC*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:90EF68*
+ ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
 
-OUI:002444*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:A8AD3D*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
 
-OUI:E0E751*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:E03005*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
 
-OUI:0017AB*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:2824FF*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
 
-OUI:001BEA*
- ID_OUI_FROM_DATABASE=Nintendo Co., Ltd.
+OUI:14C1FF*
+ ID_OUI_FROM_DATABASE=ShenZhen QianHai Comlan communication Co.,LTD
 
-OUI:0015DE*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:EC8EB5*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:001370*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:70AF6A*
+ ID_OUI_FROM_DATABASE=SHENZHEN FENGLIAN TECHNOLOGY CO., LTD.
 
-OUI:00247C*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:0026F1*
+ ID_OUI_FROM_DATABASE=ProCurve Networking by HP
 
-OUI:0023B4*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:B439D6*
+ ID_OUI_FROM_DATABASE=ProCurve Networking by HP
 
-OUI:0021AB*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:001CEF*
+ ID_OUI_FROM_DATABASE=Primax Electronics Ltd.
 
-OUI:001FDF*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:000276*
+ ID_OUI_FROM_DATABASE=Primax Electronics Ltd.
 
-OUI:00194F*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:4849C7*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00188D*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:001F9A*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:00180F*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:0014C7*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:547975*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:001540*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:2CCC15*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:0017D1*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:00BD3A*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:0015E8*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:0026CC*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:001660*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:00164E*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:001BBA*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:0016BC*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:205EF7*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001ADC*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:00034B*
+ ID_OUI_FROM_DATABASE=Nortel Networks
 
-OUI:002668*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:00001B*
+ ID_OUI_FROM_DATABASE=Novell, Inc.
 
-OUI:001F5C*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:00E011*
+ ID_OUI_FROM_DATABASE=UNIDEN CORPORATION
 
-OUI:001F00*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:B03EB0*
+ ID_OUI_FROM_DATABASE=MICRODIA Ltd.
 
-OUI:001E3B*
- ID_OUI_FROM_DATABASE=Nokia Danmark A/S
+OUI:00126C*
+ ID_OUI_FROM_DATABASE=Visonic Technologies 1993 Ltd.
 
-OUI:A04E04*
- ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:18ABF5*
+ ID_OUI_FROM_DATABASE=Ultra Electronics Electrics
 
-OUI:240B0A*
- ID_OUI_FROM_DATABASE=Palo Alto Networks
+OUI:304487*
+ ID_OUI_FROM_DATABASE=Hefei Radio Communication Technology Co., Ltd
 
-OUI:C4E510*
- ID_OUI_FROM_DATABASE=Mechatro, Inc.
+OUI:AC6175*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:74C330*
- ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD
+OUI:AC482D*
+ ID_OUI_FROM_DATABASE=Ralinwi Nanjing Electronic Technology Co., Ltd.
 
-OUI:403F8C*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:A48269*
+ ID_OUI_FROM_DATABASE=Datrium, Inc.
 
-OUI:14C3C2*
- ID_OUI_FROM_DATABASE=K.A. Schmersal GmbH & Co. KG
+OUI:441441*
+ ID_OUI_FROM_DATABASE=AudioControl Inc.
 
-OUI:10785B*
- ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
+OUI:0018DA*
+ ID_OUI_FROM_DATABASE=AMBER wireless GmbH
 
-OUI:20768F*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:EC24B8*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:9C5CF9*
- ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+OUI:68C90B*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:88A084*
- ID_OUI_FROM_DATABASE=Formation Data Systems
+OUI:F4B85E*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0025DC*
- ID_OUI_FROM_DATABASE=Sumitomo Electric Industries,Ltd
+OUI:5C313E*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:001CFC*
- ID_OUI_FROM_DATABASE=Sumitomo Electric Industries,Ltd
+OUI:A0E6F8*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00D0EC*
- ID_OUI_FROM_DATABASE=NAKAYO TELECOMMUNICATIONS,INC
+OUI:20C38F*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:8CC661*
- ID_OUI_FROM_DATABASE=Current, powered by GE
+OUI:D0FF50*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:009050*
- ID_OUI_FROM_DATABASE=Teleste Corporation
+OUI:7472B0*
+ ID_OUI_FROM_DATABASE=Guangzhou Shiyuan Electronics Co., Ltd.
 
-OUI:BC44B0*
- ID_OUI_FROM_DATABASE=Elastifile
+OUI:44BFE3*
+ ID_OUI_FROM_DATABASE=Shenzhen Longtech Electronics Co.,Ltd
 
-OUI:7864E6*
- ID_OUI_FROM_DATABASE=Green Motive Technology Limited
+OUI:F45214*
+ ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
 
-OUI:743E2B*
- ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:689E19*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:C0CCF8*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:985945*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:80ED2C*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:1CE2CC*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:E8B2AC*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:44C15C*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0080B8*
- ID_OUI_FROM_DATABASE=DMG MORI B.U.G. CO., LTD.
+OUI:0017E9*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:8489AD*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:0017E7*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:40B688*
- ID_OUI_FROM_DATABASE=LEGIC Identsystems AG
+OUI:D00790*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:A09D91*
- ID_OUI_FROM_DATABASE=SoundBridge
+OUI:04E451*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:30785C*
- ID_OUI_FROM_DATABASE=Partow Tamas Novin (Parman)
+OUI:B0D5CC*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:441102*
- ID_OUI_FROM_DATABASE=EDMI  Europe Ltd
+OUI:5CF821*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:2C21D7*
- ID_OUI_FROM_DATABASE=IMAX Corporation
+OUI:FC0F4B*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0026F7*
- ID_OUI_FROM_DATABASE=Nivetti Systems Pvt. Ltd.
+OUI:3C6FEA*
+ ID_OUI_FROM_DATABASE=Panasonic India Pvt. Ltd.
 
-OUI:24C3F9*
- ID_OUI_FROM_DATABASE=Securitas Direct AB
+OUI:A863F2*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:DC4D23*
- ID_OUI_FROM_DATABASE=MRV Comunications
+OUI:948854*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:085BDA*
- ID_OUI_FROM_DATABASE=CliniCare LTD
+OUI:001237*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0C5A9E*
- ID_OUI_FROM_DATABASE=Wi-SUN Alliance
+OUI:BC6A29*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:00C164*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:C0E422*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:C4BED4*
- ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:001830*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:98E7F5*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:1CBA8C*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:24BCF8*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:58FB84*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:10D0AB*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:E0E7BB*
+ ID_OUI_FROM_DATABASE=Nureva, Inc.
 
-OUI:202DF8*
- ID_OUI_FROM_DATABASE=Digital Media Cartridge Ltd.
+OUI:7CA97D*
+ ID_OUI_FROM_DATABASE=Objenious
 
-OUI:042DB4*
- ID_OUI_FROM_DATABASE=First Property (Beijing) Co., Ltd Modern MOMA Branch
+OUI:BC8AA3*
+ ID_OUI_FROM_DATABASE=NHN Entertainment
 
-OUI:008A96*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:70A84C*
+ ID_OUI_FROM_DATABASE=MONAD., Inc.
 
-OUI:007888*
+OUI:00A289*
  ID_OUI_FROM_DATABASE=Cisco Systems, Inc
 
-OUI:98DED0*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:6C1E90*
+ ID_OUI_FROM_DATABASE=Hansol Technics Co., Ltd.
 
-OUI:30FC68*
- ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:486DBB*
+ ID_OUI_FROM_DATABASE=Vestel Elektronik San ve Tic. A.Ş.
 
-OUI:5CCA1A*
- ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
+OUI:E09DFA*
+ ID_OUI_FROM_DATABASE=Wanan Hongsheng Electronic Co.Ltd
 
-OUI:000594*
- ID_OUI_FROM_DATABASE=HMS Industrial Networks
+OUI:34E71C*
+ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
 
-OUI:000AC2*
- ID_OUI_FROM_DATABASE=Wuhan FiberHome Digital Technology Co.,Ltd.
+OUI:182861*
+ ID_OUI_FROM_DATABASE=AirTies Wireless Networks
 
-OUI:F08CFB*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:8841FC*
+ ID_OUI_FROM_DATABASE=AirTies Wireless Networks
 
-OUI:D4F207*
- ID_OUI_FROM_DATABASE=DIAODIAO(Beijing)Technology CO.,Ltd
+OUI:182666*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:FCF8B7*
- ID_OUI_FROM_DATABASE=TRONTEQ Electronic
+OUI:C06599*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:D4883F*
- ID_OUI_FROM_DATABASE=HDPRO CO., LTD.
+OUI:CC07AB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001BF3*
- ID_OUI_FROM_DATABASE=TRANSRADIO SenderSysteme Berlin AG
+OUI:E84E84*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:E0071B*
- ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
+OUI:50FC9F*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:A86AC1*
- ID_OUI_FROM_DATABASE=HanbitEDS Co., Ltd.
+OUI:E432CB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:40163B*
+OUI:889B39*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:88B1E1*
- ID_OUI_FROM_DATABASE=Mojo Networks, Inc.
+OUI:BCB1F3*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:74DFBF*
- ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+OUI:38ECE4*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:FC3F7C*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:CCF9E8*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:608334*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:F0E77E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:84AD58*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:5CE8EB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:746FF7*
- ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
+OUI:B8D9CE*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:B01BD2*
- ID_OUI_FROM_DATABASE=Le Shi Zhi Xin Electronic Technology (Tianjin) Limited
+OUI:70F927*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:74852A*
- ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
+OUI:301966*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:386077*
- ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
+OUI:28BAB5*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:60B4F7*
- ID_OUI_FROM_DATABASE=Plume Design Inc
+OUI:103B59*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:A4D8CA*
- ID_OUI_FROM_DATABASE=HONG KONG WATER WORLD TECHNOLOGY CO. LIMITED
+OUI:6CB7F4*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00109B*
- ID_OUI_FROM_DATABASE=Emulex Corporation
+OUI:001EE1*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00E0D5*
- ID_OUI_FROM_DATABASE=Emulex Corporation
+OUI:0018AF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001035*
- ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
+OUI:BC72B1*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:ECA86B*
- ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
+OUI:78F7BE*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:4487FC*
- ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
+OUI:F49F54*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:002197*
- ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
+OUI:7C11CB*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:649968*
- ID_OUI_FROM_DATABASE=Elentec
+OUI:A4CAA0*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:00208F*
- ID_OUI_FROM_DATABASE=ECI Telecom Ltd.
+OUI:00214C*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:9CDF03*
- ID_OUI_FROM_DATABASE=Harman/Becker Automotive Systems GmbH
+OUI:001632*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:F0407B*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:D0667B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:94885E*
- ID_OUI_FROM_DATABASE=Surfilter Network Technology Co., Ltd.
+OUI:38AA3C*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
-OUI:002378*
- ID_OUI_FROM_DATABASE=GN Netcom A/S
+OUI:206432*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
-OUI:002088*
- ID_OUI_FROM_DATABASE=GLOBAL VILLAGE COMMUNICATION
+OUI:002637*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
-OUI:90C7D8*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:001377*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:BC6A44*
- ID_OUI_FROM_DATABASE=Commend International GmbH
+OUI:50B7C3*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:0020F2*
- ID_OUI_FROM_DATABASE=Oracle Corporation
+OUI:8018A7*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00015D*
- ID_OUI_FROM_DATABASE=Oracle Corporation
+OUI:5CA39D*
+ ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
 
-OUI:943BB1*
- ID_OUI_FROM_DATABASE=Kaonmedia CO., LTD.
+OUI:B88EDF*
+ ID_OUI_FROM_DATABASE=Zencheer Communication Technology Co., Ltd.
 
-OUI:146308*
- ID_OUI_FROM_DATABASE=JABIL CIRCUIT (SHANGHAI) LTD.
+OUI:D85DE2*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:08000D*
- ID_OUI_FROM_DATABASE=International Computers, Ltd
+OUI:707781*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00D0A2*
- ID_OUI_FROM_DATABASE=INTEGRATED DEVICE
+OUI:606DC7*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:0060B1*
- ID_OUI_FROM_DATABASE=Input/Output, Inc.
+OUI:681401*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:00177D*
- ID_OUI_FROM_DATABASE=IDT Technology Limited
+OUI:0071CC*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:288A1C*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:F866D1*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:100E7E*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:F80D43*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:84B59C*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:002268*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:544B8C*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:001FE1*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:541E56*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:002556*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:64649B*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:00265C*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:2C6BF5*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:90CDB6*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:002283*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:001E4C*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:EC13DB*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:F8DA0C*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:AC4BC8*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:9034FC*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:B0A86E*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:906EBB*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:3C94D5*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:342387*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:F4CC55*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:689423*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:002159*
- ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:B8763F*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:5C70A3*
- ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+OUI:1C3E84*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:3497F6*
- ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:C01885*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:50680A*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:785968*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:D89403*
- ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
+OUI:1C666D*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:9C8D7C*
- ID_OUI_FROM_DATABASE=ALPS ELECTRIC CO.,LTD.
+OUI:CCAF78*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:E04F43*
- ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
+OUI:904CE5*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:B0E03C*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:B01041*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:D09DAB*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:7487A9*
+ ID_OUI_FROM_DATABASE=OCT Technology Co., Ltd.
 
-OUI:94D859*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:E0286D*
+ ID_OUI_FROM_DATABASE=AVM Audiovisuelles Marketing und Computersysteme GmbH
 
-OUI:9471AC*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:444E1A*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:70BAEF*
- ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+OUI:E8E5D6*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:009006*
- ID_OUI_FROM_DATABASE=Hamamatsu Photonics K.K.
+OUI:5492BE*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001AF4*
- ID_OUI_FROM_DATABASE=Handreamnet
+OUI:101DC0*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:000AED*
- ID_OUI_FROM_DATABASE=HARTING Electronics GmbH
+OUI:0021D1*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:1CCB99*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:5CA933*
+ ID_OUI_FROM_DATABASE=Luma Home
 
-OUI:18E3BC*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:2CDD95*
+ ID_OUI_FROM_DATABASE=Taicang T&W Electronics
 
-OUI:289AFA*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:AC84C9*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:44A42D*
- ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:107223*
+ ID_OUI_FROM_DATABASE=TELLESCOM INDUSTRIA E COMERCIO EM TELECOMUNICACAO
 
-OUI:8C8EF2*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:CCB0DA*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:F40F24*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:14EDBB*
+ ID_OUI_FROM_DATABASE=2Wire Inc
 
-OUI:A0D385*
- ID_OUI_FROM_DATABASE=AUMA Riester GmbH & Co. KG
+OUI:44BA46*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
 
-OUI:1414E6*
- ID_OUI_FROM_DATABASE=Ningbo Sanhe Digital Co.,Ltd
+OUI:B4D135*
+ ID_OUI_FROM_DATABASE=Cloudistics
 
-OUI:84A134*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:085DDD*
+ ID_OUI_FROM_DATABASE=MERCURY CORPORATION
 
-OUI:1C9148*
- ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:6CEC5A*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. CO.,Ltd.
 
-OUI:CC167E*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:5001D9*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:600810*
+OUI:44C346*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:C85B76*
- ID_OUI_FROM_DATABASE=LCFC(HeFei) Electronics Technology co., ltd
+OUI:884477*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:001AE8*
- ID_OUI_FROM_DATABASE=Unify Software and Solutions GmbH & Co. KG
+OUI:047503*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:945907*
- ID_OUI_FROM_DATABASE=Shanghai HITE-BELDEN Network Technology Co., Ltd.
+OUI:2C402B*
+ ID_OUI_FROM_DATABASE=Smart iBlue Technology Limited
 
-OUI:48C663*
- ID_OUI_FROM_DATABASE=GTO Access Systems LLC
+OUI:180675*
+ ID_OUI_FROM_DATABASE=Dilax Intelcom GmbH
 
-OUI:606453*
- ID_OUI_FROM_DATABASE=AOD Co.,Ltd.
+OUI:30AEA4*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
 
-OUI:6C98EB*
- ID_OUI_FROM_DATABASE=Riverbed Technology, Inc.
+OUI:0C4933*
+ ID_OUI_FROM_DATABASE=Sichuan Jiuzhou Electronic Technology Co., Ltd.
+
+OUI:7828CA*
+ ID_OUI_FROM_DATABASE=Sonos, Inc.
+
+OUI:B8E937*
+ ID_OUI_FROM_DATABASE=Sonos, Inc.
+
+OUI:B05216*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+
+OUI:002926*
+ ID_OUI_FROM_DATABASE=Applied Optoelectronics, Inc Taiwan Branch
+
+OUI:68DFDD*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:DC293A*
- ID_OUI_FROM_DATABASE=Shenzhen Nuoshi Technology Co., LTD.
+OUI:C46AB7*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:40562D*
- ID_OUI_FROM_DATABASE=Smartron India Pvt ltd
+OUI:FC64BA*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:70288B*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:2082C0*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:00809F*
- ID_OUI_FROM_DATABASE=ALE International
+OUI:3480B3*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:B0D7CC*
- ID_OUI_FROM_DATABASE=Tridonic GmbH & Co KG
+OUI:7451BA*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:7C574E*
- ID_OUI_FROM_DATABASE=COBI GmbH
+OUI:64B473*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:34C0F9*
- ID_OUI_FROM_DATABASE=Rockwell Automation
+OUI:8C2FA6*
+ ID_OUI_FROM_DATABASE=Solid Optics B.V.
 
-OUI:20C047*
- ID_OUI_FROM_DATABASE=Verizon
+OUI:B0A2E7*
+ ID_OUI_FROM_DATABASE=Shenzhen TINNO Mobile Technology Corp.
 
-OUI:AC0481*
- ID_OUI_FROM_DATABASE=Jiangsu Huaxing Electronics Co., Ltd.
+OUI:BCA8A6*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:FC2D5E*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:101331*
+ ID_OUI_FROM_DATABASE=Technicolor
 
-OUI:E811CA*
- ID_OUI_FROM_DATABASE=SHANDONG KAER ELECTRIC.CO.,LTD
+OUI:38AFD7*
+ ID_OUI_FROM_DATABASE=FUJITSU LIMITED
 
-OUI:ECD68A*
- ID_OUI_FROM_DATABASE=Shenzhen JMicron Intelligent Technology Developmen
+OUI:28993A*
+ ID_OUI_FROM_DATABASE=Arista Networks
 
-OUI:1C77F6*
- ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+OUI:B0E892*
+ ID_OUI_FROM_DATABASE=Seiko Epson Corporation
 
-OUI:08D0B7*
- ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
+OUI:AC1826*
+ ID_OUI_FROM_DATABASE=Seiko Epson Corporation
 
-OUI:28285D*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:886639*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:5CF4AB*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:D8197A*
+ ID_OUI_FROM_DATABASE=Nuheara Ltd
 
-OUI:4C9EFF*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:8CE117*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:0023F8*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:64136C*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:B0B2DC*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:0005CD*
+ ID_OUI_FROM_DATABASE=D&M Holdings Inc.
 
-OUI:90EF68*
- ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation
+OUI:8C9351*
+ ID_OUI_FROM_DATABASE=Jigowatts Inc.
 
 OUI:00248D*
  ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
@@ -73922,12 +80624,6 @@ OUI:40D855*
 OUI:48DF37*
  ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:9C93E4*
- ID_OUI_FROM_DATABASE=Private
-
-OUI:005079*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:0028F8*
  ID_OUI_FROM_DATABASE=Intel Corporate
 
@@ -73988,9 +80684,6 @@ OUI:002597*
 OUI:882BD7*
  ID_OUI_FROM_DATABASE=ADDÉNERGIE  TECHNOLOGIES
 
-OUI:9CA5C0*
- ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
-
 OUI:B4A5EF*
  ID_OUI_FROM_DATABASE=Sercomm Corporation.
 
@@ -74006,9 +80699,6 @@ OUI:38A28C*
 OUI:58528A*
  ID_OUI_FROM_DATABASE=Mitsubishi Electric Corporation
 
-OUI:BCC00F*
- ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
-
 OUI:B0C287*
  ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
@@ -74039,9 +80729,6 @@ OUI:80EA23*
 OUI:D88039*
  ID_OUI_FROM_DATABASE=Microchip Technology Inc.
 
-OUI:001D72*
- ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
-
 OUI:FC3D93*
  ID_OUI_FROM_DATABASE=LONGCHEER TELECOMMUNICATION LIMITED
 
@@ -74156,54 +80843,45 @@ OUI:FCFAF7*
 OUI:C8E776*
  ID_OUI_FROM_DATABASE=PTCOM Technology
 
-OUI:5C497D*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
-
-OUI:0005CD*
- ID_OUI_FROM_DATABASE=D&M Holdings Inc.
-
-OUI:E0286D*
- ID_OUI_FROM_DATABASE=AVM Audiovisuelles Marketing und Computersysteme GmbH
-
-OUI:7487A9*
- ID_OUI_FROM_DATABASE=OCT Technology Co., Ltd.
+OUI:949AA9*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
 
-OUI:34AA99*
+OUI:C4084A*
  ID_OUI_FROM_DATABASE=Nokia
 
-OUI:C4084A*
+OUI:0C54B9*
  ID_OUI_FROM_DATABASE=Nokia
 
 OUI:8C90D3*
  ID_OUI_FROM_DATABASE=Nokia
 
-OUI:0C54B9*
+OUI:34AA99*
  ID_OUI_FROM_DATABASE=Nokia
 
-OUI:444E1A*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
-
-OUI:E8E5D6*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F8633F*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:5492BE*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:088620*
+ ID_OUI_FROM_DATABASE=TECNO MOBILE LIMITED
 
-OUI:0021D1*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:A42983*
+ ID_OUI_FROM_DATABASE=Boeing Defence Australia
 
-OUI:101DC0*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:702E22*
+ ID_OUI_FROM_DATABASE=zte corporation
 
 OUI:0023B9*
  ID_OUI_FROM_DATABASE=Airbus Defence and Space Deutschland GmbH
 
-OUI:2047ED*
- ID_OUI_FROM_DATABASE=BSkyB Ltd
+OUI:B0C128*
+ ID_OUI_FROM_DATABASE=Adler ELREHA GmbH
 
 OUI:C8F946*
  ID_OUI_FROM_DATABASE=LOCOSYS Technology Inc.
 
+OUI:2047ED*
+ ID_OUI_FROM_DATABASE=BSkyB Ltd
+
 OUI:D41D71*
  ID_OUI_FROM_DATABASE=Palo Alto Networks
 
@@ -74216,638 +80894,1142 @@ OUI:1861C7*
 OUI:9CDC71*
  ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:C8028F*
- ID_OUI_FROM_DATABASE=Nova Electronics (Shanghai) Co., Ltd.
-
 OUI:240D65*
  ID_OUI_FROM_DATABASE=Shenzhen Vsun Communication Technology Co., Ltd.
 
 OUI:D8452B*
  ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
-OUI:2CDD95*
- ID_OUI_FROM_DATABASE=Taicang T&W Electronics
+OUI:C8028F*
+ ID_OUI_FROM_DATABASE=Nova Electronics (Shanghai) Co., Ltd.
+
+OUI:60EFC6*
+ ID_OUI_FROM_DATABASE=Shenzhen Chima Technologies Co Limited
+
+OUI:502B73*
+ ID_OUI_FROM_DATABASE=Tenda Technology Co.,Ltd.Dongguan branch
+
+OUI:20DBAB*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co., Ltd.
+
+OUI:000DF0*
+ ID_OUI_FROM_DATABASE=QCOM TECHNOLOGY INC.
 
 OUI:5C9960*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
+OUI:5CF7E6*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:A0D795*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
 OUI:CC088D*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
 OUI:0080FB*
  ID_OUI_FROM_DATABASE=BVM LIMITED
 
-OUI:107223*
- ID_OUI_FROM_DATABASE=TELLESCOM INDUSTRIA E COMERCIO EM TELECOMUNICACAO
+OUI:002722*
+ ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
 
-OUI:AC84C9*
- ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:687251*
+ ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
 
-OUI:14EDBB*
- ID_OUI_FROM_DATABASE=2Wire Inc
+OUI:B4FBE4*
+ ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
 
-OUI:44BA46*
+OUI:188B15*
+ ID_OUI_FROM_DATABASE=ShenZhen ZhongRuiJing Technology co.,LTD
+
+OUI:E02CF3*
+ ID_OUI_FROM_DATABASE=MRS Electronic GmbH
+
+OUI:F41F88*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:D816C1*
+ ID_OUI_FROM_DATABASE=DEWAV (HK) ELECTRONICS LIMITED
+
+OUI:7CCC1F*
  ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
 
-OUI:B4D135*
- ID_OUI_FROM_DATABASE=Cloudistics
+OUI:C0854C*
+ ID_OUI_FROM_DATABASE=Ragentek Technology Group
 
-OUI:A8AD3D*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
+OUI:00FD45*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:E03005*
- ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd
+OUI:9C83BF*
+ ID_OUI_FROM_DATABASE=PRO-VISION, Inc.
 
-OUI:2824FF*
- ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
+OUI:9C13AB*
+ ID_OUI_FROM_DATABASE=Chanson Water Co., Ltd.
 
-OUI:14C1FF*
- ID_OUI_FROM_DATABASE=ShenZhen QianHai Comlan communication Co.,LTD
+OUI:883C1C*
+ ID_OUI_FROM_DATABASE=MERCURY CORPORATION
 
-OUI:EC8EB5*
- ID_OUI_FROM_DATABASE=Hewlett Packard
+OUI:9C5D12*
+ ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
 
-OUI:70AF6A*
- ID_OUI_FROM_DATABASE=SHENZHEN FENGLIAN TECHNOLOGY CO., LTD.
+OUI:001F82*
+ ID_OUI_FROM_DATABASE=Cal-Comp Electronics & Communications Company Ltd.
 
-OUI:0026F1*
- ID_OUI_FROM_DATABASE=ProCurve Networking by HP
+OUI:0C0227*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
 
-OUI:B439D6*
- ID_OUI_FROM_DATABASE=ProCurve Networking by HP
+OUI:C0288D*
+ ID_OUI_FROM_DATABASE=Logitech, Inc
 
-OUI:001CEF*
- ID_OUI_FROM_DATABASE=Primax Electronics Ltd.
+OUI:9C1E95*
+ ID_OUI_FROM_DATABASE=Actiontec Electronics, Inc
 
-OUI:000276*
- ID_OUI_FROM_DATABASE=Primax Electronics Ltd.
+OUI:E078A3*
+ ID_OUI_FROM_DATABASE=Shanghai Winner Information Technology Co.,Inc
 
-OUI:4849C7*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:B49691*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:001F9A*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:9CD9CB*
+ ID_OUI_FROM_DATABASE=Lesira Manufacturing Pty Ltd
 
-OUI:0014C7*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:002590*
+ ID_OUI_FROM_DATABASE=Super Micro Computer, Inc.
 
-OUI:001540*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:187532*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
 
-OUI:0017D1*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:E0DCA0*
+ ID_OUI_FROM_DATABASE=Siemens Industrial Automation Products Ltd Chengdu
 
-OUI:0015E8*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:DCD255*
+ ID_OUI_FROM_DATABASE=Kinpo Electronics, Inc.
 
-OUI:001660*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:805A04*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
 
-OUI:001BBA*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:B0EE7B*
+ ID_OUI_FROM_DATABASE=Roku, Inc
 
-OUI:205EF7*
+OUI:E8EADA*
+ ID_OUI_FROM_DATABASE=Denkovi Assembly Electronics LTD
+
+OUI:480C49*
+ ID_OUI_FROM_DATABASE=NAKAYO Inc
+
+OUI:00D0EC*
+ ID_OUI_FROM_DATABASE=NAKAYO Inc
+
+OUI:B0702D*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:D0C5F3*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:60F445*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:00B362*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:F86214*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:C0E54E*
+ ID_OUI_FROM_DATABASE=ARIES Embedded GmbH
+
+OUI:001D72*
+ ID_OUI_FROM_DATABASE=Wistron Corporation
+
+OUI:0C73BE*
+ ID_OUI_FROM_DATABASE=Dongguan Haimai Electronie Technology Co.,Ltd
+
+OUI:20780B*
+ ID_OUI_FROM_DATABASE=Delta Faucet Company
+
+OUI:24D51C*
+ ID_OUI_FROM_DATABASE=Zhongtian broadband technology co., LTD
+
+OUI:28FECD*
+ ID_OUI_FROM_DATABASE=Lemobile Information Technology (Beijing) Co., Ltd.
+
+OUI:001992*
+ ID_OUI_FROM_DATABASE=Adtran Inc
+
+OUI:4C1694*
+ ID_OUI_FROM_DATABASE=shenzhen sibituo Technology Co., Ltd
+
+OUI:6C160E*
+ ID_OUI_FROM_DATABASE=ShotTracker
+
+OUI:7C1015*
+ ID_OUI_FROM_DATABASE=Brilliant Home Technology, Inc.
+
+OUI:4C7872*
+ ID_OUI_FROM_DATABASE=Cav. Uff. Giacomo Cimberio S.p.A.
+
+OUI:5CAF06*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+
+OUI:78C1A7*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:540384*
+ ID_OUI_FROM_DATABASE=Hangkong Nano IC Technologies Co., Ltd
+
+OUI:004BF3*
+ ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
+
+OUI:28A24B*
+ ID_OUI_FROM_DATABASE=Juniper Networks
+
+OUI:044E06*
+ ID_OUI_FROM_DATABASE=Ericsson AB
+
+OUI:001BB5*
+ ID_OUI_FROM_DATABASE=Cherry GmbH
+
+OUI:6014B3*
+ ID_OUI_FROM_DATABASE=CyberTAN Technology Inc.
+
+OUI:602103*
+ ID_OUI_FROM_DATABASE=I4VINE, INC
+
+OUI:B81DAA*
+ ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
+
+OUI:407D0F*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:3805AC*
+ ID_OUI_FROM_DATABASE=Piller Group GmbH
+
+OUI:F8BBBF*
+ ID_OUI_FROM_DATABASE=eero inc.
+
+OUI:000130*
+ ID_OUI_FROM_DATABASE=Extreme Networks
+
+OUI:706DEC*
+ ID_OUI_FROM_DATABASE=Wifi-soft LLC
+
+OUI:AC6B0F*
+ ID_OUI_FROM_DATABASE=CADENCE DESIGN SYSTEMS INC
+
+OUI:00BB3A*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:E0CB1D*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:84D6D0*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
+OUI:34D270*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
+OUI:CC82EB*
+ ID_OUI_FROM_DATABASE=KYOCERA CORPORATION
+
+OUI:5082D5*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:9C84BF*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
+
+OUI:7894B4*
+ ID_OUI_FROM_DATABASE=Sercomm Corporation.
+
+OUI:000F17*
+ ID_OUI_FROM_DATABASE=Insta Elektro GmbH
+
+OUI:002365*
+ ID_OUI_FROM_DATABASE=Insta Elektro GmbH
+
+OUI:C4EEF5*
+ ID_OUI_FROM_DATABASE=II-VI Incorporated
+
+OUI:002CC8*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:70AF24*
+ ID_OUI_FROM_DATABASE=TP Vision Belgium NV
+
+OUI:7CE97C*
+ ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
+
+OUI:285F2F*
+ ID_OUI_FROM_DATABASE=RNware Co.,Ltd.
+
+OUI:E0C0D1*
+ ID_OUI_FROM_DATABASE=CK Telecom (Shenzhen) Limited
+
+OUI:948BC1*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00034B*
- ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:4827EA*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:00001B*
- ID_OUI_FROM_DATABASE=Novell, Inc.
+OUI:049573*
+ ID_OUI_FROM_DATABASE=zte corporation
 
-OUI:00E011*
- ID_OUI_FROM_DATABASE=UNIDEN CORPORATION
+OUI:48BF6B*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:B03EB0*
- ID_OUI_FROM_DATABASE=MICRODIA Ltd.
+OUI:245BA7*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:00126C*
- ID_OUI_FROM_DATABASE=Visonic Technologies 1993 Ltd.
+OUI:BCA920*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:18ABF5*
- ID_OUI_FROM_DATABASE=Ultra Electronics Electrics
+OUI:D055B2*
+ ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
 
-OUI:304487*
- ID_OUI_FROM_DATABASE=Hefei Radio Communication Technology Co., Ltd
+OUI:A49BF5*
+ ID_OUI_FROM_DATABASE=Hybridserver Tec GmbH
 
-OUI:AC6175*
+OUI:B436E3*
+ ID_OUI_FROM_DATABASE=KBVISION GROUP
+
+OUI:488803*
+ ID_OUI_FROM_DATABASE=ManTechnology Inc.
+
+OUI:7C6BF7*
+ ID_OUI_FROM_DATABASE=NTI co., ltd.
+
+OUI:54E061*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+
+OUI:B47C9C*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
+OUI:E81367*
+ ID_OUI_FROM_DATABASE=AIRSOUND Inc.
+
+OUI:64D154*
+ ID_OUI_FROM_DATABASE=Routerboard.com
+
+OUI:0020DA*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent Enterprise
+
+OUI:345BBB*
+ ID_OUI_FROM_DATABASE=GD Midea Air-Conditioning Equipment Co.,Ltd.
+
+OUI:34CE00*
+ ID_OUI_FROM_DATABASE=XIAOMI Electronics,CO.,LTD
+
+OUI:F82F08*
+ ID_OUI_FROM_DATABASE=Molex
+
+OUI:68262A*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+
+OUI:680235*
+ ID_OUI_FROM_DATABASE=Konten Networks Inc.
+
+OUI:3C678C*
  ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:AC482D*
- ID_OUI_FROM_DATABASE=Ralinwi Nanjing Electronic Technology Co., Ltd.
+OUI:D06F82*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:A48269*
- ID_OUI_FROM_DATABASE=Datrium, Inc.
+OUI:844765*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:441441*
- ID_OUI_FROM_DATABASE=AudioControl Inc.
+OUI:A0C4A5*
+ ID_OUI_FROM_DATABASE=SYGN HOUSE CO.,LTD
 
-OUI:0018DA*
- ID_OUI_FROM_DATABASE=AMBER wireless GmbH
+OUI:506787*
+ ID_OUI_FROM_DATABASE=Planet Networks
 
-OUI:EC24B8*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:C83A6B*
+ ID_OUI_FROM_DATABASE=Roku, Inc
 
-OUI:68C90B*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:B4C6F8*
+ ID_OUI_FROM_DATABASE=Axilspot Communication
 
-OUI:F4B85E*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:B83A08*
+ ID_OUI_FROM_DATABASE=Tenda Technology Co.,Ltd.Dongguan branch
 
-OUI:5C313E*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:388C50*
+ ID_OUI_FROM_DATABASE=LG Electronics
 
-OUI:A0E6F8*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:50D37F*
+ ID_OUI_FROM_DATABASE=Yu Fly Mikly Way Science and Technology Co., Ltd.
 
-OUI:20C38F*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:D8D866*
+ ID_OUI_FROM_DATABASE=SHENZHEN TOZED TECHNOLOGIES CO.,LTD.
 
-OUI:D0FF50*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:F43E61*
+ ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
 
-OUI:7472B0*
- ID_OUI_FROM_DATABASE=Guangzhou Shiyuan Electronics Co., Ltd.
+OUI:001FA4*
+ ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
 
-OUI:44BFE3*
- ID_OUI_FROM_DATABASE=Shenzhen Longtech Electronics Co.,Ltd
+OUI:1C5A0B*
+ ID_OUI_FROM_DATABASE=Tegile Systems
 
-OUI:F45214*
- ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
+OUI:38AC3D*
+ ID_OUI_FROM_DATABASE=Nephos Inc
 
-OUI:689E19*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:A09347*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:985945*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:C8F230*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:1CE2CC*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:1C77F6*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:44C15C*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:E44790*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:0017E9*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:D4503F*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
 
-OUI:0017E7*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:8425A4*
+ ID_OUI_FROM_DATABASE=Tariox Limited
 
-OUI:D00790*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:D8C8E9*
+ ID_OUI_FROM_DATABASE=Phicomm (Shanghai) Co., Ltd.
 
-OUI:04E451*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:CC90E8*
+ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
 
-OUI:B0D5CC*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:88CC45*
+ ID_OUI_FROM_DATABASE=Skyworth Digital Technology(Shenzhen) Co.,Ltd
 
-OUI:5CF821*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:605317*
+ ID_OUI_FROM_DATABASE=Sandstone Technologies
 
-OUI:FC0F4B*
+OUI:50338B*
  ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:3C6FEA*
- ID_OUI_FROM_DATABASE=Panasonic India Pvt. Ltd.
+OUI:986C5C*
+ ID_OUI_FROM_DATABASE=Jiangxi Gosun Guard Security Co.,Ltd
 
-OUI:A863F2*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:F4FCB1*
+ ID_OUI_FROM_DATABASE=JJ Corp
 
-OUI:948854*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:543B30*
+ ID_OUI_FROM_DATABASE=duagon AG
 
-OUI:001237*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:60BA18*
+ ID_OUI_FROM_DATABASE=nextLAP GmbH
 
-OUI:BC6A29*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:704CA5*
+ ID_OUI_FROM_DATABASE=Fortinet, Inc.
 
-OUI:C0E422*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:40163B*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001830*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:5C497D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:1CBA8C*
- ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:E47DBD*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:7CA97D*
- ID_OUI_FROM_DATABASE=Objenious
+OUI:503DA1*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:58FB84*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:508569*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:E0E7BB*
- ID_OUI_FROM_DATABASE=Nureva, Inc.
+OUI:1077B1*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:BC8AA3*
- ID_OUI_FROM_DATABASE=NHN Entertainment
+OUI:5CF6DC*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:70A84C*
- ID_OUI_FROM_DATABASE=MONAD., Inc.
+OUI:380195*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:407009*
+OUI:BC1485*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:88D50C*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+
+OUI:509A4C*
+ ID_OUI_FROM_DATABASE=Dell Inc.
+
+OUI:00180A*
+ ID_OUI_FROM_DATABASE=Cisco Meraki
+
+OUI:AC2205*
+ ID_OUI_FROM_DATABASE=Compal Broadband Networks, Inc.
+
+OUI:80A036*
+ ID_OUI_FROM_DATABASE=Shanghai MXCHIP Information Technology Co., Ltd.
+
+OUI:0012C9*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:94877C*
+OUI:984B4A*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001DD2*
+OUI:001A77*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:9C3426*
+OUI:CC7D37*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:3C7A8A*
+OUI:0017E2*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:000FCC*
+OUI:001784*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:BCCAB5*
+OUI:0016B5*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+
+OUI:001675*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:5C8FE0*
+OUI:00D088*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:6CCA08*
+OUI:0017EE*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:5465DE*
+OUI:001180*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:F8EDA5*
+OUI:00909C*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:00A289*
- ID_OUI_FROM_DATABASE=Cisco Systems, Inc
-
-OUI:ACEC80*
+OUI:8096B1*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0015A4*
+OUI:7CBFB1*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
 OUI:0015A3*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:7CBFB1*
+OUI:0015A4*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:8096B1*
+OUI:9C3426*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:00909C*
+OUI:001DD2*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001180*
+OUI:00211E*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0017EE*
+OUI:002210*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:00D088*
+OUI:001FC4*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001675*
+OUI:001C12*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0016B5*
+OUI:001CFB*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001784*
+OUI:D42C0F*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0017E2*
+OUI:8496D8*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:CC7D37*
+OUI:80F503*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001A77*
+OUI:5CB066*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:984B4A*
+OUI:C0C522*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:80F503*
+OUI:0024A0*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:8496D8*
+OUI:002636*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:D42C0F*
+OUI:E48399*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
 OUI:E0B7B1*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:002210*
+OUI:94877C*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:00211E*
+OUI:407009*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:E48399*
+OUI:F8EDA5*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:002636*
+OUI:5465DE*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0024A0*
+OUI:6CCA08*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:0012C9*
+OUI:5C8FE0*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001CFB*
+OUI:8C395C*
+ ID_OUI_FROM_DATABASE=Bit4id Srl
+
+OUI:BCCAB5*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001C12*
+OUI:000FCC*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:001FC4*
+OUI:3C7A8A*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:C0C522*
+OUI:ACEC80*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:5CB066*
+OUI:2CA17D*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:486DBB*
- ID_OUI_FROM_DATABASE=Vestel Elektronik San ve Tic. A.Ş.
+OUI:309C23*
+ ID_OUI_FROM_DATABASE=Micro-Star INTL CO., LTD.
 
-OUI:6C1E90*
- ID_OUI_FROM_DATABASE=Hansol Technics Co., Ltd.
+OUI:947BE7*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:E09DFA*
- ID_OUI_FROM_DATABASE=Wanan Hongsheng Electronic Co.Ltd
+OUI:2C2617*
+ ID_OUI_FROM_DATABASE=Oculus VR, LLC
 
-OUI:34E71C*
- ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
+OUI:98F7D7*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:182861*
- ID_OUI_FROM_DATABASE=AirTies Wireless Networks
+OUI:2C41A1*
+ ID_OUI_FROM_DATABASE=Bose Corporation
 
-OUI:8841FC*
- ID_OUI_FROM_DATABASE=AirTies Wireless Networks
+OUI:C8DE51*
+ ID_OUI_FROM_DATABASE=IntegraOptics
 
-OUI:BCB1F3*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:182CB4*
+ ID_OUI_FROM_DATABASE=Nectarsoft Co., Ltd.
 
-OUI:38ECE4*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:14780B*
+ ID_OUI_FROM_DATABASE=PerkinElmer Technologies GmbH & Co. KG
 
-OUI:CCF9E8*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:74DADA*
+ ID_OUI_FROM_DATABASE=D-Link International
 
-OUI:F0E77E*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:4C910C*
+ ID_OUI_FROM_DATABASE=Corporativo Lanix S.A. de C.V.
 
-OUI:5CE8EB*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:BCD713*
+ ID_OUI_FROM_DATABASE=Owl Labs
 
-OUI:B8D9CE*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:E8E1E1*
+ ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
 
-OUI:6CB7F4*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:98F2B3*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
 
-OUI:182666*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:BC1C81*
+ ID_OUI_FROM_DATABASE=Sichuan iLink Technology Co., Ltd.
 
-OUI:C06599*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:CCF954*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:CC07AB*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:581626*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:E84E84*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:B4B017*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:50FC9F*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:64C354*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:E432CB*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F873A2*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:889B39*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:646A52*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:BC72B1*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:64A7DD*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:78F7BE*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:6CFA58*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:70F927*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:3475C7*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:301966*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:C4BED4*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:28BAB5*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:30FE31*
+ ID_OUI_FROM_DATABASE=Nokia
 
-OUI:103B59*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:703018*
+ ID_OUI_FROM_DATABASE=Avaya Inc
 
-OUI:7C11CB*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:78B28D*
+ ID_OUI_FROM_DATABASE=Beijing Tengling Technology CO.Ltd
 
-OUI:A4CAA0*
- ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:000CAB*
+ ID_OUI_FROM_DATABASE=Commend International GmbH
 
-OUI:001EE1*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:00EC0A*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
 
-OUI:F49F54*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:A86B7C*
+ ID_OUI_FROM_DATABASE=SHENZHEN FENGLIAN TECHNOLOGY CO., LTD.
 
-OUI:0018AF*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:9CA5C0*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:00214C*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:1CDA27*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:001632*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:70D923*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
 
-OUI:D0667B*
+OUI:F430B9*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:2C9EEC*
+ ID_OUI_FROM_DATABASE=Jabil Circuit Penang
+
+OUI:943FC2*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
+
+OUI:A06A44*
+ ID_OUI_FROM_DATABASE=Vizio, Inc
+
+OUI:B44F96*
+ ID_OUI_FROM_DATABASE=Zhejiang Xinzailing Technology co., ltd
+
+OUI:D822F4*
+ ID_OUI_FROM_DATABASE=Avnet Silica
+
+OUI:58493B*
+ ID_OUI_FROM_DATABASE=Palo Alto Networks
+
+OUI:D083D4*
+ ID_OUI_FROM_DATABASE=Xtel Wireless ApS
+
+OUI:7CEB7F*
+ ID_OUI_FROM_DATABASE=Dmet Products Corp.
+
+OUI:8C8580*
+ ID_OUI_FROM_DATABASE=Smart Innovation LLC
+
+OUI:C4571F*
+ ID_OUI_FROM_DATABASE=June Life Inc
+
+OUI:FC5A1D*
+ ID_OUI_FROM_DATABASE=Hitron Technologies. Inc
+
+OUI:287B09*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:4859A4*
+ ID_OUI_FROM_DATABASE=zte corporation
+
+OUI:3894E0*
+ ID_OUI_FROM_DATABASE=Syrotech Networks. Ltd.
+
+OUI:34F64B*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
+OUI:ACED5C*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
+OUI:18204C*
+ ID_OUI_FROM_DATABASE=Kummler+Matter AG
+
+OUI:740ABC*
+ ID_OUI_FROM_DATABASE=LightwaveRF Technology Ltd
+
+OUI:54BD79*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:001377*
+OUI:D86C63*
+ ID_OUI_FROM_DATABASE=Google, Inc.
+
+OUI:743E2B*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
+
+OUI:D838FC*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
+
+OUI:0CF4D5*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
+
+OUI:AC6706*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
+
+OUI:94F665*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
+
+OUI:E0107F*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
+
+OUI:001392*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
+
+OUI:7811DC*
+ ID_OUI_FROM_DATABASE=XIAOMI Electronics,CO.,LTD
+
+OUI:D837BE*
+ ID_OUI_FROM_DATABASE=SHENZHEN GONGJIN ELECTRONICS CO.,LT
+
+OUI:DC44B6*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:50B7C3*
+OUI:1007B6*
  ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
 
-OUI:5CA39D*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
+OUI:F4939F*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co., Ltd.
 
-OUI:38AA3C*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
+OUI:000C03*
+ ID_OUI_FROM_DATABASE=HDMI Licensing, LLC
 
-OUI:206432*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
+OUI:CC2F71*
+ ID_OUI_FROM_DATABASE=Intel Corporate
 
-OUI:8018A7*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:F82819*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:002637*
- ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
+OUI:F4B520*
+ ID_OUI_FROM_DATABASE=Biostar Microtech international corp.
 
-OUI:B88EDF*
- ID_OUI_FROM_DATABASE=Zencheer Communication Technology Co., Ltd.
+OUI:9C93E4*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:707781*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:D4B27A*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:606DC7*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:F0F8F2*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:681401*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:341513*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:0071CC*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:64CFD9*
+ ID_OUI_FROM_DATABASE=Texas Instruments
 
-OUI:F866D1*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:24B2DE*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
 
-OUI:F80D43*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:50E971*
+ ID_OUI_FROM_DATABASE=Jibo, Inc.
 
-OUI:785968*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:50642B*
+ ID_OUI_FROM_DATABASE=XIAOMI Electronics,CO.,LTD
 
-OUI:002556*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:909D7D*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:00265C*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:84A1D1*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
-OUI:90CDB6*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:783690*
+ ID_OUI_FROM_DATABASE=Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd
 
-OUI:001E4C*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:788102*
+ ID_OUI_FROM_DATABASE=Sercomm Corporation.
 
-OUI:F8DA0C*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:58A0CB*
+ ID_OUI_FROM_DATABASE=TrackNet, Inc
 
-OUI:342387*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:586163*
+ ID_OUI_FROM_DATABASE=Quantum Networks (SG) Pte. Ltd.
 
-OUI:9034FC*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:3C7843*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:906EBB*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:A47758*
+ ID_OUI_FROM_DATABASE=Ningbo Freewings Technologies Co.,Ltd
 
-OUI:1C666D*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:00051E*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:CCAF78*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:080088*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:904CE5*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:00010F*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:002268*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:00197F*
+ ID_OUI_FROM_DATABASE=PLANTRONICS, INC.
 
-OUI:001FE1*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:E4F4C6*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:689423*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:001E2A*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:B8763F*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:0014C9*
+ ID_OUI_FROM_DATABASE=Brocade Communications Systems, Inc.
 
-OUI:1C3E84*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:00184D*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:C01885*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:0026F2*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:B01041*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:30469A*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:D85DE2*
- ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+OUI:4C60DE*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:949AA9*
- ID_OUI_FROM_DATABASE=Microsoft Corporation
+OUI:E8FCAF*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:F8633F*
- ID_OUI_FROM_DATABASE=Intel Corporate
+OUI:200CC8*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:088620*
- ID_OUI_FROM_DATABASE=TECNO MOBILE LIMITED
+OUI:DCEF09*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:A42983*
- ID_OUI_FROM_DATABASE=Boeing Defence Australia
+OUI:A06391*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:702E22*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:A040A0*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:B0C128*
- ID_OUI_FROM_DATABASE=Adler ELREHA GmbH
+OUI:8C3BAD*
+ ID_OUI_FROM_DATABASE=NETGEAR
 
-OUI:5CA933*
- ID_OUI_FROM_DATABASE=Luma Home
+OUI:005079*
+ ID_OUI_FROM_DATABASE=Private
 
-OUI:60EFC6*
- ID_OUI_FROM_DATABASE=Shenzhen Chima Technologies Co Limited
+OUI:F86465*
+ ID_OUI_FROM_DATABASE=Anova Applied Electronics, Inc.
 
-OUI:502B73*
- ID_OUI_FROM_DATABASE=Tenda Technology Co.,Ltd.Dongguan branch
+OUI:A830AD*
+ ID_OUI_FROM_DATABASE=Weifang GoerTek Technology Co.,Ltd.
 
-OUI:20DBAB*
- ID_OUI_FROM_DATABASE=Samsung Electronics Co., Ltd.
+OUI:70E1FD*
+ ID_OUI_FROM_DATABASE=FLEXTRONICS
 
-OUI:000DF0*
- ID_OUI_FROM_DATABASE=QCOM TECHNOLOGY INC.
+OUI:001D44*
+ ID_OUI_FROM_DATABASE=Krohne
 
-OUI:5CF7E6*
+OUI:D4D2E5*
+ ID_OUI_FROM_DATABASE=BKAV Corporation
+
+OUI:C06D1A*
+ ID_OUI_FROM_DATABASE=Tianjin Henxinhuifeng Technology Co.,Ltd.
+
+OUI:3432E6*
+ ID_OUI_FROM_DATABASE=Panasonic Industrial Devices Europe GmbH
+
+OUI:40A3CC*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
+OUI:E470B8*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
+OUI:B019C6*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:A0D795*
+OUI:58E28F*
  ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:002722*
- ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
+OUI:AC1F74*
+ ID_OUI_FROM_DATABASE=Apple, Inc.
 
-OUI:687251*
- ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
+OUI:303855*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:B4FBE4*
- ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
+OUI:FCE557*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
 
-OUI:188B15*
- ID_OUI_FROM_DATABASE=ShenZhen ZhongRuiJing Technology co.,LTD
+OUI:9C305B*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
 
-OUI:CCB0DA*
+OUI:00289F*
+ ID_OUI_FROM_DATABASE=Semptian Co., Ltd.
+
+OUI:8C4500*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+
+OUI:6C7660*
+ ID_OUI_FROM_DATABASE=KYOCERA CORPORATION
+
+OUI:104B46*
+ ID_OUI_FROM_DATABASE=Mitsubishi Electric Corporation
+
+OUI:903DBD*
+ ID_OUI_FROM_DATABASE=SECURE METERS LIMITED
+
+OUI:384F49*
+ ID_OUI_FROM_DATABASE=Juniper Networks
+
+OUI:A491B1*
+ ID_OUI_FROM_DATABASE=Technicolor
+
+OUI:8CD48E*
+ ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
+
+OUI:642B8A*
+ ID_OUI_FROM_DATABASE=ALL BEST Industrial Co., Ltd.
+
+OUI:68ECC5*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
+OUI:CC9891*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:1C7022*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+
+OUI:947EB9*
+ ID_OUI_FROM_DATABASE=National Narrowband Network Communications Pty Ltd
+
+OUI:4CBD8F*
+ ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
+
+OUI:B4D64E*
+ ID_OUI_FROM_DATABASE=Caldero Limited
+
+OUI:F89DBB*
+ ID_OUI_FROM_DATABASE=Tintri
+
+OUI:D4389C*
+ ID_OUI_FROM_DATABASE=Sony Mobile Communications AB
+
+OUI:104963*
+ ID_OUI_FROM_DATABASE=HARTING K.K.
+
+OUI:646E69*
  ID_OUI_FROM_DATABASE=Liteon Technology Corporation
 
-OUI:E02CF3*
- ID_OUI_FROM_DATABASE=MRS Electronic GmbH
+OUI:BC3D85*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:F41F88*
- ID_OUI_FROM_DATABASE=zte corporation
+OUI:B0E17E*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:D816C1*
- ID_OUI_FROM_DATABASE=DEWAV (HK) ELECTRONICS LIMITED
+OUI:74D21D*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
 
-OUI:7CCC1F*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+OUI:44C874*
+ ID_OUI_FROM_DATABASE=China Mobile Group Device Co.,Ltd.
 
-OUI:C0854C*
- ID_OUI_FROM_DATABASE=Ragentek Technology Group
+OUI:98EF9B*
+ ID_OUI_FROM_DATABASE=OHSUNG
 
-OUI:00FD45*
- ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
+OUI:84E327*
+ ID_OUI_FROM_DATABASE=TAILYN TECHNOLOGIES INC
+
+OUI:7091F3*
+ ID_OUI_FROM_DATABASE=Universal Electronics, Inc.
+
+OUI:68C63A*
+ ID_OUI_FROM_DATABASE=Espressif Inc.
+
+OUI:F4E204*
+ ID_OUI_FROM_DATABASE=Traqueur
+
+OUI:3456FE*
+ ID_OUI_FROM_DATABASE=Cisco Meraki
+
+OUI:08674E*
+ ID_OUI_FROM_DATABASE=Hisense broadband multimedia technology Co.,Ltd
+
+OUI:F08CFB*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
+OUI:F0407B*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
+OUI:BCC00F*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
+OUI:6405E9*
+ ID_OUI_FROM_DATABASE=Shenzhen WayOS Technology Crop., Ltd.
+
+OUI:B8C716*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
+OUI:50A83A*
+ ID_OUI_FROM_DATABASE=S Mobile Devices Limited
+
+OUI:EC8AC7*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
+OUI:E084F3*
+ ID_OUI_FROM_DATABASE=High Grade Controls Corporation
+
+OUI:74BBD3*
+ ID_OUI_FROM_DATABASE=Shenzhen xeme Communication Co., Ltd.
+
+OUI:D8ED1C*
+ ID_OUI_FROM_DATABASE=Magna Technology SL
+
+OUI:78617C*
+ ID_OUI_FROM_DATABASE=MITSUMI ELECTRIC CO.,LTD.
+
+OUI:00A096*
+ ID_OUI_FROM_DATABASE=MITSUMI ELECTRIC CO.,LTD.
+
+OUI:A07099*
+ ID_OUI_FROM_DATABASE=Beijing Huacan Electronics Co., Ltd
+
+OUI:B0935B*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+
+OUI:20F19E*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+
+OUI:389D92*
+ ID_OUI_FROM_DATABASE=Seiko Epson Corporation
+
+OUI:74860B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:C0174D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:A407B6*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:149F3C*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:149FB6*
+ ID_OUI_FROM_DATABASE=GUANGDONG GENIUS TECHNOLOGY CO.,LTD.
+
+OUI:7C1C4E*
+ ID_OUI_FROM_DATABASE=LG Innotek
+
+OUI:70708B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:BC903A*
+ ID_OUI_FROM_DATABASE=Robert Bosch GmbH
+
+OUI:603D26*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+
+OUI:3820A8*
+ ID_OUI_FROM_DATABASE=ColorTokens, Inc.
+
+OUI:705896*
+ ID_OUI_FROM_DATABASE=InShow Technology
+
+OUI:D05995*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
+OUI:54DF24*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
+OUI:78870D*
+ ID_OUI_FROM_DATABASE=Unifiedgateways India Private Limited
+
+OUI:3CA616*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
index 3731b33..6463447 100644 (file)
@@ -6,9 +6,15 @@
 #
 # With various additions from other sources
 
+acpi:3GVR*:
+ ID_VENDOR_FROM_DATABASE=VR Technology Holdings Limited
+
 acpi:3NOD*:
  ID_VENDOR_FROM_DATABASE=Shenzhen three Connaught Information Technology Co., Ltd. (3nod Group)
 
+acpi:AANT*:
+ ID_VENDOR_FROM_DATABASE=AAEON Technology Inc.
+
 acpi:AAVA*:
  ID_VENDOR_FROM_DATABASE=Aava Mobile Oy
 
@@ -36,6 +42,9 @@ acpi:ATML*:
 acpi:AUTH*:
  ID_VENDOR_FROM_DATABASE=AuthenTec
 
+acpi:BOOT*:
+ ID_VENDOR_FROM_DATABASE=Coreboot Project
+
 acpi:BOSC*:
  ID_VENDOR_FROM_DATABASE=Robert Bosch GmbH
 
@@ -66,12 +75,18 @@ acpi:ELAN*:
 acpi:ESSX*:
  ID_VENDOR_FROM_DATABASE=Everest Semiconductor Co., Ltd.
 
+acpi:EXAR*:
+ ID_VENDOR_FROM_DATABASE=Exar Corporation
+
 acpi:FRSC*:
  ID_VENDOR_FROM_DATABASE=Freescale, Inc
 
 acpi:FTSC*:
  ID_VENDOR_FROM_DATABASE=FocalTech Systems Co., Ltd.
 
+acpi:GHSW*:
+ ID_VENDOR_FROM_DATABASE=Green Hills Software
+
 acpi:GOOG*:
  ID_VENDOR_FROM_DATABASE=Google, Inc.
 
@@ -126,9 +141,15 @@ acpi:LNRO*:
 acpi:LNUX*:
  ID_VENDOR_FROM_DATABASE=The Linux Foundation
 
+acpi:MCHP*:
+ ID_VENDOR_FROM_DATABASE=Microchip Technology Inc
+
 acpi:MIPI*:
  ID_VENDOR_FROM_DATABASE=MIPI Alliance
 
+acpi:MRVL*:
+ ID_VENDOR_FROM_DATABASE=Marvell Technology Group Ltd.
+
 acpi:MSAY*:
  ID_VENDOR_FROM_DATABASE=Microsoft Corporation
 
@@ -228,6 +249,9 @@ acpi:AAE*:
 acpi:AAM*:
  ID_VENDOR_FROM_DATABASE=Aava Mobile Oy
 
+acpi:AAN*:
+ ID_VENDOR_FROM_DATABASE=AAEON Technology Inc.
+
 acpi:AAT*:
  ID_VENDOR_FROM_DATABASE=Ann Arbor Technologies
 
@@ -880,6 +904,9 @@ acpi:AXC*:
  ID_VENDOR_FROM_DATABASE=AXIOMTEK CO., LTD.
 
 acpi:AXE*:
+ ID_VENDOR_FROM_DATABASE=Axell Corporation
+
+acpi:AXE*:
  ID_VENDOR_FROM_DATABASE=D-Link Systems Inc
 
 acpi:AXI*:
@@ -933,6 +960,9 @@ acpi:BBH*:
 acpi:BBL*:
  ID_VENDOR_FROM_DATABASE=Brain Boxes Limited
 
+acpi:BBX*:
+ ID_VENDOR_FROM_DATABASE=Black Box Corporation
+
 acpi:BCC*:
  ID_VENDOR_FROM_DATABASE=Beaver Computer Corporaton
 
@@ -1308,6 +1338,9 @@ acpi:CHO*:
 acpi:CHP*:
  ID_VENDOR_FROM_DATABASE=CH Products
 
+acpi:CHR*:
+ ID_VENDOR_FROM_DATABASE=christmann informationstechnik + medien GmbH & Co. KG
+
 acpi:CHS*:
  ID_VENDOR_FROM_DATABASE=Agentur Chairos
 
@@ -1932,6 +1965,9 @@ acpi:DPL*:
 acpi:DPM*:
  ID_VENDOR_FROM_DATABASE=ADPM Synthesis sas
 
+acpi:DPN*:
+ ID_VENDOR_FROM_DATABASE=Shanghai Lexiang Technology Limited
+
 acpi:DPS*:
  ID_VENDOR_FROM_DATABASE=Digital Processing Systems
 
@@ -1968,6 +2004,9 @@ acpi:DSD*:
 acpi:DSI*:
  ID_VENDOR_FROM_DATABASE=Digitan Systems Inc
 
+acpi:DSJ*:
+ ID_VENDOR_FROM_DATABASE=VR Technology Holdings Limited
+
 acpi:DSM*:
  ID_VENDOR_FROM_DATABASE=DSM Digital Services GmbH
 
@@ -2697,6 +2736,9 @@ acpi:GFN*:
 acpi:GGL*:
  ID_VENDOR_FROM_DATABASE=Google Inc.
 
+acpi:GGT*:
+ ID_VENDOR_FROM_DATABASE=G2TOUCH KOREA
+
 acpi:GIC*:
  ID_VENDOR_FROM_DATABASE=General Inst. Corporation
 
@@ -3075,6 +3117,9 @@ acpi:HYC*:
 acpi:HYD*:
  ID_VENDOR_FROM_DATABASE=Hydis Technologies.Co.,LTD
 
+acpi:HYL*:
+ ID_VENDOR_FROM_DATABASE=Shanghai Chai Ming Huang Info&Tech Co, Ltd
+
 acpi:HYO*:
  ID_VENDOR_FROM_DATABASE=HYC CO., LTD.
 
@@ -3474,6 +3519,9 @@ acpi:IVI*:
 acpi:IVM*:
  ID_VENDOR_FROM_DATABASE=Iiyama North America
 
+acpi:IVR*:
+ ID_VENDOR_FROM_DATABASE=Inlife-Handnet Co., Ltd.
+
 acpi:IVS*:
  ID_VENDOR_FROM_DATABASE=Intevac Photonics Inc.
 
@@ -3684,6 +3732,9 @@ acpi:KOW*:
 acpi:KPC*:
  ID_VENDOR_FROM_DATABASE=King Phoenix Company
 
+acpi:KPT*:
+ ID_VENDOR_FROM_DATABASE=TPK Holding Co., Ltd
+
 acpi:KRL*:
  ID_VENDOR_FROM_DATABASE=Krell Industries Inc.
 
@@ -4500,6 +4551,9 @@ acpi:MVM*:
 acpi:MVN*:
  ID_VENDOR_FROM_DATABASE=Meta Company
 
+acpi:MVR*:
+ ID_VENDOR_FROM_DATABASE=MediCapture, Inc.
+
 acpi:MVS*:
  ID_VENDOR_FROM_DATABASE=Microvision
 
@@ -5190,6 +5244,9 @@ acpi:PMD*:
 acpi:PMM*:
  ID_VENDOR_FROM_DATABASE=Point Multimedia System
 
+acpi:PMS*:
+ ID_VENDOR_FROM_DATABASE=Pabian Embedded Systems
+
 acpi:PMT*:
  ID_VENDOR_FROM_DATABASE=Promate Electronic Co., Ltd.
 
@@ -5208,6 +5265,9 @@ acpi:PNR*:
 acpi:PNS*:
  ID_VENDOR_FROM_DATABASE=PanaScope
 
+acpi:PNT*:
+ ID_VENDOR_FROM_DATABASE=HOYA Corporation PENTAX Lifecare Division
+
 acpi:PNX*:
  ID_VENDOR_FROM_DATABASE=Phoenix Technologies, Ltd.
 
@@ -5349,6 +5409,9 @@ acpi:PVN*:
 acpi:PVP*:
  ID_VENDOR_FROM_DATABASE=Klos Technologies, Inc.
 
+acpi:PVR*:
+ ID_VENDOR_FROM_DATABASE=Pimax Tech. CO., LTD
+
 acpi:PXC*:
  ID_VENDOR_FROM_DATABASE=Phoenix Contact
 
@@ -6381,6 +6444,9 @@ acpi:TCD*:
 acpi:TCE*:
  ID_VENDOR_FROM_DATABASE=Century Corporation
 
+acpi:TCF*:
+ ID_VENDOR_FROM_DATABASE=Televic Conference
+
 acpi:TCH*:
  ID_VENDOR_FROM_DATABASE=Interaction Systems, Inc
 
@@ -6420,6 +6486,9 @@ acpi:TDC*:
 acpi:TDD*:
  ID_VENDOR_FROM_DATABASE=Tandberg Data Display AS
 
+acpi:TDG*:
+ ID_VENDOR_FROM_DATABASE=Six15 Technologies
+
 acpi:TDK*:
  ID_VENDOR_FROM_DATABASE=TDK USA Corporation
 
@@ -6453,6 +6522,9 @@ acpi:TEK*:
 acpi:TEL*:
  ID_VENDOR_FROM_DATABASE=Promotion and Display Technology Ltd.
 
+acpi:TEN*:
+ ID_VENDOR_FROM_DATABASE=Tencent
+
 acpi:TER*:
  ID_VENDOR_FROM_DATABASE=TerraTec Electronic GmbH
 
@@ -6534,6 +6606,9 @@ acpi:TLK*:
 acpi:TLL*:
  ID_VENDOR_FROM_DATABASE=Thinklogical
 
+acpi:TLN*:
+ ID_VENDOR_FROM_DATABASE=Techlogix Networx
+
 acpi:TLS*:
  ID_VENDOR_FROM_DATABASE=Teleste Educational OY
 
@@ -6660,6 +6735,9 @@ acpi:TRM*:
 acpi:TRN*:
  ID_VENDOR_FROM_DATABASE=Datacommunicatie Tron B.V.
 
+acpi:TRP*:
+ ID_VENDOR_FROM_DATABASE=TRAPEZE GROUP
+
 acpi:TRS*:
  ID_VENDOR_FROM_DATABASE=Torus Systems Ltd
 
@@ -6759,6 +6837,9 @@ acpi:TVD*:
 acpi:TVI*:
  ID_VENDOR_FROM_DATABASE=Truevision
 
+acpi:TVL*:
+ ID_VENDOR_FROM_DATABASE=Total Vision LTD
+
 acpi:TVM*:
  ID_VENDOR_FROM_DATABASE=Taiwan Video & Monitor Corporation
 
@@ -6858,6 +6939,9 @@ acpi:UMG*:
 acpi:UMM*:
  ID_VENDOR_FROM_DATABASE=Universal Multimedia
 
+acpi:UMT*:
+ ID_VENDOR_FROM_DATABASE=UltiMachine
+
 acpi:UNA*:
  ID_VENDOR_FROM_DATABASE=Unisys DSD
 
index 5089ab4..9cba3bf 100644 (file)
@@ -424,7 +424,7 @@ bluetooth:v008A*
  ID_VENDOR_FROM_DATABASE=Jawbone
 
 bluetooth:v008B*
- ID_VENDOR_FROM_DATABASE=Topcorn Positioning Systems, LLC
+ ID_VENDOR_FROM_DATABASE=Topcon Positioning Systems, LLC
 
 bluetooth:v008C*
  ID_VENDOR_FROM_DATABASE=Gimbal Inc. (formerly Qualcomm Labs, Inc. and Qualcomm Retail Solutions, Inc.)
@@ -1231,7 +1231,7 @@ bluetooth:v0197*
  ID_VENDOR_FROM_DATABASE=WiSilica Inc
 
 bluetooth:v0198*
- ID_VENDOR_FROM_DATABASE=Vengit Limited
+ ID_VENDOR_FROM_DATABASE=VENGIT Korlátolt Felelősségű Társaság
 
 bluetooth:v0199*
  ID_VENDOR_FROM_DATABASE=SALTO SYSTEMS S.L.
@@ -2828,3 +2828,294 @@ bluetooth:v03AB*
 
 bluetooth:v03AC*
  ID_VENDOR_FROM_DATABASE=Smablo LTD
+
+bluetooth:v03AD*
+ ID_VENDOR_FROM_DATABASE=XiQ
+
+bluetooth:v03AE*
+ ID_VENDOR_FROM_DATABASE=Allswell Inc.
+
+bluetooth:v03AF*
+ ID_VENDOR_FROM_DATABASE=Comm-N-Sense Corp DBA Verigo
+
+bluetooth:v03B0*
+ ID_VENDOR_FROM_DATABASE=VIBRADORM GmbH
+
+bluetooth:v03B1*
+ ID_VENDOR_FROM_DATABASE=Otodata Wireless Network Inc.
+
+bluetooth:v03B2*
+ ID_VENDOR_FROM_DATABASE=Propagation Systems Limited
+
+bluetooth:v03B3*
+ ID_VENDOR_FROM_DATABASE=Midwest Instruments & Controls
+
+bluetooth:v03B4*
+ ID_VENDOR_FROM_DATABASE=Alpha Nodus, inc.
+
+bluetooth:v03B5*
+ ID_VENDOR_FROM_DATABASE=petPOMM, Inc
+
+bluetooth:v03B6*
+ ID_VENDOR_FROM_DATABASE=Mattel
+
+bluetooth:v03B7*
+ ID_VENDOR_FROM_DATABASE=Airbly Inc.
+
+bluetooth:v03B8*
+ ID_VENDOR_FROM_DATABASE=A-Safe Limited
+
+bluetooth:v03B9*
+ ID_VENDOR_FROM_DATABASE=FREDERIQUE CONSTANT SA
+
+bluetooth:v03BA*
+ ID_VENDOR_FROM_DATABASE=Maxscend Microelectronics Company Limited
+
+bluetooth:v03BB*
+ ID_VENDOR_FROM_DATABASE=Abbott Diabetes Care
+
+bluetooth:v03BC*
+ ID_VENDOR_FROM_DATABASE=ASB Bank Ltd
+
+bluetooth:v03BD*
+ ID_VENDOR_FROM_DATABASE=amadas
+
+bluetooth:v03BE*
+ ID_VENDOR_FROM_DATABASE=Applied Science, Inc.
+
+bluetooth:v03BF*
+ ID_VENDOR_FROM_DATABASE=iLumi Solutions Inc.
+
+bluetooth:v03C0*
+ ID_VENDOR_FROM_DATABASE=Arch Systems Inc.
+
+bluetooth:v03C1*
+ ID_VENDOR_FROM_DATABASE=Ember Technologies, Inc.
+
+bluetooth:v03C2*
+ ID_VENDOR_FROM_DATABASE=Snapchat Inc
+
+bluetooth:v03C3*
+ ID_VENDOR_FROM_DATABASE=Casambi Technologies Oy
+
+bluetooth:v03C4*
+ ID_VENDOR_FROM_DATABASE=Pico Technology Inc.
+
+bluetooth:v03C5*
+ ID_VENDOR_FROM_DATABASE=St. Jude Medical, Inc.
+
+bluetooth:v03C6*
+ ID_VENDOR_FROM_DATABASE=Intricon
+
+bluetooth:v03C7*
+ ID_VENDOR_FROM_DATABASE=Structural Health Systems, Inc.
+
+bluetooth:v03C8*
+ ID_VENDOR_FROM_DATABASE=Avvel International
+
+bluetooth:v03C9*
+ ID_VENDOR_FROM_DATABASE=Gallagher Group
+
+bluetooth:v03CA*
+ ID_VENDOR_FROM_DATABASE=In2things Automation Pvt. Ltd.
+
+bluetooth:v03CB*
+ ID_VENDOR_FROM_DATABASE=SYSDEV Srl
+
+bluetooth:v03CC*
+ ID_VENDOR_FROM_DATABASE=Vonkil Technologies Ltd
+
+bluetooth:v03CD*
+ ID_VENDOR_FROM_DATABASE=Wynd Technologies, Inc.
+
+bluetooth:v03CE*
+ ID_VENDOR_FROM_DATABASE=CONTRINEX S.A.
+
+bluetooth:v03CF*
+ ID_VENDOR_FROM_DATABASE=MIRA, Inc.
+
+bluetooth:v03D0*
+ ID_VENDOR_FROM_DATABASE=Watteam Ltd
+
+bluetooth:v03D1*
+ ID_VENDOR_FROM_DATABASE=Density Inc.
+
+bluetooth:v03D2*
+ ID_VENDOR_FROM_DATABASE=IOT Pot India Private Limited
+
+bluetooth:v03D3*
+ ID_VENDOR_FROM_DATABASE=Sigma Connectivity AB
+
+bluetooth:v03D4*
+ ID_VENDOR_FROM_DATABASE=PEG PEREGO SPA
+
+bluetooth:v03D5*
+ ID_VENDOR_FROM_DATABASE=Wyzelink Systems Inc.
+
+bluetooth:v03D6*
+ ID_VENDOR_FROM_DATABASE=Yota Devices LTD
+
+bluetooth:v03D7*
+ ID_VENDOR_FROM_DATABASE=FINSECUR
+
+bluetooth:v03D8*
+ ID_VENDOR_FROM_DATABASE=Zen-Me Labs Ltd
+
+bluetooth:v03D9*
+ ID_VENDOR_FROM_DATABASE=3IWare Co., Ltd.
+
+bluetooth:v03DA*
+ ID_VENDOR_FROM_DATABASE=EnOcean GmbH
+
+bluetooth:v03DB*
+ ID_VENDOR_FROM_DATABASE=Instabeat, Inc
+
+bluetooth:v03DC*
+ ID_VENDOR_FROM_DATABASE=Nima Labs
+
+bluetooth:v03DD*
+ ID_VENDOR_FROM_DATABASE=Andreas Stihl AG & Co. KG
+
+bluetooth:v03DE*
+ ID_VENDOR_FROM_DATABASE=Nathan Rhoades LLC
+
+bluetooth:v03DF*
+ ID_VENDOR_FROM_DATABASE=Grob Technologies, LLC
+
+bluetooth:v03E0*
+ ID_VENDOR_FROM_DATABASE=Actions (Zhuhai) Technology Co., Limited
+
+bluetooth:v03E1*
+ ID_VENDOR_FROM_DATABASE=SPD Development Company Ltd
+
+bluetooth:v03E2*
+ ID_VENDOR_FROM_DATABASE=Sensoan Oy
+
+bluetooth:v03E3*
+ ID_VENDOR_FROM_DATABASE=Qualcomm Life Inc
+
+bluetooth:v03E4*
+ ID_VENDOR_FROM_DATABASE=Chip-ing AG
+
+bluetooth:v03E5*
+ ID_VENDOR_FROM_DATABASE=ffly4u
+
+bluetooth:v03E6*
+ ID_VENDOR_FROM_DATABASE=IoT Instruments Oy
+
+bluetooth:v03E7*
+ ID_VENDOR_FROM_DATABASE=TRUE Fitness Technology
+
+bluetooth:v03E8*
+ ID_VENDOR_FROM_DATABASE=Reiner Kartengeraete GmbH & Co. KG.
+
+bluetooth:v03E9*
+ ID_VENDOR_FROM_DATABASE=SHENZHEN LEMONJOY TECHNOLOGY CO., LTD.
+
+bluetooth:v03EA*
+ ID_VENDOR_FROM_DATABASE=Hello Inc.
+
+bluetooth:v03EB*
+ ID_VENDOR_FROM_DATABASE=Evollve Inc.
+
+bluetooth:v03EC*
+ ID_VENDOR_FROM_DATABASE=Jigowatts Inc.
+
+bluetooth:v03ED*
+ ID_VENDOR_FROM_DATABASE=BASIC MICRO.COM,INC.
+
+bluetooth:v03EE*
+ ID_VENDOR_FROM_DATABASE=CUBE TECHNOLOGIES
+
+bluetooth:v03EF*
+ ID_VENDOR_FROM_DATABASE=foolography GmbH
+
+bluetooth:v03F0*
+ ID_VENDOR_FROM_DATABASE=CLINK
+
+bluetooth:v03F1*
+ ID_VENDOR_FROM_DATABASE=Hestan Smart Cooking Inc.
+
+bluetooth:v03F2*
+ ID_VENDOR_FROM_DATABASE=WindowMaster A/S
+
+bluetooth:v03F3*
+ ID_VENDOR_FROM_DATABASE=Flowscape AB
+
+bluetooth:v03F4*
+ ID_VENDOR_FROM_DATABASE=PAL Technologies Ltd
+
+bluetooth:v03F5*
+ ID_VENDOR_FROM_DATABASE=WHERE, Inc.
+
+bluetooth:v03F6*
+ ID_VENDOR_FROM_DATABASE=Iton Technology Corp.
+
+bluetooth:v03F7*
+ ID_VENDOR_FROM_DATABASE=Owl Labs Inc.
+
+bluetooth:v03F8*
+ ID_VENDOR_FROM_DATABASE=Rockford Corp.
+
+bluetooth:v03F9*
+ ID_VENDOR_FROM_DATABASE=Becon Technologies Co.,Ltd.
+
+bluetooth:v03FA*
+ ID_VENDOR_FROM_DATABASE=Vyassoft Technologies Inc
+
+bluetooth:v03FB*
+ ID_VENDOR_FROM_DATABASE=Nox Medical
+
+bluetooth:v03FC*
+ ID_VENDOR_FROM_DATABASE=Kimberly-Clark
+
+bluetooth:v03FD*
+ ID_VENDOR_FROM_DATABASE=Trimble Navigation Ltd.
+
+bluetooth:v03FE*
+ ID_VENDOR_FROM_DATABASE=Littelfuse
+
+bluetooth:v03FF*
+ ID_VENDOR_FROM_DATABASE=Withings
+
+bluetooth:v0400*
+ ID_VENDOR_FROM_DATABASE=i-developer IT Beratung UG
+
+bluetooth:v0401*
+ ID_VENDOR_FROM_DATABASE=リレーションズ株式会社
+
+bluetooth:v0402*
+ ID_VENDOR_FROM_DATABASE=Sears Holdings Corporation
+
+bluetooth:v0403*
+ ID_VENDOR_FROM_DATABASE=Gantner Electronic GmbH
+
+bluetooth:v0404*
+ ID_VENDOR_FROM_DATABASE=Authomate Inc
+
+bluetooth:v0405*
+ ID_VENDOR_FROM_DATABASE=Vertex International, Inc.
+
+bluetooth:v0406*
+ ID_VENDOR_FROM_DATABASE=Airtago
+
+bluetooth:v0407*
+ ID_VENDOR_FROM_DATABASE=Swiss Audio SA
+
+bluetooth:v0408*
+ ID_VENDOR_FROM_DATABASE=ToGetHome Inc.
+
+bluetooth:v0409*
+ ID_VENDOR_FROM_DATABASE=AXIS
+
+bluetooth:v040A*
+ ID_VENDOR_FROM_DATABASE=Openmatics
+
+bluetooth:v040B*
+ ID_VENDOR_FROM_DATABASE=Jana Care Inc.
+
+bluetooth:v040C*
+ ID_VENDOR_FROM_DATABASE=Senix Corporation
+
+bluetooth:v040D*
+ ID_VENDOR_FROM_DATABASE=NorthStar Battery Company, LLC
index 0c829c8..482853d 100644 (file)
@@ -68,12 +68,18 @@ pci:v0000021Bd00008139*
 pci:v00000270*
  ID_VENDOR_FROM_DATABASE=Hauppauge computer works Inc. (Wrong ID)
 
+pci:v00000291*
+ ID_VENDOR_FROM_DATABASE=Davicom Semiconductor, Inc. (Wrong ID)
+
 pci:v000002AC*
  ID_VENDOR_FROM_DATABASE=SpeedStream
 
 pci:v000002ACd00001012*
  ID_MODEL_FROM_DATABASE=1012 PCMCIA 10/100 Ethernet Card [RTL81xx]
 
+pci:v000002E0*
+ ID_VENDOR_FROM_DATABASE=XFX Pine Group Inc. (Wrong ID)
+
 pci:v00000303*
  ID_VENDOR_FROM_DATABASE=Hewlett-Packard Company (Wrong ID)
 
@@ -138,34 +144,34 @@ pci:v00000B0B*
  ID_VENDOR_FROM_DATABASE=Rhino Equipment Corp.
 
 pci:v00000B0Bd00000105*
- ID_MODEL_FROM_DATABASE=Rhino R1T1
+ ID_MODEL_FROM_DATABASE=R1T1
 
 pci:v00000B0Bd00000205*
- ID_MODEL_FROM_DATABASE=Rhino R4FXO
+ ID_MODEL_FROM_DATABASE=R4FXO
 
 pci:v00000B0Bd00000206*
  ID_MODEL_FROM_DATABASE=RCB4FXO 4-channel FXO analog telphony card
 
 pci:v00000B0Bd00000305*
- ID_MODEL_FROM_DATABASE=Rhino R4T1
+ ID_MODEL_FROM_DATABASE=R4T1
 
 pci:v00000B0Bd00000405*
- ID_MODEL_FROM_DATABASE=Rhino R8FXX
+ ID_MODEL_FROM_DATABASE=R8FXX
 
 pci:v00000B0Bd00000406*
  ID_MODEL_FROM_DATABASE=RCB8FXX 8-channel modular analog telphony card
 
 pci:v00000B0Bd00000505*
- ID_MODEL_FROM_DATABASE=Rhino R24FXX
+ ID_MODEL_FROM_DATABASE=R24FXX
 
 pci:v00000B0Bd00000506*
  ID_MODEL_FROM_DATABASE=RCB24FXS 24-Channel FXS analog telphony card
 
 pci:v00000B0Bd00000605*
- ID_MODEL_FROM_DATABASE=Rhino R2T1
+ ID_MODEL_FROM_DATABASE=R2T1
 
 pci:v00000B0Bd00000705*
- ID_MODEL_FROM_DATABASE=Rhino R24FXS
+ ID_MODEL_FROM_DATABASE=R24FXS
 
 pci:v00000B0Bd00000706*
  ID_MODEL_FROM_DATABASE=RCB24FXO 24-Channel FXO analog telphony card
@@ -644,6 +650,66 @@ pci:v00001000d00000013*
 pci:v00001000d00000013sv00001000sd00001000*
  ID_MODEL_FROM_DATABASE=53c875a (LSI53C875A PCI to Ultra SCSI Controller)
 
+pci:v00001000d00000014*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3516
+
+pci:v00001000d00000014sv00001028sd00001FD4*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3516 (PERC H745P MX)
+
+pci:v00001000d00000014sv00001D49sd00000602*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3516 (ThinkSystem RAID 930-16i 4GB Flash PCIe 12Gb Adapter)
+
+pci:v00001000d00000014sv00001D49sd00000604*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3516 (ThinkSystem RAID 930-8e 4GB Flash PCIe 12Gb Adapter)
+
+pci:v00001000d00000015*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3416
+
+pci:v00001000d00000016*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3508
+
+pci:v00001000d00000016sv00001028sd00001FC9*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3508 (PERC H840 Adapter)
+
+pci:v00001000d00000016sv00001028sd00001FCB*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3508 (PERC H740P Adapter)
+
+pci:v00001000d00000016sv00001028sd00001FCD*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3508 (PERC H740P Mini)
+
+pci:v00001000d00000016sv00001028sd00001FCF*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3508 (PERC H740P Mini)
+
+pci:v00001000d00000016sv00001D49sd00000601*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3508 (ThinkSystem RAID 930-8i 2GB Flash PCIe 12Gb Adapter)
+
+pci:v00001000d00000016sv00001D49sd00000603*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3508 (ThinkSystem RAID 930-24i 4GB Flash PCIe 12Gb Adapter)
+
+pci:v00001000d00000016sv00001D49sd00000604*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3508 (ThinkSystem RAID 930-8e 4GB Flash PCIe 12Gb Adapter)
+
+pci:v00001000d00000017*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3408
+
+pci:v00001000d00000017sv00001D49sd00000500*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3408 (ThinkSystem RAID 530-8i PCIe 12Gb Adapter)
+
+pci:v00001000d00000017sv00001D49sd00000502*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3408 (ThinkSystem RAID 530-8i Dense Adapter)
+
+pci:v00001000d0000001B*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3504
+
+pci:v00001000d0000001Bsv00001D49sd00000605*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3504 (ThinkSystem RAID 930-4i 2GB Flash Flex Adapter)
+
+pci:v00001000d0000001C*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3404
+
+pci:v00001000d0000001Csv00001D49sd00000501*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3404 (ThinkSystem RAID 530-4i Flex Adapter)
+
 pci:v00001000d00000020*
  ID_MODEL_FROM_DATABASE=53c1010 Ultra3 SCSI Adapter
 
@@ -962,6 +1028,12 @@ pci:v00001000d0000005D*
 pci:v00001000d0000005Dsv00001000sd00009361*
  ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3108 [Invader] (MegaRAID SAS 9361-8i)
 
+pci:v00001000d0000005Dsv00001000sd00009364*
+ ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3108 [Invader] (MegaRAID SAS 9364-8i)
+
+pci:v00001000d0000005Dsv00001000sd0000936A*
+ ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3108 [Invader] (MegaRAID SAS 9364-8i)
+
 pci:v00001000d0000005Dsv00001028sd00001F41*
  ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3108 [Invader] (PERC H830 Adapter)
 
@@ -992,12 +1064,18 @@ pci:v00001000d0000005Dsv00001028sd00001F4F*
 pci:v00001000d0000005Dsv00001028sd00001F54*
  ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3108 [Invader] (PERC FD33xD)
 
+pci:v00001000d0000005Dsv00001028sd00001FD1*
+ ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3108 [Invader] (PERC H730P MX)
+
 pci:v00001000d0000005Dsv000017AAsd00001052*
  ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3108 [Invader] (ThinkServer RAID 720i)
 
 pci:v00001000d0000005Dsv000017AAsd00001053*
  ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3108 [Invader] (ThinkServer RAID 720ix)
 
+pci:v00001000d0000005Dsv00001D49sd00000600*
+ ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3108 [Invader] (ThinkSystem RAID 730-8i 1GB Cache PCIe 12Gb Adapter)
+
 pci:v00001000d0000005E*
  ID_MODEL_FROM_DATABASE=SAS1066 PCI-X Fusion-MPT SAS
 
@@ -1124,6 +1202,9 @@ pci:v00001000d00000062sv00001000sd00000062*
 pci:v00001000d00000064*
  ID_MODEL_FROM_DATABASE=SAS2116 PCI-Express Fusion-MPT SAS-2 [Meteor]
 
+pci:v00001000d00000064sv00001000sd000030C0*
+ ID_MODEL_FROM_DATABASE=SAS2116 PCI-Express Fusion-MPT SAS-2 [Meteor] (SAS 9201-16i)
+
 pci:v00001000d00000065*
  ID_MODEL_FROM_DATABASE=SAS2116 PCI-Express Fusion-MPT SAS-2 [Meteor]
 
@@ -1427,6 +1508,9 @@ pci:v00001000d00000087sv00001000sd00003020*
 pci:v00001000d00000087sv00001000sd00003040*
  ID_MODEL_FROM_DATABASE=SAS2308 PCI-Express Fusion-MPT SAS-2 (9207-8e SAS2.1 HBA)
 
+pci:v00001000d00000087sv00001000sd00003050*
+ ID_MODEL_FROM_DATABASE=SAS2308 PCI-Express Fusion-MPT SAS-2 (SAS9217-8i)
+
 pci:v00001000d00000087sv00001590sd00000044*
  ID_MODEL_FROM_DATABASE=SAS2308 PCI-Express Fusion-MPT SAS-2 (H220i)
 
@@ -1457,12 +1541,66 @@ pci:v00001000d00000096*
 pci:v00001000d00000097*
  ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3
 
+pci:v00001000d00000097sv00001000sd00003090*
+ ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (SAS9311-8i)
+
+pci:v00001000d00000097sv00001000sd000030E0*
+ ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (SAS9300-8i)
+
+pci:v00001000d00000097sv00001000sd00003130*
+ ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (SAS 9300-16i)
+
 pci:v00001000d00000097sv00001028sd00001F45*
- ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (12GB/s HBA internal)
+ ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (HBA330 Adapter)
 
 pci:v00001000d00000097sv00001028sd00001F46*
  ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (12Gbps HBA)
 
+pci:v00001000d00000097sv00001028sd00001F53*
+ ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (HBA330 Mini)
+
+pci:v00001000d00000097sv00001028sd00001FD2*
+ ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (HBA330 MX)
+
+pci:v00001000d00000097sv00001028sd00001FD3*
+ ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (HBA330 MMZ)
+
+pci:v00001000d00000097sv00001BD4sd00000011*
+ ID_MODEL_FROM_DATABASE=SAS3008 PCI-Express Fusion-MPT SAS-3 (Inspur 12Gb 8i-3008 IT SAS HBA)
+
+pci:v00001000d000000AB*
+ ID_MODEL_FROM_DATABASE=SAS3516 Fusion-MPT Tri-Mode RAID On Chip (ROC)
+
+pci:v00001000d000000AC*
+ ID_MODEL_FROM_DATABASE=SAS3416 Fusion-MPT Tri-Mode I/O Controller Chip (IOC)
+
+pci:v00001000d000000ACsv00001D49sd00000201*
+ ID_MODEL_FROM_DATABASE=SAS3416 Fusion-MPT Tri-Mode I/O Controller Chip (IOC) (ThinkSystem 430-16i SAS/SATA 12Gb HBA)
+
+pci:v00001000d000000ACsv00001D49sd00000203*
+ ID_MODEL_FROM_DATABASE=SAS3416 Fusion-MPT Tri-Mode I/O Controller Chip (IOC) (ThinkSystem 430-16e SAS/SATA 12Gb HBA)
+
+pci:v00001000d000000AE*
+ ID_MODEL_FROM_DATABASE=SAS3508 Fusion-MPT Tri-Mode RAID On Chip (ROC)
+
+pci:v00001000d000000AF*
+ ID_MODEL_FROM_DATABASE=SAS3408 Fusion-MPT Tri-Mode I/O Controller Chip (IOC)
+
+pci:v00001000d000000AFsv00001D49sd00000200*
+ ID_MODEL_FROM_DATABASE=SAS3408 Fusion-MPT Tri-Mode I/O Controller Chip (IOC) (ThinkSystem 430-8i SAS/SATA 12Gb HBA)
+
+pci:v00001000d000000AFsv00001D49sd00000202*
+ ID_MODEL_FROM_DATABASE=SAS3408 Fusion-MPT Tri-Mode I/O Controller Chip (IOC) (ThinkSystem 430-8e SAS/SATA 12Gb HBA)
+
+pci:v00001000d000000AFsv00001D49sd00000204*
+ ID_MODEL_FROM_DATABASE=SAS3408 Fusion-MPT Tri-Mode I/O Controller Chip (IOC) (ThinkSystem 430-8i SAS/SATA 12Gb Dense HBA)
+
+pci:v00001000d000000BE*
+ ID_MODEL_FROM_DATABASE=SAS3504 Fusion-MPT Tri-Mode RAID On Chip (ROC)
+
+pci:v00001000d000000BF*
+ ID_MODEL_FROM_DATABASE=SAS3404 Fusion-MPT Tri-Mode I/O Controller Chip (IOC)
+
 pci:v00001000d000000C0*
  ID_MODEL_FROM_DATABASE=SAS3324 PCI-Express Fusion-MPT SAS-3
 
@@ -1508,6 +1646,15 @@ pci:v00001000d000000CF*
 pci:v00001000d000000CFsv00001000sd00009370*
  ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3324 [Intruder] (MegaRAID SAS 9361-24i)
 
+pci:v00001000d000000D0*
+ ID_MODEL_FROM_DATABASE=SAS3716 Fusion-MPT Tri-Mode RAID Controller Chip (ROC)
+
+pci:v00001000d000000D1*
+ ID_MODEL_FROM_DATABASE=SAS3616 Fusion-MPT Tri-Mode I/O Controller Chip (IOC)
+
+pci:v00001000d000000D3*
+ ID_MODEL_FROM_DATABASE=MegaRAID Tri-Mode SAS3716W
+
 pci:v00001000d00000407*
  ID_MODEL_FROM_DATABASE=MegaRAID
 
@@ -3072,7 +3219,7 @@ pci:v00001002d00004C46sv00001002sd00000155*
  ID_MODEL_FROM_DATABASE=Rage Mobility 128 AGP 2X/Mobility M3 (IBM Thinkpad A22p)
 
 pci:v00001002d00004C46sv00001014sd00000155*
- ID_MODEL_FROM_DATABASE=Rage Mobility 128 AGP 2X/Mobility M3 (IBM Thinkpad A22p)
+ ID_MODEL_FROM_DATABASE=Rage Mobility 128 AGP 2X/Mobility M3 (Thinkpad A22p)
 
 pci:v00001002d00004C46sv00001028sd000000B1*
  ID_MODEL_FROM_DATABASE=Rage Mobility 128 AGP 2X/Mobility M3 (Latitude C600)
@@ -4560,31 +4707,34 @@ pci:v00001002d0000665Fsv00001682sd00007360*
  ID_MODEL_FROM_DATABASE=Tobago PRO [Radeon R7 360 / R9 360 OEM] (Radeon R7 360)
 
 pci:v00001002d00006660*
- ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330]
+ ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330 / M430]
 
 pci:v00001002d00006660sv00001028sd000005EA*
- ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330] (Radeon HD 8670M)
+ ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330 / M430] (Radeon HD 8670M)
 
 pci:v00001002d00006660sv00001028sd000006BF*
- ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330] (Radeon R5 M335)
+ ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330 / M430] (Radeon R5 M335)
 
 pci:v00001002d00006660sv0000103Csd00001970*
- ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330] (Radeon HD 8670M)
+ ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330 / M430] (Radeon HD 8670M)
 
 pci:v00001002d00006660sv0000103Csd000080BE*
- ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330] (Radeon R5 M330)
+ ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330 / M430] (Radeon R5 M330)
 
 pci:v00001002d00006660sv0000103Csd00008136*
- ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330] (Radeon R5 M330)
+ ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330 / M430] (Radeon R5 M330)
 
 pci:v00001002d00006660sv000017AAsd00003804*
- ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330] (Radeon R5 M330)
+ ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330 / M430] (Radeon R5 M330)
 
 pci:v00001002d00006660sv000017AAsd00003809*
- ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330] (Radeon R5 M330)
+ ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330 / M430] (Radeon R5 M330)
+
+pci:v00001002d00006660sv000017AAsd0000381A*
+ ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330 / M430] (Radeon R5 M430)
 
 pci:v00001002d00006660sv000017AAsd0000390C*
- ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330] (Radeon R5 M330)
+ ID_MODEL_FROM_DATABASE=Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330 / M430] (Radeon R5 M330)
 
 pci:v00001002d00006663*
  ID_MODEL_FROM_DATABASE=Sun PRO [Radeon HD 8570A/8570M]
@@ -4592,6 +4742,9 @@ pci:v00001002d00006663*
 pci:v00001002d00006663sv00001025sd00000846*
  ID_MODEL_FROM_DATABASE=Sun PRO [Radeon HD 8570A/8570M] (Radeon HD 8570A)
 
+pci:v00001002d00006663sv000017AAsd00003805*
+ ID_MODEL_FROM_DATABASE=Sun PRO [Radeon HD 8570A/8570M] (Radeon HD 8570M)
+
 pci:v00001002d00006664*
  ID_MODEL_FROM_DATABASE=Jet XT [Radeon R5 M240]
 
@@ -6146,9 +6299,6 @@ pci:v00001002d00006798sv00001787sd00002317*
 pci:v00001002d00006798sv00001787sd00003000*
  ID_MODEL_FROM_DATABASE=Tahiti XT [Radeon HD 7970/8970 OEM / R9 280X] (Tahiti XT2 [Radeon HD 7970 GHz Edition])
 
-pci:v00001002d00006799*
- ID_MODEL_FROM_DATABASE=New Zealand [Radeon HD 7900 Series]
-
 pci:v00001002d0000679A*
  ID_MODEL_FROM_DATABASE=Tahiti PRO [Radeon HD 7950/8950 OEM / R9 280]
 
@@ -6165,19 +6315,19 @@ pci:v00001002d0000679Asv0000174Bsd0000A003*
  ID_MODEL_FROM_DATABASE=Tahiti PRO [Radeon HD 7950/8950 OEM / R9 280] (Radeon R9 280)
 
 pci:v00001002d0000679B*
- ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990]
+ ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990/8990 OEM]
 
 pci:v00001002d0000679Bsv00001002sd00000B28*
- ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990] (Radeon HD 8990 OEM)
+ ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990/8990 OEM] (Radeon HD 8990 OEM)
 
 pci:v00001002d0000679Bsv00001002sd00000B2A*
- ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990] (Radeon HD 7990)
+ ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990/8990 OEM] (Radeon HD 7990)
 
 pci:v00001002d0000679Bsv00001462sd00008036*
- ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990] (Radeon HD 8990 OEM)
+ ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990/8990 OEM] (Radeon HD 8990 OEM)
 
 pci:v00001002d0000679Bsv0000148Csd00008990*
- ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990] (Radeon HD 8990 OEM)
+ ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990/8990 OEM] (Radeon HD 8990 OEM)
 
 pci:v00001002d0000679E*
  ID_MODEL_FROM_DATABASE=Tahiti LE [Radeon HD 7870 XT]
@@ -6345,10 +6495,88 @@ pci:v00001002d000067BE*
  ID_MODEL_FROM_DATABASE=Hawaii LE
 
 pci:v00001002d000067C0*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon Pro WX 7100]
+
+pci:v00001002d000067C4*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon Pro WX 7100]
+
+pci:v00001002d000067C4sv00001002sd00000336*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon Pro WX 7100] (Radeon Pro Duo)
+
+pci:v00001002d000067C4sv00001002sd00001336*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon Pro WX 7100] (Radeon Pro Duo)
+
+pci:v00001002d000067C7*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon Pro WX 5100]
+
+pci:v00001002d000067CA*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Polaris10]
+
+pci:v00001002d000067CC*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Polaris10]
+
+pci:v00001002d000067CF*
  ID_MODEL_FROM_DATABASE=Ellesmere [Polaris10]
 
 pci:v00001002d000067DF*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 480]
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580]
+
+pci:v00001002d000067DFsv00001002sd00000B37*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480)
+
+pci:v00001002d000067DFsv00001043sd000004A8*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480)
+
+pci:v00001002d000067DFsv00001043sd000004B0*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 470)
+
+pci:v00001002d000067DFsv00001043sd000004FB*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480)
+
+pci:v00001002d000067DFsv00001043sd000004FD*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480 8GB)
+
+pci:v00001002d000067DFsv00001458sd000022F0*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 570)
+
+pci:v00001002d000067DFsv00001462sd00003411*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 470)
+
+pci:v00001002d000067DFsv00001462sd00003413*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480)
+
+pci:v00001002d000067DFsv0000148Csd00002372*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480)
+
+pci:v00001002d000067DFsv0000148Csd00002373*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 470)
+
+pci:v00001002d000067DFsv00001682sd00009470*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 470)
+
+pci:v00001002d000067DFsv00001682sd00009480*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480)
+
+pci:v00001002d000067DFsv00001682sd00009588*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 580 XTR)
+
+pci:v00001002d000067DFsv0000174Bsd0000E347*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 470/480)
+
+pci:v00001002d000067DFsv0000174Bsd0000E349*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 470)
+
+pci:v00001002d000067DFsv00001787sd0000A470*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 470)
+
+pci:v00001002d000067DFsv00001787sd0000A480*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480)
+
+pci:v00001002d000067DFsv00001DA2sd0000E353*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Sapphire Radeon RX 580 Pulse 8GB)
+
+pci:v00001002d000067DFsv00001DA2sd0000E366*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 570)
 
 pci:v00001002d000067E0*
  ID_MODEL_FROM_DATABASE=Baffin [Polaris11]
@@ -6356,6 +6584,9 @@ pci:v00001002d000067E0*
 pci:v00001002d000067E1*
  ID_MODEL_FROM_DATABASE=Baffin [Polaris11]
 
+pci:v00001002d000067E3*
+ ID_MODEL_FROM_DATABASE=Baffin [Radeon Pro WX 4100]
+
 pci:v00001002d000067E8*
  ID_MODEL_FROM_DATABASE=Baffin [Polaris11]
 
@@ -6365,8 +6596,11 @@ pci:v00001002d000067E9*
 pci:v00001002d000067EB*
  ID_MODEL_FROM_DATABASE=Baffin [Polaris11]
 
+pci:v00001002d000067EF*
+ ID_MODEL_FROM_DATABASE=Baffin [Radeon RX 460]
+
 pci:v00001002d000067FF*
- ID_MODEL_FROM_DATABASE=Baffin [Polaris11]
+ ID_MODEL_FROM_DATABASE=Baffin [Radeon RX 560]
 
 pci:v00001002d00006800*
  ID_MODEL_FROM_DATABASE=Wimbledon XT [Radeon HD 7970M]
@@ -6437,6 +6671,9 @@ pci:v00001002d00006811sv00001458sd00002016*
 pci:v00001002d00006811sv00001462sd00002016*
  ID_MODEL_FROM_DATABASE=Curacao PRO [Radeon R7 370 / R9 270/370 OEM] (Trinidad PRO [Radeon R9 370 OEM])
 
+pci:v00001002d00006811sv00001462sd00003050*
+ ID_MODEL_FROM_DATABASE=Curacao PRO [Radeon R7 370 / R9 270/370 OEM] (R9 270 Gaming OC)
+
 pci:v00001002d00006811sv0000148Csd00002016*
  ID_MODEL_FROM_DATABASE=Curacao PRO [Radeon R7 370 / R9 270/370 OEM] (Trinidad PRO [Radeon R9 370 OEM])
 
@@ -6950,6 +7187,12 @@ pci:v00001002d00006842*
 pci:v00001002d00006843*
  ID_MODEL_FROM_DATABASE=Thames [Radeon HD 7670M]
 
+pci:v00001002d00006863*
+ ID_MODEL_FROM_DATABASE=Vega 10 [Radeon Vega Frontier Edition]
+
+pci:v00001002d0000687F*
+ ID_MODEL_FROM_DATABASE=Vega [Radeon RX Vega]
+
 pci:v00001002d00006888*
  ID_MODEL_FROM_DATABASE=Cypress XT [FirePro V8800]
 
@@ -8328,76 +8571,82 @@ pci:v00001002d000068FE*
  ID_MODEL_FROM_DATABASE=Cedar LE
 
 pci:v00001002d00006900*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360]
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445]
 
 pci:v00001002d00006900sv00001025sd00001056*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M360 / R8 M365DX)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M360 / R8 M365DX)
 
 pci:v00001002d00006900sv00001028sd00000640*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M260/M265)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M260/M265)
 
 pci:v00001002d00006900sv00001028sd00000643*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M260/M265)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M260/M265)
 
 pci:v00001002d00006900sv00001028sd0000067F*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M260)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M260)
+
+pci:v00001002d00006900sv00001028sd00000767*
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M445)
 
 pci:v00001002d00006900sv00001028sd0000130A*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M260)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M260)
 
 pci:v00001002d00006900sv0000103Csd00002263*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M260)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M260)
 
 pci:v00001002d00006900sv0000103Csd00002269*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M260)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M260)
 
 pci:v00001002d00006900sv0000103Csd000022C6*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M260)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M260)
 
 pci:v00001002d00006900sv0000103Csd000022C8*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M260)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M260)
 
 pci:v00001002d00006900sv0000103Csd0000808C*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M260)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M260)
 
 pci:v00001002d00006900sv0000103Csd00008099*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M360)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M360)
 
 pci:v00001002d00006900sv0000103Csd000080B5*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M360)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M360)
 
 pci:v00001002d00006900sv0000103Csd000080B9*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M360)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M360)
 
 pci:v00001002d00006900sv0000103Csd0000811C*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M340)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M340)
+
+pci:v00001002d00006900sv0000103Csd00008226*
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M440)
 
 pci:v00001002d00006900sv000010CFsd00001906*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M260)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M260)
 
 pci:v00001002d00006900sv00001170sd00009979*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M360)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M360)
 
 pci:v00001002d00006900sv00001179sd0000F903*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M260)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M260)
 
 pci:v00001002d00006900sv00001179sd0000F922*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M260)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M260)
 
 pci:v00001002d00006900sv00001179sd0000F923*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M260)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M260)
 
 pci:v00001002d00006900sv00001179sd0000F934*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M260)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M260)
 
 pci:v00001002d00006900sv000017AAsd00003822*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M360)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M360)
 
 pci:v00001002d00006900sv000017AAsd00003824*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M360)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M360)
 
 pci:v00001002d00006900sv000017AAsd00005021*
- ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360] (Radeon R7 M260)
+ ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445] (Radeon R7 M260)
 
 pci:v00001002d00006901*
  ID_MODEL_FROM_DATABASE=Topaz PRO [Radeon R5 M255]
@@ -8405,6 +8654,9 @@ pci:v00001002d00006901*
 pci:v00001002d00006901sv0000103Csd00001318*
  ID_MODEL_FROM_DATABASE=Topaz PRO [Radeon R5 M255] (Radeon R6 M255DX)
 
+pci:v00001002d00006907*
+ ID_MODEL_FROM_DATABASE=Meso XT [Radeon R5 M315]
+
 pci:v00001002d00006921*
  ID_MODEL_FROM_DATABASE=Amethyst XT [Radeon R9 M295X]
 
@@ -8453,6 +8705,27 @@ pci:v00001002d00006939sv0000148Csd00009380*
 pci:v00001002d00006939sv0000174Bsd0000E308*
  ID_MODEL_FROM_DATABASE=Tonga PRO [Radeon R9 285/380] (Radeon R9 380 Nitro 4G D5)
 
+pci:v00001002d00006980*
+ ID_MODEL_FROM_DATABASE=Polaris12
+
+pci:v00001002d00006981*
+ ID_MODEL_FROM_DATABASE=Polaris12
+
+pci:v00001002d00006985*
+ ID_MODEL_FROM_DATABASE=Lexa XT [Radeon PRO WX 3100]
+
+pci:v00001002d00006986*
+ ID_MODEL_FROM_DATABASE=Polaris12
+
+pci:v00001002d00006987*
+ ID_MODEL_FROM_DATABASE=Polaris12
+
+pci:v00001002d00006995*
+ ID_MODEL_FROM_DATABASE=Lexa XT [Radeon PRO WX 2100]
+
+pci:v00001002d0000699F*
+ ID_MODEL_FROM_DATABASE=Lexa PRO [Radeon RX 550]
+
 pci:v00001002d0000700F*
  ID_MODEL_FROM_DATABASE=RS100 AGP Bridge
 
@@ -8819,6 +9092,9 @@ pci:v00001002d00007300*
 pci:v00001002d00007300sv00001002sd00000B36*
  ID_MODEL_FROM_DATABASE=Fiji [Radeon R9 FURY / NANO Series] (Radeon R9 FURY X / NANO)
 
+pci:v00001002d00007300sv00001002sd00001B36*
+ ID_MODEL_FROM_DATABASE=Fiji [Radeon R9 FURY / NANO Series] (Radeon Pro Duo)
+
 pci:v00001002d00007300sv00001043sd0000049E*
  ID_MODEL_FROM_DATABASE=Fiji [Radeon R9 FURY / NANO Series] (Radeon R9 FURY)
 
@@ -9387,7 +9663,7 @@ pci:v00001002d000095CF*
  ID_MODEL_FROM_DATABASE=RV620 GL [FirePro 2260]
 
 pci:v00001002d0000960F*
- ID_MODEL_FROM_DATABASE=RS780 HDMI Audio [Radeon (HD) 3000 Series]
+ ID_MODEL_FROM_DATABASE=RS780 HDMI Audio [Radeon 3000/3100 / HD 3200/3300]
 
 pci:v00001002d00009610*
  ID_MODEL_FROM_DATABASE=RS780 [Radeon HD 3200]
@@ -9684,7 +9960,7 @@ pci:v00001002d00009919*
  ID_MODEL_FROM_DATABASE=Trinity [Radeon HD 7500G]
 
 pci:v00001002d00009920*
- ID_MODEL_FROM_DATABASE=Liverpool Graphics
+ ID_MODEL_FROM_DATABASE=Liverpool [Playstation 4 APU]
 
 pci:v00001002d00009921*
  ID_MODEL_FROM_DATABASE=Liverpool HDMI/DP Audio Controller
@@ -9741,28 +10017,31 @@ pci:v00001002d000099A4*
  ID_MODEL_FROM_DATABASE=Trinity [Radeon HD 7400G]
 
 pci:v00001002d0000AA00*
- ID_MODEL_FROM_DATABASE=R600 HDMI Audio [Radeon HD 2900 Series]
+ ID_MODEL_FROM_DATABASE=R600 HDMI Audio [Radeon HD 2900 GT/PRO/XT]
+
+pci:v00001002d0000AA01*
+ ID_MODEL_FROM_DATABASE=RV635 HDMI Audio [Radeon HD 3650/3730/3750]
 
 pci:v00001002d0000AA08*
- ID_MODEL_FROM_DATABASE=RV630 HDMI Audio [Radeon HD 2600 Series]
+ ID_MODEL_FROM_DATABASE=RV630 HDMI Audio [Radeon HD 2600 PRO/XT / HD 3610]
 
 pci:v00001002d0000AA10*
- ID_MODEL_FROM_DATABASE=RV610 HDMI Audio [Radeon HD 2350/2400 Series]
+ ID_MODEL_FROM_DATABASE=RV610 HDMI Audio [Radeon HD 2350 PRO / 2400 PRO/XT / HD 3410]
 
 pci:v00001002d0000AA10sv0000174Bsd0000AA10*
- ID_MODEL_FROM_DATABASE=RV610 HDMI Audio [Radeon HD 2350/2400 Series] (Radeon HD 2400 PRO)
+ ID_MODEL_FROM_DATABASE=RV610 HDMI Audio [Radeon HD 2350 PRO / 2400 PRO/XT / HD 3410] (Radeon HD 2400 PRO)
 
 pci:v00001002d0000AA10sv000018BCsd0000AA10*
- ID_MODEL_FROM_DATABASE=RV610 HDMI Audio [Radeon HD 2350/2400 Series] (Radeon HD 2400 PRO)
+ ID_MODEL_FROM_DATABASE=RV610 HDMI Audio [Radeon HD 2350 PRO / 2400 PRO/XT / HD 3410] (Radeon HD 2400 PRO)
 
 pci:v00001002d0000AA18*
  ID_MODEL_FROM_DATABASE=RV670/680 HDMI Audio [Radeon HD 3690/3800 Series]
 
 pci:v00001002d0000AA20*
- ID_MODEL_FROM_DATABASE=RV635 HDMI Audio [Radeon HD 3600 Series]
+ ID_MODEL_FROM_DATABASE=RV635 HDMI Audio [Radeon HD 3650/3730/3750]
 
 pci:v00001002d0000AA28*
- ID_MODEL_FROM_DATABASE=RV620 HDMI Audio [Radeon HD 3400 Series]
+ ID_MODEL_FROM_DATABASE=RV620 HDMI Audio [Radeon HD 3450/3470/3550/3570]
 
 pci:v00001002d0000AA30*
  ID_MODEL_FROM_DATABASE=RV770 HDMI Audio [Radeon HD 4850/4870]
@@ -9777,7 +10056,7 @@ pci:v00001002d0000AA38sv0000103Csd00003628*
  ID_MODEL_FROM_DATABASE=RV710/730 HDMI Audio [Radeon HD 4000 series] (dv6-1190en)
 
 pci:v00001002d0000AA50*
- ID_MODEL_FROM_DATABASE=Cypress HDMI Audio [Radeon HD 5800 Series]
+ ID_MODEL_FROM_DATABASE=Cypress HDMI Audio [Radeon HD 5830/5850/5870 / 6850/6870 Rebrand]
 
 pci:v00001002d0000AA58*
  ID_MODEL_FROM_DATABASE=Juniper HDMI Audio [Radeon HD 5700 Series]
@@ -9792,31 +10071,31 @@ pci:v00001002d0000AA60sv00001025sd00000347*
  ID_MODEL_FROM_DATABASE=Redwood HDMI Audio [Radeon HD 5000 Series] (Aspire 7740G)
 
 pci:v00001002d0000AA68*
- ID_MODEL_FROM_DATABASE=Cedar HDMI Audio [Radeon HD 5400/6300 Series]
+ ID_MODEL_FROM_DATABASE=Cedar HDMI Audio [Radeon HD 5400/6300/7300 Series]
 
 pci:v00001002d0000AA68sv00001028sd0000AA68*
- ID_MODEL_FROM_DATABASE=Cedar HDMI Audio [Radeon HD 5400/6300 Series] (XPS 8300)
+ ID_MODEL_FROM_DATABASE=Cedar HDMI Audio [Radeon HD 5400/6300/7300 Series] (XPS 8300)
 
 pci:v00001002d0000AA80*
- ID_MODEL_FROM_DATABASE=Cayman/Antilles HDMI Audio [Radeon HD 6900 Series]
+ ID_MODEL_FROM_DATABASE=Cayman/Antilles HDMI Audio [Radeon HD 6930/6950/6970/6990]
 
 pci:v00001002d0000AA88*
- ID_MODEL_FROM_DATABASE=Barts HDMI Audio [Radeon HD 6800 Series]
+ ID_MODEL_FROM_DATABASE=Barts HDMI Audio [Radeon HD 6790/6850/6870 / 7720 OEM]
 
 pci:v00001002d0000AA90*
- ID_MODEL_FROM_DATABASE=Turks/Whistler HDMI Audio [Radeon HD 6000 Series]
+ ID_MODEL_FROM_DATABASE=Turks HDMI Audio [Radeon HD 6500/6600 / 6700M Series]
 
 pci:v00001002d0000AA90sv00001028sd000004A3*
- ID_MODEL_FROM_DATABASE=Turks/Whistler HDMI Audio [Radeon HD 6000 Series] (Precision M4600)
+ ID_MODEL_FROM_DATABASE=Turks HDMI Audio [Radeon HD 6500/6600 / 6700M Series] (Precision M4600)
 
 pci:v00001002d0000AA98*
- ID_MODEL_FROM_DATABASE=Caicos HDMI Audio [Radeon HD 6400 Series]
+ ID_MODEL_FROM_DATABASE=Caicos HDMI Audio [Radeon HD 6450 / 7450/8450/8490 OEM / R5 230/235/235X OEM]
 
 pci:v00001002d0000AA98sv0000174Bsd0000AA98*
- ID_MODEL_FROM_DATABASE=Caicos HDMI Audio [Radeon HD 6400 Series] (Radeon HD 6450 1GB DDR3)
+ ID_MODEL_FROM_DATABASE=Caicos HDMI Audio [Radeon HD 6450 / 7450/8450/8490 OEM / R5 230/235/235X OEM] (Radeon HD 6450 1GB DDR3)
 
 pci:v00001002d0000AAA0*
- ID_MODEL_FROM_DATABASE=Tahiti XT HDMI Audio [Radeon HD 7970 Series]
+ ID_MODEL_FROM_DATABASE=Tahiti HDMI Audio [Radeon HD 7870 XT / 7950/7970]
 
 pci:v00001002d0000AAB0*
  ID_MODEL_FROM_DATABASE=Cape Verde/Pitcairn HDMI Audio [Radeon HD 7700/7800 Series]
@@ -9825,7 +10104,7 @@ pci:v00001002d0000AAC0*
  ID_MODEL_FROM_DATABASE=Tobago HDMI Audio [Radeon R7 360 / R9 360 OEM]
 
 pci:v00001002d0000AAC8*
- ID_MODEL_FROM_DATABASE=Hawaii HDMI Audio
+ ID_MODEL_FROM_DATABASE=Hawaii HDMI Audio [Radeon R9 290/290X / 390/390X]
 
 pci:v00001002d0000AAD8*
  ID_MODEL_FROM_DATABASE=Tonga HDMI Audio [Radeon R9 285/380]
@@ -9834,7 +10113,7 @@ pci:v00001002d0000AAD8sv0000174Bsd0000AAD8*
  ID_MODEL_FROM_DATABASE=Tonga HDMI Audio [Radeon R9 285/380] (Radeon R9 285/380 HDMI Audio)
 
 pci:v00001002d0000AAE8*
- ID_MODEL_FROM_DATABASE=Fiji HDMI/DP Audio Controller
+ ID_MODEL_FROM_DATABASE=Fiji HDMI/DP Audio [Radeon R9 Nano / FURY/FURY X]
 
 pci:v00001002d0000AC00*
  ID_MODEL_FROM_DATABASE=Theater 600 Pro
@@ -10994,6 +11273,9 @@ pci:v00001014d00000302*
 pci:v00001014d00000308*
  ID_MODEL_FROM_DATABASE=CalIOC2 PCI-E Root Port
 
+pci:v00001014d00000311*
+ ID_MODEL_FROM_DATABASE=FC 5740/1954 4-Port 10/100/1000 Base-TX PCI-X Adapter for POWER
+
 pci:v00001014d00000314*
  ID_MODEL_FROM_DATABASE=ZISC 036 Neural accelerator card
 
@@ -11084,6 +11366,9 @@ pci:v00001014d0000034Asv00001014sd000004C8*
 pci:v00001014d0000034Asv00001014sd000004C9*
  ID_MODEL_FROM_DATABASE=PCI-E IPR SAS Adapter (ASIC) (PCIe3 x 8 Cache SAS RAID Internal Adapter 6GB(2CCD))
 
+pci:v00001014d000003DC*
+ ID_MODEL_FROM_DATABASE=POWER8 Host Bridge (PHB3)
+
 pci:v00001014d0000044B*
  ID_MODEL_FROM_DATABASE=GenWQE Accelerator Adapter
 
@@ -11453,6 +11738,9 @@ pci:v00001022d00001439*
 pci:v00001022d0000145B*
  ID_MODEL_FROM_DATABASE=Zeppelin Non-Transparent Bridge
 
+pci:v00001022d0000145C*
+ ID_MODEL_FROM_DATABASE=USB3 Host Controller
+
 pci:v00001022d00001510*
  ID_MODEL_FROM_DATABASE=Family 14h Processor Root Complex
 
@@ -11705,6 +11993,9 @@ pci:v00001022d000043A2*
 pci:v00001022d000043A3*
  ID_MODEL_FROM_DATABASE=Hudson PCI to PCI bridge (PCIE port 3)
 
+pci:v00001022d000043BB*
+ ID_MODEL_FROM_DATABASE=USB 3.1 XHCI Controller
+
 pci:v00001022d00007006*
  ID_MODEL_FROM_DATABASE=AMD-751 [Irongate] System Controller
 
@@ -13055,6 +13346,12 @@ pci:v0000102Bd00000533sv0000103Csd00003381*
 pci:v0000102Bd00000534*
  ID_MODEL_FROM_DATABASE=G200eR2
 
+pci:v0000102Bd00000538*
+ ID_MODEL_FROM_DATABASE=G200eH
+
+pci:v0000102Bd00000538sv00001590sd000000E4*
+ ID_MODEL_FROM_DATABASE=G200eH (iLO5 VGA)
+
 pci:v0000102Bd00000540*
  ID_MODEL_FROM_DATABASE=M91XX
 
@@ -13094,6 +13391,21 @@ pci:v0000102Bd00000540sv0000102Bsd00002280*
 pci:v0000102Bd00000540sv0000102Bsd000022C0*
  ID_MODEL_FROM_DATABASE=M91XX (M9128 LP PCIe x16)
 
+pci:v0000102Bd00000550*
+ ID_MODEL_FROM_DATABASE=SV2
+
+pci:v0000102Bd00000550sv0000102Bsd000000C0*
+ ID_MODEL_FROM_DATABASE=SV2 (MURA-IPX-I4EF)
+
+pci:v0000102Bd00000550sv0000102Bsd000000C1*
+ ID_MODEL_FROM_DATABASE=SV2 (MURA-IPX-I4DF)
+
+pci:v0000102Bd00000550sv0000102Bsd000000C3*
+ ID_MODEL_FROM_DATABASE=SV2 (MURA-IPX-I4DHF)
+
+pci:v0000102Bd00000550sv0000102Bsd000000C5*
+ ID_MODEL_FROM_DATABASE=SV2 (MURA-IPX-I4EHF)
+
 pci:v0000102Bd00000D10*
  ID_MODEL_FROM_DATABASE=MGA Ultima/Impression
 
@@ -14570,6 +14882,12 @@ pci:v0000103Cd00001302*
 pci:v0000103Cd00001303*
  ID_MODEL_FROM_DATABASE=RMP-3 (Remote Management Processor)
 
+pci:v0000103Cd000022F6*
+ ID_MODEL_FROM_DATABASE=iLO5 Virtual USB Controller
+
+pci:v0000103Cd000022F6sv00001590sd000000E4*
+ ID_MODEL_FROM_DATABASE=iLO5 Virtual USB Controller (iLO5 Standard Virtual USB Controller)
+
 pci:v0000103Cd00002910*
  ID_MODEL_FROM_DATABASE=E2910A PCIBus Exerciser
 
@@ -14882,6 +15200,9 @@ pci:v00001043d00000675sv00000675sd00001707*
 pci:v00001043d00000675sv000010CFsd0000105E*
  ID_MODEL_FROM_DATABASE=ISDNLink P-IN100-ST-D (ISDN Adapter (PCI Bus, DV, W))
 
+pci:v00001043d000013A0*
+ ID_MODEL_FROM_DATABASE=Transformer Book T101HA-GR030R
+
 pci:v00001043d00009602*
  ID_MODEL_FROM_DATABASE=AMD RS780/RS880 PCI to PCI bridge (int gfx)
 
@@ -15713,6 +16034,9 @@ pci:v0000104Cd00008240*
 pci:v0000104Cd00008241*
  ID_MODEL_FROM_DATABASE=TUSB73x0 SuperSpeed USB 3.0 xHCI Host Controller
 
+pci:v0000104Cd00008241sv00001014sd000004B2*
+ ID_MODEL_FROM_DATABASE=TUSB73x0 SuperSpeed USB 3.0 xHCI Host Controller (S824 (8286-42A))
+
 pci:v0000104Cd00008400*
  ID_MODEL_FROM_DATABASE=ACX 100 22Mbps Wireless Interface
 
@@ -16100,6 +16424,12 @@ pci:v0000104Dd0000808A*
 pci:v0000104Dd000081CE*
  ID_MODEL_FROM_DATABASE=SxS Pro memory card
 
+pci:v0000104Dd0000905C*
+ ID_MODEL_FROM_DATABASE=SxS Pro memory card
+
+pci:v0000104Dd0000907F*
+ ID_MODEL_FROM_DATABASE=SxS Pro+ memory card
+
 pci:v0000104Dd0000908F*
  ID_MODEL_FROM_DATABASE=Aeolia ACPI
 
@@ -16124,6 +16454,9 @@ pci:v0000104Dd000090A3*
 pci:v0000104Dd000090A4*
  ID_MODEL_FROM_DATABASE=Aeolia USB 3.0 xHCI Host Controller
 
+pci:v0000104Dd000090BC*
+ ID_MODEL_FROM_DATABASE=SxS Pro+ memory card
+
 pci:v0000104E*
  ID_VENDOR_FROM_DATABASE=Oak Technology, Inc
 
@@ -17540,6 +17873,9 @@ pci:v00001077d00001656sv00001077sd0000E4F6*
 pci:v00001077d00001656sv00001077sd0000E4F7*
  ID_MODEL_FROM_DATABASE=FastLinQ QL45000 Series 25GbE Controller (FastLinQ QL45212H 25GbE Adapter)
 
+pci:v00001077d00001656sv00001590sd00000223*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL45000 Series 25GbE Controller (Synergy 6810C 25/50Gb Ethernet Adapter)
+
 pci:v00001077d0000165C*
  ID_MODEL_FROM_DATABASE=FastLinQ QL45000 Series 40GbE Controller (FCoE)
 
@@ -17589,13 +17925,13 @@ pci:v00001077d00002031*
  ID_MODEL_FROM_DATABASE=ISP8324-based 16Gb Fibre Channel to PCI Express Adapter
 
 pci:v00001077d00002031sv0000103Csd000017E7*
- ID_MODEL_FROM_DATABASE=ISP8324-based 16Gb Fibre Channel to PCI Express Adapter (HP SN1000Q 16Gb Single Port Fibre Channel Adapter)
+ ID_MODEL_FROM_DATABASE=ISP8324-based 16Gb Fibre Channel to PCI Express Adapter (SN1000Q 16Gb Single Port Fibre Channel Adapter)
 
 pci:v00001077d00002031sv0000103Csd000017E8*
- ID_MODEL_FROM_DATABASE=ISP8324-based 16Gb Fibre Channel to PCI Express Adapter (HP SN1000Q 16Gb Dual Port Fibre Channel Adapter)
+ ID_MODEL_FROM_DATABASE=ISP8324-based 16Gb Fibre Channel to PCI Express Adapter (SN1000Q 16Gb Dual Port Fibre Channel Adapter)
 
 pci:v00001077d00002031sv0000103Csd00001939*
- ID_MODEL_FROM_DATABASE=ISP8324-based 16Gb Fibre Channel to PCI Express Adapter (HP QMH2672 16Gb Dual Port Fibre Channel Adapter)
+ ID_MODEL_FROM_DATABASE=ISP8324-based 16Gb Fibre Channel to PCI Express Adapter (QMH2672 16Gb Dual Port Fibre Channel Adapter)
 
 pci:v00001077d00002031sv0000103Csd00008002*
  ID_MODEL_FROM_DATABASE=ISP8324-based 16Gb Fibre Channel to PCI Express Adapter (3830C 16G Fibre Channel Host Bus Adapter)
@@ -17655,16 +17991,16 @@ pci:v00001077d00002261sv00001077sd000002AC*
  ID_MODEL_FROM_DATABASE=ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter (QLE2742 Dual Port 32Gb FC to PCIe Gen3 x8 Adapter)
 
 pci:v00001077d00002261sv00001590sd000000F9*
- ID_MODEL_FROM_DATABASE=ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter (HPE StoreFabric SN1100Q 16Gb Single Port Fibre Channel Host Bus Adapter)
+ ID_MODEL_FROM_DATABASE=ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter (StoreFabric SN1100Q 16Gb Single Port Fibre Channel Host Bus Adapter)
 
 pci:v00001077d00002261sv00001590sd000000FA*
- ID_MODEL_FROM_DATABASE=ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter (HPE StoreFabric SN1100Q 16Gb Dual Port Fibre Channel Host Bus Adapter)
+ ID_MODEL_FROM_DATABASE=ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter (StoreFabric SN1100Q 16Gb Dual Port Fibre Channel Host Bus Adapter)
 
 pci:v00001077d00002261sv00001590sd00000203*
- ID_MODEL_FROM_DATABASE=ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter (HPE StoreFabric SN1600Q 32Gb Single Port Fibre Channel Host Bus Adapter)
+ ID_MODEL_FROM_DATABASE=ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter (StoreFabric SN1600Q 32Gb Single Port Fibre Channel Host Bus Adapter)
 
 pci:v00001077d00002261sv00001590sd00000204*
- ID_MODEL_FROM_DATABASE=ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter (HPE StoreFabric SN1600Q 32Gb Dual Port Fibre Channel Host Bus Adapter)
+ ID_MODEL_FROM_DATABASE=ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter (StoreFabric SN1600Q 32Gb Dual Port Fibre Channel Host Bus Adapter)
 
 pci:v00001077d00002300*
  ID_MODEL_FROM_DATABASE=QLA2300 64-bit Fibre Channel Adapter
@@ -17699,17 +18035,29 @@ pci:v00001077d00002432sv0000103Csd00007040*
 pci:v00001077d00002532*
  ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA
 
+pci:v00001077d00002532sv00001014sd0000041E*
+ ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (FC EN0Y/EN12 PCIe2 LP 8 Gb 4-port Fibre Channel Adapter for POWER)
+
 pci:v00001077d00002532sv0000103Csd00003262*
  ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (StorageWorks 81Q)
 
 pci:v00001077d00002532sv0000103Csd00003263*
  ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (StorageWorks 82Q)
 
+pci:v00001077d00002532sv00001077sd0000015C*
+ ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (QLE2560 PCI Express to 8Gb FC Single Channel)
+
+pci:v00001077d00002532sv00001077sd0000015D*
+ ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (QLE2562 PCI Express to 8Gb FC Dual Channel)
+
+pci:v00001077d00002532sv00001077sd0000015E*
+ ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (QLE2564 PCI Express to 8Gb FC Quad Channel)
+
 pci:v00001077d00002532sv00001077sd00000167*
  ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (QME2572 Dual Port FC8 HBA Mezzanine)
 
 pci:v00001077d00002532sv00001590sd000000FC*
- ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (HPE StoreFabric 84Q 8Gb Quad Port Fibre Channel Host Bus Adapter)
+ ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (StoreFabric 84Q 8Gb Quad Port Fibre Channel Host Bus Adapter)
 
 pci:v00001077d00003022*
  ID_MODEL_FROM_DATABASE=ISP4022-based Ethernet NIC
@@ -17747,6 +18095,9 @@ pci:v00001077d00008000*
 pci:v00001077d00008001*
  ID_MODEL_FROM_DATABASE=10GbE Converged Network Adapter (FCoE)
 
+pci:v00001077d00008001sv00001014sd000003AF*
+ ID_MODEL_FROM_DATABASE=10GbE Converged Network Adapter (FCoE) (FC 5708/5270 10 Gb FCoE PCIe Dual Port Adapter for POWER)
+
 pci:v00001077d00008020*
  ID_MODEL_FROM_DATABASE=cLOM8214 1/10GbE Controller
 
@@ -17813,6 +18164,84 @@ pci:v00001077d00008031*
 pci:v00001077d00008032*
  ID_MODEL_FROM_DATABASE=8300 Series 10GbE Converged Network Adapter (iSCSI)
 
+pci:v00001077d00008070*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller
+
+pci:v00001077d00008070sv00001077sd00000001*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (10GE 2P QL41162HxRJ-DE Adapter)
+
+pci:v00001077d00008070sv00001077sd00000002*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (10GE 2P QL41112HxCU-DE Adapter)
+
+pci:v00001077d00008070sv00001077sd0000000B*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (25GE 2P QL41262HxCU-DE Adapter)
+
+pci:v00001077d00008070sv00001077sd00000011*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (FastLinQ QL41212H 25GbE Adapter)
+
+pci:v00001077d00008070sv00001077sd00000012*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (FastLinQ QL41112H 10GbE Adapter)
+
+pci:v00001077d00008080*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (FCoE)
+
+pci:v00001077d00008080sv00001077sd00000001*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (FCoE) (10GE 2P QL41162HxRJ-DE Adapter)
+
+pci:v00001077d00008080sv00001077sd00000002*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (FCoE) (10GE 2P QL41112HxCU-DE Adapter)
+
+pci:v00001077d00008080sv00001077sd0000000B*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (FCoE) (25GE 2P QL41262HxCU-DE Adapter)
+
+pci:v00001077d00008080sv00001077sd0000000D*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (FCoE) (FastLinQ QL41262H 25GbE FCoE Adapter)
+
+pci:v00001077d00008080sv00001077sd0000000E*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (FCoE) (FastLinQ QL41162H 10GbE FCoE Adapter)
+
+pci:v00001077d00008084*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (iSCSI)
+
+pci:v00001077d00008084sv00001077sd00000001*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (iSCSI) (10GE 2P QL41162HxRJ-DE Adapter)
+
+pci:v00001077d00008084sv00001077sd00000002*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (iSCSI) (10GE 2P QL41112HxCU-DE Adapter)
+
+pci:v00001077d00008084sv00001077sd0000000B*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (iSCSI) (25GE 2P QL41262HxCU-DE Adapter)
+
+pci:v00001077d00008084sv00001077sd0000000D*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (iSCSI) (FastLinQ QL41262H 25GbE iSCSI Adapter)
+
+pci:v00001077d00008084sv00001077sd0000000E*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series 10/25/40/50GbE Controller (iSCSI) (FastLinQ QL41162H 10GbE iSCSI Adapter)
+
+pci:v00001077d00008090*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series Gigabit Ethernet Controller (SR-IOV VF)
+
+pci:v00001077d00008090sv00001077sd00000001*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series Gigabit Ethernet Controller (SR-IOV VF) (25GE 2P QL41262HxCU-DE Adapter)
+
+pci:v00001077d00008090sv00001077sd00000002*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series Gigabit Ethernet Controller (SR-IOV VF) (10GE 2P QL41112HxCU-DE Adapter)
+
+pci:v00001077d00008090sv00001077sd0000000B*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series Gigabit Ethernet Controller (SR-IOV VF) (25GE 2P QL41262HxCU-DE Adapter)
+
+pci:v00001077d00008090sv00001077sd0000000D*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series Gigabit Ethernet Controller (SR-IOV VF) (FastLinQ QL41262H 25GbE FCoE Adapter (SR-IOV VF))
+
+pci:v00001077d00008090sv00001077sd0000000E*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series Gigabit Ethernet Controller (SR-IOV VF) (FastLinQ QL41162H 10GbE iSCSI Adapter (SR-IOV VF))
+
+pci:v00001077d00008090sv00001077sd00000011*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series Gigabit Ethernet Controller (SR-IOV VF) (FastLinQ QL41212H 25GbE Adapter (SR-IOV VF))
+
+pci:v00001077d00008090sv00001077sd00000012*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL41000 Series Gigabit Ethernet Controller (SR-IOV VF) (FastLinQ QL41112H 10GbE Adapter (SR-IOV VF))
+
 pci:v00001077d00008430*
  ID_MODEL_FROM_DATABASE=ISP8324 1/10GbE Converged Network Controller (NIC VF)
 
@@ -21605,6 +22034,9 @@ pci:v000010B5d00008547*
 pci:v000010B5d00008548*
  ID_MODEL_FROM_DATABASE=PEX 8548 48-lane, 9-port PCI Express Switch
 
+pci:v000010B5d00008603*
+ ID_MODEL_FROM_DATABASE=PEX 8603 3-lane, 3-Port PCI Express Gen 2 (5.0 GT/s) Switch
+
 pci:v000010B5d00008604*
  ID_MODEL_FROM_DATABASE=PEX 8604 4-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch
 
@@ -21683,6 +22115,9 @@ pci:v000010B5d00008717*
 pci:v000010B5d00008718*
  ID_MODEL_FROM_DATABASE=PEX 8718 16-Lane, 5-Port PCI Express Gen 3 (8.0 GT/s) Switch
 
+pci:v000010B5d00008724*
+ ID_MODEL_FROM_DATABASE=PEX 8724 24-Lane, 6-Port PCI Express Gen 3 (8 GT/s) Switch, 19 x 19mm FCBGA
+
 pci:v000010B5d00008732*
  ID_MODEL_FROM_DATABASE=PEX 8732 32-lane, 8-Port PCI Express Gen 3 (8.0 GT/s) Switch
 
@@ -21692,6 +22127,9 @@ pci:v000010B5d00008734*
 pci:v000010B5d00008747*
  ID_MODEL_FROM_DATABASE=PEX 8747 48-Lane, 5-Port PCI Express Gen 3 (8.0 GT/s) Switch
 
+pci:v000010B5d00008748*
+ ID_MODEL_FROM_DATABASE=PEX 8748 48-Lane, 12-Port PCI Express Gen 3 (8 GT/s) Switch, 27 x 27mm FCBGA
+
 pci:v000010B5d000087B0*
  ID_MODEL_FROM_DATABASE=PEX 8732 32-lane, 8-Port PCI Express Gen 3 (8.0 GT/s) Switch
 
@@ -22103,6 +22541,9 @@ pci:v000010B5d00009656sv00001885sd00000701*
 pci:v000010B5d00009733*
  ID_MODEL_FROM_DATABASE=PEX 9733 33-lane, 9-port PCI Express Gen 3 (8.0 GT/s) Switch
 
+pci:v000010B5d00009733sv00001D49sd00000001*
+ ID_MODEL_FROM_DATABASE=PEX 9733 33-lane, 9-port PCI Express Gen 3 (8.0 GT/s) Switch (ThinkSystem 1610-4P NVMe Switch Adapter)
+
 pci:v000010B5d00009749*
  ID_MODEL_FROM_DATABASE=PEX 9749 49-lane, 13-port PCI Express Gen 3 (8.0 GT/s) Switch
 
@@ -24620,6 +25061,9 @@ pci:v000010DEd00000103sv00001048sd00000C4A*
 pci:v000010DEd00000103sv00001048sd00000C4B*
  ID_MODEL_FROM_DATABASE=NV10GL [Quadro] (GLoria II-64 Pro DVII)
 
+pci:v000010DEd00000103sv000010A9sd00009002*
+ ID_MODEL_FROM_DATABASE=NV10GL [Quadro] (VPro VR3)
+
 pci:v000010DEd00000110*
  ID_MODEL_FROM_DATABASE=NV11 [GeForce2 MX/MX 400]
 
@@ -26229,7 +26673,7 @@ pci:v000010DEd00000398*
  ID_MODEL_FROM_DATABASE=G73M [GeForce Go 7600]
 
 pci:v000010DEd00000398sv00001025sd0000006C*
- ID_MODEL_FROM_DATABASE=G73M [GeForce Go 7600] (Acer 9814 WKMI)
+ ID_MODEL_FROM_DATABASE=G73M [GeForce Go 7600] (Aspire 9814WKMi)
 
 pci:v000010DEd00000399*
  ID_MODEL_FROM_DATABASE=G73M [GeForce Go 7600 GT]
@@ -29093,6 +29537,9 @@ pci:v000010DEd00000DFC*
 pci:v000010DEd00000E08*
  ID_MODEL_FROM_DATABASE=GF119 HDMI Audio Controller
 
+pci:v000010DEd00000E08sv00001043sd000083A0*
+ ID_MODEL_FROM_DATABASE=GF119 HDMI Audio Controller (ENGT520 SILENT)
+
 pci:v000010DEd00000E08sv000010B0sd0000104A*
  ID_MODEL_FROM_DATABASE=GF119 HDMI Audio Controller (Gainward GeForce GT 610)
 
@@ -29174,6 +29621,12 @@ pci:v000010DEd00000F06*
 pci:v000010DEd00000FB0*
  ID_MODEL_FROM_DATABASE=GM200 High Definition Audio
 
+pci:v000010DEd00000FB8*
+ ID_MODEL_FROM_DATABASE=GP108 High Definition Audio Controller
+
+pci:v000010DEd00000FB9*
+ ID_MODEL_FROM_DATABASE=GP107GL High Definition Audio Controller
+
 pci:v000010DEd00000FBB*
  ID_MODEL_FROM_DATABASE=GM204 High Definition Audio Controller
 
@@ -29465,6 +29918,9 @@ pci:v000010DEd0000103C*
 pci:v000010DEd00001040*
  ID_MODEL_FROM_DATABASE=GF119 [GeForce GT 520]
 
+pci:v000010DEd00001040sv00001043sd000083A0*
+ ID_MODEL_FROM_DATABASE=GF119 [GeForce GT 520] (ENGT520 SILENT)
+
 pci:v000010DEd00001042*
  ID_MODEL_FROM_DATABASE=GF119 [GeForce 510]
 
@@ -29666,9 +30122,15 @@ pci:v000010DEd000010C5*
 pci:v000010DEd000010D8*
  ID_MODEL_FROM_DATABASE=GT218 [NVS 300]
 
+pci:v000010DEd000010EF*
+ ID_MODEL_FROM_DATABASE=GP102 HDMI Audio Controller
+
 pci:v000010DEd000010F0*
  ID_MODEL_FROM_DATABASE=GP104 High Definition Audio Controller
 
+pci:v000010DEd000010F1*
+ ID_MODEL_FROM_DATABASE=GP106 High Definition Audio Controller
+
 pci:v000010DEd00001140*
  ID_MODEL_FROM_DATABASE=GF117M [GeForce 610M/710M/810M/820M / GT 620M/625M/630M/720M]
 
@@ -30255,7 +30717,7 @@ pci:v000010DEd00001140sv0000144Dsd0000C10D*
  ID_MODEL_FROM_DATABASE=GF117M [GeForce 610M/710M/810M/820M / GT 620M/625M/630M/720M] (GeForce 820M)
 
 pci:v000010DEd00001140sv0000144Dsd0000C652*
- ID_MODEL_FROM_DATABASE=GF117M [GeForce 610M/710M/810M/820M / GT 620M/625M/630M/720M] (GeForce GT 620M)
+ ID_MODEL_FROM_DATABASE=GF117M [GeForce 610M/710M/810M/820M / GT 620M/625M/630M/720M] (GeForce GT 620M on NP300E5C series laptop)
 
 pci:v000010DEd00001140sv0000144Dsd0000C709*
  ID_MODEL_FROM_DATABASE=GF117M [GeForce 610M/710M/810M/820M / GT 620M/625M/630M/720M] (GeForce 710M)
@@ -31133,6 +31595,9 @@ pci:v000010DEd00001348*
 pci:v000010DEd00001349*
  ID_MODEL_FROM_DATABASE=GM108M [GeForce 930M]
 
+pci:v000010DEd0000134B*
+ ID_MODEL_FROM_DATABASE=GM108M [GeForce 940MX]
+
 pci:v000010DEd0000134D*
  ID_MODEL_FROM_DATABASE=GM108M [GeForce 940MX]
 
@@ -31148,6 +31613,9 @@ pci:v000010DEd0000137A*
 pci:v000010DEd0000137Asv000017AAsd0000505A*
  ID_MODEL_FROM_DATABASE=GM108GLM [Quadro K620M / Quadro M500M] (Quadro M500M)
 
+pci:v000010DEd0000137B*
+ ID_MODEL_FROM_DATABASE=GM108GLM [Quadro M520 Mobile]
+
 pci:v000010DEd0000137D*
  ID_MODEL_FROM_DATABASE=GM108M [GeForce 940A]
 
@@ -31229,6 +31697,12 @@ pci:v000010DEd000013B2*
 pci:v000010DEd000013B3*
  ID_MODEL_FROM_DATABASE=GM107GLM [Quadro K2200M]
 
+pci:v000010DEd000013B4*
+ ID_MODEL_FROM_DATABASE=GM107GLM [Quadro M620 Mobile]
+
+pci:v000010DEd000013B6*
+ ID_MODEL_FROM_DATABASE=GM107GLM [Quadro M1200 Mobile]
+
 pci:v000010DEd000013B9*
  ID_MODEL_FROM_DATABASE=GM107GL [NVS 810]
 
@@ -31277,6 +31751,9 @@ pci:v000010DEd000013D9*
 pci:v000010DEd000013DA*
  ID_MODEL_FROM_DATABASE=GM204M [GeForce GTX 980]
 
+pci:v000010DEd000013E7*
+ ID_MODEL_FROM_DATABASE=GM204 [GeForce GTX 980 Engineering Sample]
+
 pci:v000010DEd000013F0*
  ID_MODEL_FROM_DATABASE=GM204GL [Quadro M5000]
 
@@ -31290,7 +31767,7 @@ pci:v000010DEd000013F3*
  ID_MODEL_FROM_DATABASE=GM204GL [Tesla M6]
 
 pci:v000010DEd000013F8*
- ID_MODEL_FROM_DATABASE=GM204GLM [Quadro M5000M]
+ ID_MODEL_FROM_DATABASE=GM204GLM [Quadro M5000M / M5000 SE]
 
 pci:v000010DEd000013F9*
  ID_MODEL_FROM_DATABASE=GM204GLM [Quadro M4000M]
@@ -31298,6 +31775,9 @@ pci:v000010DEd000013F9*
 pci:v000010DEd000013FA*
  ID_MODEL_FROM_DATABASE=GM204GLM [Quadro M3000M]
 
+pci:v000010DEd000013FAsv000010DEsd000011C9*
+ ID_MODEL_FROM_DATABASE=GM204GLM [Quadro M3000M] (Quadro M3000 SE)
+
 pci:v000010DEd000013FB*
  ID_MODEL_FROM_DATABASE=GM204GLM [Quadro M5500]
 
@@ -31322,17 +31802,23 @@ pci:v000010DEd00001430*
 pci:v000010DEd00001431*
  ID_MODEL_FROM_DATABASE=GM206GL [Tesla M4]
 
+pci:v000010DEd00001436*
+ ID_MODEL_FROM_DATABASE=GM206GLM [Quadro M2200 Mobile]
+
 pci:v000010DEd000015F0*
- ID_MODEL_FROM_DATABASE=GP100GL
+ ID_MODEL_FROM_DATABASE=GP100GL [Quadro GP100]
 
 pci:v000010DEd000015F1*
  ID_MODEL_FROM_DATABASE=GP100GL
 
+pci:v000010DEd000015F7*
+ ID_MODEL_FROM_DATABASE=GP100GL [Tesla P100 PCIe 12GB]
+
 pci:v000010DEd000015F8*
- ID_MODEL_FROM_DATABASE=GP100GL
+ ID_MODEL_FROM_DATABASE=GP100GL [Tesla P100 PCIe 16GB]
 
 pci:v000010DEd000015F9*
- ID_MODEL_FROM_DATABASE=GP100GL
+ ID_MODEL_FROM_DATABASE=GP100GL [Tesla P100 SMX2 16GB]
 
 pci:v000010DEd00001617*
  ID_MODEL_FROM_DATABASE=GM204M [GeForce GTX 980M]
@@ -31344,7 +31830,7 @@ pci:v000010DEd00001619*
  ID_MODEL_FROM_DATABASE=GM204M [GeForce GTX 965M]
 
 pci:v000010DEd0000161A*
- ID_MODEL_FROM_DATABASE=GM204M [GeForce GTX 980]
+ ID_MODEL_FROM_DATABASE=GM204M [GeForce GTX 980 Mobile]
 
 pci:v000010DEd00001667*
  ID_MODEL_FROM_DATABASE=GM204M [GeForce GTX 965M]
@@ -31374,11 +31860,23 @@ pci:v000010DEd000017FD*
  ID_MODEL_FROM_DATABASE=GM200GL [Tesla M40]
 
 pci:v000010DEd00001B00*
- ID_MODEL_FROM_DATABASE=GP102
+ ID_MODEL_FROM_DATABASE=GP102 [TITAN X]
 
 pci:v000010DEd00001B01*
  ID_MODEL_FROM_DATABASE=GP102
 
+pci:v000010DEd00001B02*
+ ID_MODEL_FROM_DATABASE=GP102 [TITAN Xp]
+
+pci:v000010DEd00001B06*
+ ID_MODEL_FROM_DATABASE=GP102 [GeForce GTX 1080 Ti]
+
+pci:v000010DEd00001B30*
+ ID_MODEL_FROM_DATABASE=GP102GL [Quadro P6000]
+
+pci:v000010DEd00001B38*
+ ID_MODEL_FROM_DATABASE=GP102GL [Tesla P40]
+
 pci:v000010DEd00001B70*
  ID_MODEL_FROM_DATABASE=GP102GL
 
@@ -31397,23 +31895,41 @@ pci:v000010DEd00001B82*
 pci:v000010DEd00001B83*
  ID_MODEL_FROM_DATABASE=GP104
 
+pci:v000010DEd00001B84*
+ ID_MODEL_FROM_DATABASE=GP104 [GeForce GTX 1060 3GB]
+
+pci:v000010DEd00001BA0*
+ ID_MODEL_FROM_DATABASE=GP104M [GeForce GTX 1080 Mobile]
+
 pci:v000010DEd00001BA1*
- ID_MODEL_FROM_DATABASE=GP104M [GeForce GTX 1070]
+ ID_MODEL_FROM_DATABASE=GP104M [GeForce GTX 1070 Mobile]
 
 pci:v000010DEd00001BB0*
- ID_MODEL_FROM_DATABASE=GP104GL
+ ID_MODEL_FROM_DATABASE=GP104GL [Quadro P5000]
 
 pci:v000010DEd00001BB1*
- ID_MODEL_FROM_DATABASE=GP104GL
+ ID_MODEL_FROM_DATABASE=GP104GL [Quadro P4000]
+
+pci:v000010DEd00001BB3*
+ ID_MODEL_FROM_DATABASE=GP104GL [Tesla P4]
 
 pci:v000010DEd00001BB4*
  ID_MODEL_FROM_DATABASE=GP104GL
 
+pci:v000010DEd00001BB6*
+ ID_MODEL_FROM_DATABASE=GP104GLM [Quadro P5000 Mobile]
+
+pci:v000010DEd00001BB7*
+ ID_MODEL_FROM_DATABASE=GP104GLM [Quadro P4000 Mobile]
+
+pci:v000010DEd00001BB8*
+ ID_MODEL_FROM_DATABASE=GP104GLM [Quadro P3000 Mobile]
+
 pci:v000010DEd00001BE0*
- ID_MODEL_FROM_DATABASE=GP104M [GeForce GTX 1080]
+ ID_MODEL_FROM_DATABASE=GP104M [GeForce GTX 1080 Mobile]
 
 pci:v000010DEd00001BE1*
- ID_MODEL_FROM_DATABASE=GP104M [GeForce GTX 1070]
+ ID_MODEL_FROM_DATABASE=GP104M [GeForce GTX 1070 Mobile]
 
 pci:v000010DEd00001C00*
  ID_MODEL_FROM_DATABASE=GP106
@@ -31422,13 +31938,28 @@ pci:v000010DEd00001C01*
  ID_MODEL_FROM_DATABASE=GP106
 
 pci:v000010DEd00001C02*
- ID_MODEL_FROM_DATABASE=GP106
+ ID_MODEL_FROM_DATABASE=GP106 [GeForce GTX 1060 3GB]
 
 pci:v000010DEd00001C03*
- ID_MODEL_FROM_DATABASE=GP106 [GeForce GTX 1060]
+ ID_MODEL_FROM_DATABASE=GP106 [GeForce GTX 1060 6GB]
+
+pci:v000010DEd00001C20*
+ ID_MODEL_FROM_DATABASE=GP106M [GeForce GTX 1060 Mobile]
 
 pci:v000010DEd00001C30*
- ID_MODEL_FROM_DATABASE=GP106GL
+ ID_MODEL_FROM_DATABASE=GP106GL [Quadro P2000]
+
+pci:v000010DEd00001C35*
+ ID_MODEL_FROM_DATABASE=GP106
+
+pci:v000010DEd00001C60*
+ ID_MODEL_FROM_DATABASE=GP106M [GeForce GTX 1060 Mobile]
+
+pci:v000010DEd00001C61*
+ ID_MODEL_FROM_DATABASE=GP106M [GeForce GTX 1050 Ti Mobile]
+
+pci:v000010DEd00001C62*
+ ID_MODEL_FROM_DATABASE=GP106M [GeForce GTX 1050 Mobile]
 
 pci:v000010DEd00001C70*
  ID_MODEL_FROM_DATABASE=GP106GL
@@ -31437,10 +31968,19 @@ pci:v000010DEd00001C80*
  ID_MODEL_FROM_DATABASE=GP107
 
 pci:v000010DEd00001C81*
- ID_MODEL_FROM_DATABASE=GP107
+ ID_MODEL_FROM_DATABASE=GP107 [GeForce GTX 1050]
 
 pci:v000010DEd00001C82*
- ID_MODEL_FROM_DATABASE=GP107
+ ID_MODEL_FROM_DATABASE=GP107 [GeForce GTX 1050 Ti]
+
+pci:v000010DEd00001C8C*
+ ID_MODEL_FROM_DATABASE=GP107M [GeForce GTX 1050 Ti Mobile]
+
+pci:v000010DEd00001C8D*
+ ID_MODEL_FROM_DATABASE=GP107M [GeForce GTX 1050 Mobile]
+
+pci:v000010DEd00001C8E*
+ ID_MODEL_FROM_DATABASE=GP107M
 
 pci:v000010DEd00001CA7*
  ID_MODEL_FROM_DATABASE=GP107GL
@@ -31451,8 +31991,23 @@ pci:v000010DEd00001CA8*
 pci:v000010DEd00001CAA*
  ID_MODEL_FROM_DATABASE=GP107GL
 
+pci:v000010DEd00001CB1*
+ ID_MODEL_FROM_DATABASE=GP107GL [Quadro P1000]
+
+pci:v000010DEd00001CB2*
+ ID_MODEL_FROM_DATABASE=GP107GL [Quadro P600]
+
+pci:v000010DEd00001CB3*
+ ID_MODEL_FROM_DATABASE=GP107GL [Quadro P400]
+
 pci:v000010DEd00001D01*
- ID_MODEL_FROM_DATABASE=GP108
+ ID_MODEL_FROM_DATABASE=GP108 [GeForce GT 1030]
+
+pci:v000010DEd00001D10*
+ ID_MODEL_FROM_DATABASE=GP108 [GeForce MX150]
+
+pci:v000010DEd00001D81*
+ ID_MODEL_FROM_DATABASE=GV100
 
 pci:v000010DF*
  ID_VENDOR_FROM_DATABASE=Emulex Corporation
@@ -31521,7 +32076,10 @@ pci:v000010DFd0000E180*
  ID_MODEL_FROM_DATABASE=Proteus-X: LightPulse IOV Fibre Channel Host Adapter
 
 pci:v000010DFd0000E200*
- ID_MODEL_FROM_DATABASE=Lancer-X: LightPulse Fibre Channel Host Adapter
+ ID_MODEL_FROM_DATABASE=LightPulse LPe16002
+
+pci:v000010DFd0000E200sv00001014sd000003F1*
+ ID_MODEL_FROM_DATABASE=LightPulse LPe16002 (PCIe2 16 Gb 2-port Fibre Channel Adapter (FC EL5B; CCIN 577F))
 
 pci:v000010DFd0000E208*
  ID_MODEL_FROM_DATABASE=LightPulse 16Gb Fibre Channel Host Adapter (Lancer-VF)
@@ -31547,6 +32105,24 @@ pci:v000010DFd0000E268*
 pci:v000010DFd0000E300*
  ID_MODEL_FROM_DATABASE=Lancer Gen6: LPe32000 Fibre Channel Host Adapter
 
+pci:v000010DFd0000E300sv000010DFsd0000E310*
+ ID_MODEL_FROM_DATABASE=Lancer Gen6: LPe32000 Fibre Channel Host Adapter (Lancer Gen6: LPe31000 Fibre Channel Host Adapter)
+
+pci:v000010DFd0000E300sv000010DFsd0000E311*
+ ID_MODEL_FROM_DATABASE=Lancer Gen6: LPe32000 Fibre Channel Host Adapter (Lancer Gen6: LPe31000 Fibre Channel Host Adapter)
+
+pci:v000010DFd0000E300sv000010DFsd0000E312*
+ ID_MODEL_FROM_DATABASE=Lancer Gen6: LPe32000 Fibre Channel Host Adapter (Lancer Gen6: LPe31000 Fibre Channel Host Adapter)
+
+pci:v000010DFd0000E300sv000010DFsd0000E322*
+ ID_MODEL_FROM_DATABASE=Lancer Gen6: LPe32000 Fibre Channel Host Adapter (Lancer Gen6: LPe31000 Fibre Channel Host Adapter)
+
+pci:v000010DFd0000E300sv000010DFsd0000E323*
+ ID_MODEL_FROM_DATABASE=Lancer Gen6: LPe32000 Fibre Channel Host Adapter (Lancer Gen6: LPe31000 Fibre Channel Host Adapter)
+
+pci:v000010DFd0000E300sv000010DFsd0000E325*
+ ID_MODEL_FROM_DATABASE=Lancer Gen6: LPe32000 Fibre Channel Host Adapter (Lancer Gen6: LPe31000 Fibre Channel Host Adapter)
+
 pci:v000010DFd0000F011*
  ID_MODEL_FROM_DATABASE=Saturn: LightPulse Fibre Channel Host Adapter
 
@@ -31589,6 +32165,9 @@ pci:v000010DFd0000F0F5*
 pci:v000010DFd0000F100*
  ID_MODEL_FROM_DATABASE=Saturn-X: LightPulse Fibre Channel Host Adapter
 
+pci:v000010DFd0000F100sv00001014sd0000038A*
+ ID_MODEL_FROM_DATABASE=Saturn-X: LightPulse Fibre Channel Host Adapter (8Gb PCI Express Dual Port FC Adapter for POWER)
+
 pci:v000010DFd0000F100sv0000103Csd00003282*
  ID_MODEL_FROM_DATABASE=Saturn-X: LightPulse Fibre Channel Host Adapter (8Gb Dual-port PCI-e FC HBA)
 
@@ -31655,6 +32234,9 @@ pci:v000010DFd0000FC50*
 pci:v000010DFd0000FD00*
  ID_MODEL_FROM_DATABASE=Helios-X LightPulse Fibre Channel Host Adapter
 
+pci:v000010DFd0000FD00sv000010DFsd0000FD02*
+ ID_MODEL_FROM_DATABASE=Helios-X LightPulse Fibre Channel Host Adapter (LightPulse LP11002 Dual-port 4Gigabit PCI Fibre Channel Adapter)
+
 pci:v000010DFd0000FD11*
  ID_MODEL_FROM_DATABASE=Helios-X LightPulse Fibre Channel Host Adapter
 
@@ -31955,9 +32537,15 @@ pci:v000010ECd00005250*
 pci:v000010ECd0000525A*
  ID_MODEL_FROM_DATABASE=RTS525A PCI Express Card Reader
 
+pci:v000010ECd0000525Asv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=RTS525A PCI Express Card Reader (ThinkPad X1 Carbon 5th Gen)
+
 pci:v000010ECd00005286*
  ID_MODEL_FROM_DATABASE=RTS5286 PCI Express Card Reader
 
+pci:v000010ECd00005287*
+ ID_MODEL_FROM_DATABASE=RTL8411B PCI Express Card Reader
+
 pci:v000010ECd00005288*
  ID_MODEL_FROM_DATABASE=RTS5288 PCI Express Card Reader
 
@@ -32003,6 +32591,9 @@ pci:v000010ECd00008136*
 pci:v000010ECd00008136sv0000103Csd00001985*
  ID_MODEL_FROM_DATABASE=RTL8101/2/6E PCI Express Fast/Gigabit Ethernet controller (Pavilion 17-e163sg Notebook PC)
 
+pci:v000010ECd00008136sv0000103Csd00002A8C*
+ ID_MODEL_FROM_DATABASE=RTL8101/2/6E PCI Express Fast/Gigabit Ethernet controller (Compaq 500B Microtower)
+
 pci:v000010ECd00008136sv0000103Csd00002AB1*
  ID_MODEL_FROM_DATABASE=RTL8101/2/6E PCI Express Fast/Gigabit Ethernet controller (Pavilion p6774)
 
@@ -32237,6 +32828,9 @@ pci:v000010ECd00008168sv0000105Bsd00000D7C*
 pci:v000010ECd00008168sv000010ECsd00008168*
  ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (RTL8111/8168 PCI Express Gigabit Ethernet controller)
 
+pci:v000010ECd00008168sv0000144Dsd0000C652*
+ ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (RTL8168 on a NP300E5C series laptop)
+
 pci:v000010ECd00008168sv00001458sd0000E000*
  ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (Onboard Ethernet)
 
@@ -32261,6 +32855,9 @@ pci:v000010ECd00008168sv00001849sd00008168*
 pci:v000010ECd00008168sv00007470sd00003468*
  ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (TG-3468 Gigabit PCI Express Network Adapter)
 
+pci:v000010ECd00008168sv00008086sd00002055*
+ ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (NUC Kit DN2820FYKH)
+
 pci:v000010ECd00008168sv00008086sd0000D615*
  ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (Desktop Board D510MO/D525MW)
 
@@ -32327,6 +32924,9 @@ pci:v000010ECd00008174*
 pci:v000010ECd00008176*
  ID_MODEL_FROM_DATABASE=RTL8188CE 802.11b/g/n WiFi Adapter
 
+pci:v000010ECd00008176sv00001043sd000084B5*
+ ID_MODEL_FROM_DATABASE=RTL8188CE 802.11b/g/n WiFi Adapter (PCE-N10)
+
 pci:v000010ECd00008176sv00001A3Bsd00001139*
  ID_MODEL_FROM_DATABASE=RTL8188CE 802.11b/g/n WiFi Adapter (AW-NE139H Half-size Mini PCIe Card)
 
@@ -32369,6 +32969,9 @@ pci:v000010ECd00008192*
 pci:v000010ECd00008193*
  ID_MODEL_FROM_DATABASE=RTL8192DE Wireless LAN Controller
 
+pci:v000010ECd00008196*
+ ID_MODEL_FROM_DATABASE=RTL8196 Integrated PCI-e Bridge
+
 pci:v000010ECd00008197*
  ID_MODEL_FROM_DATABASE=SmartLAN56 56K Modem
 
@@ -32393,6 +32996,9 @@ pci:v000010ECd00008821*
 pci:v000010ECd0000B723*
  ID_MODEL_FROM_DATABASE=RTL8723BE PCIe Wireless Network Adapter
 
+pci:v000010ECd0000B723sv000010ECsd00008739*
+ ID_MODEL_FROM_DATABASE=RTL8723BE PCIe Wireless Network Adapter (Dell Wireless 1801)
+
 pci:v000010ED*
  ID_VENDOR_FROM_DATABASE=Ascii Corporation
 
@@ -32453,6 +33059,12 @@ pci:v000010EEd00003FC5*
 pci:v000010EEd00003FC6*
  ID_MODEL_FROM_DATABASE=RME Hammerfall DSP MADI
 
+pci:v000010EEd00007038*
+ ID_MODEL_FROM_DATABASE=FPGA Card XC7VX690T
+
+pci:v000010EEd00007038sv000017AAsd0000402F*
+ ID_MODEL_FROM_DATABASE=FPGA Card XC7VX690T (FPGA XC7VX690T-3FFG1157E)
+
 pci:v000010EEd00008380*
  ID_MODEL_FROM_DATABASE=Ellips ProfiXpress Profibus Master
 
@@ -33855,10 +34467,10 @@ pci:v00001106d00003059sv00001043sd000080B0*
  ID_MODEL_FROM_DATABASE=VT8233/A/8235/8237 AC97 Audio Controller (A7V600/K8V-X/K8V Deluxe motherboard (ADI AD1980 codec [SoundMAX]))
 
 pci:v00001106d00003059sv00001043sd000080F3*
- ID_MODEL_FROM_DATABASE=VT8233/A/8235/8237 AC97 Audio Controller (ASUSTek SK8V motherboard)
+ ID_MODEL_FROM_DATABASE=VT8233/A/8235/8237 AC97 Audio Controller (SK8V motherboard)
 
 pci:v00001106d00003059sv00001043sd0000810D*
- ID_MODEL_FROM_DATABASE=VT8233/A/8235/8237 AC97 Audio Controller (Asus P5VD1-X (AD1888 codec [SoundMax]))
+ ID_MODEL_FROM_DATABASE=VT8233/A/8235/8237 AC97 Audio Controller (P5VD1-X (AD1888 codec [SoundMax]))
 
 pci:v00001106d00003059sv00001043sd0000812A*
  ID_MODEL_FROM_DATABASE=VT8233/A/8235/8237 AC97 Audio Controller (A8V Deluxe motherboard (Realtek ALC850 codec))
@@ -35603,6 +36215,9 @@ pci:v0000111Dd00008088sv00001093sd00007600*
 pci:v0000111Dd00008088sv00001093sd00007602*
  ID_MODEL_FROM_DATABASE=PES32NT8BG2 PCI Express Switch (PXIe-8384)
 
+pci:v0000111Dd0000808E*
+ ID_MODEL_FROM_DATABASE=PES24NT24G2 PCI Express Switch
+
 pci:v0000111Dd0000808F*
  ID_MODEL_FROM_DATABASE=PES32NT8AG2
 
@@ -35625,7 +36240,16 @@ pci:v0000111Fd00005243*
  ID_MODEL_FROM_DATABASE=Frame capture bus interface
 
 pci:v00001120*
- ID_VENDOR_FROM_DATABASE=EMC Corporation
+ ID_VENDOR_FROM_DATABASE=Dell EMC
+
+pci:v00001120d00002306*
+ ID_MODEL_FROM_DATABASE=Unity Fibre Channel Controller
+
+pci:v00001120d00002501*
+ ID_MODEL_FROM_DATABASE=Unity Ethernet Controller
+
+pci:v00001120d00002505*
+ ID_MODEL_FROM_DATABASE=Unity Fibre Channel Controller
 
 pci:v00001121*
  ID_VENDOR_FROM_DATABASE=Zilog
@@ -35871,7 +36495,7 @@ pci:v00001131d00007133sv00001043sd00000210*
  ID_MODEL_FROM_DATABASE=SAA7131/SAA7133/SAA7135 Video Broadcast Decoder (FlyTV mini Asus Digimatrix)
 
 pci:v00001131d00007133sv00001043sd00004843*
- ID_MODEL_FROM_DATABASE=SAA7131/SAA7133/SAA7135 Video Broadcast Decoder (ASUS TV-FM 7133)
+ ID_MODEL_FROM_DATABASE=SAA7131/SAA7133/SAA7135 Video Broadcast Decoder (TV-FM 7133)
 
 pci:v00001131d00007133sv00001043sd00004845*
  ID_MODEL_FROM_DATABASE=SAA7131/SAA7133/SAA7135 Video Broadcast Decoder (TV-FM 7135)
@@ -36093,7 +36717,7 @@ pci:v00001131d00007134sv00001043sd00000210*
  ID_MODEL_FROM_DATABASE=SAA7134/SAA7135HL Video Broadcast Decoder (Digimatrix TV)
 
 pci:v00001131d00007134sv00001043sd00004840*
- ID_MODEL_FROM_DATABASE=SAA7134/SAA7135HL Video Broadcast Decoder (ASUS TV-FM 7134)
+ ID_MODEL_FROM_DATABASE=SAA7134/SAA7135HL Video Broadcast Decoder (TV-FM 7134)
 
 pci:v00001131d00007134sv00001043sd00004842*
  ID_MODEL_FROM_DATABASE=SAA7134/SAA7135HL Video Broadcast Decoder (TV-FM 7134)
@@ -38229,7 +38853,7 @@ pci:v00001180d00000476sv00001043sd00001967*
  ID_MODEL_FROM_DATABASE=RL5c476 II (V6800V)
 
 pci:v00001180d00000476sv00001043sd00001987*
- ID_MODEL_FROM_DATABASE=RL5c476 II (Asus A4K and Z81K notebooks, possibly others ( mid-2005 machines ))
+ ID_MODEL_FROM_DATABASE=RL5c476 II (A4K and Z81K notebooks, possibly others ( mid-2005 machines ))
 
 pci:v00001180d00000476sv0000104Dsd000080DF*
  ID_MODEL_FROM_DATABASE=RL5c476 II (Vaio PCG-FX403)
@@ -38256,7 +38880,7 @@ pci:v00001180d00000476sv000017AAsd0000201C*
  ID_MODEL_FROM_DATABASE=RL5c476 II (ThinkPad X60/X60s)
 
 pci:v00001180d00000476sv000017AAsd000020C4*
- ID_MODEL_FROM_DATABASE=RL5c476 II (ThinkPad T61)
+ ID_MODEL_FROM_DATABASE=RL5c476 II (ThinkPad T61/R61)
 
 pci:v00001180d00000476sv000017AAsd000020C6*
  ID_MODEL_FROM_DATABASE=RL5c476 II (ThinkPad R61)
@@ -38406,7 +39030,7 @@ pci:v00001180d00000822sv00001043sd00001237*
  ID_MODEL_FROM_DATABASE=R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter (A6J-Q008)
 
 pci:v00001180d00000822sv00001043sd00001967*
- ID_MODEL_FROM_DATABASE=R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter (ASUS V6800V)
+ ID_MODEL_FROM_DATABASE=R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter (V6800V)
 
 pci:v00001180d00000822sv000010F7sd00008338*
  ID_MODEL_FROM_DATABASE=R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter (Panasonic CF-Y5 laptop)
@@ -38453,6 +39077,9 @@ pci:v00001180d00000832sv0000103Csd000030CC*
 pci:v00001180d00000832sv0000103Csd000030CF*
  ID_MODEL_FROM_DATABASE=R5C832 IEEE 1394 Controller (Pavilion dv9668eg Laptop)
 
+pci:v00001180d00000832sv000017AAsd000020C5*
+ ID_MODEL_FROM_DATABASE=R5C832 IEEE 1394 Controller (ThinkPad R61)
+
 pci:v00001180d00000832sv000017AAsd000020C7*
  ID_MODEL_FROM_DATABASE=R5C832 IEEE 1394 Controller (ThinkPad R61)
 
@@ -38472,10 +39099,10 @@ pci:v00001180d00000843sv00001028sd000001F3*
  ID_MODEL_FROM_DATABASE=R5C843 MMC Host Controller (Inspiron 1420)
 
 pci:v00001180d00000843sv00001028sd000001F5*
- ID_MODEL_FROM_DATABASE=R5C843 MMC Host Controller (Dell Inspiron 1501)
+ ID_MODEL_FROM_DATABASE=R5C843 MMC Host Controller (Inspiron 1501)
 
 pci:v00001180d00000843sv00001028sd0000024F*
- ID_MODEL_FROM_DATABASE=R5C843 MMC Host Controller (Dell Latitude e6500)
+ ID_MODEL_FROM_DATABASE=R5C843 MMC Host Controller (Latitude e6500)
 
 pci:v00001180d00000843sv0000103Csd000003B5*
  ID_MODEL_FROM_DATABASE=R5C843 MMC Host Controller (Presario V3242AU)
@@ -38543,6 +39170,9 @@ pci:v00001180d0000E822sv00001028sd0000040B*
 pci:v00001180d0000E823*
  ID_MODEL_FROM_DATABASE=PCIe SDXC/MMC Host Controller
 
+pci:v00001180d0000E823sv000017AAsd000021CF*
+ ID_MODEL_FROM_DATABASE=PCIe SDXC/MMC Host Controller (ThinkPad T520)
+
 pci:v00001180d0000E832*
  ID_MODEL_FROM_DATABASE=R5C832 PCIe IEEE 1394 Controller
 
@@ -38552,6 +39182,9 @@ pci:v00001180d0000E832sv00001028sd0000040A*
 pci:v00001180d0000E832sv00001028sd0000040B*
  ID_MODEL_FROM_DATABASE=R5C832 PCIe IEEE 1394 Controller (Latitude E6510)
 
+pci:v00001180d0000E832sv000017AAsd000021CF*
+ ID_MODEL_FROM_DATABASE=R5C832 PCIe IEEE 1394 Controller (ThinkPad T520)
+
 pci:v00001180d0000E852*
  ID_MODEL_FROM_DATABASE=PCIe xD-Picture Card Controller
 
@@ -38891,6 +39524,9 @@ pci:v0000119Ed00000003*
 pci:v0000119F*
  ID_VENDOR_FROM_DATABASE=Bull HN Information Systems
 
+pci:v0000119Fd00001081*
+ ID_MODEL_FROM_DATABASE=BXI Host Channel Adapter
+
 pci:v000011A0*
  ID_VENDOR_FROM_DATABASE=Convex Computer Corporation
 
@@ -40481,6 +41117,9 @@ pci:v000011F8d00007384*
 pci:v000011F8d00008000*
  ID_MODEL_FROM_DATABASE=PM8000  [SPC - SAS Protocol Controller]
 
+pci:v000011F8d00008009*
+ ID_MODEL_FROM_DATABASE=PM8009 SPCve 8x6G
+
 pci:v000011F8d00008032*
  ID_MODEL_FROM_DATABASE=ATTO Celerity FC8xEN
 
@@ -40490,6 +41129,42 @@ pci:v000011F8d00008032sv0000117Csd0000003B*
 pci:v000011F8d00008032sv0000117Csd0000003C*
  ID_MODEL_FROM_DATABASE=ATTO Celerity FC8xEN (Celerity FC-84EN Fibre Channel Adapter)
 
+pci:v000011F8d00008053*
+ ID_MODEL_FROM_DATABASE=PM8053 SXP 12G 24-port SAS/SATA expander
+
+pci:v000011F8d00008054*
+ ID_MODEL_FROM_DATABASE=PM8054 SXP 12G 36-port SAS/SATA expander
+
+pci:v000011F8d00008055*
+ ID_MODEL_FROM_DATABASE=PM8055 SXP 12G 48-port SAS/SATA expander
+
+pci:v000011F8d00008056*
+ ID_MODEL_FROM_DATABASE=PM8056 SXP 12G 68-port SAS/SATA expander
+
+pci:v000011F8d00008060*
+ ID_MODEL_FROM_DATABASE=PM8060 SRCv 12G eight-port SAS/SATA RoC
+
+pci:v000011F8d00008063*
+ ID_MODEL_FROM_DATABASE=PM8063 SRCv 12G 16-port SAS/SATA RoC
+
+pci:v000011F8d00008070*
+ ID_MODEL_FROM_DATABASE=PM8070 Tachyon SPCv 12G eight-port SAS/SATA controller
+
+pci:v000011F8d00008071*
+ ID_MODEL_FROM_DATABASE=PM8071 Tachyon SPCve 12G eight-port SAS/SATA controller
+
+pci:v000011F8d00008072*
+ ID_MODEL_FROM_DATABASE=PM8072 Tachyon SPCv 12G 16-port SAS/SATA controller
+
+pci:v000011F8d00008073*
+ ID_MODEL_FROM_DATABASE=PM8073 Tachyon SPCve 12G 16-port SAS/SATA controller
+
+pci:v000011F8d00008531*
+ ID_MODEL_FROM_DATABASE=PM8531 PFX 24xG3 Fanout PCIe Switches
+
+pci:v000011F8d00008546*
+ ID_MODEL_FROM_DATABASE=PM8546 B-FEIP PSX 96xG3 PCIe Storage Switch
+
 pci:v000011F9*
  ID_VENDOR_FROM_DATABASE=I-Cube Inc
 
@@ -43272,7 +43947,7 @@ pci:v000012D8*
  ID_VENDOR_FROM_DATABASE=Pericom Semiconductor
 
 pci:v000012D8d000001A7*
- ID_MODEL_FROM_DATABASE=PI7C21P100 PCI to PCI Bridge
+ ID_MODEL_FROM_DATABASE=7C21P100 2-port PCI-X to PCI-X Bridge
 
 pci:v000012D8d0000400A*
  ID_MODEL_FROM_DATABASE=PI7C9X442SL PCI Express Bridge Port
@@ -44189,6 +44864,12 @@ pci:v00001344d00005161*
 pci:v00001344d00005163*
  ID_MODEL_FROM_DATABASE=RealSSD P425m
 
+pci:v00001344d00005180*
+ ID_MODEL_FROM_DATABASE=9100 PRO NVMe SSD
+
+pci:v00001344d00005181*
+ ID_MODEL_FROM_DATABASE=9100 MAX NVMe SSD
+
 pci:v00001345*
  ID_VENDOR_FROM_DATABASE=Arescom Inc
 
@@ -44426,6 +45107,9 @@ pci:v00001360d00000207*
 pci:v00001360d00000208*
  ID_MODEL_FROM_DATABASE=GPS180AMC GPS Receiver (PCI Express / MicroTCA / AdvancedMC)
 
+pci:v00001360d00000209*
+ ID_MODEL_FROM_DATABASE=GNS181PEX GPS/Galileo/GLONASS/BEIDOU receiver (PCI Express)
+
 pci:v00001360d00000301*
  ID_MODEL_FROM_DATABASE=TCR510PCI IRIG Timecode Reader
 
@@ -46215,7 +46899,7 @@ pci:v0000140A*
  ID_VENDOR_FROM_DATABASE=DSP Research Inc
 
 pci:v0000140B*
- ID_VENDOR_FROM_DATABASE=GE Intelligent Platforms
+ ID_VENDOR_FROM_DATABASE=Abaco Systems, Inc.
 
 pci:v0000140C*
  ID_VENDOR_FROM_DATABASE=Elmic Systems Inc
@@ -47085,7 +47769,7 @@ pci:v00001425d00005083*
  ID_MODEL_FROM_DATABASE=T540-5083 Unified Wire Ethernet Controller
 
 pci:v00001425d00005084*
- ID_MODEL_FROM_DATABASE=T580-5084 Unified Wire Ethernet Controller
+ ID_MODEL_FROM_DATABASE=T540-5084 Unified Wire Ethernet Controller
 
 pci:v00001425d00005085*
  ID_MODEL_FROM_DATABASE=T580-5085 Unified Wire Ethernet Controller
@@ -47141,6 +47825,24 @@ pci:v00001425d0000509B*
 pci:v00001425d0000509C*
  ID_MODEL_FROM_DATABASE=T520-509C Unified Wire Ethernet Controller
 
+pci:v00001425d0000509D*
+ ID_MODEL_FROM_DATABASE=T540-509D Unified Wire Ethernet Controller
+
+pci:v00001425d0000509E*
+ ID_MODEL_FROM_DATABASE=T520-509E Unified Wire Ethernet Controller
+
+pci:v00001425d0000509F*
+ ID_MODEL_FROM_DATABASE=T540-509F Unified Wire Ethernet Controller
+
+pci:v00001425d000050A0*
+ ID_MODEL_FROM_DATABASE=T540-50A0 Unified Wire Ethernet Controller
+
+pci:v00001425d000050A1*
+ ID_MODEL_FROM_DATABASE=T540-50A1 Unified Wire Ethernet Controller
+
+pci:v00001425d000050A2*
+ ID_MODEL_FROM_DATABASE=T580-50A2 Unified Wire Ethernet Controller
+
 pci:v00001425d00005401*
  ID_MODEL_FROM_DATABASE=T520-CR Unified Wire Ethernet Controller
 
@@ -47226,7 +47928,7 @@ pci:v00001425d00005483*
  ID_MODEL_FROM_DATABASE=T540-5083 Unified Wire Ethernet Controller
 
 pci:v00001425d00005484*
- ID_MODEL_FROM_DATABASE=T580-5084 Unified Wire Ethernet Controller
+ ID_MODEL_FROM_DATABASE=T540-5084 Unified Wire Ethernet Controller
 
 pci:v00001425d00005485*
  ID_MODEL_FROM_DATABASE=T580-5085 Unified Wire Ethernet Controller
@@ -47282,6 +47984,24 @@ pci:v00001425d0000549B*
 pci:v00001425d0000549C*
  ID_MODEL_FROM_DATABASE=T520-509C Unified Wire Ethernet Controller
 
+pci:v00001425d0000549D*
+ ID_MODEL_FROM_DATABASE=T540-509D Unified Wire Ethernet Controller
+
+pci:v00001425d0000549E*
+ ID_MODEL_FROM_DATABASE=T520-509E Unified Wire Ethernet Controller
+
+pci:v00001425d0000549F*
+ ID_MODEL_FROM_DATABASE=T540-509F Unified Wire Ethernet Controller
+
+pci:v00001425d000054A0*
+ ID_MODEL_FROM_DATABASE=T540-50A0 Unified Wire Ethernet Controller
+
+pci:v00001425d000054A1*
+ ID_MODEL_FROM_DATABASE=T540-50A1 Unified Wire Ethernet Controller
+
+pci:v00001425d000054A2*
+ ID_MODEL_FROM_DATABASE=T580-50A2 Unified Wire Ethernet Controller
+
 pci:v00001425d00005501*
  ID_MODEL_FROM_DATABASE=T520-CR Unified Wire Storage Controller
 
@@ -47367,7 +48087,7 @@ pci:v00001425d00005583*
  ID_MODEL_FROM_DATABASE=T540-5083 Unified Wire Storage Controller
 
 pci:v00001425d00005584*
- ID_MODEL_FROM_DATABASE=T580-5084 Unified Wire Storage Controller
+ ID_MODEL_FROM_DATABASE=T540-5084 Unified Wire Storage Controller
 
 pci:v00001425d00005585*
  ID_MODEL_FROM_DATABASE=T580-5085 Unified Wire Storage Controller
@@ -47423,6 +48143,24 @@ pci:v00001425d0000559B*
 pci:v00001425d0000559C*
  ID_MODEL_FROM_DATABASE=T520-509C Unified Wire Storage Controller
 
+pci:v00001425d0000559D*
+ ID_MODEL_FROM_DATABASE=T540-509D Unified Wire Storage Controller
+
+pci:v00001425d0000559E*
+ ID_MODEL_FROM_DATABASE=T520-509E Unified Wire Storage Controller
+
+pci:v00001425d0000559F*
+ ID_MODEL_FROM_DATABASE=T540-509F Unified Wire Storage Controller
+
+pci:v00001425d000055A0*
+ ID_MODEL_FROM_DATABASE=T540-50A0 Unified Wire Storage Controller
+
+pci:v00001425d000055A1*
+ ID_MODEL_FROM_DATABASE=T540-50A1 Unified Wire Storage Controller
+
+pci:v00001425d000055A2*
+ ID_MODEL_FROM_DATABASE=T580-50A2 Unified Wire Storage Controller
+
 pci:v00001425d00005601*
  ID_MODEL_FROM_DATABASE=T520-CR Unified Wire Storage Controller
 
@@ -47508,7 +48246,7 @@ pci:v00001425d00005683*
  ID_MODEL_FROM_DATABASE=T540-5083 Unified Wire Storage Controller
 
 pci:v00001425d00005684*
- ID_MODEL_FROM_DATABASE=T580-5084 Unified Wire Storage Controller
+ ID_MODEL_FROM_DATABASE=T540-5084 Unified Wire Storage Controller
 
 pci:v00001425d00005685*
  ID_MODEL_FROM_DATABASE=T580-5085 Unified Wire Storage Controller
@@ -47564,6 +48302,24 @@ pci:v00001425d0000569B*
 pci:v00001425d0000569C*
  ID_MODEL_FROM_DATABASE=T520-509C Unified Wire Storage Controller
 
+pci:v00001425d0000569D*
+ ID_MODEL_FROM_DATABASE=T540-509D Unified Wire Storage Controller
+
+pci:v00001425d0000569E*
+ ID_MODEL_FROM_DATABASE=T520-509E Unified Wire Storage Controller
+
+pci:v00001425d0000569F*
+ ID_MODEL_FROM_DATABASE=T540-509F Unified Wire Storage Controller
+
+pci:v00001425d000056A0*
+ ID_MODEL_FROM_DATABASE=T540-50A0 Unified Wire Storage Controller
+
+pci:v00001425d000056A1*
+ ID_MODEL_FROM_DATABASE=T540-50A1 Unified Wire Storage Controller
+
+pci:v00001425d000056A2*
+ ID_MODEL_FROM_DATABASE=T580-50A2 Unified Wire Storage Controller
+
 pci:v00001425d00005701*
  ID_MODEL_FROM_DATABASE=T520-CR Unified Wire Ethernet Controller
 
@@ -47766,7 +48522,7 @@ pci:v00001425d00005883*
  ID_MODEL_FROM_DATABASE=T540-5083 Unified Wire Ethernet Controller [VF]
 
 pci:v00001425d00005884*
- ID_MODEL_FROM_DATABASE=T580-5084 Unified Wire Ethernet Controller [VF]
+ ID_MODEL_FROM_DATABASE=T540-5084 Unified Wire Ethernet Controller [VF]
 
 pci:v00001425d00005885*
  ID_MODEL_FROM_DATABASE=T580-5085 Unified Wire Ethernet Controller [VF]
@@ -47822,6 +48578,294 @@ pci:v00001425d0000589B*
 pci:v00001425d0000589C*
  ID_MODEL_FROM_DATABASE=T520-509C Unified Wire Ethernet Controller [VF]
 
+pci:v00001425d0000589D*
+ ID_MODEL_FROM_DATABASE=T540-509D Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d0000589E*
+ ID_MODEL_FROM_DATABASE=T520-509E Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d0000589F*
+ ID_MODEL_FROM_DATABASE=T540-509F Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d000058A0*
+ ID_MODEL_FROM_DATABASE=T540-50A0 Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d000058A1*
+ ID_MODEL_FROM_DATABASE=T540-50A1 Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d000058A2*
+ ID_MODEL_FROM_DATABASE=T580-50A2 Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006001*
+ ID_MODEL_FROM_DATABASE=T6225-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006002*
+ ID_MODEL_FROM_DATABASE=T6225-SO-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006003*
+ ID_MODEL_FROM_DATABASE=T6425-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006004*
+ ID_MODEL_FROM_DATABASE=T6425-SO-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006005*
+ ID_MODEL_FROM_DATABASE=T6225-OCP-SO Unified Wire Ethernet Controller
+
+pci:v00001425d00006006*
+ ID_MODEL_FROM_DATABASE=T62100-OCP-SO Unified Wire Ethernet Controller
+
+pci:v00001425d00006007*
+ ID_MODEL_FROM_DATABASE=T62100-LP-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006008*
+ ID_MODEL_FROM_DATABASE=T62100-SO-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006009*
+ ID_MODEL_FROM_DATABASE=T6210-BT Unified Wire Ethernet Controller
+
+pci:v00001425d0000600D*
+ ID_MODEL_FROM_DATABASE=T62100-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006011*
+ ID_MODEL_FROM_DATABASE=T6225-LL-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006014*
+ ID_MODEL_FROM_DATABASE=T61100-OCP-SO Unified Wire Ethernet Controller
+
+pci:v00001425d00006015*
+ ID_MODEL_FROM_DATABASE=T6201-BT Unified Wire Ethernet Controller
+
+pci:v00001425d00006080*
+ ID_MODEL_FROM_DATABASE=T6225-6080 Unified Wire Ethernet Controller
+
+pci:v00001425d00006081*
+ ID_MODEL_FROM_DATABASE=T62100-6081 Unified Wire Ethernet Controller
+
+pci:v00001425d00006082*
+ ID_MODEL_FROM_DATABASE=T6225-6082 Unified Wire Ethernet Controller
+
+pci:v00001425d00006083*
+ ID_MODEL_FROM_DATABASE=T62100-6083 Unified Wire Ethernet Controller
+
+pci:v00001425d00006084*
+ ID_MODEL_FROM_DATABASE=T64100-6084 Unified Wire Ethernet Controller
+
+pci:v00001425d00006401*
+ ID_MODEL_FROM_DATABASE=T6225-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006402*
+ ID_MODEL_FROM_DATABASE=T6225-SO-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006403*
+ ID_MODEL_FROM_DATABASE=T6425-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006404*
+ ID_MODEL_FROM_DATABASE=T6425-SO-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006405*
+ ID_MODEL_FROM_DATABASE=T6225-OCP-SO Unified Wire Ethernet Controller
+
+pci:v00001425d00006406*
+ ID_MODEL_FROM_DATABASE=T62100-OCP-SO Unified Wire Ethernet Controller
+
+pci:v00001425d00006407*
+ ID_MODEL_FROM_DATABASE=T62100-LP-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006408*
+ ID_MODEL_FROM_DATABASE=T62100-SO-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006409*
+ ID_MODEL_FROM_DATABASE=T6210-BT Unified Wire Ethernet Controller
+
+pci:v00001425d0000640D*
+ ID_MODEL_FROM_DATABASE=T62100-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006411*
+ ID_MODEL_FROM_DATABASE=T6225-LL-CR Unified Wire Ethernet Controller
+
+pci:v00001425d00006414*
+ ID_MODEL_FROM_DATABASE=T61100-OCP-SO Unified Wire Ethernet Controller
+
+pci:v00001425d00006415*
+ ID_MODEL_FROM_DATABASE=T6201-BT Unified Wire Ethernet Controller
+
+pci:v00001425d00006480*
+ ID_MODEL_FROM_DATABASE=T6225-6080 Unified Wire Ethernet Controller
+
+pci:v00001425d00006481*
+ ID_MODEL_FROM_DATABASE=T62100-6081 Unified Wire Ethernet Controller
+
+pci:v00001425d00006482*
+ ID_MODEL_FROM_DATABASE=T6225-6082 Unified Wire Ethernet Controller
+
+pci:v00001425d00006483*
+ ID_MODEL_FROM_DATABASE=T62100-6083 Unified Wire Ethernet Controller
+
+pci:v00001425d00006484*
+ ID_MODEL_FROM_DATABASE=T64100-6084 Unified Wire Ethernet Controller
+
+pci:v00001425d00006501*
+ ID_MODEL_FROM_DATABASE=T6225-CR Unified Wire Storage Controller
+
+pci:v00001425d00006502*
+ ID_MODEL_FROM_DATABASE=T6225-SO-CR Unified Wire Storage Controller
+
+pci:v00001425d00006503*
+ ID_MODEL_FROM_DATABASE=T6425-CR Unified Wire Storage Controller
+
+pci:v00001425d00006504*
+ ID_MODEL_FROM_DATABASE=T6425-SO-CR Unified Wire Storage Controller
+
+pci:v00001425d00006505*
+ ID_MODEL_FROM_DATABASE=T6225-OCP-SO Unified Wire Storage Controller
+
+pci:v00001425d00006506*
+ ID_MODEL_FROM_DATABASE=T62100-OCP-SO Unified Wire Storage Controller
+
+pci:v00001425d00006507*
+ ID_MODEL_FROM_DATABASE=T62100-LP-CR Unified Wire Storage Controller
+
+pci:v00001425d00006508*
+ ID_MODEL_FROM_DATABASE=T62100-SO-CR Unified Wire Storage Controller
+
+pci:v00001425d00006509*
+ ID_MODEL_FROM_DATABASE=T6210-BT Unified Wire Storage Controller
+
+pci:v00001425d0000650D*
+ ID_MODEL_FROM_DATABASE=T62100-CR Unified Wire Storage Controller
+
+pci:v00001425d00006511*
+ ID_MODEL_FROM_DATABASE=T6225-LL-CR Unified Wire Storage Controller
+
+pci:v00001425d00006514*
+ ID_MODEL_FROM_DATABASE=T61100-OCP-SO Unified Wire Storage Controller
+
+pci:v00001425d00006515*
+ ID_MODEL_FROM_DATABASE=T6201-BT Unified Wire Storage Controller
+
+pci:v00001425d00006580*
+ ID_MODEL_FROM_DATABASE=T6225-6080 Unified Wire Storage Controller
+
+pci:v00001425d00006581*
+ ID_MODEL_FROM_DATABASE=T62100-6081 Unified Wire Storage Controller
+
+pci:v00001425d00006582*
+ ID_MODEL_FROM_DATABASE=T6225-6082 Unified Wire Storage Controller
+
+pci:v00001425d00006583*
+ ID_MODEL_FROM_DATABASE=T62100-6083 Unified Wire Storage Controller
+
+pci:v00001425d00006584*
+ ID_MODEL_FROM_DATABASE=T64100-6084 Unified Wire Storage Controller
+
+pci:v00001425d00006601*
+ ID_MODEL_FROM_DATABASE=T6225-CR Unified Wire Storage Controller
+
+pci:v00001425d00006602*
+ ID_MODEL_FROM_DATABASE=T6225-SO-CR Unified Wire Storage Controller
+
+pci:v00001425d00006603*
+ ID_MODEL_FROM_DATABASE=T6425-CR Unified Wire Storage Controller
+
+pci:v00001425d00006604*
+ ID_MODEL_FROM_DATABASE=T6425-SO-CR Unified Wire Storage Controller
+
+pci:v00001425d00006605*
+ ID_MODEL_FROM_DATABASE=T6225-OCP-SO Unified Wire Storage Controller
+
+pci:v00001425d00006606*
+ ID_MODEL_FROM_DATABASE=T62100-OCP-SO Unified Wire Storage Controller
+
+pci:v00001425d00006607*
+ ID_MODEL_FROM_DATABASE=T62100-LP-CR Unified Wire Storage Controller
+
+pci:v00001425d00006608*
+ ID_MODEL_FROM_DATABASE=T62100-SO-CR Unified Wire Storage Controller
+
+pci:v00001425d00006609*
+ ID_MODEL_FROM_DATABASE=T6210-BT Unified Wire Storage Controller
+
+pci:v00001425d0000660D*
+ ID_MODEL_FROM_DATABASE=T62100-CR Unified Wire Storage Controller
+
+pci:v00001425d00006611*
+ ID_MODEL_FROM_DATABASE=T6225-LL-CR Unified Wire Storage Controller
+
+pci:v00001425d00006614*
+ ID_MODEL_FROM_DATABASE=T61100-OCP-SO Unified Wire Storage Controller
+
+pci:v00001425d00006615*
+ ID_MODEL_FROM_DATABASE=T6201-BT Unified Wire Storage Controller
+
+pci:v00001425d00006680*
+ ID_MODEL_FROM_DATABASE=T6225-6080 Unified Wire Storage Controller
+
+pci:v00001425d00006681*
+ ID_MODEL_FROM_DATABASE=T62100-6081 Unified Wire Storage Controller
+
+pci:v00001425d00006682*
+ ID_MODEL_FROM_DATABASE=T6225-6082 Unified Wire Storage Controller
+
+pci:v00001425d00006683*
+ ID_MODEL_FROM_DATABASE=T62100-6083 Unified Wire Storage Controller
+
+pci:v00001425d00006684*
+ ID_MODEL_FROM_DATABASE=T64100-6084 Unified Wire Storage Controller
+
+pci:v00001425d00006801*
+ ID_MODEL_FROM_DATABASE=T6225-CR Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006802*
+ ID_MODEL_FROM_DATABASE=T6225-SO-CR Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006803*
+ ID_MODEL_FROM_DATABASE=T6425-CR Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006804*
+ ID_MODEL_FROM_DATABASE=T6425-SO-CR Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006805*
+ ID_MODEL_FROM_DATABASE=T6225-OCP-SO Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006806*
+ ID_MODEL_FROM_DATABASE=T62100-OCP-SO Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006807*
+ ID_MODEL_FROM_DATABASE=T62100-LP-CR Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006808*
+ ID_MODEL_FROM_DATABASE=T62100-SO-CR Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006809*
+ ID_MODEL_FROM_DATABASE=T6210-BT Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d0000680D*
+ ID_MODEL_FROM_DATABASE=T62100-CR Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006811*
+ ID_MODEL_FROM_DATABASE=T6225-LL-CR Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006814*
+ ID_MODEL_FROM_DATABASE=T61100-OCP-SO Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006815*
+ ID_MODEL_FROM_DATABASE=T6201-BT Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006880*
+ ID_MODEL_FROM_DATABASE=T6225-6080 Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006881*
+ ID_MODEL_FROM_DATABASE=T62100-6081 Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006882*
+ ID_MODEL_FROM_DATABASE=T6225-6082 Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006883*
+ ID_MODEL_FROM_DATABASE=T62100-6083 Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006884*
+ ID_MODEL_FROM_DATABASE=T64100-6084 Unified Wire Ethernet Controller [VF]
+
 pci:v00001425d0000A000*
  ID_MODEL_FROM_DATABASE=PE10K Unified Wire Ethernet Controller
 
@@ -48027,7 +49071,10 @@ pci:v0000144Dd0000A800*
  ID_MODEL_FROM_DATABASE=XP941 PCIe SSD
 
 pci:v0000144Dd0000A802*
- ID_MODEL_FROM_DATABASE=NVMe SSD Controller
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller SM951/PM951
+
+pci:v0000144Dd0000A804*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller SM961/PM961
 
 pci:v0000144Dd0000A820*
  ID_MODEL_FROM_DATABASE=NVMe SSD Controller 171X
@@ -48077,6 +49124,36 @@ pci:v0000144Dd0000A821sv00001028sd00001FC2*
 pci:v0000144Dd0000A821sv00001028sd00001FC4*
  ID_MODEL_FROM_DATABASE=NVMe SSD Controller 172X (Express Flash NVMe PM1725 1.6TB AIC)
 
+pci:v0000144Dd0000A822*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller 172Xa
+
+pci:v0000144Dd0000A822sv00001014sd00000621*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller 172Xa (PCIe3 1.6TB NVMe Flash Adapter II x8)
+
+pci:v0000144Dd0000A822sv00001014sd00000622*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller 172Xa (PCIe3 3.2TB NVMe Flash Adapter II x8)
+
+pci:v0000144Dd0000A822sv00001028sd00001FD9*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller 172Xa (Express Flash PM1725a 800GB SFF)
+
+pci:v0000144Dd0000A822sv00001028sd00001FDA*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller 172Xa (Express Flash PM1725a 1.6TB SFF)
+
+pci:v0000144Dd0000A822sv00001028sd00001FDB*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller 172Xa (Express Flash PM1725a 3.2TB SFF)
+
+pci:v0000144Dd0000A822sv00001028sd00001FDC*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller 172Xa (Express Flash PM1725a 6.4TB SFF)
+
+pci:v0000144Dd0000A822sv00001028sd00001FDD*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller 172Xa (Express Flash PM1725a 1.6TB AIC)
+
+pci:v0000144Dd0000A822sv00001028sd00001FDE*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller 172Xa (Express Flash PM1725a 3.2TB AIC)
+
+pci:v0000144Dd0000A822sv00001028sd00001FDF*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller 172Xa (Express Flash PM1725a 6.4TB AIC)
+
 pci:v0000144E*
  ID_VENDOR_FROM_DATABASE=OLITEC
 
@@ -48401,6 +49478,9 @@ pci:v000014A3*
 pci:v000014A4*
  ID_VENDOR_FROM_DATABASE=Lite-On Technology Corporation
 
+pci:v000014A4d000022F1*
+ ID_MODEL_FROM_DATABASE=M8Pe Series NVMe SSD
+
 pci:v000014A4d00004318*
  ID_MODEL_FROM_DATABASE=Broadcom BCM4318 [AirForce One 54g] 802.11g WLAN Controller
 
@@ -48615,7 +49695,16 @@ pci:v000014CC*
  ID_VENDOR_FROM_DATABASE=NAKAYO Telecommunications Inc
 
 pci:v000014CD*
- ID_VENDOR_FROM_DATABASE=Universal Scientific Ind.
+ ID_VENDOR_FROM_DATABASE=Universal Global Scientific Industrial Co.,Ltd
+
+pci:v000014CDd00000001*
+ ID_MODEL_FROM_DATABASE=USI-1514-1GbaseT [OCP1]
+
+pci:v000014CDd00000002*
+ ID_MODEL_FROM_DATABASE=USI-4227-SFP [OCP2]
+
+pci:v000014CDd00000003*
+ ID_MODEL_FROM_DATABASE=USI-X557-10GbaseT [OCP3]
 
 pci:v000014CE*
  ID_VENDOR_FROM_DATABASE=Whistle Communications
@@ -48804,7 +49893,7 @@ pci:v000014E3*
  ID_VENDOR_FROM_DATABASE=AMTELCO
 
 pci:v000014E4*
- ID_VENDOR_FROM_DATABASE=Broadcom Corporation
+ ID_VENDOR_FROM_DATABASE=Broadcom Limited
 
 pci:v000014E4d00000576*
  ID_MODEL_FROM_DATABASE=BCM43224 802.11a/b/g/n
@@ -48920,6 +50009,9 @@ pci:v000014E4d0000163C*
 pci:v000014E4d0000163D*
  ID_MODEL_FROM_DATABASE=NetXtreme II BCM57811 10-Gigabit Ethernet
 
+pci:v000014E4d0000163Dsv00001043sd0000858A*
+ ID_MODEL_FROM_DATABASE=NetXtreme II BCM57811 10-Gigabit Ethernet (PEB-10G/57811-1S)
+
 pci:v000014E4d0000163E*
  ID_MODEL_FROM_DATABASE=NetXtreme II BCM57811 10 Gigabit Ethernet Multi Function
 
@@ -49293,7 +50385,7 @@ pci:v000014E4d0000165A*
  ID_MODEL_FROM_DATABASE=NetXtreme BCM5722 Gigabit Ethernet PCI Express
 
 pci:v000014E4d0000165Asv00001014sd00000378*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5722 Gigabit Ethernet PCI Express (IBM System x3350 (Machine type 4192))
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5722 Gigabit Ethernet PCI Express (System x3350 (Machine type 4192))
 
 pci:v000014E4d0000165Asv00001028sd0000020F*
  ID_MODEL_FROM_DATABASE=NetXtreme BCM5722 Gigabit Ethernet PCI Express (PowerEdge R300 Broadcom NetXtreme 5722)
@@ -49535,6 +50627,9 @@ pci:v000014E4d0000168D*
 pci:v000014E4d0000168E*
  ID_MODEL_FROM_DATABASE=NetXtreme II BCM57810 10 Gigabit Ethernet
 
+pci:v000014E4d0000168Esv00001014sd00000492*
+ ID_MODEL_FROM_DATABASE=NetXtreme II BCM57810 10 Gigabit Ethernet (PCIe2 2-port 10 GbE BaseT RJ45 Adapter (FC EN0W; CCIN 2CC4))
+
 pci:v000014E4d0000168Esv0000103Csd00001798*
  ID_MODEL_FROM_DATABASE=NetXtreme II BCM57810 10 Gigabit Ethernet (Flex-10 10Gb 2-port 530FLB Adapter [Meru])
 
@@ -49589,6 +50684,9 @@ pci:v000014E4d00001693sv00001025sd00000121*
 pci:v000014E4d00001693sv0000103Csd000030C0*
  ID_MODEL_FROM_DATABASE=NetLink BCM5787M Gigabit Ethernet PCI Express (6710b)
 
+pci:v000014E4d00001693sv000017AAsd000020D5*
+ ID_MODEL_FROM_DATABASE=NetLink BCM5787M Gigabit Ethernet PCI Express (ThinkPad R61)
+
 pci:v000014E4d00001694*
  ID_MODEL_FROM_DATABASE=NetLink BCM57790 Gigabit Ethernet PCIe
 
@@ -49907,6 +51005,9 @@ pci:v000014E4d000016BE*
 pci:v000014E4d000016BF*
  ID_MODEL_FROM_DATABASE=BCM57765/57785 xD-Picture Card Reader
 
+pci:v000014E4d000016C1*
+ ID_MODEL_FROM_DATABASE=NetXtreme-E RDMA Virtual Function
+
 pci:v000014E4d000016C6*
  ID_MODEL_FROM_DATABASE=NetXtreme BCM5702A3 Gigabit Ethernet
 
@@ -49944,67 +51045,124 @@ pci:v000014E4d000016C7sv000014E4sd0000000A*
  ID_MODEL_FROM_DATABASE=NetXtreme BCM5703 Gigabit Ethernet (NetXtreme BCM5703 1000Base-SX)
 
 pci:v000014E4d000016C8*
- ID_MODEL_FROM_DATABASE=BCM57301 NetXtreme-C Single-port 10Gb Ethernet
+ ID_MODEL_FROM_DATABASE=BCM57301 NetXtreme-C 10Gb Ethernet Controller
 
 pci:v000014E4d000016C9*
- ID_MODEL_FROM_DATABASE=BCM57302 NetXtreme-C Dual-port 10Gb/25Gb Ethernet
+ ID_MODEL_FROM_DATABASE=BCM57302 NetXtreme-C 10Gb/25Gb Ethernet Controller
 
 pci:v000014E4d000016CA*
- ID_MODEL_FROM_DATABASE=BCM57304 NetXtreme-C Dual-port 10Gb/25Gb/40Gb/50Gb Ethernet
+ ID_MODEL_FROM_DATABASE=BCM57304 NetXtreme-C 10Gb/25Gb/40Gb/50Gb Ethernet Controller
 
 pci:v000014E4d000016CB*
- ID_MODEL_FROM_DATABASE=BCM57304 NetXtreme-C Ethernet Virtual Function
+ ID_MODEL_FROM_DATABASE=NetXtreme-C Ethernet Virtual Function
+
+pci:v000014E4d000016CC*
+ ID_MODEL_FROM_DATABASE=BCM57417 NetXtreme-E Ethernet Partition
 
 pci:v000014E4d000016CE*
- ID_MODEL_FROM_DATABASE=BCM57311 NetXtreme-C Single-port 10Gb RDMA Ethernet
+ ID_MODEL_FROM_DATABASE=BCM57311 NetXtreme-C 10Gb RDMA Ethernet Controller
 
 pci:v000014E4d000016CF*
- ID_MODEL_FROM_DATABASE=BCM57312 NetXtreme-C Dual-port 10Gb/25Gb RDMA Ethernet
+ ID_MODEL_FROM_DATABASE=BCM57312 NetXtreme-C 10Gb/25Gb RDMA Ethernet Controller
 
 pci:v000014E4d000016D0*
- ID_MODEL_FROM_DATABASE=BCM57402 NetXtreme-E Dual-port 10Gb Ethernet
+ ID_MODEL_FROM_DATABASE=BCM57402 NetXtreme-E 10Gb Ethernet Controller
 
 pci:v000014E4d000016D1*
- ID_MODEL_FROM_DATABASE=BCM57404 NetXtreme-E Dual-port 10Gb/25Gb Ethernet
+ ID_MODEL_FROM_DATABASE=BCM57404 NetXtreme-E 10Gb/25Gb Ethernet Controller
 
 pci:v000014E4d000016D2*
- ID_MODEL_FROM_DATABASE=BCM57406 NetXtreme-E Dual-port 10GBase-T Ethernet
+ ID_MODEL_FROM_DATABASE=BCM57406 NetXtreme-E 10GBASE-T Ethernet Controller
 
 pci:v000014E4d000016D3*
- ID_MODEL_FROM_DATABASE=BCM57404 NetXtreme-E Ethernet Virtual Function
+ ID_MODEL_FROM_DATABASE=NetXtreme-E Ethernet Virtual Function
 
 pci:v000014E4d000016D4*
- ID_MODEL_FROM_DATABASE=BCM57404 NetXtreme-E Ethernet Partition
+ ID_MODEL_FROM_DATABASE=BCM57402 NetXtreme-E Ethernet Partition
+
+pci:v000014E4d000016D5*
+ ID_MODEL_FROM_DATABASE=BCM57407 NetXtreme-E 10GBase-T Ethernet Controller
 
 pci:v000014E4d000016D6*
- ID_MODEL_FROM_DATABASE=BCM57412 NetXtreme-E Dual-port 10Gb RDMA Ethernet
+ ID_MODEL_FROM_DATABASE=BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller
 
 pci:v000014E4d000016D7*
- ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E Dual-port 10Gb/25Gb RDMA Ethernet
+ ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller
+
+pci:v000014E4d000016D7sv000014E4sd00001202*
+ ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller (BCM957412M4122 OCP 1x25G Type1 wRoCE)
+
+pci:v000014E4d000016D7sv000014E4sd00001404*
+ ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller (BCM957414M4142 OCP 2x25G Type1 wRoCE)
+
+pci:v000014E4d000016D7sv00001590sd0000020E*
+ ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller (Ethernet 25Gb 2-port 631SFP28 Adapter)
+
+pci:v000014E4d000016D7sv00001590sd00000211*
+ ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller (Ethernet 25Gb 2-port 631FLR-SFP28 Adapter)
 
 pci:v000014E4d000016D8*
- ID_MODEL_FROM_DATABASE=BCM57416 NetXtreme-E Dual-port 10GBase-T RDMA Ethernet
+ ID_MODEL_FROM_DATABASE=BCM57416 NetXtreme-E 10GBase-T RDMA Ethernet Controller
+
+pci:v000014E4d000016D8sv00001590sd0000020C*
+ ID_MODEL_FROM_DATABASE=BCM57416 NetXtreme-E 10GBase-T RDMA Ethernet Controller (Ethernet 10Gb 2-port 535T Adapter)
+
+pci:v000014E4d000016D8sv00001590sd00000212*
+ ID_MODEL_FROM_DATABASE=BCM57416 NetXtreme-E 10GBase-T RDMA Ethernet Controller (Ethernet 10Gb 2-port 535FLR-T Adapter)
 
 pci:v000014E4d000016D9*
- ID_MODEL_FROM_DATABASE=BCM57417 NetXtreme-E Dual-port 10GBase-T RDMA Ethernet
+ ID_MODEL_FROM_DATABASE=BCM57417 NetXtreme-E 10GBASE-T RDMA Ethernet Controller
+
+pci:v000014E4d000016D9sv0000108Esd00004866*
+ ID_MODEL_FROM_DATABASE=BCM57417 NetXtreme-E 10GBASE-T RDMA Ethernet Controller (Dual Port 10GBase-T Ethernet Controller)
 
 pci:v000014E4d000016DC*
- ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E Ethernet Virtual Function
+ ID_MODEL_FROM_DATABASE=NetXtreme-E Ethernet Virtual Function
 
 pci:v000014E4d000016DD*
  ID_MODEL_FROM_DATABASE=NetLink BCM5781 Gigabit Ethernet PCI Express
 
 pci:v000014E4d000016DE*
- ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E Ethernet Partition
+ ID_MODEL_FROM_DATABASE=BCM57412 NetXtreme-E Ethernet Partition
 
 pci:v000014E4d000016DF*
- ID_MODEL_FROM_DATABASE=BCM57314 NetXtreme-C Dual-port 10Gb/25Gb/40Gb/50Gb RDMA Ethernet
+ ID_MODEL_FROM_DATABASE=BCM57314 NetXtreme-C 10Gb/25Gb/40Gb/50Gb RDMA Ethernet Controller
 
 pci:v000014E4d000016E1*
- ID_MODEL_FROM_DATABASE=BCM57314 NetXtreme-C Ethernet Virtual Function
+ ID_MODEL_FROM_DATABASE=NetXtreme-C Ethernet Virtual Function
 
 pci:v000014E4d000016E2*
- ID_MODEL_FROM_DATABASE=BCM57417 NetXtreme-E Dual-port 10Gb/25Gb RDMA Ethernet
+ ID_MODEL_FROM_DATABASE=BCM57417 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller
+
+pci:v000014E4d000016E2sv0000108Esd00004866*
+ ID_MODEL_FROM_DATABASE=BCM57417 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller (Dual Port 10Gb/25Gb SFP28 Ethernet Controller)
+
+pci:v000014E4d000016E3*
+ ID_MODEL_FROM_DATABASE=BCM57416 NetXtreme-E 10Gb RDMA Ethernet Controller
+
+pci:v000014E4d000016E5*
+ ID_MODEL_FROM_DATABASE=NetXtreme-C RDMA Virtual Function
+
+pci:v000014E4d000016E7*
+ ID_MODEL_FROM_DATABASE=BCM57404 NetXtreme-E Ethernet Partition
+
+pci:v000014E4d000016E8*
+ ID_MODEL_FROM_DATABASE=BCM57406 NetXtreme-E Ethernet Partition
+
+pci:v000014E4d000016E9*
+ ID_MODEL_FROM_DATABASE=BCM57407 NetXtreme-E 25Gb Ethernet Controller
+
+pci:v000014E4d000016EC*
+ ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E Ethernet Partition
+
+pci:v000014E4d000016ED*
+ ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E RDMA Partition
+
+pci:v000014E4d000016EE*
+ ID_MODEL_FROM_DATABASE=BCM57416 NetXtreme-E Ethernet Partition
+
+pci:v000014E4d000016EF*
+ ID_MODEL_FROM_DATABASE=BCM57416 NetXtreme-E RDMA Partition
 
 pci:v000014E4d000016F3*
  ID_MODEL_FROM_DATABASE=NetXtreme BCM5727 Gigabit Ethernet PCIe
@@ -50837,6 +51995,12 @@ pci:v000014E4d0000B800*
 pci:v000014E4d0000B842*
  ID_MODEL_FROM_DATABASE=BCM56842 Trident 10GE Switch Controller
 
+pci:v000014E4d0000B850*
+ ID_MODEL_FROM_DATABASE=Broadcom BCM56850 Switch ASIC
+
+pci:v000014E4d0000B960*
+ ID_MODEL_FROM_DATABASE=Broadcom BCM56960 Switch ASIC
+
 pci:v000014E5*
  ID_VENDOR_FROM_DATABASE=Pixelfusion Ltd
 
@@ -51402,7 +52566,7 @@ pci:v000014F1d00008800sv00001002sd0000A101*
  ID_MODEL_FROM_DATABASE=CX23880/1/2/3 PCI Video and Audio Decoder (HDTV Wonder)
 
 pci:v000014F1d00008800sv00001043sd00004823*
- ID_MODEL_FROM_DATABASE=CX23880/1/2/3 PCI Video and Audio Decoder (ASUS PVR-416)
+ ID_MODEL_FROM_DATABASE=CX23880/1/2/3 PCI Video and Audio Decoder (PVR-416)
 
 pci:v000014F1d00008800sv0000107Dsd00006611*
  ID_MODEL_FROM_DATABASE=CX23880/1/2/3 PCI Video and Audio Decoder (Winfast TV 2000XP Expert)
@@ -51540,7 +52704,7 @@ pci:v000014F1d00008802sv00000070sd00009600*
  ID_MODEL_FROM_DATABASE=CX23880/1/2/3 PCI Video and Audio Decoder [MPEG Port] (WinTV 88x MPEG Encoder)
 
 pci:v000014F1d00008802sv00001043sd00004823*
- ID_MODEL_FROM_DATABASE=CX23880/1/2/3 PCI Video and Audio Decoder [MPEG Port] (ASUS PVR-416)
+ ID_MODEL_FROM_DATABASE=CX23880/1/2/3 PCI Video and Audio Decoder [MPEG Port] (PVR-416)
 
 pci:v000014F1d00008802sv0000107Dsd0000663C*
  ID_MODEL_FROM_DATABASE=CX23880/1/2/3 PCI Video and Audio Decoder [MPEG Port] (Leadtek PVR 2000)
@@ -52091,6 +53255,9 @@ pci:v00001524d00001410sv00001025sd0000003C*
 pci:v00001524d00001410sv00001025sd0000005A*
  ID_MODEL_FROM_DATABASE=CB1410 Cardbus Controller (TravelMate 290)
 
+pci:v00001524d00001410sv0000103Csd000030D5*
+ ID_MODEL_FROM_DATABASE=CB1410 Cardbus Controller (530 Laptop)
+
 pci:v00001524d00001411*
  ID_MODEL_FROM_DATABASE=CB-710/2/4 Cardbus Controller
 
@@ -52215,7 +53382,7 @@ pci:v00001541*
  ID_VENDOR_FROM_DATABASE=MACHONE Communications
 
 pci:v00001542*
- ID_VENDOR_FROM_DATABASE=Concurrent Computer Corporation
+ ID_VENDOR_FROM_DATABASE=Concurrent Real-Time
 
 pci:v00001542d00009260*
  ID_MODEL_FROM_DATABASE=RCIM-II Real-Time Clock & Interrupt Module
@@ -52235,6 +53402,9 @@ pci:v00001542d00009278*
 pci:v00001542d00009287*
  ID_MODEL_FROM_DATABASE=Analog Output Card
 
+pci:v00001542d00009290*
+ ID_MODEL_FROM_DATABASE=FPGA Card
+
 pci:v00001543*
  ID_VENDOR_FROM_DATABASE=SILICON Laboratories
 
@@ -52619,6 +53789,9 @@ pci:v0000159A*
 pci:v0000159B*
  ID_VENDOR_FROM_DATABASE=Faraday Technology Corp
 
+pci:v0000159Bd00004321*
+ ID_MODEL_FROM_DATABASE=StorLink SL3516 (Gemini) Host Bridge
+
 pci:v0000159C*
  ID_VENDOR_FROM_DATABASE=Stratus Computer Systems
 
@@ -52748,6 +53921,9 @@ pci:v000015B3d00000191*
 pci:v000015B3d000001F6*
  ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3 Flash Recovery]
 
+pci:v000015B3d000001F8*
+ ID_MODEL_FROM_DATABASE=MT27520 Family [ConnectX-3 Pro Flash Recovery]
+
 pci:v000015B3d000001FF*
  ID_MODEL_FROM_DATABASE=MT27600 Family [Connect-IB Flash Recovery]
 
@@ -52760,12 +53936,27 @@ pci:v000015B3d0000020B*
 pci:v000015B3d0000020D*
  ID_MODEL_FROM_DATABASE=MT28800 Family [ConnectX-5 Flash Recovery]
 
+pci:v000015B3d0000020F*
+ ID_MODEL_FROM_DATABASE=MT28908A0 Family [ConnectX-6 Flash Recovery]
+
+pci:v000015B3d00000211*
+ ID_MODEL_FROM_DATABASE=MT416842 Family [BlueField SoC Flash Recovery]
+
+pci:v000015B3d0000024E*
+ ID_MODEL_FROM_DATABASE=MT53100 [Spectrum-2, Flash recovery mode]
+
+pci:v000015B3d0000024F*
+ ID_MODEL_FROM_DATABASE=MT53100 [Spectrum-2, Flash recovery mode]
+
 pci:v000015B3d00000262*
  ID_MODEL_FROM_DATABASE=MT27710 [ConnectX-4 Lx Programmable] EN
 
 pci:v000015B3d00000263*
  ID_MODEL_FROM_DATABASE=MT27710 [ConnectX-4 Lx Programmable Virtual Function] EN
 
+pci:v000015B3d00000281*
+ ID_MODEL_FROM_DATABASE=NPS-600 Flash Recovery
+
 pci:v000015B3d00001002*
  ID_MODEL_FROM_DATABASE=MT25400 Family [ConnectX-2 Virtual Function]
 
@@ -52787,6 +53978,39 @@ pci:v000015B3d00001003sv0000103Csd000018CF*
 pci:v000015B3d00001003sv0000103Csd000018D6*
  ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (InfiniBand FDR/EN 10/40Gb Dual Port 544QSFP Adapter)
 
+pci:v000015B3d00001003sv000015B3sd00000025*
+ ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 IB QDR Dual Port Mezzanine Card)
+
+pci:v000015B3d00001003sv000015B3sd00000026*
+ ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 IB FDR Dual Port Mezzanine Card)
+
+pci:v000015B3d00001003sv000015B3sd00000028*
+ ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 VPI Dual QSFP+ Port QDR Infiniband 40Gb/s or 10Gb Ethernet)
+
+pci:v000015B3d00001003sv000015B3sd00000059*
+ ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 VPI IB FDR/40 GbE Single Port QSFP+ Mezzanine Card)
+
+pci:v000015B3d00001003sv000015B3sd00000065*
+ ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 VPI IB FDR/40 GbE Dual Port QSFP+ Adapter)
+
+pci:v000015B3d00001003sv000015B3sd00000066*
+ ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 IB FDR10 Dual Port Mezzanine Card)
+
+pci:v000015B3d00001003sv000015B3sd00000067*
+ ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 VPI IB FDR/40 GbE Single Port QSFP+ Adapter)
+
+pci:v000015B3d00001003sv000015B3sd00000071*
+ ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 VPI IB FDR/40 GbE Dual Port QSFP+ Mezzanine Card)
+
+pci:v000015B3d00001003sv000015B3sd00000078*
+ ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 10 GbE Dual Port KR Mezzanine Card)
+
+pci:v000015B3d00001003sv000015B3sd00000079*
+ ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 40 GbE Dual Port QSFP+ Adapter)
+
+pci:v000015B3d00001003sv000015B3sd00000080*
+ ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 10 GbE Dual Port SFP+ Adapter)
+
 pci:v000015B3d00001004*
  ID_MODEL_FROM_DATABASE=MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function]
 
@@ -52799,6 +54023,9 @@ pci:v000015B3d00001006*
 pci:v000015B3d00001007*
  ID_MODEL_FROM_DATABASE=MT27520 Family [ConnectX-3 Pro]
 
+pci:v000015B3d00001007sv00001014sd000004EB*
+ ID_MODEL_FROM_DATABASE=MT27520 Family [ConnectX-3 Pro] (2-Port 10GbE NIC and RoCE SR PCIe3)
+
 pci:v000015B3d00001007sv0000103Csd000022F3*
  ID_MODEL_FROM_DATABASE=MT27520 Family [ConnectX-3 Pro] (InfiniBand FDR/Ethernet 10Gb/40Gb 2-port 544+QSFP Adapter)
 
@@ -52820,6 +54047,15 @@ pci:v000015B3d00001007sv0000117Csd00000092*
 pci:v000015B3d00001007sv0000117Csd00000093*
  ID_MODEL_FROM_DATABASE=MT27520 Family [ConnectX-3 Pro] (FastFrame NQ12)
 
+pci:v000015B3d00001007sv000015B3sd00000078*
+ ID_MODEL_FROM_DATABASE=MT27520 Family [ConnectX-3 Pro] (ConnectX-3 Pro 10 GbE Dual Port KR Mezzanine Card)
+
+pci:v000015B3d00001007sv000015B3sd00000079*
+ ID_MODEL_FROM_DATABASE=MT27520 Family [ConnectX-3 Pro] (ConnectX-3 Pro 40 GbE Dual Port QSFP+ Adapter)
+
+pci:v000015B3d00001007sv000015B3sd00000080*
+ ID_MODEL_FROM_DATABASE=MT27520 Family [ConnectX-3 Pro] (ConnectX-3 Pro 10 GbE Dual Port SFP+ Adapter)
+
 pci:v000015B3d00001009*
  ID_MODEL_FROM_DATABASE=MT27530 Family
 
@@ -52853,32 +54089,56 @@ pci:v000015B3d00001012*
 pci:v000015B3d00001013*
  ID_MODEL_FROM_DATABASE=MT27700 Family [ConnectX-4]
 
+pci:v000015B3d00001013sv000015B3sd00000006*
+ ID_MODEL_FROM_DATABASE=MT27700 Family [ConnectX-4] (MCX416A-BCAT, ConnectX-4 EN, 40/56GbE 2P, PCIe3.0 x16)
+
+pci:v000015B3d00001013sv000015B3sd00000033*
+ ID_MODEL_FROM_DATABASE=MT27700 Family [ConnectX-4] (ConnectX-4 VPI IB EDR/100 GbE Single Port QSFP28 Adapter)
+
+pci:v000015B3d00001013sv000015B3sd00000034*
+ ID_MODEL_FROM_DATABASE=MT27700 Family [ConnectX-4] (ConnectX-4 VPI IB EDR/100 GbE Dual Port QSFP28 Adapter)
+
+pci:v000015B3d00001013sv000015B3sd00000050*
+ ID_MODEL_FROM_DATABASE=MT27700 Family [ConnectX-4] (ConnectX-4 100 GbE Dual Port QSFP28 Adapter)
+
 pci:v000015B3d00001014*
  ID_MODEL_FROM_DATABASE=MT27700 Family [ConnectX-4 Virtual Function]
 
 pci:v000015B3d00001015*
  ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx]
 
+pci:v000015B3d00001015sv000015B3sd00000016*
+ ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx] (ConnectX-4 Lx 25 GbE Dual Port SFP28 Adapter)
+
+pci:v000015B3d00001015sv000015B3sd00000020*
+ ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx] (MCX4411A-ACQN, ConnectX-4 Lx EN OCP, 1x25Gb)
+
+pci:v000015B3d00001015sv000015B3sd00000021*
+ ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx] (MCX4421A-ACQN ConnectX-4 Lx EN OCP,2x25G)
+
+pci:v000015B3d00001015sv000015B3sd00000025*
+ ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx] (ConnectX-4 Lx 25 GbE Dual Port SFP28 rNDC)
+
 pci:v000015B3d00001016*
  ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx Virtual Function]
 
 pci:v000015B3d00001017*
- ID_MODEL_FROM_DATABASE=MT27800 Family [ConnectX-5, PCIe 3.0]
+ ID_MODEL_FROM_DATABASE=MT27800 Family [ConnectX-5]
 
 pci:v000015B3d00001018*
- ID_MODEL_FROM_DATABASE=MT28800 Family [ConnectX-5 Virtual Function]
+ ID_MODEL_FROM_DATABASE=MT27800 Family [ConnectX-5 Virtual Function]
 
 pci:v000015B3d00001019*
- ID_MODEL_FROM_DATABASE=MT28800 Family [ConnectX-5, PCIe 4.0]
+ ID_MODEL_FROM_DATABASE=MT28800 Family [ConnectX-5 Ex]
 
 pci:v000015B3d0000101A*
- ID_MODEL_FROM_DATABASE=MT28830
+ ID_MODEL_FROM_DATABASE=MT28800 Family [ConnectX-5 Ex Virtual Function]
 
 pci:v000015B3d0000101B*
- ID_MODEL_FROM_DATABASE=MT28831
+ ID_MODEL_FROM_DATABASE=MT28908 Family [ConnectX-6]
 
 pci:v000015B3d0000101C*
- ID_MODEL_FROM_DATABASE=MT28840
+ ID_MODEL_FROM_DATABASE=MT28908 Family [ConnectX-6 Virtual Function]
 
 pci:v000015B3d0000101D*
  ID_MODEL_FROM_DATABASE=MT28841
@@ -52895,6 +54155,12 @@ pci:v000015B3d00001020*
 pci:v000015B3d00001021*
  ID_MODEL_FROM_DATABASE=MT28861
 
+pci:v000015B3d00001974*
+ ID_MODEL_FROM_DATABASE=MT28800 Family [ConnectX-5 PCIe Bridge]
+
+pci:v000015B3d00001975*
+ ID_MODEL_FROM_DATABASE=MT416842 Family [BlueField SoC PCIe Bridge]
+
 pci:v000015B3d00005274*
  ID_MODEL_FROM_DATABASE=MT21108 InfiniBridge
 
@@ -52943,6 +54209,9 @@ pci:v000015B3d00006732*
 pci:v000015B3d0000673C*
  ID_MODEL_FROM_DATABASE=MT26428 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE]
 
+pci:v000015B3d0000673Csv00001014sd00000487*
+ ID_MODEL_FROM_DATABASE=MT26428 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE] (GX++ 1-port 4X IB QDR Adapter for Power 795)
+
 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)
 
@@ -52961,9 +54230,15 @@ pci:v000015B3d00006746sv0000103Csd00003349*
 pci:v000015B3d00006750*
  ID_MODEL_FROM_DATABASE=MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s]
 
+pci:v000015B3d00006750sv00001014sd00000461*
+ ID_MODEL_FROM_DATABASE=MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s] (2-Port 10 GbE RoCE SR LP PCIe2 (rev b0))
+
 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:v000015B3d00006750sv000015B3sd00006572*
+ ID_MODEL_FROM_DATABASE=MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s] (IBM Flex System EN4132 2-port 10Gb RoCE Adapter)
+
 pci:v000015B3d0000675A*
  ID_MODEL_FROM_DATABASE=MT25408 [ConnectX EN 10GigE 10GBaseT, PCIe Gen2 5GT/s]
 
@@ -52997,6 +54272,18 @@ pci:v000015B3d00007122*
 pci:v000015B3d00007123*
  ID_MODEL_FROM_DATABASE=NPS-600 network interface VF
 
+pci:v000015B3d0000A2D0*
+ ID_MODEL_FROM_DATABASE=MT416842 BlueField SoC Crypto enabled
+
+pci:v000015B3d0000A2D1*
+ ID_MODEL_FROM_DATABASE=MT416842 BlueField SoC Crypto disabled
+
+pci:v000015B3d0000A2D2*
+ ID_MODEL_FROM_DATABASE=MT416842 BlueField integrated ConnectX-5 network controller
+
+pci:v000015B3d0000A2D3*
+ ID_MODEL_FROM_DATABASE=MT416842 BlueField multicore SoC family VF
+
 pci:v000015B3d0000C738*
  ID_MODEL_FROM_DATABASE=MT51136
 
@@ -53018,6 +54305,9 @@ pci:v000015B3d0000CB84*
 pci:v000015B3d0000CF08*
  ID_MODEL_FROM_DATABASE=MT53236
 
+pci:v000015B3d0000CF6C*
+ ID_MODEL_FROM_DATABASE=MT53100 [Spectrum-2, 64 x 100GbE switch]
+
 pci:v000015B3d0000D2F0*
  ID_MODEL_FROM_DATABASE=Switch-IB 3 HDR (200Gbps) switch
 
@@ -53822,6 +55112,9 @@ pci:v0000165Cd00007191*
 pci:v0000165Cd000071A1*
  ID_MODEL_FROM_DATABASE=Proc10a_66S
 
+pci:v0000165Cd000071B1*
+ ID_MODEL_FROM_DATABASE=Proc10A
+
 pci:v0000165D*
  ID_VENDOR_FROM_DATABASE=Hsing Tech. Enterprise Co., Ltd.
 
@@ -54548,6 +55841,9 @@ pci:v0000168Cd00000032sv0000103Csd00001838*
 pci:v0000168Cd00000032sv0000105Bsd0000E044*
  ID_MODEL_FROM_DATABASE=AR9485 Wireless Network Adapter (Unex DHXA-225)
 
+pci:v0000168Cd00000032sv0000144Dsd0000410E*
+ ID_MODEL_FROM_DATABASE=AR9485 Wireless Network Adapter (AR9485WB-EG 802.11b/g/n mini-PCIe card on a series 3 laptop)
+
 pci:v0000168Cd00000032sv00001A3Bsd00001186*
  ID_MODEL_FROM_DATABASE=AR9485 Wireless Network Adapter (AW-NE186H)
 
@@ -54560,6 +55856,9 @@ pci:v0000168Cd00000033sv0000168Csd0000A120*
 pci:v0000168Cd00000034*
  ID_MODEL_FROM_DATABASE=AR9462 Wireless Network Adapter
 
+pci:v0000168Cd00000034sv00001028sd0000020B*
+ ID_MODEL_FROM_DATABASE=AR9462 Wireless Network Adapter (Wireless 1601 802.11abgn Adapter)
+
 pci:v0000168Cd00000034sv00001028sd00000300*
  ID_MODEL_FROM_DATABASE=AR9462 Wireless Network Adapter (Wireless 1802 802.11abgn Adapter)
 
@@ -54947,9 +56246,42 @@ pci:v000016D5d00007013*
 pci:v000016D5d00007014*
  ID_MODEL_FROM_DATABASE=AP445: 32-Channel Isolated Digital Output Module
 
+pci:v000016D5d00007016*
+ ID_MODEL_FROM_DATABASE=AP470 48-Channel TTL Level Digital Input/Output Module
+
+pci:v000016D5d00007017*
+ ID_MODEL_FROM_DATABASE=AP323 16-bit, 20 or 40 Channel Analog Input Module
+
 pci:v000016D5d00007018*
  ID_MODEL_FROM_DATABASE=AP408: 32-Channel Digital I/O Module
 
+pci:v000016D5d0000701A*
+ ID_MODEL_FROM_DATABASE=AP220-16 12-Bit, 16-Channel Analog Output Module
+
+pci:v000016D5d0000701B*
+ ID_MODEL_FROM_DATABASE=AP231-16 16-Bit, 16-Channel Analog Output Module
+
+pci:v000016D5d00007021*
+ ID_MODEL_FROM_DATABASE=APA7-201 Reconfigurable Artix-7 FPGA module 48 TTL channels
+
+pci:v000016D5d00007022*
+ ID_MODEL_FROM_DATABASE=APA7-202 Reconfigurable Artix-7 FPGA module 24 RS485 channels
+
+pci:v000016D5d00007023*
+ ID_MODEL_FROM_DATABASE=APA7-203 Reconfigurable Artix-7 FPGA module 24 TTL & 12 RS485 channels
+
+pci:v000016D5d00007024*
+ ID_MODEL_FROM_DATABASE=APA7-204 Reconfigurable Artix-7 FPGA module 24 LVDS channels
+
+pci:v000016D5d00007042*
+ ID_MODEL_FROM_DATABASE=AP482 Counter Timer Module with TTL Level Input/Output
+
+pci:v000016D5d00007043*
+ ID_MODEL_FROM_DATABASE=AP483 Counter Timer Module with TTL Level and RS422 Input/Output
+
+pci:v000016D5d00007044*
+ ID_MODEL_FROM_DATABASE=AP484 Counter Timer Module with RS422 Input/Output
+
 pci:v000016DA*
  ID_VENDOR_FROM_DATABASE=Advantech Co., Ltd.
 
@@ -55227,6 +56559,15 @@ pci:v0000177Dd00009702sv0000177Dsd00000003*
  ID_MODEL_FROM_DATABASE=CN23XX [LiquidIO II] Intelligent Adapter (CN2350 [LiquidIO II] 2-port 10GbE Intelligent adapter)
 
 pci:v0000177Dd00009702sv0000177Dsd00000004*
+ ID_MODEL_FROM_DATABASE=CN23XX [LiquidIO II] Intelligent Adapter (CN2350 [LiquidIO II] 2-port 10GbE Intelligent adapter)
+
+pci:v0000177Dd00009702sv0000177Dsd00000005*
+ ID_MODEL_FROM_DATABASE=CN23XX [LiquidIO II] Intelligent Adapter (CN2360 [LiquidIO II] 2-port 10GbE Intelligent adapter)
+
+pci:v0000177Dd00009702sv0000177Dsd00000006*
+ ID_MODEL_FROM_DATABASE=CN23XX [LiquidIO II] Intelligent Adapter (CN2360 [LiquidIO II] 2-port 25GbE Intelligent adapter)
+
+pci:v0000177Dd00009702sv0000177Dsd00000007*
  ID_MODEL_FROM_DATABASE=CN23XX [LiquidIO II] Intelligent Adapter (CN2350 [LiquidIO II] 2-port 25GbE Intelligent adapter)
 
 pci:v0000177Dd00009703*
@@ -55238,6 +56579,18 @@ pci:v0000177Dd00009712*
 pci:v0000177Dd00009712sv0000177Dsd00000003*
  ID_MODEL_FROM_DATABASE=CN23XX [LiquidIO II] SRIOV Virtual Function (CN2350 [LiquidIO II] 2-port 10GbE SRIOV Virtual Function)
 
+pci:v0000177Dd00009712sv0000177Dsd00000004*
+ ID_MODEL_FROM_DATABASE=CN23XX [LiquidIO II] SRIOV Virtual Function (CN2350 [LiquidIO II] 2-port 10GbE SRIOV Virtual Function)
+
+pci:v0000177Dd00009712sv0000177Dsd00000005*
+ ID_MODEL_FROM_DATABASE=CN23XX [LiquidIO II] SRIOV Virtual Function (CN2360 [LiquidIO II] 2-port 10GbE SRIOV Virtual Function)
+
+pci:v0000177Dd00009712sv0000177Dsd00000006*
+ ID_MODEL_FROM_DATABASE=CN23XX [LiquidIO II] SRIOV Virtual Function (CN2360 [LiquidIO II] 2-port 25GbE SRIOV Virtual Function)
+
+pci:v0000177Dd00009712sv0000177Dsd00000007*
+ ID_MODEL_FROM_DATABASE=CN23XX [LiquidIO II] SRIOV Virtual Function (CN2350 [LiquidIO II] 2-port 25GbE SRIOV Virtual Function)
+
 pci:v0000177Dd00009713*
  ID_MODEL_FROM_DATABASE=CN23XX [LiquidIO II] NVMe SRIOV Virtual Function
 
@@ -55605,7 +56958,7 @@ pci:v000017C2*
  ID_VENDOR_FROM_DATABASE=Newisys, Inc.
 
 pci:v000017CB*
- ID_VENDOR_FROM_DATABASE=Airgo Networks, Inc.
+ ID_VENDOR_FROM_DATABASE=Qualcomm
 
 pci:v000017CBd00000001*
  ID_MODEL_FROM_DATABASE=AGN100 802.11 a/b/g True MIMO Wireless Card
@@ -55625,12 +56978,21 @@ pci:v000017CBd00000002sv00001385sd00006D00*
 pci:v000017CBd00000002sv00001737sd00000054*
  ID_MODEL_FROM_DATABASE=AGN300 802.11 a/b/g True MIMO Wireless Card (WPC54GX4 v1 802.11g Wireless-G Notebook Adapter with SRX400)
 
+pci:v000017CBd00000400*
+ ID_MODEL_FROM_DATABASE=Datacenter Technologies QDF2432 PCI Express Root Port
+
+pci:v000017CBd00000401*
+ ID_MODEL_FROM_DATABASE=Datacenter Technologies QDF2400 PCI Express Root Port
+
 pci:v000017CC*
  ID_VENDOR_FROM_DATABASE=NetChip Technology, Inc
 
 pci:v000017CCd00002280*
  ID_MODEL_FROM_DATABASE=USB 2.0
 
+pci:v000017CD*
+ ID_VENDOR_FROM_DATABASE=Cadence Design Systems, Inc.
+
 pci:v000017CF*
  ID_VENDOR_FROM_DATABASE=Z-Com, Inc.
 
@@ -55655,6 +57017,9 @@ pci:v000017D3d00001170*
 pci:v000017D3d00001201*
  ID_MODEL_FROM_DATABASE=ARC-1200 2-Port PCI-Express to SATA II RAID Controller
 
+pci:v000017D3d00001203*
+ ID_MODEL_FROM_DATABASE=ARC-1203 2/4/8 Port PCIe 2.0 to SATA 6Gb RAID Controller
+
 pci:v000017D3d00001210*
  ID_MODEL_FROM_DATABASE=ARC-1210 4-Port PCI-Express to SATA RAID Controller
 
@@ -55994,6 +57359,9 @@ pci:v000017F3*
 pci:v000017F3d00001010*
  ID_MODEL_FROM_DATABASE=R1010 IDE Controller
 
+pci:v000017F3d00002012*
+ ID_MODEL_FROM_DATABASE=M2012/R3308 VGA-compatible graphics adapter
+
 pci:v000017F3d00006020*
  ID_MODEL_FROM_DATABASE=R6020 North Bridge
 
@@ -56591,7 +57959,7 @@ pci:v000018C3*
 pci:v000018C3d00000720*
  ID_MODEL_FROM_DATABASE=nGene PCI-Express Multimedia Controller
 
-pci:v000018C3d00000720sv000007CAsd0000032E*
+pci:v000018C3d00000720sv00001461sd0000032E*
  ID_MODEL_FROM_DATABASE=nGene PCI-Express Multimedia Controller (Hybrid M779 PCI-E)
 
 pci:v000018C8*
@@ -56624,6 +57992,9 @@ pci:v000018D2*
 pci:v000018D2d00003069*
  ID_MODEL_FROM_DATABASE=DC-105v2 ISDN controller
 
+pci:v000018D4*
+ ID_VENDOR_FROM_DATABASE=Celestica
+
 pci:v000018D8*
  ID_VENDOR_FROM_DATABASE=Dialogue Technology Corp.
 
@@ -56870,6 +58241,12 @@ pci:v000018F4d00000165*
 pci:v000018F4d00000175*
  ID_MODEL_FROM_DATABASE=NT20E3-2-PTP Network Adapter 2x10Gb
 
+pci:v000018F4d00000185*
+ ID_MODEL_FROM_DATABASE=NT40A01 Network Adapter
+
+pci:v000018F4d000001A5*
+ ID_MODEL_FROM_DATABASE=NT200A01 Network Adapter
+
 pci:v000018F6*
  ID_VENDOR_FROM_DATABASE=NextIO
 
@@ -57135,208 +58512,214 @@ pci:v00001924d00000710sv00001924sd00005202*
  ID_MODEL_FROM_DATABASE=SFC4000 rev B [Solarstorm] (SFN4112F-R2)
 
 pci:v00001924d00000803*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm]
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller
 
 pci:v00001924d00000803sv00001014sd00000478*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (2-port 10GbE Low-Latency (R7))
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (2-port 10GbE Low-Latency (R7))
 
 pci:v00001924d00000803sv00001014sd00000479*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (2-port 10GbE OpenOnload (R7))
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (2-port 10GbE OpenOnload (R7))
 
 pci:v00001924d00000803sv00001014sd000004A7*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (Solarflare 10Gb Low-latency Dual-port HBA (R7))
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (Solarflare 10Gb Low-latency Dual-port HBA (R7))
 
 pci:v00001924d00000803sv00001014sd000004A8*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (Solarflare 10Gb Dual-port HBA (R7))
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (Solarflare 10Gb Dual-port HBA (R7))
 
 pci:v00001924d00000803sv0000103Csd00002132*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (Ethernet 10Gb 2-port 570FLR-SFP+ Adapter (R1))
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (Ethernet 10Gb 2-port 570FLR-SFP+ Adapter (R1))
 
 pci:v00001924d00000803sv0000103Csd00002136*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (Ethernet 10Gb 2-port 570SFP+ Adapter (R7))
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (Ethernet 10Gb 2-port 570SFP+ Adapter (R7))
 
 pci:v00001924d00000803sv00001924sd00001201*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFA6902F-R1 SFP+ AOE Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFA6902F-R1 SFP+ AOE Adapter)
 
 pci:v00001924d00000803sv00001924sd00006200*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5122F-R0 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5122F-R0 SFP+ Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00006201*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5122F-R1 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5122F-R1 SFP+ Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00006202*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5122F-R2 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5122F-R2 SFP+ Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00006204*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5122F-R4 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5122F-R4 SFP+ Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00006205*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5122F-R5 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5122F-R5 SFP+ Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00006206*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5122F-R6 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5122F-R6 SFP+ Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00006207*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5122F-R7 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5122F-R7 SFP+ Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00006210*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5322F-R0 SFP+ Precision Time Synchronization Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5322F-R0 SFP+ Precision Time Synchronization Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00006211*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5322F-R1 SFP+ Precision Time Synchronization Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5322F-R1 SFP+ Precision Time Synchronization Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00006217*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5322F-R7 SFP+ Precision Time Synchronization Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5322F-R7 SFP+ Precision Time Synchronization Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00006227*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN6122F-R7 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN6122F-R7 SFP+ Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00006237*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN6322F-R7 SFP+ Precision Time Synchronization Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN6322F-R7 SFP+ Precision Time Synchronization Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00006501*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5802K-R1 Mezzanine Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5802K-R1 Mezzanine Adapter)
 
 pci:v00001924d00000803sv00001924sd00006511*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5814H-R1 Mezzanine Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5814H-R1 Mezzanine Adapter)
 
 pci:v00001924d00000803sv00001924sd00006521*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5812H-R1 Mezzanine Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5812H-R1 Mezzanine Adapter)
 
 pci:v00001924d00000803sv00001924sd00006562*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN6832F-R2 SFP+ Mezzanine Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN6832F-R2 SFP+ Mezzanine Adapter)
 
 pci:v00001924d00000803sv00001924sd00006A05*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5112F-R5 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5112F-R5 SFP+ Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00006A06*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5112F-R6 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5112F-R6 SFP+ Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00007206*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5162F-R6 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5162F-R6 SFP+ Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00007207*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5162F-R7 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5162F-R7 SFP+ Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00007A06*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5152F-R6 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5152F-R6 SFP+ Server Adapter)
 
 pci:v00001924d00000803sv00001924sd00007A07*
- ID_MODEL_FROM_DATABASE=SFC9020 [Solarstorm] (SFN5152F-R7 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (SFN5152F-R7 SFP+ Server Adapter)
 
 pci:v00001924d00000813*
- ID_MODEL_FROM_DATABASE=SFL9021 [Solarstorm]
+ ID_MODEL_FROM_DATABASE=SFL9021 10GBASE-T Ethernet Controller
 
 pci:v00001924d00000813sv00001924sd00006100*
- ID_MODEL_FROM_DATABASE=SFL9021 [Solarstorm] (SFN5121T-R0 10GBASE-T Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFL9021 10GBASE-T Ethernet Controller (SFN5121T-R0 10GBASE-T Server Adapter)
 
 pci:v00001924d00000813sv00001924sd00006102*
- ID_MODEL_FROM_DATABASE=SFL9021 [Solarstorm] (SFN5121T-R2 10GBASE-T Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFL9021 10GBASE-T Ethernet Controller (SFN5121T-R2 10GBASE-T Server Adapter)
 
 pci:v00001924d00000813sv00001924sd00006103*
- ID_MODEL_FROM_DATABASE=SFL9021 [Solarstorm] (SFN5121T-R3 10GBASE-T Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFL9021 10GBASE-T Ethernet Controller (SFN5121T-R3 10GBASE-T Server Adapter)
 
 pci:v00001924d00000813sv00001924sd00006104*
- ID_MODEL_FROM_DATABASE=SFL9021 [Solarstorm] (SFN5121T-R4 10GBASE-T Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFL9021 10GBASE-T Ethernet Controller (SFN5121T-R4 10GBASE-T Server Adapter)
 
 pci:v00001924d00000813sv00001924sd00006902*
- ID_MODEL_FROM_DATABASE=SFL9021 [Solarstorm] (SFN5111T-R2 10GBASE-T Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFL9021 10GBASE-T Ethernet Controller (SFN5111T-R2 10GBASE-T Server Adapter)
 
 pci:v00001924d00000813sv00001924sd00006904*
- ID_MODEL_FROM_DATABASE=SFL9021 [Solarstorm] (SFN5111T-R4 10GBASE-T Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFL9021 10GBASE-T Ethernet Controller (SFN5111T-R4 10GBASE-T Server Adapter)
 
 pci:v00001924d00000813sv00001924sd00007104*
- ID_MODEL_FROM_DATABASE=SFL9021 [Solarstorm] (SFN5161T-R4 10GBASE-T Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFL9021 10GBASE-T Ethernet Controller (SFN5161T-R4 10GBASE-T Server Adapter)
 
 pci:v00001924d00000813sv00001924sd00007904*
- ID_MODEL_FROM_DATABASE=SFL9021 [Solarstorm] (SFN5151T-R4 10GBASE-T Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFL9021 10GBASE-T Ethernet Controller (SFN5151T-R4 10GBASE-T Server Adapter)
 
 pci:v00001924d00000903*
- ID_MODEL_FROM_DATABASE=SFC9120
+ ID_MODEL_FROM_DATABASE=SFC9120 10G Ethernet Controller
 
 pci:v00001924d00000903sv00001014sd000004CC*
- ID_MODEL_FROM_DATABASE=SFC9120 (SFN7122F-R2 2x10GbE SFP+ Flareon Ultra)
+ ID_MODEL_FROM_DATABASE=SFC9120 10G Ethernet Controller (SFN7122F-R2 2x10GbE SFP+ Flareon Ultra)
 
 pci:v00001924d00000903sv00001924sd00008002*
- ID_MODEL_FROM_DATABASE=SFC9120 (SFN7122F-R1 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9120 10G Ethernet Controller (SFN7122F-R1 SFP+ Server Adapter)
 
 pci:v00001924d00000903sv00001924sd00008003*
- ID_MODEL_FROM_DATABASE=SFC9120 (SFN7x41Q-R1 Flareon Ultra 7000 Series 10/40G Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9120 10G Ethernet Controller (SFN7x41Q-R1 Flareon Ultra 7000 Series 10/40G Adapter)
 
 pci:v00001924d00000903sv00001924sd00008006*
- ID_MODEL_FROM_DATABASE=SFC9120 (SFN7022F-R1 SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9120 10G Ethernet Controller (SFN7022F-R1 SFP+ Server Adapter)
 
 pci:v00001924d00000903sv00001924sd00008007*
- ID_MODEL_FROM_DATABASE=SFC9120 (SFN7322F-R2 Precision Time SFP+ Server Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9120 10G Ethernet Controller (SFN7322F-R2 Precision Time SFP+ Server Adapter)
 
 pci:v00001924d00000903sv00001924sd00008009*
- ID_MODEL_FROM_DATABASE=SFC9120 (SFN7x22F-R2 Flareon Ultra 7000 Series 10G Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9120 10G Ethernet Controller (SFN7x22F-R2 Flareon Ultra 7000 Series 10G Adapter)
 
 pci:v00001924d00000903sv00001924sd0000800A*
- ID_MODEL_FROM_DATABASE=SFC9120 (SFN7x02F-R2 Flareon 7000 Series 10G Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9120 10G Ethernet Controller (SFN7x02F-R2 Flareon 7000 Series 10G Adapter)
 
 pci:v00001924d00000903sv00001924sd0000800C*
- ID_MODEL_FROM_DATABASE=SFC9120 (SFN7x22F-R3 Flareon Ultra 7000 Series 10G Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9120 10G Ethernet Controller (SFN7x22F-R3 Flareon Ultra 7000 Series 10G Adapter)
 
 pci:v00001924d00000903sv00001924sd0000800D*
- ID_MODEL_FROM_DATABASE=SFC9120 (SFN7x02F-R3 Flareon 7000 Series 10G Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9120 10G Ethernet Controller (SFN7x02F-R3 Flareon 7000 Series 10G Adapter)
 
 pci:v00001924d00000903sv00001924sd00008010*
- ID_MODEL_FROM_DATABASE=SFC9120 (SFA7942Q-R1 QSFP+ AOE Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9120 10G Ethernet Controller (SFA7942Q-R1 QSFP+ AOE Adapter)
 
 pci:v00001924d00000903sv00001924sd00008015*
- ID_MODEL_FROM_DATABASE=SFC9120 (SFA7942Q-A5-0-R1 QSFP+ AOE Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9120 10G Ethernet Controller (SFA7942Q-A5-0-R1 QSFP+ AOE Adapter)
 
 pci:v00001924d00000923*
- ID_MODEL_FROM_DATABASE=SFC9140
+ ID_MODEL_FROM_DATABASE=SFC9140 10/40G Ethernet Controller
 
 pci:v00001924d00000923sv00001924sd0000800B*
- ID_MODEL_FROM_DATABASE=SFC9140 (SFN7x42Q-R1 Flareon Ultra 7000 Series 10/40G Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9140 10/40G Ethernet Controller (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)
+ ID_MODEL_FROM_DATABASE=SFC9140 10/40G Ethernet Controller (SFN7x42Q-R2 Flareon Ultra 7000 Series 10/40G Adapter)
 
 pci:v00001924d00000923sv00001924sd0000800F*
- ID_MODEL_FROM_DATABASE=SFC9140 (SFN7xx4F-R1 Flareon Ultra 7000 Series 10G Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9140 10/40G Ethernet Controller (SFN7xx4F-R1 Flareon Ultra 7000 Series 10G Adapter)
 
 pci:v00001924d00000A03*
- ID_MODEL_FROM_DATABASE=SFC9220
+ ID_MODEL_FROM_DATABASE=SFC9220 10/40G Ethernet Controller
 
 pci:v00001924d00000A03sv00001924sd00008011*
- ID_MODEL_FROM_DATABASE=SFC9220 (SFN 8022-R1 Solarflare Flareon 8000 Series 10G Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9220 10/40G Ethernet Controller (SFN8022-R1 8000 Series 10G Adapter)
 
 pci:v00001924d00000A03sv00001924sd00008012*
- ID_MODEL_FROM_DATABASE=SFC9220 (SFN8522-R1 Flareon Ultra 8000 Series 10G Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9220 10/40G Ethernet Controller (SFN8522-R1 8000 Series 10G Adapter)
 
 pci:v00001924d00000A03sv00001924sd00008013*
- ID_MODEL_FROM_DATABASE=SFC9220 (SFN8042-R1 Solarflare Flareon 8000 Series 10/40G Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9220 10/40G Ethernet Controller (SFN8042-R1 8000 Series 10/40G Adapter)
 
 pci:v00001924d00000A03sv00001924sd00008014*
- ID_MODEL_FROM_DATABASE=SFC9220 (SFN8542-R1 Flareon Ultra 8000 Series 10/40G Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9220 10/40G Ethernet Controller (SFN8542-R1 8000 Series 10/40G Adapter)
 
 pci:v00001924d00000A03sv00001924sd00008016*
- ID_MODEL_FROM_DATABASE=SFC9220 (SFN8022-R2 Flareon 8000 Series 10G Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9220 10/40G Ethernet Controller (SFN8022-R2 8000 Series 10G Adapte)
 
 pci:v00001924d00000A03sv00001924sd00008017*
- ID_MODEL_FROM_DATABASE=SFC9220 (SFN8522-R2 Flareon Ultra 8000 Series 10G Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9220 10/40G Ethernet Controller (SFN8522-R2 8000 Series 10G Adapter)
 
 pci:v00001924d00000A03sv00001924sd00008018*
- ID_MODEL_FROM_DATABASE=SFC9220 (SFN8042-R2 Flareon 8000 Series 10/40G Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9220 10/40G Ethernet Controller (SFN8042-R2 8000 Series 10/40G Adapter)
 
 pci:v00001924d00000A03sv00001924sd00008019*
- ID_MODEL_FROM_DATABASE=SFC9220 (SFN8542-R2 Flareon Ultra 8000 Series 10/40G Adapter)
+ ID_MODEL_FROM_DATABASE=SFC9220 10/40G Ethernet Controller (SFN8542-R2 8000 Series 10/40G Adapter)
+
+pci:v00001924d00000A03sv00001924sd0000801A*
+ ID_MODEL_FROM_DATABASE=SFC9220 10/40G Ethernet Controller (SFN8722-R1 8000 Series OCP 10G Adapter)
 
 pci:v00001924d00001803*
- ID_MODEL_FROM_DATABASE=SFC9020 Virtual Function [Solarstorm]
+ ID_MODEL_FROM_DATABASE=SFC9020 10G Ethernet Controller (Virtual Function)
 
 pci:v00001924d00001813*
- ID_MODEL_FROM_DATABASE=SFL9021 Virtual Function [Solarstorm]
+ ID_MODEL_FROM_DATABASE=SFL9021 10GBASE-T Ethernet Controller (Virtual Function)
 
 pci:v00001924d00001903*
- ID_MODEL_FROM_DATABASE=SFC9120 Virtual Function
+ ID_MODEL_FROM_DATABASE=SFC9120 10G Ethernet Controller (Virtual Function)
 
 pci:v00001924d00001923*
- ID_MODEL_FROM_DATABASE=SFC9140 Virtual Function
+ ID_MODEL_FROM_DATABASE=SFC9140 10/40G Ethernet Controller (Virtual Function)
+
+pci:v00001924d00001A03*
+ ID_MODEL_FROM_DATABASE=SFC9220 10/40G Ethernet Controller (Virtual Function)
 
 pci:v00001924d00006703*
  ID_MODEL_FROM_DATABASE=SFC4000 rev A iSCSI/Onload [Solarstorm]
@@ -58065,32 +59448,50 @@ pci:v000019A2d00000222*
  ID_MODEL_FROM_DATABASE=BladeEngine3 10Gb Gen2 PCIe iSCSI Adapter
 
 pci:v000019A2d00000700*
- ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC
+ ID_MODEL_FROM_DATABASE=OneConnect OCe10100/OCe10102 Series 10 GbE
 
 pci:v000019A2d00000700sv0000103Csd00001747*
- ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (NC550SFP DualPort 10GbE Server Adapter)
+ ID_MODEL_FROM_DATABASE=OneConnect OCe10100/OCe10102 Series 10 GbE (NC550SFP DualPort 10GbE Server Adapter)
 
 pci:v000019A2d00000700sv0000103Csd00001749*
- ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (NC550SFP Dual Port Server Adapter)
+ ID_MODEL_FROM_DATABASE=OneConnect OCe10100/OCe10102 Series 10 GbE (NC550SFP Dual Port Server Adapter)
 
 pci:v000019A2d00000700sv0000103Csd0000174A*
- ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (NC551m Dual Port FlexFabric 10Gb Adapter)
+ ID_MODEL_FROM_DATABASE=OneConnect OCe10100/OCe10102 Series 10 GbE (NC551m Dual Port FlexFabric 10Gb Adapter)
 
 pci:v000019A2d00000700sv0000103Csd0000174B*
- ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (StorageWorks NC550 DualPort Converged Network Adapter)
+ ID_MODEL_FROM_DATABASE=OneConnect OCe10100/OCe10102 Series 10 GbE (StorageWorks NC550 DualPort Converged Network Adapter)
 
 pci:v000019A2d00000700sv0000103Csd00003314*
- ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (NC551i Dual Port FlexFabric 10Gb Adapter)
+ ID_MODEL_FROM_DATABASE=OneConnect OCe10100/OCe10102 Series 10 GbE (NC551i Dual Port FlexFabric 10Gb Adapter)
 
 pci:v000019A2d00000702*
  ID_MODEL_FROM_DATABASE=OneConnect 10Gb iSCSI Initiator
 
 pci:v000019A2d00000704*
- ID_MODEL_FROM_DATABASE=OneConnect 10Gb FCoE Initiator
+ ID_MODEL_FROM_DATABASE=OneConnect OCe10100/OCe10102 Series 10 GbE CNA
+
+pci:v000019A2d00000704sv000010DFsd0000E602*
+ ID_MODEL_FROM_DATABASE=OneConnect OCe10100/OCe10102 Series 10 GbE CNA (OneConnect OCe10100 10Gb CNA)
+
+pci:v000019A2d00000704sv000010DFsd0000E630*
+ ID_MODEL_FROM_DATABASE=OneConnect OCe10100/OCe10102 Series 10 GbE CNA (OneConnect OCe10102-FM-E / OCe10102-FX-E for EMC VNX Symmetrix)
 
 pci:v000019A2d00000710*
  ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3)
 
+pci:v000019A2d00000710sv00001014sd000003D0*
+ ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3) (PCIe2 2-port 10GbE SR Adapter for POWER)
+
+pci:v000019A2d00000710sv00001014sd000003D1*
+ ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3) (PCIe2 2-port 10GbE SFP+ Copper Adapter for POWER)
+
+pci:v000019A2d00000710sv00001014sd00000409*
+ ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3) (Integrated Multifunction Card with Dual 10GbE SR Optical + Dual 1GbE for Power 750/760)
+
+pci:v000019A2d00000710sv00001014sd0000040A*
+ ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3) (Integrated Multifunction Card with Dual 10GbE SR Copper + Dual 1GbE for Power 750/760)
+
 pci:v000019A2d00000710sv0000103Csd00003315*
  ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3) (NC553i 10Gb 2-port FlexFabric Converged Network Adapter)
 
@@ -58106,6 +59507,9 @@ pci:v000019A2d00000710sv0000103Csd00003345*
 pci:v000019A2d00000710sv0000103Csd0000337B*
  ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3) (NC554FLB 10Gb 2-port FlexFabric Converged Network Adapter)
 
+pci:v000019A2d00000710sv000010DFsd0000E733*
+ ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3) (Flex System EN4054 4-port 10Gb Ethernet Mezzanine Adapter)
+
 pci:v000019A2d00000712*
  ID_MODEL_FROM_DATABASE=OneConnect 10Gb iSCSI Initiator (be3)
 
@@ -58118,6 +59522,9 @@ pci:v000019A2d00000714sv0000103Csd00003315*
 pci:v000019A2d00000714sv0000103Csd0000337B*
  ID_MODEL_FROM_DATABASE=OneConnect 10Gb FCoE Initiator (be3) (NC554FLB 10Gb 2-port FlexFabric Converged Network Adapter)
 
+pci:v000019A2d00000800*
+ ID_MODEL_FROM_DATABASE=ServerView iRMC HTI
+
 pci:v000019A8*
  ID_VENDOR_FROM_DATABASE=DAQDATA GmbH
 
@@ -58172,6 +59579,12 @@ pci:v000019E3d00005808*
 pci:v000019E3d0000DD52*
  ID_MODEL_FROM_DATABASE=DDRdrive X1-30
 
+pci:v000019E5*
+ ID_VENDOR_FROM_DATABASE=Huawei Technologies Co., Ltd.
+
+pci:v000019E5d00001711*
+ ID_MODEL_FROM_DATABASE=Hi1710 [iBMC Intelligent Management system chip w/VGA support]
+
 pci:v000019E7*
  ID_VENDOR_FROM_DATABASE=NET (Network Equipment Technologies)
 
@@ -58731,7 +60144,7 @@ pci:v00001B03d00007000*
  ID_MODEL_FROM_DATABASE=D7 Multiformat Broadcast HD/SD Encoder/Decoder/Transcoder
 
 pci:v00001B08*
- ID_VENDOR_FROM_DATABASE=MSC Vertriebs GmbH
+ ID_VENDOR_FROM_DATABASE=MSC Technologies GmbH
 
 pci:v00001B0A*
  ID_VENDOR_FROM_DATABASE=Pegatron
@@ -58817,9 +60230,24 @@ pci:v00001B36d00000006*
 pci:v00001B36d00000007*
  ID_MODEL_FROM_DATABASE=PCI SD Card Host Controller Interface
 
+pci:v00001B36d00000008*
+ ID_MODEL_FROM_DATABASE=QEMU PCIe Host bridge
+
+pci:v00001B36d00000009*
+ ID_MODEL_FROM_DATABASE=QEMU PCI Expander bridge
+
 pci:v00001B36d0000000A*
  ID_MODEL_FROM_DATABASE=PCI-PCI bridge (multiseat)
 
+pci:v00001B36d0000000B*
+ ID_MODEL_FROM_DATABASE=QEMU PCIe Expander bridge
+
+pci:v00001B36d0000000C*
+ ID_MODEL_FROM_DATABASE=QEMU PCIe Root port
+
+pci:v00001B36d0000000D*
+ ID_MODEL_FROM_DATABASE=QEMU XHCI Host Controller
+
 pci:v00001B36d00000100*
  ID_MODEL_FROM_DATABASE=QXL paravirtual graphic card
 
@@ -58865,6 +60293,9 @@ pci:v00001B37d0000001F*
 pci:v00001B37d00000020*
  ID_MODEL_FROM_DATABASE=ADQ14
 
+pci:v00001B37d00000023*
+ ID_MODEL_FROM_DATABASE=ADQ7
+
 pci:v00001B37d00002014*
  ID_MODEL_FROM_DATABASE=TX320
 
@@ -59057,6 +60488,9 @@ pci:v00001B85*
 pci:v00001B85d00001041*
  ID_MODEL_FROM_DATABASE=RevoDrive 3 X2 PCI-Express SSD 240 GB (Marvell Controller)
 
+pci:v00001B85d00006018*
+ ID_MODEL_FROM_DATABASE=RD400/400A SSD
+
 pci:v00001B85d00008788*
  ID_MODEL_FROM_DATABASE=RevoDrive Hybrid
 
@@ -59120,9 +60554,15 @@ pci:v00001BB1d00000100*
 pci:v00001BB1d00000100sv00001BB1sd00000101*
  ID_MODEL_FROM_DATABASE=Nytro Flash Storage (Nytro XF1440)
 
+pci:v00001BB1d00000100sv00001BB1sd00000103*
+ ID_MODEL_FROM_DATABASE=Nytro Flash Storage (Nytro 5000)
+
 pci:v00001BB1d00000100sv00001BB1sd00000121*
  ID_MODEL_FROM_DATABASE=Nytro Flash Storage (Nytro XM1440)
 
+pci:v00001BB1d00000100sv00001BB1sd00000123*
+ ID_MODEL_FROM_DATABASE=Nytro Flash Storage (Nytro 5000)
+
 pci:v00001BB1d00000100sv00001BB1sd000001A1*
  ID_MODEL_FROM_DATABASE=Nytro Flash Storage (Nytro XP7102)
 
@@ -59201,6 +60641,12 @@ pci:v00001BEE*
 pci:v00001BEEd00000003*
  ID_MODEL_FROM_DATABASE=CAN-IB200/PCIe
 
+pci:v00001BEF*
+ ID_VENDOR_FROM_DATABASE=Lantiq
+
+pci:v00001BEFd00000011*
+ ID_MODEL_FROM_DATABASE=MIPS SoC PCI Express Port
+
 pci:v00001BF4*
  ID_VENDOR_FROM_DATABASE=VTI Instruments Corporation
 
@@ -59223,7 +60669,25 @@ pci:v00001C09d00004256*
  ID_MODEL_FROM_DATABASE=10G-PCIE3-8D-2S
 
 pci:v00001C09d00004258*
- ID_MODEL_FROM_DATABASE=10G-PCIE3-8E-2S
+ ID_MODEL_FROM_DATABASE=10G-PCIE3-8E-2S Network Adapter
+
+pci:v00001C09d00004260*
+ ID_MODEL_FROM_DATABASE=10G-PCIE3-8E-4S Network Adapter
+
+pci:v00001C09d00004261*
+ ID_MODEL_FROM_DATABASE=10G-PCIE3-8E-4S Network Adapter
+
+pci:v00001C09d00004262*
+ ID_MODEL_FROM_DATABASE=10G-PCIE3-8E-4S Network Adapter
+
+pci:v00001C09d00004263*
+ ID_MODEL_FROM_DATABASE=10G-PCIE3-8E-4S Network Adapter
+
+pci:v00001C09d00004264*
+ ID_MODEL_FROM_DATABASE=10G-PCIE3-8E-2S Network Adapter
+
+pci:v00001C09d00004265*
+ ID_MODEL_FROM_DATABASE=10G-PCIE3-8E-2S Network Adapter
 
 pci:v00001C1C*
  ID_VENDOR_FROM_DATABASE=Symphony
@@ -59270,9 +60734,15 @@ pci:v00001C2Cd000000A6*
 pci:v00001C2Cd000000A9*
  ID_MODEL_FROM_DATABASE=FBC2XGHH Capture 2x10Gb
 
+pci:v00001C2Cd000000AD*
+ ID_MODEL_FROM_DATABASE=FBC2CGG3HL Capture 2x200Gb
+
 pci:v00001C2Cd000000AF*
  ID_MODEL_FROM_DATABASE=Capture slave device
 
+pci:v00001C2Cd0000A001*
+ ID_MODEL_FROM_DATABASE=FBC2CGG3 Capture 2x200Gb
+
 pci:v00001C32*
  ID_VENDOR_FROM_DATABASE=Highland Technology, Inc.
 
@@ -59306,6 +60776,12 @@ pci:v00001C58d00000003sv00001014sd000004F5*
 pci:v00001C58d00000003sv00001014sd000004F6*
  ID_MODEL_FROM_DATABASE=Ultrastar SN100 Series NVMe SSD (PCIe3 3.2TB NVMe Flash Adapter)
 
+pci:v00001C5F*
+ ID_VENDOR_FROM_DATABASE=Beijing Memblaze Technology Co. Ltd.
+
+pci:v00001C5Fd00000540*
+ ID_MODEL_FROM_DATABASE=PBlaze4 NVMe SSD
+
 pci:v00001C63*
  ID_VENDOR_FROM_DATABASE=Science and Research Centre of Computer Technology (JSC "NICEVT")
 
@@ -59369,6 +60845,12 @@ pci:v00001CD2d00000304*
 pci:v00001CD2d00000305*
  ID_MODEL_FROM_DATABASE=Simulyzer-RT CompactPCI Serial CAN-1 card
 
+pci:v00001CD7*
+ ID_VENDOR_FROM_DATABASE=Nanjing Magewell Electronics Co., Ltd.
+
+pci:v00001CD7d00000010*
+ ID_MODEL_FROM_DATABASE=Pro Capture Endpoint
+
 pci:v00001CDD*
  ID_VENDOR_FROM_DATABASE=secunet Security Networks AG
 
@@ -59390,12 +60872,24 @@ pci:v00001CE4d00000004*
 pci:v00001CE4d00000005*
  ID_MODEL_FROM_DATABASE=ExaNIC X40
 
+pci:v00001CE4d00000006*
+ ID_MODEL_FROM_DATABASE=ExaNIC X10-HPT
+
+pci:v00001CE4d00000007*
+ ID_MODEL_FROM_DATABASE=ExaNIC X40
+
 pci:v00001CF7*
  ID_VENDOR_FROM_DATABASE=Subspace Dynamics
 
 pci:v00001D00*
  ID_VENDOR_FROM_DATABASE=Pure Storage
 
+pci:v00001D18*
+ ID_VENDOR_FROM_DATABASE=RME
+
+pci:v00001D18d00000001*
+ ID_MODEL_FROM_DATABASE=Fireface UFX+
+
 pci:v00001D1D*
  ID_VENDOR_FROM_DATABASE=CNEX Labs
 
@@ -59435,6 +60929,9 @@ pci:v00001D44d0000A400*
 pci:v00001D49*
  ID_VENDOR_FROM_DATABASE=Lenovo
 
+pci:v00001D4C*
+ ID_VENDOR_FROM_DATABASE=Diamanti, Inc.
+
 pci:v00001D5C*
  ID_VENDOR_FROM_DATABASE=Fantasia Trading LLC
 
@@ -59492,12 +60989,39 @@ pci:v00001D6Cd0000100C*
 pci:v00001D6Cd0000100D*
  ID_MODEL_FROM_DATABASE=AR-ARKA-FX0 [Arkville 32B DPDK Data Mover]
 
+pci:v00001D6Cd0000100Dsv00001D6Csd00002001*
+ ID_MODEL_FROM_DATABASE=AR-ARKA-FX0 [Arkville 32B DPDK Data Mover] (DPDK-Aware Virtual Function [Arkville VF])
+
 pci:v00001D6Cd0000100E*
  ID_MODEL_FROM_DATABASE=AR-ARKA-FX1 [Arkville 64B DPDK Data Mover]
 
+pci:v00001D6Cd0000100Esv00001D6Csd00002001*
+ ID_MODEL_FROM_DATABASE=AR-ARKA-FX1 [Arkville 64B DPDK Data Mover] (DPDK-Aware Virtual Function [Arkville VF])
+
 pci:v00001D6Cd00004200*
  ID_MODEL_FROM_DATABASE=A5PL-E1-10GETI [10 GbE Ethernet Traffic Instrument]
 
+pci:v00001D78*
+ ID_VENDOR_FROM_DATABASE=DERA
+
+pci:v00001D7C*
+ ID_VENDOR_FROM_DATABASE=Aerotech, Inc.
+
+pci:v00001D87*
+ ID_VENDOR_FROM_DATABASE=Rockchip Inc. RK3399 PCI Express Root Port
+
+pci:v00001D8F*
+ ID_VENDOR_FROM_DATABASE=Enyx
+
+pci:v00001D95*
+ ID_VENDOR_FROM_DATABASE=Graphcore Ltd
+
+pci:v00001DA1*
+ ID_VENDOR_FROM_DATABASE=Teko Telecom S.r.l.
+
+pci:v00001DA2*
+ ID_VENDOR_FROM_DATABASE=Sapphire Technology Limited
+
 pci:v00001DE1*
  ID_VENDOR_FROM_DATABASE=Tekram Technology Co.,Ltd.
 
@@ -59619,7 +61143,7 @@ pci:v00001FC9d00004022sv00001186sd00004D00*
  ID_MODEL_FROM_DATABASE=TN9310 10GbE SFP+ Ethernet Adapter (DXE-810S 10GbE SFP+ Ethernet Adapter)
 
 pci:v00001FC9d00004022sv00001432sd00008103*
- ID_MODEL_FROM_DATABASE=TN9310 10GbE SFP+ Ethernet Adapter (EN-8102PF 10GbE SPF+ Ethernet Adapter)
+ ID_MODEL_FROM_DATABASE=TN9310 10GbE SFP+ Ethernet Adapter (10 Gigabit Ethernet SFP+ PCI Express Adapter)
 
 pci:v00001FC9d00004022sv00001FC9sd00003015*
  ID_MODEL_FROM_DATABASE=TN9310 10GbE SFP+ Ethernet Adapter (Ethernet Adapter)
@@ -59637,7 +61161,7 @@ pci:v00001FC9d00004025sv00001186sd00002900*
  ID_MODEL_FROM_DATABASE=TN9510 10GBase-T/NBASE-T Ethernet Adapter (DXE-810T 10GBase-T Ethernet Adapter)
 
 pci:v00001FC9d00004025sv00001432sd00008102*
- ID_MODEL_FROM_DATABASE=TN9510 10GBase-T/NBASE-T Ethernet Adapter (EN-8102P 10GbE Ethernet Adapter)
+ ID_MODEL_FROM_DATABASE=TN9510 10GBase-T/NBASE-T Ethernet Adapter (10 Gigabit Ethernet PCI Express Adapter)
 
 pci:v00001FC9d00004025sv00001FC9sd00003015*
  ID_MODEL_FROM_DATABASE=TN9510 10GBase-T/NBASE-T Ethernet Adapter (Ethernet Adapter)
@@ -59646,7 +61170,19 @@ pci:v00001FC9d00004026*
  ID_MODEL_FROM_DATABASE=TN9610 10GbE SFP+ Ethernet Adapter
 
 pci:v00001FC9d00004027*
- ID_MODEL_FROM_DATABASE=TN9710 10GBase-T/NBASE-T Ethernet Adapter
+ ID_MODEL_FROM_DATABASE=TN9710P 10GBase-T/NBASE-T Ethernet Adapter
+
+pci:v00001FC9d00004027sv00001154sd00000368*
+ ID_MODEL_FROM_DATABASE=TN9710P 10GBase-T/NBASE-T Ethernet Adapter (LGY-PCIE-MG)
+
+pci:v00001FC9d00004027sv00001432sd00008104*
+ ID_MODEL_FROM_DATABASE=TN9710P 10GBase-T/NBASE-T Ethernet Adapter (10 Gigabit Ethernet PCI Express Adapter)
+
+pci:v00001FC9d00004027sv00001FC9sd00003015*
+ ID_MODEL_FROM_DATABASE=TN9710P 10GBase-T/NBASE-T Ethernet Adapter (Ethernet Adapter)
+
+pci:v00001FC9d00004527*
+ ID_MODEL_FROM_DATABASE=TN9710Q 5GBase-T/NBASE-T Ethernet Adapter
 
 pci:v00001FCC*
  ID_VENDOR_FROM_DATABASE=StreamLabs
@@ -59738,6 +61274,9 @@ pci:v00003000*
 pci:v00003112*
  ID_VENDOR_FROM_DATABASE=Satelco Ingenieria S.A.
 
+pci:v00003130*
+ ID_VENDOR_FROM_DATABASE=AUDIOTRAK
+
 pci:v00003142*
  ID_VENDOR_FROM_DATABASE=Post Impression Systems.
 
@@ -61448,6 +62987,9 @@ pci:v00005555*
 pci:v00005555d00000003*
  ID_MODEL_FROM_DATABASE=TURBOstor HFP-832 [HiPPI NIC]
 
+pci:v00005555d00003B00*
+ ID_MODEL_FROM_DATABASE=Epiphan DVI2PCIe video capture card
+
 pci:v00005646*
  ID_VENDOR_FROM_DATABASE=Vector Fabrics BV
 
@@ -61460,6 +63002,9 @@ pci:v00005678*
 pci:v00005700*
  ID_VENDOR_FROM_DATABASE=Netpower
 
+pci:v00005845*
+ ID_VENDOR_FROM_DATABASE=X-ES, Inc.
+
 pci:v0000584D*
  ID_VENDOR_FROM_DATABASE=AuzenTech Co., Ltd.
 
@@ -61776,7 +63321,7 @@ pci:v00008086d00000085*
  ID_MODEL_FROM_DATABASE=Centrino Advanced-N 6205 [Taylor Peak]
 
 pci:v00008086d00000085sv00008086sd00001311*
- ID_MODEL_FROM_DATABASE=Centrino Advanced-N 6205 [Taylor Peak] (Centrino Advanced-N 6205 AGN)
+ ID_MODEL_FROM_DATABASE=Centrino Advanced-N 6205 [Taylor Peak] (Centrino Advanced-N 6205 (802.11a/b/g/n))
 
 pci:v00008086d00000085sv00008086sd00001316*
  ID_MODEL_FROM_DATABASE=Centrino Advanced-N 6205 [Taylor Peak] (Centrino Advanced-N 6205 ABG)
@@ -61883,6 +63428,9 @@ pci:v00008086d00000101sv00001028sd000004B2*
 pci:v00008086d00000101sv0000106Bsd000000DC*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port (MacBookPro8,2 [Core i7, 15", 2011])
 
+pci:v00008086d00000101sv0000144Dsd0000C652*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port (NP300E5C series laptop)
+
 pci:v00008086d00000102*
  ID_MODEL_FROM_DATABASE=2nd Generation Core Processor Family Integrated Graphics Controller
 
@@ -61907,6 +63455,12 @@ pci:v00008086d00000104sv00001028sd000004DA*
 pci:v00008086d00000104sv0000106Bsd000000DC*
  ID_MODEL_FROM_DATABASE=2nd Generation Core Processor Family DRAM Controller (MacBookPro8,2 [Core i7, 15", 2011])
 
+pci:v00008086d00000104sv0000144Dsd0000C652*
+ ID_MODEL_FROM_DATABASE=2nd Generation Core Processor Family DRAM Controller (NP300E5C series laptop)
+
+pci:v00008086d00000104sv000017AAsd000021CF*
+ ID_MODEL_FROM_DATABASE=2nd Generation Core Processor Family DRAM Controller (ThinkPad T520)
+
 pci:v00008086d00000105*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port
 
@@ -61946,6 +63500,9 @@ pci:v00008086d00000116*
 pci:v00008086d00000116sv00001028sd000004DA*
  ID_MODEL_FROM_DATABASE=2nd Generation Core Processor Family Integrated Graphics Controller (Vostro 3750)
 
+pci:v00008086d00000116sv0000144Dsd0000C652*
+ ID_MODEL_FROM_DATABASE=2nd Generation Core Processor Family Integrated Graphics Controller (integrated HD 3000 graphics controller on NP300E5C series laptop)
+
 pci:v00008086d00000122*
  ID_MODEL_FROM_DATABASE=2nd Generation Core Processor Family Integrated Graphics Controller
 
@@ -61955,6 +63512,9 @@ pci:v00008086d00000126*
 pci:v00008086d00000126sv00001028sd000004CC*
  ID_MODEL_FROM_DATABASE=2nd Generation Core Processor Family Integrated Graphics Controller (Vostro 3350)
 
+pci:v00008086d00000126sv000017AAsd000021CF*
+ ID_MODEL_FROM_DATABASE=2nd Generation Core Processor Family Integrated Graphics Controller (ThinkPad T520)
+
 pci:v00008086d00000150*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v2/3rd Gen Core processor DRAM Controller
 
@@ -62387,6 +63947,69 @@ pci:v00008086d00000814*
 pci:v00008086d00000815*
  ID_MODEL_FROM_DATABASE=Moorestown SSP0
 
+pci:v00008086d00000817*
+ ID_MODEL_FROM_DATABASE=Medfield Serial IO I2C Controller #3
+
+pci:v00008086d00000818*
+ ID_MODEL_FROM_DATABASE=Medfield Serial IO I2C Controller #4
+
+pci:v00008086d00000819*
+ ID_MODEL_FROM_DATABASE=Medfield Serial IO I2C Controller #5
+
+pci:v00008086d0000081A*
+ ID_MODEL_FROM_DATABASE=Medfield GPIO Controller [Core]
+
+pci:v00008086d0000081B*
+ ID_MODEL_FROM_DATABASE=Medfield Serial IO HSUART Controller #1
+
+pci:v00008086d0000081C*
+ ID_MODEL_FROM_DATABASE=Medfield Serial IO HSUART Controller #2
+
+pci:v00008086d0000081D*
+ ID_MODEL_FROM_DATABASE=Medfield Serial IO HSUART Controller #3
+
+pci:v00008086d0000081E*
+ ID_MODEL_FROM_DATABASE=Medfield Serial IO HSUART DMA Controller
+
+pci:v00008086d0000081F*
+ ID_MODEL_FROM_DATABASE=Medfield GPIO Controller [AON]
+
+pci:v00008086d00000820*
+ ID_MODEL_FROM_DATABASE=Medfield SD Host Controller
+
+pci:v00008086d00000821*
+ ID_MODEL_FROM_DATABASE=Medfield SDIO Controller #1
+
+pci:v00008086d00000822*
+ ID_MODEL_FROM_DATABASE=Medfield SDIO Controller #2
+
+pci:v00008086d00000823*
+ ID_MODEL_FROM_DATABASE=Medfield eMMC Controller #0
+
+pci:v00008086d00000824*
+ ID_MODEL_FROM_DATABASE=Medfield eMMC Controller #1
+
+pci:v00008086d00000827*
+ ID_MODEL_FROM_DATABASE=Medfield Serial IO DMA Controller
+
+pci:v00008086d00000828*
+ ID_MODEL_FROM_DATABASE=Medfield Power Management Unit
+
+pci:v00008086d00000829*
+ ID_MODEL_FROM_DATABASE=Medfield USB Device Controller (OTG)
+
+pci:v00008086d0000082A*
+ ID_MODEL_FROM_DATABASE=Medfield SCU IPC
+
+pci:v00008086d0000082C*
+ ID_MODEL_FROM_DATABASE=Medfield Serial IO I2C Controller #0
+
+pci:v00008086d0000082D*
+ ID_MODEL_FROM_DATABASE=Medfield Serial IO I2C Controller #1
+
+pci:v00008086d0000082E*
+ ID_MODEL_FROM_DATABASE=Medfield Serial IO I2C Controller #2
+
 pci:v00008086d00000885*
  ID_MODEL_FROM_DATABASE=Centrino Wireless-N + WiMAX 6150
 
@@ -63032,6 +64655,9 @@ pci:v00008086d00000A2A*
 pci:v00008086d00000A2E*
  ID_MODEL_FROM_DATABASE=Haswell-ULT Integrated Graphics Controller
 
+pci:v00008086d00000A53*
+ ID_MODEL_FROM_DATABASE=DC P3520 SSD
+
 pci:v00008086d00000BE0*
  ID_MODEL_FROM_DATABASE=Atom Processor D2xxx/N2xxx Integrated Graphics Controller
 
@@ -64104,7 +65730,7 @@ pci:v00008086d00001019sv00008086sd00003025*
  ID_MODEL_FROM_DATABASE=82547EI Gigabit Ethernet Controller (D875PBZ motherboard)
 
 pci:v00008086d00001019sv00008086sd0000302C*
- ID_MODEL_FROM_DATABASE=82547EI Gigabit Ethernet Controller (Intel 82865G Mainboard (D865GBF))
+ ID_MODEL_FROM_DATABASE=82547EI Gigabit Ethernet Controller (D865GBF Mainboard)
 
 pci:v00008086d00001019sv00008086sd00003427*
  ID_MODEL_FROM_DATABASE=82547EI Gigabit Ethernet Controller (S875WP1-E mainboard)
@@ -64457,6 +66083,9 @@ pci:v00008086d00001067*
 pci:v00008086d00001068*
  ID_MODEL_FROM_DATABASE=82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller Mobile
 
+pci:v00008086d00001068sv0000103Csd000030D5*
+ ID_MODEL_FROM_DATABASE=82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller Mobile (530 Laptop)
+
 pci:v00008086d00001069*
  ID_MODEL_FROM_DATABASE=82562EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller Mobile
 
@@ -64695,7 +66324,7 @@ pci:v00008086d00001096sv000015D9sd00008680*
  ID_MODEL_FROM_DATABASE=80003ES2LAN Gigabit Ethernet Controller (Copper) (X7DVL-E-O motherboard)
 
 pci:v00008086d00001096sv00008086sd00003476*
- ID_MODEL_FROM_DATABASE=80003ES2LAN Gigabit Ethernet Controller (Copper) (Intel S5000PSLSATA Server Board)
+ ID_MODEL_FROM_DATABASE=80003ES2LAN Gigabit Ethernet Controller (Copper) (S5000PSLSATA Server Board)
 
 pci:v00008086d00001097*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB DPT LAN Controller (Fiber)
@@ -64826,6 +66455,9 @@ pci:v00008086d000010BB*
 pci:v00008086d000010BC*
  ID_MODEL_FROM_DATABASE=82571EB Gigabit Ethernet Controller (Copper)
 
+pci:v00008086d000010BCsv00001014sd00000368*
+ ID_MODEL_FROM_DATABASE=82571EB Gigabit Ethernet Controller (Copper) (4-Port 10/100/1000 Base-TX PCI Express Adapter for POWER)
+
 pci:v00008086d000010BCsv0000103Csd0000704B*
  ID_MODEL_FROM_DATABASE=82571EB Gigabit Ethernet Controller (Copper) (NC364T PCI Express Quad Port Gigabit Server Adapter)
 
@@ -65156,6 +66788,9 @@ pci:v00008086d000010F8sv0000103Csd000018D0*
 pci:v00008086d000010F8sv00001059sd00000111*
  ID_MODEL_FROM_DATABASE=82599 10 Gigabit Dual Port Backplane Connection (T4007 10GbE interface)
 
+pci:v00008086d000010F8sv00001059sd00000130*
+ ID_MODEL_FROM_DATABASE=82599 10 Gigabit Dual Port Backplane Connection (T4009 10GbE interface)
+
 pci:v00008086d000010F8sv00008086sd0000000C*
  ID_MODEL_FROM_DATABASE=82599 10 Gigabit Dual Port Backplane Connection (Ethernet X520 10GbE Dual Port KX4-KR Mezz)
 
@@ -65189,6 +66824,9 @@ pci:v00008086d000010FBsv0000103Csd00002159*
 pci:v00008086d000010FBsv0000108Esd00007B11*
  ID_MODEL_FROM_DATABASE=82599ES 10-Gigabit SFI/SFP+ Network Connection (Ethernet Server Adapter X520-2)
 
+pci:v00008086d000010FBsv00001170sd0000004C*
+ ID_MODEL_FROM_DATABASE=82599ES 10-Gigabit SFI/SFP+ Network Connection (82599 DP 10G Mezzanine Adapter)
+
 pci:v00008086d000010FBsv00001734sd000011A9*
  ID_MODEL_FROM_DATABASE=82599ES 10-Gigabit SFI/SFP+ Network Connection (10 Gigabit Dual Port Network Connection)
 
@@ -65201,6 +66839,21 @@ pci:v00008086d000010FBsv000017AAsd00004007*
 pci:v00008086d000010FBsv000017AAsd0000402B*
  ID_MODEL_FROM_DATABASE=82599ES 10-Gigabit SFI/SFP+ Network Connection (82599ES 10Gb 2-port Server Adapter X520-DA2)
 
+pci:v00008086d000010FBsv000017AAsd0000402F*
+ ID_MODEL_FROM_DATABASE=82599ES 10-Gigabit SFI/SFP+ Network Connection (FPGA Card XC7VX690T-3FFG1157E)
+
+pci:v00008086d000010FBsv000018D4sd00000C09*
+ ID_MODEL_FROM_DATABASE=82599ES 10-Gigabit SFI/SFP+ Network Connection (82599ES 10Gb 2-port SFP+ OCP Mezz Card MOP81-I-10GS2)
+
+pci:v00008086d000010FBsv00001BD4sd0000001B*
+ ID_MODEL_FROM_DATABASE=82599ES 10-Gigabit SFI/SFP+ Network Connection (10G SFP+ DP ER102Fi4 Rack Adapter)
+
+pci:v00008086d000010FBsv00001BD4sd0000002F*
+ ID_MODEL_FROM_DATABASE=82599ES 10-Gigabit SFI/SFP+ Network Connection (10G SFP+ DP EP102Fi4A Adapter)
+
+pci:v00008086d000010FBsv00001BD4sd00000032*
+ ID_MODEL_FROM_DATABASE=82599ES 10-Gigabit SFI/SFP+ Network Connection (10G SFP+ DP EP102Fi4 Adapter)
+
 pci:v00008086d000010FBsv00008086sd00000002*
  ID_MODEL_FROM_DATABASE=82599ES 10-Gigabit SFI/SFP+ Network Connection (Ethernet Server Adapter X520-DA2)
 
@@ -65219,6 +66872,9 @@ pci:v00008086d000010FBsv00008086sd0000000A*
 pci:v00008086d000010FBsv00008086sd0000000C*
  ID_MODEL_FROM_DATABASE=82599ES 10-Gigabit SFI/SFP+ Network Connection (Ethernet Server Adapter X520-2)
 
+pci:v00008086d000010FBsv00008086sd000010A6*
+ ID_MODEL_FROM_DATABASE=82599ES 10-Gigabit SFI/SFP+ Network Connection (82599ES 10Gb 2 port Server Adapter X520-DA2)
+
 pci:v00008086d000010FBsv00008086sd00007A11*
  ID_MODEL_FROM_DATABASE=82599ES 10-Gigabit SFI/SFP+ Network Connection (Ethernet Server Adapter X520-2)
 
@@ -65285,6 +66941,42 @@ pci:v00008086d00001161sv00008086sd00001161*
 pci:v00008086d00001162*
  ID_MODEL_FROM_DATABASE=Xscale 80200 Big Endian Companion Chip
 
+pci:v00008086d00001190*
+ ID_MODEL_FROM_DATABASE=Merrifield SD/SDIO/eMMC Controller
+
+pci:v00008086d00001191*
+ ID_MODEL_FROM_DATABASE=Merrifield Serial IO HSUART Controller
+
+pci:v00008086d00001192*
+ ID_MODEL_FROM_DATABASE=Merrifield Serial IO HSUART DMA Controller
+
+pci:v00008086d00001194*
+ ID_MODEL_FROM_DATABASE=Merrifield Serial IO SPI Controller
+
+pci:v00008086d00001195*
+ ID_MODEL_FROM_DATABASE=Merrifield Serial IO I2C Controller
+
+pci:v00008086d00001196*
+ ID_MODEL_FROM_DATABASE=Merrifield Serial IO I2C Controller
+
+pci:v00008086d00001199*
+ ID_MODEL_FROM_DATABASE=Merrifield GPIO Controller
+
+pci:v00008086d0000119E*
+ ID_MODEL_FROM_DATABASE=Merrifield USB Device Controller (OTG)
+
+pci:v00008086d000011A0*
+ ID_MODEL_FROM_DATABASE=Merrifield SCU IPC
+
+pci:v00008086d000011A1*
+ ID_MODEL_FROM_DATABASE=Merrifield Power Management Unit
+
+pci:v00008086d000011A2*
+ ID_MODEL_FROM_DATABASE=Merrifield Serial IO DMA Controller
+
+pci:v00008086d000011A5*
+ ID_MODEL_FROM_DATABASE=Merrifield Serial IO PWM Controller
+
 pci:v00008086d00001200*
  ID_MODEL_FROM_DATABASE=IXP1200 Network Processor
 
@@ -65898,13 +67590,16 @@ pci:v00008086d00001501*
  ID_MODEL_FROM_DATABASE=82567V-3 Gigabit Network Connection
 
 pci:v00008086d00001502*
- ID_MODEL_FROM_DATABASE=82579LM Gigabit Network Connection
+ ID_MODEL_FROM_DATABASE=82579LM Gigabit Network Connection (Lewisville)
 
 pci:v00008086d00001502sv00001028sd000004A3*
- ID_MODEL_FROM_DATABASE=82579LM Gigabit Network Connection (Precision M4600)
+ ID_MODEL_FROM_DATABASE=82579LM Gigabit Network Connection (Lewisville) (Precision M4600)
+
+pci:v00008086d00001502sv000017AAsd000021CE*
+ ID_MODEL_FROM_DATABASE=82579LM Gigabit Network Connection (Lewisville) (ThinkPad T520)
 
 pci:v00008086d00001502sv00008086sd0000357A*
- ID_MODEL_FROM_DATABASE=82579LM Gigabit Network Connection (Server Board S1200BTS)
+ ID_MODEL_FROM_DATABASE=82579LM Gigabit Network Connection (Lewisville) (Server Board S1200BTS)
 
 pci:v00008086d00001503*
  ID_MODEL_FROM_DATABASE=82579V Gigabit Network Connection
@@ -66014,12 +67709,33 @@ pci:v00008086d00001521*
 pci:v00008086d00001521sv00001028sd00000602*
  ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (Gigabit 2P I350-t LOM)
 
+pci:v00008086d00001521sv00001028sd00000693*
+ ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (Gigabit 2P I350-t LOM)
+
+pci:v00008086d00001521sv00001028sd000006E2*
+ ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (Gigabit 2P I350-t LOM)
+
+pci:v00008086d00001521sv00001028sd00000757*
+ ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (Gigabit I350-t LOM)
+
+pci:v00008086d00001521sv00001028sd0000075A*
+ ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (Gigabit I350-t LOM)
+
 pci:v00008086d00001521sv00001028sd00001F60*
  ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (Gigabit 4P I350-t rNDC)
 
 pci:v00008086d00001521sv00001028sd00001F62*
  ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (Gigabit 4P X540/I350 rNDC)
 
+pci:v00008086d00001521sv00001028sd00001FA8*
+ ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (Ethernet 10G 4P X550/I350 rNDC)
+
+pci:v00008086d00001521sv00001028sd00001FA9*
+ ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (Ethernet 10G 4P X550 rNDC)
+
+pci:v00008086d00001521sv00001028sd00001FAA*
+ ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (Gigabit 4P X550/I350 rNDC)
+
 pci:v00008086d00001521sv00001028sd0000FF9A*
  ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (Gigabit 4P X710/I350 rNDC)
 
@@ -66074,6 +67790,15 @@ pci:v00008086d00001521sv000017AAsd00001074*
 pci:v00008086d00001521sv000017AAsd00004005*
  ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection
 
+pci:v00008086d00001521sv000018D4sd00000C07*
+ ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (I350 1Gb 2-port RJ45 OCP Mezz Card MOP41-I-1GT2)
+
+pci:v00008086d00001521sv00001BD4sd0000001D*
+ ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (1G base-T QP EP014Ti1 Adapter)
+
+pci:v00008086d00001521sv00001BD4sd00000035*
+ ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (1G base-T QP EP014Ti1 Adapter)
+
 pci:v00008086d00001521sv00008086sd00000001*
  ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (Ethernet Server Adapter I350-T4)
 
@@ -66203,6 +67928,15 @@ pci:v00008086d00001528sv000017AAsd00001073*
 pci:v00008086d00001528sv000017AAsd00004006*
  ID_MODEL_FROM_DATABASE=Ethernet Controller 10-Gigabit X540-AT2
 
+pci:v00008086d00001528sv00001BD4sd0000001A*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller 10-Gigabit X540-AT2 (10G base-T DP ER102Ti3 Rack Adapter)
+
+pci:v00008086d00001528sv00001BD4sd00000033*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller 10-Gigabit X540-AT2 (10G base-T DP EP102Ti3 Adapter)
+
+pci:v00008086d00001528sv00001BD4sd00000034*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller 10-Gigabit X540-AT2 (10G base-T DP EP102Ti3A Adapter)
+
 pci:v00008086d00001528sv00008086sd00000001*
  ID_MODEL_FROM_DATABASE=Ethernet Controller 10-Gigabit X540-AT2 (Ethernet Converged Network Adapter X540-T2)
 
@@ -66230,6 +67964,15 @@ pci:v00008086d00001529*
 pci:v00008086d0000152A*
  ID_MODEL_FROM_DATABASE=82599 10 Gigabit Dual Port Backplane Connection with FCoE
 
+pci:v00008086d0000152E*
+ ID_MODEL_FROM_DATABASE=82599 Virtual Function
+
+pci:v00008086d0000152F*
+ ID_MODEL_FROM_DATABASE=I350 Virtual Function
+
+pci:v00008086d00001530*
+ ID_MODEL_FROM_DATABASE=X540 Virtual Function
+
 pci:v00008086d00001533*
  ID_MODEL_FROM_DATABASE=I210 Gigabit Network Connection
 
@@ -66269,6 +68012,15 @@ pci:v00008086d00001537sv00001059sd00000111*
 pci:v00008086d00001537sv00001059sd00000120*
  ID_MODEL_FROM_DATABASE=I210 Gigabit Backplane Connection (T4008 1GbE interface)
 
+pci:v00008086d00001537sv00001059sd00000130*
+ ID_MODEL_FROM_DATABASE=I210 Gigabit Backplane Connection (T4009 1GbE interface)
+
+pci:v00008086d00001537sv00001059sd00000140*
+ ID_MODEL_FROM_DATABASE=I210 Gigabit Backplane Connection (T2035 1GbE interface)
+
+pci:v00008086d00001537sv00001059sd00000150*
+ ID_MODEL_FROM_DATABASE=I210 Gigabit Backplane Connection (RD-01068 1GbE interface)
+
 pci:v00008086d00001538*
  ID_MODEL_FROM_DATABASE=I210 Gigabit Network Connection
 
@@ -66323,6 +68075,12 @@ pci:v00008086d00001557*
 pci:v00008086d00001557sv000017AAsd00004008*
  ID_MODEL_FROM_DATABASE=82599 10 Gigabit Network Connection (82599EN 10 Gigabit Network Connection)
 
+pci:v00008086d00001557sv00001BD4sd0000001C*
+ ID_MODEL_FROM_DATABASE=82599 10 Gigabit Network Connection (10G SFP+ SP ER101Fi4 Rack Adapter)
+
+pci:v00008086d00001557sv00001BD4sd00000030*
+ ID_MODEL_FROM_DATABASE=82599 10 Gigabit Network Connection (10G SFP+ SP EP101Fi4A Adapter)
+
 pci:v00008086d00001557sv00008086sd00000001*
  ID_MODEL_FROM_DATABASE=82599 10 Gigabit Network Connection (Ethernet OCP Server Adapter X520-1)
 
@@ -66365,15 +68123,39 @@ pci:v00008086d00001560*
 pci:v00008086d00001563*
  ID_MODEL_FROM_DATABASE=Ethernet Controller 10G X550T
 
+pci:v00008086d00001563sv00001028sd00001FA8*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller 10G X550T (Ethernet 10G 4P X550/I350 rNDC)
+
+pci:v00008086d00001563sv00001028sd00001FA9*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller 10G X550T (Ethernet 10G 4P X550 rNDC)
+
+pci:v00008086d00001563sv00001590sd000000D1*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller 10G X550T (Ethernet 10Gb 2-port 562T Adapter)
+
+pci:v00008086d00001563sv00001590sd000000D2*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller 10G X550T (Ethernet 10Gb 2-port 562FLR-T Adapter)
+
+pci:v00008086d00001563sv000018D4sd00000C08*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller 10G X550T (X550 10Gb 2-port RJ45 OCP Mezz Card MOP81-I-10GT2)
+
 pci:v00008086d00001563sv00008086sd00000001*
  ID_MODEL_FROM_DATABASE=Ethernet Controller 10G X550T (Ethernet Converged Network Adapter X550-T2)
 
 pci:v00008086d00001563sv00008086sd0000001A*
  ID_MODEL_FROM_DATABASE=Ethernet Controller 10G X550T (Ethernet Converged Network Adapter X550-T2)
 
+pci:v00008086d00001563sv00008086sd0000001B*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller 10G X550T (Ethernet Server Adapter X550-T2 for OCP)
+
+pci:v00008086d00001563sv00008086sd0000001D*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller 10G X550T (Ethernet 10G 2P X550-t Adapter)
+
 pci:v00008086d00001563sv00008086sd00000022*
  ID_MODEL_FROM_DATABASE=Ethernet Controller 10G X550T (Ethernet Converged Network Adapter X550-T2)
 
+pci:v00008086d00001564*
+ ID_MODEL_FROM_DATABASE=X550 Virtual Function
+
 pci:v00008086d00001565*
  ID_MODEL_FROM_DATABASE=X550 Virtual Function
 
@@ -66426,16 +68208,28 @@ pci:v00008086d00001572sv0000103Csd00000000*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet 10Gb 562SFP+ Adapter)
 
 pci:v00008086d00001572sv0000103Csd000022FC*
- ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (HP Ethernet 10Gb 2-port 562FLR-SFP+ Adapter)
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (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)
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet 10Gb 2-port 562SFP+ Adapter)
 
 pci:v00008086d00001572sv00001137sd00000000*
- ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Converged NIC X710-4)
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Converged NIC X710-DA)
 
 pci:v00008086d00001572sv00001137sd0000013B*
- ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Converged NIC X710-4)
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Converged NIC X710-DA4)
+
+pci:v00008086d00001572sv00001137sd0000020A*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Converged NIC X710-DA2)
+
+pci:v00008086d00001572sv00001590sd00000000*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+
+
+pci:v00008086d00001572sv00001590sd00000225*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet 10GbE 4P 563SFP+ Adapter)
+
+pci:v00008086d00001572sv00001590sd0000022F*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet 10Gb 2-port 564i Communication Board)
 
 pci:v00008086d00001572sv000017AAsd00000000*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (ThinkServer X710 AnyFabric for 10GbE SFP+)
@@ -66482,15 +68276,21 @@ pci:v00008086d00001572sv00008086sd0000000B*
 pci:v00008086d00001572sv00008086sd0000000D*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+
 
+pci:v00008086d00001572sv00008086sd0000000E*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Server Adapter OCP X710-2)
+
 pci:v00008086d00001572sv00008086sd00000010*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Converged Network Adapter X710)
 
 pci:v00008086d00001572sv00008086sd00004005*
- ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Controller XL710 for 10 Gigabit SFP+)
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+
 
 pci:v00008086d00001572sv00008086sd00004006*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+
 
+pci:v00008086d00001572sv00008086sd00004007*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+
+
 pci:v00008086d00001575*
  ID_MODEL_FROM_DATABASE=DSL6340 Thunderbolt 3 NHI [Alpine Ridge 2C 2015]
 
@@ -66530,6 +68330,9 @@ pci:v00008086d00001581sv00001028sd00001F98*
 pci:v00008086d00001581sv00001028sd00001F9E*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE backplane (Ethernet 10G 2P X710-k bNDC)
 
+pci:v00008086d00001581sv00001059sd00000150*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE backplane (RD-01068 10GbE-KR interface)
+
 pci:v00008086d00001581sv00001590sd00000000*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE backplane (Ethernet 2-port 563i Adapter)
 
@@ -66612,19 +68415,19 @@ 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)
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 20GbE backplane (Ethernet 10/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)
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 20GbE backplane (Ethernet 10/20Gb 2-port 660FLB 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)
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 20GbE backplane (Ethernet 10/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)
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XL710 for 20GbE backplane (Ethernet 10/20Gb 2-port 660M Adapter)
 
 pci:v00008086d00001589*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710/X557-AT 10GBASE-T
@@ -66644,9 +68447,51 @@ pci:v00008086d00001589sv00008086sd00000001*
 pci:v00008086d00001589sv00008086sd00000002*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710/X557-AT 10GBASE-T (Ethernet Converged Network Adapter X710-T4)
 
+pci:v00008086d00001589sv00008086sd00000003*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710/X557-AT 10GBASE-T (Ethernet Converged Network Adapter X710-T)
+
+pci:v00008086d00001589sv00008086sd000000A0*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710/X557-AT 10GBASE-T (Ethernet Converged Network Adapter X710-T4)
+
 pci:v00008086d00001589sv00008086sd00001003*
  ID_MODEL_FROM_DATABASE=Ethernet Controller X710/X557-AT 10GBASE-T (Ethernet Converged Network Adapter X710-T)
 
+pci:v00008086d0000158A*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE backplane
+
+pci:v00008086d0000158B*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28
+
+pci:v00008086d0000158Bsv00008086sd00000000*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet Network Adapter XXV710)
+
+pci:v00008086d0000158Bsv00008086sd00000001*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet Network Adapter XXV710-2)
+
+pci:v00008086d0000158Bsv00008086sd00000002*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet Network Adapter XXV710-2)
+
+pci:v00008086d0000158Bsv00008086sd00000003*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet Network Adapter XXV710-1)
+
+pci:v00008086d0000158Bsv00008086sd00000004*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet Network Adapter XXV710-1)
+
+pci:v00008086d0000158Bsv00008086sd00000005*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet Network Adapter OCP XXV710-2)
+
+pci:v00008086d0000158Bsv00008086sd00000006*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet Network Adapter OCP XXV710-2)
+
+pci:v00008086d0000158Bsv00008086sd00000007*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet Network Adapter OCP XXV710-1)
+
+pci:v00008086d0000158Bsv00008086sd00000008*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet Network Adapter OCP XXV710-1)
+
+pci:v00008086d0000158Bsv00008086sd00004001*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller XXV710 for 25GbE SFP28 (Ethernet Network Adapter XXV710-2)
+
 pci:v00008086d000015A0*
  ID_MODEL_FROM_DATABASE=Ethernet Connection (2) I218-LM
 
@@ -66668,12 +68513,18 @@ pci:v00008086d000015A5*
 pci:v00008086d000015A8*
  ID_MODEL_FROM_DATABASE=Ethernet Connection X552 Virtual Function
 
+pci:v00008086d000015A9*
+ ID_MODEL_FROM_DATABASE=X552 Virtual Function
+
 pci:v00008086d000015AA*
  ID_MODEL_FROM_DATABASE=Ethernet Connection X552 10 GbE Backplane
 
 pci:v00008086d000015AAsv00001059sd00000120*
  ID_MODEL_FROM_DATABASE=Ethernet Connection X552 10 GbE Backplane (T4008 10GbE interface)
 
+pci:v00008086d000015AAsv00001059sd00000150*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X552 10 GbE Backplane (RD-01068 10GbE interface)
+
 pci:v00008086d000015AB*
  ID_MODEL_FROM_DATABASE=Ethernet Connection X552 10 GbE Backplane
 
@@ -66686,6 +68537,12 @@ pci:v00008086d000015AD*
 pci:v00008086d000015AE*
  ID_MODEL_FROM_DATABASE=Ethernet Connection X552 1000BASE-T
 
+pci:v00008086d000015B0*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X552 Backplane
+
+pci:v00008086d000015B4*
+ ID_MODEL_FROM_DATABASE=X553 Virtual Function
+
 pci:v00008086d000015B5*
  ID_MODEL_FROM_DATABASE=DSL6340 USB 3.1 Controller [Alpine Ridge]
 
@@ -66701,12 +68558,48 @@ pci:v00008086d000015B8*
 pci:v00008086d000015B9*
  ID_MODEL_FROM_DATABASE=Ethernet Connection (3) I219-LM
 
+pci:v00008086d000015BB*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (7) I219-LM
+
+pci:v00008086d000015BC*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (7) I219-V
+
+pci:v00008086d000015BD*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (6) I219-LM
+
+pci:v00008086d000015BE*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (6) I219-V
+
 pci:v00008086d000015BF*
  ID_MODEL_FROM_DATABASE=JHL6240 Thunderbolt 3 NHI (Low Power) [Alpine Ridge LP 2016]
 
 pci:v00008086d000015C0*
  ID_MODEL_FROM_DATABASE=JHL6240 Thunderbolt 3 Bridge (Low Power) [Alpine Ridge LP 2016]
 
+pci:v00008086d000015C2*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X553 Backplane
+
+pci:v00008086d000015C3*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X553 Backplane
+
+pci:v00008086d000015C4*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X553 10 GbE SFP+
+
+pci:v00008086d000015C5*
+ ID_MODEL_FROM_DATABASE=X553 Virtual Function
+
+pci:v00008086d000015C6*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X553 1GbE
+
+pci:v00008086d000015C7*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X553 1GbE
+
+pci:v00008086d000015C8*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X553/X557-AT 10GBASE-T
+
+pci:v00008086d000015CE*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X553 10 GbE SFP+
+
 pci:v00008086d000015D0*
  ID_MODEL_FROM_DATABASE=Ethernet SDI Adapter FM10420-100GbE-QDA2
 
@@ -66716,6 +68609,9 @@ pci:v00008086d000015D1*
 pci:v00008086d000015D1sv00008086sd00000002*
  ID_MODEL_FROM_DATABASE=Ethernet Controller 10G X550T (Ethernet Converged Network Adapter X550-T1)
 
+pci:v00008086d000015D1sv00008086sd0000001B*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller 10G X550T (Ethernet Server Adapter X550-T1 for OCP)
+
 pci:v00008086d000015D1sv00008086sd00000021*
  ID_MODEL_FROM_DATABASE=Ethernet Controller 10G X550T (Ethernet Converged Network Adapter X550-T1)
 
@@ -66728,6 +68624,9 @@ pci:v00008086d000015D2*
 pci:v00008086d000015D3*
  ID_MODEL_FROM_DATABASE=JHL6540 Thunderbolt 3 Bridge (C step) [Alpine Ridge 4C 2016]
 
+pci:v00008086d000015D4*
+ ID_MODEL_FROM_DATABASE=JHL6540 Thunderbolt 3 USB Controller (C step) [Alpine Ridge 4C 2016]
+
 pci:v00008086d000015D5*
  ID_MODEL_FROM_DATABASE=Ethernet SDI Adapter FM10420-25GbE-DA2
 
@@ -66743,15 +68642,36 @@ pci:v00008086d000015D7*
 pci:v00008086d000015D8*
  ID_MODEL_FROM_DATABASE=Ethernet Connection (4) I219-V
 
+pci:v00008086d000015D8sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (4) I219-V (ThinkPad X1 Carbon 5th Gen)
+
 pci:v00008086d000015D9*
  ID_MODEL_FROM_DATABASE=JHL6340 Thunderbolt 3 NHI (C step) [Alpine Ridge 2C 2016]
 
 pci:v00008086d000015DA*
  ID_MODEL_FROM_DATABASE=JHL6340 Thunderbolt 3 Bridge (C step) [Alpine Ridge 2C 2016]
 
+pci:v00008086d000015DF*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (8) I219-LM
+
+pci:v00008086d000015E0*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (8) I219-V
+
+pci:v00008086d000015E1*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (9) I219-LM
+
+pci:v00008086d000015E2*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (9) I219-V
+
 pci:v00008086d000015E3*
  ID_MODEL_FROM_DATABASE=Ethernet Connection (5) I219-LM
 
+pci:v00008086d000015E4*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X553 1GbE
+
+pci:v00008086d000015E5*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X553 1GbE
+
 pci:v00008086d00001600*
  ID_MODEL_FROM_DATABASE=Broadwell-U Host Bridge -OPI
 
@@ -66866,6 +68786,9 @@ pci:v00008086d0000163D*
 pci:v00008086d0000163E*
  ID_MODEL_FROM_DATABASE=Broadwell-U Integrated Graphics
 
+pci:v00008086d00001889*
+ ID_MODEL_FROM_DATABASE=Ethernet Adaptive Virtual Function
+
 pci:v00008086d00001900*
  ID_MODEL_FROM_DATABASE=Skylake Host Bridge/DRAM Registers
 
@@ -66884,12 +68807,18 @@ pci:v00008086d00001904*
 pci:v00008086d00001904sv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=Skylake Host Bridge/DRAM Registers (Latitude 3570)
 
+pci:v00008086d00001904sv000017AAsd0000382A*
+ ID_MODEL_FROM_DATABASE=Skylake Host Bridge/DRAM Registers (B51-80 Laptop)
+
 pci:v00008086d00001905*
  ID_MODEL_FROM_DATABASE=Skylake PCIe Controller (x8)
 
 pci:v00008086d00001906*
  ID_MODEL_FROM_DATABASE=HD Graphics 510
 
+pci:v00008086d00001906sv000017AAsd0000382A*
+ ID_MODEL_FROM_DATABASE=HD Graphics 510 (B51-80 Laptop)
+
 pci:v00008086d00001908*
  ID_MODEL_FROM_DATABASE=Skylake Host Bridge/DRAM Registers
 
@@ -66908,6 +68837,9 @@ pci:v00008086d00001910*
 pci:v00008086d00001911*
  ID_MODEL_FROM_DATABASE=Skylake Gaussian Mixture Model
 
+pci:v00008086d00001911sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Skylake Gaussian Mixture Model (ThinkPad X1 Carbon 5th Gen)
+
 pci:v00008086d00001912*
  ID_MODEL_FROM_DATABASE=HD Graphics 530
 
@@ -67043,9 +68975,78 @@ pci:v00008086d00001962*
 pci:v00008086d00001962sv0000105Asd00000000*
  ID_MODEL_FROM_DATABASE=80960RM (i960RM) Microprocessor (SuperTrak SX6000 I2O CPU)
 
+pci:v00008086d000019AC*
+ ID_MODEL_FROM_DATABASE=DNV SMBus Contoller - Host
+
+pci:v00008086d000019B0*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 0
+
+pci:v00008086d000019B1*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 0
+
+pci:v00008086d000019B2*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 0
+
+pci:v00008086d000019B3*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 0
+
+pci:v00008086d000019B4*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 0
+
+pci:v00008086d000019B5*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 0
+
+pci:v00008086d000019B6*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 0
+
+pci:v00008086d000019B7*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 0
+
+pci:v00008086d000019BE*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 0
+
+pci:v00008086d000019BF*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 0
+
+pci:v00008086d000019C0*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 1
+
+pci:v00008086d000019C1*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 1
+
+pci:v00008086d000019C2*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 1
+
+pci:v00008086d000019C3*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 1
+
+pci:v00008086d000019C4*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 1
+
+pci:v00008086d000019C5*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 1
+
+pci:v00008086d000019C6*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 1
+
+pci:v00008086d000019C7*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 1
+
+pci:v00008086d000019CE*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 1
+
+pci:v00008086d000019CF*
+ ID_MODEL_FROM_DATABASE=DNV SATA Controller 1
+
+pci:v00008086d000019DC*
+ ID_MODEL_FROM_DATABASE=DNV LPC or eSPI
+
 pci:v00008086d000019DF*
  ID_MODEL_FROM_DATABASE=DNV SMBus controller
 
+pci:v00008086d000019E0*
+ ID_MODEL_FROM_DATABASE=DNV SPI Controller
+
 pci:v00008086d00001A21*
  ID_MODEL_FROM_DATABASE=82840 840 [Carmel] Chipset Host Bridge (Hub A)
 
@@ -67077,7 +69078,7 @@ pci:v00008086d00001A38sv000015D9sd00008680*
  ID_MODEL_FROM_DATABASE=5000 Series Chipset DMA Engine (X7DVL-E-O motherboard)
 
 pci:v00008086d00001A38sv00008086sd00003476*
- ID_MODEL_FROM_DATABASE=5000 Series Chipset DMA Engine (Intel S5000PSLSATA Server Board)
+ ID_MODEL_FROM_DATABASE=5000 Series Chipset DMA Engine (S5000PSLSATA Server Board)
 
 pci:v00008086d00001A48*
  ID_MODEL_FROM_DATABASE=82597EX 10GbE Ethernet Controller
@@ -67098,52 +69099,58 @@ pci:v00008086d00001B48sv00008086sd0000A11F*
  ID_MODEL_FROM_DATABASE=82597EX 10GbE Ethernet Controller (PRO/10GbE LR Server Adapter)
 
 pci:v00008086d00001C00*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 4 port SATA IDE Controller
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family Desktop SATA Controller (IDE mode, ports 0-3)
 
 pci:v00008086d00001C01*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 4 port SATA IDE Controller
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family Mobile SATA Controller (IDE mode, ports 0-3)
 
 pci:v00008086d00001C02*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family SATA AHCI Controller
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 6 port Desktop SATA AHCI Controller
 
 pci:v00008086d00001C02sv00001028sd000004AA*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family SATA AHCI Controller (XPS 8300)
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 6 port Desktop SATA AHCI Controller (XPS 8300)
 
 pci:v00008086d00001C02sv00001043sd0000844D*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family SATA AHCI Controller (P8 series motherboard)
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 6 port Desktop SATA AHCI Controller (P8 series motherboard)
 
 pci:v00008086d00001C02sv00008086sd00007270*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family SATA AHCI Controller (Server Board S1200BTS)
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 6 port Desktop SATA AHCI Controller (Server Board S1200BTS)
 
 pci:v00008086d00001C03*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 6 port Mobile SATA AHCI Controller
 
 pci:v00008086d00001C03sv00001028sd000004A3*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller (Precision M4600)
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 6 port Mobile SATA AHCI Controller (Precision M4600)
 
 pci:v00008086d00001C03sv00001028sd000004B2*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller (Vostro 3350)
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 6 port Mobile SATA AHCI Controller (Vostro 3350)
 
 pci:v00008086d00001C03sv00001028sd000004DA*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller (Vostro 3750)
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 6 port Mobile SATA AHCI Controller (Vostro 3750)
+
+pci:v00008086d00001C03sv000017AAsd000021CF*
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 6 port Mobile SATA AHCI Controller (ThinkPad T520)
 
 pci:v00008086d00001C03sv00008086sd00007270*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller (Apple MacBookPro8,2 [Core i7, 15", 2011])
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 6 port Mobile SATA AHCI Controller (Apple MacBookPro8,2 [Core i7, 15", 2011])
 
 pci:v00008086d00001C04*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family SATA RAID Controller
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Desktop SATA RAID Controller
 
 pci:v00008086d00001C04sv0000103Csd00003118*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family SATA RAID Controller (Smart Array B110i SATA RAID Controller)
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Desktop SATA RAID Controller (Smart Array B110i SATA RAID Controller)
 
 pci:v00008086d00001C05*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family SATA RAID Controller
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Mobile SATA RAID Controller
+
+pci:v00008086d00001C06*
+ ID_MODEL_FROM_DATABASE=Z68 Express Chipset SATA RAID Controller
 
 pci:v00008086d00001C08*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 2 port SATA IDE Controller
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family Desktop SATA Controller (IDE mode, ports 4-5)
 
 pci:v00008086d00001C09*
- ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family 2 port SATA IDE Controller
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family Mobile SATA Controller (IDE mode, ports 4-5)
 
 pci:v00008086d00001C10*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family PCI Express Root Port 1
@@ -67157,6 +69164,9 @@ pci:v00008086d00001C10sv00001028sd000004DA*
 pci:v00008086d00001C10sv00001043sd0000844D*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family PCI Express Root Port 1 (P8 series motherboard)
 
+pci:v00008086d00001C10sv000017AAsd000021CF*
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family PCI Express Root Port 1 (ThinkPad T520)
+
 pci:v00008086d00001C10sv00008086sd00007270*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family PCI Express Root Port 1 (Server Board S1200BTS / Apple MacBook Pro 8,1/8,2)
 
@@ -67166,6 +69176,9 @@ pci:v00008086d00001C12*
 pci:v00008086d00001C12sv00001028sd000004AA*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family PCI Express Root Port 2 (XPS 8300)
 
+pci:v00008086d00001C12sv000017AAsd000021CF*
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family PCI Express Root Port 2 (ThinkPad T520)
+
 pci:v00008086d00001C12sv00008086sd00007270*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family PCI Express Root Port 2 (Apple MacBookPro8,2 [Core i7, 15", 2011])
 
@@ -67184,12 +69197,18 @@ pci:v00008086d00001C16*
 pci:v00008086d00001C16sv00001028sd000004AA*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family PCI Express Root Port 4 (XPS 8300)
 
+pci:v00008086d00001C16sv000017AAsd000021CF*
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family PCI Express Root Port 4 (ThinkPad T520)
+
 pci:v00008086d00001C18*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family PCI Express Root Port 5
 
 pci:v00008086d00001C18sv00001028sd000004DA*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family PCI Express Root Port 5 (Vostro 3750)
 
+pci:v00008086d00001C18sv000017AAsd000021CF*
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family PCI Express Root Port 5 (ThinkPad T520)
+
 pci:v00008086d00001C18sv00008086sd00007270*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family PCI Express Root Port 5 (Server Board S1200BTS)
 
@@ -67235,6 +69254,9 @@ pci:v00008086d00001C20sv00001043sd00008418*
 pci:v00008086d00001C20sv00001043sd0000841B*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family High Definition Audio Controller (P8H67 Series Motherboard)
 
+pci:v00008086d00001C20sv000017AAsd000021CF*
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family High Definition Audio Controller (ThinkPad T520)
+
 pci:v00008086d00001C20sv00008086sd00002008*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family High Definition Audio Controller (DQ67SW board)
 
@@ -67259,6 +69281,9 @@ pci:v00008086d00001C22sv00001028sd000004DA*
 pci:v00008086d00001C22sv00001043sd0000844D*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family SMBus Controller (P8 series motherboard)
 
+pci:v00008086d00001C22sv000017AAsd000021CF*
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family SMBus Controller (ThinkPad T520)
+
 pci:v00008086d00001C22sv00008086sd00007270*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family SMBus Controller (Server Board S1200BTS / Apple MacBook Pro 8,1/8,2)
 
@@ -67286,6 +69311,9 @@ pci:v00008086d00001C26sv00001028sd000004DA*
 pci:v00008086d00001C26sv00001043sd0000844D*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family USB Enhanced Host Controller #1 (P8 series motherboard)
 
+pci:v00008086d00001C26sv000017AAsd000021CF*
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family USB Enhanced Host Controller #1 (ThinkPad T520)
+
 pci:v00008086d00001C26sv00008086sd00007270*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family USB Enhanced Host Controller #1 (Server Board S1200BTS / Apple MacBook Pro 8,1/8,2)
 
@@ -67319,6 +69347,9 @@ pci:v00008086d00001C2Dsv00001028sd000004DA*
 pci:v00008086d00001C2Dsv00001043sd0000844D*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family USB Enhanced Host Controller #2 (P8 series motherboard)
 
+pci:v00008086d00001C2Dsv000017AAsd000021CF*
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family USB Enhanced Host Controller #2 (ThinkPad T520)
+
 pci:v00008086d00001C2Dsv00008086sd00007270*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family USB Enhanced Host Controller #2 (Server Board S1200BTS / Apple MacBook Pro 8,1/8,2)
 
@@ -67346,6 +69377,9 @@ pci:v00008086d00001C3Asv00001028sd000004DA*
 pci:v00008086d00001C3Asv00001043sd0000844D*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family MEI Controller #1 (P8 series motherboard)
 
+pci:v00008086d00001C3Asv000017AAsd000021CF*
+ ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family MEI Controller #1 (ThinkPad T520)
+
 pci:v00008086d00001C3Asv00008086sd00007270*
  ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family MEI Controller #1 (Apple MacBookPro8,2 [Core i7, 15", 2011])
 
@@ -67427,6 +69461,9 @@ pci:v00008086d00001C4F*
 pci:v00008086d00001C4Fsv00001028sd000004A3*
  ID_MODEL_FROM_DATABASE=QM67 Express Chipset Family LPC Controller (Precision M4600)
 
+pci:v00008086d00001C4Fsv000017AAsd000021CF*
+ ID_MODEL_FROM_DATABASE=QM67 Express Chipset Family LPC Controller (ThinkPad T520)
+
 pci:v00008086d00001C50*
  ID_MODEL_FROM_DATABASE=B65 Express Chipset Family LPC Controller
 
@@ -67679,6 +69716,9 @@ pci:v00008086d00001E00*
 pci:v00008086d00001E01*
  ID_MODEL_FROM_DATABASE=7 Series Chipset Family 4-port SATA Controller [IDE mode]
 
+pci:v00008086d00001E01sv0000144Dsd0000C652*
+ ID_MODEL_FROM_DATABASE=7 Series Chipset Family 4-port SATA Controller [IDE mode] (NP300E5C series laptop)
+
 pci:v00008086d00001E02*
  ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family 6-port SATA Controller [AHCI mode]
 
@@ -67700,6 +69740,9 @@ pci:v00008086d00001E03sv00001043sd00001477*
 pci:v00008086d00001E03sv00001043sd00001517*
  ID_MODEL_FROM_DATABASE=7 Series Chipset Family 6-port SATA Controller [AHCI mode] (Zenbook Prime UX31A)
 
+pci:v00008086d00001E03sv0000144Dsd0000C652*
+ ID_MODEL_FROM_DATABASE=7 Series Chipset Family 6-port SATA Controller [AHCI mode] (NP300E5C series laptop)
+
 pci:v00008086d00001E04*
  ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family SATA Controller [RAID mode]
 
@@ -67718,26 +69761,32 @@ pci:v00008086d00001E08*
 pci:v00008086d00001E09*
  ID_MODEL_FROM_DATABASE=7 Series Chipset Family 2-port SATA Controller [IDE mode]
 
+pci:v00008086d00001E09sv0000144Dsd0000C652*
+ ID_MODEL_FROM_DATABASE=7 Series Chipset Family 2-port SATA Controller [IDE mode] (NP300E5C series laptop)
+
 pci:v00008086d00001E0E*
  ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family SATA Controller [RAID mode]
 
 pci:v00008086d00001E10*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family PCI Express Root Port 1
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family PCI Express Root Port 1
 
 pci:v00008086d00001E10sv00001043sd0000108D*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family PCI Express Root Port 1 (VivoBook X202EV)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family PCI Express Root Port 1 (VivoBook X202EV)
 
 pci:v00008086d00001E10sv00001043sd00001477*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family PCI Express Root Port 1 (N56VZ)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family PCI Express Root Port 1 (N56VZ)
 
 pci:v00008086d00001E10sv00001043sd00001517*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family PCI Express Root Port 1 (Zenbook Prime UX31A)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family PCI Express Root Port 1 (Zenbook Prime UX31A)
 
 pci:v00008086d00001E10sv00001043sd000084CA*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family PCI Express Root Port 1 (P8H77-I Motherboard)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family PCI Express Root Port 1 (P8H77-I Motherboard)
+
+pci:v00008086d00001E10sv0000144Dsd0000C652*
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family PCI Express Root Port 1 (NP300E5C series laptop)
 
 pci:v00008086d00001E10sv00001849sd00001E10*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family PCI Express Root Port 1 (Motherboard)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family PCI Express Root Port 1 (Motherboard)
 
 pci:v00008086d00001E12*
  ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family PCI Express Root Port 2
@@ -67755,16 +69804,19 @@ pci:v00008086d00001E14*
  ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family PCI Express Root Port 3
 
 pci:v00008086d00001E16*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family PCI Express Root Port 4
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family PCI Express Root Port 4
 
 pci:v00008086d00001E16sv00001043sd0000108D*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family PCI Express Root Port 4 (VivoBook X202EV)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family PCI Express Root Port 4 (VivoBook X202EV)
 
 pci:v00008086d00001E16sv00001043sd00001477*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family PCI Express Root Port 4 (N56VZ)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family PCI Express Root Port 4 (N56VZ)
+
+pci:v00008086d00001E16sv0000144Dsd0000C652*
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family PCI Express Root Port 4 (NP300E5C series laptop)
 
 pci:v00008086d00001E16sv00001849sd00001618*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family PCI Express Root Port 4 (Z77 Extreme4 motherboard)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family PCI Express Root Port 4 (Z77 Extreme4 motherboard)
 
 pci:v00008086d00001E18*
  ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family PCI Express Root Port 5
@@ -67791,46 +69843,52 @@ pci:v00008086d00001E1Esv00001849sd00001E1E*
  ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family PCI Express Root Port 8 (Motherboard)
 
 pci:v00008086d00001E20*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family High Definition Audio Controller
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family High Definition Audio Controller
 
 pci:v00008086d00001E20sv00001028sd0000054B*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family High Definition Audio Controller (Dell XPS One 2710)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family High Definition Audio Controller (XPS One 2710)
 
 pci:v00008086d00001E20sv00001043sd0000108D*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family High Definition Audio Controller (VivoBook X202EV)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family High Definition Audio Controller (VivoBook X202EV)
 
 pci:v00008086d00001E20sv00001043sd00001477*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family High Definition Audio Controller (N56VZ)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family High Definition Audio Controller (N56VZ)
 
 pci:v00008086d00001E20sv00001043sd00001517*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family High Definition Audio Controller (Zenbook Prime UX31A)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family High Definition Audio Controller (Zenbook Prime UX31A)
 
 pci:v00008086d00001E20sv00001043sd00008415*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family High Definition Audio Controller (P8H77-I Motherboard)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family High Definition Audio Controller (P8H77-I Motherboard)
 
 pci:v00008086d00001E20sv00001043sd00008445*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family High Definition Audio Controller (ASUS P8Z77-V LX Motherboard)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family High Definition Audio Controller (P8Z77-V LX Motherboard)
+
+pci:v00008086d00001E20sv0000144Dsd0000C652*
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family High Definition Audio Controller (NP300E5C series laptop)
 
 pci:v00008086d00001E20sv00001849sd00001898*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family High Definition Audio Controller (Z77 Extreme4 motherboard)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family High Definition Audio Controller (Z77 Extreme4 motherboard)
 
 pci:v00008086d00001E22*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family SMBus Controller
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family SMBus Controller
 
 pci:v00008086d00001E22sv00001043sd0000108D*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family SMBus Controller (VivoBook X202EV)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family SMBus Controller (VivoBook X202EV)
 
 pci:v00008086d00001E22sv00001043sd00001477*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family SMBus Controller (N56VZ)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family SMBus Controller (N56VZ)
 
 pci:v00008086d00001E22sv00001043sd00001517*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family SMBus Controller (Zenbook Prime UX31A)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family SMBus Controller (Zenbook Prime UX31A)
 
 pci:v00008086d00001E22sv00001043sd000084CA*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family SMBus Controller (P8 series motherboard)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family SMBus Controller (P8 series motherboard)
+
+pci:v00008086d00001E22sv0000144Dsd0000C652*
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family SMBus Controller (NP300E5C series laptop)
 
 pci:v00008086d00001E22sv00001849sd00001E22*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family SMBus Controller (Motherboard)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family SMBus Controller (Motherboard)
 
 pci:v00008086d00001E24*
  ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family Thermal Management Controller
@@ -67842,40 +69900,46 @@ pci:v00008086d00001E25*
  ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family DMI to PCI Bridge
 
 pci:v00008086d00001E26*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family USB Enhanced Host Controller #1
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family USB Enhanced Host Controller #1
 
 pci:v00008086d00001E26sv00001043sd0000108D*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family USB Enhanced Host Controller #1 (VivoBook X202EV)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family USB Enhanced Host Controller #1 (VivoBook X202EV)
 
 pci:v00008086d00001E26sv00001043sd00001477*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family USB Enhanced Host Controller #1 (N56VZ)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family USB Enhanced Host Controller #1 (N56VZ)
 
 pci:v00008086d00001E26sv00001043sd00001517*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family USB Enhanced Host Controller #1 (Zenbook Prime UX31A)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family USB Enhanced Host Controller #1 (Zenbook Prime UX31A)
 
 pci:v00008086d00001E26sv00001043sd000084CA*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family USB Enhanced Host Controller #1 (P8 series motherboard)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family USB Enhanced Host Controller #1 (P8 series motherboard)
+
+pci:v00008086d00001E26sv0000144Dsd0000C652*
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family USB Enhanced Host Controller #1 (NP300E5C series laptop)
 
 pci:v00008086d00001E26sv00001849sd00001E26*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family USB Enhanced Host Controller #1 (Motherboard)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family USB Enhanced Host Controller #1 (Motherboard)
 
 pci:v00008086d00001E2D*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family USB Enhanced Host Controller #2
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family USB Enhanced Host Controller #2
 
 pci:v00008086d00001E2Dsv00001043sd0000108D*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family USB Enhanced Host Controller #2 (VivoBook X202EV)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family USB Enhanced Host Controller #2 (VivoBook X202EV)
 
 pci:v00008086d00001E2Dsv00001043sd00001477*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family USB Enhanced Host Controller #2 (N56VZ)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family USB Enhanced Host Controller #2 (N56VZ)
 
 pci:v00008086d00001E2Dsv00001043sd00001517*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family USB Enhanced Host Controller #2 (Zenbook Prime UX31A)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family USB Enhanced Host Controller #2 (Zenbook Prime UX31A)
 
 pci:v00008086d00001E2Dsv00001043sd000084CA*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family USB Enhanced Host Controller #2 (P8 series motherboard)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family USB Enhanced Host Controller #2 (P8 series motherboard)
+
+pci:v00008086d00001E2Dsv0000144Dsd0000C652*
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family USB Enhanced Host Controller #2 (NP300E5C series laptop)
 
 pci:v00008086d00001E2Dsv00001849sd00001E2D*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family USB Enhanced Host Controller #2 (Motherboard)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family USB Enhanced Host Controller #2 (Motherboard)
 
 pci:v00008086d00001E31*
  ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family USB xHCI Host Controller
@@ -67902,22 +69966,25 @@ pci:v00008086d00001E33*
  ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family LAN Controller
 
 pci:v00008086d00001E3A*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family MEI Controller #1
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family MEI Controller #1
 
 pci:v00008086d00001E3Asv00001043sd0000108D*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family MEI Controller #1 (VivoBook X202EV)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family MEI Controller #1 (VivoBook X202EV)
 
 pci:v00008086d00001E3Asv00001043sd00001477*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family MEI Controller #1 (N56VZ)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family MEI Controller #1 (N56VZ)
 
 pci:v00008086d00001E3Asv00001043sd00001517*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family MEI Controller #1 (Zenbook Prime UX31A)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family MEI Controller #1 (Zenbook Prime UX31A)
 
 pci:v00008086d00001E3Asv00001043sd000084CA*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family MEI Controller #1 (P8 series motherboard)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family MEI Controller #1 (P8 series motherboard)
+
+pci:v00008086d00001E3Asv0000144Dsd0000C652*
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family MEI Controller #1 (NP300E5C series laptop)
 
 pci:v00008086d00001E3Asv00001849sd00001E3A*
- ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family MEI Controller #1 (Motherboard)
+ ID_MODEL_FROM_DATABASE=7 Series/C216 Chipset Family MEI Controller #1 (Motherboard)
 
 pci:v00008086d00001E3B*
  ID_MODEL_FROM_DATABASE=7 Series/C210 Series Chipset Family MEI Controller #2
@@ -68030,6 +70097,9 @@ pci:v00008086d00001E5C*
 pci:v00008086d00001E5D*
  ID_MODEL_FROM_DATABASE=HM75 Express Chipset LPC Controller
 
+pci:v00008086d00001E5Dsv0000144Dsd0000C652*
+ ID_MODEL_FROM_DATABASE=HM75 Express Chipset LPC Controller (NP300E5C series laptop)
+
 pci:v00008086d00001E5E*
  ID_MODEL_FROM_DATABASE=7 Series Chipset Family LPC Controller
 
@@ -68235,16 +70305,16 @@ pci:v00008086d00002024*
  ID_MODEL_FROM_DATABASE=Sky Lake-E MM/Vt-d Configuration Registers
 
 pci:v00008086d00002030*
- ID_MODEL_FROM_DATABASE=Sky Lake-E PCI Express Root Port 1A
+ ID_MODEL_FROM_DATABASE=Sky Lake-E PCI Express Root Port A
 
 pci:v00008086d00002031*
- ID_MODEL_FROM_DATABASE=Sky Lake-E PCI Express Root Port 1B
+ ID_MODEL_FROM_DATABASE=Sky Lake-E PCI Express Root Port B
 
 pci:v00008086d00002032*
- ID_MODEL_FROM_DATABASE=Sky Lake-E PCI Express Root Port 1C
+ ID_MODEL_FROM_DATABASE=Sky Lake-E PCI Express Root Port C
 
 pci:v00008086d00002033*
- ID_MODEL_FROM_DATABASE=Sky Lake-E PCI Express Root Port 1D
+ ID_MODEL_FROM_DATABASE=Sky Lake-E PCI Express Root Port D
 
 pci:v00008086d00002035*
  ID_MODEL_FROM_DATABASE=Sky Lake-E RAS Configuration Registers
@@ -68834,6 +70904,9 @@ pci:v00008086d00002448sv00001458sd00005000*
 pci:v00008086d00002448sv00001734sd00001055*
  ID_MODEL_FROM_DATABASE=82801 Mobile PCI Bridge (Amilo M1420)
 
+pci:v00008086d00002448sv000017AAsd00002013*
+ ID_MODEL_FROM_DATABASE=82801 Mobile PCI Bridge (ThinkPad R60e)
+
 pci:v00008086d00002448sv000017AAsd000020AE*
  ID_MODEL_FROM_DATABASE=82801 Mobile PCI Bridge (ThinkPad T61/R61)
 
@@ -70430,6 +72503,15 @@ pci:v00008086d000024F0sv000010A9sd00008030*
 pci:v00008086d000024F0sv000010A9sd00008031*
  ID_MODEL_FROM_DATABASE=Omni-Path HFI Silicon 100 Series [discrete] (Omni-path HFI 100 Series, 2-port B-board)
 
+pci:v00008086d000024F0sv00001590sd000000E7*
+ ID_MODEL_FROM_DATABASE=Omni-Path HFI Silicon 100 Series [discrete] (100Gb 1-port OP101 QSFP28 x8 PCIe Gen3 with Intel Omni-Path Adapter)
+
+pci:v00008086d000024F0sv00001590sd000000E8*
+ ID_MODEL_FROM_DATABASE=Omni-Path HFI Silicon 100 Series [discrete] (100Gb 1-port OP101 QSFP28 x16 PCIe Gen3 with Intel Omni-Path Adapter)
+
+pci:v00008086d000024F0sv00001590sd0000021C*
+ ID_MODEL_FROM_DATABASE=Omni-Path HFI Silicon 100 Series [discrete] (Apollo 100Gb 1-port Intel Omni-Path Architecture 860z Mezzanine FIO Adapter)
+
 pci:v00008086d000024F0sv000015D9sd00000934*
  ID_MODEL_FROM_DATABASE=Omni-Path HFI Silicon 100 Series [discrete] (Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, SIOM Module)
 
@@ -70466,6 +72548,15 @@ pci:v00008086d000024F4*
 pci:v00008086d000024F4sv00008086sd00000030*
  ID_MODEL_FROM_DATABASE=Wireless 8260 (Dual Band Wireless-AC 8260)
 
+pci:v00008086d000024FD*
+ ID_MODEL_FROM_DATABASE=Wireless 8265 / 8275
+
+pci:v00008086d000024FDsv00008086sd00000010*
+ ID_MODEL_FROM_DATABASE=Wireless 8265 / 8275 (Dual Band Wireless-AC 8265)
+
+pci:v00008086d000024FDsv00008086sd00001130*
+ ID_MODEL_FROM_DATABASE=Wireless 8265 / 8275 (Dual Band Wireless-AC 8265)
+
 pci:v00008086d00002500*
  ID_MODEL_FROM_DATABASE=82820 820 (Camino) Chipset Host Bridge (MCH)
 
@@ -70746,7 +72837,7 @@ pci:v00008086d00002590sv00001014sd00000575*
  ID_MODEL_FROM_DATABASE=Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller (ThinkPad X41 / Z60t)
 
 pci:v00008086d00002590sv00001028sd00000182*
- ID_MODEL_FROM_DATABASE=Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller (Dell Latitude C610)
+ ID_MODEL_FROM_DATABASE=Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller (Latitude C610)
 
 pci:v00008086d00002590sv0000103Csd00000934*
  ID_MODEL_FROM_DATABASE=Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller (Compaq nw8240/nx8220)
@@ -71610,7 +73701,7 @@ pci:v00008086d00002668sv0000103Csd00002A09*
  ID_MODEL_FROM_DATABASE=82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller (PufferM-UL8E)
 
 pci:v00008086d00002668sv00001043sd00001173*
- ID_MODEL_FROM_DATABASE=82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller (Asus A6VC)
+ ID_MODEL_FROM_DATABASE=82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller (A6VC)
 
 pci:v00008086d00002668sv00001043sd0000814E*
  ID_MODEL_FROM_DATABASE=82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller (P5GD1-VW Mainboard)
@@ -71688,7 +73779,7 @@ pci:v00008086d0000266Esv00001028sd00000182*
  ID_MODEL_FROM_DATABASE=82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller (Latitude D610 Laptop)
 
 pci:v00008086d0000266Esv00001028sd00000187*
- ID_MODEL_FROM_DATABASE=82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller (Dell Precision M70 Laptop)
+ ID_MODEL_FROM_DATABASE=82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller (Precision M70 Laptop)
 
 pci:v00008086d0000266Esv00001028sd00000188*
  ID_MODEL_FROM_DATABASE=82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller (Inspiron 6000 laptop)
@@ -71760,7 +73851,7 @@ pci:v00008086d00002670sv000015D9sd00009680*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset LPC Interface Controller (X7DBN Motherboard)
 
 pci:v00008086d00002670sv00008086sd00003476*
- ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset LPC Interface Controller (Intel S5000PSLSATA Server Board)
+ ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset LPC Interface Controller (S5000PSLSATA Server Board)
 
 pci:v00008086d00002680*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset SATA IDE Controller
@@ -71778,7 +73869,7 @@ pci:v00008086d00002681sv000015D9sd00009680*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB SATA AHCI Controller (X7DBN Motherboard)
 
 pci:v00008086d00002681sv00008086sd00003476*
- ID_MODEL_FROM_DATABASE=631xESB/632xESB SATA AHCI Controller (Intel S5000PSLSATA Server Board)
+ ID_MODEL_FROM_DATABASE=631xESB/632xESB SATA AHCI Controller (S5000PSLSATA Server Board)
 
 pci:v00008086d00002682*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB SATA RAID Controller
@@ -71808,7 +73899,7 @@ pci:v00008086d00002688sv000015D9sd00009680*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset UHCI USB Controller #1 (X7DBN Motherboard)
 
 pci:v00008086d00002688sv00008086sd00003476*
- ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset UHCI USB Controller #1 (Intel S5000PSLSATA Server Board)
+ ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset UHCI USB Controller #1 (S5000PSLSATA Server Board)
 
 pci:v00008086d00002689*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset UHCI USB Controller #2
@@ -71829,7 +73920,7 @@ pci:v00008086d00002689sv000015D9sd00009680*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset UHCI USB Controller #2 (X7DBN Motherboard)
 
 pci:v00008086d00002689sv00008086sd00003476*
- ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset UHCI USB Controller #2 (Intel S5000PSLSATA Server Board)
+ ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset UHCI USB Controller #2 (S5000PSLSATA Server Board)
 
 pci:v00008086d0000268A*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset UHCI USB Controller #3
@@ -71847,7 +73938,7 @@ pci:v00008086d0000268Asv000015D9sd00009680*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset UHCI USB Controller #3 (X7DBN Motherboard)
 
 pci:v00008086d0000268Asv00008086sd00003476*
- ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset UHCI USB Controller #3 (Intel S5000PSLSATA Server Board)
+ ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset UHCI USB Controller #3 (S5000PSLSATA Server Board)
 
 pci:v00008086d0000268B*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset UHCI USB Controller #4
@@ -71859,7 +73950,7 @@ pci:v00008086d0000268Bsv000015D9sd00008680*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset UHCI USB Controller #4 (X7DVL-E-O motherboard)
 
 pci:v00008086d0000268Bsv00008086sd00003476*
- ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset UHCI USB Controller #4 (Intel S5000PSLSATA Server Board)
+ ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset UHCI USB Controller #4 (S5000PSLSATA Server Board)
 
 pci:v00008086d0000268C*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset EHCI USB2 Controller
@@ -71880,7 +73971,7 @@ pci:v00008086d0000268Csv000015D9sd00009680*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset EHCI USB2 Controller (X7DBN Motherboard)
 
 pci:v00008086d0000268Csv00008086sd00003476*
- ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset EHCI USB2 Controller (Intel S5000PSLSATA Server Board)
+ ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset EHCI USB2 Controller (S5000PSLSATA Server Board)
 
 pci:v00008086d00002690*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset PCI Express Root Port 1
@@ -71925,7 +74016,7 @@ pci:v00008086d0000269Bsv000015D9sd00009680*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset SMBus Controller (X7DBN Motherboard)
 
 pci:v00008086d0000269Bsv00008086sd00003476*
- ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset SMBus Controller (Intel S5000PSLSATA Server Board)
+ ID_MODEL_FROM_DATABASE=631xESB/632xESB/3100 Chipset SMBus Controller (S5000PSLSATA Server Board)
 
 pci:v00008086d0000269E*
  ID_MODEL_FROM_DATABASE=631xESB/632xESB IDE Controller
@@ -71976,7 +74067,7 @@ pci:v00008086d00002772sv00008086sd0000544E*
  ID_MODEL_FROM_DATABASE=82945G/GZ Integrated Graphics Controller (DeskTop Board D945GTP)
 
 pci:v00008086d00002772sv00008086sd0000D605*
- ID_MODEL_FROM_DATABASE=82945G/GZ Integrated Graphics Controller (Intel Desktop Board D945GCCR)
+ ID_MODEL_FROM_DATABASE=82945G/GZ Integrated Graphics Controller (Desktop Board D945GCCR)
 
 pci:v00008086d00002774*
  ID_MODEL_FROM_DATABASE=82955X Memory Controller Hub
@@ -72059,6 +74150,9 @@ pci:v00008086d000027A0sv0000103Csd000030A1*
 pci:v00008086d000027A0sv0000103Csd000030A3*
  ID_MODEL_FROM_DATABASE=Mobile 945GM/PM/GMS, 943/940GML and 945GT Express Memory Controller Hub (Compaq nw8440)
 
+pci:v00008086d000027A0sv0000103Csd000030D5*
+ ID_MODEL_FROM_DATABASE=Mobile 945GM/PM/GMS, 943/940GML and 945GT Express Memory Controller Hub (530 Laptop)
+
 pci:v00008086d000027A0sv00001043sd00001237*
  ID_MODEL_FROM_DATABASE=Mobile 945GM/PM/GMS, 943/940GML and 945GT Express Memory Controller Hub (A6J-Q008)
 
@@ -72089,6 +74183,9 @@ pci:v00008086d000027A2*
 pci:v00008086d000027A2sv0000103Csd000030A1*
  ID_MODEL_FROM_DATABASE=Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller (NC2400)
 
+pci:v00008086d000027A2sv0000103Csd000030D5*
+ ID_MODEL_FROM_DATABASE=Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller (530 Laptop)
+
 pci:v00008086d000027A2sv000017AAsd0000201A*
  ID_MODEL_FROM_DATABASE=Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller (ThinkPad R60/T60/X60 series)
 
@@ -72101,6 +74198,9 @@ pci:v00008086d000027A6*
 pci:v00008086d000027A6sv0000103Csd000030A1*
  ID_MODEL_FROM_DATABASE=Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller (NC2400)
 
+pci:v00008086d000027A6sv0000103Csd000030D5*
+ ID_MODEL_FROM_DATABASE=Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller (530 Laptop)
+
 pci:v00008086d000027A6sv00001775sd000011CC*
  ID_MODEL_FROM_DATABASE=Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller (CC11/CL11 integrated graphics (secondary))
 
@@ -72137,6 +74237,9 @@ pci:v00008086d000027B8*
 pci:v00008086d000027B8sv00001028sd000001E6*
  ID_MODEL_FROM_DATABASE=82801GB/GR (ICH7 Family) LPC Interface Bridge (PowerEdge 860)
 
+pci:v00008086d000027B8sv0000103Csd00002A8C*
+ ID_MODEL_FROM_DATABASE=82801GB/GR (ICH7 Family) LPC Interface Bridge (Compaq 500B Microtower)
+
 pci:v00008086d000027B8sv00001043sd00008179*
  ID_MODEL_FROM_DATABASE=82801GB/GR (ICH7 Family) LPC Interface Bridge (P5KPL-VM Motherboard)
 
@@ -72167,6 +74270,9 @@ pci:v00008086d000027B9sv0000103Csd000030A1*
 pci:v00008086d000027B9sv0000103Csd000030A3*
  ID_MODEL_FROM_DATABASE=82801GBM (ICH7-M) LPC Interface Bridge (Compaq nw8440)
 
+pci:v00008086d000027B9sv0000103Csd000030D5*
+ ID_MODEL_FROM_DATABASE=82801GBM (ICH7-M) LPC Interface Bridge (530 Laptop)
+
 pci:v00008086d000027B9sv00001071sd00008209*
  ID_MODEL_FROM_DATABASE=82801GBM (ICH7-M) LPC Interface Bridge (Medion MIM 2240 Notebook PC [MD98100])
 
@@ -72212,6 +74318,9 @@ pci:v00008086d000027C0sv00001028sd000001DF*
 pci:v00008086d000027C0sv00001028sd000001E6*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family SATA Controller [IDE mode] (PowerEdge 860)
 
+pci:v00008086d000027C0sv0000103Csd00002A8C*
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family SATA Controller [IDE mode] (Compaq 500B Microtower)
+
 pci:v00008086d000027C0sv00001043sd00008179*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family SATA Controller [IDE mode] (P5KPL-VM Motherboard)
 
@@ -72296,6 +74405,9 @@ pci:v00008086d000027C5sv0000103Csd0000309F*
 pci:v00008086d000027C5sv0000103Csd000030A3*
  ID_MODEL_FROM_DATABASE=82801GBM/GHM (ICH7-M Family) SATA Controller [AHCI mode] (Compaq nw8440)
 
+pci:v00008086d000027C5sv0000103Csd000030D5*
+ ID_MODEL_FROM_DATABASE=82801GBM/GHM (ICH7-M Family) SATA Controller [AHCI mode] (530 Laptop)
+
 pci:v00008086d000027C5sv000017AAsd0000200D*
  ID_MODEL_FROM_DATABASE=82801GBM/GHM (ICH7-M Family) SATA Controller [AHCI mode] (ThinkPad R60/T60/X60 series)
 
@@ -72323,6 +74435,9 @@ pci:v00008086d000027C8sv00001028sd000001E6*
 pci:v00008086d000027C8sv0000103Csd00002A3B*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB UHCI Controller #1 (Pavilion A1512X)
 
+pci:v00008086d000027C8sv0000103Csd00002A8C*
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB UHCI Controller #1 (Compaq 500B Microtower)
+
 pci:v00008086d000027C8sv0000103Csd0000309F*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB UHCI Controller #1 (Compaq nx9420 Notebook)
 
@@ -72332,6 +74447,9 @@ pci:v00008086d000027C8sv0000103Csd000030A1*
 pci:v00008086d000027C8sv0000103Csd000030A3*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB UHCI Controller #1 (Compaq nw8440)
 
+pci:v00008086d000027C8sv0000103Csd000030D5*
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB UHCI Controller #1 (530 Laptop)
+
 pci:v00008086d000027C8sv00001043sd00001237*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB UHCI Controller #1 (A6J-Q008)
 
@@ -72392,6 +74510,9 @@ pci:v00008086d000027C9sv00001028sd000001E6*
 pci:v00008086d000027C9sv0000103Csd00002A3B*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB UHCI Controller #2 (Pavilion A1512X)
 
+pci:v00008086d000027C9sv0000103Csd00002A8C*
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB UHCI Controller #2 (Compaq 500B Microtower)
+
 pci:v00008086d000027C9sv0000103Csd0000309F*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB UHCI Controller #2 (Compaq nx9420 Notebook)
 
@@ -72461,6 +74582,9 @@ pci:v00008086d000027CAsv00001028sd000001E6*
 pci:v00008086d000027CAsv0000103Csd00002A3B*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB UHCI Controller #3 (Pavilion A1512X)
 
+pci:v00008086d000027CAsv0000103Csd00002A8C*
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB UHCI Controller #3 (Compaq 500B Microtower)
+
 pci:v00008086d000027CAsv0000103Csd0000309F*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB UHCI Controller #3 (Compaq nx9420 Notebook)
 
@@ -72524,6 +74648,9 @@ pci:v00008086d000027CBsv00001028sd000001DF*
 pci:v00008086d000027CBsv0000103Csd00002A3B*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB UHCI Controller #4 (Pavilion A1512X)
 
+pci:v00008086d000027CBsv0000103Csd00002A8C*
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB UHCI Controller #4 (Compaq 500B Microtower)
+
 pci:v00008086d000027CBsv0000103Csd0000309F*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB UHCI Controller #4 (Compaq nx9420 Notebook)
 
@@ -72590,6 +74717,9 @@ pci:v00008086d000027CCsv00001028sd000001E6*
 pci:v00008086d000027CCsv0000103Csd00002A3B*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB2 EHCI Controller (Pavilion A1512X)
 
+pci:v00008086d000027CCsv0000103Csd00002A8C*
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB2 EHCI Controller (Compaq 500B Microtower)
+
 pci:v00008086d000027CCsv0000103Csd0000309F*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB2 EHCI Controller (Compaq nx9420 Notebook)
 
@@ -72599,6 +74729,9 @@ pci:v00008086d000027CCsv0000103Csd000030A1*
 pci:v00008086d000027CCsv0000103Csd000030A3*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB2 EHCI Controller (Compaq nw8440)
 
+pci:v00008086d000027CCsv0000103Csd000030D5*
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB2 EHCI Controller (530 Laptop)
+
 pci:v00008086d000027CCsv00001043sd00001237*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family USB2 EHCI Controller (A6J-Q008)
 
@@ -72659,6 +74792,9 @@ pci:v00008086d000027D0sv00001462sd00007418*
 pci:v00008086d000027D0sv00001775sd000011CC*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family PCI Express Port 1 (CC11/CL11)
 
+pci:v00008086d000027D0sv000017AAsd00002011*
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family PCI Express Port 1 (ThinkPad R60e)
+
 pci:v00008086d000027D0sv00008086sd0000544B*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family PCI Express Port 1 (Desktop Board D425KT)
 
@@ -72683,6 +74819,9 @@ pci:v00008086d000027D2sv00001462sd00007418*
 pci:v00008086d000027D2sv00001775sd000011CC*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family PCI Express Port 2 (CC11/CL11)
 
+pci:v00008086d000027D2sv000017AAsd00002011*
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family PCI Express Port 2 (ThinkPad R60e)
+
 pci:v00008086d000027D2sv00008086sd0000544B*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family PCI Express Port 2 (Desktop Board D425KT)
 
@@ -72701,6 +74840,9 @@ pci:v00008086d000027D4sv00001462sd00007418*
 pci:v00008086d000027D4sv00001775sd000011CC*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family PCI Express Port 3 (CC11/CL11)
 
+pci:v00008086d000027D4sv000017AAsd00002011*
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family PCI Express Port 3 (ThinkPad R60e)
+
 pci:v00008086d000027D4sv00008086sd0000544B*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family PCI Express Port 3 (Desktop Board D425KT)
 
@@ -72722,6 +74864,9 @@ pci:v00008086d000027D6sv00001462sd00007418*
 pci:v00008086d000027D6sv00001775sd000011CC*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family PCI Express Port 4 (CC11/CL11)
 
+pci:v00008086d000027D6sv000017AAsd00002011*
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family PCI Express Port 4 (ThinkPad R60e)
+
 pci:v00008086d000027D6sv00008086sd0000544B*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family PCI Express Port 4 (Desktop Board D425KT)
 
@@ -72737,6 +74882,9 @@ pci:v00008086d000027D8sv00001028sd000001D7*
 pci:v00008086d000027D8sv0000103Csd00002A3B*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family High Definition Audio Controller (Pavilion A1512X)
 
+pci:v00008086d000027D8sv0000103Csd00002A8C*
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family High Definition Audio Controller (Compaq 500B Microtower)
+
 pci:v00008086d000027D8sv0000103Csd0000309F*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family High Definition Audio Controller (Compaq nx9420 Notebook)
 
@@ -72746,11 +74894,14 @@ pci:v00008086d000027D8sv0000103Csd000030A1*
 pci:v00008086d000027D8sv0000103Csd000030A3*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family High Definition Audio Controller (Compaq nw8440)
 
+pci:v00008086d000027D8sv0000103Csd000030D5*
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family High Definition Audio Controller (530 Laptop)
+
 pci:v00008086d000027D8sv00001043sd00001123*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family High Definition Audio Controller (A6J-Q008)
 
 pci:v00008086d000027D8sv00001043sd000013C4*
- ID_MODEL_FROM_DATABASE=NM10/ICH7 Family High Definition Audio Controller (Asus G2P)
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family High Definition Audio Controller (G2P)
 
 pci:v00008086d000027D8sv00001043sd0000817F*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family High Definition Audio Controller (P5LD2-VM Mainboard (Realtek ALC 882 codec))
@@ -72804,7 +74955,7 @@ pci:v00008086d000027D8sv000017AAsd00002010*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family High Definition Audio Controller (ThinkPad R60/T60/X60 series)
 
 pci:v00008086d000027D8sv000017AAsd00003802*
- ID_MODEL_FROM_DATABASE=NM10/ICH7 Family High Definition Audio Controller (Lenovo 3000 C200 audio [Realtek ALC861VD])
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family High Definition Audio Controller (3000 C200 audio [Realtek ALC861VD])
 
 pci:v00008086d000027D8sv00008086sd00001112*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family High Definition Audio Controller (DeskTop Board D945GTP)
@@ -72839,6 +74990,9 @@ pci:v00008086d000027DAsv00001028sd000001E6*
 pci:v00008086d000027DAsv0000103Csd00002A3B*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family SMBus Controller (Pavilion A1512X)
 
+pci:v00008086d000027DAsv0000103Csd00002A8C*
+ ID_MODEL_FROM_DATABASE=NM10/ICH7 Family SMBus Controller (Compaq 500B Microtower)
+
 pci:v00008086d000027DAsv00001043sd00008179*
  ID_MODEL_FROM_DATABASE=NM10/ICH7 Family SMBus Controller (P5KPL-VM Motherboard)
 
@@ -72914,6 +75068,9 @@ pci:v00008086d000027DFsv00001028sd000001E6*
 pci:v00008086d000027DFsv0000103Csd00002A3B*
  ID_MODEL_FROM_DATABASE=82801G (ICH7 Family) IDE Controller (Pavilion A1512X)
 
+pci:v00008086d000027DFsv0000103Csd00002A8C*
+ ID_MODEL_FROM_DATABASE=82801G (ICH7 Family) IDE Controller (Compaq 500B Microtower)
+
 pci:v00008086d000027DFsv0000103Csd0000309F*
  ID_MODEL_FROM_DATABASE=82801G (ICH7 Family) IDE Controller (Compaq nx9420 Notebook)
 
@@ -72923,6 +75080,9 @@ pci:v00008086d000027DFsv0000103Csd000030A1*
 pci:v00008086d000027DFsv0000103Csd000030A3*
  ID_MODEL_FROM_DATABASE=82801G (ICH7 Family) IDE Controller (Compaq nw8440)
 
+pci:v00008086d000027DFsv0000103Csd000030D5*
+ ID_MODEL_FROM_DATABASE=82801G (ICH7 Family) IDE Controller (530 Laptop)
+
 pci:v00008086d000027DFsv00001043sd00001237*
  ID_MODEL_FROM_DATABASE=82801G (ICH7 Family) IDE Controller (A6J-Q008)
 
@@ -73007,6 +75167,9 @@ pci:v00008086d00002815sv0000104Dsd00009005*
 pci:v00008086d00002815sv0000104Dsd0000902D*
  ID_MODEL_FROM_DATABASE=82801HM (ICH8M) LPC Interface Controller (VAIO VGN-NR120E)
 
+pci:v00008086d00002815sv000017AAsd000020A5*
+ ID_MODEL_FROM_DATABASE=82801HM (ICH8M) LPC Interface Controller (ThinkPad R61)
+
 pci:v00008086d00002815sv000017C0sd00004083*
  ID_MODEL_FROM_DATABASE=82801HM (ICH8M) LPC Interface Controller (Medion WIM 2210 Notebook PC [MD96850])
 
@@ -73055,6 +75218,24 @@ pci:v00008086d00002825sv00001462sd00007235*
 pci:v00008086d00002826*
  ID_MODEL_FROM_DATABASE=C600/X79 series chipset SATA RAID Controller
 
+pci:v00008086d00002826sv00001D49sd00000100*
+ ID_MODEL_FROM_DATABASE=C600/X79 series chipset SATA RAID Controller (Intel RSTe SATA Software RAID)
+
+pci:v00008086d00002826sv00001D49sd00000101*
+ ID_MODEL_FROM_DATABASE=C600/X79 series chipset SATA RAID Controller (Intel RSTe SATA Software RAID)
+
+pci:v00008086d00002826sv00001D49sd00000102*
+ ID_MODEL_FROM_DATABASE=C600/X79 series chipset SATA RAID Controller (Intel RSTe SATA Software RAID)
+
+pci:v00008086d00002826sv00001D49sd00000103*
+ ID_MODEL_FROM_DATABASE=C600/X79 series chipset SATA RAID Controller (Intel RSTe SATA Software RAID)
+
+pci:v00008086d00002826sv00001D49sd00000104*
+ ID_MODEL_FROM_DATABASE=C600/X79 series chipset SATA RAID Controller (Intel RSTe SATA Software RAID)
+
+pci:v00008086d00002826sv00001D49sd00000105*
+ ID_MODEL_FROM_DATABASE=C600/X79 series chipset SATA RAID Controller (Intel RSTe SATA Software RAID)
+
 pci:v00008086d00002827*
  ID_MODEL_FROM_DATABASE=C610/X99 series chipset sSATA Controller [RAID mode]
 
@@ -73067,6 +75248,9 @@ pci:v00008086d00002828sv00001028sd000001F3*
 pci:v00008086d00002828sv0000103Csd000030C0*
  ID_MODEL_FROM_DATABASE=82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [IDE mode] (Compaq 6710b)
 
+pci:v00008086d00002828sv000017AAsd000020A8*
+ ID_MODEL_FROM_DATABASE=82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [IDE mode] (ThinkPad R61)
+
 pci:v00008086d00002828sv0000E4BFsd0000CC47*
  ID_MODEL_FROM_DATABASE=82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [IDE mode] (CCG-RUMBA)
 
@@ -73116,7 +75300,7 @@ pci:v00008086d00002830*
  ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) USB UHCI Controller #1
 
 pci:v00008086d00002830sv00001025sd00000121*
- ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) USB UHCI Controller #1 (Acer Aspire 5920G)
+ ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) USB UHCI Controller #1 (Aspire 5920G)
 
 pci:v00008086d00002830sv00001028sd000001DA*
  ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) USB UHCI Controller #1 (OptiPlex 745)
@@ -73296,7 +75480,7 @@ pci:v00008086d00002835*
  ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) USB UHCI Controller #5
 
 pci:v00008086d00002835sv00001025sd00000121*
- ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) USB UHCI Controller #5 (Acer Aspire 5920G)
+ ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) USB UHCI Controller #5 (Aspire 5920G)
 
 pci:v00008086d00002835sv00001028sd000001DA*
  ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) USB UHCI Controller #5 (OptiPlex 745)
@@ -73380,7 +75564,7 @@ pci:v00008086d0000283A*
  ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) USB2 EHCI Controller #2
 
 pci:v00008086d0000283Asv00001025sd00000121*
- ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) USB2 EHCI Controller #2 (Acer Aspire 5920G)
+ ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) USB2 EHCI Controller #2 (Aspire 5920G)
 
 pci:v00008086d0000283Asv00001028sd000001DA*
  ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) USB2 EHCI Controller #2 (OptiPlex 745)
@@ -73545,10 +75729,10 @@ pci:v00008086d0000284Bsv00001028sd000001F3*
  ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) HD Audio Controller (Inspiron 1420)
 
 pci:v00008086d0000284Bsv00001028sd000001F9*
- ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) HD Audio Controller (Dell Latitude D630)
+ ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) HD Audio Controller (Latitude D630)
 
 pci:v00008086d0000284Bsv00001028sd000001FF*
- ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) HD Audio Controller (Dell Precision M4300)
+ ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) HD Audio Controller (Precision M4300)
 
 pci:v00008086d0000284Bsv00001028sd00000256*
  ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) HD Audio Controller (Studio 1735)
@@ -73566,7 +75750,7 @@ pci:v00008086d0000284Bsv0000103Csd000030CC*
  ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) HD Audio Controller (Pavilion dv6700)
 
 pci:v00008086d0000284Bsv00001043sd00001339*
- ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) HD Audio Controller (Asus M51S series)
+ ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) HD Audio Controller (M51S series)
 
 pci:v00008086d0000284Bsv00001043sd000081EC*
  ID_MODEL_FROM_DATABASE=82801H (ICH8 Family) HD Audio Controller (P5B)
@@ -74571,7 +76755,7 @@ pci:v00008086d00002A00*
  ID_MODEL_FROM_DATABASE=Mobile PM965/GM965/GL960 Memory Controller Hub
 
 pci:v00008086d00002A00sv00001025sd00000121*
- ID_MODEL_FROM_DATABASE=Mobile PM965/GM965/GL960 Memory Controller Hub (Acer Aspire 5920G)
+ ID_MODEL_FROM_DATABASE=Mobile PM965/GM965/GL960 Memory Controller Hub (Aspire 5920G)
 
 pci:v00008086d00002A00sv00001028sd000001F3*
  ID_MODEL_FROM_DATABASE=Mobile PM965/GM965/GL960 Memory Controller Hub (Inspiron 1420)
@@ -74628,10 +76812,10 @@ pci:v00008086d00002A02sv0000104Dsd0000902D*
  ID_MODEL_FROM_DATABASE=Mobile GM965/GL960 Integrated Graphics Controller (primary) (VAIO VGN-NR120E)
 
 pci:v00008086d00002A02sv000017AAsd000020B5*
- ID_MODEL_FROM_DATABASE=Mobile GM965/GL960 Integrated Graphics Controller (primary) (ThinkPad T61/R61)
+ ID_MODEL_FROM_DATABASE=Mobile GM965/GL960 Integrated Graphics Controller (primary) (GM965 [X3100] on ThinkPad T61/R61)
 
 pci:v00008086d00002A02sv000017C0sd00004082*
- ID_MODEL_FROM_DATABASE=Mobile GM965/GL960 Integrated Graphics Controller (primary) (Medion WIM 2210 Notebook PC [MD96850])
+ ID_MODEL_FROM_DATABASE=Mobile GM965/GL960 Integrated Graphics Controller (primary) (GM965 on Medion WIM 2210 Notebook PC [MD96850])
 
 pci:v00008086d00002A02sv0000E4BFsd0000CC47*
  ID_MODEL_FROM_DATABASE=Mobile GM965/GL960 Integrated Graphics Controller (primary) (CCG-RUMBA)
@@ -74652,10 +76836,10 @@ pci:v00008086d00002A03sv0000104Dsd0000902D*
  ID_MODEL_FROM_DATABASE=Mobile GM965/GL960 Integrated Graphics Controller (secondary) (VAIO VGN-NR120E)
 
 pci:v00008086d00002A03sv000017AAsd000020B5*
- ID_MODEL_FROM_DATABASE=Mobile GM965/GL960 Integrated Graphics Controller (secondary) (ThinkPad T61/R61)
+ ID_MODEL_FROM_DATABASE=Mobile GM965/GL960 Integrated Graphics Controller (secondary) (GM965 [X3100] on ThinkPad T61/R61)
 
 pci:v00008086d00002A03sv000017C0sd00004082*
- ID_MODEL_FROM_DATABASE=Mobile GM965/GL960 Integrated Graphics Controller (secondary) (Medion WIM 2210 Notebook PC [MD96850])
+ ID_MODEL_FROM_DATABASE=Mobile GM965/GL960 Integrated Graphics Controller (secondary) (GM965 on Medion WIM 2210 Notebook PC [MD96850])
 
 pci:v00008086d00002A03sv0000E4BFsd0000CC47*
  ID_MODEL_FROM_DATABASE=Mobile GM965/GL960 Integrated Graphics Controller (secondary) (CCG-RUMBA)
@@ -75264,7 +77448,7 @@ pci:v00008086d00002E20*
  ID_MODEL_FROM_DATABASE=4 Series Chipset DRAM Controller
 
 pci:v00008086d00002E20sv00001028sd00000283*
- ID_MODEL_FROM_DATABASE=4 Series Chipset DRAM Controller (Dell Vostro 220)
+ ID_MODEL_FROM_DATABASE=4 Series Chipset DRAM Controller (Vostro 220)
 
 pci:v00008086d00002E20sv00001043sd000082D3*
  ID_MODEL_FROM_DATABASE=4 Series Chipset DRAM Controller (P5Q Deluxe Motherboard)
@@ -75311,12 +77495,18 @@ pci:v00008086d00002E29*
 pci:v00008086d00002E30*
  ID_MODEL_FROM_DATABASE=4 Series Chipset DRAM Controller
 
+pci:v00008086d00002E30sv0000103Csd00002A8C*
+ ID_MODEL_FROM_DATABASE=4 Series Chipset DRAM Controller (Compaq 500B Microtower)
+
 pci:v00008086d00002E31*
  ID_MODEL_FROM_DATABASE=4 Series Chipset PCI Express Root Port
 
 pci:v00008086d00002E32*
  ID_MODEL_FROM_DATABASE=4 Series Chipset Integrated Graphics Controller
 
+pci:v00008086d00002E32sv0000103Csd00002A8C*
+ ID_MODEL_FROM_DATABASE=4 Series Chipset Integrated Graphics Controller (Compaq 500B Microtower)
+
 pci:v00008086d00002E33*
  ID_MODEL_FROM_DATABASE=4 Series Chipset Integrated Graphics Controller
 
@@ -75485,6 +77675,15 @@ pci:v00008086d00002F0A*
 pci:v00008086d00002F0B*
  ID_MODEL_FROM_DATABASE=Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 3
 
+pci:v00008086d00002F0D*
+ ID_MODEL_FROM_DATABASE=Haswell Xeon Non-Transparent Bridge (Back-to-back)
+
+pci:v00008086d00002F0E*
+ ID_MODEL_FROM_DATABASE=Haswell Xeon Non-Transparent Bridge (Primary Side)
+
+pci:v00008086d00002F0F*
+ ID_MODEL_FROM_DATABASE=Haswell Xeon Non-Transparent Bridge (Secondary Side)
+
 pci:v00008086d00002F10*
  ID_MODEL_FROM_DATABASE=Xeon E7 v3/Xeon E5 v3/Core i7 IIO Debug
 
@@ -75936,7 +78135,7 @@ pci:v00008086d00003165sv00008086sd00004210*
  ID_MODEL_FROM_DATABASE=Wireless 3165 (Dual Band Wireless AC 3165)
 
 pci:v00008086d00003166*
- ID_MODEL_FROM_DATABASE=Intel Dual Band Wireless-AC 3165 Plus Bluetooth
+ ID_MODEL_FROM_DATABASE=Dual Band Wireless-AC 3165 Plus Bluetooth
 
 pci:v00008086d00003200*
  ID_MODEL_FROM_DATABASE=GD31244 PCI-X SATA HBA
@@ -76745,11 +78944,11 @@ pci:v00008086d000037CD*
 pci:v00008086d000037CE*
  ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GbE backplane
 
-pci:v00008086d000037CEsv00001590sd00000200*
+pci:v00008086d000037CEsv00001590sd00000215*
  ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GbE backplane (Ethernet 10Gb 2-port 568i Adapter)
 
-pci:v00008086d000037CEsv00008086sd00000215*
- ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GbE backplane (Ethernet 10Gb 2-port 568i Adapter)
+pci:v00008086d000037CEsv000017AAsd00004023*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GbE backplane (Intel Ethernet Connection X722 for 10GbE backplane)
 
 pci:v00008086d000037CF*
  ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GbE QSFP+
@@ -76757,15 +78956,66 @@ pci:v00008086d000037CF*
 pci:v00008086d000037D0*
  ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GbE SFP+
 
+pci:v00008086d000037D0sv000017AAsd00004020*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GbE SFP+ (Intel Ethernet Connection X722 for 10G SFP+)
+
+pci:v00008086d000037D0sv000017AAsd00004021*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GbE SFP+ (Intel Ethernet Connection X722 for 10G SFP+)
+
+pci:v00008086d000037D0sv000017AAsd00004022*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GbE SFP+
+
 pci:v00008086d000037D1*
  ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 1GbE
 
+pci:v00008086d000037D1sv00001590sd00000216*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 1GbE (Ethernet 1Gb 2-port 368i Adapter)
+
+pci:v00008086d000037D1sv00001590sd00000217*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 1GbE (Ethernet 1Gb 2-port 368FLR-MMT Adapter)
+
+pci:v00008086d000037D1sv00001590sd00000247*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 1GbE (Ethernet 1Gb 4-port 369i Adapter)
+
+pci:v00008086d000037D1sv000017AAsd00004020*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 1GbE (Intel Ethernet Connection X722 for 1GbE)
+
+pci:v00008086d000037D1sv000017AAsd00004021*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 1GbE (Intel Ethernet Connection X722 for 1GbE)
+
+pci:v00008086d000037D1sv000017AAsd00004022*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 1GbE (Intel Ethernet Connection X722 for 1GbE)
+
 pci:v00008086d000037D2*
  ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GBASE-T
 
+pci:v00008086d000037D2sv000014CDsd00000030*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GBASE-T (Ethernet OCP 2x10G RJ45 Phy Card [USI-X557-10GbaseT])
+
+pci:v00008086d000037D2sv00001590sd00000218*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GBASE-T (Ethernet 10Gb 2-port 568FLR-MMT Adapter)
+
+pci:v00008086d000037D2sv000017AAsd00004020*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GBASE-T
+
+pci:v00008086d000037D2sv000017AAsd00004021*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GBASE-T
+
+pci:v00008086d000037D2sv000017AAsd00004022*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GBASE-T
+
 pci:v00008086d000037D3*
  ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GbE SFP+
 
+pci:v00008086d000037D3sv00001590sd00000219*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GbE SFP+ (Ethernet 10Gb 2-port 568FLR-MMSFP+ Adapter)
+
+pci:v00008086d000037D3sv000017AAsd00004020*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GbE SFP+
+
+pci:v00008086d000037D3sv000017AAsd00004021*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GbE SFP+
+
 pci:v00008086d000037D4*
  ID_MODEL_FROM_DATABASE=Ethernet Connection X722 for 10GbE QSFP+
 
@@ -77577,7 +79827,7 @@ pci:v00008086d00003B56sv00001028sd0000040B*
  ID_MODEL_FROM_DATABASE=5 Series/3400 Series Chipset High Definition Audio (Latitude E6510)
 
 pci:v00008086d00003B56sv00001043sd00001373*
- ID_MODEL_FROM_DATABASE=5 Series/3400 Series Chipset High Definition Audio (ASUSTek G73-series gaming laptop)
+ ID_MODEL_FROM_DATABASE=5 Series/3400 Series Chipset High Definition Audio (G73-series gaming laptop)
 
 pci:v00008086d00003B56sv0000144Dsd0000C06A*
  ID_MODEL_FROM_DATABASE=5 Series/3400 Series Chipset High Definition Audio (R730 Laptop)
@@ -78008,8 +80258,8 @@ pci:v00008086d00004223sv00001002sd00008086*
 pci:v00008086d00004223sv00001003sd00008086*
  ID_MODEL_FROM_DATABASE=PRO/Wireless 2915ABG [Calexico2] Network Connection (mPCI 3B High-Band ZZH)
 
-pci:v00008086d00004223sv00001351sd0000103C*
- ID_MODEL_FROM_DATABASE=PRO/Wireless 2915ABG [Calexico2] Network Connection (Compaq NC6220)
+pci:v00008086d00004223sv0000103Csd00001351*
+ ID_MODEL_FROM_DATABASE=PRO/Wireless 2915ABG [Calexico2] Network Connection (Compaq nc6220)
 
 pci:v00008086d00004224*
  ID_MODEL_FROM_DATABASE=PRO/Wireless 2915ABG [Calexico2] Network Connection
@@ -78017,8 +80267,11 @@ pci:v00008086d00004224*
 pci:v00008086d00004227*
  ID_MODEL_FROM_DATABASE=PRO/Wireless 3945ABG [Golan] Network Connection
 
+pci:v00008086d00004227sv00008086sd00001010*
+ ID_MODEL_FROM_DATABASE=PRO/Wireless 3945ABG [Golan] Network Connection (ThinkPad R60e)
+
 pci:v00008086d00004227sv00008086sd00001011*
- ID_MODEL_FROM_DATABASE=PRO/Wireless 3945ABG [Golan] Network Connection (ThinkPad T60/R60e/X60s)
+ ID_MODEL_FROM_DATABASE=PRO/Wireless 3945ABG [Golan] Network Connection (ThinkPad T60/R60e/X60s/R61)
 
 pci:v00008086d00004227sv00008086sd00001014*
  ID_MODEL_FROM_DATABASE=PRO/Wireless 3945ABG [Golan] Network Connection (PRO/Wireless 3945BG Network Connection)
@@ -78371,110 +80624,134 @@ pci:v00008086d00005845*
 pci:v00008086d00005845sv00001AF4sd00001100*
  ID_MODEL_FROM_DATABASE=QEMU NVM Express Controller (QEMU Virtual Machine)
 
+pci:v00008086d00005902*
+ ID_MODEL_FROM_DATABASE=HD Graphics 610
+
+pci:v00008086d00005904*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
+
+pci:v00008086d00005904sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers (ThinkPad X1 Carbon 5th Gen)
+
+pci:v00008086d0000590F*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
+
+pci:v00008086d00005910*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
+
+pci:v00008086d00005912*
+ ID_MODEL_FROM_DATABASE=HD Graphics 630
+
+pci:v00008086d00005916*
+ ID_MODEL_FROM_DATABASE=HD Graphics 620
+
+pci:v00008086d00005916sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=HD Graphics 620 (ThinkPad X1 Carbon 5th Gen)
+
 pci:v00008086d00005A84*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series Integrated Graphics Controller
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series Integrated Graphics Controller
 
 pci:v00008086d00005A88*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series Imaging Unit
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series Imaging Unit
 
 pci:v00008086d00005A98*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series Audio Cluster
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series Audio Cluster
 
 pci:v00008086d00005A9A*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series Trusted Execution Engine
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series Trusted Execution Engine
 
 pci:v00008086d00005AA2*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series Integrated Sensor Hub
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series Integrated Sensor Hub
 
 pci:v00008086d00005AA8*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series USB xHCI
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series USB xHCI
 
 pci:v00008086d00005AAC*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #1
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #1
 
 pci:v00008086d00005AAE*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #2
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #2
 
 pci:v00008086d00005AB0*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #3
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #3
 
 pci:v00008086d00005AB2*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #4
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #4
 
 pci:v00008086d00005AB4*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #5
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #5
 
 pci:v00008086d00005AB6*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #6
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #6
 
 pci:v00008086d00005AB8*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #7
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #7
 
 pci:v00008086d00005ABA*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #8
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #8
 
 pci:v00008086d00005ABC*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series HSUART Controller #1
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series HSUART Controller #1
 
 pci:v00008086d00005ABE*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series HSUART Controller #2
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series HSUART Controller #2
 
 pci:v00008086d00005AC0*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series HSUART Controller #3
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series HSUART Controller #3
 
 pci:v00008086d00005AC2*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series SPI Controller #1
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series SPI Controller #1
 
 pci:v00008086d00005AC4*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series SPI Controller #2
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series SPI Controller #2
 
 pci:v00008086d00005AC6*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series SPI Controller #3
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series SPI Controller #3
 
 pci:v00008086d00005AC8*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series PWM Pin Controller
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series PWM Pin Controller
 
 pci:v00008086d00005ACA*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series SDXC/MMC Host Controller
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series SDXC/MMC Host Controller
 
 pci:v00008086d00005ACC*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series eMMC Controller
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series eMMC Controller
 
 pci:v00008086d00005AD0*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series SDIO Controller
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series SDIO Controller
 
 pci:v00008086d00005AD4*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series SMBus Controller
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series SMBus Controller
 
 pci:v00008086d00005AD6*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series PCI Express Port B #1
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port B #1
 
 pci:v00008086d00005AD7*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series PCI Express Port B #2
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port B #2
 
 pci:v00008086d00005AD8*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series PCI Express Port A #1
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port A #1
 
 pci:v00008086d00005AD9*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series PCI Express Port A #2
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port A #2
 
 pci:v00008086d00005ADA*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series PCI Express Port A #3
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port A #3
 
 pci:v00008086d00005ADB*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series PCI Express Port A #4
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port A #4
 
 pci:v00008086d00005AE3*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series SATA AHCI Controller
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series SATA AHCI Controller
 
 pci:v00008086d00005AE8*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series Low Pin Count Interface
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series Low Pin Count Interface
 
 pci:v00008086d00005AEE*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series HSUART Controller #4
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series HSUART Controller #4
 
 pci:v00008086d00005AF0*
- ID_MODEL_FROM_DATABASE=Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series Host Bridge
+ ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series Host Bridge
 
 pci:v00008086d000065C0*
  ID_MODEL_FROM_DATABASE=5100 Chipset Memory Controller Hub
@@ -80396,24 +82673,63 @@ pci:v00008086d00009D03*
 pci:v00008086d00009D03sv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP SATA Controller [AHCI mode] (Latitude 3570)
 
+pci:v00008086d00009D03sv000017AAsd0000382A*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP SATA Controller [AHCI mode] (B51-80 Laptop)
+
+pci:v00008086d00009D10*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #1
+
+pci:v00008086d00009D12*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #3
+
 pci:v00008086d00009D14*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #5
 
+pci:v00008086d00009D14sv000017AAsd0000382A*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #5 (B51-80 Laptop)
+
 pci:v00008086d00009D15*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #6
 
+pci:v00008086d00009D15sv000017AAsd0000382A*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #6 (B51-80 Laptop)
+
+pci:v00008086d00009D16*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #7
+
+pci:v00008086d00009D17*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #8
+
+pci:v00008086d00009D18*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #9
+
+pci:v00008086d00009D18sv000017AAsd0000382A*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #9 (B51-80 Laptop)
+
 pci:v00008086d00009D21*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP PMC
 
 pci:v00008086d00009D21sv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP PMC (Latitude 3570)
 
+pci:v00008086d00009D21sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PMC (ThinkPad X1 Carbon 5th Gen)
+
+pci:v00008086d00009D21sv000017AAsd0000382A*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PMC (B51-80 Laptop)
+
 pci:v00008086d00009D23*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP SMBus
 
 pci:v00008086d00009D23sv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP SMBus (Latitude 3570)
 
+pci:v00008086d00009D23sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP SMBus (ThinkPad X1 Carbon 5th Gen)
+
+pci:v00008086d00009D23sv000017AAsd0000382A*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP SMBus (B51-80 Laptop)
+
 pci:v00008086d00009D27*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Serial IO UART Controller #0
 
@@ -80435,24 +82751,51 @@ pci:v00008086d00009D2F*
 pci:v00008086d00009D2Fsv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP USB 3.0 xHCI Controller (Latitude 3570)
 
+pci:v00008086d00009D2Fsv000017AAsd0000382A*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP USB 3.0 xHCI Controller (B51-80 Laptop)
+
 pci:v00008086d00009D31*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Thermal subsystem
 
 pci:v00008086d00009D31sv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Thermal subsystem (Latitude 3570)
 
+pci:v00008086d00009D31sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP Thermal subsystem (ThinkPad X1 Carbon 5th Gen)
+
+pci:v00008086d00009D31sv000017AAsd0000382A*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP Thermal subsystem (B51-80 Laptop)
+
 pci:v00008086d00009D3A*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP CSME HECI #1
 
 pci:v00008086d00009D3Asv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP CSME HECI #1 (Latitude 3570)
 
+pci:v00008086d00009D3Asv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP CSME HECI #1 (ThinkPad X1 Carbon 5th Gen)
+
+pci:v00008086d00009D3Asv000017AAsd0000382A*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP CSME HECI #1 (B51-80 Laptop)
+
+pci:v00008086d00009D43*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP LPC Controller
+
+pci:v00008086d00009D43sv000017AAsd0000382A*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP LPC Controller (B51-80 Laptop)
+
 pci:v00008086d00009D48*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP LPC Controller
 
 pci:v00008086d00009D48sv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP LPC Controller (Latitude 3570)
 
+pci:v00008086d00009D58*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP LPC Controller
+
+pci:v00008086d00009D58sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP LPC Controller (ThinkPad X1 Carbon 5th Gen)
+
 pci:v00008086d00009D60*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Serial IO I2C Controller #0
 
@@ -80486,6 +82829,9 @@ pci:v00008086d00009D70*
 pci:v00008086d00009D70sv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP HD Audio (Latitude 3570)
 
+pci:v00008086d00009D70sv000017AAsd0000382A*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP HD Audio (B51-80 Laptop)
+
 pci:v00008086d0000A000*
  ID_MODEL_FROM_DATABASE=Atom Processor D4xx/D5xx/N4xx/N5xx DMI Bridge
 
@@ -80786,6 +83132,9 @@ pci:v00008086d0000A170*
 pci:v00008086d0000A182*
  ID_MODEL_FROM_DATABASE=Lewisburg SATA Controller [AHCI mode]
 
+pci:v00008086d0000A186*
+ ID_MODEL_FROM_DATABASE=Lewisburg SATA Controller [RAID mode]
+
 pci:v00008086d0000A190*
  ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #1
 
@@ -80891,6 +83240,9 @@ pci:v00008086d0000A1C7*
 pci:v00008086d0000A1D2*
  ID_MODEL_FROM_DATABASE=Lewisburg SSATA Controller [AHCI mode]
 
+pci:v00008086d0000A1D6*
+ ID_MODEL_FROM_DATABASE=Lewisburg SSATA Controller [RAID mode]
+
 pci:v00008086d0000A1E7*
  ID_MODEL_FROM_DATABASE=Lewisburg PCI Express Root Port #17
 
@@ -80924,6 +83276,171 @@ pci:v00008086d0000A1FB*
 pci:v00008086d0000A1FC*
  ID_MODEL_FROM_DATABASE=Lewisburg IE: HECI #3
 
+pci:v00008086d0000A202*
+ ID_MODEL_FROM_DATABASE=Lewisburg SATA Controller [AHCI mode]
+
+pci:v00008086d0000A206*
+ ID_MODEL_FROM_DATABASE=Lewisburg SATA Controller [RAID mode]
+
+pci:v00008086d0000A223*
+ ID_MODEL_FROM_DATABASE=Lewisburg SMBus
+
+pci:v00008086d0000A224*
+ ID_MODEL_FROM_DATABASE=Lewisburg SPI Controller
+
+pci:v00008086d0000A242*
+ ID_MODEL_FROM_DATABASE=Lewisburg LPC or eSPI Controller
+
+pci:v00008086d0000A243*
+ ID_MODEL_FROM_DATABASE=Lewisburg LPC or eSPI Controller
+
+pci:v00008086d0000A252*
+ ID_MODEL_FROM_DATABASE=Lewisburg SSATA Controller [AHCI mode]
+
+pci:v00008086d0000A256*
+ ID_MODEL_FROM_DATABASE=Lewisburg SSATA Controller [RAID mode]
+
+pci:v00008086d0000A282*
+ ID_MODEL_FROM_DATABASE=200 Series PCH SATA controller [AHCI mode]
+
+pci:v00008086d0000A286*
+ ID_MODEL_FROM_DATABASE=200 Series PCH SATA controller [RAID mode]
+
+pci:v00008086d0000A290*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #1
+
+pci:v00008086d0000A291*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #2
+
+pci:v00008086d0000A292*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #3
+
+pci:v00008086d0000A293*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #4
+
+pci:v00008086d0000A294*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #5
+
+pci:v00008086d0000A295*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #6
+
+pci:v00008086d0000A296*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #7
+
+pci:v00008086d0000A297*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #8
+
+pci:v00008086d0000A298*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #9
+
+pci:v00008086d0000A299*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #10
+
+pci:v00008086d0000A29A*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #11
+
+pci:v00008086d0000A29B*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #12
+
+pci:v00008086d0000A29C*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #13
+
+pci:v00008086d0000A29D*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #14
+
+pci:v00008086d0000A29E*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #15
+
+pci:v00008086d0000A29F*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #16
+
+pci:v00008086d0000A2A1*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PMC
+
+pci:v00008086d0000A2A3*
+ ID_MODEL_FROM_DATABASE=200 Series PCH SMBus Controller
+
+pci:v00008086d0000A2A7*
+ ID_MODEL_FROM_DATABASE=200 Series PCH Serial IO UART Controller #0
+
+pci:v00008086d0000A2A8*
+ ID_MODEL_FROM_DATABASE=200 Series PCH Serial IO UART Controller #1
+
+pci:v00008086d0000A2A9*
+ ID_MODEL_FROM_DATABASE=200 Series PCH Serial IO SPI Controller #0
+
+pci:v00008086d0000A2AA*
+ ID_MODEL_FROM_DATABASE=200 Series PCH Serial IO SPI Controller #1
+
+pci:v00008086d0000A2AF*
+ ID_MODEL_FROM_DATABASE=200 Series PCH USB 3.0 xHCI Controller
+
+pci:v00008086d0000A2B1*
+ ID_MODEL_FROM_DATABASE=200 Series PCH Thermal Subsystem
+
+pci:v00008086d0000A2BA*
+ ID_MODEL_FROM_DATABASE=200 Series PCH CSME HECI #1
+
+pci:v00008086d0000A2BB*
+ ID_MODEL_FROM_DATABASE=200 Series PCH CSME HECI #2
+
+pci:v00008086d0000A2C4*
+ ID_MODEL_FROM_DATABASE=200 Series PCH LPC Controller (H270)
+
+pci:v00008086d0000A2C5*
+ ID_MODEL_FROM_DATABASE=200 Series PCH LPC Controller (Z270)
+
+pci:v00008086d0000A2C6*
+ ID_MODEL_FROM_DATABASE=200 Series PCH LPC Controller (Q270)
+
+pci:v00008086d0000A2C7*
+ ID_MODEL_FROM_DATABASE=200 Series PCH LPC Controller (Q250)
+
+pci:v00008086d0000A2C8*
+ ID_MODEL_FROM_DATABASE=200 Series PCH LPC Controller (B250)
+
+pci:v00008086d0000A2E0*
+ ID_MODEL_FROM_DATABASE=200 Series PCH Serial IO I2C Controller #0
+
+pci:v00008086d0000A2E1*
+ ID_MODEL_FROM_DATABASE=200 Series PCH Serial IO I2C Controller #1
+
+pci:v00008086d0000A2E2*
+ ID_MODEL_FROM_DATABASE=200 Series PCH Serial IO I2C Controller #2
+
+pci:v00008086d0000A2E3*
+ ID_MODEL_FROM_DATABASE=200 Series PCH Serial IO I2C Controller #3
+
+pci:v00008086d0000A2E6*
+ ID_MODEL_FROM_DATABASE=200 Series PCH Serial IO UART Controller #2
+
+pci:v00008086d0000A2E7*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #17
+
+pci:v00008086d0000A2E8*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #18
+
+pci:v00008086d0000A2E9*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #19
+
+pci:v00008086d0000A2EA*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #20
+
+pci:v00008086d0000A2EB*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #21
+
+pci:v00008086d0000A2EC*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #22
+
+pci:v00008086d0000A2ED*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #23
+
+pci:v00008086d0000A2EE*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #24
+
+pci:v00008086d0000A2F0*
+ ID_MODEL_FROM_DATABASE=200 Series PCH HD Audio
+
 pci:v00008086d0000A620*
  ID_MODEL_FROM_DATABASE=6400/6402 Advanced Memory Buffer (AMB)
 
@@ -82004,6 +84521,48 @@ pci:v00009005d0000028Dsv00009005sd00000553*
 pci:v00009005d0000028Dsv00009005sd00000554*
  ID_MODEL_FROM_DATABASE=Series 8 12G SAS/PCIe 3 (Series 8 - ASR-8885 - 8 internal 8 external 12G SAS Port/PCIe 3.0)
 
+pci:v00009005d0000028F*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3
+
+pci:v00009005d0000028Fsv0000103Csd00000600*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P408i-p SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000601*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P408e-p SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000602*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P408i-a SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000603*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P408i-c SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000650*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array E208i-p SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000651*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array E208e-p SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000652*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array E208i-c SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000654*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array E208i-a SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000655*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P408e-m SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000700*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P204i-c SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000701*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P204i-b SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00001100*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P816i-a SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00001101*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P416ie-m SR G10)
+
 pci:v00009005d00000410*
  ID_MODEL_FROM_DATABASE=AIC-9410W SAS (Razor HBA RAID)
 
@@ -83201,12 +85760,21 @@ pci:v0000F1D0d0000CFEE*
 pci:v0000F1D0d0000DAFF*
  ID_MODEL_FROM_DATABASE=KONA LHi
 
+pci:v0000F1D0d0000DB01*
+ ID_MODEL_FROM_DATABASE=Corvid22
+
+pci:v0000F1D0d0000DB09*
+ ID_MODEL_FROM_DATABASE=Corvid 24
+
 pci:v0000F1D0d0000DCAF*
  ID_MODEL_FROM_DATABASE=Kona HD
 
 pci:v0000F1D0d0000DFEE*
  ID_MODEL_FROM_DATABASE=Xena HD-DA
 
+pci:v0000F1D0d0000EB0E*
+ ID_MODEL_FROM_DATABASE=Corvid 44
+
 pci:v0000F1D0d0000EFAC*
  ID_MODEL_FROM_DATABASE=Xena SD-MM/SD-22-MM
 
index fec0fb4..7583253 100644 (file)
@@ -50,6 +50,9 @@ usb:v0127*
 usb:v0127p0002*
  ID_MODEL_FROM_DATABASE=HDM Interface
 
+usb:v0127p0127*
+ ID_MODEL_FROM_DATABASE=ibp
+
 usb:v0145*
  ID_VENDOR_FROM_DATABASE=Unknown
 
@@ -287,9 +290,15 @@ usb:v03EBp2140*
 usb:v03EBp2141*
  ID_MODEL_FROM_DATABASE=ICE debugger
 
+usb:v03EBp2145*
+ ID_MODEL_FROM_DATABASE=ATMEGA328P-XMINI (CDC ACM)
+
 usb:v03EBp2310*
  ID_MODEL_FROM_DATABASE=EVK11xx evaluation board
 
+usb:v03EBp2404*
+ ID_MODEL_FROM_DATABASE=The Micro
+
 usb:v03EBp2FE4*
  ID_MODEL_FROM_DATABASE=ATxmega32A4U DFU bootloader
 
@@ -1058,6 +1067,9 @@ usb:v03F0p2212*
 usb:v03F0p2217*
  ID_MODEL_FROM_DATABASE=color LaserJet 9500 MFP
 
+usb:v03F0p222A*
+ ID_MODEL_FROM_DATABASE=LaserJet Pro MFP M125nw
+
 usb:v03F0p2302*
  ID_MODEL_FROM_DATABASE=PhotoSmart 7600 series
 
@@ -1328,6 +1340,9 @@ usb:v03F0p3902*
 usb:v03F0p3912*
  ID_MODEL_FROM_DATABASE=Officejet Pro 8500
 
+usb:v03F0p3917*
+ ID_MODEL_FROM_DATABASE=LaserJet P2014
+
 usb:v03F0p3A02*
  ID_MODEL_FROM_DATABASE=PhotoSmart 7150
 
@@ -1814,6 +1829,9 @@ usb:v03F0p8804*
 usb:v03F0p8904*
  ID_MODEL_FROM_DATABASE=DeskJet 6940 series
 
+usb:v03F0p8911*
+ ID_MODEL_FROM_DATABASE=Deskjet 1050 J410
+
 usb:v03F0p8C07*
  ID_MODEL_FROM_DATABASE=Digital Stereo Headset
 
@@ -1826,6 +1844,9 @@ usb:v03F0p9002*
 usb:v03F0p9102*
  ID_MODEL_FROM_DATABASE=PhotoSmart M537
 
+usb:v03F0p9207*
+ ID_MODEL_FROM_DATABASE=HD-4110 Webcam
+
 usb:v03F0p9302*
  ID_MODEL_FROM_DATABASE=PhotoSmart R930 series
 
@@ -2048,6 +2069,9 @@ usb:v03FD*
 usb:v03FDp0008*
  ID_MODEL_FROM_DATABASE=Platform Cable USB II
 
+usb:v03FDp0050*
+ ID_MODEL_FROM_DATABASE=dfu downloader
+
 usb:v03FE*
  ID_VENDOR_FROM_DATABASE=Farallon Comunications
 
@@ -2172,7 +2196,7 @@ usb:v0403p6009*
  ID_MODEL_FROM_DATABASE=Serial Converter
 
 usb:v0403p6010*
- ID_MODEL_FROM_DATABASE=FT2232C Dual USB-UART/FIFO IC
+ ID_MODEL_FROM_DATABASE=FT2232C/D/H Dual UART/FIFO IC
 
 usb:v0403p6011*
  ID_MODEL_FROM_DATABASE=FT4232H Quad HS USB-UART/FIFO IC
@@ -2303,6 +2327,9 @@ usb:v0403pBFDB*
 usb:v0403pBFDC*
  ID_MODEL_FROM_DATABASE=OpenDCC (GBM)
 
+usb:v0403pC580*
+ ID_MODEL_FROM_DATABASE=HID UNIKEY dongle [F-Response]
+
 usb:v0403pC630*
  ID_MODEL_FROM_DATABASE=lcd2usb interface
 
@@ -3785,6 +3812,9 @@ usb:v041Ep3121*
 usb:v041Ep3220*
  ID_MODEL_FROM_DATABASE=Sound Blaster Tactic(3D) Sigma sound card
 
+usb:v041Ep3232*
+ ID_MODEL_FROM_DATABASE=Sound Blaster Premium HD [SBX]
+
 usb:v041Ep3F00*
  ID_MODEL_FROM_DATABASE=E-Mu Xboard 25 MIDI Controller
 
@@ -4760,6 +4790,15 @@ usb:v0430pA102*
 usb:v0430pA103*
  ID_MODEL_FROM_DATABASE=remote storage for P3 chip
 
+usb:v0430pA111*
+ ID_MODEL_FROM_DATABASE=remote keyboard for P4 chip
+
+usb:v0430pA112*
+ ID_MODEL_FROM_DATABASE=remote mouse for P4 chip
+
+usb:v0430pA113*
+ ID_MODEL_FROM_DATABASE=remote storage for P4 chip
+
 usb:v0430pA4A2*
  ID_MODEL_FROM_DATABASE=Ethernet (RNDIS and CDC ethernet)
 
@@ -5258,6 +5297,12 @@ usb:v043E*
 usb:v043Ep3001*
  ID_MODEL_FROM_DATABASE=AN-WF100 802.11abgn Wireless Adapter [Broadcom BCM4323]
 
+usb:v043Ep3004*
+ ID_MODEL_FROM_DATABASE=TWFM-B003D 802.11abgn Wireless Module [Broadcom BCM43236B]
+
+usb:v043Ep3101*
+ ID_MODEL_FROM_DATABASE=AN-WF500 802.11abgn + BT Wireless Adapter [Broadcom BCM43242]
+
 usb:v043Ep42BD*
  ID_MODEL_FROM_DATABASE=Flatron 795FT Plus Monitor
 
@@ -5417,6 +5462,12 @@ usb:v044F*
 usb:v044Fp0400*
  ID_MODEL_FROM_DATABASE=HOTAS Cougar
 
+usb:v044Fp0402*
+ ID_MODEL_FROM_DATABASE=HOTAS Warthog Joystick
+
+usb:v044Fp0404*
+ ID_MODEL_FROM_DATABASE=HOTAS Warthog Throttle
+
 usb:v044Fp044F*
  ID_MODEL_FROM_DATABASE=GP XID
 
@@ -5486,6 +5537,9 @@ usb:v044FpB653*
 usb:v044FpB654*
  ID_MODEL_FROM_DATABASE=Ferrari GT Force Feedback Wheel
 
+usb:v044FpB687*
+ ID_MODEL_FROM_DATABASE=TWCS Throttle
+
 usb:v044FpB700*
  ID_MODEL_FROM_DATABASE=Tacticalboard
 
@@ -6207,7 +6261,7 @@ usb:v045Ep0084*
  ID_MODEL_FROM_DATABASE=Basic Optical Mouse
 
 usb:v045Ep008A*
- ID_MODEL_FROM_DATABASE=Wireless Keyboard and Mouse
+ ID_MODEL_FROM_DATABASE=Wireless Optical Desktop Receiver 2.0A
 
 usb:v045Ep008B*
  ID_MODEL_FROM_DATABASE=Dual Receiver Wireless Mouse (IntelliPoint)
@@ -6386,6 +6440,15 @@ usb:v045Ep02D5*
 usb:v045Ep02DD*
  ID_MODEL_FROM_DATABASE=Xbox One Controller (Covert Forces/Firmware 2015)
 
+usb:v045Ep02E3*
+ ID_MODEL_FROM_DATABASE=Xbox One Elite Controller
+
+usb:v045Ep02E6*
+ ID_MODEL_FROM_DATABASE=Wireless XBox Controller Dongle
+
+usb:v045Ep02EA*
+ ID_MODEL_FROM_DATABASE=Xbox One S Controller
+
 usb:v045Ep0400*
  ID_MODEL_FROM_DATABASE=Windows Powered Pocket PC 2002
 
@@ -6836,6 +6899,12 @@ usb:v045Ep0752*
 usb:v045Ep075D*
  ID_MODEL_FROM_DATABASE=LifeCam Cinema
 
+usb:v045Ep0761*
+ ID_MODEL_FROM_DATABASE=LifeCam VX-2000
+
+usb:v045Ep0765*
+ ID_MODEL_FROM_DATABASE=Xbox360 Slim Internal Wireless Module (1400) [Marvell 88W8786U]
+
 usb:v045Ep0766*
  ID_MODEL_FROM_DATABASE=LifeCam VX-800
 
@@ -6854,6 +6923,9 @@ usb:v045Ep0772*
 usb:v045Ep0779*
  ID_MODEL_FROM_DATABASE=LifeCam HD-3000
 
+usb:v045Ep077F*
+ ID_MODEL_FROM_DATABASE=LifeChat LX-6000 Headset
+
 usb:v045Ep0780*
  ID_MODEL_FROM_DATABASE=Comfort Curve Keyboard 3000
 
@@ -6863,6 +6935,9 @@ usb:v045Ep0797*
 usb:v045Ep07A5*
  ID_MODEL_FROM_DATABASE=Wireless Receiver 1461C
 
+usb:v045Ep07B9*
+ ID_MODEL_FROM_DATABASE=Wired Keyboard 200
+
 usb:v045Ep07CA*
  ID_MODEL_FROM_DATABASE=Surface Pro 3 Docking Station Audio Device
 
@@ -7130,6 +7205,12 @@ usb:v046Ap002A*
 usb:v046Ap002D*
  ID_MODEL_FROM_DATABASE=SmartTerminal XX44
 
+usb:v046Ap003C*
+ ID_MODEL_FROM_DATABASE=Raptor Gaming Keyboard
+
+usb:v046Ap003D*
+ ID_MODEL_FROM_DATABASE=Raptor Gaming Keyboard Integrated Hub
+
 usb:v046Ap003E*
  ID_MODEL_FROM_DATABASE=SmartTerminal ST-2xxx
 
@@ -7148,6 +7229,12 @@ usb:v046Ap0106*
 usb:v046Ap010D*
  ID_MODEL_FROM_DATABASE=MX-Board 3.0 Keyboard
 
+usb:v046ApB090*
+ ID_MODEL_FROM_DATABASE=Keyboard
+
+usb:v046ApB091*
+ ID_MODEL_FROM_DATABASE=Mouse
+
 usb:v046B*
  ID_VENDOR_FROM_DATABASE=American Megatrends, Inc.
 
@@ -7253,6 +7340,9 @@ usb:v046Dp0828*
 usb:v046Dp082B*
  ID_MODEL_FROM_DATABASE=Webcam C170
 
+usb:v046Dp082C*
+ ID_MODEL_FROM_DATABASE=HD Webcam C615
+
 usb:v046Dp082D*
  ID_MODEL_FROM_DATABASE=HD Pro Webcam C920
 
@@ -7589,15 +7679,24 @@ usb:v046Dp0A38*
 usb:v046Dp0A44*
  ID_MODEL_FROM_DATABASE=Headset H390
 
+usb:v046Dp0A45*
+ ID_MODEL_FROM_DATABASE=960 Headset
+
 usb:v046Dp0A4D*
  ID_MODEL_FROM_DATABASE=G430 Surround Sound Gaming Headset
 
+usb:v046Dp0A5B*
+ ID_MODEL_FROM_DATABASE=G933 Wireless Headset Dongle
+
 usb:v046Dp0B02*
  ID_MODEL_FROM_DATABASE=C-UV35 [Bluetooth Mini-Receiver] (HID proxy mode)
 
 usb:v046Dp8801*
  ID_MODEL_FROM_DATABASE=Video Camera
 
+usb:v046DpB014*
+ ID_MODEL_FROM_DATABASE=Bluetooth Mouse M336/M337/M535
+
 usb:v046DpB305*
  ID_MODEL_FROM_DATABASE=BT Mini-Receiver
 
@@ -7814,6 +7913,9 @@ usb:v046DpC07D*
 usb:v046DpC07E*
  ID_MODEL_FROM_DATABASE=G402 Gaming Mouse
 
+usb:v046DpC083*
+ ID_MODEL_FROM_DATABASE=G403 Prodigy Gaming Mouse
+
 usb:v046DpC101*
  ID_MODEL_FROM_DATABASE=UltraX Media Remote
 
@@ -7881,7 +7983,7 @@ usb:v046DpC20E*
  ID_MODEL_FROM_DATABASE=WingMan Formula GP
 
 usb:v046DpC211*
- ID_MODEL_FROM_DATABASE=iTouch Cordless Reciever
+ ID_MODEL_FROM_DATABASE=iTouch Cordless Receiver
 
 usb:v046DpC212*
  ID_MODEL_FROM_DATABASE=WingMan Extreme Digital 3D
@@ -7955,6 +8057,9 @@ usb:v046DpC22D*
 usb:v046DpC22E*
  ID_MODEL_FROM_DATABASE=G510 Gaming Keyboard onboard audio
 
+usb:v046DpC231*
+ ID_MODEL_FROM_DATABASE=G13 Virtual Mouse
+
 usb:v046DpC245*
  ID_MODEL_FROM_DATABASE=G400 Optical Mouse
 
@@ -8021,6 +8126,9 @@ usb:v046DpC2A0*
 usb:v046DpC2A1*
  ID_MODEL_FROM_DATABASE=WingMan Force Feedback Mouse
 
+usb:v046DpC2AB*
+ ID_MODEL_FROM_DATABASE=G13 Joystick
+
 usb:v046DpC301*
  ID_MODEL_FROM_DATABASE=iTouch Keyboard
 
@@ -8093,6 +8201,15 @@ usb:v046DpC31C*
 usb:v046DpC31D*
  ID_MODEL_FROM_DATABASE=Media Keyboard K200
 
+usb:v046DpC31F*
+ ID_MODEL_FROM_DATABASE=Comfort Keyboard K290
+
+usb:v046DpC332*
+ ID_MODEL_FROM_DATABASE=G502 Proteus Spectrum Optical Mouse
+
+usb:v046DpC335*
+ ID_MODEL_FROM_DATABASE=G910 Orion Spectrum Mechanical Keyboard
+
 usb:v046DpC401*
  ID_MODEL_FROM_DATABASE=TrackMan Marble Wheel
 
@@ -9119,6 +9236,9 @@ usb:v0480pA208*
 usb:v0480pB001*
  ID_MODEL_FROM_DATABASE=Stor.E Partner
 
+usb:v0480pB207*
+ ID_MODEL_FROM_DATABASE=Canvio Ready
+
 usb:v0480pD000*
  ID_MODEL_FROM_DATABASE=External Disk 2TB Model DT01ABA200
 
@@ -9170,6 +9290,9 @@ usb:v0482p0203*
 usb:v0482p0204*
  ID_MODEL_FROM_DATABASE=iBurst Terminal
 
+usb:v0482p0408*
+ ID_MODEL_FROM_DATABASE=FS-1320D Printer
+
 usb:v0483*
  ID_VENDOR_FROM_DATABASE=STMicroelectronics
 
@@ -9329,6 +9452,9 @@ usb:v048D*
 usb:v048Dp1165*
  ID_MODEL_FROM_DATABASE=IT1165 Flash Controller
 
+usb:v048Dp1172*
+ ID_MODEL_FROM_DATABASE=Flash Drive
+
 usb:v048Dp1336*
  ID_MODEL_FROM_DATABASE=SD/MMC Cardreader
 
@@ -9353,6 +9479,9 @@ usb:v048Dp9503*
 usb:v048Dp9507*
  ID_MODEL_FROM_DATABASE=ITE it9507 full featured DVB-T transmission chip [ccHDtv]
 
+usb:v048Dp9910*
+ ID_MODEL_FROM_DATABASE=IT9910 chipset based grabber
+
 usb:v048F*
  ID_VENDOR_FROM_DATABASE=Eicon Tech.
 
@@ -9551,6 +9680,9 @@ usb:v0499p1054*
 usb:v0499p160F*
  ID_MODEL_FROM_DATABASE=P-105
 
+usb:v0499p1613*
+ ID_MODEL_FROM_DATABASE=Clavinova CLP535
+
 usb:v0499p2000*
  ID_MODEL_FROM_DATABASE=DGP-7
 
@@ -10109,6 +10241,9 @@ usb:v04A7p04A0*
 usb:v04A7p04AC*
  ID_MODEL_FROM_DATABASE=Xerox Travel Scanner 100
 
+usb:v04A7p04CD*
+ ID_MODEL_FROM_DATABASE=Xerox Travel Scanner 150
+
 usb:v04A8*
  ID_VENDOR_FROM_DATABASE=Multivideo Labs, Inc.
 
@@ -10325,6 +10460,9 @@ usb:v04A9p10A9*
 usb:v04A9p10B6*
  ID_MODEL_FROM_DATABASE=PIXMA iP4300 Printer
 
+usb:v04A9p10B7*
+ ID_MODEL_FROM_DATABASE=PIXMA iP5300 Printer
+
 usb:v04A9p10C2*
  ID_MODEL_FROM_DATABASE=PIXMA iP1800 Printer
 
@@ -10332,7 +10470,13 @@ usb:v04A9p10C4*
  ID_MODEL_FROM_DATABASE=Pixma iP4500 Printer
 
 usb:v04A9p10C9*
- ID_MODEL_FROM_DATABASE=PIXIMA iP4600 Printer
+ ID_MODEL_FROM_DATABASE=PIXMA iP4600 Printer
+
+usb:v04A9p10CA*
+ ID_MODEL_FROM_DATABASE=PIXMA iP3600 Printer
+
+usb:v04A9p10E3*
+ ID_MODEL_FROM_DATABASE=PIXMA iX6850 Printer
 
 usb:v04A9p1404*
  ID_MODEL_FROM_DATABASE=W6400PG
@@ -10355,6 +10499,12 @@ usb:v04A9p1601*
 usb:v04A9p1607*
  ID_MODEL_FROM_DATABASE=DR-6080 Scanner
 
+usb:v04A9p1608*
+ ID_MODEL_FROM_DATABASE=DR-2580C Scanner
+
+usb:v04A9p1609*
+ ID_MODEL_FROM_DATABASE=DR-3080CII
+
 usb:v04A9p1700*
  ID_MODEL_FROM_DATABASE=PIXMA MP110 Scanner
 
@@ -10374,10 +10524,10 @@ usb:v04A9p1706*
  ID_MODEL_FROM_DATABASE=PIXMA MP750 Scanner
 
 usb:v04A9p1707*
- ID_MODEL_FROM_DATABASE=PIXMA MP780 Scanner
+ ID_MODEL_FROM_DATABASE=PIXMA MP780/MP790
 
 usb:v04A9p1708*
- ID_MODEL_FROM_DATABASE=PIXMA MP760 Scanner
+ ID_MODEL_FROM_DATABASE=PIXMA MP760/MP770
 
 usb:v04A9p1709*
  ID_MODEL_FROM_DATABASE=PIXMA MP150 Scanner
@@ -10395,13 +10545,13 @@ usb:v04A9p170D*
  ID_MODEL_FROM_DATABASE=PIXMA MP800 Scanner
 
 usb:v04A9p170E*
- ID_MODEL_FROM_DATABASE=MP800R
+ ID_MODEL_FROM_DATABASE=PIXMA MP800R
 
 usb:v04A9p1710*
  ID_MODEL_FROM_DATABASE=MP950
 
 usb:v04A9p1712*
- ID_MODEL_FROM_DATABASE=MP530
+ ID_MODEL_FROM_DATABASE=PIXMA MP530
 
 usb:v04A9p1713*
  ID_MODEL_FROM_DATABASE=PIXMA MP830 Scanner
@@ -10410,73 +10560,259 @@ usb:v04A9p1714*
  ID_MODEL_FROM_DATABASE=MP160
 
 usb:v04A9p1715*
- ID_MODEL_FROM_DATABASE=MP180 Storage
+ ID_MODEL_FROM_DATABASE=PIXMA MP180
 
 usb:v04A9p1716*
- ID_MODEL_FROM_DATABASE=MP460 Composite
+ ID_MODEL_FROM_DATABASE=PIXMA MP460
 
 usb:v04A9p1717*
- ID_MODEL_FROM_DATABASE=MP510
+ ID_MODEL_FROM_DATABASE=PIXMA MP510
 
 usb:v04A9p1718*
- ID_MODEL_FROM_DATABASE=MP600 Storage
+ ID_MODEL_FROM_DATABASE=PIXMA MP600
+
+usb:v04A9p1719*
+ ID_MODEL_FROM_DATABASE=PIXMA MP600R
 
 usb:v04A9p171A*
- ID_MODEL_FROM_DATABASE=MP810 Storage
+ ID_MODEL_FROM_DATABASE=PIXMA MP810
 
 usb:v04A9p171B*
- ID_MODEL_FROM_DATABASE=MP960
+ ID_MODEL_FROM_DATABASE=PIXMA MP960
+
+usb:v04A9p171C*
+ ID_MODEL_FROM_DATABASE=PIXMA MX7600
 
 usb:v04A9p1721*
- ID_MODEL_FROM_DATABASE=MP210 ser
+ ID_MODEL_FROM_DATABASE=PIXMA MP210
+
+usb:v04A9p1722*
+ ID_MODEL_FROM_DATABASE=PIXMA MP220
 
 usb:v04A9p1723*
- ID_MODEL_FROM_DATABASE=MP470 ser
+ ID_MODEL_FROM_DATABASE=PIXMA MP470
 
 usb:v04A9p1724*
  ID_MODEL_FROM_DATABASE=PIXMA MP520 series
 
 usb:v04A9p1725*
- ID_MODEL_FROM_DATABASE=MP610 ser
+ ID_MODEL_FROM_DATABASE=PIXMA MP610
 
 usb:v04A9p1726*
- ID_MODEL_FROM_DATABASE=MP970 ser
+ ID_MODEL_FROM_DATABASE=PIXMA MP970
 
 usb:v04A9p1727*
- ID_MODEL_FROM_DATABASE=MX300 ser
+ ID_MODEL_FROM_DATABASE=PIXMA MX300
 
 usb:v04A9p1728*
- ID_MODEL_FROM_DATABASE=MX310 ser
+ ID_MODEL_FROM_DATABASE=PIXMA MX310 series
 
 usb:v04A9p1729*
- ID_MODEL_FROM_DATABASE=MX700 ser
+ ID_MODEL_FROM_DATABASE=PIXMA MX700
 
 usb:v04A9p172B*
  ID_MODEL_FROM_DATABASE=MP140 ser
 
+usb:v04A9p172C*
+ ID_MODEL_FROM_DATABASE=PIXMA MX850
+
+usb:v04A9p172D*
+ ID_MODEL_FROM_DATABASE=PIXMA MP980
+
+usb:v04A9p172E*
+ ID_MODEL_FROM_DATABASE=PIXMA MP630
+
+usb:v04A9p172F*
+ ID_MODEL_FROM_DATABASE=PIXMA MP620
+
+usb:v04A9p1730*
+ ID_MODEL_FROM_DATABASE=PIXMA MP540
+
+usb:v04A9p1731*
+ ID_MODEL_FROM_DATABASE=PIXMA MP480
+
+usb:v04A9p1732*
+ ID_MODEL_FROM_DATABASE=PIXMA MP240
+
+usb:v04A9p1733*
+ ID_MODEL_FROM_DATABASE=PIXMA MP260
+
+usb:v04A9p1734*
+ ID_MODEL_FROM_DATABASE=PIXMA MP190
+
+usb:v04A9p1735*
+ ID_MODEL_FROM_DATABASE=PIXMA MX860
+
 usb:v04A9p1736*
  ID_MODEL_FROM_DATABASE=PIXMA MX320 series
 
+usb:v04A9p1737*
+ ID_MODEL_FROM_DATABASE=PIXMA MX330
+
 usb:v04A9p173A*
- ID_MODEL_FROM_DATABASE=MP250 series printer
+ ID_MODEL_FROM_DATABASE=PIXMA MP250
 
 usb:v04A9p173B*
  ID_MODEL_FROM_DATABASE=PIXMA MP270 All-In-One Printer
 
+usb:v04A9p173C*
+ ID_MODEL_FROM_DATABASE=PIXMA MP490
+
+usb:v04A9p173D*
+ ID_MODEL_FROM_DATABASE=PIXMA MP550
+
 usb:v04A9p173E*
- ID_MODEL_FROM_DATABASE=MP560
+ ID_MODEL_FROM_DATABASE=PIXMA MP560
 
 usb:v04A9p173F*
- ID_MODEL_FROM_DATABASE=Pixma MP640 Multifunction device
+ ID_MODEL_FROM_DATABASE=PIXMA MP640
+
+usb:v04A9p1740*
+ ID_MODEL_FROM_DATABASE=PIXMA MP990
+
+usb:v04A9p1741*
+ ID_MODEL_FROM_DATABASE=PIXMA MX340
+
+usb:v04A9p1742*
+ ID_MODEL_FROM_DATABASE=PIXMA MX350
+
+usb:v04A9p1743*
+ ID_MODEL_FROM_DATABASE=PIXMA MX870
+
+usb:v04A9p1746*
+ ID_MODEL_FROM_DATABASE=PIXMA MP280
+
+usb:v04A9p1747*
+ ID_MODEL_FROM_DATABASE=PIXMA MP495
 
 usb:v04A9p1748*
- ID_MODEL_FROM_DATABASE=Pixma MG5150
+ ID_MODEL_FROM_DATABASE=PIXMA MG5100 Series
+
+usb:v04A9p1749*
+ ID_MODEL_FROM_DATABASE=PIXMA MG5200 Series
+
+usb:v04A9p174A*
+ ID_MODEL_FROM_DATABASE=PIXMA MG6100 Series
+
+usb:v04A9p174B*
+ ID_MODEL_FROM_DATABASE=PIXMA MG8100 Series
 
 usb:v04A9p174D*
- ID_MODEL_FROM_DATABASE=MX360 ser
+ ID_MODEL_FROM_DATABASE=PIXMA MX360
+
+usb:v04A9p174E*
+ ID_MODEL_FROM_DATABASE=PIXMA MX410
+
+usb:v04A9p174F*
+ ID_MODEL_FROM_DATABASE=PIXMA MX420
+
+usb:v04A9p1750*
+ ID_MODEL_FROM_DATABASE=PIXMA MX880 Series
+
+usb:v04A9p1752*
+ ID_MODEL_FROM_DATABASE=PIXMA MG3100 Series
+
+usb:v04A9p1753*
+ ID_MODEL_FROM_DATABASE=PIXMA MG4100 Series
+
+usb:v04A9p1754*
+ ID_MODEL_FROM_DATABASE=PIXMA MG5300 Series
+
+usb:v04A9p1755*
+ ID_MODEL_FROM_DATABASE=PIXMA MG6200 Series
+
+usb:v04A9p1756*
+ ID_MODEL_FROM_DATABASE=PIXMA MG8200 Series
+
+usb:v04A9p1757*
+ ID_MODEL_FROM_DATABASE=PIXMA MP493
+
+usb:v04A9p1759*
+ ID_MODEL_FROM_DATABASE=PIXMA MX370 Series
+
+usb:v04A9p175B*
+ ID_MODEL_FROM_DATABASE=PIXMA MX430 Series
+
+usb:v04A9p175C*
+ ID_MODEL_FROM_DATABASE=PIXMA MX510 Series
+
+usb:v04A9p175D*
+ ID_MODEL_FROM_DATABASE=PIXMA MX710 Series
+
+usb:v04A9p175E*
+ ID_MODEL_FROM_DATABASE=PIXMA MX890 Series
+
+usb:v04A9p175F*
+ ID_MODEL_FROM_DATABASE=PIXMA MP230
+
+usb:v04A9p1762*
+ ID_MODEL_FROM_DATABASE=PIXMA MG3200 Series
+
+usb:v04A9p1763*
+ ID_MODEL_FROM_DATABASE=PIXMA MG4200 Series
+
+usb:v04A9p1764*
+ ID_MODEL_FROM_DATABASE=PIXMA MG5400 Series
+
+usb:v04A9p1765*
+ ID_MODEL_FROM_DATABASE=PIXMA MG6300 Series
+
+usb:v04A9p1766*
+ ID_MODEL_FROM_DATABASE=PIXMA MX390 Series
+
+usb:v04A9p1768*
+ ID_MODEL_FROM_DATABASE=PIXMA MX450 Series
+
+usb:v04A9p1769*
+ ID_MODEL_FROM_DATABASE=PIXMA MX520 Series
+
+usb:v04A9p176A*
+ ID_MODEL_FROM_DATABASE=PIXMA MX720 Series
+
+usb:v04A9p176B*
+ ID_MODEL_FROM_DATABASE=PIXMA MX920 Series
 
 usb:v04A9p176D*
- ID_MODEL_FROM_DATABASE=PIXMA MG2550
+ ID_MODEL_FROM_DATABASE=PIXMA MG2500 Series
+
+usb:v04A9p176E*
+ ID_MODEL_FROM_DATABASE=PIXMA MG3500 Series
+
+usb:v04A9p176F*
+ ID_MODEL_FROM_DATABASE=PIXMA MG6500 Series
+
+usb:v04A9p1770*
+ ID_MODEL_FROM_DATABASE=PIXMA MG6400 Series
+
+usb:v04A9p1771*
+ ID_MODEL_FROM_DATABASE=PIXMA MG5500 Series
+
+usb:v04A9p1772*
+ ID_MODEL_FROM_DATABASE=PIXMA MG7100 Series
+
+usb:v04A9p1774*
+ ID_MODEL_FROM_DATABASE=PIXMA MX470 Series
+
+usb:v04A9p1775*
+ ID_MODEL_FROM_DATABASE=PIXMA MX530 Series
+
+usb:v04A9p177C*
+ ID_MODEL_FROM_DATABASE=PIXMA MG7500 Series
+
+usb:v04A9p177E*
+ ID_MODEL_FROM_DATABASE=PIXMA MG6600 Series
+
+usb:v04A9p177F*
+ ID_MODEL_FROM_DATABASE=PIXMA MG5600 Series
+
+usb:v04A9p1780*
+ ID_MODEL_FROM_DATABASE=PIXMA MG2900 Series
+
+usb:v04A9p1787*
+ ID_MODEL_FROM_DATABASE=PIXMA MX490 Series
+
+usb:v04A9p178A*
+ ID_MODEL_FROM_DATABASE=PIXMA MG3600 Series
 
 usb:v04A9p178D*
  ID_MODEL_FROM_DATABASE=PIXMA MG6853
@@ -10662,10 +10998,10 @@ usb:v04A9p262D*
  ID_MODEL_FROM_DATABASE=iR C3200
 
 usb:v04A9p262F*
- ID_MODEL_FROM_DATABASE=MultiPASS MP730
+ ID_MODEL_FROM_DATABASE=PIXMA MP730
 
 usb:v04A9p2630*
- ID_MODEL_FROM_DATABASE=MultiPASS MP700
+ ID_MODEL_FROM_DATABASE=PIXMA MP700
 
 usb:v04A9p2631*
  ID_MODEL_FROM_DATABASE=LASER CLASS 700
@@ -10683,16 +11019,16 @@ usb:v04A9p2638*
  ID_MODEL_FROM_DATABASE=iR C3100
 
 usb:v04A9p263C*
- ID_MODEL_FROM_DATABASE=Smartbase MP360
+ ID_MODEL_FROM_DATABASE=PIXMA MP360
 
 usb:v04A9p263D*
- ID_MODEL_FROM_DATABASE=MP370
+ ID_MODEL_FROM_DATABASE=PIXMA MP370
 
 usb:v04A9p263E*
- ID_MODEL_FROM_DATABASE=MP390 FAX
+ ID_MODEL_FROM_DATABASE=PIXMA MP390
 
 usb:v04A9p263F*
- ID_MODEL_FROM_DATABASE=MP375
+ ID_MODEL_FROM_DATABASE=PIXMA MP375R
 
 usb:v04A9p2646*
  ID_MODEL_FROM_DATABASE=MF5530 Scanner Device V1.9.1
@@ -10700,6 +11036,9 @@ usb:v04A9p2646*
 usb:v04A9p2647*
  ID_MODEL_FROM_DATABASE=MF5550 Composite
 
+usb:v04A9p264C*
+ ID_MODEL_FROM_DATABASE=PIXMA MP740
+
 usb:v04A9p264D*
  ID_MODEL_FROM_DATABASE=PIXMA MP710
 
@@ -11525,9 +11864,15 @@ usb:v04A9p3212*
 usb:v04A9p3214*
  ID_MODEL_FROM_DATABASE=SELPHY CP800
 
+usb:v04A9p3215*
+ ID_MODEL_FROM_DATABASE=EOS 60D
+
 usb:v04A9p3218*
  ID_MODEL_FROM_DATABASE=EOS 600D / Rebel T3i (ptp)
 
+usb:v04A9p3219*
+ ID_MODEL_FROM_DATABASE=EOS 1D X
+
 usb:v04A9p3223*
  ID_MODEL_FROM_DATABASE=PowerShot A3300 IS
 
@@ -11576,9 +11921,15 @@ usb:v04A9p3237*
 usb:v04A9p3238*
  ID_MODEL_FROM_DATABASE=PowerShot SX40 HS
 
+usb:v04A9p323A*
+ ID_MODEL_FROM_DATABASE=EOS 5D Mark III
+
 usb:v04A9p323B*
  ID_MODEL_FROM_DATABASE=EOS Rebel T4i
 
+usb:v04A9p323D*
+ ID_MODEL_FROM_DATABASE=EOS M
+
 usb:v04A9p323E*
  ID_MODEL_FROM_DATABASE=PowerShot A1300
 
@@ -11603,6 +11954,9 @@ usb:v04A9p3244*
 usb:v04A9p3245*
  ID_MODEL_FROM_DATABASE=PowerShot SX240 HS
 
+usb:v04A9p3246*
+ ID_MODEL_FROM_DATABASE=PowerShot ELPH 530 HS / IXUS 510 HS
+
 usb:v04A9p3247*
  ID_MODEL_FROM_DATABASE=PowerShot ELPH 520 HS / IXUS 500 HS
 
@@ -11615,6 +11969,15 @@ usb:v04A9p3249*
 usb:v04A9p324A*
  ID_MODEL_FROM_DATABASE=PowerShot A2300
 
+usb:v04A9p3250*
+ ID_MODEL_FROM_DATABASE=EOS 6D
+
+usb:v04A9p3252*
+ ID_MODEL_FROM_DATABASE=EOS 1D C
+
+usb:v04A9p3253*
+ ID_MODEL_FROM_DATABASE=EOS 70D
+
 usb:v04A9p3255*
  ID_MODEL_FROM_DATABASE=SELPHY CP900
 
@@ -11666,9 +12029,24 @@ usb:v04A9p3266*
 usb:v04A9p3268*
  ID_MODEL_FROM_DATABASE=PowerShot ELPH 330 HS / IXUS 255 HS
 
+usb:v04A9p326F*
+ ID_MODEL_FROM_DATABASE=EOS 7D Mark II
+
+usb:v04A9p3270*
+ ID_MODEL_FROM_DATABASE=EOS 100D
+
 usb:v04A9p3271*
  ID_MODEL_FROM_DATABASE=PowerShot A2500
 
+usb:v04A9p3272*
+ ID_MODEL_FROM_DATABASE=EOS 700D
+
+usb:v04A9p3274*
+ ID_MODEL_FROM_DATABASE=PowerShot G16
+
+usb:v04A9p3275*
+ ID_MODEL_FROM_DATABASE=PowerShot S120
+
 usb:v04A9p3276*
  ID_MODEL_FROM_DATABASE=PowerShot SX170 IS
 
@@ -11678,6 +12056,12 @@ usb:v04A9p3277*
 usb:v04A9p3278*
  ID_MODEL_FROM_DATABASE=PowerShot S200
 
+usb:v04A9p327A*
+ ID_MODEL_FROM_DATABASE=SELPHY CP910
+
+usb:v04A9p327B*
+ ID_MODEL_FROM_DATABASE=SELPHY CP820
+
 usb:v04A9p327D*
  ID_MODEL_FROM_DATABASE=Powershot ELPH 115 IS / IXUS 132
 
@@ -11732,15 +12116,36 @@ usb:v04A9p32A6*
 usb:v04A9p32AA*
  ID_MODEL_FROM_DATABASE=Powershot ELPH 160 / IXUS 160
 
+usb:v04A9p32AB*
+ ID_MODEL_FROM_DATABASE=PowerShot ELPH 350HS / IXUS 275 HS
+
 usb:v04A9p32AC*
  ID_MODEL_FROM_DATABASE=PowerShot ELPH 170 IS / IXUS 170
 
 usb:v04A9p32AD*
  ID_MODEL_FROM_DATABASE=PowerShot SX410 IS
 
+usb:v04A9p32B1*
+ ID_MODEL_FROM_DATABASE=SELPHY CP1200
+
+usb:v04A9p32B2*
+ ID_MODEL_FROM_DATABASE=PowerShot G9 X
+
+usb:v04A9p32BB*
+ ID_MODEL_FROM_DATABASE=EOS M5
+
+usb:v04A9p32BF*
+ ID_MODEL_FROM_DATABASE=PowerShot SX420 IS
+
 usb:v04A9p32C1*
  ID_MODEL_FROM_DATABASE=PowerShot ELPH 180 / IXUS 175
 
+usb:v04A9p32C2*
+ ID_MODEL_FROM_DATABASE=PowerShot SX720 HS
+
+usb:v04A9p32D5*
+ ID_MODEL_FROM_DATABASE=PowerShot SX430 IS
+
 usb:v04AA*
  ID_VENDOR_FROM_DATABASE=DaeWoo Telecom, Ltd
 
@@ -11969,6 +12374,9 @@ usb:v04B0p0429*
 usb:v04B0p042A*
  ID_MODEL_FROM_DATABASE=D800 (ptp)
 
+usb:v04B0p043F*
+ ID_MODEL_FROM_DATABASE=D5600
+
 usb:v04B0p0F03*
  ID_MODEL_FROM_DATABASE=PD-10 Wireless Printer Adapter
 
@@ -12146,6 +12554,9 @@ usb:v04B4p4611*
 usb:v04B4p4616*
  ID_MODEL_FROM_DATABASE=Flash Disk (TPP)
 
+usb:v04B4p4624*
+ ID_MODEL_FROM_DATABASE=DS-Xtreme Flash Card
+
 usb:v04B4p5201*
  ID_MODEL_FROM_DATABASE=Combi Keyboard-Hub (Hub)
 
@@ -12407,6 +12818,9 @@ usb:v04B8p0143*
 usb:v04B8p0144*
  ID_MODEL_FROM_DATABASE=GT-S85
 
+usb:v04B8p0151*
+ ID_MODEL_FROM_DATABASE=Perfection V800 Photo
+
 usb:v04B8p0202*
  ID_MODEL_FROM_DATABASE=Receipt Printer M129C/TM-T70
 
@@ -12833,6 +13247,9 @@ usb:v04B9p1305*
 usb:v04B9p1306*
  ID_MODEL_FROM_DATABASE=iKey Token
 
+usb:v04B9p8000*
+ ID_MODEL_FROM_DATABASE=SafeNet Sentinel Hardware Key
+
 usb:v04BA*
  ID_VENDOR_FROM_DATABASE=Toucan Systems, Ltd
 
@@ -13094,6 +13511,9 @@ usb:v04C5p10FE*
 usb:v04C5p1150*
  ID_MODEL_FROM_DATABASE=fi-6230
 
+usb:v04C5p125A*
+ ID_MODEL_FROM_DATABASE=PalmSecure Sensor Device - MP
+
 usb:v04C5p201D*
  ID_MODEL_FROM_DATABASE=SATA 3.0 6Gbit/s Adaptor [GROOVY]
 
@@ -13136,6 +13556,9 @@ usb:v04C8p072D*
 usb:v04CA*
  ID_VENDOR_FROM_DATABASE=Lite-On Technology Corp.
 
+usb:v04CAp004B*
+ ID_MODEL_FROM_DATABASE=Keyboard
+
 usb:v04CAp004F*
  ID_MODEL_FROM_DATABASE=SK-9020 keyboard
 
@@ -13148,6 +13571,9 @@ usb:v04CAp2004*
 usb:v04CAp2006*
  ID_MODEL_FROM_DATABASE=Broadcom BCM43142A0 Bluetooth Device
 
+usb:v04CAp2007*
+ ID_MODEL_FROM_DATABASE=Broadcom BCM43142A0 Bluetooth Device
+
 usb:v04CAp3005*
  ID_MODEL_FROM_DATABASE=Atheros Bluetooth
 
@@ -13625,6 +14051,9 @@ usb:v04D8pE11C*
 usb:v04D8pF2C4*
  ID_MODEL_FROM_DATABASE=Macareux-labs Hygrometry Temperature Sensor
 
+usb:v04D8pF2F7*
+ ID_MODEL_FROM_DATABASE=Yepkit YKUSH
+
 usb:v04D8pF3AA*
  ID_MODEL_FROM_DATABASE=Macareux-labs Usbce Bootloader mode
 
@@ -13682,6 +14111,9 @@ usb:v04D9p048E*
 usb:v04D9p0499*
  ID_MODEL_FROM_DATABASE=Optical Mouse
 
+usb:v04D9p1135*
+ ID_MODEL_FROM_DATABASE=Mouse [MGK-15BU/MLK-15BU]
+
 usb:v04D9p1203*
  ID_MODEL_FROM_DATABASE=Keyboard
 
@@ -13706,6 +14138,9 @@ usb:v04D9p2011*
 usb:v04D9p2013*
  ID_MODEL_FROM_DATABASE=Keyboard [Das Keyboard]
 
+usb:v04D9p2206*
+ ID_MODEL_FROM_DATABASE=Fujitsu Siemens Mouse Esprimo Q
+
 usb:v04D9p2221*
  ID_MODEL_FROM_DATABASE=Keyboard
 
@@ -13724,9 +14159,18 @@ usb:v04D9p2834*
 usb:v04D9pA01C*
  ID_MODEL_FROM_DATABASE=wireless multimedia keyboard with trackball [Trust ADURA 17911]
 
+usb:v04D9pA050*
+ ID_MODEL_FROM_DATABASE=Chatman V1
+
 usb:v04D9pA055*
  ID_MODEL_FROM_DATABASE=Keyboard
 
+usb:v04D9pA100*
+ ID_MODEL_FROM_DATABASE=Mouse [HV-MS735]
+
+usb:v04D9pA11B*
+ ID_MODEL_FROM_DATABASE=Mouse [MX-3200]
+
 usb:v04DA*
  ID_VENDOR_FROM_DATABASE=Panasonic (Matsushita)
 
@@ -13757,6 +14201,9 @@ usb:v04DAp0D0D*
 usb:v04DAp0D0E*
  ID_MODEL_FROM_DATABASE=DVD-ROM & CD-R/RW
 
+usb:v04DAp0F07*
+ ID_MODEL_FROM_DATABASE=KX-MB2030 Multifunction Laser Printer
+
 usb:v04DAp0F40*
  ID_MODEL_FROM_DATABASE=Printer
 
@@ -13811,6 +14258,15 @@ usb:v04DAp2451*
 usb:v04DAp245B*
  ID_MODEL_FROM_DATABASE=HC-X920K (3MOS Full HD video camcorder)
 
+usb:v04DAp2477*
+ ID_MODEL_FROM_DATABASE=SDR-H85 Camcorder (PC mode)
+
+usb:v04DAp2478*
+ ID_MODEL_FROM_DATABASE=SDR-H85 Camcorder (recorder mode - SD card)
+
+usb:v04DAp2479*
+ ID_MODEL_FROM_DATABASE=SDR-H85 Camcorder (recorder mode - HDD)
+
 usb:v04DAp2497*
  ID_MODEL_FROM_DATABASE=HDC-TM700
 
@@ -13823,6 +14279,9 @@ usb:v04DAp250D*
 usb:v04DAp3904*
  ID_MODEL_FROM_DATABASE=N5HBZ0000055 802.11abgn Wireless Adapter [Atheros AR7010+AR9280]
 
+usb:v04DAp3908*
+ ID_MODEL_FROM_DATABASE=N5HBZ0000062 802.11abgn Wireless Adapter [Atheros AR9374v1.1]
+
 usb:v04DAp3C04*
  ID_MODEL_FROM_DATABASE=JT-P100MR-20 [ePassport Reader]
 
@@ -14183,6 +14642,9 @@ usb:v04E6p5410*
 usb:v04E6p5591*
  ID_MODEL_FROM_DATABASE=SCL3711-NFC&RW
 
+usb:v04E6p5810*
+ ID_MODEL_FROM_DATABASE=uTrust 2700 R Smart Card Reader
+
 usb:v04E6pE000*
  ID_MODEL_FROM_DATABASE=SCRx31 Reader
 
@@ -14255,6 +14717,9 @@ usb:v04E7p00FF*
 usb:v04E8*
  ID_VENDOR_FROM_DATABASE=Samsung Electronics Co., Ltd
 
+usb:v04E8p0001*
+ ID_MODEL_FROM_DATABASE=Printer Bootloader
+
 usb:v04E8p0100*
  ID_MODEL_FROM_DATABASE=Kingston Flash Drive (128MB)
 
@@ -14276,6 +14741,9 @@ usb:v04E8p1006*
 usb:v04E8p130C*
  ID_MODEL_FROM_DATABASE=NX100
 
+usb:v04E8p1323*
+ ID_MODEL_FROM_DATABASE=WB700 Camera
+
 usb:v04E8p1F05*
  ID_MODEL_FROM_DATABASE=S2 Portable [JMicron] (500GB)
 
@@ -14411,6 +14879,9 @@ usb:v04E8p3301*
 usb:v04E8p330C*
  ID_MODEL_FROM_DATABASE=ML-1865
 
+usb:v04E8p330F*
+ ID_MODEL_FROM_DATABASE=ML-216x Series Laser Printer
+
 usb:v04E8p3310*
  ID_MODEL_FROM_DATABASE=ML-331x Series Laser Printer
 
@@ -14712,7 +15183,7 @@ usb:v04E8p61B6*
  ID_MODEL_FROM_DATABASE=M3 Portable Hard Drive 1TB
 
 usb:v04E8p61F3*
- ID_MODEL_FROM_DATABASE=MU-PT500B [T3 500GB USB SSD]
+ ID_MODEL_FROM_DATABASE=Portable SSD T3 (MU-PT250B, MU-PT500B)
 
 usb:v04E8p6601*
  ID_MODEL_FROM_DATABASE=Mobile Phone
@@ -14844,10 +15315,10 @@ usb:v04E8p6864*
  ID_MODEL_FROM_DATABASE=GT-I9070 (network tethering, USB debugging enabled)
 
 usb:v04E8p6865*
- ID_MODEL_FROM_DATABASE=GT-I9300 Phone [Galaxy S III] (PTP mode)
+ ID_MODEL_FROM_DATABASE=Galaxy (PTP mode)
 
 usb:v04E8p6866*
- ID_MODEL_FROM_DATABASE=GT-I9300 Phone [Galaxy S III] (debugging mode)
+ ID_MODEL_FROM_DATABASE=Galaxy (debugging mode)
 
 usb:v04E8p6868*
  ID_MODEL_FROM_DATABASE=Escape Composite driver for Android Phones: Modem+Diagnostic+ADB
@@ -15179,6 +15650,9 @@ usb:v04F2pB1CF*
 usb:v04F2pB1D6*
  ID_MODEL_FROM_DATABASE=CNF9055 Toshiba Webcam
 
+usb:v04F2pB1D8*
+ ID_MODEL_FROM_DATABASE=1.3M Webcam
+
 usb:v04F2pB1E4*
  ID_MODEL_FROM_DATABASE=Toshiba Integrated Webcam
 
@@ -15224,6 +15698,9 @@ usb:v04F2pB354*
 usb:v04F2pB394*
  ID_MODEL_FROM_DATABASE=Integrated Camera
 
+usb:v04F2pB3EB*
+ ID_MODEL_FROM_DATABASE=HP 720p HD Monitor Webcam
+
 usb:v04F2pB3F6*
  ID_MODEL_FROM_DATABASE=HD WebCam (Acer)
 
@@ -15263,6 +15740,9 @@ usb:v04F3p0230*
 usb:v04F3p0232*
  ID_MODEL_FROM_DATABASE=Mouse
 
+usb:v04F3p0234*
+ ID_MODEL_FROM_DATABASE=Optical Mouse
+
 usb:v04F3p02F4*
  ID_MODEL_FROM_DATABASE=2.4G Cordless Mouse
 
@@ -16784,9 +17264,18 @@ usb:v04F9p2028*
 usb:v04F9p202B*
  ID_MODEL_FROM_DATABASE=PT-7600 P-touch Label Printer
 
+usb:v04F9p2061*
+ ID_MODEL_FROM_DATABASE=PT-P700 P-touch Label Printer
+
+usb:v04F9p2064*
+ ID_MODEL_FROM_DATABASE=PT-P700 P-touch Label Printer RemovableDisk
+
 usb:v04F9p2100*
  ID_MODEL_FROM_DATABASE=Card Reader Writer
 
+usb:v04F9p2102*
+ ID_MODEL_FROM_DATABASE=Sewing machine
+
 usb:v04F9p60A0*
  ID_MODEL_FROM_DATABASE=ADS-2000
 
@@ -17921,6 +18410,9 @@ usb:v0547p2810*
 usb:v0547p4D90*
  ID_MODEL_FROM_DATABASE=AmScope MD1900 camera
 
+usb:v0547p6010*
+ ID_MODEL_FROM_DATABASE=AmScope MU1000 camera
+
 usb:v0547p6510*
  ID_MODEL_FROM_DATABASE=Touptek UCMOS05100KPA
 
@@ -18170,6 +18662,9 @@ usb:v054Cp014D*
 usb:v054Cp0154*
  ID_MODEL_FROM_DATABASE=Eyetoy Audio Device
 
+usb:v054Cp0155*
+ ID_MODEL_FROM_DATABASE=Eyetoy Video Device
+
 usb:v054Cp015F*
  ID_MODEL_FROM_DATABASE=IC Recorder (BM)
 
@@ -18305,6 +18800,9 @@ usb:v054Cp021C*
 usb:v054Cp021D*
  ID_MODEL_FROM_DATABASE=Net MD
 
+usb:v054Cp0226*
+ ID_MODEL_FROM_DATABASE=UP-CR10L
+
 usb:v054Cp0227*
  ID_MODEL_FROM_DATABASE=Printing Support
 
@@ -18449,6 +18947,9 @@ usb:v054Cp0387*
 usb:v054Cp03BC*
  ID_MODEL_FROM_DATABASE=Webbie HD - MHS-CM1
 
+usb:v054Cp03CC*
+ ID_MODEL_FROM_DATABASE=SD Card Reader
+
 usb:v054Cp03D1*
  ID_MODEL_FROM_DATABASE=DPF-X95
 
@@ -18480,7 +18981,7 @@ usb:v054Cp0541*
  ID_MODEL_FROM_DATABASE=DSC-HX100V [Cybershot Digital Still Camera]
 
 usb:v054Cp05C4*
- ID_MODEL_FROM_DATABASE=DualShock 4
+ ID_MODEL_FROM_DATABASE=DualShock 4 [CUH-ZCT1E]
 
 usb:v054Cp0689*
  ID_MODEL_FROM_DATABASE=Walkman NWZ-B173F
@@ -18488,9 +18989,30 @@ usb:v054Cp0689*
 usb:v054Cp06BB*
  ID_MODEL_FROM_DATABASE=WALKMAN NWZ-F805
 
+usb:v054Cp06C3*
+ ID_MODEL_FROM_DATABASE=RC-S380
+
+usb:v054Cp07C4*
+ ID_MODEL_FROM_DATABASE=ILCE-6000 (aka Alpha-6000) in Mass Storage mode
+
 usb:v054Cp088C*
  ID_MODEL_FROM_DATABASE=Portable Headphone Amplifier
 
+usb:v054Cp08B7*
+ ID_MODEL_FROM_DATABASE=ILCE-6000 (aka Alpha-6000) in MTP mode
+
+usb:v054Cp094E*
+ ID_MODEL_FROM_DATABASE=ILCE-6000 (aka Alpha-6000) in PC Remote mode
+
+usb:v054Cp0994*
+ ID_MODEL_FROM_DATABASE=ILCE-6000 (aka Alpha-6000) in charging mode
+
+usb:v054Cp09CC*
+ ID_MODEL_FROM_DATABASE=DualShock 4 [CUH-ZCT2E]
+
+usb:v054Cp0BB5*
+ ID_MODEL_FROM_DATABASE=Headset MDR-1000X
+
 usb:v054Cp1000*
  ID_MODEL_FROM_DATABASE=Wireless Buzz! Receiver
 
@@ -18611,6 +19133,9 @@ usb:v0557p2011*
 usb:v0557p2202*
  ID_MODEL_FROM_DATABASE=CS124U Miniview II KVM Switch
 
+usb:v0557p2212*
+ ID_MODEL_FROM_DATABASE=Keyboard/Mouse
+
 usb:v0557p2213*
  ID_MODEL_FROM_DATABASE=CS682 2-Port USB 2.0 DVI KVM Switch
 
@@ -18636,7 +19161,7 @@ usb:v0557p7820*
  ID_MODEL_FROM_DATABASE=UC-2322 2xSerial Ports [mos7820]
 
 usb:v0557p8021*
- ID_MODEL_FROM_DATABASE=CS1764A [CubiQ DVI KVMP Switch]
+ ID_MODEL_FROM_DATABASE=Hub
 
 usb:v0558*
  ID_VENDOR_FROM_DATABASE=Truevision, Inc.
@@ -19349,6 +19874,42 @@ usb:v056Ap0318*
 usb:v056Ap032F*
  ID_MODEL_FROM_DATABASE=DTU-1031X
 
+usb:v056Ap0347*
+ ID_MODEL_FROM_DATABASE=Integrated Hub
+
+usb:v056Ap0348*
+ ID_MODEL_FROM_DATABASE=Integrated Hub
+
+usb:v056Ap034A*
+ ID_MODEL_FROM_DATABASE=DTH-W1320 [MobileStudio Pro 13] touchscreen
+
+usb:v056Ap034B*
+ ID_MODEL_FROM_DATABASE=DTH-W1620 [MobileStudio Pro 16] touchscreen
+
+usb:v056Ap034D*
+ ID_MODEL_FROM_DATABASE=DTH-W1320 [MobileStudio Pro 13] tablet
+
+usb:v056Ap034E*
+ ID_MODEL_FROM_DATABASE=DTH-W1620 [MobileStudio Pro 16] tablet
+
+usb:v056Ap034F*
+ ID_MODEL_FROM_DATABASE=DTH-1320 [Cintiq Pro 13] tablet
+
+usb:v056Ap0350*
+ ID_MODEL_FROM_DATABASE=DTH-1620 [Cintiq Pro 16] tablet
+
+usb:v056Ap0353*
+ ID_MODEL_FROM_DATABASE=DTH-1320 [Cintiq Pro 13] touchscreen
+
+usb:v056Ap0354*
+ ID_MODEL_FROM_DATABASE=DTH-1620 [Cintiq Pro 16] touchscreen
+
+usb:v056Ap0357*
+ ID_MODEL_FROM_DATABASE=PTH-660 [Intuos Pro (M)]
+
+usb:v056Ap0358*
+ ID_MODEL_FROM_DATABASE=PTH-860 [Intuos Pro (L)]
+
 usb:v056Ap0400*
  ID_MODEL_FROM_DATABASE=PenPartner 4x5
 
@@ -19496,6 +20057,9 @@ usb:v0572p1301*
 usb:v0572p1328*
  ID_MODEL_FROM_DATABASE=TrendNet TFM-561 modem
 
+usb:v0572p1804*
+ ID_MODEL_FROM_DATABASE=HP Dock Audio
+
 usb:v0572p2000*
  ID_MODEL_FROM_DATABASE=SoftGate 802.11 Adapter
 
@@ -19791,7 +20355,7 @@ usb:v057Cp2300*
  ID_MODEL_FROM_DATABASE=Teledat X130 DSL
 
 usb:v057Cp2800*
- ID_MODEL_FROM_DATABASE=ISDN-Connector TA
+ ID_MODEL_FROM_DATABASE=Teledat 2a/b / X120 / NetXXL ISDN Terminal Adapter
 
 usb:v057Cp3200*
  ID_MODEL_FROM_DATABASE=Teledat X130 DSL
@@ -19815,7 +20379,7 @@ usb:v057Cp3C00*
  ID_MODEL_FROM_DATABASE=FRITZ!Box WLAN
 
 usb:v057Cp3D00*
- ID_MODEL_FROM_DATABASE=Fritz!Box
+ ID_MODEL_FROM_DATABASE=FRITZ!Box Fon WLAN 7050/7140/7170/IAD3331
 
 usb:v057Cp3E01*
  ID_MODEL_FROM_DATABASE=FRITZ!Box (Annex A)
@@ -19877,6 +20441,12 @@ usb:v057Ep0305*
 usb:v057Ep0306*
  ID_MODEL_FROM_DATABASE=Wii Remote Controller RVL-003
 
+usb:v057Ep2006*
+ ID_MODEL_FROM_DATABASE=Joy-Con L
+
+usb:v057Ep2007*
+ ID_MODEL_FROM_DATABASE=Joy-Con R
+
 usb:v057F*
  ID_VENDOR_FROM_DATABASE=QuickShot, Ltd
 
@@ -20819,6 +21389,9 @@ usb:v058Cp001F*
 usb:v058CpFFE5*
  ID_MODEL_FROM_DATABASE=IN34 Projector
 
+usb:v058CpFFEB*
+ ID_MODEL_FROM_DATABASE=Projector IN76
+
 usb:v058D*
  ID_VENDOR_FROM_DATABASE=Micrel Semiconductor
 
@@ -21209,6 +21782,9 @@ usb:v059Fp0641*
 usb:v059Fp0829*
  ID_MODEL_FROM_DATABASE=BigDisk Extreme+
 
+usb:v059Fp1004*
+ ID_MODEL_FROM_DATABASE=Little Disk 20 GB
+
 usb:v059Fp100C*
  ID_MODEL_FROM_DATABASE=Rugged Triple Interface Mobile Hard Drive
 
@@ -21239,6 +21815,9 @@ usb:v059Fp1049*
 usb:v059Fp1052*
  ID_MODEL_FROM_DATABASE=P'9220 Mobile Drive
 
+usb:v059Fp1061*
+ ID_MODEL_FROM_DATABASE=Rugged USB3-FW
+
 usb:v059Fp1064*
  ID_MODEL_FROM_DATABASE=Rugged 16 and 32 GB
 
@@ -21623,6 +22202,9 @@ usb:v05ACp0263*
 usb:v05ACp0267*
  ID_MODEL_FROM_DATABASE=Magic Keyboard A1644
 
+usb:v05ACp0269*
+ ID_MODEL_FROM_DATABASE=Magic Mouse 2 (Lightning connector)
+
 usb:v05ACp0273*
  ID_MODEL_FROM_DATABASE=Internal Keyboard/Trackpad (ISO)
 
@@ -23105,6 +23687,9 @@ usb:v05DCpA813*
 usb:v05DCpA815*
  ID_MODEL_FROM_DATABASE=JumpDrive V10
 
+usb:v05DCpA81D*
+ ID_MODEL_FROM_DATABASE=LJDTT16G [JumpDrive 16GB]
+
 usb:v05DCpA833*
  ID_MODEL_FROM_DATABASE=JumpDrive S23 64GB
 
@@ -23117,6 +23702,9 @@ usb:v05DCpB018*
 usb:v05DCpB047*
  ID_MODEL_FROM_DATABASE=SDHC Reader [RW047-7000]
 
+usb:v05DCpB051*
+ ID_MODEL_FROM_DATABASE=microSD RDR UHS-I Card Reader [LRWM03U-7000]
+
 usb:v05DCpBA02*
  ID_MODEL_FROM_DATABASE=Workflow CFR1
 
@@ -23228,6 +23816,9 @@ usb:v05E3p0142*
 usb:v05E3p0143*
  ID_MODEL_FROM_DATABASE=Multiple Frames Film Scanner-36series
 
+usb:v05E3p0145*
+ ID_MODEL_FROM_DATABASE=Reflecta CrystalScan 7200 Photo-Scanner
+
 usb:v05E3p0180*
  ID_MODEL_FROM_DATABASE=Plustek Scanner
 
@@ -23375,6 +23966,9 @@ usb:v05E3p0732*
 usb:v05E3p0736*
  ID_MODEL_FROM_DATABASE=microSD Reader/Writer
 
+usb:v05E3p0738*
+ ID_MODEL_FROM_DATABASE=Card reader
+
 usb:v05E3p0741*
  ID_MODEL_FROM_DATABASE=microSD Card Reader
 
@@ -23384,6 +23978,9 @@ usb:v05E3p0743*
 usb:v05E3p0745*
  ID_MODEL_FROM_DATABASE=Logilink CR0012
 
+usb:v05E3p0748*
+ ID_MODEL_FROM_DATABASE=All-in-One Cardreader
+
 usb:v05E3p0751*
  ID_MODEL_FROM_DATABASE=microSD Card Reader
 
@@ -23582,6 +24179,9 @@ usb:v05FC*
 usb:v05FCp0001*
  ID_MODEL_FROM_DATABASE=Soundcraft Si Multi Digital Card
 
+usb:v05FCp0010*
+ ID_MODEL_FROM_DATABASE=Soundcraft Si MADI combo card
+
 usb:v05FCp7849*
  ID_MODEL_FROM_DATABASE=Harman/Kardon SoundSticks
 
@@ -23612,6 +24212,9 @@ usb:v05FDp262F*
 usb:v05FDpDAAE*
  ID_MODEL_FROM_DATABASE=Game Shark
 
+usb:v05FDpDBAE*
+ ID_MODEL_FROM_DATABASE=Datel XBoxMC
+
 usb:v05FE*
  ID_VENDOR_FROM_DATABASE=Chic Technology Corp.
 
@@ -23789,6 +24392,12 @@ usb:v0616*
 usb:v0617*
  ID_VENDOR_FROM_DATABASE=Swiss Federal Insitute of Technology
 
+usb:v0617p000A*
+ ID_MODEL_FROM_DATABASE=Thymio-II
+
+usb:v0617p000C*
+ ID_MODEL_FROM_DATABASE=Thymio-II Wireless
+
 usb:v0618*
  ID_VENDOR_FROM_DATABASE=MacAlly
 
@@ -23916,7 +24525,7 @@ usb:v0629*
  ID_VENDOR_FROM_DATABASE=Zida Technologies, Ltd
 
 usb:v062A*
- ID_VENDOR_FROM_DATABASE=Creative Labs
+ ID_VENDOR_FROM_DATABASE=MosArt Semiconductor Corp.
 
 usb:v062Ap0000*
  ID_MODEL_FROM_DATABASE=Optical mouse
@@ -24206,6 +24815,9 @@ usb:v064EpF102*
 usb:v064EpF103*
  ID_MODEL_FROM_DATABASE=Lenovo Integrated Webcam [R5U877]
 
+usb:v064EpF209*
+ ID_MODEL_FROM_DATABASE=HP Webcam
+
 usb:v064EpF300*
  ID_MODEL_FROM_DATABASE=UVC 0.3M Webcam
 
@@ -24213,19 +24825,28 @@ usb:v064F*
  ID_VENDOR_FROM_DATABASE=WIBU-Systems AG
 
 usb:v064Fp03E9*
- ID_MODEL_FROM_DATABASE=CmStick (article no. 1001)
+ ID_MODEL_FROM_DATABASE=CmStick (MSD, article no. 1001-xx-xxx)
 
 usb:v064Fp03F2*
- ID_MODEL_FROM_DATABASE=CmStick/M (article no. 1010)
+ ID_MODEL_FROM_DATABASE=CmStick/M (MSD, article no. 1010-xx-xxx)
 
 usb:v064Fp03F3*
- ID_MODEL_FROM_DATABASE=CmStick/M (article no. 1011)
+ ID_MODEL_FROM_DATABASE=CmStick/M (MSD, article no. 1011-xx-xxx)
 
 usb:v064Fp0BD7*
- ID_MODEL_FROM_DATABASE=BOX/U
+ ID_MODEL_FROM_DATABASE=Wibu-Box/U (article no. 3031-xx-xxx)
 
 usb:v064Fp0BD8*
- ID_MODEL_FROM_DATABASE=BOX/RU
+ ID_MODEL_FROM_DATABASE=Wibu-Box/RU (article no. 3032-xx-xxx)
+
+usb:v064Fp2AF9*
+ ID_MODEL_FROM_DATABASE=CmStick (HID, article no. 1001-xx-xxx)
+
+usb:v064Fp2B03*
+ ID_MODEL_FROM_DATABASE=CmStick/M (HID, article no. 1011-xx-xxx)
+
+usb:v064Fp5213*
+ ID_MODEL_FROM_DATABASE=CmStick/M (COMPOSITE, article no. 1011-xx-xxx)
 
 usb:v0650*
  ID_VENDOR_FROM_DATABASE=Dynapro Systems
@@ -26078,18 +26699,48 @@ usb:v06D3p0393*
 usb:v06D3p0394*
  ID_MODEL_FROM_DATABASE=CP9000D/DW Port
 
+usb:v06D3p0398*
+ ID_MODEL_FROM_DATABASE=P93D
+
 usb:v06D3p03A1*
  ID_MODEL_FROM_DATABASE=CP9550D/DW Port
 
 usb:v06D3p03A5*
  ID_MODEL_FROM_DATABASE=CP9550DW-S
 
+usb:v06D3p03A9*
+ ID_MODEL_FROM_DATABASE=CP-9600DW
+
+usb:v06D3p03AA*
+ ID_MODEL_FROM_DATABASE=CP3020DA
+
+usb:v06D3p03AD*
+ ID_MODEL_FROM_DATABASE=CP-9800D/DW
+
+usb:v06D3p03AE*
+ ID_MODEL_FROM_DATABASE=CP-9800DW-S
+
+usb:v06D3p3B10*
+ ID_MODEL_FROM_DATABASE=P95D
+
+usb:v06D3p3B21*
+ ID_MODEL_FROM_DATABASE=CP-9810D/DW
+
 usb:v06D3p3B30*
  ID_MODEL_FROM_DATABASE=CP-D70DW / CP-D707DW
 
 usb:v06D3p3B31*
  ID_MODEL_FROM_DATABASE=CP-K60DW-S
 
+usb:v06D3p3B36*
+ ID_MODEL_FROM_DATABASE=CP-D80DW
+
+usb:v06D3p3B50*
+ ID_MODEL_FROM_DATABASE=CP-W5000DW
+
+usb:v06D3p3B60*
+ ID_MODEL_FROM_DATABASE=CP-D90DW
+
 usb:v06D4*
  ID_VENDOR_FROM_DATABASE=Cisco Systems
 
@@ -26798,6 +27449,9 @@ usb:v0718p0624*
 usb:v0718p1120*
  ID_MODEL_FROM_DATABASE=RDX External dock (redbud)
 
+usb:v0718p4006*
+ ID_MODEL_FROM_DATABASE=8x Slim DVD Multi-Format Recorder External
+
 usb:v0718pD000*
  ID_MODEL_FROM_DATABASE=Disc Stakka CD/DVD Manager
 
@@ -26849,6 +27503,12 @@ usb:v071Dp2000*
 usb:v071E*
  ID_VENDOR_FROM_DATABASE=Ariston Technologies
 
+usb:v0720*
+ ID_VENDOR_FROM_DATABASE=Keyence Corp.
+
+usb:v0720p8001*
+ ID_MODEL_FROM_DATABASE=LJ-V7001
+
 usb:v0723*
  ID_VENDOR_FROM_DATABASE=Centillium Communications Corp.
 
@@ -27281,6 +27941,9 @@ usb:v0755*
 usb:v0757*
  ID_VENDOR_FROM_DATABASE=Network Technologies, Inc.
 
+usb:v0758*
+ ID_VENDOR_FROM_DATABASE=Carl Zeiss Microscopy GmbH
+
 usb:v075B*
  ID_VENDOR_FROM_DATABASE=Sophisticated Circuits, Inc.
 
@@ -27288,7 +27951,7 @@ usb:v075Bp0001*
  ID_MODEL_FROM_DATABASE=Kick-off! Watchdog
 
 usb:v0763*
- ID_VENDOR_FROM_DATABASE=Midiman
+ ID_VENDOR_FROM_DATABASE=M-Audio
 
 usb:v0763p0115*
  ID_MODEL_FROM_DATABASE=O2 / KeyRig 25
@@ -27803,6 +28466,9 @@ usb:v0781p5575*
 usb:v0781p5576*
  ID_MODEL_FROM_DATABASE=Cruzer Facet
 
+usb:v0781p5577*
+ ID_MODEL_FROM_DATABASE=Cruzer Pop (8GB)
+
 usb:v0781p557D*
  ID_MODEL_FROM_DATABASE=Cruzer Force (64GB)
 
@@ -27812,6 +28478,15 @@ usb:v0781p5580*
 usb:v0781p5581*
  ID_MODEL_FROM_DATABASE=Ultra
 
+usb:v0781p5583*
+ ID_MODEL_FROM_DATABASE=Ultra Fit
+
+usb:v0781p5590*
+ ID_MODEL_FROM_DATABASE=Ultra Dual
+
+usb:v0781p5591*
+ ID_MODEL_FROM_DATABASE=Ultra Flair
+
 usb:v0781p5E10*
  ID_MODEL_FROM_DATABASE=Encrypted
 
@@ -28737,7 +29412,7 @@ usb:v07B8p5301*
  ID_MODEL_FROM_DATABASE=GW-US54ZGL 802.11bg
 
 usb:v07B8p6001*
- ID_MODEL_FROM_DATABASE=802.11bg
+ ID_MODEL_FROM_DATABASE=WUG2690 802.11bg Wireless Module [ZyDAS ZD1211+AL2230]
 
 usb:v07B8p8188*
  ID_MODEL_FROM_DATABASE=AboCom Systems Inc [WN2001 Prolink Wireless-N Nano Adapter]
@@ -29747,6 +30422,12 @@ usb:v0810p0002*
 usb:v0810p0003*
  ID_MODEL_FROM_DATABASE=PlayStation Gamepad
 
+usb:v0810pE001*
+ ID_MODEL_FROM_DATABASE=Twin controller
+
+usb:v0810pE501*
+ ID_MODEL_FROM_DATABASE=SNES Gamepad
+
 usb:v0813*
  ID_VENDOR_FROM_DATABASE=Mattel, Inc.
 
@@ -30272,6 +30953,9 @@ usb:v0846p9043*
 usb:v0846p9050*
  ID_MODEL_FROM_DATABASE=A6200 802.11a/b/g/n/ac Wireless Adapter [Broadcom BCM43526]
 
+usb:v0846p9051*
+ ID_MODEL_FROM_DATABASE=A6200v2 802.11a/b/g/n/ac (2x2) Wireless Adapter [Realtek RTL8812AU]
+
 usb:v0846p9052*
  ID_MODEL_FROM_DATABASE=A6100 AC600 DB Wireless Adapter [Realtek RTL8811AU]
 
@@ -30704,9 +31388,18 @@ usb:v0894p0010*
 usb:v0897*
  ID_VENDOR_FROM_DATABASE=Lauterbach
 
+usb:v0897p0001*
+ ID_MODEL_FROM_DATABASE=ICE In-Circuit Emulator
+
 usb:v0897p0002*
  ID_MODEL_FROM_DATABASE=Power Debug/Power Debug II
 
+usb:v0897p0004*
+ ID_MODEL_FROM_DATABASE=PowerDebug
+
+usb:v0897p0005*
+ ID_MODEL_FROM_DATABASE=PowerDebug PRO
+
 usb:v089C*
  ID_VENDOR_FROM_DATABASE=United Technologies Research Cntr.
 
@@ -30795,13 +31488,31 @@ usb:v08BB*
  ID_VENDOR_FROM_DATABASE=Texas Instruments
 
 usb:v08BBp2702*
- ID_MODEL_FROM_DATABASE=Speakers
+ ID_MODEL_FROM_DATABASE=PCM2702 16-bit stereo audio DAC
 
 usb:v08BBp2704*
- ID_MODEL_FROM_DATABASE=Audio Codec
+ ID_MODEL_FROM_DATABASE=PCM2704 16-bit stereo audio DAC
+
+usb:v08BBp2705*
+ ID_MODEL_FROM_DATABASE=PCM2705 stereo audio DAC
 
 usb:v08BBp2706*
- ID_MODEL_FROM_DATABASE=PCM2706 Audio Codec
+ ID_MODEL_FROM_DATABASE=PCM2706 stereo audio DAC
+
+usb:v08BBp2707*
+ ID_MODEL_FROM_DATABASE=PCM2707 stereo audio DAC
+
+usb:v08BBp27C4*
+ ID_MODEL_FROM_DATABASE=PCM2704C stereo audio DAC
+
+usb:v08BBp27C5*
+ ID_MODEL_FROM_DATABASE=PCM2705C stereo audio DAC
+
+usb:v08BBp27C6*
+ ID_MODEL_FROM_DATABASE=PCM2706C stereo audio DAC
+
+usb:v08BBp27C7*
+ ID_MODEL_FROM_DATABASE=PCM2707C stereo audio DAC
 
 usb:v08BBp2900*
  ID_MODEL_FROM_DATABASE=PCM2900 Audio Codec
@@ -30818,6 +31529,9 @@ usb:v08BBp2904*
 usb:v08BBp2910*
  ID_MODEL_FROM_DATABASE=PCM2912 Audio Codec
 
+usb:v08BBp2912*
+ ID_MODEL_FROM_DATABASE=PCM2912A Audio Codec
+
 usb:v08BBp29B0*
  ID_MODEL_FROM_DATABASE=PCM2900B Audio CODEC
 
@@ -31652,6 +32366,12 @@ usb:v0908p04B1*
 usb:v0908p04B2*
  ID_MODEL_FROM_DATABASE=NC interface
 
+usb:v0908p04B3*
+ ID_MODEL_FROM_DATABASE=keyboard front panel Cockpit
+
+usb:v0908p04B4*
+ ID_MODEL_FROM_DATABASE=SCR_CCID
+
 usb:v0908p2701*
  ID_MODEL_FROM_DATABASE=ShenZhen SANZHAI Technology Co.,Ltd Spy Pen VGA
 
@@ -31874,6 +32594,12 @@ usb:v091Ep0004*
 usb:v091Ep0200*
  ID_MODEL_FROM_DATABASE=Data Card Programmer (install)
 
+usb:v091Ep086E*
+ ID_MODEL_FROM_DATABASE=Forerunner 735XT
+
+usb:v091Ep097F*
+ ID_MODEL_FROM_DATABASE=Forerunner 235
+
 usb:v091Ep1200*
  ID_MODEL_FROM_DATABASE=Data Card Programmer
 
@@ -31925,6 +32651,9 @@ usb:v091Ep255B*
 usb:v091Ep26A1*
  ID_MODEL_FROM_DATABASE=Nuvi 55
 
+usb:v091Ep47FB*
+ ID_MODEL_FROM_DATABASE=nuviCam
+
 usb:v0920*
  ID_VENDOR_FROM_DATABASE=Echelon Co.
 
@@ -31979,6 +32708,9 @@ usb:v0924p3CE8*
 usb:v0924p3CEA*
  ID_MODEL_FROM_DATABASE=Phaser 3125
 
+usb:v0924p3CEC*
+ ID_MODEL_FROM_DATABASE=Phaser 3250
+
 usb:v0924p3D5B*
  ID_MODEL_FROM_DATABASE=Phaser 6115MFP TWAIN Scanner
 
@@ -32069,6 +32801,9 @@ usb:v0930p000C*
 usb:v0930p0010*
  ID_MODEL_FROM_DATABASE=Gigabeat S (mtp)
 
+usb:v0930p01BF*
+ ID_MODEL_FROM_DATABASE=2.5"External Hard Disk
+
 usb:v0930p0200*
  ID_MODEL_FROM_DATABASE=Integrated Bluetooth (Taiyo Yuden)
 
@@ -32144,6 +32879,9 @@ usb:v0930p0A07*
 usb:v0930p0A08*
  ID_MODEL_FROM_DATABASE=WLM-20U2/GN-1080 802.11abgn Wireless Adapter [Atheros AR7010+AR9280]
 
+usb:v0930p0A0B*
+ ID_MODEL_FROM_DATABASE=WLU5053 802.11abgn Wireless Module [Broadcom BCM43236B]
+
 usb:v0930p0A13*
  ID_MODEL_FROM_DATABASE=AX88179 Gigabit Ethernet [Toshiba]
 
@@ -32342,9 +33080,24 @@ usb:v0934*
 usb:v0936*
  ID_VENDOR_FROM_DATABASE=NuTesla
 
+usb:v0936p000A*
+ ID_MODEL_FROM_DATABASE=Moebius
+
+usb:v0936p000B*
+ ID_MODEL_FROM_DATABASE=iMoebius
+
 usb:v0936p000C*
  ID_MODEL_FROM_DATABASE=Rhythmedics 6 BioData Integrator
 
+usb:v0936p000D*
+ ID_MODEL_FROM_DATABASE=Hypurius
+
+usb:v0936p000E*
+ ID_MODEL_FROM_DATABASE=Millennius
+
+usb:v0936p000F*
+ ID_MODEL_FROM_DATABASE=Purius
+
 usb:v0936p0030*
  ID_MODEL_FROM_DATABASE=Composite Device, Mass Storage Device (Flash Drive) amd HID
 
@@ -32609,6 +33362,9 @@ usb:v0951p1625*
 usb:v0951p162A*
  ID_MODEL_FROM_DATABASE=DataTraveler 112 4GB Pen Drive
 
+usb:v0951p162B*
+ ID_MODEL_FROM_DATABASE=DataTraveler HyperX 3.0
+
 usb:v0951p162D*
  ID_MODEL_FROM_DATABASE=DataTraveler 102
 
@@ -32649,16 +33405,34 @@ usb:v0954*
  ID_VENDOR_FROM_DATABASE=RPM Systems Corp.
 
 usb:v0955*
- ID_VENDOR_FROM_DATABASE=NVidia Corp.
+ ID_VENDOR_FROM_DATABASE=NVIDIA Corp.
+
+usb:v0955p7018*
+ ID_MODEL_FROM_DATABASE=T186 [Tegra Parker]
+
+usb:v0955p701A*
+ ID_MODEL_FROM_DATABASE=U-Boot running on Tegra
+
+usb:v0955p7020*
+ ID_MODEL_FROM_DATABASE=L4T (Linux for Tegra) running on Tegra
 
 usb:v0955p7030*
- ID_MODEL_FROM_DATABASE=Tegra 3 (recovery mode)
+ ID_MODEL_FROM_DATABASE=T30 [Tegra 3] recovery mode
 
 usb:v0955p7100*
  ID_MODEL_FROM_DATABASE=Tegra Device
 
+usb:v0955p7140*
+ ID_MODEL_FROM_DATABASE=T124 [Tegra K1/Logan 32-bit]
+
+usb:v0955p7210*
+ ID_MODEL_FROM_DATABASE=SHIELD Controller
+
+usb:v0955p7721*
+ ID_MODEL_FROM_DATABASE=T210 [Tegra Erista]
+
 usb:v0955p7820*
- ID_MODEL_FROM_DATABASE=Tegra 2 AC100 developer mode
+ ID_MODEL_FROM_DATABASE=T20 [Tegra 2] recovery mode
 
 usb:v0955pB400*
  ID_MODEL_FROM_DATABASE=SHIELD (debug)
@@ -32741,6 +33515,9 @@ usb:v095D*
 usb:v095Dp0001*
  ID_MODEL_FROM_DATABASE=Polycom ViaVideo
 
+usb:v0964*
+ ID_VENDOR_FROM_DATABASE=BITRAN
+
 usb:v0967*
  ID_VENDOR_FROM_DATABASE=Acer NeWeb Corp.
 
@@ -32753,9 +33530,27 @@ usb:v0968*
 usb:v096E*
  ID_VENDOR_FROM_DATABASE=Feitian Technologies, Inc.
 
+usb:v096Ep0005*
+ ID_MODEL_FROM_DATABASE=ePass2000
+
 usb:v096Ep0120*
  ID_MODEL_FROM_DATABASE=Microcosm Ltd Dinkey
 
+usb:v096Ep0305*
+ ID_MODEL_FROM_DATABASE=ePass2000Auto
+
+usb:v096Ep0309*
+ ID_MODEL_FROM_DATABASE=ePass3000GM
+
+usb:v096Ep0401*
+ ID_MODEL_FROM_DATABASE=ePass3000
+
+usb:v096Ep0702*
+ ID_MODEL_FROM_DATABASE=ePass3003
+
+usb:v096Ep0703*
+ ID_MODEL_FROM_DATABASE=ePass3003Auto
+
 usb:v096Ep0802*
  ID_MODEL_FROM_DATABASE=ePass2000 (G&D STARCOS SPK 2.4)
 
@@ -32903,6 +33698,9 @@ usb:v099Ap713A*
 usb:v099Ap7160*
  ID_MODEL_FROM_DATABASE=Hyper Slim Keyboard
 
+usb:v099E*
+ ID_VENDOR_FROM_DATABASE=Trimble Navigation, Ltd
+
 usb:v09A3*
  ID_VENDOR_FROM_DATABASE=PairGain Technologies
 
@@ -33071,6 +33869,33 @@ usb:v09CA*
 usb:v09CAp5544*
  ID_MODEL_FROM_DATABASE=PIO
 
+usb:v09CB*
+ ID_VENDOR_FROM_DATABASE=FLIR Systems
+
+usb:v09CBp1001*
+ ID_MODEL_FROM_DATABASE=Network Adapter
+
+usb:v09CBp1002*
+ ID_MODEL_FROM_DATABASE=Ex-Series RNDIS interface
+
+usb:v09CBp1004*
+ ID_MODEL_FROM_DATABASE=Ex-Series UVC interface
+
+usb:v09CBp1005*
+ ID_MODEL_FROM_DATABASE=Ex-Series RNDIS and UVC interface
+
+usb:v09CBp1006*
+ ID_MODEL_FROM_DATABASE=Ex-Series RNDIS and MSD interface
+
+usb:v09CBp1007*
+ ID_MODEL_FROM_DATABASE=Ex-Series UVC and MSD interface
+
+usb:v09CBp1008*
+ ID_MODEL_FROM_DATABASE=Serial Port
+
+usb:v09CBp1996*
+ ID_MODEL_FROM_DATABASE=FLIR ONE Camera
+
 usb:v09CC*
  ID_VENDOR_FROM_DATABASE=Workbit Corp.
 
@@ -33105,11 +33930,17 @@ usb:v09D3p000B*
  ID_MODEL_FROM_DATABASE=Bluetooth Adapter class 1 [BlueLight]
 
 usb:v09D7*
- ID_VENDOR_FROM_DATABASE=Novatel Wireless
+ ID_VENDOR_FROM_DATABASE=NovAtel Inc.
 
 usb:v09D7p0100*
  ID_MODEL_FROM_DATABASE=NovAtel FlexPack GPS receiver
 
+usb:v09D8*
+ ID_VENDOR_FROM_DATABASE=ELATEC
+
+usb:v09D8p0406*
+ ID_MODEL_FROM_DATABASE=TWN4 MIFARE NFC
+
 usb:v09D9*
  ID_VENDOR_FROM_DATABASE=KRF Tech, Ltd
 
@@ -33146,6 +33977,9 @@ usb:v09DAp0260*
 usb:v09DAp032B*
  ID_MODEL_FROM_DATABASE=Wireless Mouse (Battery Free)
 
+usb:v09DAp1068*
+ ID_MODEL_FROM_DATABASE=Bloody A90 Mouse
+
 usb:v09DAp8090*
  ID_MODEL_FROM_DATABASE=X-718BK Oscar Optical Gaming Mouse
 
@@ -33878,9 +34712,15 @@ usb:v0A5Cp2151*
 usb:v0A5Cp2154*
  ID_MODEL_FROM_DATABASE=BCM92046DG-CL1ROM Bluetooth 2.1 UHE Dongle
 
+usb:v0A5Cp216A*
+ ID_MODEL_FROM_DATABASE=BCM43142A0 Bluetooth
+
 usb:v0A5Cp216C*
  ID_MODEL_FROM_DATABASE=BCM43142A0 Bluetooth Device
 
+usb:v0A5Cp216D*
+ ID_MODEL_FROM_DATABASE=BCM43142A0 Bluetooth 4.0
+
 usb:v0A5Cp216F*
  ID_MODEL_FROM_DATABASE=BCM20702A0 Bluetooth
 
@@ -33965,8 +34805,14 @@ usb:v0A5Cp5804*
 usb:v0A5Cp6300*
  ID_MODEL_FROM_DATABASE=Pirelli Remote NDIS Device
 
+usb:v0A5Cp6410*
+ ID_MODEL_FROM_DATABASE=BCM20703A1 Bluetooth 4.1 + LE
+
 usb:v0A5CpBD11*
- ID_MODEL_FROM_DATABASE=TiVo AG0100 802.11bg Wireless Adapter [Broadcom BCM4320]
+ ID_MODEL_FROM_DATABASE=BCM4320 802.11bg Wireless Adapter
+
+usb:v0A5CpBD12*
+ ID_MODEL_FROM_DATABASE=BCM4326U 802.11bg Wireless Adapter
 
 usb:v0A5CpBD13*
  ID_MODEL_FROM_DATABASE=BCM4323 802.11abgn Wireless Adapter
@@ -33977,6 +34823,15 @@ usb:v0A5CpBD16*
 usb:v0A5CpBD17*
  ID_MODEL_FROM_DATABASE=BCM43236 802.11abgn Wireless Adapter
 
+usb:v0A5CpBD1D*
+ ID_MODEL_FROM_DATABASE=BCM43526 802.11a/b/g/n/ac (2x2) Wireless Adapter
+
+usb:v0A5CpBD1E*
+ ID_MODEL_FROM_DATABASE=BCM43143 802.11bgn (1x1) Wireless Adapter
+
+usb:v0A5CpBD1F*
+ ID_MODEL_FROM_DATABASE=BCM43242 802.11abgn Wireless Adapter
+
 usb:v0A5CpD11B*
  ID_MODEL_FROM_DATABASE=Eminent EM4045 [Broadcom 4320 USB]
 
@@ -34904,6 +35759,9 @@ usb:v0B05*
 usb:v0B05p0001*
  ID_MODEL_FROM_DATABASE=MeMO Pad HD 7 (CD-ROM mode)
 
+usb:v0B05p0301*
+ ID_MODEL_FROM_DATABASE=MyPal A696 GPS PDA
+
 usb:v0B05p1101*
  ID_MODEL_FROM_DATABASE=Mass Storage (UISDMC4S)
 
@@ -34920,7 +35778,7 @@ usb:v0B05p170B*
  ID_MODEL_FROM_DATABASE=Multi card reader
 
 usb:v0B05p170C*
- ID_MODEL_FROM_DATABASE=WL-159g 802.11bg
+ ID_MODEL_FROM_DATABASE=WL-159g 802.11bg [ZyDAS ZD1211B+AL2230]
 
 usb:v0B05p170D*
  ID_MODEL_FROM_DATABASE=802.11b/g Wireless Network Adapter
@@ -34956,7 +35814,7 @@ usb:v0B05p1726*
  ID_MODEL_FROM_DATABASE=Laptop OLED Display
 
 usb:v0B05p172A*
- ID_MODEL_FROM_DATABASE=ASUS 802.11n Network Adapter
+ ID_MODEL_FROM_DATABASE=802.11n Network Adapter
 
 usb:v0B05p172B*
  ID_MODEL_FROM_DATABASE=802.11n Network Adapter
@@ -34968,7 +35826,7 @@ usb:v0B05p1732*
  ID_MODEL_FROM_DATABASE=802.11n Network Adapter
 
 usb:v0B05p1734*
- ID_MODEL_FROM_DATABASE=ASUS AF-200
+ ID_MODEL_FROM_DATABASE=AF-200
 
 usb:v0B05p173C*
  ID_MODEL_FROM_DATABASE=BT-183 Bluetooth 2.0
@@ -35046,7 +35904,31 @@ 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]
+ ID_MODEL_FROM_DATABASE=AC51 802.11a/b/g/n/ac Wireless Adapter [Mediatek MT7610U]
+
+usb:v0B05p17D2*
+ ID_MODEL_FROM_DATABASE=USB-AC56 802.11a/b/g/n/ac Wireless Adapter [Realtek RTL8812AU]
+
+usb:v0B05p17D3*
+ ID_MODEL_FROM_DATABASE=USB-N10 v2 802.11b/g/n Wireless Adapter [MediaTek MT7601U]
+
+usb:v0B05p17DB*
+ ID_MODEL_FROM_DATABASE=USB-AC50 802.11a/b/g/n/ac (1x1) Wireless Adapter [MediaTek MT7610U]
+
+usb:v0B05p17E8*
+ ID_MODEL_FROM_DATABASE=USB-N14 802.11b/g/n (2x2) Wireless Adapter [Ralink RT5372]
+
+usb:v0B05p17EB*
+ ID_MODEL_FROM_DATABASE=USB-AC55 802.11a/b/g/n/ac Wireless Adapter [MediaTek MT7612U]
+
+usb:v0B05p180A*
+ ID_MODEL_FROM_DATABASE=Broadcom BCM20702 Single-Chip Bluetooth 4.0 + LE
+
+usb:v0B05p1817*
+ ID_MODEL_FROM_DATABASE=USB-AC68 802.11a/b/g/n/ac (4x4) Wireless Adapter [Realtek RTL8814AU]
+
+usb:v0B05p1825*
+ ID_MODEL_FROM_DATABASE=Qualcomm Bluetooth 4.1
 
 usb:v0B05p4C80*
  ID_MODEL_FROM_DATABASE=Transformer Pad TF300TG
@@ -35079,7 +35961,7 @@ usb:v0B05p5412*
  ID_MODEL_FROM_DATABASE=MeMO Pad HD 7 (PTP mode)
 
 usb:v0B05p550F*
- ID_MODEL_FROM_DATABASE=ASUS fonepad 7
+ ID_MODEL_FROM_DATABASE=Fonepad 7
 
 usb:v0B05p6101*
  ID_MODEL_FROM_DATABASE=Cable Modem
@@ -35087,6 +35969,24 @@ usb:v0B05p6101*
 usb:v0B05p620A*
  ID_MODEL_FROM_DATABASE=Remote NDIS Device
 
+usb:v0B05p7772*
+ ID_MODEL_FROM_DATABASE=Zenfone GO (ZB500KL) (MTP mode)
+
+usb:v0B05p7773*
+ ID_MODEL_FROM_DATABASE=Zenfone GO (ZB500KL) (Debug, MTP mode)
+
+usb:v0B05p7774*
+ ID_MODEL_FROM_DATABASE=Zenfone GO (ZB500KL) (RNDIS mode)
+
+usb:v0B05p7775*
+ ID_MODEL_FROM_DATABASE=Zenfone GO (ZB500KL) (Debug, RNDIS mode)
+
+usb:v0B05p7776*
+ ID_MODEL_FROM_DATABASE=Zenfone GO (ZB500KL) (PTP mode)
+
+usb:v0B05p7777*
+ ID_MODEL_FROM_DATABASE=Zenfone GO (ZB500KL) (Debug, PTP mode)
+
 usb:v0B05pB700*
  ID_MODEL_FROM_DATABASE=Broadcom Bluetooth 2.1
 
@@ -35123,18 +36023,33 @@ usb:v0B0Dp0000*
 usb:v0B0E*
  ID_VENDOR_FROM_DATABASE=GN Netcom
 
+usb:v0B0Ep0348*
+ ID_MODEL_FROM_DATABASE=Jabra UC VOICE 550a MS
+
 usb:v0B0Ep034C*
  ID_MODEL_FROM_DATABASE=Jabra UC Voice 750 MS
 
+usb:v0B0Ep0410*
+ ID_MODEL_FROM_DATABASE=Jabra SPEAK 410
+
 usb:v0B0Ep0420*
  ID_MODEL_FROM_DATABASE=Jabra SPEAK 510
 
 usb:v0B0Ep094D*
  ID_MODEL_FROM_DATABASE=GN Netcom / Jabra REVO Wireless
 
+usb:v0B0Ep1017*
+ ID_MODEL_FROM_DATABASE=Jabra PRO 930
+
 usb:v0B0Ep1022*
  ID_MODEL_FROM_DATABASE=Jabra PRO 9450, Type 9400BS (DECT Headset)
 
+usb:v0B0Ep1041*
+ ID_MODEL_FROM_DATABASE=Jabra PRO 9460
+
+usb:v0B0Ep1900*
+ ID_MODEL_FROM_DATABASE=Jabra Biz 1900
+
 usb:v0B0Ep2007*
  ID_MODEL_FROM_DATABASE=GN 2000 Stereo Corded Headset
 
@@ -35198,6 +36113,12 @@ usb:v0B33*
 usb:v0B33p0020*
  ID_MODEL_FROM_DATABASE=ShuttleXpress
 
+usb:v0B33p0030*
+ ID_MODEL_FROM_DATABASE=ShuttlePro v2
+
+usb:v0B33p0401*
+ ID_MODEL_FROM_DATABASE=RollerMouse Free 2
+
 usb:v0B33p0700*
  ID_MODEL_FROM_DATABASE=RollerMouse Pro
 
@@ -35375,6 +36296,12 @@ usb:v0B48p3012*
 usb:v0B48p3014*
  ID_MODEL_FROM_DATABASE=TT-TVStick CT2-4400
 
+usb:v0B48p3015*
+ ID_MODEL_FROM_DATABASE=TT-connect CT2-4650 CI
+
+usb:v0B48p3017*
+ ID_MODEL_FROM_DATABASE=TT-connect S2-4650 CI
+
 usb:v0B49*
  ID_VENDOR_FROM_DATABASE=ASCII Corp.
 
@@ -35619,7 +36546,7 @@ usb:v0B95p772B*
  ID_MODEL_FROM_DATABASE=AX88772B
 
 usb:v0B95p7E2B*
- ID_MODEL_FROM_DATABASE=AX88772B
+ ID_MODEL_FROM_DATABASE=AX88772B Fast Ethernet Controller
 
 usb:v0B96*
  ID_VENDOR_FROM_DATABASE=Sewon Telecom
@@ -36305,15 +37232,24 @@ usb:v0BB4p0CA5*
 usb:v0BB4p0CAE*
  ID_MODEL_FROM_DATABASE=T-Mobile MyTouch 4G Slide [Doubleshot]
 
+usb:v0BB4p0DE5*
+ ID_MODEL_FROM_DATABASE=One (M7)
+
 usb:v0BB4p0DEA*
  ID_MODEL_FROM_DATABASE=M7_UL [HTC One]
 
 usb:v0BB4p0F25*
  ID_MODEL_FROM_DATABASE=One M8
 
+usb:v0BB4p0F63*
+ ID_MODEL_FROM_DATABASE=Desire 610 Via MTP
+
 usb:v0BB4p0F64*
  ID_MODEL_FROM_DATABASE=Desire 601
 
+usb:v0BB4p0FB4*
+ ID_MODEL_FROM_DATABASE=Remote NDIS based Device
+
 usb:v0BB4p0FF8*
  ID_MODEL_FROM_DATABASE=Desire HD (Tethering Mode)
 
@@ -36386,12 +37322,18 @@ usb:v0BC2p2200*
 usb:v0BC2p2300*
  ID_MODEL_FROM_DATABASE=Expansion Portable
 
+usb:v0BC2p231A*
+ ID_MODEL_FROM_DATABASE=Expansion Portable
+
 usb:v0BC2p2320*
  ID_MODEL_FROM_DATABASE=USB 3.0 bridge [Portable Expansion Drive]
 
 usb:v0BC2p2321*
  ID_MODEL_FROM_DATABASE=Expansion Portable
 
+usb:v0BC2p2322*
+ ID_MODEL_FROM_DATABASE=SRD0NF1 Expansion Portable (STEA)
+
 usb:v0BC2p2340*
  ID_MODEL_FROM_DATABASE=FreeAgent External Hard Drive
 
@@ -36410,6 +37352,9 @@ usb:v0BC2p3312*
 usb:v0BC2p3320*
  ID_MODEL_FROM_DATABASE=SRD00F2 [Expansion Desktop Drive]
 
+usb:v0BC2p3322*
+ ID_MODEL_FROM_DATABASE=SRD0NF2 [Expansion Desktop Drive]
+
 usb:v0BC2p3332*
  ID_MODEL_FROM_DATABASE=Expansion
 
@@ -36425,6 +37370,9 @@ usb:v0BC2p5030*
 usb:v0BC2p5031*
  ID_MODEL_FROM_DATABASE=FreeAgent GoFlex USB 3.0
 
+usb:v0BC2p5032*
+ ID_MODEL_FROM_DATABASE=SATA cable
+
 usb:v0BC2p5070*
  ID_MODEL_FROM_DATABASE=FreeAgent GoFlex Desk
 
@@ -36443,6 +37391,15 @@ usb:v0BC2p5121*
 usb:v0BC2p5161*
  ID_MODEL_FROM_DATABASE=FreeAgent GoFlex dock
 
+usb:v0BC2p6126*
+ ID_MODEL_FROM_DATABASE=Maxtor D3 Station 5TB
+
+usb:v0BC2p61B6*
+ ID_MODEL_FROM_DATABASE=Maxtor HX-M101TCB/GM [M3 Portable 1TB]
+
+usb:v0BC2p61B7*
+ ID_MODEL_FROM_DATABASE=Maxtor M3 Portable
+
 usb:v0BC2pA003*
  ID_MODEL_FROM_DATABASE=Backup Plus
 
@@ -36455,15 +37412,30 @@ usb:v0BC2pA0A4*
 usb:v0BC2pAB00*
  ID_MODEL_FROM_DATABASE=Slim Portable Drive
 
+usb:v0BC2pAB1E*
+ ID_MODEL_FROM_DATABASE=Backup Plus Portable Drive
+
 usb:v0BC2pAB20*
  ID_MODEL_FROM_DATABASE=Backup Plus Portable Drive
 
 usb:v0BC2pAB21*
  ID_MODEL_FROM_DATABASE=Backup Plus Slim
 
+usb:v0BC2pAB24*
+ ID_MODEL_FROM_DATABASE=Backup Plus Portable Drive
+
+usb:v0BC2pAB26*
+ ID_MODEL_FROM_DATABASE=Backup Plus Slim Portable Drive 1 TB
+
 usb:v0BC2pAB31*
  ID_MODEL_FROM_DATABASE=Backup Plus Desktop Drive (5TB)
 
+usb:v0BC2pAB34*
+ ID_MODEL_FROM_DATABASE=Backup Plus
+
+usb:v0BC2pAB38*
+ ID_MODEL_FROM_DATABASE=Backup Plus Hub
+
 usb:v0BC3*
  ID_VENDOR_FROM_DATABASE=IPWireless, Inc.
 
@@ -36563,6 +37535,9 @@ usb:v0BDAp0107*
 usb:v0BDAp0108*
  ID_MODEL_FROM_DATABASE=Mass Storage Device
 
+usb:v0BDAp0109*
+ ID_MODEL_FROM_DATABASE=microSDXC Card Reader [Hama 00091047]
+
 usb:v0BDAp0111*
  ID_MODEL_FROM_DATABASE=RTS5111 Card Reader Controller
 
@@ -36600,7 +37575,7 @@ usb:v0BDAp0152*
  ID_MODEL_FROM_DATABASE=Mass Storage Device
 
 usb:v0BDAp0153*
- ID_MODEL_FROM_DATABASE=Mass Storage Device
+ ID_MODEL_FROM_DATABASE=3-in-1 (SD/SDHC/SDXC) Card Reader
 
 usb:v0BDAp0156*
  ID_MODEL_FROM_DATABASE=Mass Storage Device
@@ -36644,6 +37619,12 @@ usb:v0BDAp0186*
 usb:v0BDAp0301*
  ID_MODEL_FROM_DATABASE=multicard reader
 
+usb:v0BDAp0307*
+ ID_MODEL_FROM_DATABASE=Card Reader
+
+usb:v0BDAp0326*
+ ID_MODEL_FROM_DATABASE=Card reader
+
 usb:v0BDAp1724*
  ID_MODEL_FROM_DATABASE=RTL8723AU 802.11n WLAN Adapter
 
@@ -36659,18 +37640,39 @@ usb:v0BDAp2838*
 usb:v0BDAp5401*
  ID_MODEL_FROM_DATABASE=RTL 8153 USB 3.0 hub with gigabit ethernet
 
+usb:v0BDAp570C*
+ ID_MODEL_FROM_DATABASE=Asus laptop camera
+
 usb:v0BDAp5730*
  ID_MODEL_FROM_DATABASE=HP 2.0MP High Definition Webcam
 
+usb:v0BDAp5751*
+ ID_MODEL_FROM_DATABASE=Integrated Webcam
+
 usb:v0BDAp5775*
  ID_MODEL_FROM_DATABASE=HP "Truevision HD" laptop camera
 
+usb:v0BDAp57B3*
+ ID_MODEL_FROM_DATABASE=Acer 640 × 480 laptop camera
+
+usb:v0BDAp57DA*
+ ID_MODEL_FROM_DATABASE=Built-In Video Camera
+
+usb:v0BDAp58C8*
+ ID_MODEL_FROM_DATABASE=Integrated Webcam HD
+
 usb:v0BDAp8150*
  ID_MODEL_FROM_DATABASE=RTL8150 Fast Ethernet Adapter
 
 usb:v0BDAp8151*
  ID_MODEL_FROM_DATABASE=RTL8151 Adapteon Business Mobile Networks BV
 
+usb:v0BDAp8152*
+ ID_MODEL_FROM_DATABASE=RTL8152 Fast Ethernet Adapter
+
+usb:v0BDAp8153*
+ ID_MODEL_FROM_DATABASE=RTL8153 Gigabit Ethernet Adapter
+
 usb:v0BDAp8171*
  ID_MODEL_FROM_DATABASE=RTL8188SU 802.11n WLAN Adapter
 
@@ -36698,6 +37700,9 @@ usb:v0BDAp8187*
 usb:v0BDAp8189*
  ID_MODEL_FROM_DATABASE=RTL8187B Wireless 802.11g 54Mbps Network Adapter
 
+usb:v0BDAp818B*
+ ID_MODEL_FROM_DATABASE=RTL8192EU 802.11b/g/n WLAN Adapter
+
 usb:v0BDAp8192*
  ID_MODEL_FROM_DATABASE=RTL8191SU 802.11n Wireless Adapter
 
@@ -36714,7 +37719,13 @@ usb:v0BDAp8199*
  ID_MODEL_FROM_DATABASE=RTL8187SU 802.11g WLAN Adapter
 
 usb:v0BDAp8812*
- ID_MODEL_FROM_DATABASE=RTL8812AU 802.11a/b/g/n/ac WLAN Adapter
+ ID_MODEL_FROM_DATABASE=RTL8812AU 802.11a/b/g/n/ac 2T2R DB WLAN Adapter
+
+usb:v0BDAp8813*
+ ID_MODEL_FROM_DATABASE=RTL8814AU 802.11a/b/g/n/ac Wireless Adapter
+
+usb:v0BDApA811*
+ ID_MODEL_FROM_DATABASE=RTL8811AU 802.11a/b/g/n/ac WLAN Adapter
 
 usb:v0BDB*
  ID_VENDOR_FROM_DATABASE=Ericsson Business Mobile Networks BV
@@ -36752,6 +37763,9 @@ usb:v0BDBp190A*
 usb:v0BDBp190B*
  ID_MODEL_FROM_DATABASE=C3607w v2 Mobile Broadband Module
 
+usb:v0BDBp1926*
+ ID_MODEL_FROM_DATABASE=H5321 gw Mobile Broadband Driver
+
 usb:v0BDC*
  ID_VENDOR_FROM_DATABASE=Y Media Corp.
 
@@ -36851,6 +37865,9 @@ usb:v0BF8p100F*
 usb:v0BF8p1017*
  ID_MODEL_FROM_DATABASE=Keyboard KB SCR
 
+usb:v0BF8p101F*
+ ID_MODEL_FROM_DATABASE=Fujitsu Full HD Pro Webcam
+
 usb:v0BFD*
  ID_VENDOR_FROM_DATABASE=Kvaser AB
 
@@ -36863,6 +37880,12 @@ usb:v0BFDp000B*
 usb:v0BFDp000E*
  ID_MODEL_FROM_DATABASE=Leaf SemiPro HS
 
+usb:v0C00*
+ ID_VENDOR_FROM_DATABASE=FireFly Mouse Mat
+
+usb:v0C00p1607*
+ ID_MODEL_FROM_DATABASE=Apex M500
+
 usb:v0C04*
  ID_VENDOR_FROM_DATABASE=MOTO Development Group, Inc.
 
@@ -37103,6 +38126,12 @@ usb:v0C2Ep0B6A*
 usb:v0C2Ep0B81*
  ID_MODEL_FROM_DATABASE=Barcode scanner Voyager 1400g Series
 
+usb:v0C30*
+ ID_VENDOR_FROM_DATABASE=Mutoh Industries Ltd
+
+usb:v0C30p6010*
+ ID_MODEL_FROM_DATABASE=Kona 1400 Cutting Plotter
+
 usb:v0C35*
  ID_VENDOR_FROM_DATABASE=Eagletron, Inc.
 
@@ -37547,6 +38576,9 @@ usb:v0C45p6419*
 usb:v0C45p641D*
  ID_MODEL_FROM_DATABASE=1.3 MPixel Integrated Webcam
 
+usb:v0C45p6433*
+ ID_MODEL_FROM_DATABASE=Laptop Integrated Webcam HD (Composite Device)
+
 usb:v0C45p643F*
  ID_MODEL_FROM_DATABASE=Dell Integrated HD Webcam
 
@@ -37562,6 +38594,21 @@ usb:v0C45p648B*
 usb:v0C45p64BD*
  ID_MODEL_FROM_DATABASE=Sony Visual Communication Camera
 
+usb:v0C45p64D0*
+ ID_MODEL_FROM_DATABASE=Integrated Webcam
+
+usb:v0C45p64D2*
+ ID_MODEL_FROM_DATABASE=Integrated Webcam
+
+usb:v0C45p651B*
+ ID_MODEL_FROM_DATABASE=HP Webcam
+
+usb:v0C45p6705*
+ ID_MODEL_FROM_DATABASE=Integrated HD Webcam
+
+usb:v0C45p6710*
+ ID_MODEL_FROM_DATABASE=Integrated Webcam
+
 usb:v0C45p7401*
  ID_MODEL_FROM_DATABASE=TEMPer Temperature Sensor
 
@@ -38075,6 +39122,21 @@ usb:v0CA7*
 usb:v0CAD*
  ID_VENDOR_FROM_DATABASE=Motorola CGISS
 
+usb:v0CADp1007*
+ ID_MODEL_FROM_DATABASE=APX Series Consolette
+
+usb:v0CADp1020*
+ ID_MODEL_FROM_DATABASE=MOTOTRBO Series Radio (Portable)
+
+usb:v0CADp1030*
+ ID_MODEL_FROM_DATABASE=APX Series Radio (Portable)
+
+usb:v0CADp1031*
+ ID_MODEL_FROM_DATABASE=APX Series Radio (Mobile)
+
+usb:v0CADp1602*
+ ID_MODEL_FROM_DATABASE=IMPRES Battery Data Reader
+
 usb:v0CADp9001*
  ID_MODEL_FROM_DATABASE=PowerPad Pocket PC Device
 
@@ -38174,9 +39236,6 @@ usb:v0CC5*
 usb:v0CC6*
  ID_VENDOR_FROM_DATABASE=Intermagic Corp.
 
-usb:v0CC7*
- ID_VENDOR_FROM_DATABASE=Kontron Medical AG
-
 usb:v0CC8*
  ID_VENDOR_FROM_DATABASE=Technotools Corp.
 
@@ -38279,6 +39338,9 @@ usb:v0CCDp0086*
 usb:v0CCDp008E*
  ID_MODEL_FROM_DATABASE=Cinergy HTC XS
 
+usb:v0CCDp0096*
+ ID_MODEL_FROM_DATABASE=Grabby
+
 usb:v0CCDp0097*
  ID_MODEL_FROM_DATABASE=Cinergy T RC MKII
 
@@ -38297,6 +39359,12 @@ usb:v0CCDp00B3*
 usb:v0CCDp00E0*
  ID_MODEL_FROM_DATABASE=NOXON DAB/DAB+ Stick V2
 
+usb:v0CCDp0102*
+ ID_MODEL_FROM_DATABASE=Cinergy S2 Stick
+
+usb:v0CCDp0105*
+ ID_MODEL_FROM_DATABASE=Cinergy S2 Box
+
 usb:v0CCDp10A7*
  ID_MODEL_FROM_DATABASE=TerraTec G3
 
@@ -38315,6 +39383,18 @@ usb:v0CD5p0003*
 usb:v0CD5p0009*
  ID_MODEL_FROM_DATABASE=UE9
 
+usb:v0CD6*
+ ID_VENDOR_FROM_DATABASE=Scheidt & Bachmann
+
+usb:v0CD6p000C*
+ ID_MODEL_FROM_DATABASE=S&B TPU
+
+usb:v0CD6p000E*
+ ID_MODEL_FROM_DATABASE=S&B BKV
+
+usb:v0CD6p0011*
+ ID_MODEL_FROM_DATABASE=Money Coin Unit
+
 usb:v0CD7*
  ID_VENDOR_FROM_DATABASE=NewChip S.r.l.
 
@@ -38472,7 +39552,7 @@ usb:v0CF2p6250*
  ID_MODEL_FROM_DATABASE=SD card reader (UB6250)
 
 usb:v0CF3*
- ID_VENDOR_FROM_DATABASE=Atheros Communications, Inc.
+ ID_VENDOR_FROM_DATABASE=Qualcomm Atheros Communications
 
 usb:v0CF3p0001*
  ID_MODEL_FROM_DATABASE=AR5523
@@ -38519,9 +39599,15 @@ usb:v0CF3p3004*
 usb:v0CF3p3005*
  ID_MODEL_FROM_DATABASE=AR3011 Bluetooth
 
+usb:v0CF3p3007*
+ ID_MODEL_FROM_DATABASE=AR3012 Bluetooth 4.0 (no firmware)
+
 usb:v0CF3p3008*
  ID_MODEL_FROM_DATABASE=Bluetooth (AR3011)
 
+usb:v0CF3p311F*
+ ID_MODEL_FROM_DATABASE=AR3012 Bluetooth
+
 usb:v0CF3p7015*
  ID_MODEL_FROM_DATABASE=TP-Link TL-WN821N v3 / TL-WN822N v2 802.11n [Atheros AR7010+AR9287]
 
@@ -38537,6 +39623,9 @@ usb:v0CF3pB002*
 usb:v0CF3pB003*
  ID_MODEL_FROM_DATABASE=Ubiquiti WiFiStationEXT 802.11n [Atheros AR9271]
 
+usb:v0CF3pE006*
+ ID_MODEL_FROM_DATABASE=Dell Wireless 1802 Bluetooth 4.0 LE
+
 usb:v0CF4*
  ID_VENDOR_FROM_DATABASE=Fomtex Corp.
 
@@ -38642,6 +39731,9 @@ usb:v0D16p0002*
 usb:v0D16p0004*
  ID_MODEL_FROM_DATABASE=Photo Printer 63xPL/PS
 
+usb:v0D16p000E*
+ ID_MODEL_FROM_DATABASE=P910L
+
 usb:v0D16p0100*
  ID_MODEL_FROM_DATABASE=Photo Printer 63xPL/PS
 
@@ -38673,7 +39765,7 @@ usb:v0D28*
  ID_VENDOR_FROM_DATABASE=NXP
 
 usb:v0D28p0204*
- ID_MODEL_FROM_DATABASE=LPC1768
+ ID_MODEL_FROM_DATABASE=ARM mbed
 
 usb:v0D32*
  ID_VENDOR_FROM_DATABASE=Leo Hui Electric Wire & Cable Co., Ltd
@@ -38735,6 +39827,9 @@ usb:v0D46p2012*
 usb:v0D46p3003*
  ID_MODEL_FROM_DATABASE=mIDentity Light / KAAN SIM III
 
+usb:v0D46p3014*
+ ID_MODEL_FROM_DATABASE=Smart Token
+
 usb:v0D46p4000*
  ID_MODEL_FROM_DATABASE=mIDentity (mass storage)
 
@@ -38957,6 +40052,9 @@ usb:v0D64p3105*
 usb:v0D64p3108*
  ID_MODEL_FROM_DATABASE=Digicam Mass Storage Device
 
+usb:v0D64p5566*
+ ID_MODEL_FROM_DATABASE=Contour Roam Model 1600
+
 usb:v0D65*
  ID_VENDOR_FROM_DATABASE=KMJP Co., Ltd
 
@@ -39113,6 +40211,9 @@ usb:v0D8Cp0002*
 usb:v0D8Cp0003*
  ID_MODEL_FROM_DATABASE=Sound Device
 
+usb:v0D8Cp0005*
+ ID_MODEL_FROM_DATABASE=Blue Snowball
+
 usb:v0D8Cp0006*
  ID_MODEL_FROM_DATABASE=Storm HP-USB500 5.1 Headset
 
@@ -39354,7 +40455,7 @@ usb:v0D99*
  ID_VENDOR_FROM_DATABASE=Trazer Technologies, Inc.
 
 usb:v0D9A*
- ID_VENDOR_FROM_DATABASE=RTX Telecom AS
+ ID_VENDOR_FROM_DATABASE=RTX AS
 
 usb:v0D9Ap0001*
  ID_MODEL_FROM_DATABASE=Bluetooth Device
@@ -39452,6 +40553,12 @@ usb:v0DB0p3713*
 usb:v0DB0p3801*
  ID_MODEL_FROM_DATABASE=Motorola Bluetooth 2.1+EDR Device
 
+usb:v0DB0p3870*
+ ID_MODEL_FROM_DATABASE=MS-3870 802.11bgn Wireless Module [Ralink RT3070]
+
+usb:v0DB0p3871*
+ ID_MODEL_FROM_DATABASE=MS-3871 802.11bgn Wireless Module [Ralink RT8070]
+
 usb:v0DB0p4011*
  ID_MODEL_FROM_DATABASE=Medion Flash XL V2.0 Card Reader
 
@@ -39584,6 +40691,9 @@ usb:v0DBAp1000*
 usb:v0DBAp3000*
  ID_MODEL_FROM_DATABASE=Mbox 2
 
+usb:v0DBApB011*
+ ID_MODEL_FROM_DATABASE=Eleven Rack
+
 usb:v0DBC*
  ID_VENDOR_FROM_DATABASE=A&D Medical
 
@@ -39611,6 +40721,9 @@ usb:v0DBFp0300*
 usb:v0DBFp0333*
  ID_MODEL_FROM_DATABASE=Storage Adapter
 
+usb:v0DBFp0502*
+ ID_MODEL_FROM_DATABASE=FSC Storagebird XL hard disk
+
 usb:v0DBFp0707*
  ID_MODEL_FROM_DATABASE=ZIV Drive
 
@@ -39639,7 +40752,7 @@ usb:v0DC3p1702*
  ID_MODEL_FROM_DATABASE=ASEKey
 
 usb:v0DC4*
- ID_VENDOR_FROM_DATABASE=Macpower Peripherals, Ltd
+ ID_VENDOR_FROM_DATABASE=inXtron, Inc.
 
 usb:v0DC4p0040*
  ID_MODEL_FROM_DATABASE=Mass Storage Device
@@ -39959,12 +41072,18 @@ usb:v0DF6p0060*
 usb:v0DF6p0062*
  ID_MODEL_FROM_DATABASE=WLA-5000 802.11abgn [Ralink RT3572]
 
+usb:v0DF6p006F*
+ ID_MODEL_FROM_DATABASE=WLA-5100
+
 usb:v0DF6p0072*
  ID_MODEL_FROM_DATABASE=AX88179 Gigabit Ethernet [Sitecom]
 
 usb:v0DF6p061C*
  ID_MODEL_FROM_DATABASE=LN-028 Network USB 2.0 Adapter
 
+usb:v0DF6p214A*
+ ID_MODEL_FROM_DATABASE=IDE/SATA Combo Adapter [CN-330]
+
 usb:v0DF6p21F4*
  ID_MODEL_FROM_DATABASE=44 St Bluetooth Device
 
@@ -40034,6 +41153,9 @@ usb:v0DFC*
 usb:v0DFCp0001*
  ID_MODEL_FROM_DATABASE=Touchscreen
 
+usb:v0DFCp0101*
+ ID_MODEL_FROM_DATABASE=5-point Touch Screen
+
 usb:v0E03*
  ID_VENDOR_FROM_DATABASE=Nippon Systemware Co., Ltd
 
@@ -40178,20 +41300,11 @@ usb:v0E35*
 usb:v0E36*
  ID_VENDOR_FROM_DATABASE=TiePie engineering
 
-usb:v0E36p0008*
- ID_MODEL_FROM_DATABASE=Handyscope HS3
-
 usb:v0E36p0009*
- ID_MODEL_FROM_DATABASE=Handyscope HS3 (br)
-
-usb:v0E36p000A*
- ID_MODEL_FROM_DATABASE=Handyscope HS4
+ ID_MODEL_FROM_DATABASE=Handyscope HS3
 
 usb:v0E36p000B*
- ID_MODEL_FROM_DATABASE=Handyscope HS4 (br)
-
-usb:v0E36p000E*
- ID_MODEL_FROM_DATABASE=Handyscope HS4-DIFF
+ ID_MODEL_FROM_DATABASE=Handyscope HS4
 
 usb:v0E36p000F*
  ID_MODEL_FROM_DATABASE=Handyscope HS4-DIFF (br)
@@ -40307,6 +41420,9 @@ usb:v0E4Cp7288*
 usb:v0E50*
  ID_VENDOR_FROM_DATABASE=TechnoData Interware
 
+usb:v0E50p0001*
+ ID_MODEL_FROM_DATABASE=Matrix USB-Key
+
 usb:v0E50p0002*
  ID_MODEL_FROM_DATABASE=Matrixlock Dongle (HID)
 
@@ -40406,6 +41522,9 @@ usb:v0E6Ap030C*
 usb:v0E6Ap6001*
  ID_MODEL_FROM_DATABASE=GEMBIRD Flexible keyboard KB-109F-B-DE
 
+usb:v0E6Ap7F5C*
+ ID_MODEL_FROM_DATABASE=BPF-015 Key Chain Photo Frame
+
 usb:v0E6F*
  ID_VENDOR_FROM_DATABASE=Logic3
 
@@ -40496,12 +41615,18 @@ usb:v0E8Dp0004*
 usb:v0E8Dp0023*
  ID_MODEL_FROM_DATABASE=S103
 
+usb:v0E8Dp00A5*
+ ID_MODEL_FROM_DATABASE=GSM modem [Medion Surfstick Model:S4222]
+
 usb:v0E8Dp1806*
  ID_MODEL_FROM_DATABASE=Samsung SE-208 Slim Portable DVD Writer
 
 usb:v0E8Dp1836*
  ID_MODEL_FROM_DATABASE=Samsung SE-S084 Super WriteMaster Slim External DVD writer
 
+usb:v0E8Dp1956*
+ ID_MODEL_FROM_DATABASE=Samsung SE-506 Portable BluRay Disc Writer
+
 usb:v0E8Dp2000*
  ID_MODEL_FROM_DATABASE=MT65xx Preloader
 
@@ -40535,6 +41660,9 @@ usb:v0E8Fp0022*
 usb:v0E8Fp0201*
  ID_MODEL_FROM_DATABASE=SmartJoy Frag Xpad/PS2 adaptor
 
+usb:v0E8Fp300A*
+ ID_MODEL_FROM_DATABASE=steering Wheel
+
 usb:v0E90*
  ID_VENDOR_FROM_DATABASE=WiebeTech, LLC
 
@@ -40856,6 +41984,15 @@ usb:v0F0Dp0011*
 usb:v0F0E*
  ID_VENDOR_FROM_DATABASE=Energy Full Corp.
 
+usb:v0F0F*
+ ID_VENDOR_FROM_DATABASE=Silego Technology Inc
+
+usb:v0F0Fp0006*
+ ID_MODEL_FROM_DATABASE=GreenPak Universal Dev Board (Active Mode)
+
+usb:v0F0Fp8006*
+ ID_MODEL_FROM_DATABASE=GreenPak Universal Dev Board (Reset Mode)
+
 usb:v0F11*
  ID_VENDOR_FROM_DATABASE=LD Didactic GmbH
 
@@ -40913,6 +42050,9 @@ usb:v0F14*
 usb:v0F14p0012*
  ID_MODEL_FROM_DATABASE=Vital'Act 3S
 
+usb:v0F14p0038*
+ ID_MODEL_FROM_DATABASE=XIRING Smart Card Terminal LEO V2
+
 usb:v0F18*
  ID_VENDOR_FROM_DATABASE=Finger Lakes Instrumentation
 
@@ -41336,6 +42476,9 @@ usb:v0FCAp8011*
 usb:v0FCAp8020*
  ID_MODEL_FROM_DATABASE=Blackberry Playbook (CD-Rom mode)
 
+usb:v0FCAp8037*
+ ID_MODEL_FROM_DATABASE=Blackberry PRIV
+
 usb:v0FCE*
  ID_VENDOR_FROM_DATABASE=Sony Ericsson Mobile Communications AB
 
@@ -41375,6 +42518,24 @@ usb:v0FCEp0172*
 usb:v0FCEp0177*
  ID_MODEL_FROM_DATABASE=Xperia Ion [Mass Storage]
 
+usb:v0FCEp0188*
+ ID_MODEL_FROM_DATABASE=ST26i
+
+usb:v0FCEp019C*
+ ID_MODEL_FROM_DATABASE=C6833
+
+usb:v0FCEp019E*
+ ID_MODEL_FROM_DATABASE=C6903
+
+usb:v0FCEp01A5*
+ ID_MODEL_FROM_DATABASE=SO-04F
+
+usb:v0FCEp01A7*
+ ID_MODEL_FROM_DATABASE=D5503
+
+usb:v0FCEp01BA*
+ ID_MODEL_FROM_DATABASE=D6603 [Xperia Z3]
+
 usb:v0FCEp01BB*
  ID_MODEL_FROM_DATABASE=D5803 [Xperia Z3 Compact] (MTP mode)
 
@@ -41426,6 +42587,9 @@ usb:v0FCEp5177*
 usb:v0FCEp518C*
  ID_MODEL_FROM_DATABASE=C1605 [Xperia E dual] MTD mode
 
+usb:v0FCEp51A7*
+ ID_MODEL_FROM_DATABASE=D5503 (Xperia Z1 Compact)
+
 usb:v0FCEp614F*
  ID_MODEL_FROM_DATABASE=Xperia X12 (debug mode)
 
@@ -41594,6 +42758,42 @@ usb:v0FCEpE167*
 usb:v0FCEpE19B*
  ID_MODEL_FROM_DATABASE=C2005 [Xperia M dual] (Mass Storage)
 
+usb:v0FCEpE1A9*
+ ID_MODEL_FROM_DATABASE=D5303
+
+usb:v0FCEpE1AA*
+ ID_MODEL_FROM_DATABASE=D2303
+
+usb:v0FCEpE1AD*
+ ID_MODEL_FROM_DATABASE=D5103
+
+usb:v0FCEpE1B0*
+ ID_MODEL_FROM_DATABASE=D6708
+
+usb:v0FCEpE1B5*
+ ID_MODEL_FROM_DATABASE=D2004
+
+usb:v0FCEpE1BA*
+ ID_MODEL_FROM_DATABASE=D6683
+
+usb:v0FCEpE1BB*
+ ID_MODEL_FROM_DATABASE=SO-02G
+
+usb:v0FCEpE1BC*
+ ID_MODEL_FROM_DATABASE=D2203
+
+usb:v0FCEpE1C0*
+ ID_MODEL_FROM_DATABASE=SGP621
+
+usb:v0FCEpE1C2*
+ ID_MODEL_FROM_DATABASE=D2533
+
+usb:v0FCEpE1C9*
+ ID_MODEL_FROM_DATABASE=E6553
+
+usb:v0FCEpE1CF*
+ ID_MODEL_FROM_DATABASE=SGP771
+
 usb:v0FCEpF0FA*
  ID_MODEL_FROM_DATABASE=MN800 / Smartwatch 2 (DFU mode)
 
@@ -41690,6 +42890,9 @@ usb:v0FE0p0101*
 usb:v0FE0p0200*
  ID_MODEL_FROM_DATABASE=Bluetooth Keypad
 
+usb:v0FE2*
+ ID_VENDOR_FROM_DATABASE=Air Techniques
+
 usb:v0FE4*
  ID_VENDOR_FROM_DATABASE=IN-Tech Electronics, Ltd
 
@@ -41697,7 +42900,7 @@ usb:v0FE5*
  ID_VENDOR_FROM_DATABASE=Greenconn (U.S.A.), Inc.
 
 usb:v0FE6*
- ID_VENDOR_FROM_DATABASE=Kontron (Industrial Computer Source / ICS Advent)
+ ID_VENDOR_FROM_DATABASE=ICS Advent
 
 usb:v0FE6p8101*
  ID_MODEL_FROM_DATABASE=DM9601 Fast Ethernet Adapter
@@ -41714,6 +42917,9 @@ usb:v0FE9*
 usb:v0FE9p4020*
  ID_MODEL_FROM_DATABASE=TViX M-6500
 
+usb:v0FE9p9010*
+ ID_MODEL_FROM_DATABASE=FusionRemote IR receiver
+
 usb:v0FE9pDB00*
  ID_MODEL_FROM_DATABASE=FusionHDTV DVB-T (MT352+LgZ201) (uninitialized)
 
@@ -41831,8 +43037,11 @@ usb:v1004p61FC*
 usb:v1004p61FE*
  ID_MODEL_FROM_DATABASE=Optimus Android Phone [USB tethering mode]
 
+usb:v1004p627F*
+ ID_MODEL_FROM_DATABASE=G3 (VS985) Android Phone (MTP/Download mode)
+
 usb:v1004p6300*
- ID_MODEL_FROM_DATABASE=G2/Optimus Android Phone
+ ID_MODEL_FROM_DATABASE=G2/Optimus Android Phone [Charge mode]
 
 usb:v1004p631C*
  ID_MODEL_FROM_DATABASE=G2/Optimus Android Phone [MTP mode]
@@ -41846,8 +43055,11 @@ usb:v1004p631E*
 usb:v1004p631F*
  ID_MODEL_FROM_DATABASE=Optimus Android Phone (Charge Mode)
 
+usb:v1004p633A*
+ ID_MODEL_FROM_DATABASE=Ultimate 2 Android Phone L41C
+
 usb:v1004p633E*
- ID_MODEL_FROM_DATABASE=G2 Android Phone [MTP mode]
+ ID_MODEL_FROM_DATABASE=G2/G3 Android Phone [MTP/PTP/Download mode]
 
 usb:v1004p6344*
  ID_MODEL_FROM_DATABASE=G2 Android Phone [tethering mode]
@@ -42365,15 +43577,33 @@ usb:v1058p0748*
 usb:v1058p07A8*
  ID_MODEL_FROM_DATABASE=My Passport (WDBBEP), My Passport for Mac (WDBLUZ)
 
+usb:v1058p07AE*
+ ID_MODEL_FROM_DATABASE=My Passport Edge for Mac (WDBJBH)
+
+usb:v1058p07BA*
+ ID_MODEL_FROM_DATABASE=PiDrive (WDLB)
+
 usb:v1058p0810*
  ID_MODEL_FROM_DATABASE=My Passport Ultra (WDBZFP)
 
+usb:v1058p0816*
+ ID_MODEL_FROM_DATABASE=My Passport Air (WDBBLW)
+
 usb:v1058p0820*
  ID_MODEL_FROM_DATABASE=My Passport Ultra (WDBMWV, WDBZFP)
 
+usb:v1058p0822*
+ ID_MODEL_FROM_DATABASE=My Passport Ultra (WDBBUZ)
+
+usb:v1058p0824*
+ ID_MODEL_FROM_DATABASE=My Passport Slim (WDBPDZ)
+
 usb:v1058p0830*
  ID_MODEL_FROM_DATABASE=My Passport Ultra (WDBZFP)
 
+usb:v1058p0837*
+ ID_MODEL_FROM_DATABASE=My Passport Ultra (WDBBKD)
+
 usb:v1058p0900*
  ID_MODEL_FROM_DATABASE=MyBook Essential External HDD
 
@@ -42386,6 +43616,9 @@ usb:v1058p0902*
 usb:v1058p0903*
  ID_MODEL_FROM_DATABASE=My Book Premium Edition
 
+usb:v1058p0905*
+ ID_MODEL_FROM_DATABASE=My Book Pro Edition II (WD10000C033-001)
+
 usb:v1058p0910*
  ID_MODEL_FROM_DATABASE=My Book Essential Edition (Green Ring) (WDG1U)
 
@@ -42410,6 +43643,9 @@ usb:v1058p1042*
 usb:v1058p1048*
  ID_MODEL_FROM_DATABASE=Elements Portable (WDBU6Y)
 
+usb:v1058p1078*
+ ID_MODEL_FROM_DATABASE=Elements Portable (WDBUZG)
+
 usb:v1058p107C*
  ID_MODEL_FROM_DATABASE=Elements Desktop (WDBWLG)
 
@@ -42456,7 +43692,34 @@ usb:v1058p1140*
  ID_MODEL_FROM_DATABASE=My Book Essential (WDBACW)
 
 usb:v1058p1230*
- ID_MODEL_FROM_DATABASE=My Book (WDBFJK0030HBK)
+ ID_MODEL_FROM_DATABASE=My Book (WDBFJK)
+
+usb:v1058p1235*
+ ID_MODEL_FROM_DATABASE=My Book (WDBFJK0040HBK)
+
+usb:v1058p2599*
+ ID_MODEL_FROM_DATABASE=My Passport Ultra (WD40NMZW)
+
+usb:v1058p259D*
+ ID_MODEL_FROM_DATABASE=My Passport Ultra (WDBBKD)
+
+usb:v1058p259F*
+ ID_MODEL_FROM_DATABASE=My Passport Ultra (WD10JMVW)
+
+usb:v1058p25A1*
+ ID_MODEL_FROM_DATABASE=Elements / My Passport (WD20NMVW)
+
+usb:v1058p25A2*
+ ID_MODEL_FROM_DATABASE=Elements 25A2
+
+usb:v1058p25A3*
+ ID_MODEL_FROM_DATABASE=Elements Desktop (WDBWLG)
+
+usb:v1058p25E2*
+ ID_MODEL_FROM_DATABASE=My Passport (WD40NMZW)
+
+usb:v1058p30A0*
+ ID_MODEL_FROM_DATABASE=SATA adapter cable
 
 usb:v1059*
  ID_VENDOR_FROM_DATABASE=Giesecke & Devrient GmbH
@@ -42503,6 +43766,12 @@ usb:v1065p0020*
 usb:v1065p2136*
  ID_MODEL_FROM_DATABASE=EasyDisk ED1064
 
+usb:v1068*
+ ID_VENDOR_FROM_DATABASE=Micropi Elettronica
+
+usb:v1068p0001*
+ ID_MODEL_FROM_DATABASE=CPUSB - V 1.8 - software-rights management key
+
 usb:v106A*
  ID_VENDOR_FROM_DATABASE=Loyal Legend, Ltd
 
@@ -42773,12 +44042,99 @@ usb:v1082*
 usb:v1083*
  ID_VENDOR_FROM_DATABASE=Canon Electronics, Inc.
 
+usb:v1083p160C*
+ ID_MODEL_FROM_DATABASE=CR-55
+
+usb:v1083p160F*
+ ID_MODEL_FROM_DATABASE=DR-1210C
+
+usb:v1083p1614*
+ ID_MODEL_FROM_DATABASE=DR-4010C
+
+usb:v1083p1617*
+ ID_MODEL_FROM_DATABASE=DR-2510C
+
+usb:v1083p1618*
+ ID_MODEL_FROM_DATABASE=DR-X10C
+
+usb:v1083p161A*
+ ID_MODEL_FROM_DATABASE=CR-25
+
 usb:v1083p161B*
  ID_MODEL_FROM_DATABASE=DR-2010C Scanner
 
+usb:v1083p161D*
+ ID_MODEL_FROM_DATABASE=DR-3010C
+
+usb:v1083p1620*
+ ID_MODEL_FROM_DATABASE=DR-7090C
+
+usb:v1083p1622*
+ ID_MODEL_FROM_DATABASE=DR-9050C
+
+usb:v1083p1623*
+ ID_MODEL_FROM_DATABASE=DR-7550C
+
+usb:v1083p1624*
+ ID_MODEL_FROM_DATABASE=DR-6050C
+
+usb:v1083p1626*
+ ID_MODEL_FROM_DATABASE=DR-6010C
+
 usb:v1083p162C*
  ID_MODEL_FROM_DATABASE=P-150 Scanner
 
+usb:v1083p1638*
+ ID_MODEL_FROM_DATABASE=DR-6030C
+
+usb:v1083p1639*
+ ID_MODEL_FROM_DATABASE=CR-135i
+
+usb:v1083p163E*
+ ID_MODEL_FROM_DATABASE=DR-M160
+
+usb:v1083p163F*
+ ID_MODEL_FROM_DATABASE=DR-M140
+
+usb:v1083p1640*
+ ID_MODEL_FROM_DATABASE=DR-C125
+
+usb:v1083p1641*
+ ID_MODEL_FROM_DATABASE=DR-P215
+
+usb:v1083p1648*
+ ID_MODEL_FROM_DATABASE=FSU-201
+
+usb:v1083p164A*
+ ID_MODEL_FROM_DATABASE=DR-C130
+
+usb:v1083p164B*
+ ID_MODEL_FROM_DATABASE=DR-P208
+
+usb:v1083p164F*
+ ID_MODEL_FROM_DATABASE=DR-G1130
+
+usb:v1083p1650*
+ ID_MODEL_FROM_DATABASE=DR-G1100
+
+usb:v1083p1651*
+ ID_MODEL_FROM_DATABASE=DR-C120
+
+usb:v1083p1654*
+ ID_MODEL_FROM_DATABASE=DR-F120
+
+usb:v1083p1657*
+ ID_MODEL_FROM_DATABASE=DR-M1060
+
+usb:v1083p1658*
+ ID_MODEL_FROM_DATABASE=DR-C225
+
+usb:v1083p1659*
+ ID_MODEL_FROM_DATABASE=DR-P215II
+
+usb:v1083p165D*
+ ID_MODEL_FROM_DATABASE=DR-P208II
+
 usb:v1084*
  ID_VENDOR_FROM_DATABASE=Pantech Co., Ltd
 
@@ -42797,6 +44153,12 @@ usb:v108C*
 usb:v108E*
  ID_VENDOR_FROM_DATABASE=Lotes Co., Ltd.
 
+usb:v1091*
+ ID_VENDOR_FROM_DATABASE=Numerik Jena
+
+usb:v1091p8101*
+ ID_MODEL_FROM_DATABASE=Absoflex
+
 usb:v1099*
  ID_VENDOR_FROM_DATABASE=Surface Optics Corp.
 
@@ -42996,16 +44358,16 @@ usb:v10B8*
  ID_VENDOR_FROM_DATABASE=DiBcom
 
 usb:v10B8p0BB8*
- ID_MODEL_FROM_DATABASE=DiBcom USB DVB-T reference design (MOD300) (cold)
+ ID_MODEL_FROM_DATABASE=DVB-T reference design (MOD300) (cold)
 
 usb:v10B8p0BB9*
- ID_MODEL_FROM_DATABASE=DiBcom USB DVB-T reference design (MOD300) (warm)
+ ID_MODEL_FROM_DATABASE=DVB-T reference design (MOD300) (warm)
 
 usb:v10B8p0BC6*
- ID_MODEL_FROM_DATABASE=DiBcom USB2.0 DVB-T reference design (MOD3000P) (cold)
+ ID_MODEL_FROM_DATABASE=DVB-T reference design (MOD3000P) (cold)
 
 usb:v10B8p0BC7*
- ID_MODEL_FROM_DATABASE=DiBcom USB2.0 DVB-T reference design (MOD3000P) (warm)
+ ID_MODEL_FROM_DATABASE=DVB-T reference design (MOD3000P) (warm)
 
 usb:v10BB*
  ID_VENDOR_FROM_DATABASE=TM Technology, Inc.
@@ -43043,6 +44405,12 @@ usb:v10C4p0002*
 usb:v10C4p0003*
  ID_MODEL_FROM_DATABASE=CommandIR
 
+usb:v10C4p800A*
+ ID_MODEL_FROM_DATABASE=SPORTident
+
+usb:v10C4p800B*
+ ID_MODEL_FROM_DATABASE=AES
+
 usb:v10C4p8030*
  ID_MODEL_FROM_DATABASE=K4JRG Ham Radio devices
 
@@ -43055,6 +44423,9 @@ usb:v10C4p804E*
 usb:v10C4p80A9*
  ID_MODEL_FROM_DATABASE=CP210x to UART Bridge Controller
 
+usb:v10C4p80C4*
+ ID_MODEL_FROM_DATABASE=Infrared Thermometer Adapter
+
 usb:v10C4p80CA*
  ID_MODEL_FROM_DATABASE=ATM2400 Sensor Device
 
@@ -43076,12 +44447,21 @@ usb:v10C4p818A*
 usb:v10C4p81E8*
  ID_MODEL_FROM_DATABASE=Zephyr BioHarness
 
+usb:v10C4p834B*
+ ID_MODEL_FROM_DATABASE=Infrared Online Sensor Adapter
+
+usb:v10C4p834E*
+ ID_MODEL_FROM_DATABASE=Infrared Sensor Adapter
+
 usb:v10C4p8460*
  ID_MODEL_FROM_DATABASE=Sangoma Wanpipe VoiceTime
 
 usb:v10C4p8461*
  ID_MODEL_FROM_DATABASE=Sangoma U100
 
+usb:v10C4p8470*
+ ID_MODEL_FROM_DATABASE=Juniper Networks BX Series System Console
+
 usb:v10C4p8477*
  ID_MODEL_FROM_DATABASE=Balluff RFID Reader
 
@@ -43091,9 +44471,18 @@ usb:v10C4p8496*
 usb:v10C4p8497*
  ID_MODEL_FROM_DATABASE=SiLabs Cypress EVB
 
+usb:v10C4p84FB*
+ ID_MODEL_FROM_DATABASE=Infrared Blackbody Adapter
+
+usb:v10C4p8508*
+ ID_MODEL_FROM_DATABASE=RS485 Adapter
+
 usb:v10C4p8605*
  ID_MODEL_FROM_DATABASE=dilitronics ESoLUX solar lighting controller
 
+usb:v10C4p8660*
+ ID_MODEL_FROM_DATABASE=Netronics CANdoISO
+
 usb:v10C4p86BC*
  ID_MODEL_FROM_DATABASE=C8051F34x AudioDelay [AD-340]
 
@@ -43109,17 +44498,23 @@ usb:v10C4p8863*
 usb:v10C4p8897*
  ID_MODEL_FROM_DATABASE=C8051F38x HDMI Splitter [UHBX]
 
+usb:v10C4p88C9*
+ ID_MODEL_FROM_DATABASE=AES HID device
+
 usb:v10C4p8918*
  ID_MODEL_FROM_DATABASE=C8051F38x HDMI Audio Extractor [VSA-HA-DP]
 
 usb:v10C4p8973*
  ID_MODEL_FROM_DATABASE=C8051F38x HDMI Extender [UHBX-8X]
 
+usb:v10C4p89C6*
+ ID_MODEL_FROM_DATABASE=SPORTident HID device
+
 usb:v10C4p89E1*
  ID_MODEL_FROM_DATABASE=C8051F38x HDMI Extender [UHBX-SW3-WP]
 
 usb:v10C4pEA60*
- ID_MODEL_FROM_DATABASE=CP210x UART Bridge / myAVR mySmartUSB light
+ ID_MODEL_FROM_DATABASE=CP2102/CP2109 UART Bridge Controller [CP210x family]
 
 usb:v10C4pEA61*
  ID_MODEL_FROM_DATABASE=CP210x UART Bridge
@@ -43130,6 +44525,12 @@ usb:v10C4pEA70*
 usb:v10C4pEA80*
  ID_MODEL_FROM_DATABASE=CP210x UART Bridge
 
+usb:v10C4pEAC9*
+ ID_MODEL_FROM_DATABASE=EFM8UB1 Bootloader
+
+usb:v10C4pEACA*
+ ID_MODEL_FROM_DATABASE=EFM8UB2 Bootloader
+
 usb:v10C5*
  ID_VENDOR_FROM_DATABASE=Sanei Electric, Inc.
 
@@ -43154,9 +44555,21 @@ usb:v10CD*
 usb:v10CE*
  ID_VENDOR_FROM_DATABASE=Silicon Labs
 
+usb:v10CEp0007*
+ ID_MODEL_FROM_DATABASE=Shinko/Sinfonia CHC-S1245
+
 usb:v10CEp000E*
  ID_MODEL_FROM_DATABASE=Shinko/Sinfonia CHC-S2145
 
+usb:v10CEp0019*
+ ID_MODEL_FROM_DATABASE=Shinko/Sinfonia CHC-S6145
+
+usb:v10CEp001D*
+ ID_MODEL_FROM_DATABASE=Shinko/Sinfonia CHC-S6245
+
+usb:v10CEp001E*
+ ID_MODEL_FROM_DATABASE=Ciaat Brava 21
+
 usb:v10CEpEA6A*
  ID_MODEL_FROM_DATABASE=MobiData EDGE USB Modem
 
@@ -43280,6 +44693,9 @@ usb:v10F1p1A1E*
 usb:v10F1p1A2A*
  ID_MODEL_FROM_DATABASE=Laptop Integrated Webcam
 
+usb:v10F1p1A2E*
+ ID_MODEL_FROM_DATABASE=HP Truevision HD Integrated Webcam
+
 usb:v10F5*
  ID_VENDOR_FROM_DATABASE=Turtle Beach
 
@@ -43445,6 +44861,9 @@ usb:v1130p6604*
 usb:v1130p660C*
  ID_MODEL_FROM_DATABASE=Foot Pedal/Thermometer
 
+usb:v1130p6626*
+ ID_MODEL_FROM_DATABASE=Key
+
 usb:v1130p6806*
  ID_MODEL_FROM_DATABASE=Keychain photo frame
 
@@ -43505,6 +44924,15 @@ usb:v113C*
 usb:v113D*
  ID_VENDOR_FROM_DATABASE=Mapower Electronics Co., Ltd
 
+usb:v113F*
+ ID_VENDOR_FROM_DATABASE=Integrated Biometrics, LLC
+
+usb:v113Fp1020*
+ ID_MODEL_FROM_DATABASE=Watson Two-Finger Roll Scanner
+
+usb:v113Fp1100*
+ ID_MODEL_FROM_DATABASE=Columbo Single-Finger Scanner
+
 usb:v1141*
  ID_VENDOR_FROM_DATABASE=V One Multimedia, Pte., Ltd
 
@@ -43805,6 +45233,9 @@ usb:v1199p9009*
 usb:v1199p900A*
  ID_MODEL_FROM_DATABASE=Gobi 2000 Wireless Modem
 
+usb:v1199p9013*
+ ID_MODEL_FROM_DATABASE=Sierra Wireless Gobi 3000 Modem device (MC8355)
+
 usb:v1199p9055*
  ID_MODEL_FROM_DATABASE=Gobi 9x15 Multimode 3G/4G LTE Modem (NAT mode)
 
@@ -43862,6 +45293,12 @@ usb:v11BE*
 usb:v11BEpF0A0*
  ID_MODEL_FROM_DATABASE=Martin Maxxyz DMX
 
+usb:v11C0*
+ ID_VENDOR_FROM_DATABASE=Betop
+
+usb:v11C0p5506*
+ ID_MODEL_FROM_DATABASE=Gamepad
+
 usb:v11C5*
  ID_VENDOR_FROM_DATABASE=Inmax
 
@@ -43949,6 +45386,9 @@ usb:v1209p1005*
 usb:v1209p1006*
  ID_MODEL_FROM_DATABASE=Mini IO-Board
 
+usb:v1209p1AB5*
+ ID_MODEL_FROM_DATABASE=Arachnid Labs Tsunami
+
 usb:v1209p2000*
  ID_MODEL_FROM_DATABASE=Zygmunt Krynicki Lantern Brightness Sensor
 
@@ -43964,6 +45404,12 @@ usb:v1209p2300*
 usb:v1209p2301*
  ID_MODEL_FROM_DATABASE=Keyboardio Keyboardio Model 01
 
+usb:v1209p2327*
+ ID_MODEL_FROM_DATABASE=K.T.E.C.Bootloader Device
+
+usb:v1209p2328*
+ ID_MODEL_FROM_DATABASE=K.T.E.C. Keyboard Device
+
 usb:v1209p2337*
  ID_MODEL_FROM_DATABASE=/Dev or SlashDev /Net
 
@@ -43976,15 +45422,33 @@ usb:v1209p3333*
 usb:v1209p5222*
  ID_MODEL_FROM_DATABASE=telavivmakers attami
 
+usb:v1209p53C0*
+ ID_MODEL_FROM_DATABASE=SatoshiLabs TREZOR Bootloader
+
+usb:v1209p53C1*
+ ID_MODEL_FROM_DATABASE=SatoshiLabs TREZOR
+
 usb:v1209p5A22*
  ID_MODEL_FROM_DATABASE=ikari_01 sd2snes
 
+usb:v1209p7530*
+ ID_MODEL_FROM_DATABASE=Refflion - IoT Board - Bootloader
+
+usb:v1209p7531*
+ ID_MODEL_FROM_DATABASE=Refflion - IoT Board - Sketch
+
 usb:v1209p7BD0*
  ID_MODEL_FROM_DATABASE=pokey9000 Tiny Bit Dingus
 
 usb:v1209pABD0*
  ID_MODEL_FROM_DATABASE=tibounise ADB converter
 
+usb:v1209pACED*
+ ID_MODEL_FROM_DATABASE=Open Lighting Project - Ja Rule Device
+
+usb:v1209pACEE*
+ ID_MODEL_FROM_DATABASE=Open Lighting Project - Ja Rule Bootloader
+
 usb:v1209pBEEF*
  ID_MODEL_FROM_DATABASE=Modal MC-USB
 
@@ -44042,6 +45506,21 @@ usb:v121E*
 usb:v121Ep3403*
  ID_MODEL_FROM_DATABASE=Muzio JM250 Audio Player
 
+usb:v1220*
+ ID_VENDOR_FROM_DATABASE=TC Electronic
+
+usb:v1220p000A*
+ ID_MODEL_FROM_DATABASE=Hall of Fame Reverb
+
+usb:v1220p002A*
+ ID_MODEL_FROM_DATABASE=Polytune
+
+usb:v1220p0032*
+ ID_MODEL_FROM_DATABASE=Ditto X2 Looper
+
+usb:v1220p0039*
+ ID_MODEL_FROM_DATABASE=Alter Ego X4 Vintage Echo
+
 usb:v1221*
  ID_VENDOR_FROM_DATABASE=Unknown manufacturer
 
@@ -44192,6 +45671,15 @@ usb:v1235p8012*
 usb:v1235p8014*
  ID_MODEL_FROM_DATABASE=Scarlett 18i8
 
+usb:v1235p8016*
+ ID_MODEL_FROM_DATABASE=Focusrite Scarlett 2i2
+
+usb:v1235p8203*
+ ID_MODEL_FROM_DATABASE=Focusrite Scarlett 6i6
+
+usb:v1235p8204*
+ ID_MODEL_FROM_DATABASE=Scarlett 18i8 2nd Gen
+
 usb:v1241*
  ID_VENDOR_FROM_DATABASE=Belkin
 
@@ -44288,6 +45776,9 @@ usb:v125FpC96A*
 usb:v125FpCB10*
  ID_MODEL_FROM_DATABASE=Dash Drive UV100
 
+usb:v125FpCB20*
+ ID_MODEL_FROM_DATABASE=DashDrive UV110
+
 usb:v1260*
  ID_VENDOR_FROM_DATABASE=Standard Microsystems Corp.
 
@@ -44310,7 +45801,7 @@ usb:v1267p0103*
  ID_MODEL_FROM_DATABASE=G-720 Keyboard
 
 usb:v1267p0201*
- ID_MODEL_FROM_DATABASE=A4Tech SWOP-3 Mouse
+ ID_MODEL_FROM_DATABASE=Mouse
 
 usb:v1267p0210*
  ID_MODEL_FROM_DATABASE=LG Optical Mouse 3D-310
@@ -44459,6 +45950,9 @@ usb:v1286p2001*
 usb:v1286p2006*
  ID_MODEL_FROM_DATABASE=88W8362 802.11n WLAN
 
+usb:v1286p203C*
+ ID_MODEL_FROM_DATABASE=K30326 802.11bgn Wireless Module [Marvell 88W8786U]
+
 usb:v1286p8001*
  ID_MODEL_FROM_DATABASE=BLOB boot loader firmware
 
@@ -44477,6 +45971,9 @@ usb:v1292*
 usb:v1292p0258*
  ID_MODEL_FROM_DATABASE=Creative Labs VoIP Blaster
 
+usb:v1292p4154*
+ ID_MODEL_FROM_DATABASE=Retro Link Atari cable
+
 usb:v1293*
  ID_VENDOR_FROM_DATABASE=Belkin Components [hex]
 
@@ -44492,6 +45989,12 @@ usb:v1294*
 usb:v1294p1320*
  ID_MODEL_FROM_DATABASE=Webmail Notifier
 
+usb:v1297*
+ ID_VENDOR_FROM_DATABASE=DekTec
+
+usb:v1297p020F*
+ ID_MODEL_FROM_DATABASE=DTU-215 Multi-Standard Modulator
+
 usb:v129B*
  ID_VENDOR_FROM_DATABASE=CyberTAN Technology
 
@@ -44525,6 +46028,12 @@ usb:v12B9*
 usb:v12BA*
  ID_VENDOR_FROM_DATABASE=Licensed by Sony Computer Entertainment America
 
+usb:v12BAp0032*
+ ID_MODEL_FROM_DATABASE=Wireless Stereo Headset
+
+usb:v12BAp0042*
+ ID_MODEL_FROM_DATABASE=Wireless Stereo Headset
+
 usb:v12BAp00FF*
  ID_MODEL_FROM_DATABASE=Rocksmith Guitar Adapter
 
@@ -44546,6 +46055,9 @@ usb:v12BD*
 usb:v12BDpD012*
  ID_MODEL_FROM_DATABASE=JPD Shockforce gamepad
 
+usb:v12BDpD015*
+ ID_MODEL_FROM_DATABASE=Generic 4-button NES USB Controller
+
 usb:v12C4*
  ID_VENDOR_FROM_DATABASE=Autocue Group Ltd
 
@@ -44561,11 +46073,14 @@ usb:v12CF*
 usb:v12CFp0170*
  ID_MODEL_FROM_DATABASE=Tt eSPORTS BLACK Gaming mouse
 
+usb:v12CFp600B*
+ ID_MODEL_FROM_DATABASE=Cougar 600M Gaming Mouse
+
 usb:v12D1*
  ID_VENDOR_FROM_DATABASE=Huawei Technologies Co., Ltd.
 
 usb:v12D1p1001*
- ID_MODEL_FROM_DATABASE=E169/E620/E800 HSDPA Modem
+ ID_MODEL_FROM_DATABASE=E161/E169/E620/E800 HSDPA Modem
 
 usb:v12D1p1003*
  ID_MODEL_FROM_DATABASE=E220 HSDPA Modem / E230/E270/E870 HSDPA/HSUPA Modem
@@ -44594,6 +46109,9 @@ usb:v12D1p1038*
 usb:v12D1p1039*
  ID_MODEL_FROM_DATABASE=Ideos (tethering mode)
 
+usb:v12D1p1052*
+ ID_MODEL_FROM_DATABASE=MT7-L09
+
 usb:v12D1p1404*
  ID_MODEL_FROM_DATABASE=EM770W miniPCI WCDMA Modem
 
@@ -44613,11 +46131,14 @@ usb:v12D1p1436*
  ID_MODEL_FROM_DATABASE=Broadband stick
 
 usb:v12D1p1446*
- ID_MODEL_FROM_DATABASE=Broadband stick (modem on)
+ ID_MODEL_FROM_DATABASE=HSPA modem
 
 usb:v12D1p1465*
  ID_MODEL_FROM_DATABASE=K3765 HSPA
 
+usb:v12D1p14AC*
+ ID_MODEL_FROM_DATABASE=E815
+
 usb:v12D1p14C3*
  ID_MODEL_FROM_DATABASE=K5005 Vodafone LTE/UMTS/GSM Modem/Networkcard
 
@@ -44726,6 +46247,12 @@ usb:v12EF*
 usb:v12EFp0100*
  ID_MODEL_FROM_DATABASE=Tapwave Handheld [Tapwave Zodiac]
 
+usb:v12F2*
+ ID_VENDOR_FROM_DATABASE=ViewPlus Technologies, Inc.
+
+usb:v12F2p000A*
+ ID_MODEL_FROM_DATABASE=Braille embosser [SpotDot Emprint]
+
 usb:v12F5*
  ID_VENDOR_FROM_DATABASE=Dynamic System Electronics Corp.
 
@@ -44763,7 +46290,7 @@ usb:v1307p0190*
  ID_MODEL_FROM_DATABASE=Ut190 8 GB Flash Drive with MicroSD reader
 
 usb:v1307p0310*
- ID_MODEL_FROM_DATABASE=SD/MicroSD CardReader [hama]
+ ID_MODEL_FROM_DATABASE=SD/MicroSD CardReader [hama]/IT1327E [Basic Line flash drive]
 
 usb:v1307p0330*
  ID_MODEL_FROM_DATABASE=63-in-1 Multi-Card Reader/Writer
@@ -44846,6 +46373,15 @@ usb:v1313p8030*
 usb:v1313p8070*
  ID_MODEL_FROM_DATABASE=PM100D
 
+usb:v1313p8072*
+ ID_MODEL_FROM_DATABASE=PM100USB Power and Energy Meter Interface
+
+usb:v1313p8078*
+ ID_MODEL_FROM_DATABASE=PM100D Compact Power and Energy Meter Console
+
+usb:v1313p8080*
+ ID_MODEL_FROM_DATABASE=CCS100 - Compact Spectrometer
+
 usb:v131D*
  ID_VENDOR_FROM_DATABASE=Natural Point
 
@@ -44855,6 +46391,12 @@ usb:v131Dp0155*
 usb:v131Dp0156*
  ID_MODEL_FROM_DATABASE=TrackIR 4 Pro Head Tracker
 
+usb:v131Dp0158*
+ ID_MODEL_FROM_DATABASE=TrackIR 5 Pro Head Tracker
+
+usb:v1325*
+ ID_VENDOR_FROM_DATABASE=ams AG
+
 usb:v132A*
  ID_VENDOR_FROM_DATABASE=Envara Inc.
 
@@ -49376,9 +50918,72 @@ usb:v18ECp3299*
 usb:v18ECp3366*
  ID_MODEL_FROM_DATABASE=Bresser Biolux NV
 
+usb:v18F8*
+ ID_VENDOR_FROM_DATABASE=[Maxxter]
+
+usb:v18F8p0F99*
+ ID_MODEL_FROM_DATABASE=Optical gaming mouse
+
+usb:v18FB*
+ ID_VENDOR_FROM_DATABASE=Scriptel Corporation
+
+usb:v18FBp01C0*
+ ID_MODEL_FROM_DATABASE=ST1501-STN
+
+usb:v18FBp01C1*
+ ID_MODEL_FROM_DATABASE=ST1526-STN
+
+usb:v18FBp01C2*
+ ID_MODEL_FROM_DATABASE=ST1501-PYJ
+
+usb:v18FBp01C3*
+ ID_MODEL_FROM_DATABASE=ST1501B-PYJ
+
+usb:v18FBp01C4*
+ ID_MODEL_FROM_DATABASE=ST1501-PUN
+
+usb:v18FBp01C5*
+ ID_MODEL_FROM_DATABASE=ST1401-STN
+
+usb:v18FBp01C7*
+ ID_MODEL_FROM_DATABASE=ST1526-PYJ
+
+usb:v18FBp01C8*
+ ID_MODEL_FROM_DATABASE=ST1501-ECA
+
+usb:v18FBp01C9*
+ ID_MODEL_FROM_DATABASE=ST1476-STN
+
+usb:v18FBp01CB*
+ ID_MODEL_FROM_DATABASE=ST1571-STN
+
+usb:v18FBp0200*
+ ID_MODEL_FROM_DATABASE=ST1500
+
+usb:v18FBp0201*
+ ID_MODEL_FROM_DATABASE=ST1550
+
+usb:v18FBp0202*
+ ID_MODEL_FROM_DATABASE=ST1525
+
+usb:v18FBp0204*
+ ID_MODEL_FROM_DATABASE=ST1400
+
+usb:v18FBp0206*
+ ID_MODEL_FROM_DATABASE=ST1475
+
+usb:v18FBp0207*
+ ID_MODEL_FROM_DATABASE=ST1570
+
 usb:v18FD*
  ID_VENDOR_FROM_DATABASE=FineArch Inc.
 
+usb:v1901*
+ ID_VENDOR_FROM_DATABASE=GE Healthcare
+
+usb:v1901p0015*
+ ID_MODEL_FROM_DATABASE=Nemo Tracker
+
 usb:v1908*
  ID_VENDOR_FROM_DATABASE=GEMBIRD
 
@@ -49409,6 +51014,12 @@ usb:v1915p2235*
 usb:v1915p2236*
  ID_MODEL_FROM_DATABASE=Linksys WUSB11 v3.0 802.11b Adapter [Intersil PRISM 3]
 
+usb:v191C*
+ ID_VENDOR_FROM_DATABASE=Innovative Technology LTD
+
+usb:v191Cp4104*
+ ID_MODEL_FROM_DATABASE=Banknote validator NV-150
+
 usb:v1923*
  ID_VENDOR_FROM_DATABASE=FitLinxx
 
@@ -49535,6 +51146,12 @@ usb:v1934p0702*
 usb:v1934p5168*
  ID_MODEL_FROM_DATABASE=F71610A or F71612A Consumer Infrared Receiver/Transceiver
 
+usb:v1938*
+ ID_VENDOR_FROM_DATABASE=Meinberg Funkuhren GmbH & Co. KG
+
+usb:v1938p0501*
+ ID_MODEL_FROM_DATABASE=TCR51USB IRIG Time Code Reader
+
 usb:v1941*
  ID_VENDOR_FROM_DATABASE=Dream Link
 
@@ -50399,15 +52016,57 @@ usb:v1B1Cp0A00*
 usb:v1B1Cp0A60*
  ID_MODEL_FROM_DATABASE=Vengeance K60 Keyboard
 
+usb:v1B1Cp0C04*
+ ID_MODEL_FROM_DATABASE=Link Cooling Node
+
 usb:v1B1Cp1A01*
  ID_MODEL_FROM_DATABASE=Flash Voyager GT
 
+usb:v1B1Cp1A03*
+ ID_MODEL_FROM_DATABASE=Voyager 3.0
+
+usb:v1B1Cp1A09*
+ ID_MODEL_FROM_DATABASE=Voyager GT 3.0
+
 usb:v1B1Cp1A0A*
  ID_MODEL_FROM_DATABASE=Survivor Stealth Flash Drive
 
+usb:v1B1Cp1A0B*
+ ID_MODEL_FROM_DATABASE=Flash Voyager LS
+
+usb:v1B1Cp1A15*
+ ID_MODEL_FROM_DATABASE=Voyager Slider Flash Drive
+
 usb:v1B1Cp1A90*
  ID_MODEL_FROM_DATABASE=Flash Voyager GT
 
+usb:v1B1Cp1AB1*
+ ID_MODEL_FROM_DATABASE=Voyager
+
+usb:v1B1Cp1B04*
+ ID_MODEL_FROM_DATABASE=Raptor K50 Keyboard
+
+usb:v1B1Cp1B07*
+ ID_MODEL_FROM_DATABASE=Vengeance K65 Gaming Keyboard
+
+usb:v1B1Cp1B08*
+ ID_MODEL_FROM_DATABASE=Vengeance K95 Keyboard
+
+usb:v1B1Cp1B09*
+ ID_MODEL_FROM_DATABASE=Vengeance K70R keyboard
+
+usb:v1B1Cp1B11*
+ ID_MODEL_FROM_DATABASE=K95 RGB Mechanical Gaming Keyboard
+
+usb:v1B1Cp1B13*
+ ID_MODEL_FROM_DATABASE=Vengeance K70RGB keyboard
+
+usb:v1B1Cp1C00*
+ ID_MODEL_FROM_DATABASE=Controller for Corsair Link
+
+usb:v1B1Cp1C0C*
+ ID_MODEL_FROM_DATABASE=RM850i Power Supply
+
 usb:v1B1F*
  ID_VENDOR_FROM_DATABASE=eQ-3 Entwicklung GmbH
 
@@ -51309,19 +52968,19 @@ usb:v1D50*
  ID_VENDOR_FROM_DATABASE=OpenMoko, Inc.
 
 usb:v1D50p1DB5*
- ID_MODEL_FROM_DATABASE=IDBG DFU
+ ID_MODEL_FROM_DATABASE=IDBG (DFU)
 
 usb:v1D50p1DB6*
  ID_MODEL_FROM_DATABASE=IDBG
 
 usb:v1D50p5117*
- ID_MODEL_FROM_DATABASE=Neo1973/FreeRunner kernel usbnet (g_ether, CDC Ethernet) Mode
+ ID_MODEL_FROM_DATABASE=Neo1973/FreeRunner kernel usbnet (g_ether, CDC Ethernet) mode
 
 usb:v1D50p5118*
- ID_MODEL_FROM_DATABASE=Debug Board (FT2232D) for Neo1973/FreeRunner
+ ID_MODEL_FROM_DATABASE=Neo1973/FreeRunner Debug board (V2+)
 
 usb:v1D50p5119*
- ID_MODEL_FROM_DATABASE=GTA01/GTA02 U-Boot Bootloader
+ ID_MODEL_FROM_DATABASE=Neo1973/FreeRunner u-boot cdc_acm serial port
 
 usb:v1D50p511A*
  ID_MODEL_FROM_DATABASE=HXD8 u-boot usbtty CDC ACM Mode
@@ -51336,31 +52995,34 @@ usb:v1D50p511D*
  ID_MODEL_FROM_DATABASE=QT2410 u-boot usbtty CDC ACM mode
 
 usb:v1D50p5120*
- ID_MODEL_FROM_DATABASE=Neo1973/FreeRunner u-boot generic serial mode
+ ID_MODEL_FROM_DATABASE=Neo1973/FreeRunner u-boot usbtty generic serial
 
 usb:v1D50p5121*
  ID_MODEL_FROM_DATABASE=Neo1973/FreeRunner kernel mass storage (g_storage) mode
 
 usb:v1D50p5122*
- ID_MODEL_FROM_DATABASE=Neo1973/FreeRunner kernel usbnet (g_ether, RNDIS) mode
+ ID_MODEL_FROM_DATABASE=Neo1973/FreeRunner kernel cdc_ether USB network
 
 usb:v1D50p5123*
- ID_MODEL_FROM_DATABASE=Neo1973/FreeRunner internal Bluetooth CSR4 module
+ ID_MODEL_FROM_DATABASE=Neo1973/FreeRunner internal USB CSR4 module
 
 usb:v1D50p5124*
  ID_MODEL_FROM_DATABASE=Neo1973/FreeRunner Bluetooth Device ID service
 
+usb:v1D50p5300*
+ ID_MODEL_FROM_DATABASE=Rockbox
+
 usb:v1D50p6000*
  ID_MODEL_FROM_DATABASE=Ubertooth Zero
 
 usb:v1D50p6001*
- ID_MODEL_FROM_DATABASE=Ubertooth Zero DFU
+ ID_MODEL_FROM_DATABASE=Ubertooth Zero (DFU)
 
 usb:v1D50p6002*
  ID_MODEL_FROM_DATABASE=Ubertooth One
 
 usb:v1D50p6003*
- ID_MODEL_FROM_DATABASE=Ubertooth One DFU
+ ID_MODEL_FROM_DATABASE=Ubertooth One (DFU)
 
 usb:v1D50p6004*
  ID_MODEL_FROM_DATABASE=LeoLipo
@@ -51380,26 +53042,620 @@ usb:v1D50p6008*
 usb:v1D50p6009*
  ID_MODEL_FROM_DATABASE=Adjacent Reality Tracker
 
+usb:v1D50p600A*
+ ID_MODEL_FROM_DATABASE=AVR Programmer
+
+usb:v1D50p600B*
+ ID_MODEL_FROM_DATABASE=Hypna Go Go
+
+usb:v1D50p600C*
+ ID_MODEL_FROM_DATABASE=CatNip LPC1343 development board
+
+usb:v1D50p600D*
+ ID_MODEL_FROM_DATABASE=Enhanced RoboBrrd Brain board
+
+usb:v1D50p600E*
+ ID_MODEL_FROM_DATABASE=OpenRISC Ordb2a-ep4ce22 development board
+
+usb:v1D50p600F*
+ ID_MODEL_FROM_DATABASE=Paparazzi Lisa/M (DFU)
+
+usb:v1D50p6010*
+ ID_MODEL_FROM_DATABASE=OpenPipe: OSHW Bagpipes MIDI controller
+
+usb:v1D50p6011*
+ ID_MODEL_FROM_DATABASE=LeoLipo (DFU)
+
+usb:v1D50p6012*
+ ID_MODEL_FROM_DATABASE=Universal C64 Cartridge
+
+usb:v1D50p6013*
+ ID_MODEL_FROM_DATABASE=DiscFerret magnetic disc analyser (bootloader)
+
+usb:v1D50p6014*
+ ID_MODEL_FROM_DATABASE=DiscFerret magnetic disc analyser
+
+usb:v1D50p6015*
+ ID_MODEL_FROM_DATABASE=Smoothieboard
+
+usb:v1D50p6016*
+ ID_MODEL_FROM_DATABASE=phInterface
+
+usb:v1D50p6017*
+ ID_MODEL_FROM_DATABASE=Black Magic Debug Probe (DFU)
+
+usb:v1D50p6018*
+ ID_MODEL_FROM_DATABASE=Black Magic Debug Probe (Application)
+
+usb:v1D50p6019*
+ ID_MODEL_FROM_DATABASE=4pi 5 axis motion controller
+
+usb:v1D50p601A*
+ ID_MODEL_FROM_DATABASE=Paparazzi Lisa/M
+
+usb:v1D50p601B*
+ ID_MODEL_FROM_DATABASE=IST-2 chronograph for bullet speeds
+
+usb:v1D50p601C*
+ ID_MODEL_FROM_DATABASE=EPOSMote II
+
+usb:v1D50p601E*
+ ID_MODEL_FROM_DATABASE=5x5 STM32 prototyping board
+
+usb:v1D50p601F*
+ ID_MODEL_FROM_DATABASE=uNSF
+
+usb:v1D50p6020*
+ ID_MODEL_FROM_DATABASE=Toad3
+
+usb:v1D50p6021*
+ ID_MODEL_FROM_DATABASE=AlphaSphere
+
+usb:v1D50p6022*
+ ID_MODEL_FROM_DATABASE=LightPack
+
+usb:v1D50p6023*
+ ID_MODEL_FROM_DATABASE=Pixelkit
+
+usb:v1D50p6024*
+ ID_MODEL_FROM_DATABASE=Illucia
+
+usb:v1D50p6025*
+ ID_MODEL_FROM_DATABASE=Keyglove (HID)
+
+usb:v1D50p6027*
+ ID_MODEL_FROM_DATABASE=Key64 Keyboard
+
 usb:v1D50p6028*
  ID_MODEL_FROM_DATABASE=Teensy 2.0 Development Board [ErgoDox Keyboard]
 
+usb:v1D50p602A*
+ ID_MODEL_FROM_DATABASE=Marlin 2.0 (Mass Storage)
+
 usb:v1D50p602B*
  ID_MODEL_FROM_DATABASE=FPGALink
 
+usb:v1D50p602C*
+ ID_MODEL_FROM_DATABASE=5nes5snes (5x8)
+
+usb:v1D50p602D*
+ ID_MODEL_FROM_DATABASE=5nes5snes (4x12)
+
+usb:v1D50p602E*
+ ID_MODEL_FROM_DATABASE=Flexibity
+
+usb:v1D50p602F*
+ ID_MODEL_FROM_DATABASE=K-copter
+
+usb:v1D50p6030*
+ ID_MODEL_FROM_DATABASE=USB-oscope
+
+usb:v1D50p6031*
+ ID_MODEL_FROM_DATABASE=Handmade GSM GPS tracker
+
+usb:v1D50p6033*
+ ID_MODEL_FROM_DATABASE=frobiac / adnw keyboard
+
+usb:v1D50p6034*
+ ID_MODEL_FROM_DATABASE=Tiflomag Ergo 2
+
+usb:v1D50p6035*
+ ID_MODEL_FROM_DATABASE=FreeLaserTag Gun
+
+usb:v1D50p6036*
+ ID_MODEL_FROM_DATABASE=FreeLaserTag Big Brother
+
+usb:v1D50p6037*
+ ID_MODEL_FROM_DATABASE=FreeLaserTag Node
+
+usb:v1D50p6038*
+ ID_MODEL_FROM_DATABASE=Monaka
+
+usb:v1D50p6039*
+ ID_MODEL_FROM_DATABASE=eXtreme Feedback Device
+
+usb:v1D50p603A*
+ ID_MODEL_FROM_DATABASE=TiLDA
+
+usb:v1D50p603B*
+ ID_MODEL_FROM_DATABASE=Raspiface
+
+usb:v1D50p603C*
+ ID_MODEL_FROM_DATABASE=Paparazzi (bootloader)
+
+usb:v1D50p603D*
+ ID_MODEL_FROM_DATABASE=Paparazzi (Serial)
+
+usb:v1D50p603E*
+ ID_MODEL_FROM_DATABASE=Paparazzi (Mass Storage)
+
+usb:v1D50p603F*
+ ID_MODEL_FROM_DATABASE=airGuitar
+
+usb:v1D50p6040*
+ ID_MODEL_FROM_DATABASE=moco
+
+usb:v1D50p6041*
+ ID_MODEL_FROM_DATABASE=AlphaSphere (bootloader)
+
+usb:v1D50p6042*
+ ID_MODEL_FROM_DATABASE=Dspace robot controller
+
+usb:v1D50p6043*
+ ID_MODEL_FROM_DATABASE=pc-power
+
+usb:v1D50p6044*
+ ID_MODEL_FROM_DATABASE=open-usb-can (DFU)
+
+usb:v1D50p6045*
+ ID_MODEL_FROM_DATABASE=open-usb-can
+
+usb:v1D50p6046*
+ ID_MODEL_FROM_DATABASE=mimus-weigand
+
+usb:v1D50p6047*
+ ID_MODEL_FROM_DATABASE=RfCat Chronos Dongle
+
+usb:v1D50p6048*
+ ID_MODEL_FROM_DATABASE=RfCat Dons Dongle
+
+usb:v1D50p6049*
+ ID_MODEL_FROM_DATABASE=RfCat Chronos bootloader
+
+usb:v1D50p604A*
+ ID_MODEL_FROM_DATABASE=RfCat Dons bootloader
+
 usb:v1D50p604B*
  ID_MODEL_FROM_DATABASE=HackRF Jawbreaker Software-Defined Radio
 
+usb:v1D50p604C*
+ ID_MODEL_FROM_DATABASE=Makibox A6
+
+usb:v1D50p604D*
+ ID_MODEL_FROM_DATABASE=Paella Pulse height analyzer
+
+usb:v1D50p604E*
+ ID_MODEL_FROM_DATABASE=Miniscope v2b
+
+usb:v1D50p604F*
+ ID_MODEL_FROM_DATABASE=Miniscope v2c
+
+usb:v1D50p6050*
+ ID_MODEL_FROM_DATABASE=GoodFET
+
+usb:v1D50p6051*
+ ID_MODEL_FROM_DATABASE=pinocc.io
+
+usb:v1D50p6052*
+ ID_MODEL_FROM_DATABASE=APB Team Robotic Development Board
+
 usb:v1D50p6053*
  ID_MODEL_FROM_DATABASE=Darkgame Controller
 
+usb:v1D50p6054*
+ ID_MODEL_FROM_DATABASE=Satlab/AAUSAT3 BlueBox
+
+usb:v1D50p6056*
+ ID_MODEL_FROM_DATABASE=The Glitch
+
+usb:v1D50p605B*
+ ID_MODEL_FROM_DATABASE=RfCat YARD Stick One
+
+usb:v1D50p605C*
+ ID_MODEL_FROM_DATABASE=YARD Stick One bootloader
+
+usb:v1D50p605D*
+ ID_MODEL_FROM_DATABASE=Funky Sensor v2
+
+usb:v1D50p605E*
+ ID_MODEL_FROM_DATABASE=Blinkiverse Analog LED Fader
+
+usb:v1D50p605F*
+ ID_MODEL_FROM_DATABASE=Small DIP package Cypress FX2
+
+usb:v1D50p6060*
+ ID_MODEL_FROM_DATABASE=Data logger using the Cypress FX2
+
+usb:v1D50p6061*
+ ID_MODEL_FROM_DATABASE=Power Manager
+
+usb:v1D50p6063*
+ ID_MODEL_FROM_DATABASE=CPC FPGA
+
+usb:v1D50p6064*
+ ID_MODEL_FROM_DATABASE=CPC FPGA (DFU)
+
+usb:v1D50p6065*
+ ID_MODEL_FROM_DATABASE=CPC FPGA (Serial)
+
+usb:v1D50p6066*
+ ID_MODEL_FROM_DATABASE=Nuand BladeRF
+
+usb:v1D50p6067*
+ ID_MODEL_FROM_DATABASE=Orbotron 9000 (Serial)
+
+usb:v1D50p6068*
+ ID_MODEL_FROM_DATABASE=Orbotron 9000 (HID)
+
+usb:v1D50p6069*
+ ID_MODEL_FROM_DATABASE=xser (DFU)
+
+usb:v1D50p606A*
+ ID_MODEL_FROM_DATABASE=xser (legacy)
+
+usb:v1D50p606B*
+ ID_MODEL_FROM_DATABASE=S08-245, urJtag compatible firmware for S08JS
+
+usb:v1D50p606C*
+ ID_MODEL_FROM_DATABASE=Blinkytape full-color light tape
+
+usb:v1D50p606D*
+ ID_MODEL_FROM_DATABASE=TinyG open source motion controller
+
+usb:v1D50p606E*
+ ID_MODEL_FROM_DATABASE=Reefangel Evolution 1.0
+
+usb:v1D50p6070*
+ ID_MODEL_FROM_DATABASE=Open Pinball Project
+
+usb:v1D50p6071*
+ ID_MODEL_FROM_DATABASE=The Glitch HID
+
+usb:v1D50p6072*
+ ID_MODEL_FROM_DATABASE=The Glitch Disk
+
+usb:v1D50p6073*
+ ID_MODEL_FROM_DATABASE=The Glitch Serial
+
+usb:v1D50p6074*
+ ID_MODEL_FROM_DATABASE=The Glitch MIDI
+
+usb:v1D50p6075*
+ ID_MODEL_FROM_DATABASE=The Glitch RawHID
+
+usb:v1D50p6076*
+ ID_MODEL_FROM_DATABASE=Vultureprog BIOS chip programmer
+
+usb:v1D50p6077*
+ ID_MODEL_FROM_DATABASE=PaintDuino
+
+usb:v1D50p6078*
+ ID_MODEL_FROM_DATABASE=DTplug
+
+usb:v1D50p607A*
+ ID_MODEL_FROM_DATABASE=Fadecandy
+
+usb:v1D50p607B*
+ ID_MODEL_FROM_DATABASE=RCDongle for IR remote control
+
+usb:v1D50p607C*
+ ID_MODEL_FROM_DATABASE=OpenVizsla USB sniffer/analyzer
+
+usb:v1D50p607D*
+ ID_MODEL_FROM_DATABASE=Spark Core Arduino-compatible board with WiFi
+
+usb:v1D50p607F*
+ ID_MODEL_FROM_DATABASE=Spark Core Arduino-compatible board with WiFi (bootloader)
+
+usb:v1D50p6080*
+ ID_MODEL_FROM_DATABASE=arcin arcade controller
+
+usb:v1D50p6081*
+ ID_MODEL_FROM_DATABASE=BladeRF (bootloader)
+
+usb:v1D50p6082*
+ ID_MODEL_FROM_DATABASE=Facecandy (DFU)
+
+usb:v1D50p6083*
+ ID_MODEL_FROM_DATABASE=LightUp (bootloader)
+
+usb:v1D50p6084*
+ ID_MODEL_FROM_DATABASE=arcin arcade controller (DFU)
+
+usb:v1D50p6085*
+ ID_MODEL_FROM_DATABASE=IRKit for controlloing home electronics from iOS devices
+
+usb:v1D50p6086*
+ ID_MODEL_FROM_DATABASE=OneRNG entropy device
+
+usb:v1D50p6088*
+ ID_MODEL_FROM_DATABASE=picp PIC16F145x based PIC16F145x programmer
+
 usb:v1D50p6089*
- ID_MODEL_FROM_DATABASE=Great Scott Gadgets HackRF One
+ ID_MODEL_FROM_DATABASE=Great Scott Gadgets HackRF One SDR
+
+usb:v1D50p608A*
+ ID_MODEL_FROM_DATABASE=BLEduino
+
+usb:v1D50p608B*
+ ID_MODEL_FROM_DATABASE=Loctronix ASR-2300 SDR/motion sensing module
+
+usb:v1D50p608C*
+ ID_MODEL_FROM_DATABASE=Fx2lafw
+
+usb:v1D50p608D*
+ ID_MODEL_FROM_DATABASE=Fx2lafw
+
+usb:v1D50p608E*
+ ID_MODEL_FROM_DATABASE=Fx2lafw
+
+usb:v1D50p608F*
+ ID_MODEL_FROM_DATABASE=Fx2lafw
+
+usb:v1D50p6090*
+ ID_MODEL_FROM_DATABASE=Fx2lafw
+
+usb:v1D50p6091*
+ ID_MODEL_FROM_DATABASE=Fx2lafw
+
+usb:v1D50p6092*
+ ID_MODEL_FROM_DATABASE=Fx2lafw
+
+usb:v1D50p6093*
+ ID_MODEL_FROM_DATABASE=Fx2lafw
+
+usb:v1D50p6094*
+ ID_MODEL_FROM_DATABASE=Fx2lafw
+
+usb:v1D50p6095*
+ ID_MODEL_FROM_DATABASE=Fx2lafw
+
+usb:v1D50p6096*
+ ID_MODEL_FROM_DATABASE=LightUp (sketch)
+
+usb:v1D50p6097*
+ ID_MODEL_FROM_DATABASE=Tessel JavaScript enabled Microcontroller with built-in WiFi
+
+usb:v1D50p6098*
+ ID_MODEL_FROM_DATABASE=RFIDler
+
+usb:v1D50p6099*
+ ID_MODEL_FROM_DATABASE=RASDR Radio Astronomy SDR Rx Interface
+
+usb:v1D50p609A*
+ ID_MODEL_FROM_DATABASE=RASDR Radio Astronomy SDR Tx Interface
+
+usb:v1D50p609B*
+ ID_MODEL_FROM_DATABASE=RASDR Radio Astronomy SDR (bootloader)
+
+usb:v1D50p609C*
+ ID_MODEL_FROM_DATABASE=antiAFK keyboard
+
+usb:v1D50p609D*
+ ID_MODEL_FROM_DATABASE=PIC16F145x bootloader
+
+usb:v1D50p609E*
+ ID_MODEL_FROM_DATABASE=Clyde Lamp by Fabule (bootloader)
+
+usb:v1D50p609F*
+ ID_MODEL_FROM_DATABASE=Clyde Lamp by Fabule (sketch)
+
+usb:v1D50p60A0*
+ ID_MODEL_FROM_DATABASE=Smoothiepanel robotic control interface
 
 usb:v1D50p60A1*
  ID_MODEL_FROM_DATABASE=Airspy
 
+usb:v1D50p60A2*
+ ID_MODEL_FROM_DATABASE=barebox (DFU)
+
+usb:v1D50p60A3*
+ ID_MODEL_FROM_DATABASE=keyboard (bootloader)
+
+usb:v1D50p60A4*
+ ID_MODEL_FROM_DATABASE=Papilio Duo (AVR)
+
+usb:v1D50p60A5*
+ ID_MODEL_FROM_DATABASE=Papilio Duo (FPGA)
+
+usb:v1D50p60A6*
+ ID_MODEL_FROM_DATABASE=HydraBus/HydraNFC (bootloader)
+
+usb:v1D50p60A7*
+ ID_MODEL_FROM_DATABASE=HydraBus/HydraNFC
+
+usb:v1D50p60A8*
+ ID_MODEL_FROM_DATABASE=reserved
+
+usb:v1D50p60A9*
+ ID_MODEL_FROM_DATABASE=Blinky Light Controller (DFU)
+
+usb:v1D50p60AA*
+ ID_MODEL_FROM_DATABASE=Blinky Light Controller
+
+usb:v1D50p60AB*
+ ID_MODEL_FROM_DATABASE=AllPixel
+
+usb:v1D50p60AC*
+ ID_MODEL_FROM_DATABASE=OpenBLT generic microcontroller (bootloader)
+
+usb:v1D50p60B0*
+ ID_MODEL_FROM_DATABASE=Waterott Arduino based Clock (caterina bootloader)
+
+usb:v1D50p60B1*
+ ID_MODEL_FROM_DATABASE=Drinkbot (processing)
+
+usb:v1D50p60B2*
+ ID_MODEL_FROM_DATABASE=Drinkbot (OTG-tablet support)
+
+usb:v1D50p60B3*
+ ID_MODEL_FROM_DATABASE=calc.pw password generator device (standard)
+
+usb:v1D50p60B4*
+ ID_MODEL_FROM_DATABASE=calc.pw password generator device (enhanced)
+
+usb:v1D50p60B5*
+ ID_MODEL_FROM_DATABASE=TimVideos' HDMI2USB (FX2) - Unconfigured device
+
+usb:v1D50p60B6*
+ ID_MODEL_FROM_DATABASE=TimVideos' HDMI2USB (FX2) - Firmware load/upgrade
+
+usb:v1D50p60B7*
+ ID_MODEL_FROM_DATABASE=TimVideos' HDMI2USB (FX2) - HDMI/DVI Capture Device
+
+usb:v1D50p60B8*
+ ID_MODEL_FROM_DATABASE=TimVideos' HDMI2USB (Soft+UTMI) - Unconfigured device
+
+usb:v1D50p60B9*
+ ID_MODEL_FROM_DATABASE=TimVideos' HDMI2USB (Soft+UTMI) - Firmware upgrade
+
+usb:v1D50p60BA*
+ ID_MODEL_FROM_DATABASE=TimVideos' HDMI2USB (Soft+UTMI) - HDMI/DVI Capture Device
+
+usb:v1D50p60BC*
+ ID_MODEL_FROM_DATABASE=Simple CC25xx programmer / serial board
+
+usb:v1D50p60BD*
+ ID_MODEL_FROM_DATABASE=Open Source control interface for multimedia applications
+
+usb:v1D50p60BE*
+ ID_MODEL_FROM_DATABASE=Pixelmatix Aurora (bootloader)
+
+usb:v1D50p60BF*
+ ID_MODEL_FROM_DATABASE=Pixelmatix Aurora
+
+usb:v1D50p60C1*
+ ID_MODEL_FROM_DATABASE=BrewBit Model-T pOSHW temperature controller for homebrewers (bootloader)
+
+usb:v1D50p60C2*
+ ID_MODEL_FROM_DATABASE=BrewBit Model-T pOSHW temperature controller for homebrewers
+
+usb:v1D50p60C3*
+ ID_MODEL_FROM_DATABASE=X Antenna Tracker arduino board
+
+usb:v1D50p60C6*
+ ID_MODEL_FROM_DATABASE=USBtrng hardware random number generator
+
+usb:v1D50p60C7*
+ ID_MODEL_FROM_DATABASE=Zubax GNSS positioning module for light UAV systems
+
+usb:v1D50p60C8*
+ ID_MODEL_FROM_DATABASE=Xlink data transfer and control system for Commodore C64
+
+usb:v1D50p60C9*
+ ID_MODEL_FROM_DATABASE=random number generator
+
+usb:v1D50p60CA*
+ ID_MODEL_FROM_DATABASE=FinalKey password manager
+
+usb:v1D50p60CB*
+ ID_MODEL_FROM_DATABASE=PteroDAQ Data Acquisition on FRDM-KL25Z and future boards
+
+usb:v1D50p60CC*
+ ID_MODEL_FROM_DATABASE=LamDiNao
+
+usb:v1D50p60DE*
+ ID_MODEL_FROM_DATABASE=Cryptech.is random number generator
+
+usb:v1D50p60DF*
+ ID_MODEL_FROM_DATABASE=Numato Opsis HDMI2USB board (unconfigured)
+
+usb:v1D50p60E0*
+ ID_MODEL_FROM_DATABASE=Numato Opsis HDMI2USB board (JTAG Programming Mode)
+
+usb:v1D50p60E1*
+ ID_MODEL_FROM_DATABASE=Numato Opsis HDMI2USB board (User Mode)
+
+usb:v1D50p60E2*
+ ID_MODEL_FROM_DATABASE=Osmocom SIMtrace 2 (DFU)
+
+usb:v1D50p60E3*
+ ID_MODEL_FROM_DATABASE=Osmocom SIMtrace 2
+
+usb:v1D50p60E4*
+ ID_MODEL_FROM_DATABASE=3D printed racing game - (Catalina CDC bootloader)
+
+usb:v1D50p60E5*
+ ID_MODEL_FROM_DATABASE=3D printed racing game
+
+usb:v1D50p60E6*
+ ID_MODEL_FROM_DATABASE=replacement for GoodFET/FaceDancer - GreatFet
+
+usb:v1D50p60E7*
+ ID_MODEL_FROM_DATABASE=replacement for GoodFET/FaceDancer - GreatFet target
+
+usb:v1D50p60E8*
+ ID_MODEL_FROM_DATABASE=Alpen Clack keyboard
+
+usb:v1D50p60E9*
+ ID_MODEL_FROM_DATABASE=keyman64 keyboard itercepter
+
+usb:v1D50p60EA*
+ ID_MODEL_FROM_DATABASE=Wiggleport FPGA-based I/O board
+
+usb:v1D50p60EC*
+ ID_MODEL_FROM_DATABASE=Duet 3D Printer Controller
+
+usb:v1D50p60F0*
+ ID_MODEL_FROM_DATABASE=UDAD-T1 data aquisition device (boot)
+
+usb:v1D50p60F1*
+ ID_MODEL_FROM_DATABASE=UDAD-T1 data aquisition device
+
+usb:v1D50p60F2*
+ ID_MODEL_FROM_DATABASE=UDAD-T2 data aquisition device (boot)
+
+usb:v1D50p60F3*
+ ID_MODEL_FROM_DATABASE=UDAD-T2 data aquisition device
+
+usb:v1D50p60F4*
+ ID_MODEL_FROM_DATABASE=Uniti ARC motor controller
+
+usb:v1D50p60F5*
+ ID_MODEL_FROM_DATABASE=EightByEight Blinky Badge (DFU)
+
+usb:v1D50p60F6*
+ ID_MODEL_FROM_DATABASE=EightByEight Blinky Badge
+
+usb:v1D50p60F7*
+ ID_MODEL_FROM_DATABASE=cardio NFC/RFID card reader (bootloader)
+
+usb:v1D50p60F8*
+ ID_MODEL_FROM_DATABASE=cardio NFC/RFID card reader
+
+usb:v1D50p60FC*
+ ID_MODEL_FROM_DATABASE=OnlyKey Two-factor Authentication and Password Solution
+
+usb:v1D50p6100*
+ ID_MODEL_FROM_DATABASE=overlay64 video overlay module
+
+usb:v1D50p6104*
+ ID_MODEL_FROM_DATABASE=ScopeFun open source instrumentation
+
+usb:v1D50p6108*
+ ID_MODEL_FROM_DATABASE=Myriad-RF LimeSDR
+
+usb:v1D50p610C*
+ ID_MODEL_FROM_DATABASE=Magic Keys (boot)
+
+usb:v1D50p610D*
+ ID_MODEL_FROM_DATABASE=Magic Keys
+
+usb:v1D50p8085*
+ ID_MODEL_FROM_DATABASE=Box0 (box0-v5)
+
 usb:v1D50pCC15*
- ID_MODEL_FROM_DATABASE=CCCAMP2015 rad1o badge
+ ID_MODEL_FROM_DATABASE=rad1o badge for CCC congress 2015
 
 usb:v1D57*
  ID_VENDOR_FROM_DATABASE=Xenta
@@ -51473,6 +53729,15 @@ usb:v1D90*
 usb:v1D90p201E*
  ID_MODEL_FROM_DATABASE=PPU-700
 
+usb:v1D9D*
+ ID_VENDOR_FROM_DATABASE=Sigma Sport
+
+usb:v1D9Dp1010*
+ ID_MODEL_FROM_DATABASE=Docking Station Topline 2009
+
+usb:v1D9Dp1011*
+ ID_MODEL_FROM_DATABASE=Docking Station Topline 2012
+
 usb:v1DE1*
  ID_VENDOR_FROM_DATABASE=Actions Microelectronics Co.
 
@@ -53303,6 +55568,27 @@ usb:v2735p1043*
 usb:v2735p1044*
  ID_MODEL_FROM_DATABASE=HCT HMD-180A
 
+usb:v273F*
+ ID_VENDOR_FROM_DATABASE=Hughski Limited
+
+usb:v273Fp1000*
+ ID_MODEL_FROM_DATABASE=ColorHug bootloader
+
+usb:v273Fp1001*
+ ID_MODEL_FROM_DATABASE=ColorHug
+
+usb:v273Fp1002*
+ ID_MODEL_FROM_DATABASE=ColorHug+
+
+usb:v273Fp1003*
+ ID_MODEL_FROM_DATABASE=ColorHug+ Bootloader
+
+usb:v273Fp1004*
+ ID_MODEL_FROM_DATABASE=ColorHug2
+
+usb:v273Fp1005*
+ ID_MODEL_FROM_DATABASE=ColorHug2 bootloader
+
 usb:v2770*
  ID_VENDOR_FROM_DATABASE=NHJ, Ltd
 
@@ -53531,6 +55817,12 @@ usb:v2A45p200C*
 usb:v2A45p2012*
  ID_MODEL_FROM_DATABASE=MX Phone (MTP & ACM)
 
+usb:v2B24*
+ ID_VENDOR_FROM_DATABASE=KeepKey LLC
+
+usb:v2B24p0001*
+ ID_MODEL_FROM_DATABASE=Bitcoin hardware wallet
+
 usb:v2C02*
  ID_VENDOR_FROM_DATABASE=Planex Communications
 
@@ -53543,6 +55835,12 @@ usb:v2C1A*
 usb:v2C1Ap0000*
  ID_MODEL_FROM_DATABASE=Wireless Optical Mouse
 
+usb:v2DCF*
+ ID_VENDOR_FROM_DATABASE=Dialog Semiconductor
+
+usb:v2DCFpC952*
+ ID_MODEL_FROM_DATABASE=Audio Class 2.0 Devices
+
 usb:v2FB2*
  ID_VENDOR_FROM_DATABASE=Fujitsu, Ltd
 
index d4cd61c..4f01d88 100644 (file)
@@ -15,7 +15,7 @@
 # To add local entries, create a new file
 #   /etc/udev/hwdb.d/61-evdev-local.hwdb
 # and add your rules there. To load the new rules execute (as root):
-#   udevadm hwdb --update
+#   systemd-hwdb update
 #   udevadm trigger /dev/input/eventXX
 # where /dev/input/eventXX is the device in question. If in
 # doubt, simply use /dev/input/event* to reload all input rules.
@@ -45,6 +45,8 @@
 
 #  Macbook2,1 (late 2006), single-button touchpad
 evdev:input:b0003v05ACp021B*
+# Macbook4,1
+evdev:input:b0003v05ACp0229*
  EVDEV_ABS_00=256:1471:12
  EVDEV_ABS_01=256:831:12
 
@@ -76,9 +78,9 @@ evdev:input:b0003v05ACp0254*
  EVDEV_ABS_36=::92
 
 # MacbookPro10,1 (unibody, June 2012)
-evdev:input:b0003v05ACp0259*
-evdev:input:b0003v05ACp025A*
-evdev:input:b0003v05ACp025B*
+evdev:input:b0003v05ACp0262*
+evdev:input:b0003v05ACp0263*
+evdev:input:b0003v05ACp0264*
 # MacbookPro10,2 (unibody, October 2012)
 evdev:input:b0003v05ACp0259*
 evdev:input:b0003v05ACp025A*
@@ -91,6 +93,14 @@ evdev:input:b0003v05ACp025B*
 #########################################
 # ASUS
 #########################################
+
+# Asus VivoBook E402SA
+evdev:name:Elan Touchpad:dmi:*svnASUSTeKCOMPUTERINC.:pnE402SA*
+ EVDEV_ABS_00=::29
+ EVDEV_ABS_01=::29
+ EVDEV_ABS_35=::29
+ EVDEV_ABS_36=::29
+
 # Asus K52JT
 evdev:name:ETPS/2 Elantech Touchpad:dmi:bvn*:bvr*:bd*:svnASUSTeKComputerInc.:pnK52JT:*
  EVDEV_ABS_00=::18
@@ -98,12 +108,20 @@ evdev:name:ETPS/2 Elantech Touchpad:dmi:bvn*:bvr*:bd*:svnASUSTeKComputerInc.:pnK
  EVDEV_ABS_35=::18
  EVDEV_ABS_36=::16
 
-evdev:name:ETPS/2 Elantech Touchpad:dmi:*:svnASUSTeKCOMPUTERINC.:pnX550CC:*
+# Asus X550CC and S550CB
+evdev:name:ETPS/2 Elantech Touchpad:dmi:*:svnASUSTeKCOMPUTERINC.:pn?550C?:*
  EVDEV_ABS_00=::31
  EVDEV_ABS_01=::30
  EVDEV_ABS_35=::31
  EVDEV_ABS_36=::30
 
+# Asus UX301L
+evdev:name:Elan Touchpad:dmi:*:svnASUSTeKCOMPUTERINC.:pnUX301LAA:*
+ EVDEV_ABS_00=::30
+ EVDEV_ABS_01=::29
+ EVDEV_ABS_35=::30
+ EVDEV_ABS_36=::29
+
 # Asus UX305
 evdev:name:Elan Touchpad:dmi:*:svnASUSTeKCOMPUTERINC.:pnUX305UA:*
  EVDEV_ABS_00=0:3097:32
@@ -134,6 +152,27 @@ evdev:name:AlpsPS/2 ALPS DualPoint TouchPad:dmi:bvn*:bvr*:bd*:svnDellInc.:pnLati
  EVDEV_ABS_35=76:1815:22
  EVDEV_ABS_36=131:1330:30
 
+# Dell Latitude E6320
+evdev:name:AlpsPS/2 ALPS DualPoint TouchPad:dmi:bvn*:bvr*:bd*:svnDellInc.:pnLatitudeE6320*
+ EVDEV_ABS_00=79:1841:22
+ EVDEV_ABS_01=140:1325:29
+ EVDEV_ABS_35=79:1841:22
+ EVDEV_ABS_36=140:1325:29
+
+# Dell Latitude E7470
+evdev:name:AlpsPS/2 ALPS DualPoint TouchPad:dmi:bvn*:bvr*:bd*:svnDellInc.:pnLatitudeE7470*
+ EVDEV_ABS_00=39:5856:59
+ EVDEV_ABS_01=10:1532:29
+ EVDEV_ABS_35=39:5856:59
+ EVDEV_ABS_36=10:1532:29
+
+# Dell Precision 5510
+evdev:name:SynPS/2 Synaptics TouchPad:dmi:bvn*:bvr*:bd*:svnDellInc.:pnPrecision5510*
+ EVDEV_ABS_00=::42
+ EVDEV_ABS_01=::43
+ EVDEV_ABS_35=::42
+ EVDEV_ABS_36=::43
+
 # Dell Precision M4700
 evdev:name:AlpsPS/2 ALPS DualPoint TouchPad:dmi:*svnDellInc.:pnPrecisionM4700*
  EVDEV_ABS_00=0:1960:24
@@ -148,6 +187,20 @@ evdev:name:SynPS/2 Synaptics TouchPad:dmi:bvn*:bvr*:bd*:svnDellInc.:pnXPS159550*
  EVDEV_ABS_35=::41
  EVDEV_ABS_36=::43
 
+# Dell XPS M1530
+evdev:name:AlpsPS/2 ALPS GlidePoint:dmi:bvn*:bvr*:bd*:svnDellInc.:pnXPSM1530*
+ EVDEV_ABS_00=85:947:15
+ EVDEV_ABS_01=154:726:18
+
+#####
+# Sun
+#####
+
+# Fujitsu Component - USB Touch Panel
+evdev:input:b0003v0430p0530*
+ EVDEV_ABS_00=0:4096:16
+ EVDEV_ABS_01=0:4096:16
+
 #########################################
 # Google
 #########################################
@@ -170,10 +223,31 @@ evdev:name:SynPS/2 Synaptics TouchPad*:dmi:*svnHewlett-Packard:pnHPPaviliondm4*
  EVDEV_ABS_35=1360:5563:47
  EVDEV_ABS_36=1269:4618:61
 
+# HP Pavilion dv7
+evdev:name:SynPS/2 Synaptics TouchPad*:dmi:*svnHewlett-Packard:pnHPPaviliondv7*
+ EVDEV_ABS_00=1068:5805:44
+ EVDEV_ABS_01=1197:4890:57
+ EVDEV_ABS_35=1068:5805:44
+ EVDEV_ABS_36=1197:4890:57
+
+# HP Spectre
+evdev:name:SynPS/2 Synaptics TouchPad:dmi:i*svnHP:pnHPSpectreNotebook*
+ EVDEV_ABS_00=1205:5691:47
+ EVDEV_ABS_01=1083:4808:65
+ EVDEV_ABS_35=1205:5691:47
+ EVDEV_ABS_36=1083:4808:65
+
 #########################################
 # Lenovo
 #########################################
 
+# Lenovo B590
+evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO*:pvrLenovoB590*
+ EVDEV_ABS_00=1243:5759:48
+ EVDEV_ABS_01=1130:4832:65
+ EVDEV_ABS_35=1243:5759:48
+ EVDEV_ABS_36=1130:4832:65
+
 # Lenovo E530
 evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO:pn*ThinkPadEdgeE530*
  EVDEV_ABS_00=1241:5703:49
@@ -181,6 +255,13 @@ evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO:pn*ThinkPadEdgeE530*
  EVDEV_ABS_35=1241:5703:49
  EVDEV_ABS_36=1105:4820:68
 
+# Lenovo L430
+evdev:name:ETPS/2 Elantech Touchpad:dmi:*svnLENOVO*:pvrThinkPadL430*
+ EVDEV_ABS_00=19:2197:29
+ EVDEV_ABS_01=12:1151:25
+ EVDEV_ABS_35=19:2197:29
+ EVDEV_ABS_36=12:1151:25
+
 # Lenovo P50
 evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO*:pn*ThinkPad*P50*
  EVDEV_ABS_00=::44
@@ -188,6 +269,42 @@ evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO*:pn*ThinkPad*P50*
  EVDEV_ABS_35=::44
  EVDEV_ABS_36=::67
 
+# Lenovo *40 series
+evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO*:pvrThinkPad??40:*
+evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO*:pvrThinkPad??40?:*
+ EVDEV_ABS_00=::41
+ EVDEV_ABS_01=::37
+ EVDEV_ABS_35=::41
+ EVDEV_ABS_36=::37
+
+# Lenovo ThinkPad T430
+evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO*:pvrThinkPadT430*
+ EVDEV_ABS_00=1250:5631:58
+ EVDEV_ABS_01=1309:4826:78
+ EVDEV_ABS_35=1250:5631:58
+ EVDEV_ABS_36=1309:4826:78
+
+# Lenovo Thinkpad Carbon X1 4th gen. and X1 Yoga 1st gen.
+evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO*:pvrThinkPadX1Carbon4th*
+ EVDEV_ABS_00=1262:5679:44
+ EVDEV_ABS_01=1101:4824:65
+ EVDEV_ABS_35=1262:5679:44
+ EVDEV_ABS_36=1101:4824:65
+
+# Lenovo Thinkpad Carbon X1 5th gen.
+evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO*:pvrThinkPadX1Carbon5th*
+ EVDEV_ABS_00=::44
+ EVDEV_ABS_01=::65
+ EVDEV_ABS_35=::44
+ EVDEV_ABS_36=::65
+
+# Lenovo Thinkpad Carbon X1 5th gen. (rmi4)
+evdev:name:Synaptics TM3289-002:dmi:*svnLENOVO*:pvrThinkPadX1Carbon5th*
+ EVDEV_ABS_00=::19
+ EVDEV_ABS_01=::19
+ EVDEV_ABS_35=::19
+ EVDEV_ABS_36=::19
+
 # Lenovo T460
 evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO*:pn*ThinkPad*T460*
  EVDEV_ABS_00=1266:5677:44
@@ -207,6 +324,13 @@ evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO:*pvrLenovoV360*
  EVDEV_ABS_00=1243:5927:60
  EVDEV_ABS_01=902:5330:108
 
+# Lenovo W530
+evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO:*pvrThinkPadW530*
+ EVDEV_ABS_00=1250:5631:59
+ EVDEV_ABS_01=1205:4834:81
+ EVDEV_ABS_35=1250:5631:59
+ EVDEV_ABS_36=1205:4834:81
+
 # Lenovo X220 series
 evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO:*pvrThinkPadX220*
  EVDEV_ABS_00=1316:5627:58
@@ -226,6 +350,20 @@ evdev:name:AlpsPS/2 ALPS GlidePoint:dmi:*svnLENOVO:*pvrLenovoideapadY700-14ISK*
  EVDEV_ABS_35=::27
  EVDEV_ABS_36=::29
 
+# Lenovo Ideapad 500S-13ISK
+evdev:name:AlpsPS/2 ALPS GlidePoint:dmi:*svnLENOVO:*pvrLenovoideapad500S-13ISK*
+ EVDEV_ABS_00=125:3955:37
+ EVDEV_ABS_01=104:1959:27
+ EVDEV_ABS_35=125:3954:37
+ EVDEV_ABS_36=104:1959:27
+
+# Lenovo Yoga 500-14ISK
+evdev:name:AlpsPS/2 ALPS GlidePoint:dmi:*svnLENOVO:*pvrLenovoYoga500-14ISK*
+ EVDEV_ABS_00=124:3955:36
+ EVDEV_ABS_01=103:1959:26
+ EVDEV_ABS_35=124:3955:36
+ EVDEV_ABS_36=103:1959:26
+
 #########################################
 # Samsung
 #########################################
@@ -236,3 +374,28 @@ evdev:name:ETPS/2 Elantech Touchpad:dmi:*svnSAMSUNGELECTRONICSCO.,LTD.:pn305V4A/
  EVDEV_ABS_01=0:1116:24
  EVDEV_ABS_35=0:2480:28
  EVDEV_ABS_36=0:1116:24
+
+# Samsung 880Z5E
+evdev:name:ETPS/2 Elantech Touchpad:dmi:*svnSAMSUNGELECTRONICSCO.,LTD.:pn870Z5E/880Z5E/680Z5E*
+ EVDEV_ABS_00=::30
+ EVDEV_ABS_01=::29
+ EVDEV_ABS_35=::30
+ EVDEV_ABS_36=::29
+
+#########################################
+# Toshiba
+#########################################
+
+# Toshiba Tecra M11
+evdev:name:AlpsPS/2 ALPS DualPoint TouchPad:dmi:*svnTOSHIBA:pnTECRAM11*
+ EVDEV_ABS_00=90:962:11
+ EVDEV_ABS_01=51:681:14
+
+#########################################
+# Waltop
+#########################################
+
+# WALTOP International Corp. Slim Tablet
+evdev:input:b0003v172Fp0031*
+ EVDEV_ABS_00=0:10000:400
+ EVDEV_ABS_01=0:6250:400
index fd49b03..881a531 100644 (file)
@@ -1,10 +1,17 @@
 # This file is part of systemd.
 #
-# Keyboard mapping of scan codes to key codes, and
-# scan codes to add to the AT keyboard's 'force-release' list.
+# This file contains 3 types of metadata to apply to keyboards and
+# keyboard-like input devices:
+# - Key mapping
+# - Hard-coded layouts
+# - Absence of modifier LEDs
+#
+# The matching process is the same for the different types of metadata.
+#
+# ########################### MATCHING #######################################
 #
 # The lookup keys are composed in:
-#   60-keyboard.rules
+#   60-evdev.rules
 #
 # Note: The format of the "evdev:" prefix match key is a
 # contract between the rules file and the hardware data, it might
 #    ZZZZ is the bus-id (see /usr/include/linux/input.h BUS_*), YYYY, XXXX and
 #    WWW are the 4-digit hex uppercase vendor, product and version ID and VVVV
 #    is an arbitrary length input-modalias describing the device capabilities.
+#    The vendor, product and version ID for a device node "eventX" is listed
+#    in /sys/class/input/eventX/device/id.
 #
 #  - AT keyboard DMI data matches:
 #      evdev:atkbd:dmi:bvn*:bvr*:bd*:svn<vendor>:pn<product>:pvr*
 #    <vendor> and <product> are the firmware-provided strings
-#    exported by the kernel DMI modalias.
+#    exported by the kernel DMI modalias, see /sys/class/dmi/id/modalias
 #
 #  - Input driver device name and DMI data match:
 #      evdev:name:<input device name>:dmi:bvn*:bvr*:bd*:svn<vendor>:pn*
 #    <input device name> is the name device specified by the
 #    driver, <vendor> is the firmware-provided string exported
-#    by the kernel DMI modalias.
+#    by the kernel DMI modalias, see /sys/class/dmi/id/modalias
+#
+#  - Extended input driver device name, properties and DMI data match:
+#      evdev:name:<input device name>:phys:<phys>:ev:<ev>:dmi:bvn*:bvr*:bd*:svn<vendor>:pn*
+#    <input device name> is the name device specified by the
+#    driver, <phys> is the physical-device-path, "cat
+#    /sys/class/input/input?/phys", <ev> is the event bitmask, "cat
+#    /sys/class/input/input?/capabilities/ev" and <vendor> is the
+#    firmware-provided string exported by the kernel DMI modalias,
+#    see /sys/class/dmi/id/modalias
+
+
+# ######################### KEY MAPPING ######################################
+#
+# Keyboard mapping of scan codes to key codes, and
+# scan codes to add to the AT keyboard's 'force-release' list.
 #
 # Scan codes are specified as:
 #   KEYBOARD_KEY_<hex scan code>=<key code identifier>
 # The scan code should be expressed in hex lowercase. The key codes
 # are retrieved and normalized from the kernel input API header.
+# Keycodes are either KEY_* defines in lowercase with the key_ prefix
+# optionally removed or BTN_ defines in lowercase with btn_ preserved.
 #
 # An '!' as the first character of the key identifier string
 # will add the scan code to the AT keyboard's list of scan codes
 #
 # To debug key presses and access scan code mapping data of
 # an input device use the commonly available tool: evtest(1).
+
+# A device with a fixed keyboard layout that must not be changed by
+# the desktop environment may specify that layout as:
+#   XKB_FIXED_LAYOUT="us"
+#   XKB_FIXED_VARIANT=""
+# Examples of such devices: the Yubikey or other key-code generating
+# devices.
 #
 # To update this file, create a new file
 #   /etc/udev/hwdb.d/70-keyboard.hwdb
 # and add your rules there. To load the new rules execute (as root):
-#   udevadm hwdb --update
+#   systemd-hwdb update
 #   udevadm trigger /dev/input/eventXX
 # where /dev/input/eventXX is the keyboard in question. If in
-# doubt, simply use /dev/input/event* to reload all input rules.
+# doubt, simply reload all input rules
+#   udevadm trigger --verbose --sysname-match="event*"
 #
 # If your changes are generally applicable, preferably send them as a pull
 # request to
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pn*
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnGateway*:pnA0A1*:pvr*
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svneMachines:pneMachines*E725:pvr*
+ KEYBOARD_KEY_86=wlan                                   # Fn+F3 or Fn+Q for comunication key
  KEYBOARD_KEY_a5=help                                   # Fn+F1
  KEYBOARD_KEY_a6=setup                                  # Fn+F2 Acer eSettings
  KEYBOARD_KEY_a7=battery                                # Fn+F3 Power Management
@@ -87,6 +122,7 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svneMachines:pneMachines*E725:pvr*
  KEYBOARD_KEY_f3=prog2                                  # "P2" programmable button
  KEYBOARD_KEY_f4=prog1                                  # "P1" programmable button
  KEYBOARD_KEY_f5=presentation
+ KEYBOARD_KEY_f6=power                                  # Power button
  KEYBOARD_KEY_f8=fn
  KEYBOARD_KEY_f9=prog1                                  # Launch NTI shadow
 
@@ -115,6 +151,9 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pnAspire*8930:*
  KEYBOARD_KEY_89=fastforward
  KEYBOARD_KEY_9e=back
 
+evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pnAspire*7750G:pvr*
+ KEYBOARD_KEY_e0=!pageup
+
 # Travelmate C300
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pnTravelMate*C3[01]0*:pvr*
  KEYBOARD_KEY_67=f24                                    # FIXME: rotate screen
@@ -123,6 +162,10 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pnTravelMate*C3[01]0*:pvr*
  KEYBOARD_KEY_6b=fn
  KEYBOARD_KEY_6c=screenlock                             # FIXME: lock tablet device/buttons
 
+# Travelmate P648-G2-MG
+evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pnTravelMate*P648-G2-MG*:pvr*
+ KEYBOARD_KEY_8a=f20                                    # Microphone mute button; should be micmute
+
 # on some models this isn't brightnessup
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pn*5210*:pvr*
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pn*5220*:pvr*
@@ -137,6 +180,10 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pnAspire*1640:*
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pnAOA*:pvr*
  KEYBOARD_KEY_a9=!switchvideomode                       # Fn+F5
 
+# Easynote models
+evdev:atkbd:dmi:bvn*:bvr*:bd*:svnPackard*Bell*:pnEasynote*:pvr*
+ KEYBOARD_KEY_86=wlan                                   # Fn+F3 or Fn+Q for comunication key
+
 ###########################################################
 # Alienware
 ###########################################################
@@ -197,6 +244,14 @@ evdev:input:b0003v049Fp0051*
  KEYBOARD_KEY_0c0015=messenger
 
 ###########################################################
+# Cube
+###########################################################
+
+evdev:name:gpio-keys:phys:gpio-keys/input0:ev:3:dmi:bvn*:bvr*:bd*:svncube:pni1-TF:*
+ KEYBOARD_KEY_0=leftmeta
+ KEYBOARD_KEY_1=power
+
+###########################################################
 # Dell
 ###########################################################
 
@@ -213,7 +268,7 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:pn*
  KEYBOARD_KEY_8a=suspend                                # Fn+F1 hibernate
  KEYBOARD_KEY_8b=switchvideomode                        # Fn+F8 CRT/LCD (high keycode: "displaytoggle")
  KEYBOARD_KEY_8c=unknown                                # Fn+Right Auto Brightness
- KEYBOARD_KEY_8F=switchvideomode                        # Fn+F7 aspect ratio
+ KEYBOARD_KEY_8f=switchvideomode                        # Fn+F7 aspect ratio
  KEYBOARD_KEY_90=previoussong                           # Front panel previous song
  KEYBOARD_KEY_91=prog1                                  # Wi-Fi Catcher (Dell-specific)
  KEYBOARD_KEY_92=media                                  # MediaDirect button (house icon)
@@ -238,8 +293,9 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:pnInspiron*1110:pvr*
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:pnInspiron*1210:pvr*
  KEYBOARD_KEY_84=wlan
 
-# Dell Inspiron 1520
+# Dell Inspiron 1520 and Latitude 2110
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:pnInspiron*1520:pvr*
+evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:pnLatitude*2110:pvr*
  KEYBOARD_KEY_85=unknown  # Brightness Down, also emitted by acpi-video, ignore
  KEYBOARD_KEY_86=unknown  # Brightness Up, also emitted by acpi-video, ignore
 
@@ -261,6 +317,10 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:pnPrecision*:pvr*
  KEYBOARD_KEY_88=!                                      # wireless switch
  KEYBOARD_KEY_9e=!f21
 
+# Dell Latitude E7*
+evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:pnLatitude*E7*:pvr*
+ KEYBOARD_KEY_88=unknown                                # Fn-PrtScr rfkill - handled in HW
+
 # Dell XPS
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:pnXPS*:pvr*
  KEYBOARD_KEY_8c=!unknown
@@ -274,7 +334,7 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:pnXPS12-9Q33*:pvr*
 evdev:name:Dell WMI hotkeys:dmi:bvn*:bvr*:bd*:svnDell*:pnLatitude*
 # Dell Precision microphone mute
 evdev:name:Dell WMI hotkeys:dmi:bvn*:bvr*:bd*:svnDell*:pnPrecision*
- KEYBOARD_KEY_150=f20                                   # Mic mute toggle, should be micmute
+ KEYBOARD_KEY_100150=f20                                   # Mic mute toggle, should be micmute
 
 ###########################################################
 # Everex
@@ -414,6 +474,10 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnHP*Pavilion*dv7*Notebook*PC:
  KEYBOARD_KEY_c6=break
  KEYBOARD_KEY_94=reserved
 
+# Pavilion x360 13 (Prevents random airplane mode activation)
+evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pn*[pP][aA][vV][iI][lL][iI][oO][nN]*13*x360*:pvr*
+ KEYBOARD_KEY_d7=unknown
+
 # Elitebook
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pn*Compaq*:pvr*
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pn*EliteBook*:pvr*
@@ -482,8 +546,7 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnFalco:pvr*
  KEYBOARD_KEY_43=volumedown
  KEYBOARD_KEY_44=volumeup
  KEYBOARD_KEY_db=search # Same position as caps lock key on most keyboards
-# KEYBOARD_KEY_3e=fullscreen, no defined key sym
-
+ # KEYBOARD_KEY_3e=fullscreen, no defined key sym
 
 # HP EliteBook 725 G2
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnHPLicrice:pvr*
@@ -694,7 +757,7 @@ evdev:input:b0003v046DpC308*
  KEYBOARD_KEY_90003=finance                             # Finance
  KEYBOARD_KEY_90004=prog1                               # My Sites
  KEYBOARD_KEY_90005=prog2                               # Community
- KEYBOARD_KEY_C0183=media                               # Media
+ KEYBOARD_KEY_c0183=media                               # Media
 
 # Cordless Desktop S510
 evdev:input:b0003v046DpC50C*
@@ -759,22 +822,22 @@ evdev:input:b0003v046DpC52D*
 
 # Internet Navigator
 evdev:input:b0003v046DpC309*
 KEYBOARD_KEY_90001=chat         # Messenger/SMS
 KEYBOARD_KEY_90002=camera       # webcam
 KEYBOARD_KEY_90003=prog1        # iTouch
 KEYBOARD_KEY_90004=shop         # Shopping
 KEYBOARD_KEY_C0201=new          # New (F1)
 KEYBOARD_KEY_C0289=reply        # Reply mail (F2)
 KEYBOARD_KEY_C028B=forwardmail  # Forward mail (F3)
 KEYBOARD_KEY_C028C=send         # Send (F4)
-  KEYBOARD_KEY_C021A=undo         # Undo (F5).
-  KEYBOARD_KEY_C0279=redo         # Redo (F6).
 KEYBOARD_KEY_C0208=print        # Print (F7)
 KEYBOARD_KEY_C0207=save         # Save (F8)
 KEYBOARD_KEY_C0194=file         # My Computer (F9)
 KEYBOARD_KEY_C01A7=documents    # My Documents (F10)
 KEYBOARD_KEY_C01B6=images       # My Pictures (F11) ??
 KEYBOARD_KEY_C01B7=sound        # My Music (F12) ??
+ KEYBOARD_KEY_90001=chat         # Messenger/SMS
+ KEYBOARD_KEY_90002=camera       # webcam
+ KEYBOARD_KEY_90003=prog1        # iTouch
+ KEYBOARD_KEY_90004=shop         # Shopping
KEYBOARD_KEY_c0201=new          # New (F1)
KEYBOARD_KEY_c0289=reply        # Reply mail (F2)
KEYBOARD_KEY_c028b=forwardmail  # Forward mail (F3)
KEYBOARD_KEY_c028c=send         # Send (F4)
+ KEYBOARD_KEY_c021a=undo         # Undo (F5)
+ KEYBOARD_KEY_c0279=redo         # Redo (F6)
KEYBOARD_KEY_c0208=print        # Print (F7)
KEYBOARD_KEY_c0207=save         # Save (F8)
KEYBOARD_KEY_c0194=file         # My Computer (F9)
KEYBOARD_KEY_c01a7=documents    # My Documents (F10)
KEYBOARD_KEY_c01b6=images       # My Pictures (F11) ??
KEYBOARD_KEY_c01b7=sound        # My Music (F12) ??
 
 
 ###########################################################
@@ -797,6 +860,15 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnMAXDATA:pnPro*7000*:pvr*
 # Medion
 ###########################################################
 
+# Akoya
+evdev:atkbd:dmi:bvn*:bvr*:svnMEDION*:pnS3409*:pvr*
+evdev:atkbd:dmi:bvn*:bvr*:svnMedion*:pnAkoya*:pvr*
+ KEYBOARD_KEY_a0=!mute
+ KEYBOARD_KEY_ae=!volumedown
+ KEYBOARD_KEY_b0=!volumeup
+ KEYBOARD_KEY_19=!p
+ KEYBOARD_KEY_df=sleep
+
 # FID2060
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnMEDION*:pn*FID2060*:pvr*
  KEYBOARD_KEY_6b=channeldown                            # Thottle Down
@@ -850,6 +922,7 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnMicro-Star*:pn*:pvr*
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnMICRO-STAR*:pn*U-100*:pvr*
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnMICRO-STAR*:pn*U100*:pvr*
 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnMICRO-STAR*:pn*N033:*
+evdev:atkbd:dmi:bvn*:bvr*:bd*:svnMicro-Star*:pn*VR420*:pvr*
  KEYBOARD_KEY_f7=reserved
  KEYBOARD_KEY_f8=reserved
 
@@ -889,7 +962,6 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnOLPC:pnXO:*
  KEYBOARD_KEY_c2=f8
  KEYBOARD_KEY_c3=f9
  KEYBOARD_KEY_c4=f10
- KEYBOARD_KEY_c7=f11
  KEYBOARD_KEY_d8=f12
  KEYBOARD_KEY_f7=f13
  KEYBOARD_KEY_f6=f14
@@ -909,7 +981,7 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnOLPC:pnXO:*
  KEYBOARD_KEY_c9=pageup
  KEYBOARD_KEY_d1=pagedown
  KEYBOARD_KEY_c7=home
- KEYBOARD_KEY_cF=end
+ KEYBOARD_KEY_cf=end
  KEYBOARD_KEY_73=hp
  KEYBOARD_KEY_7e=hp
  KEYBOARD_KEY_db=leftmeta                               # left grab
@@ -1232,3 +1304,35 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDIXONSP:pnDIXON*:pvr*
  KEYBOARD_KEY_a0=!                                      # mute
  KEYBOARD_KEY_ae=!                                      # volume down
  KEYBOARD_KEY_b0=!                                      # volume up
+
+######################### FIXED LAYOUT DEVICES #############################
+# This section lists devices for which only one keyboard layout is possible
+# or useful such as devices which "type" expecting the user's keymap to match
+# a particular one. For example, barcode readers and OTP keys.
+#
+# The layout must be an xkb compatible layout (defined with XKB_FIXED_LAYOUT),
+# with an accompanying variant (defined with XKB_FIXED_VARIANT) if necessary.
+
+# Yubico Yubico Yubikey II"
+evdev:input:b0003v1050p0010*
+# Yubico Yubikey NEO OTP+CCID
+evdev:input:b0003v1050p0111*
+# Yubico Yubikey NEO OTP+U2F+CCID
+evdev:input:b0003v1050p0116*
+# OKE Electron Company USB barcode reader
+evdev:input:b0003v05FEp1010*
+ XKB_FIXED_LAYOUT="us"
+ XKB_FIXED_VARIANT=""
+
+######################### LACK OF MODIFIER LEDS ############################
+# This section lists keyboard which do not have their own LEDs for some
+# modifiers. Only Caps-Lock (KEYBOARD_LED_CAPSLOCK) and Num-Lock
+# (KEYBOARD_LED_CAPSLOCK) are currently handled and need their values set
+# to "0" to indicate the absence of LED.
+#
+# Presence of a LED is implicit when the property is absent.
+
+# Logitech K750
+evdev:input:b0003v046Dp4002*
+ KEYBOARD_LED_NUMLOCK=0
+ KEYBOARD_LED_CAPSLOCK=0
diff --git a/hwdb/60-sensor.hwdb b/hwdb/60-sensor.hwdb
new file mode 100644 (file)
index 0000000..dab22dc
--- /dev/null
@@ -0,0 +1,77 @@
+# This file is part of systemd.
+#
+# The lookup keys are composed in:
+#   60-sensor.rules
+#
+# Note: The format of the "sensor:" prefix match key is a
+# contract between the rules file and the hardware data, it might
+# change in later revisions to support more or better matches, it
+# is not necessarily expected to be a stable ABI.
+#
+# Match string formats:
+# sensor:modalias:<parent device modalias>:dmi:<dmi string>
+#
+# To add local entries, create a new file
+#   /etc/udev/hwdb.d/61-sensor-local.hwdb
+# and add your rules there. To load the new rules execute (as root):
+#   systemd-hwdb update
+#   udevadm trigger -y `dirname $(udevadm info -n "/dev/iio:deviceXXX" -q path)`
+# where /dev/iio:deviceXXX is the device in question.
+#
+# If your changes are generally applicable, preferably send them as a pull
+# request to
+#   https://github.com/systemd/systemd
+# or create a bug report on https://github.com/systemd/systemd/issues and
+# include your new rules, a description of the device, and the output of
+#   udevadm info --export-db
+#
+# For hwdb format and systemd behavior:
+#   https://www.freedesktop.org/software/systemd/man/hwdb.html
+#
+# Allowed properties are:
+#    ACCEL_MOUNT_MATRIX=<matrix>
+#
+# where <matrix> is a mount-matrix in the format specified in the IIO
+# subsystem[1]. The default, when unset, is equivalent to:
+#   ACCEL_MOUNT_MATRIX=1, 0, 0; 0, 1, 0; 0, 0, 1
+# eg. the identity matrix.
+#
+# [1]: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=dfc57732ad38f93ae6232a3b4e64fd077383a0f1
+#
+#
+# Sort by brand, model
+
+#########################################
+# AsusTek
+#########################################
+sensor:modalias:acpi:SMO8500*:dmi:*svn*ASUSTeK*:*pn*TP500LB*
+ ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 0
+
+sensor:modalias:acpi:SMO8500*:dmi:*svn*ASUSTeK*:*pn*TP300LJ*
+ ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
+
+#########################################
+# Endless
+#########################################
+sensor:modalias:acpi:ACCE0001*:dmi:*svnEndless*:*pnELT-NL3*
+ ACCEL_MOUNT_MATRIX=0, 1, 0; 0, 0, -1; -1, 0, 0
+
+#########################################
+# HP
+#########################################
+sensor:modalias:platform:lis3lv02d:dmi:*svn*Hewlett-Packard*:*pn*HPEliteBook8540w*
+sensor:modalias:platform:lis3lv02d:dmi:*svn*Hewlett-Packard*:*pn*HPEliteBook8560w*
+  ACCEL_MOUNT_MATRIX=1, 0, 0; 0, 0, -1; 0, 1, 0
+
+#########################################
+# Winbook
+#########################################
+sensor:modalias:acpi:BMA250*:dmi:*svn*WinBook*:*pn*TW100*
+ ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 0
+
+#########################################
+# Cytrix (Mytrix)
+#########################################
+sensor:modalias:acpi:*KIOX000A*:dmi:*svn*CytrixTechnology:*pn*Complex11t*
+ ACCEL_MOUNT_MATRIX=-1, 0, 0; 0, 1, 0; 0, 0, 1
+
diff --git a/hwdb/70-joystick.hwdb b/hwdb/70-joystick.hwdb
new file mode 100644 (file)
index 0000000..9d5c4fc
--- /dev/null
@@ -0,0 +1,50 @@
+# This file is part of systemd.
+#
+# Database for joystick device information that cannot be queried directly.
+#
+# The lookup keys are composed in:
+#   70-joystick.rules
+#
+# Note: The format of the "joystick:" prefix match key is a
+# contract between the rules file and the hardware data, it might
+# change in later revisions to support more or better matches, it
+# is not necessarily expected to be a stable ABI.
+#
+# Match string format:
+# joystick:<bustype>:v<vid>p<pid>:name:<name>:
+#
+# vid/pid as 4-digit hex lowercase vendor/product
+#
+# To add local entries, create a new file
+#   /etc/udev/hwdb.d/71-joystick-local.hwdb
+# and add your rules there. To load the new rules execute (as root):
+#   systemd-hwdb update
+#   udevadm trigger /dev/input/eventXX
+# where /dev/input/eventXX is the joystick in question. If in
+# doubt, simply use /dev/input/event* to reload all input rules.
+#
+# If your changes are generally applicable, preferably send them as a pull
+# request to
+#   https://github.com/systemd/systemd
+# or create a bug report on https://github.com/systemd/systemd/issues and
+# include your new rules, a description of the device, and the output of
+#   udevadm info /dev/input/eventXX.
+#
+# Permitted keys:
+#   Specify if a joystick is a built-in one or external:
+#   ID_INPUT_JOYSTICK_INTEGRATION=internal|external
+#
+#   If the property is missing, user-space can assume:
+#   ID_INPUT_JOYSTICK_INTEGRATION=external
+
+joystick:bluetooth:*
+ ID_INPUT_JOYSTICK_INTEGRATION=external
+
+###########################################################
+# GPD
+###########################################################
+
+# GPD Win, Classic and XBox 360 compat modes
+joystick:usb:v11c5p5507*
+joystick:usb:v045ep028e*
+ ID_INPUT_JOYSTICK_INTEGRATION=internal
index a5b39dc..d5cccb9 100644 (file)
@@ -31,7 +31,7 @@
 # To add local entries, create a new file
 #   /etc/udev/hwdb.d/71-mouse-local.hwdb
 # and add your rules there. To load the new rules execute (as root):
-#   udevadm hwdb --update
+#   systemd-hwdb update
 #   udevadm trigger /dev/input/eventXX
 # where /dev/input/eventXX is the mouse in question. If in
 # doubt, simply use /dev/input/event* to reload all input rules.
 #   udevadm info /dev/input/eventXX.
 #
 # Allowed properties are:
+#    ID_INPUT_TRACKBALL
 #    MOUSE_DPI
 #    MOUSE_WHEEL_CLICK_ANGLE
+#    MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL
+#    MOUSE_WHEEL_CLICK_COUNT
+#    MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL
+#    MOUSE_WHEEL_TILT_HORIZONTAL
+#    MOUSE_WHEEL_TILT_VERTICAL
+#
+#########################################
+#         ID_INPUT_TRACKBALL            #
+#########################################
+#
+# Specified *in additition* to ID_INPUT_MOUSE if the device is a trackball.
+# Removing ID_INPUT_MOUSE will break backwards compatibility.
 #
 #########################################
 #               MOUSE_DPI               #
 #     MOUSE_WHEEL_CLICK_ANGLE=<degrees>
 #
 # Most mice have a 15 degree click stop (24 clicks per full rotation).
+# For backwards-compatibility, the click angle must be an integer.
+# Where a device has non-integer click angles, the MOUSE_WHEEL_CLICK_COUNT
+# property should also be specified.
+#
+#########################################
+#   MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL  #
+#########################################
+#
+# Identical to MOUSE_WHEEL_CLICK_ANGLE but for the horizontal scroll wheel.
+# This property may only be specified if the angle for the horizontal
+# scroll wheel differs from the vertical wheel. If so, *both* click angles
+# must be specified.
+#
+#########################################
+#   MOUSE_WHEEL_CLICK_COUNT             #
+#   MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL  #
+#########################################
 #
+# The number of clicks the wheel sends per 360 degree rotation. This
+# property should only be used where the click angle is not an integer.
+# For backwards compatibility it must be specified in addition to
+# MOUSE_WHEEL_CLICK_ANGLE.
+# Clients should prefer MOUSE_WHEEL_CLICK_COUNT where available, it is more
+# precise than MOUSE_WHEEL_CLICK_ANGLE.
+#
+# MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL works the same way but also follows the
+# rules of MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL.
+
+#########################################
+#    MOUSE_WHEEL_TILT_HORIZONTAL        #
+#    MOUSE_WHEEL_TILT_VERTICAL          #
+#########################################
+#
+# Indicates that the respective axis is not a mouse wheel rotation but a
+# tilt along that axis. Wheel tilt is most commonly used for horizontal
+# scroll wheel emulation on mice with only a single vertical wheel.
+#
+# The vertical and horizontal Axes are independently marked as tilt axes,
+# for example it is permitted to have a MOUSE_WHEEL_CLICK_COUNT or
+# MOUSE_WHEEL_CLICK_ANGLE for the vertical axis and mark the horizontal axis
+# marked as as MOUSE_WHEEL_TILT_HORIZONTAL.
+#
+# It is a bug to have either CLICK_COUNT or CLICK_ANGLE set on the same axis
+# as WHEEL_TILT. Applications should give priority to WHEEL_TILT and ignore
+# other settings.
+#
+# This is a flag only, permitted values: 0 or 1
 
 #
 # Sort by brand, type (usb, bluetooth), DPI, frequency.
 # For mice with switchable resolution, sort by the starred entry.
 
 ##########################################
+# Generic
+##########################################
+mouse:*:name:*Trackball*:
+mouse:*:name:*trackball*:
+mouse:*:name:*TrackBall*:
+ ID_INPUT_TRACKBALL=1
+
+##########################################
 # Apple
 ##########################################
 
@@ -147,6 +214,14 @@ mouse:usb:v0461p4d16:name:USB Optical Mouse:
  MOUSE_DPI=500@125
 
 ##########################################
+# Future Technology Devices International
+##########################################
+
+# SNES Mouse plugged into a Retrode 2
+mouse:usb:v0403p97c1:name:Retrode SNES Mouse:
+ MOUSE_DPI=235@126
+
+##########################################
 # HandShoe Mouse
 ##########################################
 
@@ -177,6 +252,14 @@ mouse:usb:v093ap2510:name:PIXART USB OPTICAL MOUSE:
  MOUSE_DPI=1000@125
 
 ##########################################
+# IBM
+##########################################
+
+# IBM USB Travel Mouse (MO32BO)
+mouse:usb:v04b3p3107:name:*
+ MOUSE_DPI=800@125
+
+##########################################
 # Lenovo
 ##########################################
 
@@ -231,6 +314,7 @@ mouse:usb:v04b3p310c:name:USB Optical Mouse:
 # Logitech M570 trackball
 mouse:usb:v046dp1028:name:Logitech M570:
  MOUSE_DPI=540@167
+ ID_INPUT_TRACKBALL=1
 
 # Logitech USB-PS/2 M-BZ96C
 mouse:usb:v046dpc045:name:Logitech USB-PS/2 Optical Mouse:
@@ -280,7 +364,7 @@ mouse:usb:v046dpc049:name:Logitech USB Gaming Mouse:
 mouse:usb:v046dpc24e:name:Logitech G500s Laser Gaming Mouse:
  MOUSE_DPI=400@500 *800@500 2000@500
 
- # Logitech G9
+# Logitech G9
 mouse:usb:v046dpc048:name:Logitech G9 Laser Mouse:
  MOUSE_DPI=400@1000 800@1000 *1600@1000
 
@@ -300,6 +384,10 @@ mouse:usb:v046dpc24c:name:Logitech G400s Optical Gaming Mouse:
 mouse:usb:v046dpc07e:name:Logitech Gaming Mouse G402:
  MOUSE_DPI=400@1000 *800@1000 1600@1000 3200@1000
 
+# Logitech G502 Proteus Spectrum
+mouse:usb:v046dpc332:name:Logitech Gaming Mouse G502:
+ MOUSE_DPI=1200@1000 *2400@1000 3200@1000 6400@1000
+
 # Logitech B605 Wireless Mouse (also M505)
 mouse:usb:v046dp101d:name:Logitech B605:
 mouse:usb:v046dp101d:name:Logitech M505:
@@ -325,13 +413,18 @@ mouse:usb:v046dp402d:name:Logitech M560:
 mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:402d:
  MOUSE_DPI=1000@125
 
-# Logitech V220 Cordless Optical Mouse
-mouse:usb:v046dpc51b:name:Logitech USB Receiver:
 # Logitech Performance MX
 mouse:usb:v046dp101a:name:Logitech Performance MX:
+ MOUSE_DPI=1000@166
+
 # Logitech MX Master
+# Horiz wheel has 14 stops, angle is rounded up
 mouse:usb:v046dp4041:name:Logitech MX Master:
  MOUSE_DPI=1000@166
+ MOUSE_WHEEL_CLICK_ANGLE=15
+ MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL=26
+ MOUSE_WHEEL_CLICK_COUNT=24
+ MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL=14
 
 # Logitech MK260 Wireless Combo Receiver aka M-R0011
 mouse:usb:v046dpc52e:name:Logitech USB Receiver:
@@ -356,11 +449,6 @@ mouse:usb:v046dp4027:name:Logitech T620:
 mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:4027:
  MOUSE_DPI=1200@250
 
-# Logitech LX8 Cordless Laser Mouse
-mouse:usb:v046dpc51b:name:Logitech USB Receiver:
- MOUSE_DPI=1300@125
- MOUSE_WHEEL_CLICK_ANGLE=15
-
 # Logitech ZoneTouch Mouse T400
 mouse:usb:v046dp4026:name:Logitech T400:
 mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:4026:
@@ -370,6 +458,10 @@ mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:4026:
 mouse:usb:v046dpc068:name:Logitech G500:
  MOUSE_DPI=*1600@500 2600@500 3600@500
 
+# Logitech TrackMan Wheel (USB)
+mouse:usb:v046dpc404:name:Logitech Trackball:
+ MOUSE_DPI=300@125
+
 # Logitech MX1000 Laser Cordless Mouse
 mouse:bluetooth:v046dpb003:name:Logitech MX1000 mouse:
  MOUSE_DPI=800@80
@@ -418,6 +510,10 @@ mouse:bluetooth:v045ep0702:name:Microsoft  Wireless Laser Mouse 8000:
 mouse:bluetooth:v045ep07f3:name:Arc Touch Mouse SE:
  MOUSE_DPI=1000@2000
 
+# Microsoft Surface Mouse
+mouse:bluetooth:v0000p0000:name:Surface Mouse:
+ MOUSE_DPI=2000@2000
+
 ##########################################
 # Mionix
 ##########################################
@@ -451,6 +547,10 @@ mouse:bluetooth:v056ep0061:name:Laser  BTmouse:
 mouse:usb:v1532p0042:name:Razer Razer Abyssus:
  MOUSE_DPI=3500@1000
 
+# Razer DeathAdder Black Edition
+mouse:usb:v1532p0029:name:Razer Razer DeathAdder:
+ MOUSE_DPI=3500@1000
+
 ##########################################
 # Roccat
 ##########################################
@@ -483,3 +583,11 @@ mouse:usb:v1038p1369:name:SteelSeries Sensei Raw Gaming Mouse:
 # Trust illuminated mouse gxt 152
 mouse:usb:v145fp01ac:name:HID-compliant Mouse Trust Gaming Mouse:
  MOUSE_DPI=*800@528 1200@537 1600@536 2400@521
+
+ ##########################################
+ # Zelotes
+ ##########################################
+
+# Zelotes 5500 DPI 7 Button USB Wired Gaming Mouse
+mouse:usb:v1d57pad17:*
+ MOUSE_DPI=1000@500 1600@500 2400@500 3200@500 5500@500 *1000@1000 1600@1000 2400@1000 3200@1000 5500@1000
index ec166ea..f1a86ff 100644 (file)
 #    ZZZZ is the bus-id (see /usr/include/linux/input.h BUS_*), YYYY, XXXX and
 #    WWW are the 4-digit hex uppercase vendor, product and version ID and VVVV
 #    is an arbitrary length input-modalias describing the device capabilities.
+#    The vendor, product and version ID for a device node "eventX" is listed
+#    in /sys/class/input/eventX/device/id.
 #
 #  - Input driver device name and DMI data match:
 #      evdev:name:<input device name>:dmi:bvn*:bvr*:bd*:svn<vendor>:pn*
 #    <input device name> is the name device specified by the driver,
-#    <vendor> is the firmware-provided string from the kernel DMI modalias.
+#    <vendor> is the firmware-provided string from the kernel DMI modalias,
+#    see /sys/class/dmi/id/modalias
 #
 # To add local entries, create a new file
 #   /etc/udev/hwdb.d/71-pointingstick-local.hwdb
 # and add your rules there. To load the new rules execute (as root):
-#   udevadm hwdb --update
+#   systemd-hwdb update
 #   udevadm trigger /dev/input/eventXX
 # where /dev/input/eventXX is the pointingstick in question. If in
 # doubt, simply use /dev/input/event* to reload all input rules.
 
 # Latitude D620
 evdev:name:*DualPoint Stick:dmi:bvn*:bvr*:bd*:svnDellInc.:pnLatitudeD620*:pvr*
-  POINTINGSTICK_CONST_ACCEL=0.5
+ POINTINGSTICK_CONST_ACCEL=0.5
+
+# Latitude E5570
+evdev:name:*DualPoint Stick:dmi:bvn*:bvr*:bd*:svnDellInc.:pnLatitudeE5570*:pvr*
+ POINTINGSTICK_CONST_ACCEL=0.1
 
 # Latitude E6320
 evdev:name:*DualPoint Stick:dmi:bvn*:bvr*:bd*:svnDellInc.:pnLatitudeE6320*:pvr*
 POINTINGSTICK_CONST_ACCEL=2.0
+ POINTINGSTICK_CONST_ACCEL=2.0
 
 # Latitude E6400
 evdev:name:*DualPoint Stick:dmi:bvn*:bvr*:bd*:svnDellInc.:pnLatitudeE6400*:pvr*
-  POINTINGSTICK_CONST_ACCEL=1.5
+ POINTINGSTICK_CONST_ACCEL=1.5
+
+# Latitude E7470
+evdev:name:*DualPoint Stick:dmi:bvn*:bvr*:bd*:svnDellInc.:pnLatitudeE7470*:pvr*
+ POINTINGSTICK_CONST_ACCEL=0.6
 
 #########################################
 # Lenovo
 #########################################
 
+# Lenovo Thinkpad X220
+evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPadX220:*
 # Lenovo Thinkpad X230
 evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPadX230:*
 # Lenovo Thinkpad X230 tablet
 evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPadX230Tablet:*
-# Lenovo Thinkpad X240
-evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPadX240:*
-# Lenovo Thinkpad T440s
-evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPadT440s:*
-# Lenovo Thinkpad T540p
-evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPadT540p:*
-# Lenovo Thinkpad T550 / W550s
-evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPadT550:*
+# Lenovo Thinkpad *40 series
+evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPad??40:*
+evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPad??40?:*
+# Lenovo Thinkpad *50 series
+evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPad??50:*
+evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPad??50?:*
+# Lenovo Thinkpad *60 series
+evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPad??60:*
+evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPad??60?:*
 # Lenovo Thinkpad X1 Carbon 3rd gen
 evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPadX1Carbon3rd:*
 # Lenovo Thinkpad X1 Carbon 4th gen
 evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPadX1Carbon4th:*
-  POINTINGSTICK_SENSITIVITY=200
-  POINTINGSTICK_CONST_ACCEL=1.0
+# Lenovo Thinkpad X1 Tablet
+evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPadX1Tablet:*
+ POINTINGSTICK_SENSITIVITY=200
+ POINTINGSTICK_CONST_ACCEL=1.0
 
-# Lenovo Thinkpad X200s / X201s
+# Lenovo Thinkpad X200/X201/X200s/X201s
 # Note these come with 2 revisions of keyboard, with the trackpoints having a
 # different sensitivity in the different revisions. 1.25 is a bit slow for the
 # least sensitive revision, but it is better to be a bit slow than too fast.
-evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPadX20?s:*
-  POINTINGSTICK_SENSITIVITY=200
-  POINTINGSTICK_CONST_ACCEL=1.25
+evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPadX20?:*
+evdev:name:TPPS/2 IBM TrackPoint:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPadX20??:*
+ POINTINGSTICK_SENSITIVITY=200
+ POINTINGSTICK_CONST_ACCEL=1.25
+
+# Lenovo UltraNav SK-8845 (USB keyboard)
+evdev:input:b0003v06CBp0009*
+ POINTINGSTICK_CONST_ACCEL=2.5
+ POINTINGSTICK_SENSITIVITY=200
index 11f3f96..12d97de 100644 (file)
@@ -18,7 +18,7 @@
 # To add local entries, create a new file
 #   /etc/udev/hwdb.d/71-touchpad-local.hwdb
 # and add your rules there. To load the new rules execute (as root):
-#   udevadm hwdb --update
+#   systemd-hwdb update
 #   udevadm trigger /dev/input/eventXX
 # where /dev/input/eventXX is the touchpad in question. If in
 # doubt, simply use /dev/input/event* to reload all input rules.
@@ -47,3 +47,16 @@ touchpad:usb:*
 ###########################################################
 touchpad:usb:v05ac*
  ID_INPUT_TOUCHPAD_INTEGRATION=internal
+
+###########################################################
+# Wacom
+###########################################################
+touchpad:usb:v056a*
+ ID_INPUT_TOUCHPAD_INTEGRATION=external
+
+###########################################################
+# Microsoft (Surface Type Covers)
+###########################################################
+touchpad:usb:v045ep07*
+ ID_INPUT_TOUCHPAD_INTEGRATION=internal
index 2dc8c7c..2c23b05 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/python3
+#!/usr/bin/env python3
 
 from html.parser import HTMLParser
 from enum import Enum
@@ -31,7 +31,7 @@ class PNPTableParser(HTMLParser):
             elif self.state == State.AFTER_PNPID:
                 self.state = State.DATE
             else:
-                raise Error("Unexpected field")
+                raise ValueError
 
             self.data = ""
 
@@ -48,7 +48,7 @@ class PNPTableParser(HTMLParser):
             elif self.state == State.DATE:
                 self.state = State.NOWHERE
             else:
-                raise Error("Unexpected field")
+                raise ValueError
 
     def handle_data(self, data):
         self.data += data
diff --git a/hwdb/meson.build b/hwdb/meson.build
new file mode 100644 (file)
index 0000000..74a93f9
--- /dev/null
@@ -0,0 +1,43 @@
+hwdb_files = files('''
+        20-pci-vendor-model.hwdb
+        20-pci-classes.hwdb
+        20-usb-vendor-model.hwdb
+        20-usb-classes.hwdb
+        20-sdio-vendor-model.hwdb
+        20-sdio-classes.hwdb
+        20-bluetooth-vendor-product.hwdb
+        20-acpi-vendor.hwdb
+        20-OUI.hwdb
+        20-net-ifname.hwdb
+        60-evdev.hwdb
+        60-keyboard.hwdb
+        60-sensor.hwdb
+        70-mouse.hwdb
+        70-pointingstick.hwdb
+        70-touchpad.hwdb
+'''.split())
+
+if conf.get('ENABLE_HWDB', false)
+        install_data(hwdb_files,
+                     install_dir : udevhwdbdir)
+
+        meson.add_install_script('sh', '-c',
+                                 mkdir_p.format(join_paths(sysconfdir, 'udev/hwdb.d')))
+
+        meson.add_install_script('sh', '-c',
+                                 'test -n "$DESTDIR" || @0@/systemd-hwdb update'
+                                 .format(rootbindir))
+endif
+
+############################################################
+
+parse_hwdb_py = find_program('parse_hwdb.py')
+test('parse-hwdb',
+     parse_hwdb_py,
+     timeout : 90)
+
+############################################################
+
+run_target(
+        'update',
+        command : [hwdb_update_sh, meson.current_source_dir()])
diff --git a/hwdb/parse_hwdb.py b/hwdb/parse_hwdb.py
new file mode 100755 (executable)
index 0000000..c7b49b8
--- /dev/null
@@ -0,0 +1,216 @@
+#!/usr/bin/env python3
+# -*- Mode: python; coding: utf-8; indent-tabs-mode: nil -*- */
+#
+# This file is part of systemd. It is distrubuted under the MIT license, see
+# below.
+#
+# Copyright 2016 Zbigniew Jędrzejewski-Szmek
+#
+# The MIT License (MIT)
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import glob
+import string
+import sys
+import os
+
+try:
+    from pyparsing import (Word, White, Literal, ParserElement, Regex,
+                           LineStart, LineEnd,
+                           OneOrMore, Combine, Or, Optional, Suppress, Group,
+                           nums, alphanums, printables,
+                           stringEnd, pythonStyleComment, QuotedString,
+                           ParseBaseException)
+except ImportError:
+    print('pyparsing is not available')
+    sys.exit(77)
+
+try:
+    from evdev.ecodes import ecodes
+except ImportError:
+    ecodes = None
+    print('WARNING: evdev is not available')
+
+try:
+    from functools import lru_cache
+except ImportError:
+    # don't do caching on old python
+    lru_cache = lambda: (lambda f: f)
+
+EOL = LineEnd().suppress()
+EMPTYLINE = LineEnd()
+COMMENTLINE = pythonStyleComment + EOL
+INTEGER = Word(nums)
+STRING =  QuotedString('"')
+REAL = Combine((INTEGER + Optional('.' + Optional(INTEGER))) ^ ('.' + INTEGER))
+SIGNED_REAL = Combine(Optional(Word('-+')) + REAL)
+UDEV_TAG = Word(string.ascii_uppercase, alphanums + '_')
+
+TYPES = {'mouse':    ('usb', 'bluetooth', 'ps2', '*'),
+         'evdev':    ('name', 'atkbd', 'input'),
+         'touchpad': ('i8042', 'rmi', 'bluetooth', 'usb'),
+         'joystick': ('i8042', 'rmi', 'bluetooth', 'usb'),
+         'keyboard': ('name', ),
+         'sensor':   ('modalias', ),
+        }
+
+@lru_cache()
+def hwdb_grammar():
+    ParserElement.setDefaultWhitespaceChars('')
+
+    prefix = Or(category + ':' + Or(conn) + ':'
+                for category, conn in TYPES.items())
+    matchline = Combine(prefix + Word(printables + ' ' + '®')) + EOL
+    propertyline = (White(' ', exact=1).suppress() +
+                    Combine(UDEV_TAG - '=' - Word(alphanums + '_=:@*.!-;, "') - Optional(pythonStyleComment)) +
+                    EOL)
+    propertycomment = White(' ', exact=1) + pythonStyleComment + EOL
+
+    group = (OneOrMore(matchline('MATCHES*') ^ COMMENTLINE.suppress()) -
+             OneOrMore(propertyline('PROPERTIES*') ^ propertycomment.suppress()) -
+             (EMPTYLINE ^ stringEnd()).suppress())
+    commentgroup = OneOrMore(COMMENTLINE).suppress() - EMPTYLINE.suppress()
+
+    grammar = OneOrMore(group('GROUPS*') ^ commentgroup) + stringEnd()
+
+    return grammar
+
+@lru_cache()
+def property_grammar():
+    ParserElement.setDefaultWhitespaceChars(' ')
+
+    dpi_setting = (Optional('*')('DEFAULT') + INTEGER('DPI') + Suppress('@') + INTEGER('HZ'))('SETTINGS*')
+    mount_matrix_row = SIGNED_REAL + ',' + SIGNED_REAL + ',' + SIGNED_REAL
+    mount_matrix = (mount_matrix_row + ';' + mount_matrix_row + ';' + mount_matrix_row)('MOUNT_MATRIX')
+
+    props = (('MOUSE_DPI', Group(OneOrMore(dpi_setting))),
+             ('MOUSE_WHEEL_CLICK_ANGLE', INTEGER),
+             ('MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL', INTEGER),
+             ('MOUSE_WHEEL_CLICK_COUNT', INTEGER),
+             ('MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL', INTEGER),
+             ('ID_INPUT_TRACKBALL', Literal('1')),
+             ('MOUSE_WHEEL_TILT_HORIZONTAL', Literal('1')),
+             ('MOUSE_WHEEL_TILT_VERTICAL', Literal('1')),
+             ('POINTINGSTICK_SENSITIVITY', INTEGER),
+             ('POINTINGSTICK_CONST_ACCEL', REAL),
+             ('ID_INPUT_JOYSTICK_INTEGRATION', Or(('internal', 'external'))),
+             ('ID_INPUT_TOUCHPAD_INTEGRATION', Or(('internal', 'external'))),
+             ('XKB_FIXED_LAYOUT', STRING),
+             ('XKB_FIXED_VARIANT', STRING),
+             ('KEYBOARD_LED_NUMLOCK', Literal('0')),
+             ('KEYBOARD_LED_CAPSLOCK', Literal('0')),
+             ('ACCEL_MOUNT_MATRIX', mount_matrix),
+            )
+    fixed_props = [Literal(name)('NAME') - Suppress('=') - val('VALUE')
+                   for name, val in props]
+    kbd_props = [Regex(r'KEYBOARD_KEY_[0-9a-f]+')('NAME')
+                 - Suppress('=') -
+                 ('!' ^ (Optional('!') - Word(alphanums + '_')))('VALUE')
+                ]
+    abs_props = [Regex(r'EVDEV_ABS_[0-9a-f]{2}')('NAME')
+                 - Suppress('=') -
+                 Word(nums + ':')('VALUE')
+                ]
+
+    grammar = Or(fixed_props + kbd_props + abs_props) + EOL
+
+    return grammar
+
+ERROR = False
+def error(fmt, *args, **kwargs):
+    global ERROR
+    ERROR = True
+    print(fmt.format(*args, **kwargs))
+
+def convert_properties(group):
+    matches = [m[0] for m in group.MATCHES]
+    props = [p[0] for p in group.PROPERTIES]
+    return matches, props
+
+def parse(fname):
+    grammar = hwdb_grammar()
+    try:
+        with open(fname, 'r', encoding='UTF-8') as f:
+            parsed = grammar.parseFile(f)
+    except ParseBaseException as e:
+        error('Cannot parse {}: {}', fname, e)
+        return []
+    return [convert_properties(g) for g in parsed.GROUPS]
+
+def check_match_uniqueness(groups):
+    matches = sum((group[0] for group in groups), [])
+    matches.sort()
+    prev = None
+    for match in matches:
+        if match == prev:
+            error('Match {!r} is duplicated', match)
+        prev = match
+
+def check_one_default(prop, settings):
+    defaults = [s for s in settings if s.DEFAULT]
+    if len(defaults) > 1:
+        error('More than one star entry: {!r}', prop)
+
+def check_one_keycode(prop, value):
+    if value != '!' and ecodes is not None:
+        key = 'KEY_' + value.upper()
+        if key not in ecodes:
+            key = value.upper()
+            if key not in ecodes:
+                error('Keycode {} unknown', key)
+
+def check_properties(groups):
+    grammar = property_grammar()
+    for matches, props in groups:
+        prop_names = set()
+        for prop in props:
+            # print('--', prop)
+            prop = prop.partition('#')[0].rstrip()
+            try:
+                parsed = grammar.parseString(prop)
+            except ParseBaseException as e:
+                error('Failed to parse: {!r}', prop)
+                continue
+            # print('{!r}'.format(parsed))
+            if parsed.NAME in prop_names:
+                error('Property {} is duplicated', parsed.NAME)
+            prop_names.add(parsed.NAME)
+            if parsed.NAME == 'MOUSE_DPI':
+                check_one_default(prop, parsed.VALUE.SETTINGS)
+            elif parsed.NAME.startswith('KEYBOARD_KEY_'):
+                check_one_keycode(prop, parsed.VALUE)
+
+def print_summary(fname, groups):
+    print('{}: {} match groups, {} matches, {} properties'
+          .format(fname,
+                  len(groups),
+                  sum(len(matches) for matches, props in groups),
+                  sum(len(props) for matches, props in groups)))
+
+if __name__ == '__main__':
+    args = sys.argv[1:] or glob.glob(os.path.dirname(sys.argv[0]) + '/[67]0-*.hwdb')
+
+    for fname in args:
+        groups = parse(fname)
+        print_summary(fname, groups)
+        check_match_uniqueness(groups)
+        check_properties(groups)
+
+    sys.exit(ERROR)
diff --git a/man/50-xdg-data-dirs.sh b/man/50-xdg-data-dirs.sh
new file mode 100755 (executable)
index 0000000..073174c
--- /dev/null
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+# set the default value
+XDG_DATA_DIRS="${XDG_DATA_DIRS:-/usr/local/share/:/usr/share}"
+
+# add a directory if it exists
+if [[ -d /opt/foo/share ]]; then
+   XDG_DATA_DIRS=/opt/foo/share:${XDG_DATA_DIRS}
+fi
+
+# write our output
+echo XDG_DATA_DIRS=$XDG_DATA_DIRS
diff --git a/man/90-rearrange-path.py b/man/90-rearrange-path.py
new file mode 100755 (executable)
index 0000000..7537d5e
--- /dev/null
@@ -0,0 +1,40 @@
+#!/usr/bin/env python3
+
+"""
+
+Proof-of-concept systemd environment generator that makes sure that bin dirs
+are always after matching sbin dirs in the path.
+(Changes /sbin:/bin:/foo/bar to /bin:/sbin:/foo/bar.)
+
+This generator shows how to override the configuration possibly created by
+earlier generators. It would be easier to write in bash, but let's have it
+in Python just to prove that we can, and to serve as a template for more
+interesting generators.
+
+"""
+
+import os
+import pathlib
+
+def rearrange_bin_sbin(path):
+    """Make sure any pair of …/bin, …/sbin directories is in this order
+
+    >>> rearrange_bin_sbin('/bin:/sbin:/usr/sbin:/usr/bin')
+    '/bin:/sbin:/usr/bin:/usr/sbin'
+    """
+    items = [pathlib.Path(p) for p in path.split(':')]
+    for i in range(len(items)):
+        if 'sbin' in items[i].parts:
+            ind = items[i].parts.index('sbin')
+            bin = pathlib.Path(*items[i].parts[:ind], 'bin', *items[i].parts[ind+1:])
+            if bin in items[i+1:]:
+                j = i + 1 + items[i+1:].index(bin)
+                items[i], items[j] = items[j], items[i]
+    return ':'.join(p.as_posix() for p in items)
+
+if __name__ == '__main__':
+    path = os.environ['PATH'] # This should be always set.
+                              # If it's not, we'll just crash, we is OK too.
+    new = rearrange_bin_sbin(path)
+    if new != path:
+        print('PATH={}'.format(new))
index 6e835c0..675e017 100644 (file)
 
   <refsynopsisdiv>
     <cmdsynopsis>
-      <command>bootctl <arg choice="opt" rep="repeat">OPTIONS</arg>status</command>
+      <command>bootctl <arg choice="opt" rep="repeat">OPTIONS</arg> status</command>
     </cmdsynopsis>
     <cmdsynopsis>
-      <command>bootctl <arg choice="opt" rep="repeat">OPTIONS</arg>update</command>
+      <command>bootctl <arg choice="opt" rep="repeat">OPTIONS</arg> update</command>
     </cmdsynopsis>
     <cmdsynopsis>
-      <command>bootctl <arg choice="opt" rep="repeat">OPTIONS</arg>install</command>
+      <command>bootctl <arg choice="opt" rep="repeat">OPTIONS</arg> install</command>
     </cmdsynopsis>
     <cmdsynopsis>
-      <command>bootctl <arg choice="opt" rep="repeat">OPTIONS</arg>remove</command>
+      <command>bootctl <arg choice="opt" rep="repeat">OPTIONS</arg> remove</command>
     </cmdsynopsis>
   </refsynopsisdiv>
 
     currently installed versions of the boot loader binaries and
     all current EFI boot variables.</para>
 
-    <para><command>bootctl update</command> updates all installed
-    versions of systemd-boot, if the current version is newer than the
-    version installed in the EFI system partition. This also includes
-    the EFI default/fallback loader at /EFI/BOOT/BOOT*.EFI. A
-    systemd-boot entry in the EFI boot variables is created if there
-    is no current entry. The created entry will be added to the end of
-    the boot order list.</para>
+    <para><command>bootctl update</command> updates all installed versions of systemd-boot, if the current version is
+    newer than the version installed in the EFI system partition. This also includes the EFI default/fallback loader at
+    <filename>/EFI/BOOT/BOOT*.EFI</filename>. A systemd-boot entry in the EFI boot variables is created if there is no
+    current entry. The created entry will be added to the end of the boot order list.</para>
 
-    <para><command>bootctl install</command> installs systemd-boot into
-    the EFI system partition. A copy of systemd-boot will be stored as
-    the EFI default/fallback loader at /EFI/BOOT/BOOT*.EFI. A systemd-boot
-    entry in the EFI boot variables is created and added to the top
-    of the boot order list.</para>
+    <para><command>bootctl install</command> installs systemd-boot into the EFI system partition. A copy of
+    systemd-boot will be stored as the EFI default/fallback loader at <filename>/EFI/BOOT/BOOT*.EFI</filename>. A
+    systemd-boot entry in the EFI boot variables is created and added to the top of the boot order list.</para>
 
     <para><command>bootctl remove</command> removes all installed
     versions of systemd-boot from the EFI system partition, and removes
       <xi:include href="standard-options.xml" xpointer="help" />
       <xi:include href="standard-options.xml" xpointer="version" />
       <varlistentry>
-        <term><option>--path</option></term>
-        <listitem><para>Path to the EFI system partition. The default is /boot.</para></listitem>
+        <term><option>--path=</option></term>
+        <listitem><para>Path to the EFI System Partition (ESP). If not specified, <filename>/efi</filename>,
+        <filename>/boot</filename>, and <filename>/boot/efi</filename> are checked in turn.  It is recommended to mount
+        the ESP to <filename>/boot</filename>, if possible.</para></listitem>
       </varlistentry>
 
       <varlistentry>
   <refsect1>
     <title>See Also</title>
     <para>
-      <ulink url="http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec">Boot loader specification</ulink>
-      <ulink url="http://www.freedesktop.org/wiki/Software/systemd/BootLoaderInterface">Systemd boot loader interface</ulink>
+      <ulink url="https://www.freedesktop.org/wiki/Specifications/BootLoaderSpec">Boot loader specification</ulink>
+      <ulink url="https://www.freedesktop.org/wiki/Software/systemd/BootLoaderInterface">Systemd boot loader interface</ulink>
     </para>
   </refsect1>
 </refentry>
index 9869963..b92c60f 100644 (file)
     identical to the system manager bootup (see above) until it
     reaches <filename>basic.target</filename>. From there, systemd
     approaches the special target <filename>initrd.target</filename>.
+
+    Before any file systems are mounted, it must be determined whether
+    the system will resume from hibernation or proceed with normal boot.
+    This is accomplished by <filename>systemd-hibernate-resume@.service</filename>
+    which must be finished before <filename>local-fs-pre.target</filename>,
+    so no filesystems can be mounted before the check is complete.
+
     When the root device becomes available,
     <filename>initd-root-device.target</filename> is reached.
     If the root device can be mounted at
index 052a330..28b36f0 100644 (file)
 
         <listitem><para>Similar to <command>monitor</command> but
         writes the output in pcap format (for details, see the <ulink
-        url="http://wiki.wireshark.org/Development/LibpcapFileFormat">Libpcap
-        File Format</ulink> description. Make sure to redirect the
-        output to STDOUT to a file. Tools like
+        url="https://wiki.wireshark.org/Development/LibpcapFileFormat">Libpcap
+        File Format</ulink> description). Make sure to redirect
+        standard output to a file. Tools like
         <citerefentry project='die-net'><refentrytitle>wireshark</refentrytitle><manvolnum>1</manvolnum></citerefentry>
-        may be used to dissect and view the generated
+        may be used to dissect and view the resulting
         files.</para></listitem>
       </varlistentry>
 
@@ -472,7 +472,7 @@ o "/org/freedesktop/systemd1/job/42684"</programlisting>
 
     <para>
       <citerefentry project='dbus'><refentrytitle>dbus-daemon</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-      <ulink url="http://freedesktop.org/wiki/Software/dbus">D-Bus</ulink>,
+      <ulink url="https://www.freedesktop.org/wiki/Software/dbus">D-Bus</ulink>,
       <citerefentry><refentrytitle>sd-bus</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
index 4f95680..5f61e05 100644 (file)
       <varlistentry>
         <term><varname>Storage=</varname></term>
 
-        <listitem><para>Controls where to store cores. One of
-        <literal>none</literal>, <literal>external</literal>,
-        <literal>journal</literal>, and <literal>both</literal>. When
-        <literal>none</literal>, the core dumps will be logged but not
-        stored permanently. When <literal>external</literal> (the
-        default), cores will be stored in <filename>/var/lib/systemd/coredump</filename>.
-        When <literal>journal</literal>, cores will be stored in
-        the journal and rotated following normal journal
-        rotation patterns. When <literal>both</literal>, cores
-        will be stored in both locations.</para>
+        <listitem><para>Controls where to store cores. One of <literal>none</literal>,
+        <literal>external</literal>, and <literal>journal</literal>. When
+        <literal>none</literal>, the core dumps will be logged (including the backtrace if
+        possible), but not stored permanently. When <literal>external</literal> (the
+        default), cores will be stored in <filename>/var/lib/systemd/coredump/</filename>.
+        When <literal>journal</literal>, cores will be stored in the journal and rotated
+        following normal journal rotation patterns.</para>
 
         <para>When cores are stored in the journal, they might be
         compressed following journal compression settings, see
index abc245b..ca8156f 100644 (file)
       </varlistentry>
 
       <varlistentry>
+        <term><option>-S</option></term>
+        <term><option>--since</option></term>
+
+        <listitem><para>Only print entries which are since the specified date.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>-U</option></term>
+        <term><option>--until</option></term>
+
+        <listitem><para>Only print entries which are until the specified date.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>-r</option></term>
+        <term><option>--reverse</option></term>
+
+        <listitem><para>Reverse output so that the newest entries are displayed first.
+        </para></listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><option>-F</option> <replaceable>FIELD</replaceable></term>
         <term><option>--field=</option><replaceable>FIELD</replaceable></term>
 
         </para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><option>-q</option></term>
+        <term><option>--quiet</option></term>
+
+        <listitem><para>Suppresses info messages about lack
+        of access to journal files and possible in-flight coredumps.
+        </para></listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
 
         matching specified characteristics. If no command is
         specified, this is the implied default.</para>
 
+        <para>The output is designed to be human readable and contains list contains
+        a table with the following columns:</para>
+        <variablelist>
+          <varlistentry>
+            <term>TIME</term>
+            <listitem><para>The timestamp of the crash, as reported by the kernel.</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>PID</term>
+            <listitem><para>The identifier of the process that crashed.</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>UID</term>
+            <term>GID</term>
+            <listitem><para>The user and group identifiers of the process that crashed.</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>SIGNAL</term>
+            <listitem><para>The signal that caused the process to crash, when applicable.
+            </para></listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>COREFILE</term>
+            <listitem><para>Information whether the coredump was stored, and whether
+            it is still accessible: <literal>none</literal> means the the core was
+            not stored, <literal>-</literal> means that it was not available (for
+            example because the process was not terminated by a signal),
+            <literal>present</literal> means that the core file is accessible by the
+            current user, <literal>journal</literal> means that the core was stored
+            in the <literal>journal</literal>, <literal>truncated</literal> is the
+            same as one of the previous two, but the core was too large and was not
+            stored in its entirety, <literal>error</literal> means that the core file
+            cannot be accessed, most likely because of insufficient permissions, and
+            <literal>missing</literal> means that the core was stored in a file, but
+            this file has since been removed.</para></listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term>EXE</term>
+            <listitem><para>The full path to the executable. For backtraces of scripts
+            this is the name of the interpreter.</para></listitem>
+          </varlistentry>
+        </variablelist>
+
         <para>It's worth noting that different restrictions apply to
         data saved in the journal and core dump files saved in
         <filename>/var/lib/systemd/coredump</filename>, see overview in
       <varlistentry>
         <term><replaceable>MATCH</replaceable></term>
 
-        <listitem><para>General journalctl predicates (see
+        <listitem><para>General journalctl predicate (see
         <citerefentry><refentrytitle>journalctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>).
-        Must contain an equal sign. </para></listitem>
+        Must contain an equals sign (<literal>=</literal>).</para></listitem>
       </varlistentry>
     </variablelist>
   </refsect1>
index 4b8d4aa..17976f3 100644 (file)
       </varlistentry>
 
       <varlistentry>
+        <term><option>tcrypt-veracrypt</option></term>
+
+        <listitem><para>Check for a VeraCrypt volume.  VeraCrypt is a fork of
+        TrueCrypt that is mostly compatible, but uses different, stronger key
+        derivation algorithms that cannot be detected without this flag.
+        Enabling this option could substantially slow down unlocking, because
+        VeraCrypt's key derivation takes much longer than TrueCrypt's.  This
+        option implies <option>tcrypt</option>.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><option>timeout=</option></term>
 
         <listitem><para>Specifies the timeout for querying for a
diff --git a/man/custom-entities.ent.in b/man/custom-entities.ent.in
new file mode 100644 (file)
index 0000000..0257c2a
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!ENTITY MOUNT_PATH @MOUNT_PATH@>
+<!ENTITY UMOUNT_PATH @UMOUNT_PATH@>
+<!ENTITY systemgeneratordir @SYSTEM_GENERATOR_PATH@>
+<!ENTITY usergeneratordir @USER_GENERATOR_PATH@>
+<!ENTITY systemenvgeneratordir @SYSTEM_ENV_GENERATOR_PATH@>
+<!ENTITY userenvgeneratordir @USER_ENV_GENERATOR_PATH@>
index 4bdc167..9a28862 100644 (file)
   <refsect1>
     <title>Negative Trust Anchors</title>
 
-    <para>Negative trust anchors define domains where DNSSEC
-    validation shall be turned off. Negative trust anchor files are
-    found at the same location as positive trust anchor files, and
-    follow the same overriding rules. They are text files with the
-    <filename>.negative</filename> suffix. Empty lines and lines whose
-    first character is <literal>;</literal> are ignored. Each line
-    specifies one domain name where DNSSEC validation shall be
-    disabled on.</para>
+    <para>Negative trust anchors define domains where DNSSEC validation shall be turned
+    off. Negative trust anchor files are found at the same location as positive trust anchor files,
+    and follow the same overriding rules. They are text files with the
+    <filename>.negative</filename> suffix. Empty lines and lines whose first character is
+    <literal>;</literal> are ignored. Each line specifies one domain name which is the root of a DNS
+    subtree where validation shall be disabled.</para>
 
     <para>Negative trust anchors are useful to support private DNS
     subtrees that are not referenced from the Internet DNS hierarchy,
diff --git a/man/environment.d.xml b/man/environment.d.xml
new file mode 100644 (file)
index 0000000..ad9db16
--- /dev/null
@@ -0,0 +1,123 @@
+<?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">
+<!--
+  This file is part of systemd.
+
+  Copyright 2016 Red Hat, Inc.
+  Copyright 2017 Zbigniew Jędrzejewski-Szmek
+
+  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/>.
+-->
+<refentry id="environment.d" conditional='ENABLE_ENVIRONMENT_D'
+    xmlns:xi="http://www.w3.org/2001/XInclude">
+
+  <refentryinfo>
+    <title>environment.d</title>
+    <productname>systemd</productname>
+
+    <authorgroup>
+      <author>
+        <contrib>Developer</contrib>
+        <firstname>Ray</firstname>
+        <surname>Strode</surname>
+        <email>rstrode@redhat.com</email>
+      </author>
+    </authorgroup>
+  </refentryinfo>
+
+  <refmeta>
+    <refentrytitle>environment.d</refentrytitle>
+    <manvolnum>5</manvolnum>
+  </refmeta>
+
+  <refnamediv>
+    <refname>environment.d</refname>
+    <refpurpose>Definition of user session environment</refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <para><filename>~/.config/environment.d/*.conf</filename></para>
+    <para><filename>/etc/environment.d/*.conf</filename></para>
+    <para><filename>/run/environment.d/*.conf</filename></para>
+    <para><filename>/usr/lib/environment.d/*.conf</filename></para>
+    <para><filename>/etc/environment</filename></para>
+  </refsynopsisdiv>
+
+  <refsect1>
+    <title>Description</title>
+
+    <para>The <filename>environment.d</filename> directories contain a list of "global" environment
+    variable assignments for the user environment.
+    <citerefentry><refentrytitle>systemd-environment-d-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+    parses them and updates the environment exported by the systemd user instance to the services it
+    starts.</para>
+
+    <para>It is recommended to use numerical prefixes for file names to simplify ordering.</para>
+
+    <para>For backwards compatibility, a symlink to <filename>/etc/environment</filename> is
+    installed, so this file is also parsed.</para>
+  </refsect1>
+
+  <xi:include href="standard-conf.xml" xpointer="confd" />
+
+  <refsect1>
+    <title>Configuration Format</title>
+
+    <para>The configuration files contain a list of
+    <literal><replaceable>KEY</replaceable>=<replaceable>VALUE</replaceable></literal> environment
+    variable assignments, separated by newlines. The right hand side of these assignments may
+    reference previously defined environment variables, using the <literal>${OTHER_KEY}</literal>
+    and <literal>$OTHER_KEY</literal> format. It is also possible to use
+
+    <literal>${<replaceable>FOO</replaceable>:-<replaceable>DEFAULT_VALUE</replaceable>}</literal>
+    to expand in the same way as <literal>${<replaceable>FOO</replaceable>}</literal> unless the
+    expansion would be empty, in which case it expands to <replaceable>DEFAULT_VALUE</replaceable>,
+    and use
+    <literal>${<replaceable>FOO</replaceable>:+<replaceable>ALTERNATE_VALUE</replaceable>}</literal>
+    to expand to <replaceable>ALTERNATE_VALUE</replaceable> as long as
+    <literal>${<replaceable>FOO</replaceable>}</literal> would have expanded to a non-empty value.
+    No other elements of shell syntax are supported.</para>
+
+    <para>Each<replaceable>KEY</replaceable> must be a valid variable name. Empty lines
+    and lines beginning with the comment character <literal>#</literal> are ignored.</para>
+
+    <refsect2>
+      <title>Example</title>
+      <example>
+        <title>Setup environment to allow access to a program installed in
+        <filename noindex='true'>/opt/foo</filename></title>
+
+        <para><filename>/etc/environment.d/60-foo.conf</filename>:
+        </para>
+        <programlisting>
+        FOO_DEBUG=force-software-gl,log-verbose
+        PATH=/opt/foo/bin:$PATH
+        LD_LIBRARY_PATH=/opt/foo/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
+        XDG_DATA_DIRS=/opt/foo/share:${XDG_DATA_DIRS:-/usr/local/share/:/usr/share/}
+        </programlisting>
+      </example>
+    </refsect2>
+  </refsect1>
+
+  <refsect1>
+    <title>See Also</title>
+    <para>
+      <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-environment-d-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd.environment-generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+    </para>
+  </refsect1>
+
+</refentry>
index 538a592..ab52ccf 100644 (file)
     url="http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html">XDG
     Base Directory Specification</ulink>. Additional locations for
     high-level user resources are defined by <ulink
-    url="http://www.freedesktop.org/wiki/Software/xdg-user-dirs/">xdg-user-dirs</ulink>.</para>
+    url="https://www.freedesktop.org/wiki/Software/xdg-user-dirs/">xdg-user-dirs</ulink>.</para>
 
     <variablelist>
       <varlistentry>
index 60004e9..81bce2d 100644 (file)
     set, and is valid (something other than localhost), then the
     transient hostname is not used.</para>
 
-    <para>Note that the pretty hostname has little restrictions on the
-    characters used, while the static and transient hostnames are
-    limited to the usually accepted characters of Internet domain
-    names.</para>
+    <para>Note that the pretty hostname has little restrictions on the characters and length used, while the static and
+    transient hostnames are limited to the usually accepted characters of Internet domain names, and 64 characters at
+    maximum (the latter being a Linux limitation).</para>
 
     <para>The static hostname is stored in
     <filename>/etc/hostname</filename>, see
         <term><option>--transient</option></term>
         <term><option>--pretty</option></term>
 
-        <listitem><para>If <command>status</command> is used (or no
-        explicit command is given) and one of those fields is given,
-        <command>hostnamectl</command> will print out just this
-        selected hostname.</para>
+        <listitem><para>If <command>status</command> is invoked (or no explicit command is given) and one of these
+        switches is specified, <command>hostnamectl</command> will print out just this selected hostname.</para>
 
-        <para>If used with <command>set-hostname</command>, only the
-        selected hostname(s) will be updated. When more than one of
-        those options is used, all the specified hostnames will be
-        updated. </para></listitem>
+        <para>If used with <command>set-hostname</command>, only the selected hostname(s) will be updated. When more
+        than one of these switches are specified, all the specified hostnames will be updated. </para></listitem>
       </varlistentry>
 
       <xi:include href="user-system-options.xml" xpointer="host" />
       <varlistentry>
         <term><command>set-hostname <replaceable>NAME</replaceable></command></term>
 
-        <listitem><para>Set the system hostname to
-        <replaceable>NAME</replaceable>. By default, this will alter
-        the pretty, the static, and the transient hostname alike;
-        however, if one or more of <option>--static</option>,
-        <option>--transient</option>, <option>--pretty</option> are
-        used, only the selected hostnames are changed. If the pretty
-        hostname is being set, and static or transient are being set
-        as well, the specified hostname will be simplified in regards
-        to the character set used before the latter are updated. This
-        is done by replacing spaces with <literal>-</literal> and
-        removing special characters. This ensures that the pretty and
-        the static hostname are always closely related while still
-        following the validity rules of the specific name. This
-        simplification of the hostname string is not done if only the
-        transient and/or static host names are set, and the pretty
-        host name is left untouched.</para>
+        <listitem><para>Set the system hostname to <replaceable>NAME</replaceable>. By default, this will alter the
+        pretty, the static, and the transient hostname alike; however, if one or more of <option>--static</option>,
+        <option>--transient</option>, <option>--pretty</option> are used, only the selected hostnames are changed. If
+        the pretty hostname is being set, and static or transient are being set as well, the specified hostname will be
+        simplified in regards to the character set used before the latter are updated. This is done by removing special
+        characters and spaces. This ensures that the pretty and the static hostname are always closely related while
+        still following the validity rules of the specific name. This simplification of the hostname string is not done
+        if only the transient and/or static host names are set, and the pretty host name is left untouched.</para>
 
         <para>Pass the empty string <literal></literal> as the
         hostname to reset the selected hostnames to their default
         defined:
         <literal>desktop</literal>,
         <literal>laptop</literal>,
+        <literal>convertible</literal>,
         <literal>server</literal>,
         <literal>tablet</literal>,
         <literal>handset</literal>,
index 2b1e60f..ae5ddb1 100644 (file)
       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>,
-      disables the hwdb file entirely. hwdb files must have the extension
+      disables that hwdb file entirely. hwdb files must have the extension
       <filename>.hwdb</filename>; other extensions are ignored.</para>
 
-      <para>The hwdb file contains data records consisting of matches and
-      associated key-value pairs. Every record in the hwdb starts with one or
-      more match strings, specifying a shell glob to compare the database
-      lookup string against. Multiple match lines are specified in additional
-      consecutive lines. Every match line is compared individually, and they are
-      combined by OR. Every match line must start at the first character of
-      the line.</para>
+      <para>Each hwdb file contains data records consisting of matches and associated
+      key-value pairs. Every record in the hwdb starts with one or more match strings,
+      specifying a shell glob to compare the lookup string against. Multiple match lines
+      are specified in consecutive lines. Every match line is compared individually, and
+      they are combined by OR. Every match line must start at the first character of the
+      line.</para>
 
-      <para>The match lines are followed by one or more key-value pair lines, which
-      are recognized by a leading space character. The key name and value are separated
-      by <literal>=</literal>. An empty line signifies the end
-      of a record. Lines beginning with <literal>#</literal> are ignored.</para>
+      <para>The match lines are followed by one or more key-value pair lines, which are
+      recognized by a leading space character. The key name and value are separated by
+      <literal>=</literal>. An empty line signifies the end of a record. Lines beginning
+      with <literal>#</literal> are ignored.</para>
+
+      <para>In case multiple records match a given lookup string, the key-value pairs
+      from all records are combined. If a key is specified multiple times, the value
+      from the record with the highest priority is used (each key can have only a single
+      value). The priority is higher when the record is in a file that sorts later
+      lexicographically, and in case of records in the same file, later records have
+      higher priority.</para>
 
       <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
-      database in an immutable image.
-      During runtime, only the binary database is used.</para>
+      or alternatively <filename>/usr/lib/udev/hwdb.bin</filename> if you want ship the
+      compiled database in an immutable image.  During runtime, only the binary database
+      is used.</para>
+  </refsect1>
+
+  <refsect1>
+    <title>Examples</title>
+
+    <example>
+      <title>General syntax of hwdb files</title>
+
+      <programlisting># /usr/lib/udev/hwdb.d/example.hwdb
+# Comments can be placed before any records. This is a good spot
+# to describe what that file is used for, what kind of properties
+# it defines, and the ordering convention.
+
+# A record with three matches and one property
+mouse:*:name:*Trackball*:
+mouse:*:name:*trackball*:
+mouse:*:name:*TrackBall*:
+ ID_INPUT_TRACKBALL=1
+
+# A record with a single match and five properties
+mouse:usb:v046dp4041:name:Logitech MX Master:
+ MOUSE_DPI=1000@166
+ MOUSE_WHEEL_CLICK_ANGLE=15
+ MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL=26
+ MOUSE_WHEEL_CLICK_COUNT=24
+ MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL=14
+</programlisting>
+    </example>
+
+    <example>
+      <title>Overriding of properties</title>
+
+      <programlisting># /usr/lib/udev/hwdb.d/60-keyboard.hwdb
+evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pn*
+ KEYBOARD_KEY_a1=help
+ KEYBOARD_KEY_a2=setup
+ KEYBOARD_KEY_a3=battery
+
+evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pn123*
+ KEYBOARD_KEY_a2=wlan
+
+# /etc/udev/hwdb.d/70-keyboard.hwdb
+# disable wlan key on all at keyboards
+evdev:atkbd:*
+ KEYBOARD_KEY_a2=reserved</programlisting>
+
+      <para>If the hwdb consists of those two files, a keyboard with the lookup string
+      <literal>evdev:atkbd:dmi:bvnAcer:bdXXXXX:bd08/05/2010:svnAcer:pn123</literal>
+      will match all three records, and end up with the following properties:</para>
+
+      <programlisting>KEYBOARD_KEY_a1=help
+KEYBOARD_KEY_a2=reserved
+KEYBOARD_KEY_a3=battery</programlisting>
+    </example>
   </refsect1>
 
   <refsect1>
index 2d34596..f7ac8c4 100644 (file)
   <refnamediv>
     <refname>journal-remote.conf</refname>
     <refname>journal-remote.conf.d</refname>
-    <refpurpose>Journal remote service configuration files</refpurpose>
+    <refpurpose>Configuration files for the service accepting remote journal uploads</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
     <para><filename>/etc/systemd/journal-remote.conf</filename></para>
-    <para><filename>/etc/systemd/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>/etc/systemd/journal-remote.conf.d/*.conf</filename></para>
+    <para><filename>/run/systemd/journal-remote.conf.d/*.conf</filename></para>
+    <para><filename>/usr/lib/systemd/journal-remote.conf.d/*.conf</filename></para>
   </refsynopsisdiv>
 
   <refsect1>
     <title>Description</title>
 
-    <para>These files configure various parameters of the systemd-remote-journal
-    application,
-    <citerefentry><refentrytitle>systemd-journal-remote</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
+    <para>These files configure various parameters of
+    <citerefentry><refentrytitle>systemd-journal-remote.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
   </refsect1>
 
   <xi:include href="standard-conf.xml" xpointer="main-conf" />
diff --git a/man/journal-upload.conf.xml b/man/journal-upload.conf.xml
new file mode 100644 (file)
index 0000000..e3be62d
--- /dev/null
@@ -0,0 +1,113 @@
+<?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">
+
+<!--
+  This file is part of systemd.
+
+  Copyright 2016 Zbigniew Jędrzejewski-Szmek
+
+  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/>.
+-->
+
+<refentry id="journal-upload.conf" conditional='HAVE_MICROHTTPD'
+          xmlns:xi="http://www.w3.org/2001/XInclude">
+  <refentryinfo>
+    <title>journal-upload.conf</title>
+    <productname>systemd</productname>
+
+    <authorgroup>
+      <author>
+        <contrib>Monkey with a keyboard</contrib>
+        <firstname>Zbigniew</firstname>
+        <surname>Jędrzejewski-Szmek</surname>
+        <email>zbyszek@in.waw.pl</email>
+      </author>
+    </authorgroup>
+  </refentryinfo>
+
+  <refmeta>
+    <refentrytitle>journal-upload.conf</refentrytitle>
+    <manvolnum>5</manvolnum>
+  </refmeta>
+
+  <refnamediv>
+    <refname>journal-upload.conf</refname>
+    <refname>journal-upload.conf.d</refname>
+    <refpurpose>Configuration files for the journal upload service</refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <para><filename>/etc/systemd/journal-upload.conf</filename></para>
+    <para><filename>/etc/systemd/journal-upload.conf.d/*.conf</filename></para>
+    <para><filename>/run/systemd/journal-upload.conf.d/*.conf</filename></para>
+    <para><filename>/usr/lib/systemd/journal-upload.conf.d/*.conf</filename></para>
+  </refsynopsisdiv>
+
+  <refsect1>
+    <title>Description</title>
+
+    <para>These files configure various parameters of
+    <citerefentry><refentrytitle>systemd-journal-upload.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
+  </refsect1>
+
+  <xi:include href="standard-conf.xml" xpointer="main-conf" />
+
+  <refsect1>
+    <title>Options</title>
+
+    <para>All options are configured in the <literal>[Upload]</literal> section:</para>
+
+    <variablelist>
+      <varlistentry>
+        <term><varname>URL=</varname></term>
+
+        <listitem><para>The URL to upload the journal entries to. See the description
+        of <varname>--url=</varname> option in
+        <citerefentry><refentrytitle>systemd-journal-upload</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+        for the description of possible values.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>ServerKeyFile=</varname></term>
+
+        <listitem><para>SSL key in PEM format.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>ServerCertificateFile=</varname></term>
+
+        <listitem><para>SSL CA certificate in PEM format.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>TrustedCertificateFile=</varname></term>
+
+        <listitem><para>SSL CA certificate.</para></listitem>
+      </varlistentry>
+
+    </variablelist>
+
+  </refsect1>
+
+  <refsect1>
+      <title>See Also</title>
+      <para>
+        <citerefentry><refentrytitle>systemd-journal-upload</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+        <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+        <citerefentry><refentrytitle>systemd-journald.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+      </para>
+  </refsect1>
+
+</refentry>
index e77621d..444b916 100644 (file)
 
             <varlistentry>
               <term>
+                <option>short-full</option>
+              </term>
+              <listitem>
+                <para>is very similar, but shows timestamps in the format the <option>--since=</option> and
+                <option>--until=</option> options accept. Unlike the timestamp information shown in
+                <option>short</option> output mode this mode includes weekday, year and timezone information in the
+                output, and is locale-independent.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>
                 <option>short-iso</option>
               </term>
               <listitem>
 
             <varlistentry>
               <term>
-                <option>short-precise</option>
+                <option>short-iso-precise</option>
               </term>
               <listitem>
-                <para>is very similar, but shows timestamps with full
+                <para>as for <option>short-iso</option> but includes full
                 microsecond precision.</para>
               </listitem>
             </varlistentry>
 
             <varlistentry>
               <term>
+                <option>short-precise</option>
+              </term>
+              <listitem>
+                <para>is very similar, but shows classic syslog timestamps
+                with full microsecond precision.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term>
                 <option>short-monotonic</option>
               </term>
               <listitem>
                 <para>serializes the journal into a binary (but mostly
                 text-based) stream suitable for backups and network
                 transfer (see
-                <ulink url="http://www.freedesktop.org/wiki/Software/systemd/export">Journal Export Format</ulink>
-                for more information).</para>
+                <ulink url="https://www.freedesktop.org/wiki/Software/systemd/export">Journal Export Format</ulink>
+                for more information). To import the binary stream back
+                into native journald format use
+                <citerefentry><refentrytitle>systemd-journal-remote</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
               </listitem>
             </varlistentry>
 
               <listitem>
                 <para>formats entries as JSON data structures, one per
                 line (see
-                <ulink url="http://www.freedesktop.org/wiki/Software/systemd/json">Journal JSON Format</ulink>
+                <ulink url="https://www.freedesktop.org/wiki/Software/systemd/json">Journal JSON Format</ulink>
                 for more information).</para>
               </listitem>
             </varlistentry>
         manuals. Note that help texts are not available for all
         messages, but only for selected ones. For more information on
         the message catalog, please refer to the
-        <ulink url="http://www.freedesktop.org/wiki/Software/systemd/catalog">Message Catalog Developer Documentation</ulink>.</para>
+        <ulink url="https://www.freedesktop.org/wiki/Software/systemd/catalog">Message Catalog Developer Documentation</ulink>.</para>
 
         <para>Note: when attaching <command>journalctl</command>
         output to bug reports, please do <emphasis>not</emphasis> use
         <term><option>--quiet</option></term>
 
         <listitem><para>Suppresses all info messages
-        (i.e. "-- Logs begin at ...", "-- Reboot --"),
+        (i.e. "-- Logs begin at ", "-- Reboot --"),
         any warning messages regarding
         inaccessible system journals when run as a normal
         user.</para></listitem>
 
         <listitem><para>The cursor is shown after the last entry after
         two dashes:</para>
-        <programlisting>-- cursor: s=0639...</programlisting>
+        <programlisting>-- cursor: s=0639</programlisting>
         <para>The format of the cursor is private
         and subject to change.</para></listitem>
       </varlistentry>
         <term><option>-U</option></term>
         <term><option>--until=</option></term>
 
-        <listitem><para>Start showing entries on or newer than the
-        specified date, or on or older than the specified date,
-        respectively. Date specifications should be of the format
-        <literal>2012-10-30 18:17:16</literal>.  If the time part is
-        omitted, <literal>00:00:00</literal> is assumed.  If only the
-        seconds component is omitted, <literal>:00</literal> is
-        assumed. If the date component is omitted, the current day is
-        assumed. Alternatively the strings
-        <literal>yesterday</literal>, <literal>today</literal>,
-        <literal>tomorrow</literal> are understood, which refer to
-        00:00:00 of the day before the current day, the current day,
-        or the day after the current day,
-        respectively. <literal>now</literal> refers to the current
-        time. Finally, relative times may be specified, prefixed with
-        <literal>-</literal> or <literal>+</literal>, referring to
-        times before or after the current time, respectively. For complete
-        time and date specification, see
-        <citerefentry><refentrytitle>systemd.time</refentrytitle><manvolnum>7</manvolnum></citerefentry>.
+        <listitem><para>Start showing entries on or newer than the specified date, or on or older than the specified
+        date, respectively. Date specifications should be of the format <literal>2012-10-30 18:17:16</literal>.  If the
+        time part is omitted, <literal>00:00:00</literal> is assumed.  If only the seconds component is omitted,
+        <literal>:00</literal> is assumed. If the date component is omitted, the current day is assumed. Alternatively
+        the strings <literal>yesterday</literal>, <literal>today</literal>, <literal>tomorrow</literal> are understood,
+        which refer to 00:00:00 of the day before the current day, the current day, or the day after the current day,
+        respectively. <literal>now</literal> refers to the current time. Finally, relative times may be specified,
+        prefixed with <literal>-</literal> or <literal>+</literal>, referring to times before or after the current
+        time, respectively. For complete time and date specification, see
+        <citerefentry><refentrytitle>systemd.time</refentrytitle><manvolnum>7</manvolnum></citerefentry>. Note that
+        <option>--output=short-full</option> prints timestamps that follow precisely this format.
         </para>
         </listitem>
       </varlistentry>
         <term><option>--root=<replaceable>ROOT</replaceable></option></term>
 
         <listitem><para>Takes a directory path as an argument. If
-        specified, journalctl will operate on catalog file hierarchy
+        specified, journalctl will operate on journal directories and catalog file hierarchy
         underneath the specified directory instead of the root
         directory (e.g. <option>--update-catalog</option> will create
-        <filename><replaceable>ROOT</replaceable>/var/lib/systemd/catalog/database</filename>).
+        <filename><replaceable>ROOT</replaceable>/var/lib/systemd/catalog/database</filename>,
+        and journal files under <filename><replaceable>ROOT</replaceable>/run/journal</filename>
+        or <filename><replaceable>ROOT</replaceable>/var/log/journal</filename> will be displayed).
         </para></listitem>
       </varlistentry>
 
         a new 128-bit ID suitable for identifying messages. This is
         intended for usage by developers who need a new identifier for
         a new message they introduce and want to make
-        recognizable. This will print the new ID in three different
+        recognizable. This will print the new ID in four different
         formats which can be copied into source code or similar.
         </para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><option>--list-catalog
-        <optional><replaceable>128-bit-ID...</replaceable></optional>
+        <optional><replaceable>128-bit-ID</replaceable></optional>
         </option></term>
 
         <listitem><para>List the contents of the message catalog as a
 
       <varlistentry>
         <term><option>--dump-catalog
-        <optional><replaceable>128-bit-ID...</replaceable></optional>
+        <optional><replaceable>128-bit-ID</replaceable></optional>
         </option></term>
 
         <listitem><para>Show the contents of the message catalog, with
       <citerefentry><refentrytitle>coredumpctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.journal-fields</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>journald.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemd.time</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+      <citerefentry><refentrytitle>systemd.time</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-journal-remote</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-journal-upload</refentrytitle><manvolnum>8</manvolnum></citerefentry>
     </para>
   </refsect1>
 </refentry>
index fef4fde..209d857 100644 (file)
       <varlistentry>
         <term><varname>SplitMode=</varname></term>
 
-        <listitem><para>Controls whether to split up journal files per user. Split-up journal files are primarily
-        useful for access control: on UNIX/Linux access control is managed per file, and the journal daemon will assign
-        users read access to their journal files. This setting takes one of <literal>uid</literal>,
-        <literal>login</literal> or <literal>none</literal>. If <literal>uid</literal>, all regular users will get each
-        their own journal files regardless of whether their processes possess login sessions or not, however system
-        users will log into the system journal. If <literal>login</literal>, actually logged-in users will get each
-        their own journal files, but users without login session and system users will log into the system
-        journal. Note that in this mode, user code running outside of any login session will log into the system log
-        instead of the split-out user logs. Most importantly, this means that information about core dumps of user
-        processes collected via the
-        <citerefentry><refentrytitle>systemd-coredump</refentrytitle><manvolnum>8</manvolnum></citerefentry> subsystem
-        will end up in the system logs instead of the user logs, and thus not be accessible to the owning users. If
-        <literal>none</literal>, journal files are not split up by user and all messages are instead stored in the
-        single system journal. In this mode unprivileged users generally do not have access to their own log data. Note
-        that splitting up journal files by user is only available for journals stored persistently. If journals are
-        stored on volatile storage (see above), only a single journal file for all user IDs is kept. Defaults to
-        <literal>uid</literal>.</para></listitem>
+        <listitem><para>Controls whether to split up journal files per user, either <literal>uid</literal> or
+        <literal>none</literal>. Split journal files are primarily useful for access control: on UNIX/Linux access
+        control is managed per file, and the journal daemon will assign users read access to their journal files. If
+        <literal>uid</literal>, all regular users will each get their own journal files, and system users will log to
+        the system journal. If <literal>none</literal>, journal files are not split up by user and all messages are
+        instead stored in the single system journal. In this mode unprivileged users generally do not have access to
+        their own log data. Note that splitting up journal files by user is only available for journals stored
+        persistently. If journals are stored on volatile storage (see <varname>Storage=</varname> above), only a single
+        journal file is used. Defaults to <literal>uid</literal>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         rotated journal files are kept as history.</para>
 
         <para>Specify values in bytes or use K, M, G, T, P, E as
-        units for the specified sizes (equal to 1024, 1024², ... bytes).
+        units for the specified sizes (equal to 1024, 1024²,  bytes).
         Note that size limits are enforced synchronously when journal
         files are extended, and no explicit rotation step triggered by
         time is needed.</para>
         <term><varname>ForwardToConsole=</varname></term>
         <term><varname>ForwardToWall=</varname></term>
 
-        <listitem><para>Control whether log messages received by the
-        journal daemon shall be forwarded to a traditional syslog
-        daemon, to the kernel log buffer (kmsg), to the system
-        console, or sent as wall messages to all logged-in users.
-        These options take boolean arguments. If forwarding to syslog
-        is enabled but nothing reads messages from the socket,
-        forwarding to syslog has no effect. By default, only
-        forwarding to wall is enabled. These settings may be
-        overridden at boot time with the kernel command line options
-        <literal>systemd.journald.forward_to_syslog=</literal>,
-        <literal>systemd.journald.forward_to_kmsg=</literal>,
-        <literal>systemd.journald.forward_to_console=</literal>, and
-        <literal>systemd.journald.forward_to_wall=</literal>. When
-        forwarding to the console, the TTY to log to can be changed
-        with <varname>TTYPath=</varname>, described
-        below.</para></listitem>
+        <listitem><para>Control whether log messages received by the journal daemon shall
+        be forwarded to a traditional syslog daemon, to the kernel log buffer (kmsg), to
+        the system console, or sent as wall messages to all logged-in users.  These
+        options take boolean arguments. If forwarding to syslog is enabled but nothing
+        reads messages from the socket, forwarding to syslog has no effect. By default,
+        only forwarding to wall is enabled. These settings may be overridden at boot time
+        with the kernel command line options
+        <literal>systemd.journald.forward_to_syslog</literal>,
+        <literal>systemd.journald.forward_to_kmsg</literal>,
+        <literal>systemd.journald.forward_to_console</literal>, and
+        <literal>systemd.journald.forward_to_wall</literal>. If the option name is
+        specified without <literal>=</literal> and the following argument, true is
+        assumed. Otherwise, the argument is parsed as a boolean. When forwarding to the
+        console, the TTY to log to can be changed with <varname>TTYPath=</varname>,
+        described below.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <literal>notice</literal> for <varname>MaxLevelKMsg=</varname>,
         <literal>info</literal> for <varname>MaxLevelConsole=</varname>,
         and <literal>emerg</literal> for
-        <varname>MaxLevelWall=</varname>.</para></listitem>
+        <varname>MaxLevelWall=</varname>. These settings may be
+        overridden at boot time with the kernel command line options
+        <literal>systemd.journald.max_level_store=</literal>,
+        <literal>systemd.journald.max_level_syslog=</literal>,
+        <literal>systemd.journald.max_level_kmsg=</literal>,
+        <literal>systemd.journald.max_level_console=</literal>,
+        <literal>systemd.journald.max_level_wall=</literal>.</para>
+        </listitem>
       </varlistentry>
 
       <varlistentry>
index 3ecc969..00fb6f6 100644 (file)
@@ -59,8 +59,8 @@
     kernel command line arguments.</para>
 
     <para>For command line parameters understood by the kernel, please
-    see <ulink
-    url="https://www.kernel.org/doc/Documentation/kernel-parameters.txt"><filename>kernel-parameters.txt</filename></ulink>
+    see
+    <ulink url="https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html"><filename>kernel-parameters.html</filename></ulink>
     and
     <citerefentry project='man-pages'><refentrytitle>bootparam</refentrytitle><manvolnum>7</manvolnum></citerefentry>.</para>
 
       <varlistentry>
         <term><varname>systemd.unit=</varname></term>
         <term><varname>rd.systemd.unit=</varname></term>
-        <term><varname>systemd.dump_core=</varname></term>
-        <term><varname>systemd.crash_chvt=</varname></term>
-        <term><varname>systemd.crash_shell=</varname></term>
-        <term><varname>systemd.crash_reboot=</varname></term>
-        <term><varname>systemd.confirm_spawn=</varname></term>
-        <term><varname>systemd.show_status=</varname></term>
+        <term><varname>systemd.dump_core</varname></term>
+        <term><varname>systemd.crash_chvt</varname></term>
+        <term><varname>systemd.crash_shell</varname></term>
+        <term><varname>systemd.crash_reboot</varname></term>
+        <term><varname>systemd.confirm_spawn</varname></term>
+        <term><varname>systemd.show_status</varname></term>
         <term><varname>systemd.log_target=</varname></term>
         <term><varname>systemd.log_level=</varname></term>
-        <term><varname>systemd.log_color=</varname></term>
         <term><varname>systemd.log_location=</varname></term>
+        <term><varname>systemd.log_color</varname></term>
         <term><varname>systemd.default_standard_output=</varname></term>
         <term><varname>systemd.default_standard_error=</varname></term>
         <term><varname>systemd.setenv=</varname></term>
         <term><varname>systemd.machine_id=</varname></term>
+        <term><varname>systemd.unified_cgroup_hierarchy</varname></term>
+        <term><varname>systemd.legacy_systemd_cgroup_controller</varname></term>
         <listitem>
           <para>Parameters understood by the system and service
           manager to control system behavior. For details, see
       <varlistentry>
         <term><varname>systemd.mask=</varname></term>
         <term><varname>systemd.wants=</varname></term>
-        <term><varname>systemd.debug-shell</varname></term>
+        <term><varname>systemd.debug_shell</varname></term>
         <listitem>
           <para>Additional parameters understood by
           <citerefentry><refentrytitle>systemd-debug-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       </varlistentry>
 
       <varlistentry>
+        <term><varname>systemd.volatile=</varname></term>
+        <listitem>
+          <para>This parameter controls whether the system shall boot up in volatile mode. Takes a boolean argument, or
+          the special value <literal>state</literal>. If false (the default), normal boot mode is selected, the root
+          directory and <filename>/var</filename> are mounted as specified on the kernel command line or
+          <filename>/etc/fstab</filename>, or otherwise configured. If true, full state-less boot mode is selected. In
+          this case the root directory is mounted as volatile memory file system (<literal>tmpfs</literal>), and only
+          <filename>/usr</filename> is mounted from the file system configured as root device, in read-only mode. This
+          enables fully state-less boots were the vendor-supplied OS is used as shipped, with only default
+          configuration and no stored state in effect, as <filename>/etc</filename> and <filename>/var</filename> (as
+          well as all other resources shipped in the root file system) are reset at boot and lost on shutdown. If this
+          setting is set to <literal>state</literal> the root file system is mounted as usual, however
+          <filename>/var</filename> is mounted as a volatile memory file system (<literal>tmpfs</literal>), so that the
+          system boots up with the normal configuration applied, but all state reset at boot and lost at shutdown. For details,
+          see
+          <citerefentry><refentrytitle>systemd-volatile-root.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+          and
+          <citerefentry><refentrytitle>systemd-fstab-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><varname>quiet</varname></term>
         <listitem>
           <para>Parameter understood by both the kernel and the system
 
       <varlistentry>
         <term><varname>vconsole.keymap=</varname></term>
-        <term><varname>vconsole.keymap.toggle=</varname></term>
+        <term><varname>vconsole.keymap_toggle=</varname></term>
         <term><varname>vconsole.font=</varname></term>
-        <term><varname>vconsole.font.map=</varname></term>
-        <term><varname>vconsole.font.unimap=</varname></term>
+        <term><varname>vconsole.font_map=</varname></term>
+        <term><varname>vconsole.font_unimap=</varname></term>
 
         <listitem>
-          <para>Parameters understood by the virtual console setup
-          logic. For details, see
-          <citerefentry><refentrytitle>systemd-vconsole-setup.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
+          <para>Parameters understood by the virtual console setup logic. For details, see
+          <citerefentry><refentrytitle>vconsole.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
         </listitem>
       </varlistentry>
 
       <varlistentry>
-        <term><varname>udev.log-priority=</varname></term>
-        <term><varname>rd.udev.log-priority=</varname></term>
-        <term><varname>udev.children-max=</varname></term>
-        <term><varname>rd.udev.children-max=</varname></term>
-        <term><varname>udev.exec-delay=</varname></term>
-        <term><varname>rd.udev.exec-delay=</varname></term>
-        <term><varname>udev.event-timeout=</varname></term>
-        <term><varname>rd.udev.event-timeout=</varname></term>
+        <term><varname>udev.log_priority=</varname></term>
+        <term><varname>rd.udev.log_priority=</varname></term>
+        <term><varname>udev.children_max=</varname></term>
+        <term><varname>rd.udev.children_max=</varname></term>
+        <term><varname>udev.exec_delay=</varname></term>
+        <term><varname>rd.udev.exec_delay=</varname></term>
+        <term><varname>udev.event_timeout=</varname></term>
+        <term><varname>rd.udev.event_timeout=</varname></term>
         <term><varname>net.ifnames=</varname></term>
 
         <listitem>
       </varlistentry>
 
       <varlistentry>
+        <term><varname>roothash=</varname></term>
+        <term><varname>systemd.verity=</varname></term>
+        <term><varname>rd.systemd.verity=</varname></term>
+        <term><varname>systemd.verity_root_data=</varname></term>
+        <term><varname>systemd.verity_root_hash=</varname></term>
+        <listitem>
+          <para>Configures the integrity protection root hash for the root file system, and other related
+          parameters. For details, see
+          <citerefentry><refentrytitle>systemd-veritysetup-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><varname>systemd.gpt_auto=</varname></term>
         <term><varname>rd.systemd.gpt_auto=</varname></term>
 
       </varlistentry>
 
       <varlistentry>
-        <term><varname>modules-load=</varname></term>
-        <term><varname>rd.modules-load=</varname></term>
+        <term><varname>modules_load=</varname></term>
+        <term><varname>rd.modules_load=</varname></term>
 
         <listitem>
           <para>Load a specific kernel module early at boot. For
           <citerefentry><refentrytitle>systemd-hibernate-resume-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
         </listitem>
       </varlistentry>
+
+      <varlistentry>
+        <term><varname>systemd.firstboot=</varname></term>
+
+        <listitem><para>Takes a boolean argument, defaults to on. If off,
+        <citerefentry><refentrytitle>systemd-firstboot.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+        will not query the user for basic system settings, even if the system boots up for the first time and the
+        relevant settings are not initialized yet.</para></listitem>
+      </varlistentry>
     </variablelist>
 
   </refsect1>
         <citerefentry><refentrytitle>systemd-udevd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
         <citerefentry project='die-net'><refentrytitle>plymouth</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
         <citerefentry><refentrytitle>systemd-cryptsetup-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+        <citerefentry><refentrytitle>systemd-veritysetup-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
         <citerefentry><refentrytitle>systemd-fstab-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
         <citerefentry><refentrytitle>systemd-gpt-auto-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+        <citerefentry><refentrytitle>systemd-volatile-root.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
         <citerefentry><refentrytitle>systemd-modules-load.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
         <citerefentry><refentrytitle>systemd-backlight@.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
         <citerefentry><refentrytitle>systemd-rfkill.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-        <citerefentry><refentrytitle>systemd-hibernate-resume-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+        <citerefentry><refentrytitle>systemd-hibernate-resume-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+        <citerefentry><refentrytitle>systemd-firstboot.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
       </para>
   </refsect1>
 
index d7e27de..94b6b11 100644 (file)
     in <filename>/usr/lib/kernel/install.d/</filename>. This can be used to override a system-supplied
     executables with a local file if needed; a symbolic link in <filename>/etc/kernel/install.d/</filename>
     with the same name as an executable in <filename>/usr/lib/kernel/install.d/</filename>,
-    pointing to /dev/null, disables the executable entirely. Executables must have the
+    pointing to <filename>/dev/null</filename>, disables the executable entirely. Executables must have the
     extension <literal>.install</literal>; other extensions are ignored.</para>
 
+    <para>An executable should return <constant>0</constant> on success. It may also
+    return <constant>77</constant> to cause the whole operation to terminate
+    (executables later in lexical order will be skipped).</para>
   </refsect1>
 
   <refsect1>
         <listitem>
           <para><command>kernel-install</command> creates the directory
           <filename>/boot/<replaceable>MACHINE-ID</replaceable>/<replaceable>KERNEL-VERSION</replaceable>/</filename>
-          and calls every executable
+          and calls executables from
           <filename>/usr/lib/kernel/install.d/*.install</filename> and
           <filename>/etc/kernel/install.d/*.install</filename> with
           the arguments
-          <programlisting>add <replaceable>KERNEL-VERSION</replaceable> <filename>/boot/<replaceable>MACHINE-ID</replaceable>/<replaceable>KERNEL-VERSION</replaceable>/</filename></programlisting>
+          <programlisting>add <replaceable>KERNEL-VERSION</replaceable> \
+    <filename>/boot/<replaceable>MACHINE-ID</replaceable>/<replaceable>KERNEL-VERSION</replaceable>/</filename> <replaceable>KERNEL-IMAGE</replaceable></programlisting>
           </para>
 
           <para>The kernel-install plugin <filename>50-depmod.install</filename> runs depmod for the <replaceable>KERNEL-VERSION</replaceable>.</para>
       <varlistentry>
         <term><command>remove <replaceable>KERNEL-VERSION</replaceable></command></term>
         <listitem>
-          <para>Calls every executable <filename>/usr/lib/kernel/install.d/*.install</filename>
+          <para>Calls executables from <filename>/usr/lib/kernel/install.d/*.install</filename>
           and <filename>/etc/kernel/install.d/*.install</filename> with the arguments
           <programlisting>remove <replaceable>KERNEL-VERSION</replaceable> <filename>/boot/<replaceable>MACHINE-ID</replaceable>/<replaceable>KERNEL-VERSION</replaceable>/</filename></programlisting>
           </para>
 
   <refsect1>
     <title>Exit status</title>
-    <para>If every executable returns with 0, 0 is returned, a non-zero failure code otherwise.</para>
+    <para>If every executable returns 0 or 77, 0 is returned, and a non-zero failure code otherwise.</para>
   </refsect1>
 
   <refsect1>
     <para>
       <citerefentry><refentrytitle>machine-id</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>os-release</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
-      <ulink url="http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec">Boot loader specification</ulink>
+      <ulink url="https://www.freedesktop.org/wiki/Specifications/BootLoaderSpec">Boot loader specification</ulink>
     </para>
   </refsect1>
 
index 0fb4d7f..396481c 100644 (file)
@@ -3,27 +3,34 @@
                  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
 
 <refsect1>
-        <title>Environment</title>
-
-        <variablelist class='environment-variables'>
-                <varlistentry id='pager'>
-                        <term><varname>$SYSTEMD_PAGER</varname></term>
-
-                        <listitem><para>Pager to use when
-                        <option>--no-pager</option> is not given;
-                        overrides <varname>$PAGER</varname>.  Setting
-                        this to an empty string or the value
-                        <literal>cat</literal> is equivalent to passing
-                        <option>--no-pager</option>.</para></listitem>
-                </varlistentry>
-
-                <varlistentry id='less'>
-                        <term><varname>$SYSTEMD_LESS</varname></term>
-
-                        <listitem><para>Override the default
-                        options passed to
-                        <command>less</command>
-                        (<literal>FRSXMK</literal>).</para></listitem>
-                </varlistentry>
-        </variablelist>
+  <title>Environment</title>
+
+  <variablelist class='environment-variables'>
+    <varlistentry id='pager'>
+      <term><varname>$SYSTEMD_PAGER</varname></term>
+
+      <listitem><para>Pager to use when <option>--no-pager</option> is not given; overrides
+      <varname>$PAGER</varname>. If neither <varname>$SYSTEMD_PAGER</varname> nor <varname>$PAGER</varname> are set, a
+      set of well-known pager implementations are tried in turn, including
+      <citerefentry project='man-pages'><refentrytitle>less</refentrytitle><manvolnum>1</manvolnum></citerefentry> and
+      <citerefentry project='man-pages'><refentrytitle>more</refentrytitle><manvolnum>1</manvolnum></citerefentry>, until one is found. If
+      no pager implementation is discovered no pager is invoked. Setting this environment variable to an empty string
+      or the value <literal>cat</literal> is equivalent to passing <option>--no-pager</option>.</para></listitem>
+    </varlistentry>
+
+    <varlistentry id='less'>
+      <term><varname>$SYSTEMD_LESS</varname></term>
+
+      <listitem><para>Override the options passed to <command>less</command> (by default
+      <literal>FRSXMK</literal>).</para></listitem>
+    </varlistentry>
+
+    <varlistentry id='lesscharset'>
+      <term><varname>$SYSTEMD_LESSCHARSET</varname></term>
+
+      <listitem><para>Override the charset passed to <command>less</command> (by default <literal>utf-8</literal>, if
+      the invoking terminal is determined to be UTF-8 compatible).</para></listitem>
+    </varlistentry>
+
+    </variablelist>
 </refsect1>
index 2fe7311..1405dda 100644 (file)
     might be checked for locale configuration as well, however only as
     fallback.</para>
 
-    <para><citerefentry project='man-pages'><refentrytitle>localectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+    <para><filename>/etc/vconsole.conf</filename> is usually created and updated
+    using
+    <citerefentry><refentrytitle>systemd-localed.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
+    <citerefentry project='man-pages'><refentrytitle>localectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
     may be used to alter the settings in this file during runtime from
     the command line. Use
     <citerefentry><refentrytitle>systemd-firstboot</refentrytitle><manvolnum>1</manvolnum></citerefentry>
-    to initialize them on mounted (but not booted) system
-    images.</para>
+    to initialize them on mounted (but not booted) system images.</para>
   </refsect1>
 
   <refsect1>
index 8d2becb..7da12c2 100644 (file)
       </varlistentry>
 
       <varlistentry>
-        <term><command>set-locale LOCALE...</command></term>
+        <term><command>set-locale LOCALE</command></term>
 
         <listitem><para>Set the system locale. This takes one or more
         assignments such as "LANG=de_DE.utf8",
       <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-localed.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-firstboot</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>mkinitrd</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+      <citerefentry project='die-net'><refentrytitle>mkinitrd</refentrytitle><manvolnum>8</manvolnum></citerefentry>
     </para>
   </refsect1>
 
index fb51740..534a0d9 100644 (file)
       </varlistentry>
 
       <varlistentry>
-        <term><command>session-status</command> <optional><replaceable>ID</replaceable>...</optional></term>
+        <term><command>session-status</command> <optional><replaceable>ID</replaceable></optional></term>
 
         <listitem><para>Show terse runtime status information about
         one or more sessions, followed by the most recent log data
       </varlistentry>
 
       <varlistentry>
-        <term><command>show-session</command> <optional><replaceable>ID</replaceable>...</optional></term>
+        <term><command>show-session</command> <optional><replaceable>ID</replaceable></optional></term>
 
         <listitem><para>Show properties of one or more sessions or the
         manager itself. If no argument is specified, properties of the
       </varlistentry>
 
       <varlistentry>
-        <term><command>lock-session</command> <optional><replaceable>ID</replaceable>...</optional></term>
-        <term><command>unlock-session</command> <optional><replaceable>ID</replaceable>...</optional></term>
+        <term><command>lock-session</command> <optional><replaceable>ID</replaceable></optional></term>
+        <term><command>unlock-session</command> <optional><replaceable>ID</replaceable></optional></term>
 
         <listitem><para>Activates/deactivates the screen lock on one
         or more sessions, if the session supports it. Takes one or
       </varlistentry>
 
       <varlistentry>
-        <term><command>terminate-session</command> <replaceable>ID</replaceable>...</term>
+        <term><command>terminate-session</command> <replaceable>ID</replaceable></term>
 
         <listitem><para>Terminates a session. This kills all processes
         of the session and deallocates all resources attached to the
       </varlistentry>
 
       <varlistentry>
-        <term><command>kill-session</command> <replaceable>ID</replaceable>...</term>
+        <term><command>kill-session</command> <replaceable>ID</replaceable></term>
 
         <listitem><para>Send a signal to one or more processes of the
         session. Use <option>--kill-who=</option> to select which
       </varlistentry>
 
       <varlistentry>
-        <term><command>user-status</command> <optional><replaceable>USER</replaceable>...</optional></term>
+        <term><command>user-status</command> <optional><replaceable>USER</replaceable></optional></term>
 
         <listitem><para>Show terse runtime status information about
         one or more logged in users, followed by the most recent log
       </varlistentry>
 
       <varlistentry>
-        <term><command>show-user</command> <optional><replaceable>USER</replaceable>...</optional></term>
+        <term><command>show-user</command> <optional><replaceable>USER</replaceable></optional></term>
 
         <listitem><para>Show properties of one or more users or the
         manager itself. If no argument is specified, properties of the
       </varlistentry>
 
       <varlistentry>
-        <term><command>enable-linger</command> <optional><replaceable>USER</replaceable>...</optional></term>
-        <term><command>disable-linger</command> <optional><replaceable>USER</replaceable>...</optional></term>
+        <term><command>enable-linger</command> <optional><replaceable>USER</replaceable></optional></term>
+        <term><command>disable-linger</command> <optional><replaceable>USER</replaceable></optional></term>
 
         <listitem><para>Enable/disable user lingering for one or more
         users. If enabled for a specific user, a user manager is
       </varlistentry>
 
       <varlistentry>
-        <term><command>terminate-user</command> <replaceable>USER</replaceable>...</term>
+        <term><command>terminate-user</command> <replaceable>USER</replaceable></term>
 
         <listitem><para>Terminates all sessions of a user. This kills
         all processes of all sessions of the user and deallocates all
       </varlistentry>
 
       <varlistentry>
-        <term><command>kill-user</command> <replaceable>USER</replaceable>...</term>
+        <term><command>kill-user</command> <replaceable>USER</replaceable></term>
 
         <listitem><para>Send a signal to all processes of a user. Use
         <option>--signal=</option> to select the signal to send.
       </varlistentry>
 
       <varlistentry>
-        <term><command>seat-status</command> <optional><replaceable>NAME</replaceable>...</optional></term>
+        <term><command>seat-status</command> <optional><replaceable>NAME</replaceable></optional></term>
 
         <listitem><para>Show terse runtime status information about
         one or more seats. Takes one or more seat names as parameters.
       </varlistentry>
 
       <varlistentry>
-        <term><command>show-seat</command> <optional><replaceable>NAME</replaceable>...</optional></term>
+        <term><command>show-seat</command> <optional><replaceable>NAME</replaceable></optional></term>
 
         <listitem><para>Show properties of one or more seats or the
         manager itself. If no argument is specified, properties of the
       </varlistentry>
 
       <varlistentry>
-        <term><command>attach</command> <replaceable>NAME</replaceable> <replaceable>DEVICE</replaceable>...</term>
+        <term><command>attach</command> <replaceable>NAME</replaceable> <replaceable>DEVICE</replaceable></term>
 
         <listitem><para>Persistently attach one or more devices to a
         seat. The devices should be specified via device paths in the
       </varlistentry>
 
       <varlistentry>
-        <term><command>terminate-seat</command> <replaceable>NAME</replaceable>...</term>
+        <term><command>terminate-seat</command> <replaceable>NAME</replaceable></term>
 
         <listitem><para>Terminates all sessions on a seat. This kills
         all processes of all sessions on the seat and deallocates all
@@ -426,9 +426,9 @@ fatima (1005)
         Sessions: 5 *3
             Unit: user-1005.slice
                   ├─user@1005.service
-                    ...
+                    …
                   ├─session-3.scope
-                    ...
+                    …
                   └─session-5.scope
                     ├─3473 login -- fatima
                     └─3515 -zsh
index adba5a4..16f51af 100644 (file)
         <term><varname>HandleLidSwitch=</varname></term>
         <term><varname>HandleLidSwitchDocked=</varname></term>
 
-        <listitem><para>Controls whether logind shall handle the
+        <listitem><para>Controls how logind shall handle the
         system power and sleep keys and the lid switch to trigger
         actions such as system power-off or suspend. Can be one of
         <literal>ignore</literal>,
         docking station, or if more than one display is connected, the
         action specified by <varname>HandleLidSwitchDocked=</varname>
         occurs; otherwise the <varname>HandleLidSwitch=</varname>
-        action occurs.</para></listitem>
+        action occurs.</para>
+
+        <para>A different application may disable logind's handling of system power and
+        sleep keys and the lid switch by taking a low-level inhibitor lock
+        (<literal>handle-power-key</literal>, <literal>handle-suspend-key</literal>,
+        <literal>handle-hibernate-key</literal>, <literal>handle-lid-switch</literal>).
+        This is most commonly used by graphical desktop environments
+        to take over suspend and hibernation handling, and to use their own configuration
+        mechanisms. If a low-level inhibitor lock is taken, logind will not take any
+        action when that key or switch is triggered and the <varname>Handle*=</varname>
+        settings are irrelevant.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>HibernateKeyIgnoreInhibited=</varname></term>
         <term><varname>LidSwitchIgnoreInhibited=</varname></term>
 
-        <listitem><para>Controls whether actions triggered by the
-        power and sleep keys and the lid switch are subject to
-        inhibitor locks. These settings take boolean arguments. If
-        <literal>no</literal>, the inhibitor locks taken by
-        applications in order to block the requested operation are
-        respected. If <literal>yes</literal>, the requested operation
-        is executed in any case.
+        <listitem><para>Controls whether actions that <command>systemd-logind</command>
+        takes when the power and sleep keys and the lid switch are triggered are subject
+        to high-level inhibitor locks ("shutdown", "sleep", "idle"). Low level inhibitor
+        locks (<literal>handle-power-key</literal>, <literal>handle-suspend-key</literal>,
+        <literal>handle-hibernate-key</literal>, <literal>handle-lid-switch</literal>),
+        are always honored, irrespective of this setting.</para>
+
+        <para>These settings take boolean arguments. If <literal>no</literal>, the
+        inhibitor locks taken by applications are respected. If <literal>yes</literal>,
+        "shutdown", "sleep", and "idle" inhibitor locks are ignored.
         <varname>PowerKeyIgnoreInhibited=</varname>,
-        <varname>SuspendKeyIgnoreInhibited=</varname> and
-        <varname>HibernateKeyIgnoreInhibited=</varname> default to
-        <literal>no</literal>.
-        <varname>LidSwitchIgnoreInhibited=</varname> defaults to
-        <literal>yes</literal>. This means that the lid switch does
-        not respect suspend blockers by default, but the power and
-        sleep keys do. </para></listitem>
+        <varname>SuspendKeyIgnoreInhibited=</varname>, and
+        <varname>HibernateKeyIgnoreInhibited=</varname> default to <literal>no</literal>.
+        <varname>LidSwitchIgnoreInhibited=</varname> defaults to <literal>yes</literal>.
+        This means that when <command>systemd-logind</command> is handling events by
+        itself (no low level inhibitor locks are taken by another application), the lid
+        switch does not respect suspend blockers by default, but the power and sleep keys
+        do.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <listitem><para>Sets the maximum number of OS tasks each user may run concurrently. This controls the
         <varname>TasksMax=</varname> setting of the per-user slice unit, see
         <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-        for details. Defaults to 33%, which equals 10813 with the kernel's defaults on the host, but might be smaller
-        in OS containers.</para></listitem>
+        for details. If assigned the special value <literal>infinity</literal>, no tasks limit is applied.
+        Defaults to 33%, which equals 10813 with the kernel's defaults on the host, but might be smaller in
+        OS containers.</para></listitem>
       </varlistentry>
 
       <varlistentry>
index d318ec5..3c261bf 100644 (file)
   <refsect1>
     <title>Description</title>
 
-    <para>The <filename>/etc/machine-id</filename> file contains the
-    unique machine ID of the local system that is set during
-    installation. The machine ID is a single newline-terminated,
-    hexadecimal, 32-character, lowercase machine ID string. When
-    decoded from hexadecimal, this corresponds with a 16-byte/128-bit
-    string.</para>
+    <para>The <filename>/etc/machine-id</filename> file contains the unique machine ID of the local
+    system that is set during installation. The machine ID is a single newline-terminated,
+    hexadecimal, 32-character, lowercase ID. When decoded from hexadecimal, this corresponds to a
+    16-byte/128-bit value.</para>
 
     <para>The machine ID is usually generated from a random source
     during system installation and stays constant for all subsequent
     boots. Optionally, for stateless systems, it is generated during
     runtime at early boot if it is found to be empty.</para>
 
-    <para>The machine ID does not change based on user configuration
-    or when hardware is replaced.</para>
+    <para>The machine ID does not change based on local or network configuration or when hardware is
+    replaced. Due to this and its greater length, it is a more useful replacement for the
+    <citerefentry project='man-pages'><refentrytitle>gethostid</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+    call that POSIX specifies.</para>
 
     <para>This machine ID adheres to the same format and logic as the
     D-Bus machine ID.</para>
 
-    <para>Programs may use this ID to identify the host with a
-    globally unique ID in the network, which does not change even if
-    the local network configuration changes. Due to this and its
-    greater length, it is a more useful replacement for the
-    <citerefentry project='man-pages'><refentrytitle>gethostid</refentrytitle><manvolnum>3</manvolnum></citerefentry>
-    call that POSIX specifies.</para>
+    <para>This ID uniquely identifies the host. It should be considered "confidential", and must not be exposed in
+    untrusted environments, in particular on the network. If a stable unique identifier that is tied to the machine is
+    needed for some application, the machine ID or any part of it must not be used directly. Instead the machine ID
+    should be hashed with a cryptographic, keyed hash function, using a fixed, application-specific key. That way the
+    ID will be properly unique, and derived in a constant way from the machine ID but there will be no way to retrieve
+    the original machine ID from the application-specific one. The
+    <citerefentry><refentrytitle>sd_id128_get_machine_app_specific</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+    API provides an implementation of such an algorithm.</para>
 
     <para>The
     <citerefentry><refentrytitle>systemd-machine-id-setup</refentrytitle><manvolnum>1</manvolnum></citerefentry>
index 3511336..cd5997d 100644 (file)
         chassis types are defined:
         <literal>desktop</literal>,
         <literal>laptop</literal>,
+        <literal>convertible</literal>,
         <literal>server</literal>,
         <literal>tablet</literal>,
         <literal>handset</literal>,
index 597a5cc..46dcb44 100644 (file)
       <varlistentry>
          <term><option>--uid=</option></term>
 
-         <listitem><para>When used with the <command>shell</command>
-         command, chooses the user ID to open the interactive shell
-         session as. If this switch is not specified, defaults to
-         <literal>root</literal>. Note that this switch is not
-         supported for the <command>login</command> command (see
-         below).</para></listitem>
+         <listitem><para>When used with the <command>shell</command> command, chooses the user ID to
+         open the interactive shell session as. If the argument to the <command>shell</command>
+         command also specifies a user name, this option is ignored. If the name is not specified
+         in either way, <literal>root</literal> will be used by default. Note that this switch is
+         not supported for the <command>login</command> command (see below).</para></listitem>
       </varlistentry>
 
       <varlistentry>
         name passed.</para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><option>--max-addresses=</option></term>
+
+        <listitem><para>When used with the <option>list-machines</option>
+        command, limits the number of ip addresses output for every machine.
+        Defaults to 1. All addresses can be requested with <literal>all</literal>
+        as argument to <option>--max-addresses</option> . If the argument to
+        <option>--max-addresses</option> is less than the actual number
+        of addresses, <literal>...</literal>follows the last address.
+        If multiple addresses are to be written for a given machine, every
+        address except the first one is on a new line and is followed by
+        <literal>,</literal> if another address will be output afterwards. </para></listitem>
+      </varlistentry>
+
       <xi:include href="user-system-options.xml" xpointer="host" />
       <xi:include href="user-system-options.xml" xpointer="machine" />
 
       </varlistentry>
 
       <varlistentry>
-        <term><command>status</command> <replaceable>NAME</replaceable>...</term>
+        <term><command>status</command> <replaceable>NAME</replaceable></term>
 
         <listitem><para>Show runtime status information about
         one or more virtual machines and containers, followed by the
       </varlistentry>
 
       <varlistentry>
-        <term><command>show</command> [<replaceable>NAME</replaceable>...]</term>
-
-        <listitem><para>Show properties of one or more registered
-        virtual machines or containers or the manager itself. If no
-        argument is specified, properties of the manager will be
-        shown. If a NAME is specified, properties of this virtual
-        machine or container are shown. By default, empty properties
-        are suppressed. Use <option>--all</option> to show those too.
-        To select specific properties to show, use
-        <option>--property=</option>. This command is intended to be
-        used whenever computer-parsable output is required, and does
-        not print the cgroup tree or journal entries. Use
-        <command>status</command> if you are looking for formatted
-        human-readable output.</para></listitem>
+        <term><command>show</command> [<replaceable>NAME</replaceable>…]</term>
+
+        <listitem><para>Show properties of one or more registered virtual machines or containers or the manager
+        itself. If no argument is specified, properties of the manager will be shown. If a NAME is specified,
+        properties of this virtual machine or container are shown. By default, empty properties are suppressed. Use
+        <option>--all</option> to show those too.  To select specific properties to show, use
+        <option>--property=</option>. This command is intended to be used whenever computer-parsable output is
+        required, and does not print the control group tree or journal entries. Use <command>status</command> if you
+        are looking for formatted human-readable output.</para></listitem>
       </varlistentry>
 
       <varlistentry>
-        <term><command>start</command> <replaceable>NAME</replaceable>...</term>
+        <term><command>start</command> <replaceable>NAME</replaceable></term>
 
         <listitem><para>Start a container as a system service, using
         <citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry>.
       </varlistentry>
 
       <varlistentry>
-        <term><command>shell</command> [[<replaceable>NAME</replaceable>@]<replaceable>NAME</replaceable> [<replaceable>PATH</replaceable> [<replaceable>ARGUMENTS</replaceable>...]]] </term>
+        <term><command>shell</command> [[<replaceable>NAME</replaceable>@]<replaceable>NAME</replaceable> [<replaceable>PATH</replaceable> [<replaceable>ARGUMENTS</replaceable>]]] </term>
 
         <listitem><para>Open an interactive shell session in a
         container or on the local host. The first argument refers to
         user may be selected. Use <option>--setenv=</option> to set
         environment variables for the executed process.</para>
 
+        <para>Note that <command>machinectl shell</command> does not propagate the exit code/status of the invoked
+        shell process. Use <command>systemd-run</command> instead if that information is required (see below).</para>
+
         <para>When using the <command>shell</command> command without
         arguments, (thus invoking the executed shell or command on the
         local host), it is in many ways similar to a <citerefentry
         environment variables or resource limits, among other
         properties.</para>
 
-        <para>Note that
-        <citerefentry><refentrytitle>systemd-run</refentrytitle><manvolnum>1</manvolnum></citerefentry>
-        may be used in place of the <command>shell</command> command,
-        and allows more detailed, low-level configuration of the
-        invoked unit. However, it is frequently more privileged than
-        the <command>shell</command> command.</para></listitem>
+        <para>Note that <citerefentry><refentrytitle>systemd-run</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+        with its <option>--machine=</option> switch may be used in place of the <command>machinectl shell</command>
+        command, and allows non-interactive operation, more detailed and low-level configuration of the invoked unit,
+        as well as access to runtime and exit code/status information of the invoked shell process. In particular, use
+        <command>systemd-run</command>'s <option>--wait</option> switch to propagate exit status information of the
+        invoked process. Use <command>systemd-run</command>'s <option>--pty</option> switch for acquiring an
+        interactive shell, similar to <command>machinectl shell</command>. In general, <command>systemd-run</command>
+        is preferable for scripting purposes. However, note that <command>systemd-run</command> might require higher
+        privileges than <command>machinectl shell</command>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
-        <term><command>enable</command> <replaceable>NAME</replaceable>...</term>
-        <term><command>disable</command> <replaceable>NAME</replaceable>...</term>
+        <term><command>enable</command> <replaceable>NAME</replaceable></term>
+        <term><command>disable</command> <replaceable>NAME</replaceable></term>
 
         <listitem><para>Enable or disable a container as a system
         service to start at system boot, using
       </varlistentry>
 
       <varlistentry>
-        <term><command>poweroff</command> <replaceable>NAME</replaceable>...</term>
+        <term><command>poweroff</command> <replaceable>NAME</replaceable></term>
 
         <listitem><para>Power off one or more containers. This will
         trigger a reboot by sending SIGRTMIN+4 to the container's init
       </varlistentry>
 
       <varlistentry>
-        <term><command>reboot</command> <replaceable>NAME</replaceable>...</term>
+        <term><command>reboot</command> <replaceable>NAME</replaceable></term>
 
         <listitem><para>Reboot one or more containers. This will
         trigger a reboot by sending SIGINT to the container's init
       </varlistentry>
 
       <varlistentry>
-        <term><command>terminate</command> <replaceable>NAME</replaceable>...</term>
+        <term><command>terminate</command> <replaceable>NAME</replaceable></term>
 
         <listitem><para>Immediately terminates a virtual machine or
         container, without cleanly shutting it down. This kills all
       </varlistentry>
 
       <varlistentry>
-        <term><command>kill</command> <replaceable>NAME</replaceable>...</term>
+        <term><command>kill</command> <replaceable>NAME</replaceable></term>
 
         <listitem><para>Send a signal to one or more processes of the
         virtual machine or container. This means processes as seen by
       <varlistentry>
         <term><command>bind</command> <replaceable>NAME</replaceable> <replaceable>PATH</replaceable> [<replaceable>PATH</replaceable>]</term>
 
-        <listitem><para>Bind mounts a directory from the host into the
-        specified container. The first directory argument is the
-        source directory on the host, the second directory argument
-        is the destination directory in the container. When the
-        latter is omitted, the destination path in the container is
-        the same as the source path on the host. When combined with
-        the <option>--read-only</option> switch, a ready-only bind
-        mount is created. When combined with the
-        <option>--mkdir</option> switch, the destination path is first
-        created before the mount is applied. Note that this option is
-        currently only supported for
-        <citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry>
-        containers.</para></listitem>
+        <listitem><para>Bind mounts a directory from the host into the specified container. The first directory
+        argument is the source directory on the host, the second directory argument is the destination directory in the
+        container. When the latter is omitted, the destination path in the container is the same as the source path on
+        the host. When combined with the <option>--read-only</option> switch, a ready-only bind mount is created. When
+        combined with the <option>--mkdir</option> switch, the destination path is first created before the mount is
+        applied. Note that this option is currently only supported for
+        <citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry> containers,
+        and only if user namespacing (<option>--private-users</option>) is not used.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         system into a running container. Takes a container name,
         followed by the source path on the host and the destination
         path in the container. If the destination path is omitted, the
-        same as the source path is used.</para></listitem>
-      </varlistentry>
+        same as the source path is used.</para>
 
+        <para>If host and container share the same user and group namespace, file ownership by numeric user ID and
+        group ID is preserved for the copy, otherwise all files and directories in the copy will be owned by the root
+        user and group (UID/GID 0).</para></listitem>
+      </varlistentry>
 
       <varlistentry>
         <term><command>copy-from</command> <replaceable>NAME</replaceable> <replaceable>PATH</replaceable> [<replaceable>PATH</replaceable>]</term>
         into the host system. Takes a container name, followed by the
         source path in the container the destination path on the host.
         If the destination path is omitted, the same as the source path
-        is used.</para></listitem>
+        is used.</para>
+
+        <para>If host and container share the same user and group namespace, file ownership by numeric user ID and
+        group ID is preserved for the copy, otherwise all files and directories in the copy will be owned by the root
+        user and group (UID/GID 0).</para></listitem>
       </varlistentry>
     </variablelist></refsect2>
 
       </varlistentry>
 
       <varlistentry>
-        <term><command>image-status</command> [<replaceable>NAME</replaceable>...]</term>
+        <term><command>image-status</command> [<replaceable>NAME</replaceable>]</term>
 
         <listitem><para>Show terse status information about one or
         more container or VM images. This function is intended to
       </varlistentry>
 
       <varlistentry>
-        <term><command>show-image</command> [<replaceable>NAME</replaceable>...]</term>
+        <term><command>show-image</command> [<replaceable>NAME</replaceable>]</term>
 
         <listitem><para>Show properties of one or more registered
         virtual machine or container images, or the manager itself. If
         <listitem><para>Clones a container or VM image. The arguments specify the name of the image to clone and the
         name of the newly cloned image. Note that plain directory container images are cloned into btrfs subvolume
         images with this command, if the underlying file system supports this.  Note that cloning a container or VM
-        image is optimized for btrfs file systems, and might not be efficient on others, due to file system
-        limitations.</para>
+        image is optimized for file systems that support copy-on-write, and might not be efficient on others, due to
+        file system limitations.</para>
 
         <para>Note that this command leaves host name, machine ID and
         all other settings that could identify the instance
       </varlistentry>
 
       <varlistentry>
-        <term><command>remove</command> <replaceable>NAME</replaceable>...</term>
+        <term><command>remove</command> <replaceable>NAME</replaceable></term>
 
         <listitem><para>Removes one or more container or VM images.
         The special image <literal>.host</literal>, which refers to
         is automatically derived from the last component of the URL,
         with its suffix removed.</para>
 
-        <para>The image is verified before it is made available,
-        unless <option>--verify=no</option> is specified. Verification
-        is done via SHA256SUMS and SHA256SUMS.gpg files that need to
-        be made available on the same web server, under the same URL
-        as the <filename>.tar</filename> file, but with the last
-        component (the filename) of the URL replaced. With
-        <option>--verify=checksum</option>, only the SHA256 checksum
-        for the file is verified, based on the
-        <filename>SHA256SUMS</filename> file. With
-        <option>--verify=signature</option>, the SHA256SUMS file is
-        first verified with detached GPG signature file
-        <filename>SHA256SUMS.gpg</filename>. The public key for this
-        verification step needs to be available in
+        <para>The image is verified before it is made available, unless
+        <option>--verify=no</option> is specified.
+        Verification is done either via an inline signed file with the name
+        of the image and the suffix <filename>.sha256</filename> or via
+        separate <filename>SHA256SUMS</filename> and
+        <filename>SHA256SUMS.gpg</filename> files.
+        The signature files need to be made available on the same web
+        server, under the same URL as the <filename>.tar</filename> file.
+        With <option>--verify=checksum</option>, only the SHA256 checksum
+        for the file is verified, based on the <filename>.sha256</filename>
+        suffixed file or the<filename>SHA256SUMS</filename> file.
+        With <option>--verify=signature</option>, the sha checksum file is
+        first verified with the inline signature in the
+        <filename>.sha256</filename> file or the 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>
 
       </varlistentry>
 
       <varlistentry>
-        <term><command>cancel-transfers</command> <replaceable>ID</replaceable>...</term>
+        <term><command>cancel-transfers</command> <replaceable>ID</replaceable></term>
 
         <listitem><para>Aborts a download, import or export of the
         container or VM image with the specified ID. To list ongoing
     <filename>/var/lib/machines/</filename> to make them available for
     control with <command>machinectl</command>.</para>
 
-    <para>Note that many image operations are only supported,
+    <para>Note that some image operations are only supported,
     efficient or atomic on btrfs file systems. Due to this, if the
     <command>pull-tar</command>, <command>pull-raw</command>,
     <command>import-tar</command>, <command>import-raw</command> and
diff --git a/man/meson.build b/man/meson.build
new file mode 100644 (file)
index 0000000..4f2ddad
--- /dev/null
@@ -0,0 +1,204 @@
+# This is lame, I know, but meson has no other include mechanism
+subdir('rules')
+
+want_man = get_option('man')
+want_html = get_option('html')
+xsltproc = find_program('xsltproc',
+                        required : want_man == 'true' or want_html == 'true')
+want_man = want_man != 'false' and xsltproc.found()
+want_html = want_html != 'false' and xsltproc.found()
+
+xsltproc_flags = [
+        '--nonet',
+        '--xinclude',
+        '--stringparam', 'man.output.quietly', '1',
+        '--stringparam', 'funcsynopsis.style', 'ansi',
+        '--stringparam', 'man.authors.section.enabled', '0',
+        '--stringparam', 'man.copyright.section.enabled', '0',
+        '--stringparam', 'systemd.version', '@0@'.format(meson.project_version()),
+        '--path',
+        '@0@:@1@'.format(meson.current_build_dir(), meson.current_source_dir())]
+
+custom_man_xsl = files('custom-man.xsl')
+custom_html_xsl = files('custom-html.xsl')
+xslt_cmd = [xsltproc, '-o', '@OUTPUT0@'] + xsltproc_flags
+
+custom_entities_ent = configure_file(
+        input : 'custom-entities.ent.in',
+        output : 'custom-entities.ent',
+        configuration : conf)
+
+man_pages = []
+html_pages = []
+source_xml_files = []
+foreach tuple : manpages
+        stem = tuple[0]
+        section = tuple[1]
+        aliases = tuple[2]
+        condition = tuple[3]
+
+        xml = stem + '.xml'
+        html = stem + '.html'
+        man = stem + '.' + section
+
+        manaliases = []
+        htmlaliases = []
+        foreach alias : aliases
+                manaliases += [alias + '.' + section]
+                htmlaliases += [alias + '.html']
+        endforeach
+
+        mandirn = join_paths(get_option('mandir'), 'man' + section)
+
+        if condition == '' or conf.get(condition, false)
+                p1 = custom_target(
+                        man,
+                        input : xml,
+                        output : [man] + manaliases,
+                        command : xslt_cmd + [custom_man_xsl, '@INPUT@'],
+                        depend_files : custom_entities_ent,
+                        install : want_man,
+                        install_dir : mandirn)
+                man_pages += [p1]
+
+                p2 = []
+                foreach htmlalias : htmlaliases
+                        link = custom_target(
+                                htmlalias,
+                                input : p2,
+                                output : htmlalias,
+                                command : ['ln', '-fs', html, '@OUTPUT@'])
+                        if want_html
+                                dst = join_paths(docdir, 'html', htmlalias)
+                                cmd = 'ln -fs @0@ $DESTDIR@1@'.format(html, dst)
+                                meson.add_install_script('sh', '-c', cmd)
+                                p2 += [link]
+                        endif
+                        html_pages += [link]
+                endforeach
+
+                p3 = custom_target(
+                        html,
+                        input : xml,
+                        output : html,
+                        command : xslt_cmd + [custom_html_xsl, '@INPUT@'],
+                        depend_files : custom_entities_ent,
+                        depends : p2,
+                        install : want_html,
+                        install_dir : join_paths(docdir, 'html'))
+                html_pages += [p3]
+
+                source_xml_files += files(tuple[0] + '.xml')
+        else
+                message('Skipping @0@.@1@ because @2@ is false'.format(stem, section, condition))
+        endif
+endforeach
+
+############################################################
+
+have_lxml = run_command(xml_helper_py).returncode() == 0
+if not have_lxml
+        message('python-lxml not available, not making man page indices')
+endif
+
+systemd_directives_xml = custom_target(
+        'systemd.directives.xml',
+        input : source_xml_files,
+        output : 'systemd.directives.xml',
+        command : [make_directive_index_py, '@OUTPUT@'] + source_xml_files)
+
+nonindex_xml_files = source_xml_files + [systemd_directives_xml]
+systemd_index_xml = custom_target(
+        'systemd.index.xml',
+        input : nonindex_xml_files,
+        output : 'systemd.index.xml',
+        command : [make_man_index_py, '@OUTPUT@'] + nonindex_xml_files)
+
+foreach tuple : [['systemd.directives', '7', systemd_directives_xml],
+                 ['systemd.index',      '7', systemd_index_xml]]
+        stem = tuple[0]
+        section = tuple[1]
+        xml = tuple[2]
+
+        html = stem + '.html'
+        man = stem + '.' + section
+
+        mandirn = join_paths(get_option('mandir'), 'man' + section)
+
+        p1 = custom_target(
+                man,
+                input : xml,
+                output : man,
+                command : xslt_cmd + [custom_man_xsl, '@INPUT@'],
+                install : want_man and have_lxml,
+                install_dir : mandirn)
+        man_pages += [p1]
+
+        p2 = []
+        if html == 'systemd.index.html'
+                htmlalias = 'index.html'
+                link = custom_target(
+                        htmlalias,
+                        input : p2,
+                        output : htmlalias,
+                        command : ['ln', '-fs', html, '@OUTPUT@'])
+                if want_html
+                        dst = join_paths(docdir, 'html', htmlalias)
+                        cmd = 'ln -fs @0@ $DESTDIR@1@'.format(html, dst)
+                        meson.add_install_script('sh', '-c', cmd)
+                        p2 += [link]
+                endif
+                html_pages += [link]
+        endif
+
+        p3 = custom_target(
+                html,
+                input : xml,
+                output : html,
+                command : xslt_cmd + [custom_html_xsl, '@INPUT@'],
+                depend_files : custom_entities_ent,
+                depends : p2,
+                install : want_html and have_lxml,
+                install_dir : join_paths(docdir, 'html'))
+        html_pages += [p3]
+endforeach
+
+# cannot use run_target until https://github.com/mesonbuild/meson/issues/1644 is resolved
+man = custom_target(
+        'man',
+        output : 'man',
+        depends : man_pages,
+        command : ['echo'])
+
+html = run_target(
+        'html',
+        depends : html_pages,
+        output : 'html',
+        command : ['echo'])
+
+run_target(
+        'doc-sync',
+        depends : man_pages + html_pages,
+        command : ['rsync', '-rlv',
+                   '--delete-excluded',
+                   '--include=man',
+                   '--include=*.html',
+                   '--exclude=*',
+                   '--omit-dir-times',
+                   meson.current_build_dir(),
+                   get_option('www-target')])
+
+############################################################
+
+if git.found()
+        run_target(
+                'update-man-rules',
+                # slightly strange syntax because of
+                # https://github.com/mesonbuild/meson/issues/1643
+                # and https://github.com/mesonbuild/meson/issues/1512
+                command : ['sh', '-c',
+                           'cd @0@ && '.format(meson.build_root()) +
+                           'python3 @0@/tools/make-man-rules.py --meson `git ls-files ":/man/*.xml"` >t && '.format(meson.source_root()) +
+                           'mv t @0@/rules/meson.build'.format(meson.current_source_dir())],
+                depend_files : custom_entities_ent)
+endif
index 24e1de6..d4fa5e9 100644 (file)
       <varlistentry>
         <term>
           <command>list</command>
-          <optional><replaceable>LINK...</replaceable></optional>
+          <optional><replaceable>LINK</replaceable></optional>
         </term>
 
         <listitem>
       <varlistentry>
         <term>
           <command>status</command>
-          <optional><replaceable>LINK...</replaceable></optional>
+          <optional><replaceable>LINK</replaceable></optional>
         </term>
 
         <listitem>
       <varlistentry>
         <term>
           <command>lldp</command>
-          <optional><replaceable>LINK...</replaceable></optional>
+          <optional><replaceable>LINK</replaceable></optional>
         </term>
 
         <listitem>
@@ -172,14 +172,40 @@ s - Service VLAN, m - Two-port MAC Relay (TPMR)
 1 neighbors listed.</programlisting></para>
         </listitem>
       </varlistentry>
+
+      <varlistentry>
+        <term>
+          <command>label</command>
+        </term>
+
+        <listitem><para>Show numerical address labels that can be used for address selection.
+        This is the same information that
+        <citerefentry><refentrytitle>ip-addrlabel</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+        shows. See <ulink url="https://tools.ietf.org/html/rfc3484">RFC 3484</ulink>
+        for a discussion of address labels.</para>
+
+        <para>Produces output similar to:
+        <programlisting>Prefix/Prefixlen                          Label
+        ::/0                                  1
+    fc00::/7                                  5
+    fec0::/10                                11
+    2002::/16                                 2
+    3ffe::/16                                12
+ 2001:10::/28                                 7
+    2001::/32                                 6
+::ffff:0.0.0.0/96                             4
+        ::/96                                 3
+       ::1/128                                0</programlisting></para>
+        </listitem>
+      </varlistentry>
+
     </variablelist>
   </refsect1>
 
   <refsect1>
     <title>Exit status</title>
 
-    <para>On success, 0 is returned, a non-zero failure
-    code otherwise.</para>
+    <para>On success, 0 is returned, a non-zero failure code otherwise.</para>
   </refsect1>
 
   <refsect1>
@@ -187,7 +213,8 @@ s - Service VLAN, m - Two-port MAC Relay (TPMR)
     <para>
       <citerefentry><refentrytitle>systemd-networkd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.network</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemd.netdev</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+      <citerefentry><refentrytitle>systemd.netdev</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
+      <citerefentry project='die-net'><refentrytitle>ip</refentrytitle><manvolnum>8</manvolnum></citerefentry>
     </para>
   </refsect1>
 </refentry>
index 4bfc4f7..57e647a 100644 (file)
 
         <para>The DUID value specified here overrides the DUID that systemd-networkd generates using the machine-id
         from the <filename>/etc/machine-id</filename> file. To configure DUID per-network, see
-        <citerefentry><refentrytitle>systemd.network </refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+        <citerefentry><refentrytitle>systemd.network</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
         The configured DHCP DUID should conform to the specification in
         <ulink url="http://tools.ietf.org/html/rfc3315#section-9">RFC 3315</ulink>,
         <ulink url="http://tools.ietf.org/html/rfc6355">RFC 6355</ulink>. To configure IAID, see
index a920ec3..c25476e 100644 (file)
     <para>Here is an example <filename>/etc/nsswitch.conf</filename> file that enables
     <command>nss-myhostname</command> correctly:</para>
 
-<programlisting>passwd:         compat mymachines
-group:          compat mymachines
+<programlisting>passwd:         compat mymachines systemd
+group:          compat mymachines systemd
 shadow:         compat
 
-hosts:          files mymachines resolve <command>myhostname</command>
+hosts:          files mymachines resolve [!UNAVAIL=return] dns <command>myhostname</command>
 networks:       files
 
 protocols:      db files
@@ -138,6 +138,7 @@ netgroup:       nis</programlisting>
     <title>See Also</title>
     <para>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>nss-systemd</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>nss-resolve</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>nss-mymachines</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry project='man-pages'><refentrytitle>nsswitch.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
index ec04744..00bcc53 100644 (file)
     <para>Here is an example <filename>/etc/nsswitch.conf</filename> file that enables
     <command>nss-mymachines</command> correctly:</para>
 
-    <programlisting>passwd:         compat <command>mymachines</command>
-group:          compat <command>mymachines</command>
+    <programlisting>passwd:         compat <command>mymachines</command> systemd
+group:          compat <command>mymachines</command> systemd
 shadow:         compat
 
-hosts:          files <command>mymachines</command> resolve myhostname
+hosts:          files <command>mymachines</command> resolve [!UNAVAIL=return] dns myhostname
 networks:       files
 
 protocols:      db files
@@ -103,6 +103,7 @@ netgroup:       nis</programlisting>
     <para>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-machined.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>nss-systemd</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>nss-resolve</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>nss-myhostname</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry project='man-pages'><refentrytitle>nsswitch.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
index d9e5645..3a4e98e 100644 (file)
     hostnames via DNS.</para>
 
     <para>To activate the NSS module, add <literal>resolve</literal> to the line starting with
-    <literal>hosts:</literal> in <filename>/etc/nsswitch.conf</filename>.</para>
-
-    <para>It is recommended to place <literal>resolve</literal> early in <filename>/etc/nsswitch.conf</filename>'
-    <literal>hosts:</literal> line (but after the <literal>files</literal> or <literal>mymachines</literal> entries),
-    replacing the <literal>dns</literal> entry if it exists, to ensure DNS queries are always routed via
-    <citerefentry><refentrytitle>systemd-resolved</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
-
-    <para>Note that <command>nss-resolve</command> will chain-load <command>nss-dns</command> if
-    <filename>systemd-resolved.service</filename> is not running, ensuring that basic DNS resolution continues to work
-    if the service is down.</para>
+    <literal>hosts:</literal> in <filename>/etc/nsswitch.conf</filename>. Specifically, it is recommended to place
+    <literal>resolve</literal> early in <filename>/etc/nsswitch.conf</filename>'s <literal>hosts:</literal> line (but
+    after the <literal>files</literal> or <literal>mymachines</literal> entries), right before the
+    <literal>dns</literal> entry if it exists, followed by <literal>[!UNAVAIL=return]</literal>, to ensure DNS queries
+    are always routed via
+    <citerefentry><refentrytitle>systemd-resolved</refentrytitle><manvolnum>8</manvolnum></citerefentry> if it is
+    running, but are routed to <command>nss-dns</command> if this service is not available.</para>
+
+    <para>Note that <command>systemd-resolved</command> will synthesize DNS resource
+    records in a few cases, for example for <literal>localhost</literal> and the
+    current hostname, see
+    <citerefentry><refentrytitle>systemd-resolved</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+    for the full list. This duplicates the functionality of
+    <citerefentry><refentrytitle>nss-myhostname</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+    but it is still recommended (see examples below) to keep
+    <command>nss-myhostname</command> configured in
+    <filename>/etc/nsswitch.conf</filename>, to keep those names resolveable if
+    <command>systemd-resolved</command> is not running.</para>
   </refsect1>
 
   <refsect1>
     <para>Here is an example <filename>/etc/nsswitch.conf</filename> file that enables <command>nss-resolve</command>
     correctly:</para>
 
-<programlisting>passwd:         compat mymachines
-group:          compat mymachines
+<programlisting>passwd:         compat mymachines systemd
+group:          compat mymachines systemd
 shadow:         compat
 
-hosts:          files mymachines <command>resolve</command> myhostname
+hosts:          files mymachines <command>resolve [!UNAVAIL=return]</command> dns myhostname
 networks:       files
 
 protocols:      db files
@@ -94,7 +102,6 @@ ethers:         db files
 rpc:            db files
 
 netgroup:       nis</programlisting>
-
   </refsect1>
 
   <refsect1>
@@ -102,8 +109,9 @@ netgroup:       nis</programlisting>
     <para>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-resolved</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>nss-mymachines</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>nss-systemd</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>nss-myhostname</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>nss-mymachines</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry project='man-pages'><refentrytitle>nsswitch.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     </para>
   </refsect1>
diff --git a/man/nss-systemd.xml b/man/nss-systemd.xml
new file mode 100644 (file)
index 0000000..34811f0
--- /dev/null
@@ -0,0 +1,111 @@
+<?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">
+
+<!--
+  This file is part of systemd.
+
+  Copyright 2016 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/>.
+-->
+
+<refentry id="nss-systemd" conditional='ENABLE_NSS_SYSTEMD'>
+
+  <refentryinfo>
+    <title>nss-systemd</title>
+    <productname>systemd</productname>
+
+    <authorgroup>
+      <author>
+        <contrib>Developer</contrib>
+        <firstname>Lennart</firstname>
+        <surname>Poettering</surname>
+        <email>lennart@poettering.net</email>
+      </author>
+    </authorgroup>
+  </refentryinfo>
+
+  <refmeta>
+    <refentrytitle>nss-systemd</refentrytitle>
+    <manvolnum>8</manvolnum>
+  </refmeta>
+
+  <refnamediv>
+    <refname>nss-systemd</refname>
+    <refname>libnss_systemd.so.2</refname>
+    <refpurpose>Provide UNIX user and group name resolution for dynamic users and groups.</refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <para><filename>libnss_systemd.so.2</filename></para>
+  </refsynopsisdiv>
+
+  <refsect1>
+    <title>Description</title>
+
+    <para><command>nss-systemd</command> is a plug-in module for the GNU Name Service Switch (NSS) functionality of the
+    GNU C Library (<command>glibc</command>), providing UNIX user and group name resolution for dynamic users and
+    groups allocated through the <varname>DynamicUser=</varname> option in systemd unit files. See
+    <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry> for details on
+    this option.</para>
+
+    <para>This module also ensures that the root and nobody users and groups (i.e. the users/groups with the UIDs/GIDs
+    0 and 65534) remain resolvable at all times, even if they aren't listed in <filename>/etc/passwd</filename> or
+    <filename>/etc/group</filename>, or if these files are missing.</para>
+
+    <para>To activate the NSS module, add <literal>systemd</literal> to the lines starting with
+    <literal>passwd:</literal> and <literal>group:</literal> in <filename>/etc/nsswitch.conf</filename>.</para>
+
+    <para>It is recommended to place <literal>systemd</literal> after the <literal>files</literal> or
+    <literal>compat</literal> entry of the <filename>/etc/nsswitch.conf</filename> lines so that
+    <filename>/etc/passwd</filename> and <filename>/etc/group</filename> based mappings take precedence.</para>
+  </refsect1>
+
+  <refsect1>
+    <title>Example</title>
+
+    <para>Here is an example <filename>/etc/nsswitch.conf</filename> file that enables
+    <command>nss-systemd</command> correctly:</para>
+
+    <programlisting>passwd:         compat mymachines <command>systemd</command>
+group:          compat mymachines <command>systemd</command>
+shadow:         compat
+
+hosts:          files mymachines resolve [!UNAVAIL=return] dns myhostname
+networks:       files
+
+protocols:      db files
+services:       db files
+ethers:         db files
+rpc:            db files
+
+netgroup:       nis</programlisting>
+
+  </refsect1>
+
+  <refsect1>
+    <title>See Also</title>
+    <para>
+      <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>nss-resolve</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>nss-myhostname</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>nss-mymachines</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry project='man-pages'><refentrytitle>nsswitch.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
+      <citerefentry project='man-pages'><refentrytitle>getent</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+    </para>
+  </refsect1>
+
+</refentry>
index ddda81b..cef5445 100644 (file)
     <citerefentry><refentrytitle>systemd-logind.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
     and hence the systemd control group hierarchy.</para>
 
-    <para>On login, this module ensures the following:</para>
+    <para>On login, this module — in conjunction with <filename>systemd-logind.service</filename> — ensures the
+    following:</para>
 
     <orderedlist>
-      <listitem><para>If it does not exist yet, the user runtime
-      directory <filename>/run/user/$USER</filename> is created and
-      its ownership changed to the user that is logging
-      in.</para></listitem>
-
-      <listitem><para>The <varname>$XDG_SESSION_ID</varname>
-      environment variable is initialized. If auditing is available
-      and <command>pam_loginuid.so</command> was run before this
-      module (which is highly recommended), the variable is
-      initialized from the auditing session id
-      (<filename>/proc/self/sessionid</filename>). Otherwise, an
+      <listitem><para>If it does not exist yet, the user runtime directory <filename>/run/user/$UID</filename> is
+      either created or mounted as new <literal>tmpfs</literal> file system with quota applied, and its ownership
+      changed to the user that is logging in.</para></listitem>
+
+      <listitem><para>The <varname>$XDG_SESSION_ID</varname> environment variable is initialized. If auditing is
+      available and <command>pam_loginuid.so</command> was run before this module (which is highly recommended), the
+      variable is initialized from the auditing session id (<filename>/proc/self/sessionid</filename>). Otherwise, an
       independent session counter is used.</para></listitem>
 
-      <listitem><para>A new systemd scope unit is created for the
-      session. If this is the first concurrent session of the user, an
-      implicit slice below <filename>user.slice</filename> is
-      automatically created and the scope placed into it. An instance
-      of the system service <filename>user@.service</filename>, which
-      runs the systemd user manager instance, is started.
-      </para></listitem>
+      <listitem><para>A new systemd scope unit is created for the session. If this is the first concurrent session of
+      the user, an implicit per-user slice unit below <filename>user.slice</filename> is automatically created and the
+      scope placed into it. An instance of the system service <filename>user@.service</filename>, which runs the
+      systemd user manager instance, is started.  </para></listitem>
     </orderedlist>
 
     <para>On logout, this module ensures the following:</para>
     <orderedlist>
       <listitem><para>If enabled in
       <citerefentry><refentrytitle>logind.conf</refentrytitle>
-      <manvolnum>5</manvolnum></citerefentry>, all processes of the
-      session are terminated. If the last concurrent session of a user
-      ends, the user's systemd instance will be terminated too, and so
-      will the user's slice unit.</para></listitem>
+      <manvolnum>5</manvolnum></citerefentry> (<varname>KillUserProcesses=</varname>), all processes of the session are
+      terminated. If the last concurrent session of a user ends, the user's systemd instance will be terminated too,
+      and so will the user's slice unit.</para></listitem>
 
       <listitem><para>If the last concurrent session of a user ends,
-      the <varname>$XDG_RUNTIME_DIR</varname> directory and all its
+      the user runtime directory <filename>/run/user/$UID</filename> and all its
       contents are removed, too.</para></listitem>
     </orderedlist>
 
         offers the greatest possible file system feature set the
         operating system provides. For further details, see the <ulink
         url="http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html">XDG
-        Base Directory Specification</ulink>.</para></listitem>
+        Base Directory Specification</ulink>. <varname>$XDG_RUNTIME_DIR</varname>
+        is not set if the current user is not the original user of the session.</para></listitem>
       </varlistentry>
 
     </variablelist>
index 7556c6f..7babc5c 100644 (file)
       </varlistentry>
 
       <varlistentry>
+        <term><varname>MulticastDNS=</varname></term>
+        <listitem><para>Takes a boolean argument or
+        <literal>resolve</literal>. Controls Multicast DNS support (<ulink
+        url="https://tools.ietf.org/html/rfc6762">RFC 6762</ulink>) on
+        the local host. If true, enables full Multicast DNS responder and
+        resolver support. If false, disables both. If set to
+        <literal>resolve</literal>, only resolution support is enabled,
+        but responding is disabled. Note that
+        <citerefentry><refentrytitle>systemd-networkd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+        also maintains per-link Multicast DNS settings. Multicast DNS will be
+        enabled on a link only if the per-link and the
+        global setting is on.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><varname>DNSSEC=</varname></term>
         <listitem><para>Takes a boolean argument or
         <literal>allow-downgrade</literal>. If true all DNS lookups are
         <term><varname>Cache=</varname></term>
         <listitem><para>Takes a boolean argument. If "yes" (the default), resolving a domain name which already got
         queried earlier will return the previous result as long as it is still valid, and thus does not result in a new
-        network request. Be aware that that turning off caching comes at a performance penalty, which is particularly
+        network request. Be aware that turning off caching comes at a performance penalty, which is particularly
         high when DNSSEC is used.</para>
 
         <para>Note that caching is turned off implicitly if the configured DNS server is on a host-local IP address
         (such as 127.0.0.1 or ::1), in order to avoid duplicate local caching.</para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>DNSStubListener=</varname></term>
+        <listitem><para>Takes a boolean argument or one of <literal>udp</literal> and <literal>tcp</literal>. If
+        <literal>udp</literal> (the default), a DNS stub resolver will listen for UDP requests on address 127.0.0.53
+        port 53. If <literal>tcp</literal>, the stub will listen for TCP requests on the same address and port. If
+        <literal>yes</literal>, the stub listens for both UDP and TCP requests.  If <literal>no</literal>, the stub
+        listener is disabled.</para>
+
+        <para>Note that the DNS stub listener is turned off implicitly when its listening address and port are already
+        in use.</para></listitem>
+      </varlistentry>
+
     </variablelist>
   </refsect1>
 
diff --git a/man/rules/meson.build b/man/rules/meson.build
new file mode 100644 (file)
index 0000000..9f7201a
--- /dev/null
@@ -0,0 +1,766 @@
+# Do not edit. Generated by make-man-rules.py.
+manpages = [
+['binfmt.d', '5', [], 'ENABLE_BINFMT'],
+ ['bootctl', '1', [], 'ENABLE_EFI'],
+ ['bootup', '7', [], ''],
+ ['busctl', '1', [], ''],
+ ['coredump.conf', '5', ['coredump.conf.d'], 'ENABLE_COREDUMP'],
+ ['coredumpctl', '1', [], 'ENABLE_COREDUMP'],
+ ['crypttab', '5', [], 'HAVE_LIBCRYPTSETUP'],
+ ['daemon', '7', [], ''],
+ ['dnssec-trust-anchors.d',
+  '5',
+  ['systemd.negative', 'systemd.positive'],
+  'ENABLE_RESOLVED'],
+ ['environment.d', '5', [], 'ENABLE_ENVIRONMENT_D'],
+ ['file-hierarchy', '7', [], ''],
+ ['halt', '8', ['poweroff', 'reboot'], ''],
+ ['hostname', '5', [], ''],
+ ['hostnamectl', '1', [], 'ENABLE_HOSTNAMED'],
+ ['hwdb', '7', [], 'ENABLE_HWDB'],
+ ['journal-remote.conf', '5', ['journal-remote.conf.d'], 'HAVE_MICROHTTPD'],
+ ['journal-upload.conf', '5', ['journal-upload.conf.d'], 'HAVE_MICROHTTPD'],
+ ['journalctl', '1', [], ''],
+ ['journald.conf', '5', ['journald.conf.d'], ''],
+ ['kernel-command-line', '7', [], ''],
+ ['kernel-install', '8', [], ''],
+ ['libudev', '3', [], ''],
+ ['locale.conf', '5', [], ''],
+ ['localectl', '1', [], 'ENABLE_LOCALED'],
+ ['localtime', '5', [], ''],
+ ['loginctl', '1', [], 'ENABLE_LOGIND'],
+ ['logind.conf', '5', ['logind.conf.d'], 'ENABLE_LOGIND'],
+ ['machine-id', '5', [], ''],
+ ['machine-info', '5', [], ''],
+ ['machinectl', '1', [], 'ENABLE_MACHINED'],
+ ['modules-load.d', '5', [], 'HAVE_KMOD'],
+ ['networkctl', '1', [], 'ENABLE_NETWORKD'],
+ ['networkd.conf', '5', ['networkd.conf.d'], 'ENABLE_NETWORKD'],
+ ['nss-myhostname', '8', ['libnss_myhostname.so.2'], 'HAVE_MYHOSTNAME'],
+ ['nss-mymachines', '8', ['libnss_mymachines.so.2'], 'ENABLE_MACHINED'],
+ ['nss-resolve', '8', ['libnss_resolve.so.2'], 'ENABLE_RESOLVED'],
+ ['nss-systemd', '8', ['libnss_systemd.so.2'], 'ENABLE_NSS_SYSTEMD'],
+ ['os-release', '5', [], ''],
+ ['pam_systemd', '8', [], 'HAVE_PAM'],
+ ['resolved.conf', '5', ['resolved.conf.d'], 'ENABLE_RESOLVED'],
+ ['runlevel', '8', [], 'HAVE_UTMP'],
+ ['sd-bus-errors',
+  '3',
+  ['SD_BUS_ERROR_ACCESS_DENIED',
+   'SD_BUS_ERROR_ADDRESS_IN_USE',
+   'SD_BUS_ERROR_AUTH_FAILED',
+   'SD_BUS_ERROR_BAD_ADDRESS',
+   'SD_BUS_ERROR_DISCONNECTED',
+   'SD_BUS_ERROR_FAILED',
+   'SD_BUS_ERROR_FILE_EXISTS',
+   'SD_BUS_ERROR_FILE_NOT_FOUND',
+   'SD_BUS_ERROR_INCONSISTENT_MESSAGE',
+   'SD_BUS_ERROR_INTERACTIVE_AUTHORIZATION_REQUIRED',
+   'SD_BUS_ERROR_INVALID_ARGS',
+   'SD_BUS_ERROR_INVALID_SIGNATURE',
+   'SD_BUS_ERROR_IO_ERROR',
+   'SD_BUS_ERROR_LIMITS_EXCEEDED',
+   'SD_BUS_ERROR_MATCH_RULE_INVALID',
+   'SD_BUS_ERROR_MATCH_RULE_NOT_FOUND',
+   'SD_BUS_ERROR_NAME_HAS_NO_OWNER',
+   'SD_BUS_ERROR_NOT_SUPPORTED',
+   'SD_BUS_ERROR_NO_MEMORY',
+   'SD_BUS_ERROR_NO_NETWORK',
+   'SD_BUS_ERROR_NO_REPLY',
+   'SD_BUS_ERROR_NO_SERVER',
+   'SD_BUS_ERROR_PROPERTY_READ_ONLY',
+   'SD_BUS_ERROR_SERVICE_UNKNOWN',
+   'SD_BUS_ERROR_TIMEOUT',
+   'SD_BUS_ERROR_UNIX_PROCESS_ID_UNKNOWN',
+   'SD_BUS_ERROR_UNKNOWN_INTERFACE',
+   'SD_BUS_ERROR_UNKNOWN_METHOD',
+   'SD_BUS_ERROR_UNKNOWN_OBJECT',
+   'SD_BUS_ERROR_UNKNOWN_PROPERTY'],
+  ''],
+ ['sd-bus', '3', [], ''],
+ ['sd-daemon',
+  '3',
+  ['SD_ALERT',
+   'SD_CRIT',
+   'SD_DEBUG',
+   'SD_EMERG',
+   'SD_ERR',
+   'SD_INFO',
+   'SD_NOTICE',
+   'SD_WARNING'],
+  ''],
+ ['sd-event', '3', [], ''],
+ ['sd-id128',
+  '3',
+  ['SD_ID128_CONST_STR',
+   'SD_ID128_FORMAT_STR',
+   'SD_ID128_FORMAT_VAL',
+   'SD_ID128_MAKE',
+   'SD_ID128_MAKE_STR',
+   'SD_ID128_NULL',
+   'sd_id128_equal',
+   'sd_id128_is_null',
+   'sd_id128_t'],
+  ''],
+ ['sd-journal', '3', [], ''],
+ ['sd-login', '3', [], 'HAVE_PAM'],
+ ['sd_booted', '3', [], ''],
+ ['sd_bus_add_match', '3', [], ''],
+ ['sd_bus_creds_get_pid',
+  '3',
+  ['sd_bus_creds_get_audit_login_uid',
+   'sd_bus_creds_get_audit_session_id',
+   'sd_bus_creds_get_cgroup',
+   'sd_bus_creds_get_cmdline',
+   'sd_bus_creds_get_comm',
+   'sd_bus_creds_get_description',
+   'sd_bus_creds_get_egid',
+   'sd_bus_creds_get_euid',
+   'sd_bus_creds_get_exe',
+   'sd_bus_creds_get_fsgid',
+   'sd_bus_creds_get_fsuid',
+   'sd_bus_creds_get_gid',
+   'sd_bus_creds_get_owner_uid',
+   'sd_bus_creds_get_ppid',
+   'sd_bus_creds_get_selinux_context',
+   'sd_bus_creds_get_session',
+   'sd_bus_creds_get_sgid',
+   'sd_bus_creds_get_slice',
+   'sd_bus_creds_get_suid',
+   'sd_bus_creds_get_supplementary_gids',
+   'sd_bus_creds_get_tid',
+   'sd_bus_creds_get_tid_comm',
+   'sd_bus_creds_get_tty',
+   'sd_bus_creds_get_uid',
+   'sd_bus_creds_get_unique_name',
+   'sd_bus_creds_get_unit',
+   'sd_bus_creds_get_user_slice',
+   'sd_bus_creds_get_user_unit',
+   'sd_bus_creds_get_well_known_names',
+   'sd_bus_creds_has_bounding_cap',
+   'sd_bus_creds_has_effective_cap',
+   'sd_bus_creds_has_inheritable_cap',
+   'sd_bus_creds_has_permitted_cap'],
+  ''],
+ ['sd_bus_creds_new_from_pid',
+  '3',
+  ['sd_bus_creds_get_augmented_mask',
+   'sd_bus_creds_get_mask',
+   'sd_bus_creds_ref',
+   'sd_bus_creds_unref',
+   'sd_bus_creds_unrefp'],
+  ''],
+ ['sd_bus_default',
+  '3',
+  ['sd_bus_default_system',
+   'sd_bus_default_user',
+   'sd_bus_open',
+   'sd_bus_open_system',
+   'sd_bus_open_system_machine',
+   'sd_bus_open_system_remote',
+   'sd_bus_open_user'],
+  ''],
+ ['sd_bus_error',
+  '3',
+  ['SD_BUS_ERROR_MAKE_CONST',
+   'SD_BUS_ERROR_NULL',
+   'sd_bus_error_copy',
+   'sd_bus_error_free',
+   'sd_bus_error_get_errno',
+   'sd_bus_error_has_name',
+   'sd_bus_error_is_set',
+   'sd_bus_error_set',
+   'sd_bus_error_set_const',
+   'sd_bus_error_set_errno',
+   'sd_bus_error_set_errnof',
+   'sd_bus_error_set_errnofv',
+   'sd_bus_error_setf'],
+  ''],
+ ['sd_bus_error_add_map',
+  '3',
+  ['SD_BUS_ERROR_END', 'SD_BUS_ERROR_MAP', 'sd_bus_error_map'],
+  ''],
+ ['sd_bus_get_fd', '3', [], ''],
+ ['sd_bus_message_append', '3', ['sd_bus_message_appendv'], ''],
+ ['sd_bus_message_append_array',
+  '3',
+  ['sd_bus_message_append_array_iovec',
+   'sd_bus_message_append_array_memfd',
+   'sd_bus_message_append_array_space'],
+  ''],
+ ['sd_bus_message_append_basic', '3', [], ''],
+ ['sd_bus_message_append_string_memfd',
+  '3',
+  ['sd_bus_message_append_string_iovec', 'sd_bus_message_append_string_space'],
+  ''],
+ ['sd_bus_message_append_strv', '3', [], ''],
+ ['sd_bus_message_get_cookie', '3', ['sd_bus_message_get_reply_cookie'], ''],
+ ['sd_bus_message_get_monotonic_usec',
+  '3',
+  ['sd_bus_message_get_realtime_usec', 'sd_bus_message_get_seqnum'],
+  ''],
+ ['sd_bus_message_read_basic', '3', [], ''],
+ ['sd_bus_negotiate_fds',
+  '3',
+  ['sd_bus_negotiate_creds', 'sd_bus_negotiate_timestamp'],
+  ''],
+ ['sd_bus_new', '3', ['sd_bus_ref', 'sd_bus_unref', 'sd_bus_unrefp'], ''],
+ ['sd_bus_path_encode',
+  '3',
+  ['sd_bus_path_decode', 'sd_bus_path_decode_many', 'sd_bus_path_encode_many'],
+  ''],
+ ['sd_bus_process', '3', [], ''],
+ ['sd_bus_request_name', '3', ['sd_bus_release_name'], ''],
+ ['sd_bus_track_add_name',
+  '3',
+  ['sd_bus_track_add_sender',
+   'sd_bus_track_contains',
+   'sd_bus_track_count',
+   'sd_bus_track_count_name',
+   'sd_bus_track_count_sender',
+   'sd_bus_track_first',
+   'sd_bus_track_next',
+   'sd_bus_track_remove_name',
+   'sd_bus_track_remove_sender'],
+  ''],
+ ['sd_bus_track_new',
+  '3',
+  ['sd_bus_track_get_bus',
+   'sd_bus_track_get_recursive',
+   'sd_bus_track_get_userdata',
+   'sd_bus_track_ref',
+   'sd_bus_track_set_recursive',
+   'sd_bus_track_set_userdata',
+   'sd_bus_track_unref',
+   'sd_bus_track_unrefp'],
+  ''],
+ ['sd_event_add_child',
+  '3',
+  ['sd_event_child_handler_t', 'sd_event_source_get_child_pid'],
+  ''],
+ ['sd_event_add_defer',
+  '3',
+  ['sd_event_add_exit', 'sd_event_add_post', 'sd_event_handler_t'],
+  ''],
+ ['sd_event_add_io',
+  '3',
+  ['sd_event_io_handler_t',
+   'sd_event_source',
+   'sd_event_source_get_io_events',
+   'sd_event_source_get_io_fd',
+   'sd_event_source_get_io_revents',
+   'sd_event_source_set_io_events',
+   'sd_event_source_set_io_fd'],
+  ''],
+ ['sd_event_add_signal',
+  '3',
+  ['sd_event_signal_handler_t', 'sd_event_source_get_signal'],
+  ''],
+ ['sd_event_add_time',
+  '3',
+  ['sd_event_source_get_time',
+   'sd_event_source_get_time_accuracy',
+   'sd_event_source_get_time_clock',
+   'sd_event_source_set_time',
+   'sd_event_source_set_time_accuracy',
+   'sd_event_time_handler_t'],
+  ''],
+ ['sd_event_exit', '3', ['sd_event_get_exit_code'], ''],
+ ['sd_event_get_fd', '3', [], ''],
+ ['sd_event_new',
+  '3',
+  ['sd_event',
+   'sd_event_default',
+   'sd_event_get_tid',
+   'sd_event_ref',
+   'sd_event_unref',
+   'sd_event_unrefp'],
+  ''],
+ ['sd_event_now', '3', [], ''],
+ ['sd_event_run', '3', ['sd_event_loop'], ''],
+ ['sd_event_set_watchdog', '3', ['sd_event_get_watchdog'], ''],
+ ['sd_event_source_get_event', '3', [], ''],
+ ['sd_event_source_get_pending', '3', [], ''],
+ ['sd_event_source_set_description',
+  '3',
+  ['sd_event_source_get_description'],
+  ''],
+ ['sd_event_source_set_enabled',
+  '3',
+  ['SD_EVENT_OFF',
+   'SD_EVENT_ON',
+   'SD_EVENT_ONESHOT',
+   'sd_event_source_get_enabled'],
+  ''],
+ ['sd_event_source_set_prepare', '3', [], ''],
+ ['sd_event_source_set_priority',
+  '3',
+  ['SD_EVENT_PRIORITY_IDLE',
+   'SD_EVENT_PRIORITY_IMPORTANT',
+   'SD_EVENT_PRIORITY_NORMAL',
+   'sd_event_source_get_priority'],
+  ''],
+ ['sd_event_source_set_userdata', '3', ['sd_event_source_get_userdata'], ''],
+ ['sd_event_source_unref',
+  '3',
+  ['sd_event_source_ref', 'sd_event_source_unrefp'],
+  ''],
+ ['sd_event_wait',
+  '3',
+  ['SD_EVENT_ARMED',
+   'SD_EVENT_EXITING',
+   'SD_EVENT_FINISHED',
+   'SD_EVENT_INITIAL',
+   'SD_EVENT_PENDING',
+   'SD_EVENT_PREPARING',
+   'SD_EVENT_RUNNING',
+   'sd_event_dispatch',
+   'sd_event_get_iteration',
+   'sd_event_get_state',
+   'sd_event_prepare'],
+  ''],
+ ['sd_get_seats',
+  '3',
+  ['sd_get_machine_names', 'sd_get_sessions', 'sd_get_uids'],
+  'HAVE_PAM'],
+ ['sd_id128_get_machine',
+  '3',
+  ['sd_id128_get_boot',
+   'sd_id128_get_invocation',
+   'sd_id128_get_machine_app_specific'],
+  ''],
+ ['sd_id128_randomize', '3', [], ''],
+ ['sd_id128_to_string', '3', ['sd_id128_from_string'], ''],
+ ['sd_is_fifo',
+  '3',
+  ['sd_is_mq',
+   'sd_is_socket',
+   'sd_is_socket_inet',
+   'sd_is_socket_sockaddr',
+   'sd_is_socket_unix',
+   'sd_is_special'],
+  ''],
+ ['sd_journal_add_match',
+  '3',
+  ['sd_journal_add_conjunction',
+   'sd_journal_add_disjunction',
+   'sd_journal_flush_matches'],
+  ''],
+ ['sd_journal_enumerate_fields',
+  '3',
+  ['SD_JOURNAL_FOREACH_FIELD', 'sd_journal_restart_fields'],
+  ''],
+ ['sd_journal_get_catalog', '3', ['sd_journal_get_catalog_for_message_id'], ''],
+ ['sd_journal_get_cursor', '3', ['sd_journal_test_cursor'], ''],
+ ['sd_journal_get_cutoff_realtime_usec',
+  '3',
+  ['sd_journal_get_cutoff_monotonic_usec'],
+  ''],
+ ['sd_journal_get_data',
+  '3',
+  ['SD_JOURNAL_FOREACH_DATA',
+   'sd_journal_enumerate_data',
+   'sd_journal_get_data_threshold',
+   'sd_journal_restart_data',
+   'sd_journal_set_data_threshold'],
+  ''],
+ ['sd_journal_get_fd',
+  '3',
+  ['SD_JOURNAL_APPEND',
+   'SD_JOURNAL_INVALIDATE',
+   'SD_JOURNAL_NOP',
+   'sd_journal_get_events',
+   'sd_journal_get_timeout',
+   'sd_journal_process',
+   'sd_journal_reliable_fd',
+   'sd_journal_wait'],
+  ''],
+ ['sd_journal_get_realtime_usec', '3', ['sd_journal_get_monotonic_usec'], ''],
+ ['sd_journal_get_usage', '3', [], ''],
+ ['sd_journal_has_runtime_files', '3', ['sd_journal_has_persistent_files'], ''],
+ ['sd_journal_next',
+  '3',
+  ['SD_JOURNAL_FOREACH',
+   'SD_JOURNAL_FOREACH_BACKWARDS',
+   'sd_journal_next_skip',
+   'sd_journal_previous',
+   'sd_journal_previous_skip'],
+  ''],
+ ['sd_journal_open',
+  '3',
+  ['SD_JOURNAL_CURRENT_USER',
+   'SD_JOURNAL_LOCAL_ONLY',
+   'SD_JOURNAL_OS_ROOT',
+   'SD_JOURNAL_RUNTIME_ONLY',
+   'SD_JOURNAL_SYSTEM',
+   'sd_journal',
+   'sd_journal_close',
+   'sd_journal_open_directory',
+   'sd_journal_open_directory_fd',
+   'sd_journal_open_files',
+   'sd_journal_open_files_fd'],
+  ''],
+ ['sd_journal_print',
+  '3',
+  ['SD_JOURNAL_SUPPRESS_LOCATION',
+   'sd_journal_perror',
+   'sd_journal_printv',
+   'sd_journal_send',
+   'sd_journal_sendv'],
+  ''],
+ ['sd_journal_query_unique',
+  '3',
+  ['SD_JOURNAL_FOREACH_UNIQUE',
+   'sd_journal_enumerate_unique',
+   'sd_journal_restart_unique'],
+  ''],
+ ['sd_journal_seek_head',
+  '3',
+  ['sd_journal_seek_cursor',
+   'sd_journal_seek_monotonic_usec',
+   'sd_journal_seek_realtime_usec',
+   'sd_journal_seek_tail'],
+  ''],
+ ['sd_journal_stream_fd', '3', [], ''],
+ ['sd_listen_fds',
+  '3',
+  ['SD_LISTEN_FDS_START', 'sd_listen_fds_with_names'],
+  ''],
+ ['sd_login_monitor_new',
+  '3',
+  ['sd_login_monitor',
+   'sd_login_monitor_flush',
+   'sd_login_monitor_get_events',
+   'sd_login_monitor_get_fd',
+   'sd_login_monitor_get_timeout',
+   'sd_login_monitor_unref',
+   'sd_login_monitor_unrefp'],
+  'HAVE_PAM'],
+ ['sd_machine_get_class', '3', ['sd_machine_get_ifindices'], ''],
+ ['sd_notify',
+  '3',
+  ['sd_notifyf', 'sd_pid_notify', 'sd_pid_notify_with_fds', 'sd_pid_notifyf'],
+  ''],
+ ['sd_pid_get_session',
+  '3',
+  ['sd_peer_get_cgroup',
+   'sd_peer_get_machine_name',
+   'sd_peer_get_owner_uid',
+   'sd_peer_get_session',
+   'sd_peer_get_slice',
+   'sd_peer_get_unit',
+   'sd_peer_get_user_slice',
+   'sd_peer_get_user_unit',
+   'sd_pid_get_cgroup',
+   'sd_pid_get_machine_name',
+   'sd_pid_get_owner_uid',
+   'sd_pid_get_slice',
+   'sd_pid_get_unit',
+   'sd_pid_get_user_slice',
+   'sd_pid_get_user_unit'],
+  'HAVE_PAM'],
+ ['sd_seat_get_active',
+  '3',
+  ['sd_seat_can_graphical',
+   'sd_seat_can_multi_session',
+   'sd_seat_can_tty',
+   'sd_seat_get_sessions'],
+  'HAVE_PAM'],
+ ['sd_session_is_active',
+  '3',
+  ['sd_session_get_class',
+   'sd_session_get_desktop',
+   'sd_session_get_display',
+   'sd_session_get_remote_host',
+   'sd_session_get_remote_user',
+   'sd_session_get_seat',
+   'sd_session_get_service',
+   'sd_session_get_state',
+   'sd_session_get_tty',
+   'sd_session_get_type',
+   'sd_session_get_uid',
+   'sd_session_get_vt',
+   'sd_session_is_remote'],
+  'HAVE_PAM'],
+ ['sd_uid_get_state',
+  '3',
+  ['sd_uid_get_display',
+   'sd_uid_get_seats',
+   'sd_uid_get_sessions',
+   'sd_uid_is_on_seat'],
+  'HAVE_PAM'],
+ ['sd_watchdog_enabled', '3', [], ''],
+ ['shutdown', '8', [], ''],
+ ['sysctl.d', '5', [], ''],
+ ['systemctl', '1', [], ''],
+ ['systemd-analyze', '1', [], ''],
+ ['systemd-ask-password-console.service',
+  '8',
+  ['systemd-ask-password-console.path',
+   'systemd-ask-password-wall.path',
+   'systemd-ask-password-wall.service'],
+  ''],
+ ['systemd-ask-password', '1', [], ''],
+ ['systemd-backlight@.service', '8', ['systemd-backlight'], 'ENABLE_BACKLIGHT'],
+ ['systemd-binfmt.service', '8', ['systemd-binfmt'], 'ENABLE_BINFMT'],
+ ['systemd-cat', '1', [], ''],
+ ['systemd-cgls', '1', [], ''],
+ ['systemd-cgtop', '1', [], ''],
+ ['systemd-coredump',
+  '8',
+  ['systemd-coredump.socket', 'systemd-coredump@.service'],
+  'ENABLE_COREDUMP'],
+ ['systemd-cryptsetup-generator', '8', [], 'HAVE_LIBCRYPTSETUP'],
+ ['systemd-cryptsetup@.service',
+  '8',
+  ['systemd-cryptsetup'],
+  'HAVE_LIBCRYPTSETUP'],
+ ['systemd-debug-generator', '8', [], ''],
+ ['systemd-delta', '1', [], ''],
+ ['systemd-detect-virt', '1', [], ''],
+ ['systemd-environment-d-generator',
+  '8',
+  ['30-systemd-environment-d-generator'],
+  'ENABLE_ENVIRONMENT_D'],
+ ['systemd-escape', '1', [], ''],
+ ['systemd-firstboot', '1', ['systemd-firstboot.service'], 'ENABLE_FIRSTBOOT'],
+ ['systemd-fsck@.service',
+  '8',
+  ['systemd-fsck', 'systemd-fsck-root.service'],
+  ''],
+ ['systemd-fstab-generator', '8', [], ''],
+ ['systemd-getty-generator', '8', [], ''],
+ ['systemd-gpt-auto-generator', '8', [], ''],
+ ['systemd-halt.service',
+  '8',
+  ['systemd-kexec.service',
+   'systemd-poweroff.service',
+   'systemd-reboot.service',
+   'systemd-shutdown'],
+  ''],
+ ['systemd-hibernate-resume-generator', '8', [], 'ENABLE_HIBERNATE'],
+ ['systemd-hibernate-resume@.service',
+  '8',
+  ['systemd-hibernate-resume'],
+  'ENABLE_HIBERNATE'],
+ ['systemd-hostnamed.service', '8', ['systemd-hostnamed'], 'ENABLE_HOSTNAMED'],
+ ['systemd-hwdb', '8', [], 'ENABLE_HWDB'],
+ ['systemd-importd.service', '8', ['systemd-importd'], 'ENABLE_IMPORTD'],
+ ['systemd-inhibit', '1', [], ''],
+ ['systemd-initctl.service',
+  '8',
+  ['systemd-initctl', 'systemd-initctl.socket'],
+  ''],
+ ['systemd-journal-gatewayd.service',
+  '8',
+  ['systemd-journal-gatewayd', 'systemd-journal-gatewayd.socket'],
+  'HAVE_MICROHTTPD'],
+ ['systemd-journal-remote', '8', [], 'HAVE_MICROHTTPD'],
+ ['systemd-journal-upload', '8', [], 'HAVE_MICROHTTPD'],
+ ['systemd-journald.service',
+  '8',
+  ['systemd-journald',
+   'systemd-journald-audit.socket',
+   'systemd-journald-dev-log.socket',
+   'systemd-journald.socket'],
+  ''],
+ ['systemd-localed.service', '8', ['systemd-localed'], 'ENABLE_LOCALED'],
+ ['systemd-logind.service', '8', ['systemd-logind'], 'ENABLE_LOGIND'],
+ ['systemd-machine-id-commit.service', '8', [], ''],
+ ['systemd-machine-id-setup', '1', [], ''],
+ ['systemd-machined.service', '8', ['systemd-machined'], 'ENABLE_MACHINED'],
+ ['systemd-modules-load.service', '8', ['systemd-modules-load'], 'HAVE_KMOD'],
+ ['systemd-mount', '1', ['systemd-umount'], ''],
+ ['systemd-networkd-wait-online.service',
+  '8',
+  ['systemd-networkd-wait-online'],
+  'ENABLE_NETWORKD'],
+ ['systemd-networkd.service', '8', ['systemd-networkd'], 'ENABLE_NETWORKD'],
+ ['systemd-notify', '1', [], ''],
+ ['systemd-nspawn', '1', [], ''],
+ ['systemd-path', '1', [], ''],
+ ['systemd-quotacheck.service',
+  '8',
+  ['systemd-quotacheck'],
+  'ENABLE_QUOTACHECK'],
+ ['systemd-random-seed.service',
+  '8',
+  ['systemd-random-seed'],
+  'ENABLE_RANDOMSEED'],
+ ['systemd-remount-fs.service', '8', ['systemd-remount-fs'], ''],
+ ['systemd-resolve', '1', [], 'ENABLE_RESOLVED'],
+ ['systemd-resolved.service', '8', ['systemd-resolved'], 'ENABLE_RESOLVED'],
+ ['systemd-rfkill.service',
+  '8',
+  ['systemd-rfkill', 'systemd-rfkill.socket'],
+  'ENABLE_RFKILL'],
+ ['systemd-run', '1', [], ''],
+ ['systemd-sleep.conf', '5', ['sleep.conf.d'], ''],
+ ['systemd-socket-activate', '1', [], ''],
+ ['systemd-socket-proxyd', '8', [], ''],
+ ['systemd-suspend.service',
+  '8',
+  ['systemd-hibernate.service',
+   'systemd-hybrid-sleep.service',
+   'systemd-sleep'],
+  ''],
+ ['systemd-sysctl.service', '8', ['systemd-sysctl'], ''],
+ ['systemd-system-update-generator', '8', [], ''],
+ ['systemd-system.conf',
+  '5',
+  ['system.conf.d', 'systemd-user.conf', 'user.conf.d'],
+  ''],
+ ['systemd-sysusers', '8', ['systemd-sysusers.service'], ''],
+ ['systemd-sysv-generator', '8', [], 'HAVE_SYSV_COMPAT'],
+ ['systemd-timedated.service', '8', ['systemd-timedated'], 'ENABLE_TIMEDATED'],
+ ['systemd-timesyncd.service', '8', ['systemd-timesyncd'], 'ENABLE_TIMESYNCD'],
+ ['systemd-tmpfiles',
+  '8',
+  ['systemd-tmpfiles-clean.service',
+   'systemd-tmpfiles-clean.timer',
+   'systemd-tmpfiles-setup-dev.service',
+   'systemd-tmpfiles-setup.service'],
+  ''],
+ ['systemd-tty-ask-password-agent', '1', [], ''],
+ ['systemd-udevd.service',
+  '8',
+  ['systemd-udevd',
+   'systemd-udevd-control.socket',
+   'systemd-udevd-kernel.socket'],
+  ''],
+ ['systemd-update-done.service', '8', ['systemd-update-done'], ''],
+ ['systemd-update-utmp.service',
+  '8',
+  ['systemd-update-utmp', 'systemd-update-utmp-runlevel.service'],
+  'HAVE_UTMP'],
+ ['systemd-user-sessions.service', '8', ['systemd-user-sessions'], 'HAVE_PAM'],
+ ['systemd-vconsole-setup.service',
+  '8',
+  ['systemd-vconsole-setup'],
+  'ENABLE_VCONSOLE'],
+ ['systemd-veritysetup-generator', '8', [], 'HAVE_LIBCRYPTSETUP'],
+ ['systemd-veritysetup@.service',
+  '8',
+  ['systemd-veritysetup'],
+  'HAVE_LIBCRYPTSETUP'],
+ ['systemd-volatile-root.service', '8', ['systemd-volatile-root'], ''],
+ ['systemd', '1', ['init'], ''],
+ ['systemd.automount', '5', [], ''],
+ ['systemd.device', '5', [], ''],
+ ['systemd.environment-generator', '7', [], 'ENABLE_ENVIRONMENT_D'],
+ ['systemd.exec', '5', [], ''],
+ ['systemd.generator', '7', [], ''],
+ ['systemd.journal-fields', '7', [], ''],
+ ['systemd.kill', '5', [], ''],
+ ['systemd.link', '5', [], ''],
+ ['systemd.mount', '5', [], ''],
+ ['systemd.netdev', '5', [], 'ENABLE_NETWORKD'],
+ ['systemd.network', '5', [], 'ENABLE_NETWORKD'],
+ ['systemd.nspawn', '5', [], ''],
+ ['systemd.offline-updates', '7', [], ''],
+ ['systemd.path', '5', [], ''],
+ ['systemd.preset', '5', [], ''],
+ ['systemd.resource-control', '5', [], ''],
+ ['systemd.scope', '5', [], ''],
+ ['systemd.service', '5', [], ''],
+ ['systemd.slice', '5', [], ''],
+ ['systemd.socket', '5', [], ''],
+ ['systemd.special', '7', [], ''],
+ ['systemd.swap', '5', [], ''],
+ ['systemd.target', '5', [], ''],
+ ['systemd.time', '7', [], ''],
+ ['systemd.timer', '5', [], ''],
+ ['systemd.unit', '5', [], ''],
+ ['sysusers.d', '5', [], 'ENABLE_SYSUSERS'],
+ ['telinit', '8', [], ''],
+ ['timedatectl', '1', [], 'ENABLE_TIMEDATED'],
+ ['timesyncd.conf', '5', ['timesyncd.conf.d'], 'ENABLE_TIMESYNCD'],
+ ['tmpfiles.d', '5', [], ''],
+ ['udev', '7', [], ''],
+ ['udev.conf', '5', [], ''],
+ ['udev_device_get_syspath',
+  '3',
+  ['udev_device_get_action',
+   'udev_device_get_devnode',
+   'udev_device_get_devnum',
+   'udev_device_get_devpath',
+   'udev_device_get_devtype',
+   'udev_device_get_driver',
+   'udev_device_get_is_initialized',
+   'udev_device_get_parent',
+   'udev_device_get_parent_with_subsystem_devtype',
+   'udev_device_get_subsystem',
+   'udev_device_get_sysname',
+   'udev_device_get_sysnum',
+   'udev_device_get_udev'],
+  ''],
+ ['udev_device_has_tag',
+  '3',
+  ['udev_device_get_devlinks_list_entry',
+   'udev_device_get_properties_list_entry',
+   'udev_device_get_property_value',
+   'udev_device_get_sysattr_list_entry',
+   'udev_device_get_sysattr_value',
+   'udev_device_get_tags_list_entry',
+   'udev_device_set_sysattr_value'],
+  ''],
+ ['udev_device_new_from_syspath',
+  '3',
+  ['udev_device_new_from_device_id',
+   'udev_device_new_from_devnum',
+   'udev_device_new_from_environment',
+   'udev_device_new_from_subsystem_sysname',
+   'udev_device_ref',
+   'udev_device_unref'],
+  ''],
+ ['udev_enumerate_add_match_subsystem',
+  '3',
+  ['udev_enumerate_add_match_is_initialized',
+   'udev_enumerate_add_match_parent',
+   'udev_enumerate_add_match_property',
+   'udev_enumerate_add_match_sysattr',
+   'udev_enumerate_add_match_sysname',
+   'udev_enumerate_add_match_tag',
+   'udev_enumerate_add_nomatch_subsystem',
+   'udev_enumerate_add_nomatch_sysattr'],
+  ''],
+ ['udev_enumerate_new',
+  '3',
+  ['udev_enumerate_ref', 'udev_enumerate_unref'],
+  ''],
+ ['udev_enumerate_scan_devices',
+  '3',
+  ['udev_enumerate_add_syspath',
+   'udev_enumerate_get_list_entry',
+   'udev_enumerate_get_udev',
+   'udev_enumerate_scan_subsystems'],
+  ''],
+ ['udev_list_entry',
+  '3',
+  ['udev_list_entry_get_by_name',
+   'udev_list_entry_get_name',
+   'udev_list_entry_get_next',
+   'udev_list_entry_get_value'],
+  ''],
+ ['udev_monitor_filter_update',
+  '3',
+  ['udev_monitor_filter_add_match_subsystem_devtype',
+   'udev_monitor_filter_add_match_tag',
+   'udev_monitor_filter_remove'],
+  ''],
+ ['udev_monitor_new_from_netlink',
+  '3',
+  ['udev_monitor_ref', 'udev_monitor_unref'],
+  ''],
+ ['udev_monitor_receive_device',
+  '3',
+  ['udev_monitor_enable_receiving',
+   'udev_monitor_get_fd',
+   'udev_monitor_get_udev',
+   'udev_monitor_set_receive_buffer_size'],
+  ''],
+ ['udev_new', '3', ['udev_ref', 'udev_unref'], ''],
+ ['udevadm', '8', [], ''],
+ ['vconsole.conf', '5', [], 'ENABLE_VCONSOLE']
+]
+# Really, do not edit.
index 336dd33..6439395 100644 (file)
@@ -44,7 +44,7 @@
 
   <refnamediv>
     <refname>sd-bus</refname>
-    <refpurpose>A lightweight D-Bus and kdbus client library</refpurpose>
+    <refpurpose>A lightweight D-Bus IPC client library</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
   <refsect1>
     <title>Description</title>
 
-    <para><filename>sd-bus.h</filename> provides an implementation
-    of a D-Bus client. It can interoperate both with the traditional
-    <citerefentry project='man-pages'><refentrytitle>dbus-daemon</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-    and with kdbus. See
-    <ulink url="http://www.freedesktop.org/software/dbus/" />
-    for more information about the big picture.
+    <para><filename>sd-bus.h</filename> provides an implementation of a D-Bus IPC client. See
+    <ulink url="https://www.freedesktop.org/software/dbus/" />
+    for more information about D-Bus IPC.
     </para>
 
-    <important>
-      <para>Interfaces described here have not been declared stable yet,
-      and are not accessible from <filename>libsystemd.so</filename>.
-      This documentation is provided in hope it might be useful for
-      developers, without any guarantees of availability or stability.
-      </para>
-    </important>
-
     <para>See
+    <citerefentry><refentrytitle>sd-bus-errors</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_creds_get_pid</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_creds_new_from_pid</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_bus_default</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_new</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_request_name</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_start</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_error</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_error_add_map</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_get_name_creds</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_get_owner_creds</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_bus_message_append</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_message_append_basic</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_bus_message_append_array</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_message_append_basic</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_bus_message_append_string_memfd</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_bus_message_append_strv</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_bus_message_can_send</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_bus_message_get_cookie</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_bus_message_get_monotonic_usec</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_negotiate_fds</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_new</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_path_encode</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_request_name</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_bus_send</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_bus_set_address</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_set_allow_interactive_authorization</refentrytitle><manvolnum>3</manvolnum></citerefentry>
     <citerefentry><refentrytitle>sd_bus_set_description</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_bus_set_prepare</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_creds_get_pid</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_creds_new_from_pid</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_get_name_creds</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_get_owner_creds</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_negotiate_fds</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_path_encode</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd-bus-errors</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_error</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_error_add_map</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_bus_set_allow_interactive_authorization</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+    <citerefentry><refentrytitle>sd_bus_start</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_track_add_name</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>sd_bus_track_new</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     for more information about the functions available.</para>
   </refsect1>
 
     <para>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd-event</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>busctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry project='man-pages'><refentrytitle>dbus-daemon</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-      <citerefentry project='man-pages'><refentrytitle>dbus-send</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-      <ulink url="https://developer.gnome.org/gio/stable/gdbus.html">gdbus</ulink>
+      <citerefentry project='man-pages'><refentrytitle>dbus-send</refentrytitle><manvolnum>1</manvolnum></citerefentry>
     </para>
   </refsect1>
 
index fc615f0..24a69bb 100644 (file)
@@ -97,7 +97,7 @@
     iteration a single event source is dispatched. Each time an event
     source is dispatched the kernel is polled for new events, before
     the next event source is dispatched. The event loop is designed to
-    honour priorities and provide fairness within each priority. It is
+    honor priorities and provide fairness within each priority. It is
     not designed to provide optimal throughput, as this contradicts
     these goals due the limitations of the underlying <citerefentry
     project='man-pages'><refentrytitle>epoll</refentrytitle><manvolnum>7</manvolnum></citerefentry>
index ea79720..bc74e3f 100644 (file)
     <refname>sd-id128</refname>
     <refname>sd_id128_t</refname>
     <refname>SD_ID128_MAKE</refname>
+    <refname>SD_ID128_MAKE_STR</refname>
+    <refname>SD_ID128_NULL</refname>
     <refname>SD_ID128_CONST_STR</refname>
     <refname>SD_ID128_FORMAT_STR</refname>
     <refname>SD_ID128_FORMAT_VAL</refname>
     <refname>sd_id128_equal</refname>
+    <refname>sd_id128_is_null</refname>
     <refpurpose>APIs for processing 128-bit IDs</refpurpose>
   </refnamediv>
 
@@ -88,8 +91,8 @@
     union type:</para>
 
     <programlisting>typedef union sd_id128 {
-  uint8_t bytes[16];
-  uint64_t qwords[2];
+        uint8_t bytes[16];
+        uint64_t qwords[2];
 } sd_id128_t;</programlisting>
 
     <para>This union type allows accessing the 128-bit ID as 16
 
     <programlisting>#define SD_MESSAGE_COREDUMP SD_ID128_MAKE(fc,2e,22,bc,6e,e6,47,b6,b9,07,29,ab,34,a2,50,b1)</programlisting>
 
+    <para><function>SD_ID128_NULL</function> may be used to refer to the 128bit ID consisting of only NUL
+    bytes.</para>
+
+    <para><function>SD_ID128_MAKE_STR()</function> is similar to <function>SD_ID128_MAKE()</function>, but creates a
+    <type>const char*</type> expression that can be conveniently used in message formats and such:</para>
+
+    <programlisting>#include &lt;stdio.h&gt;
+#define SD_MESSAGE_COREDUMP_STR SD_ID128_MAKE_STR(fc,2e,22,bc,6e,e6,47,b6,b9,07,29,ab,34,a2,50,b1)
+
+int main(int argc, char **argv) {
+        puts("Match for coredumps: MESSAGE_ID=" SD_MESSAGE_COREDUMP_STR);
+}
+    </programlisting>
+
+
     <para><function>SD_ID128_CONST_STR()</function> may be used to
     convert constant 128-bit IDs into constant strings for output. The
     following example code will output the string
     "fc2e22bc6ee647b6b90729ab34a250b1":</para>
     <programlisting>int main(int argc, char *argv[]) {
-  puts(SD_ID128_CONST_STR(SD_MESSAGE_COREDUMP));
+        puts("Match for coredumps: %s", SD_ID128_CONST_STR(SD_MESSAGE_COREDUMP));
 }</programlisting>
 
-    <para><function>SD_ID128_FORMAT_STR</function> and
+    <para><function>SD_ID128_FORMAT_STR()</function> and
     <function>SD_ID128_FORMAT_VAL()</function> may be used to format a
     128-bit ID in a
     <citerefentry project='man-pages'><refentrytitle>printf</refentrytitle><manvolnum>3</manvolnum></citerefentry>
     format string, as shown in the following example:</para>
 
     <programlisting>int main(int argc, char *argv[]) {
-  sd_id128_t id;
-  id = SD_ID128_MAKE(ee,89,be,71,bd,6e,43,d6,91,e6,c5,5d,eb,03,02,07);
-  printf("The ID encoded in this C file is " SD_ID128_FORMAT_STR ".\n", SD_ID128_FORMAT_VAL(id));
-  return 0;
+        sd_id128_t id;
+        id = SD_ID128_MAKE(ee,89,be,71,bd,6e,43,d6,91,e6,c5,5d,eb,03,02,07);
+        printf("The ID encoded in this C file is " SD_ID128_FORMAT_STR ".\n", SD_ID128_FORMAT_VAL(id));
+        return 0;
 }</programlisting>
 
     <para>Use <function>sd_id128_equal()</function> to compare two 128-bit IDs:</para>
 
     <programlisting>int main(int argc, char *argv[]) {
-  sd_id128_t a, b, c;
-  a = SD_ID128_MAKE(ee,89,be,71,bd,6e,43,d6,91,e6,c5,5d,eb,03,02,07);
-  b = SD_ID128_MAKE(f2,28,88,9c,5f,09,44,15,9d,d7,04,77,58,cb,e7,3e);
-  c = a;
-  assert(sd_id128_equal(a, c));
-  assert(!sd_id128_equal(a, b));
-  return 0;
+        sd_id128_t a, b, c;
+        a = SD_ID128_MAKE(ee,89,be,71,bd,6e,43,d6,91,e6,c5,5d,eb,03,02,07);
+        b = SD_ID128_MAKE(f2,28,88,9c,5f,09,44,15,9d,d7,04,77,58,cb,e7,3e);
+        c = a;
+        assert(sd_id128_equal(a, c));
+        assert(!sd_id128_equal(a, b));
+        return 0;
+}</programlisting>
+
+    <para>Use <function>sd_id128_is_null()</function> to check if an 128bit ID consists of only NUL bytes:</para>
+
+    <programlisting>int main(int argc, char *argv[]) {
+        assert(sd_id128_is_null(SD_ID128_NULL));
 }</programlisting>
 
     <para>Note that new, randomized IDs may be generated with
     <citerefentry><refentrytitle>journalctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>'s
-    <option>--new-id</option> option.</para>
+    <option>--new-id128</option> option.</para>
   </refsect1>
 
   <xi:include href="libsystemd-pkgconfig.xml" />
index 09747a4..0f4b3e8 100644 (file)
@@ -77,7 +77,6 @@
     <citerefentry><refentrytitle>sd_journal_get_realtime_usec</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_journal_add_match</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_journal_seek_head</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-    <citerefentry><refentrytitle>sd_journal_query_enumerate</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_journal_enumerate_fields</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_journal_get_cursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_journal_get_cutoff_realtime_usec</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     tool.</para>
   </refsect1>
 
+  <refsect1>
+    <title>Thread safety</title>
+
+    <para>Functions that operate on the <structname>sd_journal</structname> object are thread
+    agnostic — given <structname>sd_journal</structname> pointer may only be used from one thread at
+    a time, but multiple threads may use multiple such objects safely. Other functions —
+    those that are used to send entries to the journal, like
+    <citerefentry><refentrytitle>sd_journal_print</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+    and similar, or those that are used to retrieve global information like
+    <citerefentry><refentrytitle>sd_journal_stream_fd</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+    and
+    <citerefentry><refentrytitle>sd_journal_get_catalog_for_message_id</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+    — are thread-safe and may be called from multiple threads in parallel.</para>
+  </refsect1>
+
   <xi:include href="libsystemd-pkgconfig.xml" />
 
   <refsect1>
       <citerefentry><refentrytitle>sd_journal_get_realtime_usec</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd_journal_add_match</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd_journal_seek_head</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>sd_journal_query_enumerate</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd_journal_enumerate_fields</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd_journal_get_cursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd_journal_get_cutoff_realtime_usec</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
index 328f711..6861fbe 100644 (file)
@@ -67,7 +67,7 @@
     local system. </para>
 
     <para>See <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/multiseat">Multi-Seat
+    url="https://www.freedesktop.org/wiki/Software/systemd/multiseat">Multi-Seat
     on Linux</ulink> for an introduction into multi-seat support on
     Linux, the background for this set of APIs.</para>
 
index 8bcf716..2014141 100644 (file)
     <title>Description</title>
 
     <para>
-      <function>sd_bus_add_match()</function> adds a match rule used to dispatch
-      incoming messages. The syntax of the rule passed in
-      <parameter>match</parameter> is described in the
-      <ulink url="https://dbus.freedesktop.org/doc/dbus-specification.html">D-Bus Specification</ulink>.
+      <function>sd_bus_add_match()</function> installs a match rule for incoming messages received on the specified bus
+      connection object <parameter>bus</parameter>. The syntax of the match rule expression passed in
+      <parameter>match</parameter> is described in the <ulink
+      url="https://dbus.freedesktop.org/doc/dbus-specification.html">D-Bus Specification</ulink>. The specified handler
+      function <parameter>callback</parameter> is called for eaching incoming message matching the specified
+      expression, the <parameter>userdata</parameter> parameter is passed as-is to the callback function.
     </para>
 
     <para>
-      The message <parameter>m</parameter> passed to the callback is only
-      borrowed, that is, the callback should not call
-      <citerefentry><refentrytitle>sd_bus_message_unref</refentrytitle><manvolnum>3</manvolnum></citerefentry>
-      on it. If the callback wants to hold on to the message beyond the lifetime
-      of the callback, it needs to call
-      <citerefentry><refentrytitle>sd_bus_message_ref</refentrytitle><manvolnum>3</manvolnum></citerefentry>
-      to create a new reference.
+      On success, and if non-<constant>NULL</constant>, the <parameter>slot</parameter> return parameter will be set to
+      a slot object that may be used as a reference to the installed match, and may be utilized to remove it again at a
+      later time with
+      <citerefentry><refentrytitle>sd_bus_slot_unref</refentrytitle><manvolnum>3</manvolnum></citerefentry>. If
+      specified as <constant>NULL</constant> the lifetime of the match is bound to the lifetime of the bus object itself, and the match
+      cannot be removed independently.
     </para>
 
     <para>
-      If an error occurs during the callback invocation, the callback should
-      return a negative error number. If it wants other callbacks that match the
-      same rule to be called, it should return 0. Otherwise it should return a
+      The message <parameter>m</parameter> passed to the callback is only borrowed, that is, the callback should not
+      call <citerefentry><refentrytitle>sd_bus_message_unref</refentrytitle><manvolnum>3</manvolnum></citerefentry> on
+      it. If the callback wants to hold on to the message beyond the lifetime of the callback, it needs to call
+      <citerefentry><refentrytitle>sd_bus_message_ref</refentrytitle><manvolnum>3</manvolnum></citerefentry> to create
+      a new reference.
+    </para>
+
+    <para>
+      If an error occurs during the callback invocation, the callback should return a negative error number. If it
+      wants other callbacks that match the same rule to be called, it should return 0. Otherwise it should return a
       positive integer.
     </para>
   </refsect1>
     <title>Return Value</title>
 
     <para>
-      On success, <function>sd_bus_add_match()</function> returns 0 or a
-      positive integer. On failure, it returns a negative errno-style error
-      code.
+      On success, <function>sd_bus_add_match()</function> returns 0 or a positive integer. On failure, it returns a
+      negative errno-style error code.
     </para>
   </refsect1>
 
 
     <para>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>sd-bus</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>sd-bus</refentrytitle><manvolnum>3</manvolnum></citerefentry>
     </para>
   </refsect1>
 
index 3bcda46..0407a96 100644 (file)
     -ENXIO is returned.</para>
 
     <para><function>sd_bus_creds_get_cgroup()</function> will retrieve
-    the cgroup path. See <ulink
+    the control group path. See <ulink
     url="https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt">cgroups.txt</ulink>.
     </para>
 
index 082f7b6..b4d7d61 100644 (file)
 
       <funcprototype>
         <funcdef>uint64_t <function>sd_bus_creds_get_mask</function></funcdef>
-        <paramdef>const sd_bus_creds *<parameter>c</parameter></paramdef>
+        <paramdef>sd_bus_creds *<parameter>c</parameter></paramdef>
       </funcprototype>
 
       <funcprototype>
         <funcdef>uint64_t <function>sd_bus_creds_get_augmented_mask</function></funcdef>
-        <paramdef>const sd_bus_creds *<parameter>c</parameter></paramdef>
+        <paramdef>sd_bus_creds *<parameter>c</parameter></paramdef>
       </funcprototype>
 
       <funcprototype>
index c2d7ee3..4970ce3 100644 (file)
@@ -68,7 +68,7 @@
       <funcsynopsisinfo>typedef struct {
         const char *name;
         const char *message;
-        ...
+        …
 } sd_bus_error;</funcsynopsisinfo>
 
       <para>
@@ -95,7 +95,7 @@
         <paramdef>sd_bus_error *<parameter>e</parameter></paramdef>
         <paramdef>const char *<parameter>name</parameter></paramdef>
         <paramdef>const char *<parameter>format</parameter></paramdef>
-        <paramdef>...</paramdef>
+        <paramdef></paramdef>
       </funcprototype>
 
       <funcprototype>
         <paramdef>sd_bus_error *<parameter>e</parameter></paramdef>
         <paramdef>int <parameter>error</parameter></paramdef>
         <paramdef>const char *<parameter>format</parameter></paramdef>
-        <paramdef>...</paramdef>
+        <paramdef></paramdef>
       </funcprototype>
 
       <funcprototype>
     <parameter>dst</parameter> using the values in
     <parameter>e</parameter>. If the strings in
     <parameter>e</parameter> were set using
-    <function>sd_bus_set_error_const()</function>, they will be shared.
+    <function>sd_bus_error_set_const()</function>, they will be shared.
     Otherwise, they will be copied. Returns a converted
     <varname>errno</varname>-like, negative error code.</para>
 
index 139bd77..a1eda21 100644 (file)
@@ -58,7 +58,7 @@
       <funcsynopsisinfo>typedef struct {
         const char *name;
         int code;
-        ...
+        …
 } sd_bus_error_map;</funcsynopsisinfo>
 
     </funcsynopsis>
index 9f9968b..2c28ee7 100644 (file)
@@ -59,7 +59,7 @@
         <funcdef>int sd_bus_message_append</funcdef>
         <paramdef>sd_bus_message *<parameter>m</parameter></paramdef>
         <paramdef>const char *<parameter>types</parameter></paramdef>
-        <paramdef>...</paramdef>
+        <paramdef></paramdef>
       </funcprototype>
 
       <funcprototype>
       </tgroup>
     </table>
 
+    <para>For types "s" and "g" (unicode string or signature), the pointer may be
+    <constant>NULL</constant>, which is equivalent to an empty string. See
+    <citerefentry><refentrytitle>sd_bus_message_append_basic</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+    for the precise interpretation of those and other types.</para>
+
   </refsect1>
 
   <refsect1>
@@ -210,7 +215,7 @@ dictionary ::= "a" "{" basic_type complete_type "}"
     </para>
 
     <programlisting>sd_bus_message *m;
-...
+…
 sd_bus_message_append(m, "s", "a string");</programlisting>
 
     <para>Append all types of integers:</para>
index a538b13..1501e14 100644 (file)
     setting as negotiated by the program ultimately activated. By
     default, file descriptor passing is enabled for both.</para>
 
-    <para><function>sd_bus_negotiate_timestamps()</function> controls
-    whether implicit sender timestamps shall be attached automatically
-    to all incoming messages. Takes a bus object and a boolean, which,
-    when true, enables timestamping, and, when false, disables it.
-    Use
+    <para><function>sd_bus_negotiate_timestamp()</function> controls whether implicit sender
+    timestamps shall be attached automatically to all incoming messages. Takes a bus object and a
+    boolean, which, when true, enables timestamping, and, when false, disables it.  Use
     <citerefentry><refentrytitle>sd_bus_message_get_monotonic_usec</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_bus_message_get_realtime_usec</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
     <citerefentry><refentrytitle>sd_bus_message_get_seqnum</refentrytitle><manvolnum>3</manvolnum></citerefentry>
-    to query the timestamps of incoming messages. If negotiation is
-    disabled or not supported, these calls will fail with
-    <constant>-ENODATA</constant>. Note that not all transports
-    support timestamping of messages. Specifically, timestamping is
-    only available on the kdbus transport, but not on dbus1. The
-    timestamping is applied by the kernel and cannot be manipulated by
-    userspace. By default, message timestamping is not negotiated for
+    to query the timestamps of incoming messages. If negotiation is disabled or not supported, these
+    calls will fail with <constant>-ENODATA</constant>. Note that currently no transports support
+    timestamping of messages. By default, message timestamping is not negotiated for
     connections.</para>
 
-    <para><function>sd_bus_negotiate_creds()</function> controls
-    whether and which implicit sender credentials shall be attached
-    automatically to all incoming messages. Takes a bus object and a
-    boolean indicating whether to enable or disable the credential
-    parts encoded in the bit mask value argument. Note that not all
-    transports support attaching sender credentials to messages, or do
-    not support all types of sender credential parameters, or might
-    suppress them under certain circumstances for individual
-    messages. Specifically, implicit sender credentials on messages
-    are only fully supported on kdbus transports, and dbus1 only
-    supports <constant>SD_BUS_CREDS_UNIQUE_NAME</constant>. The sender
-    credentials are attached by the kernel and cannot be manipulated
-    by userspace, and are thus suitable for authorization
-    decisions. By default, only
-    <constant>SD_BUS_CREDS_WELL_KNOWN_NAMES</constant> and
-    <constant>SD_BUS_CREDS_UNIQUE_NAME</constant> are enabled. In
-    fact, these two credential fields are always sent along and cannot
-    be turned off.</para>
+    <para><function>sd_bus_negotiate_creds()</function> controls whether and which implicit sender
+    credentials shall be attached automatically to all incoming messages. Takes a bus object and a
+    boolean indicating whether to enable or disable the credential parts encoded in the bit mask
+    value argument. Note that not all transports support attaching sender credentials to messages,
+    or do not support all types of sender credential parameters, or might suppress them under
+    certain circumstances for individual messages. Specifically, dbus1 only supports
+    <constant>SD_BUS_CREDS_UNIQUE_NAME</constant>. The sender credentials are suitable for
+    authorization decisions. By default, only <constant>SD_BUS_CREDS_WELL_KNOWN_NAMES</constant> and
+    <constant>SD_BUS_CREDS_UNIQUE_NAME</constant> are enabled. In fact, these two credential fields
+    are always sent along and cannot be turned off.</para>
 
     <para>The <function>sd_bus_negotiate_fds()</function> function may
     be called only before the connection has been started with
index 3088243..986eccc 100644 (file)
@@ -66,7 +66,7 @@
         <funcdef>int <function>sd_bus_path_encode_many</function></funcdef>
         <paramdef>char **<parameter>out</parameter></paramdef>
         <paramdef>const char *<parameter>path_template</parameter></paramdef>
-        <paramdef>...</paramdef>
+        <paramdef></paramdef>
       </funcprototype>
 
       <funcprototype>
@@ -80,7 +80,7 @@
         <funcdef>int <function>sd_bus_path_decode_many</function></funcdef>
         <paramdef>const char *<parameter>path</parameter></paramdef>
         <paramdef>const char *<parameter>path_template</parameter></paramdef>
-        <paramdef>...</paramdef>
+        <paramdef></paramdef>
       </funcprototype>
     </funcsynopsis>
   </refsynopsisdiv>
diff --git a/man/sd_bus_track_add_name.xml b/man/sd_bus_track_add_name.xml
new file mode 100644 (file)
index 0000000..6a5e344
--- /dev/null
@@ -0,0 +1,261 @@
+<?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">
+
+<!--
+  This file is part of systemd.
+
+  Copyright 2016 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/>.
+-->
+
+<refentry id="sd_bus_track_add_name">
+
+  <refentryinfo>
+    <title>sd_bus_track_add_name</title>
+    <productname>systemd</productname>
+
+    <authorgroup>
+      <author>
+        <contrib>Developer</contrib>
+        <firstname>Lennart</firstname>
+        <surname>Poettering</surname>
+        <email>lennart@poettering.net</email>
+      </author>
+    </authorgroup>
+  </refentryinfo>
+
+  <refmeta>
+    <refentrytitle>sd_bus_track_add_name</refentrytitle>
+    <manvolnum>3</manvolnum>
+  </refmeta>
+
+  <refnamediv>
+    <refname>sd_bus_track_add_name</refname>
+    <refname>sd_bus_track_add_sender</refname>
+    <refname>sd_bus_track_remove_name</refname>
+    <refname>sd_bus_track_remove_sender</refname>
+    <refname>sd_bus_track_count</refname>
+    <refname>sd_bus_track_count_sender</refname>
+    <refname>sd_bus_track_count_name</refname>
+    <refname>sd_bus_track_contains</refname>
+    <refname>sd_bus_track_first</refname>
+    <refname>sd_bus_track_next</refname>
+
+    <refpurpose>Add, remove and retrieve bus peers tracked in a bus peer tracking object</refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <funcsynopsis>
+      <funcsynopsisinfo>#include &lt;systemd/sd-bus.h&gt;</funcsynopsisinfo>
+
+      <funcprototype>
+        <funcdef>int <function>sd_bus_track_add_name</function></funcdef>
+        <paramdef>sd_bus_track* <parameter>t</parameter></paramdef>
+        <paramdef>const char* <parameter>name</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>int <function>sd_bus_track_add_sender</function></funcdef>
+        <paramdef>sd_bus_track* <parameter>t</parameter></paramdef>
+        <paramdef>sd_bus_message* <parameter>message</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>int <function>sd_bus_track_remove_name</function></funcdef>
+        <paramdef>sd_bus_track* <parameter>t</parameter></paramdef>
+        <paramdef>const char* <parameter>name</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>int <function>sd_bus_track_remove_sender</function></funcdef>
+        <paramdef>sd_bus_track* <parameter>t</parameter></paramdef>
+        <paramdef>sd_bus_message* <parameter>message</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>unsigned <function>sd_bus_track_count</function></funcdef>
+        <paramdef>sd_bus_track* <parameter>t</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>int <function>sd_bus_track_count_name</function></funcdef>
+        <paramdef>sd_bus_track* <parameter>t</parameter></paramdef>
+        <paramdef>const char* <parameter>name</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>int <function>sd_bus_track_count_sender</function></funcdef>
+        <paramdef>sd_bus_track* <parameter>t</parameter></paramdef>
+        <paramdef>sd_bus_message* <parameter>message</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>int <function>sd_bus_track_contains</function></funcdef>
+        <paramdef>sd_bus_track* <parameter>t</parameter></paramdef>
+        <paramdef>const char* <parameter>name</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>const char* <function>sd_bus_track_first</function></funcdef>
+        <paramdef>sd_bus_track* <parameter>t</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>const char* <function>sd_bus_track_next</function></funcdef>
+        <paramdef>sd_bus_track* <parameter>t</parameter></paramdef>
+      </funcprototype>
+
+    </funcsynopsis>
+  </refsynopsisdiv>
+
+  <refsect1>
+    <title>Description</title>
+
+    <para><function>sd_bus_track_add_name()</function> adds a peer to track to a bus peer tracking object. The first
+    argument should refer to a bus peer tracking object created with
+    <citerefentry><refentrytitle>sd_bus_track_new</refentrytitle><manvolnum>3</manvolnum></citerefentry>, the second
+    name should refer to a D-Bus peer name to track, either in unique or well-known service format. If the name is not
+    tracked yet it will be added to the list of names to track. If it already is being tracked and non-recursive mode
+    is enabled, no operation is executed by this call. If recursive mode is enabled a per-name counter is increased by
+    one each time this call is invoked, and <function>sd_bus_track_remove_name()</function> has to be called as many
+    times as <function>sd_bus_track_add_name()</function> was invoked before in order to stop tracking of the name. Use
+    <citerefentry><refentrytitle>sd_bus_track_set_recursive</refentrytitle><manvolnum>3</manvolnum></citerefentry> to
+    switch from the default non-recursive mode to recursive mode, or back. Note that the specified name is tracked as
+    it is, well-known names are not resolved to unique names by this call. Note that multiple bus peer tracking objects
+    may track the same name.</para>
+
+    <para><function>sd_bus_track_remove_name()</function> undoes the effect of
+    <function>sd_bus_track_add_name()</function> and removes a bus peer name from the list of peers to watch. Depending
+    on whether non-recursive or recursive mode is enabled for the bus peer tracking object this call will either remove
+    the name fully from the tracking object, or will simply decrement the per-name counter by one, removing the name
+    only when the counter reaches zero (see above). Note that a bus peer disconnecting from the bus will implicitly
+    remove its names fully from the bus peer tracking object, regardless of the current per-name counter.</para>
+
+    <para><function>sd_bus_track_add_sender()</function> and <function>sd_bus_track_remove_sender()</function> are
+    similar to <function>sd_bus_track_add_name()</function> and <function>sd_bus_track_remove_name()</function> but
+    take a bus message as argument. The sender of this bus message is determined and added to/removed from the bus peer
+    tracking object. As messages always originate from unique names, and never from well-known names this means that
+    this call will effectively only add unique names to the bus peer tracking object.</para>
+
+    <para><function>sd_bus_track_count()</function> returns the number of names currently being tracked by the
+    specified bus peer tracking object. Note that this function always returns the actual number of names tracked, and
+    hence if <function>sd_bus_track_add_name()</function> has been invoked multiple times for the same name it is only
+    counted as one, regardless if recursive mode is used or not.</para>
+
+    <para><function>sd_bus_track_count_name()</function> returns the current per-name counter for the specified
+    name. If non-recursive mode is used this returns either 1 or 0, depending on whether the specified name has been
+    added to the tracking object before, or not. If recursive mode has been enabled, values larger than 1 may be
+    returned too, in case <function>sd_bus_track_add_name()</function> has been called multiple times for the same
+    name.</para>
+
+    <para><function>sd_bus_track_count_sender()</function> is similar to
+    <function>sd_bus_track_count_name()</function>, but takes a bus message object and returns the per-name counter
+    matching the sender of the message.</para>
+
+    <para><function>sd_bus_track_contains()</function> may be used to determine whether the specified name has been
+    added at least once to the specified bus peer tracking object.</para>
+
+    <para><function>sd_bus_track_first()</function> and <function>sd_bus_track_next()</function> may be used to
+    enumerate all names currently being tracked by the passed bus peer tracking
+    object. <function>sd_bus_track_first()</function> returns the first entry in the object, and resets an internally
+    maintained read index. Each subsequent invocation of <function>sd_bus_track_next()</function> returns the next name
+    contained in the bus object. If the end is reached <constant>NULL</constant> is returned. If no names have been
+    added to the object yet <function>sd_bus_track_first()</function> will return <constant>NULL</constant>
+    immediately. The order in which names are returned is undefined; in particular which name is considered the first
+    returned is not defined. If recursive mode is enabled and the same name has been added multiple times to the bus
+    peer tracking object it is only returned once by this enumeration. If new names are added to or existing names
+    removed from the bus peer tracking object while it is being enumerated the enumeration ends on the next invocation
+    of <function>sd_bus_track_next()</function> as <constant>NULL</constant> is returned.</para>
+  </refsect1>
+
+  <refsect1>
+    <title>Return Value</title>
+
+    <para>On success, <function>sd_bus_track_add_name()</function> and <function>sd_bus_track_add_sender()</function>
+    return 0 if the specified name has already been added to the bus peer tracking object before and positive if it
+    hasn't. On failure, they return a negative errno-style error code.</para>
+
+    <para><function>sd_bus_track_remove_name()</function> and <function>sd_bus_track_remove_sender()</function> return
+    positive if the specified name was previously tracked by the bus peer tracking object and has now been removed. In
+    non-recursive mode, 0 is returned if the specified name was not being tracked yet. In recursive mode
+    <constant>-EUNATCH</constant> is returned in this case. On failure, they return a negative errno-style error
+    code.</para>
+
+    <para><function>sd_bus_track_count()</function> returns the number of names currently being tracked, or 0 on
+    failure.</para>
+
+    <para><function>sd_bus_track_count_name()</function> and <function>sd_bus_track_count_sender()</function> return
+    the current per-name counter for the specified name or the sender of the specified message. Zero is returned for
+    names that are not being tracked yet, a positive value for names added at least once. Larger values than 1 are only
+    returned in recursive mode. On failure, a negative errno-style error code is returned.</para>
+
+    <para><function>sd_bus_track_contains()</function> returns the passed name if it exists in the bus peer tracking
+    object. On failure, and if the name has not been added yet <constant>NULL</constant> is returned.</para>
+
+    <para><function>sd_bus_track_first()</function> and <function>sd_bus_track_next()</function> return the first/next
+    name contained in the bus peer tracking object, and <constant>NULL</constant> if the end of the enumeration is
+    reached and on error.</para>
+  </refsect1>
+
+  <refsect1>
+    <title>Errors</title>
+
+    <para>Returned errors may indicate the following problems:</para>
+
+    <variablelist>
+
+      <varlistentry>
+        <term><constant>-EUNATCH</constant></term>
+
+        <listitem><para><function>sd_bus_track_remove_name()</function> or
+        <function>sd_bus_track_remove_sender()</function> have been invoked for a name not previously added to the bus
+        peer object.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><constant>-EINVAL</constant></term>
+
+        <listitem><para>Specified parameter is invalid.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><constant>-ENOMEM</constant></term>
+
+        <listitem><para>Memory allocation failed.</para></listitem>
+      </varlistentry>
+
+    </variablelist>
+  </refsect1>
+
+  <refsect1>
+    <title>Notes</title>
+
+    <para><function>sd_bus_track_add_name()</function> and the other calls described here are available as a shared library,
+    which can be compiled and linked to with the <constant>libsystemd</constant> <citerefentry
+    project='die-net'><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry> file.</para>
+  </refsect1>
+
+  <refsect1>
+    <title>See Also</title>
+
+    <para>
+      <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>sd-bus</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>sd_bus_track_new</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+    </para>
+  </refsect1>
+
+</refentry>
diff --git a/man/sd_bus_track_new.xml b/man/sd_bus_track_new.xml
new file mode 100644 (file)
index 0000000..60e2e77
--- /dev/null
@@ -0,0 +1,263 @@
+<?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">
+
+<!--
+  This file is part of systemd.
+
+  Copyright 2016 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/>.
+-->
+
+<refentry id="sd_bus_track_new">
+
+  <refentryinfo>
+    <title>sd_bus_track_new</title>
+    <productname>systemd</productname>
+
+    <authorgroup>
+      <author>
+        <contrib>Developer</contrib>
+        <firstname>Lennart</firstname>
+        <surname>Poettering</surname>
+        <email>lennart@poettering.net</email>
+      </author>
+    </authorgroup>
+  </refentryinfo>
+
+  <refmeta>
+    <refentrytitle>sd_bus_track_new</refentrytitle>
+    <manvolnum>3</manvolnum>
+  </refmeta>
+
+  <refnamediv>
+    <refname>sd_bus_track_new</refname>
+    <refname>sd_bus_track_ref</refname>
+    <refname>sd_bus_track_unref</refname>
+    <refname>sd_bus_track_unrefp</refname>
+    <refname>sd_bus_track_set_recursive</refname>
+    <refname>sd_bus_track_get_recursive</refname>
+    <refname>sd_bus_track_get_bus</refname>
+    <refname>sd_bus_track_get_userdata</refname>
+    <refname>sd_bus_track_set_userdata</refname>
+
+    <refpurpose>Track bus peers</refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <funcsynopsis>
+      <funcsynopsisinfo>#include &lt;systemd/sd-bus.h&gt;</funcsynopsisinfo>
+
+      <funcprototype>
+        <funcdef>int <function>sd_bus_track_new</function></funcdef>
+        <paramdef>sd_bus* <parameter>bus</parameter></paramdef>
+        <paramdef>sd_bus_track** <parameter>ret</parameter></paramdef>
+        <paramdef>sd_bus_track_handler_t <parameter>handler</parameter></paramdef>
+        <paramdef>void* <parameter>userdata</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>sd_bus_track *<function>sd_bus_track_ref</function></funcdef>
+        <paramdef>sd_bus_track *<parameter>t</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>sd_bus_track *<function>sd_bus_track_unref</function></funcdef>
+        <paramdef>sd_bus_track *<parameter>t</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>void <function>sd_bus_track_unrefp</function></funcdef>
+        <paramdef>sd_bus_track **<parameter>t</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>int <function>sd_bus_track_get_recursive</function></funcdef>
+        <paramdef>sd_bus_track *<parameter>t</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>int <function>sd_bus_track_set_recursive</function></funcdef>
+        <paramdef>sd_bus_track *<parameter>t</parameter></paramdef>
+        <paramdef>int <parameter>b</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>sd_bus* <function>sd_bus_track_get_bus</function></funcdef>
+        <paramdef>sd_bus_track *<parameter>t</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>void* <function>sd_bus_track_get_userdata</function></funcdef>
+        <paramdef>sd_bus_track *<parameter>t</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>void* <function>sd_bus_track_set_userdata</function></funcdef>
+        <paramdef>sd_bus_track *<parameter>t</parameter></paramdef>
+        <paramdef>void *userdata</paramdef>
+      </funcprototype>
+
+    </funcsynopsis>
+  </refsynopsisdiv>
+
+  <refsect1>
+    <title>Description</title>
+
+    <para><function>sd_bus_track_new()</function> creates a new bus peer tracking object. The object is allocated for
+    the specified bus, and returned in the <parameter>*ret</parameter> parameter. After use, the object should be freed
+    again by dropping the acquired reference with <function>sd_bus_track_unref()</function> (see below). A bus peer
+    tracking object may be used to keep track of peers on a specific IPC bus, for cases where peers are making use of
+    one or more local objects, in order to control the lifecycle of the local objects and ensure they stay around as
+    long as the peers needing them are around, and unreferenced (and possibly destroyed) as soon as all relevant peers
+    have vanished. Each bus peer tracking object may be used to track zero, one or more peers add a time. References to
+    specific bus peers are added via
+    <citerefentry><refentrytitle>sd_bus_track_add_name</refentrytitle><manvolnum>3</manvolnum></citerefentry> or
+    <function>sd_bus_track_add_sender()</function>. They may be dropped again via
+    <function>sd_bus_track_remove_name()</function> and
+    <function>sd_bus_track_remove_sender()</function>. Alternatively, references on peers are removed automatically
+    when they disconnect from the bus.  If non-NULL the <parameter>handler</parameter> may specify a function that is
+    invoked whenever the last reference is dropped, regardless whether the reference is dropped explicitly via
+    <function>sd_bus_track_remove_name()</function> or implicitly because the peer disconnected from the bus. The final
+    argument <parameter>userdata</parameter> may be used to attach a generic user data pointer to the object. This
+    pointer is passed to the handler callback when it is invoked.</para>
+
+    <para><function>sd_bus_track_ref()</function> creates a new reference to a bus peer tracking object. This object
+    will not be destroyed until <function>sd_bus_track_unref()</function> has been called as many times plus once
+    more. Once the reference count has dropped to zero, the specified object cannot be used anymore, further calls to
+    <function>sd_bus_track_ref()</function> or <function>sd_bus_track_unref()</function> on the same object are
+    illegal.</para>
+
+    <para><function>sd_bus_track_unref()</function> destroys a reference to a bus peer tracking object.</para>
+
+    <para><function>sd_bus_track_unrefp()</function> is similar to <function>sd_bus_track_unref()</function> but takes
+    a pointer to a pointer to an <type>sd_bus_track</type> object. This call is useful in conjunction with GCC's and
+    LLVM's <ulink url="https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html">Clean-up Variable
+    Attribute</ulink>. Note that this function is defined as inline function.</para>
+
+    <para><function>sd_bus_track_ref()</function>, <function>sd_bus_track_unref()</function> and
+    <function>sd_bus_track_unrefp()</function> execute no operation if the passed in bus peer tracking object is
+    <constant>NULL</constant>.</para>
+
+    <para>Bus peer tracking objects may exist in two modes: by default they operate in non-recursive mode, but may
+    optionally be switched into recursive mode. If operating in the default non-recursive mode a peer is either tracked
+    or not tracked. In this mode invoking <function>sd_bus_track_add_name()</function> multiple times in a row for the
+    same peer is fully equivalent to calling it just once, as the call adds the peer to the set of tracked peers if
+    necessary, and executes no operation if the peer is already being tracked. A single invocation of
+    <function>sd_bus_track_remove_name()</function> removes the reference on the peer again, regardless how many times
+    <function>sd_bus_track_add_name()</function> was called before. If operating in recursive mode, the number of times
+    <function>sd_bus_track_add_name()</function> is invoked for the same peer name is counted and
+    <function>sd_bus_track_remove_name()</function> must be called the same number of times before the peer is not
+    tracked anymore, with the exception when the tracked peer vanishes from the bus, in which case the count is
+    irrelevant and the tracking of the specific peer is immediately
+    removed. <function>sd_bus_track_get_recursive()</function> may be used to determine whether the bus peer tracking
+    object is operating in recursive mode. <function>sd_bus_track_set_recursive()</function> may be used to enable or
+    disable recursive mode. By default a bus peer tracking object operates in non-recursive mode, and
+    <function>sd_bus_track_get_recursive()</function> for a newly allocated object hence returns a value equal to
+    zero. Use <function>sd_bus_track_set_recursive()</function> to enable recursive mode, right after allocation. It
+    takes a boolean argument to enable or disable recursive mode. Note that tracking objects for which
+    <function>sd_bus_track_add_name()</function> was already invoked at least once (and which hence track already one
+    or more peers) may not be switched from recursive to non-recursive mode anymore.</para>
+
+    <para><function>sd_bus_track_get_bus()</function> returns the bus object the bus peer tracking object belongs
+    to. It returns the bus object initially passed to <function>sd_bus_track_new()</function> when the object was
+    allocated.</para>
+
+    <para><function>sd_bus_track_get_userdata()</function> returns the generic user data pointer set on the bus peer
+    tracking object at the time of creation using <function>sd_bus_track_new()</function> or at a later time, using
+    <function>sd_bus_track_set_userdata()</function>.</para>
+  </refsect1>
+
+  <refsect1>
+    <title>Return Value</title>
+
+    <para>On success, <function>sd_bus_track_new()</function> and <function>sd_bus_track_set_recursive()</function>
+    return 0 or a positive integer. On failure, they return a negative errno-style error code.</para>
+
+    <para><function>sd_bus_track_ref()</function> always returns the argument.</para>
+
+    <para><function>sd_bus_track_unref()</function> always returns <constant>NULL</constant>.</para>
+
+    <para><function>sd_bus_track_get_recursive()</function> returns 0 if non-recursive mode is selected (default), and
+    greater than 0 if recursive mode is selected. On failure a negative errno-style error code is returned.</para>
+
+    <para><function>sd_bus_track_get_bus()</function> returns the bus object associated to the bus peer tracking
+    object.</para>
+
+    <para><function>sd_bus_track_get_userdata()</function> returns the generic user data pointer associated with the
+    bus peer tracking object. <function>sd_bus_track_set_userdata()</function> returns the previous user data pointer
+    set.</para>
+
+  </refsect1>
+
+  <refsect1>
+    <title>Reference ownership</title>
+
+    <para>The <function>sd_bus_track_new()</function> function creates a new object and the caller owns the sole
+    reference. When not needed anymore, this reference should be destroyed with
+    <function>sd_bus_track_unref()</function>.
+    </para>
+  </refsect1>
+
+  <refsect1>
+    <title>Errors</title>
+
+    <para>Returned errors may indicate the following problems:</para>
+
+    <variablelist>
+
+      <varlistentry>
+        <term><constant>-EBUSY</constant></term>
+
+        <listitem><para>Bus peers have already been added to the bus peer tracking object and
+        <function>sd_bus_track_set_recursive()</function> was called to change tracking mode.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><constant>-EINVAL</constant></term>
+
+        <listitem><para>Specified parameter is invalid
+        (<constant>NULL</constant> in case of output
+        parameters).</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><constant>-ENOMEM</constant></term>
+
+        <listitem><para>Memory allocation failed.</para></listitem>
+      </varlistentry>
+
+    </variablelist>
+  </refsect1>
+
+  <refsect1>
+    <title>Notes</title>
+
+    <para><function>sd_bus_track_new()</function> and the other calls described here are available as a shared library,
+    which can be compiled and linked to with the <constant>libsystemd</constant> <citerefentry
+    project='die-net'><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry> file.</para>
+  </refsect1>
+
+  <refsect1>
+    <title>See Also</title>
+
+    <para>
+      <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>sd-bus</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+      <citerefentry><refentrytitle>sd_bus_track_add_name</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+    </para>
+  </refsect1>
+
+</refentry>
index d9ebd3b..ab28b33 100644 (file)
   <refsect1>
     <title>Return Value</title>
 
-    <para>On success, this functions return 0 or a positive
+    <para>On success, these functions return 0 or a positive
     integer. On failure, they return a negative errno-style error
     code.</para>
   </refsect1>
index 2c23b00..c0a5e98 100644 (file)
   <refsect1>
     <title>Return Value</title>
 
-    <para>On success, <function>sd_event_new()</function> and
-    <function>sd_event_default()</function> return 0 or a positive
+    <para>On success, <function>sd_event_new()</function>,
+    <function>sd_event_default()</function> and
+    <function>sd_event_get_tid()</function> return 0 or a positive
     integer. On failure, they return a negative errno-style error
     code. <function>sd_event_ref()</function> always returns a pointer
     to the event loop object passed
index 24861d0..ee61d23 100644 (file)
     specified as <parameter>callback</parameter> will be invoked
     immediately before the event loop goes to sleep to wait for
     incoming events. It is invoked with the user data pointer passed
-    when the event source was created. The callback function may be
-    used to reconfigure the precise events to wait for. If the
-    <parameter>callback</parameter> parameter is passed as NULL the
-    callback function is reset. </para>
+    when the event source was created. The event source will be disabled
+    if the callback function returns a negative error code. The callback
+    function may be used to reconfigure the precise events to wait for.
+    If the <parameter>callback</parameter> parameter is passed as NULL
+    the callback function is reset. </para>
 
     <para>Event source objects have no preparation callback associated
     when they are first created with calls such as
index 8c9b39f..b6bab6d 100644 (file)
@@ -57,9 +57,9 @@
       <funcsynopsisinfo>#include &lt;systemd/sd-event.h&gt;</funcsynopsisinfo>
 
       <funcsynopsisinfo><token>enum</token> {
-        <constant>SD_EVENT_SOURCE_IMPORTANT</constant> = -100,
-        <constant>SD_EVENT_SOURCE_NORMAL</constant> = 0,
-        <constant>SD_EVENT_SOURCE_IDLE</constant> = 100,
+        <constant>SD_EVENT_PRIORITY_IMPORTANT</constant> = -100,
+        <constant>SD_EVENT_PRIORITY_NORMAL</constant> = 0,
+        <constant>SD_EVENT_PRIORITY_IDLE</constant> = 100,
 };</funcsynopsisinfo>
 
       <funcprototype>
     reliable. However, it is guaranteed that if events are seen on
     multiple same-priority event sources at the same time, each one is
     not dispatched again until all others have been dispatched
-    once. This behaviour guarantees that within each priority
+    once. This behavior guarantees that within each priority
     particular event sources do not starve or dominate the event
     loop.</para>
 
index 37eb3fc..c053144 100644 (file)
     <title>Description</title>
 
     <para><function>sd_get_seats()</function> may be used to determine
-    all currently available local seats. Returns a
-    <constant>NULL</constant> terminated array of seat identifiers.
+    all currently available local seats. Returns the number of seat
+    identifiers and if the input pointer is non-NULL, a
+    <constant>NULL</constant>-terminated array of seat identifiers
+    is stored at the address.
     The returned array and all strings it references need to be freed
     with the libc
     <citerefentry project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
     <variablelist>
 
       <varlistentry>
-        <term><constant>-EINVAL</constant></term>
-
-        <listitem><para>An input parameter was invalid (out of range,
-        or NULL, where that is not accepted).</para></listitem>
-      </varlistentry>
-
-      <varlistentry>
         <term><constant>-ENOMEM</constant></term>
 
         <listitem><para>Memory allocation failed.</para></listitem>
index 2ad1f8f..3938c6d 100644 (file)
@@ -44,7 +44,9 @@
 
   <refnamediv>
     <refname>sd_id128_get_machine</refname>
+    <refname>sd_id128_get_machine_app_specific</refname>
     <refname>sd_id128_get_boot</refname>
+    <refname>sd_id128_get_invocation</refname>
     <refpurpose>Retrieve 128-bit IDs</refpurpose>
   </refnamediv>
 
       </funcprototype>
 
       <funcprototype>
+        <funcdef>int <function>sd_id128_get_machine_app_specific</function></funcdef>
+        <paramdef>sd_id128_t <parameter>app_id</parameter></paramdef>
+        <paramdef>sd_id128_t *<parameter>ret</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
         <funcdef>int <function>sd_id128_get_boot</function></funcdef>
         <paramdef>sd_id128_t *<parameter>ret</parameter></paramdef>
       </funcprototype>
 
+      <funcprototype>
+        <funcdef>int <function>sd_id128_get_invocation</function></funcdef>
+        <paramdef>sd_id128_t *<parameter>ret</parameter></paramdef>
+      </funcprototype>
+
     </funcsynopsis>
   </refsynopsisdiv>
 
   <refsect1>
     <title>Description</title>
 
-    <para><function>sd_id128_get_machine()</function> returns the
-    machine ID of the executing host. This reads and parses the
-    <citerefentry><refentrytitle>machine-id</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-    file. This function caches the machine ID internally to make
-    retrieving the machine ID a cheap operation.</para>
+    <para><function>sd_id128_get_machine()</function> returns the machine ID of the executing host. This reads and
+    parses the <citerefentry><refentrytitle>machine-id</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+    file. This function caches the machine ID internally to make retrieving the machine ID a cheap operation. This ID
+    may be used wherever a unique identifier for the local system is needed. However, it is recommended to use this ID
+    as-is only in trusted environments. In untrusted environments it is recommended to derive an application specific
+    ID from this machine ID, in an irreversable (cryptographically secure) way. To make this easy
+    <function>sd_id128_get_machine_app_specific()</function> is provided, see below.</para>
+
+    <para><function>sd_id128_get_machine_app_specific()</function> is similar to
+    <function>sd_id128_get_machine()</function>, but retrieves a machine ID that is specific to the application that is
+    identified by the indicated application ID. It is recommended to use this function instead of
+    <function>sd_id128_get_machine()</function> when passing an ID to untrusted environments, in order to make sure
+    that the original machine ID may not be determined externally. The application-specific ID should be generated via
+    a tool like <command>journalctl --new-id128</command>, and may be compiled into the application. This function will
+    return the same application-specific ID for each combination of machine ID and application ID. Internally, this
+    function calculates HMAC-SHA256 of the application ID, keyed by the machine ID.</para>
 
     <para><function>sd_id128_get_boot()</function> returns the boot ID
     of the executing kernel. This reads and parses the
     for more information. This function also internally caches the
     returned ID to make this call a cheap operation.</para>
 
-    <para>Note that <function>sd_id128_get_boot()</function> always
-    returns a UUID v4 compatible ID.
-    <function>sd_id128_get_machine()</function> will also return a
-    UUID v4-compatible ID on new installations but might not on older.
-    It is possible to convert the machine ID into a UUID v4-compatible
-    one. For more information, see
+    <para><function>sd_id128_get_invocation()</function> returns the invocation ID of the currently executed
+    service. In its current implementation, this reads and parses the <varname>$INVOCATION_ID</varname> environment
+    variable that the service manager sets when activating a service, see
+    <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry> for details. The
+    ID is cached internally. In future a different mechanism to determine the invocation ID may be added.</para>
+
+    <para>Note that <function>sd_id128_get_machine_app_specific()</function>, <function>sd_id128_get_boot()</function>
+    and <function>sd_id128_get_invocation()</function> always return UUID v4 compatible IDs.
+    <function>sd_id128_get_machine()</function> will also return a UUID v4-compatible ID on new installations but might
+    not on older.  It is possible to convert the machine ID into a UUID v4-compatible one. For more information, see
     <citerefentry><refentrytitle>machine-id</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
 
     <para>For more information about the <literal>sd_id128_t</literal>
   <refsect1>
     <title>Notes</title>
 
-    <para>The <function>sd_id128_get_machine()</function> and
-    <function>sd_id128_get_boot()</function> interfaces are available
-    as a shared library, which can be compiled and linked to with the
-    <literal>libsystemd</literal> <citerefentry project='die-net'><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry>
-    file.</para>
+    <para>The <function>sd_id128_get_machine()</function>, <function>sd_id128_get_machine_app_specific()</function>
+    <function>sd_id128_get_boot()</function> and <function>sd_id128_get_invocation()</function> interfaces are
+    available as a shared library, which can be compiled and linked to with the
+    <literal>libsystemd</literal> <citerefentry
+    project='die-net'><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry> file.</para>
+  </refsect1>
+
+  <refsect1>
+    <title>Examples</title>
+
+    <example>
+      <title>Application-specific machine ID</title>
+
+      <para>Here's a simple example for an application specific machine ID:</para>
+
+      <programlisting>#include &lt;systemd/sd-id128.h&gt;
+#include &lt;stdio.h&gt;
+
+#define OUR_APPLICATION_ID SD_ID128_MAKE(c2,73,27,73,23,db,45,4e,a6,3b,b9,6e,79,b5,3e,97)
+
+int main(int argc, char *argv[]) {
+        sd_id128_t id;
+        sd_id128_get_machine_app_specific(OUR_APPLICATION_ID, &amp;id);
+        printf("Our application ID: " SD_ID128_FORMAT_STR "\n", SD_ID128_FORMAT_VAL(id));
+        return 0;
+}</programlisting>
+    </example>
   </refsect1>
 
   <refsect1>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd-id128</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>machine-id</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>random</refentrytitle><manvolnum>4</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>sd_id128_randomize</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+      <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>sd_id128_randomize</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+      <citerefentry project='man-pages'><refentrytitle>random</refentrytitle><manvolnum>4</manvolnum></citerefentry>
     </para>
   </refsect1>
 
index ab449d2..852a9fd 100644 (file)
@@ -77,7 +77,7 @@
     <citerefentry><refentrytitle>sd-id128</refentrytitle><manvolnum>3</manvolnum></citerefentry>.</para>
 
     <para><citerefentry><refentrytitle>journalctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>'s
-    <option>--new-id</option> option may be used as a command line
+    <option>--new-id128</option> option may be used as a command line
     front-end for <function>sd_id128_randomize()</function>.</para>
   </refsect1>
 
index 627cb87..1192ca1 100644 (file)
@@ -48,6 +48,7 @@
     <refname>sd_is_socket</refname>
     <refname>sd_is_socket_inet</refname>
     <refname>sd_is_socket_unix</refname>
+    <refname>sd_is_socket_sockaddr</refname>
     <refname>sd_is_mq</refname>
     <refname>sd_is_special</refname>
     <refpurpose>Check the type of a file descriptor</refpurpose>
       </funcprototype>
 
       <funcprototype>
+        <funcdef>int <function>sd_is_socket_sockaddr</function></funcdef>
+        <paramdef>int <parameter>fd</parameter></paramdef>
+        <paramdef>int <parameter>type</parameter></paramdef>
+        <paramdef>const struct sockaddr *<parameter>addr</parameter></paramdef>
+        <paramdef>unsigned <parameter>addr_len</parameter></paramdef>
+        <paramdef>int <parameter>listening</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
         <funcdef>int <function>sd_is_socket_unix</function></funcdef>
         <paramdef>int <parameter>fd</parameter></paramdef>
         <paramdef>int <parameter>type</parameter></paramdef>
     whether the specified file descriptor refers to a socket. If the
     <parameter>family</parameter> parameter is not
     <constant>AF_UNSPEC</constant>, it is checked whether the socket
-    is of the specified family (AF_UNIX, <constant>AF_INET</constant>,
-    ...). If the <parameter>type</parameter> parameter is not 0, it is
-    checked whether the socket is of the specified type
-    (<constant>SOCK_STREAM</constant>,
-    <constant>SOCK_DGRAM</constant>, ...). If the
+    is of the specified family (<constant>AF_UNIX</constant>,
+    <constant>AF_INET</constant>, …). If the <parameter>type</parameter>
+    parameter is not 0, it is checked whether the socket is of the
+    specified type (<constant>SOCK_STREAM</constant>,
+    <constant>SOCK_DGRAM</constant>, ). If the
     <parameter>listening</parameter> parameter is positive, it is
     checked whether the socket is in accepting mode, i.e.
     <function>listen()</function> has been called for it. If
     <constant>AF_UNSPEC</constant>, <constant>AF_INET</constant>, or
     <constant>AF_INET6</constant>.</para>
 
+    <para><function>sd_is_socket_sockaddr()</function> is similar to
+    <function>sd_is_socket_inet()</function>, but checks if the socket is bound to the
+    address specified by <parameter>addr</parameter>. The
+    <structfield>family</structfield> specified by <parameter>addr</parameter> must be
+    either <constant>AF_INET</constant> or <constant>AF_INET6</constant> and
+    <parameter>addr_len</parameter> must be large enough for that family. If
+    <parameter>addr</parameter> specifies a non-zero port, it is also checked if the
+    socket is bound to this port. In addition, for IPv6, if <parameter>addr</parameter>
+    specifies non-zero <structfield>sin6_flowinfo</structfield> or
+    <structfield>sin6_scope_id</structfield>, it is checked if the socket has the same
+    values.</para>
+
     <para><function>sd_is_socket_unix()</function> is similar to
     <function>sd_is_socket()</function> but optionally checks the
     <constant>AF_UNIX</constant> path the socket is bound to, unless
       <citerefentry><refentrytitle>sd-daemon</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>sd_listen_fds</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+      <citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
+      <citerefentry project='man-pages'><refentrytitle>ip</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
+      <citerefentry project='man-pages'><refentrytitle>ipv6</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
+      <citerefentry project='man-pages'><refentrytitle>unix</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
+      <citerefentry project='man-pages'><refentrytitle>fifo</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
+      <citerefentry project='man-pages'><refentrytitle>mq_overview</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
+      <citerefentry project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>7</manvolnum></citerefentry>.
     </para>
   </refsect1>
 
index 98415d5..2294b43 100644 (file)
   <refsect1>
     <title>Notes</title>
 
+    <para>All functions listed here are thread-agnostic and only a single thread may operate
+    on a given <structname>sd_journal</structname> object.</para>
+
     <para>The <function>sd_journal_add_match()</function>,
     <function>sd_journal_add_disjunction()</function>,
     <function>sd_journal_add_conjunction()</function> and
     message ID 03bb1dab98ab4ecfbf6fff2738bdd964 coming from any
     service (this example lacks the necessary error checking):</para>
 
-    <programlisting>...
+    <programlisting>
 int add_matches(sd_journal *j) {
   sd_journal_add_match(j, "_SYSTEMD_UNIT=avahi-daemon.service", 0);
   sd_journal_add_match(j, "PRIORITY=0", 0);
index fa58841..bc2c21e 100644 (file)
   <refsect1>
     <title>Notes</title>
 
+    <para>All functions listed here are thread-agnostic and only a single thread may operate
+    on a given <structname>sd_journal</structname> object.</para>
+
     <para>The <function>sd_journal_enumerate_fields()</function> and <function>sd_journal_restart_fields()</function>
     interfaces are available as a shared library, which can be compiled and linked to with the
     <constant>libsystemd</constant> <citerefentry
index c19eb11..92ed0de 100644 (file)
@@ -90,7 +90,7 @@
 
     <para>For more information about the journal message catalog
     please refer to the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/catalog">Journal
+    url="https://www.freedesktop.org/wiki/Software/systemd/catalog">Journal
     Message Catalogs</ulink> documentation page.</para>
   </refsect1>
 
   <refsect1>
     <title>Notes</title>
 
+    <para>Function <function>sd_journal_get_catalog()</function> is thread-agnostic and only a
+    single thread may operate on a given <structname>sd_journal</structname> object. Function
+    <function>sd_journal_get_catalog_for_message_id()</function> is thread-safe.</para>
+
     <para>The <function>sd_journal_get_catalog()</function> and
     <function>sd_journal_get_catalog_for_message_id()</function>
     interfaces are available as a shared library, which can be
index a400d8b..b7aa05f 100644 (file)
   <refsect1>
     <title>Notes</title>
 
+    <para>All functions listed here are thread-agnostic and only a single thread may operate
+    on a given <structname>sd_journal</structname> object.</para>
+
     <para>The <function>sd_journal_get_cursor()</function> and
     <function>sd_journal_test_cursor()</function> interfaces are
     available as a shared library, which can be compiled and linked to
index 23e7cc6..0950e11 100644 (file)
   <refsect1>
     <title>Notes</title>
 
+    <para>All functions listed here are thread-agnostic and only a single thread may operate
+    on a given <structname>sd_journal</structname> object.</para>
+
     <para>The
     <function>sd_journal_get_cutoff_realtime_usec()</function> and
     <function>sd_journal_get_cutoff_monotonic_usec()</function>
index 1321114..01e436e 100644 (file)
     iterate through all fields of the current journal
     entry:</para>
 
-    <programlisting>...
+    <programlisting>
 int print_fields(sd_journal *j) {
   const void *data;
   size_t length;
   SD_JOURNAL_FOREACH_DATA(j, data, length)
     printf("%.*s\n", (int) length, data);
 }
-...</programlisting>
+</programlisting>
 
   </refsect1>
 
index 61293f7..2e686ca 100644 (file)
@@ -146,7 +146,7 @@ if (t == (uint64_t) -1)
 else {
   struct timespec ts;
   uint64_t n;
-  clock_getttime(CLOCK_MONOTONIC, &amp;ts);
+  clock_gettime(CLOCK_MONOTONIC, &amp;ts);
   n = (uint64_t) ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
   msec = t > n ? (int) ((t - n + 999) / 1000) : 0;
 }</programlisting>
@@ -304,7 +304,7 @@ int wait_for_changes(sd_journal *j) {
   else {
     struct timespec ts;
     uint64_t n;
-    clock_getttime(CLOCK_MONOTONIC, &amp;ts);
+    clock_gettime(CLOCK_MONOTONIC, &amp;ts);
     n = (uint64_t) ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
     msec = t > n ? (int) ((t - n + 999) / 1000) : 0;
   }
index 72c804d..06b0ff5 100644 (file)
@@ -80,6 +80,9 @@
   <refsect1>
     <title>Notes</title>
 
+    <para>All functions listed here are thread-agnostic and only a single thread may operate
+    on a given <structname>sd_journal</structname> object.</para>
+
     <para>The <function>sd_journal_get_usage()</function> interface is
     available as a shared library, which can be compiled and linked to
     with the
index 237e649..3f6d56c 100644 (file)
   </refsect1>
 
   <refsect1>
+    <title>Notes</title>
+
+    <para>All functions listed here are thread-agnostic and only a single thread may operate
+    on a given <structname>sd_journal</structname> object.</para>
+
+    <para>Functions listed here are available as a shared library, which can be compiled and linked
+    to with the <constant>libsystemd</constant> <citerefentry
+    project='die-net'><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+    file.</para>
+  </refsect1>
+
+  <refsect1>
     <title>See Also</title>
     <para>
       <citerefentry><refentrytitle>sd-journal</refentrytitle><manvolnum>3</manvolnum></citerefentry>
index 115fe26..7c385de 100644 (file)
   <refsect1>
     <title>Notes</title>
 
+    <para>All functions listed here are thread-agnostic and only a single thread may operate
+    on a given <structname>sd_journal</structname> object.</para>
+
     <para>The <function>sd_journal_next()</function>,
     <function>sd_journal_previous()</function>,
     <function>sd_journal_next_skip()</function> and
index 153af23..25b3048 100644 (file)
 
     <para><function>sd_journal_open_directory()</function> is similar to <function>sd_journal_open()</function> but
     takes an absolute directory path as argument. All journal files in this directory will be opened and interleaved
-    automatically. This call also takes a flags argument. The only flags parameter accepted by this call is
-    <constant>SD_JOURNAL_OS_ROOT</constant>. If specified, the journal files are searched below the usual
-    <filename>/var/log/journal</filename> and <filename>/run/log/journal</filename> relative to the specified path,
-    instead of directly beneath it.</para>
+    automatically. This call also takes a flags argument. The flags parameters accepted by this call are
+    <constant>SD_JOURNAL_OS_ROOT</constant>, <constant>SD_JOURNAL_SYSTEM</constant>, and
+    <constant>SD_JOURNAL_CURRENT_USER</constant>. If <constant>SD_JOURNAL_OS_ROOT</constant> is specified, journal
+    files are searched for below the usual <filename>/var/log/journal</filename> and
+    <filename>/run/log/journal</filename> relative to the specified path, instead of directly beneath it.
+    The other two flags limit which files are opened, the same as for <function>sd_journal_open()</function>.
+    </para>
 
     <para><function>sd_journal_open_directory_fd()</function> is similar to
     <function>sd_journal_open_directory()</function>, but takes a file descriptor referencing a directory in the file
   <refsect1>
     <title>Notes</title>
 
+    <para>All functions listed here are thread-agnostic and only a single thread may operate
+    on a given <structname>sd_journal</structname> object.</para>
+
     <para>The <function>sd_journal_open()</function>,
     <function>sd_journal_open_directory()</function> and
     <function>sd_journal_close()</function> interfaces are available
index 7654252..a741abe 100644 (file)
@@ -60,7 +60,7 @@
         <funcdef>int <function>sd_journal_print</function></funcdef>
         <paramdef>int <parameter>priority</parameter></paramdef>
         <paramdef>const char *<parameter>format</parameter></paramdef>
-        <paramdef>...</paramdef>
+        <paramdef></paramdef>
       </funcprototype>
 
       <funcprototype>
@@ -73,7 +73,7 @@
       <funcprototype>
         <funcdef>int <function>sd_journal_send</function></funcdef>
         <paramdef>const char *<parameter>format</parameter></paramdef>
-        <paramdef>...</paramdef>
+        <paramdef></paramdef>
       </funcprototype>
 
       <funcprototype>
     project='man-pages'><refentrytitle>readv</refentrytitle><manvolnum>3</manvolnum></citerefentry> for details)
     instead of the format string. Each structure should reference one field of the entry to submit. The second argument
     specifies the number of structures in the array.  <function>sd_journal_sendv()</function> is particularly useful to
-    submit binary objects to the journal where that is necessary. Note that this function wil not strip trailing
+    submit binary objects to the journal where that is necessary. Note that this function will not strip trailing
     whitespace of the passed fields, but passes the specified data along unmodified. This is different from both
     <function>sd_journal_print()</function> and <function>sd_journal_send()</function> described above, which are based
     on format strings, and do strip trailing whitespace.</para>
@@ -189,10 +189,9 @@ sd_journal_send("MESSAGE=Hello World, this is PID %lu!", (unsigned long) getpid(
   <refsect1>
     <title>Return Value</title>
 
-    <para>The four calls return 0 on success or a negative errno-style
-    error code. The
-    <citerefentry project='man-pages'><refentrytitle>errno</refentrytitle><manvolnum>3</manvolnum></citerefentry>
-    variable itself is not altered.</para>
+    <para>The five calls return 0 on success or a negative errno-style error code. The <citerefentry
+    project='man-pages'><refentrytitle>errno</refentrytitle><manvolnum>3</manvolnum></citerefentry> variable itself is
+    not altered.</para>
 
     <para>If
     <citerefentry><refentrytitle>systemd-journald</refentrytitle><manvolnum>8</manvolnum></citerefentry>
@@ -201,9 +200,10 @@ sd_journal_send("MESSAGE=Hello World, this is PID %lu!", (unsigned long) getpid(
   </refsect1>
 
   <refsect1>
-    <title>Async signal safety</title>
-    <para><function>sd_journal_sendv()</function> is "async signal
-    safe" in the meaning of
+    <title>Thread safety</title>
+    <para>All functions listed here are thread-safe and may be called in parallel from multiple threads.</para>
+
+    <para><function>sd_journal_sendv()</function> is "async signal safe" in the meaning of
     <citerefentry project='man-pages'><refentrytitle>signal</refentrytitle><manvolnum>7</manvolnum></citerefentry>.
     </para>
 
@@ -217,13 +217,11 @@ sd_journal_send("MESSAGE=Hello World, this is PID %lu!", (unsigned long) getpid(
   <refsect1>
     <title>Notes</title>
 
-    <para>The <function>sd_journal_print()</function>,
-    <function>sd_journal_printv()</function>,
-    <function>sd_journal_send()</function> and
-    <function>sd_journal_sendv()</function> interfaces are available
-    as a shared library, which can be compiled and linked to with the
-    <constant>libsystemd</constant> <citerefentry project='die-net'><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry>
-    file.</para>
+    <para>The <function>sd_journal_print()</function>, <function>sd_journal_printv()</function>,
+    <function>sd_journal_send()</function>, <function>sd_journal_sendv()</function> and
+    <function>sd_journal_perror()</function> interfaces are available as a shared library, which can be compiled and
+    linked to with the <constant>libsystemd</constant> <citerefentry
+    project='die-net'><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry> file.</para>
   </refsect1>
 
   <refsect1>
index dbff55c..d7a41a0 100644 (file)
   <refsect1>
     <title>Notes</title>
 
+    <para>All functions listed here are thread-agnostic and only a single thread may operate
+    on a given <structname>sd_journal</structname> object.</para>
+
     <para>The <function>sd_journal_query_unique()</function>,
     <function>sd_journal_enumerate_unique()</function> and
     <function>sd_journal_restart_unique()</function> interfaces are
index d74c2d5..9850734 100644 (file)
   <refsect1>
     <title>Notes</title>
 
+    <para>All functions listed here are thread-agnostic and only a single thread may operate
+    on a given <structname>sd_journal</structname> object.</para>
+
     <para>The <function>sd_journal_seek_head()</function>,
     <function>sd_journal_seek_tail()</function>,
     <function>sd_journal_seek_monotonic_usec()</function>,
index 2ea7731..db88eba 100644 (file)
   <refsect1>
     <title>Notes</title>
 
+    <para>Function <function>sd_journal_stream_fd()</function> is thread-safe and may be called
+    from multiple threads. All calls will return the same file descriptor, although temporarily
+    multiple file descriptors may be open.</para>
+
     <para>The <function>sd_journal_stream_fd()</function> interface is
     available as a shared library, which can be compiled and linked to
     with the
index 93bf8d8..c1c2423 100644 (file)
@@ -79,7 +79,7 @@
     received, zero is returned. The first file descriptor may be found
     at file descriptor number 3
     (i.e. <constant>SD_LISTEN_FDS_START</constant>), the remaining
-    descriptors follow at 4, 5, 6, ..., if any.</para>
+    descriptors follow at 4, 5, 6, , if any.</para>
 
     <para>If a daemon receives more than one file descriptor, they
     will be passed in the same order as configured in the systemd
index 5625ab9..129c99f 100644 (file)
@@ -203,7 +203,7 @@ if (t == (uint64_t) -1)
 else {
          struct timespec ts;
          uint64_t n;
-         clock_getttime(CLOCK_MONOTONIC, &amp;ts);
+         clock_gettime(CLOCK_MONOTONIC, &amp;ts);
          n = (uint64_t) ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
          msec = t > n ? (int) ((t - n + 999) / 1000) : 0;
 }</programlisting>
index 025fbec..e8ddea2 100644 (file)
@@ -66,7 +66,7 @@
         <funcdef>int <function>sd_notifyf</function></funcdef>
         <paramdef>int <parameter>unset_environment</parameter></paramdef>
         <paramdef>const char *<parameter>format</parameter></paramdef>
-        <paramdef>...</paramdef>
+        <paramdef></paramdef>
       </funcprototype>
 
       <funcprototype>
@@ -81,7 +81,7 @@
         <paramdef>pid_t <parameter>pid</parameter></paramdef>
         <paramdef>int <parameter>unset_environment</parameter></paramdef>
         <paramdef>const char *<parameter>format</parameter></paramdef>
-        <paramdef>...</paramdef>
+        <paramdef></paramdef>
       </funcprototype>
 
       <funcprototype>
       </varlistentry>
 
       <varlistentry>
-        <term>STATUS=...</term>
+        <term>STATUS=</term>
 
         <listitem><para>Passes a single-line UTF-8 status string back
         to the service manager that describes the service state. This
         state feedback, fsck-like programs could pass completion
         percentages and failing programs could pass a human-readable
         error message. Example: <literal>STATUS=Completed 66% of file
-        system check...</literal></para></listitem>
+        system check</literal></para></listitem>
       </varlistentry>
 
       <varlistentry>
-        <term>ERRNO=...</term>
+        <term>ERRNO=</term>
 
         <listitem><para>If a service fails, the errno-style error
         code, formatted as string. Example: <literal>ERRNO=2</literal>
       </varlistentry>
 
       <varlistentry>
-        <term>BUSERROR=...</term>
+        <term>BUSERROR=</term>
 
         <listitem><para>If a service fails, the D-Bus error-style
         error code. Example:
       </varlistentry>
 
       <varlistentry>
-        <term>MAINPID=...</term>
+        <term>MAINPID=</term>
 
         <listitem><para>The main process ID (PID) of the service, in
         case the service manager did not fork off the process itself.
       <varlistentry>
         <term>FDSTORE=1</term>
 
-        <listitem><para>Stores additional file descriptors in the
-        service manager. File descriptors sent this way will be
-        maintained per-service by the service manager and be passed
-        again using the usual file descriptor passing logic on the
-        next invocation of the service (see
-        <citerefentry><refentrytitle>sd_listen_fds</refentrytitle><manvolnum>3</manvolnum></citerefentry>).
-        This is useful for implementing service restart schemes where
-        services serialize their state to <filename>/run</filename>,
-        push their file descriptors to the system manager, and are
-        then restarted, retrieving their state again via socket
-        passing and <filename>/run</filename>. Note that the service
-        manager will accept messages for a service only if
-        <varname>FileDescriptorStoreMax=</varname> is set to non-zero
-        for it (defaults to zero). See
-        <citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-        for details. Multiple arrays of file descriptors may be sent
-        in separate messages, in which case the arrays are combined.
-        Note that the service manager removes duplicate file
-        descriptors before passing them to the service. Use
-        <function>sd_pid_notify_with_fds()</function> to send messages
-        with <literal>FDSTORE=1</literal>, see
-        below.</para></listitem>
+        <listitem><para>Stores additional file descriptors in the service manager. File descriptors sent this way will
+        be maintained per-service by the service manager and will later be handed back using the usual file descriptor
+        passing logic at the next invocation of the service, see
+        <citerefentry><refentrytitle>sd_listen_fds</refentrytitle><manvolnum>3</manvolnum></citerefentry>.  This is
+        useful for implementing services that can restart after an explicit request or a crash without losing
+        state. Any open sockets and other file descriptors which should not be closed during the restart may be stored
+        this way. Application state can either be serialized to a file in <filename>/run</filename>, or better, stored
+        in a <citerefentry><refentrytitle>memfd_create</refentrytitle><manvolnum>2</manvolnum></citerefentry> memory
+        file descriptor. Note that the service manager will accept messages for a service only if its
+        <varname>FileDescriptorStoreMax=</varname> setting is non-zero (defaults to zero, see
+        <citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>). If file
+        descriptors sent are pollable (see
+        <citerefentry><refentrytitle>epoll_ctl</refentrytitle><manvolnum>2</manvolnum></citerefentry>), then any
+        <constant>EPOLLHUP</constant> or <constant>EPOLLERR</constant> event seen on them will result in their
+        automatic removal from the store. Multiple arrays of file descriptors may be sent in separate messages, in
+        which case the arrays are combined. Note that the service manager removes duplicate (pointing to the same
+        object) file descriptors before passing them to the service. Use <function>sd_pid_notify_with_fds()</function>
+        to send messages with <literal>FDSTORE=1</literal>, see below.</para></listitem>
       </varlistentry>
 
       <varlistentry>
-        <term>FDNAME=...</term>
+        <term>FDNAME=</term>
 
         <listitem><para>When used in combination with
         <varname>FDSTORE=1</varname>, specifies a name for the
       </varlistentry>
 
       <varlistentry>
-        <term>WATCHDOG_USEC=...</term>
+        <term>WATCHDOG_USEC=</term>
 
         <listitem><para>Reset <varname>watchdog_usec</varname> value during runtime.
         Notice that this is not available when using <function>sd_event_set_watchdog()</function>
     <citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     for details.</para>
 
+    <para>Note that <function>sd_notify()</function> notifications may be attributed to units correctly only if either
+    the sending process is still around at the time PID 1 processes the message, or if the sending process is
+    explicitly runtime-tracked by the service manager. The latter is the case if the service manager originally forked
+    off the process, i.e. on all processes that match <varname>NotifyAccess=</varname><option>main</option> or
+    <varname>NotifyAccess=</varname><option>exec</option>. Conversely, if an auxiliary process of the unit sends an
+    <function>sd_notify()</function> message and immediately exits, the service manager might not be able to properly
+    attribute the message to the unit, and thus will ignore it, even if
+    <varname>NotifyAccess=</varname><option>all</option> is set for it.</para>
+
     <para><function>sd_notifyf()</function> is similar to
     <function>sd_notify()</function> but takes a
     <function>printf()</function>-like format string plus
   <refsect1>
     <title>Return Value</title>
 
-    <para>On failure, these calls return a negative errno-style error
-    code. If <varname>$NOTIFY_SOCKET</varname> was not set and hence
-    no status data could be sent, 0 is returned. If the status was
-    sent, these functions return with a positive return value. In
-    order to support both, init systems that implement this scheme and
-    those which do not, it is generally recommended to ignore the
-    return value of this call.</para>
+    <para>On failure, these calls return a negative errno-style error code. If <varname>$NOTIFY_SOCKET</varname> was
+    not set and hence no status message could be sent, 0 is returned. If the status was sent, these functions return a
+    positive value. In order to support both service managers that implement this scheme and those which do not, it is
+    generally recommended to ignore the return value of this call. Note that the return value simply indicates whether
+    the notification message was enqueued properly, it does not reflect whether the message could be processed
+    successfully. Specifically, no error is returned when a file descriptor is attempted to be stored using
+    <varname>FDSTORE=1</varname> but the service is not actually configured to permit storing of file descriptors (see
+    above).</para>
   </refsect1>
 
   <refsect1>
       initialization:</para>
 
       <programlisting>sd_notifyf(0, "READY=1\n"
-        "STATUS=Processing requests...\n"
+        "STATUS=Processing requests\n"
         "MAINPID=%lu",
         (unsigned long) getpid());</programlisting>
     </example>
index 806cff3..14ebd53 100644 (file)
     processes, user processes that are shared between multiple
     sessions of the same user, or kernel threads). For processes not
     being part of a login session, this function will fail with
-    -ENODATA. The returned string needs to be freed with the libc
+    <constant>-ENODATA</constant>. The returned string needs to be freed with the libc
     <citerefentry
     project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
     call after use.</para>
     paths. Note that not all processes are part of a system
     unit/service (e.g. user processes, or kernel threads). For
     processes not being part of a systemd system unit, this function
-    will fail with -ENODATA. (More specifically, this call will not
+    will fail with <constant>-ENODATA</constant>. (More specifically, this call will not
     work for kernel threads.) The returned string needs to be freed
     with the libc <citerefentry
     project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
     multiple login sessions of the same user, whereas
     <function>sd_pid_get_session()</function> will fail. For processes
     not being part of a login session and not being a shared process
-    of a user, this function will fail with -ENODATA.</para>
+    of a user, this function will fail with <constant>-ENODATA</constant>.</para>
 
     <para><function>sd_pid_get_machine_name()</function> may be used
     to determine the name of the VM or container is a member of. The
     <citerefentry
     project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
     call after use. For processes not part of a VM or containers, this
-    function fails with -ENODATA.</para>
+    function fails with <constant>-ENODATA</constant>.</para>
 
     <para><function>sd_pid_get_slice()</function> may be used to
     determine the slice unit the process is a member of. See
       </varlistentry>
 
       <varlistentry>
-        <term><constant>-BADF</constant></term>
+        <term><constant>-EBADF</constant></term>
 
         <listitem><para>The specified socket file descriptor was
         invalid.</para></listitem>
index c5e6dda..3dd461f 100644 (file)
     one (<constant>NULL</constant> terminated) with the session
     identifiers of the sessions and one with the user identifiers of
     the Unix users the sessions belong to. An additional parameter may
-    be used to return the number of entries in the latter array. The
-    two arrays and the latter parameter may be passed as
+    be used to return the number of entries in the latter array. This
+    value is the same the return value, if the latter is nonnegative.
+    The two arrays and the last parameter may be passed as
     <constant>NULL</constant> in case these values need not to be
     determined. The arrays and the strings referenced by them need to
     be freed with the libc
index a6076b1..f95e74e 100644 (file)
     <para><function>sd_session_get_seat()</function> may be used to
     determine the seat identifier of the seat the session identified
     by the specified session identifier belongs to. Note that not all
-    sessions are attached to a seat, this call will fail for them. The
-    returned string needs to be freed with the libc
+    sessions are attached to a seat, this call will fail (returning
+    <constant>-ENODATA</constant>) for them. The returned string needs
+    to be freed with the libc
     <citerefentry project='man-pages'><refentrytitle>free</refentrytitle><manvolnum>3</manvolnum></citerefentry>
     call after use.</para>
 
index 3de9899..759d930 100644 (file)
 
     <xi:include href="libsystemd-pkgconfig.xml" xpointer="pkgconfig-text"/>
 
-    <para>Internally, this functions parses the
+    <para>Internally, this function parses the
     <varname>$WATCHDOG_PID</varname> and
     <varname>$WATCHDOG_USEC</varname> environment variable. The call
     will ignore these variables if <varname>$WATCHDOG_PID</varname>
 
         <listitem><para>Set by the system manager for supervised
         process for which watchdog support is enabled, and contains
-        the watchdog timeout in µs See above for
+        the watchdog timeout in µs. See above for
         details.</para></listitem>
       </varlistentry>
     </variablelist>
index f214463..f718451 100644 (file)
     </listitem>
   </varlistentry>
 
+  <varlistentry id='no-ask-password'>
+    <term><option>--no-ask-password</option></term>
+
+    <listitem><para>Do not query the user for authentication for privileged operations.</para></listitem>
+  </varlistentry>
+
   <varlistentry id='no-legend'>
     <term><option>--no-legend</option></term>
 
index e7880d2..1440514 100644 (file)
 
           <para>To list all units installed in the file system, use the
           <command>list-unit-files</command> command instead.</para>
+
+          <para>When listing units with <command>list-dependencies</command>, recursively show
+          dependencies of all dependent units (by default only dependencies of target units are
+          shown).</para>
         </listitem>
       </varlistentry>
 
           <varname>RequiresMountsFor=</varname>). Both explicitly
           and implicitly introduced dependencies are shown with
           <command>list-dependencies</command>.</para>
+
+          <para>When passed to the <command>list-jobs</command> command, for each printed job show which other jobs are
+          waiting for it. May be combined with <option>--before</option> to show both the jobs waiting for each job as
+          well as all jobs each job is waiting for.</para>
         </listitem>
       </varlistentry>
 
           units that are ordered after the specified unit. In other
           words, recursively list units following the
           <varname>Before=</varname> dependency.</para>
+
+          <para>When passed to the <command>list-jobs</command> command, for each printed job show which other jobs it
+          is waiting for. May be combined with <option>--after</option> to show both the jobs waiting for each job as
+          well as all jobs each job is waiting for.</para>
         </listitem>
       </varlistentry>
 
           of <command>status</command>, <command>list-units</command>,
           <command>list-jobs</command>, and
           <command>list-timers</command>.</para>
+          <para>Also, show installation targets in the output of
+          <command>is-enabled</command>.</para>
         </listitem>
       </varlistentry>
 
         <para><literal>ignore-requirements</literal> is similar to
         <literal>ignore-dependencies</literal>, but only causes the
         requirement dependencies to be ignored, the ordering
-        dependencies will still be honoured.</para>
+        dependencies will still be honored.</para>
         </listitem>
 
       </varlistentry>
           to finish. If this is not specified, the job will be
           verified, enqueued and <command>systemctl</command> will
           wait until the unit's start-up is completed. By passing this
-          argument, it is only verified and enqueued.</para>
+          argument, it is only verified and enqueued. This option may not be
+          combined with <option>--wait</option>.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--wait</option></term>
+
+        <listitem>
+          <para>Synchronously wait for started units to terminate again.
+          This option may not be combined with <option>--no-block</option>.
+          Note that this will wait forever if any given unit never terminates
+          (by itself or by getting stopped explicitly); particularly services
+          which use <literal>RemainAfterExit=yes</literal>.</para>
         </listitem>
       </varlistentry>
 
       <xi:include href="user-system-options.xml" xpointer="user" />
       <xi:include href="user-system-options.xml" xpointer="system" />
 
-      <!-- we do not document -failed here, as it has been made
-           redundant by -state=failed, which it predates. To keep
-           things simple, we only document the new switch, while
-           keeping the old one around for compatibility only. -->
+      <varlistentry>
+        <term><option>--failed</option></term>
+
+        <listitem>
+          <para>List units in failed state. This is equivalent to
+          <option>--state=failed</option>.</para>
+        </listitem>
+      </varlistentry>
 
       <varlistentry>
         <term><option>--no-wall</option></term>
         <listitem>
           <para>When used with
           <command>enable</command>/<command>disable</command>/<command>is-enabled</command>
-          (and related commands), use an alternate root path when
-          looking for unit files.</para>
+          (and related commands), use the specified root path when looking for unit
+          files. If this option is present, <command>systemctl</command> will operate on
+          the file system directly, instead of communicating with the <command>systemd</command>
+          daemon to carry out changes.</para>
         </listitem>
 
       </varlistentry>
 
         <listitem>
           <para>When used with <command>list-dependencies</command>,
-          <command>list-units</command> or <command>list-machines</command>, the
+          <command>list-units</command> or <command>list-machines</command>,
           the output is printed as a list instead of a tree, and the bullet
           circles are omitted.</para>
         </listitem>
 
       <variablelist>
         <varlistentry>
-          <term><command>list-units <optional><replaceable>PATTERN</replaceable>...</optional></command></term>
+          <term><command>list-units <optional><replaceable>PATTERN</replaceable></optional></command></term>
 
           <listitem>
-            <para>List units that <command>systemd</command> has loaded. This includes units that
-            are either referenced directly or through a dependency, or units that were active in the
-            past and have failed. By default only units which are active, have pending jobs, or have
-            failed are shown; this can be changed with option <option>--all</option>. If one or more
-            <replaceable>PATTERN</replaceable>s are specified, only units matching one of them are
-            shown. The units that are shown are additionally filtered by <option>--type=</option>
-            and <option>--state=</option> if those options are specified.</para>
+            <para>List units that <command>systemd</command> currently has in memory. This includes units that are
+            either referenced directly or through a dependency, units that are pinned by applications programmatically,
+            or units that were active in the past and have failed. By default only units which are active, have pending
+            jobs, or have failed are shown; this can be changed with option <option>--all</option>. If one or more
+            <replaceable>PATTERN</replaceable>s are specified, only units matching one of them are shown. The units
+            that are shown are additionally filtered by <option>--type=</option> and <option>--state=</option> if those
+            options are specified.</para>
 
             <para>This is the default command.</para>
           </listitem>
         </varlistentry>
 
         <varlistentry>
-          <term><command>list-sockets <optional><replaceable>PATTERN</replaceable>...</optional></command></term>
+          <term><command>list-sockets <optional><replaceable>PATTERN</replaceable></optional></command></term>
 
           <listitem>
-            <para>List socket units ordered by listening address.
-            If one or more <replaceable>PATTERN</replaceable>s are
-            specified, only socket units matching one of them are
+            <para>List socket units currently in memory, ordered by listening address.  If one or more
+            <replaceable>PATTERN</replaceable>s are specified, only socket units matching one of them are
             shown. Produces output similar to
             <programlisting>
 LISTEN           UNIT                        ACTIVATES
 /dev/initctl     systemd-initctl.socket      systemd-initctl.service
-...
+…
 [::]:22          sshd.socket                 sshd.service
 kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
 
@@ -670,41 +702,53 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
             is not suitable for programmatic consumption.
             </para>
 
-            <para>See also the options <option>--show-types</option>,
-            <option>--all</option>, and <option>--state=</option>.</para>
+            <para>Also see <option>--show-types</option>, <option>--all</option>, and <option>--state=</option>.</para>
           </listitem>
         </varlistentry>
 
         <varlistentry>
-          <term><command>list-timers <optional><replaceable>PATTERN</replaceable>...</optional></command></term>
+          <term><command>list-timers <optional><replaceable>PATTERN</replaceable></optional></command></term>
 
           <listitem>
-            <para>List timer units ordered by the time they elapse
-            next. If one or more <replaceable>PATTERN</replaceable>s
-            are specified, only units matching one of them are shown.
+            <para>List timer units currently in memory, ordered by the time they elapse next. If one or more
+            <replaceable>PATTERN</replaceable>s are specified, only units matching one of them are shown.
+            Produces output similar to
+            <programlisting>
+NEXT                         LEFT          LAST                         PASSED     UNIT                         ACTIVATES
+n/a                          n/a           Thu 2017-02-23 13:40:29 EST  3 days ago ureadahead-stop.timer        ureadahead-stop.service
+Sun 2017-02-26 18:55:42 EST  1min 14s left Thu 2017-02-23 13:54:44 EST  3 days ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
+Sun 2017-02-26 20:37:16 EST  1h 42min left Sun 2017-02-26 11:56:36 EST  6h ago     apt-daily.timer              apt-daily.service
+Sun 2017-02-26 20:57:49 EST  2h 3min left  Sun 2017-02-26 11:56:36 EST  6h ago     snapd.refresh.timer          snapd.refresh.service
+            </programlisting>
             </para>
 
-            <para>See also the options <option>--all</option> and
-            <option>--state=</option>.</para>
+            <para><emphasis>NEXT</emphasis> shows the next time the timer will run.</para>
+            <para><emphasis>LEFT</emphasis> shows how long till the next time the timer runs.</para>
+            <para><emphasis>LAST</emphasis> shows the last time the timer ran.</para>
+            <para><emphasis>PASSED</emphasis> shows has long as passed since the timer laset ran.</para>
+            <para><emphasis>UNIT</emphasis> shows the name of the timer</para>
+            <para><emphasis>ACTIVATES</emphasis> shows the the name the service the timer activates when it runs.</para>
+
+            <para>Also see <option>--all</option> and <option>--state=</option>.</para>
           </listitem>
         </varlistentry>
 
         <varlistentry>
-          <term><command>start <replaceable>PATTERN</replaceable>...</command></term>
+          <term><command>start <replaceable>PATTERN</replaceable></command></term>
 
           <listitem>
             <para>Start (activate) one or more units specified on the
             command line.</para>
 
-            <para>Note that glob patterns operate on the set of primary names of currently loaded units. Units which
-            are not active and are not in a failed state usually are not loaded, and will not be matched by any
+            <para>Note that glob patterns operate on the set of primary names of units currently in memory. Units which
+            are not active and are not in a failed state usually are not in memory, and will not be matched by any
             pattern. In addition, in case of instantiated units, systemd is often unaware of the instance name until
             the instance has been started. Therefore, using glob patterns with <command>start</command> has limited
             usefulness. Also, secondary alias names of units are not considered.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><command>stop <replaceable>PATTERN</replaceable>...</command></term>
+          <term><command>stop <replaceable>PATTERN</replaceable></command></term>
 
           <listitem>
             <para>Stop (deactivate) one or more units specified on the
@@ -712,7 +756,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><command>reload <replaceable>PATTERN</replaceable>...</command></term>
+          <term><command>reload <replaceable>PATTERN</replaceable></command></term>
 
           <listitem>
             <para>Asks all units listed on the command line to reload
@@ -732,27 +776,27 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
 
         </varlistentry>
         <varlistentry>
-          <term><command>restart <replaceable>PATTERN</replaceable>...</command></term>
+          <term><command>restart <replaceable>PATTERN</replaceable></command></term>
 
           <listitem>
-            <para>Restart one or more units specified on the command
-            line. If the units are not running yet, they will be
-            started.</para>
+            <para>Stop and then start one or more units specified on the
+            command line. If the units are not running yet, they will
+            be started.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><command>try-restart <replaceable>PATTERN</replaceable>...</command></term>
+          <term><command>try-restart <replaceable>PATTERN</replaceable></command></term>
 
           <listitem>
-            <para>Restart one or more units specified on the command
-            line if the units are running. This does nothing if units are not
-            running.</para>
+            <para>Stop and then start one or more units specified on the
+            command line if the units are running. This does nothing
+            if units are not running.</para>
             <!-- Note that we don't document condrestart here, as that is just compatibility support, and we generally
                  don't document that. -->
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><command>reload-or-restart <replaceable>PATTERN</replaceable>...</command></term>
+          <term><command>reload-or-restart <replaceable>PATTERN</replaceable></command></term>
 
           <listitem>
             <para>Reload one or more units if they support it. If not,
@@ -761,7 +805,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><command>try-reload-or-restart <replaceable>PATTERN</replaceable>...</command></term>
+          <term><command>try-reload-or-restart <replaceable>PATTERN</replaceable></command></term>
 
           <listitem>
             <para>Reload one or more units if they support it. If not,
@@ -793,7 +837,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><command>kill <replaceable>PATTERN</replaceable>...</command></term>
+          <term><command>kill <replaceable>PATTERN</replaceable></command></term>
 
           <listitem>
             <para>Send a signal to one or more processes of the
@@ -803,7 +847,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><command>is-active <replaceable>PATTERN</replaceable>...</command></term>
+          <term><command>is-active <replaceable>PATTERN</replaceable></command></term>
 
           <listitem>
             <para>Check whether any of the specified units are active
@@ -815,7 +859,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><command>is-failed <replaceable>PATTERN</replaceable>...</command></term>
+          <term><command>is-failed <replaceable>PATTERN</replaceable></command></term>
 
           <listitem>
             <para>Check whether any of the specified units are in a
@@ -827,7 +871,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><command>status</command> <optional><replaceable>PATTERN</replaceable>...|<replaceable>PID</replaceable>...]</optional></term>
+          <term><command>status</command> <optional><replaceable>PATTERN</replaceable>…|<replaceable>PID</replaceable>…]</optional></term>
 
           <listitem>
             <para>Show terse runtime status information about one or
@@ -851,37 +895,95 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
             a similar filter for messages and might be more
             convenient.
             </para>
+
+            <para>Systemd implicitly loads units as necessary, so just running the <command>status</command> will
+            attempt to load a file. The command is thus not useful for determining if something was already loaded or
+            not.  The units may possibly also be quickly unloaded after the operation is completed if there's no reason
+            to keep it in memory thereafter.
+            </para>
+
+            <example>
+              <title>Example output from systemctl status </title>
+
+              <programlisting>$ systemctl status bluetooth
+● bluetooth.service - Bluetooth service
+   Loaded: loaded (/usr/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
+   Active: active (running) since Wed 2017-01-04 13:54:04 EST; 1 weeks 0 days ago
+     Docs: man:bluetoothd(8)
+ Main PID: 930 (bluetoothd)
+   Status: "Running"
+    Tasks: 1
+   Memory: 648.0K
+      CPU: 435ms
+   CGroup: /system.slice/bluetooth.service
+           └─930 /usr/lib/bluetooth/bluetoothd
+
+Jan 12 10:46:45 example.com bluetoothd[8900]: Not enough free handles to register service
+Jan 12 10:46:45 example.com bluetoothd[8900]: Current Time Service could not be registered
+Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output error (5)
+</programlisting>
+
+            <para>The dot ("●") uses color on supported terminals to summarize the unit state at a glance. White
+            indicates an <literal>inactive</literal> or <literal>deactivating</literal> state. Red indicates a
+            <literal>failed</literal> or <literal>error</literal> state and green indicates an
+            <literal>active</literal>, <literal>reloading</literal> or <literal>activating</literal> state.
+            </para>
+
+            <para>The "Loaded:" line in the output will show <literal>loaded</literal> if the unit has been loaded into
+            memory. Other possible values for "Loaded:" include: <literal>error</literal> if there was a problem
+            loading it, <literal>not-found</literal>, and <literal>masked</literal>. Along with showing the path to
+            the unit file, this line will also show the enablement state.  Enabled commands start at boot.  See the
+            full table of possible enablement states — including the definition of <literal>masked</literal> — in the
+            documentation for the <command>is-enabled</command> command.
+            </para>
+
+            <para>The "Active:" line shows active state.  The value is usually <literal>active</literal> or
+            <literal>inactive</literal>. Active could mean started, bound, plugged in, etc depending on the unit type.
+            The unit could also be in process of changing states, reporting a state of <literal>activating</literal> or
+            <literal>deactivating</literal>. A special <literal>failed</literal> state is entered when the service
+            failed in some way, such as a crash, exiting with an error code or timing out. If the failed state is
+            entered the cause will be logged for later reference.</para>
+            </example>
+
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><command>show</command> <optional><replaceable>PATTERN</replaceable>...|<replaceable>JOB</replaceable>...</optional></term>
+          <term><command>show</command> <optional><replaceable>PATTERN</replaceable>…|<replaceable>JOB</replaceable>…</optional></term>
 
           <listitem>
-            <para>Show properties of one or more units, jobs, or the
-            manager itself. If no argument is specified, properties of
-            the manager will be shown. If a unit name is specified,
-            properties of the unit is shown, and if a job ID is
-            specified, properties of the job is shown. By default, empty
-            properties are suppressed. Use <option>--all</option> to
-            show those too. To select specific properties to show, use
-            <option>--property=</option>. This command is intended to be
-            used whenever computer-parsable output is required. Use
-            <command>status</command> if you are looking for formatted
-            human-readable output.</para>
+            <para>Show properties of one or more units, jobs, or the manager itself. If no argument is specified,
+            properties of the manager will be shown. If a unit name is specified, properties of the unit are shown, and
+            if a job ID is specified, properties of the job are shown. By default, empty properties are suppressed. Use
+            <option>--all</option> to show those too. To select specific properties to show, use
+            <option>--property=</option>. This command is intended to be used whenever computer-parsable output is
+            required. Use <command>status</command> if you are looking for formatted human-readable output.</para>
+
+            <para>Many properties shown by <command>systemctl show</command> map directly to configuration settings of
+            the system and service manager and its unit files. Note that the properties shown by the command are
+            generally more low-level, normalized versions of the original configuration settings and expose runtime
+            state in addition to configuration. For example, properties shown for service units include the service's
+            current main process identifier as <literal>MainPID</literal> (which is runtime state), and time settings
+            are always exposed as properties ending in the <literal>…USec</literal> suffix even if a matching
+            configuration options end in <literal>…Sec</literal>, because microseconds is the normalized time unit used
+            by the system and service manager.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><command>cat <replaceable>PATTERN</replaceable>...</command></term>
+          <term><command>cat <replaceable>PATTERN</replaceable></command></term>
 
           <listitem>
             <para>Show backing files of one or more units. Prints the
             "fragment" and "drop-ins" (source files) of units. Each
             file is preceded by a comment which includes the file
-            name.</para>
+            name. Note that this shows the contents of the backing files
+            on disk, which may not match the system manager's
+            understanding of these units if any unit files were
+            updated on disk and the <command>daemon-reload</command>
+            command wasn't issued since.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><command>set-property <replaceable>NAME</replaceable> <replaceable>ASSIGNMENT</replaceable>...</command></term>
+          <term><command>set-property <replaceable>NAME</replaceable> <replaceable>ASSIGNMENT</replaceable></command></term>
 
           <listitem>
             <para>Set the specified unit properties at runtime where
@@ -912,7 +1014,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
         </varlistentry>
 
         <varlistentry>
-          <term><command>help <replaceable>PATTERN</replaceable>...|<replaceable>PID</replaceable>...</command></term>
+          <term><command>help <replaceable>PATTERN</replaceable>…|<replaceable>PID</replaceable>…</command></term>
 
           <listitem>
             <para>Show manual pages for one or more units, if
@@ -922,7 +1024,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
         </varlistentry>
 
         <varlistentry>
-          <term><command>reset-failed [<replaceable>PATTERN</replaceable>...]</command></term>
+          <term><command>reset-failed [<replaceable>PATTERN</replaceable>]</command></term>
 
           <listitem>
             <para>Reset the <literal>failed</literal> state of the
@@ -970,7 +1072,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
 
       <variablelist>
         <varlistentry>
-          <term><command>list-unit-files <optional><replaceable>PATTERN...</replaceable></optional></command></term>
+          <term><command>list-unit-files <optional><replaceable>PATTERN</replaceable></optional></command></term>
 
           <listitem>
             <para>List unit files installed on the system, in combination with their enablement state (as reported by
@@ -981,8 +1083,8 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
         </varlistentry>
 
         <varlistentry>
-          <term><command>enable <replaceable>NAME</replaceable>...</command></term>
-          <term><command>enable <replaceable>PATH</replaceable>...</command></term>
+          <term><command>enable <replaceable>NAME</replaceable></command></term>
+          <term><command>enable <replaceable>PATH</replaceable></command></term>
 
           <listitem>
             <para>Enable one or more units or unit instances. This will create a set of symlinks, as encoded in the
@@ -993,7 +1095,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
             desired, combine this command with the <option>--now</option> switch, or invoke <command>start</command>
             with appropriate arguments later. Note that in case of unit instance enablement (i.e. enablement of units of
             the form <filename>foo@bar.service</filename>), symlinks named the same as instances are created in the
-            unit configuration diectory, however they point to the single template unit file they are instantiated
+            unit configuration directory, however they point to the single template unit file they are instantiated
             from.</para>
 
             <para>This command expects either valid unit names (in which case various unit file directories are
@@ -1032,7 +1134,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
         </varlistentry>
 
         <varlistentry>
-          <term><command>disable <replaceable>NAME</replaceable>...</command></term>
+          <term><command>disable <replaceable>NAME</replaceable></command></term>
 
           <listitem>
             <para>Disables one or more units. This removes all symlinks to the unit files backing the specified units
@@ -1064,18 +1166,18 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
         </varlistentry>
 
         <varlistentry>
-          <term><command>reenable <replaceable>NAME</replaceable>...</command></term>
+          <term><command>reenable <replaceable>NAME</replaceable></command></term>
 
           <listitem>
             <para>Reenable one or more units, as specified on the command line. This is a combination of
             <command>disable</command> and <command>enable</command> and is useful to reset the symlinks a unit file is
-            enabled with to the defaults configured in its <literal>[Install]</literal> section. This commands expects
-            a unit uname only, it does not accept paths to unit files.</para>
+            enabled with to the defaults configured in its <literal>[Install]</literal> section. This command expects
+            a unit name only, it does not accept paths to unit files.</para>
           </listitem>
         </varlistentry>
 
         <varlistentry>
-          <term><command>preset <replaceable>NAME</replaceable>...</command></term>
+          <term><command>preset <replaceable>NAME</replaceable></command></term>
 
           <listitem>
             <para>Reset the enable/disable status one or more unit files, as specified on
@@ -1088,12 +1190,13 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
             enabled and disabled, or only enabled, or only disabled.</para>
 
             <para>If the unit carries no install information, it will be silently ignored
-            by this command.</para>
+            by this command. <replaceable>NAME</replaceable> must be the real unit name,
+            any alias names are ignored silently.</para>
 
             <para>For more information on the preset policy format, see
             <citerefentry><refentrytitle>systemd.preset</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
             For more information on the concept of presets, please consult the
-            <ulink url="http://freedesktop.org/wiki/Software/systemd/Preset">Preset</ulink>
+            <ulink url="https://www.freedesktop.org/wiki/Software/systemd/Preset">Preset</ulink>
             document.</para>
           </listitem>
         </varlistentry>
@@ -1112,7 +1215,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
         </varlistentry>
 
         <varlistentry>
-          <term><command>is-enabled <replaceable>NAME</replaceable>...</command></term>
+          <term><command>is-enabled <replaceable>NAME</replaceable></command></term>
 
           <listitem>
             <para>Checks whether any of the specified unit files are
@@ -1120,6 +1223,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
             exit code of 0 if at least one is enabled, non-zero
             otherwise. Prints the current enable status (see table).
             To suppress this output, use <option>--quiet</option>.
+            To show installation targets, use <option>--full</option>.
             </para>
 
             <table>
@@ -1198,7 +1302,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
         </varlistentry>
 
         <varlistentry>
-          <term><command>mask <replaceable>NAME</replaceable>...</command></term>
+          <term><command>mask <replaceable>NAME</replaceable></command></term>
 
           <listitem>
             <para>Mask one or more units, as specified on the command line. This will link these unit files to
@@ -1212,7 +1316,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
         </varlistentry>
 
         <varlistentry>
-          <term><command>unmask <replaceable>NAME</replaceable>...</command></term>
+          <term><command>unmask <replaceable>NAME</replaceable></command></term>
 
           <listitem>
             <para>Unmask one or more unit files, as specified on the command line. This will undo the effect of
@@ -1222,7 +1326,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
         </varlistentry>
 
         <varlistentry>
-          <term><command>link <replaceable>PATH</replaceable>...</command></term>
+          <term><command>link <replaceable>PATH</replaceable></command></term>
 
           <listitem>
             <para>Link a unit file that is not in the unit file search paths into the unit file search path. This
@@ -1233,7 +1337,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
         </varlistentry>
 
         <varlistentry>
-          <term><command>revert <replaceable>NAME</replaceable>...</command></term>
+          <term><command>revert <replaceable>NAME</replaceable></command></term>
 
           <listitem>
             <para>Revert one or more unit files to their vendor versions. This command removes drop-in configuration
@@ -1242,7 +1346,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
             <literal>foo.service.d/</literal> with all their contained files are removed, both below the persistent and
             runtime configuration directories (i.e. below <filename>/etc/systemd/system</filename> and
             <filename>/run/systemd/system</filename>); if the unit file has a vendor-supplied version (i.e. a unit file
-            located below <filename>/usr</filename>) any matching peristent or runtime unit file that overrides it is
+            located below <filename>/usr</filename>) any matching persistent or runtime unit file that overrides it is
             removed, too. Note that if a unit file has no vendor-supplied version (i.e. is only defined below
             <filename>/etc/systemd/system</filename> or <filename>/run/systemd/system</filename>, but not in a unit
             file stored below <filename>/usr</filename>), then it is not removed. Also, if a unit is masked, it is
@@ -1256,9 +1360,9 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
 
         <varlistentry>
           <term><command>add-wants <replaceable>TARGET</replaceable>
-          <replaceable>NAME</replaceable>...</command></term>
+          <replaceable>NAME</replaceable></command></term>
           <term><command>add-requires <replaceable>TARGET</replaceable>
-          <replaceable>NAME</replaceable>...</command></term>
+          <replaceable>NAME</replaceable></command></term>
 
           <listitem>
             <para>Adds <literal>Wants=</literal> or <literal>Requires=</literal>
@@ -1274,7 +1378,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
         </varlistentry>
 
         <varlistentry>
-          <term><command>edit <replaceable>NAME</replaceable>...</command></term>
+          <term><command>edit <replaceable>NAME</replaceable></command></term>
 
           <listitem>
             <para>Edit a drop-in snippet or a whole replacement file if
@@ -1341,7 +1445,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
 
       <variablelist>
         <varlistentry>
-          <term><command>list-machines <optional><replaceable>PATTERN</replaceable>...</optional></command></term>
+          <term><command>list-machines <optional><replaceable>PATTERN</replaceable></optional></command></term>
 
           <listitem>
             <para>List the host and all running local containers with
@@ -1359,16 +1463,20 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
 
       <variablelist>
         <varlistentry>
-          <term><command>list-jobs <optional><replaceable>PATTERN...</replaceable></optional></command></term>
+          <term><command>list-jobs <optional><replaceable>PATTERN</replaceable></optional></command></term>
 
           <listitem>
             <para>List jobs that are in progress. If one or more
             <replaceable>PATTERN</replaceable>s are specified, only
             jobs for units matching one of them are shown.</para>
+
+            <para>When combined with <option>--after</option> or <option>--before</option> the list is augmented with
+            information on which other job each job is waiting for, and which other jobs are waiting for it, see
+            above.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><command>cancel <replaceable>JOB</replaceable>...</command></term>
+          <term><command>cancel <replaceable>JOB</replaceable></command></term>
 
           <listitem>
             <para>Cancel one or more jobs specified on the command line
@@ -1387,15 +1495,30 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
           <term><command>show-environment</command></term>
 
           <listitem>
-            <para>Dump the systemd manager environment block. The
-            environment block will be dumped in straight-forward form
-            suitable for sourcing into a shell script. This environment
-            block will be passed to all processes the manager
-            spawns.</para>
+            <para>Dump the systemd manager environment block. This is the environment
+            block that is passed to all processes the manager spawns. The environment
+            block will be dumped in straight-forward form suitable for sourcing into
+            most shells. If no special characters or whitespace is present in the variable
+            values, no escaping is performed, and the assignments have the form
+            <literal>VARIABLE=value</literal>. If whitespace or characters which have
+            special meaning to the shell are present, dollar-single-quote escaping is
+            used, and assignments have the form <literal>VARIABLE=$'value'</literal>.
+            This syntax is known to be supported by
+            <citerefentry project='die-net'><refentrytitle>bash</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+            <citerefentry project='die-net'><refentrytitle>zsh</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+            <citerefentry project='die-net'><refentrytitle>ksh</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+            and
+            <citerefentry project='die-net'><refentrytitle>busybox</refentrytitle><manvolnum>1</manvolnum></citerefentry>'s
+            <citerefentry project='die-net'><refentrytitle>ash</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+            but not
+            <citerefentry project='die-net'><refentrytitle>dash</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+            or
+            <citerefentry project='die-net'><refentrytitle>fish</refentrytitle><manvolnum>1</manvolnum></citerefentry>.
+            </para>
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><command>set-environment <replaceable>VARIABLE=VALUE</replaceable>...</command></term>
+          <term><command>set-environment <replaceable>VARIABLE=VALUE</replaceable></command></term>
 
           <listitem>
             <para>Set one or more systemd manager environment variables,
@@ -1403,7 +1526,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
           </listitem>
         </varlistentry>
         <varlistentry>
-          <term><command>unset-environment <replaceable>VARIABLE</replaceable>...</command></term>
+          <term><command>unset-environment <replaceable>VARIABLE</replaceable></command></term>
 
           <listitem>
             <para>Unset one or more systemd manager environment
@@ -1416,7 +1539,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
         <varlistentry>
           <term>
             <command>import-environment</command>
-            <optional><replaceable>VARIABLE...</replaceable></optional>
+            <optional><replaceable>VARIABLE</replaceable></optional>
           </term>
 
           <listitem>
@@ -1676,20 +1799,15 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
           <term><command>switch-root <replaceable>ROOT</replaceable> <optional><replaceable>INIT</replaceable></optional></command></term>
 
           <listitem>
-            <para>Switches to a different root directory and executes a
-            new system manager process below it. This is intended for
-            usage in initial RAM disks ("initrd"), and will transition
-            from the initrd's system manager process (a.k.a. "init"
-            process) to the main system manager process. This call takes two
-            arguments: the directory that is to become the new root directory, and
-            the path to the new system manager binary below it to
-            execute as PID 1. If the latter is omitted or the empty
-            string, a systemd binary will automatically be searched for
-            and used as init. If the system manager path is omitted or
-            equal to the empty string, the state of the initrd's system
-            manager process is passed to the main system manager, which
-            allows later introspection of the state of the services
-            involved in the initrd boot.</para>
+            <para>Switches to a different root directory and executes a new system manager process below it. This is
+            intended for usage in initial RAM disks ("initrd"), and will transition from the initrd's system manager
+            process (a.k.a. "init" process) to the main system manager process which is loaded from the actual host
+            volume. This call takes two arguments: the directory that is to become the new root directory, and the path
+            to the new system manager binary below it to execute as PID 1. If the latter is omitted or the empty
+            string, a systemd binary will automatically be searched for and used as init. If the system manager path is
+            omitted, equal to the empty string or identical to the path to the systemd binary, the state of the
+            initrd's system manager process is passed to the main system manager, which allows later introspection of
+            the state of the services involved in the initrd boot phase.</para>
           </listitem>
         </varlistentry>
 
@@ -1729,7 +1847,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
       <title>Parameter Syntax</title>
 
       <para>Unit commands listed above take either a single unit name (designated as <replaceable>NAME</replaceable>),
-      or multiple unit specifications (designated as <replaceable>PATTERN</replaceable>...). In the first case, the
+      or multiple unit specifications (designated as <replaceable>PATTERN</replaceable>). In the first case, the
       unit name with or without a suffix must be given. If the suffix is not specified (unit name is "abbreviated"),
       systemctl will append a suitable suffix, <literal>.service</literal> by default, and a type-specific suffix in
       case of commands which operate only on specific unit types. For example,
@@ -1746,7 +1864,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
       are equivalent to:
       <programlisting># systemctl status dev-sda.device
 # systemctl status home.mount</programlisting>
-      In the second case, shell-style globs will be matched against the primary names of all currently loaded units;
+      In the second case, shell-style globs will be matched against the primary names of all units currently in memory;
       literal unit names, with or without a suffix, will be treated as in the first case. This means that literal unit
       names always refer to exactly one unit, but globs may match zero units and this is not considered an
       error.</para>
@@ -1758,11 +1876,11 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
       <literal>[]</literal> may be used. See
       <citerefentry project='man-pages'><refentrytitle>glob</refentrytitle><manvolnum>7</manvolnum></citerefentry>
       for more details. The patterns are matched against the primary names of
-      currently loaded units, and patterns which do not match anything
+      units currently in memory, and patterns which do not match anything
       are silently skipped. For example:
       <programlisting># systemctl stop sshd@*.service</programlisting>
       will stop all <filename>sshd@.service</filename> instances. Note that alias names of units, and units that aren't
-      loaded are not considered for glob expansion.
+      in memory are not considered for glob expansion.
       </para>
 
       <para>For unit file commands, the specified <replaceable>NAME</replaceable> should be the name of the unit file
@@ -1804,6 +1922,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
     </variablelist>
     <xi:include href="less-variables.xml" xpointer="pager"/>
     <xi:include href="less-variables.xml" xpointer="less"/>
+    <xi:include href="less-variables.xml" xpointer="lesscharset"/>
   </refsect1>
 
   <refsect1>
index bc37765..095d4e7 100644 (file)
     <cmdsynopsis>
       <command>systemd-analyze</command>
       <arg choice="opt" rep="repeat">OPTIONS</arg>
+      <arg choice="plain">syscall-filter</arg>
+      <arg choice="opt"><replaceable>SET</replaceable>…</arg>
+    </cmdsynopsis>
+    <cmdsynopsis>
+      <command>systemd-analyze</command>
+      <arg choice="opt" rep="repeat">OPTIONS</arg>
       <arg choice="plain">verify</arg>
       <arg choice="opt" rep="repeat"><replaceable>FILES</replaceable></arg>
     </cmdsynopsis>
     initialization of another service to complete.</para>
 
     <para><command>systemd-analyze critical-chain
-    [<replaceable>UNIT...</replaceable>]</command> prints a tree of
+    [<replaceable>UNIT</replaceable>]</command> prints a tree of
     the time-critical chain of units (for each of the specified
     <replaceable>UNIT</replaceable>s or for the default target
     otherwise). The time after the unit is active or started is
     <option>--log-target=</option>, described in
     <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>).</para>
 
-    <para><command>systemd-analyze verify</command> will load unit
-    files and print warnings if any errors are detected. Files
-    specified on the command line will be loaded, but also any other
-    units referenced by them. This command works by prepending the
-    directories for all command line arguments at the beginning of the
-    unit load path, which means that all units files found in those
-    directories will be used in preference to the unit files found in
-    the standard locations, even if not listed explicitly.</para>
+    <para><command>systemd-analyze syscall-filter <optional><replaceable>SET</replaceable>…</optional></command>
+    will list system calls contained in the specified system call set <replaceable>SET</replaceable>,
+    or all known sets if no sets are specified. Argument <replaceable>SET</replaceable> must include
+    the <literal>@</literal> prefix.</para>
+
+    <para><command>systemd-analyze verify</command> will load unit files and print
+    warnings if any errors are detected. Files specified on the command line will be
+    loaded, but also any other units referenced by them. The full unit search path is
+    formed by combining the directories for all command line arguments, and the usual unit
+    load paths (variable <varname>$SYSTEMD_UNIT_PATH</varname> is supported, and may be
+    used to replace or augment the compiled in set of unit load paths; see
+    <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>).
+    All units files present in the directories containing the command line arguments will
+    be used in preference to the other paths.</para>
 
     <para>If no command is passed, <command>systemd-analyze
     time</command> is implied.</para>
@@ -321,7 +333,7 @@ $ eog targets.svg</programlisting>
       </para></listitem>
 
       <listitem><para>missing dependencies which are required to start
-      the given unit, </para></listitem>
+      the given unit,</para></listitem>
 
       <listitem><para>man pages listed in
       <varname>Documentation=</varname> which are not found in the
@@ -342,7 +354,7 @@ Documentation=man:nosuchfile(1)
 Requires=different.service
 
 [Service]
-Desription=x
+Description=x
 
 $ systemd-analyze verify ./user.slice
 [./user.slice:9] Unknown lvalue 'WhatIsThis' in section 'Unit'
index 479e5f2..3c1537d 100644 (file)
@@ -71,7 +71,7 @@
     properly notified.</para>
 
     <para>See the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/PasswordAgents">
+    url="https://www.freedesktop.org/wiki/Software/systemd/PasswordAgents">
     developer documentation</ulink> for more information about the
     system password logic.</para>
 
index 2b6fb5a..16ec257 100644 (file)
     a system password or passphrase from the user, using a question
     message specified on the command line. When run from a TTY it will
     query a password on the TTY and print it to standard output. When
-    run with no TTY or with <option>--no-tty</option> it will query
-    the password system-wide and allow active users to respond via
-    several agents. The latter is only available to privileged
-    processes.</para>
+    run with no TTY or with <option>--no-tty</option> it will use the
+    system-wide query mechanism, which allows active users to respond via
+    several agents, listed below.</para>
 
     <para>The purpose of this tool is to query system-wide passwords
     — that is passwords not attached to a specific user account.
     <itemizedlist>
 
       <listitem><para>A boot-time password agent asking the user for
-      passwords using Plymouth</para></listitem>
+      passwords using
+      <citerefentry project='die-net'><refentrytitle>plymouth</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      </para></listitem>
 
       <listitem><para>A boot-time password agent querying the user
-      directly on the console</para></listitem>
+      directly on the console —
+      <citerefentry><refentrytitle>systemd-ask-password-console.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      </para></listitem>
 
       <listitem><para>An agent requesting password input via a
-      <citerefentry
-      project='man-pages'><refentrytitle>wall</refentrytitle><manvolnum>1</manvolnum></citerefentry>
-      message</para></listitem>
-
-      <listitem><para>A command line agent which can be started
-      temporarily to process queued password
-      requests</para></listitem>
+      <citerefentry project='man-pages'><refentrytitle>wall</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+      message —
+      <citerefentry><refentrytitle>systemd-ask-password-wall.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      </para></listitem>
 
       <listitem><para>A TTY agent that is temporarily spawned during
       <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
-      invocations</para></listitem>
+      invocations,</para></listitem>
+
+      <listitem><para>A command line agent which can be started
+      temporarily to process queued password
+      requests — <command>systemd-tty-ask-password-agent --query</command>.
+      </para></listitem>
     </itemizedlist></para>
 
+    <para>Answering system-wide password queries is a privileged operation, hence
+    all the agents listed above (except for the last one), run as privileged
+    system services. The last one also needs elevated privileges, so
+    should be run through
+    <citerefentry project='die-net'><refentrytitle>sudo</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+    or similar.</para>
+
     <para>Additional password agents may be implemented according to
     the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/PasswordAgents">systemd
+    url="https://www.freedesktop.org/wiki/Software/systemd/PasswordAgents">systemd
     Password Agent Specification</ulink>.</para>
 
     <para>If a password is queried on a TTY, the user may press TAB to
     <title>See Also</title>
     <para>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-ask-password-console.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-tty-ask-password-agent</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry project='die-net'><refentrytitle>keyctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry project='die-net'><refentrytitle>plymouth</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry project='man-pages'><refentrytitle>wall</refentrytitle><manvolnum>1</manvolnum></citerefentry>
index e8f0368..219514b 100644 (file)
       <arg choice="opt" rep="repeat">OPTIONS</arg>
       <arg choice="opt" rep="repeat">CGROUP</arg>
     </cmdsynopsis>
+    <cmdsynopsis>
+      <command>systemd-cgls</command>
+      <arg choice="opt" rep="repeat">OPTIONS</arg>
+      <arg choice="plain"><option>--unit</option>|<option>--user-unit</option></arg>
+      <arg choice="opt" rep="repeat">UNIT</arg>
+    </cmdsynopsis>
   </refsynopsisdiv>
 
   <refsect1>
       </varlistentry>
 
       <varlistentry>
+        <term><option>-u</option></term>
+        <term><option>--unit</option></term>
+
+        <listitem><para>Show cgroup subtrees for the specified units.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--user-unit</option></term>
+
+        <listitem><para>Show cgroup subtrees for the specified user units.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><option>-k</option></term>
 
         <listitem><para>Include kernel threads in output.
index a28dc62..d71fdc6 100644 (file)
 
   <refsynopsisdiv>
     <para><filename>/usr/lib/systemd/systemd-coredump</filename></para>
+    <para><filename>/usr/lib/systemd/systemd-coredump</filename> <option>--backtrace</option></para>
     <para><filename>systemd-coredump@.service</filename></para>
     <para><filename>systemd-coredump.socket</filename></para>
   </refsynopsisdiv>
 
   <refsect1>
     <title>Description</title>
-    <para><command>systemd-coredump</command> is a system service that can acquire core dumps
-    from the kernel and handle them in various ways.</para>
+    <para><filename>systemd-coredump@.service</filename> is a system service that can acquire core
+    dumps from the kernel and handle them in various ways. The <command>systemd-coredump</command>
+    executable does the actual work. It is invoked twice: once as the handler by the kernel, and the
+    second time in the <filename>systemd-coredump@.service</filename> to actually write the data to
+    the journal.</para>
+
+    <para>When the kernel invokes <command>systemd-coredump</command> to handle a core dump, it runs
+    in privileged mode, and will connect to the socket created by the
+    <filename>systemd-coredump.socket</filename> unit, which in turn will spawn an unprivileged
+    <filename>systemd-coredump@.service</filename> instance to process the core dump. Hence
+    <filename>systemd-coredump.socket</filename> and <filename>systemd-coredump@.service</filename>
+    are helper units which do the actual processing of core dumps and are subject to normal service
+    management.</para>
 
     <para>Core dumps can be written to the journal or saved as a file. Once saved they can be retrieved
     for further processing, for example in
     if possible to the journal and store the core dump itself in an external file in
     <filename>/var/lib/systemd/coredump</filename>.</para>
 
-    <para>When the kernel invokes <command>systemd-coredump</command> to handle a core dump,
-    it will connect to the socket created by the <filename>systemd-coredump.socket</filename>
-    unit, which in turn will spawn a <filename>systemd-coredump@.service</filename> instance
-    to process the core dump. Hence <filename>systemd-coredump.socket</filename>
-    and <filename>systemd-coredump@.service</filename> are helper units which do the actual
-    processing of core dumps and are subject to normal service management.</para>
-
     <para>The behavior of a specific program upon reception of a signal is governed by a few
     factors which are described in detail in
     <citerefentry project='man-pages'><refentrytitle>core</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
     In particular, the core dump will only be processed when the related resource limits are sufficient.
     </para>
+
+    <para>It is also possible to invoke <command>systemd-coredump</command> with
+    <option>--backtrace</option> option. In this case, <command>systemd-coredump</command> expects
+    a journal entry in the journal
+    <ulink url="https://www.freedesktop.org/wiki/Software/systemd/export">Journal Export Format</ulink>
+    on standard input. The entry should contain a <varname>MESSAGE=</varname> field and any additional
+    metadata fields the caller deems reasonable. <command>systemd-coredump</command> will append
+    additional metadata fields in the same way it does for core dumps received from the kernel. In
+    this mode, no core dump is stored in the journal.</para>
   </refsect1>
 
   <refsect1>
     <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
     </para>
 
-    <para>In order to be used <command>systemd-coredump</command> must be configured in
+    <para>In order to be used by the kernel to handle core dumps,
+    <command>systemd-coredump</command> must be configured in
     <citerefentry project='man-pages'><refentrytitle>sysctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>
     parameter <varname>kernel.core_pattern</varname>. The syntax of this parameter is explained in
     <citerefentry project='man-pages'><refentrytitle>core</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
     <varname>kernel.core_pattern</varname> accordingly. This file may be masked or overridden to use a different
     setting following normal
     <citerefentry><refentrytitle>sysctl.d</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-    rules.
-    If the sysctl configuration is modified, it must be updated in the kernel before
-    it takes effect, see
+    rules. If the sysctl configuration is modified, it must be updated in the kernel before it
+    takes effect, see
     <citerefentry project='man-pages'><refentrytitle>sysctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>
     and
     <citerefentry><refentrytitle>systemd-sysctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
     </para>
 
-    <para>The behaviour of <command>systemd-coredump</command> itself is configured through the configuration file
+    <para>In order to by used in the <option>--backtrace</option> mode, an appropriate backtrace
+    handler must be installed on the sender side. For example, in case of
+    <citerefentry project='die-net'><refentrytitle>python</refentrytitle><manvolnum>1</manvolnum></citerefentry>, this
+    means a <varname>sys.excepthook</varname> must installed, see
+    <ulink url="https://github.com/keszybz/systemd-coredump-python">systemd-coredump-python</ulink>.
+    </para>
+
+    <para>The behavior of <command>systemd-coredump</command> itself is configured through the configuration file
     <filename>/etc/systemd/coredump.conf</filename> and corresponding snippets
     <filename>/etc/systemd/coredump.conf.d/*.conf</filename>, see
     <citerefentry><refentrytitle>coredump.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>. A new
index ea52485..73bd5b7 100644 (file)
 
     <para><filename>systemd-cryptsetup@.service</filename> will ask
     for hard disk passwords via the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/PasswordAgents">
+    url="https://www.freedesktop.org/wiki/Software/systemd/PasswordAgents">
     password agent logic</ulink>, in order to query the user for the
     password using the right mechanism at boot and during
     runtime.</para>
 
-    <para>At early boot and when the system manager configuration is
-    reloaded this <filename>/etc/crypttab</filename> is translated
-    into <filename>systemd-cryptsetup@.service</filename> units by
+    <para>At early boot and when the system manager configuration is reloaded, <filename>/etc/crypttab</filename> is
+    translated into <filename>systemd-cryptsetup@.service</filename> units by
     <citerefentry><refentrytitle>systemd-cryptsetup-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
   </refsect1>
 
index 5c5e9fc..0a66b9b 100644 (file)
@@ -70,7 +70,7 @@
     the initial transaction. This is useful to start one or more
     additional units at boot. May be specified more than once.</para>
 
-    <para>If the <option>systemd.debug-shell</option> option is
+    <para>If the <option>systemd.debug_shell</option> option is
     specified, the debug shell service
     <literal>debug-shell.service</literal> is pulled into the boot
     transaction. It will spawn a debug shell on tty9 during early
index 9970960..be241f6 100644 (file)
@@ -63,7 +63,7 @@
     compare configuration files that override other configuration
     files. Files in <filename>/etc</filename> have highest priority,
     files in <filename>/run</filename> have the second highest
-    priority, ..., files in <filename>/lib</filename> have lowest
+    priority, …, files in <filename>/usr/lib</filename> have lowest
     priority. Files in a directory with higher priority override files
     with the same name in directories of lower priority. In addition,
     certain configuration files can have <literal>.d</literal>
@@ -82,7 +82,7 @@
     suffix. Either is optional. The prefix must be one of the
     directories containing configuration files
     (<filename>/etc</filename>, <filename>/run</filename>,
-    <filename>/usr/lib</filename>, ...). If it is given, only
+    <filename>/usr/lib</filename>, ). If it is given, only
     overriding files contained in this directory will be shown.
     Otherwise, all overriding files will be shown. The suffix must be
     a name of a subdirectory containing configuration files like
index 2b7f4e6..72ea358 100644 (file)
@@ -50,7 +50,8 @@
 
   <refsynopsisdiv>
     <cmdsynopsis>
-      <command>systemd-detect-virt <arg choice="opt" rep="repeat">OPTIONS</arg></command>
+      <command>systemd-detect-virt</command>
+      <arg choice="opt" rep="repeat">OPTIONS</arg>
     </cmdsynopsis>
   </refsynopsisdiv>
 
         </thead>
         <tbody>
           <row>
-            <entry valign="top" morerows="9">VM</entry>
+            <entry valign="top" morerows="10">VM</entry>
             <entry><varname>qemu</varname></entry>
-            <entry>QEMU software virtualization</entry>
+            <entry>QEMU software virtualization, without KVM</entry>
           </row>
 
           <row>
             <entry><varname>kvm</varname></entry>
-            <entry>Linux KVM kernel virtual machine</entry>
+            <entry>Linux KVM kernel virtual machine, with whatever software, except
+            Oracle Virtualbox</entry>
           </row>
 
           <row>
 
           <row>
             <entry><varname>oracle</varname></entry>
-            <entry>Oracle VM VirtualBox (historically marketed by innotek and Sun Microsystems)</entry>
+            <entry>Oracle VM VirtualBox (historically marketed by innotek and Sun Microsystems),
+            for legacy and KVM hypervisor</entry>
           </row>
 
           <row>
             <entry>Parallels Desktop, Parallels Server</entry>
           </row>
 
+           <row>
+            <entry><varname>bhyve</varname></entry>
+            <entry>bhyve, FreeBSD hypervisor</entry>
+          </row>
+
           <row>
             <entry valign="top" morerows="5">Container</entry>
             <entry><varname>openvz</varname></entry>
       </varlistentry>
 
       <varlistentry>
+        <term><option>--private-users</option></term>
+
+        <listitem><para>Detect whether invoked in a user namespace.  In this mode, no
+        output is written, but the return value indicates whether the process was invoked
+        inside of a user namespace or not. See
+        <citerefentry project='man-pages'><refentrytitle>user_namespaces</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+        for more information.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><option>-q</option></term>
         <term><option>--quiet</option></term>
 
     <para>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>chroot</refentrytitle><manvolnum>2</manvolnum></citerefentry>
+      <citerefentry><refentrytitle>chroot</refentrytitle><manvolnum>2</manvolnum></citerefentry>,
+      <citerefentry project='man-pages'><refentrytitle>namespaces</refentrytitle><manvolnum>7</manvolnum></citerefentry>
     </para>
   </refsect1>
 
diff --git a/man/systemd-environment-d-generator.xml b/man/systemd-environment-d-generator.xml
new file mode 100644 (file)
index 0000000..7950aa9
--- /dev/null
@@ -0,0 +1,80 @@
+<?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" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
+
+<!--
+  This file is part of systemd.
+
+  Copyright 2017 Zbigniew Jędrzejewski-Szmek
+
+  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/>.
+-->
+<refentry id="systemd-environment-d-generator" conditional='ENABLE_ENVIRONMENT_D'>
+
+  <refentryinfo>
+    <title>systemd-environment-d-generator</title>
+    <productname>systemd</productname>
+
+    <authorgroup>
+      <author>
+        <contrib>Developer</contrib>
+        <firstname>Zbigniew</firstname>
+        <surname>Jędrzejewski-Szmek</surname>
+        <email>zbyszek@in.waw.pl</email>
+      </author>
+    </authorgroup>
+  </refentryinfo>
+
+  <refmeta>
+    <refentrytitle>systemd-environment-d-generator</refentrytitle>
+    <manvolnum>8</manvolnum>
+  </refmeta>
+
+  <refnamediv>
+    <refname>systemd-environment-d-generator</refname>
+    <refname>30-systemd-environment-d-generator</refname>
+    <refpurpose>Load variables specified by <filename>environment.d</filename>
+    </refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <para><filename>&userenvgeneratordir;/30-systemd-environment-d-generator</filename></para>
+  </refsynopsisdiv>
+
+  <refsect1>
+    <title>Description</title>
+
+    <para><filename>systemd-environment-d-generator</filename> is a
+    <citerefentry><refentrytitle>systemd.environment-generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+    that reads environment configuration specified by
+    <citerefentry><refentrytitle>environment.d</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+    configuration files and passes it to the
+    <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+    user manager instance.</para>
+  </refsect1>
+
+  <refsect1>
+    <title>See Also</title>
+    <para>
+      <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd.environment-generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+    </para>
+  </refsect1>
+
+</refentry>
index dbb3869..bb4c7e4 100644 (file)
@@ -86,8 +86,8 @@
 
         <listitem><para>Appends the specified unit type suffix to the
         escaped string. Takes one of the unit types supported by
-        systemd, such as <literal>.service</literal> or
-        <literal>.mount</literal>. May not be used in conjunction with
+        systemd, such as <literal>service</literal> or
+        <literal>mount</literal>. May not be used in conjunction with
         <option>--template=</option>, <option>--unescape</option> or
         <option>--mangle</option>.</para></listitem>
       </varlistentry>
@@ -97,7 +97,7 @@
 
         <listitem><para>Inserts the escaped strings in a unit name
         template. Takes a unit name template such as
-        <filename>foobar@.service</filename> May not be used in
+        <filename>foobar@.service</filename>. May not be used in
         conjunction with <option>--suffix=</option>,
         <option>--unescape</option> or
         <option>--mangle</option>.</para></listitem>
         <term><option>-p</option></term>
 
         <listitem><para>When escaping or unescaping a string, assume
-        it refers to a file system path. This enables special
-        processing of the initial <literal>/</literal> of the
-        path.</para></listitem>
+        it refers to a file system path. This eliminates leading,
+        trailing or duplicate <literal>/</literal> characters
+        and rejects <literal>.</literal> and <literal>..</literal>
+        path components.</para></listitem>
       </varlistentry>
 
       <varlistentry>
   <refsect1>
     <title>Examples</title>
 
-    <para>Escape a single string:</para>
+    <para>To escape a single string:</para>
     <programlisting>$ systemd-escape 'Hallöchen, Meister'
 Hall\xc3\xb6chen\x2c\x20Meister</programlisting>
 
@@ -155,7 +156,7 @@ Hallöchen, Meister</programlisting>
     <programlisting>$ systemd-escape -p --suffix=mount "/tmp//waldi/foobar/"
 tmp-waldi-foobar.mount</programlisting>
 
-    <para>To generate instance names of three strings</para>
+    <para>To generate instance names of three strings:</para>
     <programlisting>$ systemd-escape --template=systemd-nspawn@.service 'My Container 1' 'containerb' 'container/III'
 systemd-nspawn@My\x20Container\x201.service systemd-nspawn@containerb.service systemd-nspawn@container-III.service</programlisting>
   </refsect1>
index b269e48..539422a 100644 (file)
 
     <para><command>systemd-firstboot</command> initializes the most
     basic system settings interactively on the first boot, or
-    optionally non-interactively when a system image is created. The
-    following settings may be set up:</para>
+    optionally non-interactively when a system image is created.
+    The service is started if <varname>ConditionFirstBoot=yes</varname>
+    is satisfied. This essentially means that <filename>/etc</filename>
+    is empty, see
+    <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+    for details.</para>
+
+    <para>The following settings may be set up:</para>
 
     <itemizedlist>
       <listitem><para>The system locale, more specifically the two
   </refsect1>
 
   <refsect1>
+    <title>Kernel Command Line</title>
+
+    <variablelist class='kernel-commandline-options'>
+      <varlistentry>
+        <term><varname>systemd.firstboot=</varname></term>
+
+        <listitem><para>Takes a boolean argument, defaults to on. If off, <filename>systemd-firstboot.service</filename>
+        won't interactively query the user for basic settings at first boot, even if those settings are not
+        initialized yet.</para></listitem>
+      </varlistentry>
+    </variablelist>
+  </refsect1>
+
+  <refsect1>
     <title>See Also</title>
     <para>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
index 933c324..711e269 100644 (file)
@@ -88,8 +88,8 @@
   <refsect1>
     <title>Kernel Command Line</title>
 
-    <para><filename>systemd-fsck</filename> understands one kernel
-    command line parameter:</para>
+    <para><filename>systemd-fsck</filename> understands these kernel
+    command line parameters:</para>
 
     <variablelist class='kernel-commandline-options'>
       <varlistentry>
 
         <listitem><para>One of <literal>preen</literal>,
         <literal>yes</literal>, <literal>no</literal>. Controls the
-        mode of operation. The default is <literal> preen</literal>,
+        mode of operation. The default is <literal>preen</literal>,
         and will automatically repair problems that can be safely
-        fixed. <literal>yes </literal> will answer yes to all
+        fixed. <literal>yes</literal> will answer yes to all
         questions by fsck and <literal>no</literal> will answer no to
         all questions. </para></listitem>
       </varlistentry>
index a971cb3..b898d71 100644 (file)
     for more information about special <filename>/etc/fstab</filename>
     mount options this generator understands.</para>
 
+    <para>One special topic is handling of symbolic links.  Historical init
+    implementations supported symlinks in <filename>/etc/fstab</filename>.
+    Because mount units will refuse mounts where the target is a symbolic link,
+    this generator will resolve any symlinks as far as possible when processing
+    <filename>/etc/fstab</filename> in order to enhance backwards compatibility.
+    If a symlink target does not exist at the time that this generator runs, it
+    is assumed that the symlink target is the final target of the mount.</para>
+
     <para><filename>systemd-fstab-generator</filename> implements
     <citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>.</para>
   </refsect1>
 
         <listitem><para>Takes a boolean argument. Defaults to
         <literal>yes</literal>. If <literal>no</literal>, causes the
-        generator to ignore any mounts or swaps configured in
+        generator to ignore any mounts or swap devices configured in
         <filename>/etc/fstab</filename>. <varname>rd.fstab=</varname>
-        is honored only by initial RAM disk (initrd) while
+        is honored only by the initial RAM disk (initrd) while
         <varname>fstab=</varname> is honored by both the main system
         and the initrd.</para></listitem>
       </varlistentry>
+
       <varlistentry>
         <term><varname>root=</varname></term>
 
         initrd. <varname>root=</varname> is honored by the
         initrd.</para></listitem>
       </varlistentry>
+
       <varlistentry>
         <term><varname>rootfstype=</varname></term>
 
         passed to the mount command. <varname>rootfstype=</varname> is
         honored by the initrd.</para></listitem>
       </varlistentry>
+
       <varlistentry>
         <term><varname>rootflags=</varname></term>
 
         use. <varname>rootflags=</varname> is honored by the
         initrd.</para></listitem>
       </varlistentry>
+
       <varlistentry>
         <term><varname>mount.usr=</varname></term>
 
         <para><varname>mount.usr=</varname> is honored by the initrd.
         </para></listitem>
       </varlistentry>
+
       <varlistentry>
         <term><varname>mount.usrfstype=</varname></term>
 
         <para><varname>mount.usrfstype=</varname> is honored by the
         initrd.</para></listitem>
       </varlistentry>
+
       <varlistentry>
         <term><varname>mount.usrflags=</varname></term>
 
         <para><varname>mount.usrflags=</varname> is honored by the
         initrd.</para></listitem>
       </varlistentry>
+
+      <varlistentry>
+        <term><varname>systemd.volatile=</varname></term>
+
+        <listitem><para>Controls whether the system shall boot up in volatile mode. Takes a boolean argument or the
+        special value <option>state</option>.</para>
+
+        <para>If false (the default), this generator makes no changes to the mount tree and the system is booted up in
+        normal mode.</para>
+
+        <para>If true the generator ensures
+        <citerefentry><refentrytitle>systemd-volatile-root.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+        is run as part of the initial RAM disk ("initrd"). This service changes the mount table before transitioning to
+        the host system, so that a volatile memory file system (<literal>tmpfs</literal>) is used as root directory,
+        with only <filename>/usr</filename> mounted into it from the configured root file system, in read-only
+        mode. This way the system operates in fully stateless mode, with all configuration and state reset at boot and
+        lost at shutdown, as <filename>/etc</filename> and <filename>/var</filename> will be served from the (initially
+        unpopulated) volatile memory file system.</para>
+
+        <para>If set to <option>state</option> the generator will leave the root
+        directory mount point unaltered, however will mount a <literal>tmpfs</literal> file system to
+        <filename>/var</filename>. In this mode the normal system configuration (i.e. the contents of
+        <literal>/etc</literal>) is in effect (and may be modified during system runtime), however the system state
+        (i.e. the contents of <literal>/var</literal>) is reset at boot and lost at shutdown.</para>
+
+        <para>Note that in none of these modes the root directory, <filename>/etc</filename>, <filename>/var</filename>
+        or any other resources stored in the root file system are physically removed. It's thus safe to boot a system
+        that is normally operated in non-volatile mode temporarily into volatile mode, without losing data.</para>
+
+        <para>Note that enabling this setting will only work correctly on operating systems that can boot up with only
+        <filename>/usr</filename> mounted, and are able to automatically populate <filename>/etc</filename>, and also
+        <filename>/var</filename> in case of <literal>systemd.volatile=yes</literal>.</para></listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
 
       <citerefentry project='man-pages'><refentrytitle>fstab</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.swap</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemd-cryptsetup-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+      <citerefentry><refentrytitle>systemd-cryptsetup-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>kernel-command-line</refentrytitle><manvolnum>7</manvolnum></citerefentry>
     </para>
   </refsect1>
 
index 3389259..8bff3bb 100644 (file)
@@ -64,7 +64,7 @@
     <filename>container-getty@.service</filename> instances for
     additional container pseudo TTYs as requested by the container
     manager (see <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/ContainerInterface/"><filename>Container
+    url="https://www.freedesktop.org/wiki/Software/systemd/ContainerInterface/"><filename>Container
     Interface</filename></ulink>). This should ensure that the user is
     shown a login prompt at the right place, regardless of which
     environment the system is started in. For example, it is
index e890c4d..eb7a2c4 100644 (file)
@@ -62,7 +62,7 @@
     partitions and creates mount and swap units for them, based on the
     partition type GUIDs of GUID partition tables (GPT). It implements
     the <ulink
-    url="http://www.freedesktop.org/wiki/Specifications/DiscoverablePartitionsSpec/">Discoverable
+    url="https://www.freedesktop.org/wiki/Specifications/DiscoverablePartitionsSpec/">Discoverable
     Partitions Specification</ulink>. Note that this generator has no
     effect on non-GPT systems, or where the directories under the
     mount points are already non-empty. Also, on systems where the
             <entry>On 64-bit ARM systems, the first ARM root partition on the disk the EFI ESP is located on is mounted to the root directory <filename>/</filename>.</entry>
           </row>
           <row>
+            <entry>993d8d3d-f80e-4225-855a-9daf8ed7ea97</entry>
+            <entry><filename>Root Partition (Itanium/IA-64)</filename></entry>
+            <entry>On Itanium systems, the first Itanium root partition on the disk the EFI ESP is located on is mounted to the root directory <filename>/</filename>.</entry>
+          </row>
+          <row>
             <entry>933ac7e1-2eb4-4f13-b844-0e14e2aef915</entry>
             <entry>Home Partition</entry>
             <entry>The first home partition on the disk the root partition is located on is mounted to <filename>/home</filename>.</entry>
             <entry>Swap</entry>
             <entry>All swap partitions located on the disk the root partition is located on are enabled.</entry>
           </row>
+          <row>
+            <entry>c12a7328-f81f-11d2-ba4b-00a0c93ec93b</entry>
+            <entry>EFI System Partition (ESP)</entry>
+            <entry>The first ESP located on the disk the root partition is located on is mounted to <filename>/boot</filename> or <filename>/efi</filename>, see below.</entry>
+          </row>
         </tbody>
       </tgroup>
     </table>
     <filename>/etc/crypttab</filename> with a different device mapper
     device name.</para>
 
-    <para>Mount and automount units for the EFI System Partition (ESP),
-    mounting it to <filename>/boot</filename>, are generated on EFI
-    systems where the boot loader communicates the used ESP to the operating
-    system. Since this generator creates an automount unit, the mount will
-    only be activated on-demand, when accessed. On systems where
-    <filename>/boot</filename> is an explicitly configured mount
-    (for example, listed in
-    <citerefentry project='man-pages'><refentrytitle>fstab</refentrytitle><manvolnum>5</manvolnum></citerefentry>)
-    or where the <filename>/boot</filename> mount point is non-empty, no
-    mount units are generated.</para>
+    <para>Mount and automount units for the EFI System Partition (ESP) are generated on EFI systems. The ESP is mounted
+    to <filename>/boot</filename>, unless a mount point directory <filename>/efi</filename> exists, in which case it is
+    mounted there. Since this generator creates an automount unit, the mount will only be activated on-demand, when
+    accessed. On systems where <filename>/boot</filename> (or <filename>/efi</filename> if it exists) is an explicitly
+    configured mount (for example, listed in <citerefentry
+    project='man-pages'><refentrytitle>fstab</refentrytitle><manvolnum>5</manvolnum></citerefentry>) or where the
+    <filename>/boot</filename> (or <filename>/efi</filename>) mount point is non-empty, no mount units are
+    generated.</para>
 
     <para>When using this generator in conjunction with btrfs file
     systems, make sure to set the correct default subvolumes on them,
index d811b9b..3bbb6ab 100644 (file)
@@ -19,7 +19,7 @@
   You should have received a copy of the GNU Lesser General Public License
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 -->
-<refentry id="systemd-hibernate-resume-generator">
+<refentry id="systemd-hibernate-resume-generator" conditional='ENABLE_HIBERNATE'>
 
   <refentryinfo>
     <title>systemd-hibernate-resume-generator</title>
index 7d00827..a968adf 100644 (file)
@@ -19,7 +19,7 @@
   You should have received a copy of the GNU Lesser General Public License
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 -->
-<refentry id="systemd-hibernate-resume@.service">
+<refentry id="systemd-hibernate-resume@.service" conditional='ENABLE_HIBERNATE'>
 
   <refentryinfo>
     <title>systemd-hibernate-resume@.service</title>
index 6990d41..17755aa 100644 (file)
@@ -66,7 +66,7 @@
     is a command line client to this service.</para>
 
     <para>See the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/hostnamed">
+    url="https://www.freedesktop.org/wiki/Software/systemd/hostnamed">
     developer documentation</ulink> for information about the APIs
     <filename>systemd-hostnamed</filename> provides.</para>
   </refsect1>
index 8fdced4..70a618c 100644 (file)
@@ -64,7 +64,7 @@
     <command>import-tar</command>, <command>export-raw</command>, and <command>export-tar</command> commands.</para>
 
     <para>See the
-    <ulink url="http://www.freedesktop.org/wiki/Software/systemd/importd">
+    <ulink url="https://www.freedesktop.org/wiki/Software/systemd/importd">
     importd D-Bus API Documentation</ulink> for information about the
     APIs <filename>systemd-importd</filename> provides.</para>
   </refsect1>
index 9d85908..09b82b8 100644 (file)
@@ -61,7 +61,7 @@
     <title>Description</title>
 
     <para><command>systemd-inhibit</command> may be used to execute a
-    program with a shutdown, sleep or idle inhibitor lock taken. The
+    program with a shutdown, sleep, or idle inhibitor lock taken. The
     lock will be acquired before the specified command line is
     executed and released afterwards.</para>
 
@@ -72,7 +72,7 @@
     should not be interrupted.</para>
 
     <para>For more information see the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/inhibit">Inhibitor
+    url="https://www.freedesktop.org/wiki/Software/systemd/inhibit">Inhibitor
     Lock Developer Documentation</ulink>.</para>
   </refsect1>
 
index 9ed85c3..3ee344e 100644 (file)
         with <option>--cert=</option>.</para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><option>-D <replaceable>DIR</replaceable></option></term>
+        <term><option>--directory=<replaceable>DIR</replaceable></option></term>
+
+        <listitem><para>Takes a directory path as argument. If
+        specified, <command>systemd-journal-gatewayd</command> will serve the
+        specified journal directory <replaceable>DIR</replaceable> instead of
+        the default runtime and system journal paths.</para></listitem>
+      </varlistentry>
+
       <xi:include href="standard-options.xml" xpointer="help" />
       <xi:include href="standard-options.xml" xpointer="version" />
     </variablelist>
       </varlistentry>
 
       <varlistentry>
-        <term><uri>/entries[?option1&amp;option2=value...]</uri></term>
+        <term><uri>/entries[?option1&amp;option2=value]</uri></term>
 
         <listitem><para>Retrieval of events in various formats.</para>
 
   "hostname" : "fedora",
   "os_pretty_name" : "Fedora 19 (Rawhide)",
   "virtualization" : "kvm",
-  ...}</programlisting>
+  }</programlisting>
         </para>
         </listitem>
       </varlistentry>
         one per line
         (like <command>journalctl --output json</command>).
         See <ulink
-        url="http://www.freedesktop.org/wiki/Software/systemd/json">Journal
+        url="https://www.freedesktop.org/wiki/Software/systemd/json">Journal
         JSON Format</ulink> for more information.</para>
         </listitem>
       </varlistentry>
         transfer
         (like <command>journalctl --output export</command>).
         See <ulink
-        url="http://www.freedesktop.org/wiki/Software/systemd/export">Journal
+        url="https://www.freedesktop.org/wiki/Software/systemd/export">Journal
         Export Format</ulink> for more information.</para>
         </listitem>
       </varlistentry>
     <title>Examples</title>
     <para>Retrieve events from this boot from local journal
     in <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/export">Journal
+    url="https://www.freedesktop.org/wiki/Software/systemd/export">Journal
     Export Format</ulink>:
     <programlisting>curl --silent -H'Accept: application/vnd.fdo.journal' \
        'http://localhost:19531/entries?boot'</programlisting>
index 3899f17..d7750e4 100644 (file)
@@ -64,7 +64,7 @@
       <filename>systemd-journal-remote</filename> is a command to
       receive serialized journal events and store them to the journal.
       Input streams are in the
-      <ulink url="http://www.freedesktop.org/wiki/Software/systemd/export">
+      <ulink url="https://www.freedesktop.org/wiki/Software/systemd/export">
         Journal Export Format
       </ulink>,
       i.e. like the output from
         <replaceable>ADDRESS</replaceable>. This URL should refer to the
         root of a remote
         <citerefentry><refentrytitle>systemd-journal-gatewayd</refentrytitle><manvolnum>8</manvolnum></citerefentry>
-        instance (e.g. <ulink>http://some.host:19531/</ulink> or
-        <ulink>https://some.host:19531/</ulink>).</para></listitem>
+        instance, e.g. http://some.host:19531/ or
+        https://some.host:19531/.</para></listitem>
       </varlistentry>
     </variablelist>
 
       </varlistentry>
 
       <varlistentry>
-        <term><option>--compress</option></term>
-        <term><option>--no-compress</option></term>
+        <term><option>--compress</option> [<replaceable>BOOL</replaceable>]</term>
 
-        <listitem><para>Compress or not, respectively, the data in the
-        journal using XZ.</para></listitem>
+        <listitem><para>If this is set to <literal>yes</literal> then compress
+        the data in the journal using XZ. The default is <literal>yes</literal>.
+        </para></listitem>
       </varlistentry>
 
       <varlistentry>
-        <term><option>--seal</option></term>
-        <term><option>--no-seal</option></term>
+        <term><option>--seal</option> [<replaceable>BOOL</replaceable>]</term>
 
-        <listitem><para>Periodically sign or not, respectively, the
-        data in the journal using Forward Secure Sealing.
-        </para></listitem>
+        <listitem><para>If this is set to <literal>yes</literal> then
+        periodically sign the data in the journal using Forward Secure Sealing.
+        The default is <literal>no</literal>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
index 06aa78c..2a796c9 100644 (file)
@@ -68,7 +68,7 @@
     is a command line client to this service.</para>
 
     <para>See the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/localed">
+    url="https://www.freedesktop.org/wiki/Software/systemd/localed">
     developer documentation</ulink> for information about the APIs
     <filename>systemd-localed</filename> provides.</para>
   </refsect1>
index 5733e42..5433269 100644 (file)
     manages user logins. It is responsible for:</para>
 
     <itemizedlist>
-      <listitem><para>Keeping track of users and sessions, their
-      processes and their idle state</para></listitem>
+      <listitem><para>Keeping track of users and sessions, their processes and their idle state. This is implemented by
+      allocating a systemd slice unit for each user below <filename>user.slice</filename>, and a scope unit below it
+      for each concurrent session of a user. Also, a per-user service manager is started as system service instance of
+      <filename>user@.service</filename> for each user logged in.</para></listitem>
+
+      <listitem><para>Generating and managing session IDs. If auditing is available and an audit session ID is set for
+      a session already, the session ID is initialized from it. Otherwise, an independent session counter is
+      used.</para></listitem>
 
       <listitem><para>Providing PolicyKit-based access for users to
       operations such as system shutdown or sleep</para></listitem>
@@ -84,7 +90,7 @@
       management</para></listitem>
     </itemizedlist>
 
-    <para>User sessions are registered in logind via the
+    <para>User sessions are registered with logind via the
     <citerefentry><refentrytitle>pam_systemd</refentrytitle><manvolnum>8</manvolnum></citerefentry>
     PAM module.</para>
 
     for information about the configuration of this service.</para>
 
     <para>See <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/multiseat">Multi-Seat
+    url="https://www.freedesktop.org/wiki/Software/systemd/multiseat">Multi-Seat
     on Linux</ulink> for an introduction into basic concepts of logind
     such as users, sessions and seats.</para>
 
     <para>See the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/logind">
+    url="https://www.freedesktop.org/wiki/Software/systemd/logind">
     logind D-Bus API Documentation</ulink> for information about the
     APIs <filename>systemd-logind</filename> provides.</para>
 
     <para>For more information on the inhibition logic see the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/inhibit">Inhibitor
+    url="https://www.freedesktop.org/wiki/Software/systemd/inhibit">Inhibitor
     Lock Developer Documentation</ulink>.</para>
   </refsect1>
 
index 749987a..714317c 100644 (file)
@@ -82,7 +82,7 @@
       <filename>/etc/machine-id</filename>.</para></listitem>
 
       <listitem><para>If run inside a KVM virtual machine and a UUID
-      is was configured (via the <option>-uuid</option>
+      is configured (via the <option>-uuid</option>
       option), this UUID is used to initialize the machine ID. The
       caller must ensure that the UUID passed is sufficiently unique
       and is different for every booted instance of the
@@ -92,7 +92,7 @@
       environment and a UUID is configured for the container, this is
       used to initialize the machine ID. For details, see the
       documentation of the <ulink
-      url="http://www.freedesktop.org/wiki/Software/systemd/ContainerInterface">Container
+      url="https://www.freedesktop.org/wiki/Software/systemd/ContainerInterface">Container
       Interface</ulink>.</para></listitem>
 
       <listitem><para>Otherwise, a new ID is randomly
       <varlistentry>
         <term><option>--print</option></term>
 
-        <listitem><para>Print the machine ID generated or commited after the operation is complete.</para></listitem>
+        <listitem><para>Print the machine ID generated or committed after the operation is complete.</para></listitem>
       </varlistentry>
 
       <xi:include href="standard-options.xml" xpointer="help" />
index 999aeee..c4f173f 100644 (file)
@@ -71,7 +71,7 @@
     names.</para>
 
     <para>See the
-    <ulink url="http://www.freedesktop.org/wiki/Software/systemd/machined">
+    <ulink url="https://www.freedesktop.org/wiki/Software/systemd/machined">
     machined D-Bus API Documentation</ulink> for information about the
     APIs <filename>systemd-machined</filename> provides.</para>
   </refsect1>
index b25929b..ee097d7 100644 (file)
@@ -73,8 +73,8 @@
     <variablelist class='kernel-commandline-options'>
 
       <varlistentry>
-        <term><varname>modules-load=</varname></term>
-        <term><varname>rd.modules-load=</varname></term>
+        <term><varname>modules_load=</varname></term>
+        <term><varname>rd.modules_load=</varname></term>
 
         <listitem><para>Takes a comma-separated list of kernel modules
         to statically load during early boot. The option prefixed with
diff --git a/man/systemd-mount.xml b/man/systemd-mount.xml
new file mode 100644 (file)
index 0000000..63e4fc4
--- /dev/null
@@ -0,0 +1,320 @@
+<?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">
+
+<!--
+  This file is part of systemd.
+
+  Copyright 2016 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/>.
+-->
+
+<refentry id="systemd-mount"
+          xmlns:xi="http://www.w3.org/2001/XInclude">
+
+  <refentryinfo>
+    <title>systemd-mount</title>
+    <productname>systemd</productname>
+
+    <authorgroup>
+      <author>
+        <contrib>Developer</contrib>
+        <firstname>Lennart</firstname>
+        <surname>Poettering</surname>
+        <email>lennart@poettering.net</email>
+      </author>
+    </authorgroup>
+  </refentryinfo>
+
+  <refmeta>
+    <refentrytitle>systemd-mount</refentrytitle>
+    <manvolnum>1</manvolnum>
+  </refmeta>
+
+  <refnamediv>
+    <refname>systemd-mount</refname>
+    <refname>systemd-umount</refname>
+    <refpurpose>Establish and destroy transient mount or auto-mount points</refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <cmdsynopsis>
+      <command>systemd-mount</command>
+      <arg choice="opt" rep="repeat"><replaceable>OPTIONS</replaceable></arg>
+      <arg choice="plain"><replaceable>WHAT</replaceable></arg>
+      <arg choice="opt"><replaceable>WHERE</replaceable></arg>
+    </cmdsynopsis>
+    <cmdsynopsis>
+      <command>systemd-mount</command>
+      <arg choice="opt" rep="repeat"><replaceable>OPTIONS</replaceable></arg>
+      <arg choice="plain"><option>--list</option></arg>
+    </cmdsynopsis>
+    <cmdsynopsis>
+      <command>systemd-mount</command>
+      <arg choice="opt" rep="repeat"><replaceable>OPTIONS</replaceable></arg>
+      <arg choice="plain"><option>--umount</option></arg>
+      <arg choice="plain" rep="repeat"><replaceable>WHAT|WHERE</replaceable></arg>
+    </cmdsynopsis>
+  </refsynopsisdiv>
+
+  <refsect1>
+    <title>Description</title>
+
+    <para><command>systemd-mount</command> may be used to create and start a transient <filename>.mount</filename> or
+    <filename>.automount</filename> unit of the file system <replaceable>WHAT</replaceable> on the mount point
+    <replaceable>WHERE</replaceable>.</para>
+
+    <para>In many ways, <command>systemd-mount</command> is similar to the lower-level
+    <citerefentry project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry> command, however instead
+    of executing the mount operation directly and immediately, <command>systemd-mount</command> schedules it through
+    the service manager job queue, so that it may pull in further dependencies (such as parent mounts, or a file system
+    checker to execute a priori), and may make use of the auto-mounting logic.</para>
+
+    <para>The command takes either one or two arguments. If only one argument is specified it should refer to a block
+    device or regular file containing a file system (e.g. <literal>/dev/sdb1</literal> or
+    <literal>/path/to/disk.img</literal>). If it is a block device, which is then probed for a label and other
+    metadata, and is mounted to a directory whose name is generated from the label. In this mode the block device must
+    exist at the time of invocation of the command, so that it may be probed. If the device is found to be a removable
+    block device (e.g. a USB stick) an automount point instead of a regular mount point is created (i.e. the
+    <option>--automount=</option> option is implied, see below).</para>
+
+    <para>If two arguments are specified the first indicates the mount source (the <replaceable>WHAT</replaceable>) and
+    the second indicates the path to mount it on (the <replaceable>WHERE</replaceable>). In this mode no probing of the
+    source is attempted, and a backing device node doesn't have to exist yet. However, if this mode is combined with
+    <option>--discover</option>, device node probing for additional metadata is enabled, and – much like in the
+    single-argument case discussed above – the specified device has to exist at the time of invocation of the
+    command.</para>
+
+    <para>Use the <option>--list</option> command to show a terse table of all local, known block devices with file
+    systems that may be mounted with this command.</para>
+
+    <para><command>systemd-umount</command> can be used to unmount a mount or automount point. It is the same
+    as <command>systemd-mount</command> <option>--unmount</option>.</para>
+  </refsect1>
+
+  <refsect1>
+    <title>Options</title>
+
+    <para>The following options are understood:</para>
+
+    <variablelist>
+
+      <varlistentry>
+        <term><option>--no-block</option></term>
+
+        <listitem>
+          <para>Do not synchronously wait for the requested operation to finish. If this is not specified, the job will
+          be verified, enqueued and <command>systemd-mount</command> will wait until the mount or automount unit's
+          start-up is completed. By passing this argument, it is only verified and enqueued.</para>
+        </listitem>
+      </varlistentry>
+
+      <xi:include href="standard-options.xml" xpointer="no-pager"/>
+      <xi:include href="standard-options.xml" xpointer="no-ask-password"/>
+
+      <varlistentry>
+        <term><option>--quiet</option></term>
+        <term><option>-q</option></term>
+
+        <listitem><para>Suppresses additional informational output while running.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--discover</option></term>
+
+        <listitem><para>Enable probing of the mount source. This switch is implied if a single argument is specified on
+        the command line. If passed, additional metadata is read from the device to enhance the unit to create. For
+        example, a descriptive string for the transient units is generated from the file system label and device
+        model. Moreover if a removable block device (e.g. USB stick) is detected an automount unit instead of a regular
+        mount unit is created, with a short idle time-out, in order to ensure the file-system is placed in a clean
+        state quickly after each access.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--type=</option></term>
+        <term><option>-t</option></term>
+
+        <listitem><para>Specifies the file system type to mount (e.g. <literal>vfat</literal>, <literal>ext4</literal>,
+        …). If omitted (or set to <literal>auto</literal>) the file system is determined automatically.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--options=</option></term>
+        <term><option>-o</option></term>
+
+        <listitem><para>Additional mount options for the mount point.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--fsck=</option></term>
+
+        <listitem><para>Takes a boolean argument, defaults to on. Controls whether to run a file system check
+        immediately before the mount operation. In the automount case (see <option>--automount=</option> below) the
+        check will be run the moment the first access to the device is made, which might slightly delay the
+        access.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--description=</option></term>
+
+        <listitem><para>Provide a description for the mount or automount unit. See <varname>Description=</varname> in
+        <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+        </para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--property=</option></term>
+        <term><option>-p</option></term>
+
+        <listitem><para>Sets a unit property for the mount unit that is created. This takes an assignment in the same
+        format as <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>'s
+        <command>set-property</command> command.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--automount=</option></term>
+
+        <listitem><para>Takes a boolean argument. Controls whether to create an automount point or a regular mount
+        point. If true an automount point is created that is backed by the actual file system at the time of first
+        access. If false a plain mount point is created that is backed by the actual file system immediately. Automount
+        points have the benefit that the file system stays unmounted and hence in clean state until it is first
+        accessed. In automount mode the <option>--timeout-idle-sec=</option> switch (see below) may be used to ensure
+        the mount point is unmounted automatically after the last access and an idle period passed.</para>
+
+        <para>If this switch is not specified it defaults to false. If not specified and <option>--discover</option> is
+        used (or only a single argument passed, which implies <option>--discover</option>, see above), and the file
+        system block device is detected to be removable, it is set to true, in order to increase the chance that the
+        file system is in a fully clean state if the device is unplugged abruptly.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>-A</option></term>
+
+        <listitem><para>Equivalent to <option>--automount=yes</option>.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--timeout-idle-sec=</option></term>
+
+        <listitem><para>Takes a time value that controls the idle timeout in automount mode. If set to
+        <literal>infinity</literal> (the default) no automatic unmounts are done. Otherwise the file system backing the
+        automount point is detached after the last access and the idle timeout passed. See
+        <citerefentry><refentrytitle>systemd.time</refentrytitle><manvolnum>7</manvolnum></citerefentry> for details on
+        the time syntax supported. This option has no effect if only a regular mount is established, and automounting
+        is not used.</para>
+
+        <para>Note that if <option>--discover</option> is used (or only a single argument passed, which implies
+        <option>--discover</option>, see above), and the file system block device is detected to be removable,
+        <option>--timeout-idle-sec=1s</option> is implied.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--automount-property=</option></term>
+
+        <listitem><para>Similar to <option>--property=</option>, but applies additional properties to the automount
+        unit created, instead of the mount unit.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--bind-device=</option></term>
+
+        <listitem><para>Takes a boolean argument, defaults to off. This option only has an effect in automount mode,
+        and controls whether the automount unit shall be bound to the backing device's lifetime. If enabled, the
+        automount point will be removed automatically when the backing device vanishes. If disabled the automount point
+        stays around, and subsequent accesses will block until backing device is replugged. This option has no effect
+        in case of non-device mounts, such as network or virtual file system mounts.</para>
+
+        <para>Note that if <option>--discover</option> is used (or only a single argument passed, which implies
+        <option>--discover</option>, see above), and the file system block device is detected to be removable, this
+        option is implied.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--list</option></term>
+
+        <listitem><para>Instead of establishing a mount or automount point, print a terse list of block devices
+        containing file systems that may be mounted with <literal>systemd-mount</literal>, along with useful metadata
+        such as labels, etc.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>-u</option></term>
+        <term><option>--umount</option></term>
+
+        <listitem><para>Stop the mount and automount units corresponding to the specified mount points
+        <replaceable>WHERE</replaceable> or the devices <replaceable>WHAT</replaceable>.
+        <command>systemd-mount</command> with this option or <command>systemd-umount</command> can take multiple arguments
+        which can be mount points, devices, <filename>/etc/fstab</filename> style node names, or backing files
+        corresponding to loop devices, like
+        <command>systemd-mount --umount /path/to/umount /dev/sda1 UUID=xxxxxx-xxxx LABEL=xxxxx /path/to/disk.img</command>.
+        Note that when <option>-H</option> or <option>-M</option> is specified, only absolute paths to mount points are
+        supported.</para></listitem>
+      </varlistentry>
+
+      <xi:include href="user-system-options.xml" xpointer="user" />
+      <xi:include href="user-system-options.xml" xpointer="system" />
+      <xi:include href="user-system-options.xml" xpointer="host" />
+      <xi:include href="user-system-options.xml" xpointer="machine" />
+
+      <xi:include href="standard-options.xml" xpointer="help" />
+      <xi:include href="standard-options.xml" xpointer="version" />
+    </variablelist>
+
+  </refsect1>
+
+  <refsect1>
+    <title>Exit status</title>
+
+    <para>On success, 0 is returned, a non-zero failure
+    code otherwise.</para>
+  </refsect1>
+
+  <refsect1>
+    <title>The udev Database</title>
+
+    <para>If <option>--discover</option> is used, <command>systemd-mount</command> honors a couple of additional udev
+    properties of block devices:</para>
+
+    <variablelist class='udev-directives'>
+      <varlistentry>
+        <term><varname>SYSTEMD_MOUNT_OPTIONS=</varname></term>
+
+        <listitem><para>The mount options to use, if <option>--options=</option> is not used.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>SYSTEMD_MOUNT_WHERE=</varname></term>
+
+        <listitem><para>The file system path to place the mount point at, instead of the automatically generated
+        one.</para></listitem>
+      </varlistentry>
+    </variablelist>
+  </refsect1>
+
+  <refsect1>
+    <title>See Also</title>
+    <para>
+      <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd.automount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-run</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+    </para>
+  </refsect1>
+
+</refentry>
index 4aba233..467efd5 100644 (file)
     <para>The command line may carry a list of environment variables
     to send as part of the status update.</para>
 
-    <para>Note that systemd will refuse reception of status updates
-    from this command unless <varname>NotifyAccess=all</varname> is
-    set for the service unit this command is called from.</para>
-
+    <para>Note that systemd will refuse reception of status updates from this command unless
+    <varname>NotifyAccess=</varname> is set for the service unit this command is called from.</para>
+
+    <para>Note that <function>sd_notify()</function> notifications may be attributed to units correctly only if either
+    the sending process is still around at the time PID 1 processes the message, or if the sending process is
+    explicitly runtime-tracked by the service manager. The latter is the case if the service manager originally forked
+    off the process, i.e. on all processes that match <varname>NotifyAccess=</varname><option>main</option> or
+    <varname>NotifyAccess=</varname><option>exec</option>. Conversely, if an auxiliary process of the unit sends an
+    <function>sd_notify()</function> message and immediately exits, the service manager might not be able to properly
+    attribute the message to the unit, and thus will ignore it, even if
+    <varname>NotifyAccess=</varname><option>all</option> is set for it.</para>
+
+    <para><command>systemd-notify</command> will first attempt to invoke <function>sd_notify()</function> pretending to
+    have the PID of the invoking process. This will only succeed when invoked with sufficient privileges. On failure,
+    it will then fall back to invoking it under its own PID. This behaviour is useful in order that when the tool is
+    invoked from a shell script the shell process — and not the <command>systemd-notify</command> process — appears as
+    sender of the message, which in turn is helpful if the shell process is the main process of a service, due to the
+    limitations of <varname>NotifyAccess=</varname><option>all</option> described above.</para>
   </refsect1>
 
   <refsect1>
         <listitem><para>Send a free-form status string for the daemon
         to the init systemd. This option takes the status string as
         argument. This is equivalent to <command>systemd-notify
-        STATUS=...</command>. For details about the semantics of this
+        STATUS=</command>. For details about the semantics of this
         option see
         <citerefentry><refentrytitle>sd_notify</refentrytitle><manvolnum>3</manvolnum></citerefentry>.</para></listitem>
       </varlistentry>
       <programlisting>#!/bin/bash
 
 mkfifo /tmp/waldo
-systemd-notify --ready --status="Waiting for data..."
+systemd-notify --ready --status="Waiting for data"
 
 while : ; do
         read a &lt; /tmp/waldo
         systemd-notify --status="Processing $a"
 
-        # Do something with $a ...
+        # Do something with $a 
 
-        systemd-notify --status="Waiting for data..."
+        systemd-notify --status="Waiting for data"
 done</programlisting>
     </example>
   </refsect1>
index 9b623c8..5d3212d 100644 (file)
     container.</para>
 
     <para><command>systemd-nspawn</command> implements the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/ContainerInterface">Container Interface</ulink>
+    url="https://www.freedesktop.org/wiki/Software/systemd/ContainerInterface">Container Interface</ulink>
     specification.</para>
 
     <para>While running, containers invoked with <command>systemd-nspawn</command> are registered with the
       <varlistentry>
         <term><option>--template=</option></term>
 
-        <listitem><para>Directory or <literal>btrfs</literal>
-        subvolume to use as template for the container's root
-        directory. If this is specified and the container's root
-        directory (as configured by <option>--directory=</option>)
-        does not yet exist it is created as <literal>btrfs</literal>
-        subvolume and populated from this template tree. Ideally, the
-        specified template path refers to the root of a
-        <literal>btrfs</literal> subvolume, in which case a simple
-        copy-on-write snapshot is taken, and populating the root
-        directory is instant. If the specified template path does not
-        refer to the root of a <literal>btrfs</literal> subvolume (or
-        not even to a <literal>btrfs</literal> file system at all),
-        the tree is copied, which can be substantially more
-        time-consuming. Note that if this option is used the
-        container's root directory (in contrast to the template
-        directory!) must be located on a <literal>btrfs</literal> file
-        system, so that the <literal>btrfs</literal> subvolume may be
-        created. May not be specified together with
-        <option>--image=</option> or
+        <listitem><para>Directory or <literal>btrfs</literal> subvolume to use as template for the container's root
+        directory. If this is specified and the container's root directory (as configured by
+        <option>--directory=</option>) does not yet exist it is created as <literal>btrfs</literal> snapshot (if
+        supported) or plain directory (otherwise) and populated from this template tree. Ideally, the specified
+        template path refers to the root of a <literal>btrfs</literal> subvolume, in which case a simple copy-on-write
+        snapshot is taken, and populating the root directory is instant. If the specified template path does not refer
+        to the root of a <literal>btrfs</literal> subvolume (or not even to a <literal>btrfs</literal> file system at
+        all), the tree is copied (though possibly in a copy-on-write scheme — if the file system supports that), which
+        can be substantially more time-consuming. May not be specified together with <option>--image=</option> or
         <option>--ephemeral</option>.</para>
 
         <para>Note that this switch leaves host name, machine ID and
         <term><option>-x</option></term>
         <term><option>--ephemeral</option></term>
 
-        <listitem><para>If specified, the container is run with a
-        temporary <literal>btrfs</literal> snapshot of its root
-        directory (as configured with <option>--directory=</option>),
-        that is removed immediately when the container terminates.
-        This option is only supported if the root file system is
-        <literal>btrfs</literal>. May not be specified together with
-        <option>--image=</option> or
+        <listitem><para>If specified, the container is run with a temporary snapshot of its file system that is removed
+        immediately when the container terminates. May not be specified together with
         <option>--template=</option>.</para>
         <para>Note that this switch leaves host name, machine ID and
         all other settings that could identify the instance
           a server data partition which are mounted to the appropriate
           places in the container. All these partitions must be
           identified by the partition types defined by the <ulink
-          url="http://www.freedesktop.org/wiki/Specifications/DiscoverablePartitionsSpec/">Discoverable
+          url="https://www.freedesktop.org/wiki/Specifications/DiscoverablePartitionsSpec/">Discoverable
           Partitions Specification</ulink>.</para></listitem>
+
+          <listitem><para>No partition table, and a single file system spanning the whole image.</para></listitem>
         </itemizedlist>
 
-        <para>Any other partitions, such as foreign partitions, swap
-        partitions or EFI system partitions are not mounted. May not
-        be specified together with <option>--directory=</option>,
-        <option>--template=</option> or
-        <option>--ephemeral</option>.</para></listitem>
+        <para>On GPT images, if an EFI System Partition (ESP) is discovered, it is automatically mounted to
+        <filename>/efi</filename> (or <filename>/boot</filename> as fallback) in case a directory by this name exists
+        and is empty.</para>
+
+        <para>Partitions encrypted with LUKS are automatically decrypted. Also, on GPT images dm-verity data integrity
+        hash partitions are set up if the root hash for them is specified using the <option>--root-hash=</option>
+        option.</para>
+
+        <para>Any other partitions, such as foreign partitions or swap partitions are not mounted. May not be specified
+        together with <option>--directory=</option>, <option>--template=</option>.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><option>--root-hash=</option></term>
+
+        <listitem><para>Takes a data integrity (dm-verity) root hash specified in hexadecimal. This option enables data
+        integrity checks using dm-verity, if the used image contains the appropriate integrity data (see above). The
+        specified hash must match the root hash of integrity data, and is usually at least 256 bits (and hence 64
+        formatted hexadecimal characters) long (in case of SHA256 for example). If this option is not specified, but
+        the image file carries the <literal>user.verity.roothash</literal> extended file attribute (see <citerefentry
+        project='man-pages'><refentrytitle>xattr</refentrytitle><manvolnum>7</manvolnum></citerefentry>), then the root
+        hash is read from it, also as formatted hexadecimal characters. If the extended file attribute is not found (or
+        is not supported by the underlying file system), but a file with the <filename>.roothash</filename> suffix is
+        found next to the image file, bearing otherwise the same name, the root hash is read from it and automatically
+        used, also as formatted hexadecimal characters.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         signals. It is recommended to use this mode to invoke arbitrary commands in containers, unless they have been
         modified to run correctly as PID 1. Or in other words: this switch should be used for pretty much all commands,
         except when the command refers to an init or shell implementation, as these are generally capable of running
-        correctly as PID 1. This option may not be combined with <option>--boot</option> or
-        <option>--share-system</option>.</para>
+        correctly as PID 1. This option may not be combined with <option>--boot</option>.</para>
         </listitem>
       </varlistentry>
 
 
         <listitem><para>Automatically search for an init binary and invoke it as PID 1, instead of a shell or a user
         supplied program. If this option is used, arguments specified on the command line are used as arguments for the
-        init binary. This option may not be combined with <option>--as-pid2</option> or
-        <option>--share-system</option>.</para>
+        init binary. This option may not be combined with <option>--as-pid2</option>.</para>
 
         <para>The following table explains the different modes of invocation and relationship to
         <option>--as-pid2</option> (see above):</para>
       </varlistentry>
 
       <varlistentry>
+        <term><option>--pivot-root=</option></term>
+
+        <listitem><para>Pivot the specified directory to <filename>/</filename> inside the container, and either unmount the
+        container's old root, or pivot it to another specified directory. Takes one of: a path argument — in which case the
+        specified path will be pivoted to <filename>/</filename> and the old root will be unmounted; or a colon-separated pair
+        of new root path and pivot destination for the old root. The new root path will be pivoted to <filename>/</filename>,
+        and the old <filename>/</filename> will be pivoted to the other directory. Both paths must be absolute, and are resolved
+        in the container's file system namespace.</para>
+
+        <para>This is for containers which have several bootable directories in them; for example, several
+        <ulink url="https://ostree.readthedocs.io/en/latest/">OSTree</ulink> deployments. It emulates the behavior of
+        the boot loader and initial RAM disk which normally select which directory to mount as the root and start the
+        container's PID 1 in.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><option>-u</option></term>
         <term><option>--user=</option></term>
 
       <varlistentry>
         <term><option>--slice=</option></term>
 
-        <listitem><para>Make the container part of the specified
-        slice, instead of the default
-        <filename>machine.slice</filename>. This is only applies if
-        the machine is run in its own scope unit, i.e. if
-        <option>--keep-unit</option> is not used.</para>
+        <listitem><para>Make the container part of the specified slice, instead of the default
+        <filename>machine.slice</filename>. This applies only if the machine is run in its own scope unit, i.e. if
+        <option>--keep-unit</option> isn't used.</para>
         </listitem>
       </varlistentry>
 
       <varlistentry>
         <term><option>--property=</option></term>
 
-        <listitem><para>Set a unit property on the scope unit to
-        register for the machine. This only applies if the machine is
-        run in its own scope unit, i.e. if
-        <option>--keep-unit</option> is not used. Takes unit property
-        assignments in the same format as <command>systemctl
-        set-property</command>. This is useful to set memory limits
-        and similar for machines.</para>
+        <listitem><para>Set a unit property on the scope unit to register for the machine. This applies only if the
+        machine is run in its own scope unit, i.e. if <option>--keep-unit</option> isn't used. Takes unit property
+        assignments in the same format as <command>systemctl set-property</command>. This is useful to set memory
+        limits and similar for container.</para>
         </listitem>
       </varlistentry>
 
         purposes (usually in the range beyond the host's UID/GID 65536). The parameter may be specified as follows:</para>
 
         <orderedlist>
-          <listitem><para>The value <literal>no</literal> turns off user namespacing. This is the default.</para></listitem>
-
-          <listitem><para>The value <literal>yes</literal> (or the omission of a parameter) turns on user
-          namespacing. The UID/GID range to use is determined automatically from the file ownership of the root
-          directory of the container's directory tree. To use this option, make sure to prepare the directory tree in
-          advance, and ensure that all files and directories in it are owned by UIDs/GIDs in the range you'd like to
-          use. Also, make sure that used file ACLs exclusively reference UIDs/GIDs in the appropriate range. If this
-          mode is used the number of UIDs/GIDs assigned to the container for use is 65536, and the UID/GID of the
-          root directory must be a multiple of 65536.</para></listitem>
-
-          <listitem><para>The value "pick" turns on user namespacing. In this case the UID/GID range is automatically
-          chosen. As first step, the file owner of the root directory of the container's directory tree is read, and it
-          is checked that it is currently not used by the system otherwise (in particular, that no other container is
-          using it). If this check is successful, the UID/GID range determined this way is used, similar to the
-          behaviour if "yes" is specified. If the check is not successful (and thus the UID/GID range indicated in the
-          root directory's file owner is already used elsewhere) a new – currently unused – UID/GID range of 65536
-          UIDs/GIDs is randomly chosen between the host UID/GIDs of 524288 and 1878982656, always starting at a
-          multiple of 65536. This setting implies <option>--private-users-chown</option> (see below), which has the
-          effect that the files and directories in the container's directory tree will be owned by the appropriate
-          users of the range picked. Using this option makes user namespace behaviour fully automatic. Note that the
-          first invocation of a previously unused container image might result in picking a new UID/GID range for it,
-          and thus in the (possibly expensive) file ownership adjustment operation. However, subsequent invocations of
-          the container will be cheap (unless of course the picked UID/GID range is assigned to a different use by
-          then).</para></listitem>
-
-          <listitem><para>Finally if one or two colon-separated numeric parameters are specified, user namespacing is
-          turned on, too. The first parameter specifies the first host UID/GID to assign to the container, the second
-          parameter specifies the number of host UIDs/GIDs to assign to the container. If the second parameter is
-          omitted, 65536 UIDs/GIDs are assigned.</para></listitem>
+          <listitem><para>If one or two colon-separated numbers are specified, user namespacing is turned on. The first
+          parameter specifies the first host UID/GID to assign to the container, the second parameter specifies the
+          number of host UIDs/GIDs to assign to the container. If the second parameter is omitted, 65536 UIDs/GIDs are
+          assigned.</para></listitem>
+
+          <listitem><para>If the parameter is omitted, or true, user namespacing is turned on. The UID/GID range to
+          use is determined automatically from the file ownership of the root directory of the container's directory
+          tree. To use this option, make sure to prepare the directory tree in advance, and ensure that all files and
+          directories in it are owned by UIDs/GIDs in the range you'd like to use. Also, make sure that used file ACLs
+          exclusively reference UIDs/GIDs in the appropriate range. If this mode is used the number of UIDs/GIDs
+          assigned to the container for use is 65536, and the UID/GID of the root directory must be a multiple of
+          65536.</para></listitem>
+
+          <listitem><para>If the parameter is false, user namespacing is turned off. This is the default.</para>
+          </listitem>
+
+          <listitem><para>The special value <literal>pick</literal> turns on user namespacing. In this case the UID/GID
+          range is automatically chosen. As first step, the file owner of the root directory of the container's
+          directory tree is read, and it is checked that it is currently not used by the system otherwise (in
+          particular, that no other container is using it). If this check is successful, the UID/GID range determined
+          this way is used, similar to the behavior if "yes" is specified. If the check is not successful (and thus
+          the UID/GID range indicated in the root directory's file owner is already used elsewhere) a new – currently
+          unused – UID/GID range of 65536 UIDs/GIDs is randomly chosen between the host UID/GIDs of 524288 and
+          1878982656, always starting at a multiple of 65536. This setting implies
+          <option>--private-users-chown</option> (see below), which has the effect that the files and directories in
+          the container's directory tree will be owned by the appropriate users of the range picked. Using this option
+          makes user namespace behavior fully automatic. Note that the first invocation of a previously unused
+          container image might result in picking a new UID/GID range for it, and thus in the (possibly expensive) file
+          ownership adjustment operation. However, subsequent invocations of the container will be cheap (unless of
+          course the picked UID/GID range is assigned to a different use by then).</para></listitem>
         </orderedlist>
 
         <para>It is recommended to assign at least 65536 UIDs/GIDs to each container, so that the usable UID/GID range in the
         container covers 16 bit. For best security, do not assign overlapping UID/GID ranges to multiple containers. It is
         hence a good idea to use the upper 16 bit of the host 32-bit UIDs/GIDs as container identifier, while the lower 16
-        bit encode the container UID/GID used. This is in fact the behaviour enforced by the
+        bit encode the container UID/GID used. This is in fact the behavior enforced by the
         <option>--private-users=pick</option> option.</para>
 
         <para>When user namespaces are used, the GID range assigned to each container is always chosen identical to the
 
         <para>Note that the picked UID/GID range is not written to <filename>/etc/passwd</filename> or
         <filename>/etc/group</filename>. In fact, the allocation of the range is not stored persistently anywhere,
-        except in the file ownership of the files and directories of the container.</para></listitem>
-      </varlistentry>
-
-      <varlistentry>
-        <term><option>-U</option></term>
-
-        <listitem><para>If the kernel supports the user namespaces feature, equivalent to
-        <option>--private-users=pick</option>, otherwise equivalent to
-        <option>--private-users=no</option>.</para>
+        except in the file ownership of the files and directories of the container.</para>
 
-        <para>Note that <option>-U</option> is the default if the <filename>systemd-nspawn@.service</filename> template unit
-        file is used.</para></listitem>
+        <para>Note that when user namespacing is used file ownership on disk reflects this, and all of the container's
+        files and directories are owned by the container's effective user and group IDs. This means that copying files
+        from and to the container image requires correction of the numeric UID/GID values, according to the UID/GID
+        shift applied.</para></listitem>
       </varlistentry>
 
       <varlistentry>
       </varlistentry>
 
       <varlistentry>
+        <term><option>-U</option></term>
+
+        <listitem><para>If the kernel supports the user namespaces feature, equivalent to
+        <option>--private-users=pick --private-users-chown</option>, otherwise equivalent to
+        <option>--private-users=no</option>.</para>
+
+        <para>Note that <option>-U</option> is the default if the
+        <filename>systemd-nspawn@.service</filename> template unit file is used.</para>
+
+        <para>Note: it is possible to undo the effect of <option>--private-users-chown</option> (or
+        <option>-U</option>) on the file system by redoing the operation with the first UID of 0:</para>
+
+        <programlisting>systemd-nspawn … --private-users=0 --private-users-chown</programlisting>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><option>--private-network</option></term>
 
         <listitem><para>Disconnect networking of the container from
         broadcast domain, here called a "zone". Each container may only be part of one zone, but each zone may contain
         any number of containers. Each zone is referenced by its name. Names may be chosen freely (as long as they form
         valid network interface names when prefixed with <literal>vz-</literal>), and it is sufficient to pass the same
-        name to the <option>--network-zones=</option> switch of the various concurrently running containers to join
+        name to the <option>--network-zone=</option> switch of the various concurrently running containers to join
         them in one zone.</para>
 
         <para>Note that
         and the subdirectory is symlinked into the host at the same
         location. <literal>try-host</literal> and
         <literal>try-guest</literal> do the same but do not fail if
-        the host does not have persistent journalling enabled. If
+        the host does not have persistent journaling enabled. If
         <literal>auto</literal> (the default), and the right
         subdirectory of <filename>/var/log/journal</filename> exists,
         it will be bind mounted into the container. If the
         <term><option>--bind=</option></term>
         <term><option>--bind-ro=</option></term>
 
-        <listitem><para>Bind mount a file or directory from the host
-        into the container. Takes one of: a path argument — in which
-        case the specified path will be mounted from the host to the
-        same path in the container —, or a colon-separated pair of
-        paths — in which case the first specified path is the source
-        in the host, and the second path is the destination in the
-        container —, or a colon-separated triple of source path,
-        destination path and mount options. Mount options are
-        comma-separated and currently, only "rbind" and "norbind"
-        are allowed. Defaults to "rbind". Backslash escapes are interpreted, so
-        <literal>\:</literal> may be used to embed colons in either path.
-        This option may be specified multiple times for
-        creating multiple independent bind mount points. The
-        <option>--bind-ro=</option> option creates read-only bind
-        mounts.</para></listitem>
+        <listitem><para>Bind mount a file or directory from the host into the container. Takes one of: a path
+        argument — in which case the specified path will be mounted from the host to the same path in the container, or
+        a colon-separated pair of paths — in which case the first specified path is the source in the host, and the
+        second path is the destination in the container, or a colon-separated triple of source path, destination path
+        and mount options. The source path may optionally be prefixed with a <literal>+</literal> character. If so, the
+        source path is taken relative to the image's root directory. This permits setting up bind mounts within the
+        container image. The source path may be specified as empty string, in which case a temporary directory below
+        the host's <filename>/var/tmp</filename> directory is used. It is automatically removed when the container is
+        shut down. Mount options are comma-separated and currently, only <option>rbind</option> and
+        <option>norbind</option> are allowed, controlling whether to create a recursive or a regular bind
+        mount. Defaults to "rbind". Backslash escapes are interpreted, so <literal>\:</literal> may be used to embed
+        colons in either path.  This option may be specified multiple times for creating multiple independent bind
+        mount points. The <option>--bind-ro=</option> option creates read-only bind mounts.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         point for the overlay file system in the container. At least
         two paths have to be specified.</para>
 
+        <para>The source paths may optionally be prefixed with <literal>+</literal> character. If so they are taken
+        relative to the image's root directory. The uppermost source path may also be specified as empty string, in
+        which case a temporary directory below the host's <filename>/var/tmp</filename> is used. The directory is
+        removed automatically when the container is shut down. This behaviour is useful in order to make read-only
+        container directories writable while the container is running. For example, use the
+        <literal>--overlay=+/var::/var</literal> option in order to automatically overlay a writable temporary
+        directory on a read-only <filename>/var</filename> directory.</para>
+
         <para>For details about overlay file systems, see <ulink
         url="https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt">overlayfs.txt</ulink>. Note
         that the semantics of overlay file systems are substantially
       </varlistentry>
 
       <varlistentry>
-        <term><option>--share-system</option></term>
-
-        <listitem><para>Allows the container to share certain system
-        facilities with the host. More specifically, this turns off
-        PID namespacing, UTS namespacing and IPC namespacing, and thus
-        allows the guest to see and interact more easily with
-        processes outside of the container. Note that using this
-        option makes it impossible to start up a full Operating System
-        in the container, as an init system cannot operate in this
-        mode. It is only useful to run specific programs or
-        applications this way, without involving an init system in the
-        container. This option implies <option>--register=no</option>.
-        This option may not be combined with
-        <option>--boot</option>.</para></listitem>
-      </varlistentry>
-
-      <varlistentry>
         <term><option>--register=</option></term>
 
-        <listitem><para>Controls whether the container is registered
-        with
-        <citerefentry><refentrytitle>systemd-machined</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
-        Takes a boolean argument, which defaults to <literal>yes</literal>.
-        This option should be enabled when the container runs a full
-        Operating System (more specifically: an init system), and is
-        useful to ensure that the container is accessible via
-        <citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
-        and shown by tools such as
-        <citerefentry project='man-pages'><refentrytitle>ps</refentrytitle><manvolnum>1</manvolnum></citerefentry>.
-        If the container does not run an init system, it is
-        recommended to set this option to <literal>no</literal>. Note
-        that <option>--share-system</option> implies
-        <option>--register=no</option>. </para></listitem>
+        <listitem><para>Controls whether the container is registered with
+        <citerefentry><refentrytitle>systemd-machined</refentrytitle><manvolnum>8</manvolnum></citerefentry>.  Takes a
+        boolean argument, which defaults to <literal>yes</literal>.  This option should be enabled when the container
+        runs a full Operating System (more specifically: a system and service manager as PID 1), and is useful to
+        ensure that the container is accessible via
+        <citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry> and shown by
+        tools such as <citerefentry
+        project='man-pages'><refentrytitle>ps</refentrytitle><manvolnum>1</manvolnum></citerefentry>.  If the container
+        does not run a service manager, it is recommended to set this option to
+        <literal>no</literal>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         service unit, and the service unit's sole purpose is to run a
         single <command>systemd-nspawn</command> container. This
         option is not available if run from a user
-        session.</para></listitem>
+        session.</para>
+        <para>Note that passing <option>--keep-unit</option> disables the effect of <option>--slice=</option> and
+        <option>--property=</option>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <option>no</option> (the default), the whole OS tree is made
         available writable.</para>
 
-        <para>Note that setting this to <option>yes</option> or
-        <option>state</option> will only work correctly with
-        operating systems in the container that can boot up with only
-        <filename>/usr</filename> mounted, and are able to populate
-        <filename>/var</filename> automatically, as
-        needed.</para></listitem>
+        <para>This option provides similar functionality for containers as the <literal>systemd.volatile=</literal>
+        kernel command line switch provides for host systems. See
+        <citerefentry><refentrytitle>kernel-command-line</refentrytitle><manvolnum>7</manvolnum></citerefentry> for
+        details.</para>
+
+        <para>Note that enabling this setting will only work correctly with operating systems in the container that can
+        boot up with only <filename>/usr</filename> mounted, and are able to automatically populate
+        <filename>/var</filename>, and also <filename>/etc</filename> in case of
+        <literal>--volatile=yes</literal>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
     <example>
       <title>Download a Fedora image and start a shell in it</title>
 
-      <programlisting># machinectl pull-raw --verify=no http://ftp.halifax.rwth-aachen.de/fedora/linux/releases/21/Cloud/Images/x86_64/Fedora-Cloud-Base-20141203-21.x86_64.raw.xz
-# systemd-nspawn -M Fedora-Cloud-Base-20141203-21</programlisting>
+      <programlisting># machinectl pull-raw --verify=no \
+      https://download.fedoraproject.org/pub/fedora/linux/releases/25/CloudImages/x86_64/images/Fedora-Cloud-Base-25-1.3.x86_64.raw.xz
+# systemd-nspawn -M Fedora-Cloud-Base-25-1.3.x86_64.raw</programlisting>
 
       <para>This downloads an image using
       <citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
     <example>
       <title>Build and boot a minimal Fedora distribution in a container</title>
 
-      <programlisting># dnf -y --releasever=23 --installroot=/srv/mycontainer --disablerepo='*' --enablerepo=fedora --enablerepo=updates install systemd passwd dnf fedora-release vim-minimal
+      <programlisting># dnf -y --releasever=25 --installroot=/srv/mycontainer \
+      --disablerepo='*' --enablerepo=fedora --enablerepo=updates install \
+      systemd passwd dnf fedora-release vim-minimal
 # systemd-nspawn -bD /srv/mycontainer</programlisting>
 
       <para>This installs a minimal Fedora distribution into the
     </example>
 
     <example>
-      <title>Boot into an ephemeral <literal>btrfs</literal> snapshot of the host system</title>
+      <title>Install the OpenSUSE Tumbleweed rolling distribution</title>
+
+      <programlisting># zypper --root=/var/lib/machines/tumbleweed ar -c \
+      https://download.opensuse.org/tumbleweed/repo/oss tumbleweed
+# zypper --root=/var/lib/machines/tumbleweed refresh
+# zypper --root=/var/lib/machines/tumbleweed install --no-recommends \
+      systemd shadow zypper openSUSE-release vim
+# systemd-nspawn -M tumbleweed passwd root
+# systemd-nspawn -M tumbleweed -b</programlisting>
+    </example>
+
+    <example>
+      <title>Boot into an ephemeral snapshot of the host system</title>
 
       <programlisting># systemd-nspawn -D / -xb</programlisting>
 
-      <para>This runs a copy of the host system in a
-      <literal>btrfs</literal> snapshot which is removed immediately
-      when the container exits. All file system changes made during
-      runtime will be lost on shutdown, hence.</para>
+      <para>This runs a copy of the host system in a snapshot which is removed immediately when the container
+      exits. All file system changes made during runtime will be lost on shutdown, hence.</para>
     </example>
 
     <example>
       <title>Run a container with SELinux sandbox security contexts</title>
 
       <programlisting># chcon system_u:object_r:svirt_sandbox_file_t:s0:c0,c1 -R /srv/container
-# systemd-nspawn -L system_u:object_r:svirt_sandbox_file_t:s0:c0,c1 -Z system_u:system_r:svirt_lxc_net_t:s0:c0,c1 -D /srv/container /bin/sh</programlisting>
+# systemd-nspawn -L system_u:object_r:svirt_sandbox_file_t:s0:c0,c1 \
+      -Z system_u:system_r:svirt_lxc_net_t:s0:c0,c1 -D /srv/container /bin/sh</programlisting>
+    </example>
+
+    <example>
+      <title>Run a container with an OSTree deployment</title>
+
+      <programlisting># systemd-nspawn -b -i ~/image.raw \
+      --pivot-root=/ostree/deploy/$OS/deploy/$CHECKSUM:/sysroot \
+      --bind=+/sysroot/ostree/deploy/$OS/var:/var</programlisting>
     </example>
   </refsect1>
 
       <citerefentry project='mankier'><refentrytitle>dnf</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry project='die-net'><refentrytitle>debootstrap</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry project='archlinux'><refentrytitle>pacman</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry project='mankier'><refentrytitle>zypper</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.slice</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry project='man-pages'><refentrytitle>btrfs</refentrytitle><manvolnum>8</manvolnum></citerefentry>
index 176f2b2..6a5f0e6 100644 (file)
@@ -72,7 +72,7 @@
     systems.</para>
 
     <para>For a longer discussion of kernel API file systems see
-    <ulink url="http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems">API
+    <ulink url="https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems">API
     File Systems</ulink>.</para>
   </refsect1>
 
index ca26bb4..e3ef26b 100644 (file)
@@ -21,7 +21,7 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 -->
 
-<refentry id="systemd-resolve"
+<refentry id="systemd-resolve" conditional='ENABLE_RESOLVED'
           xmlns:xi="http://www.w3.org/2001/XInclude">
 
   <refentryinfo>
     originating from local, trusted sources is also reported authenticated, including resolution of the local host
     name, the <literal>localhost</literal> host name or all data from <filename>/etc/hosts</filename>.</para>
 
-    <para>The <option>--type=</option> switch may be used to specify a DNS resource record type (A, AAAA, SOA, MX, ...) in
+    <para>The <option>--type=</option> switch may be used to specify a DNS resource record type (A, AAAA, SOA, MX, ) in
     order to request a specific DNS resource record, instead of the address or reverse address lookups.
     The special value <literal>help</literal> may be used to list known values.</para>
 
     TXT).</para>
 
     <para>The <option>--openpgp</option> switch may be used to query PGP keys stored as
-    <ulink url="https://tools.ietf.org/html/draft-wouters-dane-openpgp-02">OPENPGPKEY</ulink> resource records.
+    <ulink url="https://tools.ietf.org/html/rfc7929">OPENPGPKEY</ulink> resource records.
     When this option is specified one or more e-mail address must be specified.</para>
 
     <para>The <option>--tlsa</option> switch maybe be used to query TLS public
         (i.e. classic unicast DNS), <literal>llmnr</literal> (<ulink
         url="https://tools.ietf.org/html/rfc4795">Link-Local Multicast Name Resolution</ulink>),
         <literal>llmnr-ipv4</literal>, <literal>llmnr-ipv6</literal> (LLMNR via the indicated underlying IP
-        protocols). By default the lookup is done via all protocols suitable for the lookup. If used, limits the set of
+        protocols), <literal>mdns</literal> (<ulink url="https://www.ietf.org/rfc/rfc6762.txt">Multicast DNS</ulink>),
+        <literal>mdns-ipv4</literal>, <literal>mdns-ipv6</literal> (MDNS via the indicated underlying IP protocols).
+        By default the lookup is done via all protocols suitable for the lookup. If used, limits the set of
         protocols that may be used. Use this option multiple times to enable resolving via multiple protocols at the
         same time. The setting <literal>llmnr</literal> is identical to specifying this switch once with
         <literal>llmnr-ipv4</literal> and once via <literal>llmnr-ipv6</literal>. Note that this option does not force
         <literal>payload</literal>, the payload of the packet is exported. If the argument is
         <literal>packet</literal>, the whole packet is dumped in wire format, prefixed by
         length specified as a little-endian 64-bit number. This format allows multiple packets
-        to be dumped and unambigously parsed.</para></listitem>
+        to be dumped and unambiguously parsed.</para></listitem>
       </varlistentry>
 
       <varlistentry>
@@ -339,7 +341,7 @@ www.0pointer.net: 2a01:238:43ed:c300:10c3:bcf3:3266:da74
     </example>
 
     <example>
-      <title>Retrieve the MX record of the <literal>0pointer.net</literal> domain</title>
+      <title>Retrieve the MX record of the <literal>yahoo.com</literal> domain</title>
 
       <programlisting>$ systemd-resolve -t MX yahoo.com --legend=no
 yahoo.com. IN MX    1 mta7.am0.yahoodns.net
@@ -356,7 +358,7 @@ _xmpp-server._tcp/gmail.com: alt1.xmpp-server.l.google.com:5269 [priority=20, we
                              173.194.210.125
                              alt4.xmpp-server.l.google.com:5269 [priority=20, weight=0]
                              173.194.65.125
-                             ...
+                             …
 </programlisting>
     </example>
 
@@ -367,7 +369,7 @@ _xmpp-server._tcp/gmail.com: alt1.xmpp-server.l.google.com:5269 [priority=20, we
 d08ee310438ca124a6149ea5cc21b6313b390dce485576eff96f8722._openpgpkey.fedoraproject.org. IN OPENPGPKEY
         mQINBFBHPMsBEACeInGYJCb+7TurKfb6wGyTottCDtiSJB310i37/6ZYoeIay/5soJjlMyf
         MFQ9T2XNT/0LM6gTa0MpC1st9LnzYTMsT6tzRly1D1UbVI6xw0g0vE5y2Cjk3xUwAynCsSs
-        ...
+        …
 </programlisting>
     </example>
 
index aa1c236..f683184 100644 (file)
 
     <itemizedlist>
       <listitem><para>The native, fully-featured API <command>systemd-resolved</command> exposes on the bus. See the
-      <ulink url="http://www.freedesktop.org/wiki/Software/systemd/resolved">API Documentation</ulink> for
+      <ulink url="https://www.freedesktop.org/wiki/Software/systemd/resolved">API Documentation</ulink> for
       details. Usage of this API is generally recommended to clients as it is asynchronous and fully featured (for
       example, properly returns DNSSEC validation status and interface scope for addresses as necessary for supporting
       link-local networking).</para></listitem>
 
       <listitem><para>The glibc
-      <citerefentry><refentrytitle>getaddrinfo</refentrytitle><manvolnum>3</manvolnum></citerefentry> API as defined
+      <citerefentry project='man-pages'><refentrytitle>getaddrinfo</refentrytitle><manvolnum>3</manvolnum></citerefentry> API as defined
       by <ulink url="https://tools.ietf.org/html/rfc3493">RFC3493</ulink> and its related resolver functions,
-      including <citerefentry><refentrytitle>gethostbyname</refentrytitle><manvolnum>3</manvolnum></citerefentry>. This
+      including <citerefentry project='man-pages'><refentrytitle>gethostbyname</refentrytitle><manvolnum>3</manvolnum></citerefentry>. This
       API is widely supported, including beyond the Linux platform. In its current form it does not expose DNSSEC
       validation status information however, and is synchronous only. This API is backed by the glibc Name Service
-      Switch (<citerefentry><refentrytitle>nss</refentrytitle><manvolnum>5</manvolnum></citerefentry>). Usage of the
+      Switch (<citerefentry project='man-pages'><refentrytitle>nss</refentrytitle><manvolnum>5</manvolnum></citerefentry>). Usage of the
       glibc NSS module <citerefentry><refentrytitle>nss-resolve</refentrytitle><manvolnum>8</manvolnum></citerefentry>
       is required in order to allow glibc's NSS resolver functions to resolve host names via
       <command>systemd-resolved</command>.</para></listitem>
       current gateway, useful for referencing it independently of the
       current network configuration state.</para></listitem>
 
-      <listitem><para>The mappings defined in <filename>/etc/hosts</filename> are resolved to their configured
-      addresses and back.</para></listitem>
+      <listitem><para>The mappings defined in <filename>/etc/hosts</filename> are resolved
+      to their configured addresses and back, but they will not affect lookups for
+      non-address types (like MX).</para></listitem>
     </itemizedlist>
 
     <para>Lookup requests are routed to the available DNS servers
     per-interface domains are exclusively routed to the matching
     interfaces.</para>
 
-    <para>See the <ulink url="http://www.freedesktop.org/wiki/Software/systemd/resolved"> resolved D-Bus API
+    <para>See the <ulink url="https://www.freedesktop.org/wiki/Software/systemd/resolved"> resolved D-Bus API
     Documentation</ulink> for information about the APIs <filename>systemd-resolved</filename> provides.</para>
 
   </refsect1>
     <title><filename>/etc/resolv.conf</filename></title>
 
     <para>Three modes of handling <filename>/etc/resolv.conf</filename> (see
-    <citerefentry><refentrytitle>resolv.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>) are
+    <citerefentry project='man-pages'><refentrytitle>resolv.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>) are
     supported:</para>
 
     <itemizedlist>
index 9c1a292..5e44b15 100644 (file)
@@ -45,7 +45,7 @@
 
   <refnamediv>
     <refname>systemd-run</refname>
-    <refpurpose>Run programs in transient scope or service or timer units</refpurpose>
+    <refpurpose>Run programs in transient scope units, service units, or timer-scheduled service units</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
   <refsect1>
     <title>Description</title>
 
-    <para><command>systemd-run</command> may be used to create and
-    start a transient <filename>.service</filename> or
-    <filename>.scope</filename> unit and run the specified
-    <replaceable>COMMAND</replaceable> in it. It may also be used to
-    create and start transient <filename>.timer</filename>
-    units.</para>
-
-    <para>If a command is run as transient service unit, it will be
-    started and managed by the service manager like any other service,
-    and thus shows up in the output of <command>systemctl
-    list-units</command> like any other unit. It will run in a clean
-    and detached execution environment, with the service manager as
-    its parent process. In this mode, <command>systemd-run</command>
-    will start the service asynchronously in the background and return
-    after the command has begun execution.</para>
-
-    <para>If a command is run as transient scope unit, it will be
-    started by <command>systemd-run</command> itself as parent process
-    and will thus inherit the execution environment of the
-    caller. However, the processes of the command are managed by the
-    service manager similar to normal services, and will show up in
-    the output of <command>systemctl list-units</command>. Execution
-    in this case is synchronous, and will return only when the command
-    finishes. This mode is enabled via the <option>--scope</option>
-    switch (see below). </para>
-
-    <para>If a command is run with timer options such as
-    <option>--on-calendar=</option> (see below), a transient timer
-    unit is created alongside the service unit for the specified
-    command. Only the transient timer unit is started immediately, the
-    transient service unit will be started when the transient timer
-    elapses. If the <option>--unit=</option> is specified, the
-    <replaceable>COMMAND</replaceable> may be omitted. In this case,
-    <command>systemd-run</command> only creates a
-    <filename>.timer</filename> unit that invokes the specified unit
-    when elapsing.</para>
+    <para><command>systemd-run</command> may be used to create and start a transient <filename>.service</filename> or
+    <filename>.scope</filename> unit and run the specified <replaceable>COMMAND</replaceable> in it. It may also be
+    used to create and start a transient <filename>.timer</filename> unit, that activates a
+    <filename>.service</filename> unit when elapsing.</para>
+
+    <para>If a command is run as transient service unit, it will be started and managed by the service manager like any
+    other service, and thus shows up in the output of <command>systemctl list-units</command> like any other unit. It
+    will run in a clean and detached execution environment, with the service manager as its parent process. In this
+    mode, <command>systemd-run</command> will start the service asynchronously in the background and return after the
+    command has begun execution (unless <option>--no-block</option> or <option>--wait</option> are specified, see
+    below).</para>
+
+    <para>If a command is run as transient scope unit, it will be executed by <command>systemd-run</command> itself as
+    parent process and will thus inherit the execution environment of the caller. However, the processes of the command
+    are managed by the service manager similar to normal services, and will show up in the output of <command>systemctl
+    list-units</command>. Execution in this case is synchronous, and will return only when the command finishes. This
+    mode is enabled via the <option>--scope</option> switch (see below). </para>
+
+    <para>If a command is run with timer options such as <option>--on-calendar=</option> (see below), a transient timer
+    unit is created alongside the service unit for the specified command. Only the transient timer unit is started
+    immediately, the transient service unit will be started when the timer elapses. If the <option>--unit=</option>
+    option is specified, the <replaceable>COMMAND</replaceable> may be omitted. In this case,
+    <command>systemd-run</command> creates only a <filename>.timer</filename> unit that invokes the specified unit when
+    elapsing.</para>
   </refsect1>
 
   <refsect1>
         <term><option>--scope</option></term>
 
         <listitem>
-          <para>Create a transient <filename>.scope</filename> unit instead of
-          the default transient <filename>.service</filename> unit.
+          <para>Create a transient <filename>.scope</filename> unit instead of the default transient
+          <filename>.service</filename> unit (see above).
           </para>
         </listitem>
       </varlistentry>
         <term><option>--property=</option></term>
         <term><option>-p</option></term>
 
-        <listitem><para>Sets a unit property for the scope or service
-        unit that is created. This takes an assignment in the same
-        format as
+        <listitem><para>Sets a property on the scope or service unit that is created. This option takes an assignment
+        in the same format as
         <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>'s
         <command>set-property</command> command.</para>
         </listitem>
       <varlistentry>
         <term><option>--description=</option></term>
 
-        <listitem><para>Provide a description for the service or scope
-        unit. If not specified, the command itself will be used as a
-        description. See <varname>Description=</varname> in
+        <listitem><para>Provide a description for the service, scope or timer unit. If not specified, the command
+        itself will be used as a description. See <varname>Description=</varname> in
         <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
         </para></listitem>
       </varlistentry>
       <varlistentry>
         <term><option>--slice=</option></term>
 
-        <listitem><para>Make the new <filename>.service</filename> or
-        <filename>.scope</filename> unit part of the specified slice,
-        instead of the <filename>system.slice</filename>.</para>
+        <listitem><para>Make the new <filename>.service</filename> or <filename>.scope</filename> unit part of the
+        specified slice, instead of <filename>system.slice</filename>.</para>
         </listitem>
       </varlistentry>
 
       <varlistentry>
         <term><option>--remain-after-exit</option></term>
 
-        <listitem><para>After the service or scope process has
-        terminated, keep the service around until it is explicitly
-        stopped. This is useful to collect runtime information about
-        the service after it finished running. Also see
+        <listitem><para>After the service process has terminated, keep the service around until it is explicitly
+        stopped. This is useful to collect runtime information about the service after it finished running. Also see
         <varname>RemainAfterExit=</varname> in
         <citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
         </para>
       <varlistentry>
         <term><option>--send-sighup</option></term>
 
-        <listitem><para>When terminating the scope or service unit,
-        send a SIGHUP immediately after SIGTERM. This is useful to
-        indicate to shells and shell-like processes that the
-        connection has been severed. Also see
+        <listitem><para>When terminating the scope or service unit, send a SIGHUP immediately after SIGTERM. This is
+        useful to indicate to shells and shell-like processes that the connection has been severed. Also see
         <varname>SendSIGHUP=</varname> in
         <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
         </para>
         <term><option>--uid=</option></term>
         <term><option>--gid=</option></term>
 
-        <listitem><para>Runs the service process under the UNIX user
-        and group. Also see <varname>User=</varname> and
-        <varname>Group=</varname> in
+        <listitem><para>Runs the service process under the specified UNIX user and group. Also see
+        <varname>User=</varname> and <varname>Group=</varname> in
         <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
         </listitem>
       </varlistentry>
         <term><option>--pty</option></term>
         <term><option>-t</option></term>
 
-        <listitem><para>When invoking a command, the service connects
-        its standard input and output to the invoking tty via a
-        pseudo TTY device. This allows invoking binaries as services
-        that expect interactive user input, such as interactive
-        command shells.</para></listitem>
+        <listitem><para>When invoking the command, the transient service connects its standard input and output to the
+        terminal <command>systemd-run</command> is invoked on, via a pseudo TTY device. This allows running binaries
+        that expect interactive user input as services, such as interactive command shells.</para>
+
+        <para>Note that
+        <citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>'s
+        <command>shell</command> command is usually a better alternative for requesting a new, interactive login
+        session on the local host or a local container.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><option>--on-unit-active=</option></term>
         <term><option>--on-unit-inactive=</option></term>
 
-        <listitem><para>Defines monotonic timers relative to different
-        starting points. Also see <varname>OnActiveSec=</varname>,
-        <varname>OnBootSec=</varname>,
-        <varname>OnStartupSec=</varname>,
-        <varname>OnUnitActiveSec=</varname> and
-        <varname>OnUnitInactiveSec=</varname> in
-        <citerefentry><refentrytitle>systemd.timer</refentrytitle><manvolnum>5</manvolnum></citerefentry>. This
-        options have no effect in conjunction with
-        <option>--scope</option>.</para>
+        <listitem><para>Defines a monotonic timer relative to different starting points for starting the specified
+        command. See <varname>OnActiveSec=</varname>, <varname>OnBootSec=</varname>, <varname>OnStartupSec=</varname>,
+        <varname>OnUnitActiveSec=</varname> and <varname>OnUnitInactiveSec=</varname> in
+        <citerefentry><refentrytitle>systemd.timer</refentrytitle><manvolnum>5</manvolnum></citerefentry> for
+        details. These options may not be combined with <option>--scope</option> or <option>--pty</option>.</para>
         </listitem>
       </varlistentry>
 
       <varlistentry>
         <term><option>--on-calendar=</option></term>
 
-        <listitem><para>Defines realtime (i.e. wallclock) timers with
-        calendar event expressions. Also see
-        <varname>OnCalendar=</varname> in
-        <citerefentry><refentrytitle>systemd.timer</refentrytitle><manvolnum>5</manvolnum></citerefentry>. This
-        option has no effect in conjunction with
-        <option>--scope</option>.</para>
+        <listitem><para>Defines a calendar timer for starting the specified command. See <varname>OnCalendar=</varname>
+        in <citerefentry><refentrytitle>systemd.timer</refentrytitle><manvolnum>5</manvolnum></citerefentry>. This
+        option may not be combined with <option>--scope</option> or <option>--pty</option>.</para>
         </listitem>
       </varlistentry>
 
       <varlistentry>
         <term><option>--timer-property=</option></term>
 
-        <listitem><para>Sets a timer unit property for the timer unit
-        that is created. It is similar with
-        <option>--property</option> but only for created timer
-        unit. This option only has effect in conjunction with
-        <option>--on-active=</option>, <option>--on-boot=</option>,
-        <option>--on-startup=</option>,
-        <option>--on-unit-active=</option>,
-        <option>--on-unit-inactive=</option>,
-        <option>--on-calendar=</option>. This takes an assignment in
-        the same format as
-        <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>'s
+        <listitem><para>Sets a property on the timer unit that is created. This option is similar to
+        <option>--property=</option> but applies to the transient timer unit rather than the transient service unit
+        created. This option only has an effect in conjunction with <option>--on-active=</option>,
+        <option>--on-boot=</option>, <option>--on-startup=</option>, <option>--on-unit-active=</option>,
+        <option>--on-unit-inactive=</option> or <option>--on-calendar=</option>. This option takes an assignment in the
+        same format as <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>'s
         <command>set-property</command> command.</para> </listitem>
       </varlistentry>
 
         <term><option>--no-block</option></term>
 
         <listitem>
-          <para>Do not synchronously wait for the requested operation
-          to finish. If this is not specified, the job will be
-          verified, enqueued and <command>systemd-run</command> will
-          wait until the unit's start-up is completed. By passing this
-          argument, it is only verified and enqueued.</para>
+          <para>Do not synchronously wait for the unit start operation to finish. If this option is not specified, the
+          start request for the transient unit will be verified, enqueued and <command>systemd-run</command> will wait
+          until the unit's start-up is completed. By passing this argument, it is only verified and enqueued. This
+          option may not be combined with <option>--wait</option>.</para>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><option>--wait</option></term>
+
+        <listitem><para>Synchronously wait for the transient service to terminate. If this option is specified, the
+        start request for the transient unit is verified, enqueued, and waited for. Subsequently the invoked unit is
+        monitored, and it is waited until it is deactivated again (most likely because the specified command
+        completed). On exit, terse information about the unit's runtime is shown, including total runtime (as well as
+        CPU usage, if <option>--property=CPUAccounting=1</option> was set) and the exit code and status of the main
+        process. This output may be suppressed with <option>--quiet</option>. This option may not be combined with
+        <option>--no-block</option>, <option>--scope</option> or the various timer options.</para></listitem>
+      </varlistentry>
+
       <xi:include href="user-system-options.xml" xpointer="user" />
       <xi:include href="user-system-options.xml" xpointer="system" />
       <xi:include href="user-system-options.xml" xpointer="host" />
@@ -425,7 +407,7 @@ There is a screen on:
       when the user first logs in, and stays around as long as at least one
       login session is open. After the user logs out of the last session,
       <filename>user@.service</filename> and all services underneath it
-      are terminated. This behaviour is the default, when "lingering" is
+      are terminated. This behavior is the default, when "lingering" is
       not enabled for that user. Enabling lingering means that
       <filename>user@.service</filename> is started automatically during
       boot, even if the user is not logged in, and that the service is
@@ -452,6 +434,7 @@ There is a screen on:
       <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.timer</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-mount</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
     </para>
   </refsect1>
index 2cf3a7d..356bc10 100644 (file)
       </varlistentry>
 
       <varlistentry>
-        <term><option>--fdname=</option><replaceable>NAME</replaceable><optional>:<replaceable>NAME</replaceable>...</optional></term>
+        <term><option>--fdname=</option><replaceable>NAME</replaceable><optional>:<replaceable>NAME</replaceable></optional></term>
 
         <listitem><para>Specify names for the file descriptors passed. This is equivalent to setting
         <varname>FileDescriptorName=</varname> in socket unit files, and enables use of
         <citerefentry><refentrytitle>sd_listen_fds_with_names</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
         Multiple entries may be specifies using separate options or by separating names with colons
-        (<literal>:</literal>) in one option. In case more names are given than descriptors, superfluous ones willl be
+        (<literal>:</literal>) in one option. In case more names are given than descriptors, superfluous ones will be
         ignored. In case less names are given than descriptors, the remaining file descriptors will be unnamed.
         </para></listitem>
       </varlistentry>
index ae4217b..b8a7800 100644 (file)
     <variablelist>
       <xi:include href="standard-options.xml" xpointer="help" />
       <xi:include href="standard-options.xml" xpointer="version" />
+      <varlistentry>
+        <term><option>--connections-max=</option></term>
+        <term><option>-c</option></term>
+
+        <listitem><para>Sets the maximum number of simultaneous connections, defaults to 256.
+        If the limit of concurrent connections is reached further connections will be refused.</para></listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
   <refsect1>
@@ -120,16 +127,15 @@ PrivateNetwork=yes]]></programlisting>
       <example>
         <title>nginx.conf</title>
         <programlisting>
-<![CDATA[[...]
+<![CDATA[[]
 server {
     listen       unix:/tmp/nginx.sock;
-    [...]]]>
+    []]]>
 </programlisting>
       </example>
       <example>
         <title>Enabling the proxy</title>
-        <programlisting><![CDATA[# systemctl enable proxy-to-nginx.socket
-# systemctl start proxy-to-nginx.socket
+        <programlisting><![CDATA[# systemctl enable --now proxy-to-nginx.socket
 $ curl http://localhost:80/]]></programlisting>
       </example>
     </refsect2>
@@ -162,15 +168,14 @@ PrivateNetwork=yes]]></programlisting>
       </example>
       <example>
         <title>nginx.conf</title>
-        <programlisting><![CDATA[[...]
+        <programlisting><![CDATA[[]
 server {
     listen       8080;
-    [...]]]></programlisting>
+    []]]></programlisting>
       </example>
       <example>
         <title>Enabling the proxy</title>
-        <programlisting><![CDATA[# systemctl enable proxy-to-nginx.socket
-# systemctl start proxy-to-nginx.socket
+        <programlisting><![CDATA[# systemctl enable --now proxy-to-nginx.socket
 $ curl http://localhost:80/]]></programlisting>
       </example>
     </refsect2>
index a8beb86..2aa172e 100644 (file)
     <para>Note that scripts or binaries dropped in
     <filename>/usr/lib/systemd/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>
+    want to react to system suspend/hibernation and resume,
+    they should rather use the <ulink
+    url="https://www.freedesktop.org/wiki/Software/systemd/inhibit">Inhibitor
+    interface</ulink>.</para>
 
     <para>Note that
     <filename>systemd-suspend.service</filename>,
index 1bb40fd..336c7a5 100644 (file)
         <term><varname>DefaultStandardOutput=journal</varname></term>
         <term><varname>DefaultStandardError=inherit</varname></term>
 
-        <listitem><para>Configures various parameters of basic manager
-        operation. These options may be overridden by the respective
-        command line arguments. See
-        <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>
-        for details about these command line
-        arguments.</para></listitem>
+        <listitem><para>Configures various parameters of basic manager operation. These options may be overridden by
+        the respective process and kernel command line arguments. See
+        <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry> for
+        details.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>CtrlAltDelBurstAction=</varname></term>
+
+        <listitem><para>Defines what action will be performed
+        if user presses Ctrl-Alt-Delete more than 7 times in 2s.
+        Can be set to <literal>reboot-force</literal>, <literal>poweroff-force</literal>,
+        <literal>reboot-immediate</literal>, <literal>poweroff-immediate</literal>
+        or disabled with <literal>none</literal>. Defaults to
+        <literal>reboot-force</literal>.
+        </para></listitem>
       </varlistentry>
 
       <varlistentry>
         <varname>TasksAccounting=</varname>. See
         <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>
         for details on the per-unit
-        settings. <varname>DefaulTasksAccounting=</varname> defaults
+        settings. <varname>DefaultTasksAccounting=</varname> defaults
         to on, the other three settings to off.</para></listitem>
       </varlistentry>
 
index e44163a..fee8602 100644 (file)
@@ -67,7 +67,7 @@
     is a command line client to this service.</para>
 
     <para>See the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/timedated">
+    url="https://www.freedesktop.org/wiki/Software/systemd/timedated">
     developer documentation</ulink> for information about the APIs
     <filename>systemd-timedated</filename> provides.</para>
   </refsect1>
index 6ec3843..3edcaf1 100644 (file)
     reboots to ensure it monotonically advances even if the system
     lacks a battery-buffered RTC chip.</para>
 
+    <para>The <filename>systemd-timesyncd</filename> service
+    specifically implements only SNTP. This minimalistic
+    service will set the system clock for large offsets or
+    slowly adjust it for smaller deltas. More complex use
+    cases are not covered by <filename>systemd-timesyncd</filename>.</para>
+
     <para>The NTP servers contacted are determined from the global
     settings in
     <citerefentry><refentrytitle>timesyncd.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
index 2876fab..2c114f4 100644 (file)
@@ -50,7 +50,9 @@
 
   <refsynopsisdiv>
     <cmdsynopsis>
-      <command>systemd-tty-ask-password-agent <arg choice="opt" rep="repeat">OPTIONS</arg> <arg choice="opt" rep="repeat">VARIABLE=VALUE</arg></command>
+      <command>systemd-tty-ask-password-agent</command>
+      <arg choice="opt" rep="repeat">OPTIONS</arg>
+      <arg choice="opt" rep="repeat">VARIABLE=VALUE</arg>
     </cmdsynopsis>
   </refsynopsisdiv>
 
     runtime.</para>
 
     <para><command>systemd-tty-ask-password-agent</command> implements
-    the <ulink url="http://www.freedesktop.org/wiki/Software/systemd/PasswordAgents">Password
-    Agents Specification</ulink>.</para>
-
+    the <ulink url="https://www.freedesktop.org/wiki/Software/systemd/PasswordAgents">Password
+    Agents Specification</ulink>, and is one of many possible response agents which
+    answer to queries formulated with
+    <citerefentry><refentrytitle>systemd-ask-password</refentrytitle><manvolnum>1</manvolnum></citerefentry>.
+    </para>
   </refsect1>
 
   <refsect1>
index 243fd06..81b957b 100644 (file)
       <para>Parameters starting with "rd." will be read when
       <command>systemd-udevd</command> is used in an initrd.</para>
       <varlistentry>
-        <term><varname>udev.log-priority=</varname></term>
-        <term><varname>rd.udev.log-priority=</varname></term>
+        <term><varname>udev.log_priority=</varname></term>
+        <term><varname>rd.udev.log_priority=</varname></term>
         <listitem>
           <para>Set the log level.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
-        <term><varname>udev.children-max=</varname></term>
-        <term><varname>rd.udev.children-max=</varname></term>
+        <term><varname>udev.children_max=</varname></term>
+        <term><varname>rd.udev.children_max=</varname></term>
         <listitem>
           <para>Limit the number of events executed in parallel.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
-        <term><varname>udev.exec-delay=</varname></term>
-        <term><varname>rd.udev.exec-delay=</varname></term>
+        <term><varname>udev.exec_delay=</varname></term>
+        <term><varname>rd.udev.exec_delay=</varname></term>
         <listitem>
           <para>Delay the execution of <varname>RUN</varname> instructions by the given
           number of seconds. This option might be useful when
         </listitem>
       </varlistentry>
       <varlistentry>
-        <term><varname>udev.event-timeout=</varname></term>
-        <term><varname>rd.udev.event-timeout=</varname></term>
+        <term><varname>udev.event_timeout=</varname></term>
+        <term><varname>rd.udev.event_timeout=</varname></term>
         <listitem>
           <para>Wait for events to finish up to the given number
           of seconds. This option might be useful if events are
index ff07976..6df82ae 100644 (file)
   <refnamediv>
     <refname>systemd-vconsole-setup.service</refname>
     <refname>systemd-vconsole-setup</refname>
-    <refpurpose>Configure the virtual console at boot</refpurpose>
+    <refpurpose>Configure the virtual consoles</refpurpose>
   </refnamediv>
 
   <refsynopsisdiv>
     <para><filename>systemd-vconsole-setup.service</filename></para>
-    <para><filename>/usr/lib/systemd/systemd-vconsole-setup</filename></para>
+    <cmdsynopsis>
+      <command>/usr/lib/systemd/systemd-vconsole-setup</command>
+      <arg choice="opt">TTY</arg>
+    </cmdsynopsis>
   </refsynopsisdiv>
 
   <refsect1>
     <title>Description</title>
 
-    <para><filename>systemd-vconsole-setup.service</filename> is an
-    early boot service that configures the virtual console font and
-    console keymap. Internally it calls
-    <citerefentry project='mankier'><refentrytitle>loadkeys</refentrytitle><manvolnum>1</manvolnum></citerefentry>
-    and
-    <citerefentry project='die-net'><refentrytitle>setfont</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
-
-    <para>See
-    <citerefentry><refentrytitle>vconsole.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-    for information about the configuration files understood by this
-    service.</para>
-
-
-  </refsect1>
-
-  <refsect1>
-    <title>Kernel Command Line</title>
-
-    <para>A few configuration parameters from
-    <filename>vconsole.conf</filename> may be overridden on the kernel
-    command line:</para>
-
-    <variablelist class='kernel-commandline-options'>
-      <varlistentry>
-        <term><varname>vconsole.keymap=</varname></term>
-        <term><varname>vconsole.keymap.toggle=</varname></term>
-
-        <listitem><para>Overrides the key mapping table for the
-        keyboard and the second toggle keymap.</para></listitem>
-      </varlistentry>
-      <varlistentry>
-
-        <term><varname>vconsole.font=</varname></term>
-        <term><varname>vconsole.font.map=</varname></term>
-        <term><varname>vconsole.font.unimap=</varname></term>
+    <para><filename>systemd-vconsole-setup</filename> is a helper used to prepare either all virtual consoles, or — if
+      the optional <replaceable>TTY</replaceable> parameter is provided — a specific one. When the system is booting up
+      it's called by <citerefentry><refentrytitle>systemd-udevd</refentrytitle><manvolnum>8</manvolnum></citerefentry> during vtconsole subsystem initialization.
+      <productname>Systemd</productname> also calls it internally as needed via
+      <filename>systemd-vconsole-setup.service</filename>. The helper calls
+      <citerefentry project='mankier'><refentrytitle>loadkeys</refentrytitle><manvolnum>1</manvolnum></citerefentry> and
+      <citerefentry project='die-net'><refentrytitle>setfont</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+      internally.
+    </para>
 
-        <listitem><para>Configures the console font, the console map,
-        and the unicode font map.</para></listitem>
-      </varlistentry>
-    </variablelist>
+    <para>
+      You may want to use this helper whenever you change <filename>vconsole.conf</filename> to
+      refresh the settings on your consoles — either through the <command>systemctl restart</command> /
+      <command>systemctl start</command> command or directly through the executable.
+    </para>
 
     <para>See
     <citerefentry><refentrytitle>vconsole.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-    for information about these settings.</para>
+    for information about the configuration files and kernel command line options understood by this program.</para>
   </refsect1>
 
   <refsect1>
diff --git a/man/systemd-veritysetup-generator.xml b/man/systemd-veritysetup-generator.xml
new file mode 100644 (file)
index 0000000..87d66e9
--- /dev/null
@@ -0,0 +1,122 @@
+<?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">
+<!--
+  This file is part of systemd.
+
+  Copyright 2016 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/>.
+-->
+<refentry id="systemd-veritysetup-generator" conditional='HAVE_LIBCRYPTSETUP'>
+
+  <refentryinfo>
+    <title>systemd-veritysetup-generator</title>
+    <productname>systemd</productname>
+
+    <authorgroup>
+      <author>
+        <contrib>Developer</contrib>
+        <firstname>Lennart</firstname>
+        <surname>Poettering</surname>
+        <email>lennart@poettering.net</email>
+      </author>
+    </authorgroup>
+  </refentryinfo>
+
+  <refmeta>
+    <refentrytitle>systemd-veritysetup-generator</refentrytitle>
+    <manvolnum>8</manvolnum>
+  </refmeta>
+
+  <refnamediv>
+    <refname>systemd-veritysetup-generator</refname>
+    <refpurpose>Unit generator for integrity protected block devices</refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <para><filename>/usr/lib/systemd/system-generators/systemd-veritysetup-generator</filename></para>
+  </refsynopsisdiv>
+
+  <refsect1>
+    <title>Description</title>
+
+    <para><filename>systemd-veritysetup-generator</filename> is a generator that translates kernel command line options
+    configuring integrity protected block devices (verity) into native systemd units early at boot and when
+    configuration of the system manager is reloaded. This will create
+    <citerefentry><refentrytitle>systemd-veritysetup@.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+    units as necessary.</para>
+
+    <para>Currently, only a single verity device may be se up with this generator, backing the root file system of the
+    OS.</para>
+
+    <para><filename>systemd-veritysetup-generator</filename> implements
+    <citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>.</para>
+  </refsect1>
+
+  <refsect1>
+    <title>Kernel Command Line</title>
+
+    <para><filename>systemd-veritysetup-generator</filename>
+    understands the following kernel command line parameters:</para>
+
+    <variablelist class='kernel-commandline-options'>
+      <varlistentry>
+        <term><varname>systemd.verity=</varname></term>
+        <term><varname>rd.systemd.verity=</varname></term>
+
+        <listitem><para>Takes a boolean argument. Defaults to <literal>yes</literal>. If <literal>no</literal>,
+        disables the generator entirely. <varname>rd.systemd.verity=</varname> is honored only by the initial RAM disk
+        (initrd) while <varname>systemd.verity=</varname> is honored by both the host system and the
+        initrd. </para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>roothash=</varname></term>
+
+        <listitem><para>Takes a root hash value for the root file system. Expects a hash value formatted in hexadecimal
+        characters, of the appropriate length (i.e. most likely 256 bit/64 characters, or longer). If not specified via
+        <varname>systemd.verity_root_data=</varname> and <varname>systemd.verity_root_hash=</varname>, the hash and
+        data devices to use are automatically derived from the specified hash value. Specifically, the data partition
+        device is looked for under a GPT partition UUID derived from the first 128bit of the root hash, the hash
+        partition device is looked for under a GPT partition UUID derived from the last 128bit of the root hash. Hence
+        it is usually sufficient to specify the root hash to boot from an integrity protected root file system, as
+        device paths are automatically determined from it — as long as the partition table is properly set up.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>systemd.verity_root_data=</varname></term>
+        <term><varname>systemd.verity_root_hash=</varname></term>
+
+        <listitem><para>These two settings take block device paths as arguments, and may be use to explicitly configure
+        the data partition and hash partition to use for setting up the integrity protection for the root file
+        system. If not specified, these paths are automatically derived from the <varname>roothash=</varname> argument
+        (see above).</para></listitem>
+      </varlistentry>
+
+    </variablelist>
+  </refsect1>
+
+  <refsect1>
+    <title>See Also</title>
+    <para>
+      <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-veritysetup@.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry project='die-net'><refentrytitle>veritysetup</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-fstab-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+    </para>
+  </refsect1>
+
+</refentry>
diff --git a/man/systemd-veritysetup@.service.xml b/man/systemd-veritysetup@.service.xml
new file mode 100644 (file)
index 0000000..173e535
--- /dev/null
@@ -0,0 +1,75 @@
+<?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">
+<!--
+  This file is part of systemd.
+
+  Copyright 2016 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/>.
+-->
+<refentry id="systemd-veritysetup@.service" conditional='HAVE_LIBCRYPTSETUP'>
+
+  <refentryinfo>
+    <title>systemd-veritysetup@.service</title>
+    <productname>systemd</productname>
+
+    <authorgroup>
+      <author>
+        <contrib>Developer</contrib>
+        <firstname>Lennart</firstname>
+        <surname>Poettering</surname>
+        <email>lennart@poettering.net</email>
+      </author>
+    </authorgroup>
+  </refentryinfo>
+
+  <refmeta>
+    <refentrytitle>systemd-veritysetup@.service</refentrytitle>
+    <manvolnum>8</manvolnum>
+  </refmeta>
+
+  <refnamediv>
+    <refname>systemd-veritysetup@.service</refname>
+    <refname>systemd-veritysetup</refname>
+    <refpurpose>Disk integrity protection logic</refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <para><filename>systemd-veritysetup@.service</filename></para>
+    <para><filename>/usr/lib/systemd/systemd-veritysetup</filename></para>
+  </refsynopsisdiv>
+
+  <refsect1>
+    <title>Description</title>
+
+    <para><filename>systemd-veritysetup@.service</filename> is a service responsible for setting up integrity
+    protection (verity) block devices. It should be instantiated for each device that requires integrity
+    protection.</para>
+
+    <para>At early boot and when the system manager configuration is reloaded kernel command line configuration for
+    integrity protected block devices is translated into <filename>systemd-veritysetup@.service</filename> units by
+    <citerefentry><refentrytitle>systemd-veritysetup-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
+  </refsect1>
+
+  <refsect1>
+    <title>See Also</title>
+    <para>
+      <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-veritysetup-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry project='die-net'><refentrytitle>veritysetup</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+     </para>
+  </refsect1>
+
+</refentry>
diff --git a/man/systemd-volatile-root.service.xml b/man/systemd-volatile-root.service.xml
new file mode 100644 (file)
index 0000000..b90a326
--- /dev/null
@@ -0,0 +1,79 @@
+<?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">
+<!--
+  This file is part of systemd.
+
+  Copyright 2016 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/>.
+-->
+<refentry id="systemd-volatile-root.service">
+
+  <refentryinfo>
+    <title>systemd-volatile-root.service</title>
+    <productname>systemd</productname>
+
+    <authorgroup>
+      <author>
+        <contrib>Developer</contrib>
+        <firstname>Lennart</firstname>
+        <surname>Poettering</surname>
+        <email>lennart@poettering.net</email>
+      </author>
+    </authorgroup>
+  </refentryinfo>
+
+  <refmeta>
+    <refentrytitle>systemd-volatile-root.service</refentrytitle>
+    <manvolnum>8</manvolnum>
+  </refmeta>
+
+  <refnamediv>
+    <refname>systemd-volatile-root.service</refname>
+    <refname>systemd-volatile-root</refname>
+    <refpurpose>Make the root file system volatile</refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <para><filename>systemd-volatile-root.service</filename></para>
+    <para><filename>/usr/lib/systemd/systemd-volatile-root</filename></para>
+  </refsynopsisdiv>
+
+  <refsect1>
+    <title>Description</title>
+
+    <para><filename>systemd-volatile-root.service</filename> is a service that replaces the root directory with a
+    volatile memory file system (<literal>tmpfs</literal>), mounting the original (non-volatile)
+    <filename>/usr</filename> inside it read-only. This way, vendor data from <filename>/usr</filename> is available as
+    usual, but all configuration data in <filename>/etc</filename>, all state data in <filename>/var</filename> and all
+    other resources stored directly under the root directory are reset on boot and lost at shutdown, enabling fully
+    stateless systems.</para>
+
+    <para>This service is only enabled if full volatile mode is selected, for example by specifying
+    <literal>systemd.volatile=yes</literal> on the kernel command line. This service runs only in the initial RAM disk
+    ("initrd"), before the system transitions to the host's root directory. Note that this service is not used if
+    <literal>systemd.volatile=state</literal> is used, as in that mode the root directory is non-volatile.</para>
+  </refsect1>
+
+  <refsect1>
+    <title>See Also</title>
+    <para>
+      <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd-fstab-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>kernel-command-line</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+    </para>
+  </refsect1>
+
+</refentry>
diff --git a/man/systemd.environment-generator.xml b/man/systemd.environment-generator.xml
new file mode 100644 (file)
index 0000000..ff8be92
--- /dev/null
@@ -0,0 +1,161 @@
+<?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" [
+<!ENTITY % entities SYSTEM "custom-entities.ent" >
+%entities;
+]>
+
+<!--
+  This file is part of systemd.
+
+  Copyright 2017 Zbigniew Jędrzejewski-Szmek
+
+  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/>.
+-->
+
+<refentry id="systemd.environment-generator" conditional='ENABLE_ENVIRONMENT_D'
+    xmlns:xi="http://www.w3.org/2001/XInclude">
+  <refentryinfo>
+    <title>systemd.environment-generator</title>
+    <productname>systemd</productname>
+
+    <authorgroup>
+      <author>
+        <contrib>Developer</contrib>
+        <firstname>Zbigniew</firstname>
+        <surname>Jędrzejewski-Szmek</surname>
+        <email>zbyszek@in.waw.pl</email>
+      </author>
+    </authorgroup>
+  </refentryinfo>
+
+  <refmeta>
+    <refentrytitle>systemd.environment-generator</refentrytitle>
+    <manvolnum>7</manvolnum>
+  </refmeta>
+
+  <refnamediv>
+    <refname>systemd.environment-generator</refname>
+    <refpurpose>Systemd environment file generators</refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <cmdsynopsis>
+      <command>&systemenvgeneratordir;/some-generator</command>
+    </cmdsynopsis>
+    <cmdsynopsis>
+      <command>&userenvgeneratordir;/some-generator</command>
+    </cmdsynopsis>
+
+    <para>
+      <literallayout><filename>/run/systemd/system-environment-generators/*</filename>
+<filename>/etc/systemd/system-environment-generators/*</filename>
+<filename>/usr/local/lib/systemd/system-environment-generators/*</filename>
+<filename>&systemenvgeneratordir;/*</filename></literallayout>
+    </para>
+
+    <para>
+      <literallayout><filename>/run/systemd/user-environment-generators/*</filename>
+<filename>/etc/systemd/user-environment-generators/*</filename>
+<filename>/usr/local/lib/systemd/user-environment-generators/*</filename>
+<filename>&userenvgeneratordir;/*</filename></literallayout>
+    </para>
+  </refsynopsisdiv>
+
+  <refsect1>
+    <title>Description</title>
+    <para>Generators are small executables that live in
+    <filename>&systemenvgeneratordir;/</filename> and other directories listed above.
+    <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry> will
+    execute those binaries very early at the startup of each manager and at configuration
+    reload time, before running the generators described in
+    <citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+    and before starting any units. Environment generators can override the environment that the
+    manager exports to services and other processes.</para>
+
+    <para>Generators are loaded from a set of paths determined during compilation, as listed
+    above. System and user environment generators are loaded from directories with names ending in
+    <filename>system-environment-generators/</filename> and
+    <filename>user-environment-generators/</filename>, respectively. Generators found in directories
+    listed earlier override the ones with the same name in directories lower in the list. A symlink
+    to <filename>/dev/null</filename> or an empty file can be used to mask a generator, thereby
+    preventing it from running. Please note that the order of the two directories with the highest
+    priority is reversed with respect to the unit load path, and generators in
+    <filename>/run</filename> overwrite those in <filename>/etc</filename>.</para>
+
+    <para>After installing new generators or updating the configuration, <command>systemctl
+    daemon-reload</command> may be executed. This will re-run all generators, updating environment
+    configuration. It will be used for any services that are started subsequently.</para>
+
+    <para>Environment file generators are executed similarly to unit file generators described
+    in
+    <citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
+    with the following differences:</para>
+
+    <itemizedlist>
+      <listitem>
+        <para>Generators are executed sequentially in the alphanumerical order of the final
+        component of their name. The output of each generator output is immediately parsed and used
+        to update the environment for generators that run after that. Thus, later generators can use
+        and/or modify the output of earlier generators.</para>
+      </listitem>
+
+      <listitem>
+        <para>Generators are run by every manager instance, their output can be different for each
+        user.</para>
+      </listitem>
+    </itemizedlist>
+
+    <para>It is recommended to use numerical prefixes for generator names to simplify ordering.</para>
+  </refsect1>
+
+  <refsect1>
+    <title>Examples</title>
+
+    <example>
+      <title>A simple generator that extends an environment variable if a directory exists in the file system</title>
+
+      <programlisting># 50-xdg-data-dirs.sh
+
+<xi:include href="50-xdg-data-dirs.sh" parse="text" /></programlisting>
+    </example>
+
+    <example>
+      <title>A more complicated generator which reads existing configuration and mutates one variable</title>
+
+      <programlisting># 90-rearrange-path.py
+
+<xi:include href="90-rearrange-path.py" parse="text" /></programlisting>
+    </example>
+
+    <example>
+      <title>Debugging a generator</title>
+
+      <programlisting>SYSTEMD_LOG_LEVEL=debug VAR_A=something VAR_B="something else" \
+&systemenvgeneratordir;/path-to-generator
+</programlisting>
+    </example>
+  </refsect1>
+
+  <refsect1>
+    <title>See also</title>
+
+    <para>
+      <citerefentry><refentrytitle>systemd-environment-d-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+    </para>
+  </refsect1>
+</refentry>
index 8d6c927..2d6f220 100644 (file)
     execution specific configuration options are configured in the
     [Service], [Socket], [Mount], or [Swap] sections, depending on the
     unit type.</para>
+
+    <para>In addition, options which control resources through Linux Control Groups (cgroups) are listed in
+    <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+    Those options complement options listed here.</para>
   </refsect1>
 
   <refsect1>
     <para>A few execution parameters result in additional, automatic
     dependencies to be added.</para>
 
-    <para>Units with <varname>WorkingDirectory=</varname> or
-    <varname>RootDirectory=</varname> set automatically gain
-    dependencies of type <varname>Requires=</varname> and
-    <varname>After=</varname> on all mount units required to access
-    the specified paths. This is equivalent to having them listed
-    explicitly in <varname>RequiresMountsFor=</varname>.</para>
+    <para>Units with <varname>WorkingDirectory=</varname>, <varname>RootDirectory=</varname> or
+    <varname>RootImage=</varname> set automatically gain dependencies of type <varname>Requires=</varname> and
+    <varname>After=</varname> on all mount units required to access the specified paths. This is equivalent to having
+    them listed explicitly in <varname>RequiresMountsFor=</varname>.</para>
 
-    <para>Similar, units with <varname>PrivateTmp=</varname> enabled
-    automatically get mount unit dependencies for all mounts
-    required to access <filename>/tmp</filename> and
-    <filename>/var/tmp</filename>.</para>
+    <para>Similar, units with <varname>PrivateTmp=</varname> enabled automatically get mount unit dependencies for all
+    mounts required to access <filename>/tmp</filename> and <filename>/var/tmp</filename>. They will also gain an
+    automatic <varname>After=</varname> dependency on
+    <citerefentry><refentrytitle>systemd-tmpfiles-setup.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
 
     <para>Units whose standard output or error output is connected to <option>journal</option>, <option>syslog</option>
     or <option>kmsg</option> (or their combinations with console output, see below) automatically acquire dependencies
       <varlistentry>
         <term><varname>WorkingDirectory=</varname></term>
 
-        <listitem><para>Takes a directory path relative to the service's root
-        directory specified by <varname>RootDirectory=</varname>, or the
-        special value <literal>~</literal>. Sets the working directory
-        for executed processes. If set to <literal>~</literal>, the
-        home directory of the user specified in
-        <varname>User=</varname> is used. If not set, defaults to the
-        root directory when systemd is running as a system instance
-        and the respective user's home directory if run as user. If
-        the setting is prefixed with the <literal>-</literal>
-        character, a missing working directory is not considered
-        fatal. If <varname>RootDirectory=</varname> is not set, then
-        <varname>WorkingDirectory=</varname> is relative to the root of
-        the system running the service manager.
-        Note that setting this parameter might result in
-        additional dependencies to be added to the unit (see
+        <listitem><para>Takes a directory path relative to the service's root directory specified by
+        <varname>RootDirectory=</varname>, or the special value <literal>~</literal>. Sets the working directory for
+        executed processes. If set to <literal>~</literal>, the home directory of the user specified in
+        <varname>User=</varname> is used. If not set, defaults to the root directory when systemd is running as a
+        system instance and the respective user's home directory if run as user. If the setting is prefixed with the
+        <literal>-</literal> character, a missing working directory is not considered fatal. If
+        <varname>RootDirectory=</varname>/<varname>RootImage=</varname> is not set, then
+        <varname>WorkingDirectory=</varname> is relative to the root of the system running the service manager.  Note
+        that setting this parameter might result in additional dependencies to be added to the unit (see
         above).</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>RootDirectory=</varname></term>
 
-        <listitem><para>Takes a directory path relative to the host's root directory
-        (i.e. the root of the system running the service manager). Sets the
-        root directory for executed processes, with the <citerefentry
-        project='man-pages'><refentrytitle>chroot</refentrytitle><manvolnum>2</manvolnum></citerefentry>
-        system call. If this is used, it must be ensured that the
-        process binary and all its auxiliary files are available in
-        the <function>chroot()</function> jail. Note that setting this
-        parameter might result in additional dependencies to be added
-        to the unit (see above).</para></listitem>
+        <listitem><para>Takes a directory path relative to the host's root directory (i.e. the root of the system
+        running the service manager). Sets the root directory for executed processes, with the <citerefentry
+        project='man-pages'><refentrytitle>chroot</refentrytitle><manvolnum>2</manvolnum></citerefentry> system
+        call. If this is used, it must be ensured that the process binary and all its auxiliary files are available in
+        the <function>chroot()</function> jail. Note that setting this parameter might result in additional
+        dependencies to be added to the unit (see above).</para>
+
+        <para>The <varname>MountAPIVFS=</varname> and <varname>PrivateUsers=</varname> settings are particularly useful
+        in conjunction with <varname>RootDirectory=</varname>. For details, see below.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>RootImage=</varname></term>
+        <listitem><para>Takes a path to a block device node or regular file as argument. This call is similar to
+        <varname>RootDirectory=</varname> however mounts a file system hierarchy from a block device node or loopback
+        file instead of a directory. The device node or file system image file needs to contain a file system without a
+        partition table, or a file system within an MBR/MS-DOS or GPT partition table with only a single
+        Linux-compatible partition, or a set of file systems within a GPT partition table that follows the <ulink
+        url="https://www.freedesktop.org/wiki/Specifications/DiscoverablePartitionsSpec/">Discoverable Partitions
+        Specification</ulink>.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>MountAPIVFS=</varname></term>
+
+        <listitem><para>Takes a boolean argument. If on, a private mount namespace for the unit's processes is created
+        and the API file systems <filename>/proc</filename>, <filename>/sys</filename>, and <filename>/dev</filename>
+        are mounted inside of it, unless they are already mounted. Note that this option has no effect unless used in
+        conjunction with <varname>RootDirectory=</varname>/<varname>RootImage=</varname> as these three mounts are
+        generally mounted in the host anyway, and unless the root directory is changed, the private mount namespace
+        will be a 1:1 copy of the host's, and include these three mounts. Note that the <filename>/dev</filename> file
+        system of the host is bind mounted if this option is used without <varname>PrivateDevices=</varname>. To run
+        the service with a private, minimal version of <filename>/dev/</filename>, combine this option with
+        <varname>PrivateDevices=</varname>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>User=</varname></term>
         <term><varname>Group=</varname></term>
 
-        <listitem><para>Sets the Unix user or group that the processes
-        are executed as, respectively. Takes a single user or group
-        name or ID as argument. If no group is set, the default group
-        of the user is chosen. These do not affect commands prefixed with <literal>+</literal>.</para></listitem>
+        <listitem><para>Set the UNIX user or group that the processes are executed as, respectively. Takes a single
+        user or group name, or a numeric ID as argument. For system services (services run by the system service manager,
+        i.e. managed by PID 1) and for user services of the root user (services managed by root's instance of
+        <command>systemd --user</command>), the default is <literal>root</literal>, but <varname>User=</varname> may be
+        used to specify a different user. For user services of any other user, switching user identity is not
+        permitted, hence the only valid setting is the same user the user's service manager is running as. If no group
+        is set, the default group of the user is used. This setting does not affect commands whose command line is
+        prefixed with <literal>+</literal>.</para>
+
+        <para>Note that restrictions on the user/group name syntax are enforced: the specified name must consist only
+        of the characters a-z, A-Z, 0-9, <literal>_</literal> and <literal>-</literal>, except for the first character
+        which must be one of a-z, A-Z or <literal>_</literal> (i.e. numbers and <literal>-</literal> are not permitted
+        as first character). The user/group name must have at least one character, and at most 31. These restrictions
+        are enforced in order to avoid ambiguities and to ensure user/group names and unit files remain portable among
+        Linux systems.</para>
+
+        <para>When used in conjunction with <varname>DynamicUser=</varname> the user/group name specified is
+        dynamically allocated at the time the service is started, and released at the time the service is stopped —
+        unless it is already allocated statically (see below). If <varname>DynamicUser=</varname> is not used the
+        specified user and group must have been created statically in the user database no later than the moment the
+        service is started, for example using the
+        <citerefentry><refentrytitle>sysusers.d</refentrytitle><manvolnum>5</manvolnum></citerefentry> facility, which
+        is applied at boot or package install time.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>DynamicUser=</varname></term>
+
+        <listitem><para>Takes a boolean parameter. If set, a UNIX user and group pair is allocated dynamically when the
+        unit is started, and released as soon as it is stopped. The user and group will not be added to
+        <filename>/etc/passwd</filename> or <filename>/etc/group</filename>, but are managed transiently during
+        runtime. The <citerefentry><refentrytitle>nss-systemd</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+        glibc NSS module provides integration of these dynamic users/groups into the system's user and group
+        databases. The user and group name to use may be configured via <varname>User=</varname> and
+        <varname>Group=</varname> (see above). If these options are not used and dynamic user/group allocation is
+        enabled for a unit, the name of the dynamic user/group is implicitly derived from the unit name. If the unit
+        name without the type suffix qualifies as valid user name it is used directly, otherwise a name incorporating a
+        hash of it is used. If a statically allocated user or group of the configured name already exists, it is used
+        and no dynamic user/group is allocated. Dynamic users/groups are allocated from the UID/GID range
+        61184…65519. It is recommended to avoid this range for regular system or login users.  At any point in time
+        each UID/GID from this range is only assigned to zero or one dynamically allocated users/groups in
+        use. However, UID/GIDs are recycled after a unit is terminated. Care should be taken that any processes running
+        as part of a unit for which dynamic users/groups are enabled do not leave files or directories owned by these
+        users/groups around, as a different unit might get the same UID/GID assigned later on, and thus gain access to
+        these files or directories. If <varname>DynamicUser=</varname> is enabled, <varname>RemoveIPC=</varname>,
+        <varname>PrivateTmp=</varname> are implied. This ensures that the lifetime of IPC objects and temporary files
+        created by the executed processes is bound to the runtime of the service, and hence the lifetime of the dynamic
+        user/group. Since <filename>/tmp</filename> and <filename>/var/tmp</filename> are usually the only
+        world-writable directories on a system this ensures that a unit making use of dynamic user/group allocation
+        cannot leave files around after unit termination. Moreover <varname>ProtectSystem=strict</varname> and
+        <varname>ProtectHome=read-only</varname> are implied, thus prohibiting the service to write to arbitrary file
+        system locations. In order to allow the service to write to certain directories, they have to be whitelisted
+        using <varname>ReadWritePaths=</varname>, but care must be taken so that UID/GID recycling doesn't
+        create security issues involving files created by the service. Use <varname>RuntimeDirectory=</varname> (see
+        below) in order to assign a writable runtime directory to a service, owned by the dynamic user/group and
+        removed automatically when the unit is terminated. Defaults to off.</para></listitem>
       </varlistentry>
 
       <varlistentry>
       </varlistentry>
 
       <varlistentry>
+        <term><varname>RemoveIPC=</varname></term>
+
+        <listitem><para>Takes a boolean parameter. If set, all System V and POSIX IPC objects owned by the user and
+        group the processes of this unit are run as are removed when the unit is stopped. This setting only has an
+        effect if at least one of <varname>User=</varname>, <varname>Group=</varname> and
+        <varname>DynamicUser=</varname> are used. It has no effect on IPC objects owned by the root user. Specifically,
+        this removes System V semaphores, as well as System V and POSIX shared memory segments and message queues. If
+        multiple units use the same user or group the IPC objects are removed when the last of these units is
+        stopped. This setting is implied if <varname>DynamicUser=</varname> is set.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><varname>Nice=</varname></term>
 
         <listitem><para>Sets the default nice level (scheduling
         assignments have no effect. Variable expansion is not
         performed inside the strings, however, specifier expansion is
         possible. The $ character has no special meaning. If you need
-        to assign a value containing spaces to a variable, use double
+        to assign a value containing spaces or the equals sign to a variable, use double
         quotes (") for the assignment.</para>
 
         <para>Example:
         <option>null</option>,
         <option>tty</option>,
         <option>tty-force</option>,
-        <option>tty-fail</option> or
-        <option>socket</option>.</para>
+        <option>tty-fail</option>,
+        <option>socket</option> or
+        <option>fd</option>.</para>
 
         <para>If <option>null</option> is selected, standard input
         will be connected to <filename>/dev/null</filename>, i.e. all
         <citerefentry project='freebsd'><refentrytitle>inetd</refentrytitle><manvolnum>8</manvolnum></citerefentry>
         daemon.</para>
 
+        <para>The <option>fd</option> option connects
+        the input stream to a single file descriptor provided by a socket unit.
+        A custom named file descriptor can be specified as part of this option,
+        after a <literal>:</literal> (e.g. <literal>fd:<replaceable>foobar</replaceable></literal>).
+        If no name is specified, <literal>stdin</literal> is assumed
+        (i.e. <literal>fd</literal> is equivalent to <literal>fd:stdin</literal>).
+        At least one socket unit defining such name must be explicitly provided via the
+        <varname>Sockets=</varname> option, and file descriptor name may differ
+        from the name of its containing socket unit.
+        If multiple matches are found, the first one will be used.
+        See <varname>FileDescriptorName=</varname> in
+        <citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+        for more details about named descriptors and ordering.</para>
+
         <para>This setting defaults to
         <option>null</option>.</para></listitem>
       </varlistentry>
         <option>kmsg</option>,
         <option>journal+console</option>,
         <option>syslog+console</option>,
-        <option>kmsg+console</option> or
-        <option>socket</option>.</para>
+        <option>kmsg+console</option>,
+        <option>socket</option> or
+        <option>fd</option>.</para>
 
         <para><option>inherit</option> duplicates the file descriptor
         of standard input for standard output.</para>
         similar to the same option of
         <varname>StandardInput=</varname>.</para>
 
+        <para>The <option>fd</option> option connects
+        the output stream to a single file descriptor provided by a socket unit.
+        A custom named file descriptor can be specified as part of this option,
+        after a <literal>:</literal> (e.g. <literal>fd:<replaceable>foobar</replaceable></literal>).
+        If no name is specified, <literal>stdout</literal> is assumed
+        (i.e. <literal>fd</literal> is equivalent to <literal>fd:stdout</literal>).
+        At least one socket unit defining such name must be explicitly provided via the
+        <varname>Sockets=</varname> option, and file descriptor name may differ
+        from the name of its containing socket unit.
+        If multiple matches are found, the first one will be used.
+        See <varname>FileDescriptorName=</varname> in
+        <citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+        for more details about named descriptors and ordering.</para>
+
         <para>If the standard output (or error output, see below) of a unit is connected to the journal, syslog or the
         kernel log buffer, the unit will implicitly gain a dependency of type <varname>After=</varname> on
         <filename>systemd-journald.socket</filename> (also see the automatic dependencies section above).</para>
         <listitem><para>Controls where file descriptor 2 (STDERR) of
         the executed processes is connected to. The available options
         are identical to those of <varname>StandardOutput=</varname>,
-        with one exception: if set to <option>inherit</option> the
+        with some exceptions: if set to <option>inherit</option> the
         file descriptor used for standard output is duplicated for
-        standard error. This setting defaults to the value set with
+        standard error, while <option>fd</option> operates on the error
+        stream and will look by default for a descriptor named
+        <literal>stderr</literal>.</para>
+
+        <para>This setting defaults to the value set with
         <option>DefaultStandardError=</option> in
         <citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
         which defaults to <option>inherit</option>. Note that setting
         <varname>MemoryLimit=</varname> is a more powerful (and
         working) replacement for <varname>LimitRSS=</varname>.</para>
 
+        <para>For system units these resource limits may be chosen freely. For user units however (i.e. units run by a
+        per-user instance of
+        <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>), these limits are
+        bound by (possibly more restrictive) per-user limits enforced by the OS.</para>
+
+        <para>Resource limits not configured explicitly for a unit default to the value configured in the various
+        <varname>DefaultLimitCPU=</varname>, <varname>DefaultLimitFSIZE=</varname>, … options available in
+        <citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>, and –
+        if not configured there – the kernel or per-user defaults, as defined by the OS (the latter only for user
+        services, see above).</para>
+
         <table>
-          <title>Limit directives and their equivalent with ulimit</title>
+          <title>Resource limit directives, their equivalent <command>ulimit</command> shell commands and the unit used</title>
 
           <tgroup cols='3'>
             <colspec colname='directive' />
             <thead>
               <row>
                 <entry>Directive</entry>
-                <entry>ulimit equivalent</entry>
+                <entry><command>ulimit</command> equivalent</entry>
                 <entry>Unit</entry>
               </row>
             </thead>
 
       <varlistentry>
         <term><varname>PAMName=</varname></term>
-        <listitem><para>Sets the PAM service name to set up a session
-        as. If set, the executed process will be registered as a PAM
-        session under the specified service name. This is only useful
-        in conjunction with the <varname>User=</varname> setting. If
-        not set, no PAM session will be opened for the executed
-        processes. See
-        <citerefentry project='man-pages'><refentrytitle>pam</refentrytitle><manvolnum>8</manvolnum></citerefentry>
-        for details.</para></listitem>
+        <listitem><para>Sets the PAM service name to set up a session as. If set, the executed process will be
+        registered as a PAM session under the specified service name. This is only useful in conjunction with the
+        <varname>User=</varname> setting, and is otherwise ignored. If not set, no PAM session will be opened for the
+        executed processes. See <citerefentry
+        project='man-pages'><refentrytitle>pam</refentrytitle><manvolnum>8</manvolnum></citerefentry> for
+        details.</para>
+
+        <para>Note that for each unit making use of this option a PAM session handler process will be maintained as
+        part of the unit and stays around as long as the unit is active, to ensure that appropriate actions can be
+        taken when the unit and hence the PAM session terminates. This process is named <literal>(sd-pam)</literal> and
+        is an immediate child process of the unit's main process.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>CapabilityBoundingSet=</varname></term>
 
-        <listitem><para>Controls which capabilities to include in the
-        capability bounding set for the executed process. See
-        <citerefentry project='man-pages'><refentrytitle>capabilities</refentrytitle><manvolnum>7</manvolnum></citerefentry>
-        for details. Takes a whitespace-separated list of capability
-        names as read by
-        <citerefentry project='mankier'><refentrytitle>cap_from_name</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-        e.g. <constant>CAP_SYS_ADMIN</constant>,
-        <constant>CAP_DAC_OVERRIDE</constant>,
-        <constant>CAP_SYS_PTRACE</constant>. Capabilities listed will
-        be included in the bounding set, all others are removed. If
-        the list of capabilities is prefixed with
-        <literal>~</literal>, all but the listed capabilities will be
-        included, the effect of the assignment inverted. Note that
-        this option also affects the respective capabilities in the
-        effective, permitted and inheritable capability sets, on top
-        of what <varname>Capabilities=</varname> does. If this option
-        is not used, the capability bounding set is not modified on
-        process execution, hence no limits on the capabilities of the
-        process are enforced. This option may appear more than once, in
-        which case the bounding sets are merged. If the empty string
-        is assigned to this option, the bounding set is reset to the
-        empty capability set, and all prior settings have no effect.
-        If set to <literal>~</literal> (without any further argument),
-        the bounding set is reset to the full set of available
-        capabilities, also undoing any previous
-        settings.</para></listitem>
+        <listitem><para>Controls which capabilities to include in the capability bounding set for the executed
+        process. See <citerefentry
+        project='man-pages'><refentrytitle>capabilities</refentrytitle><manvolnum>7</manvolnum></citerefentry> for
+        details. Takes a whitespace-separated list of capability names, e.g. <constant>CAP_SYS_ADMIN</constant>,
+        <constant>CAP_DAC_OVERRIDE</constant>, <constant>CAP_SYS_PTRACE</constant>. Capabilities listed will be
+        included in the bounding set, all others are removed. If the list of capabilities is prefixed with
+        <literal>~</literal>, all but the listed capabilities will be included, the effect of the assignment
+        inverted. Note that this option also affects the respective capabilities in the effective, permitted and
+        inheritable capability sets. If this option is not used, the capability bounding set is not modified on process
+        execution, hence no limits on the capabilities of the process are enforced. This option may appear more than
+        once, in which case the bounding sets are merged. If the empty string is assigned to this option, the bounding
+        set is reset to the empty capability set, and all prior settings have no effect.  If set to
+        <literal>~</literal> (without any further argument), the bounding set is reset to the full set of available
+        capabilities, also undoing any previous settings. This does not affect commands prefixed with
+        <literal>+</literal>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>AmbientCapabilities=</varname></term>
 
-        <listitem><para>Controls which capabilities to include in the
-        ambient capability set for the executed process. Takes a
-        whitespace-separated list of capability names as read by
-        <citerefentry project='mankier'><refentrytitle>cap_from_name</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-        e.g. <constant>CAP_SYS_ADMIN</constant>,
-        <constant>CAP_DAC_OVERRIDE</constant>,
-        <constant>CAP_SYS_PTRACE</constant>. This option may appear more than
-        once in which case the ambient capability sets are merged.
-        If the list of capabilities is prefixed with <literal>~</literal>, all
-        but the listed capabilities will be included, the effect of the
-        assignment inverted. If the empty string is
-        assigned to this option, the ambient capability set is reset to
-        the empty capability set, and all prior settings have no effect.
-        If set to <literal>~</literal> (without any further argument), the
-        ambient capability set is reset to the full set of available
-        capabilities, also undoing any previous settings. Note that adding
-        capabilities to ambient capability set adds them to the process's
-        inherited capability set.
-        </para><para>
-        Ambient capability sets are useful if you want to execute a process
-        as a non-privileged user but still want to give it some capabilities.
-        Note that in this case option <constant>keep-caps</constant> is
-        automatically added to <varname>SecureBits=</varname> to retain the
-        capabilities over the user change. <varname>AmbientCapabilities=</varname> does not affect
-        commands prefixed with <literal>+</literal>.</para></listitem>
+        <listitem><para>Controls which capabilities to include in the ambient capability set for the executed
+        process. Takes a whitespace-separated list of capability names, e.g. <constant>CAP_SYS_ADMIN</constant>,
+        <constant>CAP_DAC_OVERRIDE</constant>, <constant>CAP_SYS_PTRACE</constant>. This option may appear more than
+        once in which case the ambient capability sets are merged.  If the list of capabilities is prefixed with
+        <literal>~</literal>, all but the listed capabilities will be included, the effect of the assignment
+        inverted. If the empty string is assigned to this option, the ambient capability set is reset to the empty
+        capability set, and all prior settings have no effect.  If set to <literal>~</literal> (without any further
+        argument), the ambient capability set is reset to the full set of available capabilities, also undoing any
+        previous settings. Note that adding capabilities to ambient capability set adds them to the process's inherited
+        capability set.  </para><para> Ambient capability sets are useful if you want to execute a process as a
+        non-privileged user but still want to give it some capabilities.  Note that in this case option
+        <constant>keep-caps</constant> is automatically added to <varname>SecureBits=</varname> to retain the
+        capabilities over the user change. <varname>AmbientCapabilities=</varname> does not affect commands prefixed
+        with <literal>+</literal>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>ReadOnlyPaths=</varname></term>
         <term><varname>InaccessiblePaths=</varname></term>
 
-        <listitem><para>Sets up a new file system namespace for
-        executed processes. These options may be used to limit access
-        a process might have to the main file system hierarchy. Each
-        setting takes a space-separated list of paths relative to
-        the host's root directory (i.e. the system running the service manager).
-        Note that if entries contain symlinks, they are resolved from the host's root directory as well.
-        Entries (files or directories) listed in
-        <varname>ReadWritePaths=</varname> are accessible from
-        within the namespace with the same access rights as from
-        outside. Entries listed in
-        <varname>ReadOnlyPaths=</varname> are accessible for
-        reading only, writing will be refused even if the usual file
-        access controls would permit this. Entries listed in
-        <varname>InaccessiblePaths=</varname> will be made
-        inaccessible for processes inside the namespace, and may not
-        countain any other mountpoints, including those specified by
-        <varname>ReadWritePaths=</varname> or
-        <varname>ReadOnlyPaths=</varname>.
-        Note that restricting access with these options does not extend
-        to submounts of a directory that are created later on.
-        Non-directory paths can be specified as well. These
-        options may be specified more than once, in which case all
-        paths listed will have limited access from within the
-        namespace. If the empty string is assigned to this option, the
-        specific list is reset, and all prior assignments have no
-        effect.</para>
-        <para>Paths in
-        <varname>ReadOnlyPaths=</varname>
-        and
-        <varname>InaccessiblePaths=</varname>
-        may be prefixed with
-        <literal>-</literal>, in which case
-        they will be ignored when they do not
-        exist. Note that using this
-        setting will disconnect propagation of
-        mounts from the service to the host
-        (propagation in the opposite direction
-        continues to work). This means that
-        this setting may not be used for
-        services which shall be able to
-        install mount points in the main mount
-        namespace.</para></listitem>
+        <listitem><para>Sets up a new file system namespace for executed processes. These options may be used to limit
+        access a process might have to the file system hierarchy. Each setting takes a space-separated list of paths
+        relative to the host's root directory (i.e. the system running the service manager).  Note that if paths
+        contain symlinks, they are resolved relative to the root directory set with
+        <varname>RootDirectory=</varname>/<varname>RootImage=</varname>.</para>
+
+        <para>Paths listed in <varname>ReadWritePaths=</varname> are accessible from within the namespace with the same
+        access modes as from outside of it. Paths listed in <varname>ReadOnlyPaths=</varname> are accessible for
+        reading only, writing will be refused even if the usual file access controls would permit this. Nest
+        <varname>ReadWritePaths=</varname> inside of <varname>ReadOnlyPaths=</varname> in order to provide writable
+        subdirectories within read-only directories. Use <varname>ReadWritePaths=</varname> in order to whitelist
+        specific paths for write access if <varname>ProtectSystem=strict</varname> is used. Paths listed in
+        <varname>InaccessiblePaths=</varname> will be made inaccessible for processes inside the namespace (along with
+        everything below them in the file system hierarchy).</para>
+
+        <para>Note that restricting access with these options does not extend to submounts of a directory that are
+        created later on.  Non-directory paths may be specified as well. These options may be specified more than once,
+        in which case all paths listed will have limited access from within the namespace. If the empty string is
+        assigned to this option, the specific list is reset, and all prior assignments have no effect.</para>
+
+        <para>Paths in <varname>ReadWritePaths=</varname>, <varname>ReadOnlyPaths=</varname> and
+        <varname>InaccessiblePaths=</varname> may be prefixed with <literal>-</literal>, in which case they will be
+        ignored when they do not exist. If prefixed with <literal>+</literal> the paths are taken relative to the root
+        directory of the unit, as configured with <varname>RootDirectory=</varname>/<varname>RootImage=</varname>,
+        instead of relative to the root directory of the host (see above). When combining <literal>-</literal> and
+        <literal>+</literal> on the same path make sure to specify <literal>-</literal> first, and <literal>+</literal>
+        second.</para>
+
+        <para>Note that using this setting will disconnect propagation of mounts from the service to the host
+        (propagation in the opposite direction continues to work). This means that this setting may not be used for
+        services which shall be able to install mount points in the main mount namespace. Note that the effect of these
+        settings may be undone by privileged processes. In order to set up an effective sandboxed environment for a
+        unit it is thus recommended to combine these settings with either
+        <varname>CapabilityBoundingSet=~CAP_SYS_ADMIN</varname> or
+        <varname>SystemCallFilter=~@mount</varname>.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>BindPaths=</varname></term>
+        <term><varname>BindReadOnlyPaths=</varname></term>
+
+        <listitem><para>Configures unit-specific bind mounts. A bind mount makes a particular file or directory
+        available at an additional place in the unit's view of the file system. Any bind mounts created with this
+        option are specific to the unit, and are not visible in the host's mount table. This option expects a
+        whitespace separated list of bind mount definitions. Each definition consists of a colon-separated triple of
+        source path, destination path and option string, where the latter two are optional. If only a source path is
+        specified the source and destination is taken to be the same. The option string may be either
+        <literal>rbind</literal> or <literal>norbind</literal> for configuring a recursive or non-recursive bind
+        mount. If the destination path is omitted, the option string must be omitted too.</para>
+
+        <para><varname>BindPaths=</varname> creates regular writable bind mounts (unless the source file system mount
+        is already marked read-only), while <varname>BindReadOnlyPaths=</varname> creates read-only bind mounts. These
+        settings may be used more than once, each usage appends to the unit's list of bind mounts. If the empty string
+        is assigned to either of these two options the entire list of bind mounts defined prior to this is reset. Note
+        that in this case both read-only and regular bind mounts are reset, regardless which of the two settings is
+        used.</para>
+
+        <para>This option is particularly useful when <varname>RootDirectory=</varname>/<varname>RootImage=</varname>
+        is used. In this case the source path refers to a path on the host file system, while the destination path
+        refers to a path below the root directory of the unit.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>PrivateTmp=</varname></term>
 
-        <listitem><para>Takes a boolean argument. If true, sets up a
-        new file system namespace for the executed processes and
-        mounts private <filename>/tmp</filename> and
-        <filename>/var/tmp</filename> directories inside it that is
-        not shared by processes outside of the namespace. This is
-        useful to secure access to temporary files of the process, but
-        makes sharing between processes via <filename>/tmp</filename>
-        or <filename>/var/tmp</filename> impossible. If this is
-        enabled, all temporary files created by a service in these
-        directories will be removed after the service is stopped.
-        Defaults to false. It is possible to run two or more units
-        within the same private <filename>/tmp</filename> and
-        <filename>/var/tmp</filename> namespace by using the
+        <listitem><para>Takes a boolean argument. If true, sets up a new file system namespace for the executed
+        processes and mounts private <filename>/tmp</filename> and <filename>/var/tmp</filename> directories inside it
+        that is not shared by processes outside of the namespace. This is useful to secure access to temporary files of
+        the process, but makes sharing between processes via <filename>/tmp</filename> or <filename>/var/tmp</filename>
+        impossible. If this is enabled, all temporary files created by a service in these directories will be removed
+        after the service is stopped.  Defaults to false. It is possible to run two or more units within the same
+        private <filename>/tmp</filename> and <filename>/var/tmp</filename> namespace by using the
         <varname>JoinsNamespaceOf=</varname> directive, see
-        <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-        for details. Note that using this setting will disconnect
-        propagation of mounts from the service to the host
-        (propagation in the opposite direction continues to work).
-        This means that this setting may not be used for services
-        which shall be able to install mount points in the main mount
-        namespace.</para></listitem>
+        <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry> for
+        details. This setting is implied if <varname>DynamicUser=</varname> is set. For this setting the same
+        restrictions regarding mount propagation and privileges apply as for <varname>ReadOnlyPaths=</varname> and
+        related calls, see above. Enabling this setting has the side effect of adding <varname>Requires=</varname> and
+        <varname>After=</varname> dependencies on all mount units necessary to access <filename>/tmp</filename> and
+        <filename>/var/tmp</filename>. Moreover an implicitly <varname>After=</varname> ordering on
+        <citerefentry><refentrytitle>systemd-tmpfiles-setup.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+        is added.</para>
+
+        <para>Note that the implementation of this setting might be impossible (for example if mount namespaces
+        are not available), and the unit should be written in a way that does not solely rely on this setting for
+        security.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>PrivateDevices=</varname></term>
 
-        <listitem><para>Takes a boolean argument. If true, sets up a
-        new /dev namespace for the executed processes and only adds
-        API pseudo devices such as <filename>/dev/null</filename>,
+        <listitem><para>Takes a boolean argument. If true, sets up a new <filename>/dev</filename> mount for the
+        executed processes and only adds API pseudo devices such as <filename>/dev/null</filename>,
         <filename>/dev/zero</filename> or
-        <filename>/dev/random</filename> (as well as the pseudo TTY
-        subsystem) to it, but no physical devices such as
-        <filename>/dev/sda</filename>. This is useful to securely turn
-        off physical device access by the executed process. Defaults
-        to false. Enabling this option will also remove
-        <constant>CAP_MKNOD</constant> from the capability bounding
-        set for the unit (see above), and set
-        <varname>DevicePolicy=closed</varname> (see
+        <filename>/dev/random</filename> (as well as the pseudo TTY subsystem) to it, but no physical devices such as
+        <filename>/dev/sda</filename>, system memory <filename>/dev/mem</filename>, system ports
+        <filename>/dev/port</filename> and others. This is useful to securely turn off physical device access by the
+        executed process. Defaults to false. Enabling this option will install a system call filter to block low-level
+        I/O system calls that are grouped in the <varname>@raw-io</varname> set, will also remove
+        <constant>CAP_MKNOD</constant> and <constant>CAP_SYS_RAWIO</constant> from the capability bounding set for
+        the unit (see above), and set <varname>DevicePolicy=closed</varname> (see
         <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-        for details). Note that using this setting will disconnect
-        propagation of mounts from the service to the host
-        (propagation in the opposite direction continues to work).
-        This means that this setting may not be used for services
-        which shall be able to install mount points in the main mount
-        namespace. The /dev namespace will be mounted read-only and 'noexec'.
-        The latter may break old programs which try to set up executable
-        memory by using <citerefentry><refentrytitle>mmap</refentrytitle><manvolnum>2</manvolnum></citerefentry>
-        of <filename>/dev/zero</filename> instead of using <constant>MAP_ANON</constant>.</para></listitem>
+        for details). Note that using this setting will disconnect propagation of mounts from the service to the host
+        (propagation in the opposite direction continues to work).  This means that this setting may not be used for
+        services which shall be able to install mount points in the main mount namespace. The new <filename>/dev</filename>
+        will be mounted read-only and 'noexec'. The latter may break old programs which try to set up executable memory by
+        using <citerefentry><refentrytitle>mmap</refentrytitle><manvolnum>2</manvolnum></citerefentry> of
+        <filename>/dev/zero</filename> instead of using <constant>MAP_ANON</constant>. This setting is implied if
+        <varname>DynamicUser=</varname> is set. For this setting the same restrictions regarding mount propagation and
+        privileges apply as for <varname>ReadOnlyPaths=</varname> and related calls, see above.
+        If turned on and if running in user mode, or in system mode, but without the <constant>CAP_SYS_ADMIN</constant>
+        capability (e.g. setting <varname>User=</varname>), <varname>NoNewPrivileges=yes</varname>
+        is implied.
+        </para>
+
+        <para>Note that the implementation of this setting might be impossible (for example if mount namespaces
+        are not available), and the unit should be written in a way that does not solely rely on this setting for
+        security.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         configures only the loopback network device
         <literal>lo</literal> inside it. No other network devices will
         be available to the executed process. This is useful to
-        securely turn off network access by the executed process.
+        turn off network access by the executed process.
         Defaults to false. It is possible to run two or more units
         within the same private network namespace by using the
         <varname>JoinsNamespaceOf=</varname> directive, see
         The latter has the effect that AF_UNIX sockets in the abstract
         socket namespace will become unavailable to the processes
         (however, those located in the file system will continue to be
-        accessible).</para></listitem>
+        accessible).</para>
+
+        <para>Note that the implementation of this setting might be impossible (for example if network namespaces
+        are not available), and the unit should be written in a way that does not solely rely on this setting for
+        security.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>PrivateUsers=</varname></term>
+
+        <listitem><para>Takes a boolean argument. If true, sets up a new user namespace for the executed processes and
+        configures a minimal user and group mapping, that maps the <literal>root</literal> user and group as well as
+        the unit's own user and group to themselves and everything else to the <literal>nobody</literal> user and
+        group. This is useful to securely detach the user and group databases used by the unit from the rest of the
+        system, and thus to create an effective sandbox environment. All files, directories, processes, IPC objects and
+        other resources owned by users/groups not equaling <literal>root</literal> or the unit's own will stay visible
+        from within the unit but appear owned by the <literal>nobody</literal> user and group. If this mode is enabled,
+        all unit processes are run without privileges in the host user namespace (regardless if the unit's own
+        user/group is <literal>root</literal> or not). Specifically this means that the process will have zero process
+        capabilities on the host's user namespace, but full capabilities within the service's user namespace. Settings
+        such as <varname>CapabilityBoundingSet=</varname> will affect only the latter, and there's no way to acquire
+        additional capabilities in the host's user namespace. Defaults to off.</para>
+
+        <para>This setting is particularly useful in conjunction with
+        <varname>RootDirectory=</varname>/<varname>RootImage=</varname>, as the need to synchronize the user and group
+        databases in the root directory and on the host is reduced, as the only users and groups who need to be matched
+        are <literal>root</literal>, <literal>nobody</literal> and the unit's own user and group.</para>
+
+        <para>Note that the implementation of this setting might be impossible (for example if user namespaces
+        are not available), and the unit should be written in a way that does not solely rely on this setting for
+        security.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>ProtectSystem=</varname></term>
 
-        <listitem><para>Takes a boolean argument or
-        <literal>full</literal>. If true, mounts the
-        <filename>/usr</filename> and <filename>/boot</filename>
-        directories read-only for processes invoked by this unit. If
-        set to <literal>full</literal>, the <filename>/etc</filename>
-        directory is mounted read-only, too. This setting ensures that
-        any modification of the vendor-supplied operating system (and
-        optionally its configuration) is prohibited for the service.
-        It is recommended to enable this setting for all long-running
-        services, unless they are involved with system updates or need
-        to modify the operating system in other ways. Note however
-        that processes retaining the CAP_SYS_ADMIN capability can undo
-        the effect of this setting. This setting is hence particularly
-        useful for daemons which have this capability removed, for
-        example with <varname>CapabilityBoundingSet=</varname>.
-        Defaults to off.</para></listitem>
+        <listitem><para>Takes a boolean argument or the special values <literal>full</literal> or
+        <literal>strict</literal>. If true, mounts the <filename>/usr</filename> and <filename>/boot</filename>
+        directories read-only for processes invoked by this unit. If set to <literal>full</literal>, the
+        <filename>/etc</filename> directory is mounted read-only, too. If set to <literal>strict</literal> the entire
+        file system hierarchy is mounted read-only, except for the API file system subtrees <filename>/dev</filename>,
+        <filename>/proc</filename> and <filename>/sys</filename> (protect these directories using
+        <varname>PrivateDevices=</varname>, <varname>ProtectKernelTunables=</varname>,
+        <varname>ProtectControlGroups=</varname>). This setting ensures that any modification of the vendor-supplied
+        operating system (and optionally its configuration, and local mounts) is prohibited for the service.  It is
+        recommended to enable this setting for all long-running services, unless they are involved with system updates
+        or need to modify the operating system in other ways. If this option is used,
+        <varname>ReadWritePaths=</varname> may be used to exclude specific directories from being made read-only. This
+        setting is implied if <varname>DynamicUser=</varname> is set. For this setting the same restrictions regarding
+        mount propagation and privileges apply as for <varname>ReadOnlyPaths=</varname> and related calls, see
+        above. Defaults to off.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>ProtectHome=</varname></term>
 
-        <listitem><para>Takes a boolean argument or
-        <literal>read-only</literal>. If true, the directories
-        <filename>/home</filename>, <filename>/root</filename> and
-        <filename>/run/user</filename>
-        are made inaccessible and empty for processes invoked by this
-        unit. If set to <literal>read-only</literal>, the three
-        directories are made read-only instead. It is recommended to
-        enable this setting for all long-running services (in
-        particular network-facing ones), to ensure they cannot get
-        access to private user data, unless the services actually
-        require access to the user's private data. Note however that
-        processes retaining the CAP_SYS_ADMIN capability can undo the
-        effect of this setting. This setting is hence particularly
-        useful for daemons which have this capability removed, for
-        example with <varname>CapabilityBoundingSet=</varname>.
-        Defaults to off.</para></listitem>
+        <listitem><para>Takes a boolean argument or <literal>read-only</literal>. If true, the directories
+        <filename>/home</filename>, <filename>/root</filename> and <filename>/run/user</filename> are made inaccessible
+        and empty for processes invoked by this unit. If set to <literal>read-only</literal>, the three directories are
+        made read-only instead. It is recommended to enable this setting for all long-running services (in particular
+        network-facing ones), to ensure they cannot get access to private user data, unless the services actually
+        require access to the user's private data. This setting is implied if <varname>DynamicUser=</varname> is
+        set. For this setting the same restrictions regarding mount propagation and privileges apply as for
+        <varname>ReadOnlyPaths=</varname> and related calls, see above.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>ProtectKernelTunables=</varname></term>
+
+        <listitem><para>Takes a boolean argument. If true, kernel variables accessible through
+        <filename>/proc/sys</filename>, <filename>/sys</filename>, <filename>/proc/sysrq-trigger</filename>,
+        <filename>/proc/latency_stats</filename>, <filename>/proc/acpi</filename>,
+        <filename>/proc/timer_stats</filename>, <filename>/proc/fs</filename> and <filename>/proc/irq</filename> will
+        be made read-only to all processes of the unit. Usually, tunable kernel variables should be initialized only at
+        boot-time, for example with the
+        <citerefentry><refentrytitle>sysctl.d</refentrytitle><manvolnum>5</manvolnum></citerefentry> mechanism. Few
+        services need to write to these at runtime; it is hence recommended to turn this on for most services. For this
+        setting the same restrictions regarding mount propagation and privileges apply as for
+        <varname>ReadOnlyPaths=</varname> and related calls, see above. Defaults to off.  If turned on and if running
+        in user mode, or in system mode, but without the <constant>CAP_SYS_ADMIN</constant> capability (e.g.  services
+        for which <varname>User=</varname> is set), <varname>NoNewPrivileges=yes</varname> is implied. Note that this
+        option does not prevent indirect changes to kernel tunables effected by IPC calls to other processes. However,
+        <varname>InaccessiblePaths=</varname> may be used to make relevant IPC file system objects inaccessible. If
+        <varname>ProtectKernelTunables=</varname> is set, <varname>MountAPIVFS=yes</varname> is
+        implied.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>ProtectKernelModules=</varname></term>
+
+        <listitem><para>Takes a boolean argument. If true, explicit module loading will
+        be denied. This allows to turn off module load and unload operations on modular
+        kernels. It is recommended to turn this on for most services that do not need special
+        file systems or extra kernel modules to work. Default to off. Enabling this option
+        removes <constant>CAP_SYS_MODULE</constant> from the capability bounding set for
+        the unit, and installs a system call filter to block module system calls,
+        also <filename>/usr/lib/modules</filename> is made inaccessible. For this
+        setting the same restrictions regarding mount propagation and privileges
+        apply as for <varname>ReadOnlyPaths=</varname> and related calls, see above.
+        Note that limited automatic module loading due to user configuration or kernel
+        mapping tables might still happen as side effect of requested user operations,
+        both privileged and unprivileged. To disable module auto-load feature please see
+        <citerefentry><refentrytitle>sysctl.d</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+        <constant>kernel.modules_disabled</constant> mechanism and
+        <filename>/proc/sys/kernel/modules_disabled</filename> documentation.
+        If turned on and if running in user mode, or in system mode, but without the <constant>CAP_SYS_ADMIN</constant>
+        capability (e.g. setting <varname>User=</varname>), <varname>NoNewPrivileges=yes</varname>
+        is implied.
+        </para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>ProtectControlGroups=</varname></term>
+
+        <listitem><para>Takes a boolean argument. If true, the Linux Control Groups (<citerefentry
+        project='man-pages'><refentrytitle>cgroups</refentrytitle><manvolnum>7</manvolnum></citerefentry>) hierarchies
+        accessible through <filename>/sys/fs/cgroup</filename> will be made read-only to all processes of the
+        unit. Except for container managers no services should require write access to the control groups hierarchies;
+        it is hence recommended to turn this on for most services. For this setting the same restrictions regarding
+        mount propagation and privileges apply as for <varname>ReadOnlyPaths=</varname> and related calls, see
+        above. Defaults to off. If <varname>ProtectControlGroups=</varname> is set, <varname>MountAPIVFS=yes</varname> is
+        implied.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>MountFlags=</varname></term>
 
-        <listitem><para>Takes a mount propagation flag:
-        <option>shared</option>, <option>slave</option> or
-        <option>private</option>, which control whether mounts in the
-        file system namespace set up for this unit's processes will
-        receive or propagate mounts or unmounts. See
-        <citerefentry project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>2</manvolnum></citerefentry>
-        for details. Defaults to <option>shared</option>. Use
-        <option>shared</option> to ensure that mounts and unmounts are
-        propagated from the host to the container and vice versa. Use
-        <option>slave</option> to run processes so that none of their
-        mounts and unmounts will propagate to the host. Use
-        <option>private</option> to also ensure that no mounts and
-        unmounts from the host will propagate into the unit processes'
-        namespace. Note that <option>slave</option> means that file
-        systems mounted on the host might stay mounted continuously in
-        the unit's namespace, and thus keep the device busy. Note that
-        the file system namespace related options
-        (<varname>PrivateTmp=</varname>,
-        <varname>PrivateDevices=</varname>,
-        <varname>ProtectSystem=</varname>,
-        <varname>ProtectHome=</varname>,
-        <varname>ReadOnlyPaths=</varname>,
-        <varname>InaccessiblePaths=</varname> and
-        <varname>ReadWritePaths=</varname>) require that mount
-        and unmount propagation from the unit's file system namespace
-        is disabled, and hence downgrade <option>shared</option> to
+        <listitem><para>Takes a mount propagation flag: <option>shared</option>, <option>slave</option> or
+        <option>private</option>, which control whether mounts in the file system namespace set up for this unit's
+        processes will receive or propagate mounts and unmounts. See <citerefentry
+        project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>2</manvolnum></citerefentry> for
+        details. Defaults to <option>shared</option>. Use <option>shared</option> to ensure that mounts and unmounts
+        are propagated from systemd's namespace to the service's namespace and vice versa. Use <option>slave</option>
+        to run processes so that none of their mounts and unmounts will propagate to the host. Use <option>private</option>
+        to also ensure that no mounts and unmounts from the host will propagate into the unit processes' namespace.
+        If this is set to <option>slave</option> or <option>private</option>, any mounts created by spawned processes
+        will be unmounted after the completion of the current command line of <varname>ExecStartPre=</varname>,
+        <varname>ExecStartPost=</varname>, <varname>ExecStart=</varname>,
+        and <varname>ExecStopPost=</varname>. Note that
+        <option>slave</option> means that file systems mounted on the host might stay mounted continuously in the
+        unit's namespace, and thus keep the device busy. Note that the file system namespace related options
+        (<varname>PrivateTmp=</varname>, <varname>PrivateDevices=</varname>, <varname>ProtectSystem=</varname>,
+        <varname>ProtectHome=</varname>, <varname>ProtectKernelTunables=</varname>,
+        <varname>ProtectControlGroups=</varname>, <varname>ReadOnlyPaths=</varname>,
+        <varname>InaccessiblePaths=</varname>, <varname>ReadWritePaths=</varname>) require that mount and unmount
+        propagation from the unit's file system namespace is disabled, and hence downgrade <option>shared</option> to
         <option>slave</option>. </para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>NoNewPrivileges=</varname></term>
 
-        <listitem><para>Takes a boolean argument. If true, ensures
-        that the service process and all its children can never gain
-        new privileges. This option is more powerful than the
-        respective secure bits flags (see above), as it also prohibits
-        UID changes of any kind. This is the simplest, most effective
-        way to ensure that a process and its children can never
-        elevate privileges again.</para></listitem>
+        <listitem><para>Takes a boolean argument. If true, ensures that the service process and all its children can
+        never gain new privileges through <function>execve()</function> (e.g. via setuid or setgid bits, or filesystem
+        capabilities). This is the simplest and most effective way to ensure that a process and its children can never
+        elevate privileges again. Defaults to false, but certain settings force
+        <varname>NoNewPrivileges=yes</varname>, ignoring the value of this setting.  This is the case when
+        <varname>SystemCallFilter=</varname>, <varname>SystemCallArchitectures=</varname>,
+        <varname>RestrictAddressFamilies=</varname>, <varname>RestrictNamespaces=</varname>,
+        <varname>PrivateDevices=</varname>, <varname>ProtectKernelTunables=</varname>,
+        <varname>ProtectKernelModules=</varname>, <varname>MemoryDenyWriteExecute=</varname>, or
+        <varname>RestrictRealtime=</varname> are specified.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>SystemCallFilter=</varname></term>
 
-        <listitem><para>Takes a space-separated list of system call
-        names. If this setting is used, all system calls executed by
-        the unit processes except for the listed ones will result in
-        immediate process termination with the
-        <constant>SIGSYS</constant> signal (whitelisting). If the
-        first character of the list is <literal>~</literal>, the
-        effect is inverted: only the listed system calls will result
-        in immediate process termination (blacklisting). If running in
-        user mode, or in system mode, but without the
-        <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting
-        <varname>User=nobody</varname>),
-        <varname>NoNewPrivileges=yes</varname> is implied. This
-        feature makes use of the Secure Computing Mode 2 interfaces of
-        the kernel ('seccomp filtering') and is useful for enforcing a
-        minimal sandboxing environment. Note that the
-        <function>execve</function>,
-        <function>rt_sigreturn</function>,
-        <function>sigreturn</function>,
-        <function>exit_group</function>, <function>exit</function>
-        system calls are implicitly whitelisted and do not need to be
-        listed explicitly. This option may be specified more than once,
-        in which case the filter masks are merged. If the empty string
-        is assigned, the filter is reset, all prior assignments will
-        have no effect. This does not affect commands prefixed with <literal>+</literal>.</para>
+        <listitem><para>Takes a space-separated list of system call names. If this setting is used, all system calls
+        executed by the unit processes except for the listed ones will result in immediate process termination with the
+        <constant>SIGSYS</constant> signal (whitelisting). If the first character of the list is <literal>~</literal>,
+        the effect is inverted: only the listed system calls will result in immediate process termination
+        (blacklisting). If running in user mode, or in system mode, but without the <constant>CAP_SYS_ADMIN</constant>
+        capability (e.g. setting <varname>User=nobody</varname>), <varname>NoNewPrivileges=yes</varname> is
+        implied. This feature makes use of the Secure Computing Mode 2 interfaces of the kernel ('seccomp filtering')
+        and is useful for enforcing a minimal sandboxing environment. Note that the <function>execve</function>,
+        <function>exit</function>, <function>exit_group</function>, <function>getrlimit</function>,
+        <function>rt_sigreturn</function>, <function>sigreturn</function> system calls and the system calls for
+        querying time and sleeping are implicitly whitelisted and do not need to be listed explicitly. This option may
+        be specified more than once, in which case the filter masks are merged. If the empty string is assigned, the
+        filter is reset, all prior assignments will have no effect. This does not affect commands prefixed with
+        <literal>+</literal>.</para>
+
+        <para>Note that on systems supporting multiple ABIs (such as x86/x86-64) it is recommended to turn off
+        alternative ABIs for services, so that they cannot be used to circumvent the restrictions of this
+        option. Specifically, it is recommended to combine this option with
+        <varname>SystemCallArchitectures=native</varname> or similar.</para>
+
+        <para>Note that strict system call filters may impact execution and error handling code paths of the service
+        invocation. Specifically, access to the <function>execve</function> system call is required for the execution
+        of the service binary — if it is blocked service invocation will necessarily fail. Also, if execution of the
+        service binary fails for some reason (for example: missing service executable), the error handling logic might
+        require access to an additional set of system calls in order to process and log this failure correctly. It
+        might be necessary to temporarily disable system call filters in order to simplify debugging of such
+        failures.</para>
 
         <para>If you specify both types of this option (i.e.
         whitelisting and blacklisting), the first encountered will
             </thead>
             <tbody>
               <row>
+                <entry>@basic-io</entry>
+                <entry>System calls for basic I/O: reading, writing, seeking, file descriptor duplication and closing (<citerefentry project='man-pages'><refentrytitle>read</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>write</refentrytitle><manvolnum>2</manvolnum></citerefentry>, and related calls)</entry>
+              </row>
+              <row>
                 <entry>@clock</entry>
                 <entry>System calls for changing the system clock (<citerefentry project='man-pages'><refentrytitle>adjtimex</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>settimeofday</refentrytitle><manvolnum>2</manvolnum></citerefentry>, and related calls)</entry>
               </row>
                 <entry>Debugging, performance monitoring and tracing functionality (<citerefentry project='man-pages'><refentrytitle>ptrace</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>perf_event_open</refentrytitle><manvolnum>2</manvolnum></citerefentry> and related calls)</entry>
               </row>
               <row>
+                <entry>@file-system</entry>
+                <entry>File system operations: opening, creating files and directories for read and write, renaming and removing them, reading file properties, or creating hard and symbolic links.</entry>
+              </row>
+              <row>
                 <entry>@io-event</entry>
                 <entry>Event loop system calls (<citerefentry project='man-pages'><refentrytitle>poll</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>select</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>epoll</refentrytitle><manvolnum>7</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>eventfd</refentrytitle><manvolnum>2</manvolnum></citerefentry> and related calls)</entry>
               </row>
               <row>
                 <entry>@ipc</entry>
-                <entry>SysV IPC, POSIX Message Queues or other IPC (<citerefentry project='man-pages'><refentrytitle>mq_overview</refentrytitle><manvolnum>7</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>svipc</refentrytitle><manvolnum>7</manvolnum></citerefentry>)</entry>
+                <entry>Pipes, SysV IPC, POSIX Message Queues and other IPC (<citerefentry project='man-pages'><refentrytitle>mq_overview</refentrytitle><manvolnum>7</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>svipc</refentrytitle><manvolnum>7</manvolnum></citerefentry>)</entry>
               </row>
               <row>
                 <entry>@keyring</entry>
               </row>
               <row>
                 <entry>@module</entry>
-                <entry>Kernel module control (<citerefentry project='man-pages'><refentrytitle>init_module</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>delete_module</refentrytitle><manvolnum>2</manvolnum></citerefentry> and related calls)</entry>
+                <entry>Loading and unloading of kernel modules (<citerefentry project='man-pages'><refentrytitle>init_module</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>delete_module</refentrytitle><manvolnum>2</manvolnum></citerefentry> and related calls)</entry>
               </row>
               <row>
                 <entry>@mount</entry>
-                <entry>File system mounting and unmounting (<citerefentry project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>chroot</refentrytitle><manvolnum>2</manvolnum></citerefentry>, and related calls)</entry>
+                <entry>Mounting and unmounting of file systems (<citerefentry project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>chroot</refentrytitle><manvolnum>2</manvolnum></citerefentry>, and related calls)</entry>
               </row>
               <row>
                 <entry>@network-io</entry>
               </row>
               <row>
                 <entry>@process</entry>
-                <entry>Process control, execution, namespaces (<citerefentry project='man-pages'><refentrytitle>execve</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>kill</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>namespaces</refentrytitle><manvolnum>7</manvolnum></citerefentry>, …</entry>
+                <entry>Process control, execution, namespaceing operations (<citerefentry project='man-pages'><refentrytitle>clone</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>kill</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>namespaces</refentrytitle><manvolnum>7</manvolnum></citerefentry>, …</entry>
               </row>
               <row>
                 <entry>@raw-io</entry>
-                <entry>Raw I/O port access (<citerefentry project='man-pages'><refentrytitle>ioperm</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>iopl</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <function>pciconfig_read()</function>, …</entry>
+                <entry>Raw I/O port access (<citerefentry project='man-pages'><refentrytitle>ioperm</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>iopl</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <function>pciconfig_read()</function>, …)</entry>
+              </row>
+              <row>
+                <entry>@reboot</entry>
+                <entry>System calls for rebooting and reboot preparation (<citerefentry project='man-pages'><refentrytitle>reboot</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <function>kexec()</function>, …)</entry>
+              </row>
+              <row>
+                <entry>@resources</entry>
+                <entry>System calls for changing resource limits, memory and scheduling parameters (<citerefentry project='man-pages'><refentrytitle>setrlimit</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>setpriority</refentrytitle><manvolnum>2</manvolnum></citerefentry>, …)</entry>
+              </row>
+              <row>
+                <entry>@swap</entry>
+                <entry>System calls for enabling/disabling swap devices (<citerefentry project='man-pages'><refentrytitle>swapon</refentrytitle><manvolnum>2</manvolnum></citerefentry>, <citerefentry project='man-pages'><refentrytitle>swapoff</refentrytitle><manvolnum>2</manvolnum></citerefentry>)</entry>
               </row>
             </tbody>
           </tgroup>
         </table>
 
-        Note, that as new system calls are added to the kernel, additional system calls might be added to the groups
-        above, so the contents of the sets may change between systemd versions.</para></listitem>
+        Note, that as new system calls are added to the kernel, additional system calls might be
+        added to the groups above. Contents of the sets may also change between systemd
+        versions. In addition, the list of system calls depends on the kernel version and
+        architecture for which systemd was compiled. Use
+        <command>systemd-analyze syscall-filter</command> to list the actual list of system calls in
+        each filter.
+      </para>
+
+        <para>It is recommended to combine the file system namespacing related options with
+        <varname>SystemCallFilter=~@mount</varname>, in order to prohibit the unit's processes to undo the
+        mappings. Specifically these are the options <varname>PrivateTmp=</varname>,
+        <varname>PrivateDevices=</varname>, <varname>ProtectSystem=</varname>, <varname>ProtectHome=</varname>,
+        <varname>ProtectKernelTunables=</varname>, <varname>ProtectControlGroups=</varname>,
+        <varname>ReadOnlyPaths=</varname>, <varname>InaccessiblePaths=</varname> and
+        <varname>ReadWritePaths=</varname>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
       <varlistentry>
         <term><varname>SystemCallArchitectures=</varname></term>
 
-        <listitem><para>Takes a space-separated list of architecture
-        identifiers to include in the system call filter. The known
-        architecture identifiers are <constant>x86</constant>,
-        <constant>x86-64</constant>, <constant>x32</constant>,
-        <constant>arm</constant> as well as the special identifier
-        <constant>native</constant>. Only system calls of the
-        specified architectures will be permitted to processes of this
-        unit. This is an effective way to disable compatibility with
-        non-native architectures for processes, for example to
-        prohibit execution of 32-bit x86 binaries on 64-bit x86-64
-        systems. The special <constant>native</constant> identifier
-        implicitly maps to the native architecture of the system (or
-        more strictly: to the architecture the system manager is
-        compiled for). If running in user mode, or in system mode,
-        but without the <constant>CAP_SYS_ADMIN</constant>
-        capability (e.g. setting <varname>User=nobody</varname>),
-        <varname>NoNewPrivileges=yes</varname> is implied. Note
-        that setting this option to a non-empty list implies that
-        <constant>native</constant> is included too. By default, this
-        option is set to the empty list, i.e. no architecture system
-        call filtering is applied.</para></listitem>
+        <listitem><para>Takes a space-separated list of architecture identifiers to include in the system call
+        filter. The known architecture identifiers are the same as for <varname>ConditionArchitecture=</varname>
+        described in <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
+        as well as <constant>x32</constant>, <constant>mips64-n32</constant>, <constant>mips64-le-n32</constant>, and
+        the special identifier <constant>native</constant>. Only system calls of the specified architectures will be
+        permitted to processes of this unit. This is an effective way to disable compatibility with non-native
+        architectures for processes, for example to prohibit execution of 32-bit x86 binaries on 64-bit x86-64
+        systems. The special <constant>native</constant> identifier implicitly maps to the native architecture of the
+        system (or more strictly: to the architecture the system manager is compiled for). If running in user mode, or
+        in system mode, but without the <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting
+        <varname>User=nobody</varname>), <varname>NoNewPrivileges=yes</varname> is implied. Note that setting this
+        option to a non-empty list implies that <constant>native</constant> is included too. By default, this option is
+        set to the empty list, i.e. no system call architecture filtering is applied.</para>
+
+        <para>Note that system call filtering is not equally effective on all architectures. For example, on x86
+        filtering of network socket-related calls is not possible, due to ABI limitations — a limitation that x86-64
+        does not have, however. On systems supporting multiple ABIs at the same time — such as x86/x86-64 — it is hence
+        recommended to limit the set of permitted system call architectures so that secondary ABIs may not be used to
+        circumvent the restrictions applied to the native ABI of the system. In particular, setting
+        <varname>SystemCallFilter=native</varname> is a good choice for disabling non-native ABIs.</para>
+
+        <para>System call architectures may also be restricted system-wide via the
+        <varname>SystemCallArchitectures=</varname> option in the global configuration. See
+        <citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry> for
+        details.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>RestrictAddressFamilies=</varname></term>
 
-        <listitem><para>Restricts the set of socket address families
-        accessible to the processes of this unit. Takes a
-        space-separated list of address family names to whitelist,
-        such as
-        <constant>AF_UNIX</constant>,
-        <constant>AF_INET</constant> or
-        <constant>AF_INET6</constant>. When
-        prefixed with <constant>~</constant> the listed address
-        families will be applied as blacklist, otherwise as whitelist.
-        Note that this restricts access to the
-        <citerefentry project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>2</manvolnum></citerefentry>
-        system call only. Sockets passed into the process by other
-        means (for example, by using socket activation with socket
-        units, see
-        <citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>)
-        are unaffected. Also, sockets created with
-        <function>socketpair()</function> (which creates connected
-        AF_UNIX sockets only) are unaffected. Note that this option
-        has no effect on 32-bit x86 and is ignored (but works
-        correctly on x86-64). If running in user mode, or in system
-        mode, but without the <constant>CAP_SYS_ADMIN</constant>
-        capability (e.g. setting <varname>User=nobody</varname>),
-        <varname>NoNewPrivileges=yes</varname> is implied. By
-        default, no restriction applies, all address families are
-        accessible to processes. If assigned the empty string, any
-        previous list changes are undone.</para>
-
-        <para>Use this option to limit exposure of processes to remote
-        systems, in particular via exotic network protocols. Note that
-        in most cases, the local <constant>AF_UNIX</constant> address
-        family should be included in the configured whitelist as it is
-        frequently used for local communication, including for
+        <listitem><para>Restricts the set of socket address families accessible to the processes of this unit. Takes a
+        space-separated list of address family names to whitelist, such as <constant>AF_UNIX</constant>,
+        <constant>AF_INET</constant> or <constant>AF_INET6</constant>. When prefixed with <constant>~</constant> the
+        listed address families will be applied as blacklist, otherwise as whitelist.  Note that this restricts access
+        to the <citerefentry
+        project='man-pages'><refentrytitle>socket</refentrytitle><manvolnum>2</manvolnum></citerefentry> system call
+        only. Sockets passed into the process by other means (for example, by using socket activation with socket
+        units, see <citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>)
+        are unaffected. Also, sockets created with <function>socketpair()</function> (which creates connected AF_UNIX
+        sockets only) are unaffected. Note that this option has no effect on 32-bit x86, s390, s390x, mips, mips-le,
+        ppc, ppc-le, pcc64, ppc64-le and is ignored (but works correctly on other ABIs, including x86-64). Note that on
+        systems supporting multiple ABIs (such as x86/x86-64) it is recommended to turn off alternative ABIs for
+        services, so that they cannot be used to circumvent the restrictions of this option. Specifically, it is
+        recommended to combine this option with <varname>SystemCallArchitectures=native</varname> or similar. If
+        running in user mode, or in system mode, but without the <constant>CAP_SYS_ADMIN</constant> capability
+        (e.g. setting <varname>User=nobody</varname>), <varname>NoNewPrivileges=yes</varname> is implied. By default,
+        no restrictions apply, all address families are accessible to processes. If assigned the empty string, any
+        previous address familiy restriction changes are undone. This setting does not affect commands prefixed with
+        <literal>+</literal>.</para>
+
+        <para>Use this option to limit exposure of processes to remote access, in particular via exotic and sensitive
+        network protocols, such as <constant>AF_PACKET</constant>. Note that in most cases, the local
+        <constant>AF_UNIX</constant> address family should be included in the configured whitelist as it is frequently
+        used for local communication, including for
         <citerefentry><refentrytitle>syslog</refentrytitle><manvolnum>2</manvolnum></citerefentry>
-        logging. This does not affect commands prefixed with <literal>+</literal>.</para></listitem>
+        logging.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>RestrictNamespaces=</varname></term>
+
+        <listitem><para>Restricts access to Linux namespace functionality for the processes of this unit. For details
+        about Linux namespaces, see
+        <citerefentry project='man-pages'><refentrytitle>namespaces</refentrytitle><manvolnum>7</manvolnum></citerefentry>. Either takes a
+        boolean argument, or a space-separated list of namespace type identifiers. If false (the default), no
+        restrictions on namespace creation and switching are made. If true, access to any kind of namespacing is
+        prohibited. Otherwise, a space-separated list of namespace type identifiers must be specified, consisting of
+        any combination of: <constant>cgroup</constant>, <constant>ipc</constant>, <constant>net</constant>,
+        <constant>mnt</constant>, <constant>pid</constant>, <constant>user</constant> and <constant>uts</constant>. Any
+        namespace type listed is made accessible to the unit's processes, access to namespace types not listed is
+        prohibited (whitelisting). By prepending the list with a single tilda character (<literal>~</literal>) the
+        effect may be inverted: only the listed namespace types will be made inaccessible, all unlisted ones are
+        permitted (blacklisting). If the empty string is assigned, the default namespace restrictions are applied,
+        which is equivalent to false. Internally, this setting limits access to the
+        <citerefentry><refentrytitle>unshare</refentrytitle><manvolnum>2</manvolnum></citerefentry>,
+        <citerefentry><refentrytitle>clone</refentrytitle><manvolnum>2</manvolnum></citerefentry> and
+        <citerefentry><refentrytitle>setns</refentrytitle><manvolnum>2</manvolnum></citerefentry> system calls, taking
+        the specified flags parameters into account. Note that — if this option is used — in addition to restricting
+        creation and switching of the specified types of namespaces (or all of them, if true) access to the
+        <function>setns()</function> system call with a zero flags parameter is prohibited.  This setting is only
+        supported on x86, x86-64, mips, mips-le, mips64, mips64-le, mips64-n32, mips64-le-n32, ppc64, ppc64-le,
+        s390 and s390x, and enforces no restrictions on other architectures. If running in user
+        mode, or in system mode, but without the <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting
+        <varname>User=</varname>), <varname>NoNewPrivileges=yes</varname> is implied.  </para></listitem>
       </varlistentry>
 
       <varlistentry>
 
       <varlistentry>
         <term><varname>RuntimeDirectory=</varname></term>
-        <term><varname>RuntimeDirectoryMode=</varname></term>
 
         <listitem><para>Takes a list of directory names. If set, one
         or more directories by the specified names will be created
       </varlistentry>
 
       <varlistentry>
+        <term><varname>RuntimeDirectoryMode=</varname></term>
+
+        <listitem><para>Specifies the access mode of the directories specified in
+        <varname>RuntimeDirectory=</varname> as an octal number. Defaults to
+        <constant>0755</constant>. See "Permissions" in
+        <citerefentry project='man-pages'><refentrytitle>path_resolution</refentrytitle><manvolnum>7</manvolnum></citerefentry> for a discussion of the meaning of permission bits.
+        </para></listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><varname>MemoryDenyWriteExecute=</varname></term>
 
         <listitem><para>Takes a boolean argument. If set, attempts to create memory mappings that are writable and
-        executable at the same time, or to change existing memory mappings to become executable are prohibited.
-        Specifically, a system call filter is added that rejects
-        <citerefentry><refentrytitle>mmap</refentrytitle><manvolnum>2</manvolnum></citerefentry>
-        system calls with both <constant>PROT_EXEC</constant> and <constant>PROT_WRITE</constant> set
-        and <citerefentry><refentrytitle>mprotect</refentrytitle><manvolnum>2</manvolnum></citerefentry>
-        system calls with <constant>PROT_EXEC</constant> set. Note that this option is incompatible with programs
-        that generate program code dynamically at runtime, such as JIT execution engines, or programs compiled making
-        use of the code "trampoline" feature of various C compilers. This option improves service security, as it makes
-        harder for software exploits to change running code dynamically.
-        </para></listitem>
+        executable at the same time, or to change existing memory mappings to become executable, or mapping shared
+        memory segments as executable are prohibited.  Specifically, a system call filter is added that rejects
+        <citerefentry><refentrytitle>mmap</refentrytitle><manvolnum>2</manvolnum></citerefentry> system calls with both
+        <constant>PROT_EXEC</constant> and <constant>PROT_WRITE</constant> set,
+        <citerefentry><refentrytitle>mprotect</refentrytitle><manvolnum>2</manvolnum></citerefentry> system calls with
+        <constant>PROT_EXEC</constant> set and
+        <citerefentry><refentrytitle>shmat</refentrytitle><manvolnum>2</manvolnum></citerefentry> system calls with
+        <constant>SHM_EXEC</constant> set. Note that this option is incompatible with programs and libraries that
+        generate program code dynamically at runtime, including JIT execution engines, executable stacks, and code
+        "trampoline" feature of various C compilers. This option improves service security, as it makes harder for
+        software exploits to change running code dynamically. Note that this feature is fully available on x86-64, and
+        partially on x86. Specifically, the <function>shmat()</function> protection is not available on x86. Note that
+        on systems supporting multiple ABIs (such as x86/x86-64) it is recommended to turn off alternative ABIs for
+        services, so that they cannot be used to circumvent the restrictions of this option. Specifically, it is
+        recommended to combine this option with <varname>SystemCallArchitectures=native</varname> or similar. If
+        running in user mode, or in system mode, but without the <constant>CAP_SYS_ADMIN</constant> capability
+        (e.g. setting <varname>User=</varname>), <varname>NoNewPrivileges=yes</varname> is implied.  </para></listitem>
       </varlistentry>
 
       <varlistentry>
         <listitem><para>Takes a boolean argument. If set, any attempts to enable realtime scheduling in a process of
         the unit are refused. This restricts access to realtime task scheduling policies such as
         <constant>SCHED_FIFO</constant>, <constant>SCHED_RR</constant> or <constant>SCHED_DEADLINE</constant>. See
-        <citerefentry><refentrytitle>sched</refentrytitle><manvolnum>7</manvolnum></citerefentry> for details about
-        these scheduling policies. Realtime scheduling policies may be used to monopolize CPU time for longer periods
+        <citerefentry project='man-pages'><refentrytitle>sched</refentrytitle><manvolnum>7</manvolnum></citerefentry> for details about
+        these scheduling policies. If running in user mode, or in system mode, but
+        without the <constant>CAP_SYS_ADMIN</constant> capability
+        (e.g. setting <varname>User=</varname>), <varname>NoNewPrivileges=yes</varname>
+        is implied. Realtime scheduling policies may be used to monopolize CPU time for longer periods
         of time, and may hence be used to lock up or otherwise trigger Denial-of-Service situations on the system. It
         is hence recommended to restrict access to realtime scheduling to the few programs that actually require
         them. Defaults to off.</para></listitem>
       </varlistentry>
 
       <varlistentry>
+        <term><varname>$INVOCATION_ID</varname></term>
+
+        <listitem><para>Contains a randomized, unique 128bit ID identifying each runtime cycle of the unit, formatted
+        as 32 character hexadecimal string. A new ID is assigned each time the unit changes from an inactive state into
+        an activating or active state, and may be used to identify this specific runtime cycle, in particular in data
+        stored offline, such as the journal. The same ID is passed to all processes run as part of the
+        unit.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><varname>$XDG_RUNTIME_DIR</varname></term>
 
         <listitem><para>The directory for volatile state. Set for the
       <varlistentry>
         <term><varname>$MAINPID</varname></term>
 
-        <listitem><para>The PID of the units main process if it is
+        <listitem><para>The PID of the unit's main process if it is
         known. This is only set for control processes as invoked by
         <varname>ExecReload=</varname> and similar. </para></listitem>
       </varlistentry>
         functions) if their standard output or standard error output is connected to the journal anyway, thus enabling
         delivery of structured metadata along with logged messages.</para></listitem>
       </varlistentry>
+
+      <varlistentry>
+        <term><varname>$SERVICE_RESULT</varname></term>
+
+        <listitem><para>Only defined for the service unit type, this environment variable is passed to all
+        <varname>ExecStop=</varname> and <varname>ExecStopPost=</varname> processes, and encodes the service
+        "result". Currently, the following values are defined: <literal>protocol</literal> (in case of a protocol
+        violation; if a service did not take the steps required by its unit configuration), <literal>timeout</literal>
+        (in case of an operation timeout), <literal>exit-code</literal> (if a service process exited with a non-zero
+        exit code; see <varname>$EXIT_CODE</varname> below for the actual exit code returned), <literal>signal</literal>
+        (if a service process was terminated abnormally by a signal; see <varname>$EXIT_CODE</varname> below for the
+        actual signal used for the termination), <literal>core-dump</literal> (if a service process terminated
+        abnormally and dumped core), <literal>watchdog</literal> (if the watchdog keep-alive ping was enabled for the
+        service but it missed the deadline), or <literal>resources</literal> (a catch-all condition in case a system
+        operation failed).</para>
+
+        <para>This environment variable is useful to monitor failure or successful termination of a service. Even
+        though this variable is available in both <varname>ExecStop=</varname> and <varname>ExecStopPost=</varname>, it
+        is usually a better choice to place monitoring tools in the latter, as the former is only invoked for services
+        that managed to start up correctly, and the latter covers both services that failed during their start-up and
+        those which failed during their runtime.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>$EXIT_CODE</varname></term>
+        <term><varname>$EXIT_STATUS</varname></term>
+
+        <listitem><para>Only defined for the service unit type, these environment variables are passed to all
+        <varname>ExecStop=</varname>, <varname>ExecStopPost=</varname> processes and contain exit status/code
+        information of the main process of the service. For the precise definition of the exit code and status, see
+        <citerefentry><refentrytitle>wait</refentrytitle><manvolnum>2</manvolnum></citerefentry>. <varname>$EXIT_CODE</varname>
+        is one of <literal>exited</literal>, <literal>killed</literal>,
+        <literal>dumped</literal>. <varname>$EXIT_STATUS</varname> contains the numeric exit code formatted as string
+        if <varname>$EXIT_CODE</varname> is <literal>exited</literal>, and the signal name in all other cases. Note
+        that these environment variables are only set if the service manager succeeded to start and identify the main
+        process of the service.</para>
+
+        <table>
+          <title>Summary of possible service result variable values</title>
+          <tgroup cols='3'>
+            <colspec colname='result' />
+            <colspec colname='code' />
+            <colspec colname='status' />
+            <thead>
+              <row>
+                <entry><varname>$SERVICE_RESULT</varname></entry>
+                <entry><varname>$EXIT_CODE</varname></entry>
+                <entry><varname>$EXIT_STATUS</varname></entry>
+              </row>
+            </thead>
+
+            <tbody>
+              <row>
+                <entry morerows="1" valign="top"><literal>protocol</literal></entry>
+                <entry valign="top">not set</entry>
+                <entry>not set</entry>
+              </row>
+              <row>
+                <entry><literal>exited</literal></entry>
+                <entry><literal>0</literal></entry>
+              </row>
+
+              <row>
+                <entry morerows="1" valign="top"><literal>timeout</literal></entry>
+                <entry valign="top"><literal>killed</literal></entry>
+                <entry><literal>TERM</literal>, <literal>KILL</literal></entry>
+              </row>
+              <row>
+                <entry valign="top"><literal>exited</literal></entry>
+                <entry><literal>0</literal>, <literal>1</literal>, <literal>2</literal>, <literal
+                >3</literal>, …, <literal>255</literal></entry>
+              </row>
+
+              <row>
+                <entry valign="top"><literal>exit-code</literal></entry>
+                <entry valign="top"><literal>exited</literal></entry>
+                <entry><literal>0</literal>, <literal>1</literal>, <literal>2</literal>, <literal
+                >3</literal>, …, <literal>255</literal></entry>
+              </row>
+
+              <row>
+                <entry valign="top"><literal>signal</literal></entry>
+                <entry valign="top"><literal>killed</literal></entry>
+                <entry><literal>HUP</literal>, <literal>INT</literal>, <literal>KILL</literal>, …</entry>
+              </row>
+
+              <row>
+                <entry valign="top"><literal>core-dump</literal></entry>
+                <entry valign="top"><literal>dumped</literal></entry>
+                <entry><literal>ABRT</literal>, <literal>SEGV</literal>, <literal>QUIT</literal>, …</entry>
+              </row>
+
+              <row>
+                <entry morerows="2" valign="top"><literal>watchdog</literal></entry>
+                <entry><literal>dumped</literal></entry>
+                <entry><literal>ABRT</literal></entry>
+              </row>
+              <row>
+                <entry><literal>killed</literal></entry>
+                <entry><literal>TERM</literal>, <literal>KILL</literal></entry>
+              </row>
+              <row>
+                <entry><literal>exited</literal></entry>
+                <entry><literal>0</literal>, <literal>1</literal>, <literal>2</literal>, <literal
+                >3</literal>, …, <literal>255</literal></entry>
+              </row>
+
+              <row>
+                <entry><literal>resources</literal></entry>
+                <entry>any of the above</entry>
+                <entry>any of the above</entry>
+              </row>
+
+              <row>
+                <entry namest="results" nameend="code">Note: the process may be also terminated by a signal not sent by systemd. In particular the process may send an arbitrary signal to itself in a handler for any of the non-maskable signals. Nevertheless, in the <literal>timeout</literal> and <literal>watchdog</literal> rows above only the signals that systemd sends have been included.</entry>
+              </row>
+            </tbody>
+          </tgroup>
+        </table>
+
+        </listitem>
+      </varlistentry>
     </variablelist>
 
     <para>Additional variables may be configured by the following
       <para>
         <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
         <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+        <citerefentry><refentrytitle>systemd-analyze</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
         <citerefentry><refentrytitle>journalctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
         <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
         <citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       </para>
   </refsect1>
 
+
 </refentry>
index b268104..fb0f0c4 100644 (file)
@@ -342,7 +342,8 @@ find $dir</programlisting>
       <citerefentry><refentrytitle>systemd-system-update-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd-sysv-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+      <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd.environment-generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>
     </para>
   </refsect1>
 </refentry>
index 494f97a..b82c130 100644 (file)
@@ -87,7 +87,7 @@
           recommended to be a UUID-compatible ID, but this is not
           enforced, and formatted differently. Developers can generate
           a new ID for this purpose with <command>journalctl
-          <option>--new-id</option></command>.
+          <option>--new-id128</option></command>.
           </para>
         </listitem>
       </varlistentry>
         <listitem>
           <para>The process, user, and group ID of the process the
           journal entry originates from formatted as a decimal
-          string.</para>
+          string. Note that entries obtained via <literal>stdout</literal> or
+          <literal>stderr</literal> of forked processes will contain credentials valid for a parent
+          process (that initiated the connection to <command>systemd-journald</command>).</para>
         </listitem>
       </varlistentry>
 
       </varlistentry>
 
       <varlistentry>
+        <term><varname>_SYSTEMD_INVOCATION_ID=</varname></term>
+        <listitem>
+          <para>The invocation ID for the runtime cycle of the unit
+          the message was generated in, as available to processes
+          of the unit in <varname>$INVOCATION_ID</varname> (see
+          <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>).</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><varname>_HOSTNAME=</varname></term>
         <listitem>
           <para>The name of the originating host.</para>
 
     <para>During serialization into external formats, such as the
     <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/export">Journal
+    url="https://www.freedesktop.org/wiki/Software/systemd/export">Journal
     Export Format</ulink> or the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/json">Journal
+    url="https://www.freedesktop.org/wiki/Software/systemd/json">Journal
     JSON Format</ulink>, the addresses of journal entries are
     serialized into fields prefixed with double underscores. Note that
     these are not proper fields when stored in the journal but for
index d5b4d10..1e4a152 100644 (file)
         <listitem>
           <para>A whitespace-separated list of shell-style globs matching
           the device name, as exposed by the udev property
-          "INTERFACE". This can not be used to match on names that have
+          "INTERFACE". This cannot be used to match on names that have
           already been changed from userspace. Caution is advised when matching on
           kernel-assigned names, as they are known to be unstable
           between reboots.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
+        <term><varname>AutoNegotiation=</varname></term>
+        <listitem>
+          <para>Enables or disables automatic negotiation of transmission parameters.
+          Autonegotiation is a procedure by which two connected ethernet devices choose
+          common transmission parameters, such as speed, duplex mode, and flow control.
+          Takes a boolean value. Unset by default, which means that the kernel default
+          will be used.</para>
+
+          <para>Note that if autonegotiation is enabled, speed and duplex settings are
+          read-only. If autonegotation is disabled, speed and duplex settings are writable
+          if the driver supports multiple link modes.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
         <term><varname>WakeOnLan=</varname></term>
         <listitem>
           <para>The Wake-on-LAN policy to set for the device. The
           </variablelist>
         </listitem>
       </varlistentry>
+      <varlistentry>
+        <term><varname>Port=</varname></term>
+        <listitem>
+          <para>The port option is used to select the device port. The
+          supported values are:</para>
+
+          <variablelist>
+            <varlistentry>
+              <term><literal>tp</literal></term>
+              <listitem>
+                <para>An Ethernet interface using Twisted-Pair cable as the medium.</para>
+              </listitem>
+            </varlistentry>
+            <varlistentry>
+              <term><literal>aui</literal></term>
+              <listitem>
+                <para>Attachment Unit Interface (AUI). Normally used with hubs.
+                </para>
+              </listitem>
+            </varlistentry>
+            <varlistentry>
+              <term><literal>bnc</literal></term>
+              <listitem>
+                <para>An Ethernet interface using BNC connectors and co-axial cable.</para>
+              </listitem>
+            </varlistentry>
+            <varlistentry>
+              <term><literal>mii</literal></term>
+              <listitem>
+                <para>An Ethernet interface using a Media Independent Interface (MII).</para>
+              </listitem>
+            </varlistentry>
+            <varlistentry>
+              <term><literal>fibre</literal></term>
+              <listitem>
+                <para>An Ethernet interface using Optical Fibre as the medium.</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><varname>TCPSegmentationOffload=</varname></term>
+        <listitem>
+          <para>The TCP Segmentation Offload (TSO) when true enables
+          TCP segmentation offload. Takes a boolean value.
+          Defaults to "unset".</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><varname>GenericSegmentationOffload=</varname></term>
+        <listitem>
+          <para>The Generic Segmentation Offload (GSO) when true enables
+          generic segmentation offload. Takes a boolean value.
+          Defaults to "unset".</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><varname>UDPSegmentationOffload=</varname></term>
+        <listitem>
+          <para>The UDP Segmentation Offload (USO) when true enables
+          UDP segmentation offload. Takes a boolean value.
+          Defaults to "unset".</para>
+        </listitem>
+      </varlistentry>
+    <varlistentry>
+        <term><varname>GenericReceiveOffload=</varname></term>
+        <listitem>
+          <para>The Generic Receive Offload (GRO) when true enables
+          generic receive offload. Takes a boolean value.
+          Defaults to "unset".</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><varname>LargeReceiveOffload=</varname></term>
+        <listitem>
+          <para>The Large Receive Offload (LRO) when true enables
+          large receive offload. Takes a boolean value.
+          Defaults to "unset".</para>
+        </listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
 
index 66cddd7..1bed7d1 100644 (file)
     for kernel-to-userspace and userspace-to-userspace interfaces. Some
     of them may not be changed via mount units, and cannot be
     disabled. For a longer discussion see <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems">API
+    url="https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems">API
     File Systems</ulink>.</para>
   </refsect1>
 
     for details about the conversion.</para>
 
     <para>The NFS mount option <option>bg</option> for NFS background mounts
-    as documented in <citerefentry><refentrytitle>nfs</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-    is not supported in <filename>/etc/fstab</filename> entries. The systemd mount option <option>nofail</option>
-    provides similar functionality and should be used instead.</para>
+    as documented in <citerefentry project='man-pages'><refentrytitle>nfs</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+    is detected by <command>systemd-fstab-generator</command> and the options
+    are transformed so that systemd fulfills the job-control implications of
+    that option.  Specifically <command>systemd-fstab-generator</command> acts
+    as though <literal>x-systemd.mount-timout=infinity,retry=10000</literal> was
+    prepended to the option list, and <literal>fg,nofail</literal> was appended.
+    Depending on specific requirements, it may be appropriate to provide some of
+    these options explicitly, or to make use of the
+    <literal>x-systemd.automount</literal> option described below instead
+    of using <literal>bg</literal>.</para>
 
     <para>When reading <filename>/etc/fstab</filename> a few special
     mount options are understood by systemd which influence how
       </varlistentry>
 
       <varlistentry>
+        <term><option>x-systemd.before=</option></term>
+        <term><option>x-systemd.after=</option></term>
+
+        <listitem><para>Configures a <varname>Before=</varname>
+        dependency or <varname>After=</varname> between the created
+        mount unit and another systemd unit, such as a mount unit.
+        The argument should be a unit name or an absolute path
+        to a mount point. This option may be specified more than once.
+        This option is particularly useful for mount point declarations
+        with <option>nofail</option> option that are mounted
+        asynchronously but need to be mounted before or after some unit
+        start, for example, before <filename>local-fs.target</filename>
+        unit.
+        See <varname>Before=</varname> and <varname>After=</varname> in
+        <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+        for details.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><option>x-systemd.requires-mounts-for=</option></term>
 
         <listitem><para>Configures a
        </varlistentry>
 
       <varlistentry>
+        <term><option>x-systemd.device-bound</option></term>
+
+        <listitem><para>The block device backed file system will be upgraded
+        to <varname>BindsTo=</varname> dependency. This option is only useful
+        when mounting file systems manually with
+        <citerefentry project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+        as the default dependency in this case is <varname>Requires=</varname>.
+        This option is already implied by entries in <filename>/etc/fstab</filename>
+        or by mount units.
+        </para></listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><option>x-systemd.automount</option></term>
 
         <listitem><para>An automount unit will be created for the file
       </varlistentry>
 
       <varlistentry>
+        <term><option>x-systemd.mount-timeout=</option></term>
+
+        <listitem><para>Configure how long systemd should wait for the
+        mount command to finish before giving up on an entry from
+        <filename>/etc/fstab</filename>. Specify a time in seconds or
+        explicitly append a unit such as <literal>s</literal>,
+        <literal>min</literal>, <literal>h</literal>,
+        <literal>ms</literal>.</para>
+
+        <para>Note that this option can only be used in
+        <filename>/etc/fstab</filename>, and will be
+        ignored when part of the <varname>Options=</varname>
+        setting in a unit file.</para>
+
+        <para>See <varname>TimeoutSec=</varname> below for
+        details.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
         <term><option>noauto</option></term>
         <term><option>auto</option></term>
 
 
       <varlistentry>
         <term><varname>What=</varname></term>
-        <listitem><para>Takes an absolute path of a device node, file
-        or other resource to mount. See
-        <citerefentry project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry>
-        for details. If this refers to a device node, a dependency on
-        the respective device unit is automatically created. (See
-        <citerefentry><refentrytitle>systemd.device</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-        for more information.) This option is
-        mandatory.</para></listitem>
+        <listitem><para>Takes an absolute path of a device node, file or other resource to mount. See <citerefentry
+        project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry> for details. If
+        this refers to a device node, a dependency on the respective device unit is automatically created. (See
+        <citerefentry><refentrytitle>systemd.device</refentrytitle><manvolnum>5</manvolnum></citerefentry> for more
+        information.) This option is mandatory. Note that the usual specifier expansion is applied to this setting,
+        literal percent characters should hence be written as <literal>%%</literal>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>Where=</varname></term>
-        <listitem><para>Takes an absolute path of a directory of the
-        mount point. If the mount point does not exist at the time of
+        <listitem><para>Takes an absolute path of a directory for the
+        mount point; in particular, the destination cannot be a symbolic
+        link.  If the mount point does not exist at the time of
         mounting, it is created. This string must be reflected in the
         unit filename. (See above.) This option is
         mandatory.</para></listitem>
       <varlistentry>
         <term><varname>Options=</varname></term>
 
-        <listitem><para>Mount options to use when mounting. This takes
-        a comma-separated list of options. This setting is
-        optional.</para></listitem>
+        <listitem><para>Mount options to use when mounting. This takes a comma-separated list of options. This setting
+        is optional. Note that the usual specifier expansion is applied to this setting, literal percent characters
+        should hence be written as <literal>%%</literal>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
       </varlistentry>
 
       <varlistentry>
+        <term><varname>LazyUnmount=</varname></term>
+
+        <listitem><para>Takes a boolean argument. If true, detach the
+        filesystem from the filesystem hierarchy at time of the unmount
+        operation, and clean up all references to the filesystem as
+        soon as they are not busy anymore.
+        This corresponds with
+        <citerefentry project='man-pages'><refentrytitle>umount</refentrytitle><manvolnum>8</manvolnum></citerefentry>'s
+        <parameter>-l</parameter> switch. Defaults to
+        off.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>ForceUnmount=</varname></term>
+
+        <listitem><para>Takes a boolean argument. If true, force an
+        unmount (in case of an unreachable NFS system).
+        This corresponds with
+        <citerefentry project='man-pages'><refentrytitle>umount</refentrytitle><manvolnum>8</manvolnum></citerefentry>'s
+        <parameter>-f</parameter> switch. Defaults to
+        off.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><varname>DirectoryMode=</varname></term>
         <listitem><para>Directories of mount points (and any parent
         directories) are automatically created if needed. This option
         Takes a unit-less value in seconds, or a time span value such
         as "5min 20s". Pass 0 to disable the timeout logic. The
         default value is set from the manager configuration file's
-        <varname>DefaultTimeoutStart=</varname>
+        <varname>DefaultTimeoutStartSec=</varname>
         variable.</para></listitem>
       </varlistentry>
     </variablelist>
index a5c6f0f..e925b30 100644 (file)
     <citerefentry><refentrytitle>systemd-networkd</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
     </para>
 
-    <para>Virtual Network Device files must have the extension
-    <filename>.netdev</filename>; other extensions are ignored.
-    Virtual network devices are created as soon as networkd is
-    started. If a netdev with the specified name already exists,
-    networkd will use that as-is rather than create its own. Note that
-    the settings of the pre-existing netdev will not be changed by
+    <para>The main Virtual Network Device file must have the extension <filename>.netdev</filename>;
+    other extensions are ignored. Virtual network devices are created as soon as networkd is
+    started. If a netdev with the specified name already exists, networkd will use that as-is rather
+    than create its own. Note that the settings of the pre-existing netdev will not be changed by
     networkd.</para>
 
-    <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
-    runtime network directory
-    <filename>/run/systemd/network</filename> and the local
-    administration network directory
-    <filename>/etc/systemd/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
-    override a system-supplied configuration file with a local file if
-    needed. As a special case, an empty file (file size 0) or symlink
-    with the same name pointing to <filename>/dev/null</filename>
-    disables the configuration file entirely (it is "masked").</para>
+    <para>The <filename>.netdev</filename> files are read from the files located in the system
+    network directory <filename>/usr/lib/systemd/network</filename>, the volatile runtime network
+    directory <filename>/run/systemd/network</filename> and the local administration network
+    directory <filename>/etc/systemd/network</filename>. 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 override a system-supplied
+    configuration file with a local file if needed. As a special case, an empty file (file size 0)
+    or symlink with the same name pointing to <filename>/dev/null</filename> disables the
+    configuration file entirely (it is "masked").</para>
+
+    <para>Along with the netdev file <filename>foo.netdev</filename>, a "drop-in" directory
+    <filename>foo.netdev.d/</filename> may exist. All files with the suffix <literal>.conf</literal>
+    from this directory will be parsed after the file itself is parsed. This is useful to alter or
+    add configuration settings, without having to modify the main configuration file. Each drop-in
+    file must have appropriate section headers.</para>
+
+    <para>In addition to <filename>/etc/systemd/network</filename>, drop-in <literal>.d</literal>
+    directories can be placed in <filename>/usr/lib/systemd/network</filename> or
+    <filename>/run/systemd/network</filename> directories. Drop-in files in
+    <filename>/etc</filename> take precedence over those in <filename>/run</filename> which in turn
+    take precedence over those in <filename>/usr/lib</filename>. Drop-in files under any of these
+    directories take precedence over the main netdev file wherever located. (Of course, since
+    <filename>/run</filename> is temporary and <filename>/usr/lib</filename> is for vendors, it is
+    unlikely drop-ins should be used in either of those places.)</para>
   </refsect1>
 
   <refsect1>
           <row><entry><varname>vxlan</varname></entry>
           <entry>A virtual extensible LAN (vxlan), for connecting Cloud computing deployments.</entry></row>
 
+          <row><entry><varname>geneve</varname></entry>
+          <entry>A GEneric NEtwork Virtualization Encapsulation (GENEVE) netdev driver.</entry></row>
+
           <row><entry><varname>vrf</varname></entry>
-            <entry>A Virtual Routing and Forwarding (<ulink url="https://www.kernel.org/doc/Documentation/networking/vrf.txt">VRF</ulink>) interface to create separate routing and forwarding domains.</entry></row>
+          <entry>A Virtual Routing and Forwarding (<ulink url="https://www.kernel.org/doc/Documentation/networking/vrf.txt">VRF</ulink>) interface to create separate routing and forwarding domains.</entry></row>
+
+          <row><entry><varname>vcan</varname></entry>
+          <entry>The virtual CAN driver (vcan). Similar to the network loopback devices, vcan offers a virtual local CAN interface.</entry></row>
 
         </tbody>
       </tgroup>
           </listitem>
         </varlistentry>
         <varlistentry>
+          <term><varname>AgeingTimeSec=</varname></term>
+          <listitem>
+            <para>This specifies the number of seconds a MAC Address will be kept in
+            the forwarding database after having a packet received from this MAC Address.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><varname>Priority=</varname></term>
+          <listitem>
+            <para>The priority of the bridge. An integer between 0 and 65535. A lower value
+            means higher priority. The bridge having the lowest priority will be elected as root bridge.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><varname>DefaultPVID=</varname></term>
+          <listitem>
+            <para>This specifies the default port VLAN ID of a newly attached bridge port.
+            Set this to an integer in the range 1–4094 or <literal>none</literal> to disable the PVID.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
           <term><varname>MulticastQuerier=</varname></term>
           <listitem>
             <para>A boolean. This setting controls the IFLA_BR_MCAST_QUERIER option in the kernel.
             </para>
           </listitem>
         </varlistentry>
+          <varlistentry>
+          <term><varname>STP=</varname></term>
+          <listitem>
+            <para>A boolean. This enables the bridge's Spanning Tree Protocol (STP). When unset,
+            the kernel's default setting applies.
+            </para>
+          </listitem>
+        </varlistentry>
       </variablelist>
-
   </refsect1>
 
   <refsect1>
             This option is compulsory.</para>
           </listitem>
         </varlistentry>
+        <varlistentry>
+          <term><varname>GVRP=</varname></term>
+          <listitem>
+            <para>The Generic VLAN Registration Protocol (GVRP) is a protocol that
+            allows automatic learning of VLANs on a network. A boolean. When unset,
+            the kernel's default setting applies.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><varname>MVRP=</varname></term>
+          <listitem>
+            <para>Multiple VLAN Registration Protocol (MVRP) formerly known as GARP VLAN
+            Registration Protocol (GVRP) is a standards-based Layer 2 network protocol,
+            for automatic configuration of VLAN information on switches. It was defined
+            in the 802.1ak amendment to 802.1Q-2005. A boolean. When unset, the kernel's
+            default setting applies.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><varname>LooseBinding=</varname></term>
+          <listitem>
+            <para>The VLAN loose binding mode, in which only the operational state is passed
+            from the parent to the associated VLANs, but the VLAN device state is not changed.
+            A boolean. When unset, the kernel's default setting applies.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><varname>ReorderHeader=</varname></term>
+          <listitem>
+            <para>The VLAN reorder header is set VLAN interfaces behave like physical interfaces.
+            A boolean. When unset, the kernel's default setting applies.</para>
+          </listitem>
+        </varlistentry>
       </variablelist>
-
   </refsect1>
 
   <refsect1>
         </listitem>
       </varlistentry>
       <varlistentry>
-        <term><varname>Group=</varname></term>
+        <term><varname>Remote=</varname></term>
         <listitem>
-          <para>An assigned multicast group IP address.</para>
+          <para>Configures destination multicast group IP address.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
+        <term><varname>Local=</varname></term>
+        <listitem>
+          <para>Configures local IP address.</para>
+        </listitem>
+      </varlistentry>
+        <varlistentry>
         <term><varname>TOS=</varname></term>
         <listitem>
           <para>The Type Of Service byte value for a vxlan interface.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
-        <term><varname>ARPProxy=</varname></term>
+        <term><varname>ReduceARPProxy=</varname></term>
         <listitem>
-          <para>A boolean. When true, enables ARP proxying.</para>
+          <para>A boolean. When true, bridge-connected VXLAN tunnel
+          endpoint answers ARP requests from the local bridge on behalf
+          of remote Distributed Overlay Virtual Ethernet
+          <ulink url="https://en.wikipedia.org/wiki/Distributed_Overlay_Virtual_Ethernet">
+          (DVOE)</ulink> clients. Defaults to false.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         </listitem>
       </varlistentry>
       <varlistentry>
-        <term><varname>UDPCheckSum=</varname></term>
+        <term><varname>UDPChecksum=</varname></term>
         <listitem>
           <para>A boolean. When true, transmitting UDP checksums when doing VXLAN/IPv4 is turned on.</para>
         </listitem>
         </listitem>
       </varlistentry>
       <varlistentry>
-        <term><varname>UDP6ZeroCheckSumRx=</varname></term>
+        <term><varname>UDP6ZeroChecksumRx=</varname></term>
         <listitem>
           <para>A boolean. When true, receiving zero checksums in VXLAN/IPv6 is turned on.</para>
         </listitem>
       </varlistentry>
+      <varlistentry>
+        <term><varname>RemoteChecksumTx=</varname></term>
+        <listitem>
+          <para>A boolean. When true, remote transmit checksum offload of VXLAN is turned on.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><varname>RemoteChecksumRx=</varname></term>
+        <listitem>
+          <para>A boolean. When true, remote receive checksum offload in VXLAN is turned on.</para>
+        </listitem>
+      </varlistentry>
     <varlistentry>
       <term><varname>GroupPolicyExtension=</varname></term>
       <listitem>
       <listitem>
         <para>Configures the default destination UDP port on a per-device basis.
         If destination port is not specified then Linux kernel default will be used.
-        Set destination port 4789 to get the IANA assigned value,
-        and destination port 0 to get default values.</para>
+        Set destination port 4789 to get the IANA assigned value. If not set or if the
+        destination port is assigned the empty string the default port of 4789 is used.</para>
       </listitem>
     </varlistentry>
     <varlistentry>
           ports, and allows overriding via configuration.</para>
         </listitem>
       </varlistentry>
+    <varlistentry>
+      <term><varname>FlowLabel=</varname></term>
+        <listitem>
+          <para>Specifies the flow label to use in outgoing packets.
+          The valid range is 0-1048575.
+          </para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+  </refsect1>
+  <refsect1>
+    <title>[GENEVE] Section Options</title>
+    <para>The <literal>[GENEVE]</literal> section only applies for
+    netdevs of kind <literal>geneve</literal>, and accepts the
+    following keys:</para>
+
+    <variablelist class='network-directives'>
+      <varlistentry>
+        <term><varname>Id=</varname></term>
+        <listitem>
+          <para>Specifies the Virtual Network Identifer (VNI) to use. Ranges [0-16777215].</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><varname>Remote=</varname></term>
+        <listitem>
+          <para>Specifies the unicast destination IP address to use in outgoing packets.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><varname>TOS=</varname></term>
+        <listitem>
+          <para>Specifies the TOS value to use in outgoing packets. Ranges [1-255].</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><varname>TTL=</varname></term>
+        <listitem>
+          <para>Specifies the TTL value to use in outgoing packets. Ranges [1-255].</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><varname>UDPChecksum=</varname></term>
+        <listitem>
+          <para>A boolean. When true, specifies if UDP checksum is calculated for transmitted packets over IPv4.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><varname>UDP6ZeroChecksumTx=</varname></term>
+        <listitem>
+          <para>A boolean. When true, skip UDP checksum calculation for transmitted packets over IPv6.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><varname>UDP6ZeroChecksumRx=</varname></term>
+        <listitem>
+          <para>A boolean. When true, allows incoming UDP packets over IPv6 with zero checksum field.</para>
+        </listitem>
+      </varlistentry>
+    <varlistentry>
+      <term><varname>DestinationPort=</varname></term>
+      <listitem>
+        <para>Specifies destination port. Defaults to 6081. If not set or assigned the empty string, the default
+        port of 6081 is used.</para>
+      </listitem>
+    </varlistentry>
+    <varlistentry>
+      <term><varname>FlowLabel=</varname></term>
+        <listitem>
+          <para>Specifies the flow label to use in outgoing packets.</para>
+        </listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
   <refsect1>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>ActiveSlave=</varname></term>
+        <listitem>
+          <para>A boolean. Specifies the new active slave. The <literal>ActiveSlave=</literal>
+          option is only valid for following modes:
+          <literal>active-backup</literal>,
+          <literal>balance-alb</literal> and
+          <literal>balance-tlb</literal>. Defaults to false.
+          </para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>PrimarySlave=</varname></term>
+        <listitem>
+          <para>A boolean. Specifies which slave is the primary device. The specified
+          device will always be the active slave while it is available. Only when the
+          primary is off-line will alternate devices be used.  This is useful when
+          one slave is preferred over another, e.g. when one slave has higher throughput
+          than another. The <literal>PrimarySlave=</literal> option is only valid for
+          following modes:
+          <literal>active-backup</literal>,
+          <literal>balance-alb</literal> and
+          <literal>balance-tlb</literal>. Defaults to false.
+          </para>
+        </listitem>
+      </varlistentry>
     </variablelist>
 
     <para>For more detail information see
@@ -1150,6 +1344,15 @@ Kind=vrf
 [VRF]
 TableId=42</programlisting>
     </example>
+
+    <example>
+      <title>/etc/systemd/network/25-macvtap.netdev</title>
+      <para>Create a MacVTap device.</para>
+      <programlisting>[NetDev]
+Name=macvtap-test
+Kind=macvtap
+      </programlisting>
+    </example>
   </refsect1>
   <refsect1>
     <title>See Also</title>
index 4541a55..6b83a5b 100644 (file)
     <citerefentry><refentrytitle>systemd-networkd</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
     </para>
 
-    <para>Network files must have the extension
-    <filename>.network</filename>; other extensions are ignored.
-    Networks are applied to links whenever the links appear.</para>
-
-    <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
-    runtime network directory
-    <filename>/run/systemd/network</filename> and the local
-    administration network directory
-    <filename>/etc/systemd/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
-    override a system-supplied configuration file with a local file if
-    needed. As a special case, an empty file (file size 0) or symlink
-    with the same name pointing to <filename>/dev/null</filename>
-    disables the configuration file entirely (it is "masked").</para>
-
-    <para>Note that an interface without any static IPv6 addresses configured, and neither DHCPv6 nor IPv6LL enabled,
-    shall be considered to have no IPv6 support. IPv6 will be automatically disabled for that interface by writing "1"
-    to <filename>/proc/sys/net/ipv6/conf/<replaceable>ifname</replaceable>/disable_ipv6</filename>.
+    <para>The main network file must have the extension <filename>.network</filename>; other
+    extensions are ignored. Networks are applied to links whenever the links appear.</para>
+
+    <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 runtime network
+    directory <filename>/run/systemd/network</filename> and the local administration network
+    directory <filename>/etc/systemd/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 override a system-supplied
+    configuration file with a local file if needed. As a special case, an empty file (file size 0)
+    or symlink with the same name pointing to <filename>/dev/null</filename> disables the
+    configuration file entirely (it is "masked").</para>
+
+    <para>Along with the network file <filename>foo.network</filename>, a "drop-in" directory
+    <filename>foo.network.d/</filename> may exist. All files with the suffix
+    <literal>.conf</literal> from this directory will be parsed after the file itself is
+    parsed. This is useful to alter or add configuration settings, without having to modify the main
+    configuration file. Each drop-in file must have appropriate section headers.</para>
+
+    <para>In addition to <filename>/etc/systemd/network</filename>, drop-in <literal>.d</literal>
+    directories can be placed in <filename>/usr/lib/systemd/network</filename> or
+    <filename>/run/systemd/network</filename> directories. Drop-in files in
+    <filename>/etc</filename> take precedence over those in <filename>/run</filename> which in turn
+    take precedence over those in <filename>/usr/lib</filename>. Drop-in files under any of these
+    directories take precedence over the main netdev file wherever located. (Of course, since
+    <filename>/run</filename> is temporary and <filename>/usr/lib</filename> is for vendors, it is
+    unlikely drop-ins should be used in either of those places.)</para>
+
+    <para>Note that an interface without any static IPv6 addresses configured, and neither DHCPv6
+    nor IPv6LL enabled, shall be considered to have no IPv6 support. IPv6 will be automatically
+    disabled for that interface by writing "1" to
+    <filename>/proc/sys/net/ipv6/conf/<replaceable>ifname</replaceable>/disable_ipv6</filename>.
     </para>
   </refsect1>
 
           <listitem>
             <para>A whitespace-separated list of shell-style globs
             matching the persistent path, as exposed by the udev
-            property <literal>ID_PATH</literal>.</para>
+            property <literal>ID_PATH</literal>. If the list is
+            prefixed with a "!", the test is inverted; i.e. it is
+            true when <literal>ID_PATH</literal> does not match any
+            item in the list.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
             exposed by the udev property <literal>DRIVER</literal>
             of its parent device, or if that is not set the driver
             as exposed by <literal>ethtool -i</literal> of the
-            device itself.</para>
+            device itself. If the list is prefixed with a "!", the
+            test is inverted.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
           <listitem>
             <para>A whitespace-separated list of shell-style globs
             matching the device type, as exposed by the udev property
-            <literal>DEVTYPE</literal>.</para>
+            <literal>DEVTYPE</literal>. If the list is prefixed with
+            a "!", the test is inverted.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
           <listitem>
             <para>A whitespace-separated list of shell-style globs
             matching the device name, as exposed by the udev property
-            <literal>INTERFACE</literal>.</para>
+            <literal>INTERFACE</literal>. If the list is prefixed
+            with a "!", the test is inverted.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
           below 1280 (the minimum MTU for IPv6) it will automatically be increased to this value.</para>
         </listitem>
       </varlistentry>
+      <varlistentry>
+        <term><varname>ARP=</varname></term>
+        <listitem>
+          <para> A boolean. Enables or disables the ARP (low-level Address Resolution Protocol)
+          for this interface. Defaults to unset, which means that the kernel default will be used.</para>
+          <para> For example, disabling ARP is useful when creating multiple MACVLAN or VLAN virtual
+          interfaces atop a single lower-level physical interface, which will then only serve as a
+          link/"bridge" device aggregating traffic to the same physical link and not participate in
+          the network otherwise.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><varname>Unmanaged=</varname></term>
+        <listitem>
+          <para>A boolean. When <literal>yes</literal>, no attempts are
+          made to bring up or configure matching links, equivalent to
+          when there are no matching network files. Defaults to
+          <literal>no</literal>.</para>
+          <para>This is useful for preventing later matching network
+          files from interfering with certain interfaces that are fully
+          controlled by other applications.</para>
+        </listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
 
         <varlistentry>
           <term><varname>Domains=</varname></term>
           <listitem>
-            <para>The domains used for DNS host name resolution on this link. Takes a list of DNS domain names which
-            are used as search suffixes for extending single-label host names (host names containing no dots) to become
-            fully qualified domain names (FQDNs). If a single-label host name is resolved on this interface, each of
-            the specified search domains are appended to it in turn, converting it into a fully qualified domain name,
-            until one of them may be successfully resolved.</para>
-
-            <para>The specified domains are also used for routing of DNS queries: look-ups for host names ending in the
-            domains specified here are preferably routed to the DNS servers configured for this interface. If a domain
-            name is prefixed with <literal>~</literal>, the domain name becomes a pure "routing" domain, is used for
-            DNS query routing purposes only and is not used in the described domain search logic. By specifying a
-            routing domain of <literal>~.</literal> (the tilde indicating definition of a routing domain, the dot
-            referring to the DNS root domain which is the implied suffix of all valid DNS names) it is possible to
-            route all DNS traffic preferably to the DNS server specified for this interface. The route domain logic is
-            particularly useful on multi-homed hosts with DNS servers serving particular private DNS zones on each
-            interface.</para>
+            <para>A list of domains which should be resolved using the DNS servers on this link. Each item in the list
+            should be a domain name, optionally prefixed with a tilde (<literal>~</literal>). The domains with the
+            prefix are called "routing-only domains". The domains without the prefix are called "search domains" and
+            are first used as search suffixes for extending single-label host names (host names containing no dots) to
+            become fully qualified domain names (FQDNs). If a single-label host name is resolved on this interface,
+            each of the specified search domains are appended to it in turn, converting it into a fully qualified
+            domain name, until one of them may be successfully resolved.</para>
+
+            <para>Both "search" and "routing-only" domains are used for routing of DNS queries: look-ups for host names
+            ending in those domains (hence also single label names, if any "search domains" are listed), are routed to
+            the DNS servers configured for this interface. The domain routing logic is particularly useful on
+            multi-homed hosts with DNS servers serving particular private DNS zones on each interface.</para>
+
+            <para>The "routing-only" domain <literal>~.</literal> (the tilde indicating definition of a routing domain,
+            the dot referring to the DNS root domain which is the implied suffix of all valid DNS names) has special
+            effect. It causes all DNS traffic which does not match another configured domain routing entry to be routed
+            to DNS servers specified for this interface. This setting is useful to prefer a certain set of DNS servers
+            if a link on which they are connected is available.</para>
 
             <para>This setting is read by
-            <citerefentry><refentrytitle>systemd-resolved.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
+            <citerefentry><refentrytitle>systemd-resolved.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
+            "Search domains" correspond to the <varname>domain</varname> and <varname>search</varname> entries in
+            <citerefentry project='man-pages'><refentrytitle>resolv.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+            Domain name routing has no equivalent in the traditional glibc API, which has no concept of domain
+            name servers limited to a specific link.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
         </para></listitem>
         </varlistentry>
         <varlistentry>
-          <term><varname>ProxyARP=</varname></term>
-          <listitem><para>A boolean. Configures proxy ARP. Proxy ARP is the technique in which one host,
+          <term><varname>IPv4ProxyARP=</varname></term>
+          <listitem><para>A boolean. Configures proxy ARP for IPv4. Proxy ARP is the technique in which one host,
           usually a router, answers ARP requests intended for another machine. By "faking" its identity,
           the router accepts responsibility for routing packets to the "real" destination. (see <ulink
           url="https://tools.ietf.org/html/rfc1027">RFC 1027</ulink>.
         </para></listitem>
         </varlistentry>
         <varlistentry>
+          <term><varname>IPv6ProxyNDP=</varname></term>
+          <listitem><para>A boolean. Configures proxy NDP for IPv6. Proxy NDP (Neighbor Discovery
+          Protocol) is a technique for IPv6 to allow routing of addresses to a different
+          destination when peers expect them to be present on a certain physical link.
+          In this case a router answers Neighbour Advertisement messages intended for
+          another machine by offering its own MAC address as destination.
+          Unlike proxy ARP for IPv4, it is not enabled globally, but will only send Neighbour
+          Advertisement messages for addresses in the IPv6 neighbor proxy table,
+          which can also be shown by <command>ip -6 neighbour show proxy</command>.
+          systemd-networkd will control the per-interface `proxy_ndp` switch for each configured
+          interface depending on this option.
+          Defautls to unset.
+        </para></listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><varname>IPv6ProxyNDPAddress=</varname></term>
+          <listitem><para>An IPv6 address, for which Neighbour Advertisement messages will be
+          proxied. This option may be specified more than once. systemd-networkd will add the
+          <option>IPv6ProxyNDPAddress=</option> entries to the kernel's IPv6 neighbor proxy table.
+          This option implies <option>IPv6ProxyNDP=true</option> but has no effect if
+          <option>IPv6ProxyNDP</option> has been set to false. Defaults to unset.
+        </para></listitem>
+        </varlistentry>
+        <varlistentry>
           <term><varname>Bridge=</varname></term>
           <listitem>
-            <para>The name of the bridge to add the link to.</para>
+            <para>The name of the bridge to add the link to. See
+            <citerefentry><refentrytitle>systemd.netdev</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+            </para>
           </listitem>
         </varlistentry>
         <varlistentry>
           <term><varname>Bond=</varname></term>
           <listitem>
-            <para>The name of the bond to add the link to.</para>
+            <para>The name of the bond to add the link to. See
+            <citerefentry><refentrytitle>systemd.netdev</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+            </para>
           </listitem>
         </varlistentry>
         <varlistentry>
           <term><varname>VRF=</varname></term>
           <listitem>
-            <para>The name of the VRF to add the link to.</para>
+            <para>The name of the VRF to add the link to. See
+            <citerefentry><refentrytitle>systemd.netdev</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+            </para>
           </listitem>
         </varlistentry>
         <varlistentry>
           <term><varname>VLAN=</varname></term>
           <listitem>
-            <para>The name of a VLAN to create on the link. This
-            option may be specified more than once.</para>
+            <para>The name of a VLAN to create on the link. See
+            <citerefentry><refentrytitle>systemd.netdev</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+            This option may be specified more than once.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
           <term><varname>MACVLAN=</varname></term>
           <listitem>
-            <para>The name of a MACVLAN to create on the link. This
-            option may be specified more than once.</para>
+            <para>The name of a MACVLAN to create on the link. See
+            <citerefentry><refentrytitle>systemd.netdev</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+            This option may be specified more than once.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
           <term><varname>VXLAN=</varname></term>
           <listitem>
-            <para>The name of a VXLAN to create on the link. This
-            option may be specified more than once.</para>
+            <para>The name of a VXLAN to create on the link. See
+            <citerefentry><refentrytitle>systemd.netdev</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+            This option may be specified more than once.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
           <term><varname>Tunnel=</varname></term>
           <listitem>
-            <para>The name of a Tunnel to create on the link. This
-            option may be specified more than once.</para>
+            <para>The name of a Tunnel to create on the link. See
+            <citerefentry><refentrytitle>systemd.netdev</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+            This option may be specified more than once.</para>
           </listitem>
         </varlistentry>
       </variablelist>
             which is then configured to use them explicitly.</para>
           </listitem>
         </varlistentry>
+        <varlistentry>
+          <term><varname>HomeAddress=</varname></term>
+          <listitem>
+            <para>Takes a boolean argument. Designates this address the "home address" as defined in
+            <ulink url="https://tools.ietf.org/html/rfc6275">RFC 6275</ulink>.
+            Supported only on IPv6. Defaults to false.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><varname>DuplicateAddressDetection=</varname></term>
+          <listitem>
+            <para>Takes a boolean argument. Do not perform Duplicate Address Detection
+            <ulink url="https://tools.ietf.org/html/rfc4862">RFC 4862</ulink> when adding this address.
+            Supported only on IPv6. Defaults to false.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><varname>ManageTemporaryAddress=</varname></term>
+          <listitem>
+            <para>Takes a boolean argument. If true the kernel manage temporary addresses created
+            from this one as template on behalf of Privacy Extensions
+            <ulink url="https://tools.ietf.org/html/rfc3041">RFC 3041</ulink>.  For this to become
+            active, the use_tempaddr sysctl setting has to be set to a value greater than zero.
+            The given address needs to have a prefix length of 64. This flag allows to use privacy
+            extensions in a manually configured network, just like if stateless auto-configuration
+            was active. Defaults to false. </para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><varname>PrefixRoute=</varname></term>
+          <listitem>
+            <para>Takes a boolean argument. When adding or modifying an IPv6 address, the userspace
+            application needs a way to suppress adding a prefix route. This is for example relevant
+            together with IFA_F_MANAGERTEMPADDR, where userspace creates autoconf generated addresses,
+            but depending on on-link, no route for the prefix should be added. Defaults to false.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><varname>AutoJoin=</varname></term>
+          <listitem>
+            <para>Takes a boolean argument. Joining multicast group on ethernet level via
+            <command>ip maddr</command> command would not work if we have an Ethernet switch that does
+            IGMP snooping since the switch would not replicate multicast packets on  ports that did not
+            have IGMP reports for the multicast addresses. Linux vxlan interfaces created via
+            <command>ip link add vxlan</command> or networkd's netdev kind vxlan have the group option
+            that enables then to do the required join. By extending ip address command with option
+            <literal>autojoin</literal> we can get similar functionality for openvswitch (OVS) vxlan
+            interfaces as well as other tunneling mechanisms that need to receive multicast traffic.
+            Defaults to <literal>no</literal>.</para>
+          </listitem>
+        </varlistentry>
+      </variablelist>
+  </refsect1>
+
+    <refsect1>
+    <title>[IPv6AddressLabel] Section Options</title>
+
+      <para>An <literal>[IPv6AddressLabel]</literal> section accepts the
+      following keys. Specify several <literal>[IPv6AddressLabel]</literal>
+      sections to configure several addresse labels. IPv6 address labels are
+      used for address selection. See <ulink url="https://tools.ietf.org/html/rfc3484">RFC 3484</ulink>.
+      Precedence is managed by userspace, and only the label itself is stored in the kernel</para>
+
+      <variablelist class='network-directives'>
+        <varlistentry>
+          <term><varname>Label=</varname></term>
+          <listitem>
+            <para> The label for the prefix (an unsigned integer) ranges 0 to 4294967294.
+            0xffffffff is reserved. This key is mandatory.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><varname>Prefix=</varname></term>
+          <listitem>
+            <para>IPv6 prefix is an address with a prefix length, separated by a slash <literal>/</literal> character.
+            This key is mandatory. </para>
+          </listitem>
+        </varlistentry>
       </variablelist>
   </refsect1>
 
             <para>As in the <literal>[Network]</literal> section.</para>
           </listitem>
         </varlistentry>
+         <varlistentry>
+           <term><varname>GatewayOnlink=</varname></term>
+           <listitem>
+             <para>The <literal>GatewayOnlink</literal> option tells the kernel that it does not have
+             to check if the gateway is reachable directly by the current machine (i.e., the kernel does
+             not need to check if the gateway is attached to the local network), so that we can insert the
+             route in the kernel table without it being complained about. A boolean, defaults to <literal>no</literal>.
+             </para>
+           </listitem>
+         </varlistentry>
         <varlistentry>
           <term><varname>Destination=</varname></term>
           <listitem>
           </listitem>
         </varlistentry>
         <varlistentry>
+          <term><varname>IPv6Preference=</varname></term>
+          <listitem>
+            <para>Specifies the route preference as defined in <ulink
+            url="https://tools.ietf.org/html/rfc4191">RFC4191</ulink> for Router Discovery messages.
+            Which can be one of <literal>low</literal> the route has a lowest priority,
+            <literal>medium</literal> the route has a default priority or
+            <literal>high</literal> the route has a highest priority.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
           <term><varname>Scope=</varname></term>
           <listitem>
             <para>The scope of the route, which can be <literal>global</literal>,
           </para>
           </listitem>
         </varlistentry>
+        <varlistentry>
+          <term><varname>Protocol=</varname></term>
+          <listitem>
+            <para>The Protocol identifier for the route. Takes a number between 0 and 255 or the special values
+            <literal>kernel</literal>, <literal>boot</literal> and <literal>static</literal>. Defaults to
+            <literal>static</literal>.
+            </para>
+          </listitem>
+        </varlistentry>
       </variablelist>
   </refsect1>
 
         <varlistentry>
           <term><varname>UseRoutes=</varname></term>
           <listitem>
-            <para>When true (the default), the static routes will be
-            requested from the DHCP server and added to the routing
-            table with a metric of 1024.</para>
+            <para>When true (the default), the static routes will be requested from the DHCP server and added to the
+              routing table with a metric of 1024, and a scope of "global", "link" or "host", depending on the route's
+              destination and gateway. If the destination is on the local host, e.g., 127.x.x.x, or the same as the
+              link's own address, the scope will be set to "host". Otherwise if the gateway is null (a direct route), a
+              "link" scope will be used. For anything else, scope defaults to "global".</para>
           </listitem>
         </varlistentry>
 
             DHCP server.</para>
           </listitem>
         </varlistentry>
+
+        <varlistentry>
+          <term><varname>RouteTable=<replaceable>num</replaceable></varname></term>
+          <listitem>
+            <para>The table identifier for DHCP routes (a number between 1 and 4294967295, or 0 to unset).
+            The table can be retrieved using <command>ip route show table <replaceable>num</replaceable></command>.
+            </para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term><varname>ListenPort=</varname></term>
+          <listitem>
+            <para>Allow setting custom port for the DHCP client to listen on.</para>
+          </listitem>
+        </varlistentry>
       </variablelist>
     </refsect1>
 
             project='man-pages'><refentrytitle>resolv.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
           </listitem>
         </varlistentry>
+
+        <varlistentry>
+          <term><varname>RouteTable=<replaceable>num</replaceable></varname></term>
+          <listitem>
+            <para>The table identifier for the routes received in the Router Advertisement
+            (a number between 1 and 4294967295, or 0 to unset).
+            The table can be retrieved using <command>ip route show table <replaceable>num</replaceable></command>.
+            </para>
+          </listitem>
+        </varlistentry>
       </variablelist>
   </refsect1>
 
             <para>Sets the "cost" of sending packets of this interface.
             Each port in a bridge may have a different speed and the cost
             is used to decide which link to use. Faster interfaces
-            should have lower costs.</para>
+            should have lower costs. It is an interger value between 1 and
+            65535.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
+          <term><varname>Priority=</varname></term>
+          <listitem>
+            <para>Sets the "priority" of sending packets on this interface.
+            Each port in a bridge may have a different priority which is used
+            to decide which link to use. Lower value means higher priority.
+            It is an interger value between 0 to 63. Networkd does not set any
+            default, meaning the kernel default value of 32 is used.</para>
           </listitem>
         </varlistentry>
       </variablelist>
   </refsect1>
 
   <refsect1>
-    <title>Example</title>
+    <title>Examples</title>
     <example>
-      <title>/etc/systemd/network/50-static.network</title>
+      <title>Static network configuration</title>
 
-      <programlisting>[Match]
+      <programlisting># /etc/systemd/network/50-static.network
+[Match]
 Name=enp2s0
 
 [Network]
 Address=192.168.0.15/24
 Gateway=192.168.0.1</programlisting>
+
+      <para>This brings interface <literal>enp2s0</literal> up with a static address. The
+      specified gateway will be used for a default route.</para>
     </example>
 
     <example>
-      <title>/etc/systemd/network/80-dhcp.network</title>
+      <title>DHCP on ethernet links</title>
 
-      <programlisting>[Match]
+      <programlisting># /etc/systemd/network/80-dhcp.network
+[Match]
 Name=en*
 
 [Network]
 DHCP=yes</programlisting>
+
+      <para>This will enable DHCPv4 and DHCPv6 on all interfaces with names starting with
+      <literal>en</literal> (i.e. ethernet interfaces).</para>
     </example>
 
     <example>
-      <title>/etc/systemd/network/25-bridge-static.network</title>
+      <title>A bridge with two enslaved links</title>
 
-      <programlisting>[Match]
+      <programlisting># /etc/systemd/network/25-bridge-static.network
+[Match]
 Name=bridge0
 
 [Network]
 Address=192.168.0.15/24
 Gateway=192.168.0.1
 DNS=192.168.0.1</programlisting>
-    </example>
 
-    <example>
-      <title>/etc/systemd/network/25-bridge-slave-interface.network</title>
-
-      <programlisting>[Match]
+      <programlisting># /etc/systemd/network/25-bridge-slave-interface-1.network
+[Match]
 Name=enp2s0
 
 [Network]
 Bridge=bridge0</programlisting>
+
+      <programlisting># /etc/systemd/network/25-bridge-slave-interface-2.network
+[Match]
+Name=wlp3s0
+
+[Network]
+Bridge=bridge0</programlisting>
+
+      <para>This creates a bridge and attaches devices <literal>enp2s0</literal> and
+      <literal>wlp3s0</literal> to it. The bridge will have the specified static address
+      and network assigned, and a default route via the specified gateway will be
+      added. The specified DNS server will be added to the global list of DNS resolvers.
+      </para>
     </example>
+
     <example>
-      <title>/etc/systemd/network/25-bridge-slave-interface-vlan.network</title>
+      <title></title>
 
-      <programlisting>[Match]
+      <programlisting>
+# /etc/systemd/network/20-bridge-slave-interface-vlan.network
+[Match]
 Name=enp2s0
 
 [Network]
@@ -1233,69 +1480,121 @@ VLAN=100-200
 
 [BridgeVLAN]
 EgressUntagged=300-400</programlisting>
+
+    <para>This overrides the configuration specified in the previous example for the
+    interface <literal>enp2s0</literal>, and enables VLAN on that bridge port. VLAN IDs
+    1-32, 42, 100-400 will be allowed. Packets tagged with VLAN IDs 42, 300-400 will be
+    untagged when they leave on this interface. Untagged packets which arrive on this
+    interface will be assigned VLAN ID 42.</para>
     </example>
+
     <example>
-      <title>/etc/systemd/network/25-ipip.network</title>
+      <title>Various tunnels</title>
 
-      <programlisting>[Match]
-Name=em1
+      <programlisting>/etc/systemd/network/25-tunnels.network
+[Match]
+Name=ens1
 
 [Network]
-Tunnel=ipip-tun</programlisting>
+Tunnel=ipip-tun
+Tunnel=sit-tun
+Tunnel=gre-tun
+Tunnel=vti-tun
+      </programlisting>
+
+      <programlisting>/etc/systemd/network/25-tunnel-ipip.netdev
+[NetDev]
+Name=ipip-tun
+Kind=ipip
+      </programlisting>
+
+      <programlisting>/etc/systemd/network/25-tunnel-sit.netdev
+[NetDev]
+Name=sit-tun
+Kind=sit
+      </programlisting>
+
+      <programlisting>/etc/systemd/network/25-tunnel-gre.netdev
+[NetDev]
+Name=gre-tun
+Kind=gre
+      </programlisting>
+
+      <programlisting>/etc/systemd/network/25-tunnel-vti.netdev
+[NetDev]
+Name=vti-tun
+Kind=vti
+      </programlisting>
+
+      <para>This will bring interface <literal>ens1</literal> up and create an IPIP tunnel,
+      a SIT tunnel, a GRE tunnel, and a VTI tunnel using it.</para>
     </example>
 
     <example>
-      <title>/etc/systemd/network/25-sit.network</title>
+      <title>A bond device</title>
 
-      <programlisting>[Match]
-Name=em1
+      <programlisting># /etc/systemd/network/30-bond1.network
+[Match]
+Name=bond1
 
 [Network]
-Tunnel=sit-tun</programlisting>
-    </example>
+DHCP=ipv6
+</programlisting>
 
-    <example>
-      <title>/etc/systemd/network/25-gre.network</title>
+      <programlisting># /etc/systemd/network/30-bond1.netdev
+[NetDev]
+Name=bond1
+Kind=bond
+</programlisting>
 
-      <programlisting>[Match]
-Name=em1
+      <programlisting># /etc/systemd/network/30-bond1-dev1.network
+[Match]
+MACAddress=52:54:00:e9:64:41
 
 [Network]
-Tunnel=gre-tun</programlisting>
-    </example>
-
-    <example>
-      <title>/etc/systemd/network/25-vti.network</title>
+Bond=bond1
+</programlisting>
 
-      <programlisting>[Match]
-Name=em1
+      <programlisting># /etc/systemd/network/30-bond1-dev2.network
+[Match]
+MACAddress=52:54:00:e9:64:42
 
 [Network]
-Tunnel=vti-tun</programlisting>
+Bond=bond1
+</programlisting>
+
+    <para>This will create a bond device <literal>bond1</literal> and enslave the two
+    devices with MAC addresses 52:54:00:e9:64:41 and 52:54:00:e9:64:42 to it. IPv6 DHCP
+    will be used to acquire an address.</para>
     </example>
 
     <example>
-      <title>/etc/systemd/network/25-bond.network</title>
-
-      <programlisting>[Match]
+      <title>Virtual Routing and Forwarding (VRF)</title>
+      <para>Add the <literal>bond1</literal> interface to the VRF master interface
+      <literal>vrf1</literal>. This will redirect routes generated on this interface to be
+      within the routing table defined during VRF creation. Traffic won't be redirected
+      towards the VRFs routing table unless specific ip-rules are added.</para>
+      <programlisting># /etc/systemd/network/25-vrf.network
+[Match]
 Name=bond1
 
 [Network]
-DHCP=yes
+VRF=vrf1
 </programlisting>
     </example>
 
     <example>
-      <title>/etc/systemd/network/25-vrf.network</title>
-      <para>Add the bond1 interface to the VRF master interface vrf-test. This will redirect routes generated on this interface to be within the routing table defined during VRF creation. Traffic won't be redirected towards the VRFs routing table unless specific ip-rules are added.</para>
-      <programlisting>[Match]
-Name=bond1
+      <title>MacVTap</title>
+      <para>This brings up a network interface <literal>macvtap-test</literal>
+      and attaches it to <literal>enp0s25</literal>.</para>
+      <programlisting># /usr/lib/systemd/network/25-macvtap.network
+[Match]
+Name=enp0s25
 
 [Network]
-VRF=vrf-test
+MACVTAP=macvtap-test
 </programlisting>
     </example>
-
   </refsect1>
 
   <refsect1>
index b1344d6..4f3f052 100644 (file)
       </varlistentry>
 
       <varlistentry>
+        <term><varname>PivotRoot=</varname></term>
+
+        <listitem><para>Selects a directory to pivot to <filename>/</filename> inside the container when starting up.
+        Takes a single path, or a pair of two paths separated by a colon. Both paths must be absolute, and are resolved
+        in the container's file system namespace. This corresponds to the <option>--pivot-root=</option> command line
+        switch.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><varname>Capability=</varname></term>
         <term><varname>DropCapability=</varname></term>
 
       </varlistentry>
 
       <varlistentry>
+        <term><varname>Overlay=</varname></term>
+        <term><varname>OverlayReadOnly=</varname></term>
+
+        <listitem><para>Adds an overlay mount point. Takes a colon-separated list of paths.  This option may be used
+        multiple times to configure multiple overlay mounts. This option is equivalent to the command line switches
+        <option>--overlay=</option> and <option>--overlay-ro=</option>, see
+        <citerefentry><refentrytitle>systemd-nspawn</refentrytitle><manvolnum>1</manvolnum></citerefentry> for details
+        about the specific options supported. This setting is privileged (see above).</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><varname>PrivateUsersChown=</varname></term>
 
         <listitem><para>Configures whether the ownership of the files and directories in the container tree shall be
index ae53b85..b4dce3e 100644 (file)
@@ -77,7 +77,7 @@
 
       <listitem>
         <para>Very early in the new boot
-        <citerefentry><refentrytitle>systemd-update-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+        <citerefentry><refentrytitle>systemd-system-update-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>
         checks whether <filename>/system-update</filename> exists. If so, it (temporarily and for
         this boot only) redirects (i.e. symlinks) <filename>default.target</filename> to
         <filename>system-update.target</filename>, a special target that is pulls in the base system
       </listitem>
 
       <listitem>
-        <para>The system now continues to boot into <filename>default.target</filename>, and thus
-        into <filename>system-update.target</filename>. This target pulls in the system update unit,
-        which starts the system update script after all file systems have been mounted.</para>
+        <para>The system now continues to boot into <filename>default.target</filename>, and
+        thus into <filename>system-update.target</filename>. This target pulls in all system
+        update units. Only one service should perform an update (see the next point), and all
+        the other ones should exit cleanly with a "success" return code and without doing
+        anything. Update services should be ordered after <filename>sysinit.target</filename>
+        so that the update starts after all file systems have been mounted.</para>
       </listitem>
 
       <listitem>
-        <para>As the first step, the update script should check if the
+        <para>As the first step, an update service should check if the
         <filename>/system-update</filename> symlink points to the location used by that update
-        script. In case it does not exists or points to a different location, the script must exit
+        service. In case it does not exist or points to a different location, the service must exit
         without error. It is possible for multiple update services to be installed, and for multiple
-        update scripts to be launched in parallel, and only the one that corresponds to the tool
+        update services to be launched in parallel, and only the one that corresponds to the tool
         that <emphasis>created</emphasis> the symlink before reboot should perform any actions. It
         is unsafe to run multiple updates in parallel.</para>
       </listitem>
 
       <listitem>
-        <para>The update script should now do its job. If applicable and possible, it should
-        create a file system snapshot, then install all packages.
-        After completion (regardless whether the update succeeded or failed) the machine
-        must be rebooted, for example by calling <command>systemctl reboot</command>.
-        In addition, on failure the script should revert to the old file system snapshot
-        (without the symlink).</para>
+        <para>The update service should now do its job. If applicable and possible, it should
+        create a file system snapshot, then install all packages.  After completion (regardless
+        whether the update succeeded or failed) the machine must be rebooted, for example by
+        calling <command>systemctl reboot</command>. In addition, on failure the script should
+        revert to the old file system snapshot (without the symlink).</para>
       </listitem>
 
       <listitem>
-        <para>The system is rebooted. Since the <filename>/system-update</filename> symlink is gone,
-        the generator won't redirect <filename>default.target</filename> after reboot and the
-        system now boots into the default target again.</para>
+        <para>The upgrade scripts should exit only after the update is finished. It is expected
+        that the service which performs the upgrade will cause the machine to reboot after it
+        is done. If the <filename>system-update.target</filename> is successfully reached, i.e.
+        all update services have run, and the <filename>/system-update</filename> symlink still
+        exists, it will be removed and the machine rebooted as a safety measure.</para>
+      </listitem>
+
+      <listitem>
+        <para>After a reboot, now that the <filename>/system-update</filename> symlink is gone,
+        the generator won't redirect <filename>default.target</filename> anymore and the system
+        now boots into the default target again.</para>
       </listitem>
     </orderedlist>
   </refsect1>
         <varname>FailureAction=</varname> makes sure that the specified unit is activated if your
         script exits uncleanly (by non-zero error code, or signal/coredump). If your script succeeds
         you should trigger the reboot in your own code, for example by invoking logind's
-        <command>Reboot()</command> call or calling <command>systemct reboot</command>. See
-        <ulink url="http://www.freedesktop.org/wiki/Software/systemd/logind">logind dbus API</ulink>
+        <command>Reboot()</command> call or calling <command>systemctl reboot</command>. See
+        <ulink url="https://www.freedesktop.org/wiki/Software/systemd/logind">logind dbus API</ulink>
         for details.</para>
       </listitem>
 
       <listitem>
         <para>The update service should declare <varname>DefaultDependencies=false</varname>,
-        and pull in any services it requires explicitly.</para>
+        <varname>Requires=sysinit.target</varname>, <varname>After=sysinit.target</varname>,
+        and explicitly pull in any other services it requires.</para>
       </listitem>
     </orderedlist>
   </refsect1>
     <title>See also</title>
 
     <para>
-      <ulink url="http://www.freedesktop.org/wiki/Software/systemd/SystemUpdates/">Implementing Offline System Updates</ulink>,
+      <ulink url="https://www.freedesktop.org/wiki/Software/systemd/SystemUpdates/">Implementing Offline System Updates</ulink>,
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>systemd-update-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
-      <citerefentry><refentrytitle>dnf.plugin.system-upgrade</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+      <citerefentry><refentrytitle>systemd-system-update-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
+      <citerefentry project='mankier'><refentrytitle>dnf.plugin.system-upgrade</refentrytitle><manvolnum>8</manvolnum></citerefentry>
     </para>
   </refsect1>
 </refentry>
index b716401..92eb4e8 100644 (file)
@@ -72,7 +72,7 @@
 
     <para>For more information on the preset logic please have a look
     at the <ulink
-    url="http://freedesktop.org/wiki/Software/systemd/Preset">Presets</ulink>
+    url="https://www.freedesktop.org/wiki/Software/systemd/Preset">Presets</ulink>
     document.</para>
 
     <para>It is not recommended to ship preset files within the
     Empty lines and lines whose first non-whitespace character is # or
     ; are ignored.</para>
 
+    <para>Presets must refer to the "real" unit file, and not to any aliases. See
+    <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+    for a description of unit aliasing.</para>
+
     <para>Two different directives are understood:
     <literal>enable</literal> may be used to enable units by default,
     <literal>disable</literal> to disable units by default.</para>
index bf44a68..9b1f5db 100644 (file)
   <refsect1>
     <title>Description</title>
 
-    <para>Unit configuration files for services, slices, scopes,
-    sockets, mount points, and swap devices share a subset of
-    configuration options for resource control of spawned
-    processes. Internally, this relies on the Control Groups
-    kernel concept for organizing processes in a hierarchical tree of
-    named groups for the purpose of resource management.</para>
+    <para>Unit configuration files for services, slices, scopes, sockets, mount points, and swap devices share a subset
+    of configuration options for resource control of spawned processes. Internally, this relies on the Linux Control
+    Groups (cgroups) kernel concept for organizing processes in a hierarchical tree of named groups for the purpose of
+    resource management.</para>
 
     <para>This man page lists the configuration options shared by
     those six unit types. See
     [Slice], [Scope], [Service], [Socket], [Mount], or [Swap]
     sections, depending on the unit type.</para>
 
+    <para>In addition, options which control resources available to programs
+    <emphasis>executed</emphasis> by systemd are listed in
+    <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+    Those options complement options listed here.</para>
+
     <para>See the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/ControlGroupInterface/">New
+    url="https://www.freedesktop.org/wiki/Software/systemd/ControlGroupInterface/">New
     Control Group Interfaces</ulink> for an introduction on how to make
     use of resource control APIs from programs.</para>
   </refsect1>
   <refsect1>
     <title>Unified and Legacy Control Group Hierarchies</title>
 
-    <para>The unified control group hierarchy is the new version of kernel control group interface. Depending on the
-    resource type, there are differences in resource control capabilities.  Also, because of interface changes, some
-    resource types have a separate set of options on the unified hierarchy.</para>
+    <para>The unified control group hierarchy is the new version of kernel control group interface, see <ulink
+    url="https://www.kernel.org/doc/Documentation/cgroup-v2.txt">cgroup-v2.txt</ulink>. Depending on the resource type,
+    there are differences in resource control capabilities.  Also, because of interface changes, some resource types
+    have separate set of options on the unified hierarchy.</para>
 
     <para>
       <variablelist>
+
         <varlistentry>
-          <term><option>IO</option></term>
+          <term><option>CPU</option></term>
           <listitem>
-            <para><varname>IO</varname> prefixed settings are superset of and replace <varname>BlockIO</varname>
-            prefixed ones. On unified hierarchy, IO resource control also applies to buffered writes.</para>
+            <para>Due to the lack of consensus in the kernel community, the CPU controller support on the unified
+            control group hierarchy requires out-of-tree kernel patches. See <ulink
+            url="https://git.kernel.org/cgit/linux/kernel/git/tj/cgroup.git/tree/Documentation/cgroup-v2-cpu.txt?h=cgroup-v2-cpu">cgroup-v2-cpu.txt</ulink>.</para>
+
+            <para><varname>CPUWeight=</varname> and <varname>StartupCPUWeight=</varname> replace
+            <varname>CPUShares=</varname> and <varname>StartupCPUShares=</varname>, respectively.</para>
+
+            <para>The <literal>cpuacct</literal> controller does not exist separately on the unified hierarchy.</para>
           </listitem>
         </varlistentry>
+
         <varlistentry>
           <term><option>Memory</option></term>
           <listitem>
             and <varname>MemoryHigh=</varname> are effective only on unified hierarchy.</para>
           </listitem>
         </varlistentry>
+
+        <varlistentry>
+          <term><option>IO</option></term>
+          <listitem>
+            <para><varname>IO</varname> prefixed settings are superset of and replace <varname>BlockIO</varname>
+            prefixed ones. On unified hierarchy, IO resource control also applies to buffered writes.</para>
+          </listitem>
+        </varlistentry>
+
       </variablelist>
     </para>
 
-    <para>To ease the transition, there is best-effort translation between the two versions of settings. If all
-    settings of a unit for a given resource type are for the other hierarchy type, the settings are translated and
-    applied. If there are any valid settings for the hierarchy in use, all translations are disabled for the resource
-    type. Mixing the two types of settings on a unit can lead to confusing results.</para>
+    <para>To ease the transition, there is best-effort translation between the two versions of settings. For each
+    controller, if any of the settings for the unified hierarchy are present, all settings for the legacy hierarchy are
+    ignored. If the resulting settings are for the other type of hierarchy, the configurations are translated before
+    application.</para>
+
+    <para>Legacy control group hierarchy (see <ulink
+    url="https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt">cgroups.txt</ulink>), also called cgroup-v1,
+    doesn't allow safe delegation of controllers to unprivileged processes. If the system uses the legacy control group
+    hierarchy, resource control is disabled for systemd user instance, see
+    <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>.
+    </para>
   </refsect1>
 
   <refsect1>
       </varlistentry>
 
       <varlistentry>
-        <term><varname>CPUShares=<replaceable>weight</replaceable></varname></term>
-        <term><varname>StartupCPUShares=<replaceable>weight</replaceable></varname></term>
+        <term><varname>CPUWeight=<replaceable>weight</replaceable></varname></term>
+        <term><varname>StartupCPUWeight=<replaceable>weight</replaceable></varname></term>
 
         <listitem>
-          <para>Assign the specified CPU time share weight to the
-          processes executed. These options take an integer value and
-          control the <literal>cpu.shares</literal> control group
-          attribute. The allowed range is 2 to 262144. Defaults to
-          1024. For details about this control group attribute, see
-          <ulink
+          <para>Assign the specified CPU time weight to the processes executed, if the unified control group hierarchy
+          is used on the system. These options take an integer value and control the <literal>cpu.weight</literal>
+          control group attribute. The allowed range is 1 to 10000. Defaults to 100. For details about this control
+          group attribute, see <ulink
+          url="https://www.kernel.org/doc/Documentation/cgroup-v2.txt">cgroup-v2.txt</ulink> and <ulink
           url="https://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt">sched-design-CFS.txt</ulink>.
-          The available CPU time is split up among all units within
-          one slice relative to their CPU time share weight.</para>
+          The available CPU time is split up among all units within one slice relative to their CPU time weight.</para>
 
-          <para>While <varname>StartupCPUShares=</varname> only
-          applies to the startup phase of the system,
-          <varname>CPUShares=</varname> applies to normal runtime of
-          the system, and if the former is not set also to the startup
-          phase. Using <varname>StartupCPUShares=</varname> allows
-          prioritizing specific services at boot-up differently than
-          during normal runtime.</para>
+          <para>While <varname>StartupCPUWeight=</varname> only applies to the startup phase of the system,
+          <varname>CPUWeight=</varname> applies to normal runtime of the system, and if the former is not set also to
+          the startup phase. Using <varname>StartupCPUWeight=</varname> allows prioritizing specific services at
+          boot-up differently than during normal runtime.</para>
+
+          <para>Implies <literal>CPUAccounting=true</literal>.</para>
 
-          <para>These options imply
-          <literal>CPUAccounting=true</literal>.</para>
+          <para>These settings replace <varname>CPUShares=</varname> and <varname>StartupCPUShares=</varname>.</para>
         </listitem>
       </varlistentry>
 
         <term><varname>CPUQuota=</varname></term>
 
         <listitem>
-          <para>Assign the specified CPU time quota to the processes
-          executed. Takes a percentage value, suffixed with "%". The
-          percentage specifies how much CPU time the unit shall get at
-          maximum, relative to the total CPU time available on one
-          CPU. Use values &gt; 100% for allotting CPU time on more than
-          one CPU. This controls the
-          <literal>cpu.cfs_quota_us</literal> control group
-          attribute. For details about this control group attribute,
-          see <ulink
+          <para>Assign the specified CPU time quota to the processes executed. Takes a percentage value, suffixed with
+          "%". The percentage specifies how much CPU time the unit shall get at maximum, relative to the total CPU time
+          available on one CPU. Use values &gt; 100% for allotting CPU time on more than one CPU. This controls the
+          <literal>cpu.max</literal> attribute on the unified control group hierarchy and
+          <literal>cpu.cfs_quota_us</literal> on legacy. For details about these control group attributes, see <ulink
+          url="https://www.kernel.org/doc/Documentation/cgroup-v2.txt">cgroup-v2.txt</ulink> and <ulink
           url="https://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt">sched-design-CFS.txt</ulink>.</para>
 
-          <para>Example: <varname>CPUQuota=20%</varname> ensures that
-          the executed processes will never get more than 20% CPU time
-          on one CPU.</para>
+          <para>Example: <varname>CPUQuota=20%</varname> ensures that the executed processes will never get more than
+          20% CPU time on one CPU.</para>
 
           <para>Implies <literal>CPUAccounting=true</literal>.</para>
         </listitem>
 
           <para>Implies <literal>MemoryAccounting=true</literal>.</para>
 
-          <para>This setting is supported only if the unified control group hierarchy is used.</para>
+          <para>This setting is supported only if the unified control group hierarchy is used and disables
+          <varname>MemoryLimit=</varname>.</para>
         </listitem>
       </varlistentry>
 
 
           <para>Implies <literal>MemoryAccounting=true</literal>.</para>
 
-          <para>This setting is supported only if the unified control group hierarchy is used.</para>
+          <para>This setting is supported only if the unified control group hierarchy is used and disables
+          <varname>MemoryLimit=</varname>.</para>
         </listitem>
       </varlistentry>
 
 
           <para>Implies <literal>MemoryAccounting=true</literal>.</para>
 
-          <para>This setting is supported only if the unified control group hierarchy is used. Use
-          <varname>MemoryLimit=</varname> on systems using the legacy control group hierarchy.</para>
+          <para>This setting replaces <varname>MemoryLimit=</varname>.</para>
         </listitem>
       </varlistentry>
 
       <varlistentry>
-        <term><varname>MemoryLimit=<replaceable>bytes</replaceable></varname></term>
+        <term><varname>MemorySwapMax=<replaceable>bytes</replaceable></varname></term>
 
         <listitem>
-          <para>Specify the limit on maximum memory usage of the executed processes. The limit specifies how much
-          process and kernel memory can be used by tasks in this unit. Takes a memory size in bytes. If the value is
-          suffixed with K, M, G or T, the specified memory size is parsed as Kilobytes, Megabytes, Gigabytes, or
-          Terabytes (with the base 1024), respectively. Alternatively, a percentage value may be specified, which is
-          taken relative to the installed physical memory on the system. If assigned the special value
-          <literal>infinity</literal>, no memory limit is applied. This controls the
-          <literal>memory.limit_in_bytes</literal> control group attribute. For details about this control group
-          attribute, see <ulink
-          url="https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt">memory.txt</ulink>.</para>
+          <para>Specify the absolute limit on swap usage of the executed processes in this unit.</para>
+
+          <para>Takes a swap size in bytes. If the value is suffixed with K, M, G or T, the specified swap size is
+          parsed as Kilobytes, Megabytes, Gigabytes, or Terabytes (with the base 1024), respectively. If assigned the
+          special value <literal>infinity</literal>, no swap limit is applied. This controls the
+          <literal>memory.swap.max</literal> control group attribute. For details about this control group attribute,
+          see <ulink url="https://www.kernel.org/doc/Documentation/cgroup-v2.txt">cgroup-v2.txt</ulink>.</para>
 
           <para>Implies <literal>MemoryAccounting=true</literal>.</para>
 
-          <para>This setting is supported only if the legacy control group hierarchy is used. Use
-          <varname>MemoryMax=</varname> on systems using the unified control group hierarchy.</para>
+          <para>This setting is supported only if the unified control group hierarchy is used and disables
+          <varname>MemoryLimit=</varname>.</para>
         </listitem>
       </varlistentry>
 
           in
           <citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
 
-          <para>This setting is supported only if the unified control group hierarchy is used. Use
-          <varname>BlockIOAccounting=</varname> on systems using the legacy control group hierarchy.</para>
+          <para>This setting replaces <varname>BlockIOAccounting=</varname> and disables settings prefixed with
+          <varname>BlockIO</varname> or <varname>StartupBlockIO</varname>.</para>
         </listitem>
       </varlistentry>
 
 
           <para>Implies <literal>IOAccounting=true</literal>.</para>
 
-          <para>This setting is supported only if the unified control group hierarchy is used. Use
-          <varname>BlockIOWeight=</varname> and <varname>StartupBlockIOWeight=</varname> on systems using the legacy
-          control group hierarchy.</para>
+          <para>These settings replace <varname>BlockIOWeight=</varname> and <varname>StartupBlockIOWeight=</varname>
+          and disable settings prefixed with <varname>BlockIO</varname> or <varname>StartupBlockIO</varname>.</para>
         </listitem>
       </varlistentry>
 
 
           <para>Implies <literal>IOAccounting=true</literal>.</para>
 
-          <para>This setting is supported only if the unified control group hierarchy is used. Use
-          <varname>BlockIODeviceWeight=</varname> on systems using the legacy control group hierarchy.</para>
+          <para>This setting replaces <varname>BlockIODeviceWeight=</varname> and disables settings prefixed with
+          <varname>BlockIO</varname> or <varname>StartupBlockIO</varname>.</para>
         </listitem>
       </varlistentry>
 
 
           <para>Implies <literal>IOAccounting=true</literal>.</para>
 
-          <para>This setting is supported only if the unified control group hierarchy is used. Use
-          <varname>BlockIOAccounting=</varname> on systems using the legacy control group hierarchy.</para>
+          <para>These settings replace <varname>BlockIOReadBandwidth=</varname> and
+          <varname>BlockIOWriteBandwidth=</varname> and disable settings prefixed with <varname>BlockIO</varname> or
+          <varname>StartupBlockIO</varname>.</para>
         </listitem>
       </varlistentry>
 
 
           <para>Implies <literal>IOAccounting=true</literal>.</para>
 
-          <para>This setting is supported only if the unified control group hierarchy is used.</para>
-        </listitem>
-      </varlistentry>
-
-      <varlistentry>
-        <term><varname>BlockIOAccounting=</varname></term>
-
-        <listitem>
-          <para>Turn on Block I/O accounting for this unit, if the legacy control group hierarchy is used on the
-          system. Takes a boolean argument. Note that turning on block I/O accounting for one unit will also implicitly
-          turn it on for all units contained in the same slice and all for its parent slices and the units contained
-          therein. The system default for this setting may be controlled with
-          <varname>DefaultBlockIOAccounting=</varname> in
-          <citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
-
-          <para>This setting is supported only if the legacy control group hierarchy is used. Use
-          <varname>IOAccounting=</varname> on systems using the unified control group hierarchy.</para>
-        </listitem>
-      </varlistentry>
-
-      <varlistentry>
-        <term><varname>BlockIOWeight=<replaceable>weight</replaceable></varname></term>
-        <term><varname>StartupBlockIOWeight=<replaceable>weight</replaceable></varname></term>
-
-        <listitem><para>Set the default overall block I/O weight for the executed processes, if the legacy control
-        group hierarchy is used on the system. Takes a single weight value (between 10 and 1000) to set the default
-        block I/O weight. This controls the <literal>blkio.weight</literal> control group attribute, which defaults to
-        500. For details about this control group attribute, see <ulink
-        url="https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt">blkio-controller.txt</ulink>.
-        The available I/O bandwidth is split up among all units within one slice relative to their block I/O
-        weight.</para>
-
-        <para>While <varname>StartupBlockIOWeight=</varname> only
-        applies to the startup phase of the system,
-        <varname>BlockIOWeight=</varname> applies to the later runtime
-        of the system, and if the former is not set also to the
-        startup phase. This allows prioritizing specific services at
-        boot-up differently than during runtime.</para>
-
-        <para>Implies
-        <literal>BlockIOAccounting=true</literal>.</para>
-
-        <para>This setting is supported only if the legacy control group hierarchy is used. Use
-        <varname>IOWeight=</varname> and <varname>StartupIOWeight=</varname> on systems using the unified control group
-        hierarchy.</para>
-
-      </listitem>
-      </varlistentry>
-
-      <varlistentry>
-        <term><varname>BlockIODeviceWeight=<replaceable>device</replaceable> <replaceable>weight</replaceable></varname></term>
-
-        <listitem>
-          <para>Set the per-device overall block I/O weight for the executed processes, if the legacy control group
-          hierarchy is used on the system. Takes a space-separated pair of a file path and a weight value to specify
-          the device specific weight value, between 10 and 1000. (Example: "/dev/sda 500"). The file path may be
-          specified as path to a block device node or as any other file, in which case the backing block device of the
-          file system of the file is determined. This controls the <literal>blkio.weight_device</literal> control group
-          attribute, which defaults to 1000. Use this option multiple times to set weights for multiple devices. For
-          details about this control group attribute, see <ulink
-          url="https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt">blkio-controller.txt</ulink>.</para>
-
-          <para>Implies
-          <literal>BlockIOAccounting=true</literal>.</para>
-
-          <para>This setting is supported only if the legacy control group hierarchy is used. Use
-          <varname>IODeviceWeight=</varname> on systems using the unified control group hierarchy.</para>
-        </listitem>
-      </varlistentry>
-
-      <varlistentry>
-        <term><varname>BlockIOReadBandwidth=<replaceable>device</replaceable> <replaceable>bytes</replaceable></varname></term>
-        <term><varname>BlockIOWriteBandwidth=<replaceable>device</replaceable> <replaceable>bytes</replaceable></varname></term>
-
-        <listitem>
-          <para>Set the per-device overall block I/O bandwidth limit for the executed processes, if the legacy control
-          group hierarchy is used on the system. Takes a space-separated pair of a file path and a bandwidth value (in
-          bytes per second) to specify the device specific bandwidth. The file path may be a path to a block device
-          node, or as any other file in which case the backing block device of the file system of the file is used. If
-          the bandwidth is suffixed with K, M, G, or T, the specified bandwidth is parsed as Kilobytes, Megabytes,
-          Gigabytes, or Terabytes, respectively, to the base of 1000. (Example:
-          "/dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0 5M"). This controls the
-          <literal>blkio.throttle.read_bps_device</literal> and <literal>blkio.throttle.write_bps_device</literal>
-          control group attributes. Use this option multiple times to set bandwidth limits for multiple devices. For
-          details about these control group attributes, see <ulink
-          url="https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt">blkio-controller.txt</ulink>.
-          </para>
-
-          <para>Implies
-          <literal>BlockIOAccounting=true</literal>.</para>
-
-          <para>This setting is supported only if the legacy control group hierarchy is used. Use
-          <varname>IOReadBandwidthMax=</varname> and <varname>IOWriteBandwidthMax=</varname> on systems using the
-          unified control group hierarchy.</para>
+          <para>These settings are supported only if the unified control group hierarchy is used and disable settings
+          prefixed with <varname>BlockIO</varname> or <varname>StartupBlockIO</varname>.</para>
         </listitem>
       </varlistentry>
 
   </refsect1>
 
   <refsect1>
+    <title>Deprecated Options</title>
+
+    <para>The following options are deprecated. Use the indicated superseding options instead:</para>
+
+    <variablelist class='unit-directives'>
+
+      <varlistentry>
+        <term><varname>CPUShares=<replaceable>weight</replaceable></varname></term>
+        <term><varname>StartupCPUShares=<replaceable>weight</replaceable></varname></term>
+
+        <listitem>
+          <para>Assign the specified CPU time share weight to the processes executed. These options take an integer
+          value and control the <literal>cpu.shares</literal> control group attribute. The allowed range is 2 to
+          262144. Defaults to 1024. For details about this control group attribute, see <ulink
+          url="https://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt">sched-design-CFS.txt</ulink>.
+          The available CPU time is split up among all units within one slice relative to their CPU time share
+          weight.</para>
+
+          <para>While <varname>StartupCPUShares=</varname> only applies to the startup phase of the system,
+          <varname>CPUShares=</varname> applies to normal runtime of the system, and if the former is not set also to
+          the startup phase. Using <varname>StartupCPUShares=</varname> allows prioritizing specific services at
+          boot-up differently than during normal runtime.</para>
+
+          <para>Implies <literal>CPUAccounting=true</literal>.</para>
+
+          <para>These settings are deprecated. Use <varname>CPUWeight=</varname> and
+          <varname>StartupCPUWeight=</varname> instead.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>MemoryLimit=<replaceable>bytes</replaceable></varname></term>
+
+        <listitem>
+          <para>Specify the limit on maximum memory usage of the executed processes. The limit specifies how much
+          process and kernel memory can be used by tasks in this unit. Takes a memory size in bytes. If the value is
+          suffixed with K, M, G or T, the specified memory size is parsed as Kilobytes, Megabytes, Gigabytes, or
+          Terabytes (with the base 1024), respectively. Alternatively, a percentage value may be specified, which is
+          taken relative to the installed physical memory on the system. If assigned the special value
+          <literal>infinity</literal>, no memory limit is applied. This controls the
+          <literal>memory.limit_in_bytes</literal> control group attribute. For details about this control group
+          attribute, see <ulink
+          url="https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt">memory.txt</ulink>.</para>
+
+          <para>Implies <literal>MemoryAccounting=true</literal>.</para>
+
+          <para>This setting is deprecated. Use <varname>MemoryMax=</varname> instead.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>BlockIOAccounting=</varname></term>
+
+        <listitem>
+          <para>Turn on Block I/O accounting for this unit, if the legacy control group hierarchy is used on the
+          system. Takes a boolean argument. Note that turning on block I/O accounting for one unit will also implicitly
+          turn it on for all units contained in the same slice and all for its parent slices and the units contained
+          therein. The system default for this setting may be controlled with
+          <varname>DefaultBlockIOAccounting=</varname> in
+          <citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
+
+          <para>This setting is deprecated. Use <varname>IOAccounting=</varname> instead.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>BlockIOWeight=<replaceable>weight</replaceable></varname></term>
+        <term><varname>StartupBlockIOWeight=<replaceable>weight</replaceable></varname></term>
+
+        <listitem><para>Set the default overall block I/O weight for the executed processes, if the legacy control
+        group hierarchy is used on the system. Takes a single weight value (between 10 and 1000) to set the default
+        block I/O weight. This controls the <literal>blkio.weight</literal> control group attribute, which defaults to
+        500. For details about this control group attribute, see <ulink
+        url="https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt">blkio-controller.txt</ulink>.
+        The available I/O bandwidth is split up among all units within one slice relative to their block I/O
+        weight.</para>
+
+        <para>While <varname>StartupBlockIOWeight=</varname> only
+        applies to the startup phase of the system,
+        <varname>BlockIOWeight=</varname> applies to the later runtime
+        of the system, and if the former is not set also to the
+        startup phase. This allows prioritizing specific services at
+        boot-up differently than during runtime.</para>
+
+        <para>Implies
+        <literal>BlockIOAccounting=true</literal>.</para>
+
+        <para>These settings are deprecated. Use <varname>IOWeight=</varname> and <varname>StartupIOWeight=</varname>
+        instead.</para>
+
+      </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>BlockIODeviceWeight=<replaceable>device</replaceable> <replaceable>weight</replaceable></varname></term>
+
+        <listitem>
+          <para>Set the per-device overall block I/O weight for the executed processes, if the legacy control group
+          hierarchy is used on the system. Takes a space-separated pair of a file path and a weight value to specify
+          the device specific weight value, between 10 and 1000. (Example: "/dev/sda 500"). The file path may be
+          specified as path to a block device node or as any other file, in which case the backing block device of the
+          file system of the file is determined. This controls the <literal>blkio.weight_device</literal> control group
+          attribute, which defaults to 1000. Use this option multiple times to set weights for multiple devices. For
+          details about this control group attribute, see <ulink
+          url="https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt">blkio-controller.txt</ulink>.</para>
+
+          <para>Implies
+          <literal>BlockIOAccounting=true</literal>.</para>
+
+          <para>This setting is deprecated. Use <varname>IODeviceWeight=</varname> instead.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>BlockIOReadBandwidth=<replaceable>device</replaceable> <replaceable>bytes</replaceable></varname></term>
+        <term><varname>BlockIOWriteBandwidth=<replaceable>device</replaceable> <replaceable>bytes</replaceable></varname></term>
+
+        <listitem>
+          <para>Set the per-device overall block I/O bandwidth limit for the executed processes, if the legacy control
+          group hierarchy is used on the system. Takes a space-separated pair of a file path and a bandwidth value (in
+          bytes per second) to specify the device specific bandwidth. The file path may be a path to a block device
+          node, or as any other file in which case the backing block device of the file system of the file is used. If
+          the bandwidth is suffixed with K, M, G, or T, the specified bandwidth is parsed as Kilobytes, Megabytes,
+          Gigabytes, or Terabytes, respectively, to the base of 1000. (Example:
+          "/dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0 5M"). This controls the
+          <literal>blkio.throttle.read_bps_device</literal> and <literal>blkio.throttle.write_bps_device</literal>
+          control group attributes. Use this option multiple times to set bandwidth limits for multiple devices. For
+          details about these control group attributes, see <ulink
+          url="https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt">blkio-controller.txt</ulink>.
+          </para>
+
+          <para>Implies
+          <literal>BlockIOAccounting=true</literal>.</para>
+
+          <para>These settings are deprecated. Use <varname>IOReadBandwidthMax=</varname> and
+          <varname>IOWriteBandwidthMax=</varname> instead.</para>
+        </listitem>
+      </varlistentry>
+
+    </variablelist>
+  </refsect1>
+
+  <refsect1>
     <title>See Also</title>
     <para>
       <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.swap</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
+      <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.directives</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemd.special</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
       The documentation for control groups and specific controllers in the Linux kernel:
index f69b2ef..36f24d4 100644 (file)
@@ -69,7 +69,7 @@
     command line.</para>
 
     <para>See the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/ControlGroupInterface/">New
+    url="https://www.freedesktop.org/wiki/Software/systemd/ControlGroupInterface/">New
     Control Group Interfaces</ulink> for an introduction on how to make
     use of scope units from programs.</para>
   </refsect1>
index d3bf796..0ca5ea7 100644 (file)
@@ -84,7 +84,7 @@
     This is useful for compatibility with SysV. Note that this
     compatibility is quite comprehensive but not 100%. For details
     about the incompatibilities, see the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/Incompatibilities">Incompatibilities
+    url="https://www.freedesktop.org/wiki/Software/systemd/Incompatibilities">Incompatibilities
     with SysV</ulink> document.</para>
   </refsect1>
 
     <varname>After=</varname> on
     <filename>dbus.socket</filename>.</para>
 
-    <para>Socket activated service are automatically ordered after
-    their activated <filename>.socket</filename> units via an
-    automatic <varname>After=</varname> dependency.</para>
+    <para>Socket activated services are automatically ordered after
+    their activating <filename>.socket</filename> units via an
+    automatic <varname>After=</varname> dependency.
+    Services also pull in all <filename>.socket</filename> units
+    listed in <varname>Sockets=</varname> via automatic
+    <varname>Wants=</varname> and <varname>After=</varname> dependencies.</para>
 
     <para>Unless <varname>DefaultDependencies=</varname> in the <literal>[Unit]</literal> is set to
     <option>false</option>, service units will implicitly have dependencies of type <varname>Requires=</varname> and
     process it supervises. A number of options that may be used in
     this section are shared with other unit types. These options are
     documented in
-    <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+    <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
+    <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
     and
-    <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+    <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
     The options specific to the <literal>[Service]</literal> section
     of service units are the following:</para>
 
         process has to exit before systemd starts follow-up units.
         <varname>RemainAfterExit=</varname> is particularly useful for
         this type of service. This is the implied default if neither
-        <varname>Type=</varname> or <varname>ExecStart=</varname> are
+        <varname>Type=</varname> nor <varname>ExecStart=</varname> are
         specified.</para>
 
         <para>Behavior of <option>dbus</option> is similar to
         if used in combination with
         <varname>PrivateNetwork=</varname><option>yes</option>.</para>
 
-        <para>Behavior of <option>idle</option> is very similar to
-        <option>simple</option>; however, actual execution of the
-        service binary is delayed until all jobs are dispatched. This
-        may be used to avoid interleaving of output of shell services
-        with the status output on the console.</para>
+        <para>Behavior of <option>idle</option> is very similar to <option>simple</option>; however, actual execution
+        of the service binary is delayed until all active jobs are dispatched. This may be used to avoid interleaving
+        of output of shell services with the status output on the console. Note that this type is useful only to
+        improve console output, it is not useful as a general unit ordering tool, and the effect of this service type
+        is subject to a 5s time-out, after which the service binary is invoked anyway.</para>
         </listitem>
       </varlistentry>
 
         below (see section "Command Lines" below).
         </para>
 
-        <para>When <varname>Type=</varname> is not
-        <option>oneshot</option>, only one command may and must be
-        given. When <varname>Type=oneshot</varname> is used, zero or
-        more commands may be specified. This can be specified by
-        providing multiple command lines in the same directive, or
-        alternatively, this directive may be specified more than once
-        with the same effect. If the empty string is assigned to this
-        option, the list of commands to start is reset, prior
-        assignments of this option will have no effect. If no
-        <varname>ExecStart=</varname> is specified, then the service
-        must have <varname>RemainAfterExit=yes</varname> set.</para>
+        <para>Unless <varname>Type=</varname> is <option>oneshot</option>, exactly one command must be given. When
+        <varname>Type=oneshot</varname> is used, zero or more commands may be specified. Commands may be specified by
+        providing multiple command lines in the same directive, or alternatively, this directive may be specified more
+        than once with the same effect. If the empty string is assigned to this option, the list of commands to start
+        is reset, prior assignments of this option will have no effect. If no <varname>ExecStart=</varname> is
+        specified, then the service must have <varname>RemainAfterExit=yes</varname> and at least one
+        <varname>ExecStop=</varname> line set. (Services lacking both <varname>ExecStart=</varname> and
+        <varname>ExecStop=</varname> are not valid.)</para>
 
         <para>For each of the specified commands, the first argument must be an absolute path to an
         executable. Optionally, if this file name is prefixed with <literal>@</literal>, the second token will be
         the absolute filename is prefixed with <literal>-</literal>, an exit code of the command normally considered a
         failure (i.e. non-zero exit status or abnormal exit due to signal) is ignored and considered success.  If the
         absolute path is prefixed with <literal>+</literal> then it is executed with full
-        privileges. <literal>-</literal>, <literal>@</literal>, and <literal>+</literal> may be used together and they
+        privileges. <literal>@</literal>, <literal>-</literal>, and <literal>+</literal> may be used together and they
         can appear in any order.</para>
 
         <para>If more than one command is specified, the commands are
         all <varname>ExecStartPre=</varname> commands that were not prefixed
         with a <literal>-</literal> exit successfully.</para>
 
-        <para><varname>ExecStartPost=</varname> commands are only run after
-        the service has started successfully, as determined by <varname>Type=</varname>
-        (i.e. the process has been started for <varname>Type=simple</varname>
-        or <varname>Type=idle</varname>, the process exits successfully for
-        <varname>Type=oneshot</varname>, the initial process exits successfully
-        for <varname>Type=forking</varname>, <literal>READY=1</literal> is sent
-        for <varname>Type=notify</varname>, or the <varname>BusName=</varname>
-        has been taken for <varname>Type=dbus</varname>).</para>
+        <para><varname>ExecStartPost=</varname> commands are only run after the commands specified in
+        <varname>ExecStart=</varname> have been invoked successfully, as determined by <varname>Type=</varname>
+        (i.e. the process has been started for <varname>Type=simple</varname> or <varname>Type=idle</varname>, the last
+        <varname>ExecStart=</varname> process exited successfully for <varname>Type=oneshot</varname>, the initial
+        process exited successfully for <varname>Type=forking</varname>, <literal>READY=1</literal> is sent for
+        <varname>Type=notify</varname>, or the <varname>BusName=</varname> has been taken for
+        <varname>Type=dbus</varname>).</para>
 
         <para>Note that <varname>ExecStartPre=</varname> may not be
         used to start long-running processes. All processes forked
         multiple command lines, following the same scheme as described
         for <varname>ExecStart=</varname> above. Use of this setting
         is optional. After the commands configured in this option are
-        run, all processes remaining for a service are terminated
+        run, it is implied that the service is stopped, and any processes
+        remaining for it are terminated
         according to the <varname>KillMode=</varname> setting (see
         <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>).
         If this option is not specified, the process is terminated by
         variable substitution is supported (including
         <varname>$MAINPID</varname>, see above).</para>
 
-        <para>Note that it is usually not sufficient to specify a
-        command for this setting that only asks the service to
-        terminate (for example, by queuing some form of termination
-        signal for it), but does not wait for it to do so. Since the
-        remaining processes of the services are killed using
-        <constant>SIGKILL</constant> immediately after the command
-        exited, this would not result in a clean stop. The specified
-        command should hence be a synchronous operation, not an
-        asynchronous one.</para>
+        <para>Note that it is usually not sufficient to specify a command for this setting that only asks the service
+        to terminate (for example, by queuing some form of termination signal for it), but does not wait for it to do
+        so. Since the remaining processes of the services are killed according to <varname>KillMode=</varname> and
+        <varname>KillSignal=</varname> as described above immediately after the command exited, this may not result in
+        a clean stop. The specified command should hence be a synchronous operation, not an asynchronous one.</para>
 
         <para>Note that the commands specified in <varname>ExecStop=</varname> are only executed when the service
         started successfully first. They are not invoked if the service was never started at all, or in case its
         service failed to start up correctly. Commands configured with this setting need to be able to operate even if
         the service failed starting up half-way and left incompletely initialized data around. As the service's
         processes have been terminated already when the commands specified with this setting are executed they should
-        not attempt to communicate with them.</para></listitem>
+        not attempt to communicate with them.</para>
+
+        <para>Note that all commands that are configured with this setting are invoked with the result code of the
+        service, as well as the main process' exit code and status, set in the <varname>$SERVICE_RESULT</varname>,
+        <varname>$EXIT_CODE</varname> and <varname>$EXIT_STATUS</varname> environment variables, see
+        <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry> for
+        details.</para></listitem>
       </varlistentry>
 
       <varlistentry>
 
         <para>As exceptions to the setting above, the service will not
         be restarted if the exit code or signal is specified in
-        <varname>RestartPreventExitStatus=</varname> (see below).
-        Also, the services will always be restarted if the exit code
-        or signal is specified in
+        <varname>RestartPreventExitStatus=</varname> (see below) or
+        the service is stopped with <command>systemctl stop</command>
+        or an equivalent operation. Also, the services will always be
+        restarted if the exit code or signal is specified in
         <varname>RestartForceExitStatus=</varname> (see below).</para>
 
+        <para>Note that service restart is subject to unit start rate
+        limiting configured with <varname>StartLimitIntervalSec=</varname>
+        and <varname>StartLimitBurst=</varname>, see
+        <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+        for details.</para>
+
         <para>Setting this to <option>on-failure</option> is the
         recommended choice for long-running services, in order to
         increase reliability by attempting automatic recovery from
 
       <varlistentry>
         <term><varname>NonBlocking=</varname></term>
-        <listitem><para>Set the <constant>O_NONBLOCK</constant> flag
-        for all file descriptors passed via socket-based activation.
-        If true, all file descriptors >= 3 (i.e. all except stdin,
-        stdout, and stderr) will have the
-        <constant>O_NONBLOCK</constant> flag set and hence are in
-        non-blocking mode. This option is only useful in conjunction
-        with a socket unit, as described in
-        <citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
-        Defaults to false.</para></listitem>
+        <listitem><para>Set the <constant>O_NONBLOCK</constant> flag for all file descriptors passed via socket-based
+        activation. If true, all file descriptors >= 3 (i.e. all except stdin, stdout, stderr), excluding those passed
+        in via the file descriptor storage logic (see <varname>FileDescriptorStoreMax=</varname> for details), will
+        have the <constant>O_NONBLOCK</constant> flag set and hence are in non-blocking mode. This option is only
+        useful in conjunction with a socket unit, as described in
+        <citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry> and has no
+        effect on file descriptors which were previously saved in the file-descriptor store for example.  Defaults to
+        false.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>NotifyAccess=</varname></term>
-        <listitem><para>Controls access to the service status
-        notification socket, as accessible via the
-        <citerefentry><refentrytitle>sd_notify</refentrytitle><manvolnum>3</manvolnum></citerefentry>
-        call. Takes one of <option>none</option> (the default),
-        <option>main</option> or <option>all</option>. If
-        <option>none</option>, no daemon status updates are accepted
-        from the service processes, all status update messages are
-        ignored. If <option>main</option>, only service updates sent
-        from the main process of the service are accepted. If
-        <option>all</option>, all services updates from all members of
-        the service's control group are accepted. This option should
-        be set to open access to the notification socket when using
-        <varname>Type=notify</varname> or
-        <varname>WatchdogSec=</varname> (see above). If those options
-        are used but <varname>NotifyAccess=</varname> is not
-        configured, it will be implicitly set to
-        <option>main</option>.</para></listitem>
+        <listitem><para>Controls access to the service status notification socket, as accessible via the
+        <citerefentry><refentrytitle>sd_notify</refentrytitle><manvolnum>3</manvolnum></citerefentry> call. Takes one
+        of <option>none</option> (the default), <option>main</option>, <option>exec</option> or
+        <option>all</option>. If <option>none</option>, no daemon status updates are accepted from the service
+        processes, all status update messages are ignored. If <option>main</option>, only service updates sent from the
+        main process of the service are accepted. If <option>exec</option>, only service updates sent from any of the
+        main or control processes originating from one of the <varname>Exec*=</varname> commands are accepted. If
+        <option>all</option>, all services updates from all members of the service's control group are accepted. This
+        option should be set to open access to the notification socket when using <varname>Type=notify</varname> or
+        <varname>WatchdogSec=</varname> (see above). If those options are used but <varname>NotifyAccess=</varname> is
+        not configured, it will be implicitly set to <option>main</option>.</para>
+
+        <para>Note that <function>sd_notify()</function> notifications may be attributed to units correctly only if
+        either the sending process is still around at the time PID 1 processes the message, or if the sending process
+        is explicitly runtime-tracked by the service manager. The latter is the case if the service manager originally
+        forked off the process, i.e. on all processes that match <option>main</option> or
+        <option>exec</option>. Conversely, if an auxiliary process of the unit sends an
+        <function>sd_notify()</function> message and immediately exits, the service manager might not be able to
+        properly attribute the message to the unit, and thus will ignore it, even if
+        <varname>NotifyAccess=</varname><option>all</option> is set for it.</para></listitem>
       </varlistentry>
 
       <varlistentry>
 
       <varlistentry>
         <term><varname>FileDescriptorStoreMax=</varname></term>
-        <listitem><para>Configure how many file descriptors may be
-        stored in the service manager for the service using
+        <listitem><para>Configure how many file descriptors may be stored in the service manager for the service using
         <citerefentry><refentrytitle>sd_pid_notify_with_fds</refentrytitle><manvolnum>3</manvolnum></citerefentry>'s
-        <literal>FDSTORE=1</literal> messages. This is useful for
-        implementing service restart schemes where the state is
-        serialized to <filename>/run</filename> and the file
-        descriptors passed to the service manager, to allow restarts
-        without losing state. Defaults to 0, i.e. no file descriptors
-        may be stored in the service manager by default. All file
-        descriptors passed to the service manager from a specific
-        service are passed back to the service's main process on the
-        next service restart. Any file descriptors passed to the
-        service manager are automatically closed when POLLHUP or
-        POLLERR is seen on them, or when the service is fully stopped
-        and no job queued or being executed for it.</para></listitem>
+        <literal>FDSTORE=1</literal> messages. This is useful for implementing services that can restart after an
+        explicit request or a crash without losing state. Any open sockets and other file descriptors which should not
+        be closed during the restart may be stored this way. Application state can either be serialized to a file in
+        <filename>/run</filename>, or better, stored in a
+        <citerefentry><refentrytitle>memfd_create</refentrytitle><manvolnum>2</manvolnum></citerefentry> memory file
+        descriptor. Defaults to 0, i.e. no file descriptors may be stored in the service manager. All file descriptors
+        passed to the service manager from a specific service are passed back to the service's main process on the next
+        service restart. Any file descriptors passed to the service manager are automatically closed when
+        <constant>POLLHUP</constant> or <constant>POLLERR</constant> is seen on them, or when the service is fully
+        stopped and no job is queued or being executed for it.</para></listitem>
       </varlistentry>
 
       <varlistentry>
     must be passed as separate words). Lone semicolons may be escaped
     as <literal>\;</literal>.</para>
 
-    <para>Each command line is split on whitespace, with the first
-    item being the command to execute, and the subsequent items being
-    the arguments. Double quotes ("...") and single quotes ('...') may
-    be used, in which case everything until the next matching quote
-    becomes part of the same argument. C-style escapes are also
-    supported. The table below contains the list of allowed escape
-    patterns. Only patterns which match the syntax in the table are
-    allowed; others will result in an error, and must be escaped by
-    doubling the backslash. Quotes themselves are removed after
-    parsing and escape sequences substituted. In addition, a trailing
-    backslash (<literal>\</literal>) may be used to merge lines.
-    </para>
-
-    <para>This syntax is intended to be very similar to shell syntax,
-    but only the meta-characters and expansions described in the
-    following paragraphs are understood. Specifically, redirection
-    using
+    <para>Each command line is split on whitespace, with the first item being the command to
+    execute, and the subsequent items being the arguments. Double quotes ("…") and single quotes
+    ('…') may be used to wrap a whole item (the opening quote may appear only at the beginning or
+    after whitespace that is not quoted, and the closing quote must be followed by whitespace or the
+    end of line), in which case everything until the next matching quote becomes part of the same
+    argument. Quotes themselves are removed. C-style escapes are also supported. The table below
+    contains the list of known escape patterns. Only escape patterns which match the syntax in the
+    table are allowed; other patterns may be added in the future and unknown patterns will result in
+    a warning. In particular, any backslashes should be doubled. Finally, a trailing backslash
+    (<literal>\</literal>) may be used to merge lines.</para>
+
+    <para>This syntax is inspired by shell syntax, but only the meta-characters and expansions
+    described in the following paragraphs are understood, and the expansion of variables is
+    different. Specifically, redirection using
     <literal>&lt;</literal>,
     <literal>&lt;&lt;</literal>,
     <literal>&gt;</literal>, and
index eee98d9..3ff3cc5 100644 (file)
@@ -97,7 +97,7 @@
     </para>
 
     <para>See the <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/ControlGroupInterface/">New
+    url="https://www.freedesktop.org/wiki/Software/systemd/ControlGroupInterface/">New
     Control Group Interfaces</ulink> for an introduction on how to make
     use of slice units from programs.</para>
   </refsect1>
index af002c7..1d20a8f 100644 (file)
         <varname>BindIPv6Only=</varname> setting (see below).
         </para>
 
+        <para>If the address string is a string in the format
+        <literal>vsock:x:y</literal>, it is read as CID <literal>x</literal> on
+        a port <literal>y</literal> address in the
+        <constant>AF_VSOCK</constant> family.  The CID is a unique 32-bit
+        integer identifier in <constant>AF_VSOCK</constant> analogous to an IP
+        address.  Specifying the CID is optional, and may be set to the empty
+        string.</para>
+
         <para>Note that <constant>SOCK_SEQPACKET</constant> (i.e.
         <varname>ListenSequentialPacket=</varname>) is only available
         for <constant>AF_UNIX</constant> sockets.
       </varlistentry>
 
       <varlistentry>
+        <term><varname>MaxConnectionsPerSource=</varname></term>
+        <listitem><para>The maximum number of connections for a service per source IP address.
+        This is very similar to the <varname>MaxConnections=</varname> directive
+        above. Disabled by default.</para>
+        </listitem>
+      </varlistentry>
+
+       <varlistentry>
         <term><varname>KeepAlive=</varname></term>
         <listitem><para>Takes a boolean argument. If true, the TCP/IP
         stack will send a keep alive message after 2h (depending on
         and the kernel will ignore initial ACK packets without any
         data. The argument specifies the approximate amount of time
         the kernel should wait for incoming data before falling back
-        to the normal behavior of honouring empty ACK packets. This
+        to the normal behavior of honoring empty ACK packets. This
         option is beneficial for protocols where the client sends the
         data first (e.g. HTTP, in contrast to SMTP), because the
         server process will not be woken up unnecessarily before it
index 18ad8f9..66c45e3 100644 (file)
     <refpurpose>Special systemd units</refpurpose>
   </refnamediv>
 
-  <refsynopsisdiv>
-    <para><filename>basic.target</filename>,
+  <refsynopsisdiv><para>
+    <!-- sort alphabetically, targets first -->
+    <filename>basic.target</filename>,
     <filename>bluetooth.target</filename>,
-    <filename>ctrl-alt-del.target</filename>,
-    <filename>cryptsetup.target</filename>,
     <filename>cryptsetup-pre.target</filename>,
-    <filename>dbus.service</filename>,
-    <filename>dbus.socket</filename>,
+    <filename>cryptsetup.target</filename>,
+    <filename>ctrl-alt-del.target</filename>,
     <filename>default.target</filename>,
-    <filename>display-manager.service</filename>,
     <filename>emergency.target</filename>,
     <filename>exit.target</filename>,
     <filename>final.target</filename>,
     <filename>hibernate.target</filename>,
     <filename>hybrid-sleep.target</filename>,
     <filename>initrd-fs.target</filename>,
+    <filename>initrd-root-device.target</filename>,
+    <filename>initrd-root-fs.target</filename>,
     <filename>kbrequest.target</filename>,
     <filename>kexec.target</filename>,
-    <filename>local-fs.target</filename>,
     <filename>local-fs-pre.target</filename>,
+    <filename>local-fs.target</filename>,
+    <filename>machines.target</filename>
     <filename>multi-user.target</filename>,
-    <filename>network.target</filename>,
     <filename>network-online.target</filename>,
     <filename>network-pre.target</filename>,
+    <filename>network.target</filename>,
     <filename>nss-lookup.target</filename>,
     <filename>nss-user-lookup.target</filename>,
     <filename>paths.target</filename>,
     <filename>poweroff.target</filename>,
     <filename>printer.target</filename>,
     <filename>reboot.target</filename>,
-    <filename>remote-fs.target</filename>,
     <filename>remote-fs-pre.target</filename>,
+    <filename>remote-fs.target</filename>,
     <filename>rescue.target</filename>,
-    <filename>initrd-root-device.target</filename>,
-    <filename>initrd-root-fs.target</filename>,
     <filename>rpcbind.target</filename>,
     <filename>runlevel2.target</filename>,
     <filename>runlevel3.target</filename>,
     <filename>time-sync.target</filename>,
     <filename>timers.target</filename>,
     <filename>umount.target</filename>,
+    <!-- slices -->
     <filename>-.slice</filename>,
     <filename>system.slice</filename>,
     <filename>user.slice</filename>,
-    <filename>machine.slice</filename></para>
-  </refsynopsisdiv>
+    <filename>machine.slice</filename>,
+    <!-- the rest -->
+    <filename>dbus.service</filename>,
+    <filename>dbus.socket</filename>,
+    <filename>display-manager.service</filename>,
+    <filename>system-update-cleanup.service</filename>
+  </para></refsynopsisdiv>
 
   <refsect1>
     <title>Description</title>
 
-    <para>A few units are treated specially by systemd. They have
-    special internal semantics and cannot be renamed.</para>
+    <para>A few units are treated specially by systemd. Many of them have
+    special internal semantics and cannot be renamed, while others simply
+    have a standard meaning and should be present on all systems.</para>
   </refsect1>
 
   <refsect1>
         </listitem>
       </varlistentry>
       <varlistentry>
+        <term><filename>machines.target</filename></term>
+        <listitem>
+          <para>A standard target unit for starting all the containers
+          and other virtual machines. See <filename>systemd-nspawn@.service</filename>
+          for an example.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
         <term><filename>multi-user.target</filename></term>
         <listitem>
           <para>A special target unit for setting up a multi-user
           is part of the boot of most systems, while
           <filename>network-online.target</filename> is not, except
           when at least one unit requires it. Also see <ulink
-          url="http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget">Running
+          url="https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget">Running
           Services After the Network is up</ulink> for more
           information.</para>
 
           on. All userspace log messages will be made available on
           this socket. For more information about syslog integration,
           please consult the <ulink
-          url="http://www.freedesktop.org/wiki/Software/systemd/syslog">Syslog
+          url="https://www.freedesktop.org/wiki/Software/systemd/syslog">Syslog
           Interface</ulink> document.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
         <term><filename>system-update.target</filename></term>
+        <term><filename>system-update-cleanup.service</filename></term>
         <listitem>
-          <para>A special target unit that is used for off-line system
-          updates.
+          <para>A special target unit that is used for offline system updates.
           <citerefentry><refentrytitle>systemd-system-update-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>
-          will redirect the boot process to this target if
-          <filename>/system-update</filename> exists. For more
-          information see the <ulink
-          url="http://freedesktop.org/wiki/Software/systemd/SystemUpdates">System
-          Updates Specification</ulink>.</para>
+          will redirect the boot process to this target if <filename>/system-update</filename>
+          exists. For more information see
+          <citerefentry><refentrytitle>systemd.offline-updates</refentrytitle><manvolnum>7</manvolnum></citerefentry>.
+          </para>
+
+          <para>Updates should happen before the <filename>system-update.target</filename> is
+          reached, and the services which implement them should cause the machine to reboot. As
+          a safety measure, if this does not happen, and <filename>/system-update</filename>
+          still exists after <filename>system-update.target</filename> is reached,
+          <filename>system-update-cleanup.service</filename> will remove this symlink and
+          reboot the machine.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
           is shut down. It is hence useful when writing service files
           that require network access on shutdown, which should order
           themselves after this target, but not pull it in. Also see
-          <ulink url="http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget">Running
+          <ulink url="https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget">Running
           Services After the Network is up</ulink> for more
           information. Also see
           <filename>network-online.target</filename> described
   </refsect1>
 
   <refsect1>
+    <title>Special Passive User Units</title>
+
+    <variablelist>
+      <varlistentry>
+        <term><filename>graphical-session.target</filename></term>
+        <listitem>
+          <para>This target is active whenever any graphical session is running. It is used to stop user services which
+          only apply to a graphical (X, Wayland, etc.) session when the session is terminated. Such services should
+          have <literal>PartOf=graphical-session.target</literal> in their <literal>[Unit]</literal> section. A target
+          for a particular session (e. g.  <filename>gnome-session.target</filename>) starts and stops
+          <literal>graphical-session.target</literal> with <literal>BindsTo=graphical-session.target</literal>.</para>
+
+          <para>Which services are started by a session target is determined by the <literal>Wants=</literal> and
+          <literal>Requires=</literal> dependencies.  For services that can be enabled independently, symlinks in
+          <literal>.wants/</literal> and <literal>.requires/</literal> should be used, see
+          <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>.  Those
+          symlinks should either be shipped in packages, or should be added dynamically after installation, for example
+          using <literal>systemctl add-wants</literal>, see
+          <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>.
+          </para>
+
+          <example>
+            <title>Nautilus as part of a GNOME session</title>
+
+            <para><literal>gnome-session.target</literal> pulls in Nautilus as top-level service:</para>
+
+            <programlisting>[Unit]
+Description=User systemd services for GNOME graphical session
+Wants=nautilus.service
+BindsTo=graphical-session.target</programlisting>
+
+            <para><literal>nautilus.service</literal> gets stopped when the session stops:</para>
+
+            <programlisting>[Unit]
+Description=Render the desktop icons with Nautilus
+PartOf=graphical-session.target
+
+[Service]
+…</programlisting>
+          </example>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><filename>graphical-session-pre.target</filename></term>
+        <listitem>
+          <para>This target contains services which set up the environment or global configuration of a graphical
+          session, such as SSH/GPG agents (which need to export an environment variable into all desktop processes) or
+          migration of obsolete d-conf keys after an OS upgrade (which needs to happen before starting any process that
+          might use them). This target must be started before starting a graphical session like
+          <filename>gnome-session.target</filename>.</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+
+  </refsect1>
+
+  <refsect1>
     <title>Special Slice Units</title>
 
     <para>There are four <literal>.slice</literal> units which form
index cf4e1ba..184abff 100644 (file)
     dependencies on the device units or the mount units of the files
     they are activated from.</para>
 
-    <para>Swap units with <varname>DefaultDependencies=</varname> in the <literal>[Unit]</literal> section enabled
-    implicitly acquire a <varname>Conflicts=</varname> and an <varname>After=</varname> dependency on
-    <filename>umount.target</filename> so that they are deactivated at shutdown, unless
-    <varname>DefaultDependencies=no</varname> is specified.</para>
+    <para>Swap units with <varname>DefaultDependencies=</varname> set to its default <option>yes</option> value in the
+    <literal>[Unit]</literal> section enabled implicitly acquire a <varname>Conflicts=</varname> and a
+    <varname>Before=</varname> dependency on <filename>umount.target</filename> so that they are deactivated at
+    shutdown as well as a <varname>Before=swap.target</varname> dependency.</para>
 
     <para>Additional implicit dependencies may be added as result of
     execution and resource control parameters as documented in
 
       <varlistentry>
         <term><varname>What=</varname></term>
-        <listitem><para>Takes an absolute path of a device node or
-        file to use for paging. See
-        <citerefentry project='man-pages'><refentrytitle>swapon</refentrytitle><manvolnum>8</manvolnum></citerefentry>
-        for details. If this refers to a device node, a dependency on
-        the respective device unit is automatically created. (See
-        <citerefentry><refentrytitle>systemd.device</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-        for more information.) If this refers to a file, a dependency
-        on the respective mount unit is automatically created. (See
-        <citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>
-        for more information.) This option is
-        mandatory.</para></listitem>
+        <listitem><para>Takes an absolute path of a device node or file to use for paging. See <citerefentry
+        project='man-pages'><refentrytitle>swapon</refentrytitle><manvolnum>8</manvolnum></citerefentry> for
+        details. If this refers to a device node, a dependency on the respective device unit is automatically
+        created. (See
+        <citerefentry><refentrytitle>systemd.device</refentrytitle><manvolnum>5</manvolnum></citerefentry> for more
+        information.) If this refers to a file, a dependency on the respective mount unit is automatically
+        created. (See <citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+        for more information.) This option is mandatory. Note that the usual specifier expansion is applied to this
+        setting, literal percent characters should hence be written as <literal>%%</literal>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
       <varlistentry>
         <term><varname>Options=</varname></term>
 
-        <listitem><para>May contain an option string for the swap
-        device. This may be used for controlling discard options among
-        other functionality, if the swap backing device supports the
-        discard or trim operation. (See
+        <listitem><para>May contain an option string for the swap device. This may be used for controlling discard
+        options among other functionality, if the swap backing device supports the discard or trim operation. (See
         <citerefentry project='man-pages'><refentrytitle>swapon</refentrytitle><manvolnum>8</manvolnum></citerefentry>
-        for more information.) </para></listitem>
+        for more information.) Note that the usual specifier expansion is applied to this setting, literal percent
+        characters should hence be written as <literal>%%</literal>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
index 2e35e54..dbe7ff0 100644 (file)
@@ -83,7 +83,7 @@
     <title>Automatic Dependencies</title>
 
     <para>Unless <varname>DefaultDependencies=</varname> is set to
-    <option>no</option> in either of releated units or an explicit ordering
+    <option>no</option> in either of related units or an explicit ordering
     dependency is already defined, target units will implicitly complement all
     configured dependencies of type <varname>Wants=</varname> or
     <varname>Requires=</varname> with dependencies of type
   </refsect1>
 
   <refsect1>
+    <title>Example</title>
+
+    <example>
+      <title>Simple standalone target</title>
+
+      <programlisting># emergency-net.target
+
+[Unit]
+Description=Emergency Mode with Networking
+Requires=emergency.target systemd-networkd.service
+After=emergency.target systemd-networkd.service
+AllowIsolate=yes</programlisting>
+
+      <para>When adding dependencies to other units, it's important to check if they set
+      <varname>DefaultDependencies=</varname>. Service units, unless they set
+      <varname>DefaultDependencies=no</varname>, automatically get a dependency on
+      <filename>sysinit.target</filename>. In this case, both
+      <filename>emergency.target</filename> and <filename>systemd-networkd.service</filename>
+      have <varname>DefaultDependencies=no</varname>, so they are suitable for use
+      in this target, and do not pull in <filename>sysinit.target</filename>.</para>
+
+      <para>You can now switch into this emergency mode by running <varname>systemctl
+      isolate emergency-net.target</varname> or by passing the option
+      <varname>systemd.unit=emergency-net.target</varname> on the kernel command
+      line.</para>
+
+      <para>Other units can have <varname>WantedBy=emergency-net.target</varname> in the
+      <varname>[Install]</varname> section. After they are enabled using
+      <command>systemctl enable</command>, they will be started before
+      <varname>emergency-net.target</varname> is started. It is also possible to add
+      arbitrary units as dependencies of <filename>emergency.target</filename> without
+      modifying them by using <command>systemctl add-wants</command>.
+      </para>
+    </example>
+  </refsect1>
+
+  <refsect1>
       <title>See Also</title>
       <para>
         <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
index aae3acc..659f143 100644 (file)
   <refsect1>
     <title>Displaying Time Spans</title>
 
-    <para>Time spans refer to time durations. On display, systemd will
-    present time spans as a space-separated series of time values each
-    suffixed by a time unit.</para>
+    <para>Time spans refer to time durations. On display, systemd will present time spans as a space-separated series
+    of time values each suffixed by a time unit. Example:</para>
 
     <programlisting>2h 30min</programlisting>
 
-    <para>All specified time values are meant to be added up. The
-    above hence refers to 150 minutes.</para>
+    <para>All specified time values are meant to be added up. The above hence refers to 150 minutes. Display is
+    locale-independent, only English names for the time units are used.</para>
   </refsect1>
 
   <refsect1>
       <listitem><para>days, day, d</para></listitem>
       <listitem><para>weeks, week, w</para></listitem>
       <listitem><para>months, month, M (defined as 30.44 days)</para></listitem>
-      <listitem><para>years, year, y (define as 365.25 days)</para></listitem>
+      <listitem><para>years, year, y (defined as 365.25 days)</para></listitem>
     </itemizedlist>
 
-    <para>If no time unit is specified, generally seconds are assumed,
-    but some exceptions exist and are marked as such. In a few cases
-    <literal>ns</literal>, <literal>nsec</literal> is accepted too,
-    where the granularity of the time span allows for this.</para>
+    <para>If no time unit is specified, generally seconds are assumed, but some exceptions exist and are marked as
+    such. In a few cases <literal>ns</literal>, <literal>nsec</literal> is accepted too, where the granularity of the
+    time span permits this. Parsing is generally locale-independent, non-English names for the time units are not
+    accepted.</para>
 
     <para>Examples for valid time span specifications:</para>
 
 
     <programlisting>Fri 2012-11-23 23:02:15 CET</programlisting>
 
-    <para>The weekday is printed according to the locale choice of the
-    user.</para>
+    <para>The weekday is printed in the abbreviated English language form. The formatting is locale-independent.</para>
+
+    <para>In some cases timestamps are shown in the UTC timezone instead of the local timezone, which is indicated via
+    the <literal>UTC</literal> timezone specifier in the output.</para>
+
+    <para>In some cases timestamps are shown with microsecond granularity. In this case the sub-second remainder is
+    separated by a full stop from the seconds component.</para>
   </refsect1>
 
   <refsect1>
     <title>Parsing Timestamps</title>
 
-    <para>When parsing, systemd will accept a similar syntax, but
-    expects no timezone specification, unless it is given as the
-    literal string "UTC". In this case, the time is considered in UTC,
-    otherwise in the local timezone. The weekday specification is
-    optional, but when the weekday is specified, it must either be in
-    the abbreviated (<literal>Wed</literal>) or non-abbreviated
-    (<literal>Wednesday</literal>) English language form (case does
-    not matter), and is not subject to the locale choice of the user.
-    Either the date, or the time part may be omitted, in which case
-    the current date or 00:00:00, respectively, is assumed. The seconds
-    component of the time may also be omitted, in which case ":00" is
-    assumed. Year numbers may be specified in full or may be
-    abbreviated (omitting the century).</para>
-
-    <para>A timestamp is considered invalid if a weekday is specified
-    and the date does not actually match the specified day of the
-    week.</para>
+    <para>When parsing, systemd will accept a similar syntax, but expects no timezone specification, unless it is given
+    as the literal string <literal>UTC</literal> (for the UTC timezone) or is specified to be the locally configured
+    timezone. Other timezones than the local and UTC are not supported. The weekday specification is optional, but when
+    the weekday is specified, it must either be in the abbreviated (<literal>Wed</literal>) or non-abbreviated
+    (<literal>Wednesday</literal>) English language form (case does not matter), and is not subject to the locale
+    choice of the user.  Either the date, or the time part may be omitted, in which case the current date or 00:00:00,
+    respectively, is assumed. The seconds component of the time may also be omitted, in which case ":00" is
+    assumed. Year numbers may be specified in full or may be abbreviated (omitting the century).</para>
+
+    <para>A timestamp is considered invalid if a weekday is specified and the date does not match the specified day of
+    the week.</para>
 
     <para>When parsing, systemd will also accept a few special
     placeholders instead of timestamps: <literal>now</literal> may be
              2012-11-23 → Fri 2012-11-23 00:00:00
                12-11-23 → Fri 2012-11-23 00:00:00
                11:12:13 → Fri 2012-11-23 11:12:13
-       11:12:13.9900009 → Fri 2012-11-23 11:12:13
-                          format_timestamp_us: Fri 2012-11-23 11:12:13.990000
                   11:12 → Fri 2012-11-23 11:12:00
                     now → Fri 2012-11-23 18:15:22
                   today → Fri 2012-11-23 00:00:00
               yesterday → Fri 2012-11-22 00:00:00
                tomorrow → Fri 2012-11-24 00:00:00
                +3h30min → Fri 2012-11-23 21:45:22
-           +3h30min UTC → -EINVAL
                     -5s → Fri 2012-11-23 18:15:17
               11min ago → Fri 2012-11-23 18:04:22
-          11min ago UTC → -EINVAL
             @1395716396 → Tue 2014-03-25 03:59:56</programlisting>
 
-    <para>Note that timestamps printed by systemd will not be parsed
-    correctly by systemd, as the timezone specification is not
-    accepted, and printing timestamps is subject to locale settings
-    for the weekday, while parsing only accepts English weekday
-    names.</para>
+    <para>Note that timestamps displayed by remote systems with a non-matching timezone are usually not parsable
+    locally, as the timezone component is not understood (unless it happens to be <literal>UTC</literal>).</para>
 
-    <para>In some cases, systemd will display a relative timestamp
-    (relative to the current time, or the time of invocation of the
-    command) instead or in addition to an absolute timestamp as
-    described above. A relative timestamp is formatted as
-    follows:</para>
+    <para>Timestamps may also be specified with microsecond granularity. The sub-second remainder is expected separated
+    by a full stop from the seconds component. Example:</para>
+
+    <programlisting>2014-03-25 03:59:56.654563</programlisting>
 
-    <para>2 months 5 days ago</para>
+    <para>In some cases, systemd will display a relative timestamp (relative to the current time, or the time of
+    invocation of the command) instead of or in addition to an absolute timestamp as described above. A relative
+    timestamp is formatted as follows:</para>
 
-    <para>Note that any relative timestamp will also parse correctly
-    where a timestamp is expected. (see above)</para>
+    <programlisting>2 months 5 days ago</programlisting>
+
+    <para>Note that a relative timestamp is also accepted where a timestamp is expected (see above).</para>
   </refsect1>
 
   <refsect1>
     <para>In the date and time specifications, any component may be
     specified as <literal>*</literal> in which case any value will
     match. Alternatively, each component can be specified as a list of
-    values separated by commas. Values may also be suffixed with
+    values separated by commas. Values may be suffixed with
     <literal>/</literal> and a repetition value, which indicates that
     the value itself and the value plus all multiples of the repetition value
-    are matched.  Each component may also contain a range of values
-    separated by <literal>..</literal>.</para>
+    are matched.  Two values separated by <literal>..</literal> may be used
+    to indicate a range of values; ranges may also be followed with
+    <literal>/</literal> and a repetition value.</para>
+
+    <para>A date specification may use <literal>~</literal> to indicate the
+    last day(s) in a month. For example, <literal>*-02~03</literal> means
+    "the third last day in February," and <literal>Mon *-05~07/1</literal>
+    means "the last Monday in May."</para>
 
     <para>The seconds component may contain decimal fractions both in
     the value and the repetition. All fractions are rounded to 6
     second component is not specified, <literal>:00</literal> is
     assumed.</para>
 
-    <para>A timezone specification is not expected, unless it is given
-    as the literal string "UTC", similarly to timestamps.</para>
-
-    <para>The special expressions
-    <literal>minutely</literal>,
-    <literal>hourly</literal>, <literal>daily</literal>,
-    <literal>monthly</literal>, <literal>weekly</literal>,
-    <literal>yearly</literal>,
-    <literal>quarterly</literal>,
-    <literal>semiannually</literal> may be used as
-    calendar events which refer to
-    <literal>*-*-* *:*:00</literal>,
-    <literal>*-*-* *:00:00</literal>,
-    <literal>*-*-* 00:00:00</literal>,
-    <literal>*-*-01 00:00:00</literal>,
-    <literal>Mon *-*-* 00:00:00</literal>,
-    <literal>*-01-01 00:00:00</literal>,
-    <literal>*-01,04,07,10-01 00:00:00</literal> and
-    <literal>*-01,07-01 00:00:00</literal>, respectively.
-    </para>
+    <para>A timezone specification is not expected, unless it is given as the literal string <literal>UTC</literal>, or
+    the local timezone, similar to the supported syntax of timestamps (see above). Non-local timezones except for UTC
+    are not supported.</para>
+
+  <para>The following special expressions may be used as shorthands for longer normalized forms:</para>
+
+    <programlisting>    minutely → *-*-* *:*:00
+      hourly → *-*-* *:00:00
+       daily → *-*-* 00:00:00
+     monthly → *-*-01 00:00:00
+      weekly → Mon *-*-* 00:00:00
+      yearly → *-01-01 00:00:00
+   quarterly → *-01,04,07,10-01 00:00:00
+semiannually → *-01,07-01 00:00:00
+   </programlisting>
 
     <para>Examples for valid timestamps and their
     normalized form:</para>
 
-<programlisting>   Sat,Thu,Mon..Wed,Sat..Sun → Mon..Thu,Sat,Sun *-*-* 00:00:00
-     Mon,Sun 12-*-* 2,1:23 → Mon,Sun 2012-*-* 01,02:23:00
-                   Wed *-1 → Wed *-*-01 00:00:00
+<programlisting>  Sat,Thu,Mon..Wed,Sat..Sun → Mon..Thu,Sat,Sun *-*-* 00:00:00
+      Mon,Sun 12-*-* 2,1:23 → Mon,Sun 2012-*-* 01,02:23:00
+                    Wed *-1 → Wed *-*-01 00:00:00
            Wed..Wed,Wed *-1 → Wed *-*-01 00:00:00
-                Wed, 17:48 → Wed *-*-* 17:48:00
+                 Wed, 17:48 → Wed *-*-* 17:48:00
 Wed..Sat,Tue 12-10-15 1:2:3 → Tue..Sat 2012-10-15 01:02:03
-               *-*-7 0:0:0 → *-*-07 00:00:00
-                     10-15 → *-10-15 00:00:00
-       monday *-12-* 17:00 → Mon *-12-* 17:00:00
- Mon,Fri *-*-3,1,2 *:30:45 → Mon,Fri *-*-01,02,03 *:30:45
-      12,14,13,12:20,10,30 → *-*-* 12,13,14:10,20,30:00
-           12..14:10,20,30 → *-*-* 12,13,14:10,20,30:00
- mon,fri *-1/2-1,3 *:30:45 → Mon,Fri *-01/2-01,03 *:30:45
-            03-05 08:05:40 → *-03-05 08:05:40
-                  08:05:40 → *-*-* 08:05:40
-                     05:40 → *-*-* 05:40:00
-    Sat,Sun 12-05 08:05:40 → Sat,Sun *-12-05 08:05:40
-          Sat,Sun 08:05:40 → Sat,Sun *-*-* 08:05:40
-          2003-03-05 05:40 → 2003-03-05 05:40:00
-05:40:23.4200004/3.1700005 → 05:40:23.420000/3.170001
-            2003-02..04-05 → 2003-02,03,04-05 00:00:00
-      2003-03-05 05:40 UTC → 2003-03-05 05:40:00 UTC
-                2003-03-05 → 2003-03-05 00:00:00
-                     03-05 → *-03-05 00:00:00
-                    hourly → *-*-* *:00:00
-                     daily → *-*-* 00:00:00
-                 daily UTC → *-*-* 00:00:00 UTC
-                   monthly → *-*-01 00:00:00
-                    weekly → Mon *-*-* 00:00:00
-                    yearly → *-01-01 00:00:00
-                  annually → *-01-01 00:00:00
-                     *:2/3 → *-*-* *:02/3:00</programlisting>
+                *-*-7 0:0:0 → *-*-07 00:00:00
+                      10-15 → *-10-15 00:00:00
+        monday *-12-* 17:00 → Mon *-12-* 17:00:00
 Mon,Fri *-*-3,1,2 *:30:45 → Mon,Fri *-*-01,02,03 *:30:45
+       12,14,13,12:20,10,30 → *-*-* 12,13,14:10,20,30:00
+            12..14:10,20,30 → *-*-* 12..14:10,20,30:00
 mon,fri *-1/2-1,3 *:30:45 → Mon,Fri *-01/2-01,03 *:30:45
+             03-05 08:05:40 → *-03-05 08:05:40
+                   08:05:40 → *-*-* 08:05:40
+                      05:40 → *-*-* 05:40:00
+     Sat,Sun 12-05 08:05:40 → Sat,Sun *-12-05 08:05:40
+           Sat,Sun 08:05:40 → Sat,Sun *-*-* 08:05:40
+           2003-03-05 05:40 → 2003-03-05 05:40:00
+ 05:40:23.4200004/3.1700005 → *-*-* 05:40:23.420000/3.170001
+             2003-02..04-05 → 2003-02..04-05 00:00:00
+       2003-03-05 05:40 UTC → 2003-03-05 05:40:00 UTC
+                 2003-03-05 → 2003-03-05 00:00:00
+                      03-05 → *-03-05 00:00:00
+                     hourly → *-*-* *:00:00
+                      daily → *-*-* 00:00:00
+                  daily UTC → *-*-* 00:00:00 UTC
+                    monthly → *-*-01 00:00:00
+                     weekly → Mon *-*-* 00:00:00
+                     yearly → *-01-01 00:00:00
+                   annually → *-01-01 00:00:00
+                      *:2/3 → *-*-* *:02/3:00</programlisting>
 
       <para>Calendar events are used by timer units, see
       <citerefentry><refentrytitle>systemd.timer</refentrytitle><manvolnum>5</manvolnum></citerefentry>
index 4fe140e..26a47a1 100644 (file)
@@ -93,7 +93,7 @@
     on <filename>timers.target</filename>, as well as <varname>Conflicts=</varname> and <varname>Before=</varname> on
     <filename>shutdown.target</filename> to ensure that they are stopped cleanly prior to system shutdown.  Timer units
     with at least one <varname>OnCalendar=</varname> directive will have an additional <varname>After=</varname>
-    dependency on <filename>timer-sync.target</filename> to avoid being started before the system clock has been
+    dependency on <filename>time-sync.target</filename> to avoid being started before the system clock has been
     correctly set. Only timer units involved with early boot or late system shutdown should disable the
     <varname>DefaultDependencies=</varname> option.</para>
   </refsect1>
         <para>Note that timers do not necessarily expire at the
         precise time configured with this setting, as it is subject to
         the <varname>AccuracySec=</varname> setting
-        below.</para></listitem>
+        below.</para>
+
+       <para>May be specified more than once.</para></listitem>
       </varlistentry>
 
       <varlistentry>
index 85a7b12..dedeb6c 100644 (file)
     <option>false</option> and <option>off</option> are
     equivalent.</para>
 
-    <para>Time span values encoded in unit files can be written in
-    various formats. A stand-alone number specifies a time in seconds.
-    If suffixed with a time unit, the unit is honored. A concatenation
-    of multiple values with units is supported, in which case the
-    values are added up. Example: "50" refers to 50 seconds; "2min
-    200ms" refers to 2 minutes plus 200 milliseconds, i.e. 120200ms.
-    The following time units are understood: s, min, h, d, w, ms, us.
-    For details see
+    <para>Time span values encoded in unit files can be written in various formats. A stand-alone
+    number specifies a time in seconds.  If suffixed with a time unit, the unit is honored. A
+    concatenation of multiple values with units is supported, in which case the values are added
+    up. Example: <literal>50</literal> refers to 50 seconds; <literal>2min 200ms</literal> refers to
+    2 minutes and 200 milliseconds, i.e. 120200 ms.  The following time units are understood:
+    <literal>s</literal>, <literal>min</literal>, <literal>h</literal>, <literal>d</literal>,
+    <literal>w</literal>, <literal>ms</literal>, <literal>us</literal>.  For details see
     <citerefentry><refentrytitle>systemd.time</refentrytitle><manvolnum>7</manvolnum></citerefentry>.</para>
 
-    <para>Empty lines and lines starting with # or ; are
-    ignored. This may be used for commenting. Lines ending
-    in a backslash are concatenated with the following
-    line while reading and the backslash is replaced by a
-    space character. This may be used to wrap long lines.</para>
-
-    <para>Along with a unit file <filename>foo.service</filename>, the
-    directory <filename>foo.service.wants/</filename> may exist. All
-    unit files symlinked from such a directory are implicitly added as
-    dependencies of type <varname>Wants=</varname> to the unit. This
-    is useful to hook units into the start-up of other units, without
-    having to modify their unit files. For details about the semantics
-    of <varname>Wants=</varname>, see below. The preferred way to
-    create symlinks in the <filename>.wants/</filename> directory of a
-    unit file is with the <command>enable</command> command of the
+    <para>Empty lines and lines starting with <literal>#</literal> or <literal>;</literal> are
+    ignored. This may be used for commenting. Lines ending in a backslash are concatenated with the
+    following line while reading and the backslash is replaced by a space character. This may be
+    used to wrap long lines.</para>
+
+    <para>Units can be aliased (have an alternative name), by creating a symlink from the new name
+    to the existing name in one of the unit search paths. For example,
+    <filename>systemd-networkd.service</filename> has the alias
+    <filename>dbus-org.freedesktop.network1.service</filename>, created during installation as the
+    symlink <filename>/usr/lib/systemd/system/dbus-org.freedesktop.network1.service</filename>. In
+    addition, unit files may specify aliases through the <varname>Alias=</varname> directive in the
+    [Install] section; those aliases are only effective when the unit is enabled. When the unit is
+    enabled, symlinks will be created for those names, and removed when the unit is disabled. For
+    example, <filename>reboot.target</filename> specifies
+    <varname>Alias=ctrl-alt-del.target</varname>, so when enabled it will be invoked whenever
+    CTRL+ALT+DEL is pressed. Alias names may be used in commands like <command>enable</command>,
+    <command>disable</command>, <command>start</command>, <command>stop</command>,
+    <command>status</command>, …, and in unit dependency directives <varname>Wants=</varname>,
+    <varname>Requires=</varname>, <varname>Before=</varname>, <varname>After=</varname>, …, with the
+    limitation that aliases specified through <varname>Alias=</varname> are only effective when the
+    unit is enabled. Aliases cannot be used with the <command>preset</command> command.</para>
+
+    <para>Along with a unit file <filename>foo.service</filename>, the directory
+    <filename>foo.service.wants/</filename> may exist. All unit files symlinked from such a
+    directory are implicitly added as dependencies of type <varname>Wants=</varname> to the unit.
+    This is useful to hook units into the start-up of other units, without having to modify their
+    unit files. For details about the semantics of <varname>Wants=</varname>, see below. The
+    preferred way to create symlinks in the <filename>.wants/</filename> directory of a unit file is
+    with the <command>enable</command> command of the
     <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
-    tool which reads information from the [Install] section of unit
-    files (see below). A similar functionality exists for
-    <varname>Requires=</varname> type dependencies as well, the
-    directory suffix is <filename>.requires/</filename> in this
-    case.</para>
+    tool which reads information from the [Install] section of unit files (see below). A similar
+    functionality exists for <varname>Requires=</varname> type dependencies as well, the directory
+    suffix is <filename>.requires/</filename> in this case.</para>
 
     <para>Along with a unit file <filename>foo.service</filename>, a "drop-in" directory
-    <filename>foo.service.d/</filename> may exist. All files with the suffix <literal>.conf</literal> from this
-    directory will be parsed after the file itself is parsed. This is useful to alter or add configuration settings for
-    a unit, without having to modify unit files. Each drop-in file must have appropriate section headers. Note that for
-    instantiated units, this logic will first look for the instance <literal>.d/</literal> subdirectory and read its
-    <literal>.conf</literal> files, followed by the template <literal>.d/</literal> subdirectory and the
-    <literal>.conf</literal> files there. Also note that settings from the <literal>[Install]</literal> section are not
-    honoured in drop-in unit files, and have no effect.</para>
-
-    <para>In addition to <filename>/etc/systemd/system</filename>,
-    the drop-in <literal>.conf</literal> files for system services
-    can be placed in <filename>/usr/lib/systemd/system</filename> or
-    <filename>/run/systemd/system</filename> directories. Drop-in
-    files in <filename>/etc</filename> take precedence over those in
-    <filename>/run</filename> which in turn take precedence over
-    those in <filename>/usr/lib</filename>. Drop-in files under any of
-    these directories take precedence over unit files wherever located.
-    (Of course, since <filename>/run</filename> is temporary and
-    <filename>/usr/lib</filename> is for vendors, it is unlikely
-    drop-ins should be used in either of those places.)</para>
-    <!-- Note that we do not document .include here, as we
-         consider it mostly obsolete, and want people to
-         use .d/ drop-ins instead. -->
+    <filename>foo.service.d/</filename> may exist. All files with the suffix
+    <literal>.conf</literal> from this directory will be parsed after the file itself is
+    parsed. This is useful to alter or add configuration settings for a unit, without having to
+    modify unit files. Each drop-in file must have appropriate section headers. Note that for
+    instantiated units, this logic will first look for the instance <literal>.d/</literal>
+    subdirectory and read its <literal>.conf</literal> files, followed by the template
+    <literal>.d/</literal> subdirectory and the <literal>.conf</literal> files there. Also note that
+    settings from the <literal>[Install]</literal> section are not honored in drop-in unit files,
+    and have no effect.</para>
+
+    <para>In addition to <filename>/etc/systemd/system</filename>, the drop-in <literal>.d</literal>
+    directories for system services can be placed in <filename>/usr/lib/systemd/system</filename> or
+    <filename>/run/systemd/system</filename> directories. Drop-in files in <filename>/etc</filename>
+    take precedence over those in <filename>/run</filename> which in turn take precedence over those
+    in <filename>/usr/lib</filename>. Drop-in files under any of these directories take precedence
+    over unit files wherever located. Multiple drop-in files with different names are applied in
+    lexicographic order, regardless of which of the directories they reside in.</para>
+
+    <!-- Note that we do not document .include here, as we consider it mostly obsolete, and want
+         people to use .d/ drop-ins instead. -->
 
     <para>Some unit names reflect paths existing in the file system
     namespace. Example: a device unit
 
     <para>The unit file format is covered by the
     <ulink
-    url="http://www.freedesktop.org/wiki/Software/systemd/InterfaceStabilityPromise">Interface
+    url="https://www.freedesktop.org/wiki/Software/systemd/InterfaceStabilityPromise">Interface
     Stability Promise</ulink>.</para>
 
   </refsect1>
       <varlistentry>
         <term><varname>Requires=</varname></term>
 
-        <listitem><para>Configures requirement dependencies on other
-        units. If this unit gets activated, the units listed here will
-        be activated as well. If one of the other units gets
-        deactivated or its activation fails, this unit will be
-        deactivated. This option may be specified more than once or
-        multiple space-separated units may be specified in one option
-        in which case requirement dependencies for all listed names
-        will be created. Note that requirement dependencies do not
-        influence the order in which services are started or stopped.
-        This has to be configured independently with the
-        <varname>After=</varname> or <varname>Before=</varname>
-        options. If a unit <filename>foo.service</filename> requires a
-        unit <filename>bar.service</filename> as configured with
-        <varname>Requires=</varname> and no ordering is configured
-        with <varname>After=</varname> or <varname>Before=</varname>,
-        then both units will be started simultaneously and without any
-        delay between them if <filename>foo.service</filename> is
-        activated. Often, it is a better choice to use
-        <varname>Wants=</varname> instead of
-        <varname>Requires=</varname> in order to achieve a system that
-        is more robust when dealing with failing services.</para>
-
-        <para>Note that dependencies of this type may also be
-        configured outside of the unit configuration file by adding a
-        symlink to a <filename>.requires/</filename> directory
-        accompanying the unit file. For details, see
+        <listitem><para>Configures requirement dependencies on other units. If this unit gets activated, the units
+        listed here will be activated as well. If one of the other units gets deactivated or its activation fails, this
+        unit will be deactivated. This option may be specified more than once or multiple space-separated units may be
+        specified in one option in which case requirement dependencies for all listed names will be created. Note that
+        requirement dependencies do not influence the order in which services are started or stopped.  This has to be
+        configured independently with the <varname>After=</varname> or <varname>Before=</varname> options. If a unit
+        <filename>foo.service</filename> requires a unit <filename>bar.service</filename> as configured with
+        <varname>Requires=</varname> and no ordering is configured with <varname>After=</varname> or
+        <varname>Before=</varname>, then both units will be started simultaneously and without any delay between them
+        if <filename>foo.service</filename> is activated. Often, it is a better choice to use <varname>Wants=</varname>
+        instead of <varname>Requires=</varname> in order to achieve a system that is more robust when dealing with
+        failing services.</para>
+
+        <para>Note that this dependency type does not imply that the other unit always has to be in active state when
+        this unit is running. Specifically: failing condition checks (such as <varname>ConditionPathExists=</varname>,
+        <varname>ConditionPathExists=</varname>, … — see below) do not cause the start job of a unit with a
+        <varname>Requires=</varname> dependency on it to fail. Also, some unit types may deactivate on their own (for
+        example, a service process may decide to exit cleanly, or a device may be unplugged by the user), which is not
+        propagated to units having a <varname>Requires=</varname> dependency. Use the <varname>BindsTo=</varname>
+        dependency type together with <varname>After=</varname> to ensure that a unit may never be in active state
+        without a specific other unit also in active state (see below).</para>
+
+        <para>Note that dependencies of this type may also be configured outside of the unit configuration file by
+        adding a symlink to a <filename>.requires/</filename> directory accompanying the unit file. For details, see
         above.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>BindsTo=</varname></term>
 
-        <listitem><para>Configures requirement dependencies, very
-        similar in style to <varname>Requires=</varname>, however in
-        addition to this behavior, it also declares that this unit is
-        stopped when any of the units listed suddenly disappears.
-        Units can suddenly, unexpectedly disappear if a service
-        terminates on its own choice, a device is unplugged or a mount
-        point unmounted without involvement of
-        systemd.</para></listitem>
+        <listitem><para>Configures requirement dependencies, very similar in style to
+        <varname>Requires=</varname>. However, this dependency type is stronger: in addition to the effect of
+        <varname>Requires=</varname> it declares that if the unit bound to is stopped, this unit will be stopped
+        too. This means a unit bound to another unit that suddenly enters inactive state will be stopped too.
+        Units can suddenly, unexpectedly enter inactive state for different reasons: the main process of a service unit
+        might terminate on its own choice, the backing device of a device unit might be unplugged or the mount point of
+        a mount unit might be unmounted without involvement of the system and service manager.</para>
+
+        <para>When used in conjunction with <varname>After=</varname> on the same unit the behaviour of
+        <varname>BindsTo=</varname> is even stronger. In this case, the unit bound to strictly has to be in active
+        state for this unit to also be in active state. This not only means a unit bound to another unit that suddenly
+        enters inactive state, but also one that is bound to another unit that gets skipped due to a failed condition
+        check (such as <varname>ConditionPathExists=</varname>, <varname>ConditionPathIsSymbolicLink=</varname>, … —
+        see below) will be stopped, should it be running. Hence, in many cases it is best to combine
+        <varname>BindsTo=</varname> with <varname>After=</varname>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>Before=</varname></term>
         <term><varname>After=</varname></term>
 
-        <listitem><para>A space-separated list of unit names.
-        Configures ordering dependencies between units. If a unit
-        <filename>foo.service</filename> contains a setting
-        <option>Before=bar.service</option> and both units are being
-        started, <filename>bar.service</filename>'s start-up is
-        delayed until <filename>foo.service</filename> is started up.
-        Note that this setting is independent of and orthogonal to the
-        requirement dependencies as configured by
-        <varname>Requires=</varname>. It is a common pattern to
-        include a unit name in both the <varname>After=</varname> and
-        <varname>Requires=</varname> option, in which case the unit
-        listed will be started before the unit that is configured with
-        these options. This option may be specified more than once, in
-        which case ordering dependencies for all listed names are
-        created. <varname>After=</varname> is the inverse of
-        <varname>Before=</varname>, i.e. while
-        <varname>After=</varname> ensures that the configured unit is
-        started after the listed unit finished starting up,
-        <varname>Before=</varname> ensures the opposite, i.e. that the
-        configured unit is fully started up before the listed unit is
-        started. Note that when two units with an ordering dependency
-        between them are shut down, the inverse of the start-up order
-        is applied. i.e. if a unit is configured with
-        <varname>After=</varname> on another unit, the former is
-        stopped before the latter if both are shut down. Given two units
-        with any ordering dependency between them, if one unit is shut
-        down and the other is started up, the shutdown is ordered
-        before the start-up. It doesn't matter if the ordering
-        dependency is <varname>After=</varname> or
-        <varname>Before=</varname>. It also doesn't matter which of the
-        two is shut down, as long as one is shut down and the other is
-        started up. The shutdown is ordered before the start-up in all
-        cases. If two units have no ordering dependencies between them,
-        they are shut down or started up simultaneously, and no ordering
-        takes place.
-        </para></listitem>
+        <listitem><para>These two settings expect a space-separated list of unit names. They configure ordering
+        dependencies between units. If a unit <filename>foo.service</filename> contains a setting
+        <option>Before=bar.service</option> and both units are being started, <filename>bar.service</filename>'s
+        start-up is delayed until <filename>foo.service</filename> has finished starting up.  Note that this setting is
+        independent of and orthogonal to the requirement dependencies as configured by <varname>Requires=</varname>,
+        <varname>Wants=</varname> or <varname>BindsTo=</varname>. It is a common pattern to include a unit name in both
+        the <varname>After=</varname> and <varname>Requires=</varname> options, in which case the unit listed will be
+        started before the unit that is configured with these options. This option may be specified more than once, in
+        which case ordering dependencies for all listed names are created. <varname>After=</varname> is the inverse of
+        <varname>Before=</varname>, i.e. while <varname>After=</varname> ensures that the configured unit is started
+        after the listed unit finished starting up, <varname>Before=</varname> ensures the opposite, that the
+        configured unit is fully started up before the listed unit is started. Note that when two units with an
+        ordering dependency between them are shut down, the inverse of the start-up order is applied. i.e. if a unit is
+        configured with <varname>After=</varname> on another unit, the former is stopped before the latter if both are
+        shut down. Given two units with any ordering dependency between them, if one unit is shut down and the other is
+        started up, the shutdown is ordered before the start-up. It doesn't matter if the ordering dependency is
+        <varname>After=</varname> or <varname>Before=</varname>, in this case. It also doesn't matter which of the two
+        is shut down, as long as one is shut down and the other is started up. The shutdown is ordered before the
+        start-up in all cases. If two units have no ordering dependencies between them, they are shut down or started
+        up simultaneously, and no ordering takes place. It depends on the unit type when precisely a unit has finished
+        starting up. Most importantly, for service units start-up is considered completed for the purpose of
+        <varname>Before=</varname>/<varname>After=</varname> when all its configured start-up commands have been
+        invoked and they either failed or reported start-up success.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         all mount units required to access the specified path.</para>
 
         <para>Mount points marked with <option>noauto</option> are not
-        mounted automatically and will be ignored for the purposes of
-        this option. If such a mount should be a requirement for this
-        unit, direct dependencies on the mount units may be added
-        (<varname>Requires=</varname> and <varname>After=</varname> or
-        some other combination). </para></listitem>
+        mounted automatically through <filename>local-fs.target</filename>,
+        but are still honored for the purposes of this option, i.e. they
+        will be pulled in by this unit.</para></listitem>
       </varlistentry>
 
       <varlistentry>
 
       <varlistentry>
         <term><varname>JobTimeoutSec=</varname></term>
+        <term><varname>JobRunningTimeoutSec=</varname></term>
         <term><varname>JobTimeoutAction=</varname></term>
         <term><varname>JobTimeoutRebootArgument=</varname></term>
 
-        <listitem><para>When a job for this unit is queued, a time-out may be configured. If this time limit is
-        reached, the job will be cancelled, the unit however will not change state or even enter the
-        <literal>failed</literal> mode. This value defaults to <literal>infinity</literal> (job timeouts disabled),
-        except for device units. NB: this timeout is independent from any unit-specific timeout (for example, the
-        timeout set with <varname>TimeoutStartSec=</varname> in service units) as the job timeout has no effect on the
-        unit itself, only on the job that might be pending for it. Or in other words: unit-specific timeouts are useful
-        to abort unit state changes, and revert them. The job timeout set with this option however is useful to abort
-        only the job waiting for the unit state to change.</para>
+        <listitem><para>When a job for this unit is queued, a time-out <varname>JobTimeoutSec=</varname> may be
+        configured. Similarly, <varname>JobRunningTimeoutSec=</varname> starts counting when the queued job is actually
+        started. If either time limit is reached, the job will be cancelled, the unit however will not change state or
+        even enter the <literal>failed</literal> mode. This value defaults to <literal>infinity</literal> (job timeouts
+        disabled), except for device units (<varname>JobRunningTimeoutSec=</varname> defaults to
+        <varname>DefaultTimeoutStartSec=</varname>). NB: this timeout is independent from any unit-specific timeout
+        (for example, the timeout set with <varname>TimeoutStartSec=</varname> in service units) as the job timeout has
+        no effect on the unit itself, only on the job that might be pending for it. Or in other words: unit-specific
+        timeouts are useful to abort unit state changes, and revert them. The job timeout set with this option however
+        is useful to abort only the job waiting for the unit state to change.</para>
 
         <para><varname>JobTimeoutAction=</varname>
         optionally configures an additional
         <term><varname>ConditionDirectoryNotEmpty=</varname></term>
         <term><varname>ConditionFileNotEmpty=</varname></term>
         <term><varname>ConditionFileIsExecutable=</varname></term>
+        <term><varname>ConditionUser=</varname></term>
+        <term><varname>ConditionGroup=</varname></term>
 
         <!-- We do not document ConditionNull=
              here, as it is not particularly
         <varname>arm64-be</varname>,
         <varname>sh</varname>,
         <varname>sh64</varname>,
-        <varname>m86k</varname>,
+        <varname>m68k</varname>,
         <varname>tilegx</varname>,
-        <varname>cris</varname> to test
+        <varname>cris</varname>,
+        <varname>arc</varname>,
+        <varname>arc-be</varname> to test
         against a specific architecture. The architecture is
         determined from the information returned by
         <citerefentry project='man-pages'><refentrytitle>uname</refentrytitle><manvolnum>2</manvolnum></citerefentry>
         <varname>systemd-nspawn</varname>,
         <varname>docker</varname>,
         <varname>rkt</varname> to test
-        against a specific implementation. See
+        against a specific implementation, or
+        <varname>private-users</varname> to check whether we are running in a user namespace. See
         <citerefentry><refentrytitle>systemd-detect-virt</refentrytitle><manvolnum>1</manvolnum></citerefentry>
         for a full list of known virtualization technologies and their
         identifiers. If multiple virtualization technologies are
         to make sure they run before the stamp file's modification
         time gets reset indicating a completed update.</para>
 
-        <para><varname>ConditionFirstBoot=</varname> takes a boolean
-        argument. This condition may be used to conditionalize units
-        on whether the system is booting up with an unpopulated
-        <filename>/etc</filename> directory. This may be used to
-        populate <filename>/etc</filename> on the first boot after
-        factory reset, or when a new system instances boots up for the
-        first time.</para>
+        <para><varname>ConditionFirstBoot=</varname> takes a boolean argument. This condition may be used to
+        conditionalize units on whether the system is booting up with an unpopulated <filename>/etc</filename>
+        directory (specifically: an <filename>/etc</filename> with no <filename>/etc/machine-id</filename>). This may
+        be used to populate <filename>/etc</filename> on the first boot after factory reset, or when a new system
+        instance boots up for the first time.</para>
 
         <para>With <varname>ConditionPathExists=</varname> a file
         existence condition is checked before a unit is started. If
         whether a certain path exists, is a regular file and marked
         executable.</para>
 
+        <para><varname>ConditionUser=</varname> takes a numeric
+        <literal>UID</literal>, a UNIX user name, or the special value
+        <literal>@system</literal>. This condition may be used to check
+        whether the service manager is running as the given user. The
+        special value <literal>@system</literal> can be used to check
+        if the user id is within the system user range. This option is not
+        useful for system services, as the system manager exclusively
+        runs as the root user, and thus the test result is constant.</para>
+
+        <para><varname>ConditionGroup=</varname> is similar
+        to <varname>ConditionUser=</varname> but verifies that the
+        service manager's real or effective group, or any of its
+        auxiliary groups match the specified group or GID. This setting
+        does not have a special value <literal>@system</literal>.</para>
+
         <para>If multiple conditions are specified, the unit will be
         executed if all of them apply (i.e. a logical AND is applied).
         Condition checks can be prefixed with a pipe symbol (|) in
         <term><varname>AssertDirectoryNotEmpty=</varname></term>
         <term><varname>AssertFileNotEmpty=</varname></term>
         <term><varname>AssertFileIsExecutable=</varname></term>
+        <term><varname>AssertUser=</varname></term>
+        <term><varname>AssertGroup=</varname></term>
 
         <listitem><para>Similar to the <varname>ConditionArchitecture=</varname>,
         <varname>ConditionVirtualization=</varname>, …, condition settings described above, these settings add
       <entry>This is either the unescaped instance name (if applicable) with <filename>/</filename> prepended (if applicable), or the unescaped prefix name prepended with <filename>/</filename>.</entry>
           </row>
           <row>
-      <entry><literal>%c</literal></entry>
-      <entry>Control group path of the unit</entry>
-      <entry>This path does not include the <filename>/sys/fs/cgroup/systemd/</filename> prefix.</entry>
-          </row>
-          <row>
-      <entry><literal>%r</literal></entry>
-      <entry>Control group path of the slice the unit is placed in</entry>
-      <entry>This usually maps to the parent cgroup path of <literal>%c</literal>.</entry>
-          </row>
-          <row>
-      <entry><literal>%R</literal></entry>
-      <entry>Root control group path below which slices and units are placed</entry>
-      <entry>For system instances, this resolves to <filename>/</filename>, except in containers, where this maps to the container's root control group path.</entry>
-          </row>
-          <row>
       <entry><literal>%t</literal></entry>
       <entry>Runtime directory</entry>
       <entry>This is either <filename>/run</filename> (for the system manager) or the path <literal>$XDG_RUNTIME_DIR</literal> resolves to (for user managers).</entry>
       </tgroup>
     </table>
 
-    <para>Please note that specifiers <literal>%U</literal>,
-    <literal>%h</literal>, <literal>%s</literal> are mostly useless
-    when systemd is running in system mode. PID 1 cannot query the
-    user account database for information, so the specifiers only work
-    as shortcuts for things which are already specified in a different
-    way in the unit file. They are fully functional when systemd is
-    running in <option>--user</option> mode.</para>
   </refsect1>
 
   <refsect1>
@@ -1356,7 +1356,7 @@ ExecStart=/usr/sbin/foo-daemon
       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
-      present.</para>
+      present, processed in lexicographic order of their filename.</para>
 
       <para>The advantage of the first method is that one easily
       overrides the complete unit, the vendor unit is not parsed at
@@ -1409,7 +1409,7 @@ WantedBy=multi-user.target</programlisting>
       ordered appropriately (<varname>After=</varname>). Thirdly, in
       order to harden the service a bit more, the administrator would
       like to set the <varname>PrivateTmp=</varname> setting (see
-      <citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
+      <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
       for details). And lastly, the administrator would like to reset
       the niceness of the service to its default value of 0.</para>
 
index 65f5519..e8178ca 100644 (file)
 
   <refsynopsisdiv>
     <cmdsynopsis>
-      <command>systemd <arg choice="opt" rep="repeat">OPTIONS</arg></command>
+      <command>systemd</command>
+      <arg choice="opt" rep="repeat">OPTIONS</arg>
     </cmdsynopsis>
     <cmdsynopsis>
-      <command>init <arg choice="opt" rep="repeat">OPTIONS</arg> <arg choice="req">COMMAND</arg></command>
+      <command>init</command>
+      <arg choice="opt" rep="repeat">OPTIONS</arg>
+      <arg choice="req">COMMAND</arg>
     </cmdsynopsis>
   </refsynopsisdiv>
 
         user instance. This setting may also be enabled during boot,
         on the kernel command line via the
         <varname>systemd.crash_vt=</varname> option, see
+        <!-- FIXME: there is no crash_vt command line option? -->
         below.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><option>--show-status=</option></term>
 
-        <listitem><para>Show terse service status information while
-        booting. This switch has no effect when run as user instance.
-        Takes a boolean argument which may be omitted which is
-        interpreted as <option>true</option>.</para></listitem>
+        <listitem><para>Takes a boolean argument or the special value <constant>auto</constant>. If on, terse unit
+        status information is shown on the console during boot-up and shutdown. If off, no such status information is
+        shown. If set to <constant>auto</constant> behavior is similar to off, except that it is automatically switched
+        to on, as soon as the first unit failure or significant boot delay is encountered. This switch has no effect
+        when invoked as user instance. If specified, overrides both the kernel command line setting
+        <varname>systemd.show_status=</varname> (see below) and the configuration file option
+        <option>ShowStatus=</option>, see
+        <citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para></listitem>
       </varlistentry>
       <varlistentry>
         <term><option>--log-target=</option></term>
     <title>Concepts</title>
 
     <para>systemd provides a dependency system between various
-    entities called "units" of 12 different types. Units encapsulate
+    entities called "units" of 11 different types. Units encapsulate
     various objects that are relevant for system boot-up and
     maintenance. The majority of units are configured in unit
     configuration files, whose syntax and basic set of options is
     <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
     however some are created automatically from other configuration,
     dynamically from system state or programmatically at runtime.
-    Units may be "active" (meaning started, bound, plugged in, ...,
+    Units may be "active" (meaning started, bound, plugged in, ,
     depending on the unit type, see below), or "inactive" (meaning
-    stopped, unbound, unplugged, ...), as well as in the process of
+    stopped, unbound, unplugged, ), as well as in the process of
     being activated or deactivated, i.e. between the two states (these
     states are called "activating", "deactivating"). A special
     "failed" state is available as well, which is very similar to
 
     <para>Note that some but not all interfaces provided
     by systemd are covered by the
-    <ulink url="http://www.freedesktop.org/wiki/Software/systemd/InterfaceStabilityPromise">Interface
+    <ulink url="https://www.freedesktop.org/wiki/Software/systemd/InterfaceStabilityPromise">Interface
     Stability Promise</ulink>.</para>
 
     <para>Units may be generated dynamically at boot and system
 
     <para>Systems which invoke systemd in a container or initrd
     environment should implement the
-    <ulink url="http://www.freedesktop.org/wiki/Software/systemd/ContainerInterface">Container Interface</ulink> or
-    <ulink url="http://www.freedesktop.org/wiki/Software/systemd/InitrdInterface">initrd Interface</ulink>
+    <ulink url="https://www.freedesktop.org/wiki/Software/systemd/ContainerInterface">Container Interface</ulink> or
+    <ulink url="https://www.freedesktop.org/wiki/Software/systemd/InitrdInterface">initrd Interface</ulink>
     specifications, respectively.</para>
   </refsect1>
 
         <term><constant>SIGRTMIN+27</constant></term>
         <term><constant>SIGRTMIN+28</constant></term>
 
-        <listitem><para>Sets the log level to
+        <listitem><para>Sets the log target to
         <literal>journal-or-kmsg</literal> (or
         <literal>console</literal> on
         <constant>SIGRTMIN+27</constant>, <literal>kmsg</literal> on
       <varlistentry>
         <term><varname>$SYSTEMD_COLORS</varname></term>
 
-        <listitem><para>Controls whether colorized output should be generated.
-        </para></listitem>
+        <listitem><para>The value must be a boolean. Controls whether colorized output should be
+        generated. This can be specified to override the decision that <command>systemd</command>
+        makes based on <varname>$TERM</varname> and what the console is connected to.</para>
+        </listitem>
       </varlistentry>
 
       <varlistentry>
         <listitem><para>Set by systemd for supervised processes during
         socket-based activation. See
         <citerefentry><refentrytitle>sd_listen_fds</refentrytitle><manvolnum>3</manvolnum></citerefentry>
-        for more information. </para></listitem>
+        for more information.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <listitem><para>Set by systemd for supervised processes for
         status and start-up completion notification. See
         <citerefentry><refentrytitle>sd_notify</refentrytitle><manvolnum>3</manvolnum></citerefentry>
-        for more information. </para></listitem>
+        for more information.</para></listitem>
       </varlistentry>
     </variablelist>
   </refsect1>
       </varlistentry>
 
       <varlistentry>
-        <term><varname>systemd.dump_core=</varname></term>
+        <term><varname>systemd.dump_core</varname></term>
 
-        <listitem><para>Takes a boolean argument. If
-        <option>yes</option>, the systemd manager (PID 1) dumps core
-        when it crashes.  Otherwise, no core dump is created. Defaults
-        to <option>yes</option>.</para></listitem>
+        <listitem><para>Takes a boolean argument or enables the option if specified
+        without an argument. If enabled, the systemd manager (PID 1) dumps core when
+        it crashes. Otherwise, no core dump is created. Defaults to enabled.</para>
+        </listitem>
       </varlistentry>
 
       <varlistentry>
-        <term><varname>systemd.crash_chvt=</varname></term>
+        <term><varname>systemd.crash_chvt</varname></term>
 
-        <listitem><para>Takes a positive integer, or a boolean
-        argument. If a positive integer (in the range 1–63) is
-        specified, the system manager (PID 1) will activate the specified
-        virtual terminal (VT) when it crashes. Defaults to
-        <constant>no</constant>, meaning that no such switch is
-        attempted. If set to <constant>yes</constant>, the VT the
-        kernel messages are written to is selected.</para></listitem>
+        <listitem><para>Takes a positive integer, or a boolean argument. Can be also
+        specified without an argument, with the same effect as a positive boolean. If
+        a positive integer (in the range 1–63) is specified, the system manager (PID
+        1) will activate the specified virtual terminal (VT) when it
+        crashes. Defaults to disabled, meaning that no such switch is attempted. If
+        set to enabled, the VT the kernel messages are written to is selected.
+        </para></listitem>
       </varlistentry>
 
       <varlistentry>
-        <term><varname>systemd.crash_shell=</varname></term>
+        <term><varname>systemd.crash_shell</varname></term>
 
-        <listitem><para>Takes a boolean argument. If
-        <option>yes</option>, the system manager (PID 1) spawns a
-        shell when it crashes, after a 10s delay. Otherwise, no shell
-        is spawned. Defaults to <option>no</option>, for security
-        reasons, as the shell is not protected by password
+        <listitem><para>Takes a boolean argument or enables the option if specified
+        without an argument. If enabled, the system manager (PID 1) spawns a shell
+        when it crashes, after a 10s delay. Otherwise, no shell is spawned. Defaults
+        to disabled, for security reasons, as the shell is not protected by password
         authentication.</para></listitem>
       </varlistentry>
 
       <varlistentry>
-        <term><varname>systemd.crash_reboot=</varname></term>
+        <term><varname>systemd.crash_reboot</varname></term>
 
-        <listitem><para>Takes a boolean argument. If
-        <option>yes</option>, the system manager (PID 1) will reboot
-        the machine automatically when it crashes, after a 10s delay.
-        Otherwise, the system will hang indefinitely. Defaults to
-        <option>no</option>, in order to avoid a reboot loop. If
-        combined with <varname>systemd.crash_shell=</varname>, the
+        <listitem><para>Takes a boolean argument or enables the option if specified
+        without an argument. If enabled, the system manager (PID 1) will reboot the
+        machine automatically when it crashes, after a 10s delay.  Otherwise, the
+        system will hang indefinitely. Defaults to disabled, in order to avoid a
+        reboot loop. If combined with <varname>systemd.crash_shell</varname>, the
         system is rebooted after the shell exits.</para></listitem>
       </varlistentry>
 
       <varlistentry>
-        <term><varname>systemd.confirm_spawn=</varname></term>
+        <term><varname>systemd.confirm_spawn</varname></term>
 
-        <listitem><para>Takes a boolean argument. If
-        <option>yes</option>, the system manager (PID 1) asks for
-        confirmation when spawning processes. Defaults to
-        <option>no</option>.</para></listitem>
+        <listitem><para>Takes a boolean argument or a path to the virtual console
+        where the confirmation messages should be emitted. Can be also specified
+        without an argument, with the same effect as a positive boolean. If enabled,
+        the system manager (PID 1) asks for confirmation when spawning processes
+        using <option>/dev/console</option>. If a path or a console name (such as
+        <literal>ttyS0</literal>) is provided, the virtual console pointed to by this
+        path or described by the give name will be used instead. Defaults to disabled.
+        </para></listitem>
       </varlistentry>
 
       <varlistentry>
-        <term><varname>systemd.show_status=</varname></term>
+        <term><varname>systemd.show_status</varname></term>
 
         <listitem><para>Takes a boolean argument or the constant
-        <constant>auto</constant>. If <option>yes</option>, the
-        systemd manager (PID 1) shows terse service status updates on
-        the console during bootup.  <constant>auto</constant> behaves
-        like <option>false</option> until a service fails or there is
-        a significant delay in boot.  Defaults to
-        <option>yes</option>, unless <option>quiet</option> is passed
-        as kernel command line option, in which case it defaults to
-        <constant>auto</constant>.</para></listitem>
+        <constant>auto</constant>. Can be also specified without an argument, with
+        the same effect as a positive boolean.  If enabled, the systemd manager (PID
+        1) shows terse service status updates on the console during bootup.
+        <constant>auto</constant> behaves like <option>false</option> until a unit
+        fails or there is a significant delay in boot. Defaults to enabled, unless
+        <option>quiet</option> is passed as kernel command line option, in which case
+        it defaults to <constant>auto</constant>. If specified overrides the system
+        manager configuration file option <option>ShowStatus=</option>, see
+        <citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+        However, the process command line option <option>--show-status=</option>
+        takes precedence over both this kernel command line option and the
+        configuration file option.</para></listitem>
       </varlistentry>
 
       <varlistentry>
         <term><varname>systemd.log_target=</varname></term>
         <term><varname>systemd.log_level=</varname></term>
-        <term><varname>systemd.log_color=</varname></term>
         <term><varname>systemd.log_location=</varname></term>
+        <term><varname>systemd.log_color</varname></term>
 
-        <listitem><para>Controls log output, with the same effect as
-        the <varname>$SYSTEMD_LOG_TARGET</varname>,
+        <listitem><para>Controls log output, with the same effect as the
+        <varname>$SYSTEMD_LOG_TARGET</varname>,
         <varname>$SYSTEMD_LOG_LEVEL</varname>,
-        <varname>$SYSTEMD_LOG_COLOR</varname>,
-        <varname>$SYSTEMD_LOG_LOCATION</varname> environment variables
-        described above.</para></listitem>
+        <varname>$SYSTEMD_LOG_LOCATION</varname>,
+        <varname>$SYSTEMD_LOG_COLOR</varname> environment variables described above.
+        <varname>systemd.log_color</varname> can be specified without an argument,
+        with the same effect as a positive boolean.</para></listitem>
       </varlistentry>
 
       <varlistentry>
       </varlistentry>
 
       <varlistentry>
+        <term><varname>systemd.unified_cgroup_hierarchy</varname></term>
+
+        <listitem><para>When specified without an argument or with a true argument,
+        enables the usage of
+        <ulink url="https://www.kernel.org/doc/Documentation/cgroup-v2.txt">unified cgroup hierarchy</ulink>
+        (a.k.a. cgroups-v2). When specified with a false argument, fall back to
+        hybrid or full legacy cgroup hierarchy.</para>
+
+        <para>If this option is not specified, the default behaviour is determined
+        during compilation (the <option>--with-default-hierarchy=</option>
+        option). If the kernel does not support unified cgroup hierarchy, the legacy
+        hierarchy will be used even if this option is specified.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>systemd.legacy_systemd_cgroup_controller</varname></term>
+
+        <listitem><para>Takes effect if the full unified cgroup hierarchy is not used
+        (see previous option). When specified without an argument or with a true
+        argument, disables the use of "hybrid" cgroup hierarchy (i.e. a cgroups-v2
+        tree used for systemd, and
+        <ulink url="https://www.kernel.org/doc/Documentation/cgroup-v1/">legacy
+        cgroup hierarchy</ulink>, a.k.a. cgroups-v1, for other controllers), and
+        forces a full "legacy" mode. When specified with a false argument, enables
+        the use of "hybrid" hierarchy.</para>
+
+        <para>If this option is not specified, the default behaviour is determined
+        during compilation (the <option>--with-default-hierarchy=</option>
+        option). If the kernel does not support unified cgroup hierarchy, the legacy
+        hierarchy will be used  even if this option is specified.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><varname>quiet</varname></term>
 
         <listitem><para>Turn off status output at boot, much like
   <refsect1>
     <title>See Also</title>
     <para>
-      The <ulink url="http://www.freedesktop.org/wiki/Software/systemd/">systemd Homepage</ulink>,
+      The <ulink url="https://www.freedesktop.org/wiki/Software/systemd/">systemd Homepage</ulink>,
       <citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry project='man-pages'><refentrytitle>locale.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
       <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
index 18ee380..f232d99 100644 (file)
   <refsect1>
     <title>Description</title>
 
-    <para><command>systemd-sysusers</command> uses the files from
-    <filename>sysusers.d</filename> directory to create system users
-    and groups at package installation or boot time. This tool may be
-    used to allocate system users and groups only, it is not useful
-    for creating non-system users and groups, as it accesses
-    <filename>/etc/passwd</filename> and
-    <filename>/etc/group</filename> directly, bypassing any more
-    complex user databases, for example any database involving NIS or
-    LDAP.</para>
+    <para><command>systemd-sysusers</command> uses the files from <filename>sysusers.d</filename> directory to create
+    system users and groups at package installation or boot time. This tool may be used to allocate system users and
+    groups only, it is not useful for creating non-system (i.e. regular, "human") users and groups, as it accesses
+    <filename>/etc/passwd</filename> and <filename>/etc/group</filename> directly, bypassing any more complex user
+    databases, for example any database involving NIS or LDAP.</para>
   </refsect1>
 
   <refsect1>
@@ -83,6 +79,9 @@ g input - -
 m authd input
 u root 0 "Superuser" /root</programlisting>
 
+    <para>Empty lines and lines beginning with the <literal>#</literal> character are ignored, and may be used for
+    commenting.</para>
+
     <refsect2>
       <title>Type</title>
 
@@ -134,14 +133,14 @@ u root 0 "Superuser" /root</programlisting>
     <refsect2>
       <title>Name</title>
 
-      <para>The name field specifies the user or group name. It should
-      be shorter than 31 characters and avoid any non-ASCII
-      characters, and not begin with a numeric character. It is
-      strongly recommended to pick user and group names that are
-      unlikely to clash with normal users created by the
-      administrator. A good scheme to guarantee this is by prefixing
-      all system and group names with the underscore, and avoiding too
-      generic names.</para>
+      <para>The name field specifies the user or group name. The specified name must consist only of the characters a-z,
+      A-Z, 0-9, <literal>_</literal> and <literal>-</literal>, except for the first character which must be one of a-z,
+      A-Z or <literal>_</literal> (i.e. numbers and <literal>-</literal> are not permitted as first character). The
+      user/group name must have at least one character, and at most 31.</para>
+
+      <para>It is strongly recommended to pick user and group names that are unlikely to clash with normal users
+      created by the administrator. A good scheme to guarantee this is by prefixing all system and group names with the
+      underscore, and avoiding too generic names.</para>
 
       <para>For <varname>m</varname> lines, this field should contain
       the user name to add to a group.</para>
index 02d31fb..bdd22a6 100644 (file)
         <listitem><para>Change the SysV runlevel. This is translated
         into an activation request for
         <filename>runlevel2.target</filename>,
-        <filename>runlevel3.target</filename>, ... and is equivalent
+        <filename>runlevel3.target</filename>,  and is equivalent
         to <command>systemctl isolate runlevel2.target</command>,
         <command>systemctl isolate runlevel3.target</command>,
-        ...</para></listitem>
+        </para></listitem>
       </varlistentry>
 
       <varlistentry>
index 415e2c7..d8a83c8 100644 (file)
@@ -232,7 +232,7 @@ Password: ********
    Status: "Using Time Server 216.239.38.15:123 (time4.google.com)."
    CGroup: /system.slice/systemd-timesyncd.service
            └─595 /usr/lib/systemd/systemd-timesyncd
-...</programlisting>
+</programlisting>
     </para>
   </refsect1>
 
index 957475d..555e9c2 100644 (file)
     type, path, mode, ownership, age, and argument fields:</para>
 
     <programlisting>#Type Path        Mode UID  GID  Age Argument
-    d    /run/user   0755 root root 10d -
-    L    /tmp/foobar -    -    -    -   /dev/null</programlisting>
+    /run/user   0755 root root 10d -
+    /tmp/foobar -    -    -    -   /dev/null</programlisting>
 
     <para>Fields may be enclosed within quotes and contain C-style escapes.</para>
 
           <term><varname>d</varname></term>
           <listitem><para>Create a directory. The mode and ownership will be adjusted if
           specified and the directory already exists. Contents of this directory are subject
-          to time based cleanup if the time argument is specified.</para></listitem>
+          to time based cleanup if the age argument is specified.</para></listitem>
         </varlistentry>
 
         <varlistentry>
 
         <varlistentry>
           <term><varname>e</varname></term>
-          <listitem><para>Similar to <varname>d</varname>, but the directory will not be
-          created if it does not exist. Lines of this type accept shell-style globs in
-          place of normal path names.</para></listitem>
+          <listitem><para>Similar to <varname>d</varname>, but the directory will not be created if
+          it does not exist. Lines of this type accept shell-style globs in place of normal path
+          names. For this entry to be useful, at least one of the mode, uid, gid, or age arguments
+          must be specified, since otherwise this entry has no effect. If the age argument is
+          <literal>0</literal>, contents of the directory will be unconditionally deleted every time
+          <command>systemd-tmpfiles --clean</command> is run. This can be useful when combined with
+          <varname>!</varname>, see the examples.</para></listitem>
         </varlistentry>
 
         <varlistentry>
     <example>
       <title>Create directories with specific mode and ownership</title>
       <para>
-      <citerefentry><refentrytitle>screen</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry project='die-net'><refentrytitle>screen</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       needs two directories created at boot with specific modes and ownership:</para>
 
       <programlisting># /usr/lib/tmpfiles.d/screen.conf
@@ -644,7 +648,7 @@ d /run/uscreens 0755 root screen 10d12h
 t /run/cups - - - - security.SMACK64=printing user.attr-with-spaces="foo bar"
       </programlisting>
 
-      <para>The direcory will be owned by root and have default mode. It's contents are
+      <para>The directory will be owned by root and have default mode. Its contents are
       not subject to time based cleanup, but will be obliterated when
       <command>systemd-tmpfiles --remove</command> runs.</para>
     </example>
@@ -652,7 +656,7 @@ t /run/cups - - - - security.SMACK64=printing user.attr-with-spaces="foo bar"
     <example>
       <title>Create a directory and prevent its contents from cleanup</title>
       <para>
-      <citerefentry><refentrytitle>abrt</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+      <citerefentry project='die-net'><refentrytitle>abrt</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
       needs a directory created at boot with specific mode and ownership and its content
       should be preserved from the automatic cleanup applied to the contents of
       <filename>/var/tmp</filename>:</para>
@@ -680,6 +684,18 @@ e  /var/chache/dnf/ - - - 30d
      <filename>/var/chache/dnf/</filename> will be removed after they have not been
      accessed in 30 days.</para>
     </example>
+
+    <example>
+      <title>Empty the contents of a cache directory on boot</title>
+
+      <programlisting># /usr/lib/tmpfiles.d/krb5rcache.conf
+e! /var/cache/krb5rcache - - - 0
+</programlisting>
+
+      <para>Any files and subdirectories in <filename>/var/cache/krb5rcache/</filename>
+      will be removed on boot. The directory will not be created.
+      </para>
+    </example>
   </refsect1>
 
   <refsect1>
index dd55636..3359fb0 100644 (file)
 
       <para>The <varname>NAME</varname>, <varname>SYMLINK</varname>,
       <varname>PROGRAM</varname>, <varname>OWNER</varname>,
-      <varname>GROUP</varname>, <varname>MODE</varname>, and
-      <varname>RUN</varname> fields support simple string substitutions.
+      <varname>GROUP</varname>, <varname>MODE</varname>, <varname>SECLABEL</varname>,
+      and <varname>RUN</varname> fields support simple string substitutions.
       The <varname>RUN</varname> substitutions are performed after all rules
       have been processed, right before the program is executed, allowing for
       the use of device properties set by earlier matching rules. For all other
index 1c7921f..8d4fe31 100644 (file)
           <term><option>-s</option></term>
           <term><option>--subsystem-match=<replaceable>string[/string]</replaceable></option></term>
           <listitem>
-            <para>Filter events by subsystem[/devtype]. Only udev events with a matching subsystem value will pass.</para>
+            <para>Filter kernel uevents and udev events by subsystem[/devtype]. Only events with a matching subsystem value will pass.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
           <term><option>-t</option></term>
           <term><option>--tag-match=<replaceable>string</replaceable></option></term>
           <listitem>
-            <para>Filter events by property. Only udev events with a given tag attached will pass.</para>
+            <para>Filter udev events by tag. Only udev events with a given tag attached will pass.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
index 27196d4..4a6672c 100644 (file)
@@ -55,8 +55,9 @@
 
     <para>The <filename>/etc/vconsole.conf</filename> file configures
     the virtual console, i.e. keyboard mapping and console font. It is
-    applied at boot by
-    <citerefentry><refentrytitle>systemd-vconsole-setup.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
+    applied at boot by udev using <filename>90-vconsole.rules</filename> file.
+    You can safely mask this file if you want to avoid this kind of initialization.
+    </para>
 
     <para>The basic file format of the
     <filename>vconsole.conf</filename> is a newline-separated list of
 
     <para>Note that the kernel command line options
     <varname>vconsole.keymap=</varname>,
-    <varname>vconsole.keymap.toggle=</varname>,
+    <varname>vconsole.keymap_toggle=</varname>,
     <varname>vconsole.font=</varname>,
-    <varname>vconsole.font.map=</varname>,
-    <varname>vconsole.font.unimap=</varname> may be used
+    <varname>vconsole.font_map=</varname>,
+    <varname>vconsole.font_unimap=</varname> may be used
     to override the console settings at boot.</para>
 
     <para>Depending on the operating system other configuration files
     might be checked for configuration of the virtual console as well,
     however only as fallback.</para>
+
+    <para><filename>/etc/vconsole.conf</filename> is usually created and updated
+    using
+    <citerefentry><refentrytitle>systemd-localed.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
+    <citerefentry><refentrytitle>localectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+    may be used to instruct <command>systemd-localed.service</command> to
+    query or update configuration.</para>
   </refsect1>
 
   <refsect1>
         <term><varname>KEYMAP=</varname></term>
         <term><varname>KEYMAP_TOGGLE=</varname></term>
 
-        <listitem><para>Configures the key mapping table for the
-        keyboard. <varname>KEYMAP=</varname> defaults to
-        <literal>us</literal> if not set. The
-        <varname>KEYMAP_TOGGLE=</varname> can be used to configure a
-        second toggle keymap and is by default
-        unset.</para></listitem>
+        <listitem><para>Configures the key mapping table for the keyboard.
+        <varname>KEYMAP=</varname> defaults to <literal>us</literal> if not set. The
+        <varname>KEYMAP_TOGGLE=</varname> can be used to configure a second toggle keymap and is by
+        default unset.</para></listitem>
       </varlistentry>
 
       <varlistentry>
   </refsect1>
 
   <refsect1>
+    <title>Kernel Command Line</title>
+
+    <para>A few configuration parameters from <filename>vconsole.conf</filename> may be overridden
+    on the kernel command line:</para>
+
+    <variablelist class='kernel-commandline-options'>
+      <varlistentry>
+        <term><varname>vconsole.keymap=</varname></term>
+        <term><varname>vconsole.keymap_toggle=</varname></term>
+
+        <listitem><para>Overrides <varname>KEYMAP=</varname> and <varname>KEYMAP_TOGGLE=</varname>.
+        </para></listitem>
+      </varlistentry>
+      <varlistentry>
+
+        <term><varname>vconsole.font=</varname></term>
+        <term><varname>vconsole.font_map=</varname></term>
+        <term><varname>vconsole.font_unimap=</varname></term>
+
+        <listitem><para>Overrides <varname>FONT=</varname>, <varname>FONT_MAP=</varname>, and
+        <varname>FONT_UNIMAP=</varname>.</para></listitem>
+      </varlistentry>
+    </variablelist>
+  </refsect1>
+
+  <refsect1>
     <title>Example</title>
 
     <example>
diff --git a/meson.build b/meson.build
new file mode 100644 (file)
index 0000000..3f64c19
--- /dev/null
@@ -0,0 +1,2530 @@
+project('systemd', 'c',
+        version : '234',
+        license : 'LGPLv2+',
+        default_options: [
+                'c_std=gnu99',
+                'prefix=/usr',
+                'sysconfdir=/etc',
+                'localstatedir=/var',
+        ],
+        meson_version : '>= 0.40',
+       )
+
+# We need the same data in three different formats, ugh!
+# Also, for hysterical reasons, we use different variable
+# names, sometimes. Not all variables are included in every
+# set. Ugh, ugh, ugh!
+conf = configuration_data()
+conf.set_quoted('PACKAGE_STRING',  meson.project_name() + ' ' + meson.project_version())
+conf.set_quoted('PACKAGE_VERSION', meson.project_version())
+
+substs = configuration_data()
+substs.set('PACKAGE_URL',          'https://www.freedesktop.org/wiki/Software/systemd')
+substs.set('PACKAGE_VERSION',      meson.project_version())
+
+m4_defines = []
+
+#####################################################################
+
+rootprefixdir = get_option('rootprefix')
+if get_option('split-usr')
+        conf.set('HAVE_SPLIT_USR', true)
+        rootprefixdir = rootprefixdir != '' ? rootprefixdir : '/'
+else
+        rootprefixdir = rootprefixdir != '' ? rootprefixdir : '/usr'
+endif
+
+sysvinit_path = get_option('sysvinit-path')
+sysvrcnd_path = get_option('sysvrcnd-path')
+if sysvinit_path != '' or sysvrcnd_path != ''
+        conf.set('HAVE_SYSV_COMPAT', true,
+                 description : 'SysV init scripts and rcN.d links are supported')
+        m4_defines += ['-DHAVE_SYSV_COMPAT']
+endif
+
+# join_paths ignore the preceding arguments if an absolute component is
+# encountered, so this should canonicalize various paths when they are
+# absolute or relative.
+prefixdir = get_option('prefix')
+if not prefixdir.startswith('/')
+        error('Prefix is not absolute: "@0@"'.format(prefixdir))
+endif
+bindir = join_paths(prefixdir, get_option('bindir'))
+libdir = join_paths(prefixdir, get_option('libdir'))
+sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
+includedir = join_paths(prefixdir, get_option('includedir'))
+datadir = join_paths(prefixdir, get_option('datadir'))
+localstatedir = join_paths('/', get_option('localstatedir'))
+
+rootbindir = join_paths(rootprefixdir, 'bin')
+rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
+
+rootlibdir = get_option('rootlibdir')
+if rootlibdir == ''
+        rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
+endif
+
+# Dirs of external packages
+pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
+pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
+polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
+polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
+polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
+varlogdir = join_paths(localstatedir, 'log')
+xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
+rpmmacrosdir = get_option('rpmmacrosdir')
+
+# Our own paths
+pkgdatadir = join_paths(datadir, 'systemd')
+environmentdir = join_paths(prefixdir, 'lib/environment.d')
+pkgsysconfdir = join_paths(sysconfdir, 'systemd')
+userunitdir = join_paths(prefixdir, 'lib/systemd/user')
+userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
+tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
+sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
+sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
+binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
+modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
+networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
+pkgincludedir = join_paths(includedir, 'systemd')
+systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
+usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
+systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
+userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
+systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
+systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
+systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
+systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
+udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
+udevhomedir = udevlibexecdir
+udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
+udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
+catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
+kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
+factorydir = join_paths(datadir, 'factory')
+docdir = join_paths(datadir, 'doc/systemd')
+bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
+testsdir = join_paths(prefixdir, 'lib/systemd/tests')
+systemdstatedir = join_paths(localstatedir, 'lib/systemd')
+catalogstatedir = join_paths(systemdstatedir, 'catalog')
+randomseeddir = join_paths(localstatedir, 'lib/systemd')
+
+dbuspolicydir = get_option('dbuspolicydir')
+if dbuspolicydir == ''
+        dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
+endif
+
+dbussessionservicedir = get_option('dbussessionservicedir')
+if dbussessionservicedir == ''
+        dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
+endif
+
+dbussystemservicedir = get_option('dbussystemservicedir')
+if dbussystemservicedir == ''
+        dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
+endif
+
+pamlibdir = get_option('pamlibdir')
+if pamlibdir == ''
+        pamlibdir = join_paths(rootlibdir, 'security')
+endif
+
+pamconfdir = get_option('pamconfdir')
+if pamconfdir == ''
+        pamconfdir = join_paths(sysconfdir, 'pam.d')
+endif
+
+conf.set_quoted('PKGSYSCONFDIR',                              pkgsysconfdir)
+conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH',                    join_paths(pkgsysconfdir, 'system'))
+conf.set_quoted('SYSTEM_DATA_UNIT_PATH',                      systemunitdir)
+conf.set_quoted('SYSTEM_SYSVINIT_PATH',                       sysvinit_path)
+conf.set_quoted('SYSTEM_SYSVRCND_PATH',                       sysvrcnd_path)
+conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START',                 get_option('rc-local'))
+conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP',                  get_option('halt-local'))
+conf.set_quoted('USER_CONFIG_UNIT_PATH',                      join_paths(pkgsysconfdir, 'user'))
+conf.set_quoted('USER_DATA_UNIT_PATH',                        userunitdir)
+conf.set_quoted('CERTIFICATE_ROOT',                           get_option('certificate-root'))
+conf.set_quoted('CATALOG_DATABASE',                           join_paths(catalogstatedir, 'database'))
+conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH',                  join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
+conf.set_quoted('SYSTEMD_BINARY_PATH',                        join_paths(rootlibexecdir, 'systemd'))
+conf.set_quoted('SYSTEMD_FSCK_PATH',                          join_paths(rootlibexecdir, 'systemd-fsck'))
+conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH',               join_paths(rootlibexecdir, 'systemd-shutdown'))
+conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH',                  join_paths(rootlibexecdir, 'systemd-sleep'))
+conf.set_quoted('SYSTEMCTL_BINARY_PATH',                      join_paths(rootbindir, 'systemctl'))
+conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
+conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH',           join_paths(bindir, 'systemd-stdio-bridge'))
+conf.set_quoted('ROOTPREFIX',                                 rootprefixdir)
+conf.set_quoted('RANDOM_SEED_DIR',                            randomseeddir)
+conf.set_quoted('RANDOM_SEED',                                join_paths(randomseeddir, 'random-seed'))
+conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH',                    join_paths(rootlibexecdir, 'systemd-cryptsetup'))
+conf.set_quoted('SYSTEM_GENERATOR_PATH',                      systemgeneratordir)
+conf.set_quoted('USER_GENERATOR_PATH',                        usergeneratordir)
+conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH',                  systemenvgeneratordir)
+conf.set_quoted('USER_ENV_GENERATOR_PATH',                    userenvgeneratordir)
+conf.set_quoted('SYSTEM_SHUTDOWN_PATH',                       systemshutdowndir)
+conf.set_quoted('SYSTEM_SLEEP_PATH',                          systemsleepdir)
+conf.set_quoted('SYSTEMD_KBD_MODEL_MAP',                      join_paths(pkgdatadir, 'kbd-model-map'))
+conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP',              join_paths(pkgdatadir, 'language-fallback-map'))
+conf.set_quoted('UDEVLIBEXECDIR',                             udevlibexecdir)
+conf.set_quoted('POLKIT_AGENT_BINARY_PATH',                   join_paths(bindir, 'pkttyagent'))
+conf.set_quoted('LIBDIR',                                     libdir)
+conf.set_quoted('ROOTLIBDIR',                                 rootlibdir)
+conf.set_quoted('ROOTLIBEXECDIR',                             rootlibexecdir)
+conf.set_quoted('BOOTLIBDIR',                                 bootlibdir)
+conf.set_quoted('SYSTEMD_PULL_PATH',                          join_paths(rootlibexecdir, 'systemd-pull'))
+conf.set_quoted('SYSTEMD_IMPORT_PATH',                        join_paths(rootlibexecdir, 'systemd-import'))
+conf.set_quoted('SYSTEMD_EXPORT_PATH',                        join_paths(rootlibexecdir, 'systemd-export'))
+conf.set_quoted('VENDOR_KEYRING_PATH',                        join_paths(rootlibexecdir, 'import-pubring.gpg'))
+conf.set_quoted('USER_KEYRING_PATH',                          join_paths(pkgsysconfdir, 'import-pubring.gpg'))
+conf.set_quoted('DOCUMENT_ROOT',                              join_paths(pkgdatadir, 'gatewayd'))
+
+conf.set_quoted('ABS_BUILD_DIR',                              meson.build_root())
+conf.set_quoted('ABS_SRC_DIR',                                meson.source_root())
+
+substs.set('prefix',                                          prefixdir)
+substs.set('exec_prefix',                                     prefixdir)
+substs.set('libdir',                                          libdir)
+substs.set('rootlibdir',                                      rootlibdir)
+substs.set('includedir',                                      includedir)
+substs.set('pkgsysconfdir',                                   pkgsysconfdir)
+substs.set('bindir',                                          bindir)
+substs.set('rootbindir',                                      rootbindir)
+substs.set('rootlibexecdir',                                  rootlibexecdir)
+substs.set('systemunitdir',                                   systemunitdir)
+substs.set('userunitdir',                                     userunitdir)
+substs.set('systempresetdir',                                 systempresetdir)
+substs.set('userpresetdir',                                   userpresetdir)
+substs.set('udevhwdbdir',                                     udevhwdbdir)
+substs.set('udevrulesdir',                                    udevrulesdir)
+substs.set('udevlibexecdir',                                  udevlibexecdir)
+substs.set('catalogdir',                                      catalogdir)
+substs.set('tmpfilesdir',                                     tmpfilesdir)
+substs.set('sysusersdir',                                     sysusersdir)
+substs.set('sysctldir',                                       sysctldir)
+substs.set('binfmtdir',                                       binfmtdir)
+substs.set('modulesloaddir',                                  modulesloaddir)
+substs.set('systemgeneratordir',                              systemgeneratordir)
+substs.set('usergeneratordir',                                usergeneratordir)
+substs.set('systemenvgeneratordir',                           systemenvgeneratordir)
+substs.set('userenvgeneratordir',                             userenvgeneratordir)
+substs.set('systemshutdowndir',                               systemshutdowndir)
+substs.set('systemsleepdir',                                  systemsleepdir)
+substs.set('VARLOGDIR',                                       varlogdir)
+substs.set('CERTIFICATEROOT',                                 get_option('certificate-root'))
+substs.set('SYSTEMCTL',                                       join_paths(rootbindir, 'systemctl'))
+substs.set('RANDOM_SEED',                                     join_paths(randomseeddir, 'random-seed'))
+substs.set('SYSTEM_SYSVINIT_PATH',                            sysvinit_path)
+substs.set('SYSTEM_SYSVRCND_PATH',                            sysvrcnd_path)
+substs.set('RC_LOCAL_SCRIPT_PATH_START',                      get_option('rc-local'))
+substs.set('RC_LOCAL_SCRIPT_PATH_STOP',                       get_option('halt-local'))
+
+#####################################################################
+
+cc = meson.get_compiler('c')
+pkgconfig = import('pkgconfig')
+check_compilation_sh = find_program('tools/meson-check-compilation.sh')
+
+cxx = find_program('c++', required : false)
+if cxx.found()
+        #  Used only for tests
+        add_languages('cpp')
+endif
+
+foreach arg : ['-Wextra',
+               '-Wundef',
+               '-Wlogical-op',
+               '-Wmissing-include-dirs',
+               '-Wold-style-definition',
+               '-Wpointer-arith',
+               '-Winit-self',
+               '-Wdeclaration-after-statement',
+               '-Wfloat-equal',
+               '-Wsuggest-attribute=noreturn',
+               '-Werror=missing-prototypes',
+               '-Werror=implicit-function-declaration',
+               '-Werror=missing-declarations',
+               '-Werror=return-type',
+               '-Werror=incompatible-pointer-types',
+               '-Werror=format=2',
+               '-Wstrict-prototypes',
+               '-Wredundant-decls',
+               '-Wmissing-noreturn',
+               '-Wshadow',
+               '-Wendif-labels',
+               '-Wstrict-aliasing=2',
+               '-Wwrite-strings',
+               '-Werror=overflow',
+               '-Wdate-time',
+               '-Wnested-externs',
+               '-ffast-math',
+               '-fno-common',
+               '-fdiagnostics-show-option',
+               '-fno-strict-aliasing',
+               '-fvisibility=hidden',
+               '-fstack-protector',
+               '-fstack-protector-strong',
+               '-fPIE',
+               '--param=ssp-buffer-size=4',
+              ]
+        if cc.has_argument(arg)
+                add_project_arguments(arg, language : 'c')
+        endif
+endforeach
+
+# "negative" arguments: gcc on purpose does not return an error for "-Wno-"
+# arguments, just emits a warnings. So test for the "positive" version instead.
+foreach arg : ['unused-parameter',
+               'missing-field-initializers',
+               'unused-result',
+               'format-signedness']
+        if cc.has_argument('-W' + arg)
+                add_project_arguments('-Wno-' + arg, language : 'c')
+        endif
+endforeach
+
+if cc.compiles('
+   #include <time.h>
+   #include <inttypes.h>
+   typedef uint64_t usec_t;
+   usec_t now(clockid_t clock);
+   int main(void) {
+           struct timespec now;
+           return 0;
+   }
+', name : '-Werror=shadow with local shadowing')
+        add_project_arguments('-Werror=shadow', language : 'c')
+endif
+
+if cc.get_id() == 'clang'
+        foreach arg : ['-Wno-typedef-redefinition',
+                       '-Wno-gnu-variable-sized-type-not-at-end',
+                      ]
+                if cc.has_argument(arg,
+                                   name : '@0@ is supported'.format(arg))
+                        add_project_arguments(arg, language : 'c')
+                endif
+        endforeach
+endif
+
+link_test_c = files('tools/meson-link-test.c')
+
+# --as-needed and --no-undefined are provided by meson by default,
+# run mesonconf to see what is enabled
+foreach arg : ['-Wl,-z,relro',
+               '-Wl,-z,now',
+               '-pie',
+              ]
+
+        have = run_command(check_compilation_sh,
+                           cc.cmd_array(), '-x', 'c', arg,
+                           '-include', link_test_c).returncode() == 0
+        message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
+        if have
+                add_project_link_arguments(arg, language : 'c')
+        endif
+endforeach
+
+if get_option('buildtype') != 'debug'
+        foreach arg : ['-ffunction-sections',
+                       '-fdata-sections']
+                if cc.has_argument(arg,
+                                   name : '@0@ is supported'.format(arg))
+                        add_project_arguments(arg, language : 'c')
+                endif
+        endforeach
+
+        foreach arg : ['-Wl,--gc-sections']
+                have = run_command(check_compilation_sh,
+                                   cc.cmd_array(), '-x', 'c', arg,
+                                   '-include', link_test_c).returncode() == 0
+                message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
+                if have
+                        add_project_link_arguments(arg, language : 'c')
+                endif
+        endforeach
+endif
+
+cpp = ' '.join(cc.cmd_array()) + ' -E'
+
+#####################################################################
+# compilation result tests
+
+conf.set('_GNU_SOURCE', true)
+conf.set('__SANE_USERSPACE_TYPES__', true)
+
+conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
+conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
+conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
+conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
+conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
+conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
+conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
+
+decl_headers = '''
+#include <uchar.h>
+#include <linux/ethtool.h>
+'''
+# FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
+
+foreach decl : ['char16_t',
+                'char32_t',
+                'key_serial_t',
+                'struct ethtool_link_settings',
+               ]
+
+        # We get -1 if the size cannot be determined
+        have = cc.sizeof(decl, prefix : decl_headers) > 0
+        conf.set('HAVE_' + decl.underscorify().to_upper(), have)
+endforeach
+
+foreach decl : [['IFLA_INET6_ADDR_GEN_MODE',         'linux/if_link.h'],
+                ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
+                ['IFLA_VRF_TABLE',                   'linux/if_link.h'],
+                ['IFLA_MACVLAN_FLAGS',               'linux/if_link.h'],
+                ['IFLA_IPVLAN_MODE',                 'linux/if_link.h'],
+                ['IFLA_PHYS_PORT_ID',                'linux/if_link.h'],
+                ['IFLA_BOND_AD_INFO',                'linux/if_link.h'],
+                ['IFLA_VLAN_PROTOCOL',               'linux/if_link.h'],
+                ['IFLA_VXLAN_REMCSUM_NOPARTIAL',     'linux/if_link.h'],
+                ['IFLA_VXLAN_GPE',                   'linux/if_link.h'],
+                ['IFLA_GENEVE_LABEL',                'linux/if_link.h'],
+                # if_tunnel.h is buggy and cannot be included on its own
+                ['IFLA_VTI_REMOTE',                  'linux/if_tunnel.h', '#include <net/if.h>'],
+                ['IFLA_IPTUN_ENCAP_DPORT',           'linux/if_tunnel.h', '#include <net/if.h>'],
+                ['IFLA_GRE_ENCAP_DPORT',             'linux/if_tunnel.h', '#include <net/if.h>'],
+                ['IFLA_BRIDGE_VLAN_INFO',            'linux/if_bridge.h'],
+                ['IFLA_BRPORT_PROXYARP',             'linux/if_link.h'],
+                ['IFLA_BRPORT_LEARNING_SYNC',        'linux/if_link.h'],
+                ['IFLA_BR_VLAN_DEFAULT_PVID',        'linux/if_link.h'],
+                ['NDA_IFINDEX',                      'linux/neighbour.h'],
+                ['IFA_FLAGS',                        'linux/if_addr.h'],
+                ['LO_FLAGS_PARTSCAN',                'linux/loop.h'],
+               ]
+        prefix = decl.length() > 2 ? decl[2] : ''
+        have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
+        conf.set10('HAVE_DECL_' + decl[0], have)
+endforeach
+
+skip = false
+foreach ident : ['secure_getenv', '__secure_getenv']
+        if not skip and cc.has_function(ident)
+                conf.set('HAVE_' + ident.to_upper(), true)
+                skip = true
+        endif
+endforeach
+
+foreach ident : [
+        ['memfd_create',      '''#include <sys/memfd.h>'''],
+        ['gettid',            '''#include <sys/types.h>'''],
+        ['pivot_root',        '''#include <stdlib.h>'''],     # no known header declares pivot_root
+        ['name_to_handle_at', '''#define _GNU_SOURCE
+                                 #include <sys/types.h>
+                                 #include <sys/stat.h>
+                                 #include <fcntl.h>'''],
+        ['setns',             '''#define _GNU_SOURCE
+                                 #include <sched.h>'''],
+        ['renameat2',         '''#include <stdio.h>'''],
+        ['kcmp',              '''#include <linux/kcmp.h>'''],
+        ['keyctl',            '''#include <sys/types.h>
+                                 #include <keyutils.h>'''],
+        ['copy_file_range',   '''#include <sys/syscall.h>
+                                 #include <unistd.h>'''],
+        ['explicit_bzero' ,   '''#include <string.h>'''],
+]
+
+        have = cc.has_function(ident[0], prefix : ident[1])
+        conf.set10('HAVE_DECL_' + ident[0].to_upper(), have)
+endforeach
+
+if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''')
+        conf.set('USE_SYS_RANDOM_H', true)
+        conf.set10('HAVE_DECL_GETRANDOM', true)
+else
+        have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
+        conf.set10('HAVE_DECL_GETRANDOM', have)
+endif
+
+#####################################################################
+
+sed = find_program('sed')
+grep = find_program('grep')
+awk = find_program('awk')
+m4 = find_program('m4')
+stat = find_program('stat')
+git = find_program('git', required : false)
+
+meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
+mkdir_p = 'mkdir -p $DESTDIR/@0@'
+test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
+splash_bmp = files('test/splash.bmp')
+
+# if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
+# /usr/sbin, /sbin, and fall back to the default from middle column.
+progs = [['telinit',    '/lib/sysvinit/telinit'],
+         ['quotaon',    '/usr/sbin/quotaon'    ],
+         ['quotacheck', '/usr/sbin/quotacheck' ],
+         ['kill',       '/usr/bin/kill'        ],
+         ['kmod',       '/usr/bin/kmod'        ],
+         ['kexec',      '/usr/sbin/kexec'      ],
+         ['sulogin',    '/usr/sbin/sulogin'    ],
+         ['mount',      '/usr/bin/mount',      'MOUNT_PATH'],
+         ['umount',     '/usr/bin/umount',     'UMOUNT_PATH'],
+         ['loadkeys',   '/usr/bin/loadkeys',   'KBD_LOADKEYS'],
+         ['setfont',    '/usr/bin/setfont',    'KBD_SETFONT'],
+        ]
+foreach prog : progs
+        path = get_option(prog[0] + '-path')
+        if path != ''
+                message('Using @1@ for @0@'.format(prog[0], path))
+        else
+                exe = find_program(prog[0],
+                                   '/usr/sbin/' + prog[0],
+                                   '/sbin/' + prog[0],
+                                   required: false)
+                path = exe.found() ? exe.path() : prog[1]
+        endif
+        name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
+        conf.set_quoted(name, path)
+        substs.set(name, path)
+endforeach
+
+#if run_command('ln', '--relative', '--help').returncode() != 0
+#        error('ln does not support --relative')
+#endif
+
+############################################################
+
+gperf = find_program('gperf')
+
+gperf_test_format = '''
+#include <string.h>
+const char * in_word_set(const char *, @0@);
+@1@
+'''
+gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
+gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
+gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
+if cc.compiles(gperf_test)
+        gperf_len_type = 'size_t'
+else
+        gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
+        if cc.compiles(gperf_test)
+                gperf_len_type = 'unsigned'
+        else
+                error('unable to determine gperf len type')
+        endif
+endif
+message('gperf len type is @0@'.format(gperf_len_type))
+conf.set('GPERF_LEN_TYPE', gperf_len_type,
+         description : 'The type of gperf "len" parameter')
+
+############################################################
+
+if not cc.has_header('sys/capability.h')
+        error('POSIX caps headers not found')
+endif
+foreach header : ['linux/btrfs.h',
+                  'linux/memfd.h',
+                  'linux/vm_sockets.h',
+                  'valgrind/memcheck.h',
+                  'valgrind/valgrind.h',
+                 ]
+
+        conf.set('HAVE_' + header.underscorify().to_upper(),
+                 cc.has_header(header))
+endforeach
+
+############################################################
+
+conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
+
+default_hierarchy = get_option('default-hierarchy')
+conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
+                description : 'default cgroup hierarchy as string')
+if default_hierarchy == 'legacy'
+        conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
+elif default_hierarchy == 'hybrid'
+        conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
+else
+        conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
+endif
+
+time_epoch = get_option('time-epoch')
+if time_epoch == ''
+        NEWS = files('NEWS')
+        time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
+endif
+time_epoch = time_epoch.to_int()
+conf.set('TIME_EPOCH', time_epoch)
+
+system_uid_max = get_option('system-uid-max')
+if system_uid_max == ''
+        system_uid_max = run_command(
+                awk,
+                'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
+                '/etc/login.defs').stdout()
+endif
+system_uid_max = system_uid_max.to_int()
+conf.set('SYSTEM_UID_MAX', system_uid_max)
+substs.set('systemuidmax', system_uid_max)
+message('maximum system UID is @0@'.format(system_uid_max))
+
+conf.set_quoted('NOBODY_USER_NAME', get_option('nobody-user'))
+conf.set_quoted('NOBODY_GROUP_NAME', get_option('nobody-group'))
+
+system_gid_max = get_option('system-gid-max')
+if system_gid_max == ''
+        system_gid_max = run_command(
+                awk,
+                'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
+                '/etc/login.defs').stdout()
+endif
+system_gid_max = system_gid_max.to_int()
+conf.set('SYSTEM_GID_MAX', system_gid_max)
+substs.set('systemgidmax', system_gid_max)
+message('maximum system GID is @0@'.format(system_gid_max))
+
+tty_gid = get_option('tty-gid')
+conf.set('TTY_GID', tty_gid)
+substs.set('TTY_GID', tty_gid)
+
+if get_option('adm-group')
+        m4_defines += ['-DENABLE_ADM_GROUP']
+endif
+
+if get_option('wheel-group')
+        m4_defines += ['-DENABLE_WHEEL_GROUP']
+endif
+
+substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
+
+kill_user_processes = get_option('default-kill-user-processes')
+conf.set10('KILL_USER_PROCESSES', kill_user_processes)
+substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
+
+dns_servers = get_option('dns-servers')
+conf.set_quoted('DNS_SERVERS', dns_servers)
+substs.set('DNS_SERVERS', dns_servers)
+
+ntp_servers = get_option('ntp-servers')
+conf.set_quoted('NTP_SERVERS', ntp_servers)
+substs.set('NTP_SERVERS', ntp_servers)
+
+conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
+
+substs.set('SUSHELL', get_option('debug-shell'))
+substs.set('DEBUGTTY', get_option('debug-tty'))
+
+debug = get_option('debug')
+if debug != ''
+        foreach name : debug.split(',')
+                if name == 'hashmap'
+                        conf.set('ENABLE_DEBUG_HASHMAP', true)
+                elif name == 'mmap-cache'
+                        conf.set('ENABLE_DEBUG_MMAP_CACHE', true)
+                else
+                        message('unknown debug option "@0@", ignoring'.format(name))
+                endif
+        endforeach
+endif
+
+#####################################################################
+
+threads = dependency('threads')
+librt = cc.find_library('rt')
+libm = cc.find_library('m')
+libdl = cc.find_library('dl')
+libcrypt = cc.find_library('crypt')
+
+libcap = dependency('libcap', required : false)
+if not libcap.found()
+        # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
+        libcap = cc.find_library('cap')
+endif
+
+libmount = dependency('mount',
+                      version : '>= 2.27')
+
+want_seccomp = get_option('seccomp')
+if want_seccomp != 'false'
+        libseccomp = dependency('libseccomp',
+                                version : '>= 2.3.1',
+                                required : want_seccomp == 'true')
+        if libseccomp.found()
+                conf.set('HAVE_SECCOMP', true)
+                m4_defines += ['-DHAVE_SECCOMP']
+        endif
+else
+        libseccomp = []
+endif
+
+want_selinux = get_option('selinux')
+if want_selinux != 'false'
+        libselinux = dependency('libselinux',
+                                version : '>= 2.1.9',
+                                required : want_selinux == 'true')
+        if libselinux.found()
+                conf.set('HAVE_SELINUX', true)
+                m4_defines += ['-DHAVE_SELINUX']
+        endif
+else
+        libselinux = []
+endif
+
+want_apparmor = get_option('apparmor')
+if want_apparmor != 'false'
+        libapparmor = dependency('libapparmor',
+                                 required : want_apparmor == 'true')
+        if libapparmor.found()
+                conf.set('HAVE_APPARMOR', true)
+                m4_defines += ['-DHAVE_APPARMOR']
+        endif
+else
+        libapparmor = []
+endif
+
+smack_run_label = get_option('smack-run-label')
+if smack_run_label != ''
+        conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
+        m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
+endif
+
+want_polkit = get_option('polkit')
+install_polkit = false
+install_polkit_pkla = false
+if want_polkit != 'false'
+        conf.set('ENABLE_POLKIT', true)
+        install_polkit = true
+
+        libpolkit = dependency('polkit-gobject-1',
+                               required : false)
+        if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
+                message('Old polkit detected, will install pkla files')
+                install_polkit_pkla = true
+        endif
+endif
+
+want_acl = get_option('acl')
+if want_acl != 'false'
+        libacl = cc.find_library('acl', required : want_acl == 'true')
+        if libacl.found()
+                conf.set('HAVE_ACL', true)
+                m4_defines += ['-DHAVE_ACL']
+        endif
+else
+        libacl = []
+endif
+
+want_audit = get_option('audit')
+if want_audit != 'false'
+        libaudit = dependency('audit', required : want_audit == 'true')
+        conf.set('HAVE_AUDIT', libaudit.found())
+else
+        libaudit = []
+endif
+
+want_blkid = get_option('blkid')
+if want_blkid != 'false'
+        libblkid = dependency('blkid', required : want_blkid == 'true')
+        conf.set('HAVE_BLKID', libblkid.found())
+else
+        libblkid = []
+endif
+
+want_kmod = get_option('kmod')
+if want_kmod != 'false'
+        libkmod = dependency('libkmod',
+                             version : '>= 15',
+                             required : want_kmod == 'true')
+        conf.set('HAVE_KMOD', libkmod.found())
+else
+        libkmod = []
+endif
+
+want_pam = get_option('pam')
+if want_pam != 'false'
+        libpam = cc.find_library('pam', required : want_pam == 'true')
+        libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
+        if libpam.found() and libpam_misc.found()
+                conf.set('HAVE_PAM', true)
+                m4_defines += ['-DHAVE_PAM']
+        endif
+else
+        libpam = []
+        libpam_misc = []
+endif
+
+want_microhttpd = get_option('microhttpd')
+if want_microhttpd != 'false'
+        libmicrohttpd = dependency('libmicrohttpd',
+                                   version : '>= 0.9.33',
+                                   required : want_microhttpd == 'true')
+        if libmicrohttpd.found()
+                conf.set('HAVE_MICROHTTPD', true)
+                m4_defines += ['-DHAVE_MICROHTTPD']
+        endif
+else
+        libmicrohttpd = []
+endif
+
+want_libcryptsetup = get_option('libcryptsetup')
+if want_libcryptsetup != 'false'
+        libcryptsetup = dependency('libcryptsetup',
+                                   version : '>= 1.6.0',
+                                   required : want_libcryptsetup == 'true')
+        conf.set('HAVE_LIBCRYPTSETUP', libcryptsetup.found())
+else
+        libcryptsetup = []
+endif
+
+want_libcurl = get_option('libcurl')
+if want_libcurl != 'false'
+        libcurl = dependency('libcurl',
+                             version : '>= 7.32.0',
+                             required : want_libcurl == 'true')
+        if libcurl.found()
+                conf.set('HAVE_LIBCURL', true)
+                m4_defines += ['-DHAVE_LIBCURL']
+        endif
+else
+        libcurl = []
+endif
+
+want_libidn = get_option('libidn')
+want_libidn2 = get_option('libidn2')
+if want_libidn == 'true' and want_libidn2 == 'true'
+        error('libidn and libidn2 cannot be requested simultaneously')
+endif
+
+if want_libidn != 'false' and want_libidn2 != 'true'
+        libidn = dependency('libidn',
+                            required : want_libidn == 'true')
+        if libidn.found()
+                conf.set('HAVE_LIBIDN', true)
+                m4_defines += ['-DHAVE_LIBIDN']
+        endif
+else
+        libidn = []
+endif
+if not conf.get('HAVE_LIBIDN', false) and want_libidn2 != 'false'
+        # libidn is used for both libidn and libidn2 objects
+        libidn = dependency('libidn2',
+                            required : want_libidn2 == 'true')
+        if libidn.found()
+                conf.set('HAVE_LIBIDN2', true)
+                m4_defines += ['-DHAVE_LIBIDN2']
+        endif
+endif
+
+want_libiptc = get_option('libiptc')
+if want_libiptc != 'false'
+        libiptc = dependency('libiptc',
+                             required : want_libiptc == 'true')
+        if libiptc.found()
+                conf.set('HAVE_LIBIPTC', true)
+                m4_defines += ['-DHAVE_LIBIPTC']
+        endif
+else
+        libiptc = []
+endif
+
+want_qrencode = get_option('qrencode')
+if want_qrencode != 'false'
+        libqrencode = dependency('libqrencode',
+                                 required : want_qrencode == 'true')
+        conf.set('HAVE_QRENCODE', libqrencode.found())
+else
+        libqrencode = []
+endif
+
+want_gnutls = get_option('gnutls')
+if want_gnutls != 'false'
+        libgnutls = dependency('gnutls',
+                               version : '>= 3.1.4',
+                               required : want_gnutls == 'true')
+        conf.set('HAVE_GNUTLS', libgnutls.found())
+else
+        libgnutls = []
+endif
+
+want_elfutils = get_option('elfutils')
+if want_elfutils != 'false'
+        libdw = dependency('libdw',
+                           required : want_elfutils == 'true')
+        conf.set('HAVE_ELFUTILS', libdw.found())
+else
+        libdw = []
+endif
+
+want_zlib = get_option('zlib')
+if want_zlib != 'false'
+        libz = dependency('zlib',
+                          required : want_zlib == 'true')
+        conf.set('HAVE_ZLIB', libz.found())
+else
+        libz = []
+endif
+
+want_bzip2 = get_option('bzip2')
+if want_bzip2 != 'false'
+        libbzip2 = cc.find_library('bz2',
+                                   required : want_bzip2 == 'true')
+        conf.set('HAVE_BZIP2', libbzip2.found())
+else
+        libbzip2 = []
+endif
+
+want_xz = get_option('xz')
+if want_xz != 'false'
+        libxz = dependency('liblzma',
+                           required : want_xz == 'true')
+        conf.set('HAVE_XZ', libxz.found())
+else
+        libxz = []
+endif
+
+want_lz4 = get_option('lz4')
+if want_lz4 != 'false'
+        liblz4 = dependency('liblz4',
+                            required : want_lz4 == 'true')
+        conf.set('HAVE_LZ4', liblz4.found())
+else
+        liblz4 = []
+endif
+
+want_glib = get_option('glib')
+if want_glib != 'false'
+        libglib =    dependency('glib-2.0',
+                                version : '>= 2.22.0',
+                                required : want_glib == 'true')
+        libgobject = dependency('gobject-2.0',
+                                version : '>= 2.22.0',
+                                required : want_glib == 'true')
+        libgio =     dependency('gio-2.0',
+                                required : want_glib == 'true')
+        have = libglib.found() and libgobject.found() and libgio.found()
+        conf.set('HAVE_GLIB', have)
+else
+        libglib = []
+        libgobject = []
+        libgio = []
+endif
+
+want_xkbcommon = get_option('xkbcommon')
+if want_xkbcommon != 'false'
+        libxkbcommon = dependency('xkbcommon',
+                                  version : '>= 0.3.0',
+                                  required : want_xkbcommon == 'true')
+        conf.set('HAVE_XKBCOMMON', libxkbcommon.found())
+else
+        libxkbcommon = []
+endif
+
+want_dbus = get_option('dbus')
+if want_dbus != 'false'
+        libdbus = dependency('dbus-1',
+                             version : '>= 1.3.2',
+                             required : want_dbus == 'true')
+        conf.set('HAVE_DBUS', libdbus.found())
+else
+        libdbus = []
+endif
+
+want_gcrypt = get_option('gcrypt')
+if want_gcrypt != 'false'
+        libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
+        libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
+
+        have_deps = libgcrypt.found() and libgpg_error.found()
+        conf.set('HAVE_GCRYPT', have_deps)
+        if not have_deps
+                # link to neither of the libs if one is not found
+                libgcrypt = []
+                libgpg_error = []
+        endif
+else
+        libgcrypt = []
+        libgpg_error = []
+endif
+
+default_dnssec = get_option('default-dnssec')
+if default_dnssec != 'no' and not conf.get('HAVE_GCRYPT', false)
+        message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
+        default_dnssec = 'no'
+endif
+conf.set('DEFAULT_DNSSEC_MODE',
+         'DNSSEC_' + default_dnssec.underscorify().to_upper())
+substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
+
+want_importd = get_option('importd')
+if want_importd != 'false'
+        have_deps = (conf.get('HAVE_LIBCURL', false) and
+                     conf.get('HAVE_ZLIB', false) and
+                     conf.get('HAVE_BZIP2', false) and
+                     conf.get('HAVE_XZ', false) and
+                     conf.get('HAVE_GCRYPT', false))
+        conf.set('ENABLE_IMPORTD', have_deps)
+        if want_importd == 'true' and not have_deps
+                error('importd support was requested, but dependencies are not available')
+        endif
+endif
+
+want_remote = get_option('remote')
+if want_remote != 'false'
+        have_deps = [conf.get('HAVE_MICROHTTPD', false),
+                     conf.get('HAVE_LIBCURL', false)]
+        # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
+        # it's possible to build one without the other. Complain only if
+        # support was explictly requested. The auxiliary files like sysusers
+        # config should be installed when any of the programs are built.
+        if want_remote == 'true' and not (have_deps[0] and have_deps[1])
+                error('remote support was requested, but dependencies are not available')
+        endif
+        conf.set('ENABLE_REMOTE', have_deps[0] or have_deps[1])
+endif
+
+foreach pair : [['utmp',          'HAVE_UTMP'],
+                ['kdbus',         'ENABLE_KDBUS'],
+                ['hibernate',     'ENABLE_HIBERNATE'],
+                ['environment-d', 'ENABLE_ENVIRONMENT_D'],
+                ['binfmt',        'ENABLE_BINFMT'],
+                ['coredump',      'ENABLE_COREDUMP'],
+                ['resolve',       'ENABLE_RESOLVED'],
+                ['logind',        'ENABLE_LOGIND'],
+                ['hostnamed',     'ENABLE_HOSTNAMED'],
+                ['localed',       'ENABLE_LOCALED'],
+                ['machined',      'ENABLE_MACHINED'],
+                ['networkd',      'ENABLE_NETWORKD'],
+                ['timedated',     'ENABLE_TIMEDATED'],
+                ['timesyncd',     'ENABLE_TIMESYNCD'],
+                ['myhostname',    'HAVE_MYHOSTNAME'],
+                ['firstboot',     'ENABLE_FIRSTBOOT'],
+                ['randomseed',    'ENABLE_RANDOMSEED'],
+                ['backlight',     'ENABLE_BACKLIGHT'],
+                ['vconsole',      'ENABLE_VCONSOLE'],
+                ['quotacheck',    'ENABLE_QUOTACHECK'],
+                ['sysusers',      'ENABLE_SYSUSERS'],
+                ['tmpfiles',      'ENABLE_TMPFILES'],
+                ['hwdb',          'ENABLE_HWDB'],
+                ['rfkill',        'ENABLE_RFKILL'],
+                ['ldconfig',      'ENABLE_LDCONFIG'],
+                ['efi',           'ENABLE_EFI'],
+                ['tpm',           'SD_BOOT_LOG_TPM'],
+                ['ima',           'HAVE_IMA'],
+                ['smack',         'HAVE_SMACK'],
+                ['gshadow',       'ENABLE_GSHADOW'],
+                ['idn',           'ENABLE_IDN'],
+                ['nss-systemd',   'ENABLE_NSS_SYSTEMD'],
+               ]
+
+        if get_option(pair[0])
+                conf.set(pair[1], true)
+                m4_defines += ['-D' + pair[1]]
+        endif
+endforeach
+
+want_tests = get_option('tests')
+install_tests = get_option('install-tests')
+tests = []
+
+#####################################################################
+
+if get_option('efi')
+        efi_arch = host_machine.cpu_family()
+
+        if efi_arch == 'x86'
+                EFI_MACHINE_TYPE_NAME = 'ia32'
+                gnu_efi_arch = 'ia32'
+        elif efi_arch == 'x86_64'
+                EFI_MACHINE_TYPE_NAME = 'x64'
+                gnu_efi_arch = 'x86_64'
+        elif efi_arch == 'arm'
+                EFI_MACHINE_TYPE_NAME = 'arm'
+                gnu_efi_arch = 'arm'
+        elif efi_arch == 'aarch64'
+                EFI_MACHINE_TYPE_NAME = 'aa64'
+                gnu_efi_arch = 'aarch64'
+        else
+                EFI_MACHINE_TYPE_NAME = ''
+                gnu_efi_arch = ''
+        endif
+
+        conf.set('ENABLE_EFI', true)
+        conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
+
+        conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
+endif
+
+#####################################################################
+
+config_h = configure_file(
+        output : 'config.h',
+        configuration : conf)
+
+includes = include_directories('src/basic',
+                               'src/shared',
+                               'src/systemd',
+                               'src/journal',
+                               'src/resolve',
+                               'src/timesync',
+                               'src/login',
+                               'src/udev',
+                               'src/libudev',
+                               'src/core',
+                               'src/libsystemd/sd-bus',
+                               'src/libsystemd/sd-device',
+                               'src/libsystemd/sd-hwdb',
+                               'src/libsystemd/sd-id128',
+                               'src/libsystemd/sd-netlink',
+                               'src/libsystemd/sd-network',
+                               'src/libsystemd-network',
+                              )
+
+add_project_arguments('-include', 'config.h', language : 'c')
+
+gcrypt_util_sources = files('src/shared/gcrypt-util.h',
+                            'src/shared/gcrypt-util.c')
+
+subdir('po')
+subdir('catalog')
+subdir('src/systemd')
+subdir('src/basic')
+subdir('src/libsystemd')
+subdir('src/libsystemd-network')
+subdir('src/journal')
+subdir('src/login')
+
+libjournal_core = static_library(
+        'journal-core',
+        libjournal_core_sources,
+        journald_gperf_c,
+        include_directories : includes,
+        install : false)
+
+libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
+libsystemd = shared_library(
+        'systemd',
+        libsystemd_internal_sources,
+        journal_internal_sources,
+        version : '0.19.0',
+        include_directories : includes,
+        link_args : ['-shared',
+                     '-Wl,--version-script=' + libsystemd_sym_path],
+        link_with : [libbasic],
+        dependencies : [threads,
+                        libgcrypt,
+                        librt,
+                        libxz,
+                        liblz4],
+        link_depends : libsystemd_sym,
+        install : true,
+        install_dir : rootlibdir)
+
+############################################################
+
+# binaries that have --help and are intended for use by humans,
+# usually, but not always, installed in /bin.
+public_programs = []
+
+subdir('src/libudev')
+subdir('src/shared')
+subdir('src/core')
+subdir('src/udev')
+subdir('src/network')
+
+subdir('src/analyze')
+subdir('src/journal-remote')
+subdir('src/coredump')
+subdir('src/hostname')
+subdir('src/import')
+subdir('src/kernel-install')
+subdir('src/locale')
+subdir('src/machine')
+subdir('src/nspawn')
+subdir('src/resolve')
+subdir('src/timedate')
+subdir('src/timesync')
+subdir('src/vconsole')
+subdir('src/sulogin-shell')
+subdir('src/boot/efi')
+
+subdir('src/test')
+subdir('test')
+
+############################################################
+
+# only static linking apart from libdl, to make sure that the
+# module is linked to all libraries that it uses.
+test_dlopen = executable(
+        'test-dlopen',
+        test_dlopen_c,
+        include_directories : includes,
+        link_with : [libbasic],
+        dependencies : [libdl])
+
+foreach tuple : [['myhostname', 'HAVE_MYHOSTNAME'],
+                 ['systemd',    'ENABLE_NSS_SYSTEMD'],
+                 ['mymachines', 'ENABLE_MACHINED'],
+                 ['resolve',    'ENABLE_RESOLVED']]
+
+        condition = tuple[1] == '' or conf.get(tuple[1], false)
+        if condition
+                module = tuple[0]
+
+                sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
+                version_script_arg = join_paths(meson.current_source_dir(), sym)
+
+                nss = shared_library(
+                        'nss_' + module,
+                        'src/nss-@0@/nss-@0@.c'.format(module),
+                        version : '2',
+                        include_directories : includes,
+                        link_args : ['-shared',
+                                     '-Wl,--version-script=' + version_script_arg,
+                                     '-Wl,--undefined'],
+                        link_with : [libsystemd_internal,
+                                     libbasic],
+                        dependencies : [threads,
+                                        librt],
+                        link_depends : sym,
+                        install : true,
+                        install_dir : rootlibdir)
+
+                # We cannot use shared_module because it does not support version suffix.
+                # Unfortunately shared_library insists on creating the symlink…
+                meson.add_install_script('sh', '-c',
+                                         'rm $DESTDIR@0@/libnss_@1@.so'
+                                         .format(rootlibdir, module))
+
+                test('dlopen-nss_' + module,
+                     test_dlopen,
+                     args : [nss.full_path()]) # path to dlopen must include a slash
+        endif
+endforeach
+
+############################################################
+
+executable('systemd',
+           systemd_sources,
+           include_directories : includes,
+           link_with : [libcore,
+                        libshared],
+           dependencies : [threads,
+                           librt,
+                           libseccomp,
+                           libselinux,
+                           libmount,
+                           libblkid],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : rootlibexecdir)
+
+exe = executable('systemd-analyze',
+                 systemd_analyze_sources,
+                 include_directories : includes,
+                 link_with : [libcore,
+                              libshared],
+                 dependencies : [threads,
+                                 librt,
+                                 libseccomp,
+                                 libselinux,
+                                 libmount,
+                                 libblkid],
+                 install_rpath : rootlibexecdir,
+                 install : true)
+public_programs += [exe]
+
+executable('systemd-journald',
+           systemd_journald_sources,
+           include_directories : includes,
+           link_with : [libjournal_core,
+                        libshared],
+           dependencies : [threads,
+                           libxz,
+                           liblz4,
+                           libselinux],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : rootlibexecdir)
+
+exe = executable('systemd-cat',
+                 systemd_cat_sources,
+                 include_directories : includes,
+                 link_with : [libjournal_core,
+                              libshared],
+                 dependencies : [threads],
+                 install_rpath : rootlibexecdir,
+                 install : true)
+public_programs += [exe]
+
+exe = executable('journalctl',
+                 journalctl_sources,
+                 include_directories : includes,
+                 link_with : [libshared],
+                 dependencies : [threads,
+                                 libqrencode,
+                                 libxz,
+                                 liblz4],
+                 install_rpath : rootlibexecdir,
+                 install : true,
+                 install_dir : rootbindir)
+public_programs += [exe]
+
+executable('systemd-getty-generator',
+           'src/getty-generator/getty-generator.c',
+           include_directories : includes,
+           link_with : [libshared],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : systemgeneratordir)
+
+executable('systemd-debug-generator',
+           'src/debug-generator/debug-generator.c',
+           include_directories : includes,
+           link_with : [libshared],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : systemgeneratordir)
+
+executable('systemd-fstab-generator',
+           'src/fstab-generator/fstab-generator.c',
+           'src/core/mount-setup.c',
+           include_directories : includes,
+           link_with : [libshared],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : systemgeneratordir)
+
+if conf.get('ENABLE_ENVIRONMENT_D', false)
+        executable('30-systemd-environment-d-generator',
+                   'src/environment-d-generator/environment-d-generator.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : userenvgeneratordir)
+
+        meson.add_install_script(meson_make_symlink,
+                                 join_paths(sysconfdir, 'environment'),
+                                 join_paths(environmentdir, '99-environment.conf'))
+endif
+
+if conf.get('ENABLE_HIBERNATE', false)
+        executable('systemd-hibernate-resume-generator',
+                   'src/hibernate-resume/hibernate-resume-generator.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : systemgeneratordir)
+
+        executable('systemd-hibernate-resume',
+                   'src/hibernate-resume/hibernate-resume.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+endif
+
+if conf.get('HAVE_BLKID', false)
+        executable('systemd-gpt-auto-generator',
+                   'src/gpt-auto-generator/gpt-auto-generator.c',
+                   'src/basic/blkid-util.h',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   dependencies : libblkid,
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : systemgeneratordir)
+
+        exe = executable('systemd-dissect',
+                         'src/dissect/dissect.c',
+                         include_directories : includes,
+                         link_with : [libshared],
+                         install_rpath : rootlibexecdir,
+                         install : true,
+                         install_dir : rootlibexecdir)
+        public_programs += [exe]
+endif
+
+if conf.get('ENABLE_RESOLVED', false)
+        executable('systemd-resolved',
+                   systemd_resolved_sources,
+                   gcrypt_util_sources,
+                   include_directories : includes,
+                   link_with : [libshared],
+                   dependencies : [threads,
+                                   libgcrypt,
+                                   libgpg_error,
+                                   libm,
+                                   libidn],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+
+        exe = executable('systemd-resolve',
+                         systemd_resolve_sources,
+                         gcrypt_util_sources,
+                         include_directories : includes,
+                         link_with : [libshared],
+                         dependencies : [threads,
+                                         libgcrypt,
+                                         libgpg_error,
+                                         libm,
+                                         libidn],
+                         install_rpath : rootlibexecdir,
+                         install : true)
+        public_programs += [exe]
+endif
+
+if conf.get('ENABLE_LOGIND', false)
+        executable('systemd-logind',
+                   systemd_logind_sources,
+                   include_directories : includes,
+                   link_with : [liblogind_core,
+                                libshared],
+                   dependencies : [threads,
+                                   libacl],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+
+        exe = executable('loginctl',
+                         loginctl_sources,
+                         include_directories : includes,
+                         link_with : [libshared],
+                         dependencies : [threads,
+                                         liblz4,
+                                         libxz],
+                         install_rpath : rootlibexecdir,
+                         install : true,
+                         install_dir : rootbindir)
+        public_programs += [exe]
+
+        exe = executable('systemd-inhibit',
+                         'src/login/inhibit.c',
+                         include_directories : includes,
+                         link_with : [libshared],
+                         install_rpath : rootlibexecdir,
+                         install : true,
+                         install_dir : rootbindir)
+        public_programs += [exe]
+
+        if conf.get('HAVE_PAM', false)
+                version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
+                pam_systemd = shared_library(
+                        'pam_systemd',
+                        pam_systemd_c,
+                        name_prefix : '',
+                        include_directories : includes,
+                        link_args : ['-shared',
+                                     '-Wl,--version-script=' + version_script_arg],
+                        link_with : [libsystemd_internal,
+                                     libshared_static],
+                        dependencies : [threads,
+                                        libpam,
+                                        libpam_misc],
+                        link_depends : pam_systemd_sym,
+                        install : true,
+                        install_dir : pamlibdir)
+
+                test('dlopen-pam_systemd',
+                     test_dlopen,
+                     args : [pam_systemd.full_path()]) # path to dlopen must include a slash
+        endif
+endif
+
+if conf.get('HAVE_PAM', false)
+        executable('systemd-user-sessions',
+                   'src/user-sessions/user-sessions.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+endif
+
+if conf.get('ENABLE_EFI', false) and conf.get('HAVE_BLKID', false)
+        exe = executable('bootctl',
+                         'src/boot/bootctl.c',
+                         include_directories : includes,
+                         link_with : [libshared],
+                         dependencies : [libblkid],
+                         install_rpath : rootlibexecdir,
+                         install : true)
+        public_programs += [exe]
+endif
+
+exe = executable('systemd-socket-activate', 'src/activate/activate.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 dependencies : [threads],
+                 install_rpath : rootlibexecdir,
+                 install : true)
+public_programs += [exe]
+
+exe = executable('systemctl', 'src/systemctl/systemctl.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 dependencies : [threads,
+                                 libcap,
+                                 libselinux,
+                                 libxz,
+                                 liblz4],
+                 install_rpath : rootlibexecdir,
+                 install : true,
+                 install_dir : rootbindir)
+public_programs += [exe]
+
+if conf.get('ENABLE_BACKLIGHT', false)
+        executable('systemd-backlight',
+                   'src/backlight/backlight.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+endif
+
+if conf.get('ENABLE_RFKILL', false)
+        executable('systemd-rfkill',
+                   'src/rfkill/rfkill.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+endif
+
+executable('systemd-system-update-generator',
+           'src/system-update-generator/system-update-generator.c',
+           include_directories : includes,
+           link_with : [libshared],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : systemgeneratordir)
+
+if conf.get('HAVE_LIBCRYPTSETUP', false)
+        executable('systemd-cryptsetup',
+                   'src/cryptsetup/cryptsetup.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   dependencies : [libcryptsetup],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+
+        executable('systemd-cryptsetup-generator',
+                   'src/cryptsetup/cryptsetup-generator.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   dependencies : [libcryptsetup],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : systemgeneratordir)
+
+        executable('systemd-veritysetup',
+                   'src/veritysetup/veritysetup.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   dependencies : [libcryptsetup],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+
+        executable('systemd-veritysetup-generator',
+                   'src/veritysetup/veritysetup-generator.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   dependencies : [libcryptsetup],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : systemgeneratordir)
+endif
+
+if conf.get('HAVE_SYSV_COMPAT', false)
+        executable('systemd-sysv-generator',
+                   'src/sysv-generator/sysv-generator.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : systemgeneratordir)
+
+        executable('systemd-rc-local-generator',
+                   'src/rc-local-generator/rc-local-generator.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : systemgeneratordir)
+endif
+
+if conf.get('ENABLE_HOSTNAMED', false)
+        executable('systemd-hostnamed',
+                   'src/hostname/hostnamed.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+
+        exe = executable('hostnamectl',
+                         'src/hostname/hostnamectl.c',
+                         include_directories : includes,
+                         link_with : [libshared],
+                         install_rpath : rootlibexecdir,
+                         install : true)
+        public_programs += [exe]
+endif
+
+if conf.get('ENABLE_LOCALED', false)
+        if conf.get('HAVE_XKBCOMMON', false)
+                # logind will load libxkbcommon.so dynamically on its own
+                deps = [libdl]
+        else
+                deps = []
+        endif
+
+        executable('systemd-localed',
+                   systemd_localed_sources,
+                   include_directories : includes,
+                   link_with : [libshared],
+                   dependencies : deps,
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+
+        exe = executable('localectl',
+                         localectl_sources,
+                         include_directories : includes,
+                         link_with : [libshared],
+                         install_rpath : rootlibexecdir,
+                         install : true)
+        public_programs += [exe]
+endif
+
+if conf.get('ENABLE_TIMEDATED', false)
+        executable('systemd-timedated',
+                   'src/timedate/timedated.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+
+        exe = executable('timedatectl',
+                         'src/timedate/timedatectl.c',
+                         include_directories : includes,
+                         install_rpath : rootlibexecdir,
+                         link_with : [libshared],
+                         install : true)
+        public_programs += [exe]
+endif
+
+if conf.get('ENABLE_TIMESYNCD', false)
+        executable('systemd-timesyncd',
+                   systemd_timesyncd_sources,
+                   include_directories : includes,
+                   link_with : [libshared],
+                   dependencies : [threads,
+                                   libm],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+endif
+
+if conf.get('ENABLE_MACHINED', false)
+        executable('systemd-machined',
+                   systemd_machined_sources,
+                   include_directories : includes,
+                   link_with : [libmachine_core,
+                                libshared],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+
+        exe = executable('machinectl',
+                         'src/machine/machinectl.c',
+                         include_directories : includes,
+                         link_with : [libshared],
+                         dependencies : [threads,
+                                         libxz,
+                                         liblz4],
+                         install_rpath : rootlibexecdir,
+                         install : true,
+                         install_dir : rootbindir)
+        public_programs += [exe]
+endif
+
+if conf.get('ENABLE_IMPORTD', false)
+        executable('systemd-importd',
+                   systemd_importd_sources,
+                   include_directories : includes,
+                   link_with : [libshared],
+                   dependencies : [threads],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+
+        systemd_pull = executable('systemd-pull',
+                                  systemd_pull_sources,
+                                  include_directories : includes,
+                                  link_with : [libshared],
+                                  dependencies : [libcurl,
+                                                  libz,
+                                                  libbzip2,
+                                                  libxz,
+                                                  libgcrypt],
+                                  install_rpath : rootlibexecdir,
+                                  install : true,
+                                  install_dir : rootlibexecdir)
+
+        systemd_import = executable('systemd-import',
+                                    systemd_import_sources,
+                                    include_directories : includes,
+                                    link_with : [libshared],
+                                    dependencies : [libcurl,
+                                                    libz,
+                                                    libbzip2,
+                                                    libxz],
+                                    install_rpath : rootlibexecdir,
+                                    install : true,
+                                    install_dir : rootlibexecdir)
+
+        systemd_export = executable('systemd-export',
+                                    systemd_export_sources,
+                                    include_directories : includes,
+                                    link_with : [libshared],
+                                    dependencies : [libcurl,
+                                                    libz,
+                                                    libbzip2,
+                                                    libxz],
+                                    install_rpath : rootlibexecdir,
+                                    install : true,
+                                    install_dir : rootlibexecdir)
+        public_programs += [systemd_pull, systemd_import, systemd_export]
+endif
+
+if conf.get('ENABLE_REMOTE', false) and conf.get('HAVE_LIBCURL', false)
+        exe = executable('systemd-journal-upload',
+                         systemd_journal_upload_sources,
+                         include_directories : includes,
+                         link_with : [libshared],
+                         dependencies : [threads,
+                                         libcurl,
+                                         libgnutls,
+                                         libxz,
+                                         liblz4],
+                         install_rpath : rootlibexecdir,
+                         install : true,
+                         install_dir : rootlibexecdir)
+        public_programs += [exe]
+endif
+
+if conf.get('ENABLE_REMOTE', false) and conf.get('HAVE_MICROHTTPD', false)
+        s_j_remote = executable('systemd-journal-remote',
+                                systemd_journal_remote_sources,
+                                include_directories : includes,
+                                link_with : [libshared],
+                                dependencies : [threads,
+                                                libmicrohttpd,
+                                                libgnutls,
+                                                libxz,
+                                                liblz4],
+                                install_rpath : rootlibexecdir,
+                                install : true,
+                                install_dir : rootlibexecdir)
+
+        s_j_gatewayd = executable('systemd-journal-gatewayd',
+                                  systemd_journal_gatewayd_sources,
+                                  include_directories : includes,
+                                  link_with : [libshared],
+                                  dependencies : [threads,
+                                                  libmicrohttpd,
+                                                  libgnutls,
+                                                  libxz,
+                                                  liblz4],
+                                  install_rpath : rootlibexecdir,
+                                  install : true,
+                                  install_dir : rootlibexecdir)
+        public_programs += [s_j_remote, s_j_gatewayd]
+endif
+
+if conf.get('ENABLE_COREDUMP', false)
+        executable('systemd-coredump',
+                   systemd_coredump_sources,
+                   include_directories : includes,
+                   link_with : [libshared],
+                   dependencies : [threads,
+                                   libacl,
+                                   libdw,
+                                   libxz,
+                                   liblz4],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+
+        exe = executable('coredumpctl',
+                         coredumpctl_sources,
+                         include_directories : includes,
+                         link_with : [libshared],
+                         dependencies : [threads,
+                                         libxz,
+                                         liblz4],
+                         install_rpath : rootlibexecdir,
+                         install : true)
+        public_programs += [exe]
+endif
+
+if conf.get('ENABLE_BINFMT', false)
+        exe = executable('systemd-binfmt',
+                         'src/binfmt/binfmt.c',
+                         include_directories : includes,
+                         link_with : [libshared],
+                         install_rpath : rootlibexecdir,
+                         install : true,
+                         install_dir : rootlibexecdir)
+        public_programs += [exe]
+
+        meson.add_install_script('sh', '-c',
+                                 mkdir_p.format(binfmtdir))
+        meson.add_install_script('sh', '-c',
+                                 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
+endif
+
+if conf.get('ENABLE_VCONSOLE', false)
+        executable('systemd-vconsole-setup',
+                   'src/vconsole/vconsole-setup.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+endif
+
+if conf.get('ENABLE_RANDOMSEED', false)
+        executable('systemd-random-seed',
+                   'src/random-seed/random-seed.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+endif
+
+if conf.get('ENABLE_FIRSTBOOT', false)
+        executable('systemd-firstboot',
+                   'src/firstboot/firstboot.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   dependencies : [libcrypt],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootbindir)
+endif
+
+executable('systemd-remount-fs',
+           'src/remount-fs/remount-fs.c',
+           'src/core/mount-setup.c',
+           'src/core/mount-setup.h',
+           include_directories : includes,
+           link_with : [libshared],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : rootlibexecdir)
+
+executable('systemd-machine-id-setup',
+           'src/machine-id-setup/machine-id-setup-main.c',
+           'src/core/machine-id-setup.c',
+           'src/core/machine-id-setup.h',
+           include_directories : includes,
+           link_with : [libshared],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : rootbindir)
+
+executable('systemd-fsck',
+           'src/fsck/fsck.c',
+           include_directories : includes,
+           link_with : [libshared],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : rootlibexecdir)
+
+executable('systemd-sleep',
+           'src/sleep/sleep.c',
+           include_directories : includes,
+           link_with : [libshared],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : rootlibexecdir)
+
+exe = executable('systemd-sysctl',
+                 'src/sysctl/sysctl.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 install_rpath : rootlibexecdir,
+                 install : true,
+                 install_dir : rootlibexecdir)
+public_programs += [exe]
+
+executable('systemd-ac-power',
+           'src/ac-power/ac-power.c',
+           include_directories : includes,
+           link_with : [libshared],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : rootlibexecdir)
+
+exe = executable('systemd-detect-virt',
+                 'src/detect-virt/detect-virt.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 install_rpath : rootlibexecdir,
+                 install : true)
+public_programs += [exe]
+
+exe = executable('systemd-delta',
+                 'src/delta/delta.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 install_rpath : rootlibexecdir,
+                 install : true)
+public_programs += [exe]
+
+exe = executable('systemd-escape',
+                 'src/escape/escape.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 install_rpath : rootlibexecdir,
+                 install : true,
+                 install_dir : rootbindir)
+public_programs += [exe]
+
+exe = executable('systemd-notify',
+                 'src/notify/notify.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 install_rpath : rootlibexecdir,
+                 install : true,
+                 install_dir : rootbindir)
+public_programs += [exe]
+
+executable('systemd-volatile-root',
+           'src/volatile-root/volatile-root.c',
+           include_directories : includes,
+           link_with : [libshared],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : rootlibexecdir)
+
+executable('systemd-cgroups-agent',
+           'src/cgroups-agent/cgroups-agent.c',
+           include_directories : includes,
+           link_with : [libshared],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : rootlibexecdir)
+
+exe = executable('systemd-path',
+                 'src/path/path.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 install_rpath : rootlibexecdir,
+                 install : true)
+public_programs += [exe]
+
+exe = executable('systemd-ask-password',
+                 'src/ask-password/ask-password.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 install_rpath : rootlibexecdir,
+                 install : true,
+                 install_dir : rootbindir)
+public_programs += [exe]
+
+executable('systemd-reply-password',
+           'src/reply-password/reply-password.c',
+           include_directories : includes,
+           link_with : [libshared],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : rootlibexecdir)
+
+exe = executable('systemd-tty-ask-password-agent',
+                 'src/tty-ask-password-agent/tty-ask-password-agent.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 install_rpath : rootlibexecdir,
+                 install : true,
+                 install_dir : rootbindir)
+public_programs += [exe]
+
+exe = executable('systemd-cgls',
+                 'src/cgls/cgls.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 install_rpath : rootlibexecdir,
+                 install : true)
+public_programs += [exe]
+
+exe = executable('systemd-cgtop',
+                 'src/cgtop/cgtop.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 install_rpath : rootlibexecdir,
+                 install : true)
+public_programs += [exe]
+
+executable('systemd-initctl',
+           'src/initctl/initctl.c',
+           include_directories : includes,
+           link_with : [libshared],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : rootlibexecdir)
+
+exe = executable('systemd-mount',
+                 'src/mount/mount-tool.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 install_rpath : rootlibexecdir,
+                 install : true)
+public_programs += [exe]
+
+meson.add_install_script(meson_make_symlink,
+                         'systemd-mount', join_paths(bindir, 'systemd-umount'))
+
+exe = executable('systemd-run',
+                 'src/run/run.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 install_rpath : rootlibexecdir,
+                 install : true)
+public_programs += [exe]
+
+exe = executable('systemd-stdio-bridge',
+                 'src/stdio-bridge/stdio-bridge.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 install_rpath : rootlibexecdir,
+                 install : true)
+public_programs += [exe]
+
+exe = executable('busctl',
+                 'src/busctl/busctl.c',
+                 'src/busctl/busctl-introspect.c',
+                 'src/busctl/busctl-introspect.h',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 install_rpath : rootlibexecdir,
+                 install : true)
+public_programs += [exe]
+
+if conf.get('ENABLE_SYSUSERS', false)
+        exe = executable('systemd-sysusers',
+                         'src/sysusers/sysusers.c',
+                         include_directories : includes,
+                         link_with : [libshared],
+                         install_rpath : rootlibexecdir,
+                         install : true,
+                         install_dir : rootbindir)
+        public_programs += [exe]
+endif
+
+if conf.get('ENABLE_TMPFILES', false)
+        exe = executable('systemd-tmpfiles',
+                         'src/tmpfiles/tmpfiles.c',
+                         include_directories : includes,
+                         link_with : [libshared],
+                         dependencies : [libacl],
+                         install_rpath : rootlibexecdir,
+                         install : true,
+                         install_dir : rootbindir)
+        public_programs += [exe]
+endif
+
+if conf.get('ENABLE_HWDB', false)
+        exe = executable('systemd-hwdb',
+                         'src/hwdb/hwdb.c',
+                         'src/libsystemd/sd-hwdb/hwdb-internal.h',
+                         include_directories : includes,
+                         link_with : [libudev_internal],
+                         install_rpath : udev_rpath,
+                         install : true,
+                         install_dir : rootbindir)
+        public_programs += [exe]
+endif
+
+if conf.get('ENABLE_QUOTACHECK', false)
+        executable('systemd-quotacheck',
+                   'src/quotacheck/quotacheck.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+endif
+
+exe = executable('systemd-socket-proxyd',
+                 'src/socket-proxy/socket-proxyd.c',
+                 include_directories : includes,
+                 link_with : [libshared],
+                 dependencies : [threads],
+                 install_rpath : rootlibexecdir,
+                 install : true,
+                 install_dir : rootlibexecdir)
+public_programs += [exe]
+
+exe = executable('systemd-udevd',
+                 systemd_udevd_sources,
+                 include_directories : includes,
+                 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
+                 link_with : [libudev_core,
+                              libsystemd_network,
+                              libudev_internal],
+                 dependencies : [threads,
+                                 libkmod,
+                                 libidn,
+                                 libacl,
+                                 libblkid],
+                 install_rpath : udev_rpath,
+                 install : true,
+                 install_dir : rootlibexecdir)
+public_programs += [exe]
+
+exe = executable('udevadm',
+                 udevadm_sources,
+                 include_directories : includes,
+                 link_with : [libudev_core,
+                              libsystemd_network,
+                              libudev_internal],
+                 dependencies : [threads,
+                                 libkmod,
+                                 libidn,
+                                 libacl,
+                                 libblkid],
+                 install_rpath : udev_rpath,
+                 install : true,
+                 install_dir : rootbindir)
+public_programs += [exe]
+
+executable('systemd-shutdown',
+           systemd_shutdown_sources,
+           include_directories : includes,
+           link_with : [libshared],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : rootlibexecdir)
+
+executable('systemd-update-done',
+           'src/update-done/update-done.c',
+           include_directories : includes,
+           link_with : [libshared],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : rootlibexecdir)
+
+executable('systemd-update-utmp',
+           'src/update-utmp/update-utmp.c',
+           include_directories : includes,
+           link_with : [libshared],
+           dependencies : [libaudit],
+           install_rpath : rootlibexecdir,
+           install : true,
+           install_dir : rootlibexecdir)
+
+if conf.get('HAVE_KMOD', false)
+        executable('systemd-modules-load',
+                   'src/modules-load/modules-load.c',
+                   include_directories : includes,
+                   link_with : [libshared],
+                   dependencies : [libkmod],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+
+        meson.add_install_script('sh', '-c',
+                                 mkdir_p.format(modulesloaddir))
+        meson.add_install_script('sh', '-c',
+                                 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
+endif
+
+exe = executable('systemd-nspawn',
+                 systemd_nspawn_sources,
+                 'src/core/mount-setup.c', # FIXME: use a variable?
+                 'src/core/mount-setup.h',
+                 'src/core/loopback-setup.c',
+                 'src/core/loopback-setup.h',
+                 include_directories : [includes, include_directories('src/nspawn')],
+                 link_with : [libshared],
+                 dependencies : [libacl,
+                                 libblkid,
+                                 libseccomp,
+                                 libselinux],
+                 install_rpath : rootlibexecdir,
+                 install : true)
+public_programs += [exe]
+
+if conf.get('ENABLE_NETWORKD', false)
+        executable('systemd-networkd',
+                   systemd_networkd_sources,
+                   include_directories : includes,
+                   link_with : [libnetworkd_core,
+                                libsystemd_network,
+                                libudev_internal,
+                                libshared],
+                   dependencies : [threads],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+
+        executable('systemd-networkd-wait-online',
+                   systemd_networkd_wait_online_sources,
+                   include_directories : includes,
+                   link_with : [libnetworkd_core,
+                                libshared],
+                   install_rpath : rootlibexecdir,
+                   install : true,
+                   install_dir : rootlibexecdir)
+endif
+
+exe = executable('networkctl',
+                 networkctl_sources,
+                 include_directories : includes,
+                 link_with : [libsystemd_network,
+                              libshared],
+                 install_rpath : rootlibexecdir,
+                 install : true,
+                 install_dir : rootbindir)
+public_programs += [exe]
+
+############################################################
+
+foreach tuple : tests
+        sources = tuple[0]
+        link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
+        dependencies = tuple[2]
+        condition = tuple.length() >= 4 ? tuple[3] : ''
+        type = tuple.length() >= 5 ? tuple[4] : ''
+        defs = tuple.length() >= 6 ? tuple[5] : []
+        incs = tuple.length() >= 7 ? tuple[6] : includes
+        timeout = 30
+
+        name = sources[0].split('/')[-1].split('.')[0]
+        if type.startswith('timeout=')
+                timeout = type.split('=')[1].to_int()
+                type = ''
+        endif
+
+        if condition == '' or conf.get(condition, false)
+                exe = executable(
+                        name,
+                        sources,
+                        include_directories : incs,
+                        link_with : link_with,
+                        dependencies : dependencies,
+                        c_args : defs,
+                        install_rpath : rootlibexecdir,
+                        install : install_tests,
+                        install_dir : join_paths(testsdir, type))
+
+                if type == 'manual'
+                        message('@0@ is a manual test'.format(name))
+                elif type == 'unsafe' and want_tests != 'unsafe'
+                        message('@0@ is an unsafe test'.format(name))
+                else
+                        test(name, exe,
+                             env : test_env,
+                             timeout : timeout)
+                endif
+        else
+                message('Not compiling @0@ because @1@ is not true'.format(name, condition))
+        endif
+endforeach
+
+test_libsystemd_sym = executable(
+        'test-libsystemd-sym',
+        test_libsystemd_sym_c,
+        include_directories : includes,
+        link_with : [libsystemd],
+        install : install_tests,
+        install_dir : testsdir)
+test('test-libsystemd-sym',
+     test_libsystemd_sym)
+
+test_libudev_sym = executable(
+        'test-libudev-sym',
+        test_libudev_sym_c,
+        include_directories : includes,
+        c_args : ['-Wno-deprecated-declarations'],
+        link_with : [libudev],
+        install : install_tests,
+        install_dir : testsdir)
+test('test-libudev-sym',
+     test_libudev_sym)
+
+############################################################
+
+make_directive_index_py = find_program('tools/make-directive-index.py')
+make_man_index_py = find_program('tools/make-man-index.py')
+xml_helper_py = find_program('tools/xml_helper.py')
+hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
+
+subdir('units')
+subdir('sysctl.d')
+subdir('sysusers.d')
+subdir('tmpfiles.d')
+subdir('rules')
+subdir('hwdb')
+subdir('network')
+subdir('man')
+subdir('shell-completion/bash')
+subdir('shell-completion/zsh')
+subdir('docs/sysvinit')
+subdir('docs/var-log')
+
+# FIXME: figure out if the warning is true:
+# https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
+install_subdir('factory/etc',
+               install_dir : factorydir)
+
+
+install_data('xorg/50-systemd-user.sh',
+             install_dir : xinitrcdir)
+install_data('system-preset/90-systemd.preset',
+             install_dir : systempresetdir)
+install_data('README',
+             'NEWS',
+             'CODING_STYLE',
+             'DISTRO_PORTING',
+             'ENVIRONMENT.md',
+             'LICENSE.GPL2',
+             'LICENSE.LGPL2.1',
+             'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
+             install_dir : docdir)
+
+meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
+meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
+
+############################################################
+
+meson_check_help = find_program('tools/meson-check-help.sh')
+
+foreach exec : public_programs
+        name = exec.full_path().split('/')[-1]
+        test('check-help-' + name,
+             meson_check_help,
+             args : [exec.full_path()])
+endforeach
+
+############################################################
+
+if git.found()
+        all_files = run_command(
+                git,
+                ['--git-dir=@0@/.git'.format(meson.source_root()),
+                 'ls-files',
+                 ':/*.[ch]'])
+        all_files = files(all_files.stdout().split())
+
+        run_target(
+                'tags',
+                input : all_files,
+                command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
+        run_target(
+                'ctags',
+                input : all_files,
+                command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
+endif
+
+if git.found()
+        meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
+        run_target(
+                'git-contrib',
+                command : [meson_git_contrib_sh])
+endif
+
+if git.found()
+        git_head = run_command(
+                git,
+                ['--git-dir=@0@/.git'.format(meson.source_root()),
+                 'rev-parse', 'HEAD']).stdout().strip()
+        git_head_short = run_command(
+                git,
+                ['--git-dir=@0@/.git'.format(meson.source_root()),
+                 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
+
+        run_target(
+                'git-snapshot',
+                command : ['git', 'archive',
+                           '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
+                                                                 git_head_short),
+                           '--prefix', 'systemd-@0@/'.format(git_head),
+                           'HEAD'])
+endif
+
+############################################################
+
+status = [
+        '@0@ @1@'.format(meson.project_name(), meson.project_version()),
+
+        'prefix:                            @0@'.format(prefixdir),
+        'rootprefix:                        @0@'.format(rootprefixdir),
+        'sysconf dir:                       @0@'.format(sysconfdir),
+        'includedir:                        @0@'.format(includedir),
+        'lib dir:                           @0@'.format(libdir),
+        'rootlib dir:                       @0@'.format(rootlibdir),
+        'SysV init scripts:                 @0@'.format(sysvinit_path),
+        'SysV rc?.d directories:            @0@'.format(sysvrcnd_path),
+        'PAM modules dir:                   @0@'.format(pamlibdir),
+        'PAM configuration dir:             @0@'.format(pamconfdir),
+        'RPM macros dir:                    @0@'.format(rpmmacrosdir),
+        'D-Bus policy dir:                  @0@'.format(dbuspolicydir),
+        'D-Bus session dir:                 @0@'.format(dbussessionservicedir),
+        'D-Bus system dir:                  @0@'.format(dbussystemservicedir),
+        'bash completions dir:              @0@'.format(bashcompletiondir),
+        'zsh completions dir:               @0@'.format(zshcompletiondir),
+        'extra start script:                @0@'.format(get_option('rc-local')),
+        'extra stop script:                 @0@'.format(get_option('halt-local')),
+        'debug shell:                       @0@ @ @1@'.format(get_option('debug-shell'),
+                                                              get_option('debug-tty')),
+        'TTY GID:                           @0@'.format(tty_gid),
+        'maximum system UID:                @0@'.format(system_uid_max),
+        'maximum system GID:                @0@'.format(system_gid_max),
+        '/dev/kvm access mode:              @0@'.format(get_option('dev-kvm-mode')),
+        'certificate root:                  @0@'.format(get_option('certificate-root')),
+        'support URL:                       @0@'.format(support_url),
+        'nobody user name:                  @0@'.format(get_option('nobody-user')),
+        'nobody group name:                 @0@'.format(get_option('nobody-group')),
+        'fallback hostname:                 @0@'.format(get_option('fallback-hostname')),
+
+        'default DNSSEC mode:               @0@'.format(default_dnssec),
+        'default cgroup hierarchy:          @0@'.format(default_hierarchy),
+        'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
+
+alt_dns_servers = '\n                                            '.join(dns_servers.split(' '))
+alt_ntp_servers = '\n                                            '.join(ntp_servers.split(' '))
+status += [
+        'default DNS servers:               @0@'.format(alt_dns_servers),
+        'default NTP servers:               @0@'.format(alt_ntp_servers)]
+
+alt_time_epoch = run_command('date', '-Is', '-u', '-d',
+                             '@@0@'.format(time_epoch)).stdout().strip()
+status += [
+        'time epoch:                        @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
+
+# TODO:
+# CFLAGS:   ${OUR_CFLAGS} ${CFLAGS}
+# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
+# LDFLAGS:  ${OUR_LDFLAGS} ${LDFLAGS}
+
+if conf.get('ENABLE_EFI', false)
+        status += [
+                'efi arch:                          @0@'.format(efi_arch)]
+
+        if have_gnu_efi
+                status += [
+                        'EFI machine type:                  @0@'.format(EFI_MACHINE_TYPE_NAME),
+                        'EFI CC                             @0@'.format(efi_cc),
+                        'EFI libdir:                        @0@'.format(efi_libdir),
+                        'EFI ldsdir:                        @0@'.format(efi_ldsdir),
+                        'EFI includedir:                    @0@'.format(efi_incdir)]
+        endif
+endif
+
+found = []
+missing = []
+
+foreach tuple : [
+        ['libcryptsetup'],
+        ['PAM'],
+        ['AUDIT'],
+        ['IMA'],
+        ['AppArmor'],
+        ['SELinux'],
+        ['SECCOMP'],
+        ['SMACK'],
+        ['zlib'],
+        ['xz'],
+        ['lz4'],
+        ['bzip2'],
+        ['ACL'],
+        ['gcrypt'],
+        ['qrencode'],
+        ['microhttpd'],
+        ['gnutls'],
+        ['libcurl'],
+        ['idn'],
+        ['libidn2'],
+        ['libidn'],
+        ['nss-systemd'],
+        ['libiptc'],
+        ['elfutils'],
+        ['binfmt'],
+        ['vconsole'],
+        ['quotacheck'],
+        ['tmpfiles'],
+        ['environment.d'],
+        ['sysusers'],
+        ['firstboot'],
+        ['randomseed'],
+        ['backlight'],
+        ['rfkill'],
+        ['logind'],
+        ['machined'],
+        ['importd'],
+        ['hostnamed'],
+        ['timedated'],
+        ['timesyncd'],
+        ['localed'],
+        ['networkd'],
+        ['resolved'],
+        ['coredump'],
+        ['polkit'],
+        ['legacy pkla',      install_polkit_pkla],
+        ['efi'],
+        ['gnu-efi',          have_gnu_efi],
+        ['kmod'],
+        ['xkbcommon'],
+        ['blkid'],
+        ['dbus'],
+        ['kdbus',            get_option('kdbus')],
+        ['glib'],
+        ['nss-myhostname',   conf.get('HAVE_MYHOSTNAME', false)],
+        ['hwdb'],
+        ['tpm'],
+        ['man pages',        want_man],
+        ['html pages',       want_html],
+        ['man page indices', want_man and have_lxml],
+        ['split /usr',       conf.get('HAVE_SPLIT_USR', false)],
+        ['SysV compat'],
+        ['utmp'],
+        ['ldconfig'],
+        ['hibernate'],
+        ['adm group',        get_option('adm-group')],
+        ['wheel group',      get_option('wheel-group')],
+        ['gshadow'],
+        ['debug hashmap'],
+        ['debug mmap cache'],
+]
+
+        cond = tuple.get(1, '')
+        if cond == ''
+                ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
+                ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
+                cond = conf.get(ident1, false) or conf.get(ident2, false)
+        endif
+        if cond
+                found += [tuple[0]]
+        else
+                missing += [tuple[0]]
+        endif
+endforeach
+
+status += [
+        'enabled features: @0@'.format(', '.join(found)),
+        'disabled features: @0@'.format(', '.join(missing))]
+message('\n         '.join(status))
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644 (file)
index 0000000..1594fec
--- /dev/null
@@ -0,0 +1,256 @@
+# -*- mode: meson -*-
+
+option('split-usr', type : 'boolean', value : false,
+       description : '''assume that /bin, /sbin aren't symlinks into /usr''')
+option('rootlibdir', type : 'string',
+       description : '''[/usr]/lib/x86_64-linux-gnu or such''')
+option('rootprefix', type : 'string',
+       description : '''override the root prefix''')
+option('link-udev-shared', type : 'boolean',
+       description : 'link systemd-udev and its helpers to libsystemd-shared.so')
+
+option('sysvinit-path', type : 'string', value : '/etc/init.d',
+       description : 'the directory where the SysV init scripts are located')
+option('sysvrcnd-path', type : 'string', value : '/etc/rc.d',
+       description : 'the base directory for SysV rcN.d directories')
+option('telinit-path', type : 'string', description : 'path to telinit')
+option('rc-local', type : 'string',
+       value : '/etc/rc.local')
+option('halt-local', type : 'string',
+       value : '/usr/sbin/halt.local')
+
+option('quotaon-path', type : 'string', description : 'path to quotaon')
+option('quotacheck-path', type : 'string', description : 'path to quotacheck')
+option('kill-path', type : 'string', description : 'path to kill')
+option('kmod-path', type : 'string', description : 'path to kmod')
+option('kexec-path', type : 'string', description : 'path to kexec')
+option('sulogin-path', type : 'string', description : 'path to sulogin')
+option('mount-path', type : 'string', description : 'path to mount')
+option('umount-path', type : 'string', description : 'path to umount')
+option('loadkeys-path', type : 'string', description : 'path to loadkeys')
+option('setfont-path', type : 'string', description : 'path to setfont')
+
+option('debug-shell', type : 'string', value : '/bin/sh',
+       description : 'path to debug shell binary')
+option('debug-tty', type : 'string', value : '/dev/tty9',
+       description : 'specify the tty device for debug shell')
+option('debug', type : 'string',
+       description : 'enable extra debugging (hashmap,mmap-cache)')
+
+option('utmp', type : 'boolean',
+       description : 'support for utmp/wtmp log handling')
+option('hibernate', type : 'boolean',
+       description : 'support for hibernation')
+option('ldconfig', type : 'boolean',
+       description : 'support for dynamic linker cache creation')
+option('resolve', type : 'boolean',
+       description : 'systemd-resolved stack')
+option('efi', type : 'boolean',
+       description : 'enable systemd-boot and bootctl')
+option('tpm', type : 'boolean', value : false,
+       description : 'TPM should be used to log events and extend the registers')
+option('environment-d', type : 'boolean',
+       description : 'support for environment.d')
+option('binfmt', type : 'boolean',
+       description : 'support for custom binary formats')
+option('coredump', type : 'boolean',
+       description : 'install the coredump handler')
+option('logind', type : 'boolean',
+       description : 'install the systemd-logind stack')
+option('hostnamed', type : 'boolean',
+       description : 'install the systemd-hostnamed stack')
+option('localed', type : 'boolean',
+       description : 'install the systemd-localed stack')
+option('machined', type : 'boolean',
+       description : 'install the systemd-machined stack')
+option('networkd', type : 'boolean',
+       description : 'install the systemd-networkd stack')
+option('timedated', type : 'boolean',
+       description : 'install the systemd-timedated daemon')
+option('timesyncd', type : 'boolean',
+       description : 'install the systemd-timesyncd daemon')
+option('remote', type : 'boolean',
+       description : 'support for "journal over the network"')
+option('myhostname', type : 'boolean',
+       description : 'nss-myhostname support')
+option('firstboot', type : 'boolean',
+       description : 'support for firstboot mechanism')
+option('randomseed', type : 'boolean',
+       description : 'support for restoring random seed')
+option('backlight', type : 'boolean',
+       description : 'support for restoring backlight state')
+option('vconsole', type : 'boolean',
+       description : 'support for vconsole configuration')
+option('quotacheck', type : 'boolean',
+       description : 'support for the quotacheck tools')
+option('sysusers', type : 'boolean',
+       description : 'support for the sysusers configuration')
+option('tmpfiles', type : 'boolean',
+       description : 'support for tmpfiles.d')
+option('importd', type : 'boolean',
+       description : 'install the systemd-importd daemon')
+option('hwdb', type : 'boolean',
+       description : 'support for the hardware database')
+option('rfkill', type : 'boolean',
+       description : 'support for the rfkill tools')
+option('man', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'build and install man pages')
+option('html', type : 'combo', choices : ['auto', 'true', 'false'],
+       value : 'false',
+       description : 'build and install html pages')
+
+option('certificate-root', type : 'string', value : '/etc/ssl',
+       description : 'the prefix for TLS certificates')
+option('dbuspolicydir', type : 'string',
+       description : 'D-Bus policy directory')
+option('dbussessionservicedir', type : 'string',
+       description : 'D-Bus session service directory')
+option('dbussystemservicedir', type : 'string',
+       description : 'D-Bus system service directory')
+option('pkgconfigdatadir', type : 'string', value : 'share/pkgconfig',
+       description : 'directory for ')
+option('pkgconfiglibdir', type : 'string', value : '',
+       description : 'directory for ')
+option('rpmmacrosdir', type : 'string', value : 'lib/rpm/macros.d',
+       description : 'directory for rpm macros ["no" disables]')
+option('pamlibdir', type : 'string',
+       description : 'directory for PAM modules')
+option('pamconfdir', type : 'string',
+       description : 'directory for PAM configuration ["no" disables]')
+
+option('fallback-hostname', type : 'string', value : 'localhost',
+       description : 'the hostname used if none configured')
+option('default-hierarchy', type : 'combo',
+       choices : ['legacy', 'hybrid', 'unified'], value : 'hybrid',
+       description : 'default cgroup hierarchy')
+option('time-epoch', type : 'string',
+       description : 'time epoch for time clients')
+option('system-uid-max', type : 'string',
+       description : 'maximum system UID')
+option('system-gid-max', type : 'string',
+       description : 'maximum system GID')
+option('tty-gid', type : 'string',
+       description : 'the numeric GID of the "tty" group',
+       value : '5')
+option('adm-group', type : 'boolean',
+       description : 'the ACL for adm group should be added')
+option('wheel-group', type : 'boolean',
+       description : 'the ACL for wheel group should be added')
+option('nobody-user', type : 'string',
+       description : 'The name of the nobody user (the one with UID 65534)',
+       value : 'nobody')
+option('nobody-group', type : 'string',
+       description : 'The name of the nobody group (the one with GID 65534)',
+       value : 'nobody')
+option('dev-kvm-mode', type : 'string', value : '0660',
+       description : '/dev/kvm access mode')
+option('default-kill-user-processes', type : 'boolean',
+       description : 'the default value for KillUserProcesses= setting')
+option('gshadow', type : 'boolean',
+       description : 'support for shadow group')
+
+option('default-dnssec', type : 'combo',
+       description : 'default DNSSEC mode',
+       choices : ['yes', 'allow-downgrade', 'no'],
+       value : 'allow-downgrade')
+option('dns-servers', type : 'string',
+       description : 'space-separated list of default DNS servers',
+       value : '8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844')
+option('ntp-servers', type : 'string',
+       description : 'space-separated list of default NTP servers',
+       value : 'time1.google.com time2.google.com time3.google.com time4.google.com')
+option('support-url', type : 'string',
+       description : 'the support URL to show in catalog entries included in systemd',
+       value : 'https://lists.freedesktop.org/mailman/listinfo/systemd-devel')
+option('www-target', type : 'string',
+       description : 'the address and dir to upload docs too',
+       value : 'www.freedesktop.org:/srv/www.freedesktop.org/www/software/systemd')
+
+option('seccomp', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'SECCOMP support')
+option('selinux', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'SELinux support')
+option('apparmor', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'AppArmor support')
+option('smack', type : 'boolean',
+       description : 'SMACK support')
+option('smack-run-label', type : 'string',
+       description : 'run systemd --system itself with a specific SMACK label')
+option('polkit', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'PolicyKit support')
+option('ima', type : 'boolean',
+       description : 'IMA support')
+
+option('acl', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'libacl support')
+option('audit', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'libaudit support')
+option('blkid', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'libblkid support')
+option('kmod', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'support for loadable modules')
+option('pam', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'PAM support')
+option('microhttpd', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'libµhttpd support')
+option('libcryptsetup', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'libcryptsetup support')
+option('libcurl', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'libcurl support')
+option('idn', type : 'boolean',
+       description : 'use IDN when printing host names')
+option('libidn2', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'libidn2 support')
+option('libidn', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'libidn support')
+option('nss-systemd', type : 'boolean',
+       description : 'enable nss-systemd')
+option('libiptc', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'libiptc support')
+option('qrencode', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'libqrencode support')
+option('gcrypt', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'gcrypt support')
+option('gnutls', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'gnutls support')
+option('elfutils', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'elfutils support')
+option('zlib', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'zlib compression support')
+option('bzip2', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'bzip2 compression support')
+option('xz', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'xz compression support')
+option('lz4', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'lz4 compression support')
+option('xkbcommon', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'xkbcommon keymap support')
+option('glib', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'libglib support (for tests only)')
+option('dbus', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'libdbus support (for tests only)')
+
+option('gnu-efi', type : 'combo', choices : ['auto', 'true', 'false'],
+       description : 'gnu-efi support for sd-boot')
+option('efi-cc', type : 'string', value : 'gcc',
+       description : 'the compiler to use for EFI modules')
+option('efi-ld', type : 'string', value : 'ld',
+       description : 'the linker to use for EFI modules')
+option('efi-libdir', type : 'string',
+       description : 'path to the EFI lib directory')
+option('efi-ldsdir', type : 'string',
+       description : 'path to the EFI lds directory')
+option('efi-includedir', type : 'string', value : '/usr/include/efi',
+       description : 'path to the EFI header directory')
+option('tpm-pcrindex', type : 'string', value : '8',
+       description : 'TPM PCR register number to use')
+
+option('bashcompletiondir', type : 'string',
+       description : 'directory for bash completion scripts ["no" disables]')
+option('zshcompletiondir', type : 'string',
+       description : 'directory for zsh completion scripts ["no" disables]')
+
+option('tests', type : 'combo', choices : ['true', 'unsafe'],
+       description : 'enable extra tests with =unsafe')
+option('install-tests', type : 'boolean', value : 'false',
+       description : 'install test executables')
index 09d835d..2231118 100755 (executable)
 # This is a build script for OS image generation using mkosi (https://github.com/systemd/mkosi).
 # Simply invoke "mkosi" in the project directory to build an OS image.
 
-git clean -dfqx
-./autogen.sh c
-make -j `nproc`
-make install
+export LC_CTYPE=C.UTF-8
+meson build
+ninja -C build all
+ninja -C build test
+ninja -C build install
+
+mkdir -p $DESTDIR/etc
+
+cat > $DESTDIR/etc/issue <<EOF
+\S (built from systemd tree)
+Kernel \r on an \m (\l)
+
+EOF
deleted file mode 100644 (file)
index 1c161df8361289425425f4951bf7ee7c1c4426a3..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# This file is part of systemd.
-#
-# Copyright 2016 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/>.
-
-# This is a settings file for OS image generation using mkosi (https://github.com/systemd/mkosi).
-# Simply invoke "mkosi" in the project directory to build an OS image.
-
-[Distribution]
-Distribution=fedora
-Release=24
-
-[Output]
-Format=raw_btrfs
-Bootable=yes
-
-[Partitions]
-RootSize=2G
-
-[Packages]
-Cache=/var/tmp/dnf-cache
-BuildPackages=
-        audit-libs-devel
-        autoconf
-        automake
-        bzip2-devel
-        cryptsetup-devel
-        dbus-devel
-        docbook-style-xsl
-        elfutils-devel
-        gcc
-        git
-        gnu-efi
-        gnu-efi-devel
-        gnutls-devel
-        gperf
-        intltool
-        iptables-devel
-        kmod-devel
-        libacl-devel
-        libblkid-devel
-        libcap-devel
-        libcurl-devel
-        libgcrypt-devel
-        libidn-devel
-        libmicrohttpd-devel
-        libmount-devel
-        libseccomp-devel
-        libselinux-devel
-        libtool
-        libxkbcommon-devel
-        libxslt
-        lz4-devel
-        make
-        pam-devel
-        pkgconfig
-        python3-devel
-        python3-lxml
-        qrencode-devel
-        xz-devel
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..2718c9e2a0d7321e29ab11725081bdaeed1efe0e
--- /dev/null
@@ -0,0 +1 @@
+.mkosi/mkosi.fedora
\ No newline at end of file
diff --git a/network/meson.build b/network/meson.build
new file mode 100644 (file)
index 0000000..e9f9bba
--- /dev/null
@@ -0,0 +1,12 @@
+if conf.get('ENABLE_NETWORKD', false)
+        install_data('80-container-host0.network',
+                     '80-container-ve.network',
+                     '80-container-vz.network',
+                     install_dir : networkdir)
+
+        meson.add_install_script('sh', '-c',
+                                 mkdir_p.format(join_paths(sysconfdir, 'systemd/network')))
+endif
+
+install_data('99-default.link',
+             install_dir : networkdir)
diff --git a/packaging/sysctl-tizen-override.conf b/packaging/sysctl-tizen-override.conf
new file mode 100644 (file)
index 0000000..aadbf78
--- /dev/null
@@ -0,0 +1 @@
+net.core.default_qdisc = pfifo_fast
index 4bfc97c..0ff90b5 100644 (file)
 %define WITH_DOC 0
 %define WITH_HOSTNAMED 0
 
+%define build_dir _build
+%define dbuspolicydir %{_datadir}/dbus-1
+
+# The 'meson' macro is defined in rpm macros, but it uses features from rpm 4.15 ({shrink, set_build_flags)
+# Below is a version suitable for our purposes
+%define meson \
+  CFLAGS="${CFLAGS:-%optflags}" \
+  export CFLAGS \
+  %{__meson} \\\
+        --buildtype=plain \\\
+        --prefix=%{_prefix} \\\
+        --libdir=%{_libdir} \\\
+        --libexecdir=%{_libexecdir} \\\
+        --bindir=%{_bindir} \\\
+        --sbindir=%{_sbindir} \\\
+        --includedir=%{_includedir} \\\
+        --datadir=%{_datadir} \\\
+        --mandir=%{_mandir} \\\
+        --infodir=%{_infodir} \\\
+        --localedir=%{_datadir}/locale \\\
+        --sysconfdir=%{_sysconfdir} \\\
+        --localstatedir=%{_localstatedir} \\\
+        --sharedstatedir=%{_sharedstatedir} \\\
+        --wrap-mode=%{__meson_wrap_mode} \\\
+               %{_vpath_builddir}
+# Ninja macros below are defined for ninja in e.g. fedora distro, but
+# so far they are not provided by Tizen's ninja package.
+%define __ninja %{_bindir}/ninja
+%define __ninja_common_opts -v %{?_smp_flags}
+%define ninja_build \
+               %{__ninja} %{__ninja_common_opts}
+%define ninja_install \
+               DESTDIR=%{buildroot} %{__ninja} install %{__ninja_common_opts}
+
 Name:           systemd
-Version:        231
+Version:        234
 Release:        0%{?release_flags}
 # For a breakdown of the licensing, see README
 License:        LGPL-2.1+ and GPL-2.0+
@@ -28,6 +62,7 @@ Source3:        test-runner.c
 Source4:        wait-default-target.sh
 Source5:        wait-delayed-target.sh
 Source6:        org.tizen.system.conf
+Source7:        sysctl-tizen-override.conf
 Source1001:     systemd.manifest
 BuildRequires:  gperf
 BuildRequires:  intltool >= 0.40.0
@@ -47,6 +82,9 @@ BuildRequires:  pkgconfig(glib-2.0)
 BuildRequires:  pkgconfig(liblzma)
 BuildRequires:  pkgconfig(libkmod)
 BuildRequires:  pkgconfig(mount)
+BuildRequires:  meson
+BuildRequires:  acl
+BuildRequires:  python
 # Requires:       dbus                  # for remove circular dependency on OBS
 Requires:       filesystem
 Requires(post): coreutils
@@ -121,66 +159,62 @@ for sd-bus component (DBUS API C library).
 
 %prep
 %setup -q
+
+%build
 cp %{SOURCE1001} .
 cp %{SOURCE3} .
 
-%build
-%autogen
-# Support for generating separate packages with libraries generating coverage files
-# WARNING: if coverage build is enabled, incremental builds will not work correctly.
-#          Use the option only to generate systemd-coverage packages.
-%configure \
+%define _vpath_srcdir .
+%define _vpath_builddir %{build_dir}
+%meson \
 %if ! %{WITH_RANDOMSEED}
-        --disable-randomseed \
+       -Drandomseed=false \
 %endif
 %if ! %{?WITH_COREDUMP}
-       --disable-coredump \
+       -Dcoredump=false \
 %endif
 %if ! %{?WITH_BACKLIGHT}
-       --disable-backlight \
+       -Dbacklight=false \
 %endif
 %if ! %{?WITH_TIMEDATED}
-       --disable-timedated \
+       -Dtimedated=false \
 %endif
 %if ! %{WITH_RFKILL}
-       --disable-rfkill \
+       -Drfkill=false \
 %endif
-        --enable-compat-libs \
-        --disable-hwdb \
-        --disable-sysusers \
-        --disable-firstboot \
-        --disable-polkit \
-        --disable-timesyncd \
-        --disable-resolved \
-        --disable-networkd \
+        -Dhwdb=false \
+        -Dsysusers=false \
+        -Dfirstboot=false \
+        -Dpolkit=false \
+        -Dtimesyncd=false \
+        -Dresolve=false \
+        -Dnetworkd=false \
 %if ! %{?WITH_MACHINED}
-        --disable-machined \
+        -Dmachined=false \
 %endif
 %if ! %{?WITH_HOSTNAMED}
-        --disable-hostnamed \
+        -Dhostnamed=false \
 %endif
-        --disable-importd \
-        --disable-gcrypt \
-        --libexecdir=%{_prefix}/lib \
-        --docdir=%{_docdir}/systemd \
+        -Dimportd=false \
+               -Denvironment-d=false \
+               -Dnss-systemd=false \
+        -Dgcrypt=false \
 %if ! %{?WITH_DOC}
-        --disable-manpages \
+        -Dman=false \
 %endif
-        --disable-static \
-        --with-rpmmacrosdir=%{_sysconfdir}/rpm/ \
-        --with-sysvinit-path= \
-        --with-sysvrcnd-path= \
-        --with-smack-run-label=System::Privileged \
-        cc_cv_CFLAGS__flto=no
-make %{?_smp_mflags} \
-        systemunitdir=%{_unitdir} \
-        userunitdir=%{_unitdir_user}
+        -Drpmmacrosdir=%{_sysconfdir}/rpm/ \
+        -Dsysvinit-path="" \
+        -Dsysvrcnd-path="" \
+        -Dsmack-run-label=System::Privileged \
+               -Dinstall-tests=true \
+               -Db_pie=true
+%meson_build
 
 # compile test-runner for 'dbus-integration-test' framework
 %__cc %{_builddir}/%{name}-%{version}/test-runner.c -o %{_builddir}/%{name}-%{version}/systemd-tests
 
 %install
-%make_install
+%meson_install
 %find_lang %{name}
 cat <<EOF >> systemd.lang
 %lang(be) /usr/lib/systemd/catalog/systemd.be.catalog
@@ -272,8 +306,6 @@ rm -rf %{buildroot}/%{_prefix}/lib/systemd/system/multi-user.target.wants/system
 rm -rf %{buildroot}/%{_prefix}/lib/systemd/system/systemd-tmpfiles-clean.timer
 rm -rf %{buildroot}/%{_prefix}/lib/systemd/system/systemd-tmpfiles-clean.service
 rm -rf %{buildroot}/%{_prefix}/lib/systemd/system/timers.target.wants/systemd-tmpfiles-clean.timer
-rm -rf %{buildroot}/%{_prefix}/lib/systemd/system/systemd-remount-fs.service
-rm -rf %{buildroot}/%{_prefix}/lib/systemd/system/local-fs.target.wants/systemd-remount-fs.service
 
 # Exclude ELF binaries
 rm -f %{buildroot}/%{_prefix}/lib/systemd/system-generators/systemd-debug-generator
@@ -281,10 +313,10 @@ rm -f %{buildroot}/%{_prefix}/lib/systemd/system-generators/systemd-efi-boot-gen
 rm -f %{buildroot}/%{_prefix}/lib/systemd/system-generators/systemd-gpt-auto-generator
 rm -f %{buildroot}/%{_prefix}/lib/systemd/system-generators/systemd-hibernate-resume-generator
 
-# Preapre tests for 'dbus-integration-test' framework
+# Prepare tests for 'dbus-integration-test' framework
 install -D -m 755 %{_builddir}/%{name}-%{version}/systemd-tests %{buildroot}%{_prefix}/lib/dbus-tests/runner/systemd-tests
 mkdir -p %{buildroot}%{_prefix}/lib/dbus-tests/test-suites/systemd-tests/
-mv %{_builddir}/%{name}-%{version}/test-bus-* %{buildroot}%{_prefix}/lib/dbus-tests/test-suites/systemd-tests/
+mv %{buildroot}%{_prefix}/lib/systemd/tests/test-bus-* %{buildroot}%{_prefix}/lib/dbus-tests/test-suites/systemd-tests/
 
 # Shell Completion
 %if ! %{?WITH_BASH_COMPLETION}
@@ -304,7 +336,10 @@ ln -sf ./libsystemd.pc %{buildroot}%{_libdir}/pkgconfig/libsystemd-login.pc
 # Delayed target
 install -m 0755 %{SOURCE4} %{buildroot}%{_bindir}/wait-default-target.sh
 install -m 0755 %{SOURCE5} %{buildroot}%{_bindir}/wait-delayed-target.sh
-install -m 0755 %{SOURCE6} %{buildroot}%{_sysconfdir}/dbus-1/system.d/org.tizen.system.conf
+install -m 0755 %{SOURCE6} %{buildroot}%{dbuspolicydir}/system.d/org.tizen.system.conf
+
+# Tizen sysctl values overriding default systemd values
+install -m 0644 %{SOURCE7} %{buildroot}%{_sysconfdir}/sysctl.d/
 
 # end of install
 %pre
@@ -458,26 +493,29 @@ fi
 %dir %{_prefix}/lib/firmware
 %dir %{_prefix}/lib/firmware/updates
 %dir %{_datadir}/systemd
-%config(noreplace) %{_sysconfdir}/dbus-1/system.d/org.freedesktop.systemd1.conf
+%config(noreplace) %{dbuspolicydir}/system.d/org.freedesktop.systemd1.conf
 %if %{?WITH_HOSTNAMED}
-%config(noreplace) %{_sysconfdir}/dbus-1/system.d/org.freedesktop.hostname1.conf
+%config(noreplace) %{dbuspolicydir}/system.d/org.freedesktop.hostname1.conf
 %endif
-%config(noreplace) %{_sysconfdir}/dbus-1/system.d/org.freedesktop.login1.conf
-%config(noreplace) %{_sysconfdir}/dbus-1/system.d/org.freedesktop.locale1.conf
+%config(noreplace) %{dbuspolicydir}/system.d/org.freedesktop.login1.conf
+%config(noreplace) %{dbuspolicydir}/system.d/org.freedesktop.locale1.conf
 %if %{?WITH_TIMEDATED}
-%config(noreplace) %{_sysconfdir}/dbus-1/system.d/org.freedesktop.timedate1.conf
+%config(noreplace) %{dbuspolicydir}/system.d/org.freedesktop.timedate1.conf
 %endif
 %if %{?WITH_MACHINED}
-%config(noreplace) %{_sysconfdir}/dbus-1/system.d/org.freedesktop.machine1.conf
+%config(noreplace) %{dbuspolicydir}/system.d/org.freedesktop.machine1.conf
 %endif
 %if %{?WITH_COREDUMP}
 %config(noreplace) %{_sysconfdir}/systemd/coredump.conf
+%else
+%exclude %{_sysconfdir}/systemd/coredump.conf
 %endif
 %config(noreplace) %{_sysconfdir}/systemd/system.conf
 %config(noreplace) %{_sysconfdir}/systemd/user.conf
 %config(noreplace) %{_sysconfdir}/systemd/logind.conf
 %config(noreplace) %{_sysconfdir}/systemd/journald.conf
 %config(noreplace) %{_sysconfdir}/udev/udev.conf
+%config(noreplace) %{_sysconfdir}/sysctl.d/sysctl-tizen-override.conf
 %{_sysconfdir}/xdg/systemd
 %ghost %config(noreplace) %{_sysconfdir}/hostname
 %ghost %config(noreplace) %{_sysconfdir}/vconsole.conf
@@ -508,10 +546,12 @@ fi
 %{_bindir}/udevadm
 %{_bindir}/systemd-escape
 %{_bindir}/systemd-path
+%{_bindir}/networkctl
+%{_bindir}/systemd-mount
+%{_bindir}/systemd-umount
 %{_prefix}/lib/sysctl.d/*.conf
 %{_prefix}/lib/systemd/systemd
 %{_prefix}/lib/systemd/system
-%exclude %{_prefix}/lib/systemd/resolv.conf
 
 %dir %{_prefix}/lib/systemd/system/basic.target.wants
 %dir %{_prefix}/lib/systemd/user
@@ -528,10 +568,9 @@ fi
 %{_prefix}/lib/systemd/user/paths.target
 %{_prefix}/lib/systemd/user/smartcard.target
 %{_prefix}/lib/systemd/user/timers.target
-%exclude %{_prefix}/lib/systemd/network/80-container-ve.network
-%exclude %{_prefix}/lib/systemd/network/80-container-host0.network
-%exclude %{_prefix}/lib/systemd/network/80-container-vz.network
 %{_prefix}/lib/systemd/user/default.target
+%exclude %{_prefix}/lib/systemd/user/graphical-session.target
+%exclude %{_prefix}/lib/systemd/user/graphical-session-pre.target
 %{_prefix}/lib/systemd/network/99-default.link
 %exclude %{_prefix}/lib/systemd/system-preset/90-systemd.preset
 %{_prefix}/lib/systemd/user/delayed.target
@@ -541,10 +580,9 @@ fi
 %{_prefix}/lib/systemd/user/default.target.wants/user-default-target-done.service
 %{_prefix}/lib/systemd/user/user-delayed-target-done.service
 %{_prefix}/lib/systemd/user/delayed.target.wants/user-delayed-target-done.service
-%{_sysconfdir}/dbus-1/system.d/org.tizen.system.conf
+%{dbuspolicydir}/system.d/org.tizen.system.conf
 
-%{_prefix}/lib/systemd/libsystemd-shared-231.so
-%{_prefix}/lib/systemd/libsystemd-shared.so
+%{_prefix}/lib/systemd/libsystemd-shared-%{version}.so
 %{_prefix}/lib/systemd/systemd-*
 %dir %{_prefix}/lib/systemd/catalog
 %{_prefix}/lib/systemd/catalog/systemd.catalog
@@ -597,6 +635,14 @@ fi
 
 %{_bindir}/wait-default-target.sh
 %{_bindir}/wait-delayed-target.sh
+%exclude %{_prefix}/lib/systemd/system/systemd-networkd.socket
+%exclude %{_prefix}/lib/systemd/system/runlevel0.target
+%exclude %{_prefix}/lib/systemd/system/runlevel1.target
+%exclude %{_prefix}/lib/systemd/system/runlevel2.target
+%exclude %{_prefix}/lib/systemd/system/runlevel3.target
+%exclude %{_prefix}/lib/systemd/system/runlevel4.target
+%exclude %{_prefix}/lib/systemd/system/runlevel5.target
+%exclude %{_prefix}/lib/systemd/system/runlevel6.target
 
 %files -n libsystemd
 %manifest %{name}.manifest
@@ -644,7 +690,11 @@ fi
 %manifest %{name}.manifest
 %{_prefix}/lib/dbus-tests/test-suites/systemd-tests/
 %{_prefix}/lib/dbus-tests/runner/systemd-tests
+%{_prefix}/lib/systemd/tests/
 
 %if %{?WITH_DOC}
 %docs_package
+%else
+%exclude %{_docdir}
+%exclude %{_datadir}/doc/systemd
 %endif
index 2f1ba19..cc64eab 100644 (file)
@@ -1,6 +1,8 @@
 be
 be@latin
 bg
+ca
+cs
 da
 de
 el
@@ -15,6 +17,7 @@ ko
 pl
 pt_BR
 ru
+sk
 sr
 sv
 tr
diff --git a/po/ca.po b/po/ca.po
new file mode 100644 (file)
index 0000000..30fdea0
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,525 @@
+# Catalan translation for systemd.
+# Copyright (C) 2015 systemd's COPYRIGHT HOLDER
+# This file is distributed under the same license as the systemd package.
+# Walter Garcia-Fontes <walter.garcia@upf.edu>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: systemd master\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-11-22 16:37+0100\n"
+"PO-Revision-Date: 2016-12-29 09:02+0100\n"
+"Last-Translator: Walter Garcia-Fontes <walter.garcia@upf.edu>\n"
+"Language-Team: Català <ubuntu-l10n-ca@lists.ubuntu.com>\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:1
+msgid "Send passphrase back to system"
+msgstr "Retornar la contrasenya al sistema"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:2
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr "Es requereix autenticació per retornar la contrasenya entrada al sistema."
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:3
+msgid "Manage system services or other units"
+msgstr "Administrar serveis del sistema o d'altres unitats."
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:4
+msgid "Authentication is required to manage system services or other units."
+msgstr "Es requereix autenticació per administrar els serveis de sistemes o d'altres unitats."
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:5
+msgid "Manage system service or unit files"
+msgstr "Gestiona un servei de sistema o fitxers d'unitat"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:6
+msgid "Authentication is required to manage system service or unit files."
+msgstr "Cal autenticació per gestionar un servei de sistema o fitxers d'unitat."
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:7
+msgid "Set or unset system and service manager environment variables"
+msgstr "Administrar variables de entorno del sistema y del gestor de servicios"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:8
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr "Cal autenticació per establir o cancel·lar variables d'entorn de sistema o del gestor de serveis."
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:9
+msgid "Reload the systemd state"
+msgstr "Recarrega l'estat del systemd"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:10
+msgid "Authentication is required to reload the systemd state."
+msgstr "Cal autenticació per establir el nom de l'ordinador local."
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:1
+msgid "Set host name"
+msgstr "Estableix el nom de l'ordinador"
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:2
+msgid "Authentication is required to set the local host name."
+msgstr "Cal autenticació per establir el nom de l'ordinador local."
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:3
+msgid "Set static host name"
+msgstr "Estableix el nom estàtic de l'ordinador"
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:4
+msgid ""
+"Authentication is required to set the statically configured local host name, "
+"as well as the pretty host name."
+msgstr "Cal autenticació per establir el nom configurat estàticament de l'ordinador local, així com el nom de l'ordinador de nivell superior."
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:5
+msgid "Set machine information"
+msgstr "Estableix la informació de l'ordinador"
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:6
+msgid "Authentication is required to set local machine information."
+msgstr "Cal autenticació per establir la informació de l'ordinador local."
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:1
+msgid "Import a VM or container image"
+msgstr "Importa una màquina virtual o una imatge de contenidor"
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:2
+msgid "Authentication is required to import a VM or container image"
+msgstr "Cal autenticació per importar una màquina virtual o una imatge de contenidor"
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:3
+msgid "Export a VM or container image"
+msgstr "Exporta una màquina virtual o una imatge de contenidor"
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:4
+msgid "Authentication is required to export a VM or container image"
+msgstr "Cal autenticació per exportar una màquina virtual o una imatge de contenidor"
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:5
+msgid "Download a VM or container image"
+msgstr "Descarrega una màquina virtual o una imatge de contenidor"
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:6
+msgid "Authentication is required to download a VM or container image"
+msgstr "Cal autenticació per descarregar una màquina virtual o una imatge de contenidor"
+
+#: ../src/locale/org.freedesktop.locale1.policy.in.h:1
+msgid "Set system locale"
+msgstr "Estableix la regió del sistema"
+
+#: ../src/locale/org.freedesktop.locale1.policy.in.h:2
+msgid "Authentication is required to set the system locale."
+msgstr "Cal autenticació per establir la regió del sistema."
+
+#: ../src/locale/org.freedesktop.locale1.policy.in.h:3
+msgid "Set system keyboard settings"
+msgstr "Estableix la configuració del teclat del sistema."
+
+#: ../src/locale/org.freedesktop.locale1.policy.in.h:4
+msgid "Authentication is required to set the system keyboard settings."
+msgstr "Cal autenticació per establir la configuració del teclat del sistema."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:1
+msgid "Allow applications to inhibit system shutdown"
+msgstr "Permet a les aplicacions inhibir l'apagada del sistema"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:2
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr "Cal autenticació perquè una aplicació inhibeixi l'apagada del sistema."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:3
+msgid "Allow applications to delay system shutdown"
+msgstr "Permet a les aplicacions endarrerir l'apagada del sistema"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:4
+msgid "Authentication is required for an application to delay system shutdown."
+msgstr "Cal autenticació perquè una aplicació endarrereixi l'apagada del sistema."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:5
+msgid "Allow applications to inhibit system sleep"
+msgstr "Permet a les aplicacions inhibir la hibernació del sistema"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:6
+msgid "Authentication is required for an application to inhibit system sleep."
+msgstr "Cal autenticació perquè una aplicació inhibeixi la hibernació del sistema."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:7
+msgid "Allow applications to delay system sleep"
+msgstr "Permet a les aplicacions endarrerir la hibernació del sistema"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:8
+msgid "Authentication is required for an application to delay system sleep."
+msgstr "Cal autenticació perquè una aplicació endarrereixi la hibernació del sistema."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:9
+msgid "Allow applications to inhibit automatic system suspend"
+msgstr "Permet a les aplicacions inhibir la suspensió automàtica del sistema"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:10
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr "Cal autenticació perquè una aplicació inhibeixi la suspensió automàtica del sistema."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:11
+msgid "Allow applications to inhibit system handling of the power key"
+msgstr "Permet a les aplicacions inhibir la gestió de la tecla d'encesa per part del sistema"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:12
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr "Cal autenticació perquè una aplicació inhibeixi la gestió de la tecla d'encesa per part del sistema."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:13
+msgid "Allow applications to inhibit system handling of the suspend key"
+msgstr "Permet a les aplicacions inhibir la tecla de suspensió per part del sistema"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:14
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr "Cal autenticació perquè una aplicació inhibeixi la gestió de la tecla de suspensió per part del sistema."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:15
+msgid "Allow applications to inhibit system handling of the hibernate key"
+msgstr "Permet a les aplicacions inhibir la gestió de la tecla d'hibernació per part del sistema"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:16
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr "Cal autenticació perquè una aplicació inhibeixi la gestió de la tecla d'hibernació per part del sistema."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:17
+msgid "Allow applications to inhibit system handling of the lid switch"
+msgstr "Permet a les aplicacions la gestió del tancament de la tapa per part del sistema"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:18
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr "Cal autenticació perquè una aplicació inhibeixi la gestió del tancament de la tapa per part del sistema."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:19
+msgid "Allow non-logged-in users to run programs"
+msgstr "Permet l'execució de programes als usuaris sense inici de sessió"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:20
+msgid "Authentication is required to run programs as a non-logged-in user."
+msgstr "Cal autenticació per a la execució de programes per part d'usuaris sense inici de sessió"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:21
+msgid "Allow attaching devices to seats"
+msgstr "Permet l'annexió de dispositius als llocs de treball"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:22
+msgid "Authentication is required for attaching a device to a seat."
+msgstr "Cal autenticació per annexar un dispositiu a un lloc de treball."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:23
+msgid "Flush device to seat attachments"
+msgstr "Allibera les annexions de dispositius a llocs de treball"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:24
+msgid ""
+"Authentication is required for resetting how devices are attached to seats."
+msgstr "Cal autenticació per restablir les annexions dels dispositius als llocs de treball."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:25
+msgid "Power off the system"
+msgstr "Apaga el sistema"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:26
+msgid "Authentication is required for powering off the system."
+msgstr "Cal autenticació per apagar el sistema"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:27
+msgid "Power off the system while other users are logged in"
+msgstr "Apaga el sistema mentre que altres usuaris tenen sessió iniciada"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:28
+msgid ""
+"Authentication is required for powering off the system while other users are "
+"logged in."
+msgstr "Cal autenticació per apagar el sistema mentre que altres usuaris tenen sessió iniciada."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:29
+msgid "Power off the system while an application asked to inhibit it"
+msgstr "Apaga el sistema mentre que una aplicació ha demanat inhibir-lo"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:30
+msgid ""
+"Authentication is required for powering off the system while an application "
+"asked to inhibit it."
+msgstr "Cal autenticació per apagar el sistema mentre que una aplicació ha demanat inhibir-lo."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:31
+msgid "Reboot the system"
+msgstr "Reinicia el sistema"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:32
+msgid "Authentication is required for rebooting the system."
+msgstr "Cal autenticació per reiniciar el sistema."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:33
+msgid "Reboot the system while other users are logged in"
+msgstr "Reinicia el sistema mentre hi ha usuaris amb sessió iniciada"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:34
+msgid ""
+"Authentication is required for rebooting the system while other users are "
+"logged in."
+msgstr "Cal autenticació per reiniciar el sistema mentre hi ha usuaris amb sessió iniciada."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:35
+msgid "Reboot the system while an application asked to inhibit it"
+msgstr "Reinicia el sistema malgrat hi ha una aplicació que ho impedeix"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:36
+msgid ""
+"Authentication is required for rebooting the system while an application "
+"asked to inhibit it."
+msgstr "Cal autenticació per reiniciar el sistema malgrat hi ha una aplicació que ho impedeix."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:37
+msgid "Suspend the system"
+msgstr "Suspèn el sistema"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:38
+msgid "Authentication is required for suspending the system."
+msgstr "Cal autenticació per suspendre el sistema"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:39
+msgid "Suspend the system while other users are logged in"
+msgstr "Suspèn el sistema mentre hi ha altres usuaris amb sessió iniciada"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:40
+msgid ""
+"Authentication is required for suspending the system while other users are "
+"logged in."
+msgstr "Cal autenticació per reiniciar el sistema mentre hi ha usuaris amb sessió iniciada."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:41
+msgid "Suspend the system while an application asked to inhibit it"
+msgstr "Suspèn el sistema mentre una aplicació ha demanat d'inhibir-lo"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:42
+msgid ""
+"Authentication is required for suspending the system while an application "
+"asked to inhibit it."
+msgstr "Cal autenticació per suspendre el sistema mentre una aplicació ha demanat d'inhibir-lo."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:43
+msgid "Hibernate the system"
+msgstr "Hiberna el sistema"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:44
+msgid "Authentication is required for hibernating the system."
+msgstr "Cal autenticació per hibernar el sistema."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:45
+msgid "Hibernate the system while other users are logged in"
+msgstr "Hiberna el sistema mentre hi ha altres usuaris amb sessió iniciada"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:46
+msgid ""
+"Authentication is required for hibernating the system while other users are "
+"logged in."
+msgstr "Cal autenticació per hibernar el sistema mentre hi ha altres usuaris amb sessió iniciada."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:47
+msgid "Hibernate the system while an application asked to inhibit it"
+msgstr "Hiberna el sistema mentre una aplicació ha demanat inhibir-ho"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:48
+msgid ""
+"Authentication is required for hibernating the system while an application "
+"asked to inhibit it."
+msgstr "Cal autenticació per hibernar el sistema mentre una aplicació ha demanat inhibir-ho."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:49
+msgid "Manage active sessions, users and seats"
+msgstr "Gestiona les sessions, usuaris i llocs de treball actius"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:50
+msgid ""
+"Authentication is required for managing active sessions, users and seats."
+msgstr "Cal autenticació per administrar les sessions, usuaris i llocs de treball actius."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:51
+msgid "Lock or unlock active sessions"
+msgstr "Bloqueja o desbloqueja les sessions actives"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:52
+msgid "Authentication is required to lock or unlock active sessions."
+msgstr "Cal autenticació per bloquejar o desbloquejar les sessions actives."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:53
+msgid "Allow indication to the firmware to boot to setup interface"
+msgstr "Permet una indicació al microprogramari per iniciar a la interfície de configuració"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:54
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr "Cal autenticació per indicar al microprogramari que iniciï a la interfície de configuració."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:55
+msgid "Set a wall message"
+msgstr "Estableix un missatge de mur"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:56
+msgid "Authentication is required to set a wall message"
+msgstr "Cal autenticació per establir un text de mur"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:1
+msgid "Log into a local container"
+msgstr "Inicia sessió a un contenidor local"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:2
+msgid "Authentication is required to log into a local container."
+msgstr "Cal autenticació per iniciar sessió a un contenidor local."
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:3
+msgid "Log into the local host"
+msgstr "Inicia sessió a l'ordinador local"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:4
+msgid "Authentication is required to log into the local host."
+msgstr "Cal autenticació per iniciar sessió a l'ordinador local."
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:5
+msgid "Acquire a shell in a local container"
+msgstr "Adquireix un intèrpret d'ordres a un contenidor local"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:6
+msgid "Authentication is required to acquire a shell in a local container."
+msgstr "Cal autenticació per adquirir un intèrpret d'ordres a un contenidor local."
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:7
+msgid "Acquire a shell on the local host"
+msgstr "Adquireix un intèrpret d'ordres a l'ordinador local"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:8
+msgid "Authentication is required to acquire a shell on the local host."
+msgstr "Cal autenticació per adquirir un intèrpret d'ordres a l'ordinador local."
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:9
+msgid "Acquire a pseudo TTY in a local container"
+msgstr "Adquireix un pseudo-terminal al contenidor local"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:10
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr "Cal autenticació per adquirir una pseudo-terminal al contenidor local."
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:11
+msgid "Acquire a pseudo TTY on the local host"
+msgstr "Adquireix una pseudo-terminal a l'ordinador local"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:12
+msgid "Authentication is required to acquire a pseudo TTY on the local host."
+msgstr "Cal autenticació per adquirir una pseudo-terminal a l'ordinador local."
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:13
+msgid "Manage local virtual machines and containers"
+msgstr "Gestiona les màquines virtuals i els contenidors locals "
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:14
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr "Cal autenticació per gestionar les màquines virtuals i els contenidors locals."
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:15
+msgid "Manage local virtual machine and container images"
+msgstr "Gestiona les imatges locals de màquines virtuals i contenidors"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:16
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr "Cal autenticació per gestionar les imatges locals de màquines virtuals i contenidors."
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:1
+msgid "Set system time"
+msgstr "Estableix la data i l'hora del sistema"
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:2
+msgid "Authentication is required to set the system time."
+msgstr "Cal autenticació per establir la data i l'hora del sistema."
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:3
+msgid "Set system timezone"
+msgstr "Estableix la zona horària del sistema"
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:4
+msgid "Authentication is required to set the system timezone."
+msgstr "Cal autenticació per establir la zona horària del sistema."
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:5
+msgid "Set RTC to local timezone or UTC"
+msgstr "Estableix el rellotge del sistema a la zona horària local o a UTC"
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:6
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr "Cal autenticació per controlar si el rellotge del sistema emmagatzema la data i l'hora locals o UTC."
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:7
+msgid "Turn network time synchronization on or off"
+msgstr "Activa o desactiva la sincronització de data i hora de xarxa"
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:8
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr "Cal autenticació per controlar si s'ha d'activar la sincronització de data i hora de xarxa."
+
+#: ../src/core/dbus-unit.c:428
+msgid "Authentication is required to start '$(unit)'."
+msgstr "Cal autenticació per iniciar «$(unit)»."
+
+#: ../src/core/dbus-unit.c:429
+msgid "Authentication is required to stop '$(unit)'."
+msgstr "Cal autenticació per aturar «$(unit)»."
+
+#: ../src/core/dbus-unit.c:430
+msgid "Authentication is required to reload '$(unit)'."
+msgstr "Cal autenticació per tornar a carregar «$(unit)»."
+
+#: ../src/core/dbus-unit.c:431 ../src/core/dbus-unit.c:432
+msgid "Authentication is required to restart '$(unit)'."
+msgstr "Cal autenticació per tornar a reiniciar «$(unit)»."
+
+#: ../src/core/dbus-unit.c:535
+msgid "Authentication is required to kill '$(unit)'."
+msgstr "Cal autenticació per matar a «$(unit)»."
+
+#: ../src/core/dbus-unit.c:565
+msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
+msgstr "Cal autenticació per reiniciar l'estat «fallat» de «$(unit)»."
+
+#: ../src/core/dbus-unit.c:597
+msgid "Authentication is required to set properties on '$(unit)'."
+msgstr "Cal autenticació per establir propietats a «$(unit)»."
+
+#~ msgid "Press Ctrl+C to cancel all filesystem checks in progress"
+#~ msgstr ""
+#~ "Presione Ctrl+C para cancelar todas las comprobaciones del sistema de "
+#~ "archivos en curso"
+
+#~ 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)"
diff --git a/po/cs.po b/po/cs.po
new file mode 100644 (file)
index 0000000..9622c71
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,546 @@
+# Czech translation for systemd.
+# Copyright (C) 2016-2017 systemd's author and translators.
+# This file is distributed under the same license as the systemd package.
+# Daniel Maixner <xskipy@gmail.com>, 2016.
+# Daniel Rusek <mail@asciiwolf.com>, 2016, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: systemd master\n"
+"Report-Msgid-Bugs-To: https://github.com/systemd/systemd/issues\n"
+"POT-Creation-Date: 2016-04-23 14:24+0200\n"
+"PO-Revision-Date: 2017-04-20 23:00+0200\n"
+"Last-Translator: Daniel Rusek <mail@asciiwolf.com>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n"
+"%100>=20) ? 1 : 2);\n"
+"Language-Team: \n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:1
+msgid "Send passphrase back to system"
+msgstr "Odeslat heslo zpět do systému"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:2
+msgid "Authentication is required to send the entered passphrase back to the system."
+msgstr "Pro odeslání zadaného hesla do systému je vyžadováno ověření."
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:3
+msgid "Manage system services or other units"
+msgstr "Spravovat systémové služby nebo další jednotky"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:4
+msgid "Authentication is required to manage system services or other units."
+msgstr "Pro správu systémových služeb nebo dalších jednotek je vyžadováno ověření."
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:5
+msgid "Manage system service or unit files"
+msgstr "Spravovat systémové služby nebo soubory jednotek"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:6
+msgid "Authentication is required to manage system service or unit files."
+msgstr "Pro správu systémových služeb nebo souborů jednotek je vyžadováno ověření."
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:7
+msgid "Set or unset system and service manager environment variables"
+msgstr "Nastavit nebo rušit proměnné správce systému a služeb"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:8
+msgid ""
+"Authentication is required to set or unset system and service manager environment "
+"variables."
+msgstr ""
+"Pro nastavení nebo rušení proměnných správce systému a služeb je vyžadováno "
+"ověření."
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:9
+msgid "Reload the systemd state"
+msgstr "Znovu načíst stav systemd"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:10
+msgid "Authentication is required to reload the systemd state."
+msgstr "Pro znovu načtení stavu systemd je vyžadováno ověření."
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:1
+msgid "Set host name"
+msgstr "Nastavit název stroje"
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:2
+msgid "Authentication is required to set the local host name."
+msgstr "Pro nastavení lokálního názvu stroje je vyžadováno ověření."
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:3
+msgid "Set static host name"
+msgstr "Nastavit statický název stoje"
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:4
+msgid ""
+"Authentication is required to set the statically configured local host name, as "
+"well as the pretty host name."
+msgstr ""
+"Pro nastavení staticky konfigurovaného názvu lokálního stroje, stejně tak pro "
+"změnu uživatelsky přívětivého jména je vyžadováno ověření."
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:5
+msgid "Set machine information"
+msgstr "Nastavit informace o stroji"
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:6
+msgid "Authentication is required to set local machine information."
+msgstr "Pro nastavení informací o stroji je vyžadováno ověření."
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:1
+msgid "Import a VM or container image"
+msgstr "Importovat obraz virtuální stroje nebo kontejneru"
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:2
+msgid "Authentication is required to import a VM or container image"
+msgstr "Pro import obrazu virtuálního stroje nebo kontejneru je vyžadováno ověření"
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:3
+msgid "Export a VM or container image"
+msgstr "Exportovat obraz virtuálního stroje nebo kontejneru"
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:4
+msgid "Authentication is required to export a VM or container image"
+msgstr "Pro export obrazu virtuálního stroje nebo kontejneru je vyžadováno ověření"
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:5
+msgid "Download a VM or container image"
+msgstr "Stáhnout obraz virtuálního stroje nebo kontejneru"
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:6
+msgid "Authentication is required to download a VM or container image"
+msgstr "Pro stažení obrazu virtuálního stroje nebo kontejneru je vyžadováno ověření"
+
+#: ../src/locale/org.freedesktop.locale1.policy.in.h:1
+msgid "Set system locale"
+msgstr "Nastavit lokalizaci systému"
+
+#: ../src/locale/org.freedesktop.locale1.policy.in.h:2
+msgid "Authentication is required to set the system locale."
+msgstr "Pro nastavení lokalizace systému je vyžadováno ověření."
+
+#: ../src/locale/org.freedesktop.locale1.policy.in.h:3
+msgid "Set system keyboard settings"
+msgstr "Nastavit systémovou konfiguraci klávesnice"
+
+#: ../src/locale/org.freedesktop.locale1.policy.in.h:4
+msgid "Authentication is required to set the system keyboard settings."
+msgstr "Pro nastavení systémové konfigurace klávesnice je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:1
+msgid "Allow applications to inhibit system shutdown"
+msgstr "Povolit aplikacím zakázat vypnutí systému"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:2
+msgid "Authentication is required for an application to inhibit system shutdown."
+msgstr "Pro povolení aplikacím zakázat vypnutí systému je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:3
+msgid "Allow applications to delay system shutdown"
+msgstr "Povolit aplikacím odložit vypnutí systému"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:4
+msgid "Authentication is required for an application to delay system shutdown."
+msgstr "Pro povolení aplikacím odložit vypnutí systému je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:5
+msgid "Allow applications to inhibit system sleep"
+msgstr "Povolit aplikacím zakázat uspání systému"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:6
+msgid "Authentication is required for an application to inhibit system sleep."
+msgstr "Pro povolení aplikacím zakázat uspání systému je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:7
+msgid "Allow applications to delay system sleep"
+msgstr "Povolit aplikacím odložit uspání systému"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:8
+msgid "Authentication is required for an application to delay system sleep."
+msgstr "Pro povolení aplikacím odložit uspání systému je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:9
+msgid "Allow applications to inhibit automatic system suspend"
+msgstr "Povolit aplikacím zakázat automatické vypnutí systému"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:10
+msgid ""
+"Authentication is required for an application to inhibit automatic system suspend."
+msgstr ""
+"Pro povolení aplikacím zakázat automatické vypnutí systému je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:11
+msgid "Allow applications to inhibit system handling of the power key"
+msgstr "Povolit aplikacím zakázat chovaní systému na stisknutí vypínacího tlačítka"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:12
+msgid ""
+"Authentication is required for an application to inhibit system handling of the "
+"power key."
+msgstr ""
+"Pro povolení aplikacím zakázat chovaní systému na stisknutí vypínacího tlačítka je "
+"vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:13
+msgid "Allow applications to inhibit system handling of the suspend key"
+msgstr "Povolit aplikacím zakázat chovaní systému na stisknutí uspávacího tlačítka"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:14
+msgid ""
+"Authentication is required for an application to inhibit system handling of the "
+"suspend key."
+msgstr ""
+"Pro povolení aplikacím zakázat chovaní systému na stisknutí uspávacího tlačítka je "
+"vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:15
+msgid "Allow applications to inhibit system handling of the hibernate key"
+msgstr "Povolit aplikacím zakázat chovaní systému na stisknutí tlačítka hibernace"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:16
+msgid ""
+"Authentication is required for an application to inhibit system handling of the "
+"hibernate key."
+msgstr ""
+"Pro povolení aplikacím zakázat chovaní systému na stisknutí tlačítka hibernace je "
+"vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:17
+msgid "Allow applications to inhibit system handling of the lid switch"
+msgstr "Povolit aplikacím zakázat chovaní systému na zavření víka"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:18
+msgid ""
+"Authentication is required for an application to inhibit system handling of the "
+"lid switch."
+msgstr ""
+"Pro povolení aplikacím zakázat chovaní systému na zavření víka je vyžadováno "
+"ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:19
+msgid "Allow non-logged-in user to run programs"
+msgstr "Povolit nepřihlášenému uživateli spouštět programy"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:20
+msgid "Explicit request is required to run programs as a non-logged-in user."
+msgstr ""
+"Ke spuštění programů jako nepřihlášený uživatel je třeba speciální požadavek."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:21
+msgid "Allow non-logged-in users to run programs"
+msgstr "Povolit nepřihlášeným uživatelům spouštět programy"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:22
+msgid "Authentication is required to run programs as a non-logged-in user."
+msgstr "Ke spuštění programů jako nepřihlášený uživatel je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:23
+msgid "Allow attaching devices to seats"
+msgstr "Povolit připojování zařízení ke stanovištím"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:24
+msgid "Authentication is required for attaching a device to a seat."
+msgstr "Pro připojování zařízení ke stanovišti je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:25
+msgid "Flush device to seat attachments"
+msgstr "Odstranit přiřazení zařízení ke stanovištím"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:26
+msgid "Authentication is required for resetting how devices are attached to seats."
+msgstr ""
+"Pro reset způsobu jak jsou zařízení přiřazována ke stanovištím je vyžadováno "
+"ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:27
+msgid "Power off the system"
+msgstr "Vypnout systém"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:28
+msgid "Authentication is required for powering off the system."
+msgstr "Pro vypnutí systému je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:29
+msgid "Power off the system while other users are logged in"
+msgstr "Vypnout systém, i když jsou přihlášeni další uživatelé"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:30
+msgid ""
+"Authentication is required for powering off the system while other users are "
+"logged in."
+msgstr ""
+"Pro vypnutí systému, když jsou přihlášeni další uživatelé je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:31
+msgid "Power off the system while an application asked to inhibit it"
+msgstr "Vypnout systém, i když aplikace požádala o zákaz vypnutí"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:32
+msgid ""
+"Authentication is required for powering off the system while an application asked "
+"to inhibit it."
+msgstr ""
+"Pro vypnutí systému, když aplikace požádala o zákaz vypnutí je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:33
+msgid "Reboot the system"
+msgstr "Restartovat systém"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:34
+msgid "Authentication is required for rebooting the system."
+msgstr "Pro restartování systému je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:35
+msgid "Reboot the system while other users are logged in"
+msgstr "Restartovat systém, i když jsou přihlášeni další uživatelé"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:36
+msgid ""
+"Authentication is required for rebooting the system while other users are logged "
+"in."
+msgstr ""
+"Pro restartování systému, když jsou přihlášeni další uživatelé je vyžadováno "
+"ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:37
+msgid "Reboot the system while an application asked to inhibit it"
+msgstr "Restartovat systém, i když aplikace požádala o zákaz restartu"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:38
+msgid ""
+"Authentication is required for rebooting the system while an application asked to "
+"inhibit it."
+msgstr ""
+"Pro restartování systému, když aplikace požádala o zákaz restartu je vyžadováno "
+"ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:39
+msgid "Suspend the system"
+msgstr "Uspat systém"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:40
+msgid "Authentication is required for suspending the system."
+msgstr "Pro uspání systému je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:41
+msgid "Suspend the system while other users are logged in"
+msgstr "Uspat systém, i když jsou přihlášeni další uživatelé"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:42
+msgid ""
+"Authentication is required for suspending the system while other users are logged "
+"in."
+msgstr ""
+"Pro uspání systému, když jsou přihlášeni další uživatelé je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:43
+msgid "Suspend the system while an application asked to inhibit it"
+msgstr "Uspat systém, i když aplikace požádala o zákaz uspání"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:44
+msgid ""
+"Authentication is required for suspending the system while an application asked to "
+"inhibit it."
+msgstr ""
+"Pro uspání systému, když aplikace požádala o zákaz uspání je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:45
+msgid "Hibernate the system"
+msgstr "Hibernovat systém"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:46
+msgid "Authentication is required for hibernating the system."
+msgstr "Pro hibernaci systému je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:47
+msgid "Hibernate the system while other users are logged in"
+msgstr "Hibernovat systém, i když jsou přihlášeni další uživatelé"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:48
+msgid ""
+"Authentication is required for hibernating the system while other users are logged "
+"in."
+msgstr ""
+"Pro hibernaci systému, když jsou přihlášeni další uživatelé je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:49
+msgid "Hibernate the system while an application asked to inhibit it"
+msgstr "Hibernovat systém, i když aplikace požádala o zákaz hibernace"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:50
+msgid ""
+"Authentication is required for hibernating the system while an application asked "
+"to inhibit it."
+msgstr ""
+"Pro hibernaci systému, když aplikace požádala o zákaz hibernace je vyžadováno "
+"ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:51
+msgid "Manage active sessions, users and seats"
+msgstr "Spravovat aktivní sezení, uživatele a stanoviště"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:52
+msgid "Authentication is required for managing active sessions, users and seats."
+msgstr "Pro správu aktivních sezení, uživatelů a stanovišť je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:53
+msgid "Lock or unlock active sessions"
+msgstr "Zamknout nebo odemknout aktivní sezení"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:54
+msgid "Authentication is required to lock or unlock active sessions."
+msgstr "Pro zamčení nebo odemčení aktivních sezení je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:55
+msgid "Allow indication to the firmware to boot to setup interface"
+msgstr "Povolit indikaci firmwaru bootovat instalační prostředí"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:56
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup interface."
+msgstr ""
+"K povolení indikace firmwaru bootovat instalační prostředí je vyžadováno ověření."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:57
+msgid "Set a wall message"
+msgstr "Nastavit zprávu všem uživatelům"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:58
+msgid "Authentication is required to set a wall message"
+msgstr "K nastavení zprávy všem uživatelům je vyžadováno ověření"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:1
+msgid "Log into a local container"
+msgstr "Přihlásit se do lokálního kontejneru"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:2
+msgid "Authentication is required to log into a local container."
+msgstr "Pro přihlášení do lokálního kontejneru je vyžadováno ověření."
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:3
+msgid "Log into the local host"
+msgstr "Přihlásit se na lokální stroj"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:4
+msgid "Authentication is required to log into the local host."
+msgstr "Pro přihlášení k lokálnímu stroji je vyžadováno ověření."
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:5
+msgid "Acquire a shell in a local container"
+msgstr "Získat shell v lokálním kontejneru"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:6
+msgid "Authentication is required to acquire a shell in a local container."
+msgstr "Pro získání shellu v lokálním kontejneru je vyžadováno ověření."
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:7
+msgid "Acquire a shell on the local host"
+msgstr "Získat shell na lokálním stroji"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:8
+msgid "Authentication is required to acquire a shell on the local host."
+msgstr "Pro získání shellu na lokálním stroji je vyžadováno ověření."
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:9
+msgid "Acquire a pseudo TTY in a local container"
+msgstr "Získat pseudo TTY v lokálním kontejneru"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:10
+msgid "Authentication is required to acquire a pseudo TTY in a local container."
+msgstr "Pro získání pseudo TTY v lokálním kontejneru je vyžadováno ověření."
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:11
+msgid "Acquire a pseudo TTY on the local host"
+msgstr "Získat pseudo TTY na lokálním stroji"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:12
+msgid "Authentication is required to acquire a pseudo TTY on the local host."
+msgstr "Pro získání pseudo TTY na lokálním stroji je vyžadováno ověření."
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:13
+msgid "Manage local virtual machines and containers"
+msgstr "Spravovat lokální virtuální stroje a kontejnery"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:14
+msgid "Authentication is required to manage local virtual machines and containers."
+msgstr "Pro správu lokálních virtuálních strojů a kontejnerů je vyžadováno ověření."
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:15
+msgid "Manage local virtual machine and container images"
+msgstr "Spravovat lokální obrazy virtuálních strojů a kontejnerů"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:16
+msgid ""
+"Authentication is required to manage local virtual machine and container images."
+msgstr ""
+"Pro správu obrazů lokálních virtuálních strojů a kontejnerů je vyžadováno ověření."
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:1
+msgid "Set system time"
+msgstr "Nastavit systémový čas"
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:2
+msgid "Authentication is required to set the system time."
+msgstr "Pro nastavení systémového času je vyžadováno ověření."
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:3
+msgid "Set system timezone"
+msgstr "Nastavit systémovou časovou zónu"
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:4
+msgid "Authentication is required to set the system timezone."
+msgstr "Pro nastavení systémové časové zóny je vyžadováno ověření."
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:5
+msgid "Set RTC to local timezone or UTC"
+msgstr "Nastavit RTC na lokální časovou zónu nebo UTC"
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:6
+msgid ""
+"Authentication is required to control whether the RTC stores the local or UTC time."
+msgstr ""
+"Pro kontrolu jestli RTC ukládá lokální časovou zónu nebo UTC čas je vyžadováno "
+"ověření."
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:7
+msgid "Turn network time synchronization on or off"
+msgstr "Zapnout nebo vypnout synchronizaci s časem ze sítě"
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:8
+msgid ""
+"Authentication is required to control whether network time synchronization shall "
+"be enabled."
+msgstr "Pro kontrolu synchronizace času ze sítě je vyžadováno ověření."
+
+#: ../src/core/dbus-unit.c:459
+msgid "Authentication is required to start '$(unit)'."
+msgstr "Pro spuštění „$(unit)” je vyžadováno ověření."
+
+#: ../src/core/dbus-unit.c:460
+msgid "Authentication is required to stop '$(unit)'."
+msgstr "Pro vypnutí „$(unit)” je vyžadováno ověření."
+
+#: ../src/core/dbus-unit.c:461
+msgid "Authentication is required to reload '$(unit)'."
+msgstr "Pro znovu načtení „$(unit)” je vyžadováno ověření."
+
+#: ../src/core/dbus-unit.c:462 ../src/core/dbus-unit.c:463
+msgid "Authentication is required to restart '$(unit)'."
+msgstr "Pro restart „$(unit)” je vyžadováno ověření."
+
+#: ../src/core/dbus-unit.c:570
+msgid "Authentication is required to kill '$(unit)'."
+msgstr "Pro ukončení „$(unit)” je vyžadováno ověření."
+
+#: ../src/core/dbus-unit.c:601
+msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
+msgstr "Pro resetování chybného stavu „$(unit)” je vyžadováno ověření."
+
+#: ../src/core/dbus-unit.c:634
+msgid "Authentication is required to set properties on '$(unit)'."
+msgstr "Pro nastavení vlastností na „$(unit)” je vyžadováno ověření."
index a0aff43..e98e88a 100644 (file)
--- a/po/hr.po
+++ b/po/hr.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: systemd master\n"
 "Report-Msgid-Bugs-To: https://github.com/systemd/systemd/issues\n"
-"POT-Creation-Date: 2016-27-04 11:57+0100\n"
+"POT-Creation-Date: 2016-04-27 11:57+0100\n"
 "PO-Revision-Date: 2016-04-27 12:11+0200\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
index 88fecbc..b929217 100644 (file)
--- a/po/hu.po
+++ b/po/hu.po
@@ -3,20 +3,21 @@
 # This file is distributed under the same license as the systemd package.
 #
 # Gabor Kelemen <kelemeng at gnome dot hu>, 2015, 2016.
+# Balázs Úr <urbalazs at gmail dot com>, 2016.
 msgid ""
 msgstr ""
 "Project-Id-Version: systemd master\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-02 13:41+0100\n"
-"PO-Revision-Date: 2016-01-02 13:45+0100\n"
-"Last-Translator: Gabor Kelemen <kelemeng at ubuntu dot com>\n"
+"Report-Msgid-Bugs-To: https://github.com/systemd/systemd/issues\n"
+"POT-Creation-Date: 2016-04-24 12:53+0000\n"
+"PO-Revision-Date: 2016-08-23 18:03+0100\n"
+"Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
 "Language-Team: Hungarian <openscope at googlegroups dot com>\n"
 "Language: hu\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 1.5\n"
+"X-Generator: Lokalize 2.0\n"
 
 #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:1
 msgid "Send passphrase back to system"
@@ -241,50 +242,60 @@ msgstr ""
 "kezelésének meggátlásához."
 
 #: ../src/login/org.freedesktop.login1.policy.in.h:19
+msgid "Allow non-logged-in user to run programs"
+msgstr "Programfuttatás engedélyezése be nem jelentkezett felhasználó számára"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:20
+msgid "Explicit request is required to run programs as a non-logged-in user."
+msgstr ""
+"Határozott kérés szükséges a programfuttatáshoz be nem jelentkezett "
+"felhasználóként."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:21
 msgid "Allow non-logged-in users to run programs"
 msgstr "Programfuttatás engedélyezése be nem jelentkezett felhasználók számára"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:20
+#: ../src/login/org.freedesktop.login1.policy.in.h:22
 msgid "Authentication is required to run programs as a non-logged-in user."
 msgstr ""
 "Hitelesítés szükséges a programfuttatáshoz be nem jelentkezett "
 "felhasználóként."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:21
+#: ../src/login/org.freedesktop.login1.policy.in.h:23
 msgid "Allow attaching devices to seats"
 msgstr "Eszközök csatolásának engedélyezése munkaállomásokhoz"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:22
+#: ../src/login/org.freedesktop.login1.policy.in.h:24
 msgid "Authentication is required for attaching a device to a seat."
 msgstr ""
 "Hitelesítés szükséges eszköz csatolásának engedélyezéséhez egy "
 "munkaállomáshoz"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:23
+#: ../src/login/org.freedesktop.login1.policy.in.h:25
 msgid "Flush device to seat attachments"
 msgstr "Eszközök és munkaállomások csatolásainak törlése"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:24
+#: ../src/login/org.freedesktop.login1.policy.in.h:26
 msgid ""
 "Authentication is required for resetting how devices are attached to seats."
 msgstr ""
 "Hitelesítés szükséges az eszközök munkaállomásokhoz csatolásainak "
 "alaphelyzetbe állításához."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:25
+#: ../src/login/org.freedesktop.login1.policy.in.h:27
 msgid "Power off the system"
 msgstr "A rendszer kikapcsolása"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:26
+#: ../src/login/org.freedesktop.login1.policy.in.h:28
 msgid "Authentication is required for powering off the system."
 msgstr "Hitelesítés szükséges a rendszer kikapcsolásához."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:27
+#: ../src/login/org.freedesktop.login1.policy.in.h:29
 msgid "Power off the system while other users are logged in"
 msgstr ""
 "A rendszer kikapcsolása miközben be vannak jelentkezve más felhasználók"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:28
+#: ../src/login/org.freedesktop.login1.policy.in.h:30
 msgid ""
 "Authentication is required for powering off the system while other users are "
 "logged in."
@@ -292,12 +303,12 @@ msgstr ""
 "Hitelesítés szükséges a rendszer kikapcsolásához miközben be vannak "
 "jelentkezve más felhasználók."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:29
+#: ../src/login/org.freedesktop.login1.policy.in.h:31
 msgid "Power off the system while an application asked to inhibit it"
 msgstr ""
 "A rendszer kikapcsolása miközben egy alkalmazás ennek meggátlását kérte"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:30
+#: ../src/login/org.freedesktop.login1.policy.in.h:32
 msgid ""
 "Authentication is required for powering off the system while an application "
 "asked to inhibit it."
@@ -305,19 +316,19 @@ msgstr ""
 "Hitelesítés szükséges a rendszer kikapcsolásához miközben egy alkalmazás "
 "ennek meggátlását kérte."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:31
+#: ../src/login/org.freedesktop.login1.policy.in.h:33
 msgid "Reboot the system"
 msgstr "A rendszer újraindítása"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:32
+#: ../src/login/org.freedesktop.login1.policy.in.h:34
 msgid "Authentication is required for rebooting the system."
 msgstr "Hitelesítés szükséges a rendszer újraindításához."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:33
+#: ../src/login/org.freedesktop.login1.policy.in.h:35
 msgid "Reboot the system while other users are logged in"
 msgstr "A rendszer újraindítása mialatt be vannak jelentkezve más felhasználók"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:34
+#: ../src/login/org.freedesktop.login1.policy.in.h:36
 msgid ""
 "Authentication is required for rebooting the system while other users are "
 "logged in."
@@ -325,12 +336,12 @@ msgstr ""
 "Hitelesítés szükséges a rendszer újraindításához miközben be vannak "
 "jelentkezve más felhasználók."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:35
+#: ../src/login/org.freedesktop.login1.policy.in.h:37
 msgid "Reboot the system while an application asked to inhibit it"
 msgstr ""
 "A rendszer újraindítása miközben egy alkalmazás ennek meggátlását kérte"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:36
+#: ../src/login/org.freedesktop.login1.policy.in.h:38
 msgid ""
 "Authentication is required for rebooting the system while an application "
 "asked to inhibit it."
@@ -338,20 +349,20 @@ msgstr ""
 "Hitelesítés szükséges a rendszer újraindításához miközben egy alkalmazás "
 "ennek meggátlását kérte."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:37
+#: ../src/login/org.freedesktop.login1.policy.in.h:39
 msgid "Suspend the system"
 msgstr "A rendszer felfüggesztése"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:38
+#: ../src/login/org.freedesktop.login1.policy.in.h:40
 msgid "Authentication is required for suspending the system."
 msgstr "Hitelesítés szükséges a rendszer felfüggesztéséhez."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:39
+#: ../src/login/org.freedesktop.login1.policy.in.h:41
 msgid "Suspend the system while other users are logged in"
 msgstr ""
 "A rendszer felfüggesztése mialatt be vannak jelentkezve más felhasználók"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:40
+#: ../src/login/org.freedesktop.login1.policy.in.h:42
 msgid ""
 "Authentication is required for suspending the system while other users are "
 "logged in."
@@ -359,12 +370,12 @@ msgstr ""
 "Hitelesítés szükséges a rendszer felfüggesztéséhez miközben be vannak "
 "jelentkezve más felhasználók."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:41
+#: ../src/login/org.freedesktop.login1.policy.in.h:43
 msgid "Suspend the system while an application asked to inhibit it"
 msgstr ""
 "A rendszer felfüggesztése miközben egy alkalmazás ennek meggátlását kérte"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:42
+#: ../src/login/org.freedesktop.login1.policy.in.h:44
 msgid ""
 "Authentication is required for suspending the system while an application "
 "asked to inhibit it."
@@ -372,19 +383,19 @@ msgstr ""
 "Hitelesítés szükséges a rendszer felfüggesztéséhez miközben egy alkalmazás "
 "ennek meggátlását kérte."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:43
+#: ../src/login/org.freedesktop.login1.policy.in.h:45
 msgid "Hibernate the system"
 msgstr "A rendszer hibernálása"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:44
+#: ../src/login/org.freedesktop.login1.policy.in.h:46
 msgid "Authentication is required for hibernating the system."
 msgstr "Hitelesítés szükséges a rendszer hibernálásához."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:45
+#: ../src/login/org.freedesktop.login1.policy.in.h:47
 msgid "Hibernate the system while other users are logged in"
 msgstr "A rendszer hibernálása mialatt be vannak jelentkezve más felhasználók"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:46
+#: ../src/login/org.freedesktop.login1.policy.in.h:48
 msgid ""
 "Authentication is required for hibernating the system while other users are "
 "logged in."
@@ -392,11 +403,11 @@ msgstr ""
 "Hitelesítés szükséges a rendszer hibernálásához miközben be vannak "
 "jelentkezve más felhasználók."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:47
+#: ../src/login/org.freedesktop.login1.policy.in.h:49
 msgid "Hibernate the system while an application asked to inhibit it"
 msgstr "A rendszer hibernálása miközben egy alkalmazás ennek meggátlását kérte"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:48
+#: ../src/login/org.freedesktop.login1.policy.in.h:50
 msgid ""
 "Authentication is required for hibernating the system while an application "
 "asked to inhibit it."
@@ -404,31 +415,31 @@ msgstr ""
 "Hitelesítés szükséges a rendszer hibernálásához miközben egy alkalmazás "
 "ennek meggátlását kérte."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:49
+#: ../src/login/org.freedesktop.login1.policy.in.h:51
 msgid "Manage active sessions, users and seats"
 msgstr "Aktív munkamenetek, felhasználók és munkaállomások kezelése"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:50
+#: ../src/login/org.freedesktop.login1.policy.in.h:52
 msgid ""
 "Authentication is required for managing active sessions, users and seats."
 msgstr ""
 "Hitelesítés szükséges az aktív munkamenetek, felhasználók és munkaállomások "
 "kezeléséhez."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:51
+#: ../src/login/org.freedesktop.login1.policy.in.h:53
 msgid "Lock or unlock active sessions"
 msgstr "Aktív munkamenetek zárolása vagy feloldása"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:52
+#: ../src/login/org.freedesktop.login1.policy.in.h:54
 msgid "Authentication is required to lock or unlock active sessions."
 msgstr ""
 "Hitelesítés szükséges az aktív munkamenetek zárolásához vagy feloldásához."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:53
+#: ../src/login/org.freedesktop.login1.policy.in.h:55
 msgid "Allow indication to the firmware to boot to setup interface"
 msgstr "A firmware-nek jelezhető, hogy a beállítófelületet bootolja"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:54
+#: ../src/login/org.freedesktop.login1.policy.in.h:56
 msgid ""
 "Authentication is required to indicate to the firmware to boot to setup "
 "interface."
@@ -436,11 +447,11 @@ msgstr ""
 "Hitelesítés szükséges a firmware-nek jelzéshez, hogy a beállítófelületet "
 "bootolja"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:55
+#: ../src/login/org.freedesktop.login1.policy.in.h:57
 msgid "Set a wall message"
 msgstr "Falüzenet beállítása"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:56
+#: ../src/login/org.freedesktop.login1.policy.in.h:58
 msgid "Authentication is required to set a wall message"
 msgstr "Hitelesítés szükséges a falüzenet beállításához"
 
@@ -552,33 +563,34 @@ msgid ""
 "shall be enabled."
 msgstr "Hitelesítés szükséges a hálózati időszinkronizáció engedélyezéséhez."
 
-#: ../src/core/dbus-unit.c:449
+#: ../src/core/dbus-unit.c:450
 msgid "Authentication is required to start '$(unit)'."
 msgstr "Hitelesítés szükséges a következő elindításához: „$(unit)”."
 
-#: ../src/core/dbus-unit.c:450
+#: ../src/core/dbus-unit.c:451
 msgid "Authentication is required to stop '$(unit)'."
 msgstr "Hitelesítés szükséges a következő leállításához: „$(unit)”."
 
-#: ../src/core/dbus-unit.c:451
+#: ../src/core/dbus-unit.c:452
 msgid "Authentication is required to reload '$(unit)'."
 msgstr "Hitelesítés szükséges a következő újratöltéséhez: „$(unit)”."
 
-#: ../src/core/dbus-unit.c:452 ../src/core/dbus-unit.c:453
+#: ../src/core/dbus-unit.c:453 ../src/core/dbus-unit.c:454
 msgid "Authentication is required to restart '$(unit)'."
 msgstr "Hitelesítés szükséges a következő újraindításához: „$(unit)”."
 
-#: ../src/core/dbus-unit.c:556
+#: ../src/core/dbus-unit.c:560
 msgid "Authentication is required to kill '$(unit)'."
 msgstr "Hitelesítés szükséges a következő kilövéséhez: „$(unit)”."
 
-#: ../src/core/dbus-unit.c:586
+#: ../src/core/dbus-unit.c:590
 msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
 msgstr ""
 "Hitelesítés szükséges a következő „sikertelen” állapotának törléséhez: "
 "„$(unit)”."
 
-#: ../src/core/dbus-unit.c:618
+#: ../src/core/dbus-unit.c:622
 msgid "Authentication is required to set properties on '$(unit)'."
 msgstr ""
 "Hitelesítés szükséges a következő tulajdonságainak beállításához: „$(unit)”."
+
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/po/meson.build b/po/meson.build
new file mode 100644 (file)
index 0000000..f89291b
--- /dev/null
@@ -0,0 +1,12 @@
+i18n = import('i18n')
+i18n.gettext(meson.project_name())
+
+#####################################################################
+
+intltool_merge = find_program('intltool-merge')
+po_dir = meson.current_source_dir()
+
+intltool_cache = join_paths(meson.current_build_dir(), 'intltool-merge-cache')
+intltool_command = [intltool_merge, '-x', '-u',
+                    '-c', intltool_cache,
+                    po_dir, '@INPUT@', '@OUTPUT@']
index 92e9a20..c289a2c 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -1,13 +1,15 @@
-# translation of pl.po to Polish
-# Piotr Drąg <piotrdrag@gmail.com>, 2011, 2013, 2014, 2015, 2016.
+# Polish translation for systemd.
+# Copyright © 2011-2016 the systemd authors.
+# This file is distributed under the same license as the systemd package.
+# Piotr Drąg <piotrdrag@gmail.com>, 2011, 2013-2016.
 # Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>, 2011.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: systemd\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-04-23 14:24+0200\n"
-"PO-Revision-Date: 2016-04-23 14:25+0200\n"
+"POT-Creation-Date: 2016-10-05 19:01+0200\n"
+"PO-Revision-Date: 2016-10-05 19:02+0200\n"
 "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
 "Language-Team: Polish <trans-pl@lists.fedoraproject.org>\n"
 "Language: pl\n"
@@ -19,13 +21,13 @@ msgstr ""
 
 #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:1
 msgid "Send passphrase back to system"
-msgstr "Wysłanie hasła z powrotem do systemu"
+msgstr "Wysłanie hasła z powrotem do systemu"
 
 #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:2
 msgid ""
 "Authentication is required to send the entered passphrase back to the system."
 msgstr ""
-"Wymagane jest uwierzytelnienie, aby wysłać podane hasło z powrotem do "
+"Wymagane jest uwierzytelnienie, aby wysłać podane hasło z powrotem do "
 "systemu."
 
 #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:3
@@ -51,7 +53,7 @@ msgstr ""
 #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:7
 msgid "Set or unset system and service manager environment variables"
 msgstr ""
-"Ustawienie lub usunięcie zmiennych środowiskowych menedżera systemu i usług"
+"Ustawienie lub usunięcie zmiennych środowiskowych menedżera systemu i usług"
 
 #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:8
 msgid ""
@@ -59,7 +61,7 @@ msgid ""
 "environment variables."
 msgstr ""
 "Wymagane jest uwierzytelnienie, aby ustawić lub usunąć zmienne środowiskowe "
-"menedżera systemu i usług."
+"menedżera systemu i usług."
 
 #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:9
 msgid "Reload the systemd state"
@@ -87,16 +89,16 @@ msgid ""
 "as well as the pretty host name."
 msgstr ""
 "Wymagane jest uwierzytelnienie, aby ustawić statycznie skonfigurowaną nazwę "
-"lokalnego komputera, a także jego ładną nazwę."
+"lokalnego komputera, a także jego ładną nazwę."
 
 #: ../src/hostname/org.freedesktop.hostname1.policy.in.h:5
 msgid "Set machine information"
-msgstr "Ustawienie informacji o komputerze"
+msgstr "Ustawienie informacji o komputerze"
 
 #: ../src/hostname/org.freedesktop.hostname1.policy.in.h:6
 msgid "Authentication is required to set local machine information."
 msgstr ""
-"Wymagane jest uwierzytelnienie, aby ustawić informacje o lokalnym komputerze."
+"Wymagane jest uwierzytelnienie, aby ustawić informacje o lokalnym komputerze."
 
 #: ../src/import/org.freedesktop.import1.policy.in.h:1
 msgid "Import a VM or container image"
@@ -410,14 +412,14 @@ msgstr ""
 
 #: ../src/login/org.freedesktop.login1.policy.in.h:51
 msgid "Manage active sessions, users and seats"
-msgstr "Zarządzanie aktywnymi sesjami, użytkownikami i stanowiskami"
+msgstr "Zarządzanie aktywnymi sesjami, użytkownikami i stanowiskami"
 
 #: ../src/login/org.freedesktop.login1.policy.in.h:52
 msgid ""
 "Authentication is required for managing active sessions, users and seats."
 msgstr ""
 "Wymagane jest uwierzytelnienie, aby zarządzać aktywnymi sesjami, "
-"użytkownikami i stanowiskami."
+"użytkownikami i stanowiskami."
 
 #: ../src/login/org.freedesktop.login1.policy.in.h:53
 msgid "Lock or unlock active sessions"
@@ -468,12 +470,12 @@ msgstr ""
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:5
 msgid "Acquire a shell in a local container"
-msgstr "Uzyskanie powłoki w lokalnym kontenerze"
+msgstr "Uzyskanie powłoki w lokalnym kontenerze"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:6
 msgid "Authentication is required to acquire a shell in a local container."
 msgstr ""
-"Wymagane jest uwierzytelnienie, aby uzyskać powłokę w lokalnym kontenerze."
+"Wymagane jest uwierzytelnienie, aby uzyskać powłokę w lokalnym kontenerze."
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:7
 msgid "Acquire a shell on the local host"
@@ -486,13 +488,13 @@ msgstr ""
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:9
 msgid "Acquire a pseudo TTY in a local container"
-msgstr "Uzyskanie pseudo-TTY w lokalnym kontenerze"
+msgstr "Uzyskanie pseudo-TTY w lokalnym kontenerze"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:10
 msgid ""
 "Authentication is required to acquire a pseudo TTY in a local container."
 msgstr ""
-"Wymagane jest uwierzytelnienie, aby uzyskać pseudo-TTY w lokalnym kontenerze."
+"Wymagane jest uwierzytelnienie, aby uzyskać pseudo-TTY w lokalnym kontenerze."
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:11
 msgid "Acquire a pseudo TTY on the local host"
@@ -506,18 +508,18 @@ msgstr ""
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:13
 msgid "Manage local virtual machines and containers"
-msgstr "Zarządzanie lokalnymi maszynami wirtualnymi i kontenerami"
+msgstr "Zarządzanie lokalnymi maszynami wirtualnymi i kontenerami"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:14
 msgid ""
 "Authentication is required to manage local virtual machines and containers."
 msgstr ""
 "Wymagane jest uwierzytelnienie, aby zarządzać lokalnymi maszynami "
-"wirtualnymi i kontenerami."
+"wirtualnymi i kontenerami."
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:15
 msgid "Manage local virtual machine and container images"
-msgstr "Zarządzanie lokalnymi obrazami maszyn wirtualnych i kontenerów"
+msgstr "Zarządzanie lokalnymi obrazami maszyn wirtualnych i kontenerów"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:16
 msgid ""
@@ -525,7 +527,7 @@ msgid ""
 "images."
 msgstr ""
 "Wymagane jest uwierzytelnienie, aby zarządzać lokalnymi obrazami maszyn "
-"wirtualnych i kontenerów."
+"wirtualnych i kontenerów."
 
 #: ../src/timedate/org.freedesktop.timedate1.policy.in.h:1
 msgid "Set system time"
@@ -567,36 +569,36 @@ msgstr ""
 "Wymagane jest uwierzytelnienie, aby kontrolować, czy włączyć synchronizację "
 "czasu przez sieć."
 
-#: ../src/core/dbus-unit.c:450
+#: ../src/core/dbus-unit.c:459
 msgid "Authentication is required to start '$(unit)'."
 msgstr "Wymagane jest uwierzytelnienie, aby uruchomić jednostkę „$(unit)”."
 
-#: ../src/core/dbus-unit.c:451
+#: ../src/core/dbus-unit.c:460
 msgid "Authentication is required to stop '$(unit)'."
 msgstr "Wymagane jest uwierzytelnienie, aby zatrzymać jednostkę „$(unit)”."
 
-#: ../src/core/dbus-unit.c:452
+#: ../src/core/dbus-unit.c:461
 msgid "Authentication is required to reload '$(unit)'."
 msgstr ""
 "Wymagane jest uwierzytelnienie, aby ponownie wczytać jednostkę „$(unit)”."
 
-#: ../src/core/dbus-unit.c:453 ../src/core/dbus-unit.c:454
+#: ../src/core/dbus-unit.c:462 ../src/core/dbus-unit.c:463
 msgid "Authentication is required to restart '$(unit)'."
 msgstr ""
 "Wymagane jest uwierzytelnienie, aby ponownie uruchomić jednostkę „$(unit)”."
 
-#: ../src/core/dbus-unit.c:560
+#: ../src/core/dbus-unit.c:570
 msgid "Authentication is required to kill '$(unit)'."
 msgstr ""
 "Wymagane jest uwierzytelnienie, aby wymusić wyłączenie jednostki „$(unit)”."
 
-#: ../src/core/dbus-unit.c:590
+#: ../src/core/dbus-unit.c:601
 msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
 msgstr ""
 "Wymagane jest uwierzytelnienie, aby przywrócić stan „failed” (niepowodzenia) "
 "jednostki „$(unit)”."
 
-#: ../src/core/dbus-unit.c:622
+#: ../src/core/dbus-unit.c:634
 msgid "Authentication is required to set properties on '$(unit)'."
 msgstr ""
 "Wymagane jest uwierzytelnienie, aby ustawić właściwości jednostki „$(unit)”."
index 2a11371..a087a47 100644 (file)
@@ -1,23 +1,22 @@
 # Brazilian Portuguese translation for systemd.
-# Copyright (C) 2015 systemd's COPYRIGHT HOLDER
+# Copyright (C) 2017 systemd's COPYRIGHT HOLDER
 # This file is distributed under the same license as the systemd package.
-# Rafael Ferreira <rafael.f.f1@gmail.com>, 2014.
 # Enrico Nicoletto <liverig@gmail.com>, 2014.
-#
+# Rafael Fontenelle <rafaelff@gnome.org>, 2015, 2017.
 msgid ""
 msgstr ""
 "Project-Id-Version: systemd master\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-11-22 16:37+0100\n"
-"PO-Revision-Date: 2015-01-10 12:23-0300\n"
-"Last-Translator: Rafael Ferreira <rafael.f.f1@gmail.com>\n"
+"Report-Msgid-Bugs-To: https://github.com/systemd/systemd/issues\n"
+"POT-Creation-Date: 2016-11-17 03:29+0000\n"
+"PO-Revision-Date: 2017-04-03 14:25-0200\n"
+"Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n"
 "Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
 "Language: pt_BR\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Poedit 1.7.1\n"
+"X-Generator: Virtaal 1.0.0-beta1\n"
 
 #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:1
 msgid "Send passphrase back to system"
@@ -31,15 +30,14 @@ msgstr ""
 "sistema."
 
 #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:3
-#, fuzzy
 msgid "Manage system services or other units"
-msgstr "Gerenciar unidades e serviços do sistema"
+msgstr "Gerenciar serviços do sistema e outras unidades"
 
 #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:4
-#, fuzzy
 msgid "Authentication is required to manage system services or other units."
 msgstr ""
-"É necessária autenticação para gerenciar unidades e serviços do sistema."
+"É necessária autenticação para gerenciar serviços do sistema ou outras "
+"unidades."
 
 #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:5
 msgid "Manage system service or unit files"
@@ -52,18 +50,18 @@ msgstr ""
 "sistema."
 
 #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:7
-#, fuzzy
 msgid "Set or unset system and service manager environment variables"
-msgstr "Acesso privilegiado ao gerenciador de serviço e de sistema"
+msgstr ""
+"Definir ou retirar definição de variáveis de ambiente de gerenciador de "
+"serviço e sistema"
 
 #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:8
-#, fuzzy
 msgid ""
 "Authentication is required to set or unset system and service manager "
 "environment variables."
 msgstr ""
-"É necessária autenticação para gerenciar arquivos \"unit\" e \"service\" do "
-"sistema."
+"É necessária autenticação para definir ou retirar definição de variáveis de "
+"ambiente de gerenciador de serviço e sistema."
 
 #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:9
 msgid "Reload the systemd state"
@@ -103,30 +101,27 @@ msgstr "É necessária autenticação para definir informações de máquina loc
 
 #: ../src/import/org.freedesktop.import1.policy.in.h:1
 msgid "Import a VM or container image"
-msgstr ""
+msgstr "Importar uma VM ou imagem contêiner"
 
 #: ../src/import/org.freedesktop.import1.policy.in.h:2
-#, fuzzy
 msgid "Authentication is required to import a VM or container image"
-msgstr "É necessária autenticação para se conectar a um contêiner local."
+msgstr "É necessária autenticação para importar uma VM ou imagem contêiner"
 
 #: ../src/import/org.freedesktop.import1.policy.in.h:3
 msgid "Export a VM or container image"
-msgstr ""
+msgstr "Exportar uma VM ou imagem contêiner"
 
 #: ../src/import/org.freedesktop.import1.policy.in.h:4
-#, fuzzy
 msgid "Authentication is required to export a VM or container image"
-msgstr "É necessária autenticação para se conectar a um contêiner local."
+msgstr "É necessária autenticação para exportar uma VM ou imagem contêiner"
 
 #: ../src/import/org.freedesktop.import1.policy.in.h:5
 msgid "Download a VM or container image"
-msgstr ""
+msgstr "Baixar uma VM ou imagem contêiner"
 
 #: ../src/import/org.freedesktop.import1.policy.in.h:6
-#, fuzzy
 msgid "Authentication is required to download a VM or container image"
-msgstr "É necessária autenticação para se conectar a um contêiner local."
+msgstr "É necessária autenticação para baixar uma VM ou imagem contêiner"
 
 #: ../src/locale/org.freedesktop.locale1.policy.in.h:1
 msgid "Set system locale"
@@ -254,48 +249,61 @@ msgstr ""
 "sistema sobre o interruptor da tela."
 
 #: ../src/login/org.freedesktop.login1.policy.in.h:19
+#| msgid "Allow non-logged-in users to run programs"
+msgid "Allow non-logged-in user to run programs"
+msgstr ""
+"Permitir que programas sejam executados por usuário que não possui sessão"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:20
+#| msgid "Authentication is required to run programs as a non-logged-in user."
+msgid "Explicit request is required to run programs as a non-logged-in user."
+msgstr ""
+"É necessária requisição explícita para executar programas como usuário sem "
+"sessão aberta."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:21
 msgid "Allow non-logged-in users to run programs"
 msgstr ""
 "Permitir que programas sejam executados por usuários que não possuem sessão"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:20
+#: ../src/login/org.freedesktop.login1.policy.in.h:22
 msgid "Authentication is required to run programs as a non-logged-in user."
 msgstr ""
 "É necessária autenticação para executar programas como usuário sem sessão "
 "aberta."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:21
+#: ../src/login/org.freedesktop.login1.policy.in.h:23
 msgid "Allow attaching devices to seats"
 msgstr "Permitir conectar dispositivos em estações"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:22
+#: ../src/login/org.freedesktop.login1.policy.in.h:24
 msgid "Authentication is required for attaching a device to a seat."
 msgstr "É necessária autenticação para conectar um dispositivo em uma estação."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:23
+#: ../src/login/org.freedesktop.login1.policy.in.h:25
 msgid "Flush device to seat attachments"
 msgstr "Liberar dispositivo para conexões da estação"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:24
+#: ../src/login/org.freedesktop.login1.policy.in.h:26
 msgid ""
 "Authentication is required for resetting how devices are attached to seats."
 msgstr ""
 "É necessária autenticação para redefinir a quantidade de dispositivos "
 "conectados na estação."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:25
+#: ../src/login/org.freedesktop.login1.policy.in.h:27
 msgid "Power off the system"
 msgstr "Desligar o sistema"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:26
+#: ../src/login/org.freedesktop.login1.policy.in.h:28
 msgid "Authentication is required for powering off the system."
 msgstr "É necessária autenticação para desligar o sistema."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:27
+#: ../src/login/org.freedesktop.login1.policy.in.h:29
 msgid "Power off the system while other users are logged in"
 msgstr "Desligar o sistema enquanto outros usuários estão conectados"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:28
+#: ../src/login/org.freedesktop.login1.policy.in.h:30
 msgid ""
 "Authentication is required for powering off the system while other users are "
 "logged in."
@@ -303,11 +311,11 @@ msgstr ""
 "É necessária autenticação para desligar o sistema enquanto outros usuários "
 "estão conectados."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:29
+#: ../src/login/org.freedesktop.login1.policy.in.h:31
 msgid "Power off the system while an application asked to inhibit it"
 msgstr "Desligar o sistema enquanto um aplicativo solicitou inibição"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:30
+#: ../src/login/org.freedesktop.login1.policy.in.h:32
 msgid ""
 "Authentication is required for powering off the system while an application "
 "asked to inhibit it."
@@ -315,19 +323,19 @@ msgstr ""
 "É necessária autenticação para desligar o sistema enquanto um aplicativo "
 "solicitou inibição."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:31
+#: ../src/login/org.freedesktop.login1.policy.in.h:33
 msgid "Reboot the system"
 msgstr "Reiniciar o sistema"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:32
+#: ../src/login/org.freedesktop.login1.policy.in.h:34
 msgid "Authentication is required for rebooting the system."
 msgstr "É necessária autenticação para reiniciar o sistema."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:33
+#: ../src/login/org.freedesktop.login1.policy.in.h:35
 msgid "Reboot the system while other users are logged in"
 msgstr "Reiniciar o sistema enquanto outros usuários estiverem conectados"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:34
+#: ../src/login/org.freedesktop.login1.policy.in.h:36
 msgid ""
 "Authentication is required for rebooting the system while other users are "
 "logged in."
@@ -335,11 +343,11 @@ msgstr ""
 "É necessária autenticação para reiniciar o sistema enquanto outros usuários "
 "estiverem conectados."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:35
+#: ../src/login/org.freedesktop.login1.policy.in.h:37
 msgid "Reboot the system while an application asked to inhibit it"
 msgstr "Reiniciar o sistema enquanto um aplicativo solicitou inibição"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:36
+#: ../src/login/org.freedesktop.login1.policy.in.h:38
 msgid ""
 "Authentication is required for rebooting the system while an application "
 "asked to inhibit it."
@@ -347,19 +355,19 @@ msgstr ""
 "É necessária autenticação para reiniciar o sistema enquanto um aplicativo "
 "solicitou inibição."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:37
+#: ../src/login/org.freedesktop.login1.policy.in.h:39
 msgid "Suspend the system"
 msgstr "Suspender o sistema"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:38
+#: ../src/login/org.freedesktop.login1.policy.in.h:40
 msgid "Authentication is required for suspending the system."
 msgstr "É necessária autenticação para suspender o sistema."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:39
+#: ../src/login/org.freedesktop.login1.policy.in.h:41
 msgid "Suspend the system while other users are logged in"
 msgstr "Suspender o sistema enquanto outros usuários estiverem conectados"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:40
+#: ../src/login/org.freedesktop.login1.policy.in.h:42
 msgid ""
 "Authentication is required for suspending the system while other users are "
 "logged in."
@@ -367,11 +375,11 @@ msgstr ""
 "É necessária autenticação para suspender o sistema enquanto outros usuários "
 "estiverem conectados."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:41
+#: ../src/login/org.freedesktop.login1.policy.in.h:43
 msgid "Suspend the system while an application asked to inhibit it"
 msgstr "Suspender o sistema enquanto um aplicativo solicitou inibição"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:42
+#: ../src/login/org.freedesktop.login1.policy.in.h:44
 msgid ""
 "Authentication is required for suspending the system while an application "
 "asked to inhibit it."
@@ -379,19 +387,19 @@ msgstr ""
 "É necessária autenticação para suspender o sistema enquanto um aplicativo "
 "solicitou inibição."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:43
+#: ../src/login/org.freedesktop.login1.policy.in.h:45
 msgid "Hibernate the system"
 msgstr "Hibernar o sistema"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:44
+#: ../src/login/org.freedesktop.login1.policy.in.h:46
 msgid "Authentication is required for hibernating the system."
 msgstr "É necessária autenticação para hibernar o sistema."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:45
+#: ../src/login/org.freedesktop.login1.policy.in.h:47
 msgid "Hibernate the system while other users are logged in"
 msgstr "Hibernar o sistema enquanto outros usuários estiverem conectados"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:46
+#: ../src/login/org.freedesktop.login1.policy.in.h:48
 msgid ""
 "Authentication is required for hibernating the system while other users are "
 "logged in."
@@ -399,11 +407,11 @@ msgstr ""
 "É necessária autenticação para hibernar o sistema enquanto outros usuários "
 "estiverem conectados."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:47
+#: ../src/login/org.freedesktop.login1.policy.in.h:49
 msgid "Hibernate the system while an application asked to inhibit it"
 msgstr "Hibernar o sistema enquanto um aplicativo solicitou inibição"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:48
+#: ../src/login/org.freedesktop.login1.policy.in.h:50
 msgid ""
 "Authentication is required for hibernating the system while an application "
 "asked to inhibit it."
@@ -411,123 +419,121 @@ msgstr ""
 "É necessária autenticação para hibernar o sistema enquanto um aplicativo "
 "solicitou inibição."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:49
+#: ../src/login/org.freedesktop.login1.policy.in.h:51
 msgid "Manage active sessions, users and seats"
-msgstr ""
+msgstr "Gerenciar estações, usuários e sessões ativas"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:50
-#, fuzzy
+#: ../src/login/org.freedesktop.login1.policy.in.h:52
 msgid ""
 "Authentication is required for managing active sessions, users and seats."
-msgstr "É necessária autenticação para conectar um dispositivo em uma estação."
+msgstr ""
+"É necessária autenticação para gerenciar estações, usuários e sessões ativas."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:51
+#: ../src/login/org.freedesktop.login1.policy.in.h:53
 msgid "Lock or unlock active sessions"
-msgstr ""
+msgstr "Travar ou destravar sessões ativas"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:52
-#, fuzzy
+#: ../src/login/org.freedesktop.login1.policy.in.h:54
 msgid "Authentication is required to lock or unlock active sessions."
-msgstr "É necessária autenticação para se conectar a um contêiner local."
+msgstr "É necessária autenticação para travar ou destravar sessões ativas."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:53
+#: ../src/login/org.freedesktop.login1.policy.in.h:55
 msgid "Allow indication to the firmware to boot to setup interface"
 msgstr ""
+"Permitir indicação para o firmware inicializar para a interface de "
+"configuração"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:54
-#, fuzzy
+#: ../src/login/org.freedesktop.login1.policy.in.h:56
 msgid ""
 "Authentication is required to indicate to the firmware to boot to setup "
 "interface."
-msgstr "É necessária autenticação para definir nome de máquina local."
+msgstr ""
+"É necessária autenticação para indicar para o firmware inicializar para a "
+"interface de configuração."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:55
+#: ../src/login/org.freedesktop.login1.policy.in.h:57
 msgid "Set a wall message"
-msgstr ""
+msgstr "Definir uma mensagem de parede"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:56
-#, fuzzy
+#: ../src/login/org.freedesktop.login1.policy.in.h:58
 msgid "Authentication is required to set a wall message"
-msgstr "É necessária autenticação para definir nome de máquina local."
+msgstr "É necessária autenticação para definir uma mensagem de parede"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:1
 msgid "Log into a local container"
 msgstr "Conectar a um contêiner local"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:2
-#, fuzzy
 msgid "Authentication is required to log into a local container."
 msgstr "É necessária autenticação para se conectar a um contêiner local."
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:3
-#, fuzzy
 msgid "Log into the local host"
-msgstr "Conectar a um contêiner local"
+msgstr "Conectar a uma máquina local"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:4
-#, fuzzy
 msgid "Authentication is required to log into the local host."
-msgstr "É necessária autenticação para se conectar a um contêiner local."
+msgstr "É necessária autenticação para se conectar a uma máquina local."
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:5
-#, fuzzy
 msgid "Acquire a shell in a local container"
-msgstr "Conectar a um contêiner local"
+msgstr "Adquirir uma shell em um contêiner local"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:6
-#, fuzzy
 msgid "Authentication is required to acquire a shell in a local container."
-msgstr "É necessária autenticação para se conectar a um contêiner local."
+msgstr ""
+"É necessária autenticação para adquirir uma shell em um contêiner local."
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:7
 msgid "Acquire a shell on the local host"
-msgstr ""
+msgstr "Adquirir uma shell na máquina local"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:8
-#, fuzzy
 msgid "Authentication is required to acquire a shell on the local host."
-msgstr "É necessária autenticação para definir nome de máquina local."
+msgstr ""
+"É necessária autenticação para adquirir uma shell em uma máquina local."
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:9
-#, fuzzy
 msgid "Acquire a pseudo TTY in a local container"
-msgstr "Conectar a um contêiner local"
+msgstr "Adquirir um pseudo TTY em um contêiner local"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:10
-#, fuzzy
 msgid ""
 "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "É necessária autenticação para se conectar a um contêiner local."
+msgstr ""
+"É necessária autenticação para adquirir um pseudo TTY em um contêiner local."
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:11
 msgid "Acquire a pseudo TTY on the local host"
-msgstr ""
+msgstr "Adquiri um pseudo TTY na máquina local"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:12
-#, fuzzy
 msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "É necessária autenticação para definir nome de máquina local."
+msgstr ""
+"É necessária autenticação para adquirir um pseudo TTY em um máquina local."
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:13
 msgid "Manage local virtual machines and containers"
-msgstr ""
+msgstr "Gerenciar máquinas virtuais locais e contêineres"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:14
-#, fuzzy
 msgid ""
 "Authentication is required to manage local virtual machines and containers."
-msgstr "É necessária autenticação para definir informações de máquina local."
+msgstr ""
+"É necessária autenticação para gerenciar máquinas virtuais locais e "
+"contêineres."
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:15
 msgid "Manage local virtual machine and container images"
-msgstr ""
+msgstr "Gerenciar máquinas virtuais locais e imagens contêineres"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:16
-#, fuzzy
 msgid ""
 "Authentication is required to manage local virtual machine and container "
 "images."
-msgstr "É necessária autenticação para definir informações de máquina local."
+msgstr ""
+"É necessária autenticação para gerenciar máquinas virtuais locais e imagens "
+"contêineres."
 
 #: ../src/timedate/org.freedesktop.timedate1.policy.in.h:1
 msgid "Set system time"
@@ -569,37 +575,31 @@ msgstr ""
 "É necessária autenticação para controlar se deve ser habilitada, ou não, a "
 "sincronização de horário através de rede."
 
-#: ../src/core/dbus-unit.c:428
-#, fuzzy
+#: ../src/core/dbus-unit.c:457
 msgid "Authentication is required to start '$(unit)'."
-msgstr "É necessária autenticação para definir o horário do sistema."
+msgstr "É necessária autenticação para iniciar '$(unit)'."
 
-#: ../src/core/dbus-unit.c:429
-#, fuzzy
+#: ../src/core/dbus-unit.c:458
 msgid "Authentication is required to stop '$(unit)'."
-msgstr "É necessária autenticação para definir o horário do sistema."
+msgstr "É necessária autenticação para parar '$(unit)'."
 
-#: ../src/core/dbus-unit.c:430
-#, fuzzy
+#: ../src/core/dbus-unit.c:459
 msgid "Authentication is required to reload '$(unit)'."
-msgstr "É necessária autenticação para recarregar o estado do sistema."
+msgstr "É necessária autenticação para recarregar '$(unit)'."
 
-#: ../src/core/dbus-unit.c:431 ../src/core/dbus-unit.c:432
-#, fuzzy
+#: ../src/core/dbus-unit.c:460 ../src/core/dbus-unit.c:461
 msgid "Authentication is required to restart '$(unit)'."
-msgstr "É necessária autenticação para definir o horário do sistema."
+msgstr "É necessária autenticação para reiniciar '$(unit)'."
 
-#: ../src/core/dbus-unit.c:535
-#, fuzzy
+#: ../src/core/dbus-unit.c:568
 msgid "Authentication is required to kill '$(unit)'."
-msgstr "É necessária autenticação para se conectar a um contêiner local."
+msgstr "É necessária autenticação para matar '$(unit)'."
 
-#: ../src/core/dbus-unit.c:565
-#, fuzzy
+#: ../src/core/dbus-unit.c:599
 msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "É necessária autenticação para definir nome de máquina local."
+msgstr ""
+"É necessária autenticação para reiniciar o estado \"failed\" de '$(unit)'."
 
-#: ../src/core/dbus-unit.c:597
-#, fuzzy
+#: ../src/core/dbus-unit.c:632
 msgid "Authentication is required to set properties on '$(unit)'."
-msgstr "É necessária autenticação para definir o horário do sistema."
+msgstr "É necessária autenticação para definir propriedades em '$(unit)'."
diff --git a/po/sk.po b/po/sk.po
new file mode 100644 (file)
index 0000000..84dd732
--- /dev/null
+++ b/po/sk.po
@@ -0,0 +1,556 @@
+# Slovak translation for systemd.
+# Copyright (C) 2017 systemd's COPYRIGHT HOLDER
+# This file is distributed under the same license as the systemd package.
+# Dušan Kazik <prescott66@gmail.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: systemd master\n"
+"Report-Msgid-Bugs-To: https://github.com/systemd/systemd/issues\n"
+"POT-Creation-Date: 2017-06-24 03:26+0000\n"
+"PO-Revision-Date: 2017-06-25 11:03+0200\n"
+"Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
+"Language: sk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
+"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
+"X-Generator: Poedit 2.0.2\n"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:1
+msgid "Send passphrase back to system"
+msgstr "Odoslanie hesla späť do systému"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:2
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na odoslanie zadaného hesla späť do systému."
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:3
+msgid "Manage system services or other units"
+msgstr "Správa systémových služieb alebo iných jednotiek"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:4
+msgid "Authentication is required to manage system services or other units."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na správu systémových služieb alebo iných "
+"jednotiek."
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:5
+msgid "Manage system service or unit files"
+msgstr "Správa systémovej služby alebo súborov jednotky"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:6
+msgid "Authentication is required to manage system service or unit files."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na správu systémovej služby alebo súborov "
+"jednotky."
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:7
+msgid "Set or unset system and service manager environment variables"
+msgstr ""
+"Nastavenie alebo zrušenie nastavenia premenných prostredia systému a správcu "
+"služieb"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:8
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na nastavenie alebo zrušenie nastavenia "
+"premenných prostredia systému a správcu služieb."
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:9
+msgid "Reload the systemd state"
+msgstr "Znovu načítanie stavu systému systemd"
+
+#: ../src/core/org.freedesktop.systemd1.policy.in.in.h:10
+msgid "Authentication is required to reload the systemd state."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na znovu načítanie stavu systému systemd."
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:1
+msgid "Set host name"
+msgstr "Nastavenie názvu hostiteľa"
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:2
+msgid "Authentication is required to set the local host name."
+msgstr "Vyžaduje sa overenie totožnosti na nastavenie názvu hostiteľa."
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:3
+msgid "Set static host name"
+msgstr "Nastavenie nemenného názvu hostiteľa"
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:4
+msgid ""
+"Authentication is required to set the statically configured local host name, "
+"as well as the pretty host name."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na nastavenie pevne určeného názvu miestneho "
+"hostiteľa, známeho ako zrozumiteľný názov hostiteľa."
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:5
+msgid "Set machine information"
+msgstr "Nastavenie informácií o počítači"
+
+#: ../src/hostname/org.freedesktop.hostname1.policy.in.h:6
+msgid "Authentication is required to set local machine information."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na nastavenie informácií o miestnom počítači."
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:1
+msgid "Import a VM or container image"
+msgstr ""
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:2
+msgid "Authentication is required to import a VM or container image"
+msgstr ""
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:3
+msgid "Export a VM or container image"
+msgstr ""
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:4
+msgid "Authentication is required to export a VM or container image"
+msgstr ""
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:5
+msgid "Download a VM or container image"
+msgstr ""
+
+#: ../src/import/org.freedesktop.import1.policy.in.h:6
+msgid "Authentication is required to download a VM or container image"
+msgstr ""
+
+#: ../src/locale/org.freedesktop.locale1.policy.in.h:1
+msgid "Set system locale"
+msgstr "Nastavenie miestnych nastavení"
+
+#: ../src/locale/org.freedesktop.locale1.policy.in.h:2
+msgid "Authentication is required to set the system locale."
+msgstr "Vyžaduje sa overenie totožnosti na nastavenie miestnych nastavení."
+
+#: ../src/locale/org.freedesktop.locale1.policy.in.h:3
+msgid "Set system keyboard settings"
+msgstr "Nastavenie nastavení systémovej klávesnice"
+
+#: ../src/locale/org.freedesktop.locale1.policy.in.h:4
+msgid "Authentication is required to set the system keyboard settings."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na nastavenie nastavení systémovej "
+"klávesnice."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:1
+msgid "Allow applications to inhibit system shutdown"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:2
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:3
+msgid "Allow applications to delay system shutdown"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:4
+msgid "Authentication is required for an application to delay system shutdown."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:5
+msgid "Allow applications to inhibit system sleep"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:6
+msgid "Authentication is required for an application to inhibit system sleep."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:7
+msgid "Allow applications to delay system sleep"
+msgstr "Umožnenie aplikáciám odložiť spánok systému"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:8
+msgid "Authentication is required for an application to delay system sleep."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na odloženie spánku systému aplikáciou."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:9
+msgid "Allow applications to inhibit automatic system suspend"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:10
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:11
+msgid "Allow applications to inhibit system handling of the power key"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:12
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:13
+msgid "Allow applications to inhibit system handling of the suspend key"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:14
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:15
+msgid "Allow applications to inhibit system handling of the hibernate key"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:16
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:17
+msgid "Allow applications to inhibit system handling of the lid switch"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:18
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:19
+msgid "Allow non-logged-in user to run programs"
+msgstr "Umožnenie neprihlásenému používateľovi spúšťanie programov"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:20
+msgid "Explicit request is required to run programs as a non-logged-in user."
+msgstr ""
+"Vyžaduje sa explicitná požiadavka na spúšťanie programov ako neprihlásený "
+"používateľ."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:21
+msgid "Allow non-logged-in users to run programs"
+msgstr "Umožnenie neprihláseným používateľom spúšťanie programov"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:22
+msgid "Authentication is required to run programs as a non-logged-in user."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na spúšťanie programov ako neprihlásený "
+"používateľ."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:23
+msgid "Allow attaching devices to seats"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:24
+msgid "Authentication is required for attaching a device to a seat."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:25
+msgid "Flush device to seat attachments"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:26
+msgid ""
+"Authentication is required for resetting how devices are attached to seats."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:27
+msgid "Power off the system"
+msgstr "Vypnutie systému"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:28
+msgid "Authentication is required for powering off the system."
+msgstr "Vyžaduje sa overenie totožnosti na vypnutie systému."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:29
+msgid "Power off the system while other users are logged in"
+msgstr "Vypnutie systému, pokiaľ sú prihlásení iní používatelia"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:30
+msgid ""
+"Authentication is required for powering off the system while other users are "
+"logged in."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na vypnutie systému, pokiaľ sú prihlásení "
+"iní používatelia."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:31
+msgid "Power off the system while an application asked to inhibit it"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:32
+msgid ""
+"Authentication is required for powering off the system while an application "
+"asked to inhibit it."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:33
+msgid "Reboot the system"
+msgstr "Reštart systému"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:34
+msgid "Authentication is required for rebooting the system."
+msgstr "Vyžaduje sa overenie totožnosti na reštartovanie systému."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:35
+msgid "Reboot the system while other users are logged in"
+msgstr "Reštart systému, pokiaľ sú prihlásení iní používatelia"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:36
+msgid ""
+"Authentication is required for rebooting the system while other users are "
+"logged in."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na reštartovanie systému, pokiaľ sú "
+"prihlásení iní používatelia."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:37
+msgid "Reboot the system while an application asked to inhibit it"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:38
+msgid ""
+"Authentication is required for rebooting the system while an application "
+"asked to inhibit it."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:39
+msgid "Suspend the system"
+msgstr "Uspanie systému"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:40
+msgid "Authentication is required for suspending the system."
+msgstr "Vyžaduje sa overenie totožnosti na uspanie systému."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:41
+msgid "Suspend the system while other users are logged in"
+msgstr "Uspanie systému, pokiaľ sú prihlásení iní používatelia"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:42
+msgid ""
+"Authentication is required for suspending the system while other users are "
+"logged in."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na uspanie systému, pokiaľ sú prihlásení iní "
+"používatelia."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:43
+msgid "Suspend the system while an application asked to inhibit it"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:44
+msgid ""
+"Authentication is required for suspending the system while an application "
+"asked to inhibit it."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:45
+msgid "Hibernate the system"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:46
+msgid "Authentication is required for hibernating the system."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:47
+msgid "Hibernate the system while other users are logged in"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:48
+msgid ""
+"Authentication is required for hibernating the system while other users are "
+"logged in."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:49
+msgid "Hibernate the system while an application asked to inhibit it"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:50
+msgid ""
+"Authentication is required for hibernating the system while an application "
+"asked to inhibit it."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:51
+msgid "Manage active sessions, users and seats"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:52
+msgid ""
+"Authentication is required for managing active sessions, users and seats."
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:53
+msgid "Lock or unlock active sessions"
+msgstr "Zamknutie alebo odomknutie aktívnych relácií"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:54
+msgid "Authentication is required to lock or unlock active sessions."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na uzamknutie alebo odomknutie aktívnych "
+"relácií."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:55
+msgid "Allow indication to the firmware to boot to setup interface"
+msgstr "Umožnenie indikácie spustenia inštalačného rozhrania pre firmvér"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:56
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na indikáciu spustenia inštalačného "
+"rozhrania pre firmvér."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:57
+msgid "Set a wall message"
+msgstr ""
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:58
+msgid "Authentication is required to set a wall message"
+msgstr ""
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:1
+msgid "Log into a local container"
+msgstr "Prihlásenie do miestneho kontajneru"
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:2
+msgid "Authentication is required to log into a local container."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na prihlásenie do miestneho kontajneru."
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:3
+msgid "Log into the local host"
+msgstr ""
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:4
+msgid "Authentication is required to log into the local host."
+msgstr ""
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:5
+msgid "Acquire a shell in a local container"
+msgstr ""
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:6
+msgid "Authentication is required to acquire a shell in a local container."
+msgstr ""
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:7
+msgid "Acquire a shell on the local host"
+msgstr ""
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:8
+msgid "Authentication is required to acquire a shell on the local host."
+msgstr ""
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:9
+msgid "Acquire a pseudo TTY in a local container"
+msgstr ""
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:10
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:11
+msgid "Acquire a pseudo TTY on the local host"
+msgstr ""
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:12
+msgid "Authentication is required to acquire a pseudo TTY on the local host."
+msgstr ""
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:13
+msgid "Manage local virtual machines and containers"
+msgstr ""
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:14
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:15
+msgid "Manage local virtual machine and container images"
+msgstr ""
+
+#: ../src/machine/org.freedesktop.machine1.policy.in.h:16
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:1
+msgid "Set system time"
+msgstr ""
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:2
+msgid "Authentication is required to set the system time."
+msgstr ""
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:3
+msgid "Set system timezone"
+msgstr ""
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:4
+msgid "Authentication is required to set the system timezone."
+msgstr ""
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:5
+msgid "Set RTC to local timezone or UTC"
+msgstr ""
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:6
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:7
+msgid "Turn network time synchronization on or off"
+msgstr "Zapnutie alebo vypnutie sieťovej synchronizácie času"
+
+#: ../src/timedate/org.freedesktop.timedate1.policy.in.h:8
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Vyžaduje sa overenie totožnosti na ovládanie, či má byť povolená "
+"synchronizácia času cez sieť."
+
+#: ../src/core/dbus-unit.c:457
+msgid "Authentication is required to start '$(unit)'."
+msgstr ""
+
+#: ../src/core/dbus-unit.c:458
+msgid "Authentication is required to stop '$(unit)'."
+msgstr ""
+
+#: ../src/core/dbus-unit.c:459
+msgid "Authentication is required to reload '$(unit)'."
+msgstr ""
+
+#: ../src/core/dbus-unit.c:460 ../src/core/dbus-unit.c:461
+msgid "Authentication is required to restart '$(unit)'."
+msgstr ""
+
+#: ../src/core/dbus-unit.c:568
+msgid "Authentication is required to kill '$(unit)'."
+msgstr ""
+
+#: ../src/core/dbus-unit.c:599
+msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
+msgstr ""
+
+#: ../src/core/dbus-unit.c:632
+msgid "Authentication is required to set properties on '$(unit)'."
+msgstr ""
index 2830741..1de9b46 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -1,22 +1,23 @@
 # Swedish translation for systemd.
 # Copyright © 2015 systemd's COPYRIGHT HOLDER
 # This file is distributed under the same license as the systemd package.
-# Josef Andersson <josef.andersson@fripost.org>, 2015.
 # Sebastian Rasmussen <sebras@gmail.com>, 2015.
+# Andreas Henriksson <andreas@fatal.se>, 2016.
+# Josef Andersson <l10nl18nsweja@gmail.com>, 2015, 2017.
 msgid ""
 msgstr ""
 "Project-Id-Version: systemd master\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-11-22 16:37+0100\n"
-"PO-Revision-Date: 2015-03-14 11:09+0100\n"
-"Last-Translator: Sebastian Rasmussen <sebras@gmail.com>\n"
+"Report-Msgid-Bugs-To: https://github.com/systemd/systemd/issues\n"
+"POT-Creation-Date: 2017-03-01 15:50+0000\n"
+"PO-Revision-Date: 2017-03-19 21:18+0100\n"
+"Last-Translator: Josef Andersson <l10nl18nsweja@gmail.com>\n"
 "Language-Team: Swedish\n"
 "Language: sv\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.6.10\n"
+"X-Generator: Poedit 1.8.9\n"
 
 #: ../src/core/org.freedesktop.systemd1.policy.in.in.h:1
 msgid "Send passphrase back to system"
@@ -72,7 +73,7 @@ msgstr "Ange värdnamn"
 
 #: ../src/hostname/org.freedesktop.hostname1.policy.in.h:2
 msgid "Authentication is required to set the local host name."
-msgstr "Autentisering krävs för att ange lokalt värdnamn."
+msgstr "Autentisering krävs för att ställa in lokalt värdnamn."
 
 #: ../src/hostname/org.freedesktop.hostname1.policy.in.h:3
 msgid "Set static host name"
@@ -83,16 +84,16 @@ msgid ""
 "Authentication is required to set the statically configured local host name, "
 "as well as the pretty host name."
 msgstr ""
-"Autentisering krävs för att ange det statiskt konfigurerade lokala "
+"Autentisering krävs för att ställa in det statiskt konfigurerade lokala "
 "värdnamnet såväl som det stiliga värdnamnet."
 
 #: ../src/hostname/org.freedesktop.hostname1.policy.in.h:5
 msgid "Set machine information"
-msgstr "Ange datorinformation"
+msgstr "Ställa in datorinformation"
 
 #: ../src/hostname/org.freedesktop.hostname1.policy.in.h:6
 msgid "Authentication is required to set local machine information."
-msgstr "Autentisering krävs för att ange lokal datorinformation."
+msgstr "Autentisering krävs för att ställa in lokal datorinformation."
 
 #: ../src/import/org.freedesktop.import1.policy.in.h:1
 msgid "Import a VM or container image"
@@ -124,7 +125,7 @@ msgstr "Ange systemlokal"
 
 #: ../src/locale/org.freedesktop.locale1.policy.in.h:2
 msgid "Authentication is required to set the system locale."
-msgstr "Autentisering krävs för att ange systemlokal."
+msgstr "Autentisering krävs för att ställa in systemlokal."
 
 #: ../src/locale/org.freedesktop.locale1.policy.in.h:3
 msgid "Set system keyboard settings"
@@ -132,7 +133,8 @@ msgstr "Ange systeminställningar för tangentbord"
 
 #: ../src/locale/org.freedesktop.locale1.policy.in.h:4
 msgid "Authentication is required to set the system keyboard settings."
-msgstr "Autentisering krävs för att ange systeminställningar för tangentbord."
+msgstr ""
+"Autentisering krävs för att ställa in systeminställningar för tangentbord."
 
 #: ../src/login/org.freedesktop.login1.policy.in.h:1
 msgid "Allow applications to inhibit system shutdown"
@@ -235,45 +237,54 @@ msgstr ""
 "av brytaren för datorhöljet."
 
 #: ../src/login/org.freedesktop.login1.policy.in.h:19
+msgid "Allow non-logged-in user to run programs"
+msgstr "Tillåt ej inloggad användare att köra program"
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:20
+msgid "Explicit request is required to run programs as a non-logged-in user."
+msgstr ""
+"Uttrycklig begäran krävs för att köra program som en icke inloggad användare."
+
+#: ../src/login/org.freedesktop.login1.policy.in.h:21
 msgid "Allow non-logged-in users to run programs"
 msgstr "Tillåt ej inloggade användare att köra program"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:20
+#: ../src/login/org.freedesktop.login1.policy.in.h:22
 msgid "Authentication is required to run programs as a non-logged-in user."
 msgstr ""
 "Autentisering krävs för att köra program som en icke inloggad användare."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:21
+#: ../src/login/org.freedesktop.login1.policy.in.h:23
 msgid "Allow attaching devices to seats"
 msgstr "Tillåt att binda enheter till platser"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:22
+#: ../src/login/org.freedesktop.login1.policy.in.h:24
 msgid "Authentication is required for attaching a device to a seat."
 msgstr "Autentisering krävs för att binda en enhet till en plats."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:23
+#: ../src/login/org.freedesktop.login1.policy.in.h:25
 msgid "Flush device to seat attachments"
 msgstr "Töm bindningar för enhet-till-plats"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:24
+#: ../src/login/org.freedesktop.login1.policy.in.h:26
 msgid ""
 "Authentication is required for resetting how devices are attached to seats."
 msgstr ""
 "Autentisering krävs för att återställa hur enheter är bundna till platser."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:25
+#: ../src/login/org.freedesktop.login1.policy.in.h:27
 msgid "Power off the system"
 msgstr "Stäng av systemet"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:26
+#: ../src/login/org.freedesktop.login1.policy.in.h:28
 msgid "Authentication is required for powering off the system."
 msgstr "Autentisering krävs för att stänga av systemet."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:27
+#: ../src/login/org.freedesktop.login1.policy.in.h:29
 msgid "Power off the system while other users are logged in"
 msgstr "Stäng av systemet medan andra användare är inloggade"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:28
+#: ../src/login/org.freedesktop.login1.policy.in.h:30
 msgid ""
 "Authentication is required for powering off the system while other users are "
 "logged in."
@@ -281,11 +292,11 @@ msgstr ""
 "Autentisering krävs för att stänga av systemet medan andra användare är "
 "inloggade."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:29
+#: ../src/login/org.freedesktop.login1.policy.in.h:31
 msgid "Power off the system while an application asked to inhibit it"
 msgstr "Stäng av systemet även då ett program hindrar det"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:30
+#: ../src/login/org.freedesktop.login1.policy.in.h:32
 msgid ""
 "Authentication is required for powering off the system while an application "
 "asked to inhibit it."
@@ -293,19 +304,19 @@ msgstr ""
 "Autentisering krävs för att stänga av systemet även då ett program hindrar "
 "det."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:31
+#: ../src/login/org.freedesktop.login1.policy.in.h:33
 msgid "Reboot the system"
 msgstr "Starta om systemet"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:32
+#: ../src/login/org.freedesktop.login1.policy.in.h:34
 msgid "Authentication is required for rebooting the system."
 msgstr "Autentisering krävs för att starta om systemet."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:33
+#: ../src/login/org.freedesktop.login1.policy.in.h:35
 msgid "Reboot the system while other users are logged in"
 msgstr "Starta om systemet medan andra användare är inloggade"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:34
+#: ../src/login/org.freedesktop.login1.policy.in.h:36
 msgid ""
 "Authentication is required for rebooting the system while other users are "
 "logged in."
@@ -313,11 +324,11 @@ msgstr ""
 "Autentisering krävs för att starta om systemet medan andra användare är "
 "inloggade."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:35
+#: ../src/login/org.freedesktop.login1.policy.in.h:37
 msgid "Reboot the system while an application asked to inhibit it"
 msgstr "Starta om systemet även då ett program hindrar det"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:36
+#: ../src/login/org.freedesktop.login1.policy.in.h:38
 msgid ""
 "Authentication is required for rebooting the system while an application "
 "asked to inhibit it."
@@ -325,19 +336,19 @@ msgstr ""
 "Autentisering krävs för att starta om systemet även då ett program hindrar "
 "det."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:37
+#: ../src/login/org.freedesktop.login1.policy.in.h:39
 msgid "Suspend the system"
 msgstr "Försätt system i vänteläge"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:38
+#: ../src/login/org.freedesktop.login1.policy.in.h:40
 msgid "Authentication is required for suspending the system."
 msgstr "Autentisering krävs för att försätta system i vänteläge."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:39
+#: ../src/login/org.freedesktop.login1.policy.in.h:41
 msgid "Suspend the system while other users are logged in"
 msgstr "Försätt systemet i vänteläge medan andra användare är inloggade"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:40
+#: ../src/login/org.freedesktop.login1.policy.in.h:42
 msgid ""
 "Authentication is required for suspending the system while other users are "
 "logged in."
@@ -345,11 +356,11 @@ msgstr ""
 "Autentisering krävs för att försätta systemet i vänteläge medan andra "
 "användare är inloggade."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:41
+#: ../src/login/org.freedesktop.login1.policy.in.h:43
 msgid "Suspend the system while an application asked to inhibit it"
 msgstr "Försätt systemet i vänteläge även då ett program hindrar det"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:42
+#: ../src/login/org.freedesktop.login1.policy.in.h:44
 msgid ""
 "Authentication is required for suspending the system while an application "
 "asked to inhibit it."
@@ -357,19 +368,19 @@ msgstr ""
 "Autentisering krävs för att försätta ett program i vänteläge även då ett "
 "program hindrar det."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:43
+#: ../src/login/org.freedesktop.login1.policy.in.h:45
 msgid "Hibernate the system"
 msgstr "Försätt systemet i viloläge"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:44
+#: ../src/login/org.freedesktop.login1.policy.in.h:46
 msgid "Authentication is required for hibernating the system."
 msgstr "Autentisering krävs för att försätta systemet i viloläge."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:45
+#: ../src/login/org.freedesktop.login1.policy.in.h:47
 msgid "Hibernate the system while other users are logged in"
 msgstr "Försätt systemet i viloläge medan andra användare är inloggade"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:46
+#: ../src/login/org.freedesktop.login1.policy.in.h:48
 msgid ""
 "Authentication is required for hibernating the system while other users are "
 "logged in."
@@ -377,11 +388,11 @@ msgstr ""
 "Autentisering krävs för att försätta systemet i viloläge medan andra "
 "användare är inloggade."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:47
+#: ../src/login/org.freedesktop.login1.policy.in.h:49
 msgid "Hibernate the system while an application asked to inhibit it"
 msgstr "Försätt systemet i viloläge även då ett program hindrar det"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:48
+#: ../src/login/org.freedesktop.login1.policy.in.h:50
 msgid ""
 "Authentication is required for hibernating the system while an application "
 "asked to inhibit it."
@@ -389,100 +400,97 @@ msgstr ""
 "Autentisering krävs för att försätta ett program i viloläge även då ett "
 "program hindrar det."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:49
+#: ../src/login/org.freedesktop.login1.policy.in.h:51
 msgid "Manage active sessions, users and seats"
 msgstr "Hantera aktiva sessioner, användare och platser"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:50
+#: ../src/login/org.freedesktop.login1.policy.in.h:52
 msgid ""
 "Authentication is required for managing active sessions, users and seats."
 msgstr ""
 "Autentisering krävs för att hantera aktiva sessioner, användare och platser."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:51
+#: ../src/login/org.freedesktop.login1.policy.in.h:53
 msgid "Lock or unlock active sessions"
 msgstr "Lås eller lås upp aktiva sessioner"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:52
+#: ../src/login/org.freedesktop.login1.policy.in.h:54
 msgid "Authentication is required to lock or unlock active sessions."
 msgstr "Autentisering krävs för att låsa eller låsa upp aktiva sessioner."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:53
+#: ../src/login/org.freedesktop.login1.policy.in.h:55
 msgid "Allow indication to the firmware to boot to setup interface"
 msgstr ""
+"Tillåt indikering till firmware att starta upp i inställningsgränssnitt"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:54
-#, fuzzy
+#: ../src/login/org.freedesktop.login1.policy.in.h:56
 msgid ""
 "Authentication is required to indicate to the firmware to boot to setup "
 "interface."
-msgstr "Autentisering krävs för att ange lokalt värdnamn."
+msgstr ""
+"Autentisering krävs för att indikera till firmware att starta upp till "
+"inställningsgränssnitt."
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:55
+#: ../src/login/org.freedesktop.login1.policy.in.h:57
 msgid "Set a wall message"
-msgstr ""
+msgstr "Ange ett väggmeddelande"
 
-#: ../src/login/org.freedesktop.login1.policy.in.h:56
-#, fuzzy
+#: ../src/login/org.freedesktop.login1.policy.in.h:58
 msgid "Authentication is required to set a wall message"
-msgstr "Autentisering krävs för att ange lokalt värdnamn."
+msgstr "Autentisering krävs för att ställa in ett väggmeddelande"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:1
 msgid "Log into a local container"
-msgstr "Logga till en lokal behållare"
+msgstr "Logga in i en lokal behållare"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:2
 msgid "Authentication is required to log into a local container."
-msgstr "Autentisering krävs för att logga till en lokal behållare"
+msgstr "Autentisering krävs för att logga in i en lokal behållare"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:3
-#, fuzzy
 msgid "Log into the local host"
-msgstr "Logga till en lokal behållare"
+msgstr "Logga in på en lokal värd"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:4
-#, fuzzy
 msgid "Authentication is required to log into the local host."
-msgstr "Autentisering krävs för att logga till en lokal behållare"
+msgstr "Autentisering krävs för att logga in på den lokala värden"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:5
-#, fuzzy
 msgid "Acquire a shell in a local container"
-msgstr "Logga till en lokal behållare"
+msgstr "Förvärva en kommandotolk i en lokal behållare"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:6
-#, fuzzy
 msgid "Authentication is required to acquire a shell in a local container."
-msgstr "Autentisering krävs för att logga till en lokal behållare"
+msgstr ""
+"Autentisering krävs för att förvärva en kommandotolk i en lokal behållare."
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:7
 msgid "Acquire a shell on the local host"
-msgstr ""
+msgstr "Förvärva en kommandotolk på den lokala värden"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:8
-#, fuzzy
 msgid "Authentication is required to acquire a shell on the local host."
-msgstr "Autentisering krävs för att ange lokalt värdnamn."
+msgstr ""
+"Autentisering krävs för att förvärva en kommandotolk på den lokala värden."
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:9
-#, fuzzy
 msgid "Acquire a pseudo TTY in a local container"
-msgstr "Logga till en lokal behållare"
+msgstr "Förvärva en pseudo TTY i en lokal behållare"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:10
-#, fuzzy
 msgid ""
 "Authentication is required to acquire a pseudo TTY in a local container."
-msgstr "Autentisering krävs för att logga till en lokal behållare"
+msgstr ""
+"Autentisering krävs för att förvärva en pseudo TTY i en lokal behållare"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:11
 msgid "Acquire a pseudo TTY on the local host"
-msgstr ""
+msgstr "Förvärva en pseudo TTY på den lokala värden"
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:12
-#, fuzzy
 msgid "Authentication is required to acquire a pseudo TTY on the local host."
-msgstr "Autentisering krävs för att ange lokalt värdnamn."
+msgstr ""
+"Autentisering krävs för att förvärva en pseudo TTY på den lokala värden."
 
 #: ../src/machine/org.freedesktop.machine1.policy.in.h:13
 msgid "Manage local virtual machines and containers"
@@ -512,7 +520,7 @@ msgstr "Ange systemtid"
 
 #: ../src/timedate/org.freedesktop.timedate1.policy.in.h:2
 msgid "Authentication is required to set the system time."
-msgstr "Autentisering krävs för ange systemtiden."
+msgstr "Autentisering krävs för ställa in systemtiden."
 
 #: ../src/timedate/org.freedesktop.timedate1.policy.in.h:3
 msgid "Set system timezone"
@@ -520,7 +528,7 @@ msgstr "Ange systemets tidszon"
 
 #: ../src/timedate/org.freedesktop.timedate1.policy.in.h:4
 msgid "Authentication is required to set the system timezone."
-msgstr "Autentisering krävs för att ange systemets tidszon."
+msgstr "Autentisering krävs för att ställa in systemets tidszon."
 
 #: ../src/timedate/org.freedesktop.timedate1.policy.in.h:5
 msgid "Set RTC to local timezone or UTC"
@@ -548,40 +556,35 @@ msgstr ""
 "Autentisering krävs för att kontrollera huruvida synkronisering av "
 "nätverkstid ska vara aktiverat."
 
-#: ../src/core/dbus-unit.c:428
-#, fuzzy
+#: ../src/core/dbus-unit.c:457
 msgid "Authentication is required to start '$(unit)'."
-msgstr "Autentisering krävs för ange systemtiden."
+msgstr "Autentisering krävs för att starta \"$(unit)\"."
 
-#: ../src/core/dbus-unit.c:429
-#, fuzzy
+#: ../src/core/dbus-unit.c:458
 msgid "Authentication is required to stop '$(unit)'."
-msgstr "Autentisering krävs för ange systemtiden."
+msgstr "Autentisering krävs för att stoppa \"$(unit)\"."
 
-#: ../src/core/dbus-unit.c:430
-#, fuzzy
+#: ../src/core/dbus-unit.c:459
 msgid "Authentication is required to reload '$(unit)'."
-msgstr "Autentisering krävs för att läsa om tillståndet för systemd."
+msgstr "Autentisering krävs för att läsa om tillståndet för \"$(unit)\"."
 
-#: ../src/core/dbus-unit.c:431 ../src/core/dbus-unit.c:432
-#, fuzzy
+#: ../src/core/dbus-unit.c:460 ../src/core/dbus-unit.c:461
 msgid "Authentication is required to restart '$(unit)'."
-msgstr "Autentisering krävs för ange systemtiden."
+msgstr "Autentisering krävs för att starta om \"$(unit)\"."
 
-#: ../src/core/dbus-unit.c:535
-#, fuzzy
+#: ../src/core/dbus-unit.c:568
 msgid "Authentication is required to kill '$(unit)'."
-msgstr "Autentisering krävs för att logga till en lokal behållare"
+msgstr "Autentisering krävs för att döda \"$(unit)\"."
 
-#: ../src/core/dbus-unit.c:565
-#, fuzzy
+#: ../src/core/dbus-unit.c:599
 msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
-msgstr "Autentisering krävs för att ange lokalt värdnamn."
+msgstr ""
+"Autentisering krävs för att återställa det \"fallerade\" tillståndet för "
+"\"$(unit)\"."
 
-#: ../src/core/dbus-unit.c:597
-#, fuzzy
+#: ../src/core/dbus-unit.c:632
 msgid "Authentication is required to set properties on '$(unit)'."
-msgstr "Autentisering krävs för ange systemtiden."
+msgstr "Autentisering krävs för att ställa in egenskaper på \"$(unit)\"."
 
 #~ msgid "Press Ctrl+C to cancel all filesystem checks in progress"
 #~ msgstr "Tryck Ctrl+C för att avbryta alla pågående filsystemskontroller."
index 93a50dd..ea6e216 100644 (file)
@@ -1 +1,2 @@
+/50-udev-default.rules
 /99-systemd.rules
similarity index 94%
rename from rules/50-udev-default.rules
rename to rules/50-udev-default.rules.in
index 8f5eadc..e24eedb 100644 (file)
@@ -11,7 +11,6 @@ SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc"
 SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100"
 
 SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb"
-SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id"
 ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}"
 
 ACTION!="add", GOTO="default_end"
@@ -34,6 +33,8 @@ SUBSYSTEM=="video4linux", GROUP="video"
 SUBSYSTEM=="graphics", GROUP="video"
 SUBSYSTEM=="drm", GROUP="video"
 SUBSYSTEM=="dvb", GROUP="video"
+SUBSYSTEM=="media", GROUP="video"
+SUBSYSTEM=="cec", GROUP="video"
 
 SUBSYSTEM=="sound", GROUP="audio", \
   OPTIONS+="static_node=snd/seq", OPTIONS+="static_node=snd/timer"
@@ -74,4 +75,8 @@ KERNEL=="tun", MODE="0666", OPTIONS+="static_node=net/tun", SECLABEL{smack}="*"
 
 KERNEL=="fuse", MODE="0666", OPTIONS+="static_node=fuse"
 
+KERNEL=="kvm", GROUP="kvm", MODE="@DEV_KVM_MODE@"
+
+SUBSYSTEM=="ptp", ATTR{clock_name}=="KVM virtual PTP", SYMLINK += "ptp_kvm"
+
 LABEL="default_end"
index 5c3b52e..288f8ce 100644 (file)
@@ -2,12 +2,16 @@
 
 ACTION=="remove", GOTO="cdrom_end"
 SUBSYSTEM!="block", GOTO="cdrom_end"
-KERNEL!="sr[0-9]*|xvd*", GOTO="cdrom_end"
+KERNEL!="sr[0-9]*|vdisk*|xvd*", GOTO="cdrom_end"
 ENV{DEVTYPE}!="disk", GOTO="cdrom_end"
 
 # unconditionally tag device as CDROM
 KERNEL=="sr[0-9]*", ENV{ID_CDROM}="1"
 
+# stop automatically any mount units bound to the device if the media eject
+# button is pressed.
+ENV{ID_CDROM}=="1", ENV{SYSTEMD_MOUNT_DEVICE_BOUND}="1"
+
 # media eject button pressed
 ENV{DISK_EJECT_REQUEST}=="?*", RUN+="cdrom_id --eject-media $devnode", GOTO="cdrom_end"
 
index 1ed3e44..f7f3435 100644 (file)
@@ -1,3 +1,8 @@
 # do not edit this file, it will be overwritten on update
 
 ACTION!="remove", SUBSYSTEM=="drm", SUBSYSTEMS=="pci|usb|platform", IMPORT{builtin}="path_id"
+
+# by-path
+ENV{ID_PATH}=="?*", KERNEL=="card*", SYMLINK+="dri/by-path/$env{ID_PATH}-card"
+ENV{ID_PATH}=="?*", KERNEL=="controlD*", SYMLINK+="dri/by-path/$env{ID_PATH}-control"
+ENV{ID_PATH}=="?*", KERNEL=="renderD*", SYMLINK+="dri/by-path/$env{ID_PATH}-render"
index ade7e7f..e5e608a 100644 (file)
@@ -8,10 +8,14 @@ IMPORT{builtin}="hwdb --subsystem=input --lookup-prefix=evdev:", \
   RUN{builtin}+="keyboard", GOTO="evdev_end"
 
 # AT keyboard matching by the machine's DMI data
-ENV{ID_INPUT_KEY}=="?*", DRIVERS=="atkbd", \
+DRIVERS=="atkbd", \
   IMPORT{builtin}="hwdb 'evdev:atkbd:$attr{[dmi/id]modalias}'", \
   RUN{builtin}+="keyboard", GOTO="evdev_end"
 
+# device matching the input device name + properties + the machine's DMI data
+KERNELS=="input*", IMPORT{builtin}="hwdb 'evdev:name:$attr{name}:phys:$attr{phys}:ev:$attr{capabilities/ev}:$attr{[dmi/id]modalias}'", \
+  RUN{builtin}+="keyboard", GOTO="evdev_end"
+
 # device matching the input device name and the machine's DMI data
 KERNELS=="input*", IMPORT{builtin}="hwdb 'evdev:name:$attr{name}:$attr{[dmi/id]modalias}'", \
   RUN{builtin}+="keyboard", GOTO="evdev_end"
diff --git a/rules/60-input-id.rules b/rules/60-input-id.rules
new file mode 100644 (file)
index 0000000..dee4219
--- /dev/null
@@ -0,0 +1,7 @@
+# do not edit this file, it will be overwritten on update
+
+ACTION=="remove", GOTO="id_input_end"
+
+SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id"
+
+LABEL="id_input_end"
index 607144b..91efbe7 100644 (file)
@@ -3,6 +3,8 @@
 ACTION=="remove", GOTO="persistent_input_end"
 SUBSYSTEM!="input", GOTO="persistent_input_end"
 SUBSYSTEMS=="bluetooth", ENV{ID_BUS}="bluetooth", GOTO="persistent_input_end"
+# Bluetooth devices don't always have the bluetooth subsystem
+ATTRS{id/bustype}=="0005", ENV{ID_BUS}="bluetooth", GOTO="persistent_input_end"
 SUBSYSTEMS=="rmi4", ENV{ID_BUS}="rmi", GOTO="persistent_input_end"
 SUBSYSTEMS=="serio", ENV{ID_BUS}="i8042", GOTO="persistent_input_end"
 
index d7bbbf9..d2745f6 100644 (file)
@@ -7,7 +7,7 @@ ACTION=="remove", GOTO="persistent_storage_end"
 ENV{UDEV_DISABLE_PERSISTENT_STORAGE_RULES_FLAG}=="1", 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*|xvd*|bcache*|cciss*|dasd*|ubd*|scm*|pmem*", GOTO="persistent_storage_end"
+KERNEL!="loop*|mmcblk*[0-9]|msblk*[0-9]|mspblk*[0-9]|nvme*|sd*|sr*|vd*|xvd*|bcache*|cciss*|dasd*|ubd*|scm*|pmem*|nbd*", GOTO="persistent_storage_end"
 
 # ignore partitions that span the entire disk
 TEST=="whole_disk", GOTO="persistent_storage_end"
@@ -19,6 +19,13 @@ ENV{DEVTYPE}=="partition", IMPORT{parent}="ID_*"
 KERNEL=="nvme*[0-9]n*[0-9]", ATTR{wwid}=="?*", SYMLINK+="disk/by-id/nvme-$attr{wwid}"
 KERNEL=="nvme*[0-9]n*[0-9]p*[0-9]", ENV{DEVTYPE}=="partition", ATTRS{wwid}=="?*", SYMLINK+="disk/by-id/nvme-$attr{wwid}-part%n"
 
+KERNEL=="nvme*[0-9]n*[0-9]", ENV{DEVTYPE}=="disk", ATTRS{serial}=="?*", ENV{ID_SERIAL_SHORT}="$attr{serial}"
+KERNEL=="nvme*[0-9]n*[0-9]", ENV{DEVTYPE}=="disk", ATTRS{wwid}=="?*", ENV{ID_WWN}="$attr{wwid}"
+KERNEL=="nvme*[0-9]n*[0-9]", ENV{DEVTYPE}=="disk", ATTRS{model}=="?*", ENV{ID_SERIAL_SHORT}=="?*", ENV{ID_SERIAL}="$attr{model}_$env{ID_SERIAL_SHORT}", SYMLINK+="disk/by-id/nvme-$env{ID_SERIAL}"
+
+KERNEL=="nvme*[0-9]n*[0-9]p*[0-9]", ENV{DEVTYPE}=="partition", ATTRS{serial}=="?*", ENV{ID_SERIAL_SHORT}="$attr{serial}"
+KERNEL=="nvme*[0-9]n*[0-9]p*[0-9]", ENV{DEVTYPE}=="partition", ATTRS{model}=="?*", ENV{ID_SERIAL_SHORT}=="?*", ENV{ID_SERIAL}="$attr{model}_$env{ID_SERIAL_SHORT}", SYMLINK+="disk/by-id/nvme-$env{ID_SERIAL}-part%n"
+
 # virtio-blk
 KERNEL=="vd*[!0-9]", ATTRS{serial}=="?*", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="disk/by-id/virtio-$env{ID_SERIAL}"
 KERNEL=="vd*[0-9]", ATTRS{serial}=="?*", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="disk/by-id/virtio-$env{ID_SERIAL}-part%n"
@@ -48,7 +55,7 @@ KERNEL=="sd*[0-9]", ATTRS{ieee1394_id}=="?*", SYMLINK+="disk/by-id/ieee1394-$att
 # MMC
 KERNEL=="mmcblk[0-9]", SUBSYSTEMS=="mmc", ATTRS{name}=="?*", ATTRS{serial}=="?*", \
   ENV{ID_NAME}="$attr{name}", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="disk/by-id/mmc-$env{ID_NAME}_$env{ID_SERIAL}"
-KERNEL=="mmcblk[0-9]p[0-9]", ENV{ID_NAME}=="?*", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/mmc-$env{ID_NAME}_$env{ID_SERIAL}-part%n"
+KERNEL=="mmcblk[0-9]p[0-9]*", ENV{ID_NAME}=="?*", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/mmc-$env{ID_NAME}_$env{ID_SERIAL}-part%n"
 
 # Memstick
 KERNEL=="msblk[0-9]|mspblk[0-9]", SUBSYSTEMS=="memstick", ATTRS{name}=="?*", ATTRS{serial}=="?*", \
@@ -57,9 +64,14 @@ KERNEL=="msblk[0-9]p[0-9]|mspblk[0-9]p[0-9]", ENV{ID_NAME}=="?*", ENV{ID_SERIAL}
 
 # by-path
 ENV{DEVTYPE}=="disk", DEVPATH!="*/virtual/*", IMPORT{builtin}="path_id"
-ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}"
+KERNEL=="mmcblk[0-9]boot[0-9]", ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-boot%n"
+KERNEL!="mmcblk[0-9]boot[0-9]", ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}"
 ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-part%n"
 
+# legacy virtio-pci by-path links (deprecated)
+KERNEL=="vd*[!0-9]", ENV{ID_PATH}=="pci-*", SYMLINK+="disk/by-path/virtio-$env{ID_PATH}"
+KERNEL=="vd*[0-9]", ENV{ID_PATH}=="pci-*", SYMLINK+="disk/by-path/virtio-$env{ID_PATH}-part%n"
+
 # probe filesystem metadata of optical drives which have a media inserted
 KERNEL=="sr*", ENV{DISK_EJECT_REQUEST}!="?*", ENV{ID_CDROM_MEDIA_TRACK_COUNT_DATA}=="?*", ENV{ID_CDROM_MEDIA_SESSION_LAST_OFFSET}=="?*", \
   IMPORT{builtin}="blkid --offset=$env{ID_CDROM_MEDIA_SESSION_LAST_OFFSET}"
@@ -82,7 +94,4 @@ ENV{DEVTYPE}=="partition", ENV{ID_WWN_WITH_EXTENSION}=="?*", SYMLINK+="disk/by-i
 ENV{ID_PART_ENTRY_UUID}=="?*", SYMLINK+="disk/by-partuuid/$env{ID_PART_ENTRY_UUID}"
 ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_NAME}=="?*", SYMLINK+="disk/by-partlabel/$env{ID_PART_ENTRY_NAME}"
 
-# add symlink to GPT root disk
-ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_GPT_AUTO_ROOT}=="1", SYMLINK+="gpt-auto-root"
-
 LABEL="persistent_storage_end"
diff --git a/rules/60-sensor.rules b/rules/60-sensor.rules
new file mode 100644 (file)
index 0000000..7ad2c36
--- /dev/null
@@ -0,0 +1,18 @@
+# do not edit this file, it will be overwritten on update
+
+ACTION=="remove", GOTO="sensor_end"
+
+# device matching the sensor's name and the machine's DMI data for IIO devices
+SUBSYSTEM=="iio", KERNEL=="iio*", SUBSYSTEMS=="usb|i2c", \
+  IMPORT{builtin}="hwdb 'sensor:modalias:$attr{modalias}:$attr{[dmi/id]modalias}'", \
+  GOTO="sensor_end"
+
+SUBSYSTEM=="input", ENV{ID_INPUT_ACCELEROMETER}=="1", SUBSYSTEMS=="acpi", \
+  IMPORT{builtin}="hwdb 'sensor:modalias:acpi:$attr{hid}:$attr{[dmi/id]modalias}'", \
+  GOTO="sensor_end"
+
+SUBSYSTEM=="input", ENV{ID_INPUT_ACCELEROMETER}=="1", SUBSYSTEMS=="platform", \
+  IMPORT{builtin}="hwdb 'sensor:modalias:platform:$id:$attr{[dmi/id]modalias}'", \
+  GOTO="sensor_end"
+
+LABEL="sensor_end"
diff --git a/rules/70-joystick.rules b/rules/70-joystick.rules
new file mode 100644 (file)
index 0000000..b80d203
--- /dev/null
@@ -0,0 +1,12 @@
+# do not edit this file, it will be overwritten on update
+
+ACTION=="remove", GOTO="joystick_end"
+ENV{ID_INPUT_JOYSTICK}=="", GOTO="joystick_end"
+KERNEL!="event*", GOTO="joystick_end"
+
+# joystick:<bustype>:v<vid>p<pid>:name:<name>:*
+KERNELS=="input*", ENV{ID_BUS}!="", \
+        IMPORT{builtin}="hwdb 'joystick:$env{ID_BUS}:v$attr{id/vendor}p$attr{id/product}:name:$attr{name}:'", \
+        GOTO="joystick_end"
+
+LABEL="joystick_end"
index 04740e8..f2fc277 100644 (file)
@@ -48,6 +48,13 @@ SUBSYSTEMS=="firewire", ATTRS{guid}=="?*", \
 SUBSYSTEMS=="firewire", GOTO="skip_pci"
 
 SUBSYSTEMS=="pci", ENV{ID_BUS}="pci", ENV{ID_VENDOR_ID}="$attr{vendor}", ENV{ID_MODEL_ID}="$attr{device}"
+SUBSYSTEMS=="pci", GOTO="skip_pci"
+
+# If we reach here, the device nor any of its parents are USB/PCI/firewire bus devices.
+# If we now find a parent that is a platform device, assume that we're working with
+# an internal sound card.
+SUBSYSTEMS=="platform", ENV{SOUND_FORM_FACTOR}="internal", GOTO="sound_end"
+
 LABEL="skip_pci"
 
 # Define ID_ID if ID_BUS and ID_SERIAL are set. This will work for both
index 3aac67c..01e7919 100644 (file)
@@ -10,6 +10,8 @@ ACTION=="remove", GOTO="systemd_end"
 SUBSYSTEM=="tty", KERNEL=="tty[a-zA-Z]*|hvc*|xvc*|hvsi*|ttysclp*|sclp_line*|3270/tty[0-9]*", TAG+="systemd"
 KERNEL=="vport*", TAG+="systemd"
 
+SUBSYSTEM=="ubi", TAG+="systemd"
+
 SUBSYSTEM=="block", TAG+="systemd"
 SUBSYSTEM=="block", ACTION=="add", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", ENV{SYSTEMD_READY}="0"
 
@@ -17,6 +19,11 @@ SUBSYSTEM=="block", ACTION=="add", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", E
 # we are probably still calling mke2fs or mkswap on it.
 SUBSYSTEM=="block", ENV{DM_UUID}=="CRYPT-*", ENV{ID_PART_TABLE_TYPE}=="", ENV{ID_FS_USAGE}=="", ENV{SYSTEMD_READY}="0"
 
+# add symlink to GPT root disk
+SUBSYSTEM=="block", ENV{ID_PART_GPT_AUTO_ROOT}=="1", ENV{ID_FS_TYPE}!="crypto_LUKS", SYMLINK+="gpt-auto-root"
+SUBSYSTEM=="block", ENV{ID_PART_GPT_AUTO_ROOT}=="1", ENV{ID_FS_TYPE}=="crypto_LUKS", SYMLINK+="gpt-auto-root-luks"
+SUBSYSTEM=="block", ENV{DM_UUID}=="CRYPT-*", ENV{DM_NAME}=="root", SYMLINK+="gpt-auto-root"
+
 # Ignore raid devices that are not yet assembled and started
 SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", KERNEL=="md*", TEST!="md/array_state", ENV{SYSTEMD_READY}="0"
 SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", KERNEL=="md*", ATTR{md/array_state}=="|clear|inactive", ENV{SYSTEMD_READY}="0"
diff --git a/rules/meson.build b/rules/meson.build
new file mode 100644 (file)
index 0000000..90a55eb
--- /dev/null
@@ -0,0 +1,40 @@
+rules = files('''
+        55-udev-smack-default.rules
+        60-block.rules
+        60-cdrom_id.rules
+        60-drm.rules
+        60-evdev.rules
+        60-input-id.rules
+        60-persistent-alsa.rules
+        60-persistent-input.rules
+        60-persistent-storage.rules
+        60-persistent-storage-tape.rules
+        60-persistent-v4l.rules
+        60-sensor.rules
+        60-serial.rules
+        64-btrfs.rules
+        70-mouse.rules
+        70-touchpad.rules
+        75-net-description.rules
+        75-probe_mtd.rules
+        78-sound-card.rules
+        80-drivers.rules
+        80-net-setup-link.rules
+'''.split())
+
+install_data(rules,
+             install_dir : udevrulesdir)
+
+rules_in = '''
+        50-udev-default.rules
+        99-systemd.rules
+'''.split()
+
+foreach file : rules_in
+        gen = configure_file(
+                input : file + '.in',
+                output : file,
+                configuration : substs)
+        install_data(gen,
+                     install_dir : udevrulesdir)
+endforeach
index 6091677..87fe473 100644 (file)
@@ -37,7 +37,8 @@ __journal_fields=(MESSAGE{,_ID} PRIORITY CODE_{FILE,LINE,FUNC}
 _coredumpctl() {
         local i verb comps
         local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
-        local OPTS='-h --help --version --no-pager --no-legend -o --output -F --field -1'
+        local OPTS='-h --help --version --no-pager --no-legend -o --output -F --field -1
+                    -r --reverse -S --since -U --until'
 
         local -A VERBS=(
             [LIST]='list'
index 6a25218..7cf8b6f 100644 (file)
@@ -52,7 +52,7 @@ _hostnamectl() {
         if [[ -z $verb ]]; then
                 comps=${VERBS[*]}
         elif __contains_word "$verb" ${VERBS[CHASSIS]}; then
-                comps='desktop laptop server tablet handset watch embedded vm container'
+                comps='desktop laptop convertible server tablet handset watch embedded vm container'
         elif __contains_word "$verb" ${VERBS[STANDALONE]} ${VERBS[ICONS]} ${VERBS[NAME]}; then
                 comps=''
         fi
index 53bedcd..c90a114 100644 (file)
@@ -42,10 +42,10 @@ _journalctl() {
                               --version --list-catalog --update-catalog --list-boots
                               --show-cursor --dmesg -k --pager-end -e -r --reverse
                               --utc -x --catalog --no-full --force --dump-catalog
-                              --flush --rotate --sync'
+                              --flush --rotate --sync --no-hostname'
                        [ARG]='-b --boot --this-boot -D --directory --file -F --field
                               -M --machine -o --output -u --unit --user-unit -p --priority
-                              --vacuum-size --vacuum-time'
+                              --vacuum-size --vacuum-time --vacuum-files'
                 [ARGUNKNOWN]='-c --cursor --interval -n --lines -S --since -U --until
                               --after-cursor --verify-key -t --identifier
                               --root'
@@ -65,7 +65,7 @@ _journalctl() {
                                 compopt -o filenames
                         ;;
                         --output|-o)
-                                comps='short short-iso short-precise short-monotonic verbose export json json-pretty json-sse cat'
+                                comps='short short-full short-iso short-precise short-monotonic short-unix verbose export json json-pretty json-sse cat'
                         ;;
                         --field|-F)
                                 comps=$(journalctl --fields | sort 2>/dev/null)
@@ -82,6 +82,9 @@ _journalctl() {
                         --user-unit)
                                 comps=$(journalctl -F '_SYSTEMD_USER_UNIT' 2>/dev/null)
                         ;;
+                        --identifier|-t)
+                                comps=$(journalctl -F 'SYSLOG_IDENTIFIER' 2>/dev/null)
+                        ;;
                         *)
                                 return 0
                         ;;
diff --git a/shell-completion/bash/meson.build b/shell-completion/bash/meson.build
new file mode 100644 (file)
index 0000000..9399661
--- /dev/null
@@ -0,0 +1,50 @@
+bashcompletiondir = get_option('bashcompletiondir')
+if bashcompletiondir == ''
+        bash_completion = dependency('bash-completion', required : false)
+        if bash_completion.found()
+                bashcompletiondir = bash_completion.get_pkgconfig_variable('completionsdir')
+        else
+                bashcompletiondir = join_paths(datadir, 'bash-completion/completions')
+        endif
+
+        message('bash completions: @0@'.format(bashcompletiondir))
+endif
+
+if bashcompletiondir != 'no'
+        bash_systemctl = configure_file(
+                input : 'systemctl.in',
+                output : 'systemctl',
+                configuration : substs)
+
+        items = [['busctl',              ''],
+                 ['journalctl',          ''],
+                 ['systemd-analyze',     ''],
+                 ['systemd-cat',         ''],
+                 ['systemd-cgls',        ''],
+                 ['systemd-cgtop',       ''],
+                 ['systemd-delta',       ''],
+                 ['systemd-detect-virt', ''],
+                 ['systemd-nspawn',      ''],
+                 ['systemd-path',        ''],
+                 ['systemd-run',         ''],
+                 ['udevadm',             ''],
+                 ['kernel-install',      ''],
+                 [bash_systemctl,        ''],
+                 ['bootctl',             'ENABLE_EFI'],
+                 ['coredumpctl',         'ENABLE_COREDUMP'],
+                 ['hostnamectl',         'ENABLE_HOSTNAMED'],
+                 ['localectl',           'ENABLE_LOCALED'],
+                 ['loginctl',            'ENABLE_LOGIND'],
+                 ['machinectl',          'ENABLE_MACHINED'],
+                 ['networkctl',          'ENABLE_NETWORKD'],
+                 ['systemd-resolve',     'ENABLE_RESOLVED'],
+                 ['timedatectl',         'ENABLE_TIMEDATED'],
+                ]
+
+        foreach item : items
+                if item[1] == '' or conf.get(item[1], false)
+                        install_data(item[0],
+                                     install_dir : bashcompletiondir)
+                endif
+        endforeach
+endif
index 942c7e1..68e3338 100644 (file)
@@ -36,7 +36,7 @@ _networkctl() {
         )
 
         local -A VERBS=(
-                [STANDALONE]='list lldp'
+                [STANDALONE]='list lldp label'
                 [LINKS]='status'
         )
 
index 6f2b3f1..0398d09 100644 (file)
@@ -19,7 +19,7 @@
 
 __systemctl() {
         local mode=$1; shift 1
-        systemctl $mode --full --no-legend "$@"
+        systemctl $mode --full --no-legend "$@" 2>/dev/null
 }
 
 __systemd_properties() {
@@ -41,7 +41,7 @@ __contains_word () {
 __filter_units_by_property () {
         local mode=$1 property=$2 value=$3 ; shift 3
         local units=("$@")
-        local props
+        local props i
         IFS=$'\n' read -rd '' -a props < \
             <(__systemctl $mode show --property "$property" -- "${units[@]}")
         for ((i=0; $i < ${#units[*]}; i++)); do
@@ -51,6 +51,33 @@ __filter_units_by_property () {
         done
 }
 
+__filter_units_by_properties () {
+        local mode=$1 properties=$2 values=$3 ; shift 3
+        local units=("$@")
+        local props i j conditions=()
+        IFS=$'\n' read -rd '' -a props < \
+            <(__systemctl $mode show --property "$properties" -- "${units[@]}")
+        IFS=$',' read -r -a properties < <(echo $properties)
+        IFS=$',' read -r -a values < <(echo $values)
+        for ((i=0; i < ${#properties[*]}; i++)); do
+                for ((j=0; j < ${#properties[*]}; j++)); do
+                        if [[ ${props[i]%%=*} == ${properties[j]} ]]; then
+                                conditions+=( "${properties[j]}=${values[j]}" )
+                        fi
+                done
+        done
+        for ((i=0; i < ${#units[*]}; i++)); do
+                for ((j=0; j < ${#conditions[*]}; j++)); do
+                        if [[ "${props[ i * ${#conditions[*]} + j]}" != "${conditions[j]}" ]]; then
+                                break
+                        fi
+                done
+                if (( j == ${#conditions[*]} )); then
+                        echo " ${units[i]}"
+                fi
+        done
+}
+
 __get_all_units      () { { __systemctl $1 list-unit-files; __systemctl $1 list-units --all; } \
         | { while read -r a b; do [[ $a =~ @\. ]] || echo " $a"; done; }; }
 __get_template_names () { __systemctl $1 list-unit-files \
@@ -60,12 +87,12 @@ __get_active_units   () { __systemctl $1 list-units       \
         | { while read -r a b; do echo " $a"; done; }; }
 __get_startable_units () {
         # find startable inactive units
-        __filter_units_by_property $mode ActiveState inactive $(
-            __filter_units_by_property $mode CanStart yes $(
-                __systemctl $mode list-unit-files --state enabled,disabled,static | \
-                    { while read -r a b; do [[ $a =~ @\. ]] || echo " $a"; done; }
-                __systemctl $mode list-units --state inactive,failed | \
-                    { while read -r a b; do echo " $a"; done; } ))
+        __filter_units_by_properties $mode ActiveState,CanStart inactive,yes $(
+            { __systemctl $mode list-unit-files --state enabled,enabled-runtime,linked,linked-runtime,static,indirect,disabled,generated,transient | \
+                      { while read -r a b; do [[ $a =~ @\. ]] || echo " $a"; done; }
+              __systemctl $mode list-units --state inactive,failed | \
+                      { while read -r a b c; do [[ $b == "loaded" ]] && echo " $a"; done; }
+            } | sort -u )
 }
 __get_restartable_units () {
         # filter out masked and not-found
@@ -97,9 +124,9 @@ _systemctl () {
 
         local -A OPTS=(
                [STANDALONE]='--all -a --reverse --after --before --defaults --force -f --full -l --global
-                             --help -h --no-ask-password --no-block --no-legend --no-pager --no-reload --no-wall
+                             --help -h --no-ask-password --no-block --no-legend --no-pager --no-reload --no-wall --now
                              --quiet -q --privileged -P --system --user --version --runtime --recursive -r --firmware-setup
-                             --show-types -i --ignore-inhibitors --plain'
+                             --show-types -i --ignore-inhibitors --plain --failed'
                       [ARG]='--host -H --kill-who --property -p --signal -s --type -t --state --job-mode --root
                              --preset-mode -n --lines -o --output -M --machine'
         )
@@ -145,7 +172,7 @@ _systemctl () {
                                 comps='full enable-only disable-only'
                         ;;
                         --output|-o)
-                                comps='short short-iso short-precise short-monotonic verbose export json
+                                comps='short short-full short-iso short-iso-precise short-precise short-monotonic short-unix verbose export json
                                        json-pretty json-sse cat'
                         ;;
                         --machine|-M)
@@ -162,7 +189,7 @@ _systemctl () {
         fi
 
         local -A VERBS=(
-                [ALL_UNITS]='is-active is-failed is-enabled status show cat mask preset help list-dependencies edit set-property'
+                [ALL_UNITS]='is-active is-failed is-enabled status show cat mask preset help list-dependencies edit set-property revert'
             [ENABLED_UNITS]='disable'
            [DISABLED_UNITS]='enable'
         [REENABLABLE_UNITS]='reenable'
index 7a5f46b..92ff13d 100644 (file)
@@ -45,6 +45,7 @@ _systemd_analyze() {
                 [DOT]='dot'
                 [LOG_LEVEL]='set-log-level'
                 [VERIFY]='verify'
+                [SECCOMP_FILTER]='syscall-filter'
         )
 
         _init_completion || return
@@ -100,6 +101,11 @@ _systemd_analyze() {
                         comps='debug info notice warning err crit alert emerg'
                 fi
 
+        elif __contains_word "$verb" ${VERBS[SECCOMP_FILTER]}; then
+                if [[ $cur = -* ]]; then
+                        comps='--help --version'
+                fi
+
         elif __contains_word "$verb" ${VERBS[VERIFY]}; then
                 if [[ $cur = -* ]]; then
                         comps='--help --version --system --user --man'
index 0c501c9..f59482f 100644 (file)
@@ -36,8 +36,8 @@ _systemd-resolve() {
         local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
         local -A OPTS=(
                [STANDALONE]='-h --help --version -4 -6
-                             --service --openpgp --tlsa --statistics --reset-statistics
-                             --service-address=no --service-txt=no
+                             --service --openpgp --tlsa --status --statistics
+                             --reset-statistics --service-address=no --service-txt=no
                              --cname=no --search=no --legend=no'
                       [ARG]='-i --interface -p --protocol -t --type -c --class'
         )
index 022331e..4116ba7 100644 (file)
@@ -36,7 +36,8 @@ _systemd_run() {
                 -r --remain-after-exit --send-sighup -H --host -M --machine --service-type
                 --on-active --on-boot --on-startup --on-unit-active --on-unit-inactive
                 --on-calendar --timer-property -t --pty -q --quiet --no-block
-                --uid --gid --nice --setenv -p --property --no-ask-password'
+                --uid --gid --nice --setenv -p --property --no-ask-password
+                --wait'
 
     local mode=--system
     local i
index e4c04a6..e469bca 100644 (file)
@@ -32,6 +32,9 @@ _arguments \
     {-o+,--output=}'[Write output to FILE]:output file:_files' \
     {-F+,--field=}'[Show field in list output]:field' \
     '-1[Show information about most recent entry only]' \
+    {-S,--since}'[Print entries since the specified date]' \
+    {-U,--until}'[Print entries until the specified date]' \
+    {-r,--reverse}'[Show the newest entries first]' \
     '--no-pager[Do not pipe output into a pager]' \
     '--no-legend[Do not print the column headers]' \
     {-h,--help}'[Show this help]' \
index 7528e06..8c4a354 100644 (file)
@@ -18,7 +18,7 @@ _hostnamectl_set-icon-name() {
 
 _hostnamectl_set-chassis() {
     if (( CURRENT <= 3 )); then
-        _chassis=( desktop laptop server tablet handset watch embedded vm container )
+        _chassis=( desktop laptop convertible server tablet handset watch embedded vm container )
         _describe chassis _chassis
     else
         _message "no more options"
index 2bee23b..4a78a2e 100644 (file)
@@ -23,7 +23,7 @@ _list_fields() {
 _journal_none() {
     local -a _commands _files _jrnl_none
     # Setting use-cache will slow this down considerably
-    _commands=( ${"$(_call_program commands "$service" -F _EXE 2>/dev/null)"} )
+    _commands=( ${"$(_call_program commands "$service $_sys_service_mgr -F _EXE" 2>/dev/null)"} )
     _jrnl_none='yes'
     _alternative : \
         'files:/dev files:_files -W /dev -P /dev/' \
@@ -33,7 +33,7 @@ _journal_none() {
 
 _journal_fields() {
     local -a _fields cmd
-    cmd=("journalctl" "-F ${@[-1]}" "2>/dev/null" )
+    cmd=("journalctl $_sys_service_mgr" "-F ${@[-1]}" "2>/dev/null" )
     _fields=$(_call_program fields $cmd[@])
     _fields=${_fields//'\'/'\\'}
     _fields=${_fields//':'/'\:'}
@@ -51,6 +51,31 @@ _journal_boots() {
     "bootid:boot ids:compadd -a _bootid"
 }
 
+# Build arguments for "journalctl" to be used in completion.
+# Use both --user and --system modes, they are not exclusive.
+local -a _modes; _modes=(--user --system)
+local -a _modes_with_arg; _modes_with_arg=(--directory -D --file -M --machine --root)
+typeset -a _sys_service_mgr
+local w k v i=0 n=$#words
+while (( i++ < n )); do
+    w=$words[$i]
+    if (( $_modes[(I)$w] )); then
+        _sys_service_mgr+=($w)
+    else
+        # Handle options with arguments. "--key=value" and "--key value".
+        k=${w%%=*}
+        if (( ${_modes_with_arg[(I)$k]} )); then
+            v=${w#*=}
+            if [[ "$k" != "$w" ]]; then
+                # "--key=value" style.
+                _sys_service_mgr+=($w)
+            else
+                # "--key value" style.
+                _sys_service_mgr+=($w ${words[((++i))]})
+            fi
+        fi
+    fi
+done
 _arguments -s \
     {-h,--help}'[Show this help]' \
     '--version[Show package version]' \
@@ -80,10 +105,10 @@ _arguments -s \
     {-F,--field=}'[List all values a certain field takes]:Fields:_list_fields' \
     '--system[Show system and kernel messages]' \
     '--user[Show messages from user services]' \
-    {-M+,--machine=}'[Operate on local container]:machines:_sd_machines' \
-    {-D+,--directory=}'[Show journal files from directory]:directories:_directories' \
-    '--file=[Operate on specified journal files]:file:_files' \
-    '--root=[Operate on catalog hierarchy under specified directory]:directories:_directories' \
+    '(--directory -D -M --machine --root --file)'{-M+,--machine=}'[Operate on local container]:machines:_sd_machines' \
+    '(--directory -D -M --machine --root --file)'{-D+,--directory=}'[Show journal files from directory]:directories:_directories' \
+    '(--directory -D -M --machine --root --file)--root=[Operate on catalog hierarchy under specified directory]:directories:_directories' \
+    '(--directory -D -M --machine --root)*--file=[Operate on specified journal files]:file:_files' \
     '--new-id128[Generate a new 128 Bit ID]' \
     '--header[Show journal header information]' \
     '--disk-usage[Show total disk usage]' \
index 61f173b..acf7463 100644 (file)
@@ -6,6 +6,7 @@ _networkctl_command(){
             'list:List existing links'
            'status:Show information about the specified links'
            'lldp:Show Link Layer Discovery Protocol status'
+           'label:Show address labels'
     )
     if (( CURRENT == 1 )); then
         _describe -t commands 'networkctl command' _networkctl_cmds
index 3836f79..2948f40 100644 (file)
@@ -1,5 +1,5 @@
 #autoload
 
 local -a _output_opts
-_output_opts=(short short-iso short-precise short-monotonic verbose export json json-pretty json-sse cat)
+_output_opts=(short short-full short-iso short-iso-precise short-precise short-monotonic short-unix verbose export json json-pretty json-sse cat)
 _describe -t output 'output mode' _output_opts || compadd "$@"
index 44c31b7..aad700b 100644 (file)
@@ -29,6 +29,8 @@
     "list-unit-files:List installed unit files"
     "enable:Enable one or more unit files"
     "disable:Disable one or more unit files"
+    "add-wants:Add Wants= dependencies to a unit"
+    "add-requires:Add Requires= dependencies to a unit"
     "reenable:Reenable one or more unit files"
     "preset:Enable/disable one or more unit files based on preset configuration"
     "set-default:Set the default target"
@@ -58,6 +60,7 @@
     "kexec:Shut down and reboot the system with kexec"
     "exit:Ask for user instance termination"
     "switch-root:Change root directory"
+    "revert:Revert unit files to their vendor versions"
   )
 
   if (( CURRENT == 1 )); then
 
 __systemctl()
 {
-  systemctl $_sys_service_mgr --full --no-legend --no-pager "$@"
+  systemctl $_sys_service_mgr --full --no-legend --no-pager "$@" 2>/dev/null
 }
 
 
 # Fills the unit list
 _systemctl_all_units()
 {
-  if ( [[ ${+_sys_all_units} -eq 0 ]] || _cache_invalid SYS_ALL_UNITS ) &&
-    ! _retrieve_cache SYS_ALL_UNITS;
+  if ( [[ ${+_sys_all_units} -eq 0 ]] || _cache_invalid SYS_ALL_UNITS$_sys_service_mgr ) ||
+    ! _retrieve_cache SYS_ALL_UNITS$_sys_service_mgr;
   then
     _sys_all_units=( ${${(f)"$(__systemctl list-units --all)"}%% *} )
-    _store_cache SYS_ALL_UNITS _sys_all_units
+    _store_cache SYS_ALL_UNITS$_sys_service_mgr _sys_all_units
   fi
 }
 
@@ -111,27 +114,23 @@ _systemctl_really_all_units()
 {
   local -a all_unit_files;
   local -a really_all_units;
-  if ( [[ ${+_sys_really_all_units} -eq 0 ]] || _cache_invalid SYS_REALLY_ALL_UNITS ) &&
-    ! _retrieve_cache SYS_REALLY_ALL_UNITS;
+  if ( [[ ${+_sys_really_all_units} -eq 0 ]] || _cache_invalid SYS_REALLY_ALL_UNITS$_sys_service_mgr ) ||
+    ! _retrieve_cache SYS_REALLY_ALL_UNITS$_sys_service_mgr;
   then
     all_unit_files=( ${${(f)"$(__systemctl list-unit-files)"}%% *} )
     _systemctl_all_units
     really_all_units=($_sys_all_units $all_unit_files)
     _sys_really_all_units=(${(u)really_all_units})
-    _store_cache SYS_REALLY_ALL_UNITS _sys_really_all_units
+    _store_cache SYS_REALLY_ALL_UNITS$_sys_service_mgr _sys_really_all_units
   fi
 }
 
 _filter_units_by_property() {
-  local property=$1 value=$2 ; shift ; shift
-  local -a units ; units=($*)
-  local props
-  for props in ${(ps:\n\n:)"$(_call_program units "$service show --no-pager --property="Id,$property" -- ${units} 2>/dev/null")"}; do
-    props=(${(f)props})
-    if [[ "${props[2]}" = "$property=$value" ]]; then
-      echo -E - " ${props[1]#Id=}"
-    fi
-  done
+  local property=$1 value=$2; shift 2
+  local -a units; units=("${(q-)@}")
+  local -A props
+  props=(${(f)"$(_call_program units "$service $_sys_service_mgr show --no-pager --property=\"Id,$property\" -- ${units} 2>/dev/null")"})
+  echo -E - "${(@g:o:)${(k@)props[(Re)$property=$value]}#Id=}"
 }
 
 _systemctl_get_template_names() { echo -E - ${^${(M)${(f)"$(__systemctl list-unit-files)"}##*@.[^[:space:]]##}%%@.*}\@ }
@@ -161,7 +160,7 @@ _systemctl_unit_state() { typeset -gA _sys_unit_state; _sys_unit_state=( $(__sys
 
 local fun
 # Completion functions for ALL_UNITS
-for fun in is-active is-failed is-enabled status show cat mask preset help list-dependencies edit ; do
+for fun in is-active is-failed is-enabled status show cat mask preset help list-dependencies edit revert add-wants add-requires ; do
   (( $+functions[_systemctl_$fun] )) || _systemctl_$fun()
   {
     _systemctl_really_all_units
@@ -334,13 +333,13 @@ _unit_types() {
 }
 
 _unit_properties() {
-  if ( [[ ${+_sys_all_properties} -eq 0 ]] || _cache_invalid SYS_ALL_PROPERTIES ) &&
-    ! _retrieve_cache SYS_ALL_PROPERTIES;
+  if ( [[ ${+_sys_all_properties} -eq 0 ]] || _cache_invalid SYS_ALL_PROPERTIES$_sys_service_mgr ) ||
+    ! _retrieve_cache SYS_ALL_PROPERTIES$_sys_service_mgr;
   then
     _sys_all_properties=( ${${(M)${(f)"$(__systemctl show --all;
     @rootlibexecdir@/systemd --dump-configuration-items)"}##[[:alnum:]]##=*}%%=*}
     )
-    _store_cache SYS_ALL_PROPRTIES _sys_all_properties
+    _store_cache SYS_ALL_PROPERTIES$_sys_service_mgr _sys_all_properties
   fi
   _values -s , "${_sys_all_properties[@]}"
 }
@@ -351,8 +350,10 @@ _job_modes() {
     _values -s , "${_modes[@]}"
 }
 
+# Build arguments for "systemctl" to be used in completion.
 local -a _modes; _modes=("--user" "--system")
-local _sys_service_mgr=${${words:*_modes}[(R)(${(j.|.)_modes})]:---system}
+# Use the last mode (they are exclusive and the last one is used).
+local _sys_service_mgr=${${words:*_modes}[(R)(${(j.|.)_modes})]}
 _arguments -s \
     {-h,--help}'[Show help]' \
     '--version[Show package version]' \
@@ -388,4 +389,5 @@ _arguments -s \
     {-o+,--output=}'[Change journal output mode]:modes:_sd_outputmodes' \
     '--firmware-setup[Tell the firmware to show the setup menu on next boot]' \
     '--plain[When used with list-dependencies, print output as a list]' \
+    '--failed[Show failed units]' \
     '*::systemctl command:_systemctl_command'
index efafddc..0e67003 100644 (file)
@@ -21,6 +21,7 @@ _systemd_analyze_command(){
         'dot:Dump dependency graph (in dot(1) format)'
         'dump:Dump server status'
         'set-log-level:Set systemd log threshold'
+        'syscall-filter:List syscalls in seccomp filter'
         'verify:Check unit files for correctness'
     )
 
index 6362b97..5c3e65c 100644 (file)
@@ -51,10 +51,11 @@ _arguments \
         '--nice=[Nice level]:nice level' \
         '--setenv=[Set environment]:NAME=VALUE' \
         '--on-active=[Run after SEC seconds]:SEC' \
-        '--on-boot=[Run after SEC seconds from machine was booted up]:SEC' \
-        '--on-statup=[Run after SEC seconds from systemd was first started]:SEC' \
-        '--on-unit-active=[Run after SEC seconds from the last activation]:SEC' \
-        '--on-unit-inactive=[Run after SEC seconds from the last deactivation]:SEC' \
+        '--on-boot=[Run SEC seconds after machine was booted up]:SEC' \
+        '--on-startup=[Run SEC seconds after systemd was first started]:SEC' \
+        '--on-unit-active=[Run SEC seconds after the last activation]:SEC' \
+        '--on-unit-inactive=[Run SEC seconds after the last deactivation]:SEC' \
         '--on-calendar=[Realtime timer]:SPEC' \
         '--timer-property=[Set timer unit property]:NAME=VALUE' \
+        '--wait=[Wait until service stopped again]' \
         '*::command:_command'
diff --git a/shell-completion/zsh/meson.build b/shell-completion/zsh/meson.build
new file mode 100644 (file)
index 0000000..34408ce
--- /dev/null
@@ -0,0 +1,47 @@
+zshcompletiondir = get_option('zshcompletiondir')
+if zshcompletiondir == ''
+        zshcompletiondir = join_paths(datadir, 'zsh/site-functions')
+
+        message('zsh completions: @0@'.format(zshcompletiondir))
+endif
+
+if zshcompletiondir != 'no'
+        zsh_systemctl = configure_file(
+                input : '_systemctl.in',
+                output : '_systemctl',
+                configuration : substs)
+
+        items = [['_busctl',                   ''],
+                 ['_journalctl',               ''],
+                 ['_systemd-analyze',          ''],
+                 ['_systemd-delta',            ''],
+                 ['_systemd-nspawn',           ''],
+                 ['_systemd',                  ''],
+                 ['_systemd-run',              ''],
+                 ['_udevadm',                  ''],
+                 ['_kernel-install',           ''],
+                 ['_sd_hosts_or_user_at_host', ''],
+                 ['_sd_outputmodes',           ''],
+                 ['_sd_unit_files',            ''],
+                 ['_sd_machines',              ''],
+                 [zsh_systemctl,               ''],
+                 ['_bootctl',                  'ENABLE_EFI'],
+                 ['_coredumpctl',              'ENABLE_COREDUMP'],
+                 ['_hostnamectl',              'ENABLE_HOSTNAMED'],
+                 ['_localectl',                'ENABLE_LOCALED'],
+                 ['_loginctl',                 'ENABLE_LOGIND'],
+                 ['_machinectl',               'ENABLE_MACHINED'],
+                 ['_networkctl',               'ENABLE_NETWORKD'],
+                 ['_systemd-inhibit',          'ENABLE_LOGIND'],
+                 ['_systemd-resolve',          'ENABLE_RESOLVED'],
+                 ['_systemd-tmpfiles',         'ENABLE_TMPFILES'],
+                 ['_timedatectl',              'ENABLE_TIMEDATED'],
+                ]
+
+        foreach item : items
+                if item[1] == '' or conf.get(item[1], false)
+                        install_data(item[0],
+                                     install_dir : zshcompletiondir)
+                endif
+        endforeach
+endif
index a0cfc22..6ebd820 100644 (file)
@@ -339,7 +339,7 @@ static void sigchld_hdl(int sig) {
 
 static int install_chld_handler(void) {
         static const struct sigaction act = {
-                .sa_flags = SA_NOCLDSTOP,
+                .sa_flags = SA_NOCLDSTOP|SA_RESTART,
                 .sa_handler = sigchld_hdl,
         };
 
index 5fd3ee4..0ce0276 100644 (file)
@@ -71,6 +71,7 @@ static int prepare_filename(const char *filename, char **ret) {
 }
 
 static int generate_path(char **var, char **filenames) {
+        const char *old;
         char **filename;
 
         _cleanup_strv_free_ char **ans = NULL;
@@ -90,9 +91,19 @@ static int generate_path(char **var, char **filenames) {
 
         assert_se(strv_uniq(ans));
 
-        r = strv_extend(&ans, "");
-        if (r < 0)
-                return r;
+        /* First, prepend our directories. Second, if some path was specified, use that, and
+         * otherwise use the defaults. Any duplicates will be filtered out in path-lookup.c.
+         * Treat explicit empty path to mean that nothing should be appended.
+         */
+        old = getenv("SYSTEMD_UNIT_PATH");
+        if (!streq_ptr(old, "")) {
+                if (!old)
+                        old = ":";
+
+                r = strv_extend(&ans, old);
+                if (r < 0)
+                        return r;
+        }
 
         *var = strv_join(ans, ":");
         if (!*var)
index cbf9354..1eb2ca0 100644 (file)
@@ -36,6 +36,9 @@
 #include "log.h"
 #include "pager.h"
 #include "parse-util.h"
+#ifdef HAVE_SECCOMP
+#include "seccomp-util.h"
+#endif
 #include "special.h"
 #include "strv.h"
 #include "strxcpyx.h"
@@ -458,6 +461,7 @@ static int acquire_host_info(sd_bus *bus, struct host_info **hi) {
                                    "org.freedesktop.hostname1",
                                    "/org/freedesktop/hostname1",
                                    hostname_map,
+                                   &error,
                                    host);
         if (r < 0)
                 log_debug_errno(r, "Failed to get host information from systemd-hostnamed: %s", bus_error_message(&error, r));
@@ -466,6 +470,7 @@ static int acquire_host_info(sd_bus *bus, struct host_info **hi) {
                                    "org.freedesktop.systemd1",
                                    "/org/freedesktop/systemd1",
                                    manager_map,
+                                   &error,
                                    host);
         if (r < 0)
                 return log_error_errno(r, "Failed to get host information from systemd: %s", bus_error_message(&error, r));
@@ -622,7 +627,7 @@ static int analyze_plot(sd_bus *bus) {
             "<!-- that render these files properly but much slower are ImageMagick,   -->\n"
             "<!-- gimp, inkscape, etc. To display the files on your system, just      -->\n"
             "<!-- point your browser to this file.                                    -->\n\n"
-            "<!-- This plot was generated by systemd-analyze version %-16.16s -->\n\n", VERSION);
+            "<!-- This plot was generated by systemd-analyze version %-16.16s -->\n\n", PACKAGE_VERSION);
 
         /* style sheet */
         svg("<defs>\n  <style type=\"text/css\">\n    <![CDATA[\n"
@@ -1275,36 +1280,94 @@ static int set_log_target(sd_bus *bus, char **args) {
         return 0;
 }
 
+#ifdef HAVE_SECCOMP
+static void dump_syscall_filter(const SyscallFilterSet *set) {
+        const char *syscall;
+
+        printf("%s\n", set->name);
+        printf("    # %s\n", set->help);
+        NULSTR_FOREACH(syscall, set->value)
+                printf("    %s\n", syscall);
+}
+
+static int dump_syscall_filters(char** names) {
+        bool first = true;
+
+        pager_open(arg_no_pager, false);
+
+        if (strv_isempty(names)) {
+                int i;
+
+                for (i = 0; i < _SYSCALL_FILTER_SET_MAX; i++) {
+                        if (!first)
+                                puts("");
+                        dump_syscall_filter(syscall_filter_sets + i);
+                        first = false;
+                }
+        } else {
+                char **name;
+
+                STRV_FOREACH(name, names) {
+                        const SyscallFilterSet *set;
+
+                        if (!first)
+                                puts("");
+
+                        set = syscall_filter_set_find(*name);
+                        if (!set) {
+                                /* make sure the error appears below normal output */
+                                fflush(stdout);
+
+                                log_error("Filter set \"%s\" not found.", *name);
+                                return -ENOENT;
+                        }
+
+                        dump_syscall_filter(set);
+                        first = false;
+                }
+        }
+
+        return 0;
+}
+
+#else
+static int dump_syscall_filters(char** names) {
+        log_error("Not compiled with syscall filters, sorry.");
+        return -EOPNOTSUPP;
+}
+#endif
+
 static void help(void) {
 
         pager_open(arg_no_pager, false);
 
         printf("%s [OPTIONS...] {COMMAND} ...\n\n"
                "Profile systemd, show unit dependencies, check unit files.\n\n"
-               "  -h --help               Show this help\n"
-               "     --version            Show package version\n"
-               "     --no-pager           Do not pipe output into a pager\n"
-               "     --system             Operate on system systemd instance\n"
-               "     --user               Operate on user systemd instance\n"
-               "  -H --host=[USER@]HOST   Operate on remote host\n"
-               "  -M --machine=CONTAINER  Operate on local container\n"
-               "     --order              Show only order in the graph\n"
-               "     --require            Show only requirement in the graph\n"
-               "     --from-pattern=GLOB  Show only origins in the graph\n"
-               "     --to-pattern=GLOB    Show only destinations in the graph\n"
-               "     --fuzz=SECONDS       Also print also services which finished SECONDS\n"
-               "                          earlier than the latest in the branch\n"
-               "     --man[=BOOL]         Do [not] check for existence of man pages\n\n"
+               "  -h --help                Show this help\n"
+               "     --version             Show package version\n"
+               "     --no-pager            Do not pipe output into a pager\n"
+               "     --system              Operate on system systemd instance\n"
+               "     --user                Operate on user systemd instance\n"
+               "  -H --host=[USER@]HOST    Operate on remote host\n"
+               "  -M --machine=CONTAINER   Operate on local container\n"
+               "     --order               Show only order in the graph\n"
+               "     --require             Show only requirement in the graph\n"
+               "     --from-pattern=GLOB   Show only origins in the graph\n"
+               "     --to-pattern=GLOB     Show only destinations in the graph\n"
+               "     --fuzz=SECONDS        Also print also services which finished SECONDS\n"
+               "                           earlier than the latest in the branch\n"
+               "     --man[=BOOL]          Do [not] check for existence of man pages\n\n"
                "Commands:\n"
-               "  time                    Print time spent in the kernel\n"
-               "  blame                   Print list of running units ordered by time to init\n"
-               "  critical-chain          Print a tree of the time critical chain of units\n"
-               "  plot                    Output SVG graphic showing service initialization\n"
-               "  dot                     Output dependency graph in dot(1) format\n"
-               "  set-log-level LEVEL     Set logging threshold for manager\n"
-               "  set-log-target TARGET   Set logging target for manager\n"
-               "  dump                    Output state serialization of service manager\n"
-               "  verify FILE...          Check unit files for correctness\n"
+               "  time                     Print time spent in the kernel\n"
+               "  blame                    Print list of running units ordered by time to init\n"
+               "  critical-chain           Print a tree of the time critical chain of units\n"
+               "  plot                     Output SVG graphic showing service initialization\n"
+               "  dot                      Output dependency graph in man:dot(1) format\n"
+               "  set-log-level LEVEL      Set logging threshold for manager\n"
+               "  set-log-target TARGET    Set logging target for manager\n"
+               "  dump                     Output state serialization of service manager\n"
+               "  syscall-filter [NAME...] Print list of syscalls in seccomp filter\n"
+               "  verify FILE...           Check unit files for correctness\n"
                , program_invocation_short_name);
 
         /* When updating this list, including descriptions, apply
@@ -1471,6 +1534,8 @@ int main(int argc, char *argv[]) {
                         r = set_log_level(bus, argv+optind+1);
                 else if (streq(argv[optind], "set-log-target"))
                         r = set_log_target(bus, argv+optind+1);
+                else if (streq(argv[optind], "syscall-filter"))
+                        r = dump_syscall_filters(argv+optind+1);
                 else
                         log_error("Unknown operation '%s'.", argv[optind]);
         }
diff --git a/src/analyze/meson.build b/src/analyze/meson.build
new file mode 100644 (file)
index 0000000..fcbd814
--- /dev/null
@@ -0,0 +1,5 @@
+systemd_analyze_sources = files('''
+        analyze.c
+        analyze-verify.c
+        analyze-verify.h
+'''.split())
index 45be135..c909b5b 100644 (file)
@@ -167,7 +167,7 @@ static bool validate_device(struct udev *udev, struct udev_device *device) {
                         continue;
 
                 v = udev_device_get_sysattr_value(other, "type");
-                if (!streq_ptr(v, "platform") && !streq_ptr(v, "firmware"))
+                if (!STRPTR_IN_SET(v, "platform", "firmware"))
                         continue;
 
                 /* OK, so there's another backlight device, and it's a
@@ -357,9 +357,9 @@ int main(int argc, char *argv[]) {
                         return EXIT_FAILURE;
                 }
 
-                saved = strjoin("/var/lib/systemd/backlight/", escaped_path_id, ":", escaped_ss, ":", escaped_sysname, NULL);
+                saved = strjoin("/var/lib/systemd/backlight/", escaped_path_id, ":", escaped_ss, ":", escaped_sysname);
         } else
-                saved = strjoin("/var/lib/systemd/backlight/", escaped_ss, ":", escaped_sysname, NULL);
+                saved = strjoin("/var/lib/systemd/backlight/", escaped_ss, ":", escaped_sysname);
 
         if (!saved) {
                 log_oom();
index 9020793..a282a21 100644 (file)
@@ -69,9 +69,9 @@ uint32_t MurmurHash2 ( const void * key, int len, uint32_t seed )
 
   switch(len)
   {
-  case 3: h ^= data[2] << 16;
-  case 2: h ^= data[1] << 8;
-  case 1: h ^= data[0];
+  case 3: h ^= data[2] << 16; /* fall through */
+  case 2: h ^= data[1] << 8;  /* fall through */
+  case 1: h ^= data[0];       /* fall through */
       h *= m;
   };
 
index 3fac9c5..4b291d1 100644 (file)
@@ -23,7 +23,7 @@
 #include "af-list.h"
 #include "macro.h"
 
-static const struct af_name* lookup_af(register const char *str, register unsigned int len);
+static const struct af_name* lookup_af(register const char *str, register GPERF_LEN_TYPE len);
 
 #include "af-from-name.h"
 #include "af-to-name.h"
diff --git a/src/basic/af-to-name.awk b/src/basic/af-to-name.awk
new file mode 100644 (file)
index 0000000..18d0a89
--- /dev/null
@@ -0,0 +1,9 @@
+BEGIN{
+        print "static const char* const af_names[] = { "
+}
+!/AF_FILE/ && !/AF_ROUTE/ && !/AF_LOCAL/ {
+        printf "        [%s] = \"%s\",\n", $1, $1
+}
+END{
+        print "};"
+}
index ceeee51..a44dd47 100644 (file)
@@ -43,6 +43,14 @@ static inline void *mfree(void *memory) {
         return NULL;
 }
 
+#define free_and_replace(a, b)                  \
+        ({                                      \
+                free(a);                        \
+                (a) = (b);                      \
+                (b) = NULL;                     \
+                0;                              \
+        })
+
 void* memdup(const void *p, size_t l) _alloc_(2);
 
 static inline void freep(void *p) {
index b1c8e91..2518dd8 100644 (file)
@@ -123,6 +123,18 @@ int uname_architecture(void) {
                 { "crisv32",    ARCHITECTURE_CRIS     },
 #elif defined(__nios2__)
                 { "nios2",      ARCHITECTURE_NIOS2    },
+#elif defined(__riscv__) || defined(__riscv)
+        /* __riscv__ is obsolete, remove in 2018 */
+                { "riscv32",    ARCHITECTURE_RISCV32  },
+                { "riscv64",    ARCHITECTURE_RISCV64  },
+#  if __SIZEOF_POINTER__ == 4
+                { "riscv",      ARCHITECTURE_RISCV32  },
+#  elif __SIZEOF_POINTER__ == 8
+                { "riscv",      ARCHITECTURE_RISCV64  },
+#  endif
+#elif defined(__arc__)
+                { "arc",        ARCHITECTURE_ARC      },
+                { "arceb",      ARCHITECTURE_ARC_BE   },
 #else
 #error "Please register your architecture here!"
 #endif
@@ -174,6 +186,10 @@ static const char *const architecture_table[_ARCHITECTURE_MAX] = {
         [ARCHITECTURE_TILEGX] = "tilegx",
         [ARCHITECTURE_CRIS] = "cris",
         [ARCHITECTURE_NIOS2] = "nios2",
+        [ARCHITECTURE_RISCV32] = "riscv32",
+        [ARCHITECTURE_RISCV64] = "riscv64",
+        [ARCHITECTURE_ARC] = "arc",
+        [ARCHITECTURE_ARC_BE] = "arc-be",
 };
 
 DEFINE_STRING_TABLE_LOOKUP(architecture, int);
index b3e4d85..40a2ce6 100644 (file)
@@ -58,6 +58,10 @@ enum {
         ARCHITECTURE_TILEGX,
         ARCHITECTURE_CRIS,
         ARCHITECTURE_NIOS2,
+        ARCHITECTURE_RISCV32,
+        ARCHITECTURE_RISCV64,
+        ARCHITECTURE_ARC,
+        ARCHITECTURE_ARC_BE,
         _ARCHITECTURE_MAX,
         _ARCHITECTURE_INVALID = -1
 };
@@ -77,7 +81,11 @@ int uname_architecture(void);
 
 #if defined(__x86_64__)
 #  define native_architecture() ARCHITECTURE_X86_64
-#  define LIB_ARCH_TUPLE "x86_64-linux-gnu"
+#  if defined(__ILP32__)
+#    define LIB_ARCH_TUPLE "x86_64-linux-gnux32"
+#  else
+#    define LIB_ARCH_TUPLE "x86_64-linux-gnu"
+#  endif
 #  define SECONDARY_ARCHITECTURE ARCHITECTURE_X86
 #elif defined(__i386__)
 #  define native_architecture() ARCHITECTURE_X86
@@ -95,7 +103,11 @@ int uname_architecture(void);
 #elif defined(__powerpc__)
 #  if __BYTE_ORDER == __BIG_ENDIAN
 #    define native_architecture() ARCHITECTURE_PPC
-#    define LIB_ARCH_TUPLE "powerpc-linux-gnu"
+#    if defined(__NO_FPRS__)
+#      define LIB_ARCH_TUPLE "powerpc-linux-gnuspe"
+#    else
+#      define LIB_ARCH_TUPLE "powerpc-linux-gnu"
+#    endif
 #  else
 #    define native_architecture() ARCHITECTURE_PPC_LE
 #    error "Missing LIB_ARCH_TUPLE for PPCLE"
@@ -122,13 +134,21 @@ int uname_architecture(void);
 #elif defined(__sparc__)
 #  define native_architecture() ARCHITECTURE_SPARC
 #  define LIB_ARCH_TUPLE "sparc-linux-gnu"
-#elif defined(__mips64__)
+#elif defined(__mips64) && defined(__LP64__)
 #  if __BYTE_ORDER == __BIG_ENDIAN
 #    define native_architecture() ARCHITECTURE_MIPS64
-#    error "Missing LIB_ARCH_TUPLE for MIPS64"
+#    define LIB_ARCH_TUPLE "mips64-linux-gnuabi64"
 #  else
 #    define native_architecture() ARCHITECTURE_MIPS64_LE
-#    error "Missing LIB_ARCH_TUPLE for MIPS64_LE"
+#    define LIB_ARCH_TUPLE "mips64el-linux-gnuabi64"
+#  endif
+#elif defined(__mips64)
+#  if __BYTE_ORDER == __BIG_ENDIAN
+#    define native_architecture() ARCHITECTURE_MIPS64
+#    define LIB_ARCH_TUPLE "mips64-linux-gnuabin32"
+#  else
+#    define native_architecture() ARCHITECTURE_MIPS64_LE
+#    define LIB_ARCH_TUPLE "mips64el-linux-gnuabin32"
 #  endif
 #elif defined(__mips__)
 #  if __BYTE_ORDER == __BIG_ENDIAN
@@ -148,6 +168,7 @@ int uname_architecture(void);
 #  else
 #    define native_architecture() ARCHITECTURE_ARM64
 #    define LIB_ARCH_TUPLE "aarch64-linux-gnu"
+#    define SECONDARY_ARCHITECTURE ARCHITECTURE_ARM
 #  endif
 #elif defined(__arm__)
 #  if __BYTE_ORDER == __BIG_ENDIAN
@@ -178,19 +199,54 @@ int uname_architecture(void);
 #  error "Missing LIB_ARCH_TUPLE for SH64"
 #elif defined(__sh__)
 #  define native_architecture() ARCHITECTURE_SH
-#  define LIB_ARCH_TUPLE "sh4-linux-gnu"
+#  if defined(__SH1__)
+#    define LIB_ARCH_TUPLE "sh1-linux-gnu"
+#  elif defined(__SH2__)
+#    define LIB_ARCH_TUPLE "sh2-linux-gnu"
+#  elif defined(__SH2A__)
+#    define LIB_ARCH_TUPLE "sh2a-linux-gnu"
+#  elif defined(__SH2E__)
+#    define LIB_ARCH_TUPLE "sh2e-linux-gnu"
+#  elif defined(__SH3__)
+#    define LIB_ARCH_TUPLE "sh3-linux-gnu"
+#  elif defined(__SH3E__)
+#    define LIB_ARCH_TUPLE "sh3e-linux-gnu"
+#  elif defined(__SH4__) && !defined(__SH4A__)
+#    define LIB_ARCH_TUPLE "sh4-linux-gnu"
+#  elif defined(__SH4A__)
+#    define LIB_ARCH_TUPLE "sh4a-linux-gnu"
+#  endif
 #elif defined(__m68k__)
 #  define native_architecture() ARCHITECTURE_M68K
 #  define LIB_ARCH_TUPLE "m68k-linux-gnu"
 #elif defined(__tilegx__)
 #  define native_architecture() ARCHITECTURE_TILEGX
-#  error "Missing LIB_ARCH_TUPLE for TILEGX"
+#  define LIB_ARCH_TUPLE "tilegx-linux-gnu"
 #elif defined(__cris__)
 #  define native_architecture() ARCHITECTURE_CRIS
 #  error "Missing LIB_ARCH_TUPLE for CRIS"
 #elif defined(__nios2__)
 #  define native_architecture() ARCHITECTURE_NIOS2
 #  define LIB_ARCH_TUPLE "nios2-linux-gnu"
+#elif defined(__riscv__) || defined(__riscv)
+        /* __riscv__ is obsolete, remove in 2018 */
+#  if __SIZEOF_POINTER__ == 4
+#    define native_architecture() ARCHITECTURE_RISCV32
+#    define LIB_ARCH_TUPLE "riscv32-linux-gnu"
+#  elif __SIZEOF_POINTER__ == 8
+#    define native_architecture() ARCHITECTURE_RISCV64
+#    define LIB_ARCH_TUPLE "riscv64-linux-gnu"
+#  else
+#    error "Unrecognized riscv architecture variant"
+#  endif
+#elif defined(__arc__)
+#  if __BYTE_ORDER == __BIG_ENDIAN
+#    define native_architecture() ARCHITECTURE_ARC_BE
+#    define LIB_ARCH_TUPLE "arceb-linux"
+#  else
+#    define native_architecture() ARCHITECTURE_ARC
+#    define LIB_ARCH_TUPLE "arc-linux"
+#  endif
 #else
 #  error "Please register your architecture here!"
 #endif
index 6792d1e..2d598dc 100644 (file)
@@ -23,7 +23,7 @@
 #include "arphrd-list.h"
 #include "macro.h"
 
-static const struct arphrd_name* lookup_arphrd(register const char *str, register unsigned int len);
+static const struct arphrd_name* lookup_arphrd(register const char *str, register GPERF_LEN_TYPE len);
 
 #include "arphrd-from-name.h"
 #include "arphrd-to-name.h"
diff --git a/src/basic/arphrd-to-name.awk b/src/basic/arphrd-to-name.awk
new file mode 100644 (file)
index 0000000..5a35673
--- /dev/null
@@ -0,0 +1,9 @@
+BEGIN{
+        print "static const char* const arphrd_names[] = { "
+}
+!/CISCO/ {
+        printf "        [ARPHRD_%s] = \"%s\",\n", $1, $1
+}
+END{
+        print "};"
+}
index 5741fec..d1c9695 100644 (file)
@@ -92,8 +92,11 @@ bool use_audit(void) {
                 int fd;
 
                 fd = socket(AF_NETLINK, SOCK_RAW|SOCK_CLOEXEC|SOCK_NONBLOCK, NETLINK_AUDIT);
-                if (fd < 0)
-                        cached_use = errno != EAFNOSUPPORT && errno != EPROTONOSUPPORT;
+                if (fd < 0) {
+                        cached_use = !IN_SET(errno, EAFNOSUPPORT, EPROTONOSUPPORT, EPERM);
+                        if (errno == EPERM)
+                                log_debug_errno(errno, "Audit access prohibited, won't talk to audit");
+                }
                 else {
                         cached_use = true;
                         safe_close(fd);
index f4b12fc..f6212e6 100644 (file)
@@ -58,10 +58,8 @@ Bitmap *bitmap_copy(Bitmap *b) {
                 return NULL;
 
         ret->bitmaps = newdup(uint64_t, b->bitmaps, b->n_bitmaps);
-        if (!ret->bitmaps) {
-                free(ret);
-                return NULL;
-        }
+        if (!ret->bitmaps)
+                return mfree(ret);
 
         ret->n_bitmaps = ret->bitmaps_allocated = b->n_bitmaps;
         return ret;
index 7aa75eb..1b9cace 100644 (file)
@@ -20,7 +20,7 @@
 ***/
 
 #ifdef HAVE_BLKID
-#include <blkid/blkid.h>
+#include <blkid.h>
 #endif
 
 #include "util.h"
index 359d85f..5505499 100644 (file)
@@ -20,6 +20,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <inttypes.h>
+#include <linux/fs.h>
 #include <linux/loop.h>
 #include <stddef.h>
 #include <stdio.h>
@@ -38,6 +39,7 @@
 #include "alloc-util.h"
 #include "btrfs-ctree.h"
 #include "btrfs-util.h"
+#include "chattr-util.h"
 #include "copy.h"
 #include "fd-util.h"
 #include "fileio.h"
@@ -45,6 +47,7 @@
 #include "macro.h"
 #include "missing.h"
 #include "path-util.h"
+#include "rm-rf.h"
 #include "selinux-util.h"
 #include "smack-util.h"
 #include "sparse-endian.h"
@@ -1642,7 +1645,7 @@ static int subvol_snapshot_children(int old_fd, int new_fd, const char *subvolum
                         if (old_child_fd < 0)
                                 return -errno;
 
-                        np = strjoin(subvolume, "/", ino_args.name, NULL);
+                        np = strjoin(subvolume, "/", ino_args.name);
                         if (!np)
                                 return -ENOMEM;
 
@@ -1718,28 +1721,46 @@ int btrfs_subvol_snapshot_fd(int old_fd, const char *new_path, BtrfsSnapshotFlag
         if (r < 0)
                 return r;
         if (r == 0) {
+                bool plain_directory = false;
+
+                /* If the source isn't a proper subvolume, fail unless fallback is requested */
                 if (!(flags & BTRFS_SNAPSHOT_FALLBACK_COPY))
                         return -EISDIR;
 
                 r = btrfs_subvol_make(new_path);
-                if (r < 0)
-                        return r;
+                if (r == -ENOTTY && (flags & BTRFS_SNAPSHOT_FALLBACK_DIRECTORY)) {
+                        /* If the destination doesn't support subvolumes, then use a plain directory, if that's requested. */
+                        if (mkdir(new_path, 0755) < 0)
+                                return r;
 
-                r = copy_directory_fd(old_fd, new_path, true);
-                if (r < 0) {
-                        (void) btrfs_subvol_remove(new_path, BTRFS_REMOVE_QUOTA);
+                        plain_directory = true;
+                } else if (r < 0)
                         return r;
-                }
+
+                r = copy_directory_fd(old_fd, new_path, COPY_MERGE|COPY_REFLINK);
+                if (r < 0)
+                        goto fallback_fail;
 
                 if (flags & BTRFS_SNAPSHOT_READ_ONLY) {
-                        r = btrfs_subvol_set_read_only(new_path, true);
-                        if (r < 0) {
-                                (void) btrfs_subvol_remove(new_path, BTRFS_REMOVE_QUOTA);
-                                return r;
+
+                        if (plain_directory) {
+                                /* Plain directories have no recursive read-only flag, but something pretty close to
+                                 * it: the IMMUTABLE bit. Let's use this here, if this is requested. */
+
+                                if (flags & BTRFS_SNAPSHOT_FALLBACK_IMMUTABLE)
+                                        (void) chattr_path(new_path, FS_IMMUTABLE_FL, FS_IMMUTABLE_FL);
+                        } else {
+                                r = btrfs_subvol_set_read_only(new_path, true);
+                                if (r < 0)
+                                        goto fallback_fail;
                         }
                 }
 
                 return 0;
+
+        fallback_fail:
+                (void) rm_rf(new_path, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_SUBVOLUME);
+                return r;
         }
 
         r = extract_subvolume_name(new_path, &subvolume);
index 1d852d5..04a2e12 100644 (file)
@@ -45,10 +45,12 @@ typedef struct BtrfsQuotaInfo {
 } BtrfsQuotaInfo;
 
 typedef enum BtrfsSnapshotFlags {
-        BTRFS_SNAPSHOT_FALLBACK_COPY = 1,
+        BTRFS_SNAPSHOT_FALLBACK_COPY = 1,        /* If the source isn't a subvolume, reflink everything */
         BTRFS_SNAPSHOT_READ_ONLY = 2,
         BTRFS_SNAPSHOT_RECURSIVE = 4,
         BTRFS_SNAPSHOT_QUOTA = 8,
+        BTRFS_SNAPSHOT_FALLBACK_DIRECTORY = 16,  /* If the destination doesn't support subvolumes, reflink/copy instead */
+        BTRFS_SNAPSHOT_FALLBACK_IMMUTABLE = 32,  /* When we can't create a subvolume, use the FS_IMMUTABLE attribute for indicating read-only */
 } BtrfsSnapshotFlags;
 
 typedef enum BtrfsRemoveFlags {
index 633c2aa..3223915 100644 (file)
 #define _KMOD_FEATURE_ "-KMOD"
 #endif
 
+#ifdef HAVE_LIBIDN2
+#define _IDN2_FEATURE_ "+IDN2"
+#else
+#define _IDN2_FEATURE_ "-IDN2"
+#endif
+
 #ifdef HAVE_LIBIDN
 #define _IDN_FEATURE_ "+IDN"
 #else
 #define _IDN_FEATURE_ "-IDN"
 #endif
 
+#define _CGROUP_HIEARCHY_ "default-hierarchy=" DEFAULT_HIERARCHY_NAME
+
 #define SYSTEMD_FEATURES                                                \
         _PAM_FEATURE_ " "                                               \
         _AUDIT_FEATURE_ " "                                             \
         _BLKID_FEATURE_ " "                                             \
         _ELFUTILS_FEATURE_ " "                                          \
         _KMOD_FEATURE_ " "                                              \
-        _IDN_FEATURE_
+        _IDN2_FEATURE_ " "                                              \
+        _IDN_FEATURE_ " "                                               \
+        _CGROUP_HIEARCHY_
index e4cfab3..204120e 100644 (file)
@@ -18,7 +18,9 @@
 ***/
 
 #include <alloca.h>
+#include <ctype.h>
 #include <errno.h>
+#include <limits.h>
 #include <stddef.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -32,9 +34,9 @@
 #include "parse-util.h"
 #include "string-util.h"
 
-/* Longest valid date/time range is 1970..2199 */
-#define MAX_RANGE_LEN   230
-#define BITS_WEEKDAYS   127
+#define BITS_WEEKDAYS 127
+#define MIN_YEAR 1970
+#define MAX_YEAR 2199
 
 static void free_chain(CalendarComponent *c) {
         CalendarComponent *n;
@@ -64,9 +66,14 @@ void calendar_spec_free(CalendarSpec *c) {
 static int component_compare(const void *_a, const void *_b) {
         CalendarComponent * const *a = _a, * const *b = _b;
 
-        if ((*a)->value < (*b)->value)
+        if ((*a)->start < (*b)->start)
                 return -1;
-        if ((*a)->value > (*b)->value)
+        if ((*a)->start > (*b)->start)
+                return 1;
+
+        if ((*a)->stop < (*b)->stop)
+                return -1;
+        if ((*a)->stop > (*b)->stop)
                 return 1;
 
         if ((*a)->repeat < (*b)->repeat)
@@ -77,15 +84,24 @@ static int component_compare(const void *_a, const void *_b) {
         return 0;
 }
 
-static void sort_chain(CalendarComponent **c) {
+static void normalize_chain(CalendarComponent **c) {
         unsigned n = 0, k;
         CalendarComponent **b, *i, **j, *next;
 
         assert(c);
 
-        for (i = *c; i; i = i->next)
+        for (i = *c; i; i = i->next) {
                 n++;
 
+                /*
+                 * While we're counting the chain, also normalize `stop`
+                 * so the length of the range is a multiple of `repeat`
+                 */
+                if (i->stop > i->start && i->repeat > 0)
+                        i->stop -= (i->stop - i->start) % i->repeat;
+
+        }
+
         if (n <= 1)
                 return;
 
@@ -100,8 +116,7 @@ static void sort_chain(CalendarComponent **c) {
 
         /* Drop non-unique entries */
         for (k = n-1; k > 0; k--) {
-                if (b[k-1]->value == next->value &&
-                    b[k-1]->repeat == next->repeat) {
+                if (component_compare(&b[k-1], &next) == 0) {
                         free(b[k-1]);
                         continue;
                 }
@@ -117,15 +132,19 @@ static void fix_year(CalendarComponent *c) {
         /* Turns 12 → 2012, 89 → 1989 */
 
         while (c) {
-                CalendarComponent *n = c->next;
+                if (c->start >= 0 && c->start < 70)
+                        c->start += 2000;
 
-                if (c->value >= 0 && c->value < 70)
-                        c->value += 2000;
+                if (c->stop >= 0 && c->stop < 70)
+                        c->stop += 2000;
 
-                if (c->value >= 70 && c->value < 100)
-                        c->value += 1900;
+                if (c->start >= 70 && c->start < 100)
+                        c->start += 1900;
 
-                c = n;
+                if (c->stop >= 70 && c->stop < 100)
+                        c->stop += 1900;
+
+                c = c->next;
         }
 }
 
@@ -135,30 +154,54 @@ int calendar_spec_normalize(CalendarSpec *c) {
         if (c->weekdays_bits <= 0 || c->weekdays_bits >= BITS_WEEKDAYS)
                 c->weekdays_bits = -1;
 
+        if (c->end_of_month && !c->day)
+                c->end_of_month = false;
+
         fix_year(c->year);
 
-        sort_chain(&c->year);
-        sort_chain(&c->month);
-        sort_chain(&c->day);
-        sort_chain(&c->hour);
-        sort_chain(&c->minute);
-        sort_chain(&c->microsecond);
+        normalize_chain(&c->year);
+        normalize_chain(&c->month);
+        normalize_chain(&c->day);
+        normalize_chain(&c->hour);
+        normalize_chain(&c->minute);
+        normalize_chain(&c->microsecond);
 
         return 0;
 }
 
-_pure_ static bool chain_valid(CalendarComponent *c, int from, int to) {
+_pure_ static bool chain_valid(CalendarComponent *c, int from, int to, bool end_of_month) {
         if (!c)
                 return true;
 
-        if (c->value < from || c->value > to)
-                return false;
+        /* Forbid dates more than 28 days from the end of the month */
+        if (end_of_month)
+                to -= 3;
 
-        if (c->value + c->repeat > to)
+        if (c->start < from || c->start > to)
                 return false;
 
+        /*
+         * c->repeat must be short enough so at least one repetition may
+         * occur before the end of the interval.  For dates scheduled
+         * relative to the end of the month, c->start and c->stop
+         * correspond to the Nth last day of the month.
+         */
+        if (c->stop >= 0) {
+                if (c->stop < from || c ->stop > to)
+                        return false;
+
+                if (c->start + c->repeat > c->stop)
+                        return false;
+        } else {
+                if (end_of_month && c->start - c->repeat < from)
+                        return false;
+
+                if (!end_of_month && c->start + c->repeat > to)
+                        return false;
+        }
+
         if (c->next)
-                return chain_valid(c->next, from, to);
+                return chain_valid(c->next, from, to, end_of_month);
 
         return true;
 }
@@ -169,22 +212,22 @@ _pure_ bool calendar_spec_valid(CalendarSpec *c) {
         if (c->weekdays_bits > BITS_WEEKDAYS)
                 return false;
 
-        if (!chain_valid(c->year, 1970, 2199))
+        if (!chain_valid(c->year, MIN_YEAR, MAX_YEAR, false))
                 return false;
 
-        if (!chain_valid(c->month, 1, 12))
+        if (!chain_valid(c->month, 1, 12, false))
                 return false;
 
-        if (!chain_valid(c->day, 1, 31))
+        if (!chain_valid(c->day, 1, 31, c->end_of_month))
                 return false;
 
-        if (!chain_valid(c->hour, 0, 23))
+        if (!chain_valid(c->hour, 0, 23, false))
                 return false;
 
-        if (!chain_valid(c->minute, 0, 59))
+        if (!chain_valid(c->minute, 0, 59, false))
                 return false;
 
-        if (!chain_valid(c->microsecond, 0, 60*USEC_PER_SEC-1))
+        if (!chain_valid(c->microsecond, 0, 60*USEC_PER_SEC-1, false))
                 return false;
 
         return true;
@@ -240,6 +283,8 @@ static void format_weekdays(FILE *f, const CalendarSpec *c) {
 }
 
 static void format_chain(FILE *f, int space, const CalendarComponent *c, bool usec) {
+        int d = usec ? (int) USEC_PER_SEC : 1;
+
         assert(f);
 
         if (!c) {
@@ -247,23 +292,27 @@ static void format_chain(FILE *f, int space, const CalendarComponent *c, bool us
                 return;
         }
 
-        assert(c->value >= 0);
-        if (!usec)
-                fprintf(f, "%0*i", space, c->value);
-        else if (c->value % USEC_PER_SEC == 0)
-                fprintf(f, "%0*i", space, (int) (c->value / USEC_PER_SEC));
-        else
-                fprintf(f, "%0*i.%06i", space, (int) (c->value / USEC_PER_SEC), (int) (c->value % USEC_PER_SEC));
-
-        if (c->repeat > 0) {
-                if (!usec)
-                        fprintf(f, "/%i", c->repeat);
-                else if (c->repeat % USEC_PER_SEC == 0)
-                        fprintf(f, "/%i", (int) (c->repeat / USEC_PER_SEC));
-                else
-                        fprintf(f, "/%i.%06i", (int) (c->repeat / USEC_PER_SEC), (int) (c->repeat % USEC_PER_SEC));
+        if (usec && c->start == 0 && c->repeat == USEC_PER_SEC && !c->next) {
+                fputc('*', f);
+                return;
         }
 
+        assert(c->start >= 0);
+
+        fprintf(f, "%0*i", space, c->start / d);
+        if (c->start % d > 0)
+                fprintf(f, ".%06i", c->start % d);
+
+        if (c->stop > 0)
+                fprintf(f, "..%0*i", space, c->stop / d);
+        if (c->stop % d > 0)
+                fprintf(f, ".%06i", c->stop % d);
+
+        if (c->repeat > 0 && !(c->stop > 0 && c->repeat == d))
+                fprintf(f, "/%i", c->repeat / d);
+        if (c->repeat % d > 0)
+                fprintf(f, ".%06i", c->repeat % d);
+
         if (c->next) {
                 fputc(',', f);
                 format_chain(f, space, c->next, usec);
@@ -291,7 +340,7 @@ int calendar_spec_to_string(const CalendarSpec *c, char **p) {
         format_chain(f, 4, c->year, false);
         fputc('-', f);
         format_chain(f, 2, c->month, false);
-        fputc('-', f);
+        fputc(c->end_of_month ? '~' : '-', f);
         format_chain(f, 2, c->day, false);
         fputc(' ', f);
         format_chain(f, 2, c->hour, false);
@@ -302,6 +351,17 @@ int calendar_spec_to_string(const CalendarSpec *c, char **p) {
 
         if (c->utc)
                 fputs(" UTC", f);
+        else if (IN_SET(c->dst, 0, 1)) {
+
+                /* If daylight saving is explicitly on or off, let's show the used timezone. */
+
+                tzset();
+
+                if (!isempty(tzname[c->dst])) {
+                        fputc(' ', f);
+                        fputs(tzname[c->dst], f);
+                }
+        }
 
         r = fflush_and_check(f);
         if (r < 0) {
@@ -347,9 +407,6 @@ static int parse_weekdays(const char **p, CalendarSpec *c) {
         for (;;) {
                 unsigned i;
 
-                if (!first && **p == ' ')
-                        return 0;
-
                 for (i = 0; i < ELEMENTSOF(day_nr); i++) {
                         size_t skip;
 
@@ -405,7 +462,7 @@ static int parse_weekdays(const char **p, CalendarSpec *c) {
                                 return -EINVAL;
 
                         l = day_nr[i].nr;
-                        *p += 1;
+                        *p += 2;
 
                 /* Support ranges with "-" for backwards compatibility */
                 } else if (**p == '-') {
@@ -413,36 +470,59 @@ static int parse_weekdays(const char **p, CalendarSpec *c) {
                                 return -EINVAL;
 
                         l = day_nr[i].nr;
-                } else
+                        *p += 1;
+
+                } else if (**p == ',') {
                         l = -1;
+                        *p += 1;
+                }
+
+                /* Allow a trailing comma but not an open range */
+                if (**p == 0 || **p == ' ') {
+                        *p += strspn(*p, " ");
+                        return l < 0 ? 0 : -EINVAL;
+                }
 
-                *p += 1;
                 first = false;
         }
 }
 
-static int parse_component_decimal(const char **p, bool usec, unsigned long *res) {
-        unsigned long value;
-        const char *e = NULL;
+static int parse_one_number(const char *p, const char **e, unsigned long *ret) {
         char *ee = NULL;
-        int r;
+        unsigned long value;
 
         errno = 0;
-        value = strtoul(*p, &ee, 10);
+        value = strtoul(p, &ee, 10);
         if (errno > 0)
                 return -errno;
-        if (ee == *p)
+        if (ee == p)
                 return -EINVAL;
-        if ((unsigned long) (int) value != value)
-                return -ERANGE;
-        e = ee;
+
+        *ret = value;
+        *e = ee;
+        return 0;
+}
+
+static int parse_component_decimal(const char **p, bool usec, int *res) {
+        unsigned long value;
+        const char *e = NULL;
+        int r;
+
+        if (!isdigit(**p))
+                return -EINVAL;
+
+        r = parse_one_number(*p, &e, &value);
+        if (r < 0)
+                return r;
 
         if (usec) {
                 if (value * USEC_PER_SEC / USEC_PER_SEC != value)
                         return -ERANGE;
 
                 value *= USEC_PER_SEC;
-                if (*e == '.') {
+
+                /* One "." is a decimal point, but ".." is a range separator */
+                if (e[0] == '.' && e[1] != '.') {
                         unsigned add;
 
                         e++;
@@ -456,6 +536,9 @@ static int parse_component_decimal(const char **p, bool usec, unsigned long *res
                 }
         }
 
+        if (value > INT_MAX)
+                return -ERANGE;
+
         *p = e;
         *res = value;
 
@@ -471,7 +554,8 @@ static int const_chain(int value, CalendarComponent **c) {
         if (!cc)
                 return -ENOMEM;
 
-        cc->value = value;
+        cc->start = value;
+        cc->stop = -1;
         cc->repeat = 0;
         cc->next = *c;
 
@@ -480,10 +564,50 @@ static int const_chain(int value, CalendarComponent **c) {
         return 0;
 }
 
+static int calendarspec_from_time_t(CalendarSpec *c, time_t time) {
+        struct tm tm;
+        CalendarComponent *year = NULL, *month = NULL, *day = NULL, *hour = NULL, *minute = NULL, *us = NULL;
+        int r;
+
+        assert_se(gmtime_r(&time, &tm));
+
+        r = const_chain(tm.tm_year + 1900, &year);
+        if (r < 0)
+                return r;
+
+        r = const_chain(tm.tm_mon + 1, &month);
+        if (r < 0)
+                return r;
+
+        r = const_chain(tm.tm_mday, &day);
+        if (r < 0)
+                return r;
+
+        r = const_chain(tm.tm_hour, &hour);
+        if (r < 0)
+                return r;
+
+        r = const_chain(tm.tm_min, &minute);
+        if (r < 0)
+                return r;
+
+        r = const_chain(tm.tm_sec * USEC_PER_SEC, &us);
+        if (r < 0)
+                return r;
+
+        c->utc = true;
+        c->year = year;
+        c->month = month;
+        c->day = day;
+        c->hour = hour;
+        c->minute = minute;
+        c->microsecond = us;
+        return 0;
+}
+
 static int prepend_component(const char **p, bool usec, CalendarComponent **c) {
-        unsigned long i, value, range_end, range_inc, repeat = 0;
+        int r, start, stop = -1, repeat = 0;
         CalendarComponent *cc;
-        int r;
         const char *e;
 
         assert(p);
@@ -491,10 +615,19 @@ static int prepend_component(const char **p, bool usec, CalendarComponent **c) {
 
         e = *p;
 
-        r = parse_component_decimal(&e, usec, &value);
+        r = parse_component_decimal(&e, usec, &start);
         if (r < 0)
                 return r;
 
+        if (e[0] == '.' && e[1] == '.') {
+                e += 2;
+                r = parse_component_decimal(&e, usec, &stop);
+                if (r < 0)
+                        return r;
+
+                repeat = usec ? USEC_PER_SEC : 1;
+        }
+
         if (*e == '/') {
                 e++;
                 r = parse_component_decimal(&e, usec, &repeat);
@@ -503,40 +636,17 @@ static int prepend_component(const char **p, bool usec, CalendarComponent **c) {
 
                 if (repeat == 0)
                         return -ERANGE;
-        } else if (e[0] == '.' && e[1] == '.') {
-                e += 2;
-                r = parse_component_decimal(&e, usec, &range_end);
-                if (r < 0)
-                        return r;
-
-                if (value >= range_end)
-                        return -EINVAL;
-
-                range_inc = usec ? USEC_PER_SEC : 1;
-
-                /* Don't allow impossibly large ranges... */
-                if (range_end - value >= MAX_RANGE_LEN * range_inc)
-                        return -EINVAL;
-
-                /* ...or ranges with only a single element */
-                if (range_end - value < range_inc)
-                        return -EINVAL;
-
-                for (i = value; i <= range_end; i += range_inc) {
-                        r = const_chain(i, c);
-                        if (r < 0)
-                                return r;
-                }
         }
 
-        if (*e != 0 && *e != ' ' && *e != ',' && *e != '-' && *e != ':')
+        if (*e != 0 && *e != ' ' && *e != ',' && *e != '-' && *e != '~' && *e != ':')
                 return -EINVAL;
 
         cc = new0(CalendarComponent, 1);
         if (!cc)
                 return -ENOMEM;
 
-        cc->value = value;
+        cc->start = start;
+        cc->stop = stop;
         cc->repeat = repeat;
         cc->next = *c;
 
@@ -599,6 +709,27 @@ static int parse_date(const char **p, CalendarSpec *c) {
         if (*t == 0)
                 return 0;
 
+        /* @TIMESTAMP — UNIX time in seconds since the epoch */
+        if (*t == '@') {
+                unsigned long value;
+                time_t time;
+
+                r = parse_one_number(t + 1, &t, &value);
+                if (r < 0)
+                        return r;
+
+                time = value;
+                if ((unsigned long) time != value)
+                        return -ERANGE;
+
+                r = calendarspec_from_time_t(c, time);
+                if (r < 0)
+                        return r;
+
+                *p = t;
+                return 1; /* finito, don't parse H:M:S after that */
+        }
+
         r = parse_chain(&t, false, &first);
         if (r < 0)
                 return r;
@@ -609,7 +740,9 @@ static int parse_date(const char **p, CalendarSpec *c) {
                 return 0;
         }
 
-        if (*t != '-') {
+        if (*t == '~')
+                c->end_of_month = true;
+        else if (*t != '-') {
                 free_chain(first);
                 return -EINVAL;
         }
@@ -627,9 +760,15 @@ static int parse_date(const char **p, CalendarSpec *c) {
                 c->month = first;
                 c->day = second;
                 return 0;
+        } else if (c->end_of_month) {
+                free_chain(first);
+                free_chain(second);
+                return -EINVAL;
         }
 
-        if (*t != '-') {
+        if (*t == '~')
+                c->end_of_month = true;
+        else if (*t != '-') {
                 free_chain(first);
                 free_chain(second);
                 return -EINVAL;
@@ -643,7 +782,7 @@ static int parse_date(const char **p, CalendarSpec *c) {
                 return r;
         }
 
-        /* Got tree parts, hence it is year, month and day */
+        /* Got three parts, hence it is year, month and day */
         if (*t == ' ' || *t == 0) {
                 *p = t + strspn(t, " ");
                 c->year = first;
@@ -669,14 +808,9 @@ static int parse_calendar_time(const char **p, CalendarSpec *c) {
 
         t = *p;
 
-        if (*t == 0) {
-                /* If no time is specified at all, but a date of some
-                 * kind, then this means 00:00:00 */
-                if (c->day || c->weekdays_bits > 0)
-                        goto null_hour;
-
-                goto finish;
-        }
+        /* If no time is specified at all, then this means 00:00:00 */
+        if (*t == 0)
+                goto null_hour;
 
         r = parse_chain(&t, false, &h);
         if (r < 0)
@@ -693,12 +827,8 @@ static int parse_calendar_time(const char **p, CalendarSpec *c) {
                 goto fail;
 
         /* Already at the end? Then it's hours and minutes, and seconds are 0 */
-        if (*t == 0) {
-                if (m != NULL)
-                        goto null_second;
-
-                goto finish;
-        }
+        if (*t == 0)
+                goto null_second;
 
         if (*t != ':') {
                 r = -EINVAL;
@@ -747,24 +877,54 @@ fail:
 }
 
 int calendar_spec_from_string(const char *p, CalendarSpec **spec) {
+        const char *utc;
         CalendarSpec *c;
         int r;
-        const char *utc;
 
         assert(p);
         assert(spec);
 
-        if (isempty(p))
-                return -EINVAL;
-
         c = new0(CalendarSpec, 1);
         if (!c)
                 return -ENOMEM;
+        c->dst = -1;
 
         utc = endswith_no_case(p, " UTC");
         if (utc) {
                 c->utc = true;
                 p = strndupa(p, utc - p);
+        } else {
+                const char *e = NULL;
+                int j;
+
+                tzset();
+
+                /* Check if the local timezone was specified? */
+                for (j = 0; j <= 1; j++) {
+                        if (isempty(tzname[j]))
+                                continue;
+
+                        e = endswith_no_case(p, tzname[j]);
+                        if (!e)
+                                continue;
+                        if (e == p)
+                                continue;
+                        if (e[-1] != ' ')
+                                continue;
+
+                        break;
+                }
+
+                /* Found one of the two timezones specified? */
+                if (IN_SET(j, 0, 1)) {
+                        p = strndupa(p, e - p - 1);
+                        c->dst = j;
+                }
+        }
+
+        if (isempty(p)) {
+                r = -EINVAL;
+                goto fail;
         }
 
         if (strcaseeq(p, "minutely")) {
@@ -899,9 +1059,11 @@ int calendar_spec_from_string(const char *p, CalendarSpec **spec) {
                 if (r < 0)
                         goto fail;
 
-                r = parse_calendar_time(&p, c);
-                if (r < 0)
-                        goto fail;
+                if (r == 0) {
+                        r = parse_calendar_time(&p, c);
+                        if (r < 0)
+                                goto fail;
+                }
 
                 if (*p != 0) {
                         r = -EINVAL;
@@ -926,9 +1088,23 @@ fail:
         return r;
 }
 
-static int find_matching_component(const CalendarComponent *c, int *val) {
-        const CalendarComponent *n;
-        int d = -1;
+static int find_end_of_month(struct tm *tm, bool utc, int day) {
+        struct tm t = *tm;
+
+        t.tm_mon++;
+        t.tm_mday = 1 - day;
+
+        if (mktime_or_timegm(&t, utc) < 0 ||
+            t.tm_mon != tm->tm_mon)
+                return -1;
+
+        return t.tm_mday;
+}
+
+static int find_matching_component(const CalendarSpec *spec, const CalendarComponent *c,
+                                   struct tm *tm, int *val) {
+        const CalendarComponent *p = c;
+        int start, stop, d = -1;
         bool d_set = false;
         int r;
 
@@ -938,27 +1114,36 @@ static int find_matching_component(const CalendarComponent *c, int *val) {
                 return 0;
 
         while (c) {
-                n = c->next;
+                start = c->start;
+                stop = c->stop;
+
+                if (spec->end_of_month && p == spec->day) {
+                        start = find_end_of_month(tm, spec->utc, start);
+                        stop = find_end_of_month(tm, spec->utc, stop);
+
+                        if (stop > 0)
+                                SWAP_TWO(start, stop);
+                }
 
-                if (c->value >= *val) {
+                if (start >= *val) {
 
-                        if (!d_set || c->value < d) {
-                                d = c->value;
+                        if (!d_set || start < d) {
+                                d = start;
                                 d_set = true;
                         }
 
                 } else if (c->repeat > 0) {
                         int k;
 
-                        k = c->value + c->repeat * ((*val - c->value + c->repeat -1) / c->repeat);
+                        k = start + c->repeat * ((*val - start + c->repeat - 1) / c->repeat);
 
-                        if (!d_set || k < d) {
+                        if ((!d_set || k < d) && (stop < 0 || k <= stop)) {
                                 d = k;
                                 d_set = true;
                         }
                 }
 
-                c = n;
+                c = c->next;
         }
 
         if (!d_set)
@@ -975,7 +1160,15 @@ static bool tm_out_of_bounds(const struct tm *tm, bool utc) {
 
         t = *tm;
 
-        if (mktime_or_timegm(&t, utc) == (time_t) -1)
+        if (mktime_or_timegm(&t, utc) < 0)
+                return true;
+
+        /*
+         * Set an upper bound on the year so impossible dates like "*-02-31"
+         * don't cause find_next() to loop forever. tm_year contains years
+         * since 1900, so adjust it accordingly.
+         */
+        if (tm->tm_year + 1900 > MAX_YEAR)
                 return true;
 
         /* Did any normalization take place? If so, it was out of bounds before */
@@ -996,7 +1189,7 @@ static bool matches_weekday(int weekdays_bits, const struct tm *tm, bool utc) {
                 return true;
 
         t = *tm;
-        if (mktime_or_timegm(&t, utc) == (time_t) -1)
+        if (mktime_or_timegm(&t, utc) < 0)
                 return false;
 
         k = t.tm_wday == 0 ? 6 : t.tm_wday - 1;
@@ -1017,10 +1210,10 @@ static int find_next(const CalendarSpec *spec, struct tm *tm, usec_t *usec) {
         for (;;) {
                 /* Normalize the current date */
                 (void) mktime_or_timegm(&c, spec->utc);
-                c.tm_isdst = -1;
+                c.tm_isdst = spec->dst;
 
                 c.tm_year += 1900;
-                r = find_matching_component(spec->year, &c.tm_year);
+                r = find_matching_component(spec, spec->year, &c, &c.tm_year);
                 c.tm_year -= 1900;
 
                 if (r > 0) {
@@ -1034,7 +1227,7 @@ static int find_next(const CalendarSpec *spec, struct tm *tm, usec_t *usec) {
                         return -ENOENT;
 
                 c.tm_mon += 1;
-                r = find_matching_component(spec->month, &c.tm_mon);
+                r = find_matching_component(spec, spec->month, &c, &c.tm_mon);
                 c.tm_mon -= 1;
 
                 if (r > 0) {
@@ -1049,7 +1242,7 @@ static int find_next(const CalendarSpec *spec, struct tm *tm, usec_t *usec) {
                         continue;
                 }
 
-                r = find_matching_component(spec->day, &c.tm_mday);
+                r = find_matching_component(spec, spec->day, &c, &c.tm_mday);
                 if (r > 0)
                         c.tm_hour = c.tm_min = c.tm_sec = tm_usec = 0;
                 if (r < 0 || tm_out_of_bounds(&c, spec->utc)) {
@@ -1065,7 +1258,7 @@ static int find_next(const CalendarSpec *spec, struct tm *tm, usec_t *usec) {
                         continue;
                 }
 
-                r = find_matching_component(spec->hour, &c.tm_hour);
+                r = find_matching_component(spec, spec->hour, &c, &c.tm_hour);
                 if (r > 0)
                         c.tm_min = c.tm_sec = tm_usec = 0;
                 if (r < 0 || tm_out_of_bounds(&c, spec->utc)) {
@@ -1074,7 +1267,7 @@ static int find_next(const CalendarSpec *spec, struct tm *tm, usec_t *usec) {
                         continue;
                 }
 
-                r = find_matching_component(spec->minute, &c.tm_min);
+                r = find_matching_component(spec, spec->minute, &c, &c.tm_min);
                 if (r > 0)
                         c.tm_sec = tm_usec = 0;
                 if (r < 0 || tm_out_of_bounds(&c, spec->utc)) {
@@ -1084,7 +1277,7 @@ static int find_next(const CalendarSpec *spec, struct tm *tm, usec_t *usec) {
                 }
 
                 c.tm_sec = c.tm_sec * USEC_PER_SEC + tm_usec;
-                r = find_matching_component(spec->microsecond, &c.tm_sec);
+                r = find_matching_component(spec, spec->microsecond, &c, &c.tm_sec);
                 tm_usec = c.tm_sec % USEC_PER_SEC;
                 c.tm_sec /= USEC_PER_SEC;
 
@@ -1109,6 +1302,9 @@ int calendar_spec_next_usec(const CalendarSpec *spec, usec_t usec, usec_t *next)
         assert(spec);
         assert(next);
 
+        if (usec > USEC_TIMESTAMP_FORMATTABLE_MAX)
+                return -EINVAL;
+
         usec++;
         t = (time_t) (usec / USEC_PER_SEC);
         assert_se(localtime_or_gmtime_r(&t, &tm, spec->utc));
@@ -1119,7 +1315,7 @@ int calendar_spec_next_usec(const CalendarSpec *spec, usec_t usec, usec_t *next)
                 return r;
 
         t = mktime_or_timegm(&tm, spec->utc);
-        if (t == (time_t) -1)
+        if (t < 0)
                 return -EINVAL;
 
         *next = (usec_t) t * USEC_PER_SEC + tm_usec;
index f6472c1..3d8798d 100644 (file)
@@ -28,7 +28,8 @@
 #include "util.h"
 
 typedef struct CalendarComponent {
-        int value;
+        int start;
+        int stop;
         int repeat;
 
         struct CalendarComponent *next;
@@ -36,7 +37,9 @@ typedef struct CalendarComponent {
 
 typedef struct CalendarSpec {
         int weekdays_bits;
+        bool end_of_month;
         bool utc;
+        int dst;
 
         CalendarComponent *year;
         CalendarComponent *month;
index 3e773a0..d68cc78 100644 (file)
@@ -26,7 +26,7 @@
 #include "parse-util.h"
 #include "util.h"
 
-static const struct capability_name* lookup_capability(register const char *str, register unsigned int len);
+static const struct capability_name* lookup_capability(register const char *str, register GPERF_LEN_TYPE len);
 
 #include "cap-from-name.h"
 #include "cap-to-name.h"
diff --git a/src/basic/cap-to-name.awk b/src/basic/cap-to-name.awk
new file mode 100644 (file)
index 0000000..402a782
--- /dev/null
@@ -0,0 +1,9 @@
+BEGIN{
+        print "static const char* const capability_names[] = { "
+}
+{
+        printf "        [%s] = \"%s\",\n", $1, tolower($1)
+}
+END{
+        print "};"
+}
index d4c5bd6..c3de20a 100644 (file)
@@ -31,6 +31,7 @@
 #include "log.h"
 #include "macro.h"
 #include "parse-util.h"
+#include "user-util.h"
 #include "util.h"
 
 int have_effective_cap(int value) {
@@ -295,8 +296,9 @@ int drop_privileges(uid_t uid, gid_t gid, uint64_t keep_capabilities) {
         if (setresgid(gid, gid, gid) < 0)
                 return log_error_errno(errno, "Failed to change group ID: %m");
 
-        if (setgroups(0, NULL) < 0)
-                return log_error_errno(errno, "Failed to drop auxiliary groups list: %m");
+        r = maybe_setgroups(0, NULL);
+        if (r < 0)
+                return log_error_errno(r, "Failed to drop auxiliary groups list: %m");
 
         /* Ensure we keep the permitted caps across the setresuid() */
         if (prctl(PR_SET_KEEPCAPS, 1) < 0)
index 3fad559..75dfec3 100644 (file)
@@ -28,6 +28,7 @@
 #include <sys/stat.h>
 #include <sys/statfs.h>
 #include <sys/types.h>
+#include <sys/xattr.h>
 #include <unistd.h>
 
 #include "alloc-util.h"
@@ -37,7 +38,7 @@
 #include "extract-word.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "log.h"
 #include "login-util.h"
@@ -54,6 +55,7 @@
 #include "stdio-util.h"
 #include "string-table.h"
 #include "string-util.h"
+#include "strv.h"
 #include "unit-name.h"
 #include "user-util.h"
 
@@ -134,6 +136,20 @@ int cg_read_event(const char *controller, const char *path, const char *event,
         return -ENOENT;
 }
 
+bool cg_ns_supported(void) {
+        static thread_local int enabled = -1;
+
+        if (enabled >= 0)
+                return enabled;
+
+        if (access("/proc/self/ns/cgroup", F_OK) == 0)
+                enabled = 1;
+        else
+                enabled = 0;
+
+        return enabled;
+}
+
 int cg_enumerate_subgroups(const char *controller, const char *path, DIR **_d) {
         _cleanup_free_ char *fs = NULL;
         int r;
@@ -167,8 +183,7 @@ int cg_read_subgroup(DIR *d, char **fn) {
                 if (de->d_type != DT_DIR)
                         continue;
 
-                if (streq(de->d_name, ".") ||
-                    streq(de->d_name, ".."))
+                if (dot_or_dot_dot(de->d_name))
                         continue;
 
                 b = strdup(de->d_name);
@@ -194,6 +209,18 @@ int cg_rmdir(const char *controller, const char *path) {
         if (r < 0 && errno != ENOENT)
                 return -errno;
 
+        r = cg_hybrid_unified();
+        if (r < 0)
+                return r;
+        if (r == 0)
+                return 0;
+
+        if (streq(controller, SYSTEMD_CGROUP_CONTROLLER)) {
+                r = cg_rmdir(SYSTEMD_CGROUP_CONTROLLER_LEGACY, path);
+                if (r < 0)
+                        log_warning_errno(r, "Failed to remove compat systemd cgroup %s: %m", path);
+        }
+
         return 0;
 }
 
@@ -330,7 +357,7 @@ int cg_kill_recursive(
         while ((r = cg_read_subgroup(d, &fn)) > 0) {
                 _cleanup_free_ char *p = NULL;
 
-                p = strjoin(path, "/", fn, NULL);
+                p = strjoin(path, "/", fn);
                 free(fn);
                 if (!p)
                         return -ENOMEM;
@@ -464,7 +491,7 @@ int cg_migrate_recursive(
         while ((r = cg_read_subgroup(d, &fn)) > 0) {
                 _cleanup_free_ char *p = NULL;
 
-                p = strjoin(pfrom, "/", fn, NULL);
+                p = strjoin(pfrom, "/", fn);
                 free(fn);
                 if (!p)
                         return -ENOMEM;
@@ -528,6 +555,13 @@ static const char *controller_to_dirname(const char *controller) {
          * just cuts off the name= prefixed used for named
          * hierarchies, if it is specified. */
 
+        if (streq(controller, SYSTEMD_CGROUP_CONTROLLER)) {
+                if (cg_hybrid_unified() > 0)
+                        controller = SYSTEMD_CGROUP_CONTROLLER_HYBRID;
+                else
+                        controller = SYSTEMD_CGROUP_CONTROLLER_LEGACY;
+        }
+
         e = startswith(controller, "name=");
         if (e)
                 return e;
@@ -547,11 +581,11 @@ static int join_path_legacy(const char *controller, const char *path, const char
         if (isempty(path) && isempty(suffix))
                 t = strappend("/sys/fs/cgroup/", dn);
         else if (isempty(path))
-                t = strjoin("/sys/fs/cgroup/", dn, "/", suffix, NULL);
+                t = strjoin("/sys/fs/cgroup/", dn, "/", suffix);
         else if (isempty(suffix))
-                t = strjoin("/sys/fs/cgroup/", dn, "/", path, NULL);
+                t = strjoin("/sys/fs/cgroup/", dn, "/", path);
         else
-                t = strjoin("/sys/fs/cgroup/", dn, "/", path, "/", suffix, NULL);
+                t = strjoin("/sys/fs/cgroup/", dn, "/", path, "/", suffix);
         if (!t)
                 return -ENOMEM;
 
@@ -571,7 +605,7 @@ static int join_path_unified(const char *path, const char *suffix, char **fs) {
         else if (isempty(suffix))
                 t = strappend("/sys/fs/cgroup/", path);
         else
-                t = strjoin("/sys/fs/cgroup/", path, "/", suffix, NULL);
+                t = strjoin("/sys/fs/cgroup/", path, "/", suffix);
         if (!t)
                 return -ENOMEM;
 
@@ -580,7 +614,7 @@ static int join_path_unified(const char *path, const char *suffix, char **fs) {
 }
 
 int cg_get_path(const char *controller, const char *path, const char *suffix, char **fs) {
-        int unified, r;
+        int r;
 
         assert(fs);
 
@@ -598,7 +632,7 @@ int cg_get_path(const char *controller, const char *path, const char *suffix, ch
                 else if (!path)
                         t = strdup(suffix);
                 else
-                        t = strjoin(path, "/", suffix, NULL);
+                        t = strjoin(path, "/", suffix);
                 if (!t)
                         return -ENOMEM;
 
@@ -609,11 +643,10 @@ int cg_get_path(const char *controller, const char *path, const char *suffix, ch
         if (!cg_controller_is_valid(controller))
                 return -EINVAL;
 
-        unified = cg_unified();
-        if (unified < 0)
-                return unified;
-
-        if (unified > 0)
+        r = cg_all_unified();
+        if (r < 0)
+                return r;
+        if (r > 0)
                 r = join_path_unified(path, suffix, fs);
         else
                 r = join_path_legacy(controller, path, suffix, fs);
@@ -625,7 +658,7 @@ int cg_get_path(const char *controller, const char *path, const char *suffix, ch
 }
 
 static int controller_is_accessible(const char *controller) {
-        int unified;
+        int r;
 
         assert(controller);
 
@@ -637,10 +670,10 @@ static int controller_is_accessible(const char *controller) {
         if (!cg_controller_is_valid(controller))
                 return -EINVAL;
 
-        unified = cg_unified();
-        if (unified < 0)
-                return unified;
-        if (unified > 0) {
+        r = cg_all_unified();
+        if (r < 0)
+                return r;
+        if (r > 0) {
                 /* We don't support named hierarchies if we are using
                  * the unified hierarchy. */
 
@@ -694,7 +727,7 @@ static int trim_cb(const char *path, const struct stat *sb, int typeflag, struct
 
 int cg_trim(const char *controller, const char *path, bool delete_root) {
         _cleanup_free_ char *fs = NULL;
-        int r = 0;
+        int r = 0, q;
 
         assert(path);
 
@@ -717,6 +750,15 @@ int cg_trim(const char *controller, const char *path, bool delete_root) {
                         return -errno;
         }
 
+        q = cg_hybrid_unified();
+        if (q < 0)
+                return q;
+        if (q > 0 && streq(controller, SYSTEMD_CGROUP_CONTROLLER)) {
+                q = cg_trim(SYSTEMD_CGROUP_CONTROLLER_LEGACY, path, delete_root);
+                if (q < 0)
+                        log_warning_errno(q, "Failed to trim compat systemd cgroup %s: %m", path);
+        }
+
         return r;
 }
 
@@ -740,6 +782,16 @@ int cg_create(const char *controller, const char *path) {
                 return -errno;
         }
 
+        r = cg_hybrid_unified();
+        if (r < 0)
+                return r;
+
+        if (r > 0 && streq(controller, SYSTEMD_CGROUP_CONTROLLER)) {
+                r = cg_create(SYSTEMD_CGROUP_CONTROLLER_LEGACY, path);
+                if (r < 0)
+                        log_warning_errno(r, "Failed to create compat systemd cgroup %s: %m", path);
+        }
+
         return 1;
 }
 
@@ -777,7 +829,21 @@ int cg_attach(const char *controller, const char *path, pid_t pid) {
 
         xsprintf(c, PID_FMT "\n", pid);
 
-        return write_string_file(fs, c, 0);
+        r = write_string_file(fs, c, 0);
+        if (r < 0)
+                return r;
+
+        r = cg_hybrid_unified();
+        if (r < 0)
+                return r;
+
+        if (r > 0 && streq(controller, SYSTEMD_CGROUP_CONTROLLER)) {
+                r = cg_attach(SYSTEMD_CGROUP_CONTROLLER_LEGACY, path, pid);
+                if (r < 0)
+                        log_warning_errno(r, "Failed to attach "PID_FMT" to compat systemd cgroup %s: %m", pid, path);
+        }
+
+        return 0;
 }
 
 int cg_attach_fallback(const char *controller, const char *path, pid_t pid) {
@@ -826,7 +892,20 @@ int cg_set_group_access(
         if (r < 0)
                 return r;
 
-        return chmod_and_chown(fs, mode, uid, gid);
+        r = chmod_and_chown(fs, mode, uid, gid);
+        if (r < 0)
+                return r;
+
+        r = cg_hybrid_unified();
+        if (r < 0)
+                return r;
+        if (r > 0 && streq(controller, SYSTEMD_CGROUP_CONTROLLER)) {
+                r = cg_set_group_access(SYSTEMD_CGROUP_CONTROLLER_LEGACY, path, mode, uid, gid);
+                if (r < 0)
+                        log_warning_errno(r, "Failed to set group access on compat systemd cgroup %s: %m", path);
+        }
+
+        return 0;
 }
 
 int cg_set_task_access(
@@ -837,7 +916,7 @@ int cg_set_task_access(
                 gid_t gid) {
 
         _cleanup_free_ char *fs = NULL, *procs = NULL;
-        int r, unified;
+        int r;
 
         assert(path);
 
@@ -855,41 +934,91 @@ int cg_set_task_access(
         if (r < 0)
                 return r;
 
-        unified = cg_unified();
-        if (unified < 0)
-                return unified;
-        if (unified)
-                return 0;
+        r = cg_unified_controller(controller);
+        if (r < 0)
+                return r;
+        if (r == 0) {
+                /* Compatibility, Always keep values for "tasks" in sync with
+                 * "cgroup.procs" */
+                if (cg_get_path(controller, path, "tasks", &procs) >= 0)
+                        (void) chmod_and_chown(procs, mode, uid, gid);
+        }
+
+        r = cg_hybrid_unified();
+        if (r < 0)
+                return r;
+        if (r > 0 && streq(controller, SYSTEMD_CGROUP_CONTROLLER)) {
+                r = cg_set_task_access(SYSTEMD_CGROUP_CONTROLLER_LEGACY, path, mode, uid, gid);
+                if (r < 0)
+                        log_warning_errno(r, "Failed to set task access on compat systemd cgroup %s: %m", path);
+        }
+
+        return 0;
+}
+
+int cg_set_xattr(const char *controller, const char *path, const char *name, const void *value, size_t size, int flags) {
+        _cleanup_free_ char *fs = NULL;
+        int r;
 
-        /* Compatibility, Always keep values for "tasks" in sync with
-         * "cgroup.procs" */
-        if (cg_get_path(controller, path, "tasks", &procs) >= 0)
-                (void) chmod_and_chown(procs, mode, uid, gid);
+        assert(path);
+        assert(name);
+        assert(value || size <= 0);
+
+        r = cg_get_path(controller, path, NULL, &fs);
+        if (r < 0)
+                return r;
+
+        if (setxattr(fs, name, value, size, flags) < 0)
+                return -errno;
 
         return 0;
 }
 
+int cg_get_xattr(const char *controller, const char *path, const char *name, void *value, size_t size) {
+        _cleanup_free_ char *fs = NULL;
+        ssize_t n;
+        int r;
+
+        assert(path);
+        assert(name);
+
+        r = cg_get_path(controller, path, NULL, &fs);
+        if (r < 0)
+                return r;
+
+        n = getxattr(fs, name, value, size);
+        if (n < 0)
+                return -errno;
+
+        return (int) n;
+}
+
 int cg_pid_get_path(const char *controller, pid_t pid, char **path) {
         _cleanup_fclose_ FILE *f = NULL;
         char line[LINE_MAX];
-        const char *fs;
+        const char *fs, *controller_str;
         size_t cs = 0;
         int unified;
 
         assert(path);
         assert(pid >= 0);
 
-        unified = cg_unified();
+        if (controller) {
+                if (!cg_controller_is_valid(controller))
+                        return -EINVAL;
+        } else
+                controller = SYSTEMD_CGROUP_CONTROLLER;
+
+        unified = cg_unified_controller(controller);
         if (unified < 0)
                 return unified;
         if (unified == 0) {
-                if (controller) {
-                        if (!cg_controller_is_valid(controller))
-                                return -EINVAL;
-                } else
-                        controller = SYSTEMD_CGROUP_CONTROLLER;
+                if (streq(controller, SYSTEMD_CGROUP_CONTROLLER))
+                        controller_str = SYSTEMD_CGROUP_CONTROLLER_LEGACY;
+                else
+                        controller_str = controller;
 
-                cs = strlen(controller);
+                cs = strlen(controller_str);
         }
 
         fs = procfs_file_alloca(pid, "cgroup");
@@ -927,7 +1056,7 @@ int cg_pid_get_path(const char *controller, pid_t pid, char **path) {
 
                         *e = 0;
                         FOREACH_WORD_SEPARATOR(word, k, l, ",", state) {
-                                if (k == cs && memcmp(word, controller, cs) == 0) {
+                                if (k == cs && memcmp(word, controller_str, cs) == 0) {
                                         found = true;
                                         break;
                                 }
@@ -951,14 +1080,14 @@ int cg_pid_get_path(const char *controller, pid_t pid, char **path) {
 int cg_install_release_agent(const char *controller, const char *agent) {
         _cleanup_free_ char *fs = NULL, *contents = NULL;
         const char *sc;
-        int r, unified;
+        int r;
 
         assert(agent);
 
-        unified = cg_unified();
-        if (unified < 0)
-                return unified;
-        if (unified) /* doesn't apply to unified hierarchy */
+        r = cg_unified_controller(controller);
+        if (r < 0)
+                return r;
+        if (r > 0) /* doesn't apply to unified hierarchy */
                 return -EOPNOTSUPP;
 
         r = cg_get_path(controller, NULL, "release_agent", &fs);
@@ -1004,12 +1133,12 @@ int cg_install_release_agent(const char *controller, const char *agent) {
 
 int cg_uninstall_release_agent(const char *controller) {
         _cleanup_free_ char *fs = NULL;
-        int r, unified;
+        int r;
 
-        unified = cg_unified();
-        if (unified < 0)
-                return unified;
-        if (unified) /* Doesn't apply to unified hierarchy */
+        r = cg_unified_controller(controller);
+        if (r < 0)
+                return r;
+        if (r > 0) /* Doesn't apply to unified hierarchy */
                 return -EOPNOTSUPP;
 
         r = cg_get_path(controller, NULL, "notify_on_release", &fs);
@@ -1054,7 +1183,7 @@ int cg_is_empty(const char *controller, const char *path) {
 }
 
 int cg_is_empty_recursive(const char *controller, const char *path) {
-        int unified, r;
+        int r;
 
         assert(path);
 
@@ -1062,11 +1191,10 @@ int cg_is_empty_recursive(const char *controller, const char *path) {
         if (controller && (isempty(path) || path_equal(path, "/")))
                 return false;
 
-        unified = cg_unified();
-        if (unified < 0)
-                return unified;
-
-        if (unified > 0) {
+        r = cg_unified_controller(controller);
+        if (r < 0)
+                return r;
+        if (r > 0) {
                 _cleanup_free_ char *t = NULL;
 
                 /* On the unified hierarchy we can check empty state
@@ -1094,7 +1222,7 @@ int cg_is_empty_recursive(const char *controller, const char *path) {
                 while ((r = cg_read_subgroup(d, &fn)) > 0) {
                         _cleanup_free_ char *p = NULL;
 
-                        p = strjoin(path, "/", fn, NULL);
+                        p = strjoin(path, "/", fn);
                         free(fn);
                         if (!p)
                                 return -ENOMEM;
@@ -1656,7 +1784,7 @@ int cg_path_get_slice(const char *p, char **slice) {
                         if (!e) {
                                 char *s;
 
-                                s = strdup("-.slice");
+                                s = strdup(SPECIAL_ROOT_SLICE);
                                 if (!s)
                                         return -ENOMEM;
 
@@ -1786,6 +1914,9 @@ bool cg_controller_is_valid(const char *p) {
         if (!p)
                 return false;
 
+        if (streq(p, SYSTEMD_CGROUP_CONTROLLER))
+                return true;
+
         s = startswith(p, "name=");
         if (s)
                 p = s;
@@ -1811,7 +1942,7 @@ int cg_slice_to_path(const char *unit, char **ret) {
         assert(unit);
         assert(ret);
 
-        if (streq(unit, "-.slice")) {
+        if (streq(unit, SPECIAL_ROOT_SLICE)) {
                 char *x;
 
                 x = strdup("");
@@ -1894,9 +2025,52 @@ int cg_get_attribute(const char *controller, const char *path, const char *attri
         return read_one_line_file(p, ret);
 }
 
+int cg_get_keyed_attribute(const char *controller, const char *path, const char *attribute, const char **keys, char **values) {
+        _cleanup_free_ char *filename = NULL, *content = NULL;
+        char *line, *p;
+        int i, r;
+
+        for (i = 0; keys[i]; i++)
+                values[i] = NULL;
+
+        r = cg_get_path(controller, path, attribute, &filename);
+        if (r < 0)
+                return r;
+
+        r = read_full_file(filename, &content, NULL);
+        if (r < 0)
+                return r;
+
+        p = content;
+        while ((line = strsep(&p, "\n"))) {
+                char *key;
+
+                key = strsep(&line, " ");
+
+                for (i = 0; keys[i]; i++) {
+                        if (streq(key, keys[i])) {
+                                values[i] = strdup(line);
+                                break;
+                        }
+                }
+        }
+
+        for (i = 0; keys[i]; i++) {
+                if (!values[i]) {
+                        for (i = 0; keys[i]; i++) {
+                                free(values[i]);
+                                values[i] = NULL;
+                        }
+                        return -ENOENT;
+                }
+        }
+
+        return 0;
+}
+
 int cg_create_everywhere(CGroupMask supported, CGroupMask mask, const char *path) {
         CGroupController c;
-        int r, unified;
+        int r;
 
         /* This one will create a cgroup in our private tree, but also
          * duplicate it in the trees specified in mask, and remove it
@@ -1908,10 +2082,10 @@ int cg_create_everywhere(CGroupMask supported, CGroupMask mask, const char *path
                 return r;
 
         /* If we are in the unified hierarchy, we are done now */
-        unified = cg_unified();
-        if (unified < 0)
-                return unified;
-        if (unified > 0)
+        r = cg_all_unified();
+        if (r < 0)
+                return r;
+        if (r > 0)
                 return 0;
 
         /* Otherwise, do the same in the other hierarchies */
@@ -1932,16 +2106,16 @@ int cg_create_everywhere(CGroupMask supported, CGroupMask mask, const char *path
 
 int cg_attach_everywhere(CGroupMask supported, const char *path, pid_t pid, cg_migrate_callback_t path_callback, void *userdata) {
         CGroupController c;
-        int r, unified;
+        int r;
 
         r = cg_attach(SYSTEMD_CGROUP_CONTROLLER, path, pid);
         if (r < 0)
                 return r;
 
-        unified = cg_unified();
-        if (unified < 0)
-                return unified;
-        if (unified > 0)
+        r = cg_all_unified();
+        if (r < 0)
+                return r;
+        if (r > 0)
                 return 0;
 
         for (c = 0; c < _CGROUP_CONTROLLER_MAX; c++) {
@@ -1982,7 +2156,7 @@ int cg_attach_many_everywhere(CGroupMask supported, const char *path, Set* pids,
 
 int cg_migrate_everywhere(CGroupMask supported, const char *from, const char *to, cg_migrate_callback_t to_callback, void *userdata) {
         CGroupController c;
-        int r = 0, unified;
+        int r = 0, q;
 
         if (!path_equal(from, to))  {
                 r = cg_migrate_recursive(SYSTEMD_CGROUP_CONTROLLER, from, SYSTEMD_CGROUP_CONTROLLER, to, CGROUP_REMOVE);
@@ -1990,10 +2164,10 @@ int cg_migrate_everywhere(CGroupMask supported, const char *from, const char *to
                         return r;
         }
 
-        unified = cg_unified();
-        if (unified < 0)
-                return unified;
-        if (unified > 0)
+        q = cg_all_unified();
+        if (q < 0)
+                return q;
+        if (q > 0)
                 return r;
 
         for (c = 0; c < _CGROUP_CONTROLLER_MAX; c++) {
@@ -2017,16 +2191,16 @@ int cg_migrate_everywhere(CGroupMask supported, const char *from, const char *to
 
 int cg_trim_everywhere(CGroupMask supported, const char *path, bool delete_root) {
         CGroupController c;
-        int r, unified;
+        int r, q;
 
         r = cg_trim(SYSTEMD_CGROUP_CONTROLLER, path, delete_root);
         if (r < 0)
                 return r;
 
-        unified = cg_unified();
-        if (unified < 0)
-                return unified;
-        if (unified > 0)
+        q = cg_all_unified();
+        if (q < 0)
+                return q;
+        if (q > 0)
                 return r;
 
         for (c = 0; c < _CGROUP_CONTROLLER_MAX; c++) {
@@ -2041,20 +2215,73 @@ int cg_trim_everywhere(CGroupMask supported, const char *path, bool delete_root)
         return 0;
 }
 
+int cg_mask_to_string(CGroupMask mask, char **ret) {
+        const char *controllers[_CGROUP_CONTROLLER_MAX + 1];
+        CGroupController c;
+        int i = 0;
+        char *s;
+
+        assert(ret);
+
+        if (mask == 0) {
+                *ret = NULL;
+                return 0;
+        }
+
+        for (c = 0; c < _CGROUP_CONTROLLER_MAX; c++) {
+
+                if (!(mask & CGROUP_CONTROLLER_TO_MASK(c)))
+                        continue;
+
+                controllers[i++] = cgroup_controller_to_string(c);
+                controllers[i] = NULL;
+        }
+
+        s = strv_join((char **)controllers, NULL);
+        if (!s)
+                return -ENOMEM;
+
+        *ret = s;
+        return 0;
+}
+
+int cg_mask_from_string(const char *value, CGroupMask *mask) {
+        assert(mask);
+        assert(value);
+
+        for (;;) {
+                _cleanup_free_ char *n = NULL;
+                CGroupController v;
+                int r;
+
+                r = extract_first_word(&value, &n, NULL, 0);
+                if (r < 0)
+                        return r;
+                if (r == 0)
+                        break;
+
+                v = cgroup_controller_from_string(n);
+                if (v < 0)
+                        continue;
+
+                *mask |= CGROUP_CONTROLLER_TO_MASK(v);
+        }
+        return 0;
+}
+
 int cg_mask_supported(CGroupMask *ret) {
         CGroupMask mask = 0;
-        int r, unified;
+        int r;
 
         /* Determines the mask of supported cgroup controllers. Only
          * includes controllers we can make sense of and that are
          * actually accessible. */
 
-        unified = cg_unified();
-        if (unified < 0)
-                return unified;
-        if (unified > 0) {
+        r = cg_all_unified();
+        if (r < 0)
+                return r;
+        if (r > 0) {
                 _cleanup_free_ char *root = NULL, *controllers = NULL, *path = NULL;
-                const char *c;
 
                 /* In the unified hierarchy we can read the supported
                  * and accessible controllers from a the top-level
@@ -2072,28 +2299,14 @@ int cg_mask_supported(CGroupMask *ret) {
                 if (r < 0)
                         return r;
 
-                c = controllers;
-                for (;;) {
-                        _cleanup_free_ char *n = NULL;
-                        CGroupController v;
-
-                        r = extract_first_word(&c, &n, NULL, 0);
-                        if (r < 0)
-                                return r;
-                        if (r == 0)
-                                break;
-
-                        v = cgroup_controller_from_string(n);
-                        if (v < 0)
-                                continue;
-
-                        mask |= CGROUP_CONTROLLER_TO_MASK(v);
-                }
+                r = cg_mask_from_string(controllers, &mask);
+                if (r < 0)
+                        return r;
 
-                /* Currently, we only support the memory, io and pids
+                /* Currently, we support the cpu, memory, io and pids
                  * controller in the unified hierarchy, mask
                  * everything else off. */
-                mask &= CGROUP_MASK_MEMORY | CGROUP_MASK_IO | CGROUP_MASK_PIDS;
+                mask &= CGROUP_MASK_CPU | CGROUP_MASK_MEMORY | CGROUP_MASK_IO | CGROUP_MASK_PIDS;
 
         } else {
                 CGroupController c;
@@ -2170,9 +2383,21 @@ int cg_kernel_controllers(Set *controllers) {
         return 0;
 }
 
-static thread_local int unified_cache = -1;
+static thread_local CGroupUnified unified_cache = CGROUP_UNIFIED_UNKNOWN;
+
+/* The hybrid mode was initially implemented in v232 and simply mounted cgroup v2 on /sys/fs/cgroup/systemd.  This
+ * unfortunately broke other tools (such as docker) which expected the v1 "name=systemd" hierarchy on
+ * /sys/fs/cgroup/systemd.  From v233 and on, the hybrid mode mountnbs v2 on /sys/fs/cgroup/unified and maintains
+ * "name=systemd" hierarchy on /sys/fs/cgroup/systemd for compatibility with other tools.
+ *
+ * To keep live upgrade working, we detect and support v232 layout.  When v232 layout is detected, to keep cgroup v2
+ * process management but disable the compat dual layout, we return %true on
+ * cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER) and %false on cg_hybrid_unified().
+ */
+static thread_local bool unified_systemd_v232;
+
+static int cg_unified_update(void) {
 
-int cg_unified(void) {
         struct statfs fs;
 
         /* Checks if we support the unified hierarchy. Returns an
@@ -2180,40 +2405,92 @@ int cg_unified(void) {
          * have any other trouble determining if the unified hierarchy
          * is supported. */
 
-        if (unified_cache >= 0)
-                return unified_cache;
+        if (unified_cache >= CGROUP_UNIFIED_NONE)
+                return 0;
 
         if (statfs("/sys/fs/cgroup/", &fs) < 0)
                 return -errno;
 
         if (F_TYPE_EQUAL(fs.f_type, CGROUP2_SUPER_MAGIC))
-                unified_cache = true;
-        else if (F_TYPE_EQUAL(fs.f_type, TMPFS_MAGIC))
-                unified_cache = false;
-        else
+                unified_cache = CGROUP_UNIFIED_ALL;
+        else if (F_TYPE_EQUAL(fs.f_type, TMPFS_MAGIC)) {
+                if (statfs("/sys/fs/cgroup/unified/", &fs) == 0 &&
+                    F_TYPE_EQUAL(fs.f_type, CGROUP2_SUPER_MAGIC)) {
+                        unified_cache = CGROUP_UNIFIED_SYSTEMD;
+                        unified_systemd_v232 = false;
+                } else if (statfs("/sys/fs/cgroup/systemd/", &fs) == 0 &&
+                           F_TYPE_EQUAL(fs.f_type, CGROUP2_SUPER_MAGIC)) {
+                        unified_cache = CGROUP_UNIFIED_SYSTEMD;
+                        unified_systemd_v232 = true;
+                } else {
+                        if (statfs("/sys/fs/cgroup/systemd/", &fs) < 0)
+                                return -errno;
+                        if (!F_TYPE_EQUAL(fs.f_type, CGROUP_SUPER_MAGIC))
+                                return -ENOMEDIUM;
+                        unified_cache = CGROUP_UNIFIED_NONE;
+                }
+        } else
                 return -ENOMEDIUM;
 
-        return unified_cache;
+        return 0;
 }
 
-void cg_unified_flush(void) {
-        unified_cache = -1;
+int cg_unified_controller(const char *controller) {
+        int r;
+
+        r = cg_unified_update();
+        if (r < 0)
+                return r;
+
+        if (unified_cache == CGROUP_UNIFIED_NONE)
+                return false;
+
+        if (unified_cache >= CGROUP_UNIFIED_ALL)
+                return true;
+
+        return streq_ptr(controller, SYSTEMD_CGROUP_CONTROLLER);
+}
+
+int cg_all_unified(void) {
+        int r;
+
+        r = cg_unified_update();
+        if (r < 0)
+                return r;
+
+        return unified_cache >= CGROUP_UNIFIED_ALL;
+}
+
+int cg_hybrid_unified(void) {
+        int r;
+
+        r = cg_unified_update();
+        if (r < 0)
+                return r;
+
+        return unified_cache == CGROUP_UNIFIED_SYSTEMD && !unified_systemd_v232;
+}
+
+int cg_unified_flush(void) {
+        unified_cache = CGROUP_UNIFIED_UNKNOWN;
+
+        return cg_unified_update();
 }
 
 int cg_enable_everywhere(CGroupMask supported, CGroupMask mask, const char *p) {
         _cleanup_free_ char *fs = NULL;
         CGroupController c;
-        int r, unified;
+        int r;
 
         assert(p);
 
         if (supported == 0)
                 return 0;
 
-        unified = cg_unified();
-        if (unified < 0)
-                return unified;
-        if (!unified) /* on the legacy hiearchy there's no joining of controllers defined */
+        r = cg_all_unified();
+        if (r < 0)
+                return r;
+        if (r == 0) /* on the legacy hiearchy there's no joining of controllers defined */
                 return 0;
 
         r = cg_get_path(SYSTEMD_CGROUP_CONTROLLER, p, "cgroup.subtree_control", &fs);
@@ -2245,38 +2522,69 @@ int cg_enable_everywhere(CGroupMask supported, CGroupMask mask, const char *p) {
 
 bool cg_is_unified_wanted(void) {
         static thread_local int wanted = -1;
-        int r, unified;
+        int r;
+        bool b;
+        const bool is_default = DEFAULT_HIERARCHY == CGROUP_UNIFIED_ALL;
+
+        /* If we have a cached value, return that. */
+        if (wanted >= 0)
+                return wanted;
 
         /* If the hierarchy is already mounted, then follow whatever
          * was chosen for it. */
-        unified = cg_unified();
-        if (unified >= 0)
-                return unified;
+        if (cg_unified_flush() >= 0)
+                return (wanted = unified_cache >= CGROUP_UNIFIED_ALL);
+
+        /* Otherwise, let's see what the kernel command line has to say.
+         * Since checking is expensive, cache a non-error result. */
+        r = proc_cmdline_get_bool("systemd.unified_cgroup_hierarchy", &b);
+
+        return (wanted = r > 0 ? b : is_default);
+}
+
+bool cg_is_legacy_wanted(void) {
+        static thread_local int wanted = -1;
 
-        /* Otherwise, let's see what the kernel command line has to
-         * say. Since checking that is expensive, let's cache the
-         * result. */
+        /* If we have a cached value, return that. */
         if (wanted >= 0)
                 return wanted;
 
-        r = get_proc_cmdline_key("systemd.unified_cgroup_hierarchy", NULL);
-        if (r > 0)
-                return (wanted = true);
-        else {
-                _cleanup_free_ char *value = NULL;
+        /* Check if we have cgroups2 already mounted. */
+        if (cg_unified_flush() >= 0 &&
+            unified_cache == CGROUP_UNIFIED_ALL)
+                return (wanted = false);
 
-                r = get_proc_cmdline_key("systemd.unified_cgroup_hierarchy=", &value);
-                if (r < 0)
-                        return false;
-                if (r == 0)
-                        return (wanted = false);
-
-                return (wanted = parse_boolean(value) > 0);
-        }
+        /* Otherwise, assume that at least partial legacy is wanted,
+         * since cgroups2 should already be mounted at this point. */
+        return (wanted = true);
 }
 
-bool cg_is_legacy_wanted(void) {
-        return !cg_is_unified_wanted();
+bool cg_is_hybrid_wanted(void) {
+        static thread_local int wanted = -1;
+        int r;
+        bool b;
+        const bool is_default = DEFAULT_HIERARCHY >= CGROUP_UNIFIED_SYSTEMD;
+        /* We default to true if the default is "hybrid", obviously,
+         * but also when the default is "unified", because if we get
+         * called, it means that unified hierarchy was not mounted. */
+
+        /* If we have a cached value, return that. */
+        if (wanted >= 0)
+                return wanted;
+
+        /* If the hierarchy is already mounted, then follow whatever
+         * was chosen for it. */
+        if (cg_unified_flush() >= 0 &&
+            unified_cache == CGROUP_UNIFIED_ALL)
+                return (wanted = false);
+
+        /* Otherwise, let's see what the kernel command line has to say.
+         * Since checking is expensive, cache a non-error result. */
+        r = proc_cmdline_get_bool("systemd.legacy_systemd_cgroup_controller", &b);
+
+        /* The meaning of the kernel option is reversed wrt. to the return value
+         * of this function, hence the negation. */
+        return (wanted = r > 0 ? !b : is_default);
 }
 
 int cg_weight_parse(const char *s, uint64_t *ret) {
@@ -2355,6 +2663,20 @@ int cg_blkio_weight_parse(const char *s, uint64_t *ret) {
         return 0;
 }
 
+bool is_cgroup_fs(const struct statfs *s) {
+        return is_fs_type(s, CGROUP_SUPER_MAGIC) ||
+               is_fs_type(s, CGROUP2_SUPER_MAGIC);
+}
+
+bool fd_is_cgroup_fs(int fd) {
+        struct statfs s;
+
+        if (fstatfs(fd, &s) < 0)
+                return -errno;
+
+        return is_cgroup_fs(&s);
+}
+
 static const char *cgroup_controller_table[_CGROUP_CONTROLLER_MAX] = {
         [CGROUP_CONTROLLER_CPU] = "cpu",
         [CGROUP_CONTROLLER_CPUACCT] = "cpuacct",
index 14ebde5..c16a337 100644 (file)
@@ -23,6 +23,7 @@
 #include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
+#include <sys/statfs.h>
 #include <sys/types.h>
 
 #include "def.h"
@@ -112,6 +113,17 @@ static inline bool CGROUP_BLKIO_WEIGHT_IS_OK(uint64_t x) {
             (x >= CGROUP_BLKIO_WEIGHT_MIN && x <= CGROUP_BLKIO_WEIGHT_MAX);
 }
 
+/* Default resource limits */
+#define DEFAULT_TASKS_MAX_PERCENTAGE            15U /* 15% of PIDs, 4915 on default settings */
+#define DEFAULT_USER_TASKS_MAX_PERCENTAGE       33U /* 33% of PIDs, 10813 on default settings */
+
+typedef enum CGroupUnified {
+        CGROUP_UNIFIED_UNKNOWN = -1,
+        CGROUP_UNIFIED_NONE = 0,        /* Both systemd and controllers on legacy */
+        CGROUP_UNIFIED_SYSTEMD = 1,     /* Only systemd on unified */
+        CGROUP_UNIFIED_ALL = 2,         /* Both systemd and controllers on unified */
+} CGroupUnified;
+
 /*
  * General rules:
  *
@@ -169,10 +181,14 @@ int cg_create_and_attach(const char *controller, const char *path, pid_t pid);
 
 int cg_set_attribute(const char *controller, const char *path, const char *attribute, const char *value);
 int cg_get_attribute(const char *controller, const char *path, const char *attribute, char **ret);
+int cg_get_keyed_attribute(const char *controller, const char *path, const char *attribute, const char **keys, char **values);
 
 int cg_set_group_access(const char *controller, const char *path, mode_t mode, uid_t uid, gid_t gid);
 int cg_set_task_access(const char *controller, const char *path, mode_t mode, uid_t uid, gid_t gid);
 
+int cg_set_xattr(const char *controller, const char *path, const char *name, const void *value, size_t size, int flags);
+int cg_get_xattr(const char *controller, const char *path, const char *name, void *value, size_t size);
+
 int cg_install_release_agent(const char *controller, const char *agent);
 int cg_uninstall_release_agent(const char *controller);
 
@@ -219,14 +235,21 @@ int cg_trim_everywhere(CGroupMask supported, const char *path, bool delete_root)
 int cg_enable_everywhere(CGroupMask supported, CGroupMask mask, const char *p);
 
 int cg_mask_supported(CGroupMask *ret);
+int cg_mask_from_string(const char *s, CGroupMask *ret);
+int cg_mask_to_string(CGroupMask mask, char **ret);
 
 int cg_kernel_controllers(Set *controllers);
 
-int cg_unified(void);
-void cg_unified_flush(void);
+bool cg_ns_supported(void);
+
+int cg_all_unified(void);
+int cg_hybrid_unified(void);
+int cg_unified_controller(const char *controller);
+int cg_unified_flush(void);
 
 bool cg_is_unified_wanted(void);
 bool cg_is_legacy_wanted(void);
+bool cg_is_hybrid_wanted(void);
 
 const char* cgroup_controller_to_string(CGroupController c) _const_;
 CGroupController cgroup_controller_from_string(const char *s) _pure_;
@@ -234,3 +257,6 @@ CGroupController cgroup_controller_from_string(const char *s) _pure_;
 int cg_weight_parse(const char *s, uint64_t *ret);
 int cg_cpu_shares_parse(const char *s, uint64_t *ret);
 int cg_blkio_weight_parse(const char *s, uint64_t *ret);
+
+bool is_cgroup_fs(const struct statfs *s);
+bool fd_is_cgroup_fs(int fd);
index c781610..b8f0f5d 100644 (file)
@@ -43,7 +43,6 @@ static int files_add(Hashmap *h, const char *root, const char *path, const char
         int r;
 
         assert(path);
-        assert(suffix);
 
         dirpath = prefix_roota(root, path);
 
@@ -60,7 +59,7 @@ static int files_add(Hashmap *h, const char *root, const char *path, const char
                 if (!dirent_is_file_with_suffix(de, suffix))
                         continue;
 
-                p = strjoin(dirpath, "/", de->d_name, NULL);
+                p = strjoin(dirpath, "/", de->d_name);
                 if (!p)
                         return -ENOMEM;
 
@@ -94,7 +93,6 @@ static int conf_files_list_strv_internal(char ***strv, const char *suffix, const
         int r;
 
         assert(strv);
-        assert(suffix);
 
         /* This alters the dirs string array */
         if (!path_strv_resolve_uniq(dirs, root))
@@ -126,7 +124,6 @@ int conf_files_list_strv(char ***strv, const char *suffix, const char *root, con
         _cleanup_strv_free_ char **copy = NULL;
 
         assert(strv);
-        assert(suffix);
 
         copy = strv_copy((char**) dirs);
         if (!copy)
@@ -140,7 +137,6 @@ int conf_files_list(char ***strv, const char *suffix, const char *root, const ch
         va_list ap;
 
         assert(strv);
-        assert(suffix);
 
         va_start(ap, dir);
         dirs = strv_new_ap(dir, ap);
@@ -156,7 +152,6 @@ int conf_files_list_nulstr(char ***strv, const char *suffix, const char *root, c
         _cleanup_strv_free_ char **dirs = NULL;
 
         assert(strv);
-        assert(suffix);
 
         dirs = strv_split_nulstr(d);
         if (!dirs)
index 9883f5f..e120b9e 100644 (file)
@@ -45,6 +45,7 @@
 #include "strv.h"
 #include "time-util.h"
 #include "umask-util.h"
+#include "user-util.h"
 #include "xattr-util.h"
 
 #define COPY_BUFFER_SIZE (16*1024u)
@@ -68,7 +69,7 @@ static ssize_t try_copy_file_range(int fd_in, loff_t *off_in,
                 return -errno;
 }
 
-int copy_bytes(int fdf, int fdt, uint64_t max_bytes, bool try_reflink) {
+int copy_bytes(int fdf, int fdt, uint64_t max_bytes, CopyFlags copy_flags) {
         bool try_cfr = true, try_sendfile = true, try_splice = true;
         int r;
         size_t m = SSIZE_MAX; /* that is the maximum that sendfile and c_f_r accept */
@@ -77,7 +78,7 @@ int copy_bytes(int fdf, int fdt, uint64_t max_bytes, bool try_reflink) {
         assert(fdt >= 0);
 
         /* Try btrfs reflinks first. */
-        if (try_reflink &&
+        if ((copy_flags & COPY_REFLINK) &&
             max_bytes == (uint64_t) -1 &&
             lseek(fdf, 0, SEEK_CUR) == 0 &&
             lseek(fdt, 0, SEEK_CUR) == 0) {
@@ -176,7 +177,16 @@ int copy_bytes(int fdf, int fdt, uint64_t max_bytes, bool try_reflink) {
         return 0; /* return 0 if we hit EOF earlier than the size limit */
 }
 
-static int fd_copy_symlink(int df, const char *from, const struct stat *st, int dt, const char *to) {
+static int fd_copy_symlink(
+                int df,
+                const char *from,
+                const struct stat *st,
+                int dt,
+                const char *to,
+                uid_t override_uid,
+                gid_t override_gid,
+                CopyFlags copy_flags) {
+
         _cleanup_free_ char *target = NULL;
         int r;
 
@@ -191,13 +201,25 @@ static int fd_copy_symlink(int df, const char *from, const struct stat *st, int
         if (symlinkat(target, dt, to) < 0)
                 return -errno;
 
-        if (fchownat(dt, to, st->st_uid, st->st_gid, AT_SYMLINK_NOFOLLOW) < 0)
+        if (fchownat(dt, to,
+                     uid_is_valid(override_uid) ? override_uid : st->st_uid,
+                     gid_is_valid(override_gid) ? override_gid : st->st_gid,
+                     AT_SYMLINK_NOFOLLOW) < 0)
                 return -errno;
 
         return 0;
 }
 
-static int fd_copy_regular(int df, const char *from, const struct stat *st, int dt, const char *to) {
+static int fd_copy_regular(
+                int df,
+                const char *from,
+                const struct stat *st,
+                int dt,
+                const char *to,
+                uid_t override_uid,
+                gid_t override_gid,
+                CopyFlags copy_flags) {
+
         _cleanup_close_ int fdf = -1, fdt = -1;
         struct timespec ts[2];
         int r, q;
@@ -214,13 +236,15 @@ static int fd_copy_regular(int df, const char *from, const struct stat *st, int
         if (fdt < 0)
                 return -errno;
 
-        r = copy_bytes(fdf, fdt, (uint64_t) -1, true);
+        r = copy_bytes(fdf, fdt, (uint64_t) -1, copy_flags);
         if (r < 0) {
                 unlinkat(dt, to, 0);
                 return r;
         }
 
-        if (fchown(fdt, st->st_uid, st->st_gid) < 0)
+        if (fchown(fdt,
+                   uid_is_valid(override_uid) ? override_uid : st->st_uid,
+                   gid_is_valid(override_gid) ? override_gid : st->st_gid) < 0)
                 r = -errno;
 
         if (fchmod(fdt, st->st_mode & 07777) < 0)
@@ -229,7 +253,6 @@ static int fd_copy_regular(int df, const char *from, const struct stat *st, int
         ts[0] = st->st_atim;
         ts[1] = st->st_mtim;
         (void) futimens(fdt, ts);
-
         (void) copy_xattr(fdf, fdt);
 
         q = close(fdt);
@@ -243,7 +266,15 @@ static int fd_copy_regular(int df, const char *from, const struct stat *st, int
         return r;
 }
 
-static int fd_copy_fifo(int df, const char *from, const struct stat *st, int dt, const char *to) {
+static int fd_copy_fifo(
+                int df,
+                const char *from,
+                const struct stat *st,
+                int dt,
+                const char *to,
+                uid_t override_uid,
+                gid_t override_gid,
+                CopyFlags copy_flags) {
         int r;
 
         assert(from);
@@ -254,7 +285,10 @@ static int fd_copy_fifo(int df, const char *from, const struct stat *st, int dt,
         if (r < 0)
                 return -errno;
 
-        if (fchownat(dt, to, st->st_uid, st->st_gid, AT_SYMLINK_NOFOLLOW) < 0)
+        if (fchownat(dt, to,
+                     uid_is_valid(override_uid) ? override_uid : st->st_uid,
+                     gid_is_valid(override_gid) ? override_gid : st->st_gid,
+                     AT_SYMLINK_NOFOLLOW) < 0)
                 r = -errno;
 
         if (fchmodat(dt, to, st->st_mode & 07777, 0) < 0)
@@ -263,7 +297,15 @@ static int fd_copy_fifo(int df, const char *from, const struct stat *st, int dt,
         return r;
 }
 
-static int fd_copy_node(int df, const char *from, const struct stat *st, int dt, const char *to) {
+static int fd_copy_node(
+                int df,
+                const char *from,
+                const struct stat *st,
+                int dt,
+                const char *to,
+                uid_t override_uid,
+                gid_t override_gid,
+                CopyFlags copy_flags) {
         int r;
 
         assert(from);
@@ -274,7 +316,10 @@ static int fd_copy_node(int df, const char *from, const struct stat *st, int dt,
         if (r < 0)
                 return -errno;
 
-        if (fchownat(dt, to, st->st_uid, st->st_gid, AT_SYMLINK_NOFOLLOW) < 0)
+        if (fchownat(dt, to,
+                     uid_is_valid(override_uid) ? override_uid : st->st_uid,
+                     gid_is_valid(override_gid) ? override_gid : st->st_gid,
+                     AT_SYMLINK_NOFOLLOW) < 0)
                 r = -errno;
 
         if (fchmodat(dt, to, st->st_mode & 07777, 0) < 0)
@@ -290,7 +335,9 @@ static int fd_copy_directory(
                 int dt,
                 const char *to,
                 dev_t original_device,
-                bool merge) {
+                uid_t override_uid,
+                gid_t override_gid,
+                CopyFlags copy_flags) {
 
         _cleanup_close_ int fdf = -1, fdt = -1;
         _cleanup_closedir_ DIR *d = NULL;
@@ -316,7 +363,7 @@ static int fd_copy_directory(
         r = mkdirat(dt, to, st->st_mode & 07777);
         if (r >= 0)
                 created = true;
-        else if (errno == EEXIST && merge)
+        else if (errno == EEXIST && (copy_flags & COPY_MERGE))
                 created = false;
         else
                 return -errno;
@@ -331,7 +378,7 @@ static int fd_copy_directory(
                 struct stat buf;
                 int q;
 
-                if (STR_IN_SET(de->d_name, ".", ".."))
+                if (dot_or_dot_dot(de->d_name))
                         continue;
 
                 if (fstatat(dirfd(d), de->d_name, &buf, AT_SYMLINK_NOFOLLOW) < 0) {
@@ -343,19 +390,19 @@ static int fd_copy_directory(
                         continue;
 
                 if (S_ISREG(buf.st_mode))
-                        q = fd_copy_regular(dirfd(d), de->d_name, &buf, fdt, de->d_name);
+                        q = fd_copy_regular(dirfd(d), de->d_name, &buf, fdt, de->d_name, override_uid, override_gid, copy_flags);
                 else if (S_ISDIR(buf.st_mode))
-                        q = fd_copy_directory(dirfd(d), de->d_name, &buf, fdt, de->d_name, original_device, merge);
+                        q = fd_copy_directory(dirfd(d), de->d_name, &buf, fdt, de->d_name, original_device, override_uid, override_gid, copy_flags);
                 else if (S_ISLNK(buf.st_mode))
-                        q = fd_copy_symlink(dirfd(d), de->d_name, &buf, fdt, de->d_name);
+                        q = fd_copy_symlink(dirfd(d), de->d_name, &buf, fdt, de->d_name, override_uid, override_gid, copy_flags);
                 else if (S_ISFIFO(buf.st_mode))
-                        q = fd_copy_fifo(dirfd(d), de->d_name, &buf, fdt, de->d_name);
+                        q = fd_copy_fifo(dirfd(d), de->d_name, &buf, fdt, de->d_name, override_uid, override_gid, copy_flags);
                 else if (S_ISBLK(buf.st_mode) || S_ISCHR(buf.st_mode) || S_ISSOCK(buf.st_mode))
-                        q = fd_copy_node(dirfd(d), de->d_name, &buf, fdt, de->d_name);
+                        q = fd_copy_node(dirfd(d), de->d_name, &buf, fdt, de->d_name, override_uid, override_gid, copy_flags);
                 else
                         q = -EOPNOTSUPP;
 
-                if (q == -EEXIST && merge)
+                if (q == -EEXIST && (copy_flags & COPY_MERGE))
                         q = 0;
 
                 if (q < 0)
@@ -368,7 +415,9 @@ static int fd_copy_directory(
                         st->st_mtim
                 };
 
-                if (fchown(fdt, st->st_uid, st->st_gid) < 0)
+                if (fchown(fdt,
+                           uid_is_valid(override_uid) ? override_uid : st->st_uid,
+                           gid_is_valid(override_gid) ? override_gid : st->st_gid) < 0)
                         r = -errno;
 
                 if (fchmod(fdt, st->st_mode & 07777) < 0)
@@ -381,7 +430,7 @@ static int fd_copy_directory(
         return r;
 }
 
-int copy_tree_at(int fdf, const char *from, int fdt, const char *to, bool merge) {
+int copy_tree_at(int fdf, const char *from, int fdt, const char *to, uid_t override_uid, gid_t override_gid, CopyFlags copy_flags) {
         struct stat st;
 
         assert(from);
@@ -391,24 +440,24 @@ int copy_tree_at(int fdf, const char *from, int fdt, const char *to, bool merge)
                 return -errno;
 
         if (S_ISREG(st.st_mode))
-                return fd_copy_regular(fdf, from, &st, fdt, to);
+                return fd_copy_regular(fdf, from, &st, fdt, to, override_uid, override_gid, copy_flags);
         else if (S_ISDIR(st.st_mode))
-                return fd_copy_directory(fdf, from, &st, fdt, to, st.st_dev, merge);
+                return fd_copy_directory(fdf, from, &st, fdt, to, st.st_dev, override_uid, override_gid, copy_flags);
         else if (S_ISLNK(st.st_mode))
-                return fd_copy_symlink(fdf, from, &st, fdt, to);
+                return fd_copy_symlink(fdf, from, &st, fdt, to, override_uid, override_gid, copy_flags);
         else if (S_ISFIFO(st.st_mode))
-                return fd_copy_fifo(fdf, from, &st, fdt, to);
+                return fd_copy_fifo(fdf, from, &st, fdt, to, override_uid, override_gid, copy_flags);
         else if (S_ISBLK(st.st_mode) || S_ISCHR(st.st_mode) || S_ISSOCK(st.st_mode))
-                return fd_copy_node(fdf, from, &st, fdt, to);
+                return fd_copy_node(fdf, from, &st, fdt, to, override_uid, override_gid, copy_flags);
         else
                 return -EOPNOTSUPP;
 }
 
-int copy_tree(const char *from, const char *to, bool merge) {
-        return copy_tree_at(AT_FDCWD, from, AT_FDCWD, to, merge);
+int copy_tree(const char *from, const char *to, uid_t override_uid, gid_t override_gid, CopyFlags copy_flags) {
+        return copy_tree_at(AT_FDCWD, from, AT_FDCWD, to, override_uid, override_gid, copy_flags);
 }
 
-int copy_directory_fd(int dirfd, const char *to, bool merge) {
+int copy_directory_fd(int dirfd, const char *to, CopyFlags copy_flags) {
         struct stat st;
 
         assert(dirfd >= 0);
@@ -420,10 +469,10 @@ int copy_directory_fd(int dirfd, const char *to, bool merge) {
         if (!S_ISDIR(st.st_mode))
                 return -ENOTDIR;
 
-        return fd_copy_directory(dirfd, NULL, &st, AT_FDCWD, to, st.st_dev, merge);
+        return fd_copy_directory(dirfd, NULL, &st, AT_FDCWD, to, st.st_dev, UID_INVALID, GID_INVALID, copy_flags);
 }
 
-int copy_directory(const char *from, const char *to, bool merge) {
+int copy_directory(const char *from, const char *to, CopyFlags copy_flags) {
         struct stat st;
 
         assert(from);
@@ -435,10 +484,10 @@ int copy_directory(const char *from, const char *to, bool merge) {
         if (!S_ISDIR(st.st_mode))
                 return -ENOTDIR;
 
-        return fd_copy_directory(AT_FDCWD, from, &st, AT_FDCWD, to, st.st_dev, merge);
+        return fd_copy_directory(AT_FDCWD, from, &st, AT_FDCWD, to, st.st_dev, UID_INVALID, GID_INVALID, copy_flags);
 }
 
-int copy_file_fd(const char *from, int fdt, bool try_reflink) {
+int copy_file_fd(const char *from, int fdt, CopyFlags copy_flags) {
         _cleanup_close_ int fdf = -1;
         int r;
 
@@ -449,7 +498,7 @@ int copy_file_fd(const char *from, int fdt, bool try_reflink) {
         if (fdf < 0)
                 return -errno;
 
-        r = copy_bytes(fdf, fdt, (uint64_t) -1, try_reflink);
+        r = copy_bytes(fdf, fdt, (uint64_t) -1, copy_flags);
 
         (void) copy_times(fdf, fdt);
         (void) copy_xattr(fdf, fdt);
@@ -457,7 +506,7 @@ int copy_file_fd(const char *from, int fdt, bool try_reflink) {
         return r;
 }
 
-int copy_file(const char *from, const char *to, int flags, mode_t mode, unsigned chattr_flags) {
+int copy_file(const char *from, const char *to, int flags, mode_t mode, unsigned chattr_flags, CopyFlags copy_flags) {
         int fdt = -1, r;
 
         assert(from);
@@ -472,7 +521,7 @@ int copy_file(const char *from, const char *to, int flags, mode_t mode, unsigned
         if (chattr_flags != 0)
                 (void) chattr_fd(fdt, chattr_flags, (unsigned) -1);
 
-        r = copy_file_fd(from, fdt, true);
+        r = copy_file_fd(from, fdt, copy_flags);
         if (r < 0) {
                 close(fdt);
                 unlink(to);
@@ -487,7 +536,7 @@ int copy_file(const char *from, const char *to, int flags, mode_t mode, unsigned
         return 0;
 }
 
-int copy_file_atomic(const char *from, const char *to, mode_t mode, bool replace, unsigned chattr_flags) {
+int copy_file_atomic(const char *from, const char *to, mode_t mode, unsigned chattr_flags, CopyFlags copy_flags) {
         _cleanup_free_ char *t = NULL;
         int r;
 
@@ -498,18 +547,18 @@ int copy_file_atomic(const char *from, const char *to, mode_t mode, bool replace
         if (r < 0)
                 return r;
 
-        r = copy_file(from, t, O_NOFOLLOW|O_EXCL, mode, chattr_flags);
+        r = copy_file(from, t, O_NOFOLLOW|O_EXCL, mode, chattr_flags, copy_flags);
         if (r < 0)
                 return r;
 
-        if (replace) {
+        if (copy_flags & COPY_REPLACE) {
                 r = renameat(AT_FDCWD, t, AT_FDCWD, to);
                 if (r < 0)
                         r = -errno;
         } else
                 r = rename_noreplace(AT_FDCWD, t, AT_FDCWD, to);
         if (r < 0) {
-                (void) unlink_noerrno(t);
+                (void) unlink(t);
                 return r;
         }
 
index b5d08eb..4f3e114 100644 (file)
 #include <stdint.h>
 #include <sys/types.h>
 
-int copy_file_fd(const char *from, int to, bool try_reflink);
-int copy_file(const char *from, const char *to, int flags, mode_t mode, unsigned chattr_flags);
-int copy_file_atomic(const char *from, const char *to, mode_t mode, bool replace, unsigned chattr_flags);
-int copy_tree(const char *from, const char *to, bool merge);
-int copy_tree_at(int fdf, const char *from, int fdt, const char *to, bool merge);
-int copy_directory_fd(int dirfd, const char *to, bool merge);
-int copy_directory(const char *from, const char *to, bool merge);
-int copy_bytes(int fdf, int fdt, uint64_t max_bytes, bool try_reflink);
+typedef enum CopyFlags {
+        COPY_REFLINK    = 0x1,      /* try to reflink */
+        COPY_MERGE      = 0x2,      /* merge existing trees with our new one to copy */
+        COPY_REPLACE    = 0x4,      /* replace an existing file if there's one */
+} CopyFlags;
+
+int copy_file_fd(const char *from, int to, CopyFlags copy_flags);
+int copy_file(const char *from, const char *to, int open_flags, mode_t mode, unsigned chattr_flags, CopyFlags copy_flags);
+int copy_file_atomic(const char *from, const char *to, mode_t mode, unsigned chattr_flags, CopyFlags copy_flags);
+int copy_tree(const char *from, const char *to, uid_t override_uid, gid_t override_gid, CopyFlags copy_flags);
+int copy_tree_at(int fdf, const char *from, int fdt, const char *to, uid_t override_uid, gid_t override_gid, CopyFlags copy_flags);
+int copy_directory_fd(int dirfd, const char *to, CopyFlags copy_flags);
+int copy_directory(const char *from, const char *to, CopyFlags copy_flags);
+int copy_bytes(int fdf, int fdt, uint64_t max_bytes, CopyFlags copy_flags);
 int copy_times(int fdf, int fdt);
 int copy_xattr(int fdf, int fdt);
index 1a7a0f4..b1a3bc1 100644 (file)
@@ -36,7 +36,9 @@
 /* The default value for the net.unix.max_dgram_qlen sysctl */
 #define DEFAULT_UNIX_MAX_DGRAM_QLEN 512UL
 
-#define SYSTEMD_CGROUP_CONTROLLER "name=systemd"
+#define SYSTEMD_CGROUP_CONTROLLER_LEGACY "name=systemd"
+#define SYSTEMD_CGROUP_CONTROLLER_HYBRID "name=unified"
+#define SYSTEMD_CGROUP_CONTROLLER "_systemd"
 
 #define SIGNALS_CRASH_HANDLER SIGSEGV,SIGILL,SIGFPE,SIGBUS,SIGQUIT,SIGABRT
 #define SIGNALS_IGNORE SIGPIPE
                 .un.sun_path = "\0/org/freedesktop/plymouthd",  \
         }
 
-#ifndef TTY_GID
-#define TTY_GID 5
-#endif
-
 #define NOTIFY_FD_MAX 768
 #define NOTIFY_BUFFER_MAX PIPE_BUF
 
 #ifdef HAVE_SPLIT_USR
-#define _CONF_PATHS_SPLIT_USR(n) "/lib/" n "\0"
+#  define _CONF_PATHS_SPLIT_USR(n) "/lib/" n "\0"
 #else
-#define _CONF_PATHS_SPLIT_USR(n)
+#  define _CONF_PATHS_SPLIT_USR(n)
 #endif
 
 /* Return a nulstr for a standard cascade of configuration paths,
- * suitable to pass to conf_files_list_nulstr() or config_parse_many()
+ * suitable to pass to conf_files_list_nulstr() or config_parse_many_nulstr()
  * to implement drop-in directories for extending configuration
  * files. */
-#define CONF_PATHS_NULSTR(n) \
-        "/etc/" n "\0" \
-        "/run/" n "\0" \
-        "/usr/local/lib/" n "\0" \
-        "/usr/lib/" n "\0" \
+#define CONF_PATHS_NULSTR(n)                    \
+        "/etc/" n "\0"                          \
+        "/run/" n "\0"                          \
+        "/usr/local/lib/" n "\0"                \
+        "/usr/lib/" n "\0"                      \
         _CONF_PATHS_SPLIT_USR(n)
index 5906712..5bf58bc 100644 (file)
@@ -70,5 +70,19 @@ bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) {
         if (de->d_name[0] == '.')
                 return false;
 
+        if (!suffix)
+                return true;
+
         return endswith(de->d_name, suffix);
 }
+
+struct dirent* readdir_no_dot(DIR *dirp) {
+        struct dirent* d;
+
+        for (;;) {
+                d = readdir(dirp);
+                if (d && dot_or_dot_dot(d->d_name))
+                        continue;
+                return d;
+        }
+}
index b91d049..18b9db9 100644 (file)
@@ -31,6 +31,8 @@ int dirent_ensure_type(DIR *d, struct dirent *de);
 bool dirent_is_file(const struct dirent *de) _pure_;
 bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) _pure_;
 
+struct dirent* readdir_no_dot(DIR *dirp);
+
 #define FOREACH_DIRENT(de, d, on_error)                                 \
         for (errno = 0, de = readdir(d);; errno = 0, de = readdir(d))   \
                 if (!de) {                                              \
index 7f5fddb..56e7b6f 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "alloc-util.h"
 #include "env-util.h"
+#include "escape.h"
 #include "extract-word.h"
 #include "macro.h"
 #include "parse-util.h"
@@ -247,7 +248,7 @@ fail:
         return NULL;
 }
 
-_pure_ static bool env_match(const char *t, const char *pattern) {
+static bool env_match(const char *t, const char *pattern) {
         assert(t);
         assert(pattern);
 
@@ -273,6 +274,19 @@ _pure_ static bool env_match(const char *t, const char *pattern) {
         return false;
 }
 
+static bool env_entry_has_name(const char *entry, const char *name) {
+        const char *t;
+
+        assert(entry);
+        assert(name);
+
+        t = startswith(entry, name);
+        if (!t)
+                return false;
+
+        return *t == '=';
+}
+
 char **strv_env_delete(char **x, unsigned n_lists, ...) {
         size_t n, i = 0;
         char **k, **r;
@@ -384,6 +398,35 @@ char **strv_env_unset_many(char **l, ...) {
         return l;
 }
 
+int strv_env_replace(char ***l, char *p) {
+        char **f;
+        const char *t, *name;
+
+        assert(p);
+
+        /* Replace first occurrence of the env var or add a new one in the
+         * string list. Drop other occurences. Edits in-place. Does not copy p.
+         * p must be a valid key=value assignment.
+         */
+
+        t = strchr(p, '=');
+        assert(t);
+
+        name = strndupa(p, t - p);
+
+        for (f = *l; f && *f; f++)
+                if (env_entry_has_name(*f, name)) {
+                        free_and_replace(*f, p);
+                        strv_env_unset(f + 1, *f);
+                        return 0;
+                }
+
+        /* We didn't find a match, we need to append p or create a new strv */
+        if (strv_push(l, p) < 0)
+                return -ENOMEM;
+        return 1;
+}
+
 char **strv_env_set(char **x, const char *p) {
 
         char **k, **r;
@@ -411,7 +454,7 @@ fail:
         return NULL;
 }
 
-char *strv_env_get_n(char **l, const char *name, size_t k) {
+char *strv_env_get_n(char **l, const char *name, size_t k, unsigned flags) {
         char **i;
 
         assert(name);
@@ -419,18 +462,25 @@ char *strv_env_get_n(char **l, const char *name, size_t k) {
         if (k <= 0)
                 return NULL;
 
-        STRV_FOREACH(i, l)
+        STRV_FOREACH_BACKWARDS(i, l)
                 if (strneq(*i, name, k) &&
                     (*i)[k] == '=')
                         return *i + k + 1;
 
+        if (flags & REPLACE_ENV_USE_ENVIRONMENT) {
+                const char *t;
+
+                t = strndupa(name, k);
+                return getenv(t);
+        };
+
         return NULL;
 }
 
 char *strv_env_get(char **l, const char *name) {
         assert(name);
 
-        return strv_env_get_n(l, name, strlen(name));
+        return strv_env_get_n(l, name, strlen(name), 0);
 }
 
 char **strv_env_clean_with_callback(char **e, void (*invalid_callback)(const char *p, void *userdata), void *userdata) {
@@ -469,19 +519,26 @@ char **strv_env_clean_with_callback(char **e, void (*invalid_callback)(const cha
         return e;
 }
 
-char *replace_env(const char *format, char **env) {
+char *replace_env_n(const char *format, size_t n, char **env, unsigned flags) {
         enum {
                 WORD,
                 CURLY,
-                VARIABLE
+                VARIABLE,
+                VARIABLE_RAW,
+                TEST,
+                DEFAULT_VALUE,
+                ALTERNATE_VALUE,
         } state = WORD;
 
-        const char *e, *word = format;
-        char *r = NULL, *k;
+        const char *e, *word = format, *test_value;
+        char *k;
+        _cleanup_free_ char *r = NULL;
+        size_t i, len;
+        int nest = 0;
 
         assert(format);
 
-        for (e = format; *e; e ++) {
+        for (e = format, i = 0; *e && i < n; e ++, i ++) {
 
                 switch (state) {
 
@@ -494,24 +551,36 @@ char *replace_env(const char *format, char **env) {
                         if (*e == '{') {
                                 k = strnappend(r, word, e-word-1);
                                 if (!k)
-                                        goto fail;
+                                        return NULL;
 
                                 free(r);
                                 r = k;
 
                                 word = e-1;
                                 state = VARIABLE;
-
+                                nest++;
                         } else if (*e == '$') {
                                 k = strnappend(r, word, e-word);
                                 if (!k)
-                                        goto fail;
+                                        return NULL;
 
                                 free(r);
                                 r = k;
 
                                 word = e+1;
                                 state = WORD;
+
+                        } else if (flags & REPLACE_ENV_ALLOW_BRACELESS && strchr(VALID_CHARS_ENV_NAME, *e)) {
+                                k = strnappend(r, word, e-word-1);
+                                if (!k)
+                                        return NULL;
+
+                                free(r);
+                                r = k;
+
+                                word = e-1;
+                                state = VARIABLE_RAW;
+
                         } else
                                 state = WORD;
                         break;
@@ -520,32 +589,109 @@ char *replace_env(const char *format, char **env) {
                         if (*e == '}') {
                                 const char *t;
 
-                                t = strempty(strv_env_get_n(env, word+2, e-word-2));
+                                t = strv_env_get_n(env, word+2, e-word-2, flags);
 
                                 k = strappend(r, t);
                                 if (!k)
-                                        goto fail;
+                                        return NULL;
 
                                 free(r);
                                 r = k;
 
                                 word = e+1;
                                 state = WORD;
+                        } else if (*e == ':') {
+                                if (!(flags & REPLACE_ENV_ALLOW_EXTENDED))
+                                        /* Treat this as unsupported syntax, i.e. do no replacement */
+                                        state = WORD;
+                                else {
+                                        len = e-word-2;
+                                        state = TEST;
+                                }
+                        }
+                        break;
+
+                case TEST:
+                        if (*e == '-')
+                                state = DEFAULT_VALUE;
+                        else if (*e == '+')
+                                state = ALTERNATE_VALUE;
+                        else {
+                                state = WORD;
+                                break;
+                        }
+
+                        test_value = e+1;
+                        break;
+
+                case DEFAULT_VALUE: /* fall through */
+                case ALTERNATE_VALUE:
+                        assert(flags & REPLACE_ENV_ALLOW_EXTENDED);
+
+                        if (*e == '{') {
+                                nest++;
+                                break;
+                        }
+
+                        if (*e != '}')
+                                break;
+
+                        nest--;
+                        if (nest == 0) {
+                                const char *t;
+                                _cleanup_free_ char *v = NULL;
+
+                                t = strv_env_get_n(env, word+2, len, flags);
+
+                                if (t && state == ALTERNATE_VALUE)
+                                        t = v = replace_env_n(test_value, e-test_value, env, flags);
+                                else if (!t && state == DEFAULT_VALUE)
+                                        t = v = replace_env_n(test_value, e-test_value, env, flags);
+
+                                k = strappend(r, t);
+                                if (!k)
+                                        return NULL;
+
+                                free(r);
+                                r = k;
+
+                                word = e+1;
+                                state = WORD;
+                        }
+                        break;
+
+                case VARIABLE_RAW:
+                        assert(flags & REPLACE_ENV_ALLOW_BRACELESS);
+
+                        if (!strchr(VALID_CHARS_ENV_NAME, *e)) {
+                                const char *t;
+
+                                t = strv_env_get_n(env, word+1, e-word-1, flags);
+
+                                k = strappend(r, t);
+                                if (!k)
+                                        return NULL;
+
+                                free(r);
+                                r = k;
+
+                                word = e--;
+                                i--;
+                                state = WORD;
                         }
                         break;
                 }
         }
 
-        k = strnappend(r, word, e-word);
-        if (!k)
-                goto fail;
+        if (state == VARIABLE_RAW) {
+                const char *t;
 
-        free(r);
-        return k;
+                assert(flags & REPLACE_ENV_ALLOW_BRACELESS);
 
-fail:
-        free(r);
-        return NULL;
+                t = strv_env_get_n(env, word+1, e-word-1, flags);
+                return strappend(r, t);
+        } else
+                return strnappend(r, word, e-word);
 }
 
 char **replace_env_argv(char **argv, char **env) {
@@ -601,7 +747,7 @@ char **replace_env_argv(char **argv, char **env) {
                 }
 
                 /* If ${FOO} appears as part of a word, replace it by the variable as-is */
-                ret[k] = replace_env(*i, env);
+                ret[k] = replace_env(*i, env, 0);
                 if (!ret[k]) {
                         strv_free(ret);
                         return NULL;
@@ -622,3 +768,41 @@ int getenv_bool(const char *p) {
 
         return parse_boolean(e);
 }
+
+int serialize_environment(FILE *f, char **environment) {
+        char **e;
+
+        STRV_FOREACH(e, environment) {
+                _cleanup_free_ char *ce;
+
+                ce = cescape(*e);
+                if (!ce)
+                        return -ENOMEM;
+
+                fprintf(f, "env=%s\n", ce);
+        }
+
+        /* caller should call ferror() */
+
+        return 0;
+}
+
+int deserialize_environment(char ***environment, const char *line) {
+        char *uce;
+        int r;
+
+        assert(line);
+        assert(environment);
+
+        assert(startswith(line, "env="));
+        r = cunescape(line + 4, UNESCAPE_RELAX, &uce);
+        if (r < 0)
+                return r;
+
+        if (!env_assignment_is_valid(uce)) {
+                free(uce);
+                return -EINVAL;
+        }
+
+        return strv_env_replace(environment, uce);
+}
index b1fef70..e88fa6a 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <stdbool.h>
 #include <stddef.h>
+#include <stdio.h>
 
 #include "macro.h"
 
@@ -28,9 +29,19 @@ bool env_name_is_valid(const char *e);
 bool env_value_is_valid(const char *e);
 bool env_assignment_is_valid(const char *e);
 
-char *replace_env(const char *format, char **env);
+enum {
+        REPLACE_ENV_USE_ENVIRONMENT = 1u,
+        REPLACE_ENV_ALLOW_BRACELESS = 2u,
+        REPLACE_ENV_ALLOW_EXTENDED  = 4u,
+};
+
+char *replace_env_n(const char *format, size_t n, char **env, unsigned flags);
 char **replace_env_argv(char **argv, char **env);
 
+static inline char *replace_env(const char *format, char **env, unsigned flags) {
+        return replace_env_n(format, strlen(format), env, flags);
+}
+
 bool strv_env_is_valid(char **e);
 #define strv_env_clean(l) strv_env_clean_with_callback(l, NULL, NULL)
 char **strv_env_clean_with_callback(char **l, void (*invalid_callback)(const char *p, void *userdata), void *userdata);
@@ -44,8 +55,12 @@ char **strv_env_delete(char **x, unsigned n_lists, ...); /* New copy */
 char **strv_env_set(char **x, const char *p); /* New copy ... */
 char **strv_env_unset(char **l, const char *p); /* In place ... */
 char **strv_env_unset_many(char **l, ...) _sentinel_;
+int strv_env_replace(char ***l, char *p); /* In place ... */
 
-char *strv_env_get_n(char **l, const char *name, size_t k) _pure_;
+char *strv_env_get_n(char **l, const char *name, size_t k, unsigned flags) _pure_;
 char *strv_env_get(char **x, const char *n) _pure_;
 
 int getenv_bool(const char *p);
+
+int serialize_environment(FILE *f, char **environment);
+int deserialize_environment(char ***environment, const char *line);
index 31b66ba..c6a01ee 100644 (file)
@@ -23,7 +23,7 @@
 #include "macro.h"
 
 static const struct errno_name* lookup_errno(register const char *str,
-                                             register unsigned int len);
+                                             register GPERF_LEN_TYPE len);
 
 #include "errno-from-name.h"
 #include "errno-to-name.h"
diff --git a/src/basic/errno-to-name.awk b/src/basic/errno-to-name.awk
new file mode 100644 (file)
index 0000000..0878aba
--- /dev/null
@@ -0,0 +1,9 @@
+BEGIN{
+        print "static const char* const errno_names[] = { "
+}
+!/EDEADLOCK/ && !/EWOULDBLOCK/ && !/ENOTSUP/ {
+        printf "        [%s] = \"%s\",\n", $1, $1
+}
+END{
+        print "};"
+}
index 01daf11..85e4b52 100644 (file)
@@ -333,7 +333,7 @@ int cunescape_length_with_prefix(const char *s, size_t length, const char *prefi
                 assert(remaining > 0);
 
                 if (*f != '\\') {
-                        /* A literal literal, copy verbatim */
+                        /* A literal, copy verbatim */
                         *(t++) = *f;
                         continue;
                 }
@@ -441,10 +441,16 @@ char *octescape(const char *s, size_t len) {
 
 }
 
-static char *strcpy_backslash_escaped(char *t, const char *s, const char *bad) {
+static char *strcpy_backslash_escaped(char *t, const char *s, const char *bad, bool escape_tab_nl) {
         assert(bad);
 
         for (; *s; s++) {
+                if (escape_tab_nl && IN_SET(*s, '\n', '\t')) {
+                        *(t++) = '\\';
+                        *(t++) = *s == '\n' ? 'n' : 't';
+                        continue;
+                }
+
                 if (*s == '\\' || strchr(bad, *s))
                         *(t++) = '\\';
 
@@ -461,20 +467,21 @@ char *shell_escape(const char *s, const char *bad) {
         if (!r)
                 return NULL;
 
-        t = strcpy_backslash_escaped(r, s, bad);
+        t = strcpy_backslash_escaped(r, s, bad, false);
         *t = 0;
 
         return r;
 }
 
-char *shell_maybe_quote(const char *s) {
+char* shell_maybe_quote(const char *s, EscapeStyle style) {
         const char *p;
         char *r, *t;
 
         assert(s);
 
-        /* Encloses a string in double quotes if necessary to make it
-         * OK as shell string. */
+        /* Encloses a string in quotes if necessary to make it OK as a shell
+         * string. Note that we treat benign UTF-8 characters as needing
+         * escaping too, but that should be OK. */
 
         for (p = s; *p; p++)
                 if (*p <= ' ' ||
@@ -485,17 +492,30 @@ char *shell_maybe_quote(const char *s) {
         if (!*p)
                 return strdup(s);
 
-        r = new(char, 1+strlen(s)*2+1+1);
+        r = new(char, (style == ESCAPE_POSIX) + 1 + strlen(s)*2 + 1 + 1);
         if (!r)
                 return NULL;
 
         t = r;
-        *(t++) = '"';
+        if (style == ESCAPE_BACKSLASH)
+                *(t++) = '"';
+        else if (style == ESCAPE_POSIX) {
+                *(t++) = '$';
+                *(t++) = '\'';
+        } else
+                assert_not_reached("Bad EscapeStyle");
+
         t = mempcpy(t, s, p - s);
 
-        t = strcpy_backslash_escaped(t, p, SHELL_NEED_ESCAPE);
+        if (style == ESCAPE_BACKSLASH)
+                t = strcpy_backslash_escaped(t, p, SHELL_NEED_ESCAPE, false);
+        else
+                t = strcpy_backslash_escaped(t, p, SHELL_NEED_ESCAPE_POSIX, true);
 
-        *(t++)= '"';
+        if (style == ESCAPE_BACKSLASH)
+                *(t++) = '"';
+        else
+                *(t++) = '\'';
         *t = 0;
 
         return r;
index deaa4de..6f5cc60 100644 (file)
 /* What characters are special in the shell? */
 /* must be escaped outside and inside double-quotes */
 #define SHELL_NEED_ESCAPE "\"\\`$"
-/* can be escaped or double-quoted */
-#define SHELL_NEED_QUOTES SHELL_NEED_ESCAPE GLOB_CHARS "'()<>|&;"
+
+/* Those that can be escaped or double-quoted.
+ *
+ * Stricly speaking, ! does not need to be escaped, except in interactive
+ * mode, but let's be extra nice to the user and quote ! in case this
+ * output is ever used in interactive mode. */
+#define SHELL_NEED_QUOTES SHELL_NEED_ESCAPE GLOB_CHARS "'()<>|&;!"
+
+/* Note that we assume control characters would need to be escaped too in
+ * addition to the "special" characters listed here, if they appear in the
+ * string. Current users disallow control characters. Also '"' shall not
+ * be escaped.
+ */
+#define SHELL_NEED_ESCAPE_POSIX "\\\'"
 
 typedef enum UnescapeFlags {
         UNESCAPE_RELAX = 1,
 } UnescapeFlags;
 
+typedef enum EscapeStyle {
+        ESCAPE_BACKSLASH = 1,
+        ESCAPE_POSIX = 2,
+} EscapeStyle;
+
 char *cescape(const char *s);
 char *cescape_length(const char *s, size_t n);
 size_t cescape_char(char c, char *buf);
@@ -51,4 +68,4 @@ char *xescape(const char *s, const char *bad);
 char *octescape(const char *s, size_t len);
 
 char *shell_escape(const char *s, const char *bad);
-char *shell_maybe_quote(const char *s);
+char* shell_maybe_quote(const char *s, EscapeStyle style);
diff --git a/src/basic/exec-util.c b/src/basic/exec-util.c
new file mode 100644 (file)
index 0000000..aced9e8
--- /dev/null
@@ -0,0 +1,360 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2010 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 <dirent.h>
+#include <errno.h>
+#include <sys/prctl.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdio.h>
+
+#include "alloc-util.h"
+#include "conf-files.h"
+#include "env-util.h"
+#include "exec-util.h"
+#include "fd-util.h"
+#include "fileio.h"
+#include "hashmap.h"
+#include "macro.h"
+#include "process-util.h"
+#include "set.h"
+#include "signal-util.h"
+#include "stat-util.h"
+#include "string-util.h"
+#include "strv.h"
+#include "terminal-util.h"
+#include "util.h"
+
+/* Put this test here for a lack of better place */
+assert_cc(EAGAIN == EWOULDBLOCK);
+
+static int do_spawn(const char *path, char *argv[], int stdout_fd, pid_t *pid) {
+
+        pid_t _pid;
+
+        if (null_or_empty_path(path)) {
+                log_debug("%s is empty (a mask).", path);
+                return 0;
+        }
+
+        _pid = fork();
+        if (_pid < 0)
+                return log_error_errno(errno, "Failed to fork: %m");
+        if (_pid == 0) {
+                char *_argv[2];
+
+                assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
+
+                if (stdout_fd >= 0) {
+                        /* If the fd happens to be in the right place, go along with that */
+                        if (stdout_fd != STDOUT_FILENO &&
+                            dup2(stdout_fd, STDOUT_FILENO) < 0)
+                                return -errno;
+
+                        fd_cloexec(STDOUT_FILENO, false);
+                }
+
+                if (!argv) {
+                        _argv[0] = (char*) path;
+                        _argv[1] = NULL;
+                        argv = _argv;
+                } else
+                        argv[0] = (char*) path;
+
+                execv(path, argv);
+                log_error_errno(errno, "Failed to execute %s: %m", path);
+                _exit(EXIT_FAILURE);
+        }
+
+        log_debug("Spawned %s as " PID_FMT ".", path, _pid);
+        *pid = _pid;
+        return 1;
+}
+
+static int do_execute(
+                char **directories,
+                usec_t timeout,
+                gather_stdout_callback_t const callbacks[_STDOUT_CONSUME_MAX],
+                void* const callback_args[_STDOUT_CONSUME_MAX],
+                int output_fd,
+                char *argv[]) {
+
+        _cleanup_hashmap_free_free_ Hashmap *pids = NULL;
+        _cleanup_strv_free_ char **paths = NULL;
+        char **path;
+        int r;
+
+        /* We fork this all off from a child process so that we can somewhat cleanly make
+         * use of SIGALRM to set a time limit.
+         *
+         * If callbacks is nonnull, execution is serial. Otherwise, we default to parallel.
+         */
+
+        (void) reset_all_signal_handlers();
+        (void) reset_signal_mask();
+
+        assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
+
+        r = conf_files_list_strv(&paths, NULL, NULL, (const char* const*) directories);
+        if (r < 0)
+                return r;
+
+        if (!callbacks) {
+                pids = hashmap_new(NULL);
+                if (!pids)
+                        return log_oom();
+        }
+
+        /* Abort execution of this process after the timout. We simply rely on SIGALRM as
+         * default action terminating the process, and turn on alarm(). */
+
+        if (timeout != USEC_INFINITY)
+                alarm((timeout + USEC_PER_SEC - 1) / USEC_PER_SEC);
+
+        STRV_FOREACH(path, paths) {
+                _cleanup_free_ char *t = NULL;
+                _cleanup_close_ int fd = -1;
+                pid_t pid;
+
+                t = strdup(*path);
+                if (!t)
+                        return log_oom();
+
+                if (callbacks) {
+                        fd = open_serialization_fd(basename(*path));
+                        if (fd < 0)
+                                return log_error_errno(fd, "Failed to open serialization file: %m");
+                }
+
+                r = do_spawn(t, argv, fd, &pid);
+                if (r <= 0)
+                        continue;
+
+                if (pids) {
+                        r = hashmap_put(pids, PID_TO_PTR(pid), t);
+                        if (r < 0)
+                                return log_oom();
+                        t = NULL;
+                } else {
+                        r = wait_for_terminate_and_warn(t, pid, true);
+                        if (r < 0)
+                                continue;
+
+                        if (lseek(fd, 0, SEEK_SET) < 0)
+                                return log_error_errno(errno, "Failed to seek on serialization fd: %m");
+
+                        r = callbacks[STDOUT_GENERATE](fd, callback_args[STDOUT_GENERATE]);
+                        fd = -1;
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to process output from %s: %m", *path);
+                }
+        }
+
+        if (callbacks) {
+                r = callbacks[STDOUT_COLLECT](output_fd, callback_args[STDOUT_COLLECT]);
+                if (r < 0)
+                        return log_error_errno(r, "Callback two failed: %m");
+        }
+
+        while (!hashmap_isempty(pids)) {
+                _cleanup_free_ char *t = NULL;
+                pid_t pid;
+
+                pid = PTR_TO_PID(hashmap_first_key(pids));
+                assert(pid > 0);
+
+                t = hashmap_remove(pids, PID_TO_PTR(pid));
+                assert(t);
+
+                wait_for_terminate_and_warn(t, pid, true);
+        }
+
+        return 0;
+}
+
+int execute_directories(
+                const char* const* directories,
+                usec_t timeout,
+                gather_stdout_callback_t const callbacks[_STDOUT_CONSUME_MAX],
+                void* const callback_args[_STDOUT_CONSUME_MAX],
+                char *argv[]) {
+
+        pid_t executor_pid;
+        char *name;
+        char **dirs = (char**) directories;
+        _cleanup_close_ int fd = -1;
+        int r;
+
+        assert(!strv_isempty(dirs));
+
+        name = basename(dirs[0]);
+        assert(!isempty(name));
+
+        if (callbacks) {
+                assert(callback_args);
+                assert(callbacks[STDOUT_GENERATE]);
+                assert(callbacks[STDOUT_COLLECT]);
+                assert(callbacks[STDOUT_CONSUME]);
+
+                fd = open_serialization_fd(name);
+                if (fd < 0)
+                        return log_error_errno(fd, "Failed to open serialization file: %m");
+        }
+
+        /* Executes all binaries in the directories serially or in parallel and waits for
+         * them to finish. Optionally a timeout is applied. If a file with the same name
+         * exists in more than one directory, the earliest one wins. */
+
+        executor_pid = fork();
+        if (executor_pid < 0)
+                return log_error_errno(errno, "Failed to fork: %m");
+
+        if (executor_pid == 0) {
+                r = do_execute(dirs, timeout, callbacks, callback_args, fd, argv);
+                _exit(r < 0 ? EXIT_FAILURE : EXIT_SUCCESS);
+        }
+
+        r = wait_for_terminate_and_warn(name, executor_pid, true);
+        if (r < 0)
+                return log_error_errno(r, "Execution failed: %m");
+        if (r > 0) {
+                /* non-zero return code from child */
+                log_error("Forker process failed.");
+                return -EREMOTEIO;
+        }
+
+        if (!callbacks)
+                return 0;
+
+        if (lseek(fd, 0, SEEK_SET) < 0)
+                return log_error_errno(errno, "Failed to rewind serialization fd: %m");
+
+        r = callbacks[STDOUT_CONSUME](fd, callback_args[STDOUT_CONSUME]);
+        fd = -1;
+        if (r < 0)
+                return log_error_errno(r, "Failed to parse returned data: %m");
+        return 0;
+}
+
+static int gather_environment_generate(int fd, void *arg) {
+        char ***env = arg, **x, **y;
+        _cleanup_fclose_ FILE *f = NULL;
+        _cleanup_strv_free_ char **new;
+        int r;
+
+        /* Read a series of VAR=value assignments from fd, use them to update the list of
+         * variables in env. Also update the exported environment.
+         *
+         * fd is always consumed, even on error.
+         */
+
+        assert(env);
+
+        f = fdopen(fd, "r");
+        if (!f) {
+                safe_close(fd);
+                return -errno;
+        }
+
+        r = load_env_file_pairs(f, NULL, NULL, &new);
+        if (r < 0)
+                return r;
+
+        STRV_FOREACH_PAIR(x, y, new) {
+                char *p;
+
+                if (!env_name_is_valid(*x)) {
+                        log_warning("Invalid variable assignment \"%s=...\", ignoring.", *x);
+                        continue;
+                }
+
+                p = strjoin(*x, "=", *y);
+                if (!p)
+                        return -ENOMEM;
+
+                r = strv_env_replace(env, p);
+                if (r < 0)
+                        return r;
+
+                if (setenv(*x, *y, true) < 0)
+                        return -errno;
+        }
+
+        return r;
+}
+
+static int gather_environment_collect(int fd, void *arg) {
+        char ***env = arg;
+        _cleanup_fclose_ FILE *f = NULL;
+        int r;
+
+        /* Write out a series of env=cescape(VAR=value) assignments to fd. */
+
+        assert(env);
+
+        f = fdopen(fd, "w");
+        if (!f) {
+                safe_close(fd);
+                return -errno;
+        }
+
+        r = serialize_environment(f, *env);
+        if (r < 0)
+                return r;
+
+        if (ferror(f))
+                return errno > 0 ? -errno : -EIO;
+
+        return 0;
+}
+
+static int gather_environment_consume(int fd, void *arg) {
+        char ***env = arg;
+        _cleanup_fclose_ FILE *f = NULL;
+        char line[LINE_MAX];
+        int r = 0, k;
+
+        /* Read a series of env=cescape(VAR=value) assignments from fd into env. */
+
+        assert(env);
+
+        f = fdopen(fd, "r");
+        if (!f) {
+                safe_close(fd);
+                return -errno;
+        }
+
+        FOREACH_LINE(line, f, return -EIO) {
+                truncate_nl(line);
+
+                k = deserialize_environment(env, line);
+                if (k < 0)
+                        log_error_errno(k, "Invalid line \"%s\": %m", line);
+                if (k < 0 && r == 0)
+                        r = k;
+        }
+
+        return r;
+}
+
+const gather_stdout_callback_t gather_environment[] = {
+        gather_environment_generate,
+        gather_environment_collect,
+        gather_environment_consume,
+};
diff --git a/src/basic/exec-util.h b/src/basic/exec-util.h
new file mode 100644 (file)
index 0000000..7200979
--- /dev/null
@@ -0,0 +1,40 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2017 Zbigniew Jędrzejewski-Szmek
+
+  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 <stdbool.h>
+
+#include "time-util.h"
+
+typedef int (*gather_stdout_callback_t) (int fd, void *arg);
+
+enum {
+        STDOUT_GENERATE,   /* from generators to helper process */
+        STDOUT_COLLECT,    /* from helper process to main process */
+        STDOUT_CONSUME,    /* process data in main process */
+        _STDOUT_CONSUME_MAX,
+};
+
+int execute_directories(
+                const char* const* directories,
+                usec_t timeout,
+                gather_stdout_callback_t const callbacks[_STDOUT_CONSUME_MAX],
+                void* const callback_args[_STDOUT_CONSUME_MAX],
+                char *argv[]);
+
+extern const gather_stdout_callback_t gather_environment[_STDOUT_CONSUME_MAX];
index d488cfc..1e23c32 100644 (file)
 #include "macro.h"
 #include "set.h"
 
-const char* exit_status_to_string(ExitStatus status, ExitStatusLevel level) {
+const char* exit_status_to_string(int status, ExitStatusLevel level) {
 
         /* We cast to int here, so that -Wenum doesn't complain that
          * EXIT_SUCCESS/EXIT_FAILURE aren't in the enum */
 
-        switch ((int) status) {
+        switch (status) {
 
         case EXIT_SUCCESS:
                 return "SUCCESS";
@@ -39,7 +39,7 @@ const char* exit_status_to_string(ExitStatus status, ExitStatusLevel level) {
         }
 
         if (IN_SET(level, EXIT_STATUS_SYSTEMD, EXIT_STATUS_LSB)) {
-                switch ((int) status) {
+                switch (status) {
 
                 case EXIT_CHDIR:
                         return "CHDIR";
@@ -140,19 +140,22 @@ const char* exit_status_to_string(ExitStatus status, ExitStatusLevel level) {
                 case EXIT_RUNTIME_DIRECTORY:
                         return "RUNTIME_DIRECTORY";
 
-                case EXIT_CHOWN:
-                        return "CHOWN";
-
                 case EXIT_MAKE_STARTER:
                         return "MAKE_STARTER";
 
+                case EXIT_CHOWN:
+                        return "CHOWN";
+
                 case EXIT_SMACK_PROCESS_LABEL:
                         return "SMACK_PROCESS_LABEL";
+
+                case EXIT_KEYRING:
+                        return "KEYRING";
                 }
         }
 
         if (level == EXIT_STATUS_LSB) {
-                switch ((int) status) {
+                switch (status) {
 
                 case EXIT_INVALIDARGUMENT:
                         return "INVALIDARGUMENT";
@@ -177,34 +180,23 @@ const char* exit_status_to_string(ExitStatus status, ExitStatusLevel level) {
         return NULL;
 }
 
-
-bool is_clean_exit(int code, int status, ExitStatusSet *success_status) {
+bool is_clean_exit(int code, int status, ExitClean clean, ExitStatusSet *success_status) {
 
         if (code == CLD_EXITED)
                 return status == 0 ||
                        (success_status &&
                        set_contains(success_status->status, INT_TO_PTR(status)));
 
-        /* If a daemon does not implement handlers for some of the
-         * signals that's not considered an unclean shutdown */
+        /* If a daemon does not implement handlers for some of the signals that's not considered an unclean shutdown */
         if (code == CLD_KILLED)
-                return IN_SET(status, SIGHUP, SIGINT, SIGTERM, SIGPIPE) ||
+                return
+                        (clean == EXIT_CLEAN_DAEMON && IN_SET(status, SIGHUP, SIGINT, SIGTERM, SIGPIPE)) ||
                         (success_status &&
                          set_contains(success_status->signal, INT_TO_PTR(status)));
 
         return false;
 }
 
-bool is_clean_exit_lsb(int code, int status, ExitStatusSet *success_status) {
-
-        if (is_clean_exit(code, status, success_status))
-                return true;
-
-        return
-                code == CLD_EXITED &&
-                IN_SET(status, EXIT_NOTINSTALLED, EXIT_NOTCONFIGURED);
-}
-
 void exit_status_set_free(ExitStatusSet *x) {
         assert(x);
 
index 2309f68..d22b2c0 100644 (file)
@@ -31,7 +31,7 @@
  * https://refspecs.linuxbase.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
  */
 
-typedef enum ExitStatus {
+enum {
         /* EXIT_SUCCESS defined by libc */
         /* EXIT_FAILURE defined by libc */
         EXIT_INVALIDARGUMENT = 2,
@@ -82,7 +82,8 @@ typedef enum ExitStatus {
         EXIT_MAKE_STARTER,
         EXIT_CHOWN,
         EXIT_SMACK_PROCESS_LABEL,
-} ExitStatus;
+        EXIT_KEYRING,
+};
 
 typedef enum ExitStatusLevel {
         EXIT_STATUS_MINIMAL,   /* only cover libc EXIT_STATUS/EXIT_FAILURE */
@@ -96,10 +97,14 @@ typedef struct ExitStatusSet {
         Set *signal;
 } ExitStatusSet;
 
-const char* exit_status_to_string(ExitStatus status, ExitStatusLevel level) _const_;
+const char* exit_status_to_string(int status, ExitStatusLevel level) _const_;
 
-bool is_clean_exit(int code, int status, ExitStatusSet *success_status);
-bool is_clean_exit_lsb(int code, int status, ExitStatusSet *success_status);
+typedef enum ExitClean {
+        EXIT_CLEAN_DAEMON,
+        EXIT_CLEAN_COMMAND,
+} ExitClean;
+
+bool is_clean_exit(int code, int status, ExitClean clean, ExitStatusSet *success_status);
 
 void exit_status_set_free(ExitStatusSet *x);
 bool exit_status_set_is_empty(ExitStatusSet *x);
index d6c1228..804f14c 100644 (file)
@@ -48,7 +48,7 @@ int extract_first_word(const char **p, char **ret, const char *separators, Extra
 
         /* Bail early if called after last value or with no input */
         if (!*p)
-                goto finish_force_terminate;
+                goto finish;
         c = **p;
 
         if (!separators)
@@ -227,8 +227,8 @@ int extract_first_word_and_warn(
                 *p = save;
                 r = extract_first_word(p, ret, separators, flags|EXTRACT_CUNESCAPE_RELAX);
                 if (r >= 0) {
-                        /* It worked this time, hence it must have been an invalid escape sequence we could correct. */
-                        log_syntax(unit, LOG_WARNING, filename, line, EINVAL, "Invalid escape sequences in line, correcting: \"%s\"", rvalue);
+                        /* It worked this time, hence it must have been an invalid escape sequence. */
+                        log_syntax(unit, LOG_WARNING, filename, line, EINVAL, "Ignoring unknown escape sequences: \"%s\"", *ret);
                         return r;
                 }
 
@@ -241,7 +241,12 @@ int extract_first_word_and_warn(
         return log_syntax(unit, LOG_ERR, filename, line, r, "Unable to decode word \"%s\", ignoring: %m", rvalue);
 }
 
-int extract_many_words(const char **p, const char *separators, ExtractFlags flags, ...) {
+/* We pass ExtractFlags as unsigned int (to avoid undefined behaviour when passing
+ * an object that undergoes default argument promotion as an argument to va_start).
+ * Let's make sure that ExtractFlags fits into an unsigned int. */
+assert_cc(sizeof(enum ExtractFlags) <= sizeof(unsigned));
+
+int extract_many_words(const char **p, const char *separators, unsigned flags, ...) {
         va_list ap;
         char **l;
         int n = 0, i, c, r;
index 21db5ef..04746c6 100644 (file)
@@ -32,4 +32,4 @@ typedef enum ExtractFlags {
 
 int extract_first_word(const char **p, char **ret, const char *separators, ExtractFlags flags);
 int extract_first_word_and_warn(const char **p, char **ret, const char *separators, ExtractFlags flags, const char *unit, const char *filename, unsigned line, const char *rvalue);
-int extract_many_words(const char **p, const char *separators, ExtractFlags flags, ...) _sentinel_;
+int extract_many_words(const char **p, const char *separators, unsigned flags, ...) _sentinel_;
index 646b809..3062920 100644 (file)
@@ -24,6 +24,7 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
+#include "dirent-util.h"
 #include "fd-util.h"
 #include "fs-util.h"
 #include "macro.h"
@@ -234,12 +235,9 @@ int close_all_fds(const int except[], unsigned n_except) {
                 return r;
         }
 
-        while ((de = readdir(d))) {
+        FOREACH_DIRENT(de, d, return -errno) {
                 int fd = -1;
 
-                if (hidden_or_backup_file(de->d_name))
-                        continue;
-
                 if (safe_atoi(de->d_name, &fd) < 0)
                         /* Let's better ignore this, just in case */
                         continue;
index 66dbc0f..ef51c49 100644 (file)
 #include "fileio.h"
 #include "selinux-util.h"
 
-int write_string_file_atomic_label(const char *fn, const char *line) {
+int write_string_file_atomic_label_ts(const char *fn, const char *line, struct timespec *ts) {
         int r;
 
         r = mac_selinux_create_file_prepare(fn, S_IFREG);
         if (r < 0)
                 return r;
 
-        r = write_string_file(fn, line, WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_ATOMIC);
+        r = write_string_file_ts(fn, line, WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_ATOMIC, ts);
 
         mac_selinux_create_file_clear();
 
index fe75430..9854ea5 100644 (file)
 
 #include "fileio.h"
 
-int write_string_file_atomic_label(const char *fn, const char *line);
+int write_string_file_atomic_label_ts(const char *fn, const char *line, struct timespec *ts);
+static inline int write_string_file_atomic_label(const char *fn, const char *line) {
+        return write_string_file_atomic_label_ts(fn, line, NULL);
+}
 int write_env_file_label(const char *fname, char **l);
 int fopen_temporary_label(const char *target,
                           const char *path, FILE **f, char **temp_path);
index f183de4..9a185e3 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "alloc-util.h"
 #include "ctype.h"
+#include "env-util.h"
 #include "escape.h"
 #include "fd-util.h"
 #include "fileio.h"
@@ -37,6 +38,7 @@
 #include "hexdecoct.h"
 #include "log.h"
 #include "macro.h"
+#include "missing.h"
 #include "parse-util.h"
 #include "path-util.h"
 #include "random-util.h"
@@ -47,7 +49,9 @@
 #include "umask-util.h"
 #include "utf8.h"
 
-int write_string_stream(FILE *f, const char *line, bool enforce_newline) {
+#define READ_FULL_BYTES_MAX (4U*1024U*1024U)
+
+int write_string_stream_ts(FILE *f, const char *line, bool enforce_newline, struct timespec *ts) {
 
         assert(f);
         assert(line);
@@ -56,6 +60,13 @@ int write_string_stream(FILE *f, const char *line, bool enforce_newline) {
         if (enforce_newline && !endswith(line, "\n"))
                 fputc('\n', f);
 
+        if (ts) {
+                struct timespec twice[2] = {*ts, *ts};
+
+                if (futimens(fileno(f), twice) < 0)
+                        return -errno;
+        }
+
         return fflush_and_check(f);
 }
 
@@ -85,7 +96,7 @@ static int write_string_file_atomic(const char *fn, const char *line, bool enfor
         return r;
 }
 
-int write_string_file(const char *fn, const char *line, WriteStringFileFlags flags) {
+int write_string_file_ts(const char *fn, const char *line, WriteStringFileFlags flags, struct timespec *ts) {
         _cleanup_fclose_ FILE *f = NULL;
         int q, r;
 
@@ -100,7 +111,8 @@ int write_string_file(const char *fn, const char *line, WriteStringFileFlags fla
                         goto fail;
 
                 return r;
-        }
+        } else
+                assert(ts == NULL);
 
         if (flags & WRITE_STRING_FILE_CREATE) {
                 f = fopen(fn, "we");
@@ -127,7 +139,7 @@ int write_string_file(const char *fn, const char *line, WriteStringFileFlags fla
                 }
         }
 
-        r = write_string_stream(f, line, !(flags & WRITE_STRING_FILE_AVOID_NEWLINE));
+        r = write_string_stream_ts(f, line, !(flags & WRITE_STRING_FILE_AVOID_NEWLINE), ts);
         if (r < 0)
                 goto fail;
 
@@ -230,7 +242,7 @@ int read_full_stream(FILE *f, char **contents, size_t *size) {
         if (S_ISREG(st.st_mode)) {
 
                 /* Safety check */
-                if (st.st_size > 4*1024*1024)
+                if (st.st_size > READ_FULL_BYTES_MAX)
                         return -E2BIG;
 
                 /* Start with the right file size, but be prepared for
@@ -245,26 +257,31 @@ int read_full_stream(FILE *f, char **contents, size_t *size) {
                 char *t;
                 size_t k;
 
-                t = realloc(buf, n+1);
+                t = realloc(buf, n + 1);
                 if (!t)
                         return -ENOMEM;
 
                 buf = t;
                 k = fread(buf + l, 1, n - l, f);
+                if (k > 0)
+                        l += k;
 
-                if (k <= 0) {
-                        if (ferror(f))
-                                return -errno;
+                if (ferror(f))
+                        return -errno;
 
+                if (feof(f))
                         break;
-                }
 
-                l += k;
-                n *= 2;
+                /* We aren't expecting fread() to return a short read outside
+                 * of (error && eof), assert buffer is full and enlarge buffer.
+                 */
+                assert(l == n);
 
                 /* Safety check */
-                if (n > 4*1024*1024)
+                if (n >= READ_FULL_BYTES_MAX)
                         return -E2BIG;
+
+                n = MIN(n * 2, READ_FULL_BYTES_MAX);
         }
 
         buf[l] = 0;
@@ -545,13 +562,14 @@ static int parse_env_file_internal(
                 }
         }
 
-        if (state == PRE_VALUE ||
-            state == VALUE ||
-            state == VALUE_ESCAPE ||
-            state == SINGLE_QUOTE_VALUE ||
-            state == SINGLE_QUOTE_VALUE_ESCAPE ||
-            state == DOUBLE_QUOTE_VALUE ||
-            state == DOUBLE_QUOTE_VALUE_ESCAPE) {
+        if (IN_SET(state,
+                   PRE_VALUE,
+                   VALUE,
+                   VALUE_ESCAPE,
+                   SINGLE_QUOTE_VALUE,
+                   SINGLE_QUOTE_VALUE_ESCAPE,
+                   DOUBLE_QUOTE_VALUE,
+                   DOUBLE_QUOTE_VALUE_ESCAPE)) {
 
                 key[n_key] = 0;
 
@@ -578,14 +596,9 @@ fail:
         return r;
 }
 
-static int parse_env_file_push(
+static int check_utf8ness_and_warn(
                 const char *filename, unsigned line,
-                const char *key, char *value,
-                void *userdata,
-                int *n_pushed) {
-
-        const char *k;
-        va_list aq, *ap = userdata;
+                const char *key, char *value) {
 
         if (!utf8_is_valid(key)) {
                 _cleanup_free_ char *p = NULL;
@@ -603,6 +616,23 @@ static int parse_env_file_push(
                 return -EINVAL;
         }
 
+        return 0;
+}
+
+static int parse_env_file_push(
+                const char *filename, unsigned line,
+                const char *key, char *value,
+                void *userdata,
+                int *n_pushed) {
+
+        const char *k;
+        va_list aq, *ap = userdata;
+        int r;
+
+        r = check_utf8ness_and_warn(filename, line, key, value);
+        if (r < 0)
+                return r;
+
         va_copy(aq, *ap);
 
         while ((k = va_arg(aq, const char *))) {
@@ -654,27 +684,19 @@ static int load_env_file_push(
         char *p;
         int r;
 
-        if (!utf8_is_valid(key)) {
-                _cleanup_free_ char *t = utf8_escape_invalid(key);
-
-                log_error("%s:%u: invalid UTF-8 for key '%s', ignoring.", strna(filename), line, t);
-                return -EINVAL;
-        }
-
-        if (value && !utf8_is_valid(value)) {
-                _cleanup_free_ char *t = utf8_escape_invalid(value);
-
-                log_error("%s:%u: invalid UTF-8 value for key %s: '%s', ignoring.", strna(filename), line, key, t);
-                return -EINVAL;
-        }
+        r = check_utf8ness_and_warn(filename, line, key, value);
+        if (r < 0)
+                return r;
 
-        p = strjoin(key, "=", strempty(value), NULL);
+        p = strjoin(key, "=", value);
         if (!p)
                 return -ENOMEM;
 
-        r = strv_consume(m, p);
-        if (r < 0)
+        r = strv_env_replace(m, p);
+        if (r < 0) {
+                free(p);
                 return r;
+        }
 
         if (n_pushed)
                 (*n_pushed)++;
@@ -708,19 +730,9 @@ static int load_env_file_push_pairs(
         char ***m = userdata;
         int r;
 
-        if (!utf8_is_valid(key)) {
-                _cleanup_free_ char *t = utf8_escape_invalid(key);
-
-                log_error("%s:%u: invalid UTF-8 for key '%s', ignoring.", strna(filename), line, t);
-                return -EINVAL;
-        }
-
-        if (value && !utf8_is_valid(value)) {
-                _cleanup_free_ char *t = utf8_escape_invalid(value);
-
-                log_error("%s:%u: invalid UTF-8 value for key %s: '%s', ignoring.", strna(filename), line, key, t);
-                return -EINVAL;
-        }
+        r = check_utf8ness_and_warn(filename, line, key, value);
+        if (r < 0)
+                return r;
 
         r = strv_extend(m, key);
         if (r < 0)
@@ -759,6 +771,52 @@ int load_env_file_pairs(FILE *f, const char *fname, const char *newline, char **
         return 0;
 }
 
+static int merge_env_file_push(
+                const char *filename, unsigned line,
+                const char *key, char *value,
+                void *userdata,
+                int *n_pushed) {
+
+        char ***env = userdata;
+        char *expanded_value;
+
+        assert(env);
+
+        if (!value) {
+                log_error("%s:%u: invalid syntax (around \"%s\"), ignoring.", strna(filename), line, key);
+                return 0;
+        }
+
+        if (!env_name_is_valid(key)) {
+                log_error("%s:%u: invalid variable name \"%s\", ignoring.", strna(filename), line, key);
+                free(value);
+                return 0;
+        }
+
+        expanded_value = replace_env(value, *env,
+                                     REPLACE_ENV_USE_ENVIRONMENT|
+                                     REPLACE_ENV_ALLOW_BRACELESS|
+                                     REPLACE_ENV_ALLOW_EXTENDED);
+        if (!expanded_value)
+                return -ENOMEM;
+
+        free_and_replace(value, expanded_value);
+
+        return load_env_file_push(filename, line, key, value, env, n_pushed);
+}
+
+int merge_env_file(
+                char ***env,
+                FILE *f,
+                const char *fname) {
+
+        /* NOTE: this function supports braceful and braceless variable expansions,
+         * plus "extended" substitutions, unlike other exported parsing functions.
+         */
+
+        return parse_env_file_internal(f, fname, NEWLINE, merge_env_file_push, env, NULL);
+}
+
 static void write_env_var(FILE *f, const char *v) {
         const char *p;
 
@@ -955,9 +1013,9 @@ static int search_and_fopen_internal(const char *path, const char *mode, const c
                 FILE *f;
 
                 if (root)
-                        p = strjoin(root, *i, "/", path, NULL);
+                        p = strjoin(root, *i, "/", path);
                 else
-                        p = strjoin(*i, "/", path, NULL);
+                        p = strjoin(*i, "/", path);
                 if (!p)
                         return -ENOMEM;
 
@@ -1035,7 +1093,7 @@ int fopen_temporary(const char *path, FILE **_f, char **_temp_path) {
         if (r < 0)
                 return r;
 
-        fd = mkostemp_safe(t, O_WRONLY|O_CLOEXEC);
+        fd = mkostemp_safe(t);
         if (fd < 0) {
                 free(t);
                 return -errno;
@@ -1068,7 +1126,7 @@ int fflush_and_check(FILE *f) {
 }
 
 /* This is much like mkostemp() but is subject to umask(). */
-int mkostemp_safe(char *pattern, int flags) {
+int mkostemp_safe(char *pattern) {
         _cleanup_umask_ mode_t u = 0;
         int fd;
 
@@ -1076,7 +1134,7 @@ int mkostemp_safe(char *pattern, int flags) {
 
         u = umask(077);
 
-        fd = mkostemp(pattern, flags);
+        fd = mkostemp(pattern, O_CLOEXEC);
         if (fd < 0)
                 return -errno;
 
@@ -1161,8 +1219,8 @@ int tempfn_random_child(const char *p, const char *extra, char **ret) {
         char *t, *x;
         uint64_t u;
         unsigned i;
+        int r;
 
-        assert(p);
         assert(ret);
 
         /* Turns this:
@@ -1171,6 +1229,12 @@ int tempfn_random_child(const char *p, const char *extra, char **ret) {
          *         /foo/bar/waldo/.#<extra>3c2b6219aa75d7d0
          */
 
+        if (!p) {
+                r = tmp_dir(&p);
+                if (r < 0)
+                        return r;
+        }
+
         if (!extra)
                 extra = "";
 
@@ -1257,24 +1321,25 @@ int fputs_with_space(FILE *f, const char *s, const char *separator, bool *space)
 
 int open_tmpfile_unlinkable(const char *directory, int flags) {
         char *p;
-        int fd;
+        int fd, r;
 
-        if (!directory)
-                directory = "/tmp";
+        if (!directory) {
+                r = tmp_dir(&directory);
+                if (r < 0)
+                        return r;
+        }
 
         /* Returns an unlinked temporary file that cannot be linked into the file system anymore */
 
-#ifdef O_TMPFILE
         /* Try O_TMPFILE first, if it is supported */
         fd = open(directory, flags|O_TMPFILE|O_EXCL, S_IRUSR|S_IWUSR);
         if (fd >= 0)
                 return fd;
-#endif
 
         /* Fall back to unguessable name + unlinking */
         p = strjoina(directory, "/systemd-tmp-XXXXXX");
 
-        fd = mkostemp_safe(p, flags);
+        fd = mkostemp_safe(p);
         if (fd < 0)
                 return fd;
 
@@ -1297,7 +1362,6 @@ int open_tmpfile_linkable(const char *target, int flags, char **ret_path) {
          * which case "ret_path" will be returned as NULL. If not possible a the tempoary path name used is returned in
          * "ret_path". Use link_tmpfile() below to rename the result after writing the file in full. */
 
-#ifdef O_TMPFILE
         {
                 _cleanup_free_ char *dn = NULL;
 
@@ -1313,7 +1377,6 @@ int open_tmpfile_linkable(const char *target, int flags, char **ret_path) {
 
                 log_debug_errno(errno, "Failed to use O_TMPFILE on %s: %m", dn);
         }
-#endif
 
         r = tempfn_random(target, NULL, &tmp);
         if (r < 0)
@@ -1329,6 +1392,25 @@ int open_tmpfile_linkable(const char *target, int flags, char **ret_path) {
         return fd;
 }
 
+int open_serialization_fd(const char *ident) {
+        int fd = -1;
+
+        fd = memfd_create(ident, MFD_CLOEXEC);
+        if (fd < 0) {
+                const char *path;
+
+                path = getpid() == 1 ? "/run/systemd" : "/tmp";
+                fd = open_tmpfile_unlinkable(path, O_RDWR|O_CLOEXEC);
+                if (fd < 0)
+                        return fd;
+
+                log_debug("Serializing %s to %s.", ident, path);
+        } else
+                log_debug("Serializing %s to memfd.", ident);
+
+        return fd;
+}
+
 int link_tmpfile(int fd, const char *path, const char *target) {
 
         assert(fd >= 0);
@@ -1396,3 +1478,22 @@ int read_nul_string(FILE *f, char **ret) {
 
         return 0;
 }
+
+int mkdtemp_malloc(const char *template, char **ret) {
+        char *p;
+
+        assert(template);
+        assert(ret);
+
+        p = strdup(template);
+        if (!p)
+                return -ENOMEM;
+
+        if (!mkdtemp(p)) {
+                free(p);
+                return -errno;
+        }
+
+        *ret = p;
+        return 0;
+}
index 9ac497d..6098562 100644 (file)
@@ -35,8 +35,14 @@ typedef enum {
         WRITE_STRING_FILE_VERIFY_ON_FAILURE = 8,
 } WriteStringFileFlags;
 
-int write_string_stream(FILE *f, const char *line, bool enforce_newline);
-int write_string_file(const char *fn, const char *line, WriteStringFileFlags flags);
+int write_string_stream_ts(FILE *f, const char *line, bool enforce_newline, struct timespec *ts);
+static inline int write_string_stream(FILE *f, const char *line, bool enforce_newline) {
+        return write_string_stream_ts(f, line, enforce_newline, NULL);
+}
+int write_string_file_ts(const char *fn, const char *line, WriteStringFileFlags flags, struct timespec *ts);
+static inline int write_string_file(const char *fn, const char *line, WriteStringFileFlags flags) {
+        return write_string_file_ts(fn, line, flags, NULL);
+}
 
 int read_one_line_file(const char *fn, char **line);
 int read_full_file(const char *fn, char **contents, size_t *size);
@@ -48,6 +54,8 @@ int parse_env_file(const char *fname, const char *separator, ...) _sentinel_;
 int load_env_file(FILE *f, const char *fname, const char *separator, char ***l);
 int load_env_file_pairs(FILE *f, const char *fname, const char *separator, char ***l);
 
+int merge_env_file(char ***env, FILE *f, const char *fname);
+
 int write_env_file(const char *fname, char **l);
 
 int executable_is_script(const char *path, char **interpreter);
@@ -71,7 +79,7 @@ int search_and_fopen_nulstr(const char *path, const char *mode, const char *root
 int fflush_and_check(FILE *f);
 
 int fopen_temporary(const char *path, FILE **_f, char **_temp_path);
-int mkostemp_safe(char *pattern, int flags);
+int mkostemp_safe(char *pattern);
 
 int tempfn_xxxxxx(const char *p, const char *extra, char **ret);
 int tempfn_random(const char *p, const char *extra, char **ret);
@@ -84,7 +92,10 @@ int fputs_with_space(FILE *f, const char *s, const char *separator, bool *space)
 
 int open_tmpfile_unlinkable(const char *directory, int flags);
 int open_tmpfile_linkable(const char *target, int flags, char **ret_path);
+int open_serialization_fd(const char *ident);
 
 int link_tmpfile(int fd, const char *path, const char *target);
 
 int read_nul_string(FILE *f, char **ret);
+
+int mkdtemp_malloc(const char *template, char **ret);
similarity index 94%
rename from src/basic/formats-util.h
rename to src/basic/format-util.h
index 39a185f..ae42a8f 100644 (file)
 #  error Unknown time_t size
 #endif
 
+#if defined __x86_64__ && defined __ILP32__
+#  define PRI_TIMEX PRIi64
+#else
+#  define PRI_TIMEX "li"
+#endif
+
 #if SIZEOF_RLIM_T == 8
 #  define RLIM_FMT "%" PRIu64
 #elif SIZEOF_RLIM_T == 4
index 1e7c828..4abd1ad 100644 (file)
@@ -17,7 +17,6 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <dirent.h>
 #include <errno.h>
 #include <stddef.h>
 #include <stdio.h>
@@ -225,25 +224,25 @@ int readlink_and_make_absolute(const char *p, char **r) {
         return 0;
 }
 
-int readlink_and_canonicalize(const char *p, char **r) {
+int readlink_and_canonicalize(const char *p, const char *root, char **ret) {
         char *t, *s;
-        int j;
+        int r;
 
         assert(p);
-        assert(r);
+        assert(ret);
 
-        j = readlink_and_make_absolute(p, &t);
-        if (j < 0)
-                return j;
+        r = readlink_and_make_absolute(p, &t);
+        if (r < 0)
+                return r;
 
-        s = canonicalize_file_name(t);
-        if (s) {
+        r = chase_symlinks(t, root, 0, &s);
+        if (r < 0)
+                /* If we can't follow up, then let's return the original string, slightly cleaned up. */
+                *ret = path_kill_slashes(t);
+        else {
+                *ret = s;
                 free(t);
-                *r = s;
-        } else
-                *r = t;
-
-        path_kill_slashes(*r);
+        }
 
         return 0;
 }
@@ -447,6 +446,7 @@ int mkfifo_atomic(const char *path, mode_t mode) {
 
 int get_files_in_directory(const char *path, char ***list) {
         _cleanup_closedir_ DIR *d = NULL;
+        struct dirent *de;
         size_t bufsize = 0, n = 0;
         _cleanup_strv_free_ char **l = NULL;
 
@@ -460,16 +460,7 @@ int get_files_in_directory(const char *path, char ***list) {
         if (!d)
                 return -errno;
 
-        for (;;) {
-                struct dirent *de;
-
-                errno = 0;
-                de = readdir(d);
-                if (!de && errno > 0)
-                        return -errno;
-                if (!de)
-                        break;
-
+        FOREACH_DIRENT_ALL(de, d, return -errno) {
                 dirent_ensure_type(d, de);
 
                 if (!dirent_is_file(de))
@@ -497,34 +488,94 @@ int get_files_in_directory(const char *path, char ***list) {
         return n;
 }
 
-int var_tmp(char **ret) {
-        const char *tmp_dir = NULL;
-        const char *env_tmp_dir = NULL;
-        char *c = NULL;
-        int r;
+static int getenv_tmp_dir(const char **ret_path) {
+        const char *n;
+        int r, ret = 0;
 
-        assert(ret);
+        assert(ret_path);
 
-        env_tmp_dir = getenv("TMPDIR");
-        if (env_tmp_dir != NULL) {
-                r = is_dir(env_tmp_dir, true);
-                if (r < 0 && r != -ENOENT)
-                        return r;
-                if (r > 0)
-                        tmp_dir = env_tmp_dir;
+        /* We use the same order of environment variables python uses in tempfile.gettempdir():
+         * https://docs.python.org/3/library/tempfile.html#tempfile.gettempdir */
+        FOREACH_STRING(n, "TMPDIR", "TEMP", "TMP") {
+                const char *e;
+
+                e = secure_getenv(n);
+                if (!e)
+                        continue;
+                if (!path_is_absolute(e)) {
+                        r = -ENOTDIR;
+                        goto next;
+                }
+                if (!path_is_safe(e)) {
+                        r = -EPERM;
+                        goto next;
+                }
+
+                r = is_dir(e, true);
+                if (r < 0)
+                        goto next;
+                if (r == 0) {
+                        r = -ENOTDIR;
+                        goto next;
+                }
+
+                *ret_path = e;
+                return 1;
+
+        next:
+                /* Remember first error, to make this more debuggable */
+                if (ret >= 0)
+                        ret = r;
         }
 
-        if (!tmp_dir)
-                tmp_dir = "/var/tmp";
+        if (ret < 0)
+                return ret;
+
+        *ret_path = NULL;
+        return ret;
+}
 
-        c = strdup(tmp_dir);
-        if (!c)
-                return -ENOMEM;
-        *ret = c;
+static int tmp_dir_internal(const char *def, const char **ret) {
+        const char *e;
+        int r, k;
 
+        assert(def);
+        assert(ret);
+
+        r = getenv_tmp_dir(&e);
+        if (r > 0) {
+                *ret = e;
+                return 0;
+        }
+
+        k = is_dir(def, true);
+        if (k == 0)
+                k = -ENOTDIR;
+        if (k < 0)
+                return r < 0 ? r : k;
+
+        *ret = def;
         return 0;
 }
 
+int var_tmp_dir(const char **ret) {
+
+        /* Returns the location for "larger" temporary files, that is backed by physical storage if available, and thus
+         * even might survive a boot: /var/tmp. If $TMPDIR (or related environment variables) are set, its value is
+         * returned preferably however. Note that both this function and tmp_dir() below are affected by $TMPDIR,
+         * making it a variable that overrides all temporary file storage locations. */
+
+        return tmp_dir_internal("/var/tmp", ret);
+}
+
+int tmp_dir(const char **ret) {
+
+        /* Similar to var_tmp_dir() above, but returns the location for "smaller" temporary files, which is usually
+         * backed by an in-memory file system: /tmp. */
+
+        return tmp_dir_internal("/tmp", ret);
+}
+
 int inotify_add_watch_fd(int fd, int what, uint32_t mask) {
         char path[strlen("/proc/self/fd/") + DECIMAL_STR_MAX(int) + 1];
         int r;
index 8d6703e..eeef417 100644 (file)
@@ -39,7 +39,7 @@ int readlinkat_malloc(int fd, const char *p, char **ret);
 int readlink_malloc(const char *p, char **r);
 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 readlink_and_canonicalize(const char *p, const char *root, char **r);
 int readlink_and_make_absolute_root(const char *root, const char *path, char **ret);
 
 int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid);
@@ -61,7 +61,8 @@ int mkfifo_atomic(const char *path, mode_t mode);
 
 int get_files_in_directory(const char *path, char ***list);
 
-int var_tmp(char **ret);
+int tmp_dir(const char **ret);
+int var_tmp_dir(const char **ret);
 
 #define INOTIFY_EVENT_MAX (sizeof(struct inotify_event) + NAME_MAX + 1)
 
@@ -86,3 +87,16 @@ enum {
 };
 
 int chase_symlinks(const char *path_with_prefix, const char *root, unsigned flags, char **ret);
+
+/* Useful for usage with _cleanup_(), removes a directory and frees the pointer */
+static inline void rmdir_and_free(char *p) {
+        (void) rmdir(p);
+        free(p);
+}
+DEFINE_TRIVIAL_CLEANUP_FUNC(char*, rmdir_and_free);
+
+static inline void unlink_and_free(char *p) {
+        (void) unlink(p);
+        free(p);
+}
+DEFINE_TRIVIAL_CLEANUP_FUNC(char*, unlink_and_free);
diff --git a/src/basic/generate-af-list.sh b/src/basic/generate-af-list.sh
new file mode 100755 (executable)
index 0000000..8d9cdd1
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh -eu
+
+$1 -E -dM -include sys/socket.h - </dev/null | \
+        grep -Ev 'AF_UNSPEC|AF_MAX' | \
+        awk '/^#define[ \t]+AF_[^ \t]+[ \t]+PF_[^ \t]/ { print $2; }'
diff --git a/src/basic/generate-arphrd-list.sh b/src/basic/generate-arphrd-list.sh
new file mode 100755 (executable)
index 0000000..ee207fb
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh -eu
+
+$1 -dM -include net/if_arp.h - </dev/null | \
+        awk '/^#define[ \t]+ARPHRD_[^ \t]+[ \t]+[^ \t]/ { print $2; }' | \
+        sed -e 's/ARPHRD_//'
diff --git a/src/basic/generate-cap-list.sh b/src/basic/generate-cap-list.sh
new file mode 100755 (executable)
index 0000000..1d4a562
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh -eu
+
+$1 -dM -include linux/capability.h -include "$2" -include "$3" - </dev/null | \
+        awk '/^#define[ \t]+CAP_[A-Z_]+[ \t]+/ { print $2; }' | \
+        grep -v CAP_LAST_CAP
diff --git a/src/basic/generate-errno-list.sh b/src/basic/generate-errno-list.sh
new file mode 100755 (executable)
index 0000000..e2bab8b
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/sh -eu
+
+$1 -dM -include errno.h - </dev/null | \
+        awk '/^#define[ \t]+E[^ _]+[ \t]+/ { print $2; }'
diff --git a/src/basic/generate-gperfs.py b/src/basic/generate-gperfs.py
new file mode 100755 (executable)
index 0000000..d4cc9aa
--- /dev/null
@@ -0,0 +1,16 @@
+#!/usr/bin/env python3
+
+"""Generate %-from-name.gperf from %-list.txt
+"""
+
+import sys
+
+name, prefix, input = sys.argv[1:]
+
+print("""\
+struct {}_name {{ const char* name; int id; }};
+%null-strings
+%%""".format(name))
+
+for line in open(input):
+    print("{0}, {1}{0}".format(line.rstrip(), prefix))
index 007198c..f611c42 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+#include <dirent.h>
 #include <errno.h>
 #include <glob.h>
+#include <sys/types.h>
 
+#include "dirent-util.h"
 #include "glob-util.h"
 #include "macro.h"
+#include "path-util.h"
 #include "strv.h"
 
-int glob_exists(const char *path) {
-        _cleanup_globfree_ glob_t g = {};
+int safe_glob(const char *path, int flags, glob_t *pglob) {
         int k;
 
-        assert(path);
+        /* We want to set GLOB_ALTDIRFUNC ourselves, don't allow it to be set. */
+        assert(!(flags & GLOB_ALTDIRFUNC));
+
+        if (!pglob->gl_closedir)
+                pglob->gl_closedir = (void (*)(void *)) closedir;
+        if (!pglob->gl_readdir)
+                pglob->gl_readdir = (struct dirent *(*)(void *)) readdir_no_dot;
+        if (!pglob->gl_opendir)
+                pglob->gl_opendir = (void *(*)(const char *)) opendir;
+        if (!pglob->gl_lstat)
+                pglob->gl_lstat = lstat;
+        if (!pglob->gl_stat)
+                pglob->gl_stat = stat;
 
         errno = 0;
-        k = glob(path, GLOB_NOSORT|GLOB_BRACE, NULL, &g);
+        k = glob(path, flags | GLOB_ALTDIRFUNC, NULL, pglob);
 
         if (k == GLOB_NOMATCH)
-                return 0;
+                return -ENOENT;
         if (k == GLOB_NOSPACE)
                 return -ENOMEM;
         if (k != 0)
                 return errno > 0 ? -errno : -EIO;
+        if (strv_isempty(pglob->gl_pathv))
+                return -ENOENT;
 
-        return !strv_isempty(g.gl_pathv);
+        return 0;
 }
 
-int glob_extend(char ***strv, const char *path) {
+int glob_exists(const char *path) {
         _cleanup_globfree_ glob_t g = {};
         int k;
-        char **p;
 
-        errno = 0;
-        k = glob(path, GLOB_NOSORT|GLOB_BRACE, NULL, &g);
+        assert(path);
 
-        if (k == GLOB_NOMATCH)
-                return -ENOENT;
-        if (k == GLOB_NOSPACE)
-                return -ENOMEM;
-        if (k != 0)
-                return errno > 0 ? -errno : -EIO;
-        if (strv_isempty(g.gl_pathv))
-                return -ENOENT;
+        k = safe_glob(path, GLOB_NOSORT|GLOB_BRACE, &g);
+        if (k == -ENOENT)
+                return false;
+        if (k < 0)
+                return k;
+        return true;
+}
+
+int glob_extend(char ***strv, const char *path) {
+        _cleanup_globfree_ glob_t g = {};
+        int k;
 
-        STRV_FOREACH(p, g.gl_pathv) {
-                k = strv_extend(strv, *p);
-                if (k < 0)
-                        return k;
-        }
+        k = safe_glob(path, GLOB_NOSORT|GLOB_BRACE, &g);
+        if (k < 0)
+                return k;
 
-        return 0;
+        return strv_extend_strv(strv, g.gl_pathv, false);
 }
index 5d8fb47..e1f6083 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+#include <glob.h>
 #include <stdbool.h>
 #include <string.h>
 
 #include "macro.h"
 #include "string-util.h"
 
+/* Note: this function modifies pglob to set various functions. */
+int safe_glob(const char *path, int flags, glob_t *pglob);
+
 int glob_exists(const char *path);
 int glob_extend(char ***strv, const char *path);
 
index 5421105..e6ac054 100644 (file)
@@ -26,7 +26,7 @@
 char *
 utf8_prev_char (const char *p)
 {
-  while (1)
+  for (;;)
     {
       p--;
       if ((*p & 0xc0) != 0x80)
index c5bda6c..2d6e377 100644 (file)
@@ -72,10 +72,10 @@ int unhexchar(char c) {
 }
 
 char *hexmem(const void *p, size_t l) {
-        char *r, *z;
         const uint8_t *x;
+        char *r, *z;
 
-        z = r = malloc(l * 2 + 1);
+        z = r = new(char, l * 2 + 1);
         if (!r)
                 return NULL;
 
@@ -97,6 +97,9 @@ int unhexmem(const char *p, size_t l, void **mem, size_t *len) {
         assert(len);
         assert(p);
 
+        if (l % 2 != 0)
+                return -EINVAL;
+
         z = r = malloc((l + 1) / 2 + 1);
         if (!r)
                 return -ENOMEM;
@@ -107,12 +110,10 @@ int unhexmem(const char *p, size_t l, void **mem, size_t *len) {
                 a = unhexchar(x[0]);
                 if (a < 0)
                         return a;
-                else if (x+1 < p + l) {
-                        b = unhexchar(x[1]);
-                        if (b < 0)
-                                return b;
-                } else
-                        b = 0;
+
+                b = unhexchar(x[1]);
+                if (b < 0)
+                        return b;
 
                 *(z++) = (uint8_t) a << 4 | (uint8_t) b;
         }
index 13c3bb6..a94037b 100644 (file)
@@ -55,7 +55,7 @@ char* gethostname_malloc(void) {
         assert_se(uname(&u) >= 0);
 
         if (isempty(u.nodename) || streq(u.nodename, "(none)"))
-                return strdup(u.sysname);
+                return strdup(FALLBACK_HOSTNAME);
 
         return strdup(u.nodename);
 }
@@ -163,7 +163,6 @@ char* hostname_cleanup(char *s) {
                         *(d++) = *p;
                         dot = false;
                 }
-
         }
 
         if (dot && d > s)
index aa7ccd1..d52fdad 100644 (file)
 #include "util.h"
 
 bool in4_addr_is_null(const struct in_addr *a) {
-        return a->s_addr == 0;
-}
+        assert(a);
 
-bool in6_addr_is_null(const struct in6_addr *a) {
-        return
-                a->s6_addr32[0] == 0 &&
-                a->s6_addr32[1] == 0 &&
-                a->s6_addr32[2] == 0 &&
-                a->s6_addr32[3] == 0;
+        return a->s_addr == 0;
 }
 
 int in_addr_is_null(int family, const union in_addr_union *u) {
@@ -49,16 +43,22 @@ int in_addr_is_null(int family, const union in_addr_union *u) {
                 return in4_addr_is_null(&u->in);
 
         if (family == AF_INET6)
-                return in6_addr_is_null(&u->in6);
+                return IN6_IS_ADDR_UNSPECIFIED(&u->in6);
 
         return -EAFNOSUPPORT;
 }
 
+bool in4_addr_is_link_local(const struct in_addr *a) {
+        assert(a);
+
+        return (be32toh(a->s_addr) & UINT32_C(0xFFFF0000)) == (UINT32_C(169) << 24 | UINT32_C(254) << 16);
+}
+
 int in_addr_is_link_local(int family, const union in_addr_union *u) {
         assert(u);
 
         if (family == AF_INET)
-                return (be32toh(u->in.s_addr) & UINT32_C(0xFFFF0000)) == (UINT32_C(169) << 24 | UINT32_C(254) << 16);
+                return in4_addr_is_link_local(&u->in);
 
         if (family == AF_INET6)
                 return IN6_IS_ADDR_LINKLOCAL(&u->in6);
@@ -66,12 +66,30 @@ int in_addr_is_link_local(int family, const union in_addr_union *u) {
         return -EAFNOSUPPORT;
 }
 
+int in_addr_is_multicast(int family, const union in_addr_union *u) {
+        assert(u);
+
+        if (family == AF_INET)
+                return IN_MULTICAST(be32toh(u->in.s_addr));
+
+        if (family == AF_INET6)
+                return IN6_IS_ADDR_MULTICAST(&u->in6);
+
+        return -EAFNOSUPPORT;
+}
+
+bool in4_addr_is_localhost(const struct in_addr *a) {
+        assert(a);
+
+        /* All of 127.x.x.x is localhost. */
+        return (be32toh(a->s_addr) & UINT32_C(0xFF000000)) == UINT32_C(127) << 24;
+}
+
 int in_addr_is_localhost(int family, const union in_addr_union *u) {
         assert(u);
 
         if (family == AF_INET)
-                /* All of 127.x.x.x is localhost. */
-                return (be32toh(u->in.s_addr) & UINT32_C(0xFF000000)) == UINT32_C(127) << 24;
+                return in4_addr_is_localhost(&u->in);
 
         if (family == AF_INET6)
                 return IN6_IS_ADDR_LOOPBACK(&u->in6);
@@ -277,15 +295,14 @@ fallback:
 }
 
 int in_addr_from_string(int family, const char *s, union in_addr_union *ret) {
-
+        union in_addr_union buffer;
         assert(s);
-        assert(ret);
 
         if (!IN_SET(family, AF_INET, AF_INET6))
                 return -EAFNOSUPPORT;
 
         errno = 0;
-        if (inet_pton(family, s, ret) <= 0)
+        if (inet_pton(family, s, ret ?: &buffer) <= 0)
                 return errno > 0 ? -errno : -EINVAL;
 
         return 0;
@@ -295,18 +312,18 @@ int in_addr_from_string_auto(const char *s, int *family, union in_addr_union *re
         int r;
 
         assert(s);
-        assert(family);
-        assert(ret);
 
         r = in_addr_from_string(AF_INET, s, ret);
         if (r >= 0) {
-                *family = AF_INET;
+                if (family)
+                        *family = AF_INET;
                 return 0;
         }
 
         r = in_addr_from_string(AF_INET6, s, ret);
         if (r >= 0) {
-                *family = AF_INET6;
+                if (family)
+                        *family = AF_INET6;
                 return 0;
         }
 
@@ -447,3 +464,45 @@ int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen)
 
         return -EAFNOSUPPORT;
 }
+
+int in_addr_prefix_from_string(const char *p, int family, union in_addr_union *ret_prefix, uint8_t *ret_prefixlen) {
+        union in_addr_union buffer;
+        const char *e, *l;
+        uint8_t k;
+        int r;
+
+        assert(p);
+
+        if (!IN_SET(family, AF_INET, AF_INET6))
+                return -EAFNOSUPPORT;
+
+        e = strchr(p, '/');
+        if (e)
+                l = strndupa(p, e - p);
+        else
+                l = p;
+
+        r = in_addr_from_string(family, l, &buffer);
+        if (r < 0)
+                return r;
+
+        k = FAMILY_ADDRESS_SIZE(family) * 8;
+
+        if (e) {
+                uint8_t n;
+
+                r = safe_atou8(e + 1, &n);
+                if (r < 0)
+                        return r;
+
+                if (n > k)
+                        return -ERANGE;
+
+                k = n;
+        }
+
+        *ret_prefix = buffer;
+        *ret_prefixlen = k;
+
+        return 0;
+}
index d60064a..14e2724 100644 (file)
@@ -37,11 +37,16 @@ struct in_addr_data {
 };
 
 bool in4_addr_is_null(const struct in_addr *a);
-bool in6_addr_is_null(const struct in6_addr *a);
-
 int in_addr_is_null(int family, const union in_addr_union *u);
+
+int in_addr_is_multicast(int family, const union in_addr_union *u);
+
+bool in4_addr_is_link_local(const struct in_addr *a);
 int in_addr_is_link_local(int family, const union in_addr_union *u);
+
+bool in4_addr_is_localhost(const struct in_addr *a);
 int in_addr_is_localhost(int family, const union in_addr_union *u);
+
 int in_addr_equal(int family, const union in_addr_union *a, const union in_addr_union *b);
 int in_addr_prefix_intersect(int family, const union in_addr_union *a, unsigned aprefixlen, const union in_addr_union *b, unsigned bprefixlen);
 int in_addr_prefix_next(int family, union in_addr_union *u, unsigned prefixlen);
@@ -55,6 +60,7 @@ struct in_addr* in_addr_prefixlen_to_netmask(struct in_addr *addr, unsigned char
 int in_addr_default_prefixlen(const struct in_addr *addr, unsigned char *prefixlen);
 int in_addr_default_subnet_mask(const struct in_addr *addr, struct in_addr *mask);
 int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen);
+int in_addr_prefix_from_string(const char *p, int family, union in_addr_union *ret_prefix, uint8_t *ret_prefixlen);
 
 static inline size_t FAMILY_ADDRESS_SIZE(int family) {
         assert(family == AF_INET || family == AF_INET6);
diff --git a/src/basic/journal-importer.c b/src/basic/journal-importer.c
new file mode 100644 (file)
index 0000000..7d72eff
--- /dev/null
@@ -0,0 +1,483 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2014 Zbigniew Jędrzejewski-Szmek
+
+  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 <unistd.h>
+
+#include "alloc-util.h"
+#include "journal-importer.h"
+#include "fd-util.h"
+#include "parse-util.h"
+#include "string-util.h"
+#include "unaligned.h"
+
+enum {
+        IMPORTER_STATE_LINE = 0,    /* waiting to read, or reading line */
+        IMPORTER_STATE_DATA_START,  /* reading binary data header */
+        IMPORTER_STATE_DATA,        /* reading binary data */
+        IMPORTER_STATE_DATA_FINISH, /* expecting newline */
+        IMPORTER_STATE_EOF,         /* done */
+};
+
+static int iovw_put(struct iovec_wrapper *iovw, void* data, size_t len) {
+        if (!GREEDY_REALLOC(iovw->iovec, iovw->size_bytes, iovw->count + 1))
+                return log_oom();
+
+        iovw->iovec[iovw->count++] = (struct iovec) {data, len};
+        return 0;
+}
+
+static void iovw_free_contents(struct iovec_wrapper *iovw) {
+        iovw->iovec = mfree(iovw->iovec);
+        iovw->size_bytes = iovw->count = 0;
+}
+
+static void iovw_rebase(struct iovec_wrapper *iovw, char *old, char *new) {
+        size_t i;
+
+        for (i = 0; i < iovw->count; i++)
+                iovw->iovec[i].iov_base = (char*) iovw->iovec[i].iov_base - old + new;
+}
+
+size_t iovw_size(struct iovec_wrapper *iovw) {
+        size_t n = 0, i;
+
+        for (i = 0; i < iovw->count; i++)
+                n += iovw->iovec[i].iov_len;
+
+        return n;
+}
+
+void journal_importer_cleanup(JournalImporter *imp) {
+        if (imp->fd >= 0 && !imp->passive_fd) {
+                log_debug("Closing %s (fd=%d)", imp->name ?: "importer", imp->fd);
+                safe_close(imp->fd);
+        }
+
+        free(imp->name);
+        free(imp->buf);
+        iovw_free_contents(&imp->iovw);
+}
+
+static char* realloc_buffer(JournalImporter *imp, size_t size) {
+        char *b, *old = imp->buf;
+
+        b = GREEDY_REALLOC(imp->buf, imp->size, size);
+        if (!b)
+                return NULL;
+
+        iovw_rebase(&imp->iovw, old, imp->buf);
+
+        return b;
+}
+
+static int get_line(JournalImporter *imp, char **line, size_t *size) {
+        ssize_t n;
+        char *c = NULL;
+
+        assert(imp);
+        assert(imp->state == IMPORTER_STATE_LINE);
+        assert(imp->offset <= imp->filled);
+        assert(imp->filled <= imp->size);
+        assert(imp->buf == NULL || imp->size > 0);
+        assert(imp->fd >= 0);
+
+        for (;;) {
+                if (imp->buf) {
+                        size_t start = MAX(imp->scanned, imp->offset);
+
+                        c = memchr(imp->buf + start, '\n',
+                                   imp->filled - start);
+                        if (c != NULL)
+                                break;
+                }
+
+                imp->scanned = imp->filled;
+                if (imp->scanned >= DATA_SIZE_MAX) {
+                        log_error("Entry is bigger than %u bytes.", DATA_SIZE_MAX);
+                        return -E2BIG;
+                }
+
+                if (imp->passive_fd)
+                        /* we have to wait for some data to come to us */
+                        return -EAGAIN;
+
+                /* We know that imp->filled is at most DATA_SIZE_MAX, so if
+                   we reallocate it, we'll increase the size at least a bit. */
+                assert_cc(DATA_SIZE_MAX < ENTRY_SIZE_MAX);
+                if (imp->size - imp->filled < LINE_CHUNK &&
+                    !realloc_buffer(imp, MIN(imp->filled + LINE_CHUNK, ENTRY_SIZE_MAX)))
+                                return log_oom();
+
+                assert(imp->buf);
+                assert(imp->size - imp->filled >= LINE_CHUNK ||
+                       imp->size == ENTRY_SIZE_MAX);
+
+                n = read(imp->fd,
+                         imp->buf + imp->filled,
+                         imp->size - imp->filled);
+                if (n < 0) {
+                        if (errno != EAGAIN)
+                                log_error_errno(errno, "read(%d, ..., %zu): %m",
+                                                imp->fd,
+                                                imp->size - imp->filled);
+                        return -errno;
+                } else if (n == 0)
+                        return 0;
+
+                imp->filled += n;
+        }
+
+        *line = imp->buf + imp->offset;
+        *size = c + 1 - imp->buf - imp->offset;
+        imp->offset += *size;
+
+        return 1;
+}
+
+static int fill_fixed_size(JournalImporter *imp, void **data, size_t size) {
+
+        assert(imp);
+        assert(imp->state == IMPORTER_STATE_DATA_START ||
+               imp->state == IMPORTER_STATE_DATA ||
+               imp->state == IMPORTER_STATE_DATA_FINISH);
+        assert(size <= DATA_SIZE_MAX);
+        assert(imp->offset <= imp->filled);
+        assert(imp->filled <= imp->size);
+        assert(imp->buf != NULL || imp->size == 0);
+        assert(imp->buf == NULL || imp->size > 0);
+        assert(imp->fd >= 0);
+        assert(data);
+
+        while (imp->filled - imp->offset < size) {
+                int n;
+
+                if (imp->passive_fd)
+                        /* we have to wait for some data to come to us */
+                        return -EAGAIN;
+
+                if (!realloc_buffer(imp, imp->offset + size))
+                        return log_oom();
+
+                n = read(imp->fd, imp->buf + imp->filled,
+                         imp->size - imp->filled);
+                if (n < 0) {
+                        if (errno != EAGAIN)
+                                log_error_errno(errno, "read(%d, ..., %zu): %m", imp->fd,
+                                                imp->size - imp->filled);
+                        return -errno;
+                } else if (n == 0)
+                        return 0;
+
+                imp->filled += n;
+        }
+
+        *data = imp->buf + imp->offset;
+        imp->offset += size;
+
+        return 1;
+}
+
+static int get_data_size(JournalImporter *imp) {
+        int r;
+        void *data;
+
+        assert(imp);
+        assert(imp->state == IMPORTER_STATE_DATA_START);
+        assert(imp->data_size == 0);
+
+        r = fill_fixed_size(imp, &data, sizeof(uint64_t));
+        if (r <= 0)
+                return r;
+
+        imp->data_size = unaligned_read_le64(data);
+        if (imp->data_size > DATA_SIZE_MAX) {
+                log_error("Stream declares field with size %zu > DATA_SIZE_MAX = %u",
+                          imp->data_size, DATA_SIZE_MAX);
+                return -EINVAL;
+        }
+        if (imp->data_size == 0)
+                log_warning("Binary field with zero length");
+
+        return 1;
+}
+
+static int get_data_data(JournalImporter *imp, void **data) {
+        int r;
+
+        assert(imp);
+        assert(data);
+        assert(imp->state == IMPORTER_STATE_DATA);
+
+        r = fill_fixed_size(imp, data, imp->data_size);
+        if (r <= 0)
+                return r;
+
+        return 1;
+}
+
+static int get_data_newline(JournalImporter *imp) {
+        int r;
+        char *data;
+
+        assert(imp);
+        assert(imp->state == IMPORTER_STATE_DATA_FINISH);
+
+        r = fill_fixed_size(imp, (void**) &data, 1);
+        if (r <= 0)
+                return r;
+
+        assert(data);
+        if (*data != '\n') {
+                log_error("expected newline, got '%c'", *data);
+                return -EINVAL;
+        }
+
+        return 1;
+}
+
+static int process_dunder(JournalImporter *imp, char *line, size_t n) {
+        const char *timestamp;
+        int r;
+
+        assert(line);
+        assert(n > 0);
+        assert(line[n-1] == '\n');
+
+        /* XXX: is it worth to support timestamps in extended format?
+         * We don't produce them, but who knows... */
+
+        timestamp = startswith(line, "__CURSOR=");
+        if (timestamp)
+                /* ignore __CURSOR */
+                return 1;
+
+        timestamp = startswith(line, "__REALTIME_TIMESTAMP=");
+        if (timestamp) {
+                long long unsigned x;
+                line[n-1] = '\0';
+                r = safe_atollu(timestamp, &x);
+                if (r < 0)
+                        log_warning("Failed to parse __REALTIME_TIMESTAMP: '%s'", timestamp);
+                else
+                        imp->ts.realtime = x;
+                return r < 0 ? r : 1;
+        }
+
+        timestamp = startswith(line, "__MONOTONIC_TIMESTAMP=");
+        if (timestamp) {
+                long long unsigned x;
+                line[n-1] = '\0';
+                r = safe_atollu(timestamp, &x);
+                if (r < 0)
+                        log_warning("Failed to parse __MONOTONIC_TIMESTAMP: '%s'", timestamp);
+                else
+                        imp->ts.monotonic = x;
+                return r < 0 ? r : 1;
+        }
+
+        timestamp = startswith(line, "__");
+        if (timestamp) {
+                log_notice("Unknown dunder line %s", line);
+                return 1;
+        }
+
+        /* no dunder */
+        return 0;
+}
+
+int journal_importer_process_data(JournalImporter *imp) {
+        int r;
+
+        switch(imp->state) {
+        case IMPORTER_STATE_LINE: {
+                char *line, *sep;
+                size_t n = 0;
+
+                assert(imp->data_size == 0);
+
+                r = get_line(imp, &line, &n);
+                if (r < 0)
+                        return r;
+                if (r == 0) {
+                        imp->state = IMPORTER_STATE_EOF;
+                        return 0;
+                }
+                assert(n > 0);
+                assert(line[n-1] == '\n');
+
+                if (n == 1) {
+                        log_trace("Received empty line, event is ready");
+                        return 1;
+                }
+
+                r = process_dunder(imp, line, n);
+                if (r != 0)
+                        return r < 0 ? r : 0;
+
+                /* MESSAGE=xxx\n
+                   or
+                   COREDUMP\n
+                   LLLLLLLL0011223344...\n
+                */
+                sep = memchr(line, '=', n);
+                if (sep) {
+                        /* chomp newline */
+                        n--;
+
+                        r = iovw_put(&imp->iovw, line, n);
+                        if (r < 0)
+                                return r;
+                } else {
+                        /* replace \n with = */
+                        line[n-1] = '=';
+
+                        imp->field_len = n;
+                        imp->state = IMPORTER_STATE_DATA_START;
+
+                        /* we cannot put the field in iovec until we have all data */
+                }
+
+                log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary");
+
+                return 0; /* continue */
+        }
+
+        case IMPORTER_STATE_DATA_START:
+                assert(imp->data_size == 0);
+
+                r = get_data_size(imp);
+                // log_debug("get_data_size() -> %d", r);
+                if (r < 0)
+                        return r;
+                if (r == 0) {
+                        imp->state = IMPORTER_STATE_EOF;
+                        return 0;
+                }
+
+                imp->state = imp->data_size > 0 ?
+                        IMPORTER_STATE_DATA : IMPORTER_STATE_DATA_FINISH;
+
+                return 0; /* continue */
+
+        case IMPORTER_STATE_DATA: {
+                void *data;
+                char *field;
+
+                assert(imp->data_size > 0);
+
+                r = get_data_data(imp, &data);
+                // log_debug("get_data_data() -> %d", r);
+                if (r < 0)
+                        return r;
+                if (r == 0) {
+                        imp->state = IMPORTER_STATE_EOF;
+                        return 0;
+                }
+
+                assert(data);
+
+                field = (char*) data - sizeof(uint64_t) - imp->field_len;
+                memmove(field + sizeof(uint64_t), field, imp->field_len);
+
+                r = iovw_put(&imp->iovw, field + sizeof(uint64_t), imp->field_len + imp->data_size);
+                if (r < 0)
+                        return r;
+
+                imp->state = IMPORTER_STATE_DATA_FINISH;
+
+                return 0; /* continue */
+        }
+
+        case IMPORTER_STATE_DATA_FINISH:
+                r = get_data_newline(imp);
+                // log_debug("get_data_newline() -> %d", r);
+                if (r < 0)
+                        return r;
+                if (r == 0) {
+                        imp->state = IMPORTER_STATE_EOF;
+                        return 0;
+                }
+
+                imp->data_size = 0;
+                imp->state = IMPORTER_STATE_LINE;
+
+                return 0; /* continue */
+        default:
+                assert_not_reached("wtf?");
+        }
+}
+
+int journal_importer_push_data(JournalImporter *imp, const char *data, size_t size) {
+        assert(imp);
+        assert(imp->state != IMPORTER_STATE_EOF);
+
+        if (!realloc_buffer(imp, imp->filled + size)) {
+                log_error("Failed to store received data of size %zu "
+                          "(in addition to existing %zu bytes with %zu filled): %s",
+                          size, imp->size, imp->filled, strerror(ENOMEM));
+                return -ENOMEM;
+        }
+
+        memcpy(imp->buf + imp->filled, data, size);
+        imp->filled += size;
+
+        return 0;
+}
+
+void journal_importer_drop_iovw(JournalImporter *imp) {
+        size_t remain, target;
+
+        /* This function drops processed data that along with the iovw that points at it */
+
+        iovw_free_contents(&imp->iovw);
+
+        /* possibly reset buffer position */
+        remain = imp->filled - imp->offset;
+
+        if (remain == 0) /* no brainer */
+                imp->offset = imp->scanned = imp->filled = 0;
+        else if (imp->offset > imp->size - imp->filled &&
+                 imp->offset > remain) {
+                memcpy(imp->buf, imp->buf + imp->offset, remain);
+                imp->offset = imp->scanned = 0;
+                imp->filled = remain;
+        }
+
+        target = imp->size;
+        while (target > 16 * LINE_CHUNK && imp->filled < target / 2)
+                target /= 2;
+        if (target < imp->size) {
+                char *tmp;
+
+                tmp = realloc(imp->buf, target);
+                if (!tmp)
+                        log_warning("Failed to reallocate buffer to (smaller) size %zu",
+                                    target);
+                else {
+                        log_debug("Reallocated buffer from %zu to %zu bytes",
+                                  imp->size, target);
+                        imp->buf = tmp;
+                        imp->size = target;
+                }
+        }
+}
+
+bool journal_importer_eof(const JournalImporter *imp) {
+        return imp->state == IMPORTER_STATE_EOF;
+}
diff --git a/src/basic/journal-importer.h b/src/basic/journal-importer.h
new file mode 100644 (file)
index 0000000..b3e308d
--- /dev/null
@@ -0,0 +1,70 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 Zbigniew Jędrzejewski-Szmek
+
+  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/>.
+***/
+
+#pragma once
+
+#include <stddef.h>
+#include <stdbool.h>
+#include <sys/uio.h>
+
+#include "time-util.h"
+
+/* Make sure not to make this smaller than the maximum coredump size.
+ * See COREDUMP_MAX in coredump.c */
+#define ENTRY_SIZE_MAX (1024*1024*770u)
+#define DATA_SIZE_MAX (1024*1024*768u)
+#define LINE_CHUNK 8*1024u
+
+struct iovec_wrapper {
+        struct iovec *iovec;
+        size_t size_bytes;
+        size_t count;
+};
+
+size_t iovw_size(struct iovec_wrapper *iovw);
+
+typedef struct JournalImporter {
+        int fd;
+        bool passive_fd;
+        char *name;
+
+        char *buf;
+        size_t size;       /* total size of the buffer */
+        size_t offset;     /* offset to the beginning of live data in the buffer */
+        size_t scanned;    /* number of bytes since the beginning of data without a newline */
+        size_t filled;     /* total number of bytes in the buffer */
+
+        size_t field_len;  /* used for binary fields: the field name length */
+        size_t data_size;  /* and the size of the binary data chunk being processed */
+
+        struct iovec_wrapper iovw;
+
+        int state;
+        dual_timestamp ts;
+} JournalImporter;
+
+void journal_importer_cleanup(JournalImporter *);
+int journal_importer_process_data(JournalImporter *);
+int journal_importer_push_data(JournalImporter *, const char *data, size_t size);
+void journal_importer_drop_iovw(JournalImporter *);
+bool journal_importer_eof(const JournalImporter *);
+
+static inline size_t journal_importer_bytes_remaining(const JournalImporter *imp) {
+        return imp->filled;
+}
diff --git a/src/basic/khash.c b/src/basic/khash.c
new file mode 100644 (file)
index 0000000..84648dc
--- /dev/null
@@ -0,0 +1,275 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <linux/if_alg.h>
+#include <stdbool.h>
+#include <sys/socket.h>
+
+#include "alloc-util.h"
+#include "fd-util.h"
+#include "hexdecoct.h"
+#include "khash.h"
+#include "macro.h"
+#include "missing.h"
+#include "string-util.h"
+#include "util.h"
+
+/* On current kernels the maximum digest (according to "grep digestsize /proc/crypto | sort -u") is actually 32, but
+ * let's add some extra room, the few wasted bytes don't really matter... */
+#define LONGEST_DIGEST 128
+
+struct khash {
+        int fd;
+        char *algorithm;
+        uint8_t digest[LONGEST_DIGEST+1];
+        size_t digest_size;
+        bool digest_valid;
+};
+
+int khash_new_with_key(khash **ret, const char *algorithm, const void *key, size_t key_size) {
+        union {
+                struct sockaddr sa;
+                struct sockaddr_alg alg;
+        } sa = {
+                .alg.salg_family = AF_ALG,
+                .alg.salg_type = "hash",
+        };
+
+        _cleanup_(khash_unrefp) khash *h = NULL;
+        _cleanup_close_ int fd = -1;
+        ssize_t n;
+
+        assert(ret);
+        assert(key || key_size == 0);
+
+        /* Filter out an empty algorithm early, as we do not support an algorithm by that name. */
+        if (isempty(algorithm))
+                return -EINVAL;
+
+        /* Overly long hash algorithm names we definitely do not support */
+        if (strlen(algorithm) >= sizeof(sa.alg.salg_name))
+                return -EOPNOTSUPP;
+
+        fd = socket(AF_ALG, SOCK_SEQPACKET|SOCK_CLOEXEC, 0);
+        if (fd < 0)
+                return -errno;
+
+        strcpy((char*) sa.alg.salg_name, algorithm);
+        if (bind(fd, &sa.sa, sizeof(sa)) < 0) {
+                if (errno == ENOENT)
+                        return -EOPNOTSUPP;
+                return -errno;
+        }
+
+        if (key) {
+                if (setsockopt(fd, SOL_ALG, ALG_SET_KEY, key, key_size) < 0)
+                        return -errno;
+        }
+
+        h = new0(khash, 1);
+        if (!h)
+                return -ENOMEM;
+
+        h->fd = accept4(fd, NULL, 0, SOCK_CLOEXEC);
+        if (h->fd < 0)
+                return -errno;
+
+        h->algorithm = strdup(algorithm);
+        if (!h->algorithm)
+                return -ENOMEM;
+
+        /* Temporary fix for rc kernel bug: https://bugzilla.redhat.com/show_bug.cgi?id=1395896 */
+        (void) send(h->fd, NULL, 0, 0);
+
+        /* Figure out the digest size */
+        n = recv(h->fd, h->digest, sizeof(h->digest), 0);
+        if (n < 0)
+                return -errno;
+        if (n >= LONGEST_DIGEST) /* longer than what we expected? If so, we don't support this */
+                return -EOPNOTSUPP;
+
+        h->digest_size = (size_t) n;
+        h->digest_valid = true;
+
+        /* Temporary fix for rc kernel bug: https://bugzilla.redhat.com/show_bug.cgi?id=1395896 */
+        (void) send(h->fd, NULL, 0, 0);
+
+        *ret = h;
+        h = NULL;
+
+        return 0;
+}
+
+int khash_new(khash **ret, const char *algorithm) {
+        return khash_new_with_key(ret, algorithm, NULL, 0);
+}
+
+khash* khash_unref(khash *h) {
+        if (!h)
+                return NULL;
+
+        safe_close(h->fd);
+        free(h->algorithm);
+        free(h);
+
+        return NULL;
+}
+
+int khash_dup(khash *h, khash **ret) {
+        _cleanup_(khash_unrefp) khash *copy = NULL;
+
+        assert(h);
+        assert(ret);
+
+        copy = newdup(khash, h, 1);
+        if (!copy)
+                return -ENOMEM;
+
+        copy->fd = -1;
+        copy->algorithm = strdup(h->algorithm);
+        if (!copy->algorithm)
+                return -ENOMEM;
+
+        copy->fd = accept4(h->fd, NULL, 0, SOCK_CLOEXEC);
+        if (copy->fd < 0)
+                return -errno;
+
+        *ret = copy;
+        copy = NULL;
+
+        return 0;
+}
+
+const char *khash_get_algorithm(khash *h) {
+        assert(h);
+
+        return h->algorithm;
+}
+
+size_t khash_get_size(khash *h) {
+        assert(h);
+
+        return h->digest_size;
+}
+
+int khash_reset(khash *h) {
+        ssize_t n;
+
+        assert(h);
+
+        n = send(h->fd, NULL, 0, 0);
+        if (n < 0)
+                return -errno;
+
+        h->digest_valid = false;
+
+        return 0;
+}
+
+int khash_put(khash *h, const void *buffer, size_t size) {
+        ssize_t n;
+
+        assert(h);
+        assert(buffer || size == 0);
+
+        if (size <= 0)
+                return 0;
+
+        n = send(h->fd, buffer, size, MSG_MORE);
+        if (n < 0)
+                return -errno;
+
+        h->digest_valid = false;
+
+        return 0;
+}
+
+int khash_put_iovec(khash *h, const struct iovec *iovec, size_t n) {
+        struct msghdr mh = {
+                mh.msg_iov = (struct iovec*) iovec,
+                mh.msg_iovlen = n,
+        };
+        ssize_t k;
+
+        assert(h);
+        assert(iovec || n == 0);
+
+        if (n <= 0)
+                return 0;
+
+        k = sendmsg(h->fd, &mh, MSG_MORE);
+        if (k < 0)
+                return -errno;
+
+        h->digest_valid = false;
+
+        return 0;
+}
+
+static int retrieve_digest(khash *h) {
+        ssize_t n;
+
+        assert(h);
+
+        if (h->digest_valid)
+                return 0;
+
+        n = recv(h->fd, h->digest, h->digest_size, 0);
+        if (n < 0)
+                return n;
+        if ((size_t) n != h->digest_size) /* digest size changed? */
+                return -EIO;
+
+        h->digest_valid = true;
+
+        return 0;
+}
+
+int khash_digest_data(khash *h, const void **ret) {
+        int r;
+
+        assert(h);
+        assert(ret);
+
+        r = retrieve_digest(h);
+        if (r < 0)
+                return r;
+
+        *ret = h->digest;
+        return 0;
+}
+
+int khash_digest_string(khash *h, char **ret) {
+        int r;
+        char *p;
+
+        assert(h);
+        assert(ret);
+
+        r = retrieve_digest(h);
+        if (r < 0)
+                return r;
+
+        p = hexmem(h->digest, h->digest_size);
+        if (!p)
+                return -ENOMEM;
+
+        *ret = p;
+        return 0;
+}
diff --git a/src/basic/khash.h b/src/basic/khash.h
new file mode 100644 (file)
index 0000000..410f302
--- /dev/null
@@ -0,0 +1,53 @@
+#pragma once
+
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <inttypes.h>
+#include <sys/types.h>
+#include <sys/uio.h>
+
+#include "macro.h"
+
+typedef struct khash khash;
+
+/* For plain hash functions. Hash functions commonly supported on today's kernels are: crc32c, crct10dif, crc32,
+ * sha224, sha256, sha512, sha384, sha1, md5, md4, sha3-224, sha3-256, sha3-384, sha3-512, and more. */
+int khash_new(khash **ret, const char *algorithm);
+
+/* For keyed hash functions. Hash functions commonly supported on today's kernels are: hmac(sha256), cmac(aes),
+ * cmac(des3_ede), hmac(sha3-512), hmac(sha3-384), hmac(sha3-256), hmac(sha3-224), hmac(rmd160), hmac(rmd128),
+ * hmac(sha224), hmac(sha512), hmac(sha384), hmac(sha1), hmac(md5), and more. */
+int khash_new_with_key(khash **ret, const char *algorithm, const void *key, size_t key_size);
+
+int khash_dup(khash *h, khash **ret);
+khash* khash_unref(khash *h);
+
+const char *khash_get_algorithm(khash *h);
+size_t khash_get_size(khash *h);
+
+int khash_reset(khash *h);
+
+int khash_put(khash *h, const void *buffer, size_t size);
+int khash_put_iovec(khash *h, const struct iovec *iovec, size_t n);
+
+int khash_digest_data(khash *h, const void **ret);
+int khash_digest_string(khash *h, char **ret);
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(khash*, khash_unref);
index 5962aa4..c3771a1 100644 (file)
                 } else {                                                \
                         if ((_b->name##_prev = _a->name##_prev))        \
                                 _b->name##_prev->name##_next = _b;      \
+                        else                                            \
+                                *_head = _b;                            \
                         _b->name##_next = _a;                           \
                         _a->name##_prev = _b;                           \
                 }                                                       \
index 49b4598..3fd5380 100644 (file)
@@ -37,7 +37,7 @@
 
 #include "alloc-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "io-util.h"
 #include "log.h"
 #include "macro.h"
@@ -58,7 +58,8 @@
 #define SNDBUF_SIZE (8*1024*1024)
 
 static LogTarget log_target = LOG_TARGET_CONSOLE;
-static int log_max_level = LOG_INFO;
+static int log_max_level[] = {LOG_INFO, LOG_INFO};
+assert_cc(ELEMENTSOF(log_max_level) == _LOG_REALM_MAX);
 static int log_facility = LOG_DAEMON;
 
 static int console_fd = STDERR_FILENO;
@@ -72,6 +73,7 @@ static bool show_color = false;
 static bool show_location = false;
 
 static bool upgrade_syslog_to_journal = false;
+static bool always_reopen_console = false;
 
 /* Akin to glibc's __abort_msg; which is private and we hence cannot
  * use here. */
@@ -95,7 +97,7 @@ static int log_open_console(void) {
         if (console_fd >= 0)
                 return 0;
 
-        if (getpid() == 1) {
+        if (always_reopen_console) {
                 console_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
                 if (console_fd < 0)
                         return console_fd;
@@ -133,7 +135,7 @@ static int create_log_socket(int type) {
         if (fd < 0)
                 return -errno;
 
-        fd_inc_sndbuf(fd, SNDBUF_SIZE);
+        (void) fd_inc_sndbuf(fd, SNDBUF_SIZE);
 
         /* We need a blocking fd here since we'd otherwise lose
         messages way too early. However, let's not hang forever in the
@@ -230,6 +232,8 @@ fail:
 int log_open(void) {
         int r;
 
+        /* Do not call from library code. */
+
         /* If we don't use the console we close it here, to not get
          * killed by SAK. If we don't use syslog we close it here so
          * that we are not confused by somebody deleting the socket in
@@ -243,13 +247,13 @@ int log_open(void) {
                 return 0;
         }
 
-        if ((log_target != LOG_TARGET_AUTO && log_target != LOG_TARGET_SAFE) ||
+        if (!IN_SET(log_target, LOG_TARGET_AUTO, LOG_TARGET_SAFE) ||
             getpid() == 1 ||
             isatty(STDERR_FILENO) <= 0) {
 
-                if (log_target == LOG_TARGET_AUTO ||
-                    log_target == LOG_TARGET_JOURNAL_OR_KMSG ||
-                    log_target == LOG_TARGET_JOURNAL) {
+                if (IN_SET(log_target, LOG_TARGET_AUTO,
+                                       LOG_TARGET_JOURNAL_OR_KMSG,
+                                       LOG_TARGET_JOURNAL)) {
                         r = log_open_journal();
                         if (r >= 0) {
                                 log_close_syslog();
@@ -258,8 +262,8 @@ int log_open(void) {
                         }
                 }
 
-                if (log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
-                    log_target == LOG_TARGET_SYSLOG) {
+                if (IN_SET(log_target, LOG_TARGET_SYSLOG_OR_KMSG,
+                                       LOG_TARGET_SYSLOG)) {
                         r = log_open_syslog();
                         if (r >= 0) {
                                 log_close_journal();
@@ -268,11 +272,11 @@ int log_open(void) {
                         }
                 }
 
-                if (log_target == LOG_TARGET_AUTO ||
-                    log_target == LOG_TARGET_SAFE ||
-                    log_target == LOG_TARGET_JOURNAL_OR_KMSG ||
-                    log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
-                    log_target == LOG_TARGET_KMSG) {
+                if (IN_SET(log_target, LOG_TARGET_AUTO,
+                                       LOG_TARGET_SAFE,
+                                       LOG_TARGET_JOURNAL_OR_KMSG,
+                                       LOG_TARGET_SYSLOG_OR_KMSG,
+                                       LOG_TARGET_KMSG)) {
                         r = log_open_kmsg();
                         if (r >= 0) {
                                 log_close_journal();
@@ -304,6 +308,8 @@ void log_set_target(LogTarget target) {
 }
 
 void log_close(void) {
+        /* Do not call from library code. */
+
         log_close_journal();
         log_close_syslog();
         log_close_kmsg();
@@ -311,13 +317,16 @@ void log_close(void) {
 }
 
 void log_forget_fds(void) {
+        /* Do not call from library code. */
+
         console_fd = kmsg_fd = syslog_fd = journal_fd = -1;
 }
 
-void log_set_max_level(int level) {
+void log_set_max_level_realm(LogRealm realm, int level) {
         assert((level & LOG_PRIMASK) == level);
+        assert(realm < ELEMENTSOF(log_max_level));
 
-        log_max_level = level;
+        log_max_level[realm] = level;
 }
 
 void log_set_facility(int facility) {
@@ -330,8 +339,6 @@ static int write_to_console(
                 const char *file,
                 int line,
                 const char *func,
-                const char *object_field,
-                const char *object,
                 const char *buffer) {
 
         char location[256], prefix[1 + DECIMAL_STR_MAX(int) + 2];
@@ -343,7 +350,7 @@ static int write_to_console(
                 return 0;
 
         if (log_target == LOG_TARGET_CONSOLE_PREFIXED) {
-                sprintf(prefix, "<%i>", level);
+                xsprintf(prefix, "<%i>", level);
                 IOVEC_SET_STRING(iovec[n++], prefix);
         }
 
@@ -390,8 +397,6 @@ static int write_to_syslog(
                 const char *file,
                 int line,
                 const char *func,
-                const char *object_field,
-                const char *object,
                 const char *buffer) {
 
         char header_priority[2 + DECIMAL_STR_MAX(int) + 1],
@@ -453,8 +458,6 @@ static int write_to_kmsg(
                 const char *file,
                 int line,
                 const char *func,
-                const char *object_field,
-                const char *object,
                 const char *buffer) {
 
         char header_priority[2 + DECIMAL_STR_MAX(int) + 1],
@@ -485,7 +488,8 @@ static int log_do_header(
                 int level,
                 int error,
                 const char *file, int line, const char *func,
-                const char *object_field, const char *object) {
+                const char *object_field, const char *object,
+                const char *extra_field, const char *extra) {
 
         snprintf(header, size,
                  "PRIORITY=%i\n"
@@ -495,6 +499,7 @@ static int log_do_header(
                  "%s%s%s"
                  "%s%.*i%s"
                  "%s%s%s"
+                 "%s%s%s"
                  "SYSLOG_IDENTIFIER=%s\n",
                  LOG_PRI(level),
                  LOG_FAC(level),
@@ -504,7 +509,7 @@ static int log_do_header(
                  line ? "CODE_LINE=" : "",
                  line ? 1 : 0, line, /* %.0d means no output too, special case for 0 */
                  line ? "\n" : "",
-                 isempty(func) ? "" : "CODE_FUNCTION=",
+                 isempty(func) ? "" : "CODE_FUNC=",
                  isempty(func) ? "" : func,
                  isempty(func) ? "" : "\n",
                  error ? "ERRNO=" : "",
@@ -513,6 +518,9 @@ static int log_do_header(
                  isempty(object) ? "" : object_field,
                  isempty(object) ? "" : object,
                  isempty(object) ? "" : "\n",
+                 isempty(extra) ? "" : extra_field,
+                 isempty(extra) ? "" : extra,
+                 isempty(extra) ? "" : "\n",
                  program_invocation_short_name);
 
         return 0;
@@ -526,6 +534,8 @@ static int write_to_journal(
                 const char *func,
                 const char *object_field,
                 const char *object,
+                const char *extra_field,
+                const char *extra,
                 const char *buffer) {
 
         char header[LINE_MAX];
@@ -535,7 +545,7 @@ static int write_to_journal(
         if (journal_fd < 0)
                 return 0;
 
-        log_do_header(header, sizeof(header), level, error, file, line, func, object_field, object);
+        log_do_header(header, sizeof(header), level, error, file, line, func, object_field, object, extra_field, extra);
 
         IOVEC_SET_STRING(iovec[0], header);
         IOVEC_SET_STRING(iovec[1], "MESSAGE=");
@@ -551,7 +561,7 @@ static int write_to_journal(
         return 1;
 }
 
-static int log_dispatch(
+int log_dispatch_internal(
                 int level,
                 int error,
                 const char *file,
@@ -559,10 +569,15 @@ static int log_dispatch(
                 const char *func,
                 const char *object_field,
                 const char *object,
+                const char *extra,
+                const char *extra_field,
                 char *buffer) {
 
         assert(buffer);
 
+        if (error < 0)
+                error = -error;
+
         if (log_target == LOG_TARGET_NULL)
                 return -error;
 
@@ -570,9 +585,6 @@ static int log_dispatch(
         if ((level & LOG_FACMASK) == 0)
                 level = log_facility | LOG_PRI(level);
 
-        if (error < 0)
-                error = -error;
-
         do {
                 char *e;
                 int k = 0;
@@ -585,11 +597,11 @@ static int log_dispatch(
                 if ((e = strpbrk(buffer, NEWLINE)))
                         *(e++) = 0;
 
-                if (log_target == LOG_TARGET_AUTO ||
-                    log_target == LOG_TARGET_JOURNAL_OR_KMSG ||
-                    log_target == LOG_TARGET_JOURNAL) {
+                if (IN_SET(log_target, LOG_TARGET_AUTO,
+                                       LOG_TARGET_JOURNAL_OR_KMSG,
+                                       LOG_TARGET_JOURNAL)) {
 
-                        k = write_to_journal(level, error, file, line, func, object_field, object, buffer);
+                        k = write_to_journal(level, error, file, line, func, object_field, object, extra_field, extra, buffer);
                         if (k < 0) {
                                 if (k != -EAGAIN)
                                         log_close_journal();
@@ -597,10 +609,10 @@ static int log_dispatch(
                         }
                 }
 
-                if (log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
-                    log_target == LOG_TARGET_SYSLOG) {
+                if (IN_SET(log_target, LOG_TARGET_SYSLOG_OR_KMSG,
+                                       LOG_TARGET_SYSLOG)) {
 
-                        k = write_to_syslog(level, error, file, line, func, object_field, object, buffer);
+                        k = write_to_syslog(level, error, file, line, func, buffer);
                         if (k < 0) {
                                 if (k != -EAGAIN)
                                         log_close_syslog();
@@ -609,13 +621,13 @@ static int log_dispatch(
                 }
 
                 if (k <= 0 &&
-                    (log_target == LOG_TARGET_AUTO ||
-                     log_target == LOG_TARGET_SAFE ||
-                     log_target == LOG_TARGET_SYSLOG_OR_KMSG ||
-                     log_target == LOG_TARGET_JOURNAL_OR_KMSG ||
-                     log_target == LOG_TARGET_KMSG)) {
+                    IN_SET(log_target, LOG_TARGET_AUTO,
+                                       LOG_TARGET_SAFE,
+                                       LOG_TARGET_SYSLOG_OR_KMSG,
+                                       LOG_TARGET_JOURNAL_OR_KMSG,
+                                       LOG_TARGET_KMSG)) {
 
-                        k = write_to_kmsg(level, error, file, line, func, object_field, object, buffer);
+                        k = write_to_kmsg(level, error, file, line, func, buffer);
                         if (k < 0) {
                                 log_close_kmsg();
                                 log_open_console();
@@ -623,7 +635,7 @@ static int log_dispatch(
                 }
 
                 if (k <= 0)
-                        (void) write_to_console(level, error, file, line, func, object_field, object, buffer);
+                        (void) write_to_console(level, error, file, line, func, buffer);
 
                 buffer = e;
         } while (buffer);
@@ -632,13 +644,14 @@ static int log_dispatch(
 }
 
 int log_dump_internal(
-        int level,
-        int error,
-        const char *file,
-        int line,
-        const char *func,
-        char *buffer) {
+                int level,
+                int error,
+                const char *file,
+                int line,
+                const char *func,
+                char *buffer) {
 
+        LogRealm realm = LOG_REALM_REMOVE_LEVEL(level);
         PROTECT_ERRNO;
 
         /* This modifies the buffer... */
@@ -646,13 +659,13 @@ int log_dump_internal(
         if (error < 0)
                 error = -error;
 
-        if (_likely_(LOG_PRI(level) > log_max_level))
+        if (_likely_(LOG_PRI(level) > log_max_level[realm]))
                 return -error;
 
-        return log_dispatch(level, error, file, line, func, NULL, NULL, buffer);
+        return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, buffer);
 }
 
-int log_internalv(
+int log_internalv_realm(
                 int level,
                 int error,
                 const char *file,
@@ -661,13 +674,14 @@ int log_internalv(
                 const char *format,
                 va_list ap) {
 
-        PROTECT_ERRNO;
+        LogRealm realm = LOG_REALM_REMOVE_LEVEL(level);
         char buffer[LINE_MAX];
+        PROTECT_ERRNO;
 
         if (error < 0)
                 error = -error;
 
-        if (_likely_(LOG_PRI(level) > log_max_level))
+        if (_likely_(LOG_PRI(level) > log_max_level[realm]))
                 return -error;
 
         /* Make sure that %m maps to the specified error */
@@ -676,10 +690,10 @@ int log_internalv(
 
         vsnprintf(buffer, sizeof(buffer), format, ap);
 
-        return log_dispatch(level, error, file, line, func, NULL, NULL, buffer);
+        return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, buffer);
 }
 
-int log_internal(
+int log_internal_realm(
                 int level,
                 int error,
                 const char *file,
@@ -691,7 +705,7 @@ int log_internal(
         int r;
 
         va_start(ap, format);
-        r = log_internalv(level, error, file, line, func, format, ap);
+        r = log_internalv_realm(level, error, file, line, func, format, ap);
         va_end(ap);
 
         return r;
@@ -705,17 +719,18 @@ int log_object_internalv(
                 const char *func,
                 const char *object_field,
                 const char *object,
+                const char *extra_field,
+                const char *extra,
                 const char *format,
                 va_list ap) {
 
         PROTECT_ERRNO;
         char *buffer, *b;
-        size_t l;
 
         if (error < 0)
                 error = -error;
 
-        if (_likely_(LOG_PRI(level) > log_max_level))
+        if (_likely_(LOG_PRI(level) > log_max_level[LOG_REALM_SYSTEMD]))
                 return -error;
 
         /* Make sure that %m maps to the specified error */
@@ -727,18 +742,15 @@ int log_object_internalv(
                 size_t n;
 
                 n = strlen(object);
-                l = n + 2 + LINE_MAX;
-
-                buffer = newa(char, l);
+                buffer = newa(char, n + 2 + LINE_MAX);
                 b = stpcpy(stpcpy(buffer, object), ": ");
-        } else {
-                l = LINE_MAX;
-                b = buffer = newa(char, l);
-        }
+        } else
+                b = buffer = newa(char, LINE_MAX);
 
-        vsnprintf(b, l, format, ap);
+        vsnprintf(b, LINE_MAX, format, ap);
 
-        return log_dispatch(level, error, file, line, func, object_field, object, buffer);
+        return log_dispatch_internal(level, error, file, line, func,
+                                     object_field, object, extra_field, extra, buffer);
 }
 
 int log_object_internal(
@@ -749,13 +761,15 @@ int log_object_internal(
                 const char *func,
                 const char *object_field,
                 const char *object,
+                const char *extra_field,
+                const char *extra,
                 const char *format, ...) {
 
         va_list ap;
         int r;
 
         va_start(ap, format);
-        r = log_object_internalv(level, error, file, line, func, object_field, object, format, ap);
+        r = log_object_internalv(level, error, file, line, func, object_field, object, extra_field, extra, format, ap);
         va_end(ap);
 
         return r;
@@ -770,36 +784,56 @@ static void log_assert(
                 const char *format) {
 
         static char buffer[LINE_MAX];
+        LogRealm realm = LOG_REALM_REMOVE_LEVEL(level);
 
-        if (_likely_(LOG_PRI(level) > log_max_level))
+        if (_likely_(LOG_PRI(level) > log_max_level[realm]))
                 return;
 
         DISABLE_WARNING_FORMAT_NONLITERAL;
-        xsprintf(buffer, format, text, file, line, func);
+        snprintf(buffer, sizeof buffer, format, text, file, line, func);
         REENABLE_WARNING;
 
         log_abort_msg = buffer;
 
-        log_dispatch(level, 0, file, line, func, NULL, NULL, buffer);
+        log_dispatch_internal(level, 0, file, line, func, NULL, NULL, NULL, NULL, buffer);
 }
 
-noreturn void log_assert_failed(const char *text, const char *file, int line, const char *func) {
-        log_assert(LOG_CRIT, text, file, line, func, "Assertion '%s' failed at %s:%u, function %s(). Aborting.");
+noreturn void log_assert_failed_realm(
+                LogRealm realm,
+                const char *text,
+                const char *file,
+                int line,
+                const char *func) {
+        log_assert(LOG_REALM_PLUS_LEVEL(realm, LOG_CRIT), text, file, line, func,
+                   "Assertion '%s' failed at %s:%u, function %s(). Aborting.");
         abort();
 }
 
-noreturn void log_assert_failed_unreachable(const char *text, const char *file, int line, const char *func) {
-        log_assert(LOG_CRIT, text, file, line, func, "Code should not be reached '%s' at %s:%u, function %s(). Aborting.");
+noreturn void log_assert_failed_unreachable_realm(
+                LogRealm realm,
+                const char *text,
+                const char *file,
+                int line,
+                const char *func) {
+        log_assert(LOG_REALM_PLUS_LEVEL(realm, LOG_CRIT), text, file, line, func,
+                   "Code should not be reached '%s' at %s:%u, function %s(). Aborting.");
         abort();
 }
 
-void log_assert_failed_return(const char *text, const char *file, int line, const char *func) {
+void log_assert_failed_return_realm(
+                LogRealm realm,
+                const char *text,
+                const char *file,
+                int line,
+                const char *func) {
         PROTECT_ERRNO;
-        log_assert(LOG_DEBUG, text, file, line, func, "Assertion '%s' failed at %s:%u, function %s(). Ignoring.");
+        log_assert(LOG_REALM_PLUS_LEVEL(realm, LOG_DEBUG), text, file, line, func,
+                   "Assertion '%s' failed at %s:%u, function %s(). Ignoring.");
 }
 
-int log_oom_internal(const char *file, int line, const char *func) {
-        log_internal(LOG_ERR, ENOMEM, file, line, func, "Out of memory.");
+int log_oom_internal(LogRealm realm, const char *file, int line, const char *func) {
+        log_internal_realm(LOG_REALM_PLUS_LEVEL(realm, LOG_ERR),
+                           ENOMEM, file, line, func, "Out of memory.");
         return -ENOMEM;
 }
 
@@ -859,13 +893,14 @@ int log_struct_internal(
 
         char buf[LINE_MAX];
         bool found = false;
+        LogRealm realm = LOG_REALM_REMOVE_LEVEL(level);
         PROTECT_ERRNO;
         va_list ap;
 
         if (error < 0)
                 error = -error;
 
-        if (_likely_(LOG_PRI(level) > log_max_level))
+        if (_likely_(LOG_PRI(level) > log_max_level[realm]))
                 return -error;
 
         if (log_target == LOG_TARGET_NULL)
@@ -874,9 +909,9 @@ int log_struct_internal(
         if ((level & LOG_FACMASK) == 0)
                 level = log_facility | LOG_PRI(level);
 
-        if ((log_target == LOG_TARGET_AUTO ||
-             log_target == LOG_TARGET_JOURNAL_OR_KMSG ||
-             log_target == LOG_TARGET_JOURNAL) &&
+        if (IN_SET(log_target, LOG_TARGET_AUTO,
+                               LOG_TARGET_JOURNAL_OR_KMSG,
+                               LOG_TARGET_JOURNAL) &&
             journal_fd >= 0) {
                 char header[LINE_MAX];
                 struct iovec iovec[17] = {};
@@ -888,7 +923,7 @@ int log_struct_internal(
                 bool fallback = false;
 
                 /* If the journal is available do structured logging */
-                log_do_header(header, sizeof(header), level, error, file, line, func, NULL, NULL);
+                log_do_header(header, sizeof(header), level, error, file, line, func, NULL, NULL, NULL, NULL);
                 IOVEC_SET_STRING(iovec[n++], header);
 
                 va_start(ap, format);
@@ -935,7 +970,7 @@ int log_struct_internal(
         if (!found)
                 return -error;
 
-        return log_dispatch(level, error, file, line, func, NULL, NULL, buf + 8);
+        return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, buf + 8);
 }
 
 int log_set_target_from_string(const char *e) {
@@ -949,18 +984,18 @@ int log_set_target_from_string(const char *e) {
         return 0;
 }
 
-int log_set_max_level_from_string(const char *e) {
+int log_set_max_level_from_string_realm(LogRealm realm, const char *e) {
         int t;
 
         t = log_level_from_string(e);
         if (t < 0)
                 return -EINVAL;
 
-        log_set_max_level(t);
+        log_set_max_level_realm(realm, t);
         return 0;
 }
 
-static int parse_proc_cmdline_item(const char *key, const char *value) {
+static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
 
         /*
          * The systemd.log_xyz= settings are parsed by all tools, and
@@ -974,52 +1009,59 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
         if (streq(key, "debug") && !value)
                 log_set_max_level(LOG_DEBUG);
 
-        else if (streq(key, "systemd.log_target") && value) {
+        else if (proc_cmdline_key_streq(key, "systemd.log_target")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 if (log_set_target_from_string(value) < 0)
                         log_warning("Failed to parse log target '%s'. Ignoring.", value);
 
-        } else if (streq(key, "systemd.log_level") && value) {
+        } else if (proc_cmdline_key_streq(key, "systemd.log_level")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 if (log_set_max_level_from_string(value) < 0)
                         log_warning("Failed to parse log level '%s'. Ignoring.", value);
 
-        } else if (streq(key, "systemd.log_color") && value) {
+        } else if (proc_cmdline_key_streq(key, "systemd.log_color")) {
 
-                if (log_show_color_from_string(value) < 0)
+                if (log_show_color_from_string(value ?: "1") < 0)
                         log_warning("Failed to parse log color setting '%s'. Ignoring.", value);
 
-        } else if (streq(key, "systemd.log_location") && value) {
+        } else if (proc_cmdline_key_streq(key, "systemd.log_location")) {
 
-                if (log_show_location_from_string(value) < 0)
+                if (log_show_location_from_string(value ?: "1") < 0)
                         log_warning("Failed to parse log location setting '%s'. Ignoring.", value);
         }
 
         return 0;
 }
 
-void log_parse_environment(void) {
+void log_parse_environment_realm(LogRealm realm) {
+        /* Do not call from library code. */
+
         const char *e;
 
         if (get_ctty_devnr(0, NULL) < 0)
-                /* Only try to read the command line in daemons.
-                   We assume that anything that has a controlling
-                   tty is user stuff. */
-                (void) parse_proc_cmdline(parse_proc_cmdline_item);
+                /* Only try to read the command line in daemons.  We assume that anything that has a controlling tty is
+                   user stuff. */
+                (void) proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
 
-        e = secure_getenv("SYSTEMD_LOG_TARGET");
+        e = getenv("SYSTEMD_LOG_TARGET");
         if (e && log_set_target_from_string(e) < 0)
                 log_warning("Failed to parse log target '%s'. Ignoring.", e);
 
-        e = secure_getenv("SYSTEMD_LOG_LEVEL");
-        if (e && log_set_max_level_from_string(e) < 0)
+        e = getenv("SYSTEMD_LOG_LEVEL");
+        if (e && log_set_max_level_from_string_realm(realm, e) < 0)
                 log_warning("Failed to parse log level '%s'. Ignoring.", e);
 
-        e = secure_getenv("SYSTEMD_LOG_COLOR");
+        e = getenv("SYSTEMD_LOG_COLOR");
         if (e && log_show_color_from_string(e) < 0)
                 log_warning("Failed to parse bool '%s'. Ignoring.", e);
 
-        e = secure_getenv("SYSTEMD_LOG_LOCATION");
+        e = getenv("SYSTEMD_LOG_LOCATION");
         if (e && log_show_location_from_string(e) < 0)
                 log_warning("Failed to parse bool '%s'. Ignoring.", e);
 }
@@ -1028,8 +1070,8 @@ LogTarget log_get_target(void) {
         return log_target;
 }
 
-int log_get_max_level(void) {
-        return log_max_level;
+int log_get_max_level_realm(LogRealm realm) {
+        return log_max_level[realm];
 }
 
 void log_show_color(bool b) {
@@ -1071,8 +1113,8 @@ int log_show_location_from_string(const char *e) {
 }
 
 bool log_on_console(void) {
-        if (log_target == LOG_TARGET_CONSOLE ||
-            log_target == LOG_TARGET_CONSOLE_PREFIXED)
+        if (IN_SET(log_target, LOG_TARGET_CONSOLE,
+                               LOG_TARGET_CONSOLE_PREFIXED))
                 return true;
 
         return syslog_fd < 0 && kmsg_fd < 0 && journal_fd < 0;
@@ -1127,13 +1169,13 @@ int log_syntax_internal(
 
         PROTECT_ERRNO;
         char buffer[LINE_MAX];
-        int r;
         va_list ap;
+        const char *unit_fmt = NULL;
 
         if (error < 0)
                 error = -error;
 
-        if (_likely_(LOG_PRI(level) > log_max_level))
+        if (_likely_(LOG_PRI(level) > log_max_level[LOG_REALM_SYSTEMD]))
                 return -error;
 
         if (log_target == LOG_TARGET_NULL)
@@ -1147,24 +1189,20 @@ int log_syntax_internal(
         va_end(ap);
 
         if (unit)
-                r = log_struct_internal(
-                                level, error,
-                                file, line, func,
-                                getpid() == 1 ? "UNIT=%s" : "USER_UNIT=%s", unit,
-                                LOG_MESSAGE_ID(SD_MESSAGE_INVALID_CONFIGURATION),
-                                "CONFIG_FILE=%s", config_file,
-                                "CONFIG_LINE=%u", config_line,
-                                LOG_MESSAGE("[%s:%u] %s", config_file, config_line, buffer),
-                                NULL);
-        else
-                r = log_struct_internal(
-                                level, error,
-                                file, line, func,
-                                LOG_MESSAGE_ID(SD_MESSAGE_INVALID_CONFIGURATION),
-                                "CONFIG_FILE=%s", config_file,
-                                "CONFIG_LINE=%u", config_line,
-                                LOG_MESSAGE("[%s:%u] %s", config_file, config_line, buffer),
-                                NULL);
+                unit_fmt = getpid() == 1 ? "UNIT=%s" : "USER_UNIT=%s";
+
+        return log_struct_internal(
+                        LOG_REALM_PLUS_LEVEL(LOG_REALM_SYSTEMD, level),
+                        error,
+                        file, line, func,
+                        "MESSAGE_ID=" SD_MESSAGE_INVALID_CONFIGURATION_STR,
+                        "CONFIG_FILE=%s", config_file,
+                        "CONFIG_LINE=%u", config_line,
+                        LOG_MESSAGE("%s:%u: %s", config_file, config_line, buffer),
+                        unit_fmt, unit,
+                        NULL);
+}
 
-        return r;
+void log_set_always_reopen_console(bool b) {
+        always_reopen_console = b;
 }
index b635622..ff5d776 100644 (file)
 
 #include "macro.h"
 
+typedef enum LogRealm {
+        LOG_REALM_SYSTEMD,
+        LOG_REALM_UDEV,
+        _LOG_REALM_MAX,
+} LogRealm;
+
+#ifndef LOG_REALM
+#  define LOG_REALM LOG_REALM_SYSTEMD
+#endif
+
 typedef enum LogTarget{
         LOG_TARGET_CONSOLE,
         LOG_TARGET_CONSOLE_PREFIXED,
@@ -44,14 +54,24 @@ typedef enum LogTarget{
         LOG_TARGET_NULL,
         _LOG_TARGET_MAX,
         _LOG_TARGET_INVALID = -1
-}  LogTarget;
+} LogTarget;
+
+#define LOG_REALM_PLUS_LEVEL(realm, level)      \
+        ((realm) << 10 | (level))
+#define LOG_REALM_REMOVE_LEVEL(realm_level)     \
+        ((realm_level >> 10))
 
 void log_set_target(LogTarget target);
-void log_set_max_level(int level);
+void log_set_max_level_realm(LogRealm realm, int level);
+#define log_set_max_level(level)                \
+        log_set_max_level_realm(LOG_REALM, (level))
+
 void log_set_facility(int facility);
 
 int log_set_target_from_string(const char *e);
-int log_set_max_level_from_string(const char *e);
+int log_set_max_level_from_string_realm(LogRealm realm, const char *e);
+#define log_set_max_level_from_string(e)        \
+        log_set_max_level_from_string_realm(LOG_REALM, (e))
 
 void log_show_color(bool b);
 bool log_get_show_color(void) _pure_;
@@ -62,7 +82,14 @@ int log_show_color_from_string(const char *e);
 int log_show_location_from_string(const char *e);
 
 LogTarget log_get_target(void) _pure_;
-int log_get_max_level(void) _pure_;
+int log_get_max_level_realm(LogRealm realm) _pure_;
+#define log_get_max_level()                     \
+        log_get_max_level_realm(LOG_REALM)
+
+/* Functions below that open and close logs or configure logging based on the
+ * environment should not be called from library code — this is always a job
+ * for the application itself.
+ */
 
 int log_open(void);
 void log_close(void);
@@ -73,17 +100,33 @@ void log_close_journal(void);
 void log_close_kmsg(void);
 void log_close_console(void);
 
-void log_parse_environment(void);
+void log_parse_environment_realm(LogRealm realm);
+#define log_parse_environment() \
+        log_parse_environment_realm(LOG_REALM)
+
+int log_dispatch_internal(
+                int level,
+                int error,
+                const char *file,
+                int line,
+                const char *func,
+                const char *object_field,
+                const char *object,
+                const char *extra,
+                const char *extra_field,
+                char *buffer);
 
-int log_internal(
+int log_internal_realm(
                 int level,
                 int error,
                 const char *file,
                 int line,
                 const char *func,
                 const char *format, ...) _printf_(6,7);
+#define log_internal(level, ...) \
+        log_internal_realm(LOG_REALM_PLUS_LEVEL(LOG_REALM, (level)), __VA_ARGS__)
 
-int log_internalv(
+int log_internalv_realm(
                 int level,
                 int error,
                 const char *file,
@@ -91,7 +134,10 @@ int log_internalv(
                 const char *func,
                 const char *format,
                 va_list ap) _printf_(6,0);
+#define log_internalv(level, ...) \
+        log_internalv_realm(LOG_REALM_PLUS_LEVEL(LOG_REALM, (level)), __VA_ARGS__)
 
+/* Realm is fixed to LOG_REALM_SYSTEMD for those */
 int log_object_internal(
                 int level,
                 int error,
@@ -100,18 +146,22 @@ int log_object_internal(
                 const char *func,
                 const char *object_field,
                 const char *object,
-                const char *format, ...) _printf_(8,9);
+                const char *extra_field,
+                const char *extra,
+                const char *format, ...) _printf_(10,11);
 
 int log_object_internalv(
                 int level,
                 int error,
-                const char*file,
+                const char *file,
                 int line,
                 const char *func,
                 const char *object_field,
                 const char *object,
+                const char *extra_field,
+                const char *extra,
                 const char *format,
-                va_list ap) _printf_(8,0);
+                va_list ap) _printf_(10,0);
 
 int log_struct_internal(
                 int level,
@@ -122,6 +172,7 @@ int log_struct_internal(
                 const char *format, ...) _printf_(6,0) _sentinel_;
 
 int log_oom_internal(
+                LogRealm realm,
                 const char *file,
                 int line,
                 const char *func);
@@ -133,7 +184,7 @@ int log_format_iovec(
                 bool newline_separator,
                 int error,
                 const char *format,
-                va_list ap);
+                va_list ap) _printf_(6, 0);
 
 /* This modifies the buffer passed! */
 int log_dump_internal(
@@ -145,34 +196,50 @@ int log_dump_internal(
                 char *buffer);
 
 /* Logging for various assertions */
-noreturn void log_assert_failed(
+noreturn void log_assert_failed_realm(
+                LogRealm realm,
                 const char *text,
                 const char *file,
                 int line,
                 const char *func);
+#define log_assert_failed(text, ...) \
+        log_assert_failed_realm(LOG_REALM, (text), __VA_ARGS__)
 
-noreturn void log_assert_failed_unreachable(
+noreturn void log_assert_failed_unreachable_realm(
+                LogRealm realm,
                 const char *text,
                 const char *file,
                 int line,
                 const char *func);
+#define log_assert_failed_unreachable(text, ...) \
+        log_assert_failed_unreachable_realm(LOG_REALM, (text), __VA_ARGS__)
 
-void log_assert_failed_return(
+void log_assert_failed_return_realm(
+                LogRealm realm,
                 const char *text,
                 const char *file,
                 int line,
                 const char *func);
+#define log_assert_failed_return(text, ...) \
+        log_assert_failed_return_realm(LOG_REALM, (text), __VA_ARGS__)
+
+#define log_dispatch(level, error, buffer)                              \
+        log_dispatch_internal(level, error, __FILE__, __LINE__, __func__, NULL, NULL, NULL, NULL, buffer)
 
 /* Logging with level */
-#define log_full_errno(level, error, ...)                               \
+#define log_full_errno_realm(realm, level, error, ...)                  \
         ({                                                              \
                 int _level = (level), _e = (error);                     \
-                (log_get_max_level() >= LOG_PRI(_level))                \
-                        ? log_internal(_level, _e, __FILE__, __LINE__, __func__, __VA_ARGS__) \
+                (log_get_max_level_realm((realm)) >= LOG_PRI(_level))   \
+                        ? log_internal_realm(LOG_REALM_PLUS_LEVEL((realm), _level), _e, \
+                                             __FILE__, __LINE__, __func__, __VA_ARGS__) \
                         : -abs(_e);                                     \
         })
 
-#define log_full(level, ...) log_full_errno(level, 0, __VA_ARGS__)
+#define log_full_errno(level, error, ...)                               \
+        log_full_errno_realm(LOG_REALM, (level), (error), __VA_ARGS__)
+
+#define log_full(level, ...) log_full_errno((level), 0, __VA_ARGS__)
 
 /* Normal logging */
 #define log_debug(...)     log_full(LOG_DEBUG,   __VA_ARGS__)
@@ -197,26 +264,30 @@ void log_assert_failed_return(
 #endif
 
 /* Structured logging */
-#define log_struct(level, ...) log_struct_internal(level, 0, __FILE__, __LINE__, __func__, __VA_ARGS__)
-#define log_struct_errno(level, error, ...) log_struct_internal(level, error, __FILE__, __LINE__, __func__, __VA_ARGS__)
+#define log_struct_errno(level, error, ...) \
+        log_struct_internal(LOG_REALM_PLUS_LEVEL(LOG_REALM, level), \
+                            error, __FILE__, __LINE__, __func__, __VA_ARGS__)
+#define log_struct(level, ...) log_struct_errno(level, 0, __VA_ARGS__)
 
 /* This modifies the buffer passed! */
-#define log_dump(level, buffer) log_dump_internal(level, 0, __FILE__, __LINE__, __func__, buffer)
+#define log_dump(level, buffer) \
+        log_dump_internal(LOG_REALM_PLUS_LEVEL(LOG_REALM, level), \
+                          0, __FILE__, __LINE__, __func__, buffer)
 
-#define log_oom() log_oom_internal(__FILE__, __LINE__, __func__)
+#define log_oom() log_oom_internal(LOG_REALM, __FILE__, __LINE__, __func__)
 
 bool log_on_console(void) _pure_;
 
 const char *log_target_to_string(LogTarget target) _const_;
 LogTarget log_target_from_string(const char *s) _pure_;
 
-/* Helpers to prepare various fields for structured logging */
+/* Helper to prepare various field for structured logging */
 #define LOG_MESSAGE(fmt, ...) "MESSAGE=" fmt, ##__VA_ARGS__
-#define LOG_MESSAGE_ID(x) "MESSAGE_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(x)
 
 void log_received_signal(int level, const struct signalfd_siginfo *si);
 
 void log_set_upgrade_syslog_to_journal(bool b);
+void log_set_always_reopen_console(bool b);
 
 int log_syntax_internal(
                 const char *unit,
index 6b2aeb9..a51562d 100644 (file)
@@ -19,7 +19,6 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <assert.h>
 #include <inttypes.h>
 #include <stdbool.h>
 #include <sys/param.h>
diff --git a/src/basic/meson.build b/src/basic/meson.build
new file mode 100644 (file)
index 0000000..065f0ac
--- /dev/null
@@ -0,0 +1,281 @@
+basic_sources_plain = files('''
+        af-list.c
+        af-list.h
+        alloc-util.c
+        alloc-util.h
+        architecture.c
+        architecture.h
+        arphrd-list.c
+        arphrd-list.h
+        async.c
+        async.h
+        audit-util.c
+        audit-util.h
+        barrier.c
+        barrier.h
+        bitmap.c
+        bitmap.h
+        blkid-util.h
+        btrfs-ctree.h
+        btrfs-util.c
+        btrfs-util.h
+        build.h
+        bus-label.c
+        bus-label.h
+        calendarspec.c
+        calendarspec.h
+        capability-util.c
+        capability-util.h
+        cap-list.c
+        cap-list.h
+        cgroup-util.c
+        cgroup-util.h
+        chattr-util.c
+        chattr-util.h
+        clock-util.c
+        clock-util.h
+        conf-files.c
+        conf-files.h
+        copy.c
+        copy.h
+        cpu-set-util.c
+        cpu-set-util.h
+        def.h
+        device-nodes.c
+        device-nodes.h
+        dirent-util.c
+        dirent-util.h
+        env-util.c
+        env-util.h
+        errno-list.c
+        errno-list.h
+        escape.c
+        escape.h
+        ether-addr-util.c
+        ether-addr-util.h
+        exec-util.c
+        exec-util.h
+        exit-status.c
+        exit-status.h
+        extract-word.c
+        extract-word.h
+        fd-util.c
+        fd-util.h
+        fileio.c
+        fileio.h
+        fileio-label.c
+        fileio-label.h
+        format-util.h
+        fs-util.c
+        fs-util.h
+        glob-util.c
+        glob-util.h
+        gunicode.c
+        gunicode.h
+        hash-funcs.c
+        hash-funcs.h
+        hashmap.c
+        hashmap.h
+        hexdecoct.c
+        hexdecoct.h
+        hostname-util.c
+        hostname-util.h
+        in-addr-util.c
+        in-addr-util.h
+        ioprio.h
+        io-util.c
+        io-util.h
+        journal-importer.c
+        journal-importer.h
+        khash.c
+        khash.h
+        label.c
+        label.h
+        list.h
+        locale-util.c
+        locale-util.h
+        lockfile-util.c
+        lockfile-util.h
+        log.c
+        log.h
+        login-util.c
+        login-util.h
+        macro.h
+        memfd-util.c
+        memfd-util.h
+        mempool.c
+        mempool.h
+        missing_syscall.h
+        mkdir.c
+        mkdir.h
+        mkdir-label.c
+        mount-util.c
+        mount-util.h
+        MurmurHash2.c
+        MurmurHash2.h
+        nss-util.h
+        ordered-set.c
+        ordered-set.h
+        parse-util.c
+        parse-util.h
+        path-util.c
+        path-util.h
+        prioq.c
+        prioq.h
+        proc-cmdline.c
+        proc-cmdline.h
+        process-util.c
+        process-util.h
+        random-util.c
+        random-util.h
+        ratelimit.c
+        ratelimit.h
+        raw-clone.h
+        refcnt.h
+        replace-var.c
+        replace-var.h
+        rlimit-util.c
+        rlimit-util.h
+        rm-rf.c
+        rm-rf.h
+        securebits.h
+        selinux-util.c
+        selinux-util.h
+        set.h
+        sigbus.c
+        sigbus.h
+        signal-util.c
+        signal-util.h
+        siphash24.c
+        siphash24.h
+        smack-util.c
+        smack-util.h
+        socket-label.c
+        socket-util.c
+        socket-util.h
+        sparse-endian.h
+        special.h
+        stat-util.c
+        stat-util.h
+        stdio-util.h
+        strbuf.c
+        strbuf.h
+        string-table.c
+        string-table.h
+        string-util.c
+        string-util.h
+        strv.c
+        strv.h
+        strxcpyx.c
+        strxcpyx.h
+        syslog-util.c
+        syslog-util.h
+        terminal-util.c
+        terminal-util.h
+        time-util.c
+        time-util.h
+        umask-util.h
+        unaligned.h
+        unit-name.c
+        unit-name.h
+        user-util.c
+        user-util.h
+        utf8.c
+        utf8.h
+        util.c
+        util.h
+        verbs.c
+        verbs.h
+        virt.c
+        virt.h
+        web-util.c
+        web-util.h
+        xattr-util.c
+        xattr-util.h
+        xml.c
+        xml.h
+'''.split())
+
+missing_h = files('missing.h')
+
+generate_gperfs = find_program('generate-gperfs.py')
+
+generate_af_list = find_program('generate-af-list.sh')
+af_list_txt = custom_target(
+        'af-list.txt',
+        output : 'af-list.txt',
+        command : [generate_af_list, cpp],
+        capture : true)
+
+generate_arphrd_list = find_program('generate-arphrd-list.sh')
+arphrd_list_txt = custom_target(
+        'arphrd-list.txt',
+        output : 'arphrd-list.txt',
+        command : [generate_arphrd_list, cpp],
+        capture : true)
+
+generate_cap_list = find_program('generate-cap-list.sh')
+cap_list_txt = custom_target(
+        'cap-list.txt',
+        output : 'cap-list.txt',
+        command : [generate_cap_list, cpp, config_h, missing_h],
+        capture : true)
+
+generate_errno_list = find_program('generate-errno-list.sh')
+errno_list_txt = custom_target(
+        'errno-list.txt',
+        output : 'errno-list.txt',
+        command : [generate_errno_list, cpp],
+        capture : true)
+
+generated_gperf_headers = []
+foreach item : [['af',     af_list_txt,     'af',         ''],
+                ['arphrd', arphrd_list_txt, 'arphrd',     'ARPHRD_'],
+                ['cap',    cap_list_txt,    'capability', ''],
+                ['errno',  errno_list_txt,  'errno',      '']]
+
+        fname = '@0@-from-name.gperf'.format(item[0])
+        gperf_file = custom_target(
+                fname,
+                input : item[1],
+                output : fname,
+                command : [generate_gperfs, item[2], item[3], '@INPUT@'],
+                capture : true)
+
+        fname = '@0@-from-name.h'.format(item[0])
+        target1 = custom_target(
+                fname,
+                input : gperf_file,
+                output : fname,
+                command : [gperf,
+                           '-L', 'ANSI-C', '-t', '--ignore-case',
+                           '-N', 'lookup_@0@'.format(item[2]),
+                           '-H', 'hash_@0@_name'.format(item[2]),
+                           '-p', '-C',
+                           '@INPUT@'],
+                capture : true)
+
+        fname = '@0@-to-name.h'.format(item[0])
+        awkscript = '@0@-to-name.awk'.format(item[0])
+        target2 = custom_target(
+                fname,
+                input : [awkscript, item[1]],
+                output : fname,
+                command : [awk, '-f', '@INPUT0@', '@INPUT1@'],
+                capture : true)
+
+        generated_gperf_headers += [target1, target2]
+endforeach
+
+basic_sources = basic_sources_plain + [missing_h] + generated_gperf_headers
+
+libbasic = static_library(
+        'basic',
+        basic_sources,
+        include_directories : includes,
+        dependencies : [threads,
+                        libcap,
+                        libblkid,
+                        libselinux,
+                       ],
+        install : false)
index b1272f8..7830a4f 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <errno.h>
 #include <fcntl.h>
+#include <inttypes.h>
 #include <linux/audit.h>
 #include <linux/capability.h>
 #include <linux/if_link.h>
@@ -34,6 +35,7 @@
 #include <net/ethernet.h>
 #include <stdlib.h>
 #include <sys/resource.h>
+#include <sys/socket.h>
 #include <sys/syscall.h>
 #include <uchar.h>
 #include <unistd.h>
 #include <linux/btrfs.h>
 #endif
 
-#include "macro.h"
+#ifdef HAVE_LINUX_VM_SOCKETS_H
+#include <linux/vm_sockets.h>
+#else
+#define VMADDR_CID_ANY -1U
+struct sockaddr_vm {
+        unsigned short svm_family;
+        unsigned short svm_reserved1;
+        unsigned int svm_port;
+        unsigned int svm_cid;
+        unsigned char svm_zero[sizeof(struct sockaddr) -
+                               sizeof(unsigned short) -
+                               sizeof(unsigned short) -
+                               sizeof(unsigned int) -
+                               sizeof(unsigned int)];
+};
+#endif /* !HAVE_LINUX_VM_SOCKETS_H */
 
 #ifndef RLIMIT_RTTIME
 #define RLIMIT_RTTIME 15
 #define GRND_RANDOM 0x0002
 #endif
 
+#ifndef FS_NOCOW_FL
+#define FS_NOCOW_FL 0x00800000
+#endif
+
 #ifndef BTRFS_IOCTL_MAGIC
 #define BTRFS_IOCTL_MAGIC 0x94
 #endif
@@ -445,6 +466,10 @@ struct btrfs_ioctl_quota_ctl_args {
 #define CGROUP2_SUPER_MAGIC 0x63677270
 #endif
 
+#ifndef CLONE_NEWCGROUP
+#define CLONE_NEWCGROUP 0x02000000
+#endif
+
 #ifndef TMPFS_MAGIC
 #define TMPFS_MAGIC 0x01021994
 #endif
@@ -469,24 +494,44 @@ struct btrfs_ioctl_quota_ctl_args {
 #define MS_MOVE 8192
 #endif
 
+#ifndef MS_REC
+#define MS_REC 16384
+#endif
+
 #ifndef MS_PRIVATE
-#define MS_PRIVATE  (1 << 18)
+#define MS_PRIVATE      (1<<18)
 #endif
 
-#ifndef SCM_SECURITY
-#define SCM_SECURITY 0x03
+#ifndef MS_REC
+#define MS_REC          (1<<19)
+#endif
+
+#ifndef MS_SHARED
+#define MS_SHARED       (1<<20)
+#endif
+
+#ifndef MS_RELATIME
+#define MS_RELATIME     (1<<21)
+#endif
+
+#ifndef MS_KERNMOUNT
+#define MS_KERNMOUNT    (1<<22)
+#endif
+
+#ifndef MS_I_VERSION
+#define MS_I_VERSION    (1<<23)
 #endif
 
 #ifndef MS_STRICTATIME
-#define MS_STRICTATIME (1<<24)
+#define MS_STRICTATIME  (1<<24)
 #endif
 
-#ifndef MS_REC
-#define MS_REC 16384
+#ifndef MS_LAZYTIME
+#define MS_LAZYTIME     (1<<25)
 #endif
 
-#ifndef MS_SHARED
-#define MS_SHARED (1<<20)
+#ifndef SCM_SECURITY
+#define SCM_SECURITY 0x03
 #endif
 
 #ifndef PR_SET_NO_NEW_PRIVS
@@ -525,6 +570,17 @@ struct btrfs_ioctl_quota_ctl_args {
 #  define EVIOCREVOKE _IOW('E', 0x91, int)
 #endif
 
+#ifndef EVIOCSMASK
+
+struct input_mask {
+        uint32_t type;
+        uint32_t codes_size;
+        uint64_t codes_ptr;
+};
+
+#define EVIOCSMASK _IOW('E', 0x93, struct input_mask)
+#endif
+
 #ifndef DRM_IOCTL_SET_MASTER
 #  define DRM_IOCTL_SET_MASTER _IO('d', 0x1e)
 #endif
@@ -533,12 +589,21 @@ struct btrfs_ioctl_quota_ctl_args {
 #  define DRM_IOCTL_DROP_MASTER _IO('d', 0x1f)
 #endif
 
-#if defined(__i386__) || defined(__x86_64__)
-
-/* The precise definition of __O_TMPFILE is arch specific, so let's
- * just define this on x86 where we know the value. */
+/* The precise definition of __O_TMPFILE is arch specific; use the
+ * values defined by the kernel (note: some are hexa, some are octal,
+ * duplicated as-is from the kernel definitions):
+ * - alpha, parisc, sparc: each has a specific value;
+ * - others: they use the "generic" value.
+ */
 
 #ifndef __O_TMPFILE
+#if defined(__alpha__)
+#define __O_TMPFILE     0100000000
+#elif defined(__parisc__) || defined(__hppa__)
+#define __O_TMPFILE     0400000000
+#elif defined(__sparc__) || defined(__sparc64__)
+#define __O_TMPFILE     0x2000000
+#else
 #define __O_TMPFILE     020000000
 #endif
 
@@ -671,7 +736,7 @@ struct btrfs_ioctl_quota_ctl_args {
 #define IFLA_VLAN_MAX   (__IFLA_VLAN_MAX - 1)
 #endif
 
-#if !HAVE_DECL_IFLA_VXLAN_REMCSUM_NOPARTIAL
+#if !HAVE_DECL_IFLA_VXLAN_GPE
 #define IFLA_VXLAN_UNSPEC 0
 #define IFLA_VXLAN_ID 1
 #define IFLA_VXLAN_GROUP 2
@@ -697,11 +762,34 @@ struct btrfs_ioctl_quota_ctl_args {
 #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_COLLECT_METADATA 25
+#define IFLA_VXLAN_LABEL 26
+#define IFLA_VXLAN_GPE 27
+
+#define __IFLA_VXLAN_MAX 28
 
 #define IFLA_VXLAN_MAX  (__IFLA_VXLAN_MAX - 1)
 #endif
 
+#if !HAVE_DECL_IFLA_GENEVE_LABEL
+#define IFLA_GENEVE_UNSPEC 0
+#define IFLA_GENEVE_ID 1
+#define IFLA_GENEVE_REMOTE 2
+#define IFLA_GENEVE_TTL 3
+#define IFLA_GENEVE_TOS 4
+#define IFLA_GENEVE_PORT 5
+#define IFLA_GENEVE_COLLECT_METADATA 6
+#define IFLA_GENEVE_REMOTE6 7
+#define IFLA_GENEVE_UDP_CSUM 8
+#define IFLA_GENEVE_UDP_ZERO_CSUM6_TX 9
+#define IFLA_GENEVE_UDP_ZERO_CSUM6_RX 10
+#define IFLA_GENEVE_LABEL 11
+
+#define __IFLA_GENEVE_MAX 12
+
+#define IFLA_GENEVE_MAX  (__IFLA_GENEVE_MAX - 1)
+#endif
+
 #if !HAVE_DECL_IFLA_IPTUN_ENCAP_DPORT
 #define IFLA_IPTUN_UNSPEC 0
 #define IFLA_IPTUN_LINK 1
@@ -985,10 +1073,35 @@ struct btrfs_ioctl_quota_ctl_args {
 #define INPUT_PROP_ACCELEROMETER  0x06
 #endif
 
+#ifndef BTN_DPAD_UP
+#define BTN_DPAD_UP 0x220
+#define BTN_DPAD_RIGHT 0x223
+#endif
+
+#ifndef KEY_ALS_TOGGLE
+#define KEY_ALS_TOGGLE 0x230
+#endif
+
 #ifndef HAVE_KEY_SERIAL_T
 typedef int32_t key_serial_t;
 #endif
 
+#ifndef KEYCTL_JOIN_SESSION_KEYRING
+#define KEYCTL_JOIN_SESSION_KEYRING 1
+#endif
+
+#ifndef KEYCTL_CHOWN
+#define KEYCTL_CHOWN 4
+#endif
+
+#ifndef KEYCTL_SETPERM
+#define KEYCTL_SETPERM 5
+#endif
+
+#ifndef KEYCTL_DESCRIBE
+#define KEYCTL_DESCRIBE 6
+#endif
+
 #ifndef KEYCTL_READ
 #define KEYCTL_READ 11
 #endif
@@ -997,10 +1110,44 @@ typedef int32_t key_serial_t;
 #define KEYCTL_SET_TIMEOUT 15
 #endif
 
+#ifndef KEY_POS_VIEW
+#define KEY_POS_VIEW    0x01000000
+#define KEY_POS_READ    0x02000000
+#define KEY_POS_WRITE   0x04000000
+#define KEY_POS_SEARCH  0x08000000
+#define KEY_POS_LINK    0x10000000
+#define KEY_POS_SETATTR 0x20000000
+
+#define KEY_USR_VIEW    0x00010000
+#define KEY_USR_READ    0x00020000
+#define KEY_USR_WRITE   0x00040000
+#define KEY_USR_SEARCH  0x00080000
+#define KEY_USR_LINK    0x00100000
+#define KEY_USR_SETATTR 0x00200000
+
+#define KEY_GRP_VIEW    0x00000100
+#define KEY_GRP_READ    0x00000200
+#define KEY_GRP_WRITE   0x00000400
+#define KEY_GRP_SEARCH  0x00000800
+#define KEY_GRP_LINK    0x00001000
+#define KEY_GRP_SETATTR 0x00002000
+
+#define KEY_OTH_VIEW    0x00000001
+#define KEY_OTH_READ    0x00000002
+#define KEY_OTH_WRITE   0x00000004
+#define KEY_OTH_SEARCH  0x00000008
+#define KEY_OTH_LINK    0x00000010
+#define KEY_OTH_SETATTR 0x00000020
+#endif
+
 #ifndef KEY_SPEC_USER_KEYRING
 #define KEY_SPEC_USER_KEYRING -4
 #endif
 
+#ifndef KEY_SPEC_SESSION_KEYRING
+#define KEY_SPEC_SESSION_KEYRING -3
+#endif
+
 #ifndef PR_CAP_AMBIENT
 #define PR_CAP_AMBIENT 47
 #endif
@@ -1039,6 +1186,45 @@ typedef int32_t key_serial_t;
 #define ETHERTYPE_LLDP 0x88cc
 #endif
 
+#ifndef IFA_F_MCAUTOJOIN
+#define IFA_F_MCAUTOJOIN 0x400
+#endif
+
+#ifndef HAVE_STRUCT_ETHTOOL_LINK_SETTINGS
+
+#define ETHTOOL_GLINKSETTINGS   0x0000004c /* Get ethtool_link_settings */
+#define ETHTOOL_SLINKSETTINGS   0x0000004d /* Set ethtool_link_settings */
+
+struct ethtool_link_settings {
+        __u32   cmd;
+        __u32   speed;
+        __u8    duplex;
+        __u8    port;
+        __u8    phy_address;
+        __u8    autoneg;
+        __u8    mdio_support;
+        __u8    eth_tp_mdix;
+        __u8    eth_tp_mdix_ctrl;
+        __s8    link_mode_masks_nwords;
+        __u32   reserved[8];
+        __u32   link_mode_masks[0];
+        /* layout of link_mode_masks fields:
+         * __u32 map_supported[link_mode_masks_nwords];
+         * __u32 map_advertising[link_mode_masks_nwords];
+         * __u32 map_lp_advertising[link_mode_masks_nwords];
+         */
+};
+
+#endif
+
+#endif
+
+#ifndef SOL_ALG
+#define SOL_ALG 279
+#endif
+
+#ifndef AF_VSOCK
+#define AF_VSOCK 40
 #endif
 
 #include "missing_syscall.h"
index 3195c38..e2860fc 100644 (file)
@@ -54,6 +54,8 @@ static inline int missing_pivot_root(const char *new_root, const char *put_old)
 #      endif
 #    elif defined __i386__
 #      define __NR_memfd_create 356
+#    elif defined __arc__
+#      define __NR_memfd_create 279
 #    else
 #      warning "__NR_memfd_create unknown for your architecture"
 #    endif
@@ -101,6 +103,8 @@ static inline int missing_memfd_create(const char *name, unsigned int flags) {
 #      if _MIPS_SIM == _MIPS_SIM_ABI64
 #        define __NR_getrandom 5313
 #      endif
+#    elif defined(__arc__)
+#      define __NR_getrandom 278
 #    else
 #      warning "__NR_getrandom unknown for your architecture"
 #    endif
@@ -140,6 +144,8 @@ static inline pid_t missing_gettid(void) {
 #      define __NR_name_to_handle_at 370
 #    elif defined(__powerpc__)
 #      define __NR_name_to_handle_at 345
+#    elif defined(__arc__)
+#      define __NR_name_to_handle_at 264
 #    else
 #      error "__NR_name_to_handle_at is not defined"
 #    endif
@@ -171,6 +177,8 @@ static inline int missing_name_to_handle_at(int fd, const char *name, struct fil
 #      define __NR_setns 308
 #    elif defined(__i386__)
 #      define __NR_setns 346
+#    elif defined(__arc__)
+#      define __NR_setns 268
 #    else
 #      error "__NR_setns is not defined"
 #    endif
@@ -206,6 +214,8 @@ static inline pid_t raw_getpid(void) {
 #      define __NR_renameat2 316
 #    elif defined __arm__
 #      define __NR_renameat2 382
+#    elif defined __aarch64__
+#      define __NR_renameat2 276
 #    elif defined _MIPS_SIM
 #      if _MIPS_SIM == _MIPS_SIM_ABI32
 #        define __NR_renameat2 4351
@@ -218,6 +228,12 @@ static inline pid_t raw_getpid(void) {
 #      endif
 #    elif defined __i386__
 #      define __NR_renameat2 353
+#    elif defined __powerpc64__
+#      define __NR_renameat2 357
+#    elif defined __s390__ || defined __s390x__
+#      define __NR_renameat2 347
+#    elif defined __arc__
+#      define __NR_renameat2 276
 #    else
 #      warning "__NR_renameat2 unknown for your architecture"
 #    endif
@@ -304,6 +320,8 @@ static inline key_serial_t missing_request_key(const char *type, const char *des
 #      define __NR_copy_file_range 285
 #    elif defined __powerpc__
 #      define __NR_copy_file_range 379
+#    elif defined __arc__
+#      define __NR_copy_file_range 285
 #    else
 #      warning "__NR_copy_file_range not defined for your architecture"
 #    endif
index 28dc778..7b9400b 100644 (file)
@@ -29,6 +29,7 @@
 #include "escape.h"
 #include "fd-util.h"
 #include "fileio.h"
+#include "fs-util.h"
 #include "hashmap.h"
 #include "mount-util.h"
 #include "parse-util.h"
@@ -36,6 +37,7 @@
 #include "set.h"
 #include "stdio-util.h"
 #include "string-util.h"
+#include "strv.h"
 
 static int fd_fdinfo_mnt_id(int fd, const char *filename, int flags, int *mnt_id) {
         char path[strlen("/proc/self/fdinfo/") + DECIMAL_STR_MAX(int)];
@@ -75,7 +77,6 @@ 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, 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;
@@ -111,9 +112,10 @@ int fd_is_mount_point(int fd, const char *filename, int flags) {
 
         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()
-                         * fall back to simpler logic. */
+                if (IN_SET(errno, ENOSYS, EACCES, EPERM))
+                        /* This kernel does not support name_to_handle_at() at all, or the syscall was blocked (maybe
+                         * through seccomp, because we are running inside of a container?): fall back to simpler
+                         * logic. */
                         goto fallback_fdinfo;
                 else if (errno == EOPNOTSUPP)
                         /* This kernel or file system does not support
@@ -162,7 +164,7 @@ int fd_is_mount_point(int fd, const char *filename, int flags) {
 
 fallback_fdinfo:
         r = fd_fdinfo_mnt_id(fd, filename, flags, &mount_id);
-        if (r == -EOPNOTSUPP)
+        if (IN_SET(r, -EOPNOTSUPP, -EACCES, -EPERM))
                 goto fallback_fstat;
         if (r < 0)
                 return r;
@@ -205,9 +207,10 @@ fallback_fstat:
 }
 
 /* flags can be AT_SYMLINK_FOLLOW or 0 */
-int path_is_mount_point(const char *t, int flags) {
-        _cleanup_close_ int fd = -1;
+int path_is_mount_point(const char *t, const char *root, int flags) {
         _cleanup_free_ char *canonical = NULL, *parent = NULL;
+        _cleanup_close_ int fd = -1;
+        int r;
 
         assert(t);
 
@@ -219,9 +222,9 @@ int path_is_mount_point(const char *t, int flags) {
          * /bin -> /usr/bin/ and /usr is a mount point, then the parent that we
          * look at needs to be /usr, not /. */
         if (flags & AT_SYMLINK_FOLLOW) {
-                canonical = canonicalize_file_name(t);
-                if (!canonical)
-                        return -errno;
+                r = chase_symlinks(t, root, 0, &canonical);
+                if (r < 0)
+                        return r;
 
                 t = canonical;
         }
@@ -288,10 +291,12 @@ int umount_recursive(const char *prefix, int flags) {
                                 continue;
 
                         if (umount2(p, flags) < 0) {
-                                r = -errno;
+                                r = log_debug_errno(errno, "Failed to umount %s: %m", p);
                                 continue;
                         }
 
+                        log_debug("Successfully unmounted %s", p);
+
                         again = true;
                         n++;
 
@@ -312,24 +317,26 @@ static int get_mount_flags(const char *path, unsigned long *flags) {
         return 0;
 }
 
-int bind_remount_recursive(const char *prefix, bool ro) {
+/* Use this function only if do you have direct access to /proc/self/mountinfo
+ * and need the caller to open it for you. This is the case when /proc is
+ * masked or not mounted. Otherwise, use bind_remount_recursive. */
+int bind_remount_recursive_with_mountinfo(const char *prefix, bool ro, char **blacklist, FILE *proc_self_mountinfo) {
         _cleanup_set_free_free_ Set *done = NULL;
         _cleanup_free_ char *cleaned = NULL;
         int r;
 
-        /* Recursively remount a directory (and all its submounts)
-         * read-only or read-write. If the directory is already
-         * mounted, we reuse the mount and simply mark it
-         * MS_BIND|MS_RDONLY (or remove the MS_RDONLY for read-write
-         * operation). If it isn't we first make it one. Afterwards we
-         * apply MS_BIND|MS_RDONLY (or remove MS_RDONLY) to all
-         * submounts we can access, too. When mounts are stacked on
-         * the same mount point we only care for each individual
-         * "top-level" mount on each point, as we cannot
-         * influence/access the underlying mounts anyway. We do not
-         * have any effect on future submounts that might get
-         * propagated, they migt be writable. This includes future
-         * submounts that have been triggered via autofs. */
+        assert(proc_self_mountinfo);
+
+        /* Recursively remount a directory (and all its submounts) read-only or read-write. If the directory is already
+         * mounted, we reuse the mount and simply mark it MS_BIND|MS_RDONLY (or remove the MS_RDONLY for read-write
+         * operation). If it isn't we first make it one. Afterwards we apply MS_BIND|MS_RDONLY (or remove MS_RDONLY) to
+         * all submounts we can access, too. When mounts are stacked on the same mount point we only care for each
+         * individual "top-level" mount on each point, as we cannot influence/access the underlying mounts anyway. We
+         * do not have any effect on future submounts that might get propagated, they migt be writable. This includes
+         * future submounts that have been triggered via autofs.
+         *
+         * If the "blacklist" parameter is specified it may contain a list of subtrees to exclude from the
+         * remount operation. Note that we'll ignore the blacklist for the top-level path. */
 
         cleaned = strdup(prefix);
         if (!cleaned)
@@ -342,7 +349,6 @@ int bind_remount_recursive(const char *prefix, bool ro) {
                 return -ENOMEM;
 
         for (;;) {
-                _cleanup_fclose_ FILE *proc_self_mountinfo = NULL;
                 _cleanup_set_free_free_ Set *todo = NULL;
                 bool top_autofs = false;
                 char *x;
@@ -352,9 +358,7 @@ int bind_remount_recursive(const char *prefix, bool ro) {
                 if (!todo)
                         return -ENOMEM;
 
-                proc_self_mountinfo = fopen("/proc/self/mountinfo", "re");
-                if (!proc_self_mountinfo)
-                        return -errno;
+                rewind(proc_self_mountinfo);
 
                 for (;;) {
                         _cleanup_free_ char *path = NULL, *p = NULL, *type = NULL;
@@ -386,6 +390,33 @@ int bind_remount_recursive(const char *prefix, bool ro) {
                         if (r < 0)
                                 return r;
 
+                        if (!path_startswith(p, cleaned))
+                                continue;
+
+                        /* Ignore this mount if it is blacklisted, but only if it isn't the top-level mount we shall
+                         * operate on. */
+                        if (!path_equal(cleaned, p)) {
+                                bool blacklisted = false;
+                                char **i;
+
+                                STRV_FOREACH(i, blacklist) {
+
+                                        if (path_equal(*i, cleaned))
+                                                continue;
+
+                                        if (!path_startswith(*i, cleaned))
+                                                continue;
+
+                                        if (path_startswith(p, *i)) {
+                                                blacklisted = true;
+                                                log_debug("Not remounting %s, because blacklisted by %s, called for %s", p, *i, cleaned);
+                                                break;
+                                        }
+                                }
+                                if (blacklisted)
+                                        continue;
+                        }
+
                         /* Let's ignore autofs mounts.  If they aren't
                          * triggered yet, we want to avoid triggering
                          * them, as we don't make any guarantees for
@@ -397,12 +428,9 @@ int bind_remount_recursive(const char *prefix, bool ro) {
                                 continue;
                         }
 
-                        if (path_startswith(p, cleaned) &&
-                            !set_contains(done, p)) {
-
+                        if (!set_contains(done, p)) {
                                 r = set_consume(todo, p);
                                 p = NULL;
-
                                 if (r == -EEXIST)
                                         continue;
                                 if (r < 0)
@@ -419,8 +447,7 @@ int bind_remount_recursive(const char *prefix, bool ro) {
 
                 if (!set_contains(done, cleaned) &&
                     !set_contains(todo, cleaned)) {
-                        /* The prefix directory itself is not yet a
-                         * mount, make it one. */
+                        /* The prefix directory itself is not yet a mount, make it one. */
                         if (mount(cleaned, cleaned, NULL, MS_BIND|MS_REC, NULL) < 0)
                                 return -errno;
 
@@ -431,6 +458,8 @@ int bind_remount_recursive(const char *prefix, bool ro) {
                         if (mount(NULL, prefix, NULL, orig_flags|MS_BIND|MS_REMOUNT|(ro ? MS_RDONLY : 0), NULL) < 0)
                                 return -errno;
 
+                        log_debug("Made top-level directory %s a mount point.", prefix);
+
                         x = strdup(cleaned);
                         if (!x)
                                 return -ENOMEM;
@@ -448,9 +477,8 @@ int bind_remount_recursive(const char *prefix, bool ro) {
                         if (r < 0)
                                 return r;
 
-                        /* Deal with mount points that are obstructed by a
-                         * later mount */
-                        r = path_is_mount_point(x, 0);
+                        /* Deal with mount points that are obstructed by a later mount */
+                        r = path_is_mount_point(x, NULL, 0);
                         if (r == -ENOENT || r == 0)
                                 continue;
                         if (r < 0)
@@ -464,10 +492,21 @@ int bind_remount_recursive(const char *prefix, bool ro) {
                         if (mount(NULL, x, NULL, orig_flags|MS_BIND|MS_REMOUNT|(ro ? MS_RDONLY : 0), NULL) < 0)
                                 return -errno;
 
+                        log_debug("Remounted %s read-only.", x);
                 }
         }
 }
 
+int bind_remount_recursive(const char *prefix, bool ro, char **blacklist) {
+        _cleanup_fclose_ FILE *proc_self_mountinfo = NULL;
+
+        proc_self_mountinfo = fopen("/proc/self/mountinfo", "re");
+        if (!proc_self_mountinfo)
+                return -errno;
+
+        return bind_remount_recursive_with_mountinfo(prefix, ro, blacklist, proc_self_mountinfo);
+}
+
 int mount_move_root(const char *path) {
         assert(path);
 
@@ -501,6 +540,7 @@ bool fstype_is_network(const char *fstype) {
                 "glusterfs\0"
                 "pvfs2\0" /* OrangeFS */
                 "ocfs2\0"
+                "lustre\0"
                 ;
 
         const char *x;
@@ -557,3 +597,143 @@ const char* mode_to_inaccessible_node(mode_t mode) {
         }
         return NULL;
 }
+
+#define FLAG(name) (flags & name ? STRINGIFY(name) "|" : "")
+static char* mount_flags_to_string(long unsigned flags) {
+        char *x;
+        _cleanup_free_ char *y = NULL;
+        long unsigned overflow;
+
+        overflow = flags & ~(MS_RDONLY |
+                             MS_NOSUID |
+                             MS_NODEV |
+                             MS_NOEXEC |
+                             MS_SYNCHRONOUS |
+                             MS_REMOUNT |
+                             MS_MANDLOCK |
+                             MS_DIRSYNC |
+                             MS_NOATIME |
+                             MS_NODIRATIME |
+                             MS_BIND |
+                             MS_MOVE |
+                             MS_REC |
+                             MS_SILENT |
+                             MS_POSIXACL |
+                             MS_UNBINDABLE |
+                             MS_PRIVATE |
+                             MS_SLAVE |
+                             MS_SHARED |
+                             MS_RELATIME |
+                             MS_KERNMOUNT |
+                             MS_I_VERSION |
+                             MS_STRICTATIME |
+                             MS_LAZYTIME);
+
+        if (flags == 0 || overflow != 0)
+                if (asprintf(&y, "%lx", overflow) < 0)
+                        return NULL;
+
+        x = strjoin(FLAG(MS_RDONLY),
+                    FLAG(MS_NOSUID),
+                    FLAG(MS_NODEV),
+                    FLAG(MS_NOEXEC),
+                    FLAG(MS_SYNCHRONOUS),
+                    FLAG(MS_REMOUNT),
+                    FLAG(MS_MANDLOCK),
+                    FLAG(MS_DIRSYNC),
+                    FLAG(MS_NOATIME),
+                    FLAG(MS_NODIRATIME),
+                    FLAG(MS_BIND),
+                    FLAG(MS_MOVE),
+                    FLAG(MS_REC),
+                    FLAG(MS_SILENT),
+                    FLAG(MS_POSIXACL),
+                    FLAG(MS_UNBINDABLE),
+                    FLAG(MS_PRIVATE),
+                    FLAG(MS_SLAVE),
+                    FLAG(MS_SHARED),
+                    FLAG(MS_RELATIME),
+                    FLAG(MS_KERNMOUNT),
+                    FLAG(MS_I_VERSION),
+                    FLAG(MS_STRICTATIME),
+                    FLAG(MS_LAZYTIME),
+                    y);
+        if (!x)
+                return NULL;
+        if (!y)
+                x[strlen(x) - 1] = '\0'; /* truncate the last | */
+        return x;
+}
+
+int mount_verbose(
+                int error_log_level,
+                const char *what,
+                const char *where,
+                const char *type,
+                unsigned long flags,
+                const char *options) {
+
+        _cleanup_free_ char *fl = NULL;
+
+        fl = mount_flags_to_string(flags);
+
+        if ((flags & MS_REMOUNT) && !what && !type)
+                log_debug("Remounting %s (%s \"%s\")...",
+                          where, strnull(fl), strempty(options));
+        else if (!what && !type)
+                log_debug("Mounting %s (%s \"%s\")...",
+                          where, strnull(fl), strempty(options));
+        else if ((flags & MS_BIND) && !type)
+                log_debug("Bind-mounting %s on %s (%s \"%s\")...",
+                          what, where, strnull(fl), strempty(options));
+        else if (flags & MS_MOVE)
+                log_debug("Moving mount %s → %s (%s \"%s\")...",
+                          what, where, strnull(fl), strempty(options));
+        else
+                log_debug("Mounting %s on %s (%s \"%s\")...",
+                          strna(type), where, strnull(fl), strempty(options));
+        if (mount(what, where, type, flags, options) < 0)
+                return log_full_errno(error_log_level, errno,
+                                      "Failed to mount %s on %s (%s \"%s\"): %m",
+                                      strna(type), where, strnull(fl), strempty(options));
+        return 0;
+}
+
+int umount_verbose(const char *what) {
+        log_debug("Umounting %s...", what);
+        if (umount(what) < 0)
+                return log_error_errno(errno, "Failed to unmount %s: %m", what);
+        return 0;
+}
+
+const char *mount_propagation_flags_to_string(unsigned long flags) {
+
+        switch (flags & (MS_SHARED|MS_SLAVE|MS_PRIVATE)) {
+        case 0:
+                return "";
+        case MS_SHARED:
+                return "shared";
+        case MS_SLAVE:
+                return "slave";
+        case MS_PRIVATE:
+                return "private";
+        }
+
+        return NULL;
+}
+
+
+int mount_propagation_flags_from_string(const char *name, unsigned long *ret) {
+
+        if (isempty(name))
+                *ret = 0;
+        else if (streq(name, "shared"))
+                *ret = MS_SHARED;
+        else if (streq(name, "slave"))
+                *ret = MS_SLAVE;
+        else if (streq(name, "private"))
+                *ret = MS_PRIVATE;
+        else
+                return -EINVAL;
+        return 0;
+}
index f46989e..2e24a18 100644 (file)
 #include "missing.h"
 
 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_mount_point(const char *path, const char *root, int flags);
 
 int repeat_unmount(const char *path, int flags);
 
 int umount_recursive(const char *target, int flags);
-int bind_remount_recursive(const char *prefix, bool ro);
+int bind_remount_recursive(const char *prefix, bool ro, char **blacklist);
+int bind_remount_recursive_with_mountinfo(const char *prefix, bool ro, char **blacklist, FILE *proc_self_mountinfo);
 
 int mount_move_root(const char *path);
 
@@ -52,3 +53,15 @@ union file_handle_union {
 const char* mode_to_inaccessible_node(mode_t mode);
 
 #define FILE_HANDLE_INIT { .handle.handle_bytes = MAX_HANDLE_SZ }
+
+int mount_verbose(
+                int error_log_level,
+                const char *what,
+                const char *where,
+                const char *type,
+                unsigned long flags,
+                const char *options);
+int umount_verbose(const char *where);
+
+const char *mount_propagation_flags_to_string(unsigned long flags);
+int mount_propagation_flags_from_string(const char *name, unsigned long *ret);
index b8c14ce..4532f22 100644 (file)
@@ -28,6 +28,7 @@
 #include "extract-word.h"
 #include "macro.h"
 #include "parse-util.h"
+#include "process-util.h"
 #include "string-util.h"
 
 int parse_boolean(const char *v) {
@@ -532,7 +533,7 @@ int parse_fractional_part_u(const char **p, size_t digits, unsigned *res) {
         return 0;
 }
 
-int parse_percent(const char *p) {
+int parse_percent_unbounded(const char *p) {
         const char *pc, *n;
         unsigned v;
         int r;
@@ -545,8 +546,61 @@ int parse_percent(const char *p) {
         r = safe_atou(n, &v);
         if (r < 0)
                 return r;
+
+        return (int) v;
+}
+
+int parse_percent(const char *p) {
+        int v;
+
+        v = parse_percent_unbounded(p);
         if (v > 100)
                 return -ERANGE;
 
-        return (int) v;
+        return v;
+}
+
+int parse_nice(const char *p, int *ret) {
+        int n, r;
+
+        r = safe_atoi(p, &n);
+        if (r < 0)
+                return r;
+
+        if (!nice_is_valid(n))
+                return -ERANGE;
+
+        *ret = n;
+        return 0;
+}
+
+int parse_ip_port(const char *s, uint16_t *ret) {
+        uint16_t l;
+        int r;
+
+        r = safe_atou16(s, &l);
+        if (r < 0)
+                return r;
+
+        if (l == 0)
+                return -EINVAL;
+
+        *ret = (uint16_t) l;
+
+        return 0;
+}
+
+int parse_dev(const char *s, dev_t *ret) {
+        unsigned x, y;
+        dev_t d;
+
+        if (sscanf(s, "%u:%u", &x, &y) != 2)
+                return -EINVAL;
+
+        d = makedev(x, y);
+        if ((unsigned) major(d) != x || (unsigned) minor(d) != y)
+                return -EINVAL;
+
+        *ret = d;
+        return 0;
 }
index 73441bb..dc09782 100644 (file)
@@ -30,6 +30,7 @@
 #define MODE_INVALID ((mode_t) -1)
 
 int parse_boolean(const char *v) _pure_;
+int parse_dev(const char *s, dev_t *ret);
 int parse_pid(const char *s, pid_t* ret_pid);
 int parse_mode(const char *s, mode_t *ret);
 int parse_ifindex(const char *s, int *ret);
@@ -106,4 +107,9 @@ int safe_atod(const char *s, double *ret_d);
 
 int parse_fractional_part_u(const char **s, size_t digits, unsigned *res);
 
+int parse_percent_unbounded(const char *p);
 int parse_percent(const char *p);
+
+int parse_nice(const char *p, int *ret);
+
+int parse_ip_port(const char *s, uint16_t *ret);
index b2fa81a..80fdda1 100644 (file)
 #include "alloc-util.h"
 #include "extract-word.h"
 #include "fs-util.h"
+#include "glob-util.h"
 #include "log.h"
 #include "macro.h"
 #include "missing.h"
+#include "parse-util.h"
 #include "path-util.h"
 #include "stat-util.h"
 #include "string-util.h"
@@ -81,7 +83,7 @@ char *path_make_absolute(const char *p, const char *prefix) {
         if (path_is_absolute(p) || !prefix)
                 return strdup(p);
 
-        return strjoin(prefix, "/", p, NULL);
+        return strjoin(prefix, "/", p);
 }
 
 int path_make_absolute_cwd(const char *p, char **ret) {
@@ -102,7 +104,7 @@ int path_make_absolute_cwd(const char *p, char **ret) {
                 if (!cwd)
                         return negative_errno();
 
-                c = strjoin(cwd, "/", p, NULL);
+                c = strjoin(cwd, "/", p);
         }
         if (!c)
                 return -ENOMEM;
@@ -218,10 +220,11 @@ int path_strv_make_absolute_cwd(char **l) {
         return 0;
 }
 
-char **path_strv_resolve(char **l, const char *prefix) {
+char **path_strv_resolve(char **l, const char *root) {
         char **s;
         unsigned k = 0;
         bool enomem = false;
+        int r;
 
         if (strv_isempty(l))
                 return l;
@@ -231,17 +234,17 @@ char **path_strv_resolve(char **l, const char *prefix) {
          * changes on failure. */
 
         STRV_FOREACH(s, l) {
-                char *t, *u;
                 _cleanup_free_ char *orig = NULL;
+                char *t, *u;
 
                 if (!path_is_absolute(*s)) {
                         free(*s);
                         continue;
                 }
 
-                if (prefix) {
+                if (root) {
                         orig = *s;
-                        t = strappend(prefix, orig);
+                        t = prefix_root(root, orig);
                         if (!t) {
                                 enomem = true;
                                 continue;
@@ -249,28 +252,26 @@ char **path_strv_resolve(char **l, const char *prefix) {
                 } else
                         t = *s;
 
-                errno = 0;
-                u = canonicalize_file_name(t);
-                if (!u) {
-                        if (errno == ENOENT) {
-                                if (prefix) {
-                                        u = orig;
-                                        orig = NULL;
-                                        free(t);
-                                } else
-                                        u = t;
-                        } else {
+                r = chase_symlinks(t, root, 0, &u);
+                if (r == -ENOENT) {
+                        if (root) {
+                                u = orig;
+                                orig = NULL;
                                 free(t);
-                                if (errno == ENOMEM || errno == 0)
-                                        enomem = true;
+                        } else
+                                u = t;
+                } else if (r < 0) {
+                        free(t);
 
-                                continue;
-                        }
-                } else if (prefix) {
+                        if (r == -ENOMEM)
+                                enomem = true;
+
+                        continue;
+                } else if (root) {
                         char *x;
 
                         free(t);
-                        x = path_startswith(u, prefix);
+                        x = path_startswith(u, root);
                         if (x) {
                                 /* restore the slash if it was lost */
                                 if (!startswith(x, "/"))
@@ -286,9 +287,7 @@ char **path_strv_resolve(char **l, const char *prefix) {
                         } else {
                                 /* canonicalized path goes outside of
                                  * prefix, keep the original path instead */
-                                free(u);
-                                u = orig;
-                                orig = NULL;
+                                free_and_replace(u, orig);
                         }
                 } else
                         free(t);
@@ -304,12 +303,12 @@ char **path_strv_resolve(char **l, const char *prefix) {
         return l;
 }
 
-char **path_strv_resolve_uniq(char **l, const char *prefix) {
+char **path_strv_resolve_uniq(char **l, const char *root) {
 
         if (strv_isempty(l))
                 return l;
 
-        if (!path_strv_resolve(l, prefix))
+        if (!path_strv_resolve(l, root))
                 return NULL;
 
         return strv_uniq(l);
@@ -354,6 +353,16 @@ char* path_startswith(const char *path, const char *prefix) {
         assert(path);
         assert(prefix);
 
+        /* Returns a pointer to the start of the first component after the parts matched by
+         * the prefix, iff
+         * - both paths are absolute or both paths are relative,
+         * and
+         * - each component in prefix in turn matches a component in path at the same position.
+         * An empty string will be returned when the prefix and path are equivalent.
+         *
+         * Returns NULL otherwise.
+         */
+
         if ((path[0] == '/') != (prefix[0] == '/'))
                 return NULL;
 
@@ -433,8 +442,8 @@ bool path_equal(const char *a, const char *b) {
         return path_compare(a, b) == 0;
 }
 
-bool path_equal_or_files_same(const char *a, const char *b) {
-        return path_equal(a, b) || files_same(a, b) > 0;
+bool path_equal_or_files_same(const char *a, const char *b, int flags) {
+        return path_equal(a, b) || files_same(a, b, flags) > 0;
 }
 
 char* path_join(const char *root, const char *path, const char *rest) {
@@ -444,13 +453,11 @@ char* path_join(const char *root, const char *path, const char *rest) {
                 return strjoin(root, endswith(root, "/") ? "" : "/",
                                path[0] == '/' ? path+1 : path,
                                rest ? (endswith(path, "/") ? "" : "/") : NULL,
-                               rest && rest[0] == '/' ? rest+1 : rest,
-                               NULL);
+                               rest && rest[0] == '/' ? rest+1 : rest);
         else
                 return strjoin(path,
                                rest ? (endswith(path, "/") ? "" : "/") : NULL,
-                               rest && rest[0] == '/' ? rest+1 : rest,
-                               NULL);
+                               rest && rest[0] == '/' ? rest+1 : rest);
 }
 
 int find_binary(const char *name, char **ret) {
@@ -494,7 +501,7 @@ int find_binary(const char *name, char **ret) {
                 if (!path_is_absolute(element))
                         continue;
 
-                j = strjoin(element, "/", name, NULL);
+                j = strjoin(element, "/", name);
                 if (!j)
                         return -ENOMEM;
 
@@ -692,10 +699,7 @@ bool filename_is_valid(const char *p) {
         if (isempty(p))
                 return false;
 
-        if (streq(p, "."))
-                return false;
-
-        if (streq(p, ".."))
+        if (dot_or_dot_dot(p))
                 return false;
 
         e = strchrnul(p, '/');
@@ -713,14 +717,17 @@ bool path_is_safe(const char *p) {
         if (isempty(p))
                 return false;
 
-        if (streq(p, "..") || startswith(p, "../") || endswith(p, "/..") || strstr(p, "/../"))
+        if (dot_or_dot_dot(p))
+                return false;
+
+        if (startswith(p, "../") || endswith(p, "/..") || strstr(p, "/../"))
                 return false;
 
         if (strlen(p)+1 > PATH_MAX)
                 return false;
 
         /* The following two checks are not really dangerous, but hey, they still are confusing */
-        if (streq(p, ".") || startswith(p, "./") || endswith(p, "/.") || strstr(p, "/./"))
+        if (startswith(p, "./") || endswith(p, "/.") || strstr(p, "/./"))
                 return false;
 
         if (strstr(p, "//"))
@@ -810,7 +817,91 @@ bool is_device_path(const char *path) {
         /* Returns true on paths that refer to a device, either in
          * sysfs or in /dev */
 
-        return
-                path_startswith(path, "/dev/") ||
-                path_startswith(path, "/sys/");
+        return path_startswith(path, "/dev/") ||
+               path_startswith(path, "/sys/");
+}
+
+bool is_deviceallow_pattern(const char *path) {
+        return path_startswith(path, "/dev/") ||
+               startswith(path, "block-") ||
+               startswith(path, "char-");
+}
+
+int systemd_installation_has_version(const char *root, unsigned minimal_version) {
+        const char *pattern;
+        int r;
+
+        /* Try to guess if systemd installation is later than the specified version. This
+         * is hacky and likely to yield false negatives, particularly if the installation
+         * is non-standard. False positives should be relatively rare.
+         */
+
+        NULSTR_FOREACH(pattern,
+                       /* /lib works for systems without usr-merge, and for systems with a sane
+                        * usr-merge, where /lib is a symlink to /usr/lib. /usr/lib is necessary
+                        * for Gentoo which does a merge without making /lib a symlink.
+                        */
+                       "lib/systemd/libsystemd-shared-*.so\0"
+                       "usr/lib/systemd/libsystemd-shared-*.so\0") {
+
+                _cleanup_strv_free_ char **names = NULL;
+                _cleanup_free_ char *path = NULL;
+                char *c, **name;
+
+                path = prefix_root(root, pattern);
+                if (!path)
+                        return -ENOMEM;
+
+                r = glob_extend(&names, path);
+                if (r == -ENOENT)
+                        continue;
+                if (r < 0)
+                        return r;
+
+                assert_se((c = endswith(path, "*.so")));
+                *c = '\0'; /* truncate the glob part */
+
+                STRV_FOREACH(name, names) {
+                        /* This is most likely to run only once, hence let's not optimize anything. */
+                        char *t, *t2;
+                        unsigned version;
+
+                        t = startswith(*name, path);
+                        if (!t)
+                                continue;
+
+                        t2 = endswith(t, ".so");
+                        if (!t2)
+                                continue;
+
+                        t2[0] = '\0'; /* truncate the suffix */
+
+                        r = safe_atou(t, &version);
+                        if (r < 0) {
+                                log_debug_errno(r, "Found libsystemd shared at \"%s.so\", but failed to parse version: %m", *name);
+                                continue;
+                        }
+
+                        log_debug("Found libsystemd shared at \"%s.so\", version %u (%s).",
+                                  *name, version,
+                                  version >= minimal_version ? "OK" : "too old");
+                        if (version >= minimal_version)
+                                return true;
+                }
+        }
+
+        return false;
+}
+
+bool dot_or_dot_dot(const char *path) {
+        if (!path)
+                return false;
+        if (path[0] != '.')
+                return false;
+        if (path[1] == 0)
+                return true;
+        if (path[1] != '.')
+                return false;
+
+        return path[2] == 0;
 }
index a27c13f..26f165f 100644 (file)
@@ -24,6 +24,7 @@
 #include <stddef.h>
 
 #include "macro.h"
+#include "string-util.h"
 #include "time-util.h"
 
 #define DEFAULT_PATH_NORMAL "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
@@ -45,7 +46,7 @@ char* path_kill_slashes(char *path);
 char* path_startswith(const char *path, const char *prefix) _pure_;
 int path_compare(const char *a, const char *b) _pure_;
 bool path_equal(const char *a, const char *b) _pure_;
-bool path_equal_or_files_same(const char *a, const char *b);
+bool path_equal_or_files_same(const char *a, const char *b, int flags);
 char* path_join(const char *root, const char *path, const char *rest);
 
 static inline bool path_equal_ptr(const char *a, const char *b) {
@@ -65,9 +66,21 @@ static inline bool path_equal_ptr(const char *a, const char *b) {
                 _found;                                         \
         })
 
+#define PATH_STARTSWITH_SET(p, ...)                             \
+        ({                                                      \
+                char **s;                                       \
+                bool _found = false;                            \
+                STRV_FOREACH(s, STRV_MAKE(__VA_ARGS__))         \
+                        if (path_startswith(p, *s)) {           \
+                               _found = true;                   \
+                               break;                           \
+                        }                                       \
+                _found;                                         \
+        })
+
 int 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);
+char** path_strv_resolve(char **l, const char *root);
+char** path_strv_resolve_uniq(char **l, const char *root);
 
 int find_binary(const char *name, char **filename);
 
@@ -125,3 +138,8 @@ char *file_in_same_dir(const char *path, const char *filename);
 bool hidden_or_backup_file(const char *filename) _pure_;
 
 bool is_device_path(const char *path);
+bool is_deviceallow_pattern(const char *path);
+
+int systemd_installation_has_version(const char *root, unsigned minimal_version);
+
+bool dot_or_dot_dot(const char *path);
index d2ec516..4570b8e 100644 (file)
@@ -62,9 +62,7 @@ Prioq* prioq_free(Prioq *q) {
                 return NULL;
 
         free(q->items);
-        free(q);
-
-        return NULL;
+        return mfree(q);
 }
 
 int prioq_ensure_allocated(Prioq **q, compare_func_t compare_func) {
index 0430bea..8592a42 100644 (file)
 #include "virt.h"
 
 int proc_cmdline(char **ret) {
+        const char *e;
         assert(ret);
 
+        /* For testing purposes it is sometimes useful to be able to override what we consider /proc/cmdline to be */
+        e = secure_getenv("SYSTEMD_PROC_CMDLINE");
+        if (e) {
+                char *m;
+
+                m = strdup(e);
+                if (!m)
+                        return -ENOMEM;
+
+                *ret = m;
+                return 0;
+        }
+
         if (detect_container() > 0)
                 return get_process_cmdline(1, 0, false, ret);
         else
                 return read_one_line_file("/proc/cmdline", ret);
 }
 
-int parse_proc_cmdline(int (*parse_item)(const char *key, const char *value)) {
+int proc_cmdline_parse(proc_cmdline_parse_t parse_item, void *data, unsigned flags) {
+
         _cleanup_free_ char *line = NULL;
         const char *p;
         int r;
@@ -56,7 +71,7 @@ int parse_proc_cmdline(int (*parse_item)(const char *key, const char *value)) {
         p = line;
         for (;;) {
                 _cleanup_free_ char *word = NULL;
-                char *value = NULL;
+                char *value, *key, *q;
 
                 r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES|EXTRACT_RELAX);
                 if (r < 0)
@@ -64,16 +79,23 @@ int parse_proc_cmdline(int (*parse_item)(const char *key, const char *value)) {
                 if (r == 0)
                         break;
 
-                /* Filter out arguments that are intended only for the
-                 * initrd */
-                if (!in_initrd() && startswith(word, "rd."))
-                        continue;
+                key = word;
+
+                /* Filter out arguments that are intended only for the initrd */
+                q = startswith(word, "rd.");
+                if (q) {
+                        if (!in_initrd())
+                                continue;
+
+                        if (flags & PROC_CMDLINE_STRIP_RD_PREFIX)
+                                key = q;
+                }
 
-                value = strchr(word, '=');
+                value = strchr(key, '=');
                 if (value)
                         *(value++) = 0;
 
-                r = parse_item(word, value);
+                r = parse_item(key, value, data);
                 if (r < 0)
                         return r;
         }
@@ -81,13 +103,64 @@ int parse_proc_cmdline(int (*parse_item)(const char *key, const char *value)) {
         return 0;
 }
 
-int get_proc_cmdline_key(const char *key, char **value) {
+static bool relaxed_equal_char(char a, char b) {
+
+        return a == b ||
+                (a == '_' && b == '-') ||
+                (a == '-' && b == '_');
+}
+
+char *proc_cmdline_key_startswith(const char *s, const char *prefix) {
+
+        assert(s);
+        assert(prefix);
+
+        /* Much like startswith(), but considers "-" and "_" the same */
+
+        for (; *prefix != 0; s++, prefix++)
+                if (!relaxed_equal_char(*s, *prefix))
+                        return NULL;
+
+        return (char*) s;
+}
+
+bool proc_cmdline_key_streq(const char *x, const char *y) {
+        assert(x);
+        assert(y);
+
+        /* Much like streq(), but considers "-" and "_" the same */
+
+        for (; *x != 0 || *y != 0; x++, y++)
+                if (!relaxed_equal_char(*x, *y))
+                        return false;
+
+        return true;
+}
+
+int proc_cmdline_get_key(const char *key, unsigned flags, char **value) {
         _cleanup_free_ char *line = NULL, *ret = NULL;
         bool found = false;
         const char *p;
         int r;
 
-        assert(key);
+        /* Looks for a specific key on the kernel command line. Supports two modes:
+         *
+         * a) The "value" parameter is used. In this case a parameter beginning with the "key" string followed by "="
+         *    is searched, and the value following this is returned in "value".
+         *
+         * b) as above, but the PROC_CMDLINE_VALUE_OPTIONAL flag is set. In this case if the key is found as a
+         *    separate word (i.e. not followed by "=" but instead by whitespace or the end of the command line), then
+         *    this is also accepted, and "value" is returned as NULL.
+         *
+         * c) The "value" parameter is NULL. In this case a search for the exact "key" parameter is performed.
+         *
+         * In all three cases, > 0 is returned if the key is found, 0 if not. */
+
+        if (isempty(key))
+                return -EINVAL;
+
+        if ((flags & PROC_CMDLINE_VALUE_OPTIONAL) && !value)
+                return -EINVAL;
 
         r = proc_cmdline(&line);
         if (r < 0)
@@ -104,21 +177,26 @@ int get_proc_cmdline_key(const char *key, char **value) {
                 if (r == 0)
                         break;
 
-                /* Filter out arguments that are intended only for the
-                 * initrd */
+                /* Automatically filter out arguments that are intended only for the initrd, if we are not in the
+                 * initrd. */
                 if (!in_initrd() && startswith(word, "rd."))
                         continue;
 
                 if (value) {
-                        e = startswith(word, key);
+                        e = proc_cmdline_key_startswith(word, key);
                         if (!e)
                                 continue;
 
-                        r = free_and_strdup(&ret, e);
-                        if (r < 0)
-                                return r;
+                        if (*e == '=') {
+                                r = free_and_strdup(&ret, e+1);
+                                if (r < 0)
+                                        return r;
+
+                                found = true;
+
+                        } else if (*e == 0 && (flags & PROC_CMDLINE_VALUE_OPTIONAL))
+                                found = true;
 
-                        found = true;
                 } else {
                         if (streq(word, key))
                                 found = true;
@@ -131,20 +209,42 @@ int get_proc_cmdline_key(const char *key, char **value) {
         }
 
         return found;
+}
+
+int proc_cmdline_get_bool(const char *key, bool *ret) {
+        _cleanup_free_ char *v = NULL;
+        int r;
+
+        assert(ret);
+
+        r = proc_cmdline_get_key(key, PROC_CMDLINE_VALUE_OPTIONAL, &v);
+        if (r < 0)
+                return r;
+        if (r == 0) {
+                *ret = false;
+                return 0;
+        }
+
+        if (v) { /* parameter passed */
+                r = parse_boolean(v);
+                if (r < 0)
+                        return r;
+                *ret = r;
+        } else /* no parameter passed */
+                *ret = true;
 
+        return 1;
 }
 
 int shall_restore_state(void) {
-        _cleanup_free_ char *value = NULL;
+        bool ret;
         int r;
 
-        r = get_proc_cmdline_key("systemd.restore_state=", &value);
+        r = proc_cmdline_get_bool("systemd.restore_state", &ret);
         if (r < 0)
                 return r;
-        if (r == 0)
-                return true;
 
-        return parse_boolean(value);
+        return r > 0 ? ret : true;
 }
 
 static const char * const rlmap[] = {
index 452642a..ebfed35 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+#include <stdbool.h>
+
+#include "log.h"
+
+enum {
+        PROC_CMDLINE_STRIP_RD_PREFIX = 1,
+        PROC_CMDLINE_VALUE_OPTIONAL = 2,
+};
+
+typedef int (*proc_cmdline_parse_t)(const char *key, const char *value, void *data);
+
 int proc_cmdline(char **ret);
-int parse_proc_cmdline(int (*parse_word)(const char *key, const char *value));
-int get_proc_cmdline_key(const char *parameter, char **value);
+
+int proc_cmdline_parse(const proc_cmdline_parse_t parse, void *userdata, unsigned flags);
+
+int proc_cmdline_get_key(const char *parameter, unsigned flags, char **value);
+int proc_cmdline_get_bool(const char *key, bool *ret);
+
+char *proc_cmdline_key_startswith(const char *s, const char *prefix);
+bool proc_cmdline_key_streq(const char *x, const char *y);
 
 int shall_restore_state(void);
 const char* runlevel_to_target(const char *rl);
+
+/* A little helper call, to be used in proc_cmdline_parse_t callbacks */
+static inline bool proc_cmdline_value_missing(const char *key, const char *value) {
+        if (!value) {
+                log_warning("Missing argument for %s= kernel command line switch, ignoring.", key);
+                return true;
+        }
+
+        return false;
+}
index 54b644a..b80caca 100644 (file)
@@ -27,6 +27,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/mman.h>
 #include <sys/personality.h>
 #include <sys/prctl.h>
 #include <sys/types.h>
@@ -103,7 +104,7 @@ int get_process_comm(pid_t pid, char **name) {
 int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line) {
         _cleanup_fclose_ FILE *f = NULL;
         bool space = false;
-        char *r = NULL, *k;
+        char *k, *ans = NULL;
         const char *p;
         int c;
 
@@ -117,7 +118,7 @@ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char *
          * command line that resolves to the empty string will return the "comm" name of the process instead.
          *
          * Returns -ESRCH if the process doesn't exist, and -ENOENT if the process has no command line (and
-         * comm_fallback is false). */
+         * comm_fallback is false). Returns 0 and sets *line otherwise. */
 
         p = procfs_file_alloca(pid, "cmdline");
 
@@ -131,11 +132,11 @@ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char *
         if (max_length == 1) {
 
                 /* If there's only room for one byte, return the empty string */
-                r = new0(char, 1);
-                if (!r)
+                ans = new0(char, 1);
+                if (!ans)
                         return -ENOMEM;
 
-                *line = r;
+                *line = ans;
                 return 0;
 
         } else if (max_length == 0) {
@@ -143,36 +144,36 @@ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char *
 
                 while ((c = getc(f)) != EOF) {
 
-                        if (!GREEDY_REALLOC(r, allocated, len+3)) {
-                                free(r);
+                        if (!GREEDY_REALLOC(ans, allocated, len+3)) {
+                                free(ans);
                                 return -ENOMEM;
                         }
 
                         if (isprint(c)) {
                                 if (space) {
-                                        r[len++] = ' ';
+                                        ans[len++] = ' ';
                                         space = false;
                                 }
 
-                                r[len++] = c;
+                                ans[len++] = c;
                         } else if (len > 0)
                                 space = true;
                }
 
                 if (len > 0)
-                        r[len] = 0;
+                        ans[len] = '\0';
                 else
-                        r = mfree(r);
+                        ans = mfree(ans);
 
         } else {
                 bool dotdotdot = false;
                 size_t left;
 
-                r = new(char, max_length);
-                if (!r)
+                ans = new(char, max_length);
+                if (!ans)
                         return -ENOMEM;
 
-                k = r;
+                k = ans;
                 left = max_length;
                 while ((c = getc(f)) != EOF) {
 
@@ -196,20 +197,20 @@ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char *
 
                                 *(k++) = (char) c;
                                 left--;
-                        } else if (k > r)
+                        } else if (k > ans)
                                 space = true;
                 }
 
                 if (dotdotdot) {
                         if (max_length <= 4) {
-                                k = r;
+                                k = ans;
                                 left = max_length;
                         } else {
-                                k = r + max_length - 4;
+                                k = ans + max_length - 4;
                                 left = 4;
 
                                 /* Eat up final spaces */
-                                while (k > r && isspace(k[-1])) {
+                                while (k > ans && isspace(k[-1])) {
                                         k--;
                                         left++;
                                 }
@@ -222,11 +223,11 @@ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char *
         }
 
         /* Kernel threads have no argv[] */
-        if (isempty(r)) {
+        if (isempty(ans)) {
                 _cleanup_free_ char *t = NULL;
                 int h;
 
-                free(r);
+                free(ans);
 
                 if (!comm_fallback)
                         return -ENOENT;
@@ -236,22 +237,22 @@ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char *
                         return h;
 
                 if (max_length == 0)
-                        r = strjoin("[", t, "]", NULL);
+                        ans = strjoin("[", t, "]");
                 else {
                         size_t l;
 
                         l = strlen(t);
 
                         if (l + 3 <= max_length)
-                                r = strjoin("[", t, "]", NULL);
+                                ans = strjoin("[", t, "]");
                         else if (max_length <= 6) {
 
-                                r = new(char, max_length);
-                                if (!r)
+                                ans = new(char, max_length);
+                                if (!ans)
                                         return -ENOMEM;
 
-                                memcpy(r, "[...]", max_length-1);
-                                r[max_length-1] = 0;
+                                memcpy(ans, "[...]", max_length-1);
+                                ans[max_length-1] = 0;
                         } else {
                                 char *e;
 
@@ -263,38 +264,111 @@ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char *
                                         e--;
                                 *e = 0;
 
-                                r = strjoin("[", t, "...]", NULL);
+                                ans = strjoin("[", t, "...]");
                         }
                 }
-                if (!r)
+                if (!ans)
                         return -ENOMEM;
         }
 
-        *line = r;
+        *line = ans;
         return 0;
 }
 
-void rename_process(const char name[8]) {
-        assert(name);
+int rename_process(const char name[]) {
+        static size_t mm_size = 0;
+        static char *mm = NULL;
+        bool truncated = false;
+        size_t l;
+
+        /* This is a like a poor man's setproctitle(). It changes the comm field, argv[0], and also the glibc's
+         * internally used name of the process. For the first one a limit of 16 chars applies; to the second one in
+         * many cases one of 10 (i.e. length of "/sbin/init") — however if we have CAP_SYS_RESOURCES it is unbounded;
+         * to the third one 7 (i.e. the length of "systemd". If you pass a longer string it will likely be
+         * truncated.
+         *
+         * Returns 0 if a name was set but truncated, > 0 if it was set but not truncated. */
 
-        /* This is a like a poor man's setproctitle(). It changes the
-         * comm field, argv[0], and also the glibc's internally used
-         * name of the process. For the first one a limit of 16 chars
-         * applies, to the second one usually one of 10 (i.e. length
-         * of "/sbin/init"), to the third one one of 7 (i.e. length of
-         * "systemd"). If you pass a longer string it will be
-         * truncated */
+        if (isempty(name))
+                return -EINVAL; /* let's not confuse users unnecessarily with an empty name */
 
+        l = strlen(name);
+
+        /* First step, change the comm field. */
         (void) prctl(PR_SET_NAME, name);
+        if (l > 15) /* Linux process names can be 15 chars at max */
+                truncated = true;
+
+        /* Second step, change glibc's ID of the process name. */
+        if (program_invocation_name) {
+                size_t k;
+
+                k = strlen(program_invocation_name);
+                strncpy(program_invocation_name, name, k);
+                if (l > k)
+                        truncated = true;
+        }
+
+        /* Third step, completely replace the argv[] array the kernel maintains for us. This requires privileges, but
+         * has the advantage that the argv[] array is exactly what we want it to be, and not filled up with zeros at
+         * the end. This is the best option for changing /proc/self/cmdline. */
+        if (mm_size < l+1) {
+                size_t nn_size;
+                char *nn;
+
+                /* Let's not bother with this if we don't have euid == 0. Strictly speaking if people do weird stuff
+                 * with capabilities this could work even for euid != 0, but our own code generally doesn't do that,
+                 * hence let's use this as quick bypass check, to avoid calling mmap() if PR_SET_MM_ARG_START fails
+                 * with EPERM later on anyway. After all geteuid() is dead cheap to call, but mmap() is not. */
+                if (geteuid() != 0) {
+                        log_debug("Skipping PR_SET_MM_ARG_START, as we don't have privileges.");
+                        goto use_saved_argv;
+                }
+
+                nn_size = PAGE_ALIGN(l+1);
+                nn = mmap(NULL, nn_size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+                if (nn == MAP_FAILED) {
+                        log_debug_errno(errno, "mmap() failed: %m");
+                        goto use_saved_argv;
+                }
+
+                strncpy(nn, name, nn_size);
+
+                /* Now, let's tell the kernel about this new memory */
+                if (prctl(PR_SET_MM, PR_SET_MM_ARG_START, (unsigned long) nn, 0, 0) < 0) {
+                        log_debug_errno(errno, "PR_SET_MM_ARG_START failed, proceeding without: %m");
+                        (void) munmap(nn, nn_size);
+                        goto use_saved_argv;
+                }
+
+                /* And update the end pointer to the new end, too. If this fails, we don't really know what to do, it's
+                 * pretty unlikely that we can rollback, hence we'll just accept the failure, and continue. */
+                if (prctl(PR_SET_MM, PR_SET_MM_ARG_END, (unsigned long) nn + l + 1, 0, 0) < 0)
+                        log_debug_errno(errno, "PR_SET_MM_ARG_END failed, proceeding without: %m");
 
-        if (program_invocation_name)
-                strncpy(program_invocation_name, name, strlen(program_invocation_name));
+                if (mm)
+                        (void) munmap(mm, mm_size);
+
+                mm = nn;
+                mm_size = nn_size;
+        } else
+                strncpy(mm, name, mm_size);
+
+use_saved_argv:
+        /* Fourth step: in all cases we'll also update the original argv[], so that our own code gets it right too if
+         * it still looks here */
 
         if (saved_argc > 0) {
                 int i;
 
-                if (saved_argv[0])
-                        strncpy(saved_argv[0], name, strlen(saved_argv[0]));
+                if (saved_argv[0]) {
+                        size_t k;
+
+                        k = strlen(saved_argv[0]);
+                        strncpy(saved_argv[0], name, k);
+                        if (l > k)
+                                truncated = true;
+                }
 
                 for (i = 1; i < saved_argc; i++) {
                         if (!saved_argv[i])
@@ -303,6 +377,8 @@ void rename_process(const char name[8]) {
                         memzero(saved_argv[i], strlen(saved_argv[i]));
                 }
         }
+
+        return !truncated;
 }
 
 int is_kernel_thread(pid_t pid) {
@@ -627,7 +703,7 @@ int kill_and_sigcont(pid_t pid, int sig) {
 
         /* If this worked, also send SIGCONT, unless we already just sent a SIGCONT, or SIGKILL was sent which isn't
          * affected by a process being suspended anyway. */
-        if (r >= 0 && !IN_SET(SIGCONT, SIGKILL))
+        if (r >= 0 && !IN_SET(sig, SIGCONT, SIGKILL))
                 (void) kill(pid, SIGCONT);
 
         return r;
@@ -675,7 +751,7 @@ int getenv_for_pid(pid_t pid, const char *field, char **_value) {
                 }
                 line[i] = 0;
 
-                if (memcmp(line, field, l) == 0 && line[l] == '=') {
+                if (strneq(line, field, l) && line[l] == '=') {
                         value = strdup(line + l + 1);
                         if (!value)
                                 return -ENOMEM;
@@ -731,7 +807,7 @@ int pid_from_same_root_fs(pid_t pid) {
 
         root = procfs_file_alloca(pid, "root");
 
-        return files_same(root, "/proc/1/root");
+        return files_same(root, "/proc/1/root", 0);
 }
 
 bool is_main_thread(void) {
@@ -829,6 +905,23 @@ int pid_compare_func(const void *a, const void *b) {
         return 0;
 }
 
+int ioprio_parse_priority(const char *s, int *ret) {
+        int i, r;
+
+        assert(s);
+        assert(ret);
+
+        r = safe_atoi(s, &i);
+        if (r < 0)
+                return r;
+
+        if (!ioprio_priority_is_valid(i))
+                return -EINVAL;
+
+        *ret = i;
+        return 0;
+}
+
 static const char *const ioprio_class_table[] = {
         [IOPRIO_CLASS_NONE] = "none",
         [IOPRIO_CLASS_RT] = "realtime",
index 9f75088..28d8d74 100644 (file)
 #include <stddef.h>
 #include <stdio.h>
 #include <string.h>
+#include <sys/resource.h>
 #include <sys/types.h>
 
-#include "formats-util.h"
+#include "format-util.h"
+#include "ioprio.h"
 #include "macro.h"
 
 #define procfs_file_alloca(pid, field)                                  \
@@ -63,7 +65,7 @@ void sigkill_waitp(pid_t *pid);
 
 int kill_and_sigcont(pid_t pid, int sig);
 
-void rename_process(const char name[8]);
+int rename_process(const char name[]);
 int is_kernel_thread(pid_t pid);
 
 int getenv_for_pid(pid_t pid, const char *field, char **_value);
@@ -103,3 +105,17 @@ int sched_policy_from_string(const char *s);
 void valgrind_summary_hack(void);
 
 int pid_compare_func(const void *a, const void *b);
+
+static inline bool nice_is_valid(int n) {
+        return n >= PRIO_MIN && n < PRIO_MAX;
+}
+
+static inline bool ioprio_class_is_valid(int i) {
+        return IN_SET(i, IOPRIO_CLASS_NONE, IOPRIO_CLASS_RT, IOPRIO_CLASS_BE, IOPRIO_CLASS_IDLE);
+}
+
+static inline bool ioprio_priority_is_valid(int i) {
+        return i >= 0 && i < IOPRIO_BE_NR;
+}
+
+int ioprio_parse_priority(const char *s, int *ret);
index ad7b3ee..810eeab 100644 (file)
 #include <stdint.h>
 
 #ifdef HAVE_SYS_AUXV_H
-#include <sys/auxv.h>
+#  include <sys/auxv.h>
+#endif
+
+#ifdef USE_SYS_RANDOM_H
+#  include <sys/random.h>
+#else
+#  include <linux/random.h>
 #endif
 
 #include "fd-util.h"
 #include "random-util.h"
 #include "time-util.h"
 
-int dev_urandom(void *p, size_t n) {
+int acquire_random_bytes(void *p, size_t n, bool high_quality_required) {
         static int have_syscall = -1;
 
         _cleanup_close_ int fd = -1;
+        unsigned already_done = 0;
         int r;
 
-        /* Gathers some randomness from the kernel. This call will
-         * never block, and will always return some data from the
-         * kernel, regardless if the random pool is fully initialized
-         * or not. It thus makes no guarantee for the quality of the
-         * returned entropy, but is good enough for our usual usecases
-         * of seeding the hash functions for hashtable */
+        /* Gathers some randomness from the kernel. This call will never block. If
+         * high_quality_required, it will always return some data from the kernel,
+         * regardless of whether the random pool is fully initialized or not.
+         * Otherwise, it will return success if at least some random bytes were
+         * successfully acquired, and an error if the kernel has no entropy whatsover
+         * for us. */
 
-        /* Use the getrandom() syscall unless we know we don't have
-         * it, or when the requested size is too large for it. */
-        if (have_syscall != 0 || (size_t) (int) n != n) {
+        /* Use the getrandom() syscall unless we know we don't have it. */
+        if (have_syscall != 0) {
                 r = getrandom(p, n, GRND_NONBLOCK);
-                if (r == (int) n) {
+                if (r > 0) {
+                        have_syscall = true;
+                        if ((size_t) r == n)
+                                return 0;
+                        if (!high_quality_required) {
+                                /* Fill in the remaing bytes using pseudorandom values */
+                                pseudorandom_bytes((uint8_t*) p + r, n - r);
+                                return 0;
+                        }
+
+                        already_done = r;
+                } else if (errno == ENOSYS)
+                          /* We lack the syscall, continue with reading from /dev/urandom. */
+                          have_syscall = false;
+                else if (errno == EAGAIN) {
+                        /* The kernel has no entropy whatsoever. Let's remember to
+                         * use the syscall the next time again though.
+                         *
+                         * If high_quality_required is false, return an error so that
+                         * random_bytes() can produce some pseudorandom
+                         * bytes. Otherwise, fall back to /dev/urandom, which we know
+                         * is empty, but the kernel will produce some bytes for us on
+                         * a best-effort basis. */
                         have_syscall = true;
-                        return 0;
-                }
-
-                if (r < 0) {
-                        if (errno == ENOSYS)
-                                /* we lack the syscall, continue with
-                                 * reading from /dev/urandom */
-                                have_syscall = false;
-                        else if (errno == EAGAIN)
-                                /* not enough entropy for now. Let's
-                                 * remember to use the syscall the
-                                 * next time, again, but also read
-                                 * from /dev/urandom for now, which
-                                 * doesn't care about the current
-                                 * amount of entropy.  */
-                                have_syscall = true;
-                        else
-                                return -errno;
+
+                        if (!high_quality_required)
+                                return -ENODATA;
                 } else
-                        /* too short read? */
-                        return -ENODATA;
+                        return -errno;
         }
 
         fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC|O_NOCTTY);
         if (fd < 0)
                 return errno == ENOENT ? -ENOSYS : -errno;
 
-        return loop_read_exact(fd, p, n, true);
+        return loop_read_exact(fd, (uint8_t*) p + already_done, n - already_done, true);
 }
 
 void initialize_srand(void) {
@@ -96,12 +108,13 @@ void initialize_srand(void) {
                 return;
 
 #ifdef HAVE_SYS_AUXV_H
-        /* The kernel provides us with 16 bytes of entropy in auxv, so let's try to make use of that to seed the
-         * pseudo-random generator. It's better than nothing... */
+        /* The kernel provides us with 16 bytes of entropy in auxv, so let's
+         * try to make use of that to seed the pseudo-random generator. It's
+         * better than nothing... */
 
         auxv = (void*) getauxval(AT_RANDOM);
         if (auxv) {
-                assert_cc(sizeof(x) < 16);
+                assert_cc(sizeof(x) <= 16);
                 memcpy(&x, auxv, sizeof(x));
         } else
 #endif
@@ -115,19 +128,44 @@ void initialize_srand(void) {
         srand_called = true;
 }
 
-void random_bytes(void *p, size_t n) {
+/* INT_MAX gives us only 31 bits, so use 24 out of that. */
+#if RAND_MAX >= INT_MAX
+#  define RAND_STEP 3
+#else
+/* SHORT_INT_MAX or lower gives at most 15 bits, we just just 8 out of that. */
+#  define RAND_STEP 1
+#endif
+
+void pseudorandom_bytes(void *p, size_t n) {
         uint8_t *q;
+
+        initialize_srand();
+
+        for (q = p; q < (uint8_t*) p + n; q += RAND_STEP) {
+                unsigned rr;
+
+                rr = (unsigned) rand();
+
+#if RAND_STEP >= 3
+                if ((size_t) (q - (uint8_t*) p + 2) < n)
+                        q[2] = rr >> 16;
+#endif
+#if RAND_STEP >= 2
+                if ((size_t) (q - (uint8_t*) p + 1) < n)
+                        q[1] = rr >> 8;
+#endif
+                q[0] = rr;
+        }
+}
+
+void random_bytes(void *p, size_t n) {
         int r;
 
-        r = dev_urandom(p, n);
+        r = acquire_random_bytes(p, n, false);
         if (r >= 0)
                 return;
 
-        /* If some idiot made /dev/urandom unavailable to us, he'll
-         * get a PRNG instead. */
-
-        initialize_srand();
-
-        for (q = p; q < (uint8_t*) p + n; q ++)
-                *q = rand();
+        /* If some idiot made /dev/urandom unavailable to us, or the
+         * kernel has no entropy, use a PRNG instead. */
+        return pseudorandom_bytes(p, n);
 }
index 3cee4c5..804e225 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+#include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
 
-int dev_urandom(void *p, size_t n);
+int acquire_random_bytes(void *p, size_t n, bool high_quality_required);
+void pseudorandom_bytes(void *p, size_t n);
 void random_bytes(void *p, size_t n);
 void initialize_srand(void);
 
index d473828..c6e531a 100644 (file)
@@ -47,8 +47,8 @@
 static inline int raw_clone(unsigned long flags) {
         assert((flags & (CLONE_VM|CLONE_PARENT_SETTID|CLONE_CHILD_SETTID|
                          CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0);
-#if defined(__s390__) || defined(__CRIS__)
-        /* On s390 and cris the order of the first and second arguments
+#if defined(__s390x__) || defined(__s390__) || defined(__CRIS__)
+        /* On s390/s390x and cris the order of the first and second arguments
          * of the raw clone() system call is reversed. */
         return (int) syscall(__NR_clone, NULL, flags);
 #elif defined(__sparc__) && defined(__arch64__)
index 6a204b9..0d21423 100644 (file)
@@ -107,6 +107,5 @@ char *replace_var(const char *text, char *(*lookup)(const char *variable, void*u
         return r;
 
 oom:
-        free(r);
-        return NULL;
+        return mfree(r);
 }
index ee06372..ca834df 100644 (file)
@@ -22,7 +22,7 @@
 
 #include "alloc-util.h"
 #include "extract-word.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "macro.h"
 #include "missing.h"
 #include "rlimit-util.h"
index 43816fd..3f80ed2 100644 (file)
@@ -17,7 +17,6 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <stdbool.h>
@@ -27,6 +26,8 @@
 #include <unistd.h>
 
 #include "btrfs-util.h"
+#include "cgroup-util.h"
+#include "dirent-util.h"
 #include "fd-util.h"
 #include "log.h"
 #include "macro.h"
 #include "stat-util.h"
 #include "string-util.h"
 
+static bool is_physical_fs(const struct statfs *sfs) {
+        return !is_temporary_fs(sfs) && !is_cgroup_fs(sfs);
+}
+
 int rm_rf_children(int fd, RemoveFlags flags, struct stat *root_dev) {
         _cleanup_closedir_ DIR *d = NULL;
+        struct dirent *de;
         int ret = 0, r;
+        struct statfs sfs;
 
         assert(fd >= 0);
 
@@ -47,13 +54,13 @@ int rm_rf_children(int fd, RemoveFlags flags, struct stat *root_dev) {
 
         if (!(flags & REMOVE_PHYSICAL)) {
 
-                r = fd_is_temporary_fs(fd);
+                r = fstatfs(fd, &sfs);
                 if (r < 0) {
                         safe_close(fd);
-                        return r;
+                        return -errno;
                 }
 
-                if (!r) {
+                if (is_physical_fs(&sfs)) {
                         /* We refuse to clean physical file systems
                          * with this call, unless explicitly
                          * requested. This is extra paranoia just to
@@ -72,20 +79,11 @@ int rm_rf_children(int fd, RemoveFlags flags, struct stat *root_dev) {
                 return errno == ENOENT ? 0 : -errno;
         }
 
-        for (;;) {
-                struct dirent *de;
+        FOREACH_DIRENT_ALL(de, d, return -errno) {
                 bool is_dir;
                 struct stat st;
 
-                errno = 0;
-                de = readdir(d);
-                if (!de) {
-                        if (errno > 0 && ret == 0)
-                                ret = -errno;
-                        return ret;
-                }
-
-                if (streq(de->d_name, ".") || streq(de->d_name, ".."))
+                if (dot_or_dot_dot(de->d_name))
                         continue;
 
                 if (de->d_type == DT_UNKNOWN ||
@@ -172,6 +170,7 @@ int rm_rf_children(int fd, RemoveFlags flags, struct stat *root_dev) {
                         }
                 }
         }
+        return ret;
 }
 
 int rm_rf(const char *path, RemoveFlags flags) {
@@ -183,7 +182,7 @@ int rm_rf(const char *path, RemoveFlags flags) {
         /* We refuse to clean the root file system with this
          * call. This is extra paranoia to never cause a really
          * seriously broken system. */
-        if (path_equal(path, "/")) {
+        if (path_equal_or_files_same(path, "/", AT_SYMLINK_NOFOLLOW)) {
                 log_error("Attempted to remove entire root file system, and we can't allow that.");
                 return -EPERM;
         }
@@ -210,7 +209,7 @@ int rm_rf(const char *path, RemoveFlags flags) {
                         if (statfs(path, &s) < 0)
                                 return -errno;
 
-                        if (!is_temporary_fs(&s)) {
+                        if (is_physical_fs(&s)) {
                                 log_error("Attempted to remove disk file system, and we can't allow that.");
                                 return -EPERM;
                         }
index f693a5b..e13f700 100644 (file)
@@ -33,8 +33,6 @@ int rm_rf(const char *path, RemoveFlags flags);
 
 /* Useful for usage with _cleanup_(), destroys a directory and frees the pointer */
 static inline void rm_rf_physical_and_free(char *p) {
-        if (!p)
-                return;
         (void) rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL);
         free(p);
 }
index bc07654..139e6e2 100644 (file)
@@ -50,10 +50,10 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(context_t, context_free);
 static int cached_use = -1;
 static struct selabel_handle *label_hnd = NULL;
 
-#define log_enforcing(...) log_full(security_getenforce() == 1 ? LOG_ERR : LOG_DEBUG, __VA_ARGS__)
+#define log_enforcing(...) log_full_errno(security_getenforce() == 1 ? LOG_ERR : LOG_DEBUG, errno, __VA_ARGS__)
 #endif
 
-bool mac_selinux_have(void) {
+bool mac_selinux_use(void) {
 #ifdef HAVE_SELINUX
         if (cached_use < 0)
                 cached_use = is_selinux_enabled() > 0;
@@ -64,16 +64,6 @@ bool mac_selinux_have(void) {
 #endif
 }
 
-bool mac_selinux_use(void) {
-        if (!mac_selinux_have())
-                return false;
-
-        /* Never try to configure SELinux features if we aren't
-         * root */
-
-        return getuid() == 0;
-}
-
 void mac_selinux_retest(void) {
 #ifdef HAVE_SELINUX
         cached_use = -1;
@@ -205,7 +195,7 @@ int mac_selinux_get_create_label_from_exe(const char *exe, char **label) {
         assert(exe);
         assert(label);
 
-        if (!mac_selinux_have())
+        if (!mac_selinux_use())
                 return -EOPNOTSUPP;
 
         r = getcon_raw(&mycon);
@@ -231,7 +221,7 @@ int mac_selinux_get_our_label(char **label) {
         assert(label);
 
 #ifdef HAVE_SELINUX
-        if (!mac_selinux_have())
+        if (!mac_selinux_use())
                 return -EOPNOTSUPP;
 
         r = getcon_raw(label);
@@ -255,7 +245,7 @@ int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, const char *
         assert(exe);
         assert(label);
 
-        if (!mac_selinux_have())
+        if (!mac_selinux_use())
                 return -EOPNOTSUPP;
 
         r = getcon_raw(&mycon);
@@ -310,7 +300,7 @@ char* mac_selinux_free(char *label) {
         if (!label)
                 return NULL;
 
-        if (!mac_selinux_have())
+        if (!mac_selinux_use())
                 return NULL;
 
 
index ce6bc8e..5bf7236 100644 (file)
@@ -26,7 +26,6 @@
 #include "macro.h"
 
 bool mac_selinux_use(void);
-bool mac_selinux_have(void);
 void mac_selinux_retest(void);
 
 int mac_selinux_init(void);
index 12f64a8..a5f8beb 100644 (file)
@@ -23,8 +23,8 @@
 #include "hashmap.h"
 #include "macro.h"
 
-Set *internal_set_new(const struct hash_ops *hash_ops  HASHMAP_DEBUG_PARAMS);
-#define set_new(ops) internal_set_new(ops  HASHMAP_DEBUG_SRC_ARGS)
+Set *internal_set_new(const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS);
+#define set_new(ops) internal_set_new(ops HASHMAP_DEBUG_SRC_ARGS)
 
 static inline Set *set_free(Set *s) {
         internal_hashmap_free(HASHMAP_BASE(s));
@@ -42,8 +42,8 @@ static inline Set *set_copy(Set *s) {
         return (Set*) internal_hashmap_copy(HASHMAP_BASE(s));
 }
 
-int internal_set_ensure_allocated(Set **s, const struct hash_ops *hash_ops  HASHMAP_DEBUG_PARAMS);
-#define set_ensure_allocated(h, ops) internal_set_ensure_allocated(h, ops  HASHMAP_DEBUG_SRC_ARGS)
+int internal_set_ensure_allocated(Set **s, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS);
+#define set_ensure_allocated(h, ops) internal_set_ensure_allocated(h, ops HASHMAP_DEBUG_SRC_ARGS)
 
 int set_put(Set *s, const void *key);
 /* no set_update */
index 8c1cdc3..4bb4178 100644 (file)
@@ -127,18 +127,25 @@ void siphash24_compress(const void *_in, size_t inlen, struct siphash *state) {
         switch (left) {
                 case 7:
                         state->padding |= ((uint64_t) in[6]) << 48;
+                        /* fall through */
                 case 6:
                         state->padding |= ((uint64_t) in[5]) << 40;
+                        /* fall through */
                 case 5:
                         state->padding |= ((uint64_t) in[4]) << 32;
+                        /* fall through */
                 case 4:
                         state->padding |= ((uint64_t) in[3]) << 24;
+                        /* fall through */
                 case 3:
                         state->padding |= ((uint64_t) in[2]) << 16;
+                        /* fall through */
                 case 2:
                         state->padding |= ((uint64_t) in[1]) <<  8;
+                        /* fall through */
                 case 1:
                         state->padding |= ((uint64_t) in[0]);
+                        /* fall through */
                 case 0:
                         break;
         }
index 385c3e4..016e64a 100644 (file)
@@ -34,7 +34,7 @@
 #include "alloc-util.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "log.h"
 #include "macro.h"
 #include "missing.h"
 #include "utf8.h"
 #include "util.h"
 
+#ifdef ENABLE_IDN
+#  define IDN_FLAGS (NI_IDN|NI_IDN_USE_STD3_ASCII_RULES)
+#else
+#  define IDN_FLAGS 0
+#endif
+
 int socket_address_parse(SocketAddress *a, const char *s) {
         char *e, *n;
         unsigned u;
@@ -113,6 +119,30 @@ int socket_address_parse(SocketAddress *a, const char *s) {
                 memcpy(a->sockaddr.un.sun_path+1, s+1, l);
                 a->size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
 
+        } else if (startswith(s, "vsock:")) {
+                /* AF_VSOCK socket in vsock:cid:port notation */
+                const char *cid_start = s + strlen("vsock:");
+
+                e = strchr(cid_start, ':');
+                if (!e)
+                        return -EINVAL;
+
+                r = safe_atou(e+1, &u);
+                if (r < 0)
+                        return r;
+
+                n = strndupa(cid_start, e - cid_start);
+                if (!isempty(n)) {
+                        r = safe_atou(n, &a->sockaddr.vm.svm_cid);
+                        if (r < 0)
+                                return r;
+                } else
+                        a->sockaddr.vm.svm_cid = VMADDR_CID_ANY;
+
+                a->sockaddr.vm.svm_family = AF_VSOCK;
+                a->sockaddr.vm.svm_port = u;
+                a->size = sizeof(struct sockaddr_vm);
+
         } else {
                 e = strchr(s, ':');
                 if (e) {
@@ -289,6 +319,15 @@ int socket_address_verify(const SocketAddress *a) {
 
                 return 0;
 
+        case AF_VSOCK:
+                if (a->size != sizeof(struct sockaddr_vm))
+                        return -EINVAL;
+
+                if (a->type != SOCK_STREAM && a->type != SOCK_DGRAM)
+                        return -EINVAL;
+
+                return 0;
+
         default:
                 return -EAFNOSUPPORT;
         }
@@ -373,7 +412,7 @@ bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) {
                         return false;
 
                 if (a->sockaddr.un.sun_path[0]) {
-                        if (!path_equal_or_files_same(a->sockaddr.un.sun_path, b->sockaddr.un.sun_path))
+                        if (!path_equal_or_files_same(a->sockaddr.un.sun_path, b->sockaddr.un.sun_path, 0))
                                 return false;
                 } else {
                         if (a->size != b->size)
@@ -394,6 +433,15 @@ bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) {
 
                 break;
 
+        case AF_VSOCK:
+                if (a->sockaddr.vm.svm_cid != b->sockaddr.vm.svm_cid)
+                        return false;
+
+                if (a->sockaddr.vm.svm_port != b->sockaddr.vm.svm_port)
+                        return false;
+
+                break;
+
         default:
                 /* Cannot compare, so we assume the addresses are different */
                 return false;
@@ -441,7 +489,7 @@ const char* socket_address_get_path(const SocketAddress *a) {
 }
 
 bool socket_ipv6_is_supported(void) {
-        if (access("/proc/net/sockstat6", F_OK) != 0)
+        if (access("/proc/net/if_inet6", F_OK) != 0)
                 return false;
 
         return true;
@@ -480,15 +528,27 @@ bool socket_address_matches_fd(const SocketAddress *a, int fd) {
         return socket_address_equal(a, &b);
 }
 
-int sockaddr_port(const struct sockaddr *_sa) {
+int sockaddr_port(const struct sockaddr *_sa, unsigned *port) {
         union sockaddr_union *sa = (union sockaddr_union*) _sa;
 
         assert(sa);
 
-        if (!IN_SET(sa->sa.sa_family, AF_INET, AF_INET6))
-                return -EAFNOSUPPORT;
+        switch (sa->sa.sa_family) {
+        case AF_INET:
+                *port = be16toh(sa->in.sin_port);
+                return 0;
 
-        return be16toh(sa->sa.sa_family == AF_INET6 ? sa->in6.sin6_port : sa->in.sin_port);
+        case AF_INET6:
+                *port = be16toh(sa->in6.sin6_port);
+                return 0;
+
+        case AF_VSOCK:
+                *port = sa->vm.svm_port;
+                return 0;
+
+        default:
+                return -EAFNOSUPPORT;
+        }
 }
 
 int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, bool include_port, char **ret) {
@@ -591,6 +651,18 @@ int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_
 
                 break;
 
+        case AF_VSOCK:
+                if (include_port)
+                        r = asprintf(&p,
+                                     "vsock:%u:%u",
+                                     sa->vm.svm_cid,
+                                     sa->vm.svm_port);
+                else
+                        r = asprintf(&p, "vsock:%u", sa->vm.svm_cid);
+                if (r < 0)
+                        return -ENOMEM;
+                break;
+
         default:
                 return -EOPNOTSUPP;
         }
@@ -657,8 +729,7 @@ int socknameinfo_pretty(union sockaddr_union *sa, socklen_t salen, char **_ret)
 
         assert(_ret);
 
-        r = getnameinfo(&sa->sa, salen, host, sizeof(host), NULL, 0,
-                        NI_IDN|NI_IDN_USE_STD3_ASCII_RULES);
+        r = getnameinfo(&sa->sa, salen, host, sizeof(host), NULL, 0, IDN_FLAGS);
         if (r != 0) {
                 int saved_errno = errno;
 
@@ -748,6 +819,9 @@ bool sockaddr_equal(const union sockaddr_union *a, const union sockaddr_union *b
         if (a->sa.sa_family == AF_INET6)
                 return memcmp(&a->in6.sin6_addr, &b->in6.sin6_addr, sizeof(a->in6.sin6_addr)) == 0;
 
+        if (a->sa.sa_family == AF_VSOCK)
+                return a->vm.svm_cid == b->vm.svm_cid;
+
         return false;
 }
 
@@ -808,7 +882,7 @@ bool ifname_valid(const char *p) {
         if (strlen(p) >= IFNAMSIZ)
                 return false;
 
-        if (STR_IN_SET(p, ".", ".."))
+        if (dot_or_dot_dot(p))
                 return false;
 
         while (*p) {
@@ -831,6 +905,26 @@ bool ifname_valid(const char *p) {
         return true;
 }
 
+bool address_label_valid(const char *p) {
+
+        if (isempty(p))
+                return false;
+
+        if (strlen(p) >= IFNAMSIZ)
+                return false;
+
+        while (*p) {
+                if ((uint8_t) *p >= 127U)
+                        return false;
+
+                if ((uint8_t) *p <= 31U)
+                        return false;
+                p++;
+        }
+
+        return true;
+}
+
 int getpeercred(int fd, struct ucred *ucred) {
         socklen_t n = sizeof(struct ucred);
         struct ucred u;
@@ -1046,3 +1140,34 @@ int flush_accept(int fd) {
                 close(cfd);
         }
 }
+
+struct cmsghdr* cmsg_find(struct msghdr *mh, int level, int type, socklen_t length) {
+        struct cmsghdr *cmsg;
+
+        assert(mh);
+
+        CMSG_FOREACH(cmsg, mh)
+                if (cmsg->cmsg_level == level &&
+                    cmsg->cmsg_type == type &&
+                    (length == (socklen_t) -1 || length == cmsg->cmsg_len))
+                        return cmsg;
+
+        return NULL;
+}
+
+int socket_ioctl_fd(void) {
+        int fd;
+
+        /* Create a socket to invoke the various network interface ioctl()s on. Traditionally only AF_INET was good for
+         * that. Since kernel 4.6 AF_NETLINK works for this too. We first try to use AF_INET hence, but if that's not
+         * available (for example, because it is made unavailable via SECCOMP or such), we'll fall back to the more
+         * generic AF_NETLINK. */
+
+        fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC, 0);
+        if (fd < 0)
+                fd = socket(AF_NETLINK, SOCK_RAW|SOCK_CLOEXEC, NETLINK_GENERIC);
+        if (fd < 0)
+                return -errno;
+
+        return fd;
+}
index e9230e4..73c3a33 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/if_packet.h>
 
 #include "macro.h"
+#include "missing.h"
 #include "util.h"
 
 union sockaddr_union {
@@ -40,6 +41,7 @@ union sockaddr_union {
         struct sockaddr_nl nl;
         struct sockaddr_storage storage;
         struct sockaddr_ll ll;
+        struct sockaddr_vm vm;
 };
 
 typedef struct SocketAddress {
@@ -100,7 +102,7 @@ const char* socket_address_get_path(const SocketAddress *a);
 
 bool socket_ipv6_is_supported(void);
 
-int sockaddr_port(const struct sockaddr *_sa) _pure_;
+int sockaddr_port(const struct sockaddr *_sa, unsigned *port);
 
 int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, bool include_port, char **ret);
 int getpeername_pretty(int fd, bool include_port, char **ret);
@@ -124,6 +126,7 @@ int ip_tos_to_string_alloc(int i, char **s);
 int ip_tos_from_string(const char *s);
 
 bool ifname_valid(const char *p);
+bool address_label_valid(const char *p);
 
 int getpeercred(int fd, struct ucred *ucred);
 int getpeersec(int fd, char **ret);
@@ -142,6 +145,8 @@ int flush_accept(int fd);
 #define CMSG_FOREACH(cmsg, mh)                                          \
         for ((cmsg) = CMSG_FIRSTHDR(mh); (cmsg); (cmsg) = CMSG_NXTHDR((mh), (cmsg)))
 
+struct cmsghdr* cmsg_find(struct msghdr *mh, int level, int type, socklen_t length);
+
 /* Covers only file system and abstract AF_UNIX socket addresses, but not unnamed socket addresses. */
 #define SOCKADDR_UN_LEN(sa)                                             \
         ({                                                              \
@@ -152,3 +157,5 @@ int flush_accept(int fd);
                          1 + strnlen(_sa->sun_path+1, sizeof(_sa->sun_path)-1) : \
                          strnlen(_sa->sun_path, sizeof(_sa->sun_path))); \
         })
+
+int socket_ioctl_fd(void);
index c913fda..a3573b8 100644 (file)
 #include <stdint.h>
 
 #ifdef __CHECKER__
-#define __bitwise __attribute__((bitwise))
-#define __force __attribute__((force))
+#define __sd_bitwise __attribute__((bitwise))
+#define __sd_force __attribute__((force))
 #else
-#define __bitwise
-#define __force
+#define __sd_bitwise
+#define __sd_force
 #endif
 
-typedef uint16_t __bitwise le16_t;
-typedef uint16_t __bitwise be16_t;
-typedef uint32_t __bitwise le32_t;
-typedef uint32_t __bitwise be32_t;
-typedef uint64_t __bitwise le64_t;
-typedef uint64_t __bitwise be64_t;
+typedef uint16_t __sd_bitwise le16_t;
+typedef uint16_t __sd_bitwise be16_t;
+typedef uint32_t __sd_bitwise le32_t;
+typedef uint32_t __sd_bitwise be32_t;
+typedef uint64_t __sd_bitwise le64_t;
+typedef uint64_t __sd_bitwise be64_t;
 
 #undef htobe16
 #undef htole16
@@ -69,20 +69,23 @@ typedef uint64_t __bitwise be64_t;
 #define bswap_64_on_be(x) __bswap_64(x)
 #endif
 
-static inline le16_t htole16(uint16_t value) { return (le16_t __force) bswap_16_on_be(value); }
-static inline le32_t htole32(uint32_t value) { return (le32_t __force) bswap_32_on_be(value); }
-static inline le64_t htole64(uint64_t value) { return (le64_t __force) bswap_64_on_be(value); }
+static inline le16_t htole16(uint16_t value) { return (le16_t __sd_force) bswap_16_on_be(value); }
+static inline le32_t htole32(uint32_t value) { return (le32_t __sd_force) bswap_32_on_be(value); }
+static inline le64_t htole64(uint64_t value) { return (le64_t __sd_force) bswap_64_on_be(value); }
 
-static inline be16_t htobe16(uint16_t value) { return (be16_t __force) bswap_16_on_le(value); }
-static inline be32_t htobe32(uint32_t value) { return (be32_t __force) bswap_32_on_le(value); }
-static inline be64_t htobe64(uint64_t value) { return (be64_t __force) bswap_64_on_le(value); }
+static inline be16_t htobe16(uint16_t value) { return (be16_t __sd_force) bswap_16_on_le(value); }
+static inline be32_t htobe32(uint32_t value) { return (be32_t __sd_force) bswap_32_on_le(value); }
+static inline be64_t htobe64(uint64_t value) { return (be64_t __sd_force) bswap_64_on_le(value); }
 
-static inline uint16_t le16toh(le16_t value) { return bswap_16_on_be((uint16_t __force)value); }
-static inline uint32_t le32toh(le32_t value) { return bswap_32_on_be((uint32_t __force)value); }
-static inline uint64_t le64toh(le64_t value) { return bswap_64_on_be((uint64_t __force)value); }
+static inline uint16_t le16toh(le16_t value) { return bswap_16_on_be((uint16_t __sd_force)value); }
+static inline uint32_t le32toh(le32_t value) { return bswap_32_on_be((uint32_t __sd_force)value); }
+static inline uint64_t le64toh(le64_t value) { return bswap_64_on_be((uint64_t __sd_force)value); }
 
-static inline uint16_t be16toh(be16_t value) { return bswap_16_on_le((uint16_t __force)value); }
-static inline uint32_t be32toh(be32_t value) { return bswap_32_on_le((uint32_t __force)value); }
-static inline uint64_t be64toh(be64_t value) { return bswap_64_on_le((uint64_t __force)value); }
+static inline uint16_t be16toh(be16_t value) { return bswap_16_on_le((uint16_t __sd_force)value); }
+static inline uint32_t be32toh(be32_t value) { return bswap_32_on_le((uint32_t __sd_force)value); }
+static inline uint64_t be64toh(be64_t value) { return bswap_64_on_le((uint64_t __sd_force)value); }
+
+#undef __sd_bitwise
+#undef __sd_force
 
 #endif /* SPARSE_ENDIAN_H */
index 872c56f..48b36de 100644 (file)
 #define SPECIAL_DBUS_SOCKET "dbus.socket"
 #define SPECIAL_JOURNALD_SOCKET "systemd-journald.socket"
 #define SPECIAL_JOURNALD_SERVICE "systemd-journald.service"
+#define SPECIAL_TMPFILES_SETUP_SERVICE "systemd-tmpfiles-setup.service"
 
 /* Magic init signals */
 #define SPECIAL_KBREQUEST_TARGET "kbrequest.target"
 /* The scope unit systemd itself lives in. */
 #define SPECIAL_INIT_SCOPE "init.scope"
 
+/* The root directory. */
+#define SPECIAL_ROOT_MOUNT "-.mount"
 
 #define XCACHE_CGROUP_ROOT "/run/systemd/x-cache-cgroup-root"
index 309e84b..d87370e 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "dirent-util.h"
 #include "fd-util.h"
+#include "fs-util.h"
 #include "macro.h"
 #include "missing.h"
 #include "stat-util.h"
@@ -143,34 +144,41 @@ int path_is_read_only_fs(const char *path) {
 }
 
 int path_is_os_tree(const char *path) {
-        char *p;
         int r;
 
         assert(path);
 
-        /* We use /usr/lib/os-release as flag file if something is an OS */
-        p = strjoina(path, "/usr/lib/os-release");
-        r = access(p, F_OK);
-        if (r >= 0)
-                return 1;
+        /* Does the path exist at all? If not, generate an error immediately. This is useful so that a missing root dir
+         * always results in -ENOENT, and we can properly distuingish the case where the whole root doesn't exist from
+         * the case where just the os-release file is missing. */
+        if (laccess(path, F_OK) < 0)
+                return -errno;
 
-        /* Also check for the old location in /etc, just in case. */
-        p = strjoina(path, "/etc/os-release");
-        r = access(p, F_OK);
+        /* We use /usr/lib/os-release as flag file if something is an OS */
+        r = chase_symlinks("/usr/lib/os-release", path, CHASE_PREFIX_ROOT, NULL);
+        if (r == -ENOENT) {
+
+                /* Also check for the old location in /etc, just in case. */
+                r = chase_symlinks("/etc/os-release", path, CHASE_PREFIX_ROOT, NULL);
+                if (r == -ENOENT)
+                        return 0; /* We got nothing */
+        }
+        if (r < 0)
+                return r;
 
-        return r >= 0;
+        return 1;
 }
 
-int files_same(const char *filea, const char *fileb) {
+int files_same(const char *filea, const char *fileb, int flags) {
         struct stat a, b;
 
         assert(filea);
         assert(fileb);
 
-        if (stat(filea, &a) < 0)
+        if (fstatat(AT_FDCWD, filea, &a, flags) < 0)
                 return -errno;
 
-        if (stat(fileb, &b) < 0)
+        if (fstatat(AT_FDCWD, fileb, &b, flags) < 0)
                 return -errno;
 
         return a.st_dev == b.st_dev &&
@@ -196,7 +204,7 @@ int fd_check_fstype(int fd, statfs_f_type_t magic_value) {
 int path_check_fstype(const char *path, statfs_f_type_t magic_value) {
         _cleanup_close_ int fd = -1;
 
-        fd = open(path, O_RDONLY);
+        fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_PATH);
         if (fd < 0)
                 return -errno;
 
@@ -216,3 +224,13 @@ int fd_is_temporary_fs(int fd) {
 
         return is_temporary_fs(&s);
 }
+
+int path_is_temporary_fs(const char *path) {
+        _cleanup_close_ int fd = -1;
+
+        fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_PATH);
+        if (fd < 0)
+                return -errno;
+
+        return fd_is_temporary_fs(fd);
+}
index 56d28f7..cd204ac 100644 (file)
@@ -49,7 +49,7 @@ int null_or_empty_fd(int fd);
 int path_is_read_only_fs(const char *path);
 int path_is_os_tree(const char *path);
 
-int files_same(const char *filea, const char *fileb);
+int files_same(const char *filea, const char *fileb, int flags);
 
 /* The .f_type field of struct statfs is really weird defined on
  * different archs. Let's give its type a name. */
@@ -61,6 +61,7 @@ int path_check_fstype(const char *path, statfs_f_type_t magic_value);
 
 bool is_temporary_fs(const struct statfs *s) _pure_;
 int fd_is_temporary_fs(int fd);
+int path_is_temporary_fs(const char *path);
 
 /* Because statfs.t_type can be int on some architectures, we have to cast
  * the const magic to the type, otherwise the compiler warns about
index 4bef87d..00aaf9e 100644 (file)
@@ -62,8 +62,7 @@ struct strbuf *strbuf_new(void) {
 err:
         free(str->buf);
         free(str->root);
-        free(str);
-        return NULL;
+        return mfree(str);
 }
 
 static void strbuf_node_cleanup(struct strbuf_node *node) {
index 293a15f..9d2f4bc 100644 (file)
@@ -22,6 +22,7 @@
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
 #include "alloc-util.h"
 #include "gunicode.h"
@@ -217,7 +218,7 @@ char *strappend(const char *s, const char *suffix) {
         return strnappend(s, suffix, suffix ? strlen(suffix) : 0);
 }
 
-char *strjoin(const char *x, ...) {
+char *strjoin_real(const char *x, ...) {
         va_list ap;
         size_t l;
         char *r, *p;
@@ -323,6 +324,14 @@ char ascii_tolower(char x) {
         return x;
 }
 
+char ascii_toupper(char x) {
+
+        if (x >= 'a' && x <= 'z')
+                return x - 'a' + 'A';
+
+        return x;
+}
+
 char *ascii_strlower(char *t) {
         char *p;
 
@@ -334,6 +343,17 @@ char *ascii_strlower(char *t) {
         return t;
 }
 
+char *ascii_strupper(char *t) {
+        char *p;
+
+        assert(t);
+
+        for (p = t; *p; p++)
+                *p = ascii_toupper(*p);
+
+        return t;
+}
+
 char *ascii_strlower_n(char *t, size_t n) {
         size_t i;
 
@@ -423,7 +443,7 @@ static char *ascii_ellipsize_mem(const char *s, size_t old_length, size_t new_le
         if (old_length <= 3 || old_length <= new_length)
                 return strndup(s, old_length);
 
-        r = new0(char, new_length+1);
+        r = new0(char, new_length+3);
         if (!r)
                 return NULL;
 
@@ -433,12 +453,12 @@ static char *ascii_ellipsize_mem(const char *s, size_t old_length, size_t new_le
                 x = new_length - 3;
 
         memcpy(r, s, x);
-        r[x] = '.';
-        r[x+1] = '.';
-        r[x+2] = '.';
+        r[x] = 0xe2; /* tri-dot ellipsis: … */
+        r[x+1] = 0x80;
+        r[x+2] = 0xa6;
         memcpy(r + x + 3,
-               s + old_length - (new_length - x - 3),
-               new_length - x - 3);
+               s + old_length - (new_length - x - 1),
+               new_length - x - 1);
 
         return r;
 }
@@ -590,8 +610,7 @@ char *strreplace(const char *text, const char *old_string, const char *new_strin
         return r;
 
 oom:
-        free(r);
-        return NULL;
+        return mfree(r);
 }
 
 char *strip_tab_ansi(char **ibuf, size_t *_isz) {
@@ -662,8 +681,7 @@ char *strip_tab_ansi(char **ibuf, size_t *_isz) {
 
         if (ferror(f)) {
                 fclose(f);
-                free(obuf);
-                return NULL;
+                return mfree(obuf);
         }
 
         fclose(f);
@@ -803,34 +821,30 @@ int free_and_strdup(char **p, const char *s) {
         return 1;
 }
 
-#pragma GCC push_options
-#pragma GCC optimize("O0")
-
-void* memory_erase(void *p, size_t l) {
-        volatile uint8_t* x = (volatile uint8_t*) p;
+#if !HAVE_DECL_EXPLICIT_BZERO
+/*
+ * Pointer to memset is volatile so that compiler must de-reference
+ * the pointer and can't assume that it points to any function in
+ * particular (such as memset, which it then might further "optimize")
+ * This approach is inspired by openssl's crypto/mem_clr.c.
+ */
+typedef void *(*memset_t)(void *,int,size_t);
 
-        /* This basically does what memset() does, but hopefully isn't
-         * optimized away by the compiler. One of those days, when
-         * glibc learns memset_s() we should replace this call by
-         * memset_s(), but until then this has to do. */
+static volatile memset_t memset_func = memset;
 
-        for (; l > 0; l--)
-                *(x++) = 'x';
-
-        return p;
+void explicit_bzero(void *p, size_t l) {
+        memset_func(p, '\0', l);
 }
-
-#pragma GCC pop_options
+#endif
 
 char* string_erase(char *x) {
-
         if (!x)
                 return NULL;
 
         /* A delicious drop of snake-oil! To be called on memory where
          * we stored passphrases or so, after we used them. */
-
-        return memory_erase(x, strlen(x));
+        explicit_bzero(x, strlen(x));
+        return x;
 }
 
 char *string_free_erase(char *s) {
index 1209e1e..be44ded 100644 (file)
@@ -70,6 +70,10 @@ static inline const char *empty_to_null(const char *p) {
         return isempty(p) ? NULL : p;
 }
 
+static inline const char *strdash_if_empty(const char *str) {
+        return isempty(str) ? "-" : str;
+}
+
 static inline char *startswith(const char *s, const char *prefix) {
         size_t l;
 
@@ -103,16 +107,14 @@ const char* split(const char **state, size_t *l, const char *separator, bool quo
 #define FOREACH_WORD_SEPARATOR(word, length, s, separator, state)       \
         _FOREACH_WORD(word, length, s, separator, false, state)
 
-#define FOREACH_WORD_QUOTED(word, length, s, state)                     \
-        _FOREACH_WORD(word, length, s, WHITESPACE, true, state)
-
 #define _FOREACH_WORD(word, length, s, separator, quoted, state)        \
         for ((state) = (s), (word) = split(&(state), &(length), (separator), (quoted)); (word); (word) = split(&(state), &(length), (separator), (quoted)))
 
 char *strappend(const char *s, const char *suffix);
 char *strnappend(const char *s, const char *suffix, size_t length);
 
-char *strjoin(const char *x, ...) _sentinel_;
+char *strjoin_real(const char *x, ...) _sentinel_;
+#define strjoin(a, ...) strjoin_real((a), __VA_ARGS__, NULL)
 
 #define strjoina(a, ...)                                                \
         ({                                                              \
@@ -137,6 +139,9 @@ char ascii_tolower(char x);
 char *ascii_strlower(char *s);
 char *ascii_strlower_n(char *s, size_t n);
 
+char ascii_toupper(char x);
+char *ascii_strupper(char *s);
+
 int ascii_strcasecmp_n(const char *a, const char *b, size_t n);
 int ascii_strcasecmp_nn(const char *a, size_t n, const char *b, size_t m);
 
@@ -184,7 +189,10 @@ static inline void *memmem_safe(const void *haystack, size_t haystacklen, const
         return memmem(haystack, haystacklen, needle, needlelen);
 }
 
-void* memory_erase(void *p, size_t l);
+#if !HAVE_DECL_EXPLICIT_BZERO
+void explicit_bzero(void *p, size_t l);
+#endif
+
 char *string_erase(char *x);
 
 char *string_free_erase(char *s);
index 34e464d..c63f11c 100644 (file)
@@ -87,8 +87,7 @@ void strv_clear(char **l) {
 
 char **strv_free(char **l) {
         strv_clear(l);
-        free(l);
-        return NULL;
+        return mfree(l);
 }
 
 char **strv_free_erase(char **l) {
@@ -426,8 +425,7 @@ char *strv_join_quoted(char **l) {
         return buf;
 
  oom:
-        free(buf);
-        return NULL;
+        return mfree(buf);
 }
 
 int strv_push(char ***l, char *value) {
@@ -772,11 +770,7 @@ static int str_compare(const void *_a, const void *_b) {
 }
 
 char **strv_sort(char **l) {
-
-        if (strv_isempty(l))
-                return l;
-
-        qsort(l, strv_length(l), sizeof(char*), str_compare);
+        qsort_safe(l, strv_length(l), sizeof(char*), str_compare);
         return l;
 }
 
@@ -869,8 +863,7 @@ char ***strv_free_free(char ***l) {
         for (i = l; *i; i++)
                 strv_free(*i);
 
-        free(l);
-        return NULL;
+        return mfree(l);
 }
 
 char **strv_skip(char **l, size_t n) {
index 683ce83..385ad17 100644 (file)
@@ -96,10 +96,13 @@ bool strv_overlap(char **a, char **b) _pure_;
 #define STRV_FOREACH(s, l)                      \
         for ((s) = (l); (s) && *(s); (s)++)
 
-#define STRV_FOREACH_BACKWARDS(s, l)            \
-        STRV_FOREACH(s, l)                      \
-                ;                               \
-        for ((s)--; (l) && ((s) >= (l)); (s)--)
+#define STRV_FOREACH_BACKWARDS(s, l)                                \
+        for (s = ({                                                 \
+                        char **_l = l;                              \
+                        _l ? _l + strv_length(_l) - 1U : NULL;      \
+                        });                                         \
+             (l) && ((s) >= (l));                                   \
+             (s)--)
 
 #define STRV_FOREACH_PAIR(x, y, l)               \
         for ((x) = (l), (y) = (x+1); (x) && *(x) && *(y); (x) += 2, (y) = (x + 1))
@@ -141,6 +144,11 @@ void strv_print(char **l);
         })
 
 #define STR_IN_SET(x, ...) strv_contains(STRV_MAKE(__VA_ARGS__), x)
+#define STRPTR_IN_SET(x, ...)                                    \
+        ({                                                       \
+                const char* _x = (x);                            \
+                _x && strv_contains(STRV_MAKE(__VA_ARGS__), _x); \
+        })
 
 #define FOREACH_STRING(x, ...)                               \
         for (char **_l = ({                                  \
index aaf11d2..c6fbe79 100644 (file)
 
 /*
  * Concatenates/copies strings. In any case, terminates in all cases
- * with '\0' * and moves the @dest pointer forward to the added '\0'.
- * Returns the * remaining size, and 0 if the string was truncated.
+ * with '\0' and moves the @dest pointer forward to the added '\0'.
+ * Returns the remaining size, and 0 if the string was truncated.
+ *
+ * Due to the intended usage, these helpers silently noop invocations
+ * having zero size.  This is technically an exception to the above
+ * statement "terminates in all cases".  It's unexpected for such calls to
+ * occur outside of a loop where this is the preferred behavior.
  */
 
 #include <stdarg.h>
 size_t strpcpy(char **dest, size_t size, const char *src) {
         size_t len;
 
+        assert(dest);
+        assert(src);
+
+        if (size == 0)
+                return 0;
+
         len = strlen(src);
         if (len >= size) {
                 if (size > 1)
@@ -51,23 +62,30 @@ size_t strpcpyf(char **dest, size_t size, const char *src, ...) {
         va_list va;
         int i;
 
+        assert(dest);
+        assert(src);
+
+        if (size == 0)
+                return 0;
+
         va_start(va, src);
         i = vsnprintf(*dest, size, src, va);
         if (i < (int)size) {
                 *dest += i;
                 size -= i;
         } else {
-                *dest += size;
                 size = 0;
         }
         va_end(va);
-        *dest[0] = '\0';
         return size;
 }
 
 size_t strpcpyl(char **dest, size_t size, const char *src, ...) {
         va_list va;
 
+        assert(dest);
+        assert(src);
+
         va_start(va, src);
         do {
                 size = strpcpy(dest, size, src);
@@ -80,6 +98,9 @@ size_t strpcpyl(char **dest, size_t size, const char *src, ...) {
 size_t strscpy(char *dest, size_t size, const char *src) {
         char *s;
 
+        assert(dest);
+        assert(src);
+
         s = dest;
         return strpcpy(&s, size, src);
 }
@@ -88,6 +109,9 @@ size_t strscpyl(char *dest, size_t size, const char *src, ...) {
         va_list va;
         char *s;
 
+        assert(dest);
+        assert(src);
+
         va_start(va, src);
         s = dest;
         do {
index df56d85..9a8ef82 100644 (file)
@@ -39,6 +39,7 @@
 #include <unistd.h>
 
 #include "alloc-util.h"
+#include "env-util.h"
 #include "fd-util.h"
 #include "fileio.h"
 #include "fs-util.h"
@@ -143,12 +144,14 @@ int read_one_char(FILE *f, char *ret, usec_t t, bool *need_nl) {
         return 0;
 }
 
-int ask_char(char *ret, const char *replies, const char *text, ...) {
+#define DEFAULT_ASK_REFRESH_USEC (2*USEC_PER_SEC)
+
+int ask_char(char *ret, const char *replies, const char *fmt, ...) {
         int r;
 
         assert(ret);
         assert(replies);
-        assert(text);
+        assert(fmt);
 
         for (;;) {
                 va_list ap;
@@ -158,8 +161,10 @@ int ask_char(char *ret, const char *replies, const char *text, ...) {
                 if (colors_enabled())
                         fputs(ANSI_HIGHLIGHT, stdout);
 
-                va_start(ap, text);
-                vprintf(text, ap);
+                putchar('\r');
+
+                va_start(ap, fmt);
+                vprintf(fmt, ap);
                 va_end(ap);
 
                 if (colors_enabled())
@@ -167,9 +172,12 @@ int ask_char(char *ret, const char *replies, const char *text, ...) {
 
                 fflush(stdout);
 
-                r = read_one_char(stdin, &c, USEC_INFINITY, &need_nl);
+                r = read_one_char(stdin, &c, DEFAULT_ASK_REFRESH_USEC, &need_nl);
                 if (r < 0) {
 
+                        if (r == -ETIMEDOUT)
+                                continue;
+
                         if (r == -EBADMSG) {
                                 puts("Bad input, please try again.");
                                 continue;
@@ -345,12 +353,7 @@ int open_terminal(const char *name, int mode) {
         }
 
         r = isatty(fd);
-        if (r < 0) {
-                safe_close(fd);
-                return -errno;
-        }
-
-        if (!r) {
+        if (r == 0) {
                 safe_close(fd);
                 return -ENOTTY;
         }
@@ -459,7 +462,7 @@ int acquire_terminal(
                                         goto fail;
                                 }
 
-                                r = fd_wait_for_event(fd, POLLIN, ts + timeout - n);
+                                r = fd_wait_for_event(notify, POLLIN, ts + timeout - n);
                                 if (r < 0)
                                         goto fail;
 
@@ -785,7 +788,7 @@ bool tty_is_vc_resolve(const char *tty) {
 }
 
 const char *default_term_for_tty(const char *tty) {
-        return tty && tty_is_vc_resolve(tty) ? "TERM=linux" : "TERM=vt220";
+        return tty && tty_is_vc_resolve(tty) ? "linux" : "vt220";
 }
 
 int fd_columns(int fd) {
@@ -1191,12 +1194,9 @@ int open_terminal_in_namespace(pid_t pid, const char *name, int mode) {
         return receive_one_fd(pair[0], 0);
 }
 
-bool terminal_is_dumb(void) {
+static bool getenv_terminal_is_dumb(void) {
         const char *e;
 
-        if (!on_tty())
-                return true;
-
         e = getenv("TERM");
         if (!e)
                 return true;
@@ -1204,15 +1204,25 @@ bool terminal_is_dumb(void) {
         return streq(e, "dumb");
 }
 
+bool terminal_is_dumb(void) {
+        if (!on_tty())
+                return true;
+
+        return getenv_terminal_is_dumb();
+}
+
 bool colors_enabled(void) {
         static int enabled = -1;
 
         if (_unlikely_(enabled < 0)) {
-                const char *colors;
-
-                colors = getenv("SYSTEMD_COLORS");
-                if (colors)
-                        enabled = parse_boolean(colors) != 0;
+                int val;
+
+                val = getenv_bool("SYSTEMD_COLORS");
+                if (val >= 0)
+                        enabled = val;
+                else if (getpid() == 1)
+                        /* PID1 outputs to the console without holding it open all the time */
+                        enabled = !getenv_terminal_is_dumb();
                 else
                         enabled = !terminal_is_dumb();
         }
index 169ab77..b862bfa 100644 (file)
 #define ANSI_HIGHLIGHT_YELLOW "\x1B[0;1;33m"
 #define ANSI_HIGHLIGHT_BLUE "\x1B[0;1;34m"
 #define ANSI_HIGHLIGHT_UNDERLINE "\x1B[0;1;4m"
+#define ANSI_HIGHLIGHT_RED_UNDERLINE "\x1B[0;1;4;31m"
+#define ANSI_HIGHLIGHT_GREEN_UNDERLINE "\x1B[0;1;4;32m"
+#define ANSI_HIGHLIGHT_YELLOW_UNDERLINE "\x1B[0;1;4;33m"
+#define ANSI_HIGHLIGHT_BLUE_UNDERLINE "\x1B[0;1;4;34m"
 #define ANSI_NORMAL "\x1B[0m"
 
 #define ANSI_ERASE_TO_END_OF_LINE "\x1B[K"
@@ -83,37 +87,24 @@ bool on_tty(void);
 bool terminal_is_dumb(void);
 bool colors_enabled(void);
 
-static inline const char *ansi_underline(void) {
-        return colors_enabled() ? ANSI_UNDERLINE : "";
-}
-
-static inline const char *ansi_highlight(void) {
-        return colors_enabled() ? ANSI_HIGHLIGHT : "";
-}
-
-static inline const char *ansi_highlight_underline(void) {
-        return colors_enabled() ? ANSI_HIGHLIGHT_UNDERLINE : "";
-}
-
-static inline const char *ansi_highlight_red(void) {
-        return colors_enabled() ? ANSI_HIGHLIGHT_RED : "";
-}
-
-static inline const char *ansi_highlight_green(void) {
-        return colors_enabled() ? ANSI_HIGHLIGHT_GREEN : "";
-}
-
-static inline const char *ansi_highlight_yellow(void) {
-        return colors_enabled() ? ANSI_HIGHLIGHT_YELLOW : "";
-}
-
-static inline const char *ansi_highlight_blue(void) {
-        return colors_enabled() ? ANSI_HIGHLIGHT_BLUE : "";
-}
-
-static inline const char *ansi_normal(void) {
-        return colors_enabled() ? ANSI_NORMAL : "";
-}
+#define DEFINE_ANSI_FUNC(name, NAME)                            \
+        static inline const char *ansi_##name(void) {           \
+                return colors_enabled() ? ANSI_##NAME : "";     \
+        }                                                       \
+        struct __useless_struct_to_allow_trailing_semicolon__
+
+DEFINE_ANSI_FUNC(underline,                  UNDERLINE);
+DEFINE_ANSI_FUNC(highlight,                  HIGHLIGHT);
+DEFINE_ANSI_FUNC(highlight_underline,        HIGHLIGHT_UNDERLINE);
+DEFINE_ANSI_FUNC(highlight_red,              HIGHLIGHT_RED);
+DEFINE_ANSI_FUNC(highlight_green,            HIGHLIGHT_GREEN);
+DEFINE_ANSI_FUNC(highlight_yellow,           HIGHLIGHT_YELLOW);
+DEFINE_ANSI_FUNC(highlight_blue,             HIGHLIGHT_BLUE);
+DEFINE_ANSI_FUNC(highlight_red_underline,    HIGHLIGHT_RED_UNDERLINE);
+DEFINE_ANSI_FUNC(highlight_green_underline,  HIGHLIGHT_GREEN_UNDERLINE);
+DEFINE_ANSI_FUNC(highlight_yellow_underline, HIGHLIGHT_YELLOW_UNDERLINE);
+DEFINE_ANSI_FUNC(highlight_blue_underline,   HIGHLIGHT_BLUE_UNDERLINE);
+DEFINE_ANSI_FUNC(normal,                     NORMAL);
 
 int get_ctty_devnr(pid_t pid, dev_t *d);
 int get_ctty(pid_t, dev_t *_devnr, char **r);
index 24e681b..68ba86f 100644 (file)
@@ -40,8 +40,6 @@
 #include "strv.h"
 #include "time-util.h"
 
-static nsec_t timespec_load_nsec(const struct timespec *ts);
-
 static clockid_t map_clock_id(clockid_t c) {
 
         /* Some more exotic archs (s390, ppc, …) lack the "ALARM" flavour of the clocks. Thus, clock_gettime() will
@@ -109,7 +107,7 @@ dual_timestamp* dual_timestamp_from_realtime(dual_timestamp *ts, usec_t u) {
         ts->realtime = u;
 
         delta = (int64_t) now(CLOCK_REALTIME) - (int64_t) u;
-        ts->monotonic = usec_sub(now(CLOCK_MONOTONIC), delta);
+        ts->monotonic = usec_sub_signed(now(CLOCK_MONOTONIC), delta);
 
         return ts;
 }
@@ -126,8 +124,8 @@ triple_timestamp* triple_timestamp_from_realtime(triple_timestamp *ts, usec_t u)
 
         ts->realtime = u;
         delta = (int64_t) now(CLOCK_REALTIME) - (int64_t) u;
-        ts->monotonic = usec_sub(now(CLOCK_MONOTONIC), delta);
-        ts->boottime = clock_boottime_supported() ? usec_sub(now(CLOCK_BOOTTIME), delta) : USEC_INFINITY;
+        ts->monotonic = usec_sub_signed(now(CLOCK_MONOTONIC), delta);
+        ts->boottime = clock_boottime_supported() ? usec_sub_signed(now(CLOCK_BOOTTIME), delta) : USEC_INFINITY;
 
         return ts;
 }
@@ -143,7 +141,7 @@ dual_timestamp* dual_timestamp_from_monotonic(dual_timestamp *ts, usec_t u) {
 
         ts->monotonic = u;
         delta = (int64_t) now(CLOCK_MONOTONIC) - (int64_t) u;
-        ts->realtime = usec_sub(now(CLOCK_REALTIME), delta);
+        ts->realtime = usec_sub_signed(now(CLOCK_REALTIME), delta);
 
         return ts;
 }
@@ -158,8 +156,8 @@ dual_timestamp* dual_timestamp_from_boottime_or_monotonic(dual_timestamp *ts, us
 
         dual_timestamp_get(ts);
         delta = (int64_t) now(clock_boottime_or_monotonic()) - (int64_t) u;
-        ts->realtime = usec_sub(ts->realtime, delta);
-        ts->monotonic = usec_sub(ts->monotonic, delta);
+        ts->realtime = usec_sub_signed(ts->realtime, delta);
+        ts->monotonic = usec_sub_signed(ts->monotonic, delta);
 
         return ts;
 }
@@ -187,7 +185,7 @@ usec_t triple_timestamp_by_clock(triple_timestamp *ts, clockid_t clock) {
 usec_t timespec_load(const struct timespec *ts) {
         assert(ts);
 
-        if (ts->tv_sec == (time_t) -1 && ts->tv_nsec == (long) -1)
+        if (ts->tv_sec < 0 || ts->tv_nsec < 0)
                 return USEC_INFINITY;
 
         if ((usec_t) ts->tv_sec > (UINT64_MAX - (ts->tv_nsec / NSEC_PER_USEC)) / USEC_PER_SEC)
@@ -198,10 +196,10 @@ usec_t timespec_load(const struct timespec *ts) {
                 (usec_t) ts->tv_nsec / NSEC_PER_USEC;
 }
 
-static nsec_t timespec_load_nsec(const struct timespec *ts) {
+nsec_t timespec_load_nsec(const struct timespec *ts) {
         assert(ts);
 
-        if (ts->tv_sec == (time_t) -1 && ts->tv_nsec == (long) -1)
+        if (ts->tv_sec < 0 || ts->tv_nsec < 0)
                 return NSEC_INFINITY;
 
         if ((nsec_t) ts->tv_sec >= (UINT64_MAX - ts->tv_nsec) / NSEC_PER_SEC)
@@ -213,7 +211,8 @@ static nsec_t timespec_load_nsec(const struct timespec *ts) {
 struct timespec *timespec_store(struct timespec *ts, usec_t u)  {
         assert(ts);
 
-        if (u == USEC_INFINITY) {
+        if (u == USEC_INFINITY ||
+            u / USEC_PER_SEC >= TIME_T_MAX) {
                 ts->tv_sec = (time_t) -1;
                 ts->tv_nsec = (long) -1;
                 return ts;
@@ -228,8 +227,7 @@ struct timespec *timespec_store(struct timespec *ts, usec_t u)  {
 usec_t timeval_load(const struct timeval *tv) {
         assert(tv);
 
-        if (tv->tv_sec == (time_t) -1 &&
-            tv->tv_usec == (suseconds_t) -1)
+        if (tv->tv_sec < 0 || tv->tv_usec < 0)
                 return USEC_INFINITY;
 
         if ((usec_t) tv->tv_sec > (UINT64_MAX - tv->tv_usec) / USEC_PER_SEC)
@@ -243,7 +241,8 @@ usec_t timeval_load(const struct timeval *tv) {
 struct timeval *timeval_store(struct timeval *tv, usec_t u) {
         assert(tv);
 
-        if (u == USEC_INFINITY) {
+        if (u == USEC_INFINITY ||
+            u / USEC_PER_SEC > TIME_T_MAX) {
                 tv->tv_sec = (time_t) -1;
                 tv->tv_usec = (suseconds_t) -1;
         } else {
@@ -254,32 +253,97 @@ struct timeval *timeval_store(struct timeval *tv, usec_t u) {
         return tv;
 }
 
-static char *format_timestamp_internal(char *buf, size_t l, usec_t t,
-                                       bool utc, bool us) {
+static char *format_timestamp_internal(
+                char *buf,
+                size_t l,
+                usec_t t,
+                bool utc,
+                bool us) {
+
+        /* The weekdays in non-localized (English) form. We use this instead of the localized form, so that our
+         * generated timestamps may be parsed with parse_timestamp(), and always read the same. */
+        static const char * const weekdays[] = {
+                [0] = "Sun",
+                [1] = "Mon",
+                [2] = "Tue",
+                [3] = "Wed",
+                [4] = "Thu",
+                [5] = "Fri",
+                [6] = "Sat",
+        };
+
         struct tm tm;
         time_t sec;
-        int k;
+        size_t n;
 
         assert(buf);
-        assert(l > 0);
 
+        if (l <
+            3 +                  /* week day */
+            1 + 10 +             /* space and date */
+            1 + 8 +              /* space and time */
+            (us ? 1 + 6 : 0) +   /* "." and microsecond part */
+            1 + 1 +              /* space and shortest possible zone */
+            1)
+                return NULL; /* Not enough space even for the shortest form. */
         if (t <= 0 || t == USEC_INFINITY)
+                return NULL; /* Timestamp is unset */
+
+        /* Let's not format times with years > 9999 */
+        if (t > USEC_TIMESTAMP_FORMATTABLE_MAX)
                 return NULL;
 
-        sec = (time_t) (t / USEC_PER_SEC);
-        localtime_or_gmtime_r(&sec, &tm, utc);
+        sec = (time_t) (t / USEC_PER_SEC); /* Round down */
 
-        if (us)
-                k = strftime(buf, l, "%a %Y-%m-%d %H:%M:%S", &tm);
-        else
-                k = strftime(buf, l, "%a %Y-%m-%d %H:%M:%S %Z", &tm);
-
-        if (k <= 0)
+        if (!localtime_or_gmtime_r(&sec, &tm, utc))
                 return NULL;
+
+        /* Start with the week day */
+        assert((size_t) tm.tm_wday < ELEMENTSOF(weekdays));
+        memcpy(buf, weekdays[tm.tm_wday], 4);
+
+        /* Add the main components */
+        if (strftime(buf + 3, l - 3, " %Y-%m-%d %H:%M:%S", &tm) <= 0)
+                return NULL; /* Doesn't fit */
+
+        /* Append the microseconds part, if that's requested */
         if (us) {
-                snprintf(buf + strlen(buf), l - strlen(buf), ".%06llu", (unsigned long long) (t % USEC_PER_SEC));
-                if (strftime(buf + strlen(buf), l - strlen(buf), " %Z", &tm) <= 0)
-                        return NULL;
+                n = strlen(buf);
+                if (n + 8 > l)
+                        return NULL; /* Microseconds part doesn't fit. */
+
+                sprintf(buf + n, ".%06"PRI_USEC, t % USEC_PER_SEC);
+        }
+
+        /* Append the timezone */
+        n = strlen(buf);
+        if (utc) {
+                /* If this is UTC then let's explicitly use the "UTC" string here, because gmtime_r() normally uses the
+                 * obsolete "GMT" instead. */
+                if (n + 5 > l)
+                        return NULL; /* "UTC" doesn't fit. */
+
+                strcpy(buf + n, " UTC");
+
+        } else if (!isempty(tm.tm_zone)) {
+                size_t tn;
+
+                /* An explicit timezone is specified, let's use it, if it fits */
+                tn = strlen(tm.tm_zone);
+                if (n + 1 + tn + 1 > l) {
+                        /* The full time zone does not fit in. Yuck. */
+
+                        if (n + 1 + _POSIX_TZNAME_MAX + 1 > l)
+                                return NULL; /* Not even enough space for the POSIX minimum (of 6)? In that case, complain that it doesn't fit */
+
+                        /* So the time zone doesn't fit in fully, but the caller passed enough space for the POSIX
+                         * minimum time zone length. In this case suppress the timezone entirely, in order not to dump
+                         * an overly long, hard to read string on the user. This should be safe, because the user will
+                         * assume the local timezone anyway if none is shown. And so does parse_timestamp(). */
+                } else {
+                        buf[n++] = ' ';
+                        strcpy(buf + n, tm.tm_zone);
+                }
         }
 
         return buf;
@@ -438,11 +502,11 @@ char *format_timespan(char *buf, size_t l, usec_t t, usec_t accuracy) {
 
                         if (j > 0) {
                                 k = snprintf(p, l,
-                                             "%s"USEC_FMT".%0*llu%s",
+                                             "%s"USEC_FMT".%0*"PRI_USEC"%s",
                                              p > buf ? " " : "",
                                              a,
                                              j,
-                                             (unsigned long long) b,
+                                             b,
                                              table[i].suffix);
 
                                 t = 0;
@@ -490,16 +554,30 @@ void dual_timestamp_serialize(FILE *f, const char *name, dual_timestamp *t) {
 }
 
 int dual_timestamp_deserialize(const char *value, dual_timestamp *t) {
-        unsigned long long a, b;
+        uint64_t a, b;
+        int r, pos;
 
         assert(value);
         assert(t);
 
-        if (sscanf(value, "%llu %llu", &a, &b) != 2) {
-                log_debug("Failed to parse dual timestamp value \"%s\": %m", value);
+        pos = strspn(value, WHITESPACE);
+        if (value[pos] == '-')
+                return -EINVAL;
+        pos += strspn(value + pos, DIGITS);
+        pos += strspn(value + pos, WHITESPACE);
+        if (value[pos] == '-')
+                return -EINVAL;
+
+        r = sscanf(value, "%" PRIu64 "%" PRIu64 "%n", &a, &b, &pos);
+        if (r != 2) {
+                log_debug("Failed to parse dual timestamp value \"%s\".", value);
                 return -EINVAL;
         }
 
+        if (value[pos] != '\0')
+                /* trailing garbage */
+                return -EINVAL;
+
         t->realtime = a;
         t->monotonic = b;
 
@@ -539,12 +617,11 @@ int parse_timestamp(const char *t, usec_t *usec) {
                 { "Sat",       6 },
         };
 
-        const char *k;
-        const char *utc;
+        const char *k, *utc, *tzn = NULL;
         struct tm tm, copy;
         time_t x;
         usec_t x_usec, plus = 0, minus = 0, ret;
-        int r, weekday = -1;
+        int r, weekday = -1, dst = -1;
         unsigned i;
 
         /*
@@ -609,15 +686,55 @@ int parse_timestamp(const char *t, usec_t *usec) {
                 goto finish;
         }
 
+        /* See if the timestamp is suffixed with UTC */
         utc = endswith_no_case(t, " UTC");
         if (utc)
                 t = strndupa(t, utc - t);
+        else {
+                const char *e = NULL;
+                int j;
+
+                tzset();
+
+                /* See if the timestamp is suffixed by either the DST or non-DST local timezone. Note that we only
+                 * support the local timezones here, nothing else. Not because we wouldn't want to, but simply because
+                 * there are no nice APIs available to cover this. By accepting the local time zone strings, we make
+                 * sure that all timestamps written by format_timestamp() can be parsed correctly, even though we don't
+                 * support arbitrary timezone specifications.  */
+
+                for (j = 0; j <= 1; j++) {
+
+                        if (isempty(tzname[j]))
+                                continue;
+
+                        e = endswith_no_case(t, tzname[j]);
+                        if (!e)
+                                continue;
+                        if (e == t)
+                                continue;
+                        if (e[-1] != ' ')
+                                continue;
+
+                        break;
+                }
 
-        x = ret / USEC_PER_SEC;
+                if (IN_SET(j, 0, 1)) {
+                        /* Found one of the two timezones specified. */
+                        t = strndupa(t, e - t - 1);
+                        dst = j;
+                        tzn = tzname[j];
+                }
+        }
+
+        x = (time_t) (ret / USEC_PER_SEC);
         x_usec = 0;
 
-        assert_se(localtime_or_gmtime_r(&x, &tm, utc));
-        tm.tm_isdst = -1;
+        if (!localtime_or_gmtime_r(&x, &tm, utc))
+                return -EINVAL;
+
+        tm.tm_isdst = dst;
+        if (tzn)
+                tm.tm_zone = tzn;
 
         if (streq(t, "today")) {
                 tm.tm_sec = tm.tm_min = tm.tm_hour = 0;
@@ -634,7 +751,6 @@ int parse_timestamp(const char *t, usec_t *usec) {
                 goto from_tm;
         }
 
-
         for (i = 0; i < ELEMENTSOF(day_nr); i++) {
                 size_t skip;
 
@@ -727,25 +843,31 @@ parse_usec:
                         return -EINVAL;
 
                 x_usec = add;
-
         }
 
 from_tm:
         x = mktime_or_timegm(&tm, utc);
-        if (x == (time_t) -1)
+        if (x < 0)
                 return -EINVAL;
 
         if (weekday >= 0 && tm.tm_wday != weekday)
                 return -EINVAL;
 
         ret = (usec_t) x * USEC_PER_SEC + x_usec;
+        if (ret > USEC_TIMESTAMP_FORMATTABLE_MAX)
+                return -EINVAL;
 
 finish:
+        if (ret + plus < ret) /* overflow? */
+                return -EINVAL;
         ret += plus;
-        if (ret > minus)
+        if (ret > USEC_TIMESTAMP_FORMATTABLE_MAX)
+                return -EINVAL;
+
+        if (ret >= minus)
                 ret -= minus;
         else
-                ret = 0;
+                return -EINVAL;
 
         *usec = ret;
 
@@ -785,6 +907,7 @@ static char* extract_multiplier(char *p, usec_t *multiplier) {
                 { "y",       USEC_PER_YEAR   },
                 { "usec",    1ULL            },
                 { "us",      1ULL            },
+                { "µs",      1ULL            },
         };
         unsigned i;
 
@@ -886,6 +1009,16 @@ int parse_sec(const char *t, usec_t *usec) {
         return parse_time(t, usec, USEC_PER_SEC);
 }
 
+int parse_sec_fix_0(const char *t, usec_t *usec) {
+        t += strspn(t, WHITESPACE);
+        if (streq(t, "0")) {
+                *usec = USEC_INFINITY;
+                return 0;
+        }
+
+        return parse_sec(t, usec);
+}
+
 int parse_nsec(const char *t, nsec_t *nsec) {
         static const struct {
                 const char *suffix;
@@ -918,6 +1051,7 @@ int parse_nsec(const char *t, nsec_t *nsec) {
                 { "y", NSEC_PER_YEAR },
                 { "usec", NSEC_PER_USEC },
                 { "us", NSEC_PER_USEC },
+                { "µs", NSEC_PER_USEC },
                 { "nsec", 1ULL },
                 { "ns", 1ULL },
                 { "", 1ULL }, /* default is nsec */
@@ -1171,7 +1305,7 @@ bool clock_supported(clockid_t clock) {
                 if (!clock_boottime_supported())
                         return false;
 
-                /* fall through, after checking the cached value for CLOCK_BOOTTIME. */
+                /* fall through */
 
         default:
                 /* For everything else, check properly */
@@ -1222,8 +1356,27 @@ unsigned long usec_to_jiffies(usec_t u) {
                 r = sysconf(_SC_CLK_TCK);
 
                 assert(r > 0);
-                hz = (unsigned long) r;
+                hz = r;
         }
 
         return DIV_ROUND_UP(u , USEC_PER_SEC / hz);
 }
+
+usec_t usec_shift_clock(usec_t x, clockid_t from, clockid_t to) {
+        usec_t a, b;
+
+        if (x == USEC_INFINITY)
+                return USEC_INFINITY;
+        if (map_clock_id(from) == map_clock_id(to))
+                return x;
+
+        a = now(from);
+        b = now(to);
+
+        if (x > a)
+                /* x lies in the future */
+                return usec_add(b, usec_sub_unsigned(x, a));
+        else
+                /* x lies in the past */
+                return usec_sub_unsigned(b, usec_sub_unsigned(a, x));
+}
index 1b058f0..3b7f0e9 100644 (file)
 typedef uint64_t usec_t;
 typedef uint64_t nsec_t;
 
-#define NSEC_FMT "%" PRIu64
-#define USEC_FMT "%" PRIu64
+#define PRI_NSEC PRIu64
+#define PRI_USEC PRIu64
+#define NSEC_FMT "%" PRI_NSEC
+#define USEC_FMT "%" PRI_USEC
 
 #include "macro.h"
 
@@ -68,7 +70,9 @@ typedef struct triple_timestamp {
 #define USEC_PER_YEAR ((usec_t) (31557600ULL*USEC_PER_SEC))
 #define NSEC_PER_YEAR ((nsec_t) (31557600ULL*NSEC_PER_SEC))
 
-#define FORMAT_TIMESTAMP_MAX ((4*4+1)+11+9+4+1) /* weekdays can be unicode */
+/* We assume a maximum timezone length of 6. TZNAME_MAX is not defined on Linux, but glibc internally initializes this
+ * to 6. Let's rely on that. */
+#define FORMAT_TIMESTAMP_MAX (3+1+10+1+8+1+6+1+6+1)
 #define FORMAT_TIMESTAMP_WIDTH 28 /* when outputting, assume this width */
 #define FORMAT_TIMESTAMP_RELATIVE_MAX 256
 #define FORMAT_TIMESPAN_MAX 64
@@ -109,6 +113,7 @@ static inline bool triple_timestamp_is_set(triple_timestamp *ts) {
 usec_t triple_timestamp_by_clock(triple_timestamp *ts, clockid_t clock);
 
 usec_t timespec_load(const struct timespec *ts) _pure_;
+nsec_t timespec_load_nsec(const struct timespec *ts) _pure_;
 struct timespec *timespec_store(struct timespec *ts, usec_t u);
 
 usec_t timeval_load(const struct timeval *tv) _pure_;
@@ -128,6 +133,7 @@ int timestamp_deserialize(const char *value, usec_t *timestamp);
 int parse_timestamp(const char *t, usec_t *usec);
 
 int parse_sec(const char *t, usec_t *usec);
+int parse_sec_fix_0(const char *t, usec_t *usec);
 int parse_time(const char *t, usec_t *usec, usec_t default_unit);
 int parse_nsec(const char *t, nsec_t *nsec);
 
@@ -140,6 +146,8 @@ bool clock_boottime_supported(void);
 bool clock_supported(clockid_t clock);
 clockid_t clock_boottime_or_monotonic(void);
 
+usec_t usec_shift_clock(usec_t, clockid_t from, clockid_t to);
+
 #define xstrftime(buf, fmt, tm) \
         assert_message_se(strftime(buf, ELEMENTSOF(buf), fmt, tm) > 0, \
                           "xstrftime: " #buf "[] must be big enough")
@@ -164,15 +172,30 @@ static inline usec_t usec_add(usec_t a, usec_t b) {
         return c;
 }
 
-static inline usec_t usec_sub(usec_t timestamp, int64_t delta) {
-        if (delta < 0)
-                return usec_add(timestamp, (usec_t) (-delta));
+static inline usec_t usec_sub_unsigned(usec_t timestamp, usec_t delta) {
 
         if (timestamp == USEC_INFINITY) /* Make sure infinity doesn't degrade */
                 return USEC_INFINITY;
-
-        if (timestamp < (usec_t) delta)
+        if (timestamp < delta)
                 return 0;
 
         return timestamp - delta;
 }
+
+static inline usec_t usec_sub_signed(usec_t timestamp, int64_t delta) {
+        if (delta < 0)
+                return usec_add(timestamp, (usec_t) (-delta));
+        else
+                return usec_sub_unsigned(timestamp, (usec_t) delta);
+}
+
+#if SIZEOF_TIME_T == 8
+/* The last second we can format is 31. Dec 9999, 1s before midnight, because otherwise we'd enter 5 digit year
+ * territory. However, since we want to stay away from this in all timezones we take one day off. */
+#define USEC_TIMESTAMP_FORMATTABLE_MAX ((usec_t) 253402214399000000)
+#elif SIZEOF_TIME_T == 4
+/* With a 32bit time_t we can't go beyond 2038... */
+#define USEC_TIMESTAMP_FORMATTABLE_MAX ((usec_t) 2147483647000000)
+#else
+#error "Yuck, time_t is neither 4 not 8 bytes wide?"
+#endif
index fe883b9..920ca0d 100644 (file)
@@ -273,7 +273,7 @@ int unit_name_build(const char *prefix, const char *instance, const char *suffix
         if (!instance)
                 s = strappend(prefix, suffix);
         else
-                s = strjoin(prefix, "@", instance, suffix, NULL);
+                s = strjoin(prefix, "@", instance, suffix);
         if (!s)
                 return -ENOMEM;
 
@@ -554,7 +554,7 @@ int unit_name_from_path_instance(const char *prefix, const char *path, const cha
         if (r < 0)
                 return r;
 
-        s = strjoin(prefix, "@", p, suffix, NULL);
+        s = strjoin(prefix, "@", p, suffix);
         if (!s)
                 return -ENOMEM;
 
@@ -1047,3 +1047,12 @@ static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
 };
 
 DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency);
+
+static const char* const notify_access_table[_NOTIFY_ACCESS_MAX] = {
+        [NOTIFY_NONE] = "none",
+        [NOTIFY_MAIN] = "main",
+        [NOTIFY_EXEC] = "exec",
+        [NOTIFY_ALL] = "all"
+};
+
+DEFINE_STRING_TABLE_LOOKUP(notify_access, NotifyAccess);
index 44eadf0..0f164a6 100644 (file)
@@ -257,6 +257,15 @@ typedef enum UnitDependency {
         _UNIT_DEPENDENCY_INVALID = -1
 } UnitDependency;
 
+typedef enum NotifyAccess {
+        NOTIFY_NONE,
+        NOTIFY_ALL,
+        NOTIFY_MAIN,
+        NOTIFY_EXEC,
+        _NOTIFY_ACCESS_MAX,
+        _NOTIFY_ACCESS_INVALID = -1
+} NotifyAccess;
+
 typedef enum UnitNameFlags {
         UNIT_NAME_PLAIN = 1,      /* Allow foo.service */
         UNIT_NAME_INSTANCE = 2,   /* Allow foo@bar.service */
@@ -365,3 +374,6 @@ TimerState timer_state_from_string(const char *s) _pure_;
 
 const char *unit_dependency_to_string(UnitDependency i) _const_;
 UnitDependency unit_dependency_from_string(const char *s) _pure_;
+
+const char* notify_access_to_string(NotifyAccess i) _const_;
+NotifyAccess notify_access_from_string(const char *s) _pure_;
index e9d668d..c619dad 100644 (file)
 #include <string.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#include <utmp.h>
 
-#include "missing.h"
 #include "alloc-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "fileio.h"
+#include "format-util.h"
 #include "macro.h"
+#include "missing.h"
 #include "parse-util.h"
 #include "path-util.h"
 #include "string-util.h"
+#include "strv.h"
 #include "user-util.h"
+#include "utf8.h"
 
 bool uid_is_valid(uid_t uid) {
 
+        /* Also see POSIX IEEE Std 1003.1-2008, 2016 Edition, 3.436. */
+
         /* Some libc APIs use UID_INVALID as special placeholder */
         if (uid == (uid_t) UINT32_C(0xFFFFFFFF))
                 return false;
@@ -173,6 +179,35 @@ int get_user_creds(
         return 0;
 }
 
+int get_user_creds_clean(
+                const char **username,
+                uid_t *uid, gid_t *gid,
+                const char **home,
+                const char **shell) {
+
+        int r;
+
+        /* Like get_user_creds(), but resets home/shell to NULL if they don't contain anything relevant. */
+
+        r = get_user_creds(username, uid, gid, home, shell);
+        if (r < 0)
+                return r;
+
+        if (shell &&
+            (isempty(*shell) || PATH_IN_SET(*shell,
+                                            "/bin/nologin",
+                                            "/sbin/nologin",
+                                            "/usr/bin/nologin",
+                                            "/usr/sbin/nologin")))
+                *shell = NULL;
+
+        if (home &&
+            (isempty(*home) || path_equal(*home, "/")))
+                *home = NULL;
+
+        return 0;
+}
+
 int get_group_creds(const char **groupname, gid_t *gid) {
         struct group *g;
         gid_t id;
@@ -427,9 +462,11 @@ int get_shell(char **_s) {
 }
 
 int reset_uid_gid(void) {
+        int r;
 
-        if (setgroups(0, NULL) < 0)
-                return -errno;
+        r = maybe_setgroups(0, NULL);
+        if (r < 0)
+                return r;
 
         if (setresgid(0, 0, 0) < 0)
                 return -errno;
@@ -479,3 +516,131 @@ int take_etc_passwd_lock(const char *root) {
 
         return fd;
 }
+
+bool valid_user_group_name(const char *u) {
+        const char *i;
+        long sz;
+
+        /* Checks if the specified name is a valid user/group name. Also see POSIX IEEE Std 1003.1-2008, 2016 Edition,
+         * 3.437. We are a bit stricter here however. Specifically we deviate from POSIX rules:
+         *
+         * - We don't allow any dots (this would break chown syntax which permits dots as user/group name separator)
+         * - We require that names fit into the appropriate utmp field
+         * - We don't allow empty user names
+         *
+         * Note that other systems are even more restrictive, and don't permit underscores or uppercase characters.
+         */
+
+        if (isempty(u))
+                return false;
+
+        if (!(u[0] >= 'a' && u[0] <= 'z') &&
+            !(u[0] >= 'A' && u[0] <= 'Z') &&
+            u[0] != '_')
+                return false;
+
+        for (i = u+1; *i; i++) {
+                if (!(*i >= 'a' && *i <= 'z') &&
+                    !(*i >= 'A' && *i <= 'Z') &&
+                    !(*i >= '0' && *i <= '9') &&
+                    *i != '_' &&
+                    *i != '-')
+                        return false;
+        }
+
+        sz = sysconf(_SC_LOGIN_NAME_MAX);
+        assert_se(sz > 0);
+
+        if ((size_t) (i-u) > (size_t) sz)
+                return false;
+
+        if ((size_t) (i-u) > UT_NAMESIZE - 1)
+                return false;
+
+        return true;
+}
+
+bool valid_user_group_name_or_id(const char *u) {
+
+        /* Similar as above, but is also fine with numeric UID/GID specifications, as long as they are in the right
+         * range, and not the invalid user ids. */
+
+        if (isempty(u))
+                return false;
+
+        if (valid_user_group_name(u))
+                return true;
+
+        return parse_uid(u, NULL) >= 0;
+}
+
+bool valid_gecos(const char *d) {
+
+        if (!d)
+                return false;
+
+        if (!utf8_is_valid(d))
+                return false;
+
+        if (string_has_cc(d, NULL))
+                return false;
+
+        /* Colons are used as field separators, and hence not OK */
+        if (strchr(d, ':'))
+                return false;
+
+        return true;
+}
+
+bool valid_home(const char *p) {
+
+        if (isempty(p))
+                return false;
+
+        if (!utf8_is_valid(p))
+                return false;
+
+        if (string_has_cc(p, NULL))
+                return false;
+
+        if (!path_is_absolute(p))
+                return false;
+
+        if (!path_is_safe(p))
+                return false;
+
+        /* Colons are used as field separators, and hence not OK */
+        if (strchr(p, ':'))
+                return false;
+
+        return true;
+}
+
+int maybe_setgroups(size_t size, const gid_t *list) {
+        int r;
+
+        /* Check if setgroups is allowed before we try to drop all the auxiliary groups */
+        if (size == 0) { /* Dropping all aux groups? */
+                _cleanup_free_ char *setgroups_content = NULL;
+                bool can_setgroups;
+
+                r = read_one_line_file("/proc/self/setgroups", &setgroups_content);
+                if (r == -ENOENT)
+                        /* Old kernels don't have /proc/self/setgroups, so assume we can use setgroups */
+                        can_setgroups = true;
+                else if (r < 0)
+                        return r;
+                else
+                        can_setgroups = streq(setgroups_content, "allow");
+
+                if (!can_setgroups) {
+                        log_debug("Skipping setgroups(), /proc/self/setgroups is set to 'deny'");
+                        return 0;
+                }
+        }
+
+        if (setgroups(size, list) < 0)
+                return -errno;
+
+        return 0;
+}
index 8026eca..dfea561 100644 (file)
@@ -20,6 +20,7 @@
 ***/
 
 #include <stdbool.h>
+#include <stdint.h>
 #include <sys/types.h>
 #include <unistd.h>
 
@@ -39,6 +40,7 @@ char* getlogname_malloc(void);
 char* getusername_malloc(void);
 
 int get_user_creds(const char **username, uid_t *uid, gid_t *gid, const char **home, const char **shell);
+int get_user_creds_clean(const char **username, uid_t *uid, gid_t *gid, const char **home, const char **shell);
 int get_group_creds(const char **groupname, gid_t *gid);
 
 char* uid_to_name(uid_t uid);
@@ -57,8 +59,19 @@ int take_etc_passwd_lock(const char *root);
 #define UID_INVALID ((uid_t) -1)
 #define GID_INVALID ((gid_t) -1)
 
-/* The following macros add 1 when converting things, since UID 0 is a
- * valid UID, while the pointer NULL is special */
+/* Let's pick a UIDs within the 16bit range, so that we are compatible with containers using 16bit
+ * user namespacing. At least on Fedora normal users are allocated until UID 60000, hence do not
+ * allocate from below this. Also stay away from the upper end of the range as that is often used
+ * for overflow/nobody users. */
+#define DYNAMIC_UID_MIN ((uid_t) UINT32_C(0x0000EF00))
+#define DYNAMIC_UID_MAX ((uid_t) UINT32_C(0x0000FFEF))
+
+static inline bool uid_is_dynamic(uid_t uid) {
+        return DYNAMIC_UID_MIN <= uid && uid <= DYNAMIC_UID_MAX;
+}
+
+/* The following macros add 1 when converting things, since UID 0 is a valid UID, while the pointer
+ * NULL is special */
 #define PTR_TO_UID(p) ((uid_t) (((uintptr_t) (p))-1))
 #define UID_TO_PTR(u) ((void*) (((uintptr_t) (u))+1))
 
@@ -68,3 +81,10 @@ int take_etc_passwd_lock(const char *root);
 static inline bool userns_supported(void) {
         return access("/proc/self/uid_map", F_OK) >= 0;
 }
+
+bool valid_user_group_name(const char *u);
+bool valid_user_group_name_or_id(const char *u);
+bool valid_gecos(const char *d);
+bool valid_home(const char *p);
+
+int maybe_setgroups(size_t size, const gid_t *list);
index 9d66d28..b52a5db 100644 (file)
@@ -18,7 +18,6 @@
 ***/
 
 #include <alloca.h>
-#include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <sched.h>
@@ -41,7 +40,7 @@
 #include "dirent-util.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "hashmap.h"
 #include "hostname-util.h"
 #include "log.h"
@@ -60,9 +59,6 @@
 #include "user-util.h"
 #include "util.h"
 
-/* Put this test here for a lack of better place */
-assert_cc(EAGAIN == EWOULDBLOCK);
-
 int saved_argc = 0;
 char **saved_argv = NULL;
 static int saved_in_initrd = -1;
@@ -81,146 +77,6 @@ size_t page_size(void) {
         return pgsz;
 }
 
-static int do_execute(char **directories, usec_t timeout, char *argv[]) {
-        _cleanup_hashmap_free_free_ Hashmap *pids = NULL;
-        _cleanup_set_free_free_ Set *seen = NULL;
-        char **directory;
-
-        /* We fork this all off from a child process so that we can
-         * somewhat cleanly make use of SIGALRM to set a time limit */
-
-        (void) reset_all_signal_handlers();
-        (void) reset_signal_mask();
-
-        assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
-
-        pids = hashmap_new(NULL);
-        if (!pids)
-                return log_oom();
-
-        seen = set_new(&string_hash_ops);
-        if (!seen)
-                return log_oom();
-
-        STRV_FOREACH(directory, directories) {
-                _cleanup_closedir_ DIR *d;
-                struct dirent *de;
-
-                d = opendir(*directory);
-                if (!d) {
-                        if (errno == ENOENT)
-                                continue;
-
-                        return log_error_errno(errno, "Failed to open directory %s: %m", *directory);
-                }
-
-                FOREACH_DIRENT(de, d, break) {
-                        _cleanup_free_ char *path = NULL;
-                        pid_t pid;
-                        int r;
-
-                        if (!dirent_is_file(de))
-                                continue;
-
-                        if (set_contains(seen, de->d_name)) {
-                                log_debug("%1$s/%2$s skipped (%2$s was already seen).", *directory, de->d_name);
-                                continue;
-                        }
-
-                        r = set_put_strdup(seen, de->d_name);
-                        if (r < 0)
-                                return log_oom();
-
-                        path = strjoin(*directory, "/", de->d_name, NULL);
-                        if (!path)
-                                return log_oom();
-
-                        if (null_or_empty_path(path)) {
-                                log_debug("%s is empty (a mask).", path);
-                                continue;
-                        }
-
-                        pid = fork();
-                        if (pid < 0) {
-                                log_error_errno(errno, "Failed to fork: %m");
-                                continue;
-                        } else if (pid == 0) {
-                                char *_argv[2];
-
-                                assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
-
-                                if (!argv) {
-                                        _argv[0] = path;
-                                        _argv[1] = NULL;
-                                        argv = _argv;
-                                } else
-                                        argv[0] = path;
-
-                                execv(path, argv);
-                                return log_error_errno(errno, "Failed to execute %s: %m", path);
-                        }
-
-                        log_debug("Spawned %s as " PID_FMT ".", path, pid);
-
-                        r = hashmap_put(pids, PID_TO_PTR(pid), path);
-                        if (r < 0)
-                                return log_oom();
-                        path = NULL;
-                }
-        }
-
-        /* Abort execution of this process after the timout. We simply
-         * rely on SIGALRM as default action terminating the process,
-         * and turn on alarm(). */
-
-        if (timeout != USEC_INFINITY)
-                alarm((timeout + USEC_PER_SEC - 1) / USEC_PER_SEC);
-
-        while (!hashmap_isempty(pids)) {
-                _cleanup_free_ char *path = NULL;
-                pid_t pid;
-
-                pid = PTR_TO_PID(hashmap_first_key(pids));
-                assert(pid > 0);
-
-                path = hashmap_remove(pids, PID_TO_PTR(pid));
-                assert(path);
-
-                wait_for_terminate_and_warn(path, pid, true);
-        }
-
-        return 0;
-}
-
-void execute_directories(const char* const* directories, usec_t timeout, char *argv[]) {
-        pid_t executor_pid;
-        int r;
-        char *name;
-        char **dirs = (char**) directories;
-
-        assert(!strv_isempty(dirs));
-
-        name = basename(dirs[0]);
-        assert(!isempty(name));
-
-        /* Executes all binaries in the directories in parallel and waits
-         * for them to finish. Optionally a timeout is applied. If a file
-         * with the same name exists in more than one directory, the
-         * earliest one wins. */
-
-        executor_pid = fork();
-        if (executor_pid < 0) {
-                log_error_errno(errno, "Failed to fork: %m");
-                return;
-
-        } else if (executor_pid == 0) {
-                r = do_execute(dirs, timeout, argv);
-                _exit(r < 0 ? EXIT_FAILURE : EXIT_SUCCESS);
-        }
-
-        wait_for_terminate_and_warn(name, executor_pid, true);
-}
-
 bool plymouth_running(void) {
         return access("/run/plymouth/pid", F_OK) >= 0;
 }
@@ -467,7 +323,7 @@ bool in_initrd(void) {
          * 2. the root file system must be a memory file system
          *
          * The second check is extra paranoia, since misdetecting an
-         * initrd can have bad bad consequences due the initrd
+         * initrd can have bad consequences due the initrd
          * emptying when transititioning to the main systemd.
          */
 
@@ -493,7 +349,7 @@ void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
         u = nmemb;
         while (l < u) {
                 idx = (l + u) / 2;
-                p = (void *)(((const char *) base) + (idx * size));
+                p = (const char *) base + idx * size;
                 comparison = compar(key, p, arg);
                 if (comparison < 0)
                         u = idx;
@@ -508,28 +364,17 @@ void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
 int on_ac_power(void) {
         bool found_offline = false, found_online = false;
         _cleanup_closedir_ DIR *d = NULL;
+        struct dirent *de;
 
         d = opendir("/sys/class/power_supply");
         if (!d)
                 return errno == ENOENT ? true : -errno;
 
-        for (;;) {
-                struct dirent *de;
+        FOREACH_DIRENT(de, d, return -errno) {
                 _cleanup_close_ int fd = -1, device = -1;
                 char contents[6];
                 ssize_t n;
 
-                errno = 0;
-                de = readdir(d);
-                if (!de && errno > 0)
-                        return -errno;
-
-                if (!de)
-                        break;
-
-                if (hidden_or_backup_file(de->d_name))
-                        continue;
-
                 device = openat(dirfd(d), de->d_name, O_DIRECTORY|O_RDONLY|O_CLOEXEC|O_NOCTTY);
                 if (device < 0) {
                         if (errno == ENOENT || errno == ENOTDIR)
@@ -696,7 +541,7 @@ int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int
                 if (asprintf(&userns_fd_path, "/proc/self/fd/%d", userns_fd) < 0)
                         return -ENOMEM;
 
-                r = files_same(userns_fd_path, "/proc/self/ns/user");
+                r = files_same(userns_fd_path, "/proc/self/ns/user", 0);
                 if (r < 0)
                         return r;
                 if (r)
index 44497dc..c7da6c3 100644 (file)
@@ -41,7 +41,7 @@
 #include <time.h>
 #include <unistd.h>
 
-#include "formats-util.h"
+#include "format-util.h"
 #include "macro.h"
 #include "missing.h"
 #include "time-util.h"
@@ -61,7 +61,9 @@ static inline const char* one_zero(bool b) {
         return b ? "1" : "0";
 }
 
-void execute_directories(const char* const* directories, usec_t timeout, char *argv[]);
+static inline const char* enable_disable(bool b) {
+        return b ? "enable" : "disable";
+}
 
 bool plymouth_running(void);
 
index dace1f4..6011744 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "alloc-util.h"
 #include "dirent-util.h"
+#include "env-util.h"
 #include "fd-util.h"
 #include "fileio.h"
 #include "macro.h"
@@ -47,8 +48,10 @@ static int detect_vm_cpuid(void) {
                 { "KVMKVMKVM",    VIRTUALIZATION_KVM       },
                 /* http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1009458 */
                 { "VMwareVMware", VIRTUALIZATION_VMWARE    },
-                /* http://msdn.microsoft.com/en-us/library/ff542428.aspx */
+                /* https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs */
                 { "Microsoft Hv", VIRTUALIZATION_MICROSOFT },
+                /* https://wiki.freebsd.org/bhyve */
+                { "bhyve bhyve ", VIRTUALIZATION_BHYVE     },
         };
 
         uint32_t eax, ecx;
@@ -178,6 +181,8 @@ static int detect_vm_dmi(void) {
                 { "Xen",           VIRTUALIZATION_XEN       },
                 { "Bochs",         VIRTUALIZATION_BOCHS     },
                 { "Parallels",     VIRTUALIZATION_PARALLELS },
+                /* https://wiki.freebsd.org/bhyve */
+                { "BHYVE",         VIRTUALIZATION_BHYVE     },
         };
         unsigned i;
         int r;
@@ -310,25 +315,31 @@ static int detect_vm_zvm(void) {
 /* Returns a short identifier for the various VM implementations */
 int detect_vm(void) {
         static thread_local int cached_found = _VIRTUALIZATION_INVALID;
-        int r;
+        int r, dmi;
 
         if (cached_found >= 0)
                 return cached_found;
 
         /* We have to use the correct order here:
-         * Some virtualization technologies do use KVM hypervisor but are
-         * expected to be detected as something else. So detect DMI first.
          *
-         * An example is Virtualbox since version 5.0, which uses KVM backend.
-         * Detection via DMI works corretly, the CPU ID would find KVM
-         * only. */
-        r = detect_vm_dmi();
+         * -> First try to detect Oracle Virtualbox, even if it uses KVM.
+         * -> Second try to detect from cpuid, this will report KVM for
+         *    whatever software is used even if info in dmi is overwritten.
+         * -> Third try to detect from dmi. */
+
+        dmi = detect_vm_dmi();
+        if (dmi == VIRTUALIZATION_ORACLE) {
+                r = dmi;
+                goto finish;
+        }
+
+        r = detect_vm_cpuid();
         if (r < 0)
                 return r;
         if (r != VIRTUALIZATION_NONE)
                 goto finish;
 
-        r = detect_vm_cpuid();
+        r = dmi;
         if (r < 0)
                 return r;
         if (r != VIRTUALIZATION_NONE)
@@ -403,8 +414,7 @@ int detect_container(void) {
         if (cached_found >= 0)
                 return cached_found;
 
-        /* /proc/vz exists in container and outside of the container,
-         * /proc/bc only outside of the container. */
+        /* /proc/vz exists in container and outside of the container, /proc/bc only outside of the container. */
         if (access("/proc/vz", F_OK) >= 0 &&
             access("/proc/bc", F_OK) < 0) {
                 r = VIRTUALIZATION_OPENVZ;
@@ -412,50 +422,58 @@ int detect_container(void) {
         }
 
         if (getpid() == 1) {
-                /* If we are PID 1 we can just check our own
-                 * environment variable */
+                /* If we are PID 1 we can just check our own environment variable, and that's authoritative. */
 
                 e = getenv("container");
                 if (isempty(e)) {
                         r = VIRTUALIZATION_NONE;
                         goto finish;
                 }
-        } else {
-
-                /* Otherwise, PID 1 dropped this information into a
-                 * file in /run. This is better than accessing
-                 * /proc/1/environ, since we don't need CAP_SYS_PTRACE
-                 * for that. */
-
-                r = read_one_line_file("/run/systemd/container", &m);
-                if (r == -ENOENT) {
-
-                        /* Fallback for cases where PID 1 was not
-                         * systemd (for example, cases where
-                         * init=/bin/sh is used. */
-
-                        r = getenv_for_pid(1, "container", &m);
-                        if (r <= 0) {
-
-                                /* If that didn't work, give up,
-                                 * assume no container manager.
-                                 *
-                                 * Note: This means we still cannot
-                                 * detect containers if init=/bin/sh
-                                 * is passed but privileges dropped,
-                                 * as /proc/1/environ is only readable
-                                 * with privileges. */
-
-                                r = VIRTUALIZATION_NONE;
-                                goto finish;
-                        }
-                }
-                if (r < 0)
-                        return r;
 
+                goto translate_name;
+        }
+
+        /* Otherwise, PID 1 might have dropped this information into a file in /run. This is better than accessing
+         * /proc/1/environ, since we don't need CAP_SYS_PTRACE for that. */
+        r = read_one_line_file("/run/systemd/container", &m);
+        if (r >= 0) {
+                e = m;
+                goto translate_name;
+        }
+        if (r != -ENOENT)
+                return log_debug_errno(r, "Failed to read /run/systemd/container: %m");
+
+        /* Fallback for cases where PID 1 was not systemd (for example, cases where init=/bin/sh is used. */
+        r = getenv_for_pid(1, "container", &m);
+        if (r > 0) {
                 e = m;
+                goto translate_name;
         }
+        if (r < 0) /* This only works if we have CAP_SYS_PTRACE, hence let's better ignore failures here */
+                log_debug_errno(r, "Failed to read $container of PID 1, ignoring: %m");
+
+        /* Interestingly /proc/1/sched actually shows the host's PID for what we see as PID 1. Hence, if the PID shown
+         * there is not 1, we know we are in a PID namespace. and hence a container. */
+        r = read_one_line_file("/proc/1/sched", &m);
+        if (r >= 0) {
+                const char *t;
+
+                t = strrchr(m, '(');
+                if (!t)
+                        return -EIO;
+
+                if (!startswith(t, "(1,")) {
+                        r = VIRTUALIZATION_CONTAINER_OTHER;
+                        goto finish;
+                }
+        } else if (r != -ENOENT)
+                return r;
+
+        /* If that didn't work, give up, assume no container manager. */
+        r = VIRTUALIZATION_NONE;
+        goto finish;
 
+translate_name:
         for (j = 0; j < ELEMENTSOF(value_table); j++)
                 if (streq(e, value_table[j].value)) {
                         r = value_table[j].id;
@@ -465,7 +483,7 @@ int detect_container(void) {
         r = VIRTUALIZATION_CONTAINER_OTHER;
 
 finish:
-        log_debug("Found container virtualization %s", virtualization_to_string(r));
+        log_debug("Found container virtualization %s.", virtualization_to_string(r));
         cached_found = r;
         return r;
 }
@@ -480,10 +498,83 @@ int detect_virtualization(void) {
         return r;
 }
 
+static int userns_has_mapping(const char *name) {
+        _cleanup_fclose_ FILE *f = NULL;
+        _cleanup_free_ char *buf = NULL;
+        size_t n_allocated = 0;
+        ssize_t n;
+        uint32_t a, b, c;
+        int r;
+
+        f = fopen(name, "re");
+        if (!f) {
+                log_debug_errno(errno, "Failed to open %s: %m", name);
+                return errno == ENOENT ? false : -errno;
+        }
+
+        n = getline(&buf, &n_allocated, f);
+        if (n < 0) {
+                if (feof(f)) {
+                        log_debug("%s is empty, we're in an uninitialized user namespace", name);
+                        return true;
+                }
+
+                return log_debug_errno(errno, "Failed to read %s: %m", name);
+        }
+
+        r = sscanf(buf, "%"PRIu32" %"PRIu32" %"PRIu32, &a, &b, &c);
+        if (r < 3)
+                return log_debug_errno(errno, "Failed to parse %s: %m", name);
+
+        if (a == 0 && b == 0 && c == UINT32_MAX) {
+                /* The kernel calls mappings_overlap() and does not allow overlaps */
+                log_debug("%s has a full 1:1 mapping", name);
+                return false;
+        }
+
+        /* Anything else implies that we are in a user namespace */
+        log_debug("Mapping found in %s, we're in a user namespace", name);
+        return true;
+}
+
+int running_in_userns(void) {
+        _cleanup_free_ char *line = NULL;
+        int r;
+
+        r = userns_has_mapping("/proc/self/uid_map");
+        if (r != 0)
+                return r;
+
+        r = userns_has_mapping("/proc/self/gid_map");
+        if (r != 0)
+                return r;
+
+        /* "setgroups" file was added in kernel v3.18-rc6-15-g9cc46516dd. It is also
+         * possible to compile a kernel without CONFIG_USER_NS, in which case "setgroups"
+         * also does not exist. We cannot distinguish those two cases, so assume that
+         * we're running on a stripped-down recent kernel, rather than on an old one,
+         * and if the file is not found, return false.
+         */
+        r = read_one_line_file("/proc/self/setgroups", &line);
+        if (r < 0) {
+                log_debug_errno(r, "/proc/self/setgroups: %m");
+                return r == -ENOENT ? false : r;
+        }
+
+        truncate_nl(line);
+        r = streq(line, "deny");
+        /* See user_namespaces(7) for a description of this "setgroups" contents. */
+        log_debug("/proc/self/setgroups contains \"%s\", %s user namespace", line, r ? "in" : "not in");
+        return r;
+}
+
 int running_in_chroot(void) {
         int ret;
 
-        ret = files_same("/proc/1/root", "/");
+        if (getenv_bool("SYSTEMD_IGNORE_CHROOT") > 0)
+                return 0;
+
+        ret = files_same("/proc/1/root", "/", 0);
         if (ret < 0)
                 return ret;
 
@@ -502,6 +593,7 @@ static const char *const virtualization_table[_VIRTUALIZATION_MAX] = {
         [VIRTUALIZATION_MICROSOFT] = "microsoft",
         [VIRTUALIZATION_ZVM] = "zvm",
         [VIRTUALIZATION_PARALLELS] = "parallels",
+        [VIRTUALIZATION_BHYVE] = "bhyve",
         [VIRTUALIZATION_VM_OTHER] = "vm-other",
 
         [VIRTUALIZATION_SYSTEMD_NSPAWN] = "systemd-nspawn",
index a538f07..7d15169 100644 (file)
@@ -37,6 +37,7 @@ enum {
         VIRTUALIZATION_MICROSOFT,
         VIRTUALIZATION_ZVM,
         VIRTUALIZATION_PARALLELS,
+        VIRTUALIZATION_BHYVE,
         VIRTUALIZATION_VM_OTHER,
         VIRTUALIZATION_VM_LAST = VIRTUALIZATION_VM_OTHER,
 
@@ -66,6 +67,7 @@ int detect_vm(void);
 int detect_container(void);
 int detect_virtualization(void);
 
+int running_in_userns(void);
 int running_in_chroot(void);
 
 const char *virtualization_to_string(int v) _const_;
index 37fa049..233bc80 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <assert.h>
-#include <blkid/blkid.h>
+#include <blkid.h>
 #include <ctype.h>
 #include <dirent.h>
 #include <errno.h>
 #include <ftw.h>
 #include <getopt.h>
 #include <limits.h>
+#include <linux/magic.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 
 #include "alloc-util.h"
 #include "blkid-util.h"
+#include "copy.h"
 #include "dirent-util.h"
 #include "efivars.h"
 #include "fd-util.h"
 #include "fileio.h"
+#include "fs-util.h"
 #include "locale-util.h"
+#include "parse-util.h"
 #include "rm-rf.h"
+#include "stat-util.h"
 #include "string-util.h"
+#include "strv.h"
+#include "umask-util.h"
 #include "util.h"
+#include "verbs.h"
+#include "virt.h"
+
+static char *arg_path = NULL;
+static bool arg_touch_variables = true;
+
+static int verify_esp(
+                bool searching,
+                const char *p,
+                uint32_t *ret_part,
+                uint64_t *ret_pstart,
+                uint64_t *ret_psize,
+                sd_id128_t *ret_uuid) {
 
-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;
-        _cleanup_free_ char *t = NULL;
         _cleanup_blkid_free_probe_ blkid_probe b = NULL;
-        int r;
+        _cleanup_free_ char *t = NULL;
+        uint64_t pstart = 0, psize = 0;
+        struct stat st, st2;
         const char *v, *t2;
+        struct statfs sfs;
+        sd_id128_t uuid = SD_ID128_NULL;
+        uint32_t part = 0;
+        bool quiet;
+        int r;
 
-        if (statfs(p, &sfs) < 0)
-                return log_error_errno(errno, "Failed to check file system type of \"%s\": %m", p);
+        assert(p);
+
+        /* Non-root user can run only `bootctl status`, then if error occured in the following, it does not cause any issues.
+         * So, let's silence the error messages. */
+        quiet = (geteuid() != 0);
+
+        if (statfs(p, &sfs) < 0) {
+
+                /* If we are searching for the mount point, don't generate a log message if we can't find the path */
+                if (errno == ENOENT && searching)
+                        return -ENOENT;
+
+                return log_full_errno(quiet && errno == EACCES ? LOG_DEBUG : LOG_ERR, errno,
+                                      "Failed to check file system type of \"%s\": %m", p);
+        }
+
+        if (!F_TYPE_EQUAL(sfs.f_type, MSDOS_SUPER_MAGIC)) {
+
+                if (searching)
+                        return -EADDRNOTAVAIL;
 
-        if (sfs.f_type != 0x4d44) {
                 log_error("File system \"%s\" is not a FAT EFI System Partition (ESP) file system.", p);
                 return -ENODEV;
         }
 
         if (stat(p, &st) < 0)
-                return log_error_errno(errno, "Failed to determine block device node of \"%s\": %m", p);
+                return log_full_errno(quiet && errno == EACCES ? LOG_DEBUG : LOG_ERR, errno,
+                                      "Failed to determine block device node of \"%s\": %m", p);
 
         if (major(st.st_dev) == 0) {
                 log_error("Block device node of %p is invalid.", p);
@@ -73,25 +113,27 @@ static int verify_esp(const char *p, uint32_t *part, uint64_t *pstart, uint64_t
         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);
+                return log_full_errno(quiet && errno == EACCES ? LOG_DEBUG : LOG_ERR, errno,
+                                      "Failed to determine block device node of parent of \"%s\": %m", p);
 
         if (st.st_dev == st2.st_dev) {
                 log_error("Directory \"%s\" is not the root of the EFI System Partition (ESP) file system.", p);
                 return -ENODEV;
         }
 
+        /* In a container we don't have access to block devices, skip this part of the verification, we trust the
+         * container manager set everything up correctly on its own. Also skip the following verification for non-root user. */
+        if (detect_container() > 0 || geteuid() != 0)
+                goto finish;
+
         r = asprintf(&t, "/dev/block/%u:%u", major(st.st_dev), minor(st.st_dev));
         if (r < 0)
                 return log_oom();
 
         errno = 0;
         b = blkid_new_probe_from_filename(t);
-        if (!b) {
-                if (errno == 0)
-                        return log_oom();
-
-                return log_error_errno(errno, "Failed to open file system \"%s\": %m", p);
-        }
+        if (!b)
+                return log_error_errno(errno ?: ENOMEM, "Failed to open file system \"%s\": %m", p);
 
         blkid_probe_enable_superblocks(b, 1);
         blkid_probe_set_superblocks_flags(b, BLKID_SUBLKS_TYPE);
@@ -106,18 +148,13 @@ static int verify_esp(const char *p, uint32_t *part, uint64_t *pstart, uint64_t
         } else if (r == 1) {
                 log_error("File system \"%s\" does not contain a label.", p);
                 return -ENODEV;
-        } else if (r != 0) {
-                r = errno ? -errno : -EIO;
-                return log_error_errno(r, "Failed to probe file system \"%s\": %m", p);
-        }
+        } else if (r != 0)
+                return log_error_errno(errno ?: EIO, "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;
-                return log_error_errno(r, "Failed to probe file system type \"%s\": %m", p);
-        }
-
+        if (r != 0)
+                return log_error_errno(errno ?: EIO, "Failed to probe file system type \"%s\": %m", p);
         if (!streq(v, "vfat")) {
                 log_error("File system \"%s\" is not FAT.", p);
                 return -ENODEV;
@@ -125,11 +162,8 @@ static int verify_esp(const char *p, uint32_t *part, uint64_t *pstart, uint64_t
 
         errno = 0;
         r = blkid_probe_lookup_value(b, "PART_ENTRY_SCHEME", &v, NULL);
-        if (r != 0) {
-                r = errno ? -errno : -EIO;
-                return log_error_errno(r, "Failed to probe partition scheme \"%s\": %m", p);
-        }
-
+        if (r != 0)
+                return log_error_errno(errno ?: EIO, "Failed to probe partition scheme \"%s\": %m", p);
         if (!streq(v, "gpt")) {
                 log_error("File system \"%s\" is not on a GPT partition table.", p);
                 return -ENODEV;
@@ -137,11 +171,8 @@ static int verify_esp(const char *p, uint32_t *part, uint64_t *pstart, uint64_t
 
         errno = 0;
         r = blkid_probe_lookup_value(b, "PART_ENTRY_TYPE", &v, NULL);
-        if (r != 0) {
-                r = errno ? -errno : -EIO;
-                return log_error_errno(r, "Failed to probe partition type UUID \"%s\": %m", p);
-        }
-
+        if (r != 0)
+                return log_error_errno(errno ?: EIO, "Failed to probe partition type UUID \"%s\": %m", p);
         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;
@@ -149,12 +180,9 @@ static int verify_esp(const char *p, uint32_t *part, uint64_t *pstart, uint64_t
 
         errno = 0;
         r = blkid_probe_lookup_value(b, "PART_ENTRY_UUID", &v, NULL);
-        if (r != 0) {
-                r = errno ? -errno : -EIO;
-                return log_error_errno(r, "Failed to probe partition entry UUID \"%s\": %m", p);
-        }
-
-        r = sd_id128_from_string(v, uuid);
+        if (r != 0)
+                return log_error_errno(errno ?: EIO, "Failed to probe partition entry UUID \"%s\": %m", p);
+        r = sd_id128_from_string(v, &uuid);
         if (r < 0) {
                 log_error("Partition \"%s\" has invalid UUID \"%s\".", p, v);
                 return -EIO;
@@ -162,31 +190,68 @@ static int verify_esp(const char *p, uint32_t *part, uint64_t *pstart, uint64_t
 
         errno = 0;
         r = blkid_probe_lookup_value(b, "PART_ENTRY_NUMBER", &v, NULL);
-        if (r != 0) {
-                r = errno ? -errno : -EIO;
-                return log_error_errno(r, "Failed to probe partition number \"%s\": m", p);
-        }
-        *part = strtoul(v, NULL, 10);
+        if (r != 0)
+                return log_error_errno(errno ?: EIO, "Failed to probe partition number \"%s\": m", p);
+        r = safe_atou32(v, &part);
+        if (r < 0)
+                return log_error_errno(r, "Failed to parse PART_ENTRY_NUMBER field.");
 
         errno = 0;
         r = blkid_probe_lookup_value(b, "PART_ENTRY_OFFSET", &v, NULL);
-        if (r != 0) {
-                r = errno ? -errno : -EIO;
-                return log_error_errno(r, "Failed to probe partition offset \"%s\": %m", p);
-        }
-        *pstart = strtoul(v, NULL, 10);
+        if (r != 0)
+                return log_error_errno(errno ?: EIO, "Failed to probe partition offset \"%s\": %m", p);
+        r = safe_atou64(v, &pstart);
+        if (r < 0)
+                return log_error_errno(r, "Failed to parse PART_ENTRY_OFFSET field.");
 
         errno = 0;
         r = blkid_probe_lookup_value(b, "PART_ENTRY_SIZE", &v, NULL);
-        if (r != 0) {
-                r = errno ? -errno : -EIO;
-                return log_error_errno(r, "Failed to probe partition size \"%s\": %m", p);
-        }
-        *psize = strtoul(v, NULL, 10);
+        if (r != 0)
+                return log_error_errno(errno ?: EIO, "Failed to probe partition size \"%s\": %m", p);
+        r = safe_atou64(v, &psize);
+        if (r < 0)
+                return log_error_errno(r, "Failed to parse PART_ENTRY_SIZE field.");
+
+finish:
+        if (ret_part)
+                *ret_part = part;
+        if (ret_pstart)
+                *ret_pstart = pstart;
+        if (ret_psize)
+                *ret_psize = psize;
+        if (ret_uuid)
+                *ret_uuid = uuid;
 
         return 0;
 }
 
+static int find_esp(uint32_t *part, uint64_t *pstart, uint64_t *psize, sd_id128_t *uuid) {
+        const char *path;
+        int r;
+
+        if (arg_path)
+                return verify_esp(false, arg_path, part, pstart, psize, uuid);
+
+        FOREACH_STRING(path, "/efi", "/boot", "/boot/efi") {
+
+                r = verify_esp(true, path, part, pstart, psize, uuid);
+                if (IN_SET(r, -ENOENT, -EADDRNOTAVAIL)) /* This one is not it */
+                        continue;
+                if (r < 0)
+                        return r;
+
+                arg_path = strdup(path);
+                if (!arg_path)
+                        return log_oom();
+
+                log_info("Using EFI System Partition at %s.", path);
+                return 0;
+        }
+
+        log_error("Couldn't find EFI system partition. It is recommended to mount it to /boot. Alternatively, use --path= to specify path to mount point.");
+        return -ENOENT;
+}
+
 /* search for "#### LoaderInfo: systemd-boot 218 ####" string inside the binary */
 static int get_file_version(int fd, char **v) {
         struct stat st;
@@ -199,14 +264,16 @@ static int get_file_version(int fd, char **v) {
         assert(v);
 
         if (fstat(fd, &st) < 0)
-                return -errno;
+                return log_error_errno(errno, "Failed to stat EFI binary: %m");
 
-        if (st.st_size < 27)
+        if (st.st_size < 27) {
+                *v = NULL;
                 return 0;
+        }
 
         buf = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
         if (buf == MAP_FAILED)
-                return -errno;
+                return log_error_errno(errno, "Failed to memory map EFI binary: %m");
 
         s = memmem(buf, st.st_size - 8, "#### LoaderInfo: ", 17);
         if (!s)
@@ -228,7 +295,7 @@ static int get_file_version(int fd, char **v) {
         r = 1;
 
 finish:
-        munmap(buf, st.st_size);
+        (void) munmap(buf, st.st_size);
         *v = x;
         return r;
 }
@@ -280,7 +347,15 @@ static int status_binaries(const char *esp_path, sd_id128_t partition) {
 
         printf("Boot Loader Binaries:\n");
 
-        printf("          ESP: /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(partition));
+        if (!esp_path) {
+                printf("          ESP: Cannot find or access mount point of ESP.\n\n");
+                return -ENOENT;
+        }
+
+        printf("          ESP: %s", esp_path);
+        if (!sd_id128_is_null(partition))
+                printf(" (/dev/disk/by-partuuid/%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x)", SD_ID128_FORMAT_VAL(partition));
+        printf("\n");
 
         r = enumerate_binaries(esp_path, "EFI/systemd", NULL);
         if (r == 0)
@@ -331,16 +406,12 @@ static int status_variables(void) {
         _cleanup_free_ uint16_t *options = NULL, *order = NULL;
         int i;
 
-        if (!is_efi_boot()) {
-                log_notice("Not booted with EFI, not showing EFI variables.");
-                return 0;
-        }
-
         n_options = efi_get_boot_options(&options);
         if (n_options == -ENOENT)
-                return log_error_errno(ENOENT, "Failed to access EFI variables, efivarfs"
+                return log_error_errno(n_options,
+                                       "Failed to access EFI variables, efivarfs"
                                        " needs to be available at /sys/firmware/efi/efivars/.");
-        else if (n_options < 0)
+        if (n_options < 0)
                 return log_error_errno(n_options, "Failed to read EFI boot entries: %m");
 
         n_order = efi_get_boot_order(&order);
@@ -360,10 +431,11 @@ static int status_variables(void) {
 
                 for (j = 0; j < n_order; j++)
                         if (options[i] == order[j])
-                                goto next;
+                                goto next_option;
 
                 print_efi_option(options[i], false);
-        next:
+
+        next_option:
                 continue;
         }
 
@@ -396,16 +468,16 @@ static int compare_version(const char *a, const char *b) {
         return strverscmp(a, b);
 }
 
-static int version_check(int fd, const char *from, const char *to) {
+static int version_check(int fd_from, const char *from, int fd_to, const char *to) {
         _cleanup_free_ char *a = NULL, *b = NULL;
-        _cleanup_close_ int fd2 = -1;
         int r;
 
-        assert(fd >= 0);
+        assert(fd_from >= 0);
         assert(from);
+        assert(fd_to >= 0);
         assert(to);
 
-        r = get_file_version(fd, &a);
+        r = get_file_version(fd_from, &a);
         if (r < 0)
                 return r;
         if (r == 0) {
@@ -413,15 +485,7 @@ static int version_check(int fd, const char *from, const char *to) {
                 return -EINVAL;
         }
 
-        fd2 = open(to, O_RDONLY|O_CLOEXEC);
-        if (fd2 < 0) {
-                if (errno == ENOENT)
-                        return 0;
-
-                return log_error_errno(errno, "Failed to open \"%s\" for reading: %m", to);
-        }
-
-        r = get_file_version(fd2, &b);
+        r = get_file_version(fd_to, &b);
         if (r < 0)
                 return r;
         if (r == 0 || compare_product(a, b) != 0) {
@@ -437,99 +501,59 @@ static int version_check(int fd, const char *from, const char *to) {
         return 0;
 }
 
-static int copy_file(const char *from, const char *to, bool force) {
-        _cleanup_fclose_ FILE *f = NULL, *g = NULL;
-        char *p;
+static int copy_file_with_version_check(const char *from, const char *to, bool force) {
+        _cleanup_close_ int fd_from = -1, fd_to = -1;
+        _cleanup_free_ char *t = NULL;
         int r;
-        struct timespec t[2];
-        struct stat st;
-
-        assert(from);
-        assert(to);
 
-        f = fopen(from, "re");
-        if (!f)
+        fd_from = open(from, O_RDONLY|O_CLOEXEC|O_NOCTTY);
+        if (fd_from < 0)
                 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(fileno(f), from, to);
-                if (r < 0)
-                        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)
-                        return 0;
-
-                return log_error_errno(errno, "Failed to open \"%s\" for writing: %m", to);
-        }
+                fd_to = open(to, O_RDONLY|O_CLOEXEC|O_NOCTTY);
+                if (fd_to < 0) {
+                        if (errno != -ENOENT)
+                                return log_error_errno(errno, "Failed to open \"%s\" for reading: %m", to);
+                } else {
+                        r = version_check(fd_from, from, fd_to, to);
+                        if (r < 0)
+                                return r;
 
-        rewind(f);
-        do {
-                size_t k;
-                uint8_t buf[32*1024];
+                        if (lseek(fd_from, 0, SEEK_SET) == (off_t) -1)
+                                return log_error_errno(errno, "Failed to seek in \%s\": %m", from);
 
-                k = fread(buf, 1, sizeof(buf), f);
-                if (ferror(f)) {
-                        r = log_error_errno(EIO, "Failed to read \"%s\": %m", from);
-                        goto error;
+                        fd_to = safe_close(fd_to);
                 }
+        }
 
-                if (k == 0)
-                        break;
-
-                fwrite(buf, 1, k, g);
-                if (ferror(g)) {
-                        r = log_error_errno(EIO, "Failed to write \"%s\": %m", to);
-                        goto error;
-                }
-        } while (!feof(f));
+        r = tempfn_random(to, NULL, &t);
+        if (r < 0)
+                return log_oom();
 
-        r = fflush_and_check(g);
-        if (r < 0) {
-                log_error_errno(r, "Failed to write \"%s\": %m", to);
-                goto error;
+        RUN_WITH_UMASK(0000) {
+                fd_to = open(t, O_WRONLY|O_CREAT|O_CLOEXEC|O_EXCL|O_NOFOLLOW, 0644);
+                if (fd_to < 0)
+                        return log_error_errno(errno, "Failed to open \"%s\" for writing: %m", t);
         }
 
-        r = fstat(fileno(f), &st);
+        r = copy_bytes(fd_from, fd_to, (uint64_t) -1, COPY_REFLINK);
         if (r < 0) {
-                r = log_error_errno(errno, "Failed to get file timestamps of \"%s\": %m", from);
-                goto error;
+                unlink(t);
+                return log_error_errno(errno, "Failed to copy data from \"%s\" to \"%s\": %m", from, t);
         }
 
-        t[0] = st.st_atim;
-        t[1] = st.st_mtim;
+        (void) copy_times(fd_from, fd_to);
 
-        r = futimens(fileno(g), t);
+        r = renameat(AT_FDCWD, t, AT_FDCWD, to);
         if (r < 0) {
-                r = log_error_errno(errno, "Failed to set file timestamps on \"%s\": %m", p);
-                goto error;
-        }
-
-        if (rename(p, to) < 0) {
-                r = log_error_errno(errno, "Failed to rename \"%s\" to \"%s\": %m", p, to);
-                goto error;
+                (void) unlink_noerrno(t);
+                return log_error_errno(errno, "Failed to rename \"%s\" to \"%s\": %m", t, to);
         }
 
         log_info("Copied \"%s\" to \"%s\".", from, to);
-        return 0;
 
-error:
-        (void) unlink(p);
-        return r;
-}
-
-static char* strupper(char *s) {
-        char *p;
-
-        for (p = s; *p; p++)
-                *p = toupper(*p);
-
-        return s;
+        return 0;
 }
 
 static int mkdir_one(const char *prefix, const char *suffix) {
@@ -550,15 +574,16 @@ static const char *efi_subdirs[] = {
         "EFI/systemd",
         "EFI/BOOT",
         "loader",
-        "loader/entries"
+        "loader/entries",
+        NULL
 };
 
 static int create_dirs(const char *esp_path) {
+        const char **i;
         int r;
-        unsigned i;
 
-        for (i = 0; i < ELEMENTSOF(efi_subdirs); i++) {
-                r = mkdir_one(esp_path, efi_subdirs[i]);
+        STRV_FOREACH(i, efi_subdirs) {
+                r = mkdir_one(esp_path, *i);
                 if (r < 0)
                         return r;
         }
@@ -572,7 +597,7 @@ static int copy_one_file(const char *esp_path, const char *name, bool force) {
 
         p = strjoina(BOOTLIBDIR "/", name);
         q = strjoina(esp_path, "/EFI/systemd/", name);
-        r = copy_file(p, q, force);
+        r = copy_file_with_version_check(p, q, force);
 
         if (startswith(name, "systemd-boot")) {
                 int k;
@@ -580,9 +605,9 @@ static int copy_one_file(const char *esp_path, const char *name, bool force) {
 
                 /* Create the EFI default boot loader name (specified for removable devices) */
                 v = strjoina(esp_path, "/EFI/BOOT/BOOT", name + strlen("systemd-boot"));
-                strupper(strrchr(v, '/') + 1);
+                ascii_strupper(strrchr(v, '/') + 1);
 
-                k = copy_file(p, v, force);
+                k = copy_file_with_version_check(p, v, force);
                 if (k < 0 && r == 0)
                         r = k;
         }
@@ -751,8 +776,8 @@ static int install_variables(const char *esp_path,
         if (access(p, F_OK) < 0) {
                 if (errno == ENOENT)
                         return 0;
-                else
-                        return log_error_errno(errno, "Cannot access \"%s\": %m", p);
+
+                return log_error_errno(errno, "Cannot access \"%s\": %m", p);
         }
 
         r = find_slot(uuid, path, &slot);
@@ -762,7 +787,7 @@ static int install_variables(const char *esp_path,
                                        "Failed to access EFI variables. Is the \"efivarfs\" filesystem mounted?" :
                                        "Failed to determine current boot order: %m");
 
-        if (first || r == false) {
+        if (first || r == 0) {
                 r = efi_add_boot_option(slot, "Linux Boot Manager",
                                         part, pstart, psize,
                                         uuid, path);
@@ -846,7 +871,7 @@ static int remove_binaries(const char *esp_path) {
         if (q < 0 && r == 0)
                 r = q;
 
-        for (i = ELEMENTSOF(efi_subdirs); i > 0; i--) {
+        for (i = ELEMENTSOF(efi_subdirs)-1; i > 0; i--) {
                 q = rmdir_one(esp_path, efi_subdirs[i-1]);
                 if (q < 0 && r == 0)
                         r = q;
@@ -872,46 +897,58 @@ static int remove_variables(sd_id128_t uuid, const char *path, bool in_order) {
 
         if (in_order)
                 return remove_from_order(slot);
-        else
-                return 0;
+
+        return 0;
 }
 
 static int install_loader_config(const char *esp_path) {
-        char *p;
-        char line[64];
-        char *machine = NULL;
-        _cleanup_fclose_ FILE *f = NULL, *g = NULL;
-
-        f = fopen("/etc/machine-id", "re");
-        if (!f)
-                return errno == ENOENT ? 0 : -errno;
-
-        if (fgets(line, sizeof(line), f) != NULL) {
-                char *s;
-
-                s = strchr(line, '\n');
-                if (s)
-                        s[0] = '\0';
-                if (strlen(line) == 32)
-                        machine = line;
-        }
 
-        if (!machine)
-                return -ESRCH;
+        char machine_string[SD_ID128_STRING_MAX];
+        _cleanup_(unlink_and_freep) char *t = NULL;
+        _cleanup_fclose_ FILE *f = NULL;
+        sd_id128_t machine_id;
+        const char *p;
+        int r, fd;
+
+        r = sd_id128_get_machine(&machine_id);
+        if (r < 0)
+                return log_error_errno(r, "Failed to get machine did: %m");
 
         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);
+
+        if (access(p, F_OK) >= 0) /* Silently skip creation if the file already exists (early check) */
+                return 0;
+
+        fd = open_tmpfile_linkable(p, O_WRONLY|O_CLOEXEC, &t);
+        if (fd < 0)
+                return log_error_errno(fd, "Failed to open \"%s\" for writing: %m", p);
+
+        f = fdopen(fd, "we");
+        if (!f) {
+                safe_close(fd);
+                return log_oom();
         }
 
-        return 0;
+        fprintf(f, "#timeout 3\n");
+        fprintf(f, "default %s-*\n", sd_id128_to_string(machine_id, machine_string));
+
+        r = fflush_and_check(f);
+        if (r < 0)
+                return log_error_errno(r, "Failed to write \"%s\": %m", p);
+
+        r = link_tmpfile(fd, t, p);
+        if (r == -EEXIST)
+                return 0; /* Silently skip creation if the file exists now (recheck) */
+        if (r < 0)
+                return log_error_errno(r, "Failed to move \"%s\" into place: %m", p);
+
+        t = mfree(t);
+
+        return 1;
 }
 
-static int help(void) {
+static int help(int argc, char *argv[], void *userdata) {
+
         printf("%s [COMMAND] [OPTIONS...]\n"
                "\n"
                "Install, update or remove the systemd-boot EFI boot manager.\n\n"
@@ -930,9 +967,6 @@ static int help(void) {
         return 0;
 }
 
-static const char *arg_path = "/boot";
-static bool arg_touch_variables = true;
-
 static int parse_argv(int argc, char *argv[]) {
         enum {
                 ARG_PATH = 0x100,
@@ -948,7 +982,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { NULL,           0,                 NULL, 0                }
         };
 
-        int c;
+        int c, r;
 
         assert(argc >= 0);
         assert(argv);
@@ -957,14 +991,16 @@ static int parse_argv(int argc, char *argv[]) {
                 switch (c) {
 
                 case 'h':
-                        help();
+                        help(0, NULL, NULL);
                         return 0;
 
                 case ARG_VERSION:
                         return version();
 
                 case ARG_PATH:
-                        arg_path = optarg;
+                        r = free_and_strdup(&arg_path, optarg);
+                        if (r < 0)
+                                return log_oom();
                         break;
 
                 case ARG_NO_VARIABLES:
@@ -989,149 +1025,167 @@ static void read_loader_efi_var(const char *name, char **var) {
                 log_warning_errno(r, "Failed to read EFI variable %s: %m", name);
 }
 
-static int bootctl_main(int argc, char*argv[]) {
-        enum action {
-                ACTION_STATUS,
-                ACTION_INSTALL,
-                ACTION_UPDATE,
-                ACTION_REMOVE
-        } arg_action = ACTION_STATUS;
-        static const struct {
-                const char* verb;
-                enum action action;
-        } verbs[] = {
-                { "status",  ACTION_STATUS },
-                { "install", ACTION_INSTALL },
-                { "update",  ACTION_UPDATE },
-                { "remove",  ACTION_REMOVE },
-        };
+static int must_be_root(void) {
 
-        sd_id128_t uuid = {};
-        uint32_t part = 0;
-        uint64_t pstart = 0, psize = 0;
-        int r, q;
+        if (geteuid() == 0)
+                return 0;
 
-        if (argv[optind]) {
-                unsigned i;
+        log_error("Need to be root.");
+        return -EPERM;
+}
 
-                for (i = 0; i < ELEMENTSOF(verbs); i++) {
-                        if (!streq(argv[optind], verbs[i].verb))
-                                continue;
-                        arg_action = verbs[i].action;
-                        break;
-                }
-                if (i >= ELEMENTSOF(verbs)) {
-                        log_error("Unknown operation \"%s\"", argv[optind]);
-                        return -EINVAL;
-                }
-        }
+static int verb_status(int argc, char *argv[], void *userdata) {
 
-        if (geteuid() != 0)
-                return log_error_errno(EPERM, "Need to be root.");
+        sd_id128_t uuid = SD_ID128_NULL;
+        int r, r2;
 
-        r = verify_esp(arg_path, &part, &pstart, &psize, &uuid);
-        if (r == -ENODEV && !arg_path)
-                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)
-                return r;
+        r2 = find_esp(NULL, NULL, NULL, &uuid);
 
-        switch (arg_action) {
-        case ACTION_STATUS: {
-                _cleanup_free_ char *fw_type = NULL;
-                _cleanup_free_ char *fw_info = NULL;
-                _cleanup_free_ char *loader = NULL;
-                _cleanup_free_ char *loader_path = NULL;
-                sd_id128_t loader_part_uuid = {};
-
-                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");
+        if (is_efi_boot()) {
+                _cleanup_free_ char *fw_type = NULL, *fw_info = NULL, *loader = NULL, *loader_path = NULL;
+                sd_id128_t loader_part_uuid = SD_ID128_NULL;
 
-                        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_is_null(loader_part_uuid))
-                                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", special_glyph(TREE_RIGHT), strna(loader_path));
-                        printf("\n");
-                } else
-                        printf("System:\n    Not booted with EFI\n");
-
-                r = status_binaries(arg_path, uuid);
+                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)
+                        r2 = 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)
-                        return r;
+                        r2 = log_warning_errno(r, "Failed to query secure boot status: %m");
+                else
+                        printf("  Secure Boot: %sd\n", enable_disable(r));
+
+                r = is_efi_secure_boot_setup_mode();
+                if (r < 0)
+                        r2 = log_warning_errno(r, "Failed to query secure boot mode: %m");
+                else
+                        printf("   Setup Mode: %s\n", r ? "setup" : "user");
+                printf("\n");
+
+                printf("Current Loader:\n");
+                printf("      Product: %s\n", strna(loader));
+                if (!sd_id128_is_null(loader_part_uuid))
+                        printf("          ESP: /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("          ESP: n/a\n");
+                printf("         File: %s%s\n", special_glyph(TREE_RIGHT), strna(loader_path));
+                printf("\n");
+        } else
+                printf("System:\n    Not booted with EFI\n\n");
+
+        r = status_binaries(arg_path, uuid);
+        if (r < 0)
+                r2 = r;
 
-                if (arg_touch_variables)
-                        r = status_variables();
-                break;
+        if (is_efi_boot()) {
+                r = status_variables();
+                if (r < 0)
+                        r2 = r;
         }
 
-        case ACTION_INSTALL:
-        case ACTION_UPDATE:
-                umask(0002);
+        return r2;
+}
+
+static int verb_install(int argc, char *argv[], void *userdata) {
+
+        sd_id128_t uuid = SD_ID128_NULL;
+        uint64_t pstart = 0, psize = 0;
+        uint32_t part = 0;
+        bool install;
+        int r;
+
+        r = must_be_root();
+        if (r < 0)
+                return r;
+
+        r = find_esp(&part, &pstart, &psize, &uuid);
+        if (r < 0)
+                return r;
+
+        install = streq(argv[0], "install");
 
-                r = install_binaries(arg_path, arg_action == ACTION_INSTALL);
+        RUN_WITH_UMASK(0002) {
+                r = install_binaries(arg_path, install);
                 if (r < 0)
                         return r;
 
-                if (arg_action == ACTION_INSTALL) {
+                if (install) {
                         r = install_loader_config(arg_path);
                         if (r < 0)
                                 return r;
                 }
+        }
 
-                if (arg_touch_variables)
-                        r = install_variables(arg_path,
-                                              part, pstart, psize, uuid,
-                                              "/EFI/systemd/systemd-boot" EFI_MACHINE_TYPE_NAME ".efi",
-                                              arg_action == ACTION_INSTALL);
-                break;
+        if (arg_touch_variables)
+                r = install_variables(arg_path,
+                                      part, pstart, psize, uuid,
+                                      "/EFI/systemd/systemd-boot" EFI_MACHINE_TYPE_NAME ".efi",
+                                      install);
 
-        case ACTION_REMOVE:
-                r = remove_binaries(arg_path);
+        return r;
+}
 
-                if (arg_touch_variables) {
-                        q = remove_variables(uuid, "/EFI/systemd/systemd-boot" EFI_MACHINE_TYPE_NAME ".efi", true);
-                        if (q < 0 && r == 0)
-                                r = q;
-                }
-                break;
+static int verb_remove(int argc, char *argv[], void *userdata) {
+        sd_id128_t uuid = SD_ID128_NULL;
+        int r;
+
+        r = must_be_root();
+        if (r < 0)
+                return r;
+
+        r = find_esp(NULL, NULL, NULL, &uuid);
+        if (r < 0)
+                return r;
+
+        r = remove_binaries(arg_path);
+
+        if (arg_touch_variables) {
+                int q;
+
+                q = remove_variables(uuid, "/EFI/systemd/systemd-boot" EFI_MACHINE_TYPE_NAME ".efi", true);
+                if (q < 0 && r == 0)
+                        r = q;
         }
 
         return r;
 }
 
+static int bootctl_main(int argc, char *argv[]) {
+
+        static const Verb verbs[] = {
+                { "help",            VERB_ANY, VERB_ANY, 0,            help         },
+                { "status",          VERB_ANY, 1,        VERB_DEFAULT, verb_status  },
+                { "install",         VERB_ANY, 1,        0,            verb_install },
+                { "update",          VERB_ANY, 1,        0,            verb_install },
+                { "remove",          VERB_ANY, 1,        0,            verb_remove  },
+                {}
+        };
+
+        return dispatch_verb(argc, argv, verbs, NULL);
+}
+
 int main(int argc, char *argv[]) {
         int r;
 
         log_parse_environment();
         log_open();
 
+        /* If we run in a container, automatically turn of EFI file system access */
+        if (detect_container() > 0)
+                arg_touch_variables = false;
+
         r = parse_argv(argc, argv);
         if (r <= 0)
                 goto finish;
@@ -1139,5 +1193,6 @@ int main(int argc, char *argv[]) {
         r = bootctl_main(argc, argv);
 
  finish:
+        free(arg_path);
         return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }
index 30c1ead..1e990b3 100644 (file)
 #include "disk.h"
 #include "graphics.h"
 #include "linux.h"
-#include "pefile.h"
-#include "util.h"
 #include "measure.h"
+#include "pe.h"
+#include "shim.h"
+#include "util.h"
 
 #ifndef EFI_OS_INDICATIONS_BOOT_TO_FW_UI
 #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001ULL
 #endif
 
 /* magic string to find in the binary image */
-static const char __attribute__((used)) magic[] = "#### LoaderInfo: systemd-boot " VERSION " ####";
+static const char __attribute__((used)) magic[] = "#### LoaderInfo: systemd-boot " PACKAGE_VERSION " ####";
 
 static const EFI_GUID global_guid = EFI_GLOBAL_VARIABLE;
 
@@ -363,7 +364,7 @@ static VOID print_status(Config *config, CHAR16 *loaded_image_path) {
         uefi_call_wrapper(ST->ConOut->SetAttribute, 2, ST->ConOut, EFI_LIGHTGRAY|EFI_BACKGROUND_BLACK);
         uefi_call_wrapper(ST->ConOut->ClearScreen, 1, ST->ConOut);
 
-        Print(L"systemd-boot version:   " VERSION "\n");
+        Print(L"systemd-boot version:   " PACKAGE_VERSION "\n");
         Print(L"architecture:           " EFI_MACHINE_TYPE_NAME "\n");
         Print(L"loaded image:           %s\n", loaded_image_path);
         Print(L"UEFI specification:     %d.%02d\n", ST->Hdr.Revision >> 16, ST->Hdr.Revision & 0xffff);
@@ -383,6 +384,9 @@ static VOID print_status(Config *config, CHAR16 *loaded_image_path) {
                 FreePool(b);
         }
 
+        if (shim_loaded())
+                Print(L"Shim:                   present\n");
+
         if (efivar_get_raw(&global_guid, L"OsIndicationsSupported", &b, &size) == EFI_SUCCESS) {
                 Print(L"OsIndicationsSupported: %d\n", (UINT64)*b);
                 FreePool(b);
@@ -781,7 +785,7 @@ static BOOLEAN menu_run(Config *config, ConfigEntry **chosen_entry, CHAR16 *load
                         break;
 
                 case KEYPRESS(0, 0, 'v'):
-                        status = PoolPrint(L"systemd-boot " VERSION " (" EFI_MACHINE_TYPE_NAME "), UEFI Specification %d.%02d, Vendor %s %d.%02d",
+                        status = PoolPrint(L"systemd-boot " PACKAGE_VERSION " (" EFI_MACHINE_TYPE_NAME "), UEFI Specification %d.%02d, Vendor %s %d.%02d",
                                            ST->Hdr.Revision >> 16, ST->Hdr.Revision & 0xffff,
                                            ST->FirmwareVendor, ST->FirmwareRevision >> 16, ST->FirmwareRevision & 0xffff);
                         break;
@@ -1482,7 +1486,7 @@ static VOID config_entry_add_osx(Config *config) {
                         root = LibOpenRoot(handles[i]);
                         if (!root)
                                 continue;
-                        found = config_entry_add_loader_auto(config, handles[i], root, NULL, L"auto-osx", 'a', L"OS X",
+                        found = config_entry_add_loader_auto(config, handles[i], root, NULL, L"auto-osx", 'a', L"macOS",
                                                              L"\\System\\Library\\CoreServices\\boot.efi");
                         uefi_call_wrapper(root->Close, 1, root);
                         if (found)
@@ -1539,7 +1543,7 @@ static VOID config_entry_add_linux( Config *config, EFI_LOADED_IMAGE *loaded_ima
                                 continue;
 
                         /* look for .osrel and .cmdline sections in the .efi binary */
-                        err = pefile_locate_sections(linux_dir, f->FileName, sections, addrs, offs, szs);
+                        err = pe_file_locate_sections(linux_dir, f->FileName, sections, addrs, offs, szs);
                         if (EFI_ERROR(err))
                                 continue;
 
@@ -1647,7 +1651,7 @@ static EFI_STATUS image_start(EFI_HANDLE parent_image, const Config *config, con
                 loaded_image->LoadOptionsSize = (StrLen(loaded_image->LoadOptions)+1) * sizeof(CHAR16);
 
 #ifdef SD_BOOT_LOG_TPM
-                /* Try to log any options to the TPM, escpecially to catch manually edited options */
+                /* Try to log any options to the TPM, especially to catch manually edited options */
                 err = tpm_log_event(SD_TPM_PCR,
                                     (EFI_PHYSICAL_ADDRESS) loaded_image->LoadOptions,
                                     loaded_image->LoadOptionsSize, loaded_image->LoadOptions);
@@ -1718,7 +1722,7 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
         InitializeLib(image, sys_table);
         init_usec = time_usec();
         efivar_set_time_usec(L"LoaderTimeInitUSec", init_usec);
-        efivar_set(L"LoaderInfo", L"systemd-boot " VERSION, FALSE);
+        efivar_set(L"LoaderInfo", L"systemd-boot " PACKAGE_VERSION, FALSE);
         s = PoolPrint(L"%s %d.%02d", ST->FirmwareVendor, ST->FirmwareRevision >> 16, ST->FirmwareRevision & 0xffff);
         efivar_set(L"LoaderFirmwareInfo", s, FALSE);
         FreePool(s);
@@ -1745,6 +1749,14 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
                 return EFI_LOAD_ERROR;
         }
 
+        if (secure_boot_enabled() && shim_loaded()) {
+                err = security_policy_install();
+                if (EFI_ERROR(err)) {
+                        Print(L"Error installing security policy: %r ", err);
+                        uefi_call_wrapper(BS->Stall, 1, 3 * 1000 * 1000);
+                        return err;
+                }
+        }
 
         /* the filesystem path to this image, to prevent adding ourselves to the menu */
         loaded_image_path = DevicePathToStr(loaded_image->FilePath);
@@ -1787,7 +1799,7 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
 
         config_title_generate(&config);
 
-        /* select entry by configured pattern or EFI LoaderDefaultEntry= variable*/
+        /* select entry by configured pattern or EFI LoaderDefaultEntry= variable */
         config_default_entry_select(&config);
 
         /* if no configured entry to select from was found, enable the menu */
index 7c01638..b22d37b 100644 (file)
@@ -199,7 +199,7 @@ static EFI_STATUS tpm1_measure_to_pcr_and_event_log(const EFI_TCG *tcg, UINT32 p
 
         event_number = 1;
         status = uefi_call_wrapper(tcg->HashLogExtendEvent, 7,
-                                   tcg, buffer, buffer_size, TCG_ALG_SHA, tcg_event, &event_number, &event_log_last);
+                                   (EFI_TCG *) tcg, buffer, buffer_size, TCG_ALG_SHA, tcg_event, &event_number, &event_log_last);
 
         if (EFI_ERROR(status))
                 return status;
@@ -209,12 +209,35 @@ static EFI_STATUS tpm1_measure_to_pcr_and_event_log(const EFI_TCG *tcg, UINT32 p
         return EFI_SUCCESS;
 }
 
+/*
+ * According to TCG EFI Protocol Specification for TPM 2.0 family,
+ * all events generated after the invocation of EFI_TCG2_GET_EVENT_LOG
+ * shall be stored in an instance of an EFI_CONFIGURATION_TABLE aka
+ * EFI TCG 2.0 final events table. Hence, it is necessary to trigger the
+ * internal switch through calling get_event_log() in order to allow
+ * to retrieve the logs from OS runtime.
+ */
+static EFI_STATUS trigger_tcg2_final_events_table(const EFI_TCG2 *tcg)
+{
+        return uefi_call_wrapper(tcg->GetEventLog, 5, (EFI_TCG2 *) tcg,
+                                 EFI_TCG2_EVENT_LOG_FORMAT_TCG_2, NULL,
+                                 NULL, NULL);
+}
 
 static EFI_STATUS tpm2_measure_to_pcr_and_event_log(const EFI_TCG2 *tcg, UINT32 pcrindex, const EFI_PHYSICAL_ADDRESS buffer,
                                                     UINT64 buffer_size, const CHAR16 *description) {
         EFI_STATUS status;
         EFI_TCG2_EVENT *tcg_event;
         UINTN desc_len;
+        static BOOLEAN triggered = FALSE;
+
+        if (triggered == FALSE) {
+                status = trigger_tcg2_final_events_table(tcg);
+                if (EFI_ERROR(status))
+                        return status;
+
+                triggered = TRUE;
+        }
 
         desc_len = StrLen(description) * sizeof(CHAR16);
 
@@ -231,7 +254,7 @@ static EFI_STATUS tpm2_measure_to_pcr_and_event_log(const EFI_TCG2 *tcg, UINT32
 
         CopyMem((VOID *) tcg_event->Event, (VOID *) description, desc_len);
 
-        status = uefi_call_wrapper(tcg->HashLogExtendEvent, 5, tcg, 0, buffer, buffer_size, tcg_event);
+        status = uefi_call_wrapper(tcg->HashLogExtendEvent, 5, (EFI_TCG2 *) tcg, 0, buffer, buffer_size, tcg_event);
 
         uefi_call_wrapper(BS->FreePool, 1, tcg_event);
 
index a2cfe81..43aa8a0 100644 (file)
@@ -13,9 +13,6 @@
 #ifndef __SDBOOT_MEASURE_H
 #define __SDBOOT_MEASURE_H
 
-#ifndef SD_TPM_PCR
-#define SD_TPM_PCR 8
-#endif
-
 EFI_STATUS tpm_log_event(UINT32 pcrindex, const EFI_PHYSICAL_ADDRESS buffer, UINTN buffer_size, const CHAR16 *description);
+
 #endif
diff --git a/src/boot/efi/meson.build b/src/boot/efi/meson.build
new file mode 100644 (file)
index 0000000..5ef5b2d
--- /dev/null
@@ -0,0 +1,205 @@
+efi_headers = files('''
+        console.h
+        disk.h
+        graphics.h
+        linux.h
+        measure.h
+        pe.h
+        splash.h
+        util.h
+        shim.h
+'''.split())
+
+common_sources = '''
+        disk.c
+        graphics.c
+        measure.c
+        pe.c
+        util.c
+'''.split()
+
+systemd_boot_sources = '''
+        boot.c
+        console.c
+        shim.c
+'''.split()
+
+stub_sources = '''
+        linux.c
+        splash.c
+        stub.c
+'''.split()
+
+if conf.get('ENABLE_EFI', false) and get_option('gnu-efi') != 'false'
+        efi_cc = get_option('efi-cc')
+        efi_ld = get_option('efi-ld')
+
+        efi_incdir = get_option('efi-includedir')
+        have_header = (gnu_efi_arch != '' and
+                       cc.has_header('@0@/@1@/efibind.h'.format(efi_incdir, gnu_efi_arch)))
+
+        if have_header and EFI_MACHINE_TYPE_NAME == ''
+                error('gnu-efi is available, but EFI_MACHINE_TYPE_NAME is unknown')
+        endif
+
+        efi_libdir = get_option('efi-libdir')
+        if efi_libdir == ''
+                cmd = 'cd /usr/lib/$(@0@ -print-multi-os-directory) && pwd'.format(efi_cc)
+                ret = run_command('sh', '-c', cmd)
+                if ret.returncode() == 0
+                        efi_libdir = ret.stdout().strip()
+                endif
+        endif
+
+        have_gnu_efi = have_header and efi_libdir != ''
+else
+        have_gnu_efi = false
+endif
+
+if get_option('gnu-efi') == 'true' and not have_gnu_efi
+        error('gnu-efi support requested, but headers were not found')
+endif
+
+if have_gnu_efi
+        efi_conf = configuration_data()
+        efi_conf.set_quoted('PACKAGE_VERSION', meson.project_version())
+        efi_conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
+        efi_conf.set('SD_BOOT_LOG_TPM', get_option('tpm'))
+        efi_conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
+
+        efi_config_h = configure_file(
+                output : 'efi_config.h',
+                configuration : efi_conf)
+
+        objcopy = find_program('objcopy')
+
+        efi_ldsdir = get_option('efi-ldsdir')
+        arch_lds = 'elf_@0@_efi.lds'.format(gnu_efi_arch)
+        if efi_ldsdir == ''
+                efi_ldsdir = join_paths(efi_libdir, 'gnuefi')
+                cmd = run_command('test', '-f', join_paths(efi_ldsdir, arch_lds))
+                if cmd.returncode() != 0
+                        efi_ldsdir = efi_libdir
+                        cmd = run_command('test', '-f', join_paths(efi_ldsdir, arch_lds))
+                        if cmd.returncode() != 0
+                               error('Cannot find @0@'.format(arch_lds))
+                        endif
+                endif
+        endif
+
+        message('efi-libdir: "@0@"'.format(efi_libdir))
+        message('efi-ldsdir: "@0@"'.format(efi_ldsdir))
+        message('efi-includedir: "@0@"'.format(efi_incdir))
+
+        compile_args = ['-Wall',
+                        '-Wextra',
+                        '-std=gnu90',
+                        '-nostdinc',
+                        '-ggdb', '-O0',
+                        '-fpic',
+                        '-fshort-wchar',
+                        '-ffreestanding',
+                        '-fno-strict-aliasing',
+                        '-fno-stack-protector',
+                        '-Wsign-compare',
+                        '-Wno-missing-field-initializers',
+                        '-isystem', efi_incdir,
+                        '-isystem', join_paths(efi_incdir, gnu_efi_arch),
+                        '-include', efi_config_h]
+        if efi_arch == 'x86_64'
+                compile_args += ['-mno-red-zone',
+                                 '-mno-sse',
+                                 '-mno-mmx',
+                                 '-DEFI_FUNCTION_WRAPPER',
+                                 '-DGNU_EFI_USE_MS_ABI']
+        elif efi_arch == 'ia32'
+                compile_args += ['-mno-sse',
+                                 '-mno-mmx']
+        endif
+
+        efi_ldflags = ['-T',
+                       join_paths(efi_ldsdir, arch_lds),
+                       '-shared',
+                       '-Bsymbolic',
+                       '-nostdlib',
+                       '-znocombreloc',
+                       '-L', efi_libdir,
+                       join_paths(efi_ldsdir, 'crt0-efi-@0@.o'.format(gnu_efi_arch))]
+        if efi_arch == 'aarch64' or efi_arch == 'arm'
+                # Aarch64 and ARM32 don't have an EFI capable objcopy. Use 'binary'
+                # instead, and add required symbols manually.
+                efi_ldflags += ['--defsym=EFI_SUBSYSTEM=0xa']
+                efi_format = ['-O', 'binary']
+        else
+                efi_format = ['--target=efi-app-@0@'.format(gnu_efi_arch)]
+        endif
+
+        systemd_boot_objects = []
+        stub_objects = []
+        foreach file : common_sources + systemd_boot_sources + stub_sources
+                o_file = custom_target(file + '.o',
+                                       input : file,
+                                       output : file + '.o',
+                                       command : [efi_cc, '-c', '@INPUT@', '-o', '@OUTPUT@']
+                                                 + compile_args,
+                                       depend_files : efi_headers)
+                if (common_sources + systemd_boot_sources).contains(file)
+                        systemd_boot_objects += [o_file]
+                endif
+                if (common_sources + stub_sources).contains(file)
+                        stub_objects += [o_file]
+                endif
+        endforeach
+
+        libgcc_file_name = run_command(efi_cc, '-print-libgcc-file-name').stdout().strip()
+        systemd_boot_efi_name = 'systemd-boot@0@.efi'.format(EFI_MACHINE_TYPE_NAME)
+        stub_efi_name = 'linux@0@.efi.stub'.format(EFI_MACHINE_TYPE_NAME)
+        no_undefined_symbols = find_program('no-undefined-symbols.sh')
+
+        foreach tuple : [['systemd_boot.so', systemd_boot_efi_name, systemd_boot_objects],
+                         ['stub.so', stub_efi_name, stub_objects]]
+                so = custom_target(
+                        tuple[0],
+                        input : tuple[2],
+                        output : tuple[0],
+                        command : [efi_ld, '-o', '@OUTPUT@'] +
+                                  efi_ldflags + tuple[2] +
+                                  ['-lefi', '-lgnuefi', libgcc_file_name])
+
+                test('no-undefined-symbols-' + tuple[0],
+                     no_undefined_symbols,
+                     args : [so])
+
+                stub = custom_target(
+                        tuple[1],
+                        input : so,
+                        output : tuple[1],
+                        command : [objcopy,
+                                   '-j', '.text',
+                                   '-j', '.sdata',
+                                   '-j', '.data',
+                                   '-j', '.dynamic',
+                                   '-j', '.dynsym',
+                                   '-j', '.rel',
+                                   '-j', '.rela',
+                                   '-j', '.reloc']
+                                  + efi_format +
+                                  ['@INPUT@', '@OUTPUT@'],
+                        install : true,
+                        install_dir : bootlibdir)
+
+                set_variable(tuple[0].underscorify(), so)
+                set_variable(tuple[0].underscorify() + '_stub', stub)
+        endforeach
+endif
+
+############################################################
+
+if have_gnu_efi
+        test_efi_disk_img = custom_target(
+                'test-efi-disk.img',
+                input : [systemd_boot_so, stub_so_stub],
+                output : 'test-efi-disk.img',
+                command : [test_efi_create_disk_sh, '@OUTPUT@',
+                           '@INPUT0@', '@INPUT1@', splash_bmp])
+endif
diff --git a/src/boot/efi/no-undefined-symbols.sh b/src/boot/efi/no-undefined-symbols.sh
new file mode 100755 (executable)
index 0000000..08b266c
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/sh -eu
+
+if nm -D -u "$1" | grep ' U '; then
+        echo "Undefined symbols detected!"
+        exit 1
+fi
similarity index 60%
rename from src/boot/efi/pefile.c
rename to src/boot/efi/pe.c
index 77fff77..054e8ed 100644 (file)
@@ -15,7 +15,7 @@
 #include <efi.h>
 #include <efilib.h>
 
-#include "pefile.h"
+#include "pe.h"
 #include "util.h"
 
 struct DosFileHeader {
@@ -52,6 +52,11 @@ struct PeFileHeader {
         UINT16  Characteristics;
 } __attribute__((packed));
 
+struct PeHeader {
+        UINT8   Magic[4];
+        struct PeFileHeader FileHeader;
+} __attribute__((packed));
+
 struct PeSectionHeader {
         UINT8   Name[8];
         UINT32  VirtualSize;
@@ -65,15 +70,61 @@ struct PeSectionHeader {
         UINT32  Characteristics;
 } __attribute__((packed));
 
+EFI_STATUS pe_memory_locate_sections(CHAR8 *base, CHAR8 **sections, UINTN *addrs, UINTN *offsets, UINTN *sizes) {
+        struct DosFileHeader *dos;
+        struct PeHeader *pe;
+        UINTN i;
+        UINTN offset;
+
+        dos = (struct DosFileHeader *)base;
+
+        if (CompareMem(dos->Magic, "MZ", 2) != 0)
+                return EFI_LOAD_ERROR;
+
+        pe = (struct PeHeader *)&base[dos->ExeHeader];
+        if (CompareMem(pe->Magic, "PE\0\0", 4) != 0)
+                return EFI_LOAD_ERROR;
+
+        /* PE32+ Subsystem type */
+        if (pe->FileHeader.Machine != PE_HEADER_MACHINE_X64 &&
+            pe->FileHeader.Machine != PE_HEADER_MACHINE_I386)
+                return EFI_LOAD_ERROR;
+
+        if (pe->FileHeader.NumberOfSections > 96)
+                return EFI_LOAD_ERROR;
+
+        offset = dos->ExeHeader + sizeof(*pe) + pe->FileHeader.SizeOfOptionalHeader;
+
+        for (i = 0; i < pe->FileHeader.NumberOfSections; i++) {
+                struct PeSectionHeader *sect;
+                UINTN j;
+
+                sect = (struct PeSectionHeader *)&base[offset];
+                for (j = 0; sections[j]; j++) {
+                        if (CompareMem(sect->Name, sections[j], strlena(sections[j])) != 0)
+                                continue;
 
-EFI_STATUS pefile_locate_sections(EFI_FILE *dir, CHAR16 *path, CHAR8 **sections, UINTN *addrs, UINTN *offsets, UINTN *sizes) {
+                        if (addrs)
+                                addrs[j] = (UINTN)sect->VirtualAddress;
+                        if (offsets)
+                                offsets[j] = (UINTN)sect->PointerToRawData;
+                        if (sizes)
+                                sizes[j] = (UINTN)sect->VirtualSize;
+                }
+                offset += sizeof(*sect);
+        }
+
+        return EFI_SUCCESS;
+}
+
+EFI_STATUS pe_file_locate_sections(EFI_FILE *dir, CHAR16 *path, CHAR8 **sections, UINTN *addrs, UINTN *offsets, UINTN *sizes) {
         EFI_FILE_HANDLE handle;
         struct DosFileHeader dos;
-        uint8_t magic[4];
-        struct PeFileHeader pe;
+        struct PeHeader pe;
         UINTN len;
-        UINTN i;
+        UINTN headerlen;
         EFI_STATUS err;
+        CHAR8 *header = NULL;
 
         err = uefi_call_wrapper(dir->Open, 5, dir, &handle, path, EFI_FILE_MODE_READ, 0ULL);
         if (EFI_ERROR(err))
@@ -89,30 +140,10 @@ EFI_STATUS pefile_locate_sections(EFI_FILE *dir, CHAR16 *path, CHAR8 **sections,
                 goto out;
         }
 
-        if (CompareMem(dos.Magic, "MZ", 2) != 0) {
-                err = EFI_LOAD_ERROR;
-                goto out;
-        }
-
         err = uefi_call_wrapper(handle->SetPosition, 2, handle, dos.ExeHeader);
         if (EFI_ERROR(err))
                 goto out;
 
-        /* PE header */
-        len = sizeof(magic);
-        err = uefi_call_wrapper(handle->Read, 3, handle, &len, &magic);
-        if (EFI_ERROR(err))
-                goto out;
-        if (len != sizeof(magic)) {
-                err = EFI_LOAD_ERROR;
-                goto out;
-        }
-
-        if (CompareMem(magic, "PE\0\0", 2) != 0) {
-                err = EFI_LOAD_ERROR;
-                goto out;
-        }
-
         len = sizeof(pe);
         err = uefi_call_wrapper(handle->Read, 3, handle, &len, &pe);
         if (EFI_ERROR(err))
@@ -122,49 +153,30 @@ EFI_STATUS pefile_locate_sections(EFI_FILE *dir, CHAR16 *path, CHAR8 **sections,
                 goto out;
         }
 
-        /* PE32+ Subsystem type */
-        if (pe.Machine != PE_HEADER_MACHINE_X64 &&
-            pe.Machine != PE_HEADER_MACHINE_I386) {
-                err = EFI_LOAD_ERROR;
+        headerlen = sizeof(dos) + sizeof(pe) + pe.FileHeader.SizeOfOptionalHeader + pe.FileHeader.NumberOfSections * sizeof(struct PeSectionHeader);
+        header = AllocatePool(headerlen);
+        if (!header) {
+                err = EFI_OUT_OF_RESOURCES;
                 goto out;
         }
+        len = headerlen;
+        err = uefi_call_wrapper(handle->SetPosition, 2, handle, 0);
+        if (EFI_ERROR(err))
+                goto out;
 
-        if (pe.NumberOfSections > 96) {
-                err = EFI_LOAD_ERROR;
+        err = uefi_call_wrapper(handle->Read, 3, handle, &len, header);
+        if (EFI_ERROR(err)) {
                 goto out;
         }
-
-        /* the sections start directly after the headers */
-        err = uefi_call_wrapper(handle->SetPosition, 2, handle, dos.ExeHeader + sizeof(magic) + sizeof(pe) + pe.SizeOfOptionalHeader);
-        if (EFI_ERROR(err))
+        if (len != headerlen) {
+                err = EFI_LOAD_ERROR;
                 goto out;
-
-        for (i = 0; i < pe.NumberOfSections; i++) {
-                struct PeSectionHeader sect;
-                UINTN j;
-
-                len = sizeof(sect);
-                err = uefi_call_wrapper(handle->Read, 3, handle, &len, &sect);
-                if (EFI_ERROR(err))
-                        goto out;
-                if (len != sizeof(sect)) {
-                        err = EFI_LOAD_ERROR;
-                        goto out;
-                }
-                for (j = 0; sections[j]; j++) {
-                        if (CompareMem(sect.Name, sections[j], strlena(sections[j])) != 0)
-                                continue;
-
-                        if (addrs)
-                                addrs[j] = (UINTN)sect.VirtualAddress;
-                        if (offsets)
-                                offsets[j] = (UINTN)sect.PointerToRawData;
-                        if (sizes)
-                                sizes[j] = (UINTN)sect.VirtualSize;
-                }
         }
 
+        err = pe_memory_locate_sections(header, sections, addrs, offsets, sizes);
 out:
+        if (header)
+                FreePool(header);
         uefi_call_wrapper(handle->Close, 1, handle);
         return err;
 }
similarity index 67%
rename from src/boot/efi/pefile.h
rename to src/boot/efi/pe.h
index 2e445ed..fa8feea 100644 (file)
@@ -15,6 +15,8 @@
 #ifndef __SDBOOT_PEFILE_H
 #define __SDBOOT_PEFILE_H
 
-EFI_STATUS pefile_locate_sections(EFI_FILE *dir, CHAR16 *path,
-                                  CHAR8 **sections, UINTN *addrs, UINTN *offsets, UINTN *sizes);
+EFI_STATUS pe_memory_locate_sections(CHAR8 *base,
+                                     CHAR8 **sections, UINTN *addrs, UINTN *offsets, UINTN *sizes);
+EFI_STATUS pe_file_locate_sections(EFI_FILE *dir, CHAR16 *path,
+                                   CHAR8 **sections, UINTN *addrs, UINTN *offsets, UINTN *sizes);
 #endif
diff --git a/src/boot/efi/shim.c b/src/boot/efi/shim.c
new file mode 100644 (file)
index 0000000..0f73be9
--- /dev/null
@@ -0,0 +1,262 @@
+/*
+ * This program 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.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * Port to systemd-boot
+ * Copyright 2017 Max Resch <resch.max@gmail.com>
+ *
+ * Security Policy Handling
+ * Copyright 2012 <James.Bottomley@HansenPartnership.com>
+ * https://github.com/mjg59/efitools
+ */
+
+#include <efi.h>
+#include <efilib.h>
+
+#include "util.h"
+#include "shim.h"
+
+/* well known shim lock guid */
+#define SHIM_LOCK_GUID
+
+struct ShimLock {
+        EFI_STATUS __attribute__((sysv_abi)) (*shim_verify) (VOID *buffer, UINT32 size);
+
+        /* context is actually a struct for the PE header, but it isn't needed so void is sufficient just do define the interface
+         * see shim.c/shim.h and PeHeader.h in the github shim repo */
+        EFI_STATUS __attribute__((sysv_abi)) (*generate_hash) (VOID *data, UINT32 datasize, VOID *context, UINT8 *sha256hash, UINT8 *sha1hash);
+
+        EFI_STATUS __attribute__((sysv_abi)) (*read_header) (VOID *data, UINT32 datasize, VOID *context);
+};
+
+static const EFI_GUID simple_fs_guid = SIMPLE_FILE_SYSTEM_PROTOCOL;
+static const EFI_GUID global_guid = EFI_GLOBAL_VARIABLE;
+
+static const EFI_GUID security_protocol_guid = { 0xa46423e3, 0x4617, 0x49f1, {0xb9, 0xff, 0xd1, 0xbf, 0xa9, 0x11, 0x58, 0x39 } };
+static const EFI_GUID security2_protocol_guid = { 0x94ab2f58, 0x1438, 0x4ef1, {0x91, 0x52, 0x18, 0x94, 0x1a, 0x3a, 0x0e, 0x68 } };
+static const EFI_GUID shim_lock_guid = { 0x605dab50, 0xe046, 0x4300, {0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23} };
+
+BOOLEAN shim_loaded(void) {
+        struct ShimLock *shim_lock;
+
+        return uefi_call_wrapper(BS->LocateProtocol, 3, (EFI_GUID*) &shim_lock_guid, NULL, (VOID**) &shim_lock) == EFI_SUCCESS;
+}
+
+static BOOLEAN shim_validate(VOID *data, UINT32 size) {
+        struct ShimLock *shim_lock;
+
+        if (!data)
+                return FALSE;
+
+        if (uefi_call_wrapper(BS->LocateProtocol, 3, (EFI_GUID*) &shim_lock_guid, NULL, (VOID**) &shim_lock) != EFI_SUCCESS)
+                return FALSE;
+
+        if (!shim_lock)
+                return FALSE;
+
+        if (shim_lock->shim_verify(data, size) == EFI_SUCCESS)
+                return TRUE;
+
+        return FALSE;
+}
+
+BOOLEAN secure_boot_enabled(void) {
+        CHAR8 *b;
+        UINTN size;
+        BOOLEAN result;
+
+        if (efivar_get_raw(&global_guid, L"SecureBoot", &b, &size) == EFI_SUCCESS) {
+                result = *b > 0;
+                FreePool(b);
+                return result;
+        }
+
+        return FALSE;
+}
+
+/*
+ * See the UEFI Platform Initialization manual (Vol2: DXE) for this
+ */
+struct _EFI_SECURITY2_PROTOCOL;
+struct _EFI_SECURITY_PROTOCOL;
+struct _EFI_DEVICE_PATH_PROTOCOL;
+
+typedef struct _EFI_SECURITY2_PROTOCOL EFI_SECURITY2_PROTOCOL;
+typedef struct _EFI_SECURITY_PROTOCOL EFI_SECURITY_PROTOCOL;
+typedef struct _EFI_DEVICE_PATH_PROTOCOL EFI_DEVICE_PATH_PROTOCOL;
+
+typedef EFI_STATUS (EFIAPI *EFI_SECURITY_FILE_AUTHENTICATION_STATE) (
+        const EFI_SECURITY_PROTOCOL *This,
+        UINT32 AuthenticationStatus,
+        const EFI_DEVICE_PATH_PROTOCOL *File
+);
+
+typedef EFI_STATUS (EFIAPI *EFI_SECURITY2_FILE_AUTHENTICATION) (
+        const EFI_SECURITY2_PROTOCOL *This,
+        const EFI_DEVICE_PATH_PROTOCOL *DevicePath,
+        VOID *FileBuffer,
+        UINTN FileSize,
+        BOOLEAN  BootPolicy
+);
+
+struct _EFI_SECURITY2_PROTOCOL {
+        EFI_SECURITY2_FILE_AUTHENTICATION FileAuthentication;
+};
+
+struct _EFI_SECURITY_PROTOCOL {
+        EFI_SECURITY_FILE_AUTHENTICATION_STATE  FileAuthenticationState;
+};
+
+/* Handle to the original authenticator for security1 protocol */
+static EFI_SECURITY_FILE_AUTHENTICATION_STATE esfas = NULL;
+
+/* Handle to the original authenticator for security2 protocol */
+static EFI_SECURITY2_FILE_AUTHENTICATION es2fa = NULL;
+
+/*
+ * Perform shim/MOK and Secure Boot authentication on a binary that's already been
+ * loaded into memory. This function does the platform SB authentication first
+ * but preserves its return value in case of its failure, so that it can be
+ * returned in case of a shim/MOK authentication failure. This is done because
+ * the SB failure code seems to vary from one implementation to another, and I
+ * don't want to interfere with that at this time.
+ */
+static EFIAPI EFI_STATUS security2_policy_authentication (const EFI_SECURITY2_PROTOCOL *this,
+                                                          const EFI_DEVICE_PATH_PROTOCOL *device_path,
+                                                          VOID *file_buffer, UINTN file_size, BOOLEAN boot_policy) {
+        EFI_STATUS status;
+
+        /* Chain original security policy */
+        status = uefi_call_wrapper(es2fa, 5, this, device_path, file_buffer, file_size, boot_policy);
+
+        /* if OK, don't bother with MOK check */
+        if (status == EFI_SUCCESS)
+                return status;
+
+        if (shim_validate(file_buffer, file_size))
+                return EFI_SUCCESS;
+
+        return status;
+}
+
+/*
+ * Perform both shim/MOK and platform Secure Boot authentication. This function loads
+ * the file and performs shim/MOK authentication first simply to avoid double loads
+ * of Linux kernels, which are much more likely to be shim/MOK-signed than platform-signed,
+ * since kernels are big and can take several seconds to load on some computers and
+ * filesystems. This also has the effect of returning whatever the platform code is for
+ * authentication failure, be it EFI_ACCESS_DENIED, EFI_SECURITY_VIOLATION, or something
+ * else. (This seems to vary between implementations.)
+ */
+static EFIAPI EFI_STATUS security_policy_authentication (const EFI_SECURITY_PROTOCOL *this, UINT32 authentication_status,
+                                                         const EFI_DEVICE_PATH_PROTOCOL *device_path_const) {
+        EFI_STATUS status;
+        EFI_DEVICE_PATH *dev_path;
+        EFI_HANDLE h;
+        EFI_FILE *root;
+        VOID *file_buffer = NULL;
+        UINTN file_size;
+        CHAR16 *dev_path_str;
+
+        if (!device_path_const)
+                return EFI_INVALID_PARAMETER;
+
+        dev_path = DuplicateDevicePath((EFI_DEVICE_PATH*) device_path_const);
+
+        status = uefi_call_wrapper(BS->LocateDevicePath, 3, (EFI_GUID*) &simple_fs_guid, &dev_path, &h);
+        if (status != EFI_SUCCESS) {
+                FreePool(dev_path);
+                return status;
+        }
+
+        /* No need to check return value, this already happend in efi_main() */
+        root = LibOpenRoot(h);
+        dev_path_str = DevicePathToStr(dev_path);
+        FreePool(dev_path);
+
+        file_size = file_read(root, dev_path_str, 0, 0, file_buffer);
+        FreePool(dev_path_str);
+        uefi_call_wrapper(root->Close, 1, root);
+
+        if (shim_validate(file_buffer, file_size))
+                status = EFI_SUCCESS;
+
+        FreePool(file_buffer);
+
+        /* Try using the platform's native policy.... */
+        if (status != EFI_SUCCESS)
+                status = uefi_call_wrapper(esfas, 3, this, authentication_status, device_path_const);
+
+        return status;
+}
+
+EFI_STATUS security_policy_install(void) {
+        EFI_SECURITY_PROTOCOL *security_protocol;
+        EFI_SECURITY2_PROTOCOL *security2_protocol = NULL;
+        EFI_STATUS status;
+
+        /* Already Installed */
+        if (esfas)
+                return EFI_ALREADY_STARTED;
+
+        /*
+         * Don't bother with status here.  The call is allowed
+         * to fail, since SECURITY2 was introduced in PI 1.2.1
+         * If it fails, use security2_protocol == NULL as indicator
+         */
+        uefi_call_wrapper(BS->LocateProtocol, 3, (EFI_GUID*) &security2_protocol_guid, NULL, (VOID**) &security2_protocol);
+
+        status = uefi_call_wrapper(BS->LocateProtocol, 3, (EFI_GUID*) &security_protocol_guid, NULL, (VOID**) &security_protocol);
+         /* This one is mandatory, so there's a serious problem */
+        if (status != EFI_SUCCESS)
+                return status;
+
+        if (!security2_protocol) {
+                es2fa = security2_protocol->FileAuthentication;
+                security2_protocol->FileAuthentication = security2_policy_authentication;
+        }
+
+        esfas = security_protocol->FileAuthenticationState;
+        security_protocol->FileAuthenticationState = security_policy_authentication;
+
+        return EFI_SUCCESS;
+}
+
+EFI_STATUS security_policy_uninstall(void) {
+        EFI_STATUS status;
+
+        if (esfas) {
+                EFI_SECURITY_PROTOCOL *security_protocol;
+
+                status = uefi_call_wrapper(BS->LocateProtocol, 3, (EFI_GUID*) &security_protocol_guid, NULL, (VOID**) &security_protocol);
+
+                if (status != EFI_SUCCESS)
+                        return status;
+
+                security_protocol->FileAuthenticationState = esfas;
+                esfas = NULL;
+        } else
+                /* nothing installed */
+                return EFI_NOT_STARTED;
+
+        if (es2fa) {
+                EFI_SECURITY2_PROTOCOL *security2_protocol;
+
+                status = uefi_call_wrapper(BS->LocateProtocol, 3, (EFI_GUID*) &security2_protocol_guid, NULL, (VOID**) &security2_protocol);
+
+                if (status != EFI_SUCCESS)
+                        return status;
+
+                security2_protocol->FileAuthentication = es2fa;
+                es2fa = NULL;
+        }
+
+        return EFI_SUCCESS;
+}
diff --git a/src/boot/efi/shim.h b/src/boot/efi/shim.h
new file mode 100644 (file)
index 0000000..2dcf48d
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * This program 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.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * Port to systemd-boot
+ * Copyright 2017 Max Resch <resch.max@gmail.com>
+ *
+ * Security Policy Handling
+ * Copyright 2012 <James.Bottomley@HansenPartnership.com>
+ * https://github.com/mjg59/efitools
+ */
+
+#ifndef __SDBOOT_SHIM_H
+#define __SDBOOT_SHIM_H
+
+BOOLEAN shim_loaded(void);
+
+BOOLEAN secure_boot_enabled(void);
+
+EFI_STATUS security_policy_install(void);
+
+EFI_STATUS security_policy_uninstall(void);
+
+#endif
index 1e250f3..bab5d46 100644 (file)
 #include "disk.h"
 #include "graphics.h"
 #include "linux.h"
-#include "pefile.h"
+#include "measure.h"
+#include "pe.h"
 #include "splash.h"
 #include "util.h"
-#include "measure.h"
 
 /* magic string to find in the binary image */
-static const char __attribute__((used)) magic[] = "#### LoaderInfo: systemd-stub " VERSION " ####";
+static const char __attribute__((used)) magic[] = "#### LoaderInfo: systemd-stub " PACKAGE_VERSION " ####";
 
 static const EFI_GUID global_guid = EFI_GLOBAL_VARIABLE;
 
 EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
         EFI_LOADED_IMAGE *loaded_image;
-        EFI_FILE *root_dir;
-        CHAR16 *loaded_image_path;
         CHAR8 *b;
         UINTN size;
         BOOLEAN secure = FALSE;
@@ -59,22 +57,12 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
                 return err;
         }
 
-        root_dir = LibOpenRoot(loaded_image->DeviceHandle);
-        if (!root_dir) {
-                Print(L"Unable to open root directory: %r ", err);
-                uefi_call_wrapper(BS->Stall, 1, 3 * 1000 * 1000);
-                return EFI_LOAD_ERROR;
-        }
-
-        loaded_image_path = DevicePathToStr(loaded_image->FilePath);
-
         if (efivar_get_raw(&global_guid, L"SecureBoot", &b, &size) == EFI_SUCCESS) {
                 if (*b > 0)
                         secure = TRUE;
                 FreePool(b);
         }
-
-        err = pefile_locate_sections(root_dir, loaded_image_path, sections, addrs, offs, szs);
+        err = pe_memory_locate_sections(loaded_image->ImageBase, sections, addrs, offs, szs);
         if (EFI_ERROR(err)) {
                 Print(L"Unable to locate embedded .linux section: %r ", err);
                 uefi_call_wrapper(BS->Stall, 1, 3 * 1000 * 1000);
@@ -87,7 +75,7 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
         cmdline_len = szs[0];
 
         /* if we are not in secure boot mode, accept a custom command line and replace the built-in one */
-        if (!secure && loaded_image->LoadOptionsSize > 0) {
+        if (!secure && loaded_image->LoadOptionsSize > 0 && *(CHAR16 *)loaded_image->LoadOptions != 0) {
                 CHAR16 *options;
                 CHAR8 *line;
                 UINTN i;
@@ -100,7 +88,7 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
                 cmdline = line;
 
 #ifdef SD_BOOT_LOG_TPM
-                /* Try to log any options to the TPM, escpecially manually edited options */
+                /* Try to log any options to the TPM, especially manually edited options */
                 err = tpm_log_event(SD_TPM_PCR,
                                     (EFI_PHYSICAL_ADDRESS) loaded_image->LoadOptions,
                                     loaded_image->LoadOptionsSize, loaded_image->LoadOptions);
similarity index 92%
rename from src/libsystemd/sd-bus/busctl-introspect.c
rename to src/busctl/busctl-introspect.c
index b09509f..a057949 100644 (file)
@@ -143,9 +143,7 @@ static int parse_xml_annotation(Context *context, uint64_t *flags) {
                 case STATE_NAME:
 
                         if (t == XML_ATTRIBUTE_VALUE) {
-                                free(field);
-                                field = name;
-                                name = NULL;
+                                free_and_replace(field, name);
 
                                 state = STATE_ANNOTATION;
                         } else {
@@ -158,9 +156,7 @@ static int parse_xml_annotation(Context *context, uint64_t *flags) {
                 case STATE_VALUE:
 
                         if (t == XML_ATTRIBUTE_VALUE) {
-                                free(value);
-                                value = name;
-                                name = NULL;
+                                free_and_replace(value, name);
 
                                 state = STATE_ANNOTATION;
                         } else {
@@ -194,6 +190,7 @@ static int parse_xml_node(Context *context, const char *prefix, unsigned n_depth
                 STATE_SIGNAL_ARG,
                 STATE_SIGNAL_ARG_NAME,
                 STATE_SIGNAL_ARG_TYPE,
+                STATE_SIGNAL_ARG_DIRECTION,
                 STATE_PROPERTY,
                 STATE_PROPERTY_NAME,
                 STATE_PROPERTY_TYPE,
@@ -285,7 +282,7 @@ static int parse_xml_node(Context *context, const char *prefix, unsigned n_depth
                                         if (endswith(prefix, "/"))
                                                 node_path = strappend(prefix, name);
                                         else
-                                                node_path = strjoin(prefix, "/", name, NULL);
+                                                node_path = strjoin(prefix, "/", name);
                                         if (!node_path)
                                                 return log_oom();
                                 }
@@ -350,11 +347,8 @@ static int parse_xml_node(Context *context, const char *prefix, unsigned n_depth
                 case STATE_INTERFACE_NAME:
 
                         if (t == XML_ATTRIBUTE_VALUE) {
-                                if (n_depth == 0) {
-                                        free(context->interface_name);
-                                        context->interface_name = name;
-                                        name = NULL;
-                                }
+                                if (n_depth == 0)
+                                        free_and_replace(context->interface_name, name);
 
                                 state = STATE_INTERFACE;
                         } else {
@@ -409,12 +403,8 @@ static int parse_xml_node(Context *context, const char *prefix, unsigned n_depth
                 case STATE_METHOD_NAME:
 
                         if (t == XML_ATTRIBUTE_VALUE) {
-
-                                if (n_depth == 0) {
-                                        free(context->member_name);
-                                        context->member_name = name;
-                                        name = NULL;
-                                }
+                                if (n_depth == 0)
+                                        free_and_replace(context->member_name, name);
 
                                 state = STATE_METHOD;
                         } else {
@@ -432,7 +422,7 @@ static int parse_xml_node(Context *context, const char *prefix, unsigned n_depth
                                 else if (streq_ptr(name, "type"))
                                         state = STATE_METHOD_ARG_TYPE;
                                 else if (streq_ptr(name, "direction"))
-                                         state = STATE_METHOD_ARG_DIRECTION;
+                                        state = STATE_METHOD_ARG_DIRECTION;
                                 else {
                                         log_error("Unexpected method <arg> attribute %s.", name);
                                         return -EBADMSG;
@@ -458,7 +448,8 @@ static int parse_xml_node(Context *context, const char *prefix, unsigned n_depth
                                                 } else if (streq(argument_direction, "out")) {
                                                         if (!strextend(&context->member_result, argument_type, NULL))
                                                                 return log_oom();
-                                                }
+                                                } else
+                                                        log_error("Unexpected method <arg> direction value '%s'.", argument_direction);
                                         }
 
                                         argument_type = mfree(argument_type);
@@ -487,9 +478,7 @@ static int parse_xml_node(Context *context, const char *prefix, unsigned n_depth
                 case STATE_METHOD_ARG_TYPE:
 
                         if (t == XML_ATTRIBUTE_VALUE) {
-                                free(argument_type);
-                                argument_type = name;
-                                name = NULL;
+                                free_and_replace(argument_type, name);
 
                                 state = STATE_METHOD_ARG;
                         } else {
@@ -502,9 +491,7 @@ static int parse_xml_node(Context *context, const char *prefix, unsigned n_depth
                 case STATE_METHOD_ARG_DIRECTION:
 
                         if (t == XML_ATTRIBUTE_VALUE) {
-                                free(argument_direction);
-                                argument_direction = name;
-                                name = NULL;
+                                free_and_replace(argument_direction, name);
 
                                 state = STATE_METHOD_ARG;
                         } else {
@@ -559,12 +546,8 @@ static int parse_xml_node(Context *context, const char *prefix, unsigned n_depth
                 case STATE_SIGNAL_NAME:
 
                         if (t == XML_ATTRIBUTE_VALUE) {
-
-                                if (n_depth == 0) {
-                                        free(context->member_name);
-                                        context->member_name = name;
-                                        name = NULL;
-                                }
+                                if (n_depth == 0)
+                                        free_and_replace(context->member_name, name);
 
                                 state = STATE_SIGNAL;
                         } else {
@@ -582,6 +565,8 @@ static int parse_xml_node(Context *context, const char *prefix, unsigned n_depth
                                         state = STATE_SIGNAL_ARG_NAME;
                                 else if (streq_ptr(name, "type"))
                                         state = STATE_SIGNAL_ARG_TYPE;
+                                else if (streq_ptr(name, "direction"))
+                                        state = STATE_SIGNAL_ARG_DIRECTION;
                                 else {
                                         log_error("Unexpected signal <arg> attribute %s.", name);
                                         return -EBADMSG;
@@ -599,8 +584,11 @@ static int parse_xml_node(Context *context, const char *prefix, unsigned n_depth
                                    (t == XML_TAG_CLOSE && streq_ptr(name, "arg"))) {
 
                                 if (argument_type) {
-                                        if (!strextend(&context->member_signature, argument_type, NULL))
-                                                return log_oom();
+                                        if (!argument_direction || streq(argument_direction, "out")) {
+                                                if (!strextend(&context->member_signature, argument_type, NULL))
+                                                        return log_oom();
+                                        } else
+                                                log_error("Unexpected signal <arg> direction value '%s'.", argument_direction);
 
                                         argument_type = mfree(argument_type);
                                 }
@@ -627,9 +615,7 @@ static int parse_xml_node(Context *context, const char *prefix, unsigned n_depth
                 case STATE_SIGNAL_ARG_TYPE:
 
                         if (t == XML_ATTRIBUTE_VALUE) {
-                                free(argument_type);
-                                argument_type = name;
-                                name = NULL;
+                                free_and_replace(argument_type, name);
 
                                 state = STATE_SIGNAL_ARG;
                         } else {
@@ -639,6 +625,19 @@ static int parse_xml_node(Context *context, const char *prefix, unsigned n_depth
 
                         break;
 
+                case STATE_SIGNAL_ARG_DIRECTION:
+
+                        if (t == XML_ATTRIBUTE_VALUE) {
+                                free_and_replace(argument_direction, name);
+
+                                state = STATE_SIGNAL_ARG;
+                        } else {
+                                log_error("Unexpected token in signal <arg>. (4)");
+                                return -EINVAL;
+                        }
+
+                        break;
+
                 case STATE_PROPERTY:
 
                         if (t == XML_ATTRIBUTE_NAME) {
@@ -688,12 +687,9 @@ static int parse_xml_node(Context *context, const char *prefix, unsigned n_depth
                 case STATE_PROPERTY_NAME:
 
                         if (t == XML_ATTRIBUTE_VALUE) {
+                                if (n_depth == 0)
+                                        free_and_replace(context->member_name, name);
 
-                                if (n_depth == 0) {
-                                        free(context->member_name);
-                                        context->member_name = name;
-                                        name = NULL;
-                                }
                                 state = STATE_PROPERTY;
                         } else {
                                 log_error("Unexpected token in <property>. (2)");
@@ -705,12 +701,8 @@ static int parse_xml_node(Context *context, const char *prefix, unsigned n_depth
                 case STATE_PROPERTY_TYPE:
 
                         if (t == XML_ATTRIBUTE_VALUE) {
-
-                                if (n_depth == 0) {
-                                        free(context->member_signature);
-                                        context->member_signature = name;
-                                        name = NULL;
-                                }
+                                if (n_depth == 0)
+                                        free_and_replace(context->member_signature, name);
 
                                 state = STATE_PROPERTY;
                         } else {
similarity index 99%
rename from src/libsystemd/sd-bus/busctl.c
rename to src/busctl/busctl.c
index 9270195..0d4bb8e 100644 (file)
@@ -1179,6 +1179,8 @@ static int monitor(sd_bus *bus, char *argv[], int (*dump)(sd_bus_message *m, FIL
                         return log_error_errno(r, "Failed to add match: %m");
         }
 
+        log_info("Monitoring bus message stream.");
+
         while (monitor_run_condi) {
                 receiver_pid_match = true;
                 sender_pid_match = true;
@@ -2155,9 +2157,7 @@ int main(int argc, char *argv[]) {
                 goto finish;
         }
 
-        if (streq_ptr(argv[optind], "monitor") ||
-            streq_ptr(argv[optind], "dot") ||
-            streq_ptr(argv[optind], "capture")) {
+        if (STRPTR_IN_SET(argv[optind], "monitor", "dot", "capture")) {
 
                 r = sd_bus_set_monitor(bus, true);
                 if (r < 0) {
index dcb5912..1b746a0 100644 (file)
@@ -26,7 +26,6 @@
 #include "sd-bus.h"
 
 #include "alloc-util.h"
-#include "bus-error.h"
 #include "bus-util.h"
 #include "cgroup-show.h"
 #include "cgroup-util.h"
 #include "output-mode.h"
 #include "pager.h"
 #include "path-util.h"
+#include "strv.h"
 #include "unit-name.h"
 #include "util.h"
 
 static bool arg_no_pager = false;
 static bool arg_kernel_threads = false;
 static bool arg_all = false;
+
+static enum {
+        SHOW_UNIT_NONE,
+        SHOW_UNIT_SYSTEM,
+        SHOW_UNIT_USER,
+} arg_show_unit = SHOW_UNIT_NONE;
+static char **arg_names = NULL;
+
 static int arg_full = -1;
 static char* arg_machine = NULL;
 
@@ -51,6 +59,8 @@ static void help(void) {
                "     --version        Show package version\n"
                "     --no-pager       Do not pipe output into a pager\n"
                "  -a --all            Show all groups, including empty\n"
+               "  -u --unit           Show the subtrees of specifified system units\n"
+               "     --user-unit      Show the subtrees of specifified user units\n"
                "  -l --full           Do not ellipsize output\n"
                "  -k                  Include kernel threads in output\n"
                "  -M --machine=       Show container\n"
@@ -62,15 +72,18 @@ static int parse_argv(int argc, char *argv[]) {
         enum {
                 ARG_NO_PAGER = 0x100,
                 ARG_VERSION,
+                ARG_USER_UNIT,
         };
 
         static const struct option options[] = {
-                { "help",      no_argument,       NULL, 'h'          },
-                { "version",   no_argument,       NULL, ARG_VERSION  },
-                { "no-pager",  no_argument,       NULL, ARG_NO_PAGER },
-                { "all",       no_argument,       NULL, 'a'          },
-                { "full",      no_argument,       NULL, 'l'          },
-                { "machine",   required_argument, NULL, 'M'          },
+                { "help",      no_argument,       NULL, 'h'           },
+                { "version",   no_argument,       NULL, ARG_VERSION   },
+                { "no-pager",  no_argument,       NULL, ARG_NO_PAGER  },
+                { "all",       no_argument,       NULL, 'a'           },
+                { "full",      no_argument,       NULL, 'l'           },
+                { "machine",   required_argument, NULL, 'M'           },
+                { "unit",      optional_argument, NULL, 'u'           },
+                { "user-unit", optional_argument, NULL, ARG_USER_UNIT },
                 {}
         };
 
@@ -79,7 +92,7 @@ static int parse_argv(int argc, char *argv[]) {
         assert(argc >= 1);
         assert(argv);
 
-        while ((c = getopt_long(argc, argv, "hkalM:", options, NULL)) >= 0)
+        while ((c = getopt_long(argc, argv, "-hkalM:u::", options, NULL)) >= 0)
 
                 switch (c) {
 
@@ -98,6 +111,24 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_all = true;
                         break;
 
+                case 'u':
+                        arg_show_unit = SHOW_UNIT_SYSTEM;
+                        if (strv_push(&arg_names, optarg) < 0) /* push optarg if not empty */
+                                return log_oom();
+                        break;
+
+                case ARG_USER_UNIT:
+                        arg_show_unit = SHOW_UNIT_USER;
+                        if (strv_push(&arg_names, optarg) < 0) /* push optarg if not empty */
+                                return log_oom();
+                        break;
+
+                case 1:
+                        /* positional argument */
+                        if (strv_push(&arg_names, optarg) < 0)
+                                return log_oom();
+                        break;
+
                 case 'l':
                         arg_full = true;
                         break;
@@ -117,56 +148,17 @@ static int parse_argv(int argc, char *argv[]) {
                         assert_not_reached("Unhandled option");
                 }
 
-        return 1;
-}
-
-static int get_cgroup_root(char **ret) {
-        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
-        _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
-        _cleanup_free_ char *unit = NULL, *path = NULL;
-        const char *m;
-        int r;
-
-        if (!arg_machine) {
-                r = cg_get_root_path(ret);
-                if (r == -ENOMEDIUM)
-                        return log_error_errno(r, "Failed to get root control group path: No cgroup filesystem mounted on /sys/fs/cgroup");
-                else if (r < 0)
-                        return log_error_errno(r, "Failed to get root control group path: %m");
-
-                return 0;
+        if (arg_machine && arg_show_unit != SHOW_UNIT_NONE) {
+                log_error("Cannot combine --unit or --user-unit with --machine=.");
+                return -EINVAL;
         }
 
-        m = strjoina("/run/systemd/machines/", arg_machine);
-        r = parse_env_file(m, NEWLINE, "SCOPE", &unit, NULL);
-        if (r < 0)
-                return log_error_errno(r, "Failed to load machine data: %m");
-
-        path = unit_dbus_path_from_name(unit);
-        if (!path)
-                return log_oom();
-
-        r = bus_connect_transport_systemd(BUS_TRANSPORT_LOCAL, NULL, false, &bus);
-        if (r < 0)
-                return log_error_errno(r, "Failed to create bus connection: %m");
-
-        r = sd_bus_get_property_string(
-                        bus,
-                        "org.freedesktop.systemd1",
-                        path,
-                        unit_dbus_interface_from_name(unit),
-                        "ControlGroup",
-                        &error,
-                        ret);
-        if (r < 0)
-                return log_error_errno(r, "Failed to query unit control group path: %s", bus_error_message(&error, r));
-
-        return 0;
+        return 1;
 }
 
 static void show_cg_info(const char *controller, const char *path) {
 
-        if (cg_unified() <= 0 && controller && !streq(controller, SYSTEMD_CGROUP_CONTROLLER))
+        if (cg_all_unified() == 0 && controller && !streq(controller, SYSTEMD_CGROUP_CONTROLLER))
                 printf("Controller %s; ", controller);
 
         printf("Control group %s:\n", isempty(path) ? "/" : path);
@@ -194,36 +186,70 @@ int main(int argc, char *argv[]) {
                 (arg_full > 0) * OUTPUT_FULL_WIDTH |
                 arg_kernel_threads * OUTPUT_KERNEL_THREADS;
 
-        if (optind < argc) {
+        if (arg_names) {
+                _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
                 _cleanup_free_ char *root = NULL;
-                int i;
+                char **name;
 
-                r = get_cgroup_root(&root);
-                if (r < 0)
-                        goto finish;
-
-                for (i = optind; i < argc; i++) {
+                STRV_FOREACH(name, arg_names) {
                         int q;
 
-                        if (path_startswith(argv[i], "/sys/fs/cgroup")) {
+                        if (arg_show_unit != SHOW_UNIT_NONE) {
+                                /* Command line arguments are unit names */
+                                _cleanup_free_ char *cgroup = NULL;
+
+                                if (!bus) {
+                                        /* Connect to the bus only if necessary */
+                                        r = bus_connect_transport_systemd(BUS_TRANSPORT_LOCAL, NULL,
+                                                                          arg_show_unit == SHOW_UNIT_USER,
+                                                                          &bus);
+                                        if (r < 0) {
+                                                log_error_errno(r, "Failed to create bus connection: %m");
+                                                goto finish;
+                                        }
+                                }
+
+                                q = show_cgroup_get_unit_path_and_warn(bus, *name, &cgroup);
+                                if (q < 0)
+                                        goto failed;
+
+                                if (isempty(cgroup)) {
+                                        log_warning("Unit %s not found.", *name);
+                                        q = -ENOENT;
+                                        goto failed;
+                                }
+
+                                printf("Unit %s (%s):\n", *name, cgroup);
+                                fflush(stdout);
+
+                                q = show_cgroup_by_path(cgroup, NULL, 0, output_flags);
 
-                                printf("Directory %s:\n", argv[i]);
+                        } else if (path_startswith(*name, "/sys/fs/cgroup")) {
+
+                                printf("Directory %s:\n", *name);
                                 fflush(stdout);
 
-                                q = show_cgroup_by_path(argv[i], NULL, 0, output_flags);
+                                q = show_cgroup_by_path(*name, NULL, 0, output_flags);
                         } else {
                                 _cleanup_free_ char *c = NULL, *p = NULL, *j = NULL;
                                 const char *controller, *path;
 
-                                r = cg_split_spec(argv[i], &c, &p);
-                                if (r < 0) {
-                                        log_error_errno(r, "Failed to split argument %s: %m", argv[i]);
-                                        goto finish;
+                                if (!root) {
+                                        /* Query root only if needed, treat error as fatal */
+                                        r = show_cgroup_get_path_and_warn(arg_machine, NULL, &root);
+                                        if (r < 0)
+                                                goto finish;
+                                }
+
+                                q = cg_split_spec(*name, &c, &p);
+                                if (q < 0) {
+                                        log_error_errno(q, "Failed to split argument %s: %m", *name);
+                                        goto failed;
                                 }
 
                                 controller = c ?: SYSTEMD_CGROUP_CONTROLLER;
                                 if (p) {
-                                        j = strjoin(root, "/", p, NULL);
+                                        j = strjoin(root, "/", p);
                                         if (!j) {
                                                 r = log_oom();
                                                 goto finish;
@@ -239,7 +265,8 @@ int main(int argc, char *argv[]) {
                                 q = show_cgroup(controller, path, NULL, 0, output_flags);
                         }
 
-                        if (q < 0)
+                failed:
+                        if (q < 0 && r >= 0)
                                 r = q;
                 }
 
@@ -267,7 +294,7 @@ int main(int argc, char *argv[]) {
                 if (!done) {
                         _cleanup_free_ char *root = NULL;
 
-                        r = get_cgroup_root(&root);
+                        r = show_cgroup_get_path_and_warn(arg_machine, NULL, &root);
                         if (r < 0)
                                 goto finish;
 
@@ -283,6 +310,7 @@ int main(int argc, char *argv[]) {
 
 finish:
         pager_close();
+        free(arg_names); /* don't free the strings */
 
         return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }
index c67b328..7ebb02f 100644 (file)
@@ -31,6 +31,7 @@
 #include "alloc-util.h"
 #include "bus-error.h"
 #include "bus-util.h"
+#include "cgroup-show.h"
 #include "cgroup-util.h"
 #include "fd-util.h"
 #include "fileio.h"
@@ -74,6 +75,7 @@ static usec_t arg_delay = 1*USEC_PER_SEC;
 static char* arg_machine = NULL;
 static char* arg_root = NULL;
 static bool arg_recursive = true;
+static bool arg_recursive_unset = false;
 
 static enum {
         COUNT_PIDS,
@@ -117,7 +119,7 @@ static const char *maybe_format_bytes(char *buf, size_t l, bool is_valid, uint64
         if (!is_valid)
                 return "-";
         if (arg_raw) {
-                snprintf(buf, l, "%jd", t);
+                snprintf(buf, l, "%" PRIu64, t);
                 return buf;
         }
         return format_bytes(buf, l, t);
@@ -132,12 +134,16 @@ static int process(
                 Group **ret) {
 
         Group *g;
-        int r;
+        int r, all_unified;
 
         assert(controller);
         assert(path);
         assert(a);
 
+        all_unified = cg_all_unified();
+        if (all_unified < 0)
+                return all_unified;
+
         g = hashmap_get(a, path);
         if (!g) {
                 g = hashmap_get(b, path);
@@ -208,24 +214,47 @@ static int process(
                 if (g->n_tasks > 0)
                         g->n_tasks_valid = true;
 
-        } else if (streq(controller, "cpuacct") && cg_unified() <= 0) {
+        } else if (streq(controller, "cpu") || streq(controller, "cpuacct")) {
                 _cleanup_free_ char *p = NULL, *v = NULL;
                 uint64_t new_usage;
                 nsec_t timestamp;
 
-                r = cg_get_path(controller, path, "cpuacct.usage", &p);
-                if (r < 0)
-                        return r;
+                if (all_unified) {
+                        const char *keys[] = { "usage_usec", NULL };
+                        _cleanup_free_ char *val = NULL;
 
-                r = read_one_line_file(p, &v);
-                if (r == -ENOENT)
-                        return 0;
-                if (r < 0)
-                        return r;
+                        if (!streq(controller, "cpu"))
+                                return 0;
 
-                r = safe_atou64(v, &new_usage);
-                if (r < 0)
-                        return r;
+                        r = cg_get_keyed_attribute("cpu", path, "cpu.stat", keys, &val);
+                        if (r == -ENOENT)
+                                return 0;
+                        if (r < 0)
+                                return r;
+
+                        r = safe_atou64(val, &new_usage);
+                        if (r < 0)
+                                return r;
+
+                        new_usage *= NSEC_PER_USEC;
+                } else {
+                        if (!streq(controller, "cpuacct"))
+                                return 0;
+
+                        r = cg_get_path(controller, path, "cpuacct.usage", &p);
+                        if (r < 0)
+                                return r;
+
+                        r = read_one_line_file(p, &v);
+                        if (r == -ENOENT)
+                                return 0;
+                        if (r < 0)
+                                return r;
+
+                        r = safe_atou64(v, &new_usage);
+                        if (r < 0)
+                                return r;
+                }
 
                 timestamp = now_nsec(CLOCK_MONOTONIC);
 
@@ -250,10 +279,10 @@ static int process(
         } else if (streq(controller, "memory")) {
                 _cleanup_free_ char *p = NULL, *v = NULL;
 
-                if (cg_unified() <= 0)
-                        r = cg_get_path(controller, path, "memory.usage_in_bytes", &p);
-                else
+                if (all_unified)
                         r = cg_get_path(controller, path, "memory.current", &p);
+                else
+                        r = cg_get_path(controller, path, "memory.usage_in_bytes", &p);
                 if (r < 0)
                         return r;
 
@@ -270,15 +299,14 @@ static int process(
                 if (g->memory > 0)
                         g->memory_valid = true;
 
-        } else if ((streq(controller, "io") && cg_unified() > 0) ||
-                   (streq(controller, "blkio") && cg_unified() <= 0)) {
+        } else if ((streq(controller, "io") && all_unified) ||
+                   (streq(controller, "blkio") && !all_unified)) {
                 _cleanup_fclose_ FILE *f = NULL;
                 _cleanup_free_ char *p = NULL;
-                bool unified = cg_unified() > 0;
                 uint64_t wr = 0, rd = 0;
                 nsec_t timestamp;
 
-                r = cg_get_path(controller, path, unified ? "io.stat" : "blkio.io_service_bytes", &p);
+                r = cg_get_path(controller, path, all_unified ? "io.stat" : "blkio.io_service_bytes", &p);
                 if (r < 0)
                         return r;
 
@@ -301,7 +329,7 @@ static int process(
                         l += strcspn(l, WHITESPACE);
                         l += strspn(l, WHITESPACE);
 
-                        if (unified) {
+                        if (all_unified) {
                                 while (!isempty(l)) {
                                         if (sscanf(l, "rbytes=%" SCNu64, &k))
                                                 rd += k;
@@ -408,7 +436,7 @@ static int refresh_one(
                 if (r == 0)
                         break;
 
-                p = strjoin(path, "/", fn, NULL);
+                p = strjoin(path, "/", fn);
                 if (!p)
                         return -ENOMEM;
 
@@ -449,6 +477,9 @@ static int refresh(const char *root, Hashmap *a, Hashmap *b, unsigned iteration)
         r = refresh_one(SYSTEMD_CGROUP_CONTROLLER, root, a, b, iteration, 0, NULL);
         if (r < 0)
                 return r;
+        r = refresh_one("cpu", root, a, b, iteration, 0, NULL);
+        if (r < 0)
+                return r;
         r = refresh_one("cpuacct", root, a, b, iteration, 0, NULL);
         if (r < 0)
                 return r;
@@ -702,7 +733,6 @@ static int parse_argv(int argc, char *argv[]) {
                 {}
         };
 
-        bool recursive_unset = false;
         int c, r;
 
         assert(argc >= 1);
@@ -822,7 +852,7 @@ static int parse_argv(int argc, char *argv[]) {
                         }
 
                         arg_recursive = r;
-                        recursive_unset = r == 0;
+                        arg_recursive_unset = r == 0;
                         break;
 
                 case 'M':
@@ -836,22 +866,13 @@ static int parse_argv(int argc, char *argv[]) {
                         assert_not_reached("Unhandled option");
                 }
 
-        if (optind == argc-1) {
-                if (arg_machine) {
-                        log_error("Specifying a control group path together with the -M option is not allowed");
-                        return -EINVAL;
-                }
+        if (optind == argc - 1)
                 arg_root = argv[optind];
-        else if (optind < argc) {
+        else if (optind < argc) {
                 log_error("Too many arguments.");
                 return -EINVAL;
         }
 
-        if (recursive_unset && arg_count == COUNT_PIDS) {
-                log_error("Non-recursive counting is only supported when counting processes, not tasks. Use -P or -k.");
-                return -EINVAL;
-        }
-
         return 1;
 }
 
@@ -864,59 +885,6 @@ static const char* counting_what(void) {
                 return "userspace processes (excl. kernel)";
 }
 
-static int get_cgroup_root(char **ret) {
-        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
-        _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
-        _cleanup_free_ char *unit = NULL, *path = NULL;
-        const char *m;
-        int r;
-
-        if (arg_root) {
-                char *aux;
-
-                aux = strdup(arg_root);
-                if (!aux)
-                        return log_oom();
-
-                *ret = aux;
-                return 0;
-        }
-
-        if (!arg_machine) {
-                r = cg_get_root_path(ret);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to get root control group path: %m");
-
-                return 0;
-        }
-
-        m = strjoina("/run/systemd/machines/", arg_machine);
-        r = parse_env_file(m, NEWLINE, "SCOPE", &unit, NULL);
-        if (r < 0)
-                return log_error_errno(r, "Failed to load machine data: %m");
-
-        path = unit_dbus_path_from_name(unit);
-        if (!path)
-                return log_oom();
-
-        r = bus_connect_transport_systemd(BUS_TRANSPORT_LOCAL, NULL, false, &bus);
-        if (r < 0)
-                return log_error_errno(r, "Failed to create bus connection: %m");
-
-        r = sd_bus_get_property_string(
-                        bus,
-                        "org.freedesktop.systemd1",
-                        path,
-                        unit_dbus_interface_from_name(unit),
-                        "ControlGroup",
-                        &error,
-                        ret);
-        if (r < 0)
-                return log_error_errno(r, "Failed to query unit control group path: %s", bus_error_message(&error, r));
-
-        return 0;
-}
-
 int main(int argc, char *argv[]) {
         int r;
         Hashmap *a = NULL, *b = NULL;
@@ -929,6 +897,10 @@ int main(int argc, char *argv[]) {
         log_parse_environment();
         log_open();
 
+        r = parse_argv(argc, argv);
+        if (r <= 0)
+                goto finish;
+
         r = cg_mask_supported(&mask);
         if (r < 0) {
                 log_error_errno(r, "Failed to determine supported controllers: %m");
@@ -937,15 +909,17 @@ int main(int argc, char *argv[]) {
 
         arg_count = (mask & CGROUP_MASK_PIDS) ? COUNT_PIDS : COUNT_USERSPACE_PROCESSES;
 
-        r = parse_argv(argc, argv);
-        if (r <= 0)
-                goto finish;
+        if (arg_recursive_unset && arg_count == COUNT_PIDS) {
+                log_error("Non-recursive counting is only supported when counting processes, not tasks. Use -P or -k.");
+                return -EINVAL;
+        }
 
-        r = get_cgroup_root(&root);
+        r = show_cgroup_get_path_and_warn(arg_machine, arg_root, &root);
         if (r < 0) {
                 log_error_errno(r, "Failed to get root control group path: %m");
                 goto finish;
-        }
+        } else
+                log_debug("Cgroup path: %s", root);
 
         a = hashmap_new(&string_hash_ops);
         b = hashmap_new(&string_hash_ops);
index 76afe3f..a91906b 100644 (file)
@@ -27,6 +27,7 @@
 #include <libaudit.h>
 #include <stdbool.h>
 
+#include "capability-util.h"
 #include "fd-util.h"
 #include "log.h"
 #include "util.h"
@@ -37,6 +38,13 @@ static int audit_fd;
 int get_audit_fd(void) {
 
         if (!initialized) {
+                if (have_effective_cap(CAP_AUDIT_WRITE) == 0) {
+                        audit_fd = -EPERM;
+                        initialized = true;
+
+                        return audit_fd;
+                }
+
                 audit_fd = audit_open();
 
                 if (audit_fd < 0) {
index 3131dca..0f72854 100644 (file)
@@ -34,7 +34,7 @@
 #include "bus-util.h"
 #include "dbus-automount.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "io-util.h"
 #include "label.h"
 #include "mkdir.h"
@@ -101,17 +101,17 @@ static void unmount_autofs(Automount *a) {
         a->pipe_event_source = sd_event_source_unref(a->pipe_event_source);
         a->pipe_fd = safe_close(a->pipe_fd);
 
-        /* If we reload/reexecute things we keep the mount point
-         * around */
-        if (a->where &&
-            (UNIT(a)->manager->exit_code != MANAGER_RELOAD &&
-             UNIT(a)->manager->exit_code != MANAGER_REEXECUTE)) {
+        /* If we reload/reexecute things we keep the mount point around */
+        if (!IN_SET(UNIT(a)->manager->exit_code, MANAGER_RELOAD, MANAGER_REEXECUTE)) {
+
                 automount_send_ready(a, a->tokens, -EHOSTDOWN);
                 automount_send_ready(a, a->expire_tokens, -EHOSTDOWN);
 
-                r = repeat_unmount(a->where, MNT_DETACH);
-                if (r < 0)
-                        log_error_errno(r, "Failed to unmount: %m");
+                if (a->where) {
+                        r = repeat_unmount(a->where, MNT_DETACH);
+                        if (r < 0)
+                                log_error_errno(r, "Failed to unmount: %m");
+                }
         }
 }
 
@@ -186,6 +186,22 @@ static int automount_verify(Automount *a) {
         return 0;
 }
 
+static int automount_set_where(Automount *a) {
+        int r;
+
+        assert(a);
+
+        if (a->where)
+                return 0;
+
+        r = unit_name_to_path(UNIT(a)->id, &a->where);
+        if (r < 0)
+                return r;
+
+        path_kill_slashes(a->where);
+        return 1;
+}
+
 static int automount_load(Unit *u) {
         Automount *a = AUTOMOUNT(u);
         int r;
@@ -201,13 +217,9 @@ static int automount_load(Unit *u) {
         if (u->load_state == UNIT_LOADED) {
                 Unit *x;
 
-                if (!a->where) {
-                        r = unit_name_to_path(u->id, &a->where);
-                        if (r < 0)
-                                return r;
-                }
-
-                path_kill_slashes(a->where);
+                r = automount_set_where(a);
+                if (r < 0)
+                        return r;
 
                 r = unit_load_related_unit(u, ".mount", &x);
                 if (r < 0)
@@ -256,21 +268,30 @@ static int automount_coldplug(Unit *u) {
         assert(a);
         assert(a->state == AUTOMOUNT_DEAD);
 
-        if (a->deserialized_state != a->state) {
+        if (a->deserialized_state == a->state)
+                return 0;
+
+        if (IN_SET(a->deserialized_state, AUTOMOUNT_WAITING, AUTOMOUNT_RUNNING)) {
+
+                r = automount_set_where(a);
+                if (r < 0)
+                        return r;
 
                 r = open_dev_autofs(u->manager);
                 if (r < 0)
                         return r;
 
-                if (a->deserialized_state == AUTOMOUNT_WAITING ||
-                    a->deserialized_state == AUTOMOUNT_RUNNING) {
-                        assert(a->pipe_fd >= 0);
+                assert(a->pipe_fd >= 0);
 
-                        r = sd_event_add_io(u->manager->event, &a->pipe_event_source, a->pipe_fd, EPOLLIN, automount_dispatch_io, u);
-                        if (r < 0)
-                                return r;
+                r = sd_event_add_io(u->manager->event, &a->pipe_event_source, a->pipe_fd, EPOLLIN, automount_dispatch_io, u);
+                if (r < 0)
+                        return r;
 
-                        (void) sd_event_source_set_description(a->pipe_event_source, "automount-io");
+                (void) sd_event_source_set_description(a->pipe_event_source, "automount-io");
+                if (a->deserialized_state == AUTOMOUNT_RUNNING) {
+                        r = automount_start_expire(a);
+                        if (r < 0)
+                                log_unit_warning_errno(UNIT(a), r, "Failed to start expiration timer, ignoring: %m");
                 }
 
                 automount_set_state(a, a->deserialized_state);
@@ -301,7 +322,7 @@ static void automount_dump(Unit *u, FILE *f, const char *prefix) {
 static void automount_enter_dead(Automount *a, AutomountResult f) {
         assert(a);
 
-        if (f != AUTOMOUNT_SUCCESS)
+        if (a->result == AUTOMOUNT_SUCCESS)
                 a->result = f;
 
         automount_set_state(a, a->result != AUTOMOUNT_SUCCESS ? AUTOMOUNT_FAILED : AUTOMOUNT_DEAD);
@@ -394,8 +415,11 @@ static int autofs_set_timeout(int dev_autofs_fd, int ioctl_fd, usec_t usec) {
         init_autofs_dev_ioctl(&param);
         param.ioctlfd = ioctl_fd;
 
-        /* Convert to seconds, rounding up. */
-        param.timeout.timeout = (usec + USEC_PER_SEC - 1) / USEC_PER_SEC;
+        if (usec == USEC_INFINITY)
+                param.timeout.timeout = 0;
+        else
+                /* Convert to seconds, rounding up. */
+                param.timeout.timeout = (usec + USEC_PER_SEC - 1) / USEC_PER_SEC;
 
         if (ioctl(dev_autofs_fd, AUTOFS_DEV_IOCTL_TIMEOUT, &param) < 0)
                 return -errno;
@@ -450,10 +474,10 @@ static int automount_send_ready(Automount *a, Set *tokens, int status) {
         while ((token = PTR_TO_UINT(set_steal_first(tokens)))) {
                 int k;
 
-                /* Autofs fun fact II:
+                /* Autofs fun fact:
                  *
-                 * if you pass a positive status code here, the kernel will
-                 * freeze! Yay! */
+                 * if you pass a positive status code here, kernels
+                 * prior to 4.12 will freeze! Yay! */
 
                 k = autofs_send_ready(UNIT(a)->manager->dev_autofs_fd,
                                       ioctl_fd,
@@ -595,12 +619,6 @@ static void automount_enter_waiting(Automount *a) {
         if (r < 0)
                 goto fail;
 
-        /* Autofs fun fact:
-         *
-         * Unless we close the ioctl fd here, for some weird reason
-         * the direct mount will not receive events from the
-         * kernel. */
-
         r = sd_event_add_io(UNIT(a)->manager->event, &a->pipe_event_source, p[0], EPOLLIN, automount_dispatch_io, a);
         if (r < 0)
                 goto fail;
@@ -729,6 +747,12 @@ static void automount_enter_running(Automount *a) {
 
         assert(a);
 
+        /* If the user masked our unit in the meantime, fail */
+        if (UNIT(a)->load_state != UNIT_LOADED) {
+                log_unit_error(UNIT(a), "Suppressing automount event since unit is no longer loaded.");
+                goto fail;
+        }
+
         /* We don't take mount requests anymore if we are supposed to
          * shut down anyway */
         if (unit_stop_pending(UNIT(a))) {
@@ -781,7 +805,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, 0) > 0) {
+        if (path_is_mount_point(a->where, NULL, 0) > 0) {
                 log_unit_error(u, "Path %s is already a mount point, refusing start.", a->where);
                 return -EEXIST;
         }
@@ -798,6 +822,10 @@ static int automount_start(Unit *u) {
                 return r;
         }
 
+        r = unit_acquire_invocation_id(u);
+        if (r < 0)
+                return r;
+
         a->result = AUTOMOUNT_SUCCESS;
         automount_enter_waiting(a);
         return 1;
@@ -942,7 +970,6 @@ static int automount_dispatch_io(sd_event_source *s, int fd, uint32_t events, vo
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         union autofs_v5_packet_union packet;
         Automount *a = AUTOMOUNT(userdata);
-        struct stat st;
         Unit *trigger;
         int r;
 
@@ -1004,18 +1031,6 @@ static int automount_dispatch_io(sd_event_source *s, int fd, uint32_t events, vo
                         goto fail;
                 }
 
-                /* Before we do anything, let's see if somebody is playing games with us? */
-                if (lstat(a->where, &st) < 0) {
-                        log_unit_warning_errno(UNIT(a), errno, "Failed to stat automount point: %m");
-                        goto fail;
-                }
-
-                if (!S_ISDIR(st.st_mode) || st.st_dev == a->dev_id) {
-                        log_unit_info(UNIT(a), "Automount point already unmounted?");
-                        automount_send_ready(a, a->expire_tokens, 0);
-                        break;
-                }
-
                 trigger = UNIT_TRIGGER(UNIT(a));
                 if (!trigger) {
                         log_unit_error(UNIT(a), "Unit to trigger vanished.");
@@ -1108,6 +1123,9 @@ const UnitVTable automount_vtable = {
         .reset_failed = automount_reset_failed,
 
         .bus_vtable = bus_automount_vtable,
+        .bus_set_property = bus_automount_set_property,
+
+        .can_transient = true,
 
         .shutdown = automount_shutdown,
         .supported = automount_supported,
index 0633b41..bec818f 100644 (file)
@@ -28,7 +28,7 @@
 #include "busname.h"
 #include "dbus-busname.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "parse-util.h"
 #include "process-util.h"
 #include "service.h"
@@ -442,7 +442,7 @@ fail:
 static void busname_enter_dead(BusName *n, BusNameResult f) {
         assert(n);
 
-        if (f != BUSNAME_SUCCESS)
+        if (n->result == BUSNAME_SUCCESS)
                 n->result = f;
 
         busname_set_state(n, n->result != BUSNAME_SUCCESS ? BUSNAME_FAILED : BUSNAME_DEAD);
@@ -454,7 +454,7 @@ static void busname_enter_signal(BusName *n, BusNameState state, BusNameResult f
 
         assert(n);
 
-        if (f != BUSNAME_SUCCESS)
+        if (n->result == BUSNAME_SUCCESS)
                 n->result = f;
 
         kill_context_init(&kill_context);
@@ -639,6 +639,10 @@ static int busname_start(Unit *u) {
                 return r;
         }
 
+        r = unit_acquire_invocation_id(u);
+        if (r < 0)
+                return r;
+
         n->result = BUSNAME_SUCCESS;
         busname_enter_making(n);
 
@@ -760,7 +764,7 @@ static int busname_peek_message(BusName *n) {
         struct kdbus_item *d;
         struct kdbus_msg *k;
         size_t start, ps, sz, delta;
-        void *p = NULL;
+        void *p = MAP_FAILED;
         pid_t pid = 0;
         int r;
 
@@ -821,7 +825,7 @@ static int busname_peek_message(BusName *n) {
         r = 0;
 
 finish:
-        if (p)
+        if (p != MAP_FAILED)
                 (void) munmap(p, sz);
 
         cmd_free.offset = cmd_recv.msg.offset;
@@ -868,7 +872,7 @@ static void busname_sigchld_event(Unit *u, pid_t pid, int code, int status) {
 
         n->control_pid = 0;
 
-        if (is_clean_exit(code, status, NULL))
+        if (is_clean_exit(code, status, EXIT_CLEAN_COMMAND, NULL))
                 f = BUSNAME_SUCCESS;
         else if (code == CLD_EXITED)
                 f = BUSNAME_FAILURE_EXIT_CODE;
@@ -882,7 +886,7 @@ static void busname_sigchld_event(Unit *u, pid_t pid, int code, int status) {
         log_unit_full(u, f == BUSNAME_SUCCESS ? LOG_DEBUG : LOG_NOTICE, 0,
                       "Control process exited, code=%s status=%i", sigchld_code_to_string(code), status);
 
-        if (f != BUSNAME_SUCCESS)
+        if (n->result == BUSNAME_SUCCESS)
                 n->result = f;
 
         switch (n->state) {
index e622656..d95d236 100644 (file)
@@ -59,12 +59,16 @@ void cgroup_context_init(CGroupContext *c) {
         /* Initialize everything to the kernel defaults, assuming the
          * structure is preinitialized to 0 */
 
+        c->cpu_weight = CGROUP_WEIGHT_INVALID;
+        c->startup_cpu_weight = CGROUP_WEIGHT_INVALID;
+        c->cpu_quota_per_sec_usec = USEC_INFINITY;
+
         c->cpu_shares = CGROUP_CPU_SHARES_INVALID;
         c->startup_cpu_shares = CGROUP_CPU_SHARES_INVALID;
-        c->cpu_quota_per_sec_usec = USEC_INFINITY;
 
         c->memory_high = CGROUP_LIMIT_MAX;
         c->memory_max = CGROUP_LIMIT_MAX;
+        c->memory_swap_max = CGROUP_LIMIT_MAX;
 
         c->memory_limit = CGROUP_LIMIT_MAX;
 
@@ -160,6 +164,8 @@ void cgroup_context_dump(CGroupContext *c, FILE* f, const char *prefix) {
                 "%sBlockIOAccounting=%s\n"
                 "%sMemoryAccounting=%s\n"
                 "%sTasksAccounting=%s\n"
+                "%sCPUWeight=%" PRIu64 "\n"
+                "%sStartupCPUWeight=%" PRIu64 "\n"
                 "%sCPUShares=%" PRIu64 "\n"
                 "%sStartupCPUShares=%" PRIu64 "\n"
                 "%sCPUQuotaPerSecSec=%s\n"
@@ -170,6 +176,7 @@ void cgroup_context_dump(CGroupContext *c, FILE* f, const char *prefix) {
                 "%sMemoryLow=%" PRIu64 "\n"
                 "%sMemoryHigh=%" PRIu64 "\n"
                 "%sMemoryMax=%" PRIu64 "\n"
+                "%sMemorySwapMax=%" PRIu64 "\n"
                 "%sMemoryLimit=%" PRIu64 "\n"
                 "%sTasksMax=%" PRIu64 "\n"
                 "%sDevicePolicy=%s\n"
@@ -179,6 +186,8 @@ void cgroup_context_dump(CGroupContext *c, FILE* f, const char *prefix) {
                 prefix, yes_no(c->blockio_accounting),
                 prefix, yes_no(c->memory_accounting),
                 prefix, yes_no(c->tasks_accounting),
+                prefix, c->cpu_weight,
+                prefix, c->startup_cpu_weight,
                 prefix, c->cpu_shares,
                 prefix, c->startup_cpu_shares,
                 prefix, format_timespan(u, sizeof(u), c->cpu_quota_per_sec_usec, 1),
@@ -189,6 +198,7 @@ void cgroup_context_dump(CGroupContext *c, FILE* f, const char *prefix) {
                 prefix, c->memory_low,
                 prefix, c->memory_high,
                 prefix, c->memory_max,
+                prefix, c->memory_swap_max,
                 prefix, c->memory_limit,
                 prefix, c->tasks_max,
                 prefix, cgroup_device_policy_to_string(c->device_policy),
@@ -279,14 +289,24 @@ static int lookup_block_device(const char *p, dev_t *dev) {
 static int whitelist_device(const char *path, const char *node, const char *acc) {
         char buf[2+DECIMAL_STR_MAX(dev_t)*2+2+4];
         struct stat st;
+        bool ignore_notfound;
         int r;
 
         assert(path);
         assert(acc);
 
+        if (node[0] == '-') {
+                /* Non-existent paths starting with "-" must be silently ignored */
+                node++;
+                ignore_notfound = true;
+        } else
+                ignore_notfound = false;
+
         if (stat(node, &st) < 0) {
-                log_warning("Couldn't stat device %s", node);
-                return -errno;
+                if (errno == ENOENT && ignore_notfound)
+                        return 0;
+
+                return log_warning_errno(errno, "Couldn't stat device %s: %m", node);
         }
 
         if (!S_ISCHR(st.st_mode) && !S_ISBLK(st.st_mode)) {
@@ -380,8 +400,96 @@ static int whitelist_major(const char *path, const char *name, char type, const
         return 0;
 
 fail:
-        log_warning_errno(errno, "Failed to read /proc/devices: %m");
-        return -errno;
+        return log_warning_errno(errno, "Failed to read /proc/devices: %m");
+}
+
+static bool cgroup_context_has_cpu_weight(CGroupContext *c) {
+        return c->cpu_weight != CGROUP_WEIGHT_INVALID ||
+                c->startup_cpu_weight != CGROUP_WEIGHT_INVALID;
+}
+
+static bool cgroup_context_has_cpu_shares(CGroupContext *c) {
+        return c->cpu_shares != CGROUP_CPU_SHARES_INVALID ||
+                c->startup_cpu_shares != CGROUP_CPU_SHARES_INVALID;
+}
+
+static uint64_t cgroup_context_cpu_weight(CGroupContext *c, ManagerState state) {
+        if (IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING) &&
+            c->startup_cpu_weight != CGROUP_WEIGHT_INVALID)
+                return c->startup_cpu_weight;
+        else if (c->cpu_weight != CGROUP_WEIGHT_INVALID)
+                return c->cpu_weight;
+        else
+                return CGROUP_WEIGHT_DEFAULT;
+}
+
+static uint64_t cgroup_context_cpu_shares(CGroupContext *c, ManagerState state) {
+        if (IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING) &&
+            c->startup_cpu_shares != CGROUP_CPU_SHARES_INVALID)
+                return c->startup_cpu_shares;
+        else if (c->cpu_shares != CGROUP_CPU_SHARES_INVALID)
+                return c->cpu_shares;
+        else
+                return CGROUP_CPU_SHARES_DEFAULT;
+}
+
+static void cgroup_apply_unified_cpu_config(Unit *u, uint64_t weight, uint64_t quota) {
+        char buf[MAX(DECIMAL_STR_MAX(uint64_t) + 1, (DECIMAL_STR_MAX(usec_t) + 1) * 2)];
+        int r;
+
+        xsprintf(buf, "%" PRIu64 "\n", weight);
+        r = cg_set_attribute("cpu", u->cgroup_path, "cpu.weight", buf);
+        if (r < 0)
+                log_unit_full(u, IN_SET(r, -ENOENT, -EROFS, -EACCES) ? LOG_DEBUG : LOG_WARNING, r,
+                              "Failed to set cpu.weight: %m");
+
+        if (quota != USEC_INFINITY)
+                xsprintf(buf, USEC_FMT " " USEC_FMT "\n",
+                         quota * CGROUP_CPU_QUOTA_PERIOD_USEC / USEC_PER_SEC, CGROUP_CPU_QUOTA_PERIOD_USEC);
+        else
+                xsprintf(buf, "max " USEC_FMT "\n", CGROUP_CPU_QUOTA_PERIOD_USEC);
+
+        r = cg_set_attribute("cpu", u->cgroup_path, "cpu.max", buf);
+
+        if (r < 0)
+                log_unit_full(u, IN_SET(r, -ENOENT, -EROFS, -EACCES) ? LOG_DEBUG : LOG_WARNING, r,
+                              "Failed to set cpu.max: %m");
+}
+
+static void cgroup_apply_legacy_cpu_config(Unit *u, uint64_t shares, uint64_t quota) {
+        char buf[MAX(DECIMAL_STR_MAX(uint64_t), DECIMAL_STR_MAX(usec_t)) + 1];
+        int r;
+
+        xsprintf(buf, "%" PRIu64 "\n", shares);
+        r = cg_set_attribute("cpu", u->cgroup_path, "cpu.shares", buf);
+        if (r < 0)
+                log_unit_full(u, IN_SET(r, -ENOENT, -EROFS, -EACCES) ? LOG_DEBUG : LOG_WARNING, r,
+                              "Failed to set cpu.shares: %m");
+
+        xsprintf(buf, USEC_FMT "\n", CGROUP_CPU_QUOTA_PERIOD_USEC);
+        r = cg_set_attribute("cpu", u->cgroup_path, "cpu.cfs_period_us", buf);
+        if (r < 0)
+                log_unit_full(u, IN_SET(r, -ENOENT, -EROFS, -EACCES) ? LOG_DEBUG : LOG_WARNING, r,
+                              "Failed to set cpu.cfs_period_us: %m");
+
+        if (quota != USEC_INFINITY) {
+                xsprintf(buf, USEC_FMT "\n", quota * CGROUP_CPU_QUOTA_PERIOD_USEC / USEC_PER_SEC);
+                r = cg_set_attribute("cpu", u->cgroup_path, "cpu.cfs_quota_us", buf);
+        } else
+                r = cg_set_attribute("cpu", u->cgroup_path, "cpu.cfs_quota_us", "-1");
+        if (r < 0)
+                log_unit_full(u, IN_SET(r, -ENOENT, -EROFS, -EACCES) ? LOG_DEBUG : LOG_WARNING, r,
+                              "Failed to set cpu.cfs_quota_us: %m");
+}
+
+static uint64_t cgroup_cpu_shares_to_weight(uint64_t shares) {
+        return CLAMP(shares * CGROUP_WEIGHT_DEFAULT / CGROUP_CPU_SHARES_DEFAULT,
+                     CGROUP_WEIGHT_MIN, CGROUP_WEIGHT_MAX);
+}
+
+static uint64_t cgroup_cpu_weight_to_shares(uint64_t weight) {
+        return CLAMP(weight * CGROUP_CPU_SHARES_DEFAULT / CGROUP_WEIGHT_DEFAULT,
+                     CGROUP_CPU_SHARES_MIN, CGROUP_CPU_SHARES_MAX);
 }
 
 static bool cgroup_context_has_io_config(CGroupContext *c) {
@@ -523,7 +631,7 @@ static unsigned cgroup_apply_blkio_device_limit(Unit *u, const char *dev_path, u
 }
 
 static bool cgroup_context_has_unified_memory_config(CGroupContext *c) {
-        return c->memory_low > 0 || c->memory_high != CGROUP_LIMIT_MAX || c->memory_max != CGROUP_LIMIT_MAX;
+        return c->memory_low > 0 || c->memory_high != CGROUP_LIMIT_MAX || c->memory_max != CGROUP_LIMIT_MAX || c->memory_swap_max != CGROUP_LIMIT_MAX;
 }
 
 static void cgroup_apply_unified_memory_limit(Unit *u, const char *file, uint64_t v) {
@@ -568,30 +676,42 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
          * and missing cgroups, i.e. EROFS and ENOENT. */
 
         if ((mask & CGROUP_MASK_CPU) && !is_root) {
-                char buf[MAX(DECIMAL_STR_MAX(uint64_t), DECIMAL_STR_MAX(usec_t)) + 1];
+                bool has_weight = cgroup_context_has_cpu_weight(c);
+                bool has_shares = cgroup_context_has_cpu_shares(c);
 
-                sprintf(buf, "%" PRIu64 "\n",
-                        IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING) && c->startup_cpu_shares != CGROUP_CPU_SHARES_INVALID ? c->startup_cpu_shares :
-                        c->cpu_shares != CGROUP_CPU_SHARES_INVALID ? c->cpu_shares : CGROUP_CPU_SHARES_DEFAULT);
-                r = cg_set_attribute("cpu", path, "cpu.shares", buf);
-                if (r < 0)
-                        log_unit_full(u, IN_SET(r, -ENOENT, -EROFS, -EACCES) ? LOG_DEBUG : LOG_WARNING, r,
-                                      "Failed to set cpu.shares: %m");
+                if (cg_all_unified() > 0) {
+                        uint64_t weight;
 
-                sprintf(buf, USEC_FMT "\n", CGROUP_CPU_QUOTA_PERIOD_USEC);
-                r = cg_set_attribute("cpu", path, "cpu.cfs_period_us", buf);
-                if (r < 0)
-                        log_unit_full(u, IN_SET(r, -ENOENT, -EROFS, -EACCES) ? LOG_DEBUG : LOG_WARNING, r,
-                                      "Failed to set cpu.cfs_period_us: %m");
+                        if (has_weight)
+                                weight = cgroup_context_cpu_weight(c, state);
+                        else if (has_shares) {
+                                uint64_t shares = cgroup_context_cpu_shares(c, state);
 
-                if (c->cpu_quota_per_sec_usec != USEC_INFINITY) {
-                        sprintf(buf, USEC_FMT "\n", c->cpu_quota_per_sec_usec * CGROUP_CPU_QUOTA_PERIOD_USEC / USEC_PER_SEC);
-                        r = cg_set_attribute("cpu", path, "cpu.cfs_quota_us", buf);
-                } else
-                        r = cg_set_attribute("cpu", path, "cpu.cfs_quota_us", "-1");
-                if (r < 0)
-                        log_unit_full(u, IN_SET(r, -ENOENT, -EROFS, -EACCES) ? LOG_DEBUG : LOG_WARNING, r,
-                                      "Failed to set cpu.cfs_quota_us: %m");
+                                weight = cgroup_cpu_shares_to_weight(shares);
+
+                                log_cgroup_compat(u, "Applying [Startup]CpuShares %" PRIu64 " as [Startup]CpuWeight %" PRIu64 " on %s",
+                                                  shares, weight, path);
+                        } else
+                                weight = CGROUP_WEIGHT_DEFAULT;
+
+                        cgroup_apply_unified_cpu_config(u, weight, c->cpu_quota_per_sec_usec);
+                } else {
+                        uint64_t shares;
+
+                        if (has_weight) {
+                                uint64_t weight = cgroup_context_cpu_weight(c, state);
+
+                                shares = cgroup_cpu_weight_to_shares(weight);
+
+                                log_cgroup_compat(u, "Applying [Startup]CpuWeight %" PRIu64 " as [Startup]CpuShares %" PRIu64 " on %s",
+                                                  weight, shares, path);
+                        } else if (has_shares)
+                                shares = cgroup_context_cpu_shares(c, state);
+                        else
+                                shares = CGROUP_CPU_SHARES_DEFAULT;
+
+                        cgroup_apply_legacy_cpu_config(u, shares, c->cpu_quota_per_sec_usec);
+                }
         }
 
         if (mask & CGROUP_MASK_IO) {
@@ -679,16 +799,16 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
                         char buf[DECIMAL_STR_MAX(uint64_t)+1];
                         uint64_t weight;
 
-                        if (has_blockio)
-                                weight = cgroup_context_blkio_weight(c, state);
-                        else if (has_io) {
+                        if (has_io) {
                                 uint64_t io_weight = cgroup_context_io_weight(c, state);
 
                                 weight = cgroup_weight_io_to_blkio(cgroup_context_io_weight(c, state));
 
                                 log_cgroup_compat(u, "Applying [Startup]IOWeight %" PRIu64 " as [Startup]BlockIOWeight %" PRIu64,
                                                   io_weight, weight);
-                        } else
+                        } else if (has_blockio)
+                                weight = cgroup_context_blkio_weight(c, state);
+                        else
                                 weight = CGROUP_BLKIO_WEIGHT_DEFAULT;
 
                         xsprintf(buf, "%" PRIu64 "\n", weight);
@@ -697,13 +817,7 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
                                 log_unit_full(u, IN_SET(r, -ENOENT, -EROFS, -EACCES) ? LOG_DEBUG : LOG_WARNING, r,
                                               "Failed to set blkio.weight: %m");
 
-                        if (has_blockio) {
-                                CGroupBlockIODeviceWeight *w;
-
-                                /* FIXME: no way to reset this list */
-                                LIST_FOREACH(device_weights, w, c->blockio_device_weights)
-                                        cgroup_apply_blkio_device_weight(u, w->path, w->weight);
-                        } else if (has_io) {
+                        if (has_io) {
                                 CGroupIODeviceWeight *w;
 
                                 /* FIXME: no way to reset this list */
@@ -715,18 +829,17 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
 
                                         cgroup_apply_blkio_device_weight(u, w->path, weight);
                                 }
+                        } else if (has_blockio) {
+                                CGroupBlockIODeviceWeight *w;
+
+                                /* FIXME: no way to reset this list */
+                                LIST_FOREACH(device_weights, w, c->blockio_device_weights)
+                                        cgroup_apply_blkio_device_weight(u, w->path, w->weight);
                         }
                 }
 
                 /* Apply limits and free ones without config. */
-                if (has_blockio) {
-                        CGroupBlockIODeviceBandwidth *b, *next;
-
-                        LIST_FOREACH_SAFE(device_bandwidths, b, next, c->blockio_device_bandwidths) {
-                                if (!cgroup_apply_blkio_device_limit(u, b->path, b->rbps, b->wbps))
-                                        cgroup_context_free_blockio_device_bandwidth(c, b);
-                        }
-                } else if (has_io) {
+                if (has_io) {
                         CGroupIODeviceLimit *l, *next;
 
                         LIST_FOREACH_SAFE(device_limits, l, next, c->io_device_limits) {
@@ -736,16 +849,23 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
                                 if (!cgroup_apply_blkio_device_limit(u, l->path, l->limits[CGROUP_IO_RBPS_MAX], l->limits[CGROUP_IO_WBPS_MAX]))
                                         cgroup_context_free_io_device_limit(c, l);
                         }
+                } else if (has_blockio) {
+                        CGroupBlockIODeviceBandwidth *b, *next;
+
+                        LIST_FOREACH_SAFE(device_bandwidths, b, next, c->blockio_device_bandwidths)
+                                if (!cgroup_apply_blkio_device_limit(u, b->path, b->rbps, b->wbps))
+                                        cgroup_context_free_blockio_device_bandwidth(c, b);
                 }
         }
 
         if ((mask & CGROUP_MASK_MEMORY) && !is_root) {
-                if (cg_unified() > 0) {
-                        uint64_t max = c->memory_max;
+                if (cg_all_unified() > 0) {
+                        uint64_t max, swap_max = CGROUP_LIMIT_MAX;
 
-                        if (cgroup_context_has_unified_memory_config(c))
+                        if (cgroup_context_has_unified_memory_config(c)) {
                                 max = c->memory_max;
-                        else {
+                                swap_max = c->memory_swap_max;
+                        } else {
                                 max = c->memory_limit;
 
                                 if (max != CGROUP_LIMIT_MAX)
@@ -755,16 +875,16 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
                         cgroup_apply_unified_memory_limit(u, "memory.low", c->memory_low);
                         cgroup_apply_unified_memory_limit(u, "memory.high", c->memory_high);
                         cgroup_apply_unified_memory_limit(u, "memory.max", max);
+                        cgroup_apply_unified_memory_limit(u, "memory.swap.max", swap_max);
                 } else {
                         char buf[DECIMAL_STR_MAX(uint64_t) + 1];
-                        uint64_t val = c->memory_limit;
+                        uint64_t val;
 
-                        if (val == CGROUP_LIMIT_MAX) {
+                        if (cgroup_context_has_unified_memory_config(c)) {
                                 val = c->memory_max;
-
-                                if (val != CGROUP_LIMIT_MAX)
-                                        log_cgroup_compat(u, "Applying MemoryMax %" PRIi64 " as MemoryLimit", c->memory_max);
-                        }
+                                log_cgroup_compat(u, "Applying MemoryMax %" PRIi64 " as MemoryLimit", val);
+                        } else
+                                val = c->memory_limit;
 
                         if (val == CGROUP_LIMIT_MAX)
                                 strncpy(buf, "-1\n", sizeof(buf));
@@ -804,8 +924,8 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
                                 "/dev/tty\0" "rwm\0"
                                 "/dev/pts/ptmx\0" "rw\0" /* /dev/pts/ptmx may not be duplicated, but accessed */
                                 /* Allow /run/systemd/inaccessible/{chr,blk} devices for mapping InaccessiblePaths */
-                                "/run/systemd/inaccessible/chr\0" "rwm\0"
-                                "/run/systemd/inaccessible/blk\0" "rwm\0";
+                                "-/run/systemd/inaccessible/chr\0" "rwm\0"
+                                "-/run/systemd/inaccessible/blk\0" "rwm\0";
 
                         const char *x, *y;
 
@@ -818,7 +938,7 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
                 }
 
                 LIST_FOREACH(device_allow, a, c->device_allow) {
-                        char acc[4];
+                        char acc[4], *val;
                         unsigned k = 0;
 
                         if (a->r)
@@ -835,10 +955,10 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
 
                         if (startswith(a->path, "/dev/"))
                                 whitelist_device(path, a->path, acc);
-                        else if (startswith(a->path, "block-"))
-                                whitelist_major(path, a->path + 6, 'b', acc);
-                        else if (startswith(a->path, "char-"))
-                                whitelist_major(path, a->path + 5, 'c', acc);
+                        else if ((val = startswith(a->path, "block-")))
+                                whitelist_major(path, val, 'b', acc);
+                        else if ((val = startswith(a->path, "char-")))
+                                whitelist_major(path, val, 'c', acc);
                         else
                                 log_unit_debug(u, "Ignoring device %s while writing cgroup attribute.", a->path);
                 }
@@ -846,7 +966,7 @@ static void cgroup_context_apply(Unit *u, CGroupMask mask, ManagerState state) {
 
         if ((mask & CGROUP_MASK_PIDS) && !is_root) {
 
-                if (c->tasks_max != (uint64_t) -1) {
+                if (c->tasks_max != CGROUP_LIMIT_MAX) {
                         char buf[DECIMAL_STR_MAX(uint64_t) + 2];
 
                         sprintf(buf, "%" PRIu64 "\n", c->tasks_max);
@@ -866,8 +986,8 @@ CGroupMask cgroup_context_get_mask(CGroupContext *c) {
         /* Figure out which controllers we need */
 
         if (c->cpu_accounting ||
-            c->cpu_shares != CGROUP_CPU_SHARES_INVALID ||
-            c->startup_cpu_shares != CGROUP_CPU_SHARES_INVALID ||
+            cgroup_context_has_cpu_weight(c) ||
+            cgroup_context_has_cpu_shares(c) ||
             c->cpu_quota_per_sec_usec != USEC_INFINITY)
                 mask |= CGROUP_MASK_CPUACCT | CGROUP_MASK_CPU;
 
@@ -913,7 +1033,7 @@ CGroupMask unit_get_own_mask(Unit *u) {
                 e = unit_get_exec_context(u);
                 if (!e ||
                     exec_context_maintains_privileges(e) ||
-                    cg_unified() > 0)
+                    cg_all_unified() > 0)
                         return _CGROUP_MASK_ALL;
         }
 
@@ -1091,9 +1211,10 @@ char *unit_default_cgroup_path(Unit *u) {
                 return NULL;
 
         if (slice)
-                return strjoin(u->manager->cgroup_root, "/", slice, "/", escaped, NULL);
+                return strjoin(u->manager->cgroup_root, "/", slice, "/",
+                               escaped);
         else
-                return strjoin(u->manager->cgroup_root, "/", escaped, NULL);
+                return strjoin(u->manager->cgroup_root, "/", escaped);
 }
 
 int unit_set_cgroup_path(Unit *u, const char *path) {
@@ -1139,9 +1260,9 @@ int unit_watch_cgroup(Unit *u) {
                 return 0;
 
         /* Only applies to the unified hierarchy */
-        r = cg_unified();
+        r = cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER);
         if (r < 0)
-                return log_unit_error_errno(u, r, "Failed detect whether the unified hierarchy is used: %m");
+                return log_error_errno(r, "Failed to determine whether the name=systemd hierarchy is unified: %m");
         if (r == 0)
                 return 0;
 
@@ -1249,6 +1370,26 @@ int unit_attach_pids_to_cgroup(Unit *u) {
         return 0;
 }
 
+static void cgroup_xattr_apply(Unit *u) {
+        char ids[SD_ID128_STRING_MAX];
+        int r;
+
+        assert(u);
+
+        if (!MANAGER_IS_SYSTEM(u->manager))
+                return;
+
+        if (sd_id128_is_null(u->invocation_id))
+                return;
+
+        r = cg_set_xattr(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path,
+                         "trusted.invocation_id",
+                         sd_id128_to_string(u->invocation_id, ids), 32,
+                         0);
+        if (r < 0)
+                log_unit_warning_errno(u, r, "Failed to set invocation ID on control group %s, ignoring: %m", u->cgroup_path);
+}
+
 static bool unit_has_mask_realized(Unit *u, CGroupMask target_mask, CGroupMask enable_mask) {
         assert(u);
 
@@ -1292,6 +1433,7 @@ static int unit_realize_cgroup_now(Unit *u, ManagerState state) {
 
         /* Finally, apply the necessary attributes. */
         cgroup_context_apply(u, target_mask, state);
+        cgroup_xattr_apply(u);
 
         return 0;
 }
@@ -1418,6 +1560,8 @@ void unit_prune_cgroup(Unit *u) {
         if (!u->cgroup_path)
                 return;
 
+        (void) unit_get_cpu_usage(u, NULL); /* Cache the last CPU usage value before we destroy the cgroup */
+
         is_root_slice = unit_has_name(u, SPECIAL_ROOT_SLICE);
 
         r = cg_trim_everywhere(u->manager->cgroup_supported, u->cgroup_path, !is_root_slice);
@@ -1510,7 +1654,7 @@ static int unit_watch_pids_in_path(Unit *u, const char *path) {
                 while ((r = cg_read_subgroup(d, &fn)) > 0) {
                         _cleanup_free_ char *p = NULL;
 
-                        p = strjoin(path, "/", fn, NULL);
+                        p = strjoin(path, "/", fn);
                         free(fn);
 
                         if (!p)
@@ -1529,6 +1673,8 @@ static int unit_watch_pids_in_path(Unit *u, const char *path) {
 }
 
 int unit_watch_all_pids(Unit *u) {
+        int r;
+
         assert(u);
 
         /* Adds all PIDs from our cgroup to the set of PIDs we
@@ -1539,7 +1685,10 @@ int unit_watch_all_pids(Unit *u) {
         if (!u->cgroup_path)
                 return -ENOENT;
 
-        if (cg_unified() > 0) /* On unified we can use proper notifications */
+        r = cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER);
+        if (r < 0)
+                return r;
+        if (r > 0) /* On unified we can use proper notifications */
                 return 0;
 
         return unit_watch_pids_in_path(u, u->cgroup_path);
@@ -1612,7 +1761,7 @@ static int on_cgroup_inotify_event(sd_event_source *s, int fd, uint32_t revents,
 int manager_setup_cgroup(Manager *m) {
         _cleanup_free_ char *path = NULL;
         CGroupController c;
-        int r, unified;
+        int r, all_unified;
         char *e;
 
         assert(m);
@@ -1657,19 +1806,30 @@ int manager_setup_cgroup(Manager *m) {
         if (r < 0)
                 return log_error_errno(r, "Cannot find cgroup mount point: %m");
 
-        unified = cg_unified();
-        if (unified < 0)
+        r = cg_unified_flush();
+        if (r < 0)
                 return log_error_errno(r, "Couldn't determine if we are running in the unified hierarchy: %m");
-        if (unified > 0)
+
+        all_unified = cg_all_unified();
+        if (r < 0)
+                return log_error_errno(r, "Couldn't determine whether we are in all unified mode: %m");
+        if (r > 0)
                 log_debug("Unified cgroup hierarchy is located at %s.", path);
-        else
-                log_debug("Using cgroup controller " SYSTEMD_CGROUP_CONTROLLER ". File system hierarchy is at %s.", path);
+        else {
+                r = cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to determine whether systemd's own controller is in unified mode: %m");
+                if (r > 0)
+                        log_debug("Unified cgroup hierarchy is located at %s. Controllers are on legacy hierarchies.", path);
+                else
+                        log_debug("Using cgroup controller " SYSTEMD_CGROUP_CONTROLLER_LEGACY ". File system hierarchy is at %s.", path);
+        }
 
         if (!m->test_run) {
                 const char *scope_path;
 
                 /* 3. Install agent */
-                if (unified) {
+                if (cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER) > 0) {
 
                         /* In the unified hierarchy we can get
                          * cgroup empty notifications via inotify. */
@@ -1729,7 +1889,7 @@ int manager_setup_cgroup(Manager *m) {
                         return log_error_errno(errno, "Failed to open pin file: %m");
 
                 /* 6.  Always enable hierarchical support if it exists... */
-                if (!unified)
+                if (!all_unified)
                         (void) cg_set_attribute("memory", "/", "memory.use_hierarchy", "1");
         }
 
@@ -1855,10 +2015,13 @@ int unit_get_memory_current(Unit *u, uint64_t *ret) {
         if ((u->cgroup_realized_mask & CGROUP_MASK_MEMORY) == 0)
                 return -ENODATA;
 
-        if (cg_unified() <= 0)
-                r = cg_get_attribute("memory", u->cgroup_path, "memory.usage_in_bytes", &v);
-        else
+        r = cg_all_unified();
+        if (r < 0)
+                return r;
+        if (r > 0)
                 r = cg_get_attribute("memory", u->cgroup_path, "memory.current", &v);
+        else
+                r = cg_get_attribute("memory", u->cgroup_path, "memory.usage_in_bytes", &v);
         if (r == -ENOENT)
                 return -ENODATA;
         if (r < 0)
@@ -1900,18 +2063,40 @@ static int unit_get_cpu_usage_raw(Unit *u, nsec_t *ret) {
         if (!u->cgroup_path)
                 return -ENODATA;
 
-        if ((u->cgroup_realized_mask & CGROUP_MASK_CPUACCT) == 0)
-                return -ENODATA;
-
-        r = cg_get_attribute("cpuacct", u->cgroup_path, "cpuacct.usage", &v);
-        if (r == -ENOENT)
-                return -ENODATA;
+        r = cg_all_unified();
         if (r < 0)
                 return r;
+        if (r > 0) {
+                const char *keys[] = { "usage_usec", NULL };
+                _cleanup_free_ char *val = NULL;
+                uint64_t us;
 
-        r = safe_atou64(v, &ns);
-        if (r < 0)
-                return r;
+                if ((u->cgroup_realized_mask & CGROUP_MASK_CPU) == 0)
+                        return -ENODATA;
+
+                r = cg_get_keyed_attribute("cpu", u->cgroup_path, "cpu.stat", keys, &val);
+                if (r < 0)
+                        return r;
+
+                r = safe_atou64(val, &us);
+                if (r < 0)
+                        return r;
+
+                ns = us * NSEC_PER_USEC;
+        } else {
+                if ((u->cgroup_realized_mask & CGROUP_MASK_CPUACCT) == 0)
+                        return -ENODATA;
+
+                r = cg_get_attribute("cpuacct", u->cgroup_path, "cpuacct.usage", &v);
+                if (r == -ENOENT)
+                        return -ENODATA;
+                if (r < 0)
+                        return r;
+
+                r = safe_atou64(v, &ns);
+                if (r < 0)
+                        return r;
+        }
 
         *ret = ns;
         return 0;
@@ -1921,16 +2106,33 @@ int unit_get_cpu_usage(Unit *u, nsec_t *ret) {
         nsec_t ns;
         int r;
 
+        assert(u);
+
+        /* Retrieve the current CPU usage counter. This will subtract the CPU counter taken when the unit was
+         * started. If the cgroup has been removed already, returns the last cached value. To cache the value, simply
+         * call this function with a NULL return value. */
+
         r = unit_get_cpu_usage_raw(u, &ns);
+        if (r == -ENODATA && u->cpu_usage_last != NSEC_INFINITY) {
+                /* If we can't get the CPU usage anymore (because the cgroup was already removed, for example), use our
+                 * cached value. */
+
+                if (ret)
+                        *ret = u->cpu_usage_last;
+                return 0;
+        }
         if (r < 0)
                 return r;
 
-        if (ns > u->cpuacct_usage_base)
-                ns -= u->cpuacct_usage_base;
+        if (ns > u->cpu_usage_base)
+                ns -= u->cpu_usage_base;
         else
                 ns = 0;
 
-        *ret = ns;
+        u->cpu_usage_last = ns;
+        if (ret)
+                *ret = ns;
+
         return 0;
 }
 
@@ -1940,13 +2142,15 @@ int unit_reset_cpu_usage(Unit *u) {
 
         assert(u);
 
+        u->cpu_usage_last = NSEC_INFINITY;
+
         r = unit_get_cpu_usage_raw(u, &ns);
         if (r < 0) {
-                u->cpuacct_usage_base = 0;
+                u->cpu_usage_base = 0;
                 return r;
         }
 
-        u->cpuacct_usage_base = ns;
+        u->cpu_usage_base = ns;
         return 0;
 }
 
index a57403e..4cd168f 100644 (file)
@@ -89,6 +89,10 @@ struct CGroupContext {
         bool tasks_accounting;
 
         /* For unified hierarchy */
+        uint64_t cpu_weight;
+        uint64_t startup_cpu_weight;
+        usec_t cpu_quota_per_sec_usec;
+
         uint64_t io_weight;
         uint64_t startup_io_weight;
         LIST_HEAD(CGroupIODeviceWeight, io_device_weights);
@@ -97,11 +101,11 @@ struct CGroupContext {
         uint64_t memory_low;
         uint64_t memory_high;
         uint64_t memory_max;
+        uint64_t memory_swap_max;
 
         /* For legacy hierarchies */
         uint64_t cpu_shares;
         uint64_t startup_cpu_shares;
-        usec_t cpu_quota_per_sec_usec;
 
         uint64_t blockio_weight;
         uint64_t startup_blockio_weight;
index b2806ad..26212b3 100644 (file)
@@ -32,3 +32,57 @@ const sd_bus_vtable bus_automount_vtable[] = {
         SD_BUS_PROPERTY("TimeoutIdleUSec", "t", bus_property_get_usec, offsetof(Automount, timeout_idle_usec), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_VTABLE_END
 };
+
+static int bus_automount_set_transient_property(
+                Automount *a,
+                const char *name,
+                sd_bus_message *message,
+                UnitSetPropertiesMode mode,
+                sd_bus_error *error) {
+
+        int r;
+
+        assert(a);
+        assert(name);
+        assert(message);
+
+        if (streq(name, "TimeoutIdleUSec")) {
+                usec_t timeout_idle_usec;
+                r = sd_bus_message_read(message, "t", &timeout_idle_usec);
+                if (r < 0)
+                        return r;
+
+                if (mode != UNIT_CHECK) {
+                        char time[FORMAT_TIMESPAN_MAX];
+
+                        a->timeout_idle_usec = timeout_idle_usec;
+                        unit_write_drop_in_format(UNIT(a), mode, name, "[Automount]\nTimeoutIdleSec=%s\n",
+                                format_timespan(time, sizeof(time), timeout_idle_usec, USEC_PER_MSEC));
+                }
+        } else
+                return 0;
+
+        return 1;
+}
+
+int bus_automount_set_property(
+                Unit *u,
+                const char *name,
+                sd_bus_message *message,
+                UnitSetPropertiesMode mode,
+                sd_bus_error *error) {
+
+        Automount *a = AUTOMOUNT(u);
+        int r = 0;
+
+        assert(a);
+        assert(name);
+        assert(message);
+
+        if (u->transient && u->load_state == UNIT_STUB)
+                /* This is a transient unit, let's load a little more */
+
+                r = bus_automount_set_transient_property(a, name, message, mode, error);
+
+        return r;
+}
index 7b51eb9..f41adda 100644 (file)
@@ -21,3 +21,5 @@
 
 
 extern const sd_bus_vtable bus_automount_vtable[];
+
+int bus_automount_set_property(Unit *u, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
index 85b0c86..12d3ca0 100644 (file)
@@ -210,6 +210,8 @@ const sd_bus_vtable bus_cgroup_vtable[] = {
         SD_BUS_VTABLE_START(0),
         SD_BUS_PROPERTY("Delegate", "b", bus_property_get_bool, offsetof(CGroupContext, delegate), 0),
         SD_BUS_PROPERTY("CPUAccounting", "b", bus_property_get_bool, offsetof(CGroupContext, cpu_accounting), 0),
+        SD_BUS_PROPERTY("CPUWeight", "t", NULL, offsetof(CGroupContext, cpu_weight), 0),
+        SD_BUS_PROPERTY("StartupCPUWeight", "t", NULL, offsetof(CGroupContext, startup_cpu_weight), 0),
         SD_BUS_PROPERTY("CPUShares", "t", NULL, offsetof(CGroupContext, cpu_shares), 0),
         SD_BUS_PROPERTY("StartupCPUShares", "t", NULL, offsetof(CGroupContext, startup_cpu_shares), 0),
         SD_BUS_PROPERTY("CPUQuotaPerSecUSec", "t", bus_property_get_usec, offsetof(CGroupContext, cpu_quota_per_sec_usec), 0),
@@ -231,6 +233,7 @@ const sd_bus_vtable bus_cgroup_vtable[] = {
         SD_BUS_PROPERTY("MemoryLow", "t", NULL, offsetof(CGroupContext, memory_low), 0),
         SD_BUS_PROPERTY("MemoryHigh", "t", NULL, offsetof(CGroupContext, memory_high), 0),
         SD_BUS_PROPERTY("MemoryMax", "t", NULL, offsetof(CGroupContext, memory_max), 0),
+        SD_BUS_PROPERTY("MemorySwapMax", "t", NULL, offsetof(CGroupContext, memory_swap_max), 0),
         SD_BUS_PROPERTY("MemoryLimit", "t", NULL, offsetof(CGroupContext, memory_limit), 0),
         SD_BUS_PROPERTY("DevicePolicy", "s", property_get_cgroup_device_policy, offsetof(CGroupContext, device_policy), 0),
         SD_BUS_PROPERTY("DeviceAllow", "a(ss)", property_get_device_allow, 0, 0),
@@ -303,6 +306,50 @@ int bus_cgroup_set_property(
 
                 return 1;
 
+        } else if (streq(name, "CPUWeight")) {
+                uint64_t weight;
+
+                r = sd_bus_message_read(message, "t", &weight);
+                if (r < 0)
+                        return r;
+
+                if (!CGROUP_WEIGHT_IS_OK(weight))
+                        return sd_bus_error_set_errnof(error, EINVAL, "CPUWeight value out of range");
+
+                if (mode != UNIT_CHECK) {
+                        c->cpu_weight = weight;
+                        unit_invalidate_cgroup(u, CGROUP_MASK_CPU);
+
+                        if (weight == CGROUP_WEIGHT_INVALID)
+                                unit_write_drop_in_private(u, mode, name, "CPUWeight=");
+                        else
+                                unit_write_drop_in_private_format(u, mode, name, "CPUWeight=%" PRIu64, weight);
+                }
+
+                return 1;
+
+        } else if (streq(name, "StartupCPUWeight")) {
+                uint64_t weight;
+
+                r = sd_bus_message_read(message, "t", &weight);
+                if (r < 0)
+                        return r;
+
+                if (!CGROUP_WEIGHT_IS_OK(weight))
+                        return sd_bus_error_set_errnof(error, EINVAL, "StartupCPUWeight value out of range");
+
+                if (mode != UNIT_CHECK) {
+                        c->startup_cpu_weight = weight;
+                        unit_invalidate_cgroup(u, CGROUP_MASK_CPU);
+
+                        if (weight == CGROUP_CPU_SHARES_INVALID)
+                                unit_write_drop_in_private(u, mode, name, "StartupCPUWeight=");
+                        else
+                                unit_write_drop_in_private_format(u, mode, name, "StartupCPUWeight=%" PRIu64, weight);
+                }
+
+                return 1;
+
         } else if (streq(name, "CPUShares")) {
                 uint64_t shares;
 
@@ -360,7 +407,15 @@ int bus_cgroup_set_property(
                 if (mode != UNIT_CHECK) {
                         c->cpu_quota_per_sec_usec = u64;
                         unit_invalidate_cgroup(u, CGROUP_MASK_CPU);
-                        unit_write_drop_in_private_format(u, mode, "CPUQuota", "CPUQuota=%0.f%%", (double) (c->cpu_quota_per_sec_usec / 10000));
+                        if (c->cpu_quota_per_sec_usec == USEC_INFINITY)
+                                unit_write_drop_in_private_format(u, mode, "CPUQuota",
+                                                                  "CPUQuota=");
+                        else
+                                /* config_parse_cpu_quota() requires an integer, so
+                                 * truncating division is used on purpose here. */
+                                unit_write_drop_in_private_format(u, mode, "CPUQuota",
+                                                                  "CPUQuota=%0.f%%",
+                                                                  (double) (c->cpu_quota_per_sec_usec / 10000));
                 }
 
                 return 1;
@@ -829,7 +884,7 @@ int bus_cgroup_set_property(
 
                 return 1;
 
-        } else if (STR_IN_SET(name, "MemoryLow", "MemoryHigh", "MemoryMax")) {
+        } else if (STR_IN_SET(name, "MemoryLow", "MemoryHigh", "MemoryMax", "MemorySwapMax")) {
                 uint64_t v;
 
                 r = sd_bus_message_read(message, "t", &v);
@@ -843,6 +898,8 @@ int bus_cgroup_set_property(
                                 c->memory_low = v;
                         else if (streq(name, "MemoryHigh"))
                                 c->memory_high = v;
+                        else if (streq(name, "MemorySwapMax"))
+                                c->memory_swap_max = v;
                         else
                                 c->memory_max = v;
 
index 3030cbc..a5b8eac 100644 (file)
@@ -34,6 +34,7 @@
 #include "fileio.h"
 #include "ioprio.h"
 #include "missing.h"
+#include "mount-util.h"
 #include "namespace.h"
 #include "parse-util.h"
 #include "path-util.h"
@@ -44,6 +45,8 @@
 #endif
 #include "strv.h"
 #include "syslog-util.h"
+#include "unit-printf.h"
+#include "user-util.h"
 #include "utf8.h"
 
 BUS_DEFINE_PROPERTY_GET_ENUM(bus_property_get_exec_output, exec_output, ExecOutput);
@@ -157,21 +160,50 @@ static int property_get_ioprio(
 
 
         ExecContext *c = userdata;
-        int32_t n;
 
         assert(bus);
         assert(reply);
         assert(c);
 
-        if (c->ioprio_set)
-                n = c->ioprio;
-        else {
-                n = ioprio_get(IOPRIO_WHO_PROCESS, 0);
-                if (n < 0)
-                        n = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 4);
-        }
+        return sd_bus_message_append(reply, "i", exec_context_get_effective_ioprio(c));
+}
 
-        return sd_bus_message_append(reply, "i", n);
+static int property_get_ioprio_class(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+
+        ExecContext *c = userdata;
+
+        assert(bus);
+        assert(reply);
+        assert(c);
+
+        return sd_bus_message_append(reply, "i", IOPRIO_PRIO_CLASS(exec_context_get_effective_ioprio(c)));
+}
+
+static int property_get_ioprio_priority(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+
+        ExecContext *c = userdata;
+
+        assert(bus);
+        assert(reply);
+        assert(c);
+
+        return sd_bus_message_append(reply, "i", IOPRIO_PRIO_DATA(exec_context_get_effective_ioprio(c)));
 }
 
 static int property_get_cpu_sched_policy(
@@ -656,6 +688,96 @@ static int property_get_syslog_facility(
         return sd_bus_message_append(reply, "i", LOG_FAC(c->syslog_priority));
 }
 
+static int property_get_input_fdname(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        ExecContext *c = userdata;
+        const char *name;
+
+        assert(bus);
+        assert(c);
+        assert(property);
+        assert(reply);
+
+        name = exec_context_fdname(c, STDIN_FILENO);
+
+        return sd_bus_message_append(reply, "s", name);
+}
+
+static int property_get_output_fdname(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        ExecContext *c = userdata;
+        const char *name = NULL;
+
+        assert(bus);
+        assert(c);
+        assert(property);
+        assert(reply);
+
+        if (c->std_output == EXEC_OUTPUT_NAMED_FD && streq(property, "StandardOutputFileDescriptorName"))
+                name = exec_context_fdname(c, STDOUT_FILENO);
+        else if (c->std_error == EXEC_OUTPUT_NAMED_FD && streq(property, "StandardErrorFileDescriptorName"))
+                name = exec_context_fdname(c, STDERR_FILENO);
+
+        return sd_bus_message_append(reply, "s", name);
+}
+
+static int property_get_bind_paths(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        ExecContext *c = userdata;
+        unsigned i;
+        bool ro;
+        int r;
+
+        assert(bus);
+        assert(c);
+        assert(property);
+        assert(reply);
+
+        ro = !!strstr(property, "ReadOnly");
+
+        r = sd_bus_message_open_container(reply, 'a', "(ssbt)");
+        if (r < 0)
+                return r;
+
+        for (i = 0; i < c->n_bind_mounts; i++) {
+
+                if (ro != c->bind_mounts[i].read_only)
+                        continue;
+
+                r = sd_bus_message_append(
+                                reply, "(ssbt)",
+                                c->bind_mounts[i].source,
+                                c->bind_mounts[i].destination,
+                                c->bind_mounts[i].ignore_enoent,
+                                c->bind_mounts[i].recursive ? (uint64_t) MS_REC : (uint64_t) 0);
+                if (r < 0)
+                        return r;
+        }
+
+        return sd_bus_message_close_container(reply);
+}
+
 const sd_bus_vtable bus_exec_vtable[] = {
         SD_BUS_VTABLE_START(0),
         SD_BUS_PROPERTY("Environment", "as", NULL, offsetof(ExecContext, environment), SD_BUS_VTABLE_PROPERTY_CONST),
@@ -696,9 +818,11 @@ const sd_bus_vtable bus_exec_vtable[] = {
         SD_BUS_PROPERTY("LimitRTTIMESoft", "t", bus_property_get_rlimit, offsetof(ExecContext, rlimit[RLIMIT_RTTIME]), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("WorkingDirectory", "s", property_get_working_directory, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("RootDirectory", "s", NULL, offsetof(ExecContext, root_directory), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("RootImage", "s", NULL, offsetof(ExecContext, root_image), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("OOMScoreAdjust", "i", property_get_oom_score_adjust, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("Nice", "i", property_get_nice, 0, SD_BUS_VTABLE_PROPERTY_CONST),
-        SD_BUS_PROPERTY("IOScheduling", "i", property_get_ioprio, 0, SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("IOSchedulingClass", "i", property_get_ioprio_class, 0, SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("IOSchedulingPriority", "i", property_get_ioprio_priority, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("CPUSchedulingPolicy", "i", property_get_cpu_sched_policy, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("CPUSchedulingPriority", "i", property_get_cpu_sched_priority, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("CPUAffinity", "ay", property_get_cpu_affinity, 0, SD_BUS_VTABLE_PROPERTY_CONST),
@@ -706,8 +830,11 @@ const sd_bus_vtable bus_exec_vtable[] = {
         SD_BUS_PROPERTY("CPUSchedulingResetOnFork", "b", bus_property_get_bool, offsetof(ExecContext, cpu_sched_reset_on_fork), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("NonBlocking", "b", bus_property_get_bool, offsetof(ExecContext, non_blocking), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("StandardInput", "s", property_get_exec_input, offsetof(ExecContext, std_input), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("StandardInputFileDescriptorName", "s", property_get_input_fdname, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("StandardOutput", "s", bus_property_get_exec_output, offsetof(ExecContext, std_output), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("StandardOutputFileDescriptorName", "s", property_get_output_fdname, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("StandardError", "s", bus_property_get_exec_output, offsetof(ExecContext, std_error), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("StandardErrorFileDescriptorName", "s", property_get_output_fdname, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("TTYPath", "s", NULL, offsetof(ExecContext, tty_path), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("TTYReset", "b", bus_property_get_bool, offsetof(ExecContext, tty_reset), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("TTYVHangup", "b", bus_property_get_bool, offsetof(ExecContext, tty_vhangup), SD_BUS_VTABLE_PROPERTY_CONST),
@@ -717,24 +844,26 @@ const sd_bus_vtable bus_exec_vtable[] = {
         SD_BUS_PROPERTY("SyslogLevelPrefix", "b", bus_property_get_bool, offsetof(ExecContext, syslog_level_prefix), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("SyslogLevel", "i", property_get_syslog_level, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("SyslogFacility", "i", property_get_syslog_facility, 0, SD_BUS_VTABLE_PROPERTY_CONST),
-        SD_BUS_PROPERTY("Capabilities", "s", property_get_capabilities, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("SecureBits", "i", bus_property_get_int, offsetof(ExecContext, secure_bits), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("CapabilityBoundingSet", "t", property_get_capability_bounding_set, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("AmbientCapabilities", "t", property_get_ambient_capabilities, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("User", "s", NULL, offsetof(ExecContext, user), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("Group", "s", NULL, offsetof(ExecContext, group), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("DynamicUser", "b", bus_property_get_bool, offsetof(ExecContext, dynamic_user), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("RemoveIPC", "b", bus_property_get_bool, offsetof(ExecContext, remove_ipc), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("SupplementaryGroups", "as", NULL, offsetof(ExecContext, supplementary_groups), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("PAMName", "s", NULL, offsetof(ExecContext, pam_name), SD_BUS_VTABLE_PROPERTY_CONST),
-        SD_BUS_PROPERTY("ReadWriteDirectories", "as", NULL, offsetof(ExecContext, read_write_paths), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
-        SD_BUS_PROPERTY("ReadOnlyDirectories", "as", NULL, offsetof(ExecContext, read_only_paths), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
-        SD_BUS_PROPERTY("InaccessibleDirectories", "as", NULL, offsetof(ExecContext, inaccessible_paths), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
         SD_BUS_PROPERTY("ReadWritePaths", "as", NULL, offsetof(ExecContext, read_write_paths), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("ReadOnlyPaths", "as", NULL, offsetof(ExecContext, read_only_paths), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("InaccessiblePaths", "as", NULL, offsetof(ExecContext, inaccessible_paths), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("MountFlags", "t", bus_property_get_ulong, offsetof(ExecContext, mount_flags), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("PrivateTmp", "b", bus_property_get_bool, offsetof(ExecContext, private_tmp), SD_BUS_VTABLE_PROPERTY_CONST),
-        SD_BUS_PROPERTY("PrivateNetwork", "b", bus_property_get_bool, offsetof(ExecContext, private_network), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("PrivateDevices", "b", bus_property_get_bool, offsetof(ExecContext, private_devices), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("ProtectKernelTunables", "b", bus_property_get_bool, offsetof(ExecContext, protect_kernel_tunables), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("ProtectKernelModules", "b", bus_property_get_bool, offsetof(ExecContext, protect_kernel_modules), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("ProtectControlGroups", "b", bus_property_get_bool, offsetof(ExecContext, protect_control_groups), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("PrivateNetwork", "b", bus_property_get_bool, offsetof(ExecContext, private_network), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("PrivateUsers", "b", bus_property_get_bool, offsetof(ExecContext, private_users), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("ProtectHome", "s", bus_property_get_protect_home, offsetof(ExecContext, protect_home), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("ProtectSystem", "s", bus_property_get_protect_system, offsetof(ExecContext, protect_system), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("SameProcessGroup", "b", bus_property_get_bool, offsetof(ExecContext, same_pgrp), SD_BUS_VTABLE_PROPERTY_CONST),
@@ -754,6 +883,18 @@ const sd_bus_vtable bus_exec_vtable[] = {
         SD_BUS_PROPERTY("RuntimeDirectory", "as", NULL, offsetof(ExecContext, runtime_directory), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("MemoryDenyWriteExecute", "b", bus_property_get_bool, offsetof(ExecContext, memory_deny_write_execute), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("RestrictRealtime", "b", bus_property_get_bool, offsetof(ExecContext, restrict_realtime), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("RestrictNamespaces", "t", bus_property_get_ulong, offsetof(ExecContext, restrict_namespaces), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("BindPaths", "a(ssbt)", property_get_bind_paths, 0, SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("BindReadOnlyPaths", "a(ssbt)", property_get_bind_paths, 0, SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("MountAPIVFS", "b", bus_property_get_bool, offsetof(ExecContext, mount_apivfs), SD_BUS_VTABLE_PROPERTY_CONST),
+
+        /* Obsolete/redundant properties: */
+        SD_BUS_PROPERTY("Capabilities", "s", property_get_capabilities, 0, SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("ReadWriteDirectories", "as", NULL, offsetof(ExecContext, read_write_paths), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
+        SD_BUS_PROPERTY("ReadOnlyDirectories", "as", NULL, offsetof(ExecContext, read_only_paths), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
+        SD_BUS_PROPERTY("InaccessibleDirectories", "as", NULL, offsetof(ExecContext, inaccessible_paths), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
+        SD_BUS_PROPERTY("IOScheduling", "i", property_get_ioprio, 0, SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
+
         SD_BUS_VTABLE_END
 };
 
@@ -870,6 +1011,9 @@ int bus_exec_context_set_transient_property(
                 if (r < 0)
                         return r;
 
+                if (!isempty(uu) && !valid_user_group_name_or_id(uu))
+                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid user name: %s", uu);
+
                 if (mode != UNIT_CHECK) {
 
                         if (isempty(uu))
@@ -889,6 +1033,9 @@ int bus_exec_context_set_transient_property(
                 if (r < 0)
                         return r;
 
+                if (!isempty(gg) && !valid_user_group_name_or_id(gg))
+                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid group name: %s", gg);
+
                 if (mode != UNIT_CHECK) {
 
                         if (isempty(gg))
@@ -919,7 +1066,7 @@ int bus_exec_context_set_transient_property(
 
                 return 1;
         } else if (streq(name, "SyslogLevel")) {
-                int level;
+                int32_t level;
 
                 r = sd_bus_message_read(message, "i", &level);
                 if (r < 0)
@@ -935,7 +1082,7 @@ int bus_exec_context_set_transient_property(
 
                 return 1;
         } else if (streq(name, "SyslogFacility")) {
-                int facility;
+                int32_t facility;
 
                 r = sd_bus_message_read(message, "i", &facility);
                 if (r < 0)
@@ -951,13 +1098,13 @@ int bus_exec_context_set_transient_property(
 
                 return 1;
         } else if (streq(name, "Nice")) {
-                int n;
+                int32_t n;
 
                 r = sd_bus_message_read(message, "i", &n);
                 if (r < 0)
                         return r;
 
-                if (n < PRIO_MIN || n >= PRIO_MAX)
+                if (!nice_is_valid(n))
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Nice value out of range");
 
                 if (mode != UNIT_CHECK) {
@@ -967,7 +1114,51 @@ int bus_exec_context_set_transient_property(
 
                 return 1;
 
-        } else if (STR_IN_SET(name, "TTYPath", "RootDirectory")) {
+        } else if (streq(name, "IOSchedulingClass")) {
+                int32_t q;
+
+                r = sd_bus_message_read(message, "i", &q);
+                if (r < 0)
+                        return r;
+
+                if (!ioprio_class_is_valid(q))
+                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid IO scheduling class: %i", q);
+
+                if (mode != UNIT_CHECK) {
+                        _cleanup_free_ char *s = NULL;
+
+                        r = ioprio_class_to_string_alloc(q, &s);
+                        if (r < 0)
+                                return r;
+
+                        c->ioprio = IOPRIO_PRIO_VALUE(q, IOPRIO_PRIO_DATA(c->ioprio));
+                        c->ioprio_set = true;
+
+                        unit_write_drop_in_private_format(u, mode, name, "IOSchedulingClass=%s", s);
+                }
+
+                return 1;
+
+        } else if (streq(name, "IOSchedulingPriority")) {
+                int32_t p;
+
+                r = sd_bus_message_read(message, "i", &p);
+                if (r < 0)
+                        return r;
+
+                if (!ioprio_priority_is_valid(p))
+                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid IO scheduling priority: %i", p);
+
+                if (mode != UNIT_CHECK) {
+                        c->ioprio = IOPRIO_PRIO_VALUE(IOPRIO_PRIO_CLASS(c->ioprio), p);
+                        c->ioprio_set = true;
+
+                        unit_write_drop_in_private_format(u, mode, name, "IOSchedulingPriority=%i", p);
+                }
+
+                return 1;
+
+        } else if (STR_IN_SET(name, "TTYPath", "RootDirectory", "RootImage")) {
                 const char *s;
 
                 r = sd_bus_message_read(message, "s", &s);
@@ -980,6 +1171,8 @@ int bus_exec_context_set_transient_property(
                 if (mode != UNIT_CHECK) {
                         if (streq(name, "TTYPath"))
                                 r = free_and_strdup(&c->tty_path, s);
+                        else if (streq(name, "RootImage"))
+                                r = free_and_strdup(&c->root_image, s);
                         else {
                                 assert(streq(name, "RootDirectory"));
                                 r = free_and_strdup(&c->root_directory, s);
@@ -1047,7 +1240,6 @@ int bus_exec_context_set_transient_property(
 
                 return 1;
 
-
         } else if (streq(name, "StandardOutput")) {
                 const char *s;
                 ExecOutput p;
@@ -1089,9 +1281,46 @@ int bus_exec_context_set_transient_property(
                 return 1;
 
         } else if (STR_IN_SET(name,
+                              "StandardInputFileDescriptorName", "StandardOutputFileDescriptorName", "StandardErrorFileDescriptorName")) {
+                const char *s;
+
+                r = sd_bus_message_read(message, "s", &s);
+                if (r < 0)
+                        return r;
+
+                if (!fdname_is_valid(s))
+                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid file descriptor name");
+
+                if (mode != UNIT_CHECK) {
+                        if (streq(name, "StandardInputFileDescriptorName")) {
+                                c->std_input = EXEC_INPUT_NAMED_FD;
+                                r = free_and_strdup(&c->stdio_fdname[STDIN_FILENO], s);
+                                if (r < 0)
+                                        return r;
+                                unit_write_drop_in_private_format(u, mode, name, "StandardInput=fd:%s", s);
+                        } else if (streq(name, "StandardOutputFileDescriptorName")) {
+                                c->std_output = EXEC_OUTPUT_NAMED_FD;
+                                r = free_and_strdup(&c->stdio_fdname[STDOUT_FILENO], s);
+                                if (r < 0)
+                                        return r;
+                                unit_write_drop_in_private_format(u, mode, name, "StandardOutput=fd:%s", s);
+                        } else if (streq(name, "StandardErrorFileDescriptorName")) {
+                                c->std_error = EXEC_OUTPUT_NAMED_FD;
+                                r = free_and_strdup(&c->stdio_fdname[STDERR_FILENO], s);
+                                if (r < 0)
+                                        return r;
+                                unit_write_drop_in_private_format(u, mode, name, "StandardError=fd:%s", s);
+                        }
+                }
+
+                return 1;
+
+        } else if (STR_IN_SET(name,
                               "IgnoreSIGPIPE", "TTYVHangup", "TTYReset",
-                              "PrivateTmp", "PrivateDevices", "PrivateNetwork",
-                              "NoNewPrivileges", "SyslogLevelPrefix", "MemoryDenyWriteExecute", "RestrictRealtime")) {
+                              "PrivateTmp", "PrivateDevices", "PrivateNetwork", "PrivateUsers",
+                              "NoNewPrivileges", "SyslogLevelPrefix", "MemoryDenyWriteExecute",
+                              "RestrictRealtime", "DynamicUser", "RemoveIPC", "ProtectKernelTunables",
+                              "ProtectKernelModules", "ProtectControlGroups", "MountAPIVFS")) {
                 int b;
 
                 r = sd_bus_message_read(message, "b", &b);
@@ -1111,6 +1340,8 @@ int bus_exec_context_set_transient_property(
                                 c->private_devices = b;
                         else if (streq(name, "PrivateNetwork"))
                                 c->private_network = b;
+                        else if (streq(name, "PrivateUsers"))
+                                c->private_users = b;
                         else if (streq(name, "NoNewPrivileges"))
                                 c->no_new_privileges = b;
                         else if (streq(name, "SyslogLevelPrefix"))
@@ -1119,6 +1350,18 @@ int bus_exec_context_set_transient_property(
                                 c->memory_deny_write_execute = b;
                         else if (streq(name, "RestrictRealtime"))
                                 c->restrict_realtime = b;
+                        else if (streq(name, "DynamicUser"))
+                                c->dynamic_user = b;
+                        else if (streq(name, "RemoveIPC"))
+                                c->remove_ipc = b;
+                        else if (streq(name, "ProtectKernelTunables"))
+                                c->protect_kernel_tunables = b;
+                        else if (streq(name, "ProtectKernelModules"))
+                                c->protect_kernel_modules = b;
+                        else if (streq(name, "ProtectControlGroups"))
+                                c->protect_control_groups = b;
+                        else if (streq(name, "MountAPIVFS"))
+                                c->mount_apivfs = b;
 
                         unit_write_drop_in_private_format(u, mode, name, "%s=%s", name, yes_no(b));
                 }
@@ -1183,7 +1426,7 @@ int bus_exec_context_set_transient_property(
 
         } else if (streq(name, "Environment")) {
 
-                _cleanup_strv_free_ char **l = NULL;
+                _cleanup_strv_free_ char **l = NULL, **q = NULL;
 
                 r = sd_bus_message_read_strv(message, &l);
                 if (r < 0)
@@ -1192,22 +1435,27 @@ int bus_exec_context_set_transient_property(
                 if (!strv_env_is_valid(l))
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid environment block.");
 
-                if (mode != UNIT_CHECK) {
-                        _cleanup_free_ char *joined = NULL;
-                        char **e;
+                r = unit_full_printf_strv(u, l, &q);
+                if (r < 0)
+                        return r;
 
-                        if (strv_length(l) == 0) {
+                if (mode != UNIT_CHECK) {
+                        if (strv_length(q) == 0) {
                                 c->environment = strv_free(c->environment);
                                 unit_write_drop_in_private_format(u, mode, name, "Environment=");
                         } else {
-                                e = strv_env_merge(2, c->environment, l);
+                                _cleanup_free_ char *joined = NULL;
+                                char **e;
+
+                                e = strv_env_merge(2, c->environment, q);
                                 if (!e)
                                         return -ENOMEM;
 
                                 strv_free(c->environment);
                                 c->environment = e;
 
-                                joined = strv_join_quoted(c->environment);
+                                /* We write just the new settings out to file, with unresolved specifiers */
+                                joined = strv_join_quoted(q);
                                 if (!joined)
                                         return -ENOMEM;
 
@@ -1254,7 +1502,7 @@ int bus_exec_context_set_transient_property(
 
                 _cleanup_free_ char *joined = NULL;
                 _cleanup_fclose_ FILE *f = NULL;
-                _cleanup_free_ char **l = NULL;
+                _cleanup_strv_free_ char **l = NULL;
                 size_t size = 0;
                 char **i;
 
@@ -1281,13 +1529,13 @@ int bus_exec_context_set_transient_property(
                         if (r < 0)
                                 return r;
 
-                        if (!isempty(path) && !path_is_absolute(path))
-                                return sd_bus_error_set_errnof(error, EINVAL, "Path %s is not absolute.", path);
+                        if (!path_is_absolute(path))
+                                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Path %s is not absolute.", path);
 
                         if (mode != UNIT_CHECK) {
                                 char *buf = NULL;
 
-                                buf = strjoin(b ? "-" : "", path, NULL);
+                                buf = strjoin(b ? "-" : "", path);
                                 if (!buf)
                                         return -ENOMEM;
 
@@ -1367,12 +1615,15 @@ int bus_exec_context_set_transient_property(
                         return r;
 
                 STRV_FOREACH(p, l) {
-                        int offset;
-                        if (!utf8_is_valid(*p))
+                        const char *i = *p;
+                        size_t offset;
+
+                        if (!utf8_is_valid(i))
                                 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid %s", name);
 
-                        offset = **p == '-';
-                        if (!path_is_absolute(*p + offset))
+                        offset = i[0] == '-';
+                        offset += i[offset] == '+';
+                        if (!path_is_absolute(i + offset))
                                 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid %s", name);
                 }
 
@@ -1391,7 +1642,6 @@ int bus_exec_context_set_transient_property(
                                 unit_write_drop_in_private_format(u, mode, name, "%s=", name);
                         } else {
                                 r = strv_extend_strv(dirs, l, true);
-
                                 if (r < 0)
                                         return -ENOMEM;
 
@@ -1510,7 +1760,108 @@ int bus_exec_context_set_transient_property(
                 }
 
                 return 1;
+        } else if (streq(name, "RestrictNamespaces")) {
+                uint64_t flags;
+
+                r = sd_bus_message_read(message, "t", &flags);
+                if (r < 0)
+                        return r;
+                if ((flags & NAMESPACE_FLAGS_ALL) != flags)
+                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unknown namespace types");
+
+                if (mode != UNIT_CHECK) {
+                        _cleanup_free_ char *s = NULL;
+
+                        r = namespace_flag_to_string_many(flags, &s);
+                        if (r < 0)
+                                return r;
+
+                        c->restrict_namespaces = flags;
+                        unit_write_drop_in_private_format(u, mode, name, "%s=%s", name, s);
+                }
+
+                return 1;
+        } else if (streq(name, "MountFlags")) {
+                uint64_t flags;
+
+                r = sd_bus_message_read(message, "t", &flags);
+                if (r < 0)
+                        return r;
+                if (!IN_SET(flags, 0, MS_SHARED, MS_PRIVATE, MS_SLAVE))
+                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unknown mount propagation flags");
+
+                if (mode != UNIT_CHECK) {
+                        c->mount_flags = flags;
+
+                        unit_write_drop_in_private_format(u, mode, name, "%s=%s", name, mount_propagation_flags_to_string(flags));
+                }
+
+                return 1;
+        } else if (STR_IN_SET(name, "BindPaths", "BindReadOnlyPaths")) {
+                unsigned empty = true;
+
+                r = sd_bus_message_enter_container(message, 'a', "(ssbt)");
+                if (r < 0)
+                        return r;
+
+                while ((r = sd_bus_message_enter_container(message, 'r', "ssbt")) > 0) {
+                        const char *source, *destination;
+                        int ignore_enoent;
+                        uint64_t mount_flags;
+
+                        r = sd_bus_message_read(message, "ssbt", &source, &destination, &ignore_enoent, &mount_flags);
+                        if (r < 0)
+                                return r;
+
+                        r = sd_bus_message_exit_container(message);
+                        if (r < 0)
+                                return r;
+
+                        if (!path_is_absolute(source))
+                                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Source path %s is not absolute.", source);
+                        if (!path_is_absolute(destination))
+                                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Destination path %s is not absolute.", destination);
+                        if (!IN_SET(mount_flags, 0, MS_REC))
+                                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unknown mount flags.");
+
+                        if (mode != UNIT_CHECK) {
+                                r = bind_mount_add(&c->bind_mounts, &c->n_bind_mounts,
+                                                   &(BindMount) {
+                                                           .source = strdup(source),
+                                                           .destination = strdup(destination),
+                                                           .read_only = !!strstr(name, "ReadOnly"),
+                                                           .recursive = !!(mount_flags & MS_REC),
+                                                           .ignore_enoent = ignore_enoent,
+                                                   });
+                                if (r < 0)
+                                        return r;
+
+                                unit_write_drop_in_private_format(
+                                                u, mode, name,
+                                                "%s=%s%s:%s:%s",
+                                                name,
+                                                ignore_enoent ? "-" : "",
+                                                source,
+                                                destination,
+                                                (mount_flags & MS_REC) ? "rbind" : "norbind");
+                        }
+
+                        empty = false;
+                }
+                if (r < 0)
+                        return r;
 
+                r = sd_bus_message_exit_container(message);
+                if (r < 0)
+                        return r;
+
+                if (empty) {
+                        bind_mount_free_many(c->bind_mounts, c->n_bind_mounts);
+                        c->bind_mounts = NULL;
+                        c->n_bind_mounts = 0;
+                }
+
+                return 1;
         }
 
         ri = rlimit_from_string(name);
index ccf7453..effc45d 100644 (file)
@@ -65,7 +65,7 @@ int bus_job_method_cancel(sd_bus_message *message, void *userdata, sd_bus_error
                 return r;
 
         /* Access is granted to the job owner */
-        if (!sd_bus_track_contains(j->clients, sd_bus_message_get_sender(message))) {
+        if (!sd_bus_track_contains(j->bus_track, sd_bus_message_get_sender(message))) {
 
                 /* And for everybody else consult PolicyKit */
                 r = bus_verify_manage_units_async(j->unit->manager, message, error);
@@ -80,9 +80,61 @@ int bus_job_method_cancel(sd_bus_message *message, void *userdata, sd_bus_error
         return sd_bus_reply_method_return(message, NULL);
 }
 
+int bus_job_method_get_waiting_jobs(sd_bus_message *message, void *userdata, sd_bus_error *error) {
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+        _cleanup_free_ Job **list = NULL;
+        Job *j = userdata;
+        int r, i, n;
+
+        if (strstr(sd_bus_message_get_member(message), "After"))
+                n = job_get_after(j, &list);
+        else
+                n = job_get_before(j, &list);
+        if (n < 0)
+                return n;
+
+        r = sd_bus_message_new_method_return(message, &reply);
+        if (r < 0)
+                return r;
+
+        r = sd_bus_message_open_container(reply, 'a', "(usssoo)");
+        if (r < 0)
+                return r;
+
+        for (i = 0; i < n; i ++) {
+                _cleanup_free_ char *unit_path = NULL, *job_path = NULL;
+
+                job_path = job_dbus_path(list[i]);
+                if (!job_path)
+                        return -ENOMEM;
+
+                unit_path = unit_dbus_path(list[i]->unit);
+                if (!unit_path)
+                        return -ENOMEM;
+
+                r = sd_bus_message_append(reply, "(usssoo)",
+                                          list[i]->id,
+                                          list[i]->unit->id,
+                                          job_type_to_string(list[i]->type),
+                                          job_state_to_string(list[i]->state),
+                                          job_path,
+                                          unit_path);
+                if (r < 0)
+                        return r;
+        }
+
+        r = sd_bus_message_close_container(reply);
+        if (r < 0)
+                return r;
+
+        return sd_bus_send(NULL, reply, NULL);
+}
+
 const sd_bus_vtable bus_job_vtable[] = {
         SD_BUS_VTABLE_START(0),
         SD_BUS_METHOD("Cancel", NULL, NULL, bus_job_method_cancel, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("GetAfter", NULL, "a(usssoo)", bus_job_method_get_waiting_jobs, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("GetBefore", NULL, "a(usssoo)", bus_job_method_get_waiting_jobs, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_PROPERTY("Id", "u", NULL, offsetof(Job, id), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("Unit", "(so)", property_get_unit, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("JobType", "s", property_get_type, offsetof(Job, type), SD_BUS_VTABLE_PROPERTY_CONST),
@@ -143,7 +195,7 @@ void bus_job_send_change_signal(Job *j) {
                 j->in_dbus_queue = false;
         }
 
-        r = bus_foreach_bus(j->manager, j->clients, j->sent_dbus_new_signal ? send_changed_signal : send_new_signal, j);
+        r = bus_foreach_bus(j->manager, j->bus_track, j->sent_dbus_new_signal ? send_changed_signal : send_new_signal, j);
         if (r < 0)
                 log_debug_errno(r, "Failed to send job change signal for %u: %m", j->id);
 
@@ -187,7 +239,70 @@ void bus_job_send_removed_signal(Job *j) {
         if (!j->sent_dbus_new_signal)
                 bus_job_send_change_signal(j);
 
-        r = bus_foreach_bus(j->manager, j->clients, send_removed_signal, j);
+        r = bus_foreach_bus(j->manager, j->bus_track, send_removed_signal, j);
         if (r < 0)
                 log_debug_errno(r, "Failed to send job remove signal for %u: %m", j->id);
 }
+
+static int bus_job_track_handler(sd_bus_track *t, void *userdata) {
+        Job *j = userdata;
+
+        assert(t);
+        assert(j);
+
+        j->bus_track = sd_bus_track_unref(j->bus_track); /* make sure we aren't called again */
+
+        /* Last client dropped off the bus, maybe we should GC this now? */
+        job_add_to_gc_queue(j);
+        return 0;
+}
+
+static int bus_job_allocate_bus_track(Job *j) {
+
+        assert(j);
+
+        if (j->bus_track)
+                return 0;
+
+        return sd_bus_track_new(j->unit->manager->api_bus, &j->bus_track, bus_job_track_handler, j);
+}
+
+int bus_job_coldplug_bus_track(Job *j) {
+        int r = 0;
+        _cleanup_strv_free_ char **deserialized_clients = NULL;
+
+        assert(j);
+
+        deserialized_clients = j->deserialized_clients;
+        j->deserialized_clients = NULL;
+
+        if (strv_isempty(deserialized_clients))
+                return 0;
+
+        if (!j->manager->api_bus)
+                return 0;
+
+        r = bus_job_allocate_bus_track(j);
+        if (r < 0)
+                return r;
+
+        return bus_track_add_name_many(j->bus_track, deserialized_clients);
+}
+
+int bus_job_track_sender(Job *j, sd_bus_message *m) {
+        int r;
+
+        assert(j);
+        assert(m);
+
+        if (sd_bus_message_get_bus(m) != j->unit->manager->api_bus) {
+                j->ref_by_private_bus = true;
+                return 0;
+        }
+
+        r = bus_job_allocate_bus_track(j);
+        if (r < 0)
+                return r;
+
+        return sd_bus_track_add_sender(j->bus_track, m);
+}
index 024d067..a4366a0 100644 (file)
 extern const sd_bus_vtable bus_job_vtable[];
 
 int bus_job_method_cancel(sd_bus_message *message, void *job, sd_bus_error *error);
+int bus_job_method_get_waiting_jobs(sd_bus_message *message, void *userdata, sd_bus_error *error);
 
 void bus_job_send_change_signal(Job *j);
 void bus_job_send_removed_signal(Job *j);
+
+int bus_job_coldplug_bus_track(Job *j);
+int bus_job_track_sender(Job *j, sd_bus_message *m);
index 932028b..9b5e184 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <errno.h>
 #include <sys/prctl.h>
+#include <sys/statvfs.h>
 #include <unistd.h>
 
 #include "alloc-util.h"
 #include "env-util.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
+#include "fs-util.h"
 #include "install.h"
 #include "log.h"
+#include "parse-util.h"
 #include "path-util.h"
 #include "selinux-access.h"
 #include "stat-util.h"
 #include "string-util.h"
 #include "strv.h"
 #include "syslog-util.h"
+#include "user-util.h"
 #include "virt.h"
 #include "watchdog.h"
 
+/* Require 16MiB free in /run/systemd for reloading/reexecing. After all we need to serialize our state there, and if
+ * we can't we'll fail badly. */
+#define RELOAD_DISK_SPACE_MIN (UINT64_C(16) * UINT64_C(1024) * UINT64_C(1024))
+
+static UnitFileFlags unit_file_bools_to_flags(bool runtime, bool force) {
+        return (runtime ? UNIT_FILE_RUNTIME : 0) |
+               (force   ? UNIT_FILE_FORCE   : 0);
+}
+
 static int property_get_version(
                 sd_bus *bus,
                 const char *path,
@@ -463,6 +476,64 @@ static int method_get_unit_by_pid(sd_bus_message *message, void *userdata, sd_bu
         return sd_bus_reply_method_return(message, "o", path);
 }
 
+static int method_get_unit_by_invocation_id(sd_bus_message *message, void *userdata, sd_bus_error *error) {
+        _cleanup_free_ char *path = NULL;
+        Manager *m = userdata;
+        sd_id128_t id;
+        const void *a;
+        Unit *u;
+        size_t sz;
+        int r;
+
+        assert(message);
+        assert(m);
+
+        /* Anyone can call this method */
+
+        r = sd_bus_message_read_array(message, 'y', &a, &sz);
+        if (r < 0)
+                return r;
+        if (sz == 0)
+                id = SD_ID128_NULL;
+        else if (sz == 16)
+                memcpy(&id, a, sz);
+        else
+                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid invocation ID");
+
+        if (sd_id128_is_null(id)) {
+                _cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
+                pid_t pid;
+
+                r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID, &creds);
+                if (r < 0)
+                        return r;
+
+                r = sd_bus_creds_get_pid(creds, &pid);
+                if (r < 0)
+                        return r;
+
+                u = manager_get_unit_by_pid(m, pid);
+                if (!u)
+                        return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_UNIT, "Client " PID_FMT " not member of any unit.", pid);
+        } else {
+                u = hashmap_get(m->units_by_invocation_id, &id);
+                if (!u)
+                        return sd_bus_error_setf(error, BUS_ERROR_NO_UNIT_FOR_INVOCATION_ID, "No unit with the specified invocation ID " SD_ID128_FORMAT_STR " known.", SD_ID128_FORMAT_VAL(id));
+        }
+
+        r = mac_selinux_unit_access_check(u, message, "status", error);
+        if (r < 0)
+                return r;
+
+        /* So here's a special trick: the bus path we return actually references the unit by its invocation ID instead
+         * of the unit name. This means it stays valid only as long as the invocation ID stays the same. */
+        path = unit_dbus_path_invocation_id(u);
+        if (!path)
+                return -ENOMEM;
+
+        return sd_bus_reply_method_return(message, "o", path);
+}
+
 static int method_load_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
         _cleanup_free_ char *path = NULL;
         Manager *m = userdata;
@@ -642,6 +713,54 @@ static int method_set_unit_properties(sd_bus_message *message, void *userdata, s
         return bus_unit_method_set_properties(message, u, error);
 }
 
+static int method_ref_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
+        Manager *m = userdata;
+        const char *name;
+        Unit *u;
+        int r;
+
+        assert(message);
+        assert(m);
+
+        r = sd_bus_message_read(message, "s", &name);
+        if (r < 0)
+                return r;
+
+        r = manager_load_unit(m, name, NULL, error, &u);
+        if (r < 0)
+                return r;
+
+        r = bus_unit_check_load_state(u, error);
+        if (r < 0)
+                return r;
+
+        return bus_unit_method_ref(message, u, error);
+}
+
+static int method_unref_unit(sd_bus_message *message, void *userdata, sd_bus_error *error) {
+        Manager *m = userdata;
+        const char *name;
+        Unit *u;
+        int r;
+
+        assert(message);
+        assert(m);
+
+        r = sd_bus_message_read(message, "s", &name);
+        if (r < 0)
+                return r;
+
+        r = manager_load_unit(m, name, NULL, error, &u);
+        if (r < 0)
+                return r;
+
+        r = bus_unit_check_load_state(u, error);
+        if (r < 0)
+                return r;
+
+        return bus_unit_method_unref(message, u, error);
+}
+
 static int reply_unit_info(sd_bus_message *reply, Unit *u) {
         _cleanup_free_ char *unit_path = NULL, *job_path = NULL;
         Unit *following;
@@ -729,13 +848,9 @@ static int method_get_unit_processes(sd_bus_message *message, void *userdata, sd
         if (r < 0)
                 return r;
 
-        r = manager_load_unit(m, name, NULL, error, &u);
-        if (r < 0)
-                return r;
-
-        r = bus_unit_check_load_state(u, error);
-        if (r < 0)
-                return r;
+        u = manager_get_unit(m, name);
+        if (!u)
+                return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_UNIT, "Unit %s not loaded.", name);
 
         return bus_unit_method_get_processes(message, u, error);
 }
@@ -780,6 +895,13 @@ static int transient_unit_from_message(
         if (r < 0)
                 return r;
 
+        /* If the client asked for it, automatically add a reference to this unit. */
+        if (u->bus_track_add) {
+                r = bus_unit_track_add_sender(u, message);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to watch sender: %m");
+        }
+
         /* Now load the missing bits of the unit we just created */
         unit_add_to_load_queue(u);
         manager_dispatch_load_queue(m);
@@ -1192,6 +1314,40 @@ static int method_refuse_snapshot(sd_bus_message *message, void *userdata, sd_bu
         return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Support for snapshots has been removed.");
 }
 
+static int verify_run_space(const char *message, sd_bus_error *error) {
+        struct statvfs svfs;
+        uint64_t available;
+
+        if (statvfs("/run/systemd", &svfs) < 0)
+                return sd_bus_error_set_errnof(error, errno, "Failed to statvfs(/run/systemd): %m");
+
+        available = (uint64_t) svfs.f_bfree * (uint64_t) svfs.f_bsize;
+
+        if (available < RELOAD_DISK_SPACE_MIN) {
+                char fb_available[FORMAT_BYTES_MAX], fb_need[FORMAT_BYTES_MAX];
+                return sd_bus_error_setf(error,
+                                         BUS_ERROR_DISK_FULL,
+                                         "%s, not enough space available on /run/systemd. "
+                                         "Currently, %s are free, but a safety buffer of %s is enforced.",
+                                         message,
+                                         format_bytes(fb_available, sizeof(fb_available), available),
+                                         format_bytes(fb_need, sizeof(fb_need), RELOAD_DISK_SPACE_MIN));
+        }
+
+        return 0;
+}
+
+int verify_run_space_and_log(const char *message) {
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        int r;
+
+        r = verify_run_space(message, &error);
+        if (r < 0)
+                log_error_errno(r, "%s", bus_error_message(&error, r));
+
+        return r;
+}
+
 static int method_reload(sd_bus_message *message, void *userdata, sd_bus_error *error) {
         Manager *m = userdata;
         int r;
@@ -1199,6 +1355,10 @@ static int method_reload(sd_bus_message *message, void *userdata, sd_bus_error *
         assert(message);
         assert(m);
 
+        r = verify_run_space("Refusing to reload", error);
+        if (r < 0)
+                return r;
+
         r = mac_selinux_access_check(message, "reload", error);
         if (r < 0)
                 return r;
@@ -1231,6 +1391,10 @@ static int method_reexecute(sd_bus_message *message, void *userdata, sd_bus_erro
         assert(message);
         assert(m);
 
+        r = verify_run_space("Refusing to reexecute", error);
+        if (r < 0)
+                return r;
+
         r = mac_selinux_access_check(message, "reload", error);
         if (r < 0)
                 return r;
@@ -1349,11 +1513,26 @@ static int method_switch_root(sd_bus_message *message, void *userdata, sd_bus_er
         char *ri = NULL, *rt = NULL;
         const char *root, *init;
         Manager *m = userdata;
+        struct statvfs svfs;
+        uint64_t available;
         int r;
 
         assert(message);
         assert(m);
 
+        if (statvfs("/run/systemd", &svfs) < 0)
+                return sd_bus_error_set_errnof(error, errno, "Failed to statvfs(/run/systemd): %m");
+
+        available = (uint64_t) svfs.f_bfree * (uint64_t) svfs.f_bsize;
+
+        if (available < RELOAD_DISK_SPACE_MIN) {
+                char fb_available[FORMAT_BYTES_MAX], fb_need[FORMAT_BYTES_MAX];
+                log_warning("Dangerously low amount of free space on /run/systemd, root switching operation might not complete successfuly. "
+                            "Currently, %s are free, but %s are suggested. Proceeding anyway.",
+                            format_bytes(fb_available, sizeof(fb_available), available),
+                            format_bytes(fb_need, sizeof(fb_need), RELOAD_DISK_SPACE_MIN));
+        }
+
         r = mac_selinux_access_check(message, "reboot", error);
         if (r < 0)
                 return r;
@@ -1365,25 +1544,36 @@ static int method_switch_root(sd_bus_message *message, void *userdata, sd_bus_er
         if (r < 0)
                 return r;
 
-        if (path_equal(root, "/") || !path_is_absolute(root))
-                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid switch root path %s", root);
+        if (isempty(root))
+                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "New root directory may not be the empty string.");
+        if (!path_is_absolute(root))
+                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "New root path '%s' is not absolute.", root);
+        if (path_equal(root, "/"))
+                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "New root directory cannot be the old root directory.");
 
         /* Safety check */
         if (isempty(init)) {
-                if (!path_is_os_tree(root))
-                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Specified switch root path %s does not seem to be an OS tree. os-release file is missing.", root);
+                r = path_is_os_tree(root);
+                if (r < 0)
+                        return sd_bus_error_set_errnof(error, r, "Failed to determine whether root path '%s' contains an OS tree: %m", root);
+                if (r == 0)
+                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Specified switch root path '%s' does not seem to be an OS tree. os-release file is missing.", root);
         } else {
-                _cleanup_free_ char *p = NULL;
+                _cleanup_free_ char *chased = NULL;
 
                 if (!path_is_absolute(init))
-                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid init path %s", init);
+                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Path to init binary '%s' not absolute.", init);
 
-                p = strappend(root, init);
-                if (!p)
-                        return -ENOMEM;
+                r = chase_symlinks(init, root, CHASE_PREFIX_ROOT, &chased);
+                if (r < 0)
+                        return sd_bus_error_set_errnof(error, r, "Could not resolve init executable %s: %m", init);
 
-                if (access(p, X_OK) < 0)
-                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Specified init binary %s does not exist.", p);
+                if (laccess(chased, X_OK) < 0) {
+                        if (errno == EACCES)
+                                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Init binary %s is not executable.", init);
+
+                        return sd_bus_error_set_errnof(error, r, "Could not check whether init binary %s is executable: %m", init);
+                }
         }
 
         rt = strdup(root);
@@ -1511,8 +1701,8 @@ static int method_unset_and_set_environment(sd_bus_message *message, void *userd
 }
 
 static int method_set_exit_code(sd_bus_message *message, void *userdata, sd_bus_error *error) {
-        uint8_t code;
         Manager *m = userdata;
+        uint8_t code;
         int r;
 
         assert(message);
@@ -1534,6 +1724,61 @@ static int method_set_exit_code(sd_bus_message *message, void *userdata, sd_bus_
         return sd_bus_reply_method_return(message, NULL);
 }
 
+static int method_lookup_dynamic_user_by_name(sd_bus_message *message, void *userdata, sd_bus_error *error) {
+        Manager *m = userdata;
+        const char *name;
+        uid_t uid;
+        int r;
+
+        assert(message);
+        assert(m);
+
+        r = sd_bus_message_read_basic(message, 's', &name);
+        if (r < 0)
+                return r;
+
+        if (!MANAGER_IS_SYSTEM(m))
+                return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Dynamic users are only supported in the system instance.");
+        if (!valid_user_group_name(name))
+                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User name invalid: %s", name);
+
+        r = dynamic_user_lookup_name(m, name, &uid);
+        if (r == -ESRCH)
+                return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_DYNAMIC_USER, "Dynamic user %s does not exist.", name);
+        if (r < 0)
+                return r;
+
+        return sd_bus_reply_method_return(message, "u", (uint32_t) uid);
+}
+
+static int method_lookup_dynamic_user_by_uid(sd_bus_message *message, void *userdata, sd_bus_error *error) {
+        _cleanup_free_ char *name = NULL;
+        Manager *m = userdata;
+        uid_t uid;
+        int r;
+
+        assert(message);
+        assert(m);
+
+        assert_cc(sizeof(uid) == sizeof(uint32_t));
+        r = sd_bus_message_read_basic(message, 'u', &uid);
+        if (r < 0)
+                return r;
+
+        if (!MANAGER_IS_SYSTEM(m))
+                return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Dynamic users are only supported in the system instance.");
+        if (!uid_is_valid(uid))
+                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User ID invalid: " UID_FMT, uid);
+
+        r = dynamic_user_lookup_uid(m, uid, &name);
+        if (r == -ESRCH)
+                return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_DYNAMIC_USER, "Dynamic user ID " UID_FMT " does not exist.", uid);
+        if (r < 0)
+                return r;
+
+        return sd_bus_reply_method_return(message, "s", name);
+}
+
 static int list_unit_files_by_patterns(sd_bus_message *message, void *userdata, sd_bus_error *error, char **states, char **patterns) {
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
         Manager *m = userdata;
@@ -1667,63 +1912,6 @@ static int send_unit_files_changed(sd_bus *bus, void *userdata) {
         return sd_bus_send(bus, message, NULL);
 }
 
-static int reply_unit_file_changes_and_free(
-                Manager *m,
-                sd_bus_message *message,
-                int carries_install_info,
-                UnitFileChange *changes,
-                unsigned n_changes) {
-
-        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
-        unsigned i;
-        int r;
-
-        if (unit_file_changes_have_modification(changes, n_changes)) {
-                r = bus_foreach_bus(m, NULL, send_unit_files_changed, NULL);
-                if (r < 0)
-                        log_debug_errno(r, "Failed to send UnitFilesChanged signal: %m");
-        }
-
-        r = sd_bus_message_new_method_return(message, &reply);
-        if (r < 0)
-                goto fail;
-
-        if (carries_install_info >= 0) {
-                r = sd_bus_message_append(reply, "b", carries_install_info);
-                if (r < 0)
-                        goto fail;
-        }
-
-        r = sd_bus_message_open_container(reply, 'a', "(sss)");
-        if (r < 0)
-                goto fail;
-
-        for (i = 0; i < n_changes; i++)
-                if (changes[i].type >= 0) {
-                        const char *change = unit_file_change_type_to_string(changes[i].type);
-                        assert(change != NULL);
-
-                        r = sd_bus_message_append(
-                                        reply, "(sss)",
-                                        change,
-                                        changes[i].path,
-                                        changes[i].source);
-                        if (r < 0)
-                                goto fail;
-                }
-
-        r = sd_bus_message_close_container(reply);
-        if (r < 0)
-                goto fail;
-
-        unit_file_changes_free(changes, n_changes);
-        return sd_bus_send(NULL, reply, NULL);
-
-fail:
-        unit_file_changes_free(changes, n_changes);
-        return r;
-}
-
 /* Create an error reply, using the error information from changes[]
  * if possible, and fall back to generating an error from error code c.
  * The error message only describes the first error.
@@ -1737,12 +1925,14 @@ static int install_error(
                 unsigned n_changes) {
         int r;
         unsigned i;
-        assert(c < 0);
 
         for (i = 0; i < n_changes; i++)
+
                 switch(changes[i].type) {
+
                 case 0 ... INT_MAX:
                         continue;
+
                 case -EEXIST:
                         if (changes[i].source)
                                 r = sd_bus_error_setf(error, BUS_ERROR_UNIT_EXISTS,
@@ -1753,39 +1943,117 @@ static int install_error(
                                                       "File %s already exists.",
                                                       changes[i].path);
                         goto found;
+
                 case -ERFKILL:
                         r = sd_bus_error_setf(error, BUS_ERROR_UNIT_MASKED,
                                               "Unit file %s is masked.", changes[i].path);
                         goto found;
+
                 case -EADDRNOTAVAIL:
                         r = sd_bus_error_setf(error, BUS_ERROR_UNIT_GENERATED,
                                               "Unit %s is transient or generated.", changes[i].path);
                         goto found;
+
                 case -ELOOP:
                         r = sd_bus_error_setf(error, BUS_ERROR_UNIT_LINKED,
                                               "Refusing to operate on linked unit file %s", changes[i].path);
                         goto found;
+
+                case -ENOENT:
+                        r = sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_UNIT, "Unit file %s does not exist.", changes[i].path);
+                        goto found;
+
                 default:
                         r = sd_bus_error_set_errnof(error, changes[i].type, "File %s: %m", changes[i].path);
                         goto found;
                 }
 
-        r = c;
+        r = c < 0 ? c : -EINVAL;
+
  found:
         unit_file_changes_free(changes, n_changes);
         return r;
 }
 
+static int reply_unit_file_changes_and_free(
+                Manager *m,
+                sd_bus_message *message,
+                int carries_install_info,
+                UnitFileChange *changes,
+                unsigned n_changes,
+                sd_bus_error *error) {
+
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+        bool bad = false, good = false;
+        unsigned i;
+        int r;
+
+        if (unit_file_changes_have_modification(changes, n_changes)) {
+                r = bus_foreach_bus(m, NULL, send_unit_files_changed, NULL);
+                if (r < 0)
+                        log_debug_errno(r, "Failed to send UnitFilesChanged signal: %m");
+        }
+
+        r = sd_bus_message_new_method_return(message, &reply);
+        if (r < 0)
+                goto fail;
+
+        if (carries_install_info >= 0) {
+                r = sd_bus_message_append(reply, "b", carries_install_info);
+                if (r < 0)
+                        goto fail;
+        }
+
+        r = sd_bus_message_open_container(reply, 'a', "(sss)");
+        if (r < 0)
+                goto fail;
+
+        for (i = 0; i < n_changes; i++) {
+
+                if (changes[i].type < 0) {
+                        bad = true;
+                        continue;
+                }
+
+                r = sd_bus_message_append(
+                                reply, "(sss)",
+                                unit_file_change_type_to_string(changes[i].type),
+                                changes[i].path,
+                                changes[i].source);
+                if (r < 0)
+                        goto fail;
+
+                good = true;
+        }
+
+        /* If there was a failed change, and no successful change, then return the first failure as proper method call
+         * error. */
+        if (bad && !good)
+                return install_error(error, 0, changes, n_changes);
+
+        r = sd_bus_message_close_container(reply);
+        if (r < 0)
+                goto fail;
+
+        unit_file_changes_free(changes, n_changes);
+        return sd_bus_send(NULL, reply, NULL);
+
+fail:
+        unit_file_changes_free(changes, n_changes);
+        return r;
+}
+
 static int method_enable_unit_files_generic(
                 sd_bus_message *message,
                 Manager *m,
-                int (*call)(UnitFileScope scope, bool runtime, const char *root_dir, char *files[], bool force, UnitFileChange **changes, unsigned *n_changes),
+                int (*call)(UnitFileScope scope, UnitFileFlags flags, const char *root_dir, char *files[], UnitFileChange **changes, unsigned *n_changes),
                 bool carries_install_info,
                 sd_bus_error *error) {
 
         _cleanup_strv_free_ char **l = NULL;
         UnitFileChange *changes = NULL;
         unsigned n_changes = 0;
+        UnitFileFlags flags;
         int runtime, force, r;
 
         assert(message);
@@ -1799,17 +2067,19 @@ static int method_enable_unit_files_generic(
         if (r < 0)
                 return r;
 
+        flags = unit_file_bools_to_flags(runtime, force);
+
         r = bus_verify_manage_unit_files_async(m, message, error);
         if (r < 0)
                 return r;
         if (r == 0)
                 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
 
-        r = call(m->unit_file_scope, runtime, NULL, l, force, &changes, &n_changes);
+        r = call(m->unit_file_scope, flags, NULL, l, &changes, &n_changes);
         if (r < 0)
                 return install_error(error, r, changes, n_changes);
 
-        return reply_unit_file_changes_and_free(m, message, carries_install_info ? r : -1, changes, n_changes);
+        return reply_unit_file_changes_and_free(m, message, carries_install_info ? r : -1, changes, n_changes, error);
 }
 
 static int method_enable_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
@@ -1824,8 +2094,8 @@ static int method_link_unit_files(sd_bus_message *message, void *userdata, sd_bu
         return method_enable_unit_files_generic(message, userdata, unit_file_link, false, error);
 }
 
-static int unit_file_preset_without_mode(UnitFileScope scope, bool runtime, const char *root_dir, char **files, bool force, UnitFileChange **changes, unsigned *n_changes) {
-        return unit_file_preset(scope, runtime, root_dir, files, UNIT_FILE_PRESET_FULL, force, changes, n_changes);
+static int unit_file_preset_without_mode(UnitFileScope scope, UnitFileFlags flags, const char *root_dir, char **files, UnitFileChange **changes, unsigned *n_changes) {
+        return unit_file_preset(scope, flags, root_dir, files, UNIT_FILE_PRESET_FULL, changes, n_changes);
 }
 
 static int method_preset_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
@@ -1844,6 +2114,7 @@ static int method_preset_unit_files_with_mode(sd_bus_message *message, void *use
         Manager *m = userdata;
         UnitFilePresetMode mm;
         int runtime, force, r;
+        UnitFileFlags flags;
         const char *mode;
 
         assert(message);
@@ -1857,6 +2128,8 @@ static int method_preset_unit_files_with_mode(sd_bus_message *message, void *use
         if (r < 0)
                 return r;
 
+        flags = unit_file_bools_to_flags(runtime, force);
+
         if (isempty(mode))
                 mm = UNIT_FILE_PRESET_FULL;
         else {
@@ -1871,17 +2144,17 @@ static int method_preset_unit_files_with_mode(sd_bus_message *message, void *use
         if (r == 0)
                 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
 
-        r = unit_file_preset(m->unit_file_scope, runtime, NULL, l, mm, force, &changes, &n_changes);
+        r = unit_file_preset(m->unit_file_scope, flags, NULL, l, mm, &changes, &n_changes);
         if (r < 0)
                 return install_error(error, r, changes, n_changes);
 
-        return reply_unit_file_changes_and_free(m, message, r, changes, n_changes);
+        return reply_unit_file_changes_and_free(m, message, r, changes, n_changes, error);
 }
 
 static int method_disable_unit_files_generic(
                 sd_bus_message *message,
                 Manager *m,
-                int (*call)(UnitFileScope scope, bool runtime, const char *root_dir, char *files[], UnitFileChange **changes, unsigned *n_changes),
+                int (*call)(UnitFileScope scope, UnitFileFlags flags, const char *root_dir, char *files[], UnitFileChange **changes, unsigned *n_changes),
                 sd_bus_error *error) {
 
         _cleanup_strv_free_ char **l = NULL;
@@ -1906,11 +2179,11 @@ static int method_disable_unit_files_generic(
         if (r == 0)
                 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
 
-        r = call(m->unit_file_scope, runtime, NULL, l, &changes, &n_changes);
+        r = call(m->unit_file_scope, runtime ? UNIT_FILE_RUNTIME : 0, NULL, l, &changes, &n_changes);
         if (r < 0)
                 return install_error(error, r, changes, n_changes);
 
-        return reply_unit_file_changes_and_free(m, message, -1, changes, n_changes);
+        return reply_unit_file_changes_and_free(m, message, -1, changes, n_changes, error);
 }
 
 static int method_disable_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
@@ -1945,7 +2218,7 @@ static int method_revert_unit_files(sd_bus_message *message, void *userdata, sd_
         if (r < 0)
                 return install_error(error, r, changes, n_changes);
 
-        return reply_unit_file_changes_and_free(m, message, -1, changes, n_changes);
+        return reply_unit_file_changes_and_free(m, message, -1, changes, n_changes, error);
 }
 
 static int method_set_default_target(sd_bus_message *message, void *userdata, sd_bus_error *error) {
@@ -1972,11 +2245,11 @@ static int method_set_default_target(sd_bus_message *message, void *userdata, sd
         if (r == 0)
                 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
 
-        r = unit_file_set_default(m->unit_file_scope, NULL, name, force, &changes, &n_changes);
+        r = unit_file_set_default(m->unit_file_scope, force ? UNIT_FILE_FORCE : 0, NULL, name, &changes, &n_changes);
         if (r < 0)
                 return install_error(error, r, changes, n_changes);
 
-        return reply_unit_file_changes_and_free(m, message, -1, changes, n_changes);
+        return reply_unit_file_changes_and_free(m, message, -1, changes, n_changes, error);
 }
 
 static int method_preset_all_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
@@ -1985,6 +2258,7 @@ static int method_preset_all_unit_files(sd_bus_message *message, void *userdata,
         Manager *m = userdata;
         UnitFilePresetMode mm;
         const char *mode;
+        UnitFileFlags flags;
         int force, runtime, r;
 
         assert(message);
@@ -1998,6 +2272,8 @@ static int method_preset_all_unit_files(sd_bus_message *message, void *userdata,
         if (r < 0)
                 return r;
 
+        flags = unit_file_bools_to_flags(runtime, force);
+
         if (isempty(mode))
                 mm = UNIT_FILE_PRESET_FULL;
         else {
@@ -2012,11 +2288,11 @@ static int method_preset_all_unit_files(sd_bus_message *message, void *userdata,
         if (r == 0)
                 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
 
-        r = unit_file_preset_all(m->unit_file_scope, runtime, NULL, mm, force, &changes, &n_changes);
+        r = unit_file_preset_all(m->unit_file_scope, flags, NULL, mm, &changes, &n_changes);
         if (r < 0)
                 return install_error(error, r, changes, n_changes);
 
-        return reply_unit_file_changes_and_free(m, message, -1, changes, n_changes);
+        return reply_unit_file_changes_and_free(m, message, -1, changes, n_changes, error);
 }
 
 static int method_add_dependency_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
@@ -2027,6 +2303,7 @@ static int method_add_dependency_unit_files(sd_bus_message *message, void *userd
         int runtime, force, r;
         char *target, *type;
         UnitDependency dep;
+        UnitFileFlags flags;
 
         assert(message);
         assert(m);
@@ -2045,15 +2322,80 @@ static int method_add_dependency_unit_files(sd_bus_message *message, void *userd
         if (r < 0)
                 return r;
 
+        flags = unit_file_bools_to_flags(runtime, force);
+
         dep = unit_dependency_from_string(type);
         if (dep < 0)
                 return -EINVAL;
 
-        r = unit_file_add_dependency(m->unit_file_scope, runtime, NULL, l, target, dep, force, &changes, &n_changes);
+        r = unit_file_add_dependency(m->unit_file_scope, flags, NULL, l, target, dep, &changes, &n_changes);
         if (r < 0)
                 return install_error(error, r, changes, n_changes);
 
-        return reply_unit_file_changes_and_free(m, message, -1, changes, n_changes);
+        return reply_unit_file_changes_and_free(m, message, -1, changes, n_changes, error);
+}
+
+static int method_get_unit_file_links(sd_bus_message *message, void *userdata, sd_bus_error *error) {
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+        UnitFileChange *changes = NULL;
+        unsigned n_changes = 0, i;
+        UnitFileFlags flags;
+        const char *name;
+        char **p;
+        int runtime, r;
+
+        r = sd_bus_message_read(message, "sb", &name, &runtime);
+        if (r < 0)
+                return r;
+
+        r = sd_bus_message_new_method_return(message, &reply);
+        if (r < 0)
+                return r;
+
+        r = sd_bus_message_open_container(reply, SD_BUS_TYPE_ARRAY, "s");
+        if (r < 0)
+                return r;
+
+        p = STRV_MAKE(name);
+        flags = UNIT_FILE_DRY_RUN |
+                (runtime ? UNIT_FILE_RUNTIME : 0);
+
+        r = unit_file_disable(UNIT_FILE_SYSTEM, flags, NULL, p, &changes, &n_changes);
+        if (r < 0)
+                return log_error_errno(r, "Failed to get file links for %s: %m", name);
+
+        for (i = 0; i < n_changes; i++)
+                if (changes[i].type == UNIT_FILE_UNLINK) {
+                        r = sd_bus_message_append(reply, "s", changes[i].path);
+                        if (r < 0)
+                                return r;
+                }
+
+        r = sd_bus_message_close_container(reply);
+        if (r < 0)
+                return r;
+
+        return sd_bus_send(NULL, reply, NULL);
+}
+
+static int method_get_job_waiting(sd_bus_message *message, void *userdata, sd_bus_error *error) {
+        Manager *m = userdata;
+        uint32_t id;
+        Job *j;
+        int r;
+
+        assert(message);
+        assert(m);
+
+        r = sd_bus_message_read(message, "u", &id);
+        if (r < 0)
+                return r;
+
+        j = manager_get_job(m, id);
+        if (!j)
+                return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_JOB, "Job %u does not exist.", (unsigned) id);
+
+        return bus_job_method_get_waiting_jobs(message, j, error);
 }
 
 const sd_bus_vtable bus_manager_vtable[] = {
@@ -2143,6 +2485,7 @@ const sd_bus_vtable bus_manager_vtable[] = {
 
         SD_BUS_METHOD("GetUnit", "s", "o", method_get_unit, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("GetUnitByPID", "u", "o", method_get_unit_by_pid, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("GetUnitByInvocationID", "ay", "o", method_get_unit_by_invocation_id, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("LoadUnit", "s", "o", method_load_unit, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("StartUnit", "ss", "o", method_start_unit, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("StartUnitReplace", "sss", "o", method_start_unit_replace, SD_BUS_VTABLE_UNPRIVILEGED),
@@ -2155,9 +2498,13 @@ const sd_bus_vtable bus_manager_vtable[] = {
         SD_BUS_METHOD("KillUnit", "ssi", NULL, method_kill_unit, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("ResetFailedUnit", "s", NULL, method_reset_failed_unit, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("SetUnitProperties", "sba(sv)", NULL, method_set_unit_properties, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("RefUnit", "s", NULL, method_ref_unit, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("UnrefUnit", "s", NULL, method_unref_unit, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("StartTransientUnit", "ssa(sv)a(sa(sv))", "o", method_start_transient_unit, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("GetUnitProcesses", "s", "a(sus)", method_get_unit_processes, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("GetJob", "u", "o", method_get_job, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("GetJobAfter", "u", "a(usssoo)", method_get_job_waiting, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("GetJobBefore", "u", "a(usssoo)", method_get_job_waiting, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("CancelJob", "u", NULL, method_cancel_job, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("ClearJobs", NULL, NULL, method_clear_jobs, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("ResetFailed", NULL, NULL, method_reset_failed, SD_BUS_VTABLE_UNPRIVILEGED),
@@ -2198,7 +2545,10 @@ const sd_bus_vtable bus_manager_vtable[] = {
         SD_BUS_METHOD("GetDefaultTarget", NULL, "s", method_get_default_target, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("PresetAllUnitFiles", "sbb", "a(sss)", method_preset_all_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("AddDependencyUnitFiles", "asssbb", "a(sss)", method_add_dependency_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("GetUnitFileLinks", "sb", "as", method_get_unit_file_links, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("SetExitCode", "y", NULL, method_set_exit_code, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("LookupDynamicUserByName", "s", "u", method_lookup_dynamic_user_by_name, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("LookupDynamicUserByUID", "u", "s", method_lookup_dynamic_user_by_uid, SD_BUS_VTABLE_UNPRIVILEGED),
 
         SD_BUS_SIGNAL("UnitNew", "so", 0),
         SD_BUS_SIGNAL("UnitRemoved", "so", 0),
index cffb4aa..5d37c88 100644 (file)
@@ -27,3 +27,5 @@ void bus_manager_send_user_finished_to_system(Manager *m, uid_t user_id);
 void bus_manager_send_finished(Manager *m, usec_t firmware_usec, usec_t loader_usec, usec_t kernel_usec, usec_t initrd_usec, usec_t userspace_usec, usec_t total_usec);
 void bus_manager_send_reloading(Manager *m, bool active);
 void bus_manager_send_change_signal(Manager *m);
+
+int verify_run_space_and_log(const char *message);
index 935db7c..76a7a7c 100644 (file)
@@ -116,7 +116,11 @@ const sd_bus_vtable bus_mount_vtable[] = {
         SD_BUS_PROPERTY("ControlPID", "u", bus_property_get_pid, offsetof(Mount, control_pid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("DirectoryMode", "u", bus_property_get_mode, offsetof(Mount, directory_mode), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("SloppyOptions", "b", bus_property_get_bool, offsetof(Mount, sloppy_options), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("LazyUnmount", "b", bus_property_get_bool, offsetof(Mount, lazy_unmount), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("ForceUnmount", "b", bus_property_get_bool, offsetof(Mount, force_unmount), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Mount, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("UID", "u", NULL, offsetof(Unit, ref_uid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("GID", "u", NULL, offsetof(Unit, ref_gid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         BUS_EXEC_COMMAND_VTABLE("ExecMount", offsetof(Mount, exec_command[MOUNT_EXEC_MOUNT]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
         BUS_EXEC_COMMAND_VTABLE("ExecUnmount", offsetof(Mount, exec_command[MOUNT_EXEC_UNMOUNT]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
         BUS_EXEC_COMMAND_VTABLE("ExecRemount", offsetof(Mount, exec_command[MOUNT_EXEC_REMOUNT]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
@@ -157,6 +161,9 @@ static int bus_mount_set_transient_property(
                 if (!p)
                         return -ENOMEM;
 
+                unit_write_drop_in_format(UNIT(m), mode, name, "[Mount]\n%s=%s\n",
+                        name, new_property);
+
                 free(*property);
                 *property = p;
         }
index fab3677..6458ee5 100644 (file)
@@ -36,7 +36,7 @@ static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_type, service_type, ServiceType
 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, service_result, ServiceResult);
 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_restart, service_restart, ServiceRestart);
 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_notify_access, notify_access, NotifyAccess);
-static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_failure_action, failure_action, FailureAction);
+static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_emergency_action, emergency_action, EmergencyAction);
 
 const sd_bus_vtable bus_service_vtable[] = {
         SD_BUS_VTABLE_START(0),
@@ -50,12 +50,7 @@ const sd_bus_vtable bus_service_vtable[] = {
         SD_BUS_PROPERTY("RuntimeMaxUSec", "t", bus_property_get_usec, offsetof(Service, runtime_max_usec), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("WatchdogUSec", "t", bus_property_get_usec, offsetof(Service, watchdog_usec), SD_BUS_VTABLE_PROPERTY_CONST),
         BUS_PROPERTY_DUAL_TIMESTAMP("WatchdogTimestamp", offsetof(Service, watchdog_timestamp), 0),
-        /* The following four are obsolete, and thus marked hidden here. They moved into the Unit interface */
-        SD_BUS_PROPERTY("StartLimitInterval", "t", bus_property_get_usec, offsetof(Unit, start_limit.interval), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
-        SD_BUS_PROPERTY("StartLimitBurst", "u", bus_property_get_unsigned, offsetof(Unit, start_limit.burst), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
-        SD_BUS_PROPERTY("StartLimitAction", "s", property_get_failure_action, offsetof(Unit, start_limit_action), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
-        SD_BUS_PROPERTY("RebootArgument", "s", NULL, offsetof(Unit, reboot_arg), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
-        SD_BUS_PROPERTY("FailureAction", "s", property_get_failure_action, offsetof(Service, failure_action), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("FailureAction", "s", property_get_emergency_action, offsetof(Service, emergency_action), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("PermissionsStartOnly", "b", bus_property_get_bool, offsetof(Service, permissions_start_only), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("RootDirectoryStartOnly", "b", bus_property_get_bool, offsetof(Service, root_directory_start_only), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("RemainAfterExit", "b", bus_property_get_bool, offsetof(Service, remain_after_exit), SD_BUS_VTABLE_PROPERTY_CONST),
@@ -70,6 +65,9 @@ const sd_bus_vtable bus_service_vtable[] = {
         SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Service, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("USBFunctionDescriptors", "s", NULL, offsetof(Service, usb_function_descriptors), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("USBFunctionStrings", "s", NULL, offsetof(Service, usb_function_strings), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("UID", "u", NULL, offsetof(Unit, ref_uid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("GID", "u", NULL, offsetof(Unit, ref_gid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+
         BUS_EXEC_STATUS_VTABLE("ExecMain", offsetof(Service, main_exec_status), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPre", offsetof(Service, exec_command[SERVICE_EXEC_START_PRE]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
         BUS_EXEC_COMMAND_LIST_VTABLE("ExecStart", offsetof(Service, exec_command[SERVICE_EXEC_START]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
@@ -77,6 +75,12 @@ const sd_bus_vtable bus_service_vtable[] = {
         BUS_EXEC_COMMAND_LIST_VTABLE("ExecReload", offsetof(Service, exec_command[SERVICE_EXEC_RELOAD]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
         BUS_EXEC_COMMAND_LIST_VTABLE("ExecStop", offsetof(Service, exec_command[SERVICE_EXEC_STOP]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
         BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPost", offsetof(Service, exec_command[SERVICE_EXEC_STOP_POST]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
+
+        /* The following four are obsolete, and thus marked hidden here. They moved into the Unit interface */
+        SD_BUS_PROPERTY("StartLimitInterval", "t", bus_property_get_usec, offsetof(Unit, start_limit.interval), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
+        SD_BUS_PROPERTY("StartLimitBurst", "u", bus_property_get_unsigned, offsetof(Unit, start_limit.burst), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
+        SD_BUS_PROPERTY("StartLimitAction", "s", property_get_emergency_action, offsetof(Unit, start_limit_action), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
+        SD_BUS_PROPERTY("RebootArgument", "s", NULL, offsetof(Unit, reboot_arg), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
         SD_BUS_VTABLE_END
 };
 
@@ -139,6 +143,29 @@ static int bus_service_set_transient_property(
 
                 return 1;
 
+        } else if (streq(name, "Restart")) {
+                ServiceRestart sr;
+                const char *v;
+
+                r = sd_bus_message_read(message, "s", &v);
+                if (r < 0)
+                        return r;
+
+                if (isempty(v))
+                        sr = SERVICE_RESTART_NO;
+                else {
+                        sr = service_restart_from_string(v);
+                        if (sr < 0)
+                                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid restart setting: %s", v);
+                }
+
+                if (mode != UNIT_CHECK) {
+                        s->restart = sr;
+                        unit_write_drop_in_private_format(UNIT(s), mode, name, "Restart=%s", service_restart_to_string(sr));
+                }
+
+                return 1;
+
         } else if (STR_IN_SET(name,
                               "StandardInputFileDescriptor",
                               "StandardOutputFileDescriptor",
@@ -172,6 +199,39 @@ static int bus_service_set_transient_property(
 
                 return 1;
 
+        } else if (streq(name, "FileDescriptorStoreMax")) {
+                uint32_t u;
+
+                r = sd_bus_message_read(message, "u", &u);
+                if (r < 0)
+                        return r;
+
+                if (mode != UNIT_CHECK) {
+                        s->n_fd_store_max = (unsigned) u;
+                        unit_write_drop_in_private_format(UNIT(s), mode, name, "FileDescriptorStoreMax=%" PRIu32, u);
+                }
+
+                return 1;
+
+        } else if (streq(name, "NotifyAccess")) {
+                const char *t;
+                NotifyAccess k;
+
+                r = sd_bus_message_read(message, "s", &t);
+                if (r < 0)
+                        return r;
+
+                k = notify_access_from_string(t);
+                if (k < 0)
+                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid notify access setting %s", t);
+
+                if (mode != UNIT_CHECK) {
+                        s->notify_access = k;
+                        unit_write_drop_in_private_format(UNIT(s), mode, name, "NotifyAccess=%s", notify_access_to_string(s->notify_access));
+                }
+
+                return 1;
+
         } else if (streq(name, "ExecStart")) {
                 unsigned n = 0;
 
index 9613406..21adb64 100644 (file)
@@ -137,6 +137,7 @@ const sd_bus_vtable bus_socket_vtable[] = {
         SD_BUS_PROPERTY("Symlinks", "as", NULL, offsetof(Socket, symlinks), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("Mark", "i", bus_property_get_int, offsetof(Socket, mark), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("MaxConnections", "u", bus_property_get_unsigned, offsetof(Socket, max_connections), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("MaxConnectionsPerSource", "u", bus_property_get_unsigned, offsetof(Socket, max_connections_per_source), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("MessageQueueMaxMessages", "x", bus_property_get_long, offsetof(Socket, mq_maxmsg), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("MessageQueueMessageSize", "x", bus_property_get_long, offsetof(Socket, mq_msgsize), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("ReusePort", "b",  bus_property_get_bool, offsetof(Socket, reuse_port), SD_BUS_VTABLE_PROPERTY_CONST),
@@ -151,6 +152,8 @@ const sd_bus_vtable bus_socket_vtable[] = {
         SD_BUS_PROPERTY("SocketProtocol", "i", bus_property_get_int, offsetof(Socket, socket_protocol), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("TriggerLimitIntervalUSec", "t", bus_property_get_usec, offsetof(Socket, trigger_limit.interval), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("TriggerLimitBurst", "u", bus_property_get_unsigned, offsetof(Socket, trigger_limit.burst), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("UID", "u", NULL, offsetof(Unit, ref_uid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("GID", "u", NULL, offsetof(Unit, ref_gid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPre", offsetof(Socket, exec_command[SOCKET_EXEC_START_PRE]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
         BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPost", offsetof(Socket, exec_command[SOCKET_EXEC_START_POST]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
         BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPre", offsetof(Socket, exec_command[SOCKET_EXEC_STOP_PRE]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
index 292f873..85a2c26 100644 (file)
@@ -84,6 +84,8 @@ const sd_bus_vtable bus_swap_vtable[] = {
         SD_BUS_PROPERTY("TimeoutUSec", "t", bus_property_get_usec, offsetof(Swap, timeout_usec), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("ControlPID", "u", bus_property_get_pid, offsetof(Swap, control_pid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Swap, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("UID", "u", NULL, offsetof(Unit, ref_uid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("GID", "u", NULL, offsetof(Unit, ref_gid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         BUS_EXEC_COMMAND_VTABLE("ExecActivate", offsetof(Swap, exec_command[SWAP_EXEC_ACTIVATE]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
         BUS_EXEC_COMMAND_VTABLE("ExecDeactivate", offsetof(Swap, exec_command[SWAP_EXEC_DEACTIVATE]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
         SD_BUS_VTABLE_END
index efbb0e8..c98282a 100644 (file)
@@ -144,28 +144,14 @@ static int property_get_next_elapse_monotonic(
                 sd_bus_error *error) {
 
         Timer *t = userdata;
-        usec_t x;
 
         assert(bus);
         assert(reply);
         assert(t);
 
-        if (t->next_elapse_monotonic_or_boottime <= 0)
-                x = 0;
-        else if (t->wake_system) {
-                usec_t a, b;
-
-                a = now(CLOCK_MONOTONIC);
-                b = now(clock_boottime_or_monotonic());
-
-                if (t->next_elapse_monotonic_or_boottime + a > b)
-                        x = t->next_elapse_monotonic_or_boottime + a - b;
-                else
-                        x = 0;
-        } else
-                x = t->next_elapse_monotonic_or_boottime;
-
-        return sd_bus_message_append(reply, "t", x);
+        return sd_bus_message_append(reply, "t",
+                                     (uint64_t) usec_shift_clock(t->next_elapse_monotonic_or_boottime,
+                                                                 TIMER_MONOTONIC_CLOCK(t), CLOCK_MONOTONIC));
 }
 
 const sd_bus_vtable bus_timer_vtable[] = {
index b55d2cf..b0645ce 100644 (file)
@@ -22,6 +22,7 @@
 #include "alloc-util.h"
 #include "bus-common-errors.h"
 #include "cgroup-util.h"
+#include "dbus-job.h"
 #include "dbus-unit.h"
 #include "dbus.h"
 #include "fd-util.h"
@@ -37,7 +38,7 @@
 
 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_load_state, unit_load_state, UnitLoadState);
 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_job_mode, job_mode, JobMode);
-static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_failure_action, failure_action, FailureAction);
+static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_emergency_action, emergency_action, EmergencyAction);
 
 static int property_get_names(
                 sd_bus *bus,
@@ -263,10 +264,7 @@ static int property_get_can_stop(
         assert(reply);
         assert(u);
 
-        /* On the lower levels we assume that every unit we can start
-         * we can also stop */
-
-        return sd_bus_message_append(reply, "b", unit_can_start(u) && !u->refuse_manual_stop);
+        return sd_bus_message_append(reply, "b", unit_can_stop(u) && !u->refuse_manual_stop);
 }
 
 static int property_get_can_reload(
@@ -418,6 +416,7 @@ static int bus_verify_manage_units_async_full(
                 const char *verb,
                 int capability,
                 const char *polkit_message,
+                bool interactive,
                 sd_bus_message *call,
                 sd_bus_error *error) {
 
@@ -433,7 +432,15 @@ static int bus_verify_manage_units_async_full(
                 details[7] = GETTEXT_PACKAGE;
         }
 
-        return bus_verify_polkit_async(call, capability, "org.freedesktop.systemd1.manage-units", details, false, UID_INVALID, &u->manager->polkit_registry, error);
+        return bus_verify_polkit_async(
+                        call,
+                        capability,
+                        "org.freedesktop.systemd1.manage-units",
+                        details,
+                        interactive,
+                        UID_INVALID,
+                        &u->manager->polkit_registry,
+                        error);
 }
 
 int bus_unit_method_start_generic(
@@ -475,7 +482,7 @@ int bus_unit_method_start_generic(
                 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Job mode %s invalid", smode);
 
         if (reload_if_possible)
-                verb = strjoin("reload-or-", job_type_to_string(job_type), NULL);
+                verb = strjoin("reload-or-", job_type_to_string(job_type));
         else
                 verb = strdup(job_type_to_string(job_type));
         if (!verb)
@@ -486,6 +493,7 @@ int bus_unit_method_start_generic(
                         verb,
                         CAP_SYS_ADMIN,
                         job_type < _JOB_TYPE_MAX ? polkit_message_for_job[job_type] : NULL,
+                        true,
                         message,
                         error);
         if (r < 0)
@@ -558,6 +566,7 @@ int bus_unit_method_kill(sd_bus_message *message, void *userdata, sd_bus_error *
                         "kill",
                         CAP_KILL,
                         N_("Authentication is required to kill '$(unit)'."),
+                        true,
                         message,
                         error);
         if (r < 0)
@@ -588,6 +597,7 @@ int bus_unit_method_reset_failed(sd_bus_message *message, void *userdata, sd_bus
                         "reset-failed",
                         CAP_SYS_ADMIN,
                         N_("Authentication is required to reset the \"failed\" state of '$(unit)'."),
+                        true,
                         message,
                         error);
         if (r < 0)
@@ -620,6 +630,7 @@ int bus_unit_method_set_properties(sd_bus_message *message, void *userdata, sd_b
                         "set-property",
                         CAP_SYS_ADMIN,
                         N_("Authentication is required to set properties on '$(unit)'."),
+                        true,
                         message,
                         error);
         if (r < 0)
@@ -634,6 +645,53 @@ int bus_unit_method_set_properties(sd_bus_message *message, void *userdata, sd_b
         return sd_bus_reply_method_return(message, NULL);
 }
 
+int bus_unit_method_ref(sd_bus_message *message, void *userdata, sd_bus_error *error) {
+        Unit *u = userdata;
+        int r;
+
+        assert(message);
+        assert(u);
+
+        r = mac_selinux_unit_access_check(u, message, "start", error);
+        if (r < 0)
+                return r;
+
+        r = bus_verify_manage_units_async_full(
+                        u,
+                        "ref",
+                        CAP_SYS_ADMIN,
+                        NULL,
+                        false,
+                        message,
+                        error);
+        if (r < 0)
+                return r;
+        if (r == 0)
+                return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
+
+        r = bus_unit_track_add_sender(u, message);
+        if (r < 0)
+                return r;
+
+        return sd_bus_reply_method_return(message, NULL);
+}
+
+int bus_unit_method_unref(sd_bus_message *message, void *userdata, sd_bus_error *error) {
+        Unit *u = userdata;
+        int r;
+
+        assert(message);
+        assert(u);
+
+        r = bus_unit_track_remove_sender(u, message);
+        if (r == -EUNATCH)
+                return sd_bus_error_setf(error, BUS_ERROR_NOT_REFERENCED, "Unit has not been referenced yet.");
+        if (r < 0)
+                return r;
+
+        return sd_bus_reply_method_return(message, NULL);
+}
+
 const sd_bus_vtable bus_unit_vtable[] = {
         SD_BUS_VTABLE_START(0),
 
@@ -660,10 +718,6 @@ const sd_bus_vtable bus_unit_vtable[] = {
         SD_BUS_PROPERTY("PropagatesReloadTo", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_PROPAGATES_RELOAD_TO]), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("ReloadPropagatedFrom", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_RELOAD_PROPAGATED_FROM]), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("JoinsNamespaceOf", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_JOINS_NAMESPACE_OF]), SD_BUS_VTABLE_PROPERTY_CONST),
-        SD_BUS_PROPERTY("RequiresOverridable", "as", property_get_obsolete_dependencies, 0, SD_BUS_VTABLE_HIDDEN),
-        SD_BUS_PROPERTY("RequisiteOverridable", "as", property_get_obsolete_dependencies, 0, SD_BUS_VTABLE_HIDDEN),
-        SD_BUS_PROPERTY("RequiredByOverridable", "as", property_get_obsolete_dependencies, 0, SD_BUS_VTABLE_HIDDEN),
-        SD_BUS_PROPERTY("RequisiteOfOverridable", "as", property_get_obsolete_dependencies, 0, SD_BUS_VTABLE_HIDDEN),
         SD_BUS_PROPERTY("RequiresMountsFor", "as", NULL, offsetof(Unit, requires_mounts_for), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("Documentation", "as", NULL, offsetof(Unit, documentation), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("Description", "s", property_get_description, 0, SD_BUS_VTABLE_PROPERTY_CONST),
@@ -694,7 +748,8 @@ const sd_bus_vtable bus_unit_vtable[] = {
         SD_BUS_PROPERTY("IgnoreOnIsolate", "b", bus_property_get_bool, offsetof(Unit, ignore_on_isolate), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("NeedDaemonReload", "b", property_get_need_daemon_reload, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("JobTimeoutUSec", "t", bus_property_get_usec, offsetof(Unit, job_timeout), SD_BUS_VTABLE_PROPERTY_CONST),
-        SD_BUS_PROPERTY("JobTimeoutAction", "s", property_get_failure_action, offsetof(Unit, job_timeout_action), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("JobRunningTimeoutUSec", "t", bus_property_get_usec, offsetof(Unit, job_running_timeout), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("JobTimeoutAction", "s", property_get_emergency_action, offsetof(Unit, job_timeout_action), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("JobTimeoutRebootArgument", "s", NULL, offsetof(Unit, job_timeout_reboot_arg), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("ConditionResult", "b", bus_property_get_bool, offsetof(Unit, condition_result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("AssertResult", "b", bus_property_get_bool, offsetof(Unit, assert_result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
@@ -704,11 +759,12 @@ const sd_bus_vtable bus_unit_vtable[] = {
         SD_BUS_PROPERTY("Asserts", "a(sbbsi)", property_get_conditions, offsetof(Unit, asserts), 0),
         SD_BUS_PROPERTY("LoadError", "(ss)", property_get_load_error, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("Transient", "b", bus_property_get_bool, offsetof(Unit, transient), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("Perpetual", "b", bus_property_get_bool, offsetof(Unit, perpetual), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("StartLimitIntervalSec", "t", bus_property_get_usec, offsetof(Unit, start_limit.interval), SD_BUS_VTABLE_PROPERTY_CONST),
-        SD_BUS_PROPERTY("StartLimitInterval", "t", bus_property_get_usec, offsetof(Unit, start_limit.interval), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN), /* obsolete alias name */
         SD_BUS_PROPERTY("StartLimitBurst", "u", bus_property_get_unsigned, offsetof(Unit, start_limit.burst), SD_BUS_VTABLE_PROPERTY_CONST),
-        SD_BUS_PROPERTY("StartLimitAction", "s", property_get_failure_action, offsetof(Unit, start_limit_action), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("StartLimitAction", "s", property_get_emergency_action, offsetof(Unit, start_limit_action), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("RebootArgument", "s", NULL, offsetof(Unit, reboot_arg), SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("InvocationID", "ay", bus_property_get_id128, offsetof(Unit, invocation_id), 0),
 
         SD_BUS_METHOD("Start", "s", "o", method_start, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("Stop", "s", "o", method_stop, SD_BUS_VTABLE_UNPRIVILEGED),
@@ -720,7 +776,15 @@ const sd_bus_vtable bus_unit_vtable[] = {
         SD_BUS_METHOD("Kill", "si", NULL, bus_unit_method_kill, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("ResetFailed", NULL, NULL, bus_unit_method_reset_failed, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("SetProperties", "ba(sv)", NULL, bus_unit_method_set_properties, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("Ref", NULL, NULL, bus_unit_method_ref, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("Unref", NULL, NULL, bus_unit_method_unref, SD_BUS_VTABLE_UNPRIVILEGED),
 
+        /* Obsolete properties or obsolete alias names */
+        SD_BUS_PROPERTY("RequiresOverridable", "as", property_get_obsolete_dependencies, 0, SD_BUS_VTABLE_HIDDEN),
+        SD_BUS_PROPERTY("RequisiteOverridable", "as", property_get_obsolete_dependencies, 0, SD_BUS_VTABLE_HIDDEN),
+        SD_BUS_PROPERTY("RequiredByOverridable", "as", property_get_obsolete_dependencies, 0, SD_BUS_VTABLE_HIDDEN),
+        SD_BUS_PROPERTY("RequisiteOfOverridable", "as", property_get_obsolete_dependencies, 0, SD_BUS_VTABLE_HIDDEN),
+        SD_BUS_PROPERTY("StartLimitInterval", "t", bus_property_get_usec, offsetof(Unit, start_limit.interval), SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
         SD_BUS_VTABLE_END
 };
 
@@ -922,7 +986,7 @@ static int append_cgroup(sd_bus_message *reply, const char *p, Set *pids) {
                 if (r == 0)
                         break;
 
-                j = strjoin(p, "/", g, NULL);
+                j = strjoin(p, "/", g);
                 if (!j)
                         return -ENOMEM;
 
@@ -943,6 +1007,10 @@ int bus_unit_method_get_processes(sd_bus_message *message, void *userdata, sd_bu
 
         assert(message);
 
+        r = mac_selinux_unit_access_check(u, message, "status", error);
+        if (r < 0)
+                return r;
+
         pids = set_new(NULL);
         if (!pids)
                 return -ENOMEM;
@@ -1064,7 +1132,7 @@ void bus_unit_send_change_signal(Unit *u) {
         if (!u->id)
                 return;
 
-        r = bus_foreach_bus(u->manager, NULL, u->sent_dbus_new_signal ? send_changed_signal : send_new_signal, u);
+        r = bus_foreach_bus(u->manager, u->bus_track, u->sent_dbus_new_signal ? send_changed_signal : send_new_signal, u);
         if (r < 0)
                 log_unit_debug_errno(u, r, "Failed to send unit change signal for %s: %m", u->id);
 
@@ -1104,13 +1172,13 @@ void bus_unit_send_removed_signal(Unit *u) {
         int r;
         assert(u);
 
-        if (!u->sent_dbus_new_signal)
+        if (!u->sent_dbus_new_signal || u->in_dbus_queue)
                 bus_unit_send_change_signal(u);
 
         if (!u->id)
                 return;
 
-        r = bus_foreach_bus(u->manager, NULL, send_removed_signal, u);
+        r = bus_foreach_bus(u->manager, u->bus_track, send_removed_signal, u);
         if (r < 0)
                 log_unit_debug_errno(u, r, "Failed to send unit remove signal for %s: %m", u->id);
 }
@@ -1155,23 +1223,15 @@ int bus_unit_queue_job(
             (type == JOB_STOP && u->refuse_manual_stop) ||
             ((type == JOB_RESTART || type == JOB_TRY_RESTART) && (u->refuse_manual_start || u->refuse_manual_stop)) ||
             (type == JOB_RELOAD_OR_START && job_type_collapse(type, u) == JOB_START && u->refuse_manual_start))
-                return sd_bus_error_setf(error, BUS_ERROR_ONLY_BY_DEPENDENCY, "Operation refused, unit %s may be requested by dependency only.", u->id);
+                return sd_bus_error_setf(error, BUS_ERROR_ONLY_BY_DEPENDENCY, "Operation refused, unit %s may be requested by dependency only (it is configured to refuse manual start/stop).", u->id);
 
         r = manager_add_job(u->manager, type, u, mode, error, &j);
         if (r < 0)
                 return r;
 
-        if (sd_bus_message_get_bus(message) == u->manager->api_bus) {
-                if (!j->clients) {
-                        r = sd_bus_track_new(sd_bus_message_get_bus(message), &j->clients, NULL, NULL);
-                        if (r < 0)
-                                return r;
-                }
-
-                r = sd_bus_track_add_sender(j->clients, message);
-                if (r < 0)
-                        return r;
-        }
+        r = bus_job_track_sender(j, message);
+        if (r < 0)
+                return r;
 
         path = job_dbus_path(j);
         if (!path)
@@ -1301,7 +1361,7 @@ static int bus_unit_set_transient_property(
                                 if (r < 0)
                                         return r;
 
-                                label = strjoin(name, "-", other, NULL);
+                                label = strjoin(name, "-", other);
                                 if (!label)
                                         return -ENOMEM;
 
@@ -1317,6 +1377,29 @@ static int bus_unit_set_transient_property(
                         return r;
 
                 return 1;
+
+        } else if (streq(name, "AddRef")) {
+
+                int b;
+
+                /* Why is this called "AddRef" rather than just "Ref", or "Reference"? There's already a "Ref()" method
+                 * on the Unit interface, and it's probably not a good idea to expose a property and a method on the
+                 * same interface (well, strictly speaking AddRef isn't exposed as full property, we just read it for
+                 * transient units, but still). And "References" and "ReferencedBy" is already used as unit reference
+                 * dependency type, hence let's not confuse things with that.
+                 *
+                 * Note that we don't acually add the reference to the bus track. We do that only after the setup of
+                 * the transient unit is complete, so that setting this property multiple times in the same transient
+                 * unit creation call doesn't count as individual references. */
+
+                r = sd_bus_message_read(message, "b", &b);
+                if (r < 0)
+                        return r;
+
+                if (mode != UNIT_CHECK)
+                        u->bus_track_add = b;
+
+                return 1;
         }
 
         return 0;
@@ -1421,3 +1504,71 @@ int bus_unit_check_load_state(Unit *u, sd_bus_error *error) {
 
         return sd_bus_error_set_errnof(error, u->load_error, "Unit %s is not loaded properly: %m.", u->id);
 }
+
+static int bus_unit_track_handler(sd_bus_track *t, void *userdata) {
+        Unit *u = userdata;
+
+        assert(t);
+        assert(u);
+
+        u->bus_track = sd_bus_track_unref(u->bus_track); /* make sure we aren't called again */
+
+        unit_add_to_gc_queue(u);
+        return 0;
+}
+
+static int bus_unit_allocate_bus_track(Unit *u) {
+        int r;
+
+        assert(u);
+
+        if (u->bus_track)
+                return 0;
+
+        r = sd_bus_track_new(u->manager->api_bus, &u->bus_track, bus_unit_track_handler, u);
+        if (r < 0)
+                return r;
+
+        r = sd_bus_track_set_recursive(u->bus_track, true);
+        if (r < 0) {
+                u->bus_track = sd_bus_track_unref(u->bus_track);
+                return r;
+        }
+
+        return 0;
+}
+
+int bus_unit_track_add_name(Unit *u, const char *name) {
+        int r;
+
+        assert(u);
+
+        r = bus_unit_allocate_bus_track(u);
+        if (r < 0)
+                return r;
+
+        return sd_bus_track_add_name(u->bus_track, name);
+}
+
+int bus_unit_track_add_sender(Unit *u, sd_bus_message *m) {
+        int r;
+
+        assert(u);
+
+        r = bus_unit_allocate_bus_track(u);
+        if (r < 0)
+                return r;
+
+        return sd_bus_track_add_sender(u->bus_track, m);
+}
+
+int bus_unit_track_remove_sender(Unit *u, sd_bus_message *m) {
+        assert(u);
+
+        /* If we haven't allocated the bus track object yet, then there's definitely no reference taken yet, return an
+         * error */
+        if (!u->bus_track)
+                return -EUNATCH;
+
+        return sd_bus_track_remove_sender(u->bus_track, m);
+}
index 4db88db..b280de7 100644 (file)
@@ -33,9 +33,15 @@ int bus_unit_method_start_generic(sd_bus_message *message, Unit *u, JobType job_
 int bus_unit_method_kill(sd_bus_message *message, void *userdata, sd_bus_error *error);
 int bus_unit_method_reset_failed(sd_bus_message *message, void *userdata, sd_bus_error *error);
 
-int bus_unit_queue_job(sd_bus_message *message, Unit *u, JobType type, JobMode mode, bool reload_if_possible, sd_bus_error *error);
 int bus_unit_set_properties(Unit *u, sd_bus_message *message, UnitSetPropertiesMode mode, bool commit, sd_bus_error *error);
 int bus_unit_method_set_properties(sd_bus_message *message, void *userdata, sd_bus_error *error);
 int bus_unit_method_get_processes(sd_bus_message *message, void *userdata, sd_bus_error *error);
+int bus_unit_method_ref(sd_bus_message *message, void *userdata, sd_bus_error *error);
+int bus_unit_method_unref(sd_bus_message *message, void *userdata, sd_bus_error *error);
 
+int bus_unit_queue_job(sd_bus_message *message, Unit *u, JobType type, JobMode mode, bool reload_if_possible, sd_bus_error *error);
 int bus_unit_check_load_state(Unit *u, sd_bus_error *error);
+
+int bus_unit_track_add_name(Unit *u, const char *name);
+int bus_unit_track_add_sender(Unit *u, sd_bus_message *m);
+int bus_unit_track_remove_sender(Unit *u, sd_bus_message *m);
index 3422a02..cfc045d 100644 (file)
@@ -175,7 +175,7 @@ static int signal_activation_request(sd_bus_message *message, void *userdata, sd
                 goto failed;
 
         if (u->refuse_manual_start) {
-                r = sd_bus_error_setf(&error, BUS_ERROR_ONLY_BY_DEPENDENCY, "Operation refused, %s may be requested by dependency only.", u->id);
+                r = sd_bus_error_setf(&error, BUS_ERROR_ONLY_BY_DEPENDENCY, "Operation refused, %s may be requested by dependency only (it is configured to refuse manual start/stop).", u->id);
                 goto failed;
         }
 
@@ -298,7 +298,7 @@ static int bus_job_find(sd_bus *bus, const char *path, const char *interface, vo
 }
 
 static int find_unit(Manager *m, sd_bus *bus, const char *path, Unit **unit, sd_bus_error *error) {
-        Unit *u;
+        Unit *u = NULL;  /* just to appease gcc, initialization is not really necessary */
         int r;
 
         assert(m);
@@ -323,15 +323,15 @@ static int find_unit(Manager *m, sd_bus *bus, const char *path, Unit **unit, sd_
                         return r;
 
                 u = manager_get_unit_by_pid(m, pid);
+                if (!u)
+                        return 0;
         } else {
                 r = manager_load_unit_from_dbus_path(m, path, error, &u);
                 if (r < 0)
                         return 0;
+                assert(u);
         }
 
-        if (!u)
-                return 0;
-
         *unit = u;
         return 1;
 }
@@ -477,7 +477,7 @@ static int bus_kill_context_find(sd_bus *bus, const char *path, const char *inte
 }
 
 static int bus_job_enumerate(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
-        _cleanup_free_ char **l = NULL;
+        _cleanup_strv_free_ char **l = NULL;
         Manager *m = userdata;
         unsigned k = 0;
         Iterator i;
@@ -504,7 +504,7 @@ static int bus_job_enumerate(sd_bus *bus, const char *path, void *userdata, char
 }
 
 static int bus_unit_enumerate(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
-        _cleanup_free_ char **l = NULL;
+        _cleanup_strv_free_ char **l = NULL;
         Manager *m = userdata;
         unsigned k = 0;
         Iterator i;
@@ -753,13 +753,13 @@ int manager_sync_bus_names(Manager *m, sd_bus *bus) {
                         /* If it is, determine its current owner */
                         r = sd_bus_get_name_creds(bus, name, SD_BUS_CREDS_UNIQUE_NAME, &creds);
                         if (r < 0) {
-                                log_error_errno(r, "Failed to get bus name owner %s: %m", name);
+                                log_full_errno(r == -ENXIO ? LOG_DEBUG : LOG_ERR, r, "Failed to get bus name owner %s: %m", name);
                                 continue;
                         }
 
                         r = sd_bus_creds_get_unique_name(creds, &unique);
                         if (r < 0) {
-                                log_error_errno(r, "Failed to get unique name for %s: %m", name);
+                                log_full_errno(r == -ENXIO ? LOG_DEBUG : LOG_ERR, r, "Failed to get unique name for %s: %m", name);
                                 continue;
                         }
 
@@ -964,10 +964,6 @@ static int bus_init_private(Manager *m) {
         if (m->private_listen_fd >= 0)
                 return 0;
 
-        /* We don't need the private socket if we have kdbus */
-        if (m->kdbus_fd >= 0)
-                return 0;
-
         if (MANAGER_IS_SYSTEM(m)) {
 
                 /* We want the private bus only when running as init */
@@ -1045,6 +1041,7 @@ int bus_init(Manager *m, bool try_bus_connect) {
 
 static void destroy_bus(Manager *m, sd_bus **bus) {
         Iterator i;
+        Unit *u;
         Job *j;
 
         assert(m);
@@ -1053,13 +1050,24 @@ static void destroy_bus(Manager *m, sd_bus **bus) {
         if (!*bus)
                 return;
 
+        /* Make sure all bus slots watching names are released. */
+        HASHMAP_FOREACH(u, m->watch_bus, i) {
+                if (!u->match_bus_slot)
+                        continue;
+
+                if (sd_bus_slot_get_bus(u->match_bus_slot) != *bus)
+                        continue;
+
+                u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot);
+        }
+
         /* Get rid of tracked clients on this bus */
         if (m->subscribed && sd_bus_track_get_bus(m->subscribed) == *bus)
                 m->subscribed = sd_bus_track_unref(m->subscribed);
 
         HASHMAP_FOREACH(j, m->jobs, i)
-                if (j->clients && sd_bus_track_get_bus(j->clients) == *bus)
-                        j->clients = sd_bus_track_unref(j->clients);
+                if (j->bus_track && sd_bus_track_get_bus(j->bus_track) == *bus)
+                        j->bus_track = sd_bus_track_unref(j->bus_track);
 
         /* Get rid of queued message on this bus */
         if (m->queued_message && sd_bus_message_get_bus(m->queued_message) == *bus)
@@ -1168,62 +1176,49 @@ int bus_foreach_bus(
         return ret;
 }
 
-void bus_track_serialize(sd_bus_track *t, FILE *f) {
+void bus_track_serialize(sd_bus_track *t, FILE *f, const char *prefix) {
         const char *n;
 
         assert(f);
+        assert(prefix);
 
-        for (n = sd_bus_track_first(t); n; n = sd_bus_track_next(t))
-                fprintf(f, "subscribed=%s\n", n);
-}
-
-int bus_track_deserialize_item(char ***l, const char *line) {
-        const char *e;
-        int r;
+        for (n = sd_bus_track_first(t); n; n = sd_bus_track_next(t)) {
+                int c, j;
 
-        assert(l);
-        assert(line);
+                c = sd_bus_track_count_name(t, n);
 
-        e = startswith(line, "subscribed=");
-        if (!e)
-                return 0;
-
-        r = strv_extend(l, e);
-        if (r < 0)
-                return r;
-
-        return 1;
+                for (j = 0; j < c; j++) {
+                        fputs(prefix, f);
+                        fputc('=', f);
+                        fputs(n, f);
+                        fputc('\n', f);
+                }
+        }
 }
 
-int bus_track_coldplug(Manager *m, sd_bus_track **t, char ***l) {
+int bus_track_coldplug(Manager *m, sd_bus_track **t, bool recursive, char **l) {
         int r = 0;
 
         assert(m);
         assert(t);
-        assert(l);
 
-        if (!strv_isempty(*l) && m->api_bus) {
-                char **i;
-
-                if (!*t) {
-                        r = sd_bus_track_new(m->api_bus, t, NULL, NULL);
-                        if (r < 0)
-                                return r;
-                }
+        if (strv_isempty(l))
+                return 0;
 
-                r = 0;
-                STRV_FOREACH(i, *l) {
-                        int k;
+        if (!m->api_bus)
+                return 0;
 
-                        k = sd_bus_track_add_name(*t, *i);
-                        if (k < 0)
-                                r = k;
-                }
+        if (!*t) {
+                r = sd_bus_track_new(m->api_bus, t, NULL, NULL);
+                if (r < 0)
+                        return r;
         }
 
-        *l = strv_free(*l);
+        r = sd_bus_track_set_recursive(*t, recursive);
+        if (r < 0)
+                return r;
 
-        return r;
+        return bus_track_add_name_many(*t, l);
 }
 
 int bus_verify_manage_units_async(Manager *m, sd_bus_message *call, sd_bus_error *error) {
index 6baaffb..a092ed9 100644 (file)
@@ -28,9 +28,8 @@ void bus_done(Manager *m);
 
 int bus_fdset_add_all(Manager *m, FDSet *fds);
 
-void bus_track_serialize(sd_bus_track *t, FILE *f);
-int bus_track_deserialize_item(char ***l, const char *line);
-int bus_track_coldplug(Manager *m, sd_bus_track **t, char ***l);
+void bus_track_serialize(sd_bus_track *t, FILE *f, const char *prefix);
+int bus_track_coldplug(Manager *m, sd_bus_track **t, bool recursive, char **l);
 
 int manager_sync_bus_names(Manager *m, sd_bus *bus);
 
index 592ec47..48fa262 100644 (file)
@@ -112,7 +112,7 @@ static void device_init(Unit *u) {
          * indefinitely for plugged in devices, something which cannot
          * happen for the other units since their operations time out
          * anyway. */
-        u->job_timeout = u->manager->default_timeout_start_usec;
+        u->job_running_timeout = u->manager->default_timeout_start_usec;
 
         u->ignore_on_isolate = true;
 }
@@ -239,7 +239,7 @@ static int device_update_description(Unit *u, struct udev_device *dev, const cha
                 if (label) {
                         _cleanup_free_ char *j;
 
-                        j = strjoin(model, " ", label, NULL);
+                        j = strjoin(model, " ", label);
                         if (j)
                                 r = unit_set_description(u, j);
                         else
@@ -256,38 +256,63 @@ static int device_update_description(Unit *u, struct udev_device *dev, const cha
 }
 
 static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
-        const char *wants;
-        const char *word, *state;
-        size_t l;
+        const char *wants, *property, *p;
         int r;
-        const char *property;
 
         assert(u);
         assert(dev);
 
         property = MANAGER_IS_USER(u->manager) ? "SYSTEMD_USER_WANTS" : "SYSTEMD_WANTS";
         wants = udev_device_get_property_value(dev, property);
-        if (!wants)
-                return 0;
-
-        FOREACH_WORD_QUOTED(word, l, wants, state) {
-                _cleanup_free_ char *n = NULL;
-                char e[l+1];
+        for (p = wants;;) {
+                _cleanup_free_ char *word = NULL, *k = NULL;
 
-                memcpy(e, word, l);
-                e[l] = 0;
+                r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES);
+                if (r == 0)
+                        return 0;
+                if (r == -ENOMEM)
+                        return log_oom();
+                if (r < 0)
+                        return log_unit_error_errno(u, r, "Failed to add parse %s: %m", property);
 
-                r = unit_name_mangle(e, UNIT_NAME_NOGLOB, &n);
+                r = unit_name_mangle(word, UNIT_NAME_NOGLOB, &k);
                 if (r < 0)
-                        return log_unit_error_errno(u, r, "Failed to mangle unit name: %m");
+                        return log_unit_error_errno(u, r, "Failed to mangle unit name \"%s\": %m", word);
 
-                r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
+                r = unit_add_dependency_by_name(u, UNIT_WANTS, k, NULL, true);
                 if (r < 0)
                         return log_unit_error_errno(u, r, "Failed to add wants dependency: %m");
         }
-        if (!isempty(state))
-                log_unit_warning(u, "Property %s on %s has trailing garbage, ignoring.", property, strna(udev_device_get_syspath(dev)));
+}
+
+static bool device_is_bound_by_mounts(Unit *d, struct udev_device *dev) {
+        const char *bound_by;
+        int r = false;
+
+        assert(d);
+        assert(dev);
+
+        bound_by = udev_device_get_property_value(dev, "SYSTEMD_MOUNT_DEVICE_BOUND");
+        if (bound_by)
+                r = parse_boolean(bound_by) > 0;
 
+        DEVICE(d)->bind_mounts = r;
+        return r;
+}
+
+static int device_upgrade_mount_deps(Unit *u) {
+        Unit *other;
+        Iterator i;
+        int r;
+
+        SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i) {
+                if (other->type != UNIT_MOUNT)
+                        continue;
+
+                r = unit_add_dependency(other, UNIT_BINDS_TO, u, true);
+                if (r < 0)
+                        return r;
+        }
         return 0;
 }
 
@@ -331,11 +356,7 @@ static int device_setup_unit(Manager *m, struct udev_device *dev, const char *pa
         if (!u) {
                 delete = true;
 
-                u = unit_new(m, sizeof(Device));
-                if (!u)
-                        return log_oom();
-
-                r = unit_add_name(u, e);
+                r = unit_new_for_name(m, sizeof(Device), e, &u);
                 if (r < 0)
                         goto fail;
 
@@ -359,6 +380,13 @@ static int device_setup_unit(Manager *m, struct udev_device *dev, const char *pa
                         (void) device_add_udev_wants(u, dev);
         }
 
+        /* So the user wants the mount units to be bound to the device but a
+         * mount unit might has been seen by systemd before the device appears
+         * on its radar. In this case the device unit is partially initialized
+         * and includes the deps on the mount unit but at that time the "bind
+         * mounts" flag wasn't not present. Fix this up now. */
+        if (dev && device_is_bound_by_mounts(u, dev))
+                device_upgrade_mount_deps(u);
 
         /* Note that this won't dispatch the load queue, the caller
          * has to do that if needed and appropriate */
@@ -427,26 +455,22 @@ static int device_process_new(Manager *m, struct udev_device *dev) {
         /* Add additional units for all explicitly configured
          * aliases */
         alias = udev_device_get_property_value(dev, "SYSTEMD_ALIAS");
-        if (alias) {
-                const char *word, *state;
-                size_t l;
-
-                FOREACH_WORD_QUOTED(word, l, alias, state) {
-                        char e[l+1];
+        for (;;) {
+                _cleanup_free_ char *word = NULL;
 
-                        memcpy(e, word, l);
-                        e[l] = 0;
+                r = extract_first_word(&alias, &word, NULL, EXTRACT_QUOTES);
+                if (r == 0)
+                        return 0;
+                if (r == -ENOMEM)
+                        return log_oom();
+                if (r < 0)
+                        return log_warning_errno(r, "Failed to add parse SYSTEMD_ALIAS for %s: %m", sysfs);
 
-                        if (path_is_absolute(e))
-                                (void) device_setup_unit(m, dev, e, false);
-                        else
-                                log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, e);
-                }
-                if (!isempty(state))
-                        log_warning("SYSTEMD_ALIAS for %s has trailing garbage, ignoring.", sysfs);
+                if (path_is_absolute(word))
+                        (void) device_setup_unit(m, dev, word, false);
+                else
+                        log_warning("SYSTEMD_ALIAS for %s is not an absolute path, ignoring: %s", sysfs, word);
         }
-
-        return 0;
 }
 
 static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) {
@@ -464,6 +488,10 @@ static void device_update_found_one(Device *d, bool add, DeviceFound found, bool
         if (!now)
                 return;
 
+        /* Didn't exist before, but does now? if so, generate a new invocation ID for it */
+        if (previous == DEVICE_NOT_FOUND && d->found != DEVICE_NOT_FOUND)
+                (void) unit_acquire_invocation_id(UNIT(d));
+
         if (d->found & DEVICE_FOUND_UDEV)
                 /* When the device is known to udev we consider it
                  * plugged. */
@@ -473,12 +501,16 @@ static void device_update_found_one(Device *d, bool add, DeviceFound found, bool
                  * now referenced by the kernel, then we assume the
                  * kernel knows it now, and udev might soon too. */
                 device_set_state(d, DEVICE_TENTATIVE);
-        else
+        else {
                 /* If nobody sees the device, or if the device was
                  * previously seen by udev and now is only referenced
                  * from the kernel, then we consider the device is
                  * gone, the kernel just hasn't noticed it yet. */
+
                 device_set_state(d, DEVICE_DEAD);
+                device_unset_sysfs(d);
+        }
+
 }
 
 static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) {
@@ -840,6 +872,14 @@ int device_found_node(Manager *m, const char *node, bool add, DeviceFound found,
         return device_update_found_by_name(m, node, add, found, now);
 }
 
+bool device_shall_be_bound_by(Unit *device, Unit *u) {
+
+        if (u->type != UNIT_MOUNT)
+                return false;
+
+        return DEVICE(device)->bind_mounts;
+}
+
 const UnitVTable device_vtable = {
         .object_size = sizeof(Device),
         .sections =
@@ -847,6 +887,8 @@ const UnitVTable device_vtable = {
                 "Device\0"
                 "Install\0",
 
+        .gc_jobs = true,
+
         .init = device_init,
         .done = device_done,
         .load = unit_load_fragment_and_dropin_optional,
index 184a1a3..dd372fb 100644 (file)
@@ -40,8 +40,11 @@ struct Device {
         LIST_FIELDS(struct Device, same_sysfs);
 
         DeviceState state, deserialized_state;
+
+        bool bind_mounts;
 };
 
 extern const UnitVTable device_vtable;
 
 int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now);
+bool device_shall_be_bound_by(Unit *device, Unit *u);
diff --git a/src/core/dynamic-user.c b/src/core/dynamic-user.c
new file mode 100644 (file)
index 0000000..e1846e1
--- /dev/null
@@ -0,0 +1,794 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <grp.h>
+#include <pwd.h>
+#include <sys/file.h>
+
+#include "dynamic-user.h"
+#include "fd-util.h"
+#include "fs-util.h"
+#include "parse-util.h"
+#include "random-util.h"
+#include "stdio-util.h"
+#include "string-util.h"
+#include "user-util.h"
+#include "fileio.h"
+
+/* Takes a value generated randomly or by hashing and turns it into a UID in the right range */
+#define UID_CLAMP_INTO_RANGE(rnd) (((uid_t) (rnd) % (DYNAMIC_UID_MAX - DYNAMIC_UID_MIN + 1)) + DYNAMIC_UID_MIN)
+
+static DynamicUser* dynamic_user_free(DynamicUser *d) {
+        if (!d)
+                return NULL;
+
+        if (d->manager)
+                (void) hashmap_remove(d->manager->dynamic_users, d->name);
+
+        safe_close_pair(d->storage_socket);
+        return mfree(d);
+}
+
+static int dynamic_user_add(Manager *m, const char *name, int storage_socket[2], DynamicUser **ret) {
+        DynamicUser *d = NULL;
+        int r;
+
+        assert(m);
+        assert(name);
+        assert(storage_socket);
+
+        r = hashmap_ensure_allocated(&m->dynamic_users, &string_hash_ops);
+        if (r < 0)
+                return r;
+
+        d = malloc0(offsetof(DynamicUser, name) + strlen(name) + 1);
+        if (!d)
+                return -ENOMEM;
+
+        strcpy(d->name, name);
+
+        d->storage_socket[0] = storage_socket[0];
+        d->storage_socket[1] = storage_socket[1];
+
+        r = hashmap_put(m->dynamic_users, d->name, d);
+        if (r < 0) {
+                free(d);
+                return r;
+        }
+
+        d->manager = m;
+
+        if (ret)
+                *ret = d;
+
+        return 0;
+}
+
+int dynamic_user_acquire(Manager *m, const char *name, DynamicUser** ret) {
+        _cleanup_close_pair_ int storage_socket[2] = { -1, -1 };
+        DynamicUser *d;
+        int r;
+
+        assert(m);
+        assert(name);
+
+        /* Return the DynamicUser structure for a specific user name. Note that this won't actually allocate a UID for
+         * it, but just prepare the data structure for it. The UID is allocated only on demand, when it's really
+         * needed, and in the child process we fork off, since allocation involves NSS checks which are not OK to do
+         * from PID 1. To allow the children and PID 1 share information about allocated UIDs we use an anonymous
+         * AF_UNIX/SOCK_DGRAM socket (called the "storage socket") that contains at most one datagram with the
+         * allocated UID number, plus an fd referencing the lock file for the UID
+         * (i.e. /run/systemd/dynamic-uid/$UID). Why involve the socket pair? So that PID 1 and all its children can
+         * share the same storage for the UID and lock fd, simply by inheriting the storage socket fds. The socket pair
+         * may exist in three different states:
+         *
+         * a) no datagram stored. This is the initial state. In this case the dynamic user was never realized.
+         *
+         * b) a datagram containing a UID stored, but no lock fd attached to it. In this case there was already a
+         *    statically assigned UID by the same name, which we are reusing.
+         *
+         * c) a datagram containing a UID stored, and a lock fd is attached to it. In this case we allocated a dynamic
+         *    UID and locked it in the file system, using the lock fd.
+         *
+         * As PID 1 and various children might access the socket pair simultaneously, and pop the datagram or push it
+         * back in any time, we also maintain a lock on the socket pair. Note one peculiarity regarding locking here:
+         * the UID lock on disk is protected via a BSD file lock (i.e. an fd-bound lock), so that the lock is kept in
+         * place as long as there's a reference to the fd open. The lock on the storage socket pair however is a POSIX
+         * file lock (i.e. a process-bound lock), as all users share the same fd of this (after all it is anonymous,
+         * nobody else could get any access to it except via our own fd) and we want to synchronize access between all
+         * processes that have access to it. */
+
+        d = hashmap_get(m->dynamic_users, name);
+        if (d) {
+                /* We already have a structure for the dynamic user, let's increase the ref count and reuse it */
+                d->n_ref++;
+                *ret = d;
+                return 0;
+        }
+
+        if (!valid_user_group_name_or_id(name))
+                return -EINVAL;
+
+        if (socketpair(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0, storage_socket) < 0)
+                return -errno;
+
+        r = dynamic_user_add(m, name, storage_socket, &d);
+        if (r < 0)
+                return r;
+
+        storage_socket[0] = storage_socket[1] = -1;
+
+        if (ret) {
+                d->n_ref++;
+                *ret = d;
+        }
+
+        return 1;
+}
+
+static int make_uid_symlinks(uid_t uid, const char *name, bool b) {
+
+        char path1[strlen("/run/systemd/dynamic-uid/direct:") + DECIMAL_STR_MAX(uid_t) + 1];
+        const char *path2;
+        int r = 0, k;
+
+        /* Add direct additional symlinks for direct lookups of dynamic UIDs and their names by userspace code. The
+         * only reason we have this is because dbus-daemon cannot use D-Bus for resolving users and groups (since it
+         * would be its own client then). We hence keep these world-readable symlinks in place, so that the
+         * unprivileged dbus user can read the mappings when it needs them via these symlinks instead of having to go
+         * via the bus. Ideally, we'd use the lock files we keep for this anyway, but we can't since we use BSD locks
+         * on them and as those may be taken by any user with read access we can't make them world-readable. */
+
+        xsprintf(path1, "/run/systemd/dynamic-uid/direct:" UID_FMT, uid);
+        if (unlink(path1) < 0 && errno != ENOENT)
+                r = -errno;
+
+        if (b && symlink(name, path1) < 0) {
+                k = log_warning_errno(errno, "Failed to symlink \"%s\": %m", path1);
+                if (r == 0)
+                        r = k;
+        }
+
+        path2 = strjoina("/run/systemd/dynamic-uid/direct:", name);
+        if (unlink(path2) < 0 && errno != ENOENT) {
+                k = -errno;
+                if (r == 0)
+                        r = k;
+        }
+
+        if (b && symlink(path1 + strlen("/run/systemd/dynamic-uid/direct:"), path2) < 0) {
+                k = log_warning_errno(errno,  "Failed to symlink \"%s\": %m", path2);
+                if (r == 0)
+                        r = k;
+        }
+
+        return r;
+}
+
+static int pick_uid(const char *name, uid_t *ret_uid) {
+
+        static const uint8_t hash_key[] = {
+                0x37, 0x53, 0x7e, 0x31, 0xcf, 0xce, 0x48, 0xf5,
+                0x8a, 0xbb, 0x39, 0x57, 0x8d, 0xd9, 0xec, 0x59
+        };
+
+        unsigned n_tries = 100;
+        uid_t candidate;
+        int r;
+
+        /* A static user by this name does not exist yet. Let's find a free ID then, and use that. We start with a UID
+         * generated as hash from the user name. */
+        candidate = UID_CLAMP_INTO_RANGE(siphash24(name, strlen(name), hash_key));
+
+        (void) mkdir("/run/systemd/dynamic-uid", 0755);
+
+        for (;;) {
+                char lock_path[strlen("/run/systemd/dynamic-uid/") + DECIMAL_STR_MAX(uid_t) + 1];
+                _cleanup_close_ int lock_fd = -1;
+                ssize_t l;
+
+                if (--n_tries <= 0) /* Give up retrying eventually */
+                        return -EBUSY;
+
+                if (!uid_is_dynamic(candidate))
+                        goto next;
+
+                xsprintf(lock_path, "/run/systemd/dynamic-uid/" UID_FMT, candidate);
+
+                for (;;) {
+                        struct stat st;
+
+                        lock_fd = open(lock_path, O_CREAT|O_RDWR|O_NOFOLLOW|O_CLOEXEC|O_NOCTTY, 0600);
+                        if (lock_fd < 0)
+                                return -errno;
+
+                        r = flock(lock_fd, LOCK_EX|LOCK_NB); /* Try to get a BSD file lock on the UID lock file */
+                        if (r < 0) {
+                                if (errno == EBUSY || errno == EAGAIN)
+                                        goto next; /* already in use */
+
+                                return -errno;
+                        }
+
+                        if (fstat(lock_fd, &st) < 0)
+                                return -errno;
+                        if (st.st_nlink > 0)
+                                break;
+
+                        /* Oh, bummer, we got the lock, but the file was unlinked between the time we opened it and
+                         * got the lock. Close it, and try again. */
+                        lock_fd = safe_close(lock_fd);
+                }
+
+                /* Some superficial check whether this UID/GID might already be taken by some static user */
+                if (getpwuid(candidate) || getgrgid((gid_t) candidate)) {
+                        (void) unlink(lock_path);
+                        goto next;
+                }
+
+                /* Let's store the user name in the lock file, so that we can use it for looking up the username for a UID */
+                l = pwritev(lock_fd,
+                            (struct iovec[2]) {
+                                    { .iov_base = (char*) name, .iov_len = strlen(name) },
+                                    { .iov_base = (char[1]) { '\n' }, .iov_len = 1 }
+                            }, 2, 0);
+                if (l < 0) {
+                        (void) unlink(lock_path);
+                        return -errno;
+                }
+
+                (void) ftruncate(lock_fd, l);
+                (void) make_uid_symlinks(candidate, name, true); /* also add direct lookup symlinks */
+
+                *ret_uid = candidate;
+                r = lock_fd;
+                lock_fd = -1;
+
+                return r;
+
+        next:
+                /* Pick another random UID, and see if that works for us. */
+                random_bytes(&candidate, sizeof(candidate));
+                candidate = UID_CLAMP_INTO_RANGE(candidate);
+        }
+}
+
+static int dynamic_user_pop(DynamicUser *d, uid_t *ret_uid, int *ret_lock_fd) {
+        uid_t uid = UID_INVALID;
+        struct iovec iov = {
+                .iov_base = &uid,
+                .iov_len = sizeof(uid),
+        };
+        union {
+                struct cmsghdr cmsghdr;
+                uint8_t buf[CMSG_SPACE(sizeof(int))];
+        } control = {};
+        struct msghdr mh = {
+                .msg_control = &control,
+                .msg_controllen = sizeof(control),
+                .msg_iov = &iov,
+                .msg_iovlen = 1,
+        };
+        struct cmsghdr *cmsg;
+
+        ssize_t k;
+        int lock_fd = -1;
+
+        assert(d);
+        assert(ret_uid);
+        assert(ret_lock_fd);
+
+        /* Read the UID and lock fd that is stored in the storage AF_UNIX socket. This should be called with the lock
+         * on the socket taken. */
+
+        k = recvmsg(d->storage_socket[0], &mh, MSG_DONTWAIT|MSG_NOSIGNAL|MSG_CMSG_CLOEXEC);
+        if (k < 0)
+                return -errno;
+
+        cmsg = cmsg_find(&mh, SOL_SOCKET, SCM_RIGHTS, CMSG_LEN(sizeof(int)));
+        if (cmsg)
+                lock_fd = *(int*) CMSG_DATA(cmsg);
+        else
+                cmsg_close_all(&mh); /* just in case... */
+
+        *ret_uid = uid;
+        *ret_lock_fd = lock_fd;
+
+        return 0;
+}
+
+static int dynamic_user_push(DynamicUser *d, uid_t uid, int lock_fd) {
+        struct iovec iov = {
+                .iov_base = &uid,
+                .iov_len = sizeof(uid),
+        };
+        union {
+                struct cmsghdr cmsghdr;
+                uint8_t buf[CMSG_SPACE(sizeof(int))];
+        } control = {};
+        struct msghdr mh = {
+                .msg_control = &control,
+                .msg_controllen = sizeof(control),
+                .msg_iov = &iov,
+                .msg_iovlen = 1,
+        };
+        ssize_t k;
+
+        assert(d);
+
+        /* Store the UID and lock_fd in the storage socket. This should be called with the socket pair lock taken. */
+
+        if (lock_fd >= 0) {
+                struct cmsghdr *cmsg;
+
+                cmsg = CMSG_FIRSTHDR(&mh);
+                cmsg->cmsg_level = SOL_SOCKET;
+                cmsg->cmsg_type = SCM_RIGHTS;
+                cmsg->cmsg_len = CMSG_LEN(sizeof(int));
+                memcpy(CMSG_DATA(cmsg), &lock_fd, sizeof(int));
+
+                mh.msg_controllen = CMSG_SPACE(sizeof(int));
+        } else {
+                mh.msg_control = NULL;
+                mh.msg_controllen = 0;
+        }
+
+        k = sendmsg(d->storage_socket[1], &mh, MSG_DONTWAIT|MSG_NOSIGNAL);
+        if (k < 0)
+                return -errno;
+
+        return 0;
+}
+
+static void unlink_uid_lock(int lock_fd, uid_t uid, const char *name) {
+        char lock_path[strlen("/run/systemd/dynamic-uid/") + DECIMAL_STR_MAX(uid_t) + 1];
+
+        if (lock_fd < 0)
+                return;
+
+        xsprintf(lock_path, "/run/systemd/dynamic-uid/" UID_FMT, uid);
+        (void) unlink(lock_path);
+
+        (void) make_uid_symlinks(uid, name, false); /* remove direct lookup symlinks */
+}
+
+int dynamic_user_realize(DynamicUser *d, uid_t *ret) {
+
+        _cleanup_close_ int etc_passwd_lock_fd = -1, uid_lock_fd = -1;
+        uid_t uid = UID_INVALID;
+        int r;
+
+        assert(d);
+
+        /* Acquire a UID for the user name. This will allocate a UID for the user name if the user doesn't exist
+         * yet. If it already exists its existing UID/GID will be reused. */
+
+        if (lockf(d->storage_socket[0], F_LOCK, 0) < 0)
+                return -errno;
+
+        r = dynamic_user_pop(d, &uid, &uid_lock_fd);
+        if (r < 0) {
+                int new_uid_lock_fd;
+                uid_t new_uid;
+
+                if (r != -EAGAIN)
+                        goto finish;
+
+                /* OK, nothing stored yet, let's try to find something useful. While we are working on this release the
+                 * lock however, so that nobody else blocks on our NSS lookups. */
+                (void) lockf(d->storage_socket[0], F_ULOCK, 0);
+
+                /* Let's see if a proper, static user or group by this name exists. Try to take the lock on
+                 * /etc/passwd, if that fails with EROFS then /etc is read-only. In that case it's fine if we don't
+                 * take the lock, given that users can't be added there anyway in this case. */
+                etc_passwd_lock_fd = take_etc_passwd_lock(NULL);
+                if (etc_passwd_lock_fd < 0 && etc_passwd_lock_fd != -EROFS)
+                        return etc_passwd_lock_fd;
+
+                /* First, let's parse this as numeric UID */
+                r = parse_uid(d->name, &uid);
+                if (r < 0) {
+                        struct passwd *p;
+                        struct group *g;
+
+                        /* OK, this is not a numeric UID. Let's see if there's a user by this name */
+                        p = getpwnam(d->name);
+                        if (p)
+                                uid = p->pw_uid;
+
+                        /* Let's see if there's a group by this name */
+                        g = getgrnam(d->name);
+                        if (g) {
+                                /* If the UID/GID of the user/group of the same don't match, refuse operation */
+                                if (uid != UID_INVALID && uid != (uid_t) g->gr_gid)
+                                        return -EILSEQ;
+
+                                uid = (uid_t) g->gr_gid;
+                        }
+                }
+
+                if (uid == UID_INVALID) {
+                        /* No static UID assigned yet, excellent. Let's pick a new dynamic one, and lock it. */
+
+                        uid_lock_fd = pick_uid(d->name, &uid);
+                        if (uid_lock_fd < 0)
+                                return uid_lock_fd;
+                }
+
+                /* So, we found a working UID/lock combination. Let's see if we actually still need it. */
+                if (lockf(d->storage_socket[0], F_LOCK, 0) < 0) {
+                        unlink_uid_lock(uid_lock_fd, uid, d->name);
+                        return -errno;
+                }
+
+                r = dynamic_user_pop(d, &new_uid, &new_uid_lock_fd);
+                if (r < 0) {
+                        if (r != -EAGAIN) {
+                                /* OK, something bad happened, let's get rid of the bits we acquired. */
+                                unlink_uid_lock(uid_lock_fd, uid, d->name);
+                                goto finish;
+                        }
+
+                        /* Great! Nothing is stored here, still. Store our newly acquired data. */
+                } else {
+                        /* Hmm, so as it appears there's now something stored in the storage socket. Throw away what we
+                         * acquired, and use what's stored now. */
+
+                        unlink_uid_lock(uid_lock_fd, uid, d->name);
+                        safe_close(uid_lock_fd);
+
+                        uid = new_uid;
+                        uid_lock_fd = new_uid_lock_fd;
+                }
+        }
+
+        /* If the UID/GID was already allocated dynamically, push the data we popped out back in. If it was already
+         * allocated statically, push the UID back too, but do not push the lock fd in. If we allocated the UID
+         * dynamically right here, push that in along with the lock fd for it. */
+        r = dynamic_user_push(d, uid, uid_lock_fd);
+        if (r < 0)
+                goto finish;
+
+        *ret = uid;
+        r = 0;
+
+finish:
+        (void) lockf(d->storage_socket[0], F_ULOCK, 0);
+        return r;
+}
+
+int dynamic_user_current(DynamicUser *d, uid_t *ret) {
+        _cleanup_close_ int lock_fd = -1;
+        uid_t uid;
+        int r;
+
+        assert(d);
+        assert(ret);
+
+        /* Get the currently assigned UID for the user, if there's any. This simply pops the data from the storage socket, and pushes it back in right-away. */
+
+        if (lockf(d->storage_socket[0], F_LOCK, 0) < 0)
+                return -errno;
+
+        r = dynamic_user_pop(d, &uid, &lock_fd);
+        if (r < 0)
+                goto finish;
+
+        r = dynamic_user_push(d, uid, lock_fd);
+        if (r < 0)
+                goto finish;
+
+        *ret = uid;
+        r = 0;
+
+finish:
+        (void) lockf(d->storage_socket[0], F_ULOCK, 0);
+        return r;
+}
+
+DynamicUser* dynamic_user_ref(DynamicUser *d) {
+        if (!d)
+                return NULL;
+
+        assert(d->n_ref > 0);
+        d->n_ref++;
+
+        return d;
+}
+
+DynamicUser* dynamic_user_unref(DynamicUser *d) {
+        if (!d)
+                return NULL;
+
+        /* Note that this doesn't actually release any resources itself. If a dynamic user should be fully destroyed
+         * and its UID released, use dynamic_user_destroy() instead. NB: the dynamic user table may contain entries
+         * with no references, which is commonly the case right before a daemon reload. */
+
+        assert(d->n_ref > 0);
+        d->n_ref--;
+
+        return NULL;
+}
+
+static int dynamic_user_close(DynamicUser *d) {
+        _cleanup_close_ int lock_fd = -1;
+        uid_t uid;
+        int r;
+
+        /* Release the user ID, by releasing the lock on it, and emptying the storage socket. After this the user is
+         * unrealized again, much like it was after it the DynamicUser object was first allocated. */
+
+        if (lockf(d->storage_socket[0], F_LOCK, 0) < 0)
+                return -errno;
+
+        r = dynamic_user_pop(d, &uid, &lock_fd);
+        if (r == -EAGAIN) {
+                /* User wasn't realized yet, nothing to do. */
+                r = 0;
+                goto finish;
+        }
+        if (r < 0)
+                goto finish;
+
+        /* This dynamic user was realized and dynamically allocated. In this case, let's remove the lock file. */
+        unlink_uid_lock(lock_fd, uid, d->name);
+        r = 1;
+
+finish:
+        (void) lockf(d->storage_socket[0], F_ULOCK, 0);
+        return r;
+}
+
+DynamicUser* dynamic_user_destroy(DynamicUser *d) {
+        if (!d)
+                return NULL;
+
+        /* Drop a reference to a DynamicUser object, and destroy the user completely if this was the last
+         * reference. This is called whenever a service is shut down and wants its dynamic UID gone. Note that
+         * dynamic_user_unref() is what is called whenever a service is simply freed, for example during a reload
+         * cycle, where the dynamic users should not be destroyed, but our datastructures should. */
+
+        dynamic_user_unref(d);
+
+        if (d->n_ref > 0)
+                return NULL;
+
+        (void) dynamic_user_close(d);
+        return dynamic_user_free(d);
+}
+
+int dynamic_user_serialize(Manager *m, FILE *f, FDSet *fds) {
+        DynamicUser *d;
+        Iterator i;
+
+        assert(m);
+        assert(f);
+        assert(fds);
+
+        /* Dump the dynamic user database into the manager serialization, to deal with daemon reloads. */
+
+        HASHMAP_FOREACH(d, m->dynamic_users, i) {
+                int copy0, copy1;
+
+                copy0 = fdset_put_dup(fds, d->storage_socket[0]);
+                if (copy0 < 0)
+                        return copy0;
+
+                copy1 = fdset_put_dup(fds, d->storage_socket[1]);
+                if (copy1 < 0)
+                        return copy1;
+
+                fprintf(f, "dynamic-user=%s %i %i\n", d->name, copy0, copy1);
+        }
+
+        return 0;
+}
+
+void dynamic_user_deserialize_one(Manager *m, const char *value, FDSet *fds) {
+        _cleanup_free_ char *name = NULL, *s0 = NULL, *s1 = NULL;
+        int r, fd0, fd1;
+
+        assert(m);
+        assert(value);
+        assert(fds);
+
+        /* Parse the serialization again, after a daemon reload */
+
+        r = extract_many_words(&value, NULL, 0, &name, &s0, &s1, NULL);
+        if (r != 3 || !isempty(value)) {
+                log_debug("Unable to parse dynamic user line.");
+                return;
+        }
+
+        if (safe_atoi(s0, &fd0) < 0 || !fdset_contains(fds, fd0)) {
+                log_debug("Unable to process dynamic user fd specification.");
+                return;
+        }
+
+        if (safe_atoi(s1, &fd1) < 0 || !fdset_contains(fds, fd1)) {
+                log_debug("Unable to process dynamic user fd specification.");
+                return;
+        }
+
+        r = dynamic_user_add(m, name, (int[]) { fd0, fd1 }, NULL);
+        if (r < 0) {
+                log_debug_errno(r, "Failed to add dynamic user: %m");
+                return;
+        }
+
+        (void) fdset_remove(fds, fd0);
+        (void) fdset_remove(fds, fd1);
+}
+
+void dynamic_user_vacuum(Manager *m, bool close_user) {
+        DynamicUser *d;
+        Iterator i;
+
+        assert(m);
+
+        /* Empty the dynamic user database, optionally cleaning up orphaned dynamic users, i.e. destroy and free users
+         * to which no reference exist. This is called after a daemon reload finished, in order to destroy users which
+         * might not be referenced anymore. */
+
+        HASHMAP_FOREACH(d, m->dynamic_users, i) {
+                if (d->n_ref > 0)
+                        continue;
+
+                if (close_user) {
+                        log_debug("Removing orphaned dynamic user %s", d->name);
+                        (void) dynamic_user_close(d);
+                }
+
+                dynamic_user_free(d);
+        }
+}
+
+int dynamic_user_lookup_uid(Manager *m, uid_t uid, char **ret) {
+        char lock_path[strlen("/run/systemd/dynamic-uid/") + DECIMAL_STR_MAX(uid_t) + 1];
+        _cleanup_free_ char *user = NULL;
+        uid_t check_uid;
+        int r;
+
+        assert(m);
+        assert(ret);
+
+        /* A friendly way to translate a dynamic user's UID into a name. */
+        if (!uid_is_dynamic(uid))
+                return -ESRCH;
+
+        xsprintf(lock_path, "/run/systemd/dynamic-uid/" UID_FMT, uid);
+        r = read_one_line_file(lock_path, &user);
+        if (r == -ENOENT)
+                return -ESRCH;
+        if (r < 0)
+                return r;
+
+        /* The lock file might be stale, hence let's verify the data before we return it */
+        r = dynamic_user_lookup_name(m, user, &check_uid);
+        if (r < 0)
+                return r;
+        if (check_uid != uid) /* lock file doesn't match our own idea */
+                return -ESRCH;
+
+        *ret = user;
+        user = NULL;
+
+        return 0;
+}
+
+int dynamic_user_lookup_name(Manager *m, const char *name, uid_t *ret) {
+        DynamicUser *d;
+        int r;
+
+        assert(m);
+        assert(name);
+        assert(ret);
+
+        /* A friendly call for translating a dynamic user's name into its UID */
+
+        d = hashmap_get(m->dynamic_users, name);
+        if (!d)
+                return -ESRCH;
+
+        r = dynamic_user_current(d, ret);
+        if (r == -EAGAIN) /* not realized yet? */
+                return -ESRCH;
+
+        return r;
+}
+
+int dynamic_creds_acquire(DynamicCreds *creds, Manager *m, const char *user, const char *group) {
+        bool acquired = false;
+        int r;
+
+        assert(creds);
+        assert(m);
+
+        /* A DynamicUser object encapsulates an allocation of both a UID and a GID for a specific name. However, some
+         * services use different user and groups. For cases like that there's DynamicCreds containing a pair of user
+         * and group. This call allocates a pair. */
+
+        if (!creds->user && user) {
+                r = dynamic_user_acquire(m, user, &creds->user);
+                if (r < 0)
+                        return r;
+
+                acquired = true;
+        }
+
+        if (!creds->group) {
+
+                if (creds->user && (!group || streq_ptr(user, group)))
+                        creds->group = dynamic_user_ref(creds->user);
+                else {
+                        r = dynamic_user_acquire(m, group, &creds->group);
+                        if (r < 0) {
+                                if (acquired)
+                                        creds->user = dynamic_user_unref(creds->user);
+                                return r;
+                        }
+                }
+        }
+
+        return 0;
+}
+
+int dynamic_creds_realize(DynamicCreds *creds, uid_t *uid, gid_t *gid) {
+        uid_t u = UID_INVALID;
+        gid_t g = GID_INVALID;
+        int r;
+
+        assert(creds);
+        assert(uid);
+        assert(gid);
+
+        /* Realize both the referenced user and group */
+
+        if (creds->user) {
+                r = dynamic_user_realize(creds->user, &u);
+                if (r < 0)
+                        return r;
+        }
+
+        if (creds->group && creds->group != creds->user) {
+                r = dynamic_user_realize(creds->group, &g);
+                if (r < 0)
+                        return r;
+        } else
+                g = u;
+
+        *uid = u;
+        *gid = g;
+
+        return 0;
+}
+
+void dynamic_creds_unref(DynamicCreds *creds) {
+        assert(creds);
+
+        creds->user = dynamic_user_unref(creds->user);
+        creds->group = dynamic_user_unref(creds->group);
+}
+
+void dynamic_creds_destroy(DynamicCreds *creds) {
+        assert(creds);
+
+        creds->user = dynamic_user_destroy(creds->user);
+        creds->group = dynamic_user_destroy(creds->group);
+}
diff --git a/src/core/dynamic-user.h b/src/core/dynamic-user.h
new file mode 100644 (file)
index 0000000..0b8bce1
--- /dev/null
@@ -0,0 +1,66 @@
+#pragma once
+
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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/>.
+***/
+
+typedef struct DynamicUser DynamicUser;
+
+typedef struct DynamicCreds {
+        /* A combination of a dynamic user and group */
+        DynamicUser *user;
+        DynamicUser *group;
+} DynamicCreds;
+
+#include "manager.h"
+
+/* Note that this object always allocates a pair of user and group under the same name, even if one of them isn't
+ * used. This means, if you want to allocate a group and user pair, and they might have two different names, then you
+ * need to allocated two of these objects. DynamicCreds below makes that easy. */
+struct DynamicUser {
+        int n_ref;
+        Manager *manager;
+
+        /* An AF_UNIX socket pair that contains a datagram containing both the numeric ID assigned, as well as a lock
+         * file fd locking the user ID we picked. */
+        int storage_socket[2];
+
+        char name[];
+};
+
+int dynamic_user_acquire(Manager *m, const char *name, DynamicUser **ret);
+
+int dynamic_user_realize(DynamicUser *d, uid_t *ret);
+int dynamic_user_current(DynamicUser *d, uid_t *ret);
+
+DynamicUser* dynamic_user_ref(DynamicUser *d);
+DynamicUser* dynamic_user_unref(DynamicUser *d);
+DynamicUser* dynamic_user_destroy(DynamicUser *d);
+
+int dynamic_user_serialize(Manager *m, FILE *f, FDSet *fds);
+void dynamic_user_deserialize_one(Manager *m, const char *value, FDSet *fds);
+void dynamic_user_vacuum(Manager *m, bool close_user);
+
+int dynamic_user_lookup_uid(Manager *m, uid_t uid, char **ret);
+int dynamic_user_lookup_name(Manager *m, const char *name, uid_t *ret);
+
+int dynamic_creds_acquire(DynamicCreds *creds, Manager *m, const char *user, const char *group);
+int dynamic_creds_realize(DynamicCreds *creds, uid_t *uid, gid_t *gid);
+
+void dynamic_creds_unref(DynamicCreds *creds);
+void dynamic_creds_destroy(DynamicCreds *creds);
similarity index 60%
rename from src/core/failure-action.c
rename to src/core/emergency-action.c
index ddae461..90232bc 100644 (file)
 
 #include "bus-error.h"
 #include "bus-util.h"
-#include "failure-action.h"
+#include "emergency-action.h"
 #include "special.h"
 #include "string-table.h"
 #include "terminal-util.h"
 
-static void log_and_status(Manager *m, const char *message) {
-        log_warning("%s", message);
+static void log_and_status(Manager *m, const char *message, const char *reason) {
+        log_warning("%s: %s", message, reason);
         manager_status_printf(m, STATUS_TYPE_EMERGENCY,
                               ANSI_HIGHLIGHT_RED " !!  " ANSI_NORMAL,
-                              "%s", message);
+                              "%s: %s", message, reason);
 }
 
-int failure_action(
+int emergency_action(
                 Manager *m,
-                FailureAction action,
-                const char *reboot_arg) {
+                EmergencyAction action,
+                const char *reboot_arg,
+                const char *reason) {
 
         assert(m);
         assert(action >= 0);
-        assert(action < _FAILURE_ACTION_MAX);
+        assert(action < _EMERGENCY_ACTION_MAX);
 
-        if (action == FAILURE_ACTION_NONE)
+        if (action == EMERGENCY_ACTION_NONE)
                 return -ECANCELED;
 
         if (!MANAGER_IS_SYSTEM(m)) {
                 /* Downgrade all options to simply exiting if we run
                  * in user mode */
 
-                log_warning("Exiting as result of failure.");
+                log_warning("Exiting: %s", reason);
                 m->exit_code = MANAGER_EXIT;
                 return -ECANCELED;
         }
 
         switch (action) {
 
-        case FAILURE_ACTION_REBOOT:
-                log_and_status(m, "Rebooting as result of failure.");
+        case EMERGENCY_ACTION_REBOOT:
+                log_and_status(m, "Rebooting", reason);
 
                 (void) update_reboot_parameter_and_warn(reboot_arg);
                 (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_REBOOT_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL);
 
                 break;
 
-        case FAILURE_ACTION_REBOOT_FORCE:
-                log_and_status(m, "Forcibly rebooting as result of failure.");
+        case EMERGENCY_ACTION_REBOOT_FORCE:
+                log_and_status(m, "Forcibly rebooting", reason);
 
                 (void) update_reboot_parameter_and_warn(reboot_arg);
                 m->exit_code = MANAGER_REBOOT;
 
                 break;
 
-        case FAILURE_ACTION_REBOOT_IMMEDIATE:
-                log_and_status(m, "Rebooting immediately as result of failure.");
+        case EMERGENCY_ACTION_REBOOT_IMMEDIATE:
+                log_and_status(m, "Rebooting immediately", reason);
 
                 sync();
 
@@ -89,18 +90,18 @@ int failure_action(
                 reboot(RB_AUTOBOOT);
                 break;
 
-        case FAILURE_ACTION_POWEROFF:
-                log_and_status(m, "Powering off as result of failure.");
+        case EMERGENCY_ACTION_POWEROFF:
+                log_and_status(m, "Powering off", reason);
                 (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_POWEROFF_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL);
                 break;
 
-        case FAILURE_ACTION_POWEROFF_FORCE:
-                log_and_status(m, "Forcibly powering off as result of failure.");
+        case EMERGENCY_ACTION_POWEROFF_FORCE:
+                log_and_status(m, "Forcibly powering off", reason);
                 m->exit_code = MANAGER_POWEROFF;
                 break;
 
-        case FAILURE_ACTION_POWEROFF_IMMEDIATE:
-                log_and_status(m, "Powering off immediately as result of failure.");
+        case EMERGENCY_ACTION_POWEROFF_IMMEDIATE:
+                log_and_status(m, "Powering off immediately", reason);
 
                 sync();
 
@@ -109,19 +110,19 @@ int failure_action(
                 break;
 
         default:
-                assert_not_reached("Unknown failure action");
+                assert_not_reached("Unknown emergency action");
         }
 
         return -ECANCELED;
 }
 
-static const char* const failure_action_table[_FAILURE_ACTION_MAX] = {
-        [FAILURE_ACTION_NONE] = "none",
-        [FAILURE_ACTION_REBOOT] = "reboot",
-        [FAILURE_ACTION_REBOOT_FORCE] = "reboot-force",
-        [FAILURE_ACTION_REBOOT_IMMEDIATE] = "reboot-immediate",
-        [FAILURE_ACTION_POWEROFF] = "poweroff",
-        [FAILURE_ACTION_POWEROFF_FORCE] = "poweroff-force",
-        [FAILURE_ACTION_POWEROFF_IMMEDIATE] = "poweroff-immediate"
+static const char* const emergency_action_table[_EMERGENCY_ACTION_MAX] = {
+        [EMERGENCY_ACTION_NONE] = "none",
+        [EMERGENCY_ACTION_REBOOT] = "reboot",
+        [EMERGENCY_ACTION_REBOOT_FORCE] = "reboot-force",
+        [EMERGENCY_ACTION_REBOOT_IMMEDIATE] = "reboot-immediate",
+        [EMERGENCY_ACTION_POWEROFF] = "poweroff",
+        [EMERGENCY_ACTION_POWEROFF_FORCE] = "poweroff-force",
+        [EMERGENCY_ACTION_POWEROFF_IMMEDIATE] = "poweroff-immediate"
 };
-DEFINE_STRING_TABLE_LOOKUP(failure_action, FailureAction);
+DEFINE_STRING_TABLE_LOOKUP(emergency_action, EmergencyAction);
similarity index 56%
rename from src/core/failure-action.h
rename to src/core/emergency-action.h
index 1adac4a..8804b59 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-typedef enum FailureAction {
-        FAILURE_ACTION_NONE,
-        FAILURE_ACTION_REBOOT,
-        FAILURE_ACTION_REBOOT_FORCE,
-        FAILURE_ACTION_REBOOT_IMMEDIATE,
-        FAILURE_ACTION_POWEROFF,
-        FAILURE_ACTION_POWEROFF_FORCE,
-        FAILURE_ACTION_POWEROFF_IMMEDIATE,
-        _FAILURE_ACTION_MAX,
-        _FAILURE_ACTION_INVALID = -1
-} FailureAction;
+typedef enum EmergencyAction {
+        EMERGENCY_ACTION_NONE,
+        EMERGENCY_ACTION_REBOOT,
+        EMERGENCY_ACTION_REBOOT_FORCE,
+        EMERGENCY_ACTION_REBOOT_IMMEDIATE,
+        EMERGENCY_ACTION_POWEROFF,
+        EMERGENCY_ACTION_POWEROFF_FORCE,
+        EMERGENCY_ACTION_POWEROFF_IMMEDIATE,
+        _EMERGENCY_ACTION_MAX,
+        _EMERGENCY_ACTION_INVALID = -1
+} EmergencyAction;
 
 #include "macro.h"
 #include "manager.h"
 
-int failure_action(Manager *m, FailureAction action, const char *reboot_arg);
+int emergency_action(Manager *m, EmergencyAction action, const char *reboot_arg, const char *reason);
 
-const char* failure_action_to_string(FailureAction i) _const_;
-FailureAction failure_action_from_string(const char *s) _pure_;
+const char* emergency_action_to_string(EmergencyAction i) _const_;
+EmergencyAction emergency_action_from_string(const char *s) _pure_;
index 4b81c83..9295108 100644 (file)
 #include <signal.h>
 #include <string.h>
 #include <sys/capability.h>
+#include <sys/eventfd.h>
 #include <sys/mman.h>
 #include <sys/personality.h>
 #include <sys/prctl.h>
+#include <sys/shm.h>
 #include <sys/socket.h>
 #include <sys/stat.h>
+#include <sys/types.h>
 #include <sys/un.h>
 #include <unistd.h>
 #include <utmpx.h>
@@ -68,7 +71,7 @@
 #include "exit-status.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "glob-util.h"
 #include "io-util.h"
@@ -90,6 +93,7 @@
 #include "selinux-util.h"
 #include "signal-util.h"
 #include "smack-util.h"
+#include "special.h"
 #include "string-table.h"
 #include "string-util.h"
 #include "strv.h"
@@ -153,22 +157,26 @@ static int shift_fds(int fds[], unsigned n_fds) {
         return 0;
 }
 
-static int flags_fds(const int fds[], unsigned n_fds, bool nonblock) {
-        unsigned i;
+static int flags_fds(const int fds[], unsigned n_storage_fds, unsigned n_socket_fds, bool nonblock) {
+        unsigned i, n_fds;
         int r;
 
+        n_fds = n_storage_fds + n_socket_fds;
         if (n_fds <= 0)
                 return 0;
 
         assert(fds);
 
-        /* Drops/Sets O_NONBLOCK and FD_CLOEXEC from the file flags */
+        /* Drops/Sets O_NONBLOCK and FD_CLOEXEC from the file flags.
+         * O_NONBLOCK only applies to socket activation though. */
 
         for (i = 0; i < n_fds; i++) {
 
-                r = fd_nonblock(fds[i], nonblock);
-                if (r < 0)
-                        return r;
+                if (i < n_socket_fds) {
+                        r = fd_nonblock(fds[i], nonblock);
+                        if (r < 0)
+                                return r;
+                }
 
                 /* We unconditionally drop FD_CLOEXEC from the fds,
                  * since after all we want to pass these fds to our
@@ -219,12 +227,36 @@ static void exec_context_tty_reset(const ExecContext *context, const ExecParamet
                 (void) vt_disallocate(path);
 }
 
+static bool is_terminal_input(ExecInput i) {
+        return IN_SET(i,
+                      EXEC_INPUT_TTY,
+                      EXEC_INPUT_TTY_FORCE,
+                      EXEC_INPUT_TTY_FAIL);
+}
+
 static bool is_terminal_output(ExecOutput o) {
-        return
-                o == EXEC_OUTPUT_TTY ||
-                o == EXEC_OUTPUT_SYSLOG_AND_CONSOLE ||
-                o == EXEC_OUTPUT_KMSG_AND_CONSOLE ||
-                o == EXEC_OUTPUT_JOURNAL_AND_CONSOLE;
+        return IN_SET(o,
+                      EXEC_OUTPUT_TTY,
+                      EXEC_OUTPUT_SYSLOG_AND_CONSOLE,
+                      EXEC_OUTPUT_KMSG_AND_CONSOLE,
+                      EXEC_OUTPUT_JOURNAL_AND_CONSOLE);
+}
+
+static bool exec_context_needs_term(const ExecContext *c) {
+        assert(c);
+
+        /* Return true if the execution context suggests we should set $TERM to something useful. */
+
+        if (is_terminal_input(c->std_input))
+                return true;
+
+        if (is_terminal_output(c->std_output))
+                return true;
+
+        if (is_terminal_output(c->std_error))
+                return true;
+
+        return !!c->tty_path;
 }
 
 static int open_null_as(int flags, int nfd) {
@@ -363,13 +395,6 @@ static int open_terminal_as(const char *path, mode_t mode, int nfd) {
         return r;
 }
 
-static bool is_terminal_input(ExecInput i) {
-        return
-                i == EXEC_INPUT_TTY ||
-                i == EXEC_INPUT_TTY_FORCE ||
-                i == EXEC_INPUT_TTY_FAIL;
-}
-
 static int fixup_input(ExecInput std_input, int socket_fd, bool apply_tty_stdin) {
 
         if (is_terminal_input(std_input) && !apply_tty_stdin)
@@ -392,7 +417,8 @@ static int fixup_output(ExecOutput std_output, int socket_fd) {
 static int setup_input(
                 const ExecContext *context,
                 const ExecParameters *params,
-                int socket_fd) {
+                int socket_fd,
+                int named_iofds[3]) {
 
         ExecInput i;
 
@@ -410,7 +436,7 @@ static int setup_input(
                 return STDIN_FILENO;
         }
 
-        i = fixup_input(context->std_input, socket_fd, params->apply_tty_stdin);
+        i = fixup_input(context->std_input, socket_fd, params->flags & EXEC_APPLY_TTY_STDIN);
 
         switch (i) {
 
@@ -442,6 +468,10 @@ static int setup_input(
         case EXEC_INPUT_SOCKET:
                 return dup2(socket_fd, STDIN_FILENO) < 0 ? -errno : STDIN_FILENO;
 
+        case EXEC_INPUT_NAMED_FD:
+                (void) fd_nonblock(named_iofds[STDIN_FILENO], false);
+                return dup2(named_iofds[STDIN_FILENO], STDIN_FILENO) < 0 ? -errno : STDIN_FILENO;
+
         default:
                 assert_not_reached("Unknown input type");
         }
@@ -453,6 +483,7 @@ static int setup_output(
                 const ExecParameters *params,
                 int fileno,
                 int socket_fd,
+                int named_iofds[3],
                 const char *ident,
                 uid_t uid,
                 gid_t gid,
@@ -485,7 +516,7 @@ static int setup_output(
                 return STDERR_FILENO;
         }
 
-        i = fixup_input(context->std_input, socket_fd, params->apply_tty_stdin);
+        i = fixup_input(context->std_input, socket_fd, params->flags & EXEC_APPLY_TTY_STDIN);
         o = fixup_output(context->std_output, socket_fd);
 
         if (fileno == STDERR_FILENO) {
@@ -504,7 +535,7 @@ static int setup_output(
                         return fileno;
 
                 /* Duplicate from stdout if possible */
-                if (e == o || e == EXEC_OUTPUT_INHERIT)
+                if ((e == o && e != EXEC_OUTPUT_NAMED_FD) || e == EXEC_OUTPUT_INHERIT)
                         return dup2(STDOUT_FILENO, fileno) < 0 ? -errno : fileno;
 
                 o = e;
@@ -566,6 +597,10 @@ static int setup_output(
                 assert(socket_fd >= 0);
                 return dup2(socket_fd, fileno) < 0 ? -errno : fileno;
 
+        case EXEC_OUTPUT_NAMED_FD:
+                (void) fd_nonblock(named_iofds[fileno], false);
+                return dup2(named_iofds[fileno], fileno) < 0 ? -errno : fileno;
+
         default:
                 assert_not_reached("Unknown error type");
         }
@@ -593,7 +628,7 @@ static int chown_terminal(int fd, uid_t uid) {
         return 0;
 }
 
-static int setup_confirm_stdio(int *_saved_stdin, int *_saved_stdout) {
+static int setup_confirm_stdio(const char *vc, int *_saved_stdin, int *_saved_stdout) {
         _cleanup_close_ int fd = -1, saved_stdin = -1, saved_stdout = -1;
         int r;
 
@@ -608,12 +643,7 @@ static int setup_confirm_stdio(int *_saved_stdin, int *_saved_stdout) {
         if (saved_stdout < 0)
                 return -errno;
 
-        fd = acquire_terminal(
-                        "/dev/console",
-                        false,
-                        false,
-                        false,
-                        DEFAULT_CONFIRM_USEC);
+        fd = acquire_terminal(vc, false, false, false, DEFAULT_CONFIRM_USEC);
         if (fd < 0)
                 return fd;
 
@@ -643,21 +673,27 @@ static int setup_confirm_stdio(int *_saved_stdin, int *_saved_stdout) {
         return 0;
 }
 
-_printf_(1, 2) static int write_confirm_message(const char *format, ...) {
+static void write_confirm_error_fd(int err, int fd, const Unit *u) {
+        assert(err < 0);
+
+        if (err == -ETIMEDOUT)
+                dprintf(fd, "Confirmation question timed out for %s, assuming positive response.\n", u->id);
+        else {
+                errno = -err;
+                dprintf(fd, "Couldn't ask confirmation for %s: %m, assuming positive response.\n", u->id);
+        }
+}
+
+static void write_confirm_error(int err, const char *vc, const Unit *u) {
         _cleanup_close_ int fd = -1;
-        va_list ap;
 
-        assert(format);
+        assert(vc);
 
-        fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
+        fd = open_terminal(vc, O_WRONLY|O_NOCTTY|O_CLOEXEC);
         if (fd < 0)
-                return fd;
-
-        va_start(ap, format);
-        vdprintf(fd, format, ap);
-        va_end(ap);
+                return;
 
-        return 0;
+        write_confirm_error_fd(err, fd, u);
 }
 
 static int restore_confirm_stdio(int *saved_stdin, int *saved_stdout) {
@@ -682,92 +718,250 @@ static int restore_confirm_stdio(int *saved_stdin, int *saved_stdout) {
         return r;
 }
 
-static int ask_for_confirmation(char *response, char **argv) {
+enum {
+        CONFIRM_PRETEND_FAILURE = -1,
+        CONFIRM_PRETEND_SUCCESS =  0,
+        CONFIRM_EXECUTE = 1,
+};
+
+static int ask_for_confirmation(const char *vc, Unit *u, const char *cmdline) {
         int saved_stdout = -1, saved_stdin = -1, r;
-        _cleanup_free_ char *line = NULL;
+        _cleanup_free_ char *e = NULL;
+        char c;
 
-        r = setup_confirm_stdio(&saved_stdin, &saved_stdout);
-        if (r < 0)
-                return r;
+        /* For any internal errors, assume a positive response. */
+        r = setup_confirm_stdio(vc, &saved_stdin, &saved_stdout);
+        if (r < 0) {
+                write_confirm_error(r, vc, u);
+                return CONFIRM_EXECUTE;
+        }
 
-        line = exec_command_line(argv);
-        if (!line)
-                return -ENOMEM;
+        /* confirm_spawn might have been disabled while we were sleeping. */
+        if (manager_is_confirm_spawn_disabled(u->manager)) {
+                r = 1;
+                goto restore_stdio;
+        }
+
+        e = ellipsize(cmdline, 60, 100);
+        if (!e) {
+                log_oom();
+                r = CONFIRM_EXECUTE;
+                goto restore_stdio;
+        }
 
-        r = ask_char(response, "yns", "Execute %s? [Yes, No, Skip] ", line);
+        for (;;) {
+                r = ask_char(&c, "yfshiDjcn", "Execute %s? [y, f, s – h for help] ", e);
+                if (r < 0) {
+                        write_confirm_error_fd(r, STDOUT_FILENO, u);
+                        r = CONFIRM_EXECUTE;
+                        goto restore_stdio;
+                }
 
-        restore_confirm_stdio(&saved_stdin, &saved_stdout);
+                switch (c) {
+                case 'c':
+                        printf("Resuming normal execution.\n");
+                        manager_disable_confirm_spawn();
+                        r = 1;
+                        break;
+                case 'D':
+                        unit_dump(u, stdout, "  ");
+                        continue; /* ask again */
+                case 'f':
+                        printf("Failing execution.\n");
+                        r = CONFIRM_PRETEND_FAILURE;
+                        break;
+                case 'h':
+                        printf("  c - continue, proceed without asking anymore\n"
+                               "  D - dump, show the state of the unit\n"
+                               "  f - fail, don't execute the command and pretend it failed\n"
+                               "  h - help\n"
+                               "  i - info, show a short summary of the unit\n"
+                               "  j - jobs, show jobs that are in progress\n"
+                               "  s - skip, don't execute the command and pretend it succeeded\n"
+                               "  y - yes, execute the command\n");
+                        continue; /* ask again */
+                case 'i':
+                        printf("  Description: %s\n"
+                               "  Unit:        %s\n"
+                               "  Command:     %s\n",
+                               u->id, u->description, cmdline);
+                        continue; /* ask again */
+                case 'j':
+                        manager_dump_jobs(u->manager, stdout, "  ");
+                        continue; /* ask again */
+                case 'n':
+                        /* 'n' was removed in favor of 'f'. */
+                        printf("Didn't understand 'n', did you mean 'f'?\n");
+                        continue; /* ask again */
+                case 's':
+                        printf("Skipping execution.\n");
+                        r = CONFIRM_PRETEND_SUCCESS;
+                        break;
+                case 'y':
+                        r = CONFIRM_EXECUTE;
+                        break;
+                default:
+                        assert_not_reached("Unhandled choice");
+                }
+                break;
+        }
 
+restore_stdio:
+        restore_confirm_stdio(&saved_stdin, &saved_stdout);
         return r;
 }
 
-static int enforce_groups(const ExecContext *context, const char *username, gid_t gid) {
-        bool keep_groups = false;
+static int get_fixed_user(const ExecContext *c, const char **user,
+                          uid_t *uid, gid_t *gid,
+                          const char **home, const char **shell) {
         int r;
+        const char *name;
 
-        assert(context);
+        assert(c);
 
-        /* Lookup and set GID and supplementary group list. Here too
-         * we avoid NSS lookups for gid=0. */
+        if (!c->user)
+                return 0;
+
+        /* Note that we don't set $HOME or $SHELL if they are not particularly enlightening anyway
+         * (i.e. are "/" or "/bin/nologin"). */
+
+        name = c->user;
+        r = get_user_creds_clean(&name, uid, gid, home, shell);
+        if (r < 0)
+                return r;
+
+        *user = name;
+        return 0;
+}
+
+static int get_fixed_group(const ExecContext *c, const char **group, gid_t *gid) {
+        int r;
+        const char *name;
+
+        assert(c);
+
+        if (!c->group)
+                return 0;
+
+        name = c->group;
+        r = get_group_creds(&name, gid);
+        if (r < 0)
+                return r;
+
+        *group = name;
+        return 0;
+}
+
+static int get_supplementary_groups(const ExecContext *c, const char *user,
+                                    const char *group, gid_t gid,
+                                    gid_t **supplementary_gids, int *ngids) {
+        char **i;
+        int r, k = 0;
+        int ngroups_max;
+        bool keep_groups = false;
+        gid_t *groups = NULL;
+        _cleanup_free_ gid_t *l_gids = NULL;
 
-        if (context->group || username) {
+        assert(c);
+
+        /*
+         * If user is given, then lookup GID and supplementary groups list.
+         * We avoid NSS lookups for gid=0. Also we have to initialize groups
+         * here and as early as possible so we keep the list of supplementary
+         * groups of the caller.
+         */
+        if (user && gid_is_valid(gid) && gid != 0) {
                 /* First step, initialize groups from /etc/groups */
-                if (username && gid != 0) {
-                        if (initgroups(username, gid) < 0)
-                                return -errno;
+                if (initgroups(user, gid) < 0)
+                        return -errno;
 
-                        keep_groups = true;
-                }
+                keep_groups = true;
+        }
 
-                /* Second step, set our gids */
-                if (setresgid(gid, gid, gid) < 0)
+        if (!c->supplementary_groups)
+                return 0;
+
+        /*
+         * If SupplementaryGroups= was passed then NGROUPS_MAX has to
+         * be positive, otherwise fail.
+         */
+        errno = 0;
+        ngroups_max = (int) sysconf(_SC_NGROUPS_MAX);
+        if (ngroups_max <= 0) {
+                if (errno > 0)
                         return -errno;
+                else
+                        return -EOPNOTSUPP; /* For all other values */
         }
 
-        if (context->supplementary_groups) {
-                int ngroups_max, k;
-                gid_t *gids;
-                char **i;
+        l_gids = new(gid_t, ngroups_max);
+        if (!l_gids)
+                return -ENOMEM;
 
-                /* Final step, initialize any manually set supplementary groups */
-                assert_se((ngroups_max = (int) sysconf(_SC_NGROUPS_MAX)) > 0);
+        if (keep_groups) {
+                /*
+                 * Lookup the list of groups that the user belongs to, we
+                 * avoid NSS lookups here too for gid=0.
+                 */
+                k = ngroups_max;
+                if (getgrouplist(user, gid, l_gids, &k) < 0)
+                        return -EINVAL;
+        } else
+                k = 0;
 
-                if (!(gids = new(gid_t, ngroups_max)))
-                        return -ENOMEM;
+        STRV_FOREACH(i, c->supplementary_groups) {
+                const char *g;
 
-                if (keep_groups) {
-                        k = getgroups(ngroups_max, gids);
-                        if (k < 0) {
-                                free(gids);
-                                return -errno;
-                        }
-                } else
-                        k = 0;
+                if (k >= ngroups_max)
+                        return -E2BIG;
 
-                STRV_FOREACH(i, context->supplementary_groups) {
-                        const char *g;
+                g = *i;
+                r = get_group_creds(&g, l_gids+k);
+                if (r < 0)
+                        return r;
 
-                        if (k >= ngroups_max) {
-                                free(gids);
-                                return -E2BIG;
-                        }
+                k++;
+        }
 
-                        g = *i;
-                        r = get_group_creds(&g, gids+k);
-                        if (r < 0) {
-                                free(gids);
-                                return r;
-                        }
+        /*
+         * Sets ngids to zero to drop all supplementary groups, happens
+         * when we are under root and SupplementaryGroups= is empty.
+         */
+        if (k == 0) {
+                *ngids = 0;
+                return 0;
+        }
 
-                        k++;
-                }
+        /* Otherwise get the final list of supplementary groups */
+        groups = memdup(l_gids, sizeof(gid_t) * k);
+        if (!groups)
+                return -ENOMEM;
 
-                if (setgroups(k, gids) < 0) {
-                        free(gids);
-                        return -errno;
-                }
+        *supplementary_gids = groups;
+        *ngids = k;
+
+        groups = NULL;
+
+        return 0;
+}
+
+static int enforce_groups(const ExecContext *context, gid_t gid,
+                          gid_t *supplementary_gids, int ngids) {
+        int r;
+
+        assert(context);
 
-                free(gids);
+        /* Handle SupplementaryGroups= even if it is empty */
+        if (context->supplementary_groups) {
+                r = maybe_setgroups(ngids, supplementary_gids);
+                if (r < 0)
+                        return r;
+        }
+
+        if (gid_is_valid(gid)) {
+                /* Then set our gids */
+                if (setresgid(gid, gid, gid) < 0)
+                        return -errno;
         }
 
         return 0;
@@ -776,6 +970,9 @@ static int enforce_groups(const ExecContext *context, const char *username, gid_
 static int enforce_user(const ExecContext *context, uid_t uid) {
         assert(context);
 
+        if (!uid_is_valid(uid))
+                return 0;
+
         /* Sets (but doesn't look up) the uid and make sure we keep the
          * capabilities while doing so. */
 
@@ -839,14 +1036,19 @@ static int null_conv(
         return PAM_CONV_ERR;
 }
 
+#endif
+
 static int setup_pam(
                 const char *name,
                 const char *user,
                 uid_t uid,
+                gid_t gid,
                 const char *tty,
                 char ***env,
                 int fds[], unsigned n_fds) {
 
+#ifdef HAVE_PAM
+
         static const struct pam_conv conv = {
                 .conv = null_conv,
                 .appdata_ptr = NULL
@@ -946,8 +1148,14 @@ static int setup_pam(
                  * and this will make PR_SET_PDEATHSIG work in most cases.
                  * If this fails, ignore the error - but expect sd-pam threads
                  * to fail to exit normally */
+
+                r = maybe_setgroups(0, NULL);
+                if (r < 0)
+                        log_warning_errno(r, "Failed to setgroups() in sd-pam: %m");
+                if (setresgid(gid, gid, gid) < 0)
+                        log_warning_errno(errno, "Failed to setresgid() in sd-pam: %m");
                 if (setresuid(uid, uid, uid) < 0)
-                        log_error_errno(r, "Error: Failed to setresuid() in sd-pam: %m");
+                        log_warning_errno(errno, "Failed to setresuid() in sd-pam: %m");
 
                 (void) ignore_signals(SIGPIPE, -1);
 
@@ -961,11 +1169,13 @@ static int setup_pam(
 
                 /* Tell the parent that our setup is done. This is especially
                  * important regarding dropping privileges. Otherwise, unit
-                 * setup might race against our setresuid(2) call. */
-                barrier_place(&barrier);
+                 * setup might race against our setresuid(2) call.
+                 *
+                 * If the parent aborted, we'll detect this below, hence ignore
+                 * return failure here. */
+                (void) barrier_place(&barrier);
 
-                /* Check if our parent process might already have
-                 * died? */
+                /* Check if our parent process might already have died? */
                 if (getppid() == parent_pid) {
                         sigset_t ss;
 
@@ -1040,8 +1250,10 @@ fail:
         closelog();
 
         return r;
-}
+#else
+        return 0;
 #endif
+}
 
 static void rename_process_from_path(const char *path) {
         char process_name[11];
@@ -1074,285 +1286,188 @@ static void rename_process_from_path(const char *path) {
         rename_process(process_name);
 }
 
-#ifdef HAVE_SECCOMP
+static bool context_has_address_families(const ExecContext *c) {
+        assert(c);
 
-static int apply_seccomp(const ExecContext *c) {
-        uint32_t negative_action, action;
-        scmp_filter_ctx *seccomp;
-        Iterator i;
-        void *id;
-        int r;
+        return c->address_families_whitelist ||
+                !set_isempty(c->address_families);
+}
 
+static bool context_has_syscall_filters(const ExecContext *c) {
         assert(c);
 
-        negative_action = c->syscall_errno == 0 ? SCMP_ACT_KILL : SCMP_ACT_ERRNO(c->syscall_errno);
-
-        seccomp = seccomp_init(c->syscall_whitelist ? negative_action : SCMP_ACT_ALLOW);
-        if (!seccomp)
-                return -ENOMEM;
+        return c->syscall_whitelist ||
+                !set_isempty(c->syscall_filter);
+}
 
-        if (c->syscall_archs) {
+static bool context_has_no_new_privileges(const ExecContext *c) {
+        assert(c);
 
-                SET_FOREACH(id, c->syscall_archs, i) {
-                        r = seccomp_arch_add(seccomp, PTR_TO_UINT32(id) - 1);
-                        if (r == -EEXIST)
-                                continue;
-                        if (r < 0)
-                                goto finish;
-                }
+        if (c->no_new_privileges)
+                return true;
 
-        } else {
-                r = seccomp_add_secondary_archs(seccomp);
-                if (r < 0)
-                        goto finish;
-        }
+        if (have_effective_cap(CAP_SYS_ADMIN)) /* if we are privileged, we don't need NNP */
+                return false;
+
+        /* We need NNP if we have any form of seccomp and are unprivileged */
+        return context_has_address_families(c) ||
+                c->memory_deny_write_execute ||
+                c->restrict_realtime ||
+                exec_context_restrict_namespaces_set(c) ||
+                c->protect_kernel_tunables ||
+                c->protect_kernel_modules ||
+                c->private_devices ||
+                context_has_syscall_filters(c) ||
+                !set_isempty(c->syscall_archs);
+}
 
-        action = c->syscall_whitelist ? SCMP_ACT_ALLOW : negative_action;
-        SET_FOREACH(id, c->syscall_filter, i) {
-                r = seccomp_rule_add(seccomp, action, PTR_TO_INT(id) - 1, 0);
-                if (r < 0)
-                        goto finish;
-        }
+#ifdef HAVE_SECCOMP
 
-        r = seccomp_attr_set(seccomp, SCMP_FLTATR_CTL_NNP, 0);
-        if (r < 0)
-                goto finish;
+static bool skip_seccomp_unavailable(const Unit* u, const char* msg) {
 
-        r = seccomp_load(seccomp);
+        if (is_seccomp_available())
+                return false;
 
-finish:
-        seccomp_release(seccomp);
-        return r;
+        log_open();
+        log_unit_debug(u, "SECCOMP features not detected in the kernel, skipping %s", msg);
+        log_close();
+        return true;
 }
 
-static int apply_address_families(const ExecContext *c) {
-        scmp_filter_ctx *seccomp;
-        Iterator i;
-        int r;
+static int apply_syscall_filter(const Unit* u, const ExecContext *c) {
+        uint32_t negative_action, default_action, action;
 
+        assert(u);
         assert(c);
 
-        seccomp = seccomp_init(SCMP_ACT_ALLOW);
-        if (!seccomp)
-                return -ENOMEM;
-
-        r = seccomp_add_secondary_archs(seccomp);
-        if (r < 0)
-                goto finish;
-
-        if (c->address_families_whitelist) {
-                int af, first = 0, last = 0;
-                void *afp;
+        if (!context_has_syscall_filters(c))
+                return 0;
 
-                /* If this is a whitelist, we first block the address
-                 * families that are out of range and then everything
-                 * that is not in the set. First, we find the lowest
-                 * and highest address family in the set. */
+        if (skip_seccomp_unavailable(u, "SystemCallFilter="))
+                return 0;
 
-                SET_FOREACH(afp, c->address_families, i) {
-                        af = PTR_TO_INT(afp);
+        negative_action = c->syscall_errno == 0 ? SCMP_ACT_KILL : SCMP_ACT_ERRNO(c->syscall_errno);
 
-                        if (af <= 0 || af >= af_max())
-                                continue;
+        if (c->syscall_whitelist) {
+                default_action = negative_action;
+                action = SCMP_ACT_ALLOW;
+        } else {
+                default_action = SCMP_ACT_ALLOW;
+                action = negative_action;
+        }
 
-                        if (first == 0 || af < first)
-                                first = af;
+        return seccomp_load_syscall_filter_set_raw(default_action, c->syscall_filter, action);
+}
 
-                        if (last == 0 || af > last)
-                                last = af;
-                }
+static int apply_syscall_archs(const Unit *u, const ExecContext *c) {
+        assert(u);
+        assert(c);
 
-                assert((first == 0) == (last == 0));
+        if (set_isempty(c->syscall_archs))
+                return 0;
 
-                if (first == 0) {
+        if (skip_seccomp_unavailable(u, "SystemCallArchitectures="))
+                return 0;
 
-                        /* No entries in the valid range, block everything */
-                        r = seccomp_rule_add(
-                                        seccomp,
-                                        SCMP_ACT_ERRNO(EPROTONOSUPPORT),
-                                        SCMP_SYS(socket),
-                                        0);
-                        if (r < 0)
-                                goto finish;
+        return seccomp_restrict_archs(c->syscall_archs);
+}
 
-                } else {
+static int apply_address_families(const Unit* u, const ExecContext *c) {
+        assert(u);
+        assert(c);
 
-                        /* Block everything below the first entry */
-                        r = seccomp_rule_add(
-                                        seccomp,
-                                        SCMP_ACT_ERRNO(EPROTONOSUPPORT),
-                                        SCMP_SYS(socket),
-                                        1,
-                                        SCMP_A0(SCMP_CMP_LT, first));
-                        if (r < 0)
-                                goto finish;
-
-                        /* Block everything above the last entry */
-                        r = seccomp_rule_add(
-                                        seccomp,
-                                        SCMP_ACT_ERRNO(EPROTONOSUPPORT),
-                                        SCMP_SYS(socket),
-                                        1,
-                                        SCMP_A0(SCMP_CMP_GT, last));
-                        if (r < 0)
-                                goto finish;
+        if (!context_has_address_families(c))
+                return 0;
 
-                        /* Block everything between the first and last
-                         * entry */
-                        for (af = 1; af < af_max(); af++) {
+        if (skip_seccomp_unavailable(u, "RestrictAddressFamilies="))
+                return 0;
 
-                                if (set_contains(c->address_families, INT_TO_PTR(af)))
-                                        continue;
+        return seccomp_restrict_address_families(c->address_families, c->address_families_whitelist);
+}
 
-                                r = seccomp_rule_add(
-                                                seccomp,
-                                                SCMP_ACT_ERRNO(EPROTONOSUPPORT),
-                                                SCMP_SYS(socket),
-                                                1,
-                                                SCMP_A0(SCMP_CMP_EQ, af));
-                                if (r < 0)
-                                        goto finish;
-                        }
-                }
+static int apply_memory_deny_write_execute(const Unit* u, const ExecContext *c) {
+        assert(u);
+        assert(c);
 
-        } else {
-                void *af;
+        if (!c->memory_deny_write_execute)
+                return 0;
 
-                /* If this is a blacklist, then generate one rule for
-                 * each address family that are then combined in OR
-                 * checks. */
+        if (skip_seccomp_unavailable(u, "MemoryDenyWriteExecute="))
+                return 0;
 
-                SET_FOREACH(af, c->address_families, i) {
+        return seccomp_memory_deny_write_execute();
+}
 
-                        r = seccomp_rule_add(
-                                        seccomp,
-                                        SCMP_ACT_ERRNO(EPROTONOSUPPORT),
-                                        SCMP_SYS(socket),
-                                        1,
-                                        SCMP_A0(SCMP_CMP_EQ, PTR_TO_INT(af)));
-                        if (r < 0)
-                                goto finish;
-                }
-        }
+static int apply_restrict_realtime(const Unit* u, const ExecContext *c) {
+        assert(u);
+        assert(c);
 
-        r = seccomp_attr_set(seccomp, SCMP_FLTATR_CTL_NNP, 0);
-        if (r < 0)
-                goto finish;
+        if (!c->restrict_realtime)
+                return 0;
 
-        r = seccomp_load(seccomp);
+        if (skip_seccomp_unavailable(u, "RestrictRealtime="))
+                return 0;
 
-finish:
-        seccomp_release(seccomp);
-        return r;
+        return seccomp_restrict_realtime();
 }
 
-static int apply_memory_deny_write_execute(const ExecContext *c) {
-        scmp_filter_ctx *seccomp;
-        int r;
-
+static int apply_protect_sysctl(const Unit *u, const ExecContext *c) {
+        assert(u);
         assert(c);
 
-        seccomp = seccomp_init(SCMP_ACT_ALLOW);
-        if (!seccomp)
-                return -ENOMEM;
-
-        r = seccomp_rule_add(
-                        seccomp,
-                        SCMP_ACT_ERRNO(EPERM),
-                        SCMP_SYS(mmap),
-                        1,
-                        SCMP_A2(SCMP_CMP_MASKED_EQ, PROT_EXEC|PROT_WRITE, PROT_EXEC|PROT_WRITE));
-        if (r < 0)
-                goto finish;
-
-        r = seccomp_rule_add(
-                        seccomp,
-                        SCMP_ACT_ERRNO(EPERM),
-                        SCMP_SYS(mprotect),
-                        1,
-                        SCMP_A2(SCMP_CMP_MASKED_EQ, PROT_EXEC, PROT_EXEC));
-        if (r < 0)
-                goto finish;
+        /* Turn off the legacy sysctl() system call. Many distributions turn this off while building the kernel, but
+         * let's protect even those systems where this is left on in the kernel. */
 
-        r = seccomp_attr_set(seccomp, SCMP_FLTATR_CTL_NNP, 0);
-        if (r < 0)
-                goto finish;
+        if (!c->protect_kernel_tunables)
+                return 0;
 
-        r = seccomp_load(seccomp);
+        if (skip_seccomp_unavailable(u, "ProtectKernelTunables="))
+                return 0;
 
-finish:
-        seccomp_release(seccomp);
-        return r;
+        return seccomp_protect_sysctl();
 }
 
-static int apply_restrict_realtime(const ExecContext *c) {
-        static const int permitted_policies[] = {
-                SCHED_OTHER,
-                SCHED_BATCH,
-                SCHED_IDLE,
-        };
+static int apply_protect_kernel_modules(const Unit *u, const ExecContext *c) {
+        assert(u);
+        assert(c);
 
-        scmp_filter_ctx *seccomp;
-        unsigned i;
-        int r, p, max_policy = 0;
+        /* Turn off module syscalls on ProtectKernelModules=yes */
 
-        assert(c);
+        if (!c->protect_kernel_modules)
+                return 0;
 
-        seccomp = seccomp_init(SCMP_ACT_ALLOW);
-        if (!seccomp)
-                return -ENOMEM;
+        if (skip_seccomp_unavailable(u, "ProtectKernelModules="))
+                return 0;
 
-        /* Determine the highest policy constant we want to allow */
-        for (i = 0; i < ELEMENTSOF(permitted_policies); i++)
-                if (permitted_policies[i] > max_policy)
-                        max_policy = permitted_policies[i];
+        return seccomp_load_syscall_filter_set(SCMP_ACT_ALLOW, syscall_filter_sets + SYSCALL_FILTER_SET_MODULE, SCMP_ACT_ERRNO(EPERM));
+}
 
-        /* Go through all policies with lower values than that, and block them -- unless they appear in the
-         * whitelist. */
-        for (p = 0; p < max_policy; p++) {
-                bool good = false;
+static int apply_private_devices(const Unit *u, const ExecContext *c) {
+        assert(u);
+        assert(c);
 
-                /* Check if this is in the whitelist. */
-                for (i = 0; i < ELEMENTSOF(permitted_policies); i++)
-                        if (permitted_policies[i] == p) {
-                                good = true;
-                                break;
-                        }
+        /* If PrivateDevices= is set, also turn off iopl and all @raw-io syscalls. */
 
-                if (good)
-                        continue;
+        if (!c->private_devices)
+                return 0;
 
-                /* Deny this policy */
-                r = seccomp_rule_add(
-                                seccomp,
-                                SCMP_ACT_ERRNO(EPERM),
-                                SCMP_SYS(sched_setscheduler),
-                                1,
-                                SCMP_A1(SCMP_CMP_EQ, p));
-                if (r < 0)
-                        goto finish;
-        }
+        if (skip_seccomp_unavailable(u, "PrivateDevices="))
+                return 0;
 
-        /* Blacklist all other policies, i.e. the ones with higher values. Note that all comparisons are unsigned here,
-         * hence no need no check for < 0 values. */
-        r = seccomp_rule_add(
-                        seccomp,
-                        SCMP_ACT_ERRNO(EPERM),
-                        SCMP_SYS(sched_setscheduler),
-                        1,
-                        SCMP_A1(SCMP_CMP_GT, max_policy));
-        if (r < 0)
-                goto finish;
+        return seccomp_load_syscall_filter_set(SCMP_ACT_ALLOW, syscall_filter_sets + SYSCALL_FILTER_SET_RAW_IO, SCMP_ACT_ERRNO(EPERM));
+}
 
-        r = seccomp_attr_set(seccomp, SCMP_FLTATR_CTL_NNP, 0);
-        if (r < 0)
-                goto finish;
+static int apply_restrict_namespaces(Unit *u, const ExecContext *c) {
+        assert(u);
+        assert(c);
+
+        if (!exec_context_restrict_namespaces_set(c))
+                return 0;
 
-        r = seccomp_load(seccomp);
+        if (skip_seccomp_unavailable(u, "RestrictNamespaces="))
+                return 0;
 
-finish:
-        seccomp_release(seccomp);
-        return r;
+        return seccomp_restrict_namespaces(c->restrict_namespaces);
 }
 
 #endif
@@ -1360,7 +1475,6 @@ finish:
 static void do_idle_pipe_dance(int idle_pipe[4]) {
         assert(idle_pipe);
 
-
         idle_pipe[1] = safe_close(idle_pipe[1]);
         idle_pipe[2] = safe_close(idle_pipe[2]);
 
@@ -1387,6 +1501,7 @@ static void do_idle_pipe_dance(int idle_pipe[4]) {
 }
 
 static int build_environment(
+                Unit *u,
                 const ExecContext *c,
                 const ExecParameters *p,
                 unsigned n_fds,
@@ -1401,10 +1516,11 @@ static int build_environment(
         unsigned n_env = 0;
         char *x;
 
+        assert(u);
         assert(c);
         assert(ret);
 
-        our_env = new0(char*, 12);
+        our_env = new0(char*, 14);
         if (!our_env)
                 return -ENOMEM;
 
@@ -1423,13 +1539,13 @@ static int build_environment(
                 if (!joined)
                         return -ENOMEM;
 
-                x = strjoin("LISTEN_FDNAMES=", joined, NULL);
+                x = strjoin("LISTEN_FDNAMES=", joined);
                 if (!x)
                         return -ENOMEM;
                 our_env[n_env++] = x;
         }
 
-        if (p->watchdog_usec > 0) {
+        if ((p->flags & EXEC_SET_WATCHDOG) && p->watchdog_usec > 0) {
                 if (asprintf(&x, "WATCHDOG_PID="PID_FMT, getpid()) < 0)
                         return -ENOMEM;
                 our_env[n_env++] = x;
@@ -1439,6 +1555,16 @@ static int build_environment(
                 our_env[n_env++] = x;
         }
 
+        /* If this is D-Bus, tell the nss-systemd module, since it relies on being able to use D-Bus look up dynamic
+         * users via PID 1, possibly dead-locking the dbus daemon. This way it will not use D-Bus to resolve names, but
+         * check the database directly. */
+        if (unit_has_name(u, SPECIAL_DBUS_SERVICE)) {
+                x = strdup("SYSTEMD_NSS_BYPASS_BUS=1");
+                if (!x)
+                        return -ENOMEM;
+                our_env[n_env++] = x;
+        }
+
         if (home) {
                 x = strappend("HOME=", home);
                 if (!x)
@@ -1465,12 +1591,28 @@ static int build_environment(
                 our_env[n_env++] = x;
         }
 
-        if (is_terminal_input(c->std_input) ||
-            c->std_output == EXEC_OUTPUT_TTY ||
-            c->std_error == EXEC_OUTPUT_TTY ||
-            c->tty_path) {
+        if (!sd_id128_is_null(u->invocation_id)) {
+                if (asprintf(&x, "INVOCATION_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(u->invocation_id)) < 0)
+                        return -ENOMEM;
+
+                our_env[n_env++] = x;
+        }
+
+        if (exec_context_needs_term(c)) {
+                const char *tty_path, *term = NULL;
+
+                tty_path = exec_context_tty_path(c);
+
+                /* If we are forked off PID 1 and we are supposed to operate on /dev/console, then let's try to inherit
+                 * the $TERM set for PID 1. This is useful for containers so that the $TERM the container manager
+                 * passes to PID 1 ends up all the way in the console login shown. */
+
+                if (path_equal(tty_path, "/dev/console") && getppid() == 1)
+                        term = getenv("TERM");
+                if (!term)
+                        term = default_term_for_tty(tty_path);
 
-                x = strdup(default_term_for_tty(exec_context_tty_path(c)));
+                x = strappend("TERM=", term);
                 if (!x)
                         return -ENOMEM;
                 our_env[n_env++] = x;
@@ -1504,7 +1646,7 @@ static int build_pass_environment(const ExecContext *c, char ***ret) {
                 v = getenv(*i);
                 if (!v)
                         continue;
-                x = strjoin(*i, "=", v, NULL);
+                x = strjoin(*i, "=", v);
                 if (!x)
                         return -ENOMEM;
                 if (!GREEDY_REALLOC(pass_env, n_bufsize, n_env + 2))
@@ -1528,11 +1670,17 @@ static bool exec_needs_mount_namespace(
         assert(context);
         assert(params);
 
+        if (context->root_image)
+                return true;
+
         if (!strv_isempty(context->read_write_paths) ||
             !strv_isempty(context->read_only_paths) ||
             !strv_isempty(context->inaccessible_paths))
                 return true;
 
+        if (context->n_bind_mounts > 0)
+                return true;
+
         if (context->mount_flags != 0)
                 return true;
 
@@ -1541,20 +1689,483 @@ static bool exec_needs_mount_namespace(
 
         if (context->private_devices ||
             context->protect_system != PROTECT_SYSTEM_NO ||
-            context->protect_home != PROTECT_HOME_NO)
+            context->protect_home != PROTECT_HOME_NO ||
+            context->protect_kernel_tunables ||
+            context->protect_kernel_modules ||
+            context->protect_control_groups)
+                return true;
+
+        if (context->mount_apivfs && (context->root_image || context->root_directory))
                 return true;
 
         return false;
 }
 
+static int setup_private_users(uid_t uid, gid_t gid) {
+        _cleanup_free_ char *uid_map = NULL, *gid_map = NULL;
+        _cleanup_close_pair_ int errno_pipe[2] = { -1, -1 };
+        _cleanup_close_ int unshare_ready_fd = -1;
+        _cleanup_(sigkill_waitp) pid_t pid = 0;
+        uint64_t c = 1;
+        siginfo_t si;
+        ssize_t n;
+        int r;
+
+        /* Set up a user namespace and map root to root, the selected UID/GID to itself, and everything else to
+         * nobody. In order to be able to write this mapping we need CAP_SETUID in the original user namespace, which
+         * we however lack after opening the user namespace. To work around this we fork() a temporary child process,
+         * which waits for the parent to create the new user namespace while staying in the original namespace. The
+         * child then writes the UID mapping, under full privileges. The parent waits for the child to finish and
+         * continues execution normally. */
+
+        if (uid != 0 && uid_is_valid(uid)) {
+                r = asprintf(&uid_map,
+                             "0 0 1\n"                      /* Map root → root */
+                             UID_FMT " " UID_FMT " 1\n",    /* Map $UID → $UID */
+                             uid, uid);
+                if (r < 0)
+                        return -ENOMEM;
+        } else {
+                uid_map = strdup("0 0 1\n");            /* The case where the above is the same */
+                if (!uid_map)
+                        return -ENOMEM;
+        }
+
+        if (gid != 0 && gid_is_valid(gid)) {
+                r = asprintf(&gid_map,
+                             "0 0 1\n"                      /* Map root → root */
+                             GID_FMT " " GID_FMT " 1\n",    /* Map $GID → $GID */
+                             gid, gid);
+                if (r < 0)
+                        return -ENOMEM;
+        } else {
+                gid_map = strdup("0 0 1\n");            /* The case where the above is the same */
+                if (!gid_map)
+                        return -ENOMEM;
+        }
+
+        /* Create a communication channel so that the parent can tell the child when it finished creating the user
+         * namespace. */
+        unshare_ready_fd = eventfd(0, EFD_CLOEXEC);
+        if (unshare_ready_fd < 0)
+                return -errno;
+
+        /* Create a communication channel so that the child can tell the parent a proper error code in case it
+         * failed. */
+        if (pipe2(errno_pipe, O_CLOEXEC) < 0)
+                return -errno;
+
+        pid = fork();
+        if (pid < 0)
+                return -errno;
+
+        if (pid == 0) {
+                _cleanup_close_ int fd = -1;
+                const char *a;
+                pid_t ppid;
+
+                /* Child process, running in the original user namespace. Let's update the parent's UID/GID map from
+                 * here, after the parent opened its own user namespace. */
+
+                ppid = getppid();
+                errno_pipe[0] = safe_close(errno_pipe[0]);
+
+                /* Wait until the parent unshared the user namespace */
+                if (read(unshare_ready_fd, &c, sizeof(c)) < 0) {
+                        r = -errno;
+                        goto child_fail;
+                }
+
+                /* Disable the setgroups() system call in the child user namespace, for good. */
+                a = procfs_file_alloca(ppid, "setgroups");
+                fd = open(a, O_WRONLY|O_CLOEXEC);
+                if (fd < 0) {
+                        if (errno != ENOENT) {
+                                r = -errno;
+                                goto child_fail;
+                        }
+
+                        /* If the file is missing the kernel is too old, let's continue anyway. */
+                } else {
+                        if (write(fd, "deny\n", 5) < 0) {
+                                r = -errno;
+                                goto child_fail;
+                        }
+
+                        fd = safe_close(fd);
+                }
+
+                /* First write the GID map */
+                a = procfs_file_alloca(ppid, "gid_map");
+                fd = open(a, O_WRONLY|O_CLOEXEC);
+                if (fd < 0) {
+                        r = -errno;
+                        goto child_fail;
+                }
+                if (write(fd, gid_map, strlen(gid_map)) < 0) {
+                        r = -errno;
+                        goto child_fail;
+                }
+                fd = safe_close(fd);
+
+                /* The write the UID map */
+                a = procfs_file_alloca(ppid, "uid_map");
+                fd = open(a, O_WRONLY|O_CLOEXEC);
+                if (fd < 0) {
+                        r = -errno;
+                        goto child_fail;
+                }
+                if (write(fd, uid_map, strlen(uid_map)) < 0) {
+                        r = -errno;
+                        goto child_fail;
+                }
+
+                _exit(EXIT_SUCCESS);
+
+        child_fail:
+                (void) write(errno_pipe[1], &r, sizeof(r));
+                _exit(EXIT_FAILURE);
+        }
+
+        errno_pipe[1] = safe_close(errno_pipe[1]);
+
+        if (unshare(CLONE_NEWUSER) < 0)
+                return -errno;
+
+        /* Let the child know that the namespace is ready now */
+        if (write(unshare_ready_fd, &c, sizeof(c)) < 0)
+                return -errno;
+
+        /* Try to read an error code from the child */
+        n = read(errno_pipe[0], &r, sizeof(r));
+        if (n < 0)
+                return -errno;
+        if (n == sizeof(r)) { /* an error code was sent to us */
+                if (r < 0)
+                        return r;
+                return -EIO;
+        }
+        if (n != 0) /* on success we should have read 0 bytes */
+                return -EIO;
+
+        r = wait_for_terminate(pid, &si);
+        if (r < 0)
+                return r;
+        pid = 0;
+
+        /* If something strange happened with the child, let's consider this fatal, too */
+        if (si.si_code != CLD_EXITED || si.si_status != 0)
+                return -EIO;
+
+        return 0;
+}
+
+static int setup_runtime_directory(
+                const ExecContext *context,
+                const ExecParameters *params,
+                uid_t uid,
+                gid_t gid) {
+
+        char **rt;
+        int r;
+
+        assert(context);
+        assert(params);
+
+        STRV_FOREACH(rt, context->runtime_directory) {
+                _cleanup_free_ char *p;
+
+                p = strjoin(params->runtime_prefix, "/", *rt);
+                if (!p)
+                        return -ENOMEM;
+
+                r = mkdir_p_label(p, context->runtime_directory_mode);
+                if (r < 0)
+                        return r;
+
+                r = chmod_and_chown(p, context->runtime_directory_mode, uid, gid);
+                if (r < 0)
+                        return r;
+        }
+
+        return 0;
+}
+
+static int setup_smack(
+                const ExecContext *context,
+                const ExecCommand *command) {
+
+#ifdef HAVE_SMACK
+        int r;
+
+        assert(context);
+        assert(command);
+
+        if (!mac_smack_use())
+                return 0;
+
+        if (context->smack_process_label) {
+                r = mac_smack_apply_pid(0, context->smack_process_label);
+                if (r < 0)
+                        return r;
+        }
+#ifdef SMACK_DEFAULT_PROCESS_LABEL
+        else {
+                _cleanup_free_ char *exec_label = NULL;
+
+                r = mac_smack_read(command->path, SMACK_ATTR_EXEC, &exec_label);
+                if (r < 0 && r != -ENODATA && r != -EOPNOTSUPP)
+                        return r;
+
+                r = mac_smack_apply_pid(0, exec_label ? : SMACK_DEFAULT_PROCESS_LABEL);
+                if (r < 0)
+                        return r;
+        }
+#endif
+#endif
+
+        return 0;
+}
+
+static int compile_read_write_paths(
+                const ExecContext *context,
+                const ExecParameters *params,
+                char ***ret) {
+
+        _cleanup_strv_free_ char **l = NULL;
+        char **rt;
+
+        /* Compile the list of writable paths. This is the combination of
+         * the explicitly configured paths, plus all runtime directories. */
+
+        if (strv_isempty(context->read_write_paths) &&
+            strv_isempty(context->runtime_directory)) {
+                *ret = NULL; /* NOP if neither is set */
+                return 0;
+        }
+
+        l = strv_copy(context->read_write_paths);
+        if (!l)
+                return -ENOMEM;
+
+        STRV_FOREACH(rt, context->runtime_directory) {
+                char *s;
+
+                s = strjoin(params->runtime_prefix, "/", *rt);
+                if (!s)
+                        return -ENOMEM;
+
+                if (strv_consume(&l, s) < 0)
+                        return -ENOMEM;
+        }
+
+        *ret = l;
+        l = NULL;
+
+        return 0;
+}
+
+static int apply_mount_namespace(
+                Unit *u,
+                ExecCommand *command,
+                const ExecContext *context,
+                const ExecParameters *params,
+                ExecRuntime *runtime) {
+
+        _cleanup_strv_free_ char **rw = NULL;
+        char *tmp = NULL, *var = NULL;
+        const char *root_dir = NULL, *root_image = NULL;
+        NameSpaceInfo ns_info = {
+                .ignore_protect_paths = false,
+                .private_dev = context->private_devices,
+                .protect_control_groups = context->protect_control_groups,
+                .protect_kernel_tunables = context->protect_kernel_tunables,
+                .protect_kernel_modules = context->protect_kernel_modules,
+                .mount_apivfs = context->mount_apivfs,
+        };
+        bool apply_restrictions;
+        int r;
+
+        assert(context);
+
+        /* The runtime struct only contains the parent of the private /tmp,
+         * which is non-accessible to world users. Inside of it there's a /tmp
+         * that is sticky, and that's the one we want to use here. */
+
+        if (context->private_tmp && runtime) {
+                if (runtime->tmp_dir)
+                        tmp = strjoina(runtime->tmp_dir, "/tmp");
+                if (runtime->var_tmp_dir)
+                        var = strjoina(runtime->var_tmp_dir, "/tmp");
+        }
+
+        r = compile_read_write_paths(context, params, &rw);
+        if (r < 0)
+                return r;
+
+        if (params->flags & EXEC_APPLY_CHROOT) {
+                root_image = context->root_image;
+
+                if (!root_image)
+                        root_dir = context->root_directory;
+        }
+
+        /*
+         * If DynamicUser=no and RootDirectory= is set then lets pass a relaxed
+         * sandbox info, otherwise enforce it, don't ignore protected paths and
+         * fail if we are enable to apply the sandbox inside the mount namespace.
+         */
+        if (!context->dynamic_user && root_dir)
+                ns_info.ignore_protect_paths = true;
+
+        apply_restrictions = (params->flags & EXEC_APPLY_PERMISSIONS) && !command->privileged;
+
+        r = setup_namespace(root_dir, root_image,
+                            &ns_info, rw,
+                            apply_restrictions ? context->read_only_paths : NULL,
+                            apply_restrictions ? context->inaccessible_paths : NULL,
+                            context->bind_mounts,
+                            context->n_bind_mounts,
+                            tmp,
+                            var,
+                            apply_restrictions ? context->protect_home : PROTECT_HOME_NO,
+                            apply_restrictions ? context->protect_system : PROTECT_SYSTEM_NO,
+                            context->mount_flags,
+                            DISSECT_IMAGE_DISCARD_ON_LOOP);
+
+        /* If we couldn't set up the namespace this is probably due to a
+         * missing capability. In this case, silently proceeed. */
+        if (IN_SET(r, -EPERM, -EACCES)) {
+                log_open();
+                log_unit_debug_errno(u, r, "Failed to set up namespace, assuming containerized execution, ignoring: %m");
+                log_close();
+                r = 0;
+        }
+
+        return r;
+}
+
+static int apply_working_directory(
+                const ExecContext *context,
+                const ExecParameters *params,
+                const char *home,
+                const bool needs_mount_ns,
+                int *exit_status) {
+
+        const char *d, *wd;
+
+        assert(context);
+        assert(exit_status);
+
+        if (context->working_directory_home) {
+
+                if (!home) {
+                        *exit_status = EXIT_CHDIR;
+                        return -ENXIO;
+                }
+
+                wd = home;
+
+        } else if (context->working_directory)
+                wd = context->working_directory;
+        else
+                wd = "/";
+
+        if (params->flags & EXEC_APPLY_CHROOT) {
+                if (!needs_mount_ns && context->root_directory)
+                        if (chroot(context->root_directory) < 0) {
+                                *exit_status = EXIT_CHROOT;
+                                return -errno;
+                        }
+
+                d = wd;
+        } else
+                d = prefix_roota(context->root_directory, wd);
+
+        if (chdir(d) < 0 && !context->working_directory_missing_ok) {
+                *exit_status = EXIT_CHDIR;
+                return -errno;
+        }
+
+        return 0;
+}
+
+static int setup_keyring(Unit *u, const ExecParameters *p, uid_t uid, gid_t gid) {
+        key_serial_t keyring;
+
+        assert(u);
+        assert(p);
+
+        /* Let's set up a new per-service "session" kernel keyring for each system service. This has the benefit that
+         * each service runs with its own keyring shared among all processes of the service, but with no hook-up beyond
+         * that scope, and in particular no link to the per-UID keyring. If we don't do this the keyring will be
+         * automatically created on-demand and then linked to the per-UID keyring, by the kernel. The kernel's built-in
+         * on-demand behaviour is very appropriate for login users, but probably not so much for system services, where
+         * UIDs are not necessarily specific to a service but reused (at least in the case of UID 0). */
+
+        if (!(p->flags & EXEC_NEW_KEYRING))
+                return 0;
+
+        keyring = keyctl(KEYCTL_JOIN_SESSION_KEYRING, 0, 0, 0, 0);
+        if (keyring == -1) {
+                if (errno == ENOSYS)
+                        log_debug_errno(errno, "Kernel keyring not supported, ignoring.");
+                else if (IN_SET(errno, EACCES, EPERM))
+                        log_debug_errno(errno, "Kernel keyring access prohibited, ignoring.");
+                else if (errno == EDQUOT)
+                        log_debug_errno(errno, "Out of kernel keyrings to allocate, ignoring.");
+                else
+                        return log_error_errno(errno, "Setting up kernel keyring failed: %m");
+
+                return 0;
+        }
+
+        /* Populate they keyring with the invocation ID by default. */
+        if (!sd_id128_is_null(u->invocation_id)) {
+                key_serial_t key;
+
+                key = add_key("user", "invocation_id", &u->invocation_id, sizeof(u->invocation_id), KEY_SPEC_SESSION_KEYRING);
+                if (key == -1)
+                        log_debug_errno(errno, "Failed to add invocation ID to keyring, ignoring: %m");
+                else {
+                        if (keyctl(KEYCTL_SETPERM, key,
+                                   KEY_POS_VIEW|KEY_POS_READ|KEY_POS_SEARCH|
+                                   KEY_USR_VIEW|KEY_USR_READ|KEY_USR_SEARCH, 0, 0) < 0)
+                                return log_error_errno(errno, "Failed to restrict invocation ID permission: %m");
+                }
+        }
+
+        /* And now, make the keyring owned by the service's user */
+        if (uid_is_valid(uid) || gid_is_valid(gid))
+                if (keyctl(KEYCTL_CHOWN, keyring, uid, gid, 0) < 0)
+                        return log_error_errno(errno, "Failed to change ownership of session keyring: %m");
+
+        return 0;
+}
+
+static void append_socket_pair(int *array, unsigned *n, int pair[2]) {
+        assert(array);
+        assert(n);
+
+        if (!pair)
+                return;
+
+        if (pair[0] >= 0)
+                array[(*n)++] = pair[0];
+        if (pair[1] >= 0)
+                array[(*n)++] = pair[1];
+}
+
 static int close_remaining_fds(
                 const ExecParameters *params,
                 ExecRuntime *runtime,
+                DynamicCreds *dcreds,
+                int user_lookup_fd,
                 int socket_fd,
                 int *fds, unsigned n_fds) {
 
         unsigned n_dont_close = 0;
-        int dont_close[n_fds + 7];
+        int dont_close[n_fds + 12];
 
         assert(params);
 
@@ -1572,14 +2183,77 @@ static int close_remaining_fds(
                 n_dont_close += n_fds;
         }
 
-        if (runtime) {
-                if (runtime->netns_storage_socket[0] >= 0)
-                        dont_close[n_dont_close++] = runtime->netns_storage_socket[0];
-                if (runtime->netns_storage_socket[1] >= 0)
-                        dont_close[n_dont_close++] = runtime->netns_storage_socket[1];
+        if (runtime)
+                append_socket_pair(dont_close, &n_dont_close, runtime->netns_storage_socket);
+
+        if (dcreds) {
+                if (dcreds->user)
+                        append_socket_pair(dont_close, &n_dont_close, dcreds->user->storage_socket);
+                if (dcreds->group)
+                        append_socket_pair(dont_close, &n_dont_close, dcreds->group->storage_socket);
         }
 
-        return close_all_fds(dont_close, n_dont_close);
+        if (user_lookup_fd >= 0)
+                dont_close[n_dont_close++] = user_lookup_fd;
+
+        return close_all_fds(dont_close, n_dont_close);
+}
+
+static int send_user_lookup(
+                Unit *unit,
+                int user_lookup_fd,
+                uid_t uid,
+                gid_t gid) {
+
+        assert(unit);
+
+        /* Send the resolved UID/GID to PID 1 after we learnt it. We send a single datagram, containing the UID/GID
+         * data as well as the unit name. Note that we suppress sending this if no user/group to resolve was
+         * specified. */
+
+        if (user_lookup_fd < 0)
+                return 0;
+
+        if (!uid_is_valid(uid) && !gid_is_valid(gid))
+                return 0;
+
+        if (writev(user_lookup_fd,
+               (struct iovec[]) {
+                           { .iov_base = &uid, .iov_len = sizeof(uid) },
+                           { .iov_base = &gid, .iov_len = sizeof(gid) },
+                           { .iov_base = unit->id, .iov_len = strlen(unit->id) }}, 3) < 0)
+                return -errno;
+
+        return 0;
+}
+
+static int acquire_home(const ExecContext *c, uid_t uid, const char** home, char **buf) {
+        int r;
+
+        assert(c);
+        assert(home);
+        assert(buf);
+
+        /* If WorkingDirectory=~ is set, try to acquire a usable home directory. */
+
+        if (*home)
+                return 0;
+
+        if (!c->working_directory_home)
+                return 0;
+
+        if (uid == 0) {
+                /* Hardcode /root as home directory for UID 0 */
+                *home = "/root";
+                return 1;
+        }
+
+        r = get_home_dir(buf);
+        if (r < 0)
+                return r;
+
+        *home = *buf;
+        return 1;
 }
 
 static int exec_child(
@@ -1588,27 +2262,39 @@ static int exec_child(
                 const ExecContext *context,
                 const ExecParameters *params,
                 ExecRuntime *runtime,
+                DynamicCreds *dcreds,
                 char **argv,
                 int socket_fd,
-                int *fds, unsigned n_fds,
+                int named_iofds[3],
+                int *fds,
+                unsigned n_storage_fds,
+                unsigned n_socket_fds,
                 char **files_env,
-                int *exit_status) {
+                int user_lookup_fd,
+                int *exit_status,
+                char **error_message) {
 
         _cleanup_strv_free_ char **our_env = NULL, **pass_env = NULL, **accum_env = NULL, **final_argv = NULL;
-        _cleanup_free_ char *mac_selinux_context_net = NULL;
-        const char *username = NULL, *home = NULL, *shell = NULL, *wd;
+        _cleanup_free_ char *mac_selinux_context_net = NULL, *home_buffer = NULL;
+        _cleanup_free_ gid_t *supplementary_gids = NULL;
+        const char *username = NULL, *groupname = NULL;
+        const char *home = NULL, *shell = NULL;
         dev_t journal_stream_dev = 0;
         ino_t journal_stream_ino = 0;
         bool needs_mount_namespace;
         uid_t uid = UID_INVALID;
         gid_t gid = GID_INVALID;
-        int i, r;
+        int i, r, ngids = 0;
+        unsigned n_fds;
 
         assert(unit);
         assert(command);
         assert(context);
         assert(params);
         assert(exit_status);
+        assert(error_message);
+        /* We don't always set error_message, hence it must be initialized */
+        assert(*error_message == NULL);
 
         rename_process_from_path(command->path);
 
@@ -1626,6 +2312,8 @@ static int exec_child(
         r = reset_signal_mask();
         if (r < 0) {
                 *exit_status = EXIT_SIGNAL_MASK;
+                *error_message = strdup("Failed to reset signal mask");
+                /* If strdup fails, here and below, we will just print the generic error message. */
                 return r;
         }
 
@@ -1638,9 +2326,11 @@ static int exec_child(
 
         log_forget_fds();
 
-        r = close_remaining_fds(params, runtime, socket_fd, fds, n_fds);
+        n_fds = n_storage_fds + n_socket_fds;
+        r = close_remaining_fds(params, runtime, dcreds, user_lookup_fd, socket_fd, fds, n_fds);
         if (r < 0) {
                 *exit_status = EXIT_FDS;
+                *error_message = strdup("Failed to close remaining fds");
                 return r;
         }
 
@@ -1652,65 +2342,124 @@ static int exec_child(
 
         exec_context_tty_reset(context, params);
 
-        if (params->confirm_spawn) {
-                char response;
+        if (unit_shall_confirm_spawn(unit)) {
+                const char *vc = params->confirm_spawn;
+                _cleanup_free_ char *cmdline = NULL;
+
+                cmdline = exec_command_line(argv);
+                if (!cmdline) {
+                        *exit_status = EXIT_CONFIRM;
+                        return -ENOMEM;
+                }
 
-                r = ask_for_confirmation(&response, argv);
-                if (r == -ETIMEDOUT)
-                        write_confirm_message("Confirmation question timed out, assuming positive response.\n");
-                else if (r < 0)
-                        write_confirm_message("Couldn't ask confirmation question, assuming positive response: %s\n", strerror(-r));
-                else if (response == 's') {
-                        write_confirm_message("Skipping execution.\n");
+                r = ask_for_confirmation(vc, unit, cmdline);
+                if (r != CONFIRM_EXECUTE) {
+                        if (r == CONFIRM_PRETEND_SUCCESS) {
+                                *exit_status = EXIT_SUCCESS;
+                                return 0;
+                        }
                         *exit_status = EXIT_CONFIRM;
+                        *error_message = strdup("Execution cancelled");
                         return -ECANCELED;
-                } else if (response == 'n') {
-                        write_confirm_message("Failing execution.\n");
-                        *exit_status = 0;
-                        return 0;
                 }
         }
 
-        if (context->user) {
-                username = context->user;
-                r = get_user_creds(&username, &uid, &gid, &home, &shell);
+        if (context->dynamic_user && dcreds) {
+
+                /* Make sure we bypass our own NSS module for any NSS checks */
+                if (putenv((char*) "SYSTEMD_NSS_DYNAMIC_BYPASS=1") != 0) {
+                        *exit_status = EXIT_USER;
+                        *error_message = strdup("Failed to update environment");
+                        return -errno;
+                }
+
+                r = dynamic_creds_realize(dcreds, &uid, &gid);
                 if (r < 0) {
                         *exit_status = EXIT_USER;
+                        *error_message = strdup("Failed to update dynamic user credentials");
                         return r;
                 }
-        }
 
-        if (context->group) {
-                const char *g = context->group;
+                if (!uid_is_valid(uid)) {
+                        *exit_status = EXIT_USER;
+                        (void) asprintf(error_message, "UID validation failed for \""UID_FMT"\"", uid);
+                        /* If asprintf fails, here and below, we will just print the generic error message. */
+                        return -ESRCH;
+                }
+
+                if (!gid_is_valid(gid)) {
+                        *exit_status = EXIT_USER;
+                        (void) asprintf(error_message, "GID validation failed for \""GID_FMT"\"", gid);
+                        return -ESRCH;
+                }
+
+                if (dcreds->user)
+                        username = dcreds->user->name;
+
+        } else {
+                r = get_fixed_user(context, &username, &uid, &gid, &home, &shell);
+                if (r < 0) {
+                        *exit_status = EXIT_USER;
+                        *error_message = strdup("Failed to determine user credentials");
+                        return r;
+                }
 
-                r = get_group_creds(&g, &gid);
+                r = get_fixed_group(context, &groupname, &gid);
                 if (r < 0) {
                         *exit_status = EXIT_GROUP;
+                        *error_message = strdup("Failed to determine group credentials");
                         return r;
                 }
         }
 
+        /* Initialize user supplementary groups and get SupplementaryGroups= ones */
+        r = get_supplementary_groups(context, username, groupname, gid,
+                                     &supplementary_gids, &ngids);
+        if (r < 0) {
+                *exit_status = EXIT_GROUP;
+                *error_message = strdup("Failed to determine supplementary groups");
+                return r;
+        }
+
+        r = send_user_lookup(unit, user_lookup_fd, uid, gid);
+        if (r < 0) {
+                *exit_status = EXIT_USER;
+                *error_message = strdup("Failed to send user credentials to PID1");
+                return r;
+        }
+
+        user_lookup_fd = safe_close(user_lookup_fd);
+
+        r = acquire_home(context, uid, &home, &home_buffer);
+        if (r < 0) {
+                *exit_status = EXIT_CHDIR;
+                *error_message = strdup("Failed to determine $HOME for user");
+                return r;
+        }
 
         /* If a socket is connected to STDIN/STDOUT/STDERR, we
          * must sure to drop O_NONBLOCK */
         if (socket_fd >= 0)
                 (void) fd_nonblock(socket_fd, false);
 
-        r = setup_input(context, params, socket_fd);
+        r = setup_input(context, params, socket_fd, named_iofds);
         if (r < 0) {
                 *exit_status = EXIT_STDIN;
+                *error_message = strdup("Failed to set up stdin");
                 return r;
         }
 
-        r = setup_output(unit, context, params, STDOUT_FILENO, socket_fd, basename(command->path), uid, gid, &journal_stream_dev, &journal_stream_ino);
+        r = setup_output(unit, context, params, STDOUT_FILENO, socket_fd, named_iofds, basename(command->path), uid, gid, &journal_stream_dev, &journal_stream_ino);
         if (r < 0) {
                 *exit_status = EXIT_STDOUT;
+                *error_message = strdup("Failed to set up stdout");
                 return r;
         }
 
-        r = setup_output(unit, context, params, STDERR_FILENO, socket_fd, basename(command->path), uid, gid, &journal_stream_dev, &journal_stream_ino);
+        r = setup_output(unit, context, params, STDERR_FILENO, socket_fd, named_iofds, basename(command->path), uid, gid, &journal_stream_dev, &journal_stream_ino);
         if (r < 0) {
                 *exit_status = EXIT_STDERR;
+                *error_message = strdup("Failed to set up stderr");
                 return r;
         }
 
@@ -1718,6 +2467,7 @@ static int exec_child(
                 r = cg_attach_everywhere(params->cgroup_supported, params->cgroup_path, 0, NULL, NULL);
                 if (r < 0) {
                         *exit_status = EXIT_CGROUP;
+                        (void) asprintf(error_message, "Failed to attach to cgroup %s", params->cgroup_path);
                         return r;
                 }
         }
@@ -1738,6 +2488,7 @@ static int exec_child(
                         log_close();
                 } else if (r < 0) {
                         *exit_status = EXIT_OOM_ADJUST;
+                        *error_message = strdup("Failed to write /proc/self/oom_score_adj");
                         return -errno;
                 }
         }
@@ -1789,13 +2540,14 @@ static int exec_child(
                 }
 
         if (context->utmp_id)
-                utmp_put_init_process(context->utmp_id, getpid(), getsid(0), context->tty_path,
+                utmp_put_init_process(context->utmp_id, getpid(), getsid(0),
+                                      context->tty_path,
                                       context->utmp_mode == EXEC_UTMP_INIT  ? INIT_PROCESS :
                                       context->utmp_mode == EXEC_UTMP_LOGIN ? LOGIN_PROCESS :
                                       USER_PROCESS,
-                                      username ? "root" : context->user);
+                                      username);
 
-        if (context->user && is_terminal_input(context->std_input)) {
+        if (context->user) {
                 r = chown_terminal(STDIN_FILENO, uid);
                 if (r < 0) {
                         *exit_status = EXIT_STDIN;
@@ -1822,32 +2574,15 @@ static int exec_child(
         }
 
         if (!strv_isempty(context->runtime_directory) && params->runtime_prefix) {
-                char **rt;
-
-                STRV_FOREACH(rt, context->runtime_directory) {
-                        _cleanup_free_ char *p;
-
-                        p = strjoin(params->runtime_prefix, "/", *rt, NULL);
-                        if (!p) {
-                                *exit_status = EXIT_RUNTIME_DIRECTORY;
-                                return -ENOMEM;
-                        }
-
-                        r = mkdir_p_label(p, context->runtime_directory_mode);
-                        if (r < 0) {
-                                *exit_status = EXIT_RUNTIME_DIRECTORY;
-                                return r;
-                        }
-
-                        r = chmod_and_chown(p, context->runtime_directory_mode, uid, gid);
-                        if (r < 0) {
-                                *exit_status = EXIT_RUNTIME_DIRECTORY;
-                                return r;
-                        }
+                r = setup_runtime_directory(context, params, uid, gid);
+                if (r < 0) {
+                        *exit_status = EXIT_RUNTIME_DIRECTORY;
+                        return r;
                 }
         }
 
         r = build_environment(
+                        unit,
                         context,
                         params,
                         n_fds,
@@ -1881,49 +2616,22 @@ static int exec_child(
         }
         accum_env = strv_env_clean(accum_env);
 
-        umask(context->umask);
-
-        if (params->apply_permissions && !command->privileged) {
-                r = enforce_groups(context, username, gid);
-                if (r < 0) {
-                        *exit_status = EXIT_GROUP;
-                        return r;
-                }
-#ifdef HAVE_SMACK
-                if (context->smack_process_label) {
-                        r = mac_smack_apply_pid(0, context->smack_process_label);
-                        if (r < 0) {
-                                *exit_status = EXIT_SMACK_PROCESS_LABEL;
-                                return r;
-                        }
-                }
-#ifdef SMACK_DEFAULT_PROCESS_LABEL
-                else {
-                        _cleanup_free_ char *exec_label = NULL;
+        (void) umask(context->umask);
 
-                        r = mac_smack_read(command->path, SMACK_ATTR_EXEC, &exec_label);
-                        if (r < 0 && r != -ENODATA && r != -EOPNOTSUPP) {
-                                *exit_status = EXIT_SMACK_PROCESS_LABEL;
-                                return r;
-                        }
+        r = setup_keyring(unit, params, uid, gid);
+        if (r < 0) {
+                *exit_status = EXIT_KEYRING;
+                return r;
+        }
 
-                        r = mac_smack_apply_pid(0, exec_label ? : SMACK_DEFAULT_PROCESS_LABEL);
-                        if (r < 0) {
-                                *exit_status = EXIT_SMACK_PROCESS_LABEL;
-                                return r;
-                        }
-                }
-#endif
-#endif
-#ifdef HAVE_PAM
+        if ((params->flags & EXEC_APPLY_PERMISSIONS) && !command->privileged) {
                 if (context->pam_name && username) {
-                        r = setup_pam(context->pam_name, username, uid, context->tty_path, &accum_env, fds, n_fds);
+                        r = setup_pam(context->pam_name, username, uid, gid, context->tty_path, &accum_env, fds, n_fds);
                         if (r < 0) {
                                 *exit_status = EXIT_PAM;
                                 return r;
                         }
                 }
-#endif
         }
 
         if (context->private_network && runtime && runtime->netns_storage_socket[0] >= 0) {
@@ -1935,80 +2643,35 @@ static int exec_child(
         }
 
         needs_mount_namespace = exec_needs_mount_namespace(context, params, runtime);
-
         if (needs_mount_namespace) {
-                char *tmp = NULL, *var = NULL;
-
-                /* The runtime struct only contains the parent
-                 * of the private /tmp, which is
-                 * non-accessible to world users. Inside of it
-                 * there's a /tmp that is sticky, and that's
-                 * the one we want to use here. */
-
-                if (context->private_tmp && runtime) {
-                        if (runtime->tmp_dir)
-                                tmp = strjoina(runtime->tmp_dir, "/tmp");
-                        if (runtime->var_tmp_dir)
-                                var = strjoina(runtime->var_tmp_dir, "/tmp");
-                }
-
-                r = setup_namespace(
-                                params->apply_chroot ? context->root_directory : NULL,
-                                context->read_write_paths,
-                                context->read_only_paths,
-                                context->inaccessible_paths,
-                                tmp,
-                                var,
-                                context->private_devices,
-                                context->protect_home,
-                                context->protect_system,
-                                context->mount_flags);
-
-                /* If we couldn't set up the namespace this is
-                 * probably due to a missing capability. In this case,
-                 * silently proceeed. */
-                if (r == -EPERM || r == -EACCES) {
-                        log_open();
-                        log_unit_debug_errno(unit, r, "Failed to set up namespace, assuming containerized execution, ignoring: %m");
-                        log_close();
-                } else if (r < 0) {
+                r = apply_mount_namespace(unit, command, context, params, runtime);
+                if (r < 0) {
                         *exit_status = EXIT_NAMESPACE;
                         return r;
                 }
         }
 
-        if (context->working_directory_home)
-                wd = home;
-        else if (context->working_directory)
-                wd = context->working_directory;
-        else
-                wd = "/";
-
-        if (params->apply_chroot) {
-                if (!needs_mount_namespace && context->root_directory)
-                        if (chroot(context->root_directory) < 0) {
-                                *exit_status = EXIT_CHROOT;
-                                return -errno;
-                        }
-
-                if (chdir(wd) < 0 &&
-                    !context->working_directory_missing_ok) {
-                        *exit_status = EXIT_CHDIR;
-                        return -errno;
-                }
-        } else {
-                const char *d;
+        /* Apply just after mount namespace setup */
+        r = apply_working_directory(context, params, home, needs_mount_namespace, exit_status);
+        if (r < 0)
+                return r;
 
-                d = strjoina(strempty(context->root_directory), "/", strempty(wd));
-                if (chdir(d) < 0 &&
-                    !context->working_directory_missing_ok) {
-                        *exit_status = EXIT_CHDIR;
-                        return -errno;
+        /* Drop groups as early as possbile */
+        if ((params->flags & EXEC_APPLY_PERMISSIONS) && !command->privileged) {
+                r = enforce_groups(context, gid, supplementary_gids, ngids);
+                if (r < 0) {
+                        *exit_status = EXIT_GROUP;
+                        return r;
                 }
         }
 
 #ifdef HAVE_SELINUX
-        if (params->apply_permissions && mac_selinux_use() && params->selinux_context_net && socket_fd >= 0 && !command->privileged) {
+        if ((params->flags & EXEC_APPLY_PERMISSIONS) &&
+            mac_selinux_use() &&
+            params->selinux_context_net &&
+            socket_fd >= 0 &&
+            !command->privileged) {
+
                 r = mac_selinux_get_child_mls_label(socket_fd, command->path, context->selinux_context, &mac_selinux_context_net);
                 if (r < 0) {
                         *exit_status = EXIT_SELINUX_CONTEXT;
@@ -2017,6 +2680,14 @@ static int exec_child(
         }
 #endif
 
+        if ((params->flags & EXEC_APPLY_PERMISSIONS) && context->private_users) {
+                r = setup_private_users(uid, gid);
+                if (r < 0) {
+                        *exit_status = EXIT_USER;
+                        return r;
+                }
+        }
+
         /* We repeat the fd closing here, to make sure that
          * nothing is leaked from the PAM modules. Note that
          * we are more aggressive this time since socket_fd
@@ -2027,19 +2698,14 @@ static int exec_child(
         if (r >= 0)
                 r = shift_fds(fds, n_fds);
         if (r >= 0)
-                r = flags_fds(fds, n_fds, context->non_blocking);
+                r = flags_fds(fds, n_storage_fds, n_socket_fds, context->non_blocking);
         if (r < 0) {
                 *exit_status = EXIT_FDS;
                 return r;
         }
 
-        if (params->apply_permissions && !command->privileged) {
+        if ((params->flags & EXEC_APPLY_PERMISSIONS) && !command->privileged) {
 
-                bool use_address_families = context->address_families_whitelist ||
-                        !set_isempty(context->address_families);
-                bool use_syscall_filter = context->syscall_whitelist ||
-                        !set_isempty(context->syscall_filter) ||
-                        !set_isempty(context->syscall_archs);
                 int secure_bits = context->secure_bits;
 
                 for (i = 0; i < _RLIMIT_MAX; i++) {
@@ -2066,6 +2732,7 @@ static int exec_child(
                         r = capability_bounding_set_drop(context->capability_bounding_set, false);
                         if (r < 0) {
                                 *exit_status = EXIT_CAPABILITIES;
+                                *error_message = strdup("Failed to drop capabilities");
                                 return r;
                         }
                 }
@@ -2076,6 +2743,7 @@ static int exec_child(
                         r = capability_ambient_set_apply(context->capability_ambient_set, true);
                         if (r < 0) {
                                 *exit_status = EXIT_CAPABILITIES;
+                                *error_message = strdup("Failed to apply ambient capabilities (before UID change)");
                                 return r;
                         }
 
@@ -2100,6 +2768,7 @@ static int exec_child(
                         r = enforce_user(context, uid);
                         if (r < 0) {
                                 *exit_status = EXIT_USER;
+                                (void) asprintf(error_message, "Failed to change UID to "UID_FMT, uid);
                                 return r;
                         }
                         if (context->capability_ambient_set != 0) {
@@ -2108,6 +2777,7 @@ static int exec_child(
                                 r = capability_ambient_set_apply(context->capability_ambient_set, false);
                                 if (r < 0) {
                                         *exit_status = EXIT_CAPABILITIES;
+                                        *error_message = strdup("Failed to apply ambient capabilities (after UID change)");
                                         return r;
                                 }
 
@@ -2122,6 +2792,46 @@ static int exec_child(
                         }
                 }
 
+                /* Apply the MAC contexts late, but before seccomp syscall filtering, as those should really be last to
+                 * influence our own codepaths as little as possible. Moreover, applying MAC contexts usually requires
+                 * syscalls that are subject to seccomp filtering, hence should probably be applied before the syscalls
+                 * are restricted. */
+
+#ifdef HAVE_SELINUX
+                if (mac_selinux_use()) {
+                        char *exec_context = mac_selinux_context_net ?: context->selinux_context;
+
+                        if (exec_context) {
+                                r = setexeccon(exec_context);
+                                if (r < 0) {
+                                        *exit_status = EXIT_SELINUX_CONTEXT;
+                                        (void) asprintf(error_message, "Failed to set SELinux context to %s", exec_context);
+                                        return r;
+                                }
+                        }
+                }
+#endif
+
+                r = setup_smack(context, command);
+                if (r < 0) {
+                        *exit_status = EXIT_SMACK_PROCESS_LABEL;
+                        *error_message = strdup("Failed to set SMACK process label");
+                        return r;
+                }
+
+#ifdef HAVE_APPARMOR
+                if (context->apparmor_profile && mac_apparmor_use()) {
+                        r = aa_change_onexec(context->apparmor_profile);
+                        if (r < 0 && !context->apparmor_profile_ignore) {
+                                *exit_status = EXIT_APPARMOR_PROFILE;
+                                (void) asprintf(error_message,
+                                                "Failed to prepare AppArmor profile change to %s",
+                                                context->apparmor_profile);
+                                return -errno;
+                        }
+                }
+#endif
+
                 /* PR_GET_SECUREBITS is not privileged, while
                  * PR_SET_SECUREBITS is. So to suppress
                  * potential EPERMs we'll try not to call
@@ -2129,6 +2839,7 @@ static int exec_child(
                 if (prctl(PR_GET_SECUREBITS) != secure_bits)
                         if (prctl(PR_SET_SECUREBITS, secure_bits) < 0) {
                                 *exit_status = EXIT_SECUREBITS;
+                                *error_message = strdup("Failed to set secure bits");
                                 return -errno;
                         }
 
@@ -2138,68 +2849,77 @@ static int exec_child(
                                 return -errno;
                         }
 
-                if (context->no_new_privileges ||
-                    (!have_effective_cap(CAP_SYS_ADMIN) && (use_address_families || context->memory_deny_write_execute || context->restrict_realtime || use_syscall_filter)))
+                if (context_has_no_new_privileges(context))
                         if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) {
                                 *exit_status = EXIT_NO_NEW_PRIVILEGES;
+                                *error_message = strdup("Failed to disable new privileges");
                                 return -errno;
                         }
 
 #ifdef HAVE_SECCOMP
-                if (use_address_families) {
-                        r = apply_address_families(context);
-                        if (r < 0) {
-                                *exit_status = EXIT_ADDRESS_FAMILIES;
-                                return r;
-                        }
+                r = apply_address_families(unit, context);
+                if (r < 0) {
+                        *exit_status = EXIT_ADDRESS_FAMILIES;
+                        *error_message = strdup("Failed to restrict address families");
+                        return r;
                 }
 
-                if (context->memory_deny_write_execute) {
-                        r = apply_memory_deny_write_execute(context);
-                        if (r < 0) {
-                                *exit_status = EXIT_SECCOMP;
-                                return r;
-                        }
+                r = apply_memory_deny_write_execute(unit, context);
+                if (r < 0) {
+                        *exit_status = EXIT_SECCOMP;
+                        *error_message = strdup("Failed to disable writing to executable memory");
+                        return r;
                 }
 
-                if (context->restrict_realtime) {
-                        r = apply_restrict_realtime(context);
-                        if (r < 0) {
-                                *exit_status = EXIT_SECCOMP;
-                                return r;
-                        }
+                r = apply_restrict_realtime(unit, context);
+                if (r < 0) {
+                        *exit_status = EXIT_SECCOMP;
+                        *error_message = strdup("Failed to apply realtime restrictions");
+                        return r;
                 }
 
-                if (use_syscall_filter) {
-                        r = apply_seccomp(context);
-                        if (r < 0) {
-                                *exit_status = EXIT_SECCOMP;
-                                return r;
-                        }
+                r = apply_restrict_namespaces(unit, context);
+                if (r < 0) {
+                        *exit_status = EXIT_SECCOMP;
+                        *error_message = strdup("Failed to apply namespace restrictions");
+                        return r;
                 }
-#endif
 
-#ifdef HAVE_SELINUX
-                if (mac_selinux_use()) {
-                        char *exec_context = mac_selinux_context_net ?: context->selinux_context;
+                r = apply_protect_sysctl(unit, context);
+                if (r < 0) {
+                        *exit_status = EXIT_SECCOMP;
+                        *error_message = strdup("Failed to apply sysctl restrictions");
+                        return r;
+                }
 
-                        if (exec_context) {
-                                r = setexeccon(exec_context);
-                                if (r < 0) {
-                                        *exit_status = EXIT_SELINUX_CONTEXT;
-                                        return r;
-                                }
-                        }
+                r = apply_protect_kernel_modules(unit, context);
+                if (r < 0) {
+                        *exit_status = EXIT_SECCOMP;
+                        *error_message = strdup("Failed to apply module loading restrictions");
+                        return r;
                 }
-#endif
 
-#ifdef HAVE_APPARMOR
-                if (context->apparmor_profile && mac_apparmor_use()) {
-                        r = aa_change_onexec(context->apparmor_profile);
-                        if (r < 0 && !context->apparmor_profile_ignore) {
-                                *exit_status = EXIT_APPARMOR_PROFILE;
-                                return -errno;
-                        }
+                r = apply_private_devices(unit, context);
+                if (r < 0) {
+                        *exit_status = EXIT_SECCOMP;
+                        *error_message = strdup("Failed to set up private devices");
+                        return r;
+                }
+
+                r = apply_syscall_archs(unit, context);
+                if (r < 0) {
+                        *exit_status = EXIT_SECCOMP;
+                        *error_message = strdup("Failed to apply syscall architecture restrictions");
+                        return r;
+                }
+
+                /* This really should remain the last step before the execve(), to make sure our own code is unaffected
+                 * by the filter as little as possible. */
+                r = apply_syscall_filter(unit, context);
+                if (r < 0) {
+                        *exit_status = EXIT_SECCOMP;
+                        *error_message = strdup("Failed to apply syscall filters");
+                        return r;
                 }
 #endif
         }
@@ -2207,6 +2927,7 @@ static int exec_child(
         final_argv = replace_env_argv(argv, accum_env);
         if (!final_argv) {
                 *exit_status = EXIT_MEMORY;
+                *error_message = strdup("Failed to prepare process arguments");
                 return -ENOMEM;
         }
 
@@ -2217,9 +2938,9 @@ static int exec_child(
                 if (line) {
                         log_open();
                         log_struct(LOG_DEBUG,
-                                   LOG_UNIT_ID(unit),
                                    "EXECUTABLE=%s", command->path,
                                    LOG_UNIT_MESSAGE(unit, "Executing: %s", line),
+                                   LOG_UNIT_ID(unit),
                                    NULL);
                         log_close();
                 }
@@ -2235,12 +2956,15 @@ int exec_spawn(Unit *unit,
                const ExecContext *context,
                const ExecParameters *params,
                ExecRuntime *runtime,
+               DynamicCreds *dcreds,
                pid_t *ret) {
 
         _cleanup_strv_free_ char **files_env = NULL;
-        int *fds = NULL; unsigned n_fds = 0;
+        int *fds = NULL;
+        unsigned n_storage_fds = 0, n_socket_fds = 0;
         _cleanup_free_ char *line = NULL;
         int socket_fd, r;
+        int named_iofds[3] = { -1, -1, -1 };
         char **argv;
         pid_t pid;
 
@@ -2249,24 +2973,34 @@ int exec_spawn(Unit *unit,
         assert(context);
         assert(ret);
         assert(params);
-        assert(params->fds || params->n_fds <= 0);
+        assert(params->fds || (params->n_storage_fds + params->n_socket_fds <= 0));
 
         if (context->std_input == EXEC_INPUT_SOCKET ||
             context->std_output == EXEC_OUTPUT_SOCKET ||
             context->std_error == EXEC_OUTPUT_SOCKET) {
 
-                if (params->n_fds != 1) {
+                if (params->n_socket_fds > 1) {
                         log_unit_error(unit, "Got more than one socket.");
                         return -EINVAL;
                 }
 
+                if (params->n_socket_fds == 0) {
+                        log_unit_error(unit, "Got no socket.");
+                        return -EINVAL;
+                }
+
                 socket_fd = params->fds[0];
         } else {
                 socket_fd = -1;
                 fds = params->fds;
-                n_fds = params->n_fds;
+                n_storage_fds = params->n_storage_fds;
+                n_socket_fds = params->n_socket_fds;
         }
 
+        r = exec_context_named_iofds(unit, context, params, named_iofds);
+        if (r < 0)
+                return log_unit_error_errno(unit, r, "Failed to load a named file descriptor: %m");
+
         r = exec_context_load_environment(unit, context, &files_env);
         if (r < 0)
                 return log_unit_error_errno(unit, r, "Failed to load environment files: %m");
@@ -2277,9 +3011,9 @@ int exec_spawn(Unit *unit,
                 return log_oom();
 
         log_struct(LOG_DEBUG,
-                   LOG_UNIT_ID(unit),
                    LOG_UNIT_MESSAGE(unit, "About to execute: %s", line),
                    "EXECUTABLE=%s", command->path,
+                   LOG_UNIT_ID(unit),
                    NULL);
         pid = fork();
         if (pid < 0)
@@ -2287,27 +3021,51 @@ int exec_spawn(Unit *unit,
 
         if (pid == 0) {
                 int exit_status;
+                _cleanup_free_ char *error_message = NULL;
 
                 r = exec_child(unit,
                                command,
                                context,
                                params,
                                runtime,
+                               dcreds,
                                argv,
                                socket_fd,
-                               fds, n_fds,
+                               named_iofds,
+                               fds,
+                               n_storage_fds,
+                               n_socket_fds,
                                files_env,
-                               &exit_status);
+                               unit->manager->user_lookup_fds[1],
+                               &exit_status,
+                               &error_message);
                 if (r < 0) {
                         log_open();
-                        log_struct_errno(LOG_ERR, r,
-                                         LOG_MESSAGE_ID(SD_MESSAGE_SPAWN_FAILED),
-                                         LOG_UNIT_ID(unit),
-                                         LOG_UNIT_MESSAGE(unit, "Failed at step %s spawning %s: %m",
-                                                          exit_status_to_string(exit_status, EXIT_STATUS_SYSTEMD),
-                                                          command->path),
-                                         "EXECUTABLE=%s", command->path,
-                                         NULL);
+                        if (error_message)
+                                log_struct_errno(LOG_ERR, r,
+                                                 "MESSAGE_ID=" SD_MESSAGE_SPAWN_FAILED_STR,
+                                                 LOG_UNIT_ID(unit),
+                                                 LOG_UNIT_MESSAGE(unit, "%s: %m",
+                                                                  error_message),
+                                                 "EXECUTABLE=%s", command->path,
+                                                 NULL);
+                        else if (r == -ENOENT && command->ignore)
+                                log_struct_errno(LOG_INFO, r,
+                                                 "MESSAGE_ID=" SD_MESSAGE_SPAWN_FAILED_STR,
+                                                 LOG_UNIT_ID(unit),
+                                                 LOG_UNIT_MESSAGE(unit, "Skipped spawning %s: %m",
+                                                                  command->path),
+                                                 "EXECUTABLE=%s", command->path,
+                                                 NULL);
+                        else
+                                log_struct_errno(LOG_ERR, r,
+                                                 "MESSAGE_ID=" SD_MESSAGE_SPAWN_FAILED_STR,
+                                                 LOG_UNIT_ID(unit),
+                                                 LOG_UNIT_MESSAGE(unit, "Failed at step %s spawning %s: %m",
+                                                                  exit_status_to_string(exit_status, EXIT_STATUS_SYSTEMD),
+                                                                  command->path),
+                                                 "EXECUTABLE=%s", command->path,
+                                                 NULL);
                 }
 
                 _exit(exit_status);
@@ -2342,6 +3100,7 @@ void exec_context_init(ExecContext *c) {
         c->personality = PERSONALITY_INVALID;
         c->runtime_directory_mode = 0755;
         c->capability_bounding_set = CAP_ALL;
+        c->restrict_namespaces = NAMESPACE_FLAGS_ALL;
 }
 
 void exec_context_done(ExecContext *c) {
@@ -2356,8 +3115,12 @@ void exec_context_done(ExecContext *c) {
         for (l = 0; l < ELEMENTSOF(c->rlimit); l++)
                 c->rlimit[l] = mfree(c->rlimit[l]);
 
+        for (l = 0; l < 3; l++)
+                c->stdio_fdname[l] = mfree(c->stdio_fdname[l]);
+
         c->working_directory = mfree(c->working_directory);
         c->root_directory = mfree(c->root_directory);
+        c->root_image = mfree(c->root_image);
         c->tty_path = mfree(c->tty_path);
         c->syslog_identifier = mfree(c->syslog_identifier);
         c->user = mfree(c->user);
@@ -2376,6 +3139,8 @@ void exec_context_done(ExecContext *c) {
         c->read_write_paths = strv_free(c->read_write_paths);
         c->inaccessible_paths = strv_free(c->inaccessible_paths);
 
+        bind_mount_free_many(c->bind_mounts, c->n_bind_mounts);
+
         if (c->cpuset)
                 CPU_FREE(c->cpuset);
 
@@ -2401,7 +3166,7 @@ int exec_context_destroy_runtime_directory(ExecContext *c, const char *runtime_p
         STRV_FOREACH(i, c->runtime_directory) {
                 _cleanup_free_ char *p;
 
-                p = strjoin(runtime_prefix, "/", *i, NULL);
+                p = strjoin(runtime_prefix, "/", *i);
                 if (!p)
                         return -ENOMEM;
 
@@ -2459,6 +3224,73 @@ static void invalid_env(const char *p, void *userdata) {
         log_unit_error(info->unit, "Ignoring invalid environment assignment '%s': %s", p, info->path);
 }
 
+const char* exec_context_fdname(const ExecContext *c, int fd_index) {
+        assert(c);
+
+        switch (fd_index) {
+        case STDIN_FILENO:
+                if (c->std_input != EXEC_INPUT_NAMED_FD)
+                        return NULL;
+                return c->stdio_fdname[STDIN_FILENO] ?: "stdin";
+        case STDOUT_FILENO:
+                if (c->std_output != EXEC_OUTPUT_NAMED_FD)
+                        return NULL;
+                return c->stdio_fdname[STDOUT_FILENO] ?: "stdout";
+        case STDERR_FILENO:
+                if (c->std_error != EXEC_OUTPUT_NAMED_FD)
+                        return NULL;
+                return c->stdio_fdname[STDERR_FILENO] ?: "stderr";
+        default:
+                return NULL;
+        }
+}
+
+int exec_context_named_iofds(Unit *unit, const ExecContext *c, const ExecParameters *p, int named_iofds[3]) {
+        unsigned i, targets;
+        const char* stdio_fdname[3];
+        unsigned n_fds;
+
+        assert(c);
+        assert(p);
+
+        targets = (c->std_input == EXEC_INPUT_NAMED_FD) +
+                  (c->std_output == EXEC_OUTPUT_NAMED_FD) +
+                  (c->std_error == EXEC_OUTPUT_NAMED_FD);
+
+        for (i = 0; i < 3; i++)
+                stdio_fdname[i] = exec_context_fdname(c, i);
+
+        n_fds = p->n_storage_fds + p->n_socket_fds;
+
+        for (i = 0; i < n_fds  && targets > 0; i++)
+                if (named_iofds[STDIN_FILENO] < 0 &&
+                    c->std_input == EXEC_INPUT_NAMED_FD &&
+                    stdio_fdname[STDIN_FILENO] &&
+                    streq(p->fd_names[i], stdio_fdname[STDIN_FILENO])) {
+
+                        named_iofds[STDIN_FILENO] = p->fds[i];
+                        targets--;
+
+                } else if (named_iofds[STDOUT_FILENO] < 0 &&
+                           c->std_output == EXEC_OUTPUT_NAMED_FD &&
+                           stdio_fdname[STDOUT_FILENO] &&
+                           streq(p->fd_names[i], stdio_fdname[STDOUT_FILENO])) {
+
+                        named_iofds[STDOUT_FILENO] = p->fds[i];
+                        targets--;
+
+                } else if (named_iofds[STDERR_FILENO] < 0 &&
+                           c->std_error == EXEC_OUTPUT_NAMED_FD &&
+                           stdio_fdname[STDERR_FILENO] &&
+                           streq(p->fd_names[i], stdio_fdname[STDERR_FILENO])) {
+
+                        named_iofds[STDERR_FILENO] = p->fds[i];
+                        targets--;
+                }
+
+        return targets == 0 ? 0 : -ENOENT;
+}
+
 int exec_context_load_environment(Unit *unit, const ExecContext *c, char ***l) {
         char **i, **r = NULL;
 
@@ -2468,10 +3300,10 @@ int exec_context_load_environment(Unit *unit, const ExecContext *c, char ***l) {
         STRV_FOREACH(i, c->environment_files) {
                 char *fn;
                 int k;
+                unsigned n;
                 bool ignore = false;
                 char **p;
                 _cleanup_globfree_ glob_t pglob = {};
-                int count, n;
 
                 fn = *i;
 
@@ -2489,23 +3321,19 @@ int exec_context_load_environment(Unit *unit, const ExecContext *c, char ***l) {
                 }
 
                 /* Filename supports globbing, take all matching files */
-                errno = 0;
-                if (glob(fn, 0, NULL, &pglob) != 0) {
+                k = safe_glob(fn, 0, &pglob);
+                if (k < 0) {
                         if (ignore)
                                 continue;
 
                         strv_free(r);
-                        return errno > 0 ? -errno : -EINVAL;
+                        return k;
                 }
-                count = pglob.gl_pathc;
-                if (count == 0) {
-                        if (ignore)
-                                continue;
 
-                        strv_free(r);
-                        return -EINVAL;
-                }
-                for (n = 0; n < count; n++) {
+                /* When we don't match anything, -ENOENT should be returned */
+                assert(pglob.gl_pathc > 0);
+
+                for (n = 0; n < pglob.gl_pathc; n++) {
                         k = load_env_file(NULL, pglob.gl_pathv[n], NULL, &p);
                         if (k < 0) {
                                 if (ignore)
@@ -2591,6 +3419,7 @@ static void strv_fprintf(FILE *f, char **l) {
 void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
         char **e, **d;
         unsigned i;
+        int r;
 
         assert(c);
         assert(f);
@@ -2603,10 +3432,15 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
                 "%sRootDirectory: %s\n"
                 "%sNonBlocking: %s\n"
                 "%sPrivateTmp: %s\n"
-                "%sPrivateNetwork: %s\n"
                 "%sPrivateDevices: %s\n"
+                "%sProtectKernelTunables: %s\n"
+                "%sProtectKernelModules: %s\n"
+                "%sProtectControlGroups: %s\n"
+                "%sPrivateNetwork: %s\n"
+                "%sPrivateUsers: %s\n"
                 "%sProtectHome: %s\n"
                 "%sProtectSystem: %s\n"
+                "%sMountAPIVFS: %s\n"
                 "%sIgnoreSIGPIPE: %s\n"
                 "%sMemoryDenyWriteExecute: %s\n"
                 "%sRestrictRealtime: %s\n",
@@ -2615,14 +3449,22 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
                 prefix, c->root_directory ? c->root_directory : "/",
                 prefix, yes_no(c->non_blocking),
                 prefix, yes_no(c->private_tmp),
-                prefix, yes_no(c->private_network),
                 prefix, yes_no(c->private_devices),
+                prefix, yes_no(c->protect_kernel_tunables),
+                prefix, yes_no(c->protect_kernel_modules),
+                prefix, yes_no(c->protect_control_groups),
+                prefix, yes_no(c->private_network),
+                prefix, yes_no(c->private_users),
                 prefix, protect_home_to_string(c->protect_home),
                 prefix, protect_system_to_string(c->protect_system),
+                prefix, yes_no(c->mount_apivfs),
                 prefix, yes_no(c->ignore_sigpipe),
                 prefix, yes_no(c->memory_deny_write_execute),
                 prefix, yes_no(c->restrict_realtime));
 
+        if (c->root_image)
+                fprintf(f, "%sRootImage: %s\n", prefix, c->root_image);
+
         STRV_FOREACH(e, c->environment)
                 fprintf(f, "%sEnvironment: %s\n", prefix, *e);
 
@@ -2779,6 +3621,8 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
         if (c->group)
                 fprintf(f, "%sGroup: %s\n", prefix, c->group);
 
+        fprintf(f, "%sDynamicUser: %s\n", prefix, yes_no(c->dynamic_user));
+
         if (strv_length(c->supplementary_groups) > 0) {
                 fprintf(f, "%sSupplementaryGroups:", prefix);
                 strv_fprintf(f, c->supplementary_groups);
@@ -2806,6 +3650,15 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
                 fputs("\n", f);
         }
 
+        if (c->n_bind_mounts > 0)
+                for (i = 0; i < c->n_bind_mounts; i++) {
+                        fprintf(f, "%s%s: %s:%s:%s\n", prefix,
+                                c->bind_mounts[i].read_only ? "BindReadOnlyPaths" : "BindPaths",
+                                c->bind_mounts[i].source,
+                                c->bind_mounts[i].destination,
+                                c->bind_mounts[i].recursive ? "rbind" : "norbind");
+                }
+
         if (c->utmp_id)
                 fprintf(f,
                         "%sUtmpIdentifier: %s\n",
@@ -2869,6 +3722,15 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
                 fputc('\n', f);
         }
 
+        if (exec_context_restrict_namespaces_set(c)) {
+                _cleanup_free_ char *s = NULL;
+
+                r = namespace_flag_to_string_many(c->restrict_namespaces, &s);
+                if (r >= 0)
+                        fprintf(f, "%sRestrictNamespaces: %s\n",
+                                prefix, s);
+        }
+
         if (c->syscall_errno > 0)
                 fprintf(f,
                         "%sSystemCallErrorNumber: %s\n",
@@ -2895,6 +3757,21 @@ bool exec_context_maintains_privileges(ExecContext *c) {
         return false;
 }
 
+int exec_context_get_effective_ioprio(ExecContext *c) {
+        int p;
+
+        assert(c);
+
+        if (c->ioprio_set)
+                return c->ioprio;
+
+        p = ioprio_get(IOPRIO_WHO_PROCESS, 0);
+        if (p < 0)
+                return IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 4);
+
+        return p;
+}
+
 void exec_status_start(ExecStatus *s, pid_t pid) {
         assert(s);
 
@@ -2938,12 +3815,12 @@ void exec_status_dump(ExecStatus *s, FILE *f, const char *prefix) {
                 "%sPID: "PID_FMT"\n",
                 prefix, s->pid);
 
-        if (s->start_timestamp.realtime > 0)
+        if (dual_timestamp_is_set(&s->start_timestamp))
                 fprintf(f,
                         "%sStart Timestamp: %s\n",
                         prefix, format_timestamp(buf, sizeof(buf), s->start_timestamp.realtime));
 
-        if (s->exit_timestamp.realtime > 0)
+        if (dual_timestamp_is_set(&s->exit_timestamp))
                 fprintf(f,
                         "%sExit Timestamp: %s\n"
                         "%sExit Code: %s\n"
@@ -2964,7 +3841,8 @@ char *exec_command_line(char **argv) {
         STRV_FOREACH(a, argv)
                 k += strlen(*a)+3;
 
-        if (!(n = new(char, k)))
+        n = new(char, k);
+        if (!n)
                 return NULL;
 
         p = n;
@@ -3153,9 +4031,7 @@ ExecRuntime *exec_runtime_unref(ExecRuntime *r) {
         free(r->tmp_dir);
         free(r->var_tmp_dir);
         safe_close_pair(r->netns_storage_socket);
-        free(r);
-
-        return NULL;
+        return mfree(r);
 }
 
 int exec_runtime_serialize(Unit *u, ExecRuntime *rt, FILE *f, FDSet *fds) {
@@ -3311,7 +4187,8 @@ static const char* const exec_input_table[_EXEC_INPUT_MAX] = {
         [EXEC_INPUT_TTY] = "tty",
         [EXEC_INPUT_TTY_FORCE] = "tty-force",
         [EXEC_INPUT_TTY_FAIL] = "tty-fail",
-        [EXEC_INPUT_SOCKET] = "socket"
+        [EXEC_INPUT_SOCKET] = "socket",
+        [EXEC_INPUT_NAMED_FD] = "fd",
 };
 
 DEFINE_STRING_TABLE_LOOKUP(exec_input, ExecInput);
@@ -3326,7 +4203,8 @@ static const char* const exec_output_table[_EXEC_OUTPUT_MAX] = {
         [EXEC_OUTPUT_KMSG_AND_CONSOLE] = "kmsg+console",
         [EXEC_OUTPUT_JOURNAL] = "journal",
         [EXEC_OUTPUT_JOURNAL_AND_CONSOLE] = "journal+console",
-        [EXEC_OUTPUT_SOCKET] = "socket"
+        [EXEC_OUTPUT_SOCKET] = "socket",
+        [EXEC_OUTPUT_NAMED_FD] = "fd",
 };
 
 DEFINE_STRING_TABLE_LOOKUP(exec_output, ExecOutput);
index 04cc4d6..2751b1d 100644 (file)
@@ -35,6 +35,7 @@ typedef struct ExecParameters ExecParameters;
 #include "list.h"
 #include "missing.h"
 #include "namespace.h"
+#include "nsflags.h"
 
 typedef enum ExecUtmpMode {
         EXEC_UTMP_INIT,
@@ -50,6 +51,7 @@ typedef enum ExecInput {
         EXEC_INPUT_TTY_FORCE,
         EXEC_INPUT_TTY_FAIL,
         EXEC_INPUT_SOCKET,
+        EXEC_INPUT_NAMED_FD,
         _EXEC_INPUT_MAX,
         _EXEC_INPUT_INVALID = -1
 } ExecInput;
@@ -65,6 +67,7 @@ typedef enum ExecOutput {
         EXEC_OUTPUT_JOURNAL,
         EXEC_OUTPUT_JOURNAL_AND_CONSOLE,
         EXEC_OUTPUT_SOCKET,
+        EXEC_OUTPUT_NAMED_FD,
         _EXEC_OUTPUT_MAX,
         _EXEC_OUTPUT_INVALID = -1
 } ExecOutput;
@@ -92,6 +95,8 @@ struct ExecRuntime {
         char *tmp_dir;
         char *var_tmp_dir;
 
+        /* An AF_UNIX socket pair, that contains a datagram containing a file descriptor referring to the network
+         * namespace. */
         int netns_storage_socket[2];
 };
 
@@ -101,7 +106,7 @@ struct ExecContext {
         char **pass_environment;
 
         struct rlimit *rlimit[_RLIMIT_MAX];
-        char *working_directory, *root_directory;
+        char *working_directory, *root_directory, *root_image;
         bool working_directory_missing_ok;
         bool working_directory_home;
 
@@ -118,6 +123,7 @@ struct ExecContext {
         ExecInput std_input;
         ExecOutput std_output;
         ExecOutput std_error;
+        char *stdio_fdname[3];
 
         nsec_t timer_slack_nsec;
 
@@ -155,6 +161,8 @@ struct ExecContext {
 
         char **read_write_paths, **read_only_paths, **inaccessible_paths;
         unsigned long mount_flags;
+        BindMount *bind_mounts;
+        unsigned n_bind_mounts;
 
         uint64_t capability_bounding_set;
         uint64_t capability_ambient_set;
@@ -171,11 +179,19 @@ struct ExecContext {
         bool private_tmp;
         bool private_network;
         bool private_devices;
+        bool private_users;
         ProtectSystem protect_system;
         ProtectHome protect_home;
+        bool protect_kernel_tunables;
+        bool protect_kernel_modules;
+        bool protect_control_groups;
+        bool mount_apivfs;
 
         bool no_new_privileges;
 
+        bool dynamic_user;
+        bool remove_ipc;
+
         /* This is not exposed to the user but available
          * internally. We need it to make sure that whenever we spawn
          * /usr/bin/mount it is run in the same process group as us so
@@ -185,6 +201,8 @@ struct ExecContext {
 
         unsigned long personality;
 
+        unsigned long restrict_namespaces; /* The CLONE_NEWxyz flags permitted to the unit's processes */
+
         Set *syscall_filter;
         Set *syscall_archs;
         int syscall_errno;
@@ -203,22 +221,37 @@ struct ExecContext {
         bool nice_set:1;
         bool ioprio_set:1;
         bool cpu_sched_set:1;
-        bool no_new_privileges_set:1;
 };
 
+static inline bool exec_context_restrict_namespaces_set(const ExecContext *c) {
+        assert(c);
+
+        return (c->restrict_namespaces & NAMESPACE_FLAGS_ALL) != NAMESPACE_FLAGS_ALL;
+}
+
+typedef enum ExecFlags {
+        EXEC_APPLY_PERMISSIONS = 1U << 0,
+        EXEC_APPLY_CHROOT      = 1U << 1,
+        EXEC_APPLY_TTY_STDIN   = 1U << 2,
+        EXEC_NEW_KEYRING       = 1U << 3,
+
+        /* The following are not used by execute.c, but by consumers internally */
+        EXEC_PASS_FDS          = 1U << 4,
+        EXEC_IS_CONTROL        = 1U << 5,
+        EXEC_SETENV_RESULT     = 1U << 6,
+        EXEC_SET_WATCHDOG      = 1U << 7,
+} ExecFlags;
+
 struct ExecParameters {
         char **argv;
         char **environment;
 
         int *fds;
         char **fd_names;
-        unsigned n_fds;
-
-        bool apply_permissions:1;
-        bool apply_chroot:1;
-        bool apply_tty_stdin:1;
+        unsigned n_storage_fds;
+        unsigned n_socket_fds;
 
-        bool confirm_spawn:1;
+        ExecFlags flags;
         bool selinux_context_net:1;
 
         bool cgroup_delegate:1;
@@ -227,6 +260,8 @@ struct ExecParameters {
 
         const char *runtime_prefix;
 
+        const char *confirm_spawn;
+
         usec_t watchdog_usec;
 
         int *idle_pipe;
@@ -237,12 +272,14 @@ struct ExecParameters {
 };
 
 #include "unit.h"
+#include "dynamic-user.h"
 
 int exec_spawn(Unit *unit,
                ExecCommand *command,
                const ExecContext *context,
                const ExecParameters *exec_params,
                ExecRuntime *runtime,
+               DynamicCreds *dynamic_creds,
                pid_t *ret);
 
 void exec_command_done(ExecCommand *c);
@@ -266,10 +303,14 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix);
 int exec_context_destroy_runtime_directory(ExecContext *c, const char *runtime_root);
 
 int exec_context_load_environment(Unit *unit, const ExecContext *c, char ***l);
+int exec_context_named_iofds(Unit *unit, const ExecContext *c, const ExecParameters *p, int named_iofds[3]);
+const char* exec_context_fdname(const ExecContext *c, int fd_index);
 
 bool exec_context_may_touch_console(ExecContext *c);
 bool exec_context_maintains_privileges(ExecContext *c);
 
+int exec_context_get_effective_ioprio(ExecContext *c);
+
 void exec_status_start(ExecStatus *s, pid_t pid);
 void exec_status_exit(ExecStatus *s, ExecContext *context, pid_t pid, int code, int status);
 void exec_status_dump(ExecStatus *s, FILE *f, const char *prefix);
index 68be528..845e31e 100644 (file)
 #include "util.h"
 
 int hostname_setup(void) {
-        int r;
         _cleanup_free_ char *b = NULL;
-        const char *hn;
         bool enoent = false;
+        const char *hn;
+        int r;
 
         r = read_hostname_config("/etc/hostname", &b);
         if (r < 0) {
@@ -56,7 +56,7 @@ int hostname_setup(void) {
                 if (enoent)
                         log_info("No hostname configured.");
 
-                hn = "localhost";
+                hn = FALLBACK_HOSTNAME;
         }
 
         r = sethostname_idempotent(hn);
index d1b0ce7..7b5c98a 100644 (file)
@@ -44,15 +44,13 @@ int ima_setup(void) {
                 return 0;
         }
 
-        input = fopen(IMA_POLICY_PATH, "re");
-        if (!input) {
-                log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_WARNING, errno,
-                               "Failed to open the IMA custom policy file "IMA_POLICY_PATH", ignoring: %m");
+        if (access(IMA_SECFS_POLICY, W_OK) < 0) {
+                log_warning("Another IMA custom policy has already been loaded, ignoring.");
                 return 0;
         }
 
-        if (access(IMA_SECFS_POLICY, F_OK) < 0) {
-                log_warning("Another IMA custom policy has already been loaded, ignoring.");
+        if (access(IMA_POLICY_PATH, F_OK) < 0) {
+                log_debug("No IMA custom policy file "IMA_POLICY_PATH", ignoring.");
                 return 0;
         }
 
@@ -62,6 +60,25 @@ int ima_setup(void) {
                 return 0;
         }
 
+        /* attempt to write the name of the policy file into sysfs file */
+        if (write(imafd, IMA_POLICY_PATH, strlen(IMA_POLICY_PATH)) > 0)
+                goto done;
+
+        /* fall back to copying the policy line-by-line */
+        input = fopen(IMA_POLICY_PATH, "re");
+        if (!input) {
+                log_warning_errno(errno, "Failed to open the IMA custom policy file "IMA_POLICY_PATH", ignoring: %m");
+                return 0;
+        }
+
+        close(imafd);
+
+        imafd = open(IMA_SECFS_POLICY, O_WRONLY|O_CLOEXEC);
+        if (imafd < 0) {
+                log_error_errno(errno, "Failed to open the IMA kernel interface "IMA_SECFS_POLICY", ignoring: %m");
+                return 0;
+        }
+
         FOREACH_LINE(line, input,
                      return log_error_errno(errno, "Failed to read the IMA custom policy file "IMA_POLICY_PATH": %m")) {
                 size_t len;
@@ -74,6 +91,7 @@ int ima_setup(void) {
                                                lineno);
         }
 
+done:
         log_info("Successfully loaded the IMA custom policy "IMA_POLICY_PATH".");
 #endif /* HAVE_IMA */
         return 0;
index 7557874..8e2039d 100644 (file)
@@ -90,9 +90,12 @@ void job_free(Job *j) {
         if (j->in_dbus_queue)
                 LIST_REMOVE(dbus_queue, j->manager->dbus_job_queue, j);
 
+        if (j->in_gc_queue)
+                LIST_REMOVE(gc_queue, j->manager->gc_job_queue, j);
+
         sd_event_source_unref(j->timer_event_source);
 
-        sd_bus_track_unref(j->clients);
+        sd_bus_track_unref(j->bus_track);
         strv_free(j->deserialized_clients);
 
         free(j);
@@ -226,6 +229,9 @@ Job* job_install(Job *j) {
         log_unit_debug(j->unit,
                        "Installed new job %s/%s as %u",
                        j->unit->id, job_type_to_string(j->type), (unsigned) j->id);
+
+        job_add_to_gc_queue(j);
+
         return j;
 }
 
@@ -267,7 +273,8 @@ JobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool
          * this means the 'anchor' job (i.e. the one the user
          * explicitly asked for) is the requester. */
 
-        if (!(l = new0(JobDependency, 1)))
+        l = new0(JobDependency, 1);
+        if (!l)
                 return NULL;
 
         l->subject = subject;
@@ -457,9 +464,7 @@ static bool job_is_runnable(Job *j) {
         if (j->type == JOB_NOP)
                 return true;
 
-        if (j->type == JOB_START ||
-            j->type == JOB_VERIFY_ACTIVE ||
-            j->type == JOB_RELOAD) {
+        if (IN_SET(j->type, JOB_START, JOB_VERIFY_ACTIVE, JOB_RELOAD)) {
 
                 /* Immediate result is that the job is or might be
                  * started. In this case let's wait for the
@@ -476,8 +481,7 @@ static bool job_is_runnable(Job *j) {
 
         SET_FOREACH(other, j->unit->dependencies[UNIT_BEFORE], i)
                 if (other->job &&
-                    (other->job->type == JOB_STOP ||
-                     other->job->type == JOB_RESTART))
+                    IN_SET(other->job->type, JOB_STOP, JOB_RESTART))
                         return false;
 
         /* This means that for a service a and a service b where b
@@ -572,6 +576,7 @@ int job_run_and_invalidate(Job *j) {
         if (!job_is_runnable(j))
                 return -EAGAIN;
 
+        job_start_timer(j, true);
         job_set_state(j, JOB_RUNNING);
         job_add_to_dbus_queue(j);
 
@@ -623,6 +628,8 @@ int job_run_and_invalidate(Job *j) {
                         r = job_finish_and_invalidate(j, JOB_ASSERT, true, false);
                 else if (r == -EOPNOTSUPP)
                         r = job_finish_and_invalidate(j, JOB_UNSUPPORTED, true, false);
+                else if (r == -ENOLINK)
+                        r = job_finish_and_invalidate(j, JOB_DEPENDENCY, true, false);
                 else if (r == -EAGAIN)
                         job_set_state(j, JOB_WAITING);
                 else if (r < 0)
@@ -641,6 +648,7 @@ _pure_ static const char *job_get_status_message_format(Unit *u, JobType t, JobR
                 [JOB_DEPENDENCY]  = "Dependency failed for %s.",
                 [JOB_ASSERT]      = "Assertion failed for %s.",
                 [JOB_UNSUPPORTED] = "Starting of %s not supported.",
+                [JOB_COLLECTED]   = "Unnecessary job for %s was removed.",
         };
         static const char *const generic_finished_stop_job[_JOB_RESULT_MAX] = {
                 [JOB_DONE]        = "Stopped %s.",
@@ -689,19 +697,20 @@ _pure_ static const char *job_get_status_message_format(Unit *u, JobType t, JobR
         return NULL;
 }
 
-static void job_print_status_message(Unit *u, JobType t, JobResult result) {
-        static struct {
-                const char *color, *word;
-        } const statuses[_JOB_RESULT_MAX] = {
-                [JOB_DONE]        = {ANSI_GREEN,            "  OK  "},
-                [JOB_TIMEOUT]     = {ANSI_HIGHLIGHT_RED,    " TIME "},
-                [JOB_FAILED]      = {ANSI_HIGHLIGHT_RED,    "FAILED"},
-                [JOB_DEPENDENCY]  = {ANSI_HIGHLIGHT_YELLOW, "DEPEND"},
-                [JOB_SKIPPED]     = {ANSI_HIGHLIGHT,        " INFO "},
-                [JOB_ASSERT]      = {ANSI_HIGHLIGHT_YELLOW, "ASSERT"},
-                [JOB_UNSUPPORTED] = {ANSI_HIGHLIGHT_YELLOW, "UNSUPP"},
-        };
+static const struct {
+        const char *color, *word;
+} job_print_status_messages [_JOB_RESULT_MAX] = {
+        [JOB_DONE]        = { ANSI_GREEN,            "  OK  " },
+        [JOB_TIMEOUT]     = { ANSI_HIGHLIGHT_RED,    " TIME " },
+        [JOB_FAILED]      = { ANSI_HIGHLIGHT_RED,    "FAILED" },
+        [JOB_DEPENDENCY]  = { ANSI_HIGHLIGHT_YELLOW, "DEPEND" },
+        [JOB_SKIPPED]     = { ANSI_HIGHLIGHT,        " INFO " },
+        [JOB_ASSERT]      = { ANSI_HIGHLIGHT_YELLOW, "ASSERT" },
+        [JOB_UNSUPPORTED] = { ANSI_HIGHLIGHT_YELLOW, "UNSUPP" },
+        /* JOB_COLLECTED */
+};
 
+static void job_print_status_message(Unit *u, JobType t, JobResult result) {
         const char *format;
         const char *status;
 
@@ -713,14 +722,19 @@ static void job_print_status_message(Unit *u, JobType t, JobResult result) {
         if (t == JOB_RELOAD)
                 return;
 
+        if (!job_print_status_messages[result].word)
+                return;
+
         format = job_get_status_message_format(u, t, result);
         if (!format)
                 return;
 
         if (log_get_show_color())
-                status = strjoina(statuses[result].color, statuses[result].word, ANSI_NORMAL);
+                status = strjoina(job_print_status_messages[result].color,
+                                  job_print_status_messages[result].word,
+                                  ANSI_NORMAL);
         else
-                status = statuses[result].word;
+                status = job_print_status_messages[result].word;
 
         if (result != JOB_DONE)
                 manager_flip_auto_status(u->manager, true);
@@ -732,15 +746,14 @@ static void job_print_status_message(Unit *u, JobType t, JobResult result) {
         if (t == JOB_START && result == JOB_FAILED) {
                 _cleanup_free_ char *quoted;
 
-                quoted = shell_maybe_quote(u->id);
+                quoted = shell_maybe_quote(u->id, ESCAPE_BACKSLASH);
                 manager_status_printf(u->manager, STATUS_TYPE_NORMAL, NULL, "See 'systemctl status %s' for details.", strna(quoted));
         }
 }
 
 static void job_log_status_message(Unit *u, JobType t, JobResult result) {
-        const char *format;
+        const char *format, *mid;
         char buf[LINE_MAX];
-        sd_id128_t mid;
         static const int job_result_log_level[_JOB_RESULT_MAX] = {
                 [JOB_DONE]        = LOG_INFO,
                 [JOB_CANCELED]    = LOG_INFO,
@@ -751,55 +764,59 @@ static void job_log_status_message(Unit *u, JobType t, JobResult result) {
                 [JOB_INVALID]     = LOG_INFO,
                 [JOB_ASSERT]      = LOG_WARNING,
                 [JOB_UNSUPPORTED] = LOG_WARNING,
+                [JOB_COLLECTED]   = LOG_INFO,
         };
 
         assert(u);
         assert(t >= 0);
         assert(t < _JOB_TYPE_MAX);
 
-        /* Skip this if it goes to the console. since we already print
-         * to the console anyway... */
-
-        if (log_on_console())
+        /* Skip printing if output goes to the console, and job_print_status_message()
+           will actually print something to the console. */
+        if (log_on_console() && job_print_status_messages[result].word)
                 return;
 
         format = job_get_status_message_format(u, t, result);
         if (!format)
                 return;
 
+        /* The description might be longer than the buffer, but that's OK, we'll just truncate it here */
         DISABLE_WARNING_FORMAT_NONLITERAL;
-        xsprintf(buf, format, unit_description(u));
+        snprintf(buf, sizeof(buf), format, unit_description(u));
         REENABLE_WARNING;
 
         switch (t) {
 
         case JOB_START:
-                mid = result == JOB_DONE ? SD_MESSAGE_UNIT_STARTED : SD_MESSAGE_UNIT_FAILED;
+                if (result == JOB_DONE)
+                        mid = "MESSAGE_ID=" SD_MESSAGE_UNIT_STARTED_STR;
+                else
+                        mid = "MESSAGE_ID=" SD_MESSAGE_UNIT_FAILED_STR;
                 break;
 
         case JOB_RELOAD:
-                mid = SD_MESSAGE_UNIT_RELOADED;
+                mid = "MESSAGE_ID=" SD_MESSAGE_UNIT_RELOADED_STR;
                 break;
 
         case JOB_STOP:
         case JOB_RESTART:
-                mid = SD_MESSAGE_UNIT_STOPPED;
+                mid = "MESSAGE_ID=" SD_MESSAGE_UNIT_STOPPED_STR;
                 break;
 
         default:
                 log_struct(job_result_log_level[result],
-                           LOG_UNIT_ID(u),
                            LOG_MESSAGE("%s", buf),
                            "RESULT=%s", job_result_to_string(result),
+                           LOG_UNIT_ID(u),
                            NULL);
                 return;
         }
 
         log_struct(job_result_log_level[result],
-                   LOG_MESSAGE_ID(mid),
-                   LOG_UNIT_ID(u),
                    LOG_MESSAGE("%s", buf),
                    "RESULT=%s", job_result_to_string(result),
+                   LOG_UNIT_ID(u),
+                   mid,
                    NULL);
 }
 
@@ -861,6 +878,7 @@ int job_finish_and_invalidate(Job *j, JobResult result, bool recursive, bool alr
                 job_set_state(j, JOB_WAITING);
 
                 job_add_to_run_queue(j);
+                job_add_to_gc_queue(j);
 
                 goto finish;
         }
@@ -904,11 +922,15 @@ int job_finish_and_invalidate(Job *j, JobResult result, bool recursive, bool alr
 finish:
         /* Try to start the next jobs that can be started */
         SET_FOREACH(other, u->dependencies[UNIT_AFTER], i)
-                if (other->job)
+                if (other->job) {
                         job_add_to_run_queue(other->job);
+                        job_add_to_gc_queue(other->job);
+                }
         SET_FOREACH(other, u->dependencies[UNIT_BEFORE], i)
-                if (other->job)
+                if (other->job) {
                         job_add_to_run_queue(other->job);
+                        job_add_to_gc_queue(other->job);
+                }
 
         manager_check_finished(u->manager);
 
@@ -927,27 +949,51 @@ static int job_dispatch_timer(sd_event_source *s, uint64_t monotonic, void *user
         u = j->unit;
         job_finish_and_invalidate(j, JOB_TIMEOUT, true, false);
 
-        failure_action(u->manager, u->job_timeout_action, u->job_timeout_reboot_arg);
+        emergency_action(u->manager, u->job_timeout_action, u->job_timeout_reboot_arg, "job timed out");
 
         return 0;
 }
 
-int job_start_timer(Job *j) {
+int job_start_timer(Job *j, bool job_running) {
         int r;
+        usec_t timeout_time, old_timeout_time;
 
-        if (j->timer_event_source)
-                return 0;
+        if (job_running) {
+                j->begin_running_usec = now(CLOCK_MONOTONIC);
 
-        j->begin_usec = now(CLOCK_MONOTONIC);
+                if (j->unit->job_running_timeout == USEC_INFINITY)
+                        return 0;
 
-        if (j->unit->job_timeout == USEC_INFINITY)
-                return 0;
+                timeout_time = usec_add(j->begin_running_usec, j->unit->job_running_timeout);
+
+                if (j->timer_event_source) {
+                        /* Update only if JobRunningTimeoutSec= results in earlier timeout */
+                        r = sd_event_source_get_time(j->timer_event_source, &old_timeout_time);
+                        if (r < 0)
+                                return r;
+
+                        if (old_timeout_time <= timeout_time)
+                                return 0;
+
+                        return sd_event_source_set_time(j->timer_event_source, timeout_time);
+                }
+        } else {
+                if (j->timer_event_source)
+                        return 0;
+
+                j->begin_usec = now(CLOCK_MONOTONIC);
+
+                if (j->unit->job_timeout == USEC_INFINITY)
+                        return 0;
+
+                timeout_time = usec_add(j->begin_usec, j->unit->job_timeout);
+        }
 
         r = sd_event_add_time(
                         j->manager->event,
                         &j->timer_event_source,
                         CLOCK_MONOTONIC,
-                        usec_add(j->begin_usec, j->unit->job_timeout), 0,
+                        timeout_time, 0,
                         job_dispatch_timer, j);
         if (r < 0)
                 return r;
@@ -997,7 +1043,10 @@ char *job_dbus_path(Job *j) {
         return p;
 }
 
-int job_serialize(Job *j, FILE *f, FDSet *fds) {
+int job_serialize(Job *j, FILE *f) {
+        assert(j);
+        assert(f);
+
         fprintf(f, "job-id=%u\n", j->id);
         fprintf(f, "job-type=%s\n", job_type_to_string(j->type));
         fprintf(f, "job-state=%s\n", job_state_to_string(j->state));
@@ -1007,16 +1056,19 @@ int job_serialize(Job *j, FILE *f, FDSet *fds) {
 
         if (j->begin_usec > 0)
                 fprintf(f, "job-begin="USEC_FMT"\n", j->begin_usec);
+        if (j->begin_running_usec > 0)
+                fprintf(f, "job-begin-running="USEC_FMT"\n", j->begin_running_usec);
 
-        bus_track_serialize(j->clients, f);
+        bus_track_serialize(j->bus_track, f, "subscribed");
 
         /* End marker */
         fputc('\n', f);
         return 0;
 }
 
-int job_deserialize(Job *j, FILE *f, FDSet *fds) {
+int job_deserialize(Job *j, FILE *f) {
         assert(j);
+        assert(f);
 
         for (;;) {
                 char line[LINE_MAX], *l, *v;
@@ -1103,29 +1155,50 @@ int job_deserialize(Job *j, FILE *f, FDSet *fds) {
                         else
                                 j->begin_usec = ull;
 
+                } else if (streq(l, "job-begin-running")) {
+                        unsigned long long ull;
+
+                        if (sscanf(v, "%llu", &ull) != 1)
+                                log_debug("Failed to parse job-begin-running value %s", v);
+                        else
+                                j->begin_running_usec = ull;
+
                 } else if (streq(l, "subscribed")) {
 
                         if (strv_extend(&j->deserialized_clients, v) < 0)
-                                return log_oom();
+                                log_oom();
                 }
         }
 }
 
 int job_coldplug(Job *j) {
         int r;
+        usec_t timeout_time = USEC_INFINITY;
 
         assert(j);
 
         /* After deserialization is complete and the bus connection
          * set up again, let's start watching our subscribers again */
-        r = bus_track_coldplug(j->manager, &j->clients, &j->deserialized_clients);
-        if (r < 0)
-                return r;
+        (void) bus_job_coldplug_bus_track(j);
 
         if (j->state == JOB_WAITING)
                 job_add_to_run_queue(j);
 
-        if (j->begin_usec == 0 || j->unit->job_timeout == USEC_INFINITY)
+        /* Maybe due to new dependencies we don't actually need this job anymore? */
+        job_add_to_gc_queue(j);
+
+        /* Create timer only when job began or began running and the respective timeout is finite.
+         * Follow logic of job_start_timer() if both timeouts are finite */
+        if (j->begin_usec == 0)
+                return 0;
+
+        if (j->unit->job_timeout != USEC_INFINITY)
+                timeout_time = usec_add(j->begin_usec, j->unit->job_timeout);
+
+        if (j->begin_running_usec > 0 && j->unit->job_running_timeout != USEC_INFINITY)
+                timeout_time = MIN(timeout_time, usec_add(j->begin_running_usec, j->unit->job_running_timeout));
+
+        if (timeout_time == USEC_INFINITY)
                 return 0;
 
         j->timer_event_source = sd_event_source_unref(j->timer_event_source);
@@ -1134,7 +1207,7 @@ int job_coldplug(Job *j) {
                         j->manager->event,
                         &j->timer_event_source,
                         CLOCK_MONOTONIC,
-                        usec_add(j->begin_usec, j->unit->job_timeout), 0,
+                        timeout_time, 0,
                         job_dispatch_timer, j);
         if (r < 0)
                 log_debug_errno(r, "Failed to restart timeout for job: %m");
@@ -1199,9 +1272,223 @@ int job_get_timeout(Job *j, usec_t *timeout) {
         return 1;
 }
 
+bool job_check_gc(Job *j) {
+        Unit *other;
+        Iterator i;
+
+        assert(j);
+
+        /* Checks whether this job should be GC'ed away. We only do this for jobs of units that have no effect on their
+         * own and just track external state. For now the only unit type that qualifies for this are .device units. */
+
+        if (!UNIT_VTABLE(j->unit)->gc_jobs)
+                return true;
+
+        if (sd_bus_track_count(j->bus_track) > 0)
+                return true;
+
+        /* FIXME: So this is a bit ugly: for now we don't properly track references made via private bus connections
+         * (because it's nasty, as sd_bus_track doesn't apply to it). We simply remember that the job was once
+         * referenced by one, and reset this whenever we notice that no private bus connections are around. This means
+         * the GC is a bit too conservative when it comes to jobs created by private bus connections. */
+        if (j->ref_by_private_bus) {
+                if (set_isempty(j->unit->manager->private_buses))
+                        j->ref_by_private_bus = false;
+                else
+                        return true;
+        }
+
+        if (j->type == JOB_NOP)
+                return true;
+
+        /* If a job is ordered after ours, and is to be started, then it needs to wait for us, regardless if we stop or
+         * start, hence let's not GC in that case. */
+        SET_FOREACH(other, j->unit->dependencies[UNIT_BEFORE], i) {
+                if (!other->job)
+                        continue;
+
+                if (other->job->ignore_order)
+                        continue;
+
+                if (IN_SET(other->job->type, JOB_START, JOB_VERIFY_ACTIVE, JOB_RELOAD))
+                        return true;
+        }
+
+        /* If we are going down, but something else is ordered After= us, then it needs to wait for us */
+        if (IN_SET(j->type, JOB_STOP, JOB_RESTART))
+                SET_FOREACH(other, j->unit->dependencies[UNIT_AFTER], i) {
+                        if (!other->job)
+                                continue;
+
+                        if (other->job->ignore_order)
+                                continue;
+
+                        return true;
+                }
+
+        /* The logic above is kinda the inverse of the job_is_runnable() logic. Specifically, if the job "we" is
+         * ordered before the job "other":
+         *
+         *  we start + other start → stay
+         *  we start + other stop  → gc
+         *  we stop  + other start → stay
+         *  we stop  + other stop  → gc
+         *
+         * "we" are ordered after "other":
+         *
+         *  we start + other start → gc
+         *  we start + other stop  → gc
+         *  we stop  + other start → stay
+         *  we stop  + other stop  → stay
+         *
+         */
+
+        return false;
+}
+
+void job_add_to_gc_queue(Job *j) {
+        assert(j);
+
+        if (j->in_gc_queue)
+                return;
+
+        if (job_check_gc(j))
+                return;
+
+        LIST_PREPEND(gc_queue, j->unit->manager->gc_job_queue, j);
+        j->in_gc_queue = true;
+}
+
+static int job_compare(const void *a, const void *b) {
+        Job *x = *(Job**) a, *y = *(Job**) b;
+
+        if (x->id < y->id)
+                return -1;
+        if (x->id > y->id)
+                return 1;
+
+        return 0;
+}
+
+static size_t sort_job_list(Job **list, size_t n) {
+        Job *previous = NULL;
+        size_t a, b;
+
+        /* Order by numeric IDs */
+        qsort_safe(list, n, sizeof(Job*), job_compare);
+
+        /* Filter out duplicates */
+        for (a = 0, b = 0; a < n; a++) {
+
+                if (previous == list[a])
+                        continue;
+
+                previous = list[b++] = list[a];
+        }
+
+        return b;
+}
+
+int job_get_before(Job *j, Job*** ret) {
+        _cleanup_free_ Job** list = NULL;
+        size_t n = 0, n_allocated = 0;
+        Unit *other = NULL;
+        Iterator i;
+
+        /* Returns a list of all pending jobs that need to finish before this job may be started. */
+
+        assert(j);
+        assert(ret);
+
+        if (j->ignore_order) {
+                *ret = NULL;
+                return 0;
+        }
+
+        if (IN_SET(j->type, JOB_START, JOB_VERIFY_ACTIVE, JOB_RELOAD)) {
+
+                SET_FOREACH(other, j->unit->dependencies[UNIT_AFTER], i) {
+                        if (!other->job)
+                                continue;
+
+                        if (!GREEDY_REALLOC(list, n_allocated, n+1))
+                                return -ENOMEM;
+                        list[n++] = other->job;
+                }
+        }
+
+        SET_FOREACH(other, j->unit->dependencies[UNIT_BEFORE], i) {
+                if (!other->job)
+                        continue;
+
+                if (!IN_SET(other->job->type, JOB_STOP, JOB_RESTART))
+                        continue;
+
+                if (!GREEDY_REALLOC(list, n_allocated, n+1))
+                        return -ENOMEM;
+                list[n++] = other->job;
+        }
+
+        n = sort_job_list(list, n);
+
+        *ret = list;
+        list = NULL;
+
+        return (int) n;
+}
+
+int job_get_after(Job *j, Job*** ret) {
+        _cleanup_free_ Job** list = NULL;
+        size_t n = 0, n_allocated = 0;
+        Unit *other = NULL;
+        Iterator i;
+
+        assert(j);
+        assert(ret);
+
+        /* Returns a list of all pending jobs that are waiting for this job to finish. */
+
+        SET_FOREACH(other, j->unit->dependencies[UNIT_BEFORE], i) {
+                if (!other->job)
+                        continue;
+
+                if (other->job->ignore_order)
+                        continue;
+
+                if (!IN_SET(other->job->type, JOB_START, JOB_VERIFY_ACTIVE, JOB_RELOAD))
+                        continue;
+
+                if (!GREEDY_REALLOC(list, n_allocated, n+1))
+                        return -ENOMEM;
+                list[n++] = other->job;
+        }
+
+        if (IN_SET(j->type, JOB_STOP, JOB_RESTART)) {
+
+                SET_FOREACH(other, j->unit->dependencies[UNIT_AFTER], i) {
+                        if (!other->job)
+                                continue;
+
+                        if (other->job->ignore_order)
+                                continue;
+
+                        if (!GREEDY_REALLOC(list, n_allocated, n+1))
+                                return -ENOMEM;
+                        list[n++] = other->job;
+                }
+        }
+
+        n = sort_job_list(list, n);
+
+        *ret = list;
+        list = NULL;
+
+        return (int) n;
+}
+
 static const char* const job_state_table[_JOB_STATE_MAX] = {
         [JOB_WAITING] = "waiting",
-        [JOB_RUNNING] = "running"
+        [JOB_RUNNING] = "running",
 };
 
 DEFINE_STRING_TABLE_LOOKUP(job_state, JobState);
@@ -1242,6 +1529,7 @@ static const char* const job_result_table[_JOB_RESULT_MAX] = {
         [JOB_INVALID] = "invalid",
         [JOB_ASSERT] = "assert",
         [JOB_UNSUPPORTED] = "unsupported",
+        [JOB_COLLECTED] = "collected",
 };
 
 DEFINE_STRING_TABLE_LOOKUP(job_result, JobResult);
index d359e8b..b170018 100644 (file)
@@ -107,6 +107,7 @@ enum JobResult {
         JOB_INVALID,             /* JOB_RELOAD of inactive unit */
         JOB_ASSERT,              /* Couldn't start a unit, because an assert didn't hold */
         JOB_UNSUPPORTED,         /* Couldn't start a unit, because the unit type is not supported on the system */
+        JOB_COLLECTED,           /* Job was garbage collected, since nothing needed it anymore */
         _JOB_RESULT_MAX,
         _JOB_RESULT_INVALID = -1
 };
@@ -122,8 +123,8 @@ struct JobDependency {
         LIST_FIELDS(JobDependency, subject);
         LIST_FIELDS(JobDependency, object);
 
-        bool matters;
-        bool conflicts;
+        bool matters:1;
+        bool conflicts:1;
 };
 
 struct Job {
@@ -133,6 +134,7 @@ struct Job {
         LIST_FIELDS(Job, transaction);
         LIST_FIELDS(Job, run_queue);
         LIST_FIELDS(Job, dbus_queue);
+        LIST_FIELDS(Job, gc_queue);
 
         LIST_HEAD(JobDependency, subject_list);
         LIST_HEAD(JobDependency, object_list);
@@ -148,6 +150,7 @@ struct Job {
 
         sd_event_source *timer_event_source;
         usec_t begin_usec;
+        usec_t begin_running_usec;
 
         /*
          * This tracks where to send signals, and also which clients
@@ -156,7 +159,7 @@ struct Job {
          *
          * There can be more than one client, because of job merging.
          */
-        sd_bus_track *clients;
+        sd_bus_track *bus_track;
         char **deserialized_clients;
 
         JobResult result;
@@ -168,6 +171,8 @@ struct Job {
         bool sent_dbus_new_signal:1;
         bool ignore_order:1;
         bool irreversible:1;
+        bool in_gc_queue:1;
+        bool ref_by_private_bus:1;
 };
 
 Job* job_new(Unit *unit, JobType type);
@@ -177,8 +182,8 @@ Job* job_install(Job *j);
 int job_install_deserialized(Job *j);
 void job_uninstall(Job *j);
 void job_dump(Job *j, FILE*f, const char *prefix);
-int job_serialize(Job *j, FILE *f, FDSet *fds);
-int job_deserialize(Job *j, FILE *f, FDSet *fds);
+int job_serialize(Job *j, FILE *f);
+int job_deserialize(Job *j, FILE *f);
 int job_coldplug(Job *j);
 
 JobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool conflicts);
@@ -216,7 +221,7 @@ int job_type_merge_and_collapse(JobType *a, JobType b, Unit *u);
 void job_add_to_run_queue(Job *j);
 void job_add_to_dbus_queue(Job *j);
 
-int job_start_timer(Job *j);
+int job_start_timer(Job *j, bool job_running);
 
 int job_run_and_invalidate(Job *j);
 int job_finish_and_invalidate(Job *j, JobResult result, bool recursive, bool already);
@@ -227,6 +232,12 @@ void job_shutdown_magic(Job *j);
 
 int job_get_timeout(Job *j, usec_t *timeout) _pure_;
 
+bool job_check_gc(Job *j);
+void job_add_to_gc_queue(Job *j);
+
+int job_get_before(Job *j, Job*** ret);
+int job_get_after(Job *j, Job*** ret);
+
 const char* job_type_to_string(JobType t) _const_;
 JobType job_type_from_string(const char *s) _pure_;
 
index a8b814e..3fe9fa2 100644 (file)
@@ -24,8 +24,9 @@
 
 #include "alloc-util.h"
 #include "def.h"
+#include "dirent-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "killall.h"
 #include "parse-util.h"
 #include "process-util.h"
@@ -65,29 +66,26 @@ static bool ignore_proc(pid_t pid, bool warn_rootfs) {
         if (count <= 0)
                 return true;
 
-        /* Processes with argv[0][0] = '@' we ignore from the killing
-         * spree.
+        /* Processes with argv[0][0] = '@' we ignore from the killing spree.
          *
          * http://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons */
-        if (c == '@' && warn_rootfs) {
-                _cleanup_free_ char *comm = NULL;
+        if (c != '@')
+                return false;
 
-                r = pid_from_same_root_fs(pid);
-                if (r < 0)
-                        return true;
+        if (warn_rootfs &&
+            pid_from_same_root_fs(pid) == 0) {
+
+                _cleanup_free_ char *comm = NULL;
 
                 get_process_comm(pid, &comm);
 
-                if (r)
-                        log_notice("Process " PID_FMT " (%s) has been marked to be excluded from killing. It is "
-                                   "running from the root file system, and thus likely to block re-mounting of the "
-                                   "root file system to read-only. Please consider moving it into an initrd file "
-                                   "system instead.", pid, strna(comm));
-                return true;
-        } else if (c == '@')
-                return true;
+                log_notice("Process " PID_FMT " (%s) has been marked to be excluded from killing. It is "
+                           "running from the root file system, and thus likely to block re-mounting of the "
+                           "root file system to read-only. Please consider moving it into an initrd file "
+                           "system instead.", pid, strna(comm));
+        }
 
-        return false;
+        return true;
 }
 
 static void wait_for_children(Set *pids, sigset_t *mask) {
@@ -172,7 +170,7 @@ static int killall(int sig, Set *pids, bool send_sighup) {
         if (!dir)
                 return -errno;
 
-        while ((d = readdir(dir))) {
+        FOREACH_DIRENT_ALL(d, dir, break) {
                 pid_t pid;
                 int r;
 
@@ -215,7 +213,8 @@ static int killall(int sig, Set *pids, bool send_sighup) {
 
 
                         if (get_ctty_devnr(pid, NULL) >= 0)
-                                kill(pid, SIGHUP);
+                                /* it's OK if the process is gone, just ignore the result */
+                                (void) kill(pid, SIGHUP);
                 }
         }
 
index f83fa09..00f09ce 100644 (file)
 
 
 #include "conf-parser.h"
+#include "fs-util.h"
 #include "load-dropin.h"
 #include "load-fragment.h"
 #include "log.h"
+#include "stat-util.h"
+#include "string-util.h"
 #include "strv.h"
 #include "unit-name.h"
 #include "unit.h"
 
-static int add_dependency_consumer(
-                UnitDependency dependency,
-                const char *entry,
-                const char* filepath,
-                void *arg) {
-        Unit *u = arg;
+static int unit_name_compatible(const char *a, const char *b) {
+        _cleanup_free_ char *prefix = NULL;
         int r;
 
-        assert(u);
+        /* the straightforward case: the symlink name matches the target */
+        if (streq(a, b))
+                return 1;
 
-        r = unit_add_dependency_by_name(u, dependency, entry, filepath, true);
+        r = unit_name_template(a, &prefix);
+        if (r == -EINVAL)
+                /* not a template */
+                return 0;
         if (r < 0)
-                log_error_errno(r, "Cannot add dependency %s to %s, ignoring: %m", entry, u->id);
+                /* oom, or some other failure. Just skip the warning. */
+                return r;
+
+        /* an instance name points to a target that is just the template name */
+        if (streq(prefix, b))
+                return 1;
 
         return 0;
 }
 
-int unit_load_dropin(Unit *u) {
-        _cleanup_strv_free_ char **l = NULL;
-        Iterator i;
-        char *t, **f;
+static int process_deps(Unit *u, UnitDependency dependency, const char *dir_suffix) {
+        _cleanup_strv_free_ char **paths = NULL;
+        char **p;
         int r;
 
-        assert(u);
+        r = unit_file_find_dropin_paths(NULL,
+                                        u->manager->lookup_paths.search_path,
+                                        u->manager->unit_path_cache,
+                                        dir_suffix,
+                                        NULL,
+                                        u->names,
+                                        &paths);
+        if (r < 0)
+                return r;
+
+        STRV_FOREACH(p, paths) {
+                const char *entry;
+                _cleanup_free_ char *target = NULL;
 
-        /* Load dependencies from supplementary drop-in directories */
+                entry = basename(*p);
 
-        SET_FOREACH(t, u->names, i) {
-                char **p;
+                if (null_or_empty_path(*p) > 0) {
+                        /* an error usually means an invalid symlink, which is not a mask */
+                        log_unit_debug(u, "%s dependency on %s is masked by %s, ignoring.",
+                                       unit_dependency_to_string(dependency), entry, *p);
+                        continue;
+                }
+
+                r = is_symlink(*p);
+                if (r < 0) {
+                        log_unit_warning_errno(u, r, "%s dropin %s unreadable, ignoring: %m",
+                                               unit_dependency_to_string(dependency), *p);
+                        continue;
+                }
+                if (r == 0) {
+                        log_unit_warning(u, "%s dependency dropin %s is not a symlink, ignoring.",
+                                         unit_dependency_to_string(dependency), *p);
+                        continue;
+                }
+
+                if (!unit_name_is_valid(entry, UNIT_NAME_ANY)) {
+                        log_unit_warning(u, "%s dependency dropin %s is not a valid unit name, ignoring.",
+                                         unit_dependency_to_string(dependency), *p);
+                        continue;
+                }
+
+                r = readlink_malloc(*p, &target);
+                if (r < 0) {
+                        log_unit_warning_errno(u, r, "readlink(\"%s\") failed, ignoring: %m", *p);
+                        continue;
+                }
 
-                STRV_FOREACH(p, u->manager->lookup_paths.search_path) {
-                        unit_file_process_dir(u->manager->unit_path_cache, *p, t, ".wants", UNIT_WANTS,
-                                              add_dependency_consumer, u, NULL);
-                        unit_file_process_dir(u->manager->unit_path_cache, *p, t, ".requires", UNIT_REQUIRES,
-                                              add_dependency_consumer, u, NULL);
+                /* We don't treat this as an error, especially because we didn't check this for a
+                 * long time. Nevertheless, we warn, because such mismatch can be mighty confusing. */
+                r = unit_name_compatible(entry, basename(target));
+                if (r < 0) {
+                        log_unit_warning_errno(u, r, "Can't check if names %s and %s are compatible, ignoring: %m", entry, basename(target));
+                        continue;
                 }
+                if (r == 0)
+                        log_unit_warning(u, "%s dependency dropin %s target %s has different name",
+                                         unit_dependency_to_string(dependency), *p, target);
+
+                r = unit_add_dependency_by_name(u, dependency, entry, *p, true);
+                if (r < 0)
+                        log_unit_error_errno(u, r, "cannot add %s dependency on %s, ignoring: %m",
+                                             unit_dependency_to_string(dependency), entry);
         }
 
+        return 0;
+}
+
+int unit_load_dropin(Unit *u) {
+        _cleanup_strv_free_ char **l = NULL;
+        char **f;
+        int r;
+
+        assert(u);
+
+        /* Load dependencies from .wants and .requires directories */
+        r = process_deps(u, UNIT_WANTS, ".wants");
+        if (r < 0)
+                return r;
+
+        r = process_deps(u, UNIT_REQUIRES, ".requires");
+        if (r < 0)
+                return r;
+
+        /* Load .conf dropins */
         r = unit_find_dropin_paths(u, &l);
         if (r <= 0)
                 return 0;
index 942d267..5828a22 100644 (file)
 /* Read service data supplementary drop-in directories */
 
 static inline int unit_find_dropin_paths(Unit *u, char ***paths) {
-        return unit_file_find_dropin_paths(u->manager->lookup_paths.search_path,
-                                           u->manager->unit_path_cache,
-                                           u->names,
-                                           paths);
+        return unit_file_find_dropin_conf_paths(NULL,
+                                                u->manager->lookup_paths.search_path,
+                                                u->manager->unit_path_cache,
+                                                u->names,
+                                                paths);
 }
 
 int unit_load_dropin(Unit *u);
diff --git a/src/core/load-fragment-gperf-nulstr.awk b/src/core/load-fragment-gperf-nulstr.awk
new file mode 100644 (file)
index 0000000..b52438a
--- /dev/null
@@ -0,0 +1,14 @@
+BEGIN{
+        keywords=0 ; FS="," ;
+        print "extern const char load_fragment_gperf_nulstr[];" ;
+        print "const char load_fragment_gperf_nulstr[] ="
+}
+keyword==1 {
+        print "\"" $$1 "\\0\""
+}
+/%%/ {
+        keyword=1
+}
+END {
+        print ";"
+}
index 85c5bf7..965c6e7 100644 (file)
@@ -18,10 +18,11 @@ struct ConfigPerfItem;
 m4_dnl Define the context options only once
 m4_define(`EXEC_CONTEXT_CONFIG_ITEMS',
 `$1.WorkingDirectory,            config_parse_working_directory,     0,                             offsetof($1, exec_context)
-$1.RootDirectory,                config_parse_unit_path_printf,      0,                             offsetof($1, exec_context.root_directory)
-$1.User,                         config_parse_unit_string_printf,    0,                             offsetof($1, exec_context.user)
-$1.Group,                        config_parse_unit_string_printf,    0,                             offsetof($1, exec_context.group)
-$1.SupplementaryGroups,          config_parse_strv,                  0,                             offsetof($1, exec_context.supplementary_groups)
+$1.RootDirectory,                config_parse_unit_path_printf,      true,                          offsetof($1, exec_context.root_directory)
+$1.RootImage,                    config_parse_unit_path_printf,      true,                          offsetof($1, exec_context.root_image)
+$1.User,                         config_parse_user_group,            0,                             offsetof($1, exec_context.user)
+$1.Group,                        config_parse_user_group,            0,                             offsetof($1, exec_context.group)
+$1.SupplementaryGroups,          config_parse_user_group_strv,       0,                             offsetof($1, exec_context.supplementary_groups)
 $1.Nice,                         config_parse_exec_nice,             0,                             offsetof($1, exec_context)
 $1.OOMScoreAdjust,               config_parse_exec_oom_score_adjust, 0,                             offsetof($1, exec_context)
 $1.IOSchedulingClass,            config_parse_exec_io_class,         0,                             offsetof($1, exec_context)
@@ -34,9 +35,10 @@ $1.UMask,                        config_parse_mode,                  0,
 $1.Environment,                  config_parse_environ,               0,                             offsetof($1, exec_context.environment)
 $1.EnvironmentFile,              config_parse_unit_env_file,         0,                             offsetof($1, exec_context.environment_files)
 $1.PassEnvironment,              config_parse_pass_environ,          0,                             offsetof($1, exec_context.pass_environment)
-$1.StandardInput,                config_parse_input,                 0,                             offsetof($1, exec_context.std_input)
-$1.StandardOutput,               config_parse_output,                0,                             offsetof($1, exec_context.std_output)
-$1.StandardError,                config_parse_output,                0,                             offsetof($1, exec_context.std_error)
+$1.DynamicUser,                  config_parse_bool,                  true,                          offsetof($1, exec_context.dynamic_user)
+$1.StandardInput,                config_parse_exec_input,            0,                             offsetof($1, exec_context)
+$1.StandardOutput,               config_parse_exec_output,           0,                             offsetof($1, exec_context)
+$1.StandardError,                config_parse_exec_output,           0,                             offsetof($1, exec_context)
 $1.TTYPath,                      config_parse_unit_path_printf,      0,                             offsetof($1, exec_context.tty_path)
 $1.TTYReset,                     config_parse_bool,                  0,                             offsetof($1, exec_context.tty_reset)
 $1.TTYVHangup,                   config_parse_bool,                  0,                             offsetof($1, exec_context.tty_vhangup)
@@ -56,12 +58,14 @@ m4_ifdef(`HAVE_SECCOMP',
 $1.SystemCallArchitectures,      config_parse_syscall_archs,         0,                             offsetof($1, exec_context.syscall_archs)
 $1.SystemCallErrorNumber,        config_parse_syscall_errno,         0,                             offsetof($1, exec_context)
 $1.MemoryDenyWriteExecute,       config_parse_bool,                  0,                             offsetof($1, exec_context.memory_deny_write_execute)
+$1.RestrictNamespaces,           config_parse_restrict_namespaces,   0,                             offsetof($1, exec_context)
 $1.RestrictRealtime,             config_parse_bool,                  0,                             offsetof($1, exec_context.restrict_realtime)
 $1.RestrictAddressFamilies,      config_parse_address_families,      0,                             offsetof($1, exec_context)',
 `$1.SystemCallFilter,            config_parse_warn_compat,           DISABLED_CONFIGURATION,        0
 $1.SystemCallArchitectures,      config_parse_warn_compat,           DISABLED_CONFIGURATION,        0
 $1.SystemCallErrorNumber,        config_parse_warn_compat,           DISABLED_CONFIGURATION,        0
 $1.MemoryDenyWriteExecute,       config_parse_warn_compat,           DISABLED_CONFIGURATION,        0
+$1.RestrictNamespaces,           config_parse_warn_compat,           DISABLED_CONFIGURATION,        0
 $1.RestrictRealtime,             config_parse_warn_compat,           DISABLED_CONFIGURATION,        0
 $1.RestrictAddressFamilies,      config_parse_warn_compat,           DISABLED_CONFIGURATION,        0')
 $1.LimitCPU,                     config_parse_limit,                 RLIMIT_CPU,                    offsetof($1, exec_context.rlimit)
@@ -86,12 +90,19 @@ $1.InaccessibleDirectories,      config_parse_namespace_path_strv,   0,
 $1.ReadWritePaths,               config_parse_namespace_path_strv,   0,                             offsetof($1, exec_context.read_write_paths)
 $1.ReadOnlyPaths,                config_parse_namespace_path_strv,   0,                             offsetof($1, exec_context.read_only_paths)
 $1.InaccessiblePaths,            config_parse_namespace_path_strv,   0,                             offsetof($1, exec_context.inaccessible_paths)
+$1.BindPaths,                    config_parse_bind_paths,            0,                             offsetof($1, exec_context)
+$1.BindReadOnlyPaths,            config_parse_bind_paths,            0,                             offsetof($1, exec_context)
 $1.PrivateTmp,                   config_parse_bool,                  0,                             offsetof($1, exec_context.private_tmp)
-$1.PrivateNetwork,               config_parse_bool,                  0,                             offsetof($1, exec_context.private_network)
 $1.PrivateDevices,               config_parse_bool,                  0,                             offsetof($1, exec_context.private_devices)
+$1.ProtectKernelTunables,        config_parse_bool,                  0,                             offsetof($1, exec_context.protect_kernel_tunables)
+$1.ProtectKernelModules,         config_parse_bool,                  0,                             offsetof($1, exec_context.protect_kernel_modules)
+$1.ProtectControlGroups,         config_parse_bool,                  0,                             offsetof($1, exec_context.protect_control_groups)
+$1.PrivateNetwork,               config_parse_bool,                  0,                             offsetof($1, exec_context.private_network)
+$1.PrivateUsers,                 config_parse_bool,                  0,                             offsetof($1, exec_context.private_users)
 $1.ProtectSystem,                config_parse_protect_system,        0,                             offsetof($1, exec_context)
 $1.ProtectHome,                  config_parse_protect_home,          0,                             offsetof($1, exec_context)
 $1.MountFlags,                   config_parse_exec_mount_flags,      0,                             offsetof($1, exec_context)
+$1.MountAPIVFS,                  config_parse_bool,                  0,                             offsetof($1, exec_context.mount_apivfs)
 $1.Personality,                  config_parse_personality,           0,                             offsetof($1, exec_context.personality)
 $1.RuntimeDirectoryMode,         config_parse_mode,                  0,                             offsetof($1, exec_context.runtime_directory_mode)
 $1.RuntimeDirectory,             config_parse_runtime_directory,     0,                             offsetof($1, exec_context.runtime_directory)
@@ -120,6 +131,8 @@ $1.KillSignal,                   config_parse_signal,                0,
 m4_define(`CGROUP_CONTEXT_CONFIG_ITEMS',
 `$1.Slice,                       config_parse_unit_slice,            0,                             0
 $1.CPUAccounting,                config_parse_bool,                  0,                             offsetof($1, cgroup_context.cpu_accounting)
+$1.CPUWeight,                    config_parse_cpu_weight,            0,                             offsetof($1, cgroup_context.cpu_weight)
+$1.StartupCPUWeight,             config_parse_cpu_weight,            0,                             offsetof($1, cgroup_context.startup_cpu_weight)
 $1.CPUShares,                    config_parse_cpu_shares,            0,                             offsetof($1, cgroup_context.cpu_shares)
 $1.StartupCPUShares,             config_parse_cpu_shares,            0,                             offsetof($1, cgroup_context.startup_cpu_shares)
 $1.CPUQuota,                     config_parse_cpu_quota,             0,                             offsetof($1, cgroup_context)
@@ -127,6 +140,7 @@ $1.MemoryAccounting,             config_parse_bool,                  0,
 $1.MemoryLow,                    config_parse_memory_limit,          0,                             offsetof($1, cgroup_context)
 $1.MemoryHigh,                   config_parse_memory_limit,          0,                             offsetof($1, cgroup_context)
 $1.MemoryMax,                    config_parse_memory_limit,          0,                             offsetof($1, cgroup_context)
+$1.MemorySwapMax,                config_parse_memory_limit,          0,                             offsetof($1, cgroup_context)
 $1.MemoryLimit,                  config_parse_memory_limit,          0,                             offsetof($1, cgroup_context)
 $1.DeviceAllow,                  config_parse_device_allow,          0,                             offsetof($1, cgroup_context)
 $1.DevicePolicy,                 config_parse_device_policy,         0,                             offsetof($1, cgroup_context.device_policy)
@@ -180,14 +194,15 @@ Unit.OnFailureIsolate,           config_parse_job_mode_isolate,      0,
 Unit.IgnoreOnIsolate,            config_parse_bool,                  0,                             offsetof(Unit, ignore_on_isolate)
 Unit.IgnoreOnSnapshot,           config_parse_warn_compat,           DISABLED_LEGACY,               0
 Unit.JobTimeoutSec,              config_parse_sec_fix_0,             0,                             offsetof(Unit, job_timeout)
-Unit.JobTimeoutAction,           config_parse_failure_action,        0,                             offsetof(Unit, job_timeout_action)
-Unit.JobTimeoutRebootArgument,   config_parse_string,                0,                             offsetof(Unit, job_timeout_reboot_arg)
+Unit.JobRunningTimeoutSec,       config_parse_sec,                   0,                             offsetof(Unit, job_running_timeout)
+Unit.JobTimeoutAction,           config_parse_emergency_action,      0,                             offsetof(Unit, job_timeout_action)
+Unit.JobTimeoutRebootArgument,   config_parse_unit_string_printf,    0,                             offsetof(Unit, job_timeout_reboot_arg)
 Unit.StartLimitIntervalSec,      config_parse_sec,                   0,                             offsetof(Unit, start_limit.interval)
 m4_dnl The following is a legacy alias name for compatibility
 Unit.StartLimitInterval,         config_parse_sec,                   0,                             offsetof(Unit, start_limit.interval)
 Unit.StartLimitBurst,            config_parse_unsigned,              0,                             offsetof(Unit, start_limit.burst)
-Unit.StartLimitAction,           config_parse_failure_action,        0,                             offsetof(Unit, start_limit_action)
-Unit.RebootArgument,             config_parse_string,                0,                             offsetof(Unit, reboot_arg)
+Unit.StartLimitAction,           config_parse_emergency_action,      0,                             offsetof(Unit, start_limit_action)
+Unit.RebootArgument,             config_parse_unit_string_printf,    0,                             offsetof(Unit, reboot_arg)
 Unit.ConditionPathExists,        config_parse_unit_condition_path,   CONDITION_PATH_EXISTS,         offsetof(Unit, conditions)
 Unit.ConditionPathExistsGlob,    config_parse_unit_condition_path,   CONDITION_PATH_EXISTS_GLOB,    offsetof(Unit, conditions)
 Unit.ConditionPathIsDirectory,   config_parse_unit_condition_path,   CONDITION_PATH_IS_DIRECTORY,   offsetof(Unit, conditions)
@@ -206,6 +221,8 @@ Unit.ConditionSecurity,          config_parse_unit_condition_string, CONDITION_S
 Unit.ConditionCapability,        config_parse_unit_condition_string, CONDITION_CAPABILITY,          offsetof(Unit, conditions)
 Unit.ConditionHost,              config_parse_unit_condition_string, CONDITION_HOST,                offsetof(Unit, conditions)
 Unit.ConditionACPower,           config_parse_unit_condition_string, CONDITION_AC_POWER,            offsetof(Unit, conditions)
+Unit.ConditionUser,              config_parse_unit_condition_string, CONDITION_USER,                offsetof(Unit, conditions)
+Unit.ConditionGroup,             config_parse_unit_condition_string, CONDITION_GROUP,               offsetof(Unit, conditions)
 Unit.ConditionNull,              config_parse_unit_condition_null,   0,                             offsetof(Unit, conditions)
 Unit.AssertPathExists,           config_parse_unit_condition_path,   CONDITION_PATH_EXISTS,         offsetof(Unit, asserts)
 Unit.AssertPathExistsGlob,       config_parse_unit_condition_path,   CONDITION_PATH_EXISTS_GLOB,    offsetof(Unit, asserts)
@@ -225,6 +242,8 @@ Unit.AssertSecurity,             config_parse_unit_condition_string, CONDITION_S
 Unit.AssertCapability,           config_parse_unit_condition_string, CONDITION_CAPABILITY,          offsetof(Unit, asserts)
 Unit.AssertHost,                 config_parse_unit_condition_string, CONDITION_HOST,                offsetof(Unit, asserts)
 Unit.AssertACPower,              config_parse_unit_condition_string, CONDITION_AC_POWER,            offsetof(Unit, asserts)
+Unit.AssertUser,                 config_parse_unit_condition_string, CONDITION_USER,                offsetof(Unit, asserts)
+Unit.AssertGroup,                config_parse_unit_condition_string, CONDITION_GROUP,               offsetof(Unit, asserts)
 Unit.AssertNull,                 config_parse_unit_condition_null,   0,                             offsetof(Unit, asserts)
 m4_dnl
 Service.PIDFile,                 config_parse_unit_path_printf,      0,                             offsetof(Service, pid_file)
@@ -243,9 +262,9 @@ Service.WatchdogSec,             config_parse_sec,                   0,
 m4_dnl The following three only exist for compatibility, they moved into Unit, see above
 Service.StartLimitInterval,      config_parse_sec,                   0,                             offsetof(Unit, start_limit.interval)
 Service.StartLimitBurst,         config_parse_unsigned,              0,                             offsetof(Unit, start_limit.burst)
-Service.StartLimitAction,        config_parse_failure_action,        0,                             offsetof(Unit, start_limit_action)
-Service.RebootArgument,          config_parse_string,                0,                             offsetof(Unit, reboot_arg)
-Service.FailureAction,           config_parse_failure_action,        0,                             offsetof(Service, failure_action)
+Service.StartLimitAction,        config_parse_emergency_action,      0,                             offsetof(Unit, start_limit_action)
+Service.RebootArgument,          config_parse_unit_path_printf,      0,                             offsetof(Unit, reboot_arg)
+Service.FailureAction,           config_parse_emergency_action,      0,                             offsetof(Service, emergency_action)
 Service.Type,                    config_parse_service_type,          0,                             offsetof(Service, type)
 Service.Restart,                 config_parse_service_restart,       0,                             offsetof(Service, restart)
 Service.PermissionsStartOnly,    config_parse_bool,                  0,                             offsetof(Service, permissions_start_only)
@@ -262,8 +281,8 @@ Service.FileDescriptorStoreMax,  config_parse_unsigned,              0,
 Service.NotifyAccess,            config_parse_notify_access,         0,                             offsetof(Service, notify_access)
 Service.Sockets,                 config_parse_service_sockets,       0,                             0
 Service.BusPolicy,               config_parse_warn_compat,           DISABLED_LEGACY,               0
-Service.USBFunctionDescriptors,  config_parse_path,                  0,                             offsetof(Service, usb_function_descriptors)
-Service.USBFunctionStrings,      config_parse_path,                  0,                             offsetof(Service, usb_function_strings)
+Service.USBFunctionDescriptors,  config_parse_unit_path_printf,      0,                             offsetof(Service, usb_function_descriptors)
+Service.USBFunctionStrings,      config_parse_unit_path_printf,      0,                             offsetof(Service, usb_function_strings)
 EXEC_CONTEXT_CONFIG_ITEMS(Service)m4_dnl
 CGROUP_CONTEXT_CONFIG_ITEMS(Service)m4_dnl
 KILL_CONTEXT_CONFIG_ITEMS(Service)m4_dnl
@@ -284,14 +303,15 @@ Socket.ExecStartPre,             config_parse_exec,                  SOCKET_EXEC
 Socket.ExecStartPost,            config_parse_exec,                  SOCKET_EXEC_START_POST,        offsetof(Socket, exec_command)
 Socket.ExecStopPre,              config_parse_exec,                  SOCKET_EXEC_STOP_PRE,          offsetof(Socket, exec_command)
 Socket.ExecStopPost,             config_parse_exec,                  SOCKET_EXEC_STOP_POST,         offsetof(Socket, exec_command)
-Socket.TimeoutSec,               config_parse_sec,                   0,                             offsetof(Socket, timeout_usec)
-Socket.SocketUser,               config_parse_unit_string_printf,    0,                             offsetof(Socket, user)
-Socket.SocketGroup,              config_parse_unit_string_printf,    0,                             offsetof(Socket, group)
+Socket.TimeoutSec,               config_parse_sec_fix_0,             0,                             offsetof(Socket, timeout_usec)
+Socket.SocketUser,               config_parse_user_group,            0,                             offsetof(Socket, user)
+Socket.SocketGroup,              config_parse_user_group,            0,                             offsetof(Socket, group)
 Socket.SocketMode,               config_parse_mode,                  0,                             offsetof(Socket, socket_mode)
 Socket.DirectoryMode,            config_parse_mode,                  0,                             offsetof(Socket, directory_mode)
 Socket.Accept,                   config_parse_bool,                  0,                             offsetof(Socket, accept)
 Socket.Writable,                 config_parse_bool,                  0,                             offsetof(Socket, writable)
 Socket.MaxConnections,           config_parse_unsigned,              0,                             offsetof(Socket, max_connections)
+Socket.MaxConnectionsPerSource,  config_parse_unsigned,              0,                             offsetof(Socket, max_connections_per_source)
 Socket.KeepAlive,                config_parse_bool,                  0,                             offsetof(Socket, keep_alive)
 Socket.KeepAliveTimeSec,         config_parse_sec,                   0,                             offsetof(Socket, keep_alive_time)
 Socket.KeepAliveIntervalSec,     config_parse_sec,                   0,                             offsetof(Socket, keep_alive_interval)
@@ -321,9 +341,9 @@ Socket.Service,                  config_parse_socket_service,        0,
 Socket.TriggerLimitIntervalSec,  config_parse_sec,                   0,                             offsetof(Socket, trigger_limit.interval)
 Socket.TriggerLimitBurst,        config_parse_unsigned,              0,                             offsetof(Socket, trigger_limit.burst)
 m4_ifdef(`HAVE_SMACK',
-`Socket.SmackLabel,              config_parse_string,                0,                             offsetof(Socket, smack)
-Socket.SmackLabelIPIn,           config_parse_string,                0,                             offsetof(Socket, smack_ip_in)
-Socket.SmackLabelIPOut,          config_parse_string,                0,                             offsetof(Socket, smack_ip_out)',
+`Socket.SmackLabel,              config_parse_unit_string_printf,    0,                             offsetof(Socket, smack)
+Socket.SmackLabelIPIn,           config_parse_unit_string_printf,    0,                             offsetof(Socket, smack_ip_in)
+Socket.SmackLabelIPOut,          config_parse_unit_string_printf,    0,                             offsetof(Socket, smack_ip_out)',
 `Socket.SmackLabel,              config_parse_warn_compat,           DISABLED_CONFIGURATION,        0
 Socket.SmackLabelIPIn,           config_parse_warn_compat,           DISABLED_CONFIGURATION,        0
 Socket.SmackLabelIPOut,          config_parse_warn_compat,           DISABLED_CONFIGURATION,        0')
@@ -343,25 +363,27 @@ BusName.AllowWorld,              config_parse_bus_policy_world,      0,
 BusName.SELinuxContext,          config_parse_exec_selinux_context,  0,                             0
 BusName.AcceptFileDescriptors,   config_parse_bool,                  0,                             offsetof(BusName, accept_fd)
 m4_dnl
-Mount.What,                      config_parse_string,                0,                             offsetof(Mount, parameters_fragment.what)
+Mount.What,                      config_parse_unit_string_printf,    0,                             offsetof(Mount, parameters_fragment.what)
 Mount.Where,                     config_parse_path,                  0,                             offsetof(Mount, where)
-Mount.Options,                   config_parse_string,                0,                             offsetof(Mount, parameters_fragment.options)
+Mount.Options,                   config_parse_unit_string_printf,    0,                             offsetof(Mount, parameters_fragment.options)
 Mount.Type,                      config_parse_string,                0,                             offsetof(Mount, parameters_fragment.fstype)
-Mount.TimeoutSec,                config_parse_sec,                   0,                             offsetof(Mount, timeout_usec)
+Mount.TimeoutSec,                config_parse_sec_fix_0,             0,                             offsetof(Mount, timeout_usec)
 Mount.DirectoryMode,             config_parse_mode,                  0,                             offsetof(Mount, directory_mode)
 Mount.SloppyOptions,             config_parse_bool,                  0,                             offsetof(Mount, sloppy_options)
+Mount.LazyUnmount,               config_parse_bool,                  0,                             offsetof(Mount, lazy_unmount)
+Mount.ForceUnmount,              config_parse_bool,                  0,                             offsetof(Mount, force_unmount)
 EXEC_CONTEXT_CONFIG_ITEMS(Mount)m4_dnl
 CGROUP_CONTEXT_CONFIG_ITEMS(Mount)m4_dnl
 KILL_CONTEXT_CONFIG_ITEMS(Mount)m4_dnl
 m4_dnl
 Automount.Where,                 config_parse_path,                  0,                             offsetof(Automount, where)
 Automount.DirectoryMode,         config_parse_mode,                  0,                             offsetof(Automount, directory_mode)
-Automount.TimeoutIdleSec,        config_parse_sec,                   0,                             offsetof(Automount, timeout_idle_usec)
+Automount.TimeoutIdleSec,        config_parse_sec_fix_0,             0,                             offsetof(Automount, timeout_idle_usec)
 m4_dnl
 Swap.What,                       config_parse_path,                  0,                             offsetof(Swap, parameters_fragment.what)
 Swap.Priority,                   config_parse_int,                   0,                             offsetof(Swap, parameters_fragment.priority)
-Swap.Options,                    config_parse_string,                0,                             offsetof(Swap, parameters_fragment.options)
-Swap.TimeoutSec,                 config_parse_sec,                   0,                             offsetof(Swap, timeout_usec)
+Swap.Options,                    config_parse_unit_string_printf,    0,                             offsetof(Swap, parameters_fragment.options)
+Swap.TimeoutSec,                 config_parse_sec_fix_0,             0,                             offsetof(Swap, timeout_usec)
 EXEC_CONTEXT_CONFIG_ITEMS(Swap)m4_dnl
 CGROUP_CONTEXT_CONFIG_ITEMS(Swap)m4_dnl
 KILL_CONTEXT_CONFIG_ITEMS(Swap)m4_dnl
index 35915be..8d01a0b 100644 (file)
@@ -49,6 +49,7 @@
 #include "load-fragment.h"
 #include "log.h"
 #include "missing.h"
+#include "mount-util.h"
 #include "parse-util.h"
 #include "path-util.h"
 #include "process-util.h"
@@ -64,6 +65,7 @@
 #include "unit-name.h"
 #include "unit-printf.h"
 #include "unit.h"
+#include "user-util.h"
 #include "utf8.h"
 #include "web-util.h"
 
@@ -240,6 +242,7 @@ int config_parse_unit_path_printf(
         _cleanup_free_ char *k = NULL;
         Unit *u = userdata;
         int r;
+        bool fatal = ltype;
 
         assert(filename);
         assert(lvalue);
@@ -248,8 +251,10 @@ int config_parse_unit_path_printf(
 
         r = unit_full_printf(u, rvalue, &k);
         if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers on %s, ignoring: %m", rvalue);
-                return 0;
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Failed to resolve unit specifiers on %s%s: %m",
+                           fatal ? "" : ", ignoring", rvalue);
+                return fatal ? -ENOEXEC : 0;
         }
 
         return config_parse_path(unit, filename, line, section, section_line, lvalue, ltype, k, data, userdata);
@@ -268,26 +273,33 @@ int config_parse_unit_path_strv_printf(
                 void *userdata) {
 
         char ***x = data;
-        const char *word, *state;
         Unit *u = userdata;
-        size_t l;
         int r;
+        const char *p;
 
         assert(filename);
         assert(lvalue);
         assert(rvalue);
         assert(u);
 
-        FOREACH_WORD_QUOTED(word, l, rvalue, state) {
-                _cleanup_free_ char *k = NULL;
-                char t[l+1];
+        for (p = rvalue;;) {
+                _cleanup_free_ char *word = NULL, *k = NULL;
 
-                memcpy(t, word, l);
-                t[l] = 0;
+                r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES);
+                if (r == 0)
+                        return 0;
+                if (r == -ENOMEM)
+                        return log_oom();
+                if (r < 0) {
+                        log_syntax(unit, LOG_WARNING, filename, line, r,
+                                   "Invalid syntax, ignoring: %s", rvalue);
+                        return 0;
+                }
 
-                r = unit_full_printf(u, t, &k);
+                r = unit_full_printf(u, word, &k);
                 if (r < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers on %s, ignoring: %m", t);
+                        log_syntax(unit, LOG_ERR, filename, line, r,
+                                   "Failed to resolve unit specifiers on \"%s\", ignoring: %m", word);
                         return 0;
                 }
 
@@ -297,7 +309,8 @@ int config_parse_unit_path_strv_printf(
                 }
 
                 if (!path_is_absolute(k)) {
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Symlink path %s is not absolute, ignoring: %m", k);
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Symlink path is not absolute: %s", k);
                         return 0;
                 }
 
@@ -306,13 +319,8 @@ int config_parse_unit_path_strv_printf(
                 r = strv_push(x, k);
                 if (r < 0)
                         return log_oom();
-
                 k = NULL;
         }
-        if (!isempty(state))
-                log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid syntax, ignoring.");
-
-        return 0;
 }
 
 int config_parse_socket_listen(const char *unit,
@@ -387,7 +395,9 @@ int config_parse_socket_listen(const char *unit,
 
                 r = socket_address_parse_and_warn(&p->address, k);
                 if (r < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse address value, ignoring: %s", rvalue);
+                        if (r != -EAFNOSUPPORT)
+                                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse address value, ignoring: %s", rvalue);
+
                         return 0;
                 }
 
@@ -490,16 +500,17 @@ int config_parse_socket_bind(const char *unit,
         return 0;
 }
 
-int config_parse_exec_nice(const char *unit,
-                           const char *filename,
-                           unsigned line,
-                           const char *section,
-                           unsigned section_line,
-                           const char *lvalue,
-                           int ltype,
-                           const char *rvalue,
-                           void *data,
-                           void *userdata) {
+int config_parse_exec_nice(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
 
         ExecContext *c = data;
         int priority, r;
@@ -509,14 +520,13 @@ int config_parse_exec_nice(const char *unit,
         assert(rvalue);
         assert(data);
 
-        r = safe_atoi(rvalue, &priority);
+        r = parse_nice(rvalue, &priority);
         if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse nice priority, ignoring: %s", rvalue);
-                return 0;
-        }
+                if (r == -ERANGE)
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Nice priority out of range, ignoring: %s", rvalue);
+                else
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse nice priority, ignoring: %s", rvalue);
 
-        if (priority < PRIO_MIN || priority >= PRIO_MAX) {
-                log_syntax(unit, LOG_ERR, filename, line, 0, "Nice priority out of range, ignoring: %s", rvalue);
                 return 0;
         }
 
@@ -575,6 +585,7 @@ int config_parse_exec(
                 void *userdata) {
 
         ExecCommand **e = data;
+        Unit *u = userdata;
         const char *p;
         bool semicolon;
         int r;
@@ -600,22 +611,21 @@ int config_parse_exec(
                 _cleanup_free_ ExecCommand *nce = NULL;
                 _cleanup_strv_free_ char **n = NULL;
                 size_t nlen = 0, nbufsize = 0;
-                char *f;
-                int i;
+                const char *f;
 
                 semicolon = false;
 
-                r = extract_first_word_and_warn(&p, &firstword, WHITESPACE, EXTRACT_QUOTES|EXTRACT_CUNESCAPE, unit, filename, line, rvalue);
+                r = extract_first_word_and_warn(&p, &firstword, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE, unit, filename, line, rvalue);
                 if (r <= 0)
                         return 0;
 
                 f = firstword;
-                for (i = 0; i < 3; i++) {
+                for (;;) {
                         /* We accept an absolute path as first argument.
                          * If it's prefixed with - and the path doesn't exist,
                          * we ignore it instead of erroring out;
                          * if it's prefixed with @, we allow overriding of argv[0];
-                         * and if it's prefixed with !, it will be run with full privileges */
+                         * and if it's prefixed with +, it will be run with full privileges */
                         if (*f == '-' && !ignore)
                                 ignore = true;
                         else if (*f == '@' && !separate_argv0)
@@ -627,47 +637,57 @@ int config_parse_exec(
                         f++;
                 }
 
-                if (isempty(f)) {
+                r = unit_full_printf(u, f, &path);
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r,
+                                   "Failed to resolve unit specifiers on %s%s: %m",
+                                   f, ignore ? ", ignoring" : "");
+                        return ignore ? 0 : -ENOEXEC;
+                }
+
+                if (isempty(path)) {
                         /* First word is either "-" or "@" with no command. */
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Empty path in command line, ignoring: \"%s\"", rvalue);
-                        return 0;
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Empty path in command line%s: \"%s\"",
+                                   ignore ? ", ignoring" : "", rvalue);
+                        return ignore ? 0 : -ENOEXEC;
                 }
-                if (!string_is_safe(f)) {
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Executable path contains special characters, ignoring: %s", rvalue);
-                        return 0;
+                if (!string_is_safe(path)) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Executable path contains special characters%s: %s",
+                                   ignore ? ", ignoring" : "", rvalue);
+                        return ignore ? 0 : -ENOEXEC;
                 }
-                if (!path_is_absolute(f)) {
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Executable path is not absolute, ignoring: %s", rvalue);
-                        return 0;
+                if (!path_is_absolute(path)) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Executable path is not absolute%s: %s",
+                                   ignore ? ", ignoring" : "", rvalue);
+                        return ignore ? 0 : -ENOEXEC;
                 }
-                if (endswith(f, "/")) {
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Executable path specifies a directory, ignoring: %s", rvalue);
-                        return 0;
-                }
-
-                if (f == firstword) {
-                        path = firstword;
-                        firstword = NULL;
-                } else {
-                        path = strdup(f);
-                        if (!path)
-                                return log_oom();
+                if (endswith(path, "/")) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Executable path specifies a directory%s: %s",
+                                   ignore ? ", ignoring" : "", rvalue);
+                        return ignore ? 0 : -ENOEXEC;
                 }
 
                 if (!separate_argv0) {
+                        char *w = NULL;
+
                         if (!GREEDY_REALLOC(n, nbufsize, nlen + 2))
                                 return log_oom();
-                        f = strdup(path);
-                        if (!f)
+
+                        w = strdup(path);
+                        if (!w)
                                 return log_oom();
-                        n[nlen++] = f;
+                        n[nlen++] = w;
                         n[nlen] = NULL;
                 }
 
                 path_kill_slashes(path);
 
                 while (!isempty(p)) {
-                        _cleanup_free_ char *word = NULL;
+                        _cleanup_free_ char *word = NULL, *resolved = NULL;
 
                         /* Check explicitly for an unquoted semicolon as
                          * command separator token.  */
@@ -678,38 +698,51 @@ int config_parse_exec(
                                 break;
                         }
 
-                        /* Check for \; explicitly, to not confuse it with \\;
-                         * or "\;" or "\\;" etc.  extract_first_word would
-                         * return the same for all of those.  */
+                        /* Check for \; explicitly, to not confuse it with \\; or "\;" or "\\;" etc.
+                         * extract_first_word() would return the same for all of those.  */
                         if (p[0] == '\\' && p[1] == ';' && (!p[2] || strchr(WHITESPACE, p[2]))) {
+                                char *w;
+
                                 p += 2;
                                 p += strspn(p, WHITESPACE);
+
                                 if (!GREEDY_REALLOC(n, nbufsize, nlen + 2))
                                         return log_oom();
-                                f = strdup(";");
-                                if (!f)
+
+                                w = strdup(";");
+                                if (!w)
                                         return log_oom();
-                                n[nlen++] = f;
+                                n[nlen++] = w;
                                 n[nlen] = NULL;
                                 continue;
                         }
 
-                        r = extract_first_word_and_warn(&p, &word, WHITESPACE, EXTRACT_QUOTES|EXTRACT_CUNESCAPE, unit, filename, line, rvalue);
+                        r = extract_first_word_and_warn(&p, &word, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE, unit, filename, line, rvalue);
                         if (r == 0)
                                 break;
-                        else if (r < 0)
-                                return 0;
+                        if (r < 0)
+                                return ignore ? 0 : -ENOEXEC;
+
+                        r = unit_full_printf(u, word, &resolved);
+                        if (r < 0) {
+                                log_syntax(unit, LOG_ERR, filename, line, r,
+                                           "Failed to resolve unit specifiers on %s%s: %m",
+                                           word, ignore ? ", ignoring" : "");
+                                return ignore ? 0 : -ENOEXEC;
+                        }
 
                         if (!GREEDY_REALLOC(n, nbufsize, nlen + 2))
                                 return log_oom();
-                        n[nlen++] = word;
+                        n[nlen++] = resolved;
                         n[nlen] = NULL;
-                        word = NULL;
+                        resolved = NULL;
                 }
 
                 if (!n || !n[0]) {
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Empty executable name or zeroeth argument, ignoring: %s", rvalue);
-                        return 0;
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Empty executable name or zeroeth argument%s: %s",
+                                   ignore ? ", ignoring" : "", rvalue);
+                        return ignore ? 0 : -ENOEXEC;
                 }
 
                 nce = new0(ExecCommand, 1);
@@ -775,8 +808,104 @@ int config_parse_socket_bindtodevice(
         return 0;
 }
 
-DEFINE_CONFIG_PARSE_ENUM(config_parse_output, exec_output, ExecOutput, "Failed to parse output specifier");
-DEFINE_CONFIG_PARSE_ENUM(config_parse_input, exec_input, ExecInput, "Failed to parse input specifier");
+DEFINE_CONFIG_PARSE_ENUM(config_parse_input, exec_input, ExecInput, "Failed to parse input literal specifier");
+DEFINE_CONFIG_PARSE_ENUM(config_parse_output, exec_output, ExecOutput, "Failed to parse output literal specifier");
+
+int config_parse_exec_input(const char *unit,
+                            const char *filename,
+                            unsigned line,
+                            const char *section,
+                            unsigned section_line,
+                            const char *lvalue,
+                            int ltype,
+                            const char *rvalue,
+                            void *data,
+                            void *userdata) {
+        ExecContext *c = data;
+        const char *name;
+        int r;
+
+        assert(data);
+        assert(filename);
+        assert(line);
+        assert(rvalue);
+
+        name = startswith(rvalue, "fd:");
+        if (name) {
+                /* Strip prefix and validate fd name */
+                if (!fdname_is_valid(name)) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid file descriptor name, ignoring: %s", name);
+                        return 0;
+                }
+                c->std_input = EXEC_INPUT_NAMED_FD;
+                r = free_and_strdup(&c->stdio_fdname[STDIN_FILENO], name);
+                if (r < 0)
+                        log_oom();
+                return r;
+        } else {
+                ExecInput ei = exec_input_from_string(rvalue);
+                if (ei == _EXEC_INPUT_INVALID)
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse input specifier, ignoring: %s", rvalue);
+                else
+                        c->std_input = ei;
+                return 0;
+        }
+}
+
+int config_parse_exec_output(const char *unit,
+                             const char *filename,
+                             unsigned line,
+                             const char *section,
+                             unsigned section_line,
+                             const char *lvalue,
+                             int ltype,
+                             const char *rvalue,
+                             void *data,
+                             void *userdata) {
+        ExecContext *c = data;
+        ExecOutput eo;
+        const char *name;
+        int r;
+
+        assert(data);
+        assert(filename);
+        assert(line);
+        assert(lvalue);
+        assert(rvalue);
+
+        name = startswith(rvalue, "fd:");
+        if (name) {
+                /* Strip prefix and validate fd name */
+                if (!fdname_is_valid(name)) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid file descriptor name, ignoring: %s", name);
+                        return 0;
+                }
+                eo = EXEC_OUTPUT_NAMED_FD;
+        } else {
+                eo = exec_output_from_string(rvalue);
+                if (eo == _EXEC_OUTPUT_INVALID) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse output specifier, ignoring: %s", rvalue);
+                        return 0;
+                }
+        }
+
+        if (streq(lvalue, "StandardOutput")) {
+                c->std_output = eo;
+                r = free_and_strdup(&c->stdio_fdname[STDOUT_FILENO], name);
+                if (r < 0)
+                        log_oom();
+                return r;
+        } else if (streq(lvalue, "StandardError")) {
+                c->std_error = eo;
+                r = free_and_strdup(&c->stdio_fdname[STDERR_FILENO], name);
+                if (r < 0)
+                        log_oom();
+                return r;
+        } else {
+                log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse output property, ignoring: %s", lvalue);
+                return 0;
+        }
+}
 
 int config_parse_exec_io_class(const char *unit,
                                const char *filename,
@@ -828,8 +957,8 @@ int config_parse_exec_io_priority(const char *unit,
         assert(rvalue);
         assert(data);
 
-        r = safe_atoi(rvalue, &i);
-        if (r < 0 || i < 0 || i >= IOPRIO_BE_NR) {
+        r = ioprio_parse_priority(rvalue, &i);
+        if (r < 0) {
                 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse IO priority, ignoring: %s", rvalue);
                 return 0;
         }
@@ -997,8 +1126,8 @@ int config_parse_exec_secure_bits(const char *unit,
                                   void *userdata) {
 
         ExecContext *c = data;
-        size_t l;
-        const char *word, *state;
+        const char *p;
+        int r;
 
         assert(filename);
         assert(lvalue);
@@ -1011,28 +1140,38 @@ int config_parse_exec_secure_bits(const char *unit,
                 return 0;
         }
 
-        FOREACH_WORD_QUOTED(word, l, rvalue, state) {
-                if (first_word(word, "keep-caps"))
+        for (p = rvalue;;) {
+                _cleanup_free_ char *word = NULL;
+
+                r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES);
+                if (r == 0)
+                        return 0;
+                if (r == -ENOMEM)
+                        return log_oom();
+                if (r < 0) {
+                        log_syntax(unit, LOG_WARNING, filename, line, r,
+                                   "Invalid syntax, ignoring: %s", rvalue);
+                        return 0;
+                }
+
+                if (streq(word, "keep-caps"))
                         c->secure_bits |= 1<<SECURE_KEEP_CAPS;
-                else if (first_word(word, "keep-caps-locked"))
+                else if (streq(word, "keep-caps-locked"))
                         c->secure_bits |= 1<<SECURE_KEEP_CAPS_LOCKED;
-                else if (first_word(word, "no-setuid-fixup"))
+                else if (streq(word, "no-setuid-fixup"))
                         c->secure_bits |= 1<<SECURE_NO_SETUID_FIXUP;
-                else if (first_word(word, "no-setuid-fixup-locked"))
+                else if (streq(word, "no-setuid-fixup-locked"))
                         c->secure_bits |= 1<<SECURE_NO_SETUID_FIXUP_LOCKED;
-                else if (first_word(word, "noroot"))
+                else if (streq(word, "noroot"))
                         c->secure_bits |= 1<<SECURE_NOROOT;
-                else if (first_word(word, "noroot-locked"))
+                else if (streq(word, "noroot-locked"))
                         c->secure_bits |= 1<<SECURE_NOROOT_LOCKED;
                 else {
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse secure bits, ignoring: %s", rvalue);
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Failed to parse secure bit \"%s\", ignoring.", word);
                         return 0;
                 }
         }
-        if (!isempty(state))
-                log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid syntax, garbage at the end, ignoring.");
-
-        return 0;
 }
 
 int config_parse_capability_set(
@@ -1179,38 +1318,30 @@ int config_parse_sysv_priority(const char *unit,
 DEFINE_CONFIG_PARSE_ENUM(config_parse_exec_utmp_mode, exec_utmp_mode, ExecUtmpMode, "Failed to parse utmp mode");
 DEFINE_CONFIG_PARSE_ENUM(config_parse_kill_mode, kill_mode, KillMode, "Failed to parse kill mode");
 
-int config_parse_exec_mount_flags(const char *unit,
-                                  const char *filename,
-                                  unsigned line,
-                                  const char *section,
-                                  unsigned section_line,
-                                  const char *lvalue,
-                                  int ltype,
-                                  const char *rvalue,
-                                  void *data,
-                                  void *userdata) {
+int config_parse_exec_mount_flags(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
 
 
-        unsigned long flags = 0;
         ExecContext *c = data;
+        int r;
 
         assert(filename);
         assert(lvalue);
         assert(rvalue);
         assert(data);
 
-        if (streq(rvalue, "shared"))
-                flags = MS_SHARED;
-        else if (streq(rvalue, "slave"))
-                flags = MS_SLAVE;
-        else if (streq(rvalue, "private"))
-                flags = MS_PRIVATE;
-        else {
+        r = mount_propagation_flags_from_string(rvalue, &c->mount_flags);
+        if (r < 0)
                 log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse mount flag %s, ignoring.", rvalue);
-                return 0;
-        }
-
-        c->mount_flags = flags;
 
         return 0;
 }
@@ -1250,10 +1381,12 @@ int config_parse_exec_selinux_context(
         } else
                 ignore = false;
 
-        r = unit_name_printf(u, rvalue, &k);
+        r = unit_full_printf(u, rvalue, &k);
         if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers, ignoring: %m");
-                return 0;
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Failed to resolve specifiers%s: %m",
+                           ignore ? ", ignoring" : "");
+                return ignore ? 0 : -ENOEXEC;
         }
 
         free(c->selinux_context);
@@ -1298,10 +1431,12 @@ int config_parse_exec_apparmor_profile(
         } else
                 ignore = false;
 
-        r = unit_name_printf(u, rvalue, &k);
+        r = unit_full_printf(u, rvalue, &k);
         if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers, ignoring: %m");
-                return 0;
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Failed to resolve specifiers%s: %m",
+                           ignore ? ", ignoring" : "");
+                return ignore ? 0 : -ENOEXEC;
         }
 
         free(c->apparmor_profile);
@@ -1346,10 +1481,12 @@ int config_parse_exec_smack_process_label(
         } else
                 ignore = false;
 
-        r = unit_name_printf(u, rvalue, &k);
+        r = unit_full_printf(u, rvalue, &k);
         if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers, ignoring: %m");
-                return 0;
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Failed to resolve specifiers%s: %m",
+                           ignore ? ", ignoring" : "");
+                return ignore ? 0 : -ENOEXEC;
         }
 
         free(c->smack_process_label);
@@ -1371,10 +1508,13 @@ int config_parse_timer(const char *unit,
                        void *userdata) {
 
         Timer *t = data;
-        usec_t u = 0;
+        usec_t usec = 0;
         TimerValue *v;
         TimerBase b;
         CalendarSpec *c = NULL;
+        Unit *u = userdata;
+        _cleanup_free_ char *k = NULL;
+        int r;
 
         assert(filename);
         assert(lvalue);
@@ -1393,14 +1533,20 @@ int config_parse_timer(const char *unit,
                 return 0;
         }
 
+        r = unit_full_printf(u, rvalue, &k);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", rvalue);
+                return 0;
+        }
+
         if (b == TIMER_CALENDAR) {
-                if (calendar_spec_from_string(rvalue, &c) < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse calendar specification, ignoring: %s", rvalue);
+                if (calendar_spec_from_string(k, &c) < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse calendar specification, ignoring: %s", k);
                         return 0;
                 }
         } else {
-                if (parse_sec(rvalue, &u) < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse timer value, ignoring: %s", rvalue);
+                if (parse_sec(k, &usec) < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse timer value, ignoring: %s", k);
                         return 0;
                 }
         }
@@ -1412,7 +1558,7 @@ int config_parse_timer(const char *unit,
         }
 
         v->base = b;
-        v->value = u;
+        v->value = usec;
         v->calendar_spec = c;
 
         LIST_PREPEND(value, t->values, v);
@@ -1558,19 +1704,19 @@ int config_parse_socket_service(
 
         r = unit_name_printf(UNIT(s), rvalue, &p);
         if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers, ignoring: %s", rvalue);
-                return 0;
+                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers: %s", rvalue);
+                return -ENOEXEC;
         }
 
         if (!endswith(p, ".service")) {
-                log_syntax(unit, LOG_ERR, filename, line, 0, "Unit must be of type service, ignoring: %s", rvalue);
-                return 0;
+                log_syntax(unit, LOG_ERR, filename, line, 0, "Unit must be of type service: %s", rvalue);
+                return -ENOEXEC;
         }
 
         r = manager_load_unit(UNIT(s)->manager, p, NULL, &error, &x);
         if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to load unit %s, ignoring: %s", rvalue, bus_error_message(&error, r));
-                return 0;
+                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to load unit %s: %s", rvalue, bus_error_message(&error, r));
+                return -ENOEXEC;
         }
 
         unit_ref_set(&s->service, x);
@@ -1604,7 +1750,7 @@ int config_parse_fdname(
                 return 0;
         }
 
-        r = unit_name_printf(UNIT(s), rvalue, &p);
+        r = unit_full_printf(UNIT(s), rvalue, &p);
         if (r < 0) {
                 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers, ignoring: %s", rvalue);
                 return 0;
@@ -1615,11 +1761,7 @@ int config_parse_fdname(
                 return 0;
         }
 
-        free(s->fdname);
-        s->fdname = p;
-        p = NULL;
-
-        return 0;
+        return free_and_replace(s->fdname, p);
 }
 
 int config_parse_service_sockets(
@@ -1785,14 +1927,128 @@ int config_parse_sec_fix_0(
          * compatibility with older versions of systemd where 0 instead of infinity was used as indicator to turn off a
          * timeout. */
 
-        r = parse_sec(rvalue, usec);
+        r = parse_sec_fix_0(rvalue, usec);
         if (r < 0) {
                 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse %s= parameter, ignoring: %s", lvalue, rvalue);
                 return 0;
         }
 
-        if (*usec <= 0)
-                *usec = USEC_INFINITY;
+        return 0;
+}
+
+int config_parse_user_group(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        char **user = data, *n;
+        Unit *u = userdata;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(u);
+
+        if (isempty(rvalue))
+                n = NULL;
+        else {
+                _cleanup_free_ char *k = NULL;
+
+                r = unit_full_printf(u, rvalue, &k);
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s: %m", rvalue);
+                        return -ENOEXEC;
+                }
+
+                if (!valid_user_group_name_or_id(k)) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid user/group name or numeric ID: %s", k);
+                        return -ENOEXEC;
+                }
+
+                n = k;
+                k = NULL;
+        }
+
+        free(*user);
+        *user = n;
+
+        return 0;
+}
+
+int config_parse_user_group_strv(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        char ***users = data;
+        Unit *u = userdata;
+        const char *p;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(u);
+
+        if (isempty(rvalue)) {
+                char **empty;
+
+                empty = new0(char*, 1);
+                if (!empty)
+                        return log_oom();
+
+                strv_free(*users);
+                *users = empty;
+
+                return 0;
+        }
+
+        p = rvalue;
+        for (;;) {
+                _cleanup_free_ char *word = NULL, *k = NULL;
+
+                r = extract_first_word(&p, &word, NULL, 0);
+                if (r == 0)
+                        break;
+                if (r == -ENOMEM)
+                        return log_oom();
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Invalid syntax: %s", rvalue);
+                        return -ENOEXEC;
+                }
+
+                r = unit_full_printf(u, word, &k);
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s: %m", word);
+                        return -ENOEXEC;
+                }
+
+                if (!valid_user_group_name_or_id(k)) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid user/group name or numeric ID: %s", k);
+                        return -ENOEXEC;
+                }
+
+                r = strv_push(users, k);
+                if (r < 0)
+                        return log_oom();
+
+                k = NULL;
+        }
 
         return 0;
 }
@@ -1943,27 +2199,28 @@ int config_parse_working_directory(
 
                 r = unit_full_printf(u, rvalue, &k);
                 if (r < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in working directory path '%s', ignoring: %m", rvalue);
-                        return 0;
+                        log_syntax(unit, LOG_ERR, filename, line, r,
+                                   "Failed to resolve unit specifiers in working directory path '%s'%s: %m",
+                                   rvalue, missing_ok ? ", ignoring" : "");
+                        return missing_ok ? 0 : -ENOEXEC;
                 }
 
                 path_kill_slashes(k);
 
                 if (!utf8_is_valid(k)) {
                         log_syntax_invalid_utf8(unit, LOG_ERR, filename, line, rvalue);
-                        return 0;
+                        return missing_ok ? 0 : -ENOEXEC;
                 }
 
                 if (!path_is_absolute(k)) {
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Working directory path '%s' is not absolute, ignoring.", rvalue);
-                        return 0;
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Working directory path '%s' is not absolute%s.",
+                                   rvalue, missing_ok ? ", ignoring" : "");
+                        return missing_ok ? 0 : -ENOEXEC;
                 }
 
-                free(c->working_directory);
-                c->working_directory = k;
-                k = NULL;
-
                 c->working_directory_home = false;
+                free_and_replace(c->working_directory, k);
         }
 
         c->working_directory_missing_ok = missing_ok;
@@ -2027,10 +2284,8 @@ int config_parse_environ(const char *unit,
                          void *userdata) {
 
         Unit *u = userdata;
-        char*** env = data;
-        const char *word, *state;
-        size_t l;
-        _cleanup_free_ char *k = NULL;
+        char ***env = data;
+        const char *p;
         int r;
 
         assert(filename);
@@ -2044,46 +2299,43 @@ int config_parse_environ(const char *unit,
                 return 0;
         }
 
-        if (u) {
-                r = unit_full_printf(u, rvalue, &k);
+        for (p = rvalue;; ) {
+                _cleanup_free_ char *word = NULL, *k = NULL;
+
+                r = extract_first_word(&p, &word, NULL, EXTRACT_CUNESCAPE|EXTRACT_QUOTES);
+                if (r == 0)
+                        return 0;
+                if (r == -ENOMEM)
+                        return log_oom();
                 if (r < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers, ignoring: %s", rvalue);
+                        log_syntax(unit, LOG_WARNING, filename, line, r,
+                                   "Invalid syntax, ignoring: %s", rvalue);
                         return 0;
                 }
-        }
-
-        if (!k) {
-                k = strdup(rvalue);
-                if (!k)
-                        return log_oom();
-        }
 
-        FOREACH_WORD_QUOTED(word, l, k, state) {
-                _cleanup_free_ char *n = NULL;
-                char **x;
-
-                r = cunescape_length(word, l, 0, &n);
-                if (r < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, r, "Couldn't unescape assignment, ignoring: %s", rvalue);
-                        continue;
+                if (u) {
+                        r = unit_full_printf(u, word, &k);
+                        if (r < 0) {
+                                log_syntax(unit, LOG_ERR, filename, line, r,
+                                           "Failed to resolve specifiers, ignoring: %s", k);
+                                continue;
+                        }
+                } else {
+                        k = word;
+                        word = NULL;
                 }
 
-                if (!env_assignment_is_valid(n)) {
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid environment assignment, ignoring: %s", rvalue);
+                if (!env_assignment_is_valid(k)) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Invalid environment assignment, ignoring: %s", k);
                         continue;
                 }
 
-                x = strv_env_set(*env, n);
-                if (!x)
+                r = strv_env_replace(env, k);
+                if (r < 0)
                         return log_oom();
-
-                strv_free(*env);
-                *env = x;
+                k = NULL;
         }
-        if (!isempty(state))
-                log_syntax(unit, LOG_ERR, filename, line, 0, "Trailing garbage, ignoring.");
-
-        return 0;
 }
 
 int config_parse_pass_environ(const char *unit,
@@ -2117,7 +2369,7 @@ int config_parse_pass_environ(const char *unit,
         for (;;) {
                 _cleanup_free_ char *word = NULL;
 
-                r = extract_first_word(&rvalue, &word, WHITESPACE, EXTRACT_QUOTES);
+                r = extract_first_word(&rvalue, &word, NULL, EXTRACT_QUOTES);
                 if (r == 0)
                         break;
                 if (r == -ENOMEM)
@@ -2340,7 +2592,7 @@ int config_parse_unit_condition_null(
 }
 
 DEFINE_CONFIG_PARSE_ENUM(config_parse_notify_access, notify_access, NotifyAccess, "Failed to parse notify access specifier");
-DEFINE_CONFIG_PARSE_ENUM(config_parse_failure_action, failure_action, FailureAction, "Failed to parse failure action specifier");
+DEFINE_CONFIG_PARSE_ENUM(config_parse_emergency_action, emergency_action, EmergencyAction, "Failed to parse failure action specifier");
 
 int config_parse_unit_requires_mounts_for(
                 const char *unit,
@@ -2355,37 +2607,45 @@ int config_parse_unit_requires_mounts_for(
                 void *userdata) {
 
         Unit *u = userdata;
-        const char *word, *state;
-        size_t l;
+        const char *p;
+        int r;
 
         assert(filename);
         assert(lvalue);
         assert(rvalue);
         assert(data);
 
-        FOREACH_WORD_QUOTED(word, l, rvalue, state) {
-                int r;
-                _cleanup_free_ char *n;
+        for (p = rvalue;; ) {
+                _cleanup_free_ char *word = NULL, *resolved = NULL;
 
-                n = strndup(word, l);
-                if (!n)
+                r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES);
+                if (r == 0)
+                        return 0;
+                if (r == -ENOMEM)
                         return log_oom();
+                if (r < 0) {
+                        log_syntax(unit, LOG_WARNING, filename, line, r,
+                                   "Invalid syntax, ignoring: %s", rvalue);
+                        return 0;
+                }
 
-                if (!utf8_is_valid(n)) {
+                if (!utf8_is_valid(word)) {
                         log_syntax_invalid_utf8(unit, LOG_ERR, filename, line, rvalue);
                         continue;
                 }
 
-                r = unit_require_mounts_for(u, n);
+                r = unit_full_printf(u, word, &resolved);
                 if (r < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to add required mount for, ignoring: %s", rvalue);
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve unit name \"%s\", ignoring: %m", word);
                         continue;
                 }
-        }
-        if (!isempty(state))
-                log_syntax(unit, LOG_ERR, filename, line, 0, "Trailing garbage, ignoring.");
 
-        return 0;
+                r = unit_require_mounts_for(u, resolved);
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to add required mount \"%s\", ignoring: %m", resolved);
+                        continue;
+                }
+        }
 }
 
 int config_parse_documentation(const char *unit,
@@ -2435,6 +2695,7 @@ int config_parse_documentation(const char *unit,
 }
 
 #ifdef HAVE_SECCOMP
+
 static int syscall_filter_parse_one(
                 const char *unit,
                 const char *filename,
@@ -2445,27 +2706,29 @@ static int syscall_filter_parse_one(
                 bool warn) {
         int r;
 
-        if (*t == '@') {
-                const SystemCallFilterSet *set;
+        if (t[0] == '@') {
+                const SyscallFilterSet *set;
+                const char *i;
 
-                for (set = syscall_filter_sets; set->set_name; set++)
-                        if (streq(set->set_name, t)) {
-                                const char *sys;
+                set = syscall_filter_set_find(t);
+                if (!set) {
+                        if (warn)
+                                log_syntax(unit, LOG_WARNING, filename, line, 0, "Don't know system call group, ignoring: %s", t);
+                        return 0;
+                }
 
-                                NULSTR_FOREACH(sys, set->value) {
-                                        r = syscall_filter_parse_one(unit, filename, line, c, invert, sys, false);
-                                        if (r < 0)
-                                                return r;
-                                }
-                                break;
-                        }
+                NULSTR_FOREACH(i, set->value) {
+                        r = syscall_filter_parse_one(unit, filename, line, c, invert, i, false);
+                        if (r < 0)
+                                return r;
+                }
         } else {
                 int id;
 
                 id = seccomp_syscall_resolve_name(t);
                 if (id == __NR_SCMP_ERROR)  {
                         if (warn)
-                                log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse system call, ignoring: %s", t);
+                                log_syntax(unit, LOG_WARNING, filename, line, 0, "Failed to parse system call, ignoring: %s", t);
                         return 0;
                 }
 
@@ -2479,8 +2742,9 @@ static int syscall_filter_parse_one(
                         if (r < 0)
                                 return log_oom();
                 } else
-                        set_remove(c->syscall_filter, INT_TO_PTR(id + 1));
+                        (void) set_remove(c->syscall_filter, INT_TO_PTR(id + 1));
         }
+
         return 0;
 }
 
@@ -2499,8 +2763,7 @@ int config_parse_syscall_filter(
         ExecContext *c = data;
         Unit *u = userdata;
         bool invert = false;
-        const char *word, *state;
-        size_t l;
+        const char *p;
         int r;
 
         assert(filename);
@@ -2539,24 +2802,24 @@ int config_parse_syscall_filter(
                 }
         }
 
-        FOREACH_WORD_QUOTED(word, l, rvalue, state) {
-                _cleanup_free_ char *t = NULL;
+        p = rvalue;
+        for (;;) {
+                _cleanup_free_ char *word = NULL;
 
-                t = strndup(word, l);
-                if (!t)
+                r = extract_first_word(&p, &word, NULL, 0);
+                if (r == 0)
+                        break;
+                if (r == -ENOMEM)
                         return log_oom();
+                if (r < 0) {
+                        log_syntax(unit, LOG_WARNING, filename, line, r, "Invalid syntax, ignoring: %s", rvalue);
+                        break;
+                }
 
-                r = syscall_filter_parse_one(unit, filename, line, c, invert, t, true);
+                r = syscall_filter_parse_one(unit, filename, line, c, invert, word, true);
                 if (r < 0)
                         return r;
         }
-        if (!isempty(state))
-                log_syntax(unit, LOG_ERR, filename, line, 0, "Trailing garbage, ignoring.");
-
-        /* Turn on NNP, but only if it wasn't configured explicitly
-         * before, and only if we are in user mode. */
-        if (!c->no_new_privileges_set && MANAGER_IS_USER(u->manager))
-                c->no_new_privileges = true;
 
         return 0;
 }
@@ -2574,8 +2837,7 @@ int config_parse_syscall_archs(
                 void *userdata) {
 
         Set **archs = data;
-        const char *word, *state;
-        size_t l;
+        const char *p;
         int r;
 
         if (isempty(rvalue)) {
@@ -2587,30 +2849,32 @@ int config_parse_syscall_archs(
         if (r < 0)
                 return log_oom();
 
-        FOREACH_WORD_QUOTED(word, l, rvalue, state) {
-                _cleanup_free_ char *t = NULL;
+        for (p = rvalue;;) {
+                _cleanup_free_ char *word = NULL;
                 uint32_t a;
 
-                t = strndup(word, l);
-                if (!t)
+                r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES);
+                if (r == 0)
+                        return 0;
+                if (r == -ENOMEM)
                         return log_oom();
+                if (r < 0) {
+                        log_syntax(unit, LOG_WARNING, filename, line, r,
+                                   "Invalid syntax, ignoring: %s", rvalue);
+                        return 0;
+                }
 
-                r = seccomp_arch_from_string(t, &a);
+                r = seccomp_arch_from_string(word, &a);
                 if (r < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse system call architecture, ignoring: %s", t);
+                        log_syntax(unit, LOG_ERR, filename, line, r,
+                                   "Failed to parse system call architecture \"%s\", ignoring: %m", word);
                         continue;
                 }
 
                 r = set_put(*archs, UINT32_TO_PTR(a + 1));
-                if (r == 0)
-                        continue;
                 if (r < 0)
                         return log_oom();
         }
-        if (!isempty(state))
-                log_syntax(unit, LOG_ERR, filename, line, 0, "Trailing garbage, ignoring.");
-
-        return 0;
 }
 
 int config_parse_syscall_errno(
@@ -2662,8 +2926,7 @@ int config_parse_address_families(
 
         ExecContext *c = data;
         bool invert = false;
-        const char *word, *state;
-        size_t l;
+        const char *p;
         int r;
 
         assert(filename);
@@ -2690,34 +2953,84 @@ int config_parse_address_families(
                 c->address_families_whitelist = !invert;
         }
 
-        FOREACH_WORD_QUOTED(word, l, rvalue, state) {
-                _cleanup_free_ char *t = NULL;
+        for (p = rvalue;;) {
+                _cleanup_free_ char *word = NULL;
                 int af;
 
-                t = strndup(word, l);
-                if (!t)
+                r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES);
+                if (r == 0)
+                        return 0;
+                if (r == -ENOMEM)
                         return log_oom();
+                if (r < 0) {
+                        log_syntax(unit, LOG_WARNING, filename, line, r,
+                                   "Invalid syntax, ignoring: %s", rvalue);
+                        return 0;
+                }
 
-                af = af_from_name(t);
+                af = af_from_name(word);
                 if (af <= 0)  {
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse address family, ignoring: %s", t);
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Failed to parse address family \"%s\", ignoring: %m", word);
                         continue;
                 }
 
                 /* If we previously wanted to forbid an address family and now
-                 * we want to allow it, then remove it from the list
+                 * we want to allow it, then just remove it from the list.
                  */
                 if (!invert == c->address_families_whitelist)  {
                         r = set_put(c->address_families, INT_TO_PTR(af));
-                        if (r == 0)
-                                continue;
                         if (r < 0)
                                 return log_oom();
                 } else
                         set_remove(c->address_families, INT_TO_PTR(af));
         }
-        if (!isempty(state))
-                log_syntax(unit, LOG_ERR, filename, line, 0, "Trailing garbage, ignoring.");
+}
+
+int config_parse_restrict_namespaces(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        ExecContext *c = data;
+        bool invert = false;
+        int r;
+
+        if (isempty(rvalue)) {
+                /* Reset to the default. */
+                c->restrict_namespaces = NAMESPACE_FLAGS_ALL;
+                return 0;
+        }
+
+        if (rvalue[0] == '~') {
+                invert = true;
+                rvalue++;
+        }
+
+        r = parse_boolean(rvalue);
+        if (r > 0)
+                c->restrict_namespaces = 0;
+        else if (r == 0)
+                c->restrict_namespaces = NAMESPACE_FLAGS_ALL;
+        else {
+                /* Not a boolean argument, in this case it's a list of namespace types. */
+
+                r = namespace_flag_from_string_many(rvalue, &c->restrict_namespaces);
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse namespace type string, ignoring: %s", rvalue);
+                        return 0;
+                }
+        }
+
+        if (invert)
+                c->restrict_namespaces = (~c->restrict_namespaces) & NAMESPACE_FLAGS_ALL;
 
         return 0;
 }
@@ -2767,6 +3080,34 @@ int config_parse_unit_slice(
 
 DEFINE_CONFIG_PARSE_ENUM(config_parse_device_policy, cgroup_device_policy, CGroupDevicePolicy, "Failed to parse device policy");
 
+int config_parse_cpu_weight(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        uint64_t *weight = data;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+
+        r = cg_weight_parse(rvalue, weight);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "CPU weight '%s' invalid. Ignoring.", rvalue);
+                return 0;
+        }
+
+        return 0;
+}
+
 int config_parse_cpu_shares(
                 const char *unit,
                 const char *filename,
@@ -2819,7 +3160,7 @@ int config_parse_cpu_quota(
                 return 0;
         }
 
-        r = parse_percent(rvalue);
+        r = parse_percent_unbounded(rvalue);
         if (r <= 0) {
                 log_syntax(unit, LOG_ERR, filename, line, r, "CPU quota '%s' invalid. Ignoring.", rvalue);
                 return 0;
@@ -2869,8 +3210,12 @@ int config_parse_memory_limit(
                 c->memory_high = bytes;
         else if (streq(lvalue, "MemoryMax"))
                 c->memory_max = bytes;
-        else
+        else if (streq(lvalue, "MemorySwapMax"))
+                c->memory_swap_max = bytes;
+        else if (streq(lvalue, "MemoryLimit"))
                 c->memory_limit = bytes;
+        else
+                return -EINVAL;
 
         return 0;
 }
@@ -2887,30 +3232,36 @@ int config_parse_tasks_max(
                 void *data,
                 void *userdata) {
 
-        uint64_t *tasks_max = data, u;
+        uint64_t *tasks_max = data, v;
+        Unit *u = userdata;
         int r;
 
-        if (isempty(rvalue) || streq(rvalue, "infinity")) {
-                *tasks_max = (uint64_t) -1;
+        if (isempty(rvalue)) {
+                *tasks_max = u->manager->default_tasks_max;
+                return 0;
+        }
+
+        if (streq(rvalue, "infinity")) {
+                *tasks_max = CGROUP_LIMIT_MAX;
                 return 0;
         }
 
         r = parse_percent(rvalue);
         if (r < 0) {
-                r = safe_atou64(rvalue, &u);
+                r = safe_atou64(rvalue, &v);
                 if (r < 0) {
                         log_syntax(unit, LOG_ERR, filename, line, r, "Maximum tasks value '%s' invalid. Ignoring.", rvalue);
                         return 0;
                 }
         } else
-                u = system_tasks_max_scale(r, 100U);
+                v = system_tasks_max_scale(r, 100U);
 
-        if (u <= 0 || u >= UINT64_MAX) {
+        if (v <= 0 || v >= UINT64_MAX) {
                 log_syntax(unit, LOG_ERR, filename, line, 0, "Maximum tasks value '%s' out of range. Ignoring.", rvalue);
                 return 0;
         }
 
-        *tasks_max = u;
+        *tasks_max = v;
         return 0;
 }
 
@@ -2953,9 +3304,7 @@ int config_parse_device_allow(
         if (!path)
                 return log_oom();
 
-        if (!startswith(path, "/dev/") &&
-            !startswith(path, "block-") &&
-            !startswith(path, "char-")) {
+        if (!is_deviceallow_pattern(path)) {
                 log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid device node path '%s'. Ignoring.", path);
                 return 0;
         }
@@ -3400,8 +3749,7 @@ int config_parse_runtime_directory(
 
         char***rt = data;
         Unit *u = userdata;
-        const char *word, *state;
-        size_t l;
+        const char *p;
         int r;
 
         assert(filename);
@@ -3415,34 +3763,38 @@ int config_parse_runtime_directory(
                 return 0;
         }
 
-        FOREACH_WORD_QUOTED(word, l, rvalue, state) {
-                _cleanup_free_ char *t = NULL, *n = NULL;
+        for (p = rvalue;;) {
+                _cleanup_free_ char *word = NULL, *k = NULL;
 
-                t = strndup(word, l);
-                if (!t)
+                r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES);
+                if (r == 0)
+                        return 0;
+                if (r == -ENOMEM)
                         return log_oom();
+                if (r < 0) {
+                        log_syntax(unit, LOG_WARNING, filename, line, r,
+                                   "Invalid syntax, ignoring: %s", rvalue);
+                        return 0;
+                }
 
-                r = unit_name_printf(u, t, &n);
+                r = unit_full_printf(u, word, &k);
                 if (r < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers, ignoring: %m");
+                        log_syntax(unit, LOG_ERR, filename, line, r,
+                                   "Failed to resolve specifiers in \"%s\", ignoring: %m", word);
                         continue;
                 }
 
-                if (!filename_is_valid(n)) {
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Runtime directory is not valid, ignoring assignment: %s", rvalue);
+                if (!filename_is_valid(k)) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0,
+                                   "Runtime directory is not valid, ignoring assignment: %s", rvalue);
                         continue;
                 }
 
-                r = strv_push(rt, n);
+                r = strv_push(rt, k);
                 if (r < 0)
                         return log_oom();
-
-                n = NULL;
+                k = NULL;
         }
-        if (!isempty(state))
-                log_syntax(unit, LOG_ERR, filename, line, 0, "Trailing garbage, ignoring.");
-
-        return 0;
 }
 
 int config_parse_set_status(
@@ -3527,8 +3879,8 @@ int config_parse_namespace_path_strv(
                 void *data,
                 void *userdata) {
 
+        Unit *u = userdata;
         char*** sv = data;
-        const char *prev;
         const char *cur;
         int r;
 
@@ -3543,10 +3895,11 @@ int config_parse_namespace_path_strv(
                 return 0;
         }
 
-        prev = cur = rvalue;
+        cur = rvalue;
         for (;;) {
-                _cleanup_free_ char *word = NULL;
-                int offset;
+                _cleanup_free_ char *word = NULL, *resolved = NULL, *joined = NULL;
+                const char *w;
+                bool ignore_enoent = false, shall_prefix = false;
 
                 r = extract_first_word(&cur, &word, NULL, EXTRACT_QUOTES);
                 if (r == 0)
@@ -3554,31 +3907,189 @@ int config_parse_namespace_path_strv(
                 if (r == -ENOMEM)
                         return log_oom();
                 if (r < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, r, "Trailing garbage, ignoring: %s", prev);
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract first word, ignoring: %s", rvalue);
                         return 0;
                 }
 
                 if (!utf8_is_valid(word)) {
                         log_syntax_invalid_utf8(unit, LOG_ERR, filename, line, word);
-                        prev = cur;
                         continue;
                 }
 
-                offset = word[0] == '-';
-                if (!path_is_absolute(word + offset)) {
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Not an absolute path, ignoring: %s", word);
-                        prev = cur;
+                w = word;
+                if (startswith(w, "-")) {
+                        ignore_enoent = true;
+                        w++;
+                }
+                if (startswith(w, "+")) {
+                        shall_prefix = true;
+                        w++;
+                }
+
+                r = unit_full_printf(u, w, &resolved);
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to resolve specifiers in %s: %m", word);
+                        continue;
+                }
+
+                if (!path_is_absolute(resolved)) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "Not an absolute path, ignoring: %s", resolved);
                         continue;
                 }
 
-                path_kill_slashes(word + offset);
+                path_kill_slashes(resolved);
 
-                r = strv_push(sv, word);
+                joined = strjoin(ignore_enoent ? "-" : "",
+                                 shall_prefix ? "+" : "",
+                                 resolved);
+
+                r = strv_push(sv, joined);
                 if (r < 0)
                         return log_oom();
 
-                prev = cur;
-                word = NULL;
+                joined = NULL;
+        }
+
+        return 0;
+}
+
+int config_parse_bind_paths(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        ExecContext *c = data;
+        Unit *u = userdata;
+        const char *p;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        if (isempty(rvalue)) {
+                /* Empty assignment resets the list */
+                bind_mount_free_many(c->bind_mounts, c->n_bind_mounts);
+                c->bind_mounts = NULL;
+                c->n_bind_mounts = 0;
+                return 0;
+        }
+
+        p = rvalue;
+        for (;;) {
+                _cleanup_free_ char *source = NULL, *destination = NULL;
+                _cleanup_free_ char *sresolved = NULL, *dresolved = NULL;
+                char *s = NULL, *d = NULL;
+                bool rbind = true, ignore_enoent = false;
+
+                r = extract_first_word(&p, &source, ":" WHITESPACE, EXTRACT_QUOTES|EXTRACT_DONT_COALESCE_SEPARATORS);
+                if (r == 0)
+                        break;
+                if (r == -ENOMEM)
+                        return log_oom();
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse %s: %s", lvalue, rvalue);
+                        return 0;
+                }
+
+                r = unit_full_printf(u, source, &sresolved);
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r,
+                                   "Failed to resolved specifiers in \"%s\", ignoring: %m", source);
+                        return 0;
+                }
+
+                s = sresolved;
+                if (s[0] == '-') {
+                        ignore_enoent = true;
+                        s++;
+                }
+
+                if (!utf8_is_valid(s)) {
+                        log_syntax_invalid_utf8(unit, LOG_ERR, filename, line, s);
+                        return 0;
+                }
+                if (!path_is_absolute(s)) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "Not an absolute source path, ignoring: %s", s);
+                        return 0;
+                }
+
+                path_kill_slashes(s);
+
+                /* Optionally, the destination is specified. */
+                if (p && p[-1] == ':') {
+                        r = extract_first_word(&p, &destination, ":" WHITESPACE, EXTRACT_QUOTES|EXTRACT_DONT_COALESCE_SEPARATORS);
+                        if (r == -ENOMEM)
+                                return log_oom();
+                        if (r < 0) {
+                                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse %s: %s", lvalue, rvalue);
+                                return 0;
+                        }
+                        if (r == 0) {
+                                log_syntax(unit, LOG_ERR, filename, line, 0, "Missing argument after ':': %s", rvalue);
+                                return 0;
+                        }
+
+                        r = unit_full_printf(u, destination, &dresolved);
+                        if (r < 0) {
+                                log_syntax(unit, LOG_ERR, filename, line, r,
+                                           "Failed to resolved specifiers in \"%s\", ignoring: %m", destination);
+                                return 0;
+                        }
+
+                        if (!utf8_is_valid(dresolved)) {
+                                log_syntax_invalid_utf8(unit, LOG_ERR, filename, line, dresolved);
+                                return 0;
+                        }
+                        if (!path_is_absolute(dresolved)) {
+                                log_syntax(unit, LOG_ERR, filename, line, 0, "Not an absolute destination path, ignoring: %s", dresolved);
+                                return 0;
+                        }
+
+                        d = path_kill_slashes(dresolved);
+
+                        /* Optionally, there's also a short option string specified */
+                        if (p && p[-1] == ':') {
+                                _cleanup_free_ char *options = NULL;
+
+                                r = extract_first_word(&p, &options, NULL, EXTRACT_QUOTES);
+                                if (r == -ENOMEM)
+                                        return log_oom();
+                                if (r < 0) {
+                                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse %s: %s", lvalue, rvalue);
+                                        return 0;
+                                }
+
+                                if (isempty(options) || streq(options, "rbind"))
+                                        rbind = true;
+                                else if (streq(options, "norbind"))
+                                        rbind = false;
+                                else {
+                                        log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid option string, ignoring setting: %s", options);
+                                        return 0;
+                                }
+                        }
+                } else
+                        d = s;
+
+                r = bind_mount_add(&c->bind_mounts, &c->n_bind_mounts,
+                                   &(BindMount) {
+                                           .source = s,
+                                           .destination = d,
+                                           .read_only = !!strstr(lvalue, "ReadOnly"),
+                                           .recursive = rbind,
+                                           .ignore_enoent = ignore_enoent,
+                                   });
+                if (r < 0)
+                        return log_oom();
         }
 
         return 0;
@@ -3610,8 +4121,7 @@ int config_parse_no_new_privileges(
                 return 0;
         }
 
-        c->no_new_privileges = !!k;
-        c->no_new_privileges_set = true;
+        c->no_new_privileges = k;
 
         return 0;
 }
@@ -4006,8 +4516,11 @@ int unit_load_fragment(Unit *u) {
                         return r;
 
                 r = load_from_path(u, k);
-                if (r < 0)
+                if (r < 0) {
+                        if (r == -ENOEXEC)
+                                log_unit_notice(u, "Unit configuration has fatal error, unit will not be started.");
                         return r;
+                }
 
                 if (u->load_state == UNIT_STUB) {
                         SET_FOREACH(t, u->names, i) {
@@ -4060,8 +4573,8 @@ void unit_dump_config_items(FILE *f) {
                 { config_parse_exec_cpu_affinity,     "CPUAFFINITY" },
                 { config_parse_mode,                  "MODE" },
                 { config_parse_unit_env_file,         "FILE" },
-                { config_parse_output,                "OUTPUT" },
-                { config_parse_input,                 "INPUT" },
+                { config_parse_exec_output,           "OUTPUT" },
+                { config_parse_exec_input,            "INPUT" },
                 { config_parse_log_facility,          "FACILITY" },
                 { config_parse_log_level,             "LEVEL" },
                 { config_parse_exec_capabilities,     "CAPABILITIES" },
@@ -4083,6 +4596,7 @@ void unit_dump_config_items(FILE *f) {
                 { config_parse_sec,                   "SECONDS" },
                 { config_parse_nsec,                  "NANOSECONDS" },
                 { config_parse_namespace_path_strv,   "PATH [...]" },
+                { config_parse_bind_paths,            "PATH[:PATH[:OPTIONS]] [...]" },
                 { config_parse_unit_requires_mounts_for, "PATH [...]" },
                 { config_parse_exec_mount_flags,      "MOUNTFLAG [...]" },
                 { config_parse_unit_string_printf,    "STRING" },
@@ -4097,7 +4611,7 @@ void unit_dump_config_items(FILE *f) {
                 { config_parse_unit_slice,            "SLICE" },
                 { config_parse_documentation,         "URL" },
                 { config_parse_service_timeout,       "SECONDS" },
-                { config_parse_failure_action,        "ACTION" },
+                { config_parse_emergency_action,      "ACTION" },
                 { config_parse_set_status,            "STATUS" },
                 { config_parse_service_sockets,       "SOCKETS" },
                 { config_parse_environ,               "ENVIRON" },
@@ -4106,8 +4620,10 @@ void unit_dump_config_items(FILE *f) {
                 { config_parse_syscall_archs,         "ARCHS" },
                 { config_parse_syscall_errno,         "ERRNO" },
                 { config_parse_address_families,      "FAMILIES" },
+                { config_parse_restrict_namespaces,   "NAMESPACES"  },
 #endif
                 { config_parse_cpu_shares,            "SHARES" },
+                { config_parse_cpu_weight,            "WEIGHT" },
                 { config_parse_memory_limit,          "LIMIT" },
                 { config_parse_device_allow,          "DEVICE" },
                 { config_parse_device_policy,         "POLICY" },
index e3ba05b..4e76a4e 100644 (file)
@@ -45,7 +45,9 @@ int config_parse_service_timeout(const char *unit, const char *filename, unsigne
 int config_parse_service_type(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_service_restart(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_socket_bindtodevice(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_exec_output(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_output(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_exec_input(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_input(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_exec_io_class(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_exec_io_priority(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
@@ -74,7 +76,7 @@ int config_parse_unit_condition_string(const char *unit, const char *filename, u
 int config_parse_unit_condition_null(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_kill_mode(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_notify_access(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
-int config_parse_failure_action(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_emergency_action(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_unit_requires_mounts_for(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_syscall_filter(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_syscall_archs(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
@@ -82,6 +84,7 @@ int config_parse_syscall_errno(const char *unit, const char *filename, unsigned
 int config_parse_environ(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_pass_environ(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_unit_slice(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_cpu_weight(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_cpu_shares(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_memory_limit(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_tasks_max(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
@@ -112,9 +115,13 @@ int config_parse_exec_utmp_mode(const char *unit, const char *filename, unsigned
 int config_parse_working_directory(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_fdname(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_sec_fix_0(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_user_group(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_user_group_strv(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_restrict_namespaces(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_bind_paths(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 
 /* gperf prototypes */
-const struct ConfigPerfItem* load_fragment_gperf_lookup(const char *key, unsigned length);
+const struct ConfigPerfItem* load_fragment_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
 extern const char load_fragment_gperf_nulstr[];
 
 typedef enum Disabled {
index ccf61d2..fdd847e 100644 (file)
@@ -87,7 +87,7 @@ int locale_setup(char ***environment) {
                 if (!variables[i])
                         continue;
 
-                s = strjoin(locale_variable_to_string(i), "=", variables[i], NULL);
+                s = strjoin(locale_variable_to_string(i), "=", variables[i]);
                 if (!s) {
                         r = -ENOMEM;
                         goto finish;
index 04062a7..c167305 100644 (file)
 #include "missing.h"
 #include "netlink-util.h"
 
-static int start_loopback(sd_netlink *rtnl) {
+#define LOOPBACK_SETUP_TIMEOUT_USEC (5 * USEC_PER_SEC)
+
+struct state {
+        unsigned n_messages;
+        int rcode;
+        const char *title;
+};
+
+static int generic_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
+        struct state *s = userdata;
+
+        assert(s);
+        assert(s->n_messages > 0);
+        s->n_messages--;
+
+        errno = 0;
+        log_debug_errno(sd_netlink_message_get_errno(m), "Failed to %s: %m", s->title);
+
+        s->rcode = sd_netlink_message_get_errno(m);
+
+        return 0;
+}
+
+static int start_loopback(sd_netlink *rtnl, struct state *s) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
         int r;
 
+        assert(rtnl);
+        assert(s);
+
         r = sd_rtnl_message_new_link(rtnl, &req, RTM_SETLINK, LOOPBACK_IFINDEX);
         if (r < 0)
                 return r;
@@ -38,10 +64,81 @@ static int start_loopback(sd_netlink *rtnl) {
         if (r < 0)
                 return r;
 
-        r = sd_netlink_call(rtnl, req, 0, NULL);
+        r = sd_netlink_call_async(rtnl, req, generic_handler, s, LOOPBACK_SETUP_TIMEOUT_USEC, NULL);
+        if (r < 0)
+                return r;
+
+        s->n_messages ++;
+        return 0;
+}
+
+static int add_ipv4_address(sd_netlink *rtnl, struct state *s) {
+        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
+        int r;
+
+        assert(rtnl);
+        assert(s);
+
+        r = sd_rtnl_message_new_addr(rtnl, &req, RTM_NEWADDR, LOOPBACK_IFINDEX, AF_INET);
+        if (r < 0)
+                return r;
+
+        r = sd_rtnl_message_addr_set_prefixlen(req, 8);
+        if (r < 0)
+                return r;
+
+        r = sd_rtnl_message_addr_set_flags(req, IFA_F_PERMANENT);
+        if (r < 0)
+                return r;
+
+        r = sd_rtnl_message_addr_set_scope(req, RT_SCOPE_HOST);
+        if (r < 0)
+                return r;
+
+        r = sd_netlink_message_append_in_addr(req, IFA_LOCAL, &(struct in_addr) { .s_addr = htobe32(INADDR_LOOPBACK) } );
+        if (r < 0)
+                return r;
+
+        r = sd_netlink_call_async(rtnl, req, generic_handler, s, USEC_INFINITY, NULL);
         if (r < 0)
                 return r;
 
+        s->n_messages ++;
+        return 0;
+}
+
+static int add_ipv6_address(sd_netlink *rtnl, struct state *s) {
+        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
+        int r;
+
+        assert(rtnl);
+        assert(s);
+
+        r = sd_rtnl_message_new_addr(rtnl, &req, RTM_NEWADDR, LOOPBACK_IFINDEX, AF_INET6);
+        if (r < 0)
+                return r;
+
+        r = sd_rtnl_message_addr_set_prefixlen(req, 128);
+        if (r < 0)
+                return r;
+
+        r = sd_rtnl_message_addr_set_flags(req, IFA_F_PERMANENT);
+        if (r < 0)
+                return r;
+
+        r = sd_rtnl_message_addr_set_scope(req, RT_SCOPE_HOST);
+        if (r < 0)
+                return r;
+
+        r = sd_netlink_message_append_in6_addr(req, IFA_LOCAL, &in6addr_loopback);
+        if (r < 0)
+                return r;
+
+        r = sd_netlink_call_async(rtnl, req, generic_handler, s, USEC_INFINITY, NULL);
+        if (r < 0)
+                return r;
+
+        s->n_messages ++;
         return 0;
 }
 
@@ -54,7 +151,7 @@ static bool check_loopback(sd_netlink *rtnl) {
         if (r < 0)
                 return false;
 
-        r = sd_netlink_call(rtnl, req, 0, &reply);
+        r = sd_netlink_call(rtnl, req, USEC_INFINITY, &reply);
         if (r < 0)
                 return false;
 
@@ -67,23 +164,52 @@ static bool check_loopback(sd_netlink *rtnl) {
 
 int loopback_setup(void) {
         _cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
+        struct state state_4 = { .title = "add address 127.0.0.1 to loopback interface" },
+                     state_6 = { .title = "add address ::1 to loopback interface"},
+                     state_up = { .title = "bring loopback interface up" };
         int r;
 
         r = sd_netlink_open(&rtnl);
         if (r < 0)
-                return r;
+                return log_error_errno(r, "Failed to open netlink: %m");
+
+        /* Note that we add the IP addresses here explicitly even though the kernel does that too implicitly when
+         * setting up the loopback device. The reason we do this here a second time (and possibly race against the
+         * kernel) is that we want to synchronously wait until the IP addresses are set up correctly, see
+         *
+         * https://github.com/systemd/systemd/issues/5641 */
 
-        r = start_loopback(rtnl);
-        if (r < 0) {
+        r = add_ipv4_address(rtnl, &state_4);
+        if (r < 0)
+                return log_error_errno(r, "Failed to enqueue IPv4 loopback address add request: %m");
+
+        r = add_ipv6_address(rtnl, &state_6);
+        if (r < 0)
+                return log_error_errno(r, "Failed to enqueue IPv6 loopback address add request: %m");
+
+        r = start_loopback(rtnl, &state_up);
+        if (r < 0)
+                return log_error_errno(r, "Failed to enqueue loopback interface start request: %m");
+
+        while (state_4.n_messages + state_6.n_messages + state_up.n_messages > 0) {
+                r = sd_netlink_wait(rtnl, LOOPBACK_SETUP_TIMEOUT_USEC);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to wait for netlink event: %m");
+
+                r = sd_netlink_process(rtnl, NULL);
+                if (r < 0)
+                        return log_warning_errno(r, "Failed to process netlink event: %m");
+        }
 
-                /* If we lack the permissions to configure the
-                 * loopback device, but we find it to be already
-                 * configured, let's exit cleanly, in order to
-                 * supported unprivileged containers. */
-                if (r == -EPERM && check_loopback(rtnl))
+        /* Note that we don't really care whether the addresses could be added or not */
+        if (state_up.rcode != 0) {
+                /* If we lack the permissions to configure the loopback device,
+                 * but we find it to be already configured, let's exit cleanly,
+                 * in order to supported unprivileged containers. */
+                if (state_up.rcode == -EPERM && check_loopback(rtnl))
                         return 0;
 
-                return log_warning_errno(r, "Failed to configure loopback device: %m");
+                return log_warning_errno(state_up.rcode, "Failed to configure loopback device: %m");
         }
 
         return 0;
index 76dfcfa..df3cc74 100644 (file)
@@ -146,14 +146,18 @@ int machine_id_setup(const char *root, sd_id128_t machine_id, sd_id128_t *ret) {
                 r = generate_machine_id(root, &machine_id);
                 if (r < 0)
                         return r;
+        }
 
+        if (writable) {
                 if (lseek(fd, 0, SEEK_SET) == (off_t) -1)
-                        return log_error_errno(errno, "Failed to seek: %m");
-        }
+                        return log_error_errno(errno, "Failed to seek %s: %m", etc_machine_id);
+
+                if (ftruncate(fd, 0) < 0)
+                        return log_error_errno(errno, "Failed to truncate %s: %m", etc_machine_id);
 
-        if (writable)
                 if (id128_write_fd(fd, ID128_PLAIN, machine_id, true) >= 0)
                         goto finish;
+        }
 
         fd = safe_close(fd);
 
@@ -199,7 +203,7 @@ int machine_id_commit(const char *root) {
 
         etc_machine_id = prefix_roota(root, "/etc/machine-id");
 
-        r = path_is_mount_point(etc_machine_id, 0);
+        r = path_is_mount_point(etc_machine_id, NULL, 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) {
index 48fbc22..27f8843 100644 (file)
@@ -32,6 +32,8 @@
 %_binfmtdir @binfmtdir@
 %_systemdgeneratordir @systemgeneratordir@
 %_systemdusergeneratordir @usergeneratordir@
+%_systemd_system_env_generator_dir @systemenvgeneratordir@
+%_systemd_user_env_generator_dir @userenvgeneratordir@
 
 %systemd_requires \
 Requires(post): systemd \
@@ -82,7 +84,7 @@ fi \
 %systemd_user_postun_with_restart() %{nil}
 
 %udev_hwdb_update() \
-udevadm hwdb --update >/dev/null 2>&1 || : \
+systemd-hwdb update >/dev/null 2>&1 || : \
 %{nil}
 
 %udev_rules_update() \
index 9c9d073..e7a345e 100644 (file)
 #include "cpu-set-util.h"
 #include "dbus-manager.h"
 #include "def.h"
+#include "emergency-action.h"
 #include "env-util.h"
 #include "fd-util.h"
 #include "fdset.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "hostname-setup.h"
 #include "ima-setup.h"
 #include "mount-setup.h"
 #include "pager.h"
 #include "parse-util.h"
+#include "path-util.h"
 #include "proc-cmdline.h"
 #include "process-util.h"
 #include "raw-clone.h"
 #include "rlimit-util.h"
+#ifdef HAVE_SECCOMP
+#include "seccomp-util.h"
+#endif
 #include "selinux-setup.h"
 #include "selinux-util.h"
 #include "signal-util.h"
@@ -92,8 +97,7 @@ static enum {
         ACTION_HELP,
         ACTION_VERSION,
         ACTION_TEST,
-        ACTION_DUMP_CONFIGURATION_ITEMS,
-        ACTION_DONE
+        ACTION_DUMP_CONFIGURATION_ITEMS
 } arg_action = ACTION_RUN;
 static char *arg_default_unit = NULL;
 static bool arg_system = false;
@@ -101,7 +105,7 @@ static bool arg_dump_core = true;
 static int arg_crash_chvt = -1;
 static bool arg_crash_shell = false;
 static bool arg_crash_reboot = false;
-static bool arg_confirm_spawn = false;
+static char *arg_confirm_spawn = NULL;
 static ShowStatus arg_show_status = _SHOW_STATUS_UNSET;
 static bool arg_switched_root = false;
 static bool arg_no_pager = false;
@@ -129,6 +133,7 @@ static bool arg_default_memory_accounting = false;
 static bool arg_default_tasks_accounting = true;
 static uint64_t arg_default_tasks_max = UINT64_MAX;
 static sd_id128_t arg_machine_id = {};
+static EmergencyAction arg_cad_burst_action = EMERGENCY_ACTION_REBOOT_FORCE;
 
 noreturn static void freeze_or_reboot(void) {
 
@@ -200,7 +205,7 @@ noreturn static void crash(int sig) {
                                               pid, sigchld_code_to_string(status.si_code),
                                               status.si_status,
                                               strna(status.si_code == CLD_EXITED
-                                                    ? exit_status_to_string(status.si_status, EXIT_STATUS_FULL)
+                                                    ? exit_status_to_string(status.si_status, EXIT_STATUS_MINIMAL)
                                                     : signal_to_string(status.si_status)));
                         else
                                 log_emergency("Caught <%s>, dumped core as pid "PID_FMT".", signal_to_string(sig), pid);
@@ -290,6 +295,28 @@ static int parse_crash_chvt(const char *value) {
         return 0;
 }
 
+static int parse_confirm_spawn(const char *value, char **console) {
+        char *s;
+        int r;
+
+        r = value ? parse_boolean(value) : 1;
+        if (r == 0) {
+                *console = NULL;
+                return 0;
+        }
+
+        if (r > 0) /* on with default tty */
+                s = strdup("/dev/console");
+        else if (is_path(value)) /* on with fully qualified path */
+                s = strdup(value);
+        else /* on with only a tty file name, not a fully qualified path */
+                s = strjoin("/dev/", value);
+        if (!s)
+                return -ENOMEM;
+        *console = s;
+        return 0;
+}
+
 static int set_machine_id(const char *m) {
         sd_id128_t t;
         assert(m);
@@ -304,66 +331,79 @@ static int set_machine_id(const char *m) {
         return 0;
 }
 
-static int parse_proc_cmdline_item(const char *key, const char *value) {
+static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
 
         int r;
 
         assert(key);
 
-        if (streq(key, "systemd.unit") && value) {
+        if (STR_IN_SET(key, "systemd.unit", "rd.systemd.unit")) {
 
-                if (!in_initrd())
-                        return free_and_strdup(&arg_default_unit, value);
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
-        } else if (streq(key, "rd.systemd.unit") && value) {
-
-                if (in_initrd())
-                        return free_and_strdup(&arg_default_unit, value);
+                if (!unit_name_is_valid(value, UNIT_NAME_PLAIN|UNIT_NAME_INSTANCE))
+                        log_warning("Unit name specified on %s= is not valid, ignoring: %s", key, value);
+                else if (in_initrd() == !!startswith(key, "rd.")) {
+                        if (free_and_strdup(&arg_default_unit, value) < 0)
+                                return log_oom();
+                }
 
-        } else if (streq(key, "systemd.dump_core") && value) {
+        } else if (proc_cmdline_key_streq(key, "systemd.dump_core")) {
 
-                r = parse_boolean(value);
+                r = value ? parse_boolean(value) : true;
                 if (r < 0)
                         log_warning("Failed to parse dump core switch %s. Ignoring.", value);
                 else
                         arg_dump_core = r;
 
-        } else if (streq(key, "systemd.crash_chvt") && value) {
+        } else if (proc_cmdline_key_streq(key, "systemd.crash_chvt")) {
 
-                if (parse_crash_chvt(value) < 0)
+                if (!value)
+                        arg_crash_chvt = 0; /* turn on */
+                else if (parse_crash_chvt(value) < 0)
                         log_warning("Failed to parse crash chvt switch %s. Ignoring.", value);
 
-        } else if (streq(key, "systemd.crash_shell") && value) {
+        } else if (proc_cmdline_key_streq(key, "systemd.crash_shell")) {
 
-                r = parse_boolean(value);
+                r = value ? parse_boolean(value) : true;
                 if (r < 0)
                         log_warning("Failed to parse crash shell switch %s. Ignoring.", value);
                 else
                         arg_crash_shell = r;
 
-        } else if (streq(key, "systemd.crash_reboot") && value) {
+        } else if (proc_cmdline_key_streq(key, "systemd.crash_reboot")) {
 
-                r = parse_boolean(value);
+                r = value ? parse_boolean(value) : true;
                 if (r < 0)
                         log_warning("Failed to parse crash reboot switch %s. Ignoring.", value);
                 else
                         arg_crash_reboot = r;
 
-        } else if (streq(key, "systemd.confirm_spawn") && value) {
+        } else if (proc_cmdline_key_streq(key, "systemd.confirm_spawn")) {
+                char *s;
 
-                r = parse_boolean(value);
+                r = parse_confirm_spawn(value, &s);
                 if (r < 0)
-                        log_warning("Failed to parse confirm spawn switch %s. Ignoring.", value);
-                else
-                        arg_confirm_spawn = r;
+                        log_warning_errno(r, "Failed to parse confirm_spawn switch %s. Ignoring.", value);
+                else {
+                        free(arg_confirm_spawn);
+                        arg_confirm_spawn = s;
+                }
 
-        } else if (streq(key, "systemd.show_status") && value) {
+        } else if (proc_cmdline_key_streq(key, "systemd.show_status")) {
 
-                r = parse_show_status(value, &arg_show_status);
-                if (r < 0)
-                        log_warning("Failed to parse show status switch %s. Ignoring.", value);
+                if (value) {
+                        r = parse_show_status(value, &arg_show_status);
+                        if (r < 0)
+                                log_warning("Failed to parse show status switch %s. Ignoring.", value);
+                } else
+                        arg_show_status = SHOW_STATUS_YES;
+
+        } else if (proc_cmdline_key_streq(key, "systemd.default_standard_output")) {
 
-        } else if (streq(key, "systemd.default_standard_output") && value) {
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 r = exec_output_from_string(value);
                 if (r < 0)
@@ -371,7 +411,10 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
                 else
                         arg_default_std_output = r;
 
-        } else if (streq(key, "systemd.default_standard_error") && value) {
+        } else if (proc_cmdline_key_streq(key, "systemd.default_standard_error")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 r = exec_output_from_string(value);
                 if (r < 0)
@@ -379,24 +422,42 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
                 else
                         arg_default_std_error = r;
 
-        } else if (streq(key, "systemd.setenv") && value) {
+        } else if (streq(key, "systemd.setenv")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 if (env_assignment_is_valid(value)) {
                         char **env;
 
                         env = strv_env_set(arg_default_environment, value);
-                        if (env)
-                                arg_default_environment = env;
-                        else
-                                log_warning_errno(ENOMEM, "Setting environment variable '%s' failed, ignoring: %m", value);
+                        if (!env)
+                                return log_oom();
+
+                        arg_default_environment = env;
                 } else
                         log_warning("Environment variable name '%s' is not valid. Ignoring.", value);
 
-        } else if (streq(key, "systemd.machine_id") && value) {
+        } else if (proc_cmdline_key_streq(key, "systemd.machine_id")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
-               r = set_machine_id(value);
-               if (r < 0)
-                       log_warning("MachineID '%s' is not valid. Ignoring.", value);
+                r = set_machine_id(value);
+                if (r < 0)
+                        log_warning("MachineID '%s' is not valid. Ignoring.", value);
+
+        } else if (proc_cmdline_key_streq(key, "systemd.default_timeout_start_sec")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
+                r = parse_sec(value, &arg_default_timeout_start_usec);
+                if (r < 0)
+                        log_warning_errno(r, "Failed to parse default start timeout: %s, ignoring.", value);
+
+                if (arg_default_timeout_start_usec <= 0)
+                        arg_default_timeout_start_usec = USEC_INFINITY;
 
         } else if (streq(key, "quiet") && !value) {
 
@@ -418,15 +479,6 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
                 target = runlevel_to_target(key);
                 if (target)
                         return free_and_strdup(&arg_default_unit, target);
-
-        } else if (streq(key, "systemd.default_timeout_start_sec") && value) {
-
-                r = parse_sec(value, &arg_default_timeout_start_usec);
-                if (r < 0)
-                        log_warning_errno(r, "Failed to parse default start timeout: %s, ignoring.", value);
-
-                if (arg_default_timeout_start_usec <= 0)
-                        arg_default_timeout_start_usec = USEC_INFINITY;
         }
 
         return 0;
@@ -484,7 +536,7 @@ static int config_parse_cpu_affinity2(
                 return ncpus;
 
         if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus), c) < 0)
-                log_warning("Failed to set CPU affinity: %m");
+                log_warning_errno(errno, "Failed to set CPU affinity: %m");
 
         return 0;
 }
@@ -570,7 +622,7 @@ static int config_parse_join_controllers(const char *unit,
                 char **l;
                 int r;
 
-                r = extract_first_word(&rvalue, &word, WHITESPACE, EXTRACT_QUOTES);
+                r = extract_first_word(&rvalue, &word, NULL, EXTRACT_QUOTES);
                 if (r < 0) {
                         log_syntax(unit, LOG_ERR, filename, line, r, "Invalid value for %s: %s", lvalue, whole_rvalue);
                         return r;
@@ -700,6 +752,7 @@ static int parse_config_file(void) {
                 { "Manager", "DefaultMemoryAccounting",   config_parse_bool,             0, &arg_default_memory_accounting         },
                 { "Manager", "DefaultTasksAccounting",    config_parse_bool,             0, &arg_default_tasks_accounting          },
                 { "Manager", "DefaultTasksMax",           config_parse_tasks_max,        0, &arg_default_tasks_max                 },
+                { "Manager", "CtrlAltDelBurstAction",     config_parse_emergency_action, 0, &arg_cad_burst_action                  },
                 {}
         };
 
@@ -713,7 +766,7 @@ static int parse_config_file(void) {
                 CONF_PATHS_NULSTR("systemd/system.conf.d") :
                 CONF_PATHS_NULSTR("systemd/user.conf.d");
 
-        config_parse_many(fn, conf_dirs_nulstr, "Manager\0", config_item_table_lookup, items, false, NULL);
+        config_parse_many_nulstr(fn, conf_dirs_nulstr, "Manager\0", config_item_table_lookup, items, false, NULL);
 
         /* Traditionally "0" was used to turn off the default unit timeouts. Fix this up so that we used USEC_INFINITY
          * like everywhere else. */
@@ -876,7 +929,6 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case ARG_UNIT:
-
                         r = free_and_strdup(&arg_default_unit, optarg);
                         if (r < 0)
                                 return log_error_errno(r, "Failed to set default unit %s: %m", optarg);
@@ -947,12 +999,11 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case ARG_CONFIRM_SPAWN:
-                        r = optarg ? parse_boolean(optarg) : 1;
-                        if (r < 0) {
-                                log_error("Failed to parse confirm spawn boolean %s.", optarg);
-                                return r;
-                        }
-                        arg_confirm_spawn = r;
+                        arg_confirm_spawn = mfree(arg_confirm_spawn);
+
+                        r = parse_confirm_spawn(optarg, &arg_confirm_spawn);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse confirm spawn option: %m");
                         break;
 
                 case ARG_SHOW_STATUS:
@@ -994,10 +1045,8 @@ static int parse_argv(int argc, char *argv[]) {
 
                 case ARG_MACHINE_ID:
                         r = set_machine_id(optarg);
-                        if (r < 0) {
-                                log_error("MachineID '%s' is not valid.", optarg);
-                                return r;
-                        }
+                        if (r < 0)
+                                return log_error_errno(r, "MachineID '%s' is not valid.", optarg);
                         break;
 
                 case 'h':
@@ -1113,6 +1162,8 @@ static int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds, bool switching
 static int bump_rlimit_nofile(struct rlimit *saved_rlimit) {
         struct rlimit nl;
         int r;
+        int min_max;
+        _cleanup_free_ char *nr_open = NULL;
 
         assert(saved_rlimit);
 
@@ -1120,7 +1171,7 @@ static int bump_rlimit_nofile(struct rlimit *saved_rlimit) {
          * later when transitioning from the initrd to the main
          * systemd or suchlike. */
         if (getrlimit(RLIMIT_NOFILE, saved_rlimit) < 0)
-                return log_error_errno(errno, "Reading RLIMIT_NOFILE failed: %m");
+                return log_warning_errno(errno, "Reading RLIMIT_NOFILE failed, ignoring: %m");
 
         /* Make sure forked processes get the default kernel setting */
         if (!arg_default_rlimit[RLIMIT_NOFILE]) {
@@ -1133,11 +1184,19 @@ static int bump_rlimit_nofile(struct rlimit *saved_rlimit) {
                 arg_default_rlimit[RLIMIT_NOFILE] = rl;
         }
 
+        /* Get current RLIMIT_NOFILE maximum compiled into the kernel. */
+        r = read_one_line_file("/proc/sys/fs/nr_open", &nr_open);
+        if (r == 0)
+                r = safe_atoi(nr_open, &min_max);
+        /* If we fail, fallback to the hard-coded kernel limit of 1024 * 1024. */
+        if (r < 0)
+                min_max = 1024 * 1024;
+
         /* Bump up the resource limit for ourselves substantially */
-        nl.rlim_cur = nl.rlim_max = 64*1024;
+        nl.rlim_cur = nl.rlim_max = min_max;
         r = setrlimit_closest(RLIMIT_NOFILE, &nl);
         if (r < 0)
-                return log_error_errno(r, "Setting RLIMIT_NOFILE failed: %m");
+                return log_warning_errno(r, "Setting RLIMIT_NOFILE failed, ignoring: %m");
 
         return 0;
 }
@@ -1182,41 +1241,16 @@ oom:
 
 static int enforce_syscall_archs(Set *archs) {
 #ifdef HAVE_SECCOMP
-        scmp_filter_ctx *seccomp;
-        Iterator i;
-        void *id;
         int r;
 
-        seccomp = seccomp_init(SCMP_ACT_ALLOW);
-        if (!seccomp)
-                return log_oom();
-
-        SET_FOREACH(id, arg_syscall_archs, i) {
-                r = seccomp_arch_add(seccomp, PTR_TO_UINT32(id) - 1);
-                if (r == -EEXIST)
-                        continue;
-                if (r < 0) {
-                        log_error_errno(r, "Failed to add architecture to seccomp: %m");
-                        goto finish;
-                }
-        }
-
-        r = seccomp_attr_set(seccomp, SCMP_FLTATR_CTL_NNP, 0);
-        if (r < 0) {
-                log_error_errno(r, "Failed to unset NO_NEW_PRIVS: %m");
-                goto finish;
-        }
+        if (!is_seccomp_available())
+                return 0;
 
-        r = seccomp_load(seccomp);
+        r = seccomp_restrict_archs(arg_syscall_archs);
         if (r < 0)
-                log_error_errno(r, "Failed to add install architecture seccomp: %m");
-
-finish:
-        seccomp_release(seccomp);
-        return r;
-#else
-        return 0;
+                return log_error_errno(r, "Failed to enforce system call architecture restrication: %m");
 #endif
+        return 0;
 }
 
 static int status_welcome(void) {
@@ -1314,12 +1348,11 @@ static int fixup_environment(void) {
          * However if TERM was configured through the kernel
          * command line then leave it alone. */
 
-        r = get_proc_cmdline_key("TERM=", &term);
+        r = proc_cmdline_get_key("TERM", 0, &term);
         if (r < 0)
                 return r;
-
         if (r == 0) {
-                term = strdup(default_term_for_tty("/dev/console") + 5);
+                term = strdup(default_term_for_tty("/dev/console"));
                 if (!term)
                         return -ENOMEM;
         }
@@ -1384,17 +1417,24 @@ int main(int argc, char *argv[]) {
            called 'systemd'. That is confusing, hence let's call us
            systemd right-away. */
         program_invocation_short_name = systemd;
-        prctl(PR_SET_NAME, systemd);
+        (void) prctl(PR_SET_NAME, systemd);
 
         saved_argv = argv;
         saved_argc = argc;
 
         log_set_upgrade_syslog_to_journal(true);
 
-        /* Disable the umask logic */
-        if (getpid() == 1)
+        if (getpid() == 1) {
+                /* Disable the umask logic */
                 umask(0);
 
+                /* Always reopen /dev/console when running as PID 1 or one of its pre-execve() children. This is
+                 * important so that we never end up logging to any foreign stderr, for example if we have to log in a
+                 * child process right before execve()'ing the actual binary, at a point in time where socket
+                 * activation stderr/stdout area already set up. */
+                log_set_always_reopen_console(true);
+        }
+
         if (getpid() == 1 && detect_container() <= 0) {
 
                 /* Running outside of a container as PID 1 */
@@ -1408,19 +1448,20 @@ int main(int argc, char *argv[]) {
                 if (!skip_setup) {
                         r = mount_setup_early();
                         if (r < 0) {
-                                error_message = "Failed to early mount API filesystems";
+                                error_message = "Failed to mount early API filesystems";
                                 goto finish;
                         }
+
                         dual_timestamp_get(&security_start_timestamp);
                         if (mac_selinux_setup(&loaded_policy) < 0) {
                                 error_message = "Failed to load SELinux policy";
                                 goto finish;
-                        } else if (ima_setup() < 0) {
-                                error_message = "Failed to load IMA policy";
-                                goto finish;
                         } else if (mac_smack_setup(&loaded_policy) < 0) {
                                 error_message = "Failed to load SMACK policy";
                                 goto finish;
+                        } else if (ima_setup() < 0) {
+                                error_message = "Failed to load IMA policy";
+                                goto finish;
                         }
                         dual_timestamp_get(&security_finish_timestamp);
                 }
@@ -1480,7 +1521,7 @@ int main(int argc, char *argv[]) {
                 log_close_console(); /* force reopen of /dev/console */
                 log_open();
 
-                /* For the later on, see above... */
+                /* For later on, see above... */
                 log_set_target(LOG_TARGET_JOURNAL);
 
                 /* clear the kernel timestamp,
@@ -1500,7 +1541,8 @@ int main(int argc, char *argv[]) {
         if (getpid() == 1) {
                 /* Don't limit the core dump size, so that coredump handlers such as systemd-coredump (which honour the limit)
                  * will process core dumps for system services by default. */
-                (void) setrlimit(RLIMIT_CORE, &RLIMIT_MAKE_CONST(RLIM_INFINITY));
+                if (setrlimit(RLIMIT_CORE, &RLIMIT_MAKE_CONST(RLIM_INFINITY)) < 0)
+                        log_warning_errno(errno, "Failed to set RLIMIT_CORE: %m");
 
                 /* But at the same time, turn off the core_pattern logic by default, so that no coredumps are stored
                  * until the systemd-coredump tool is enabled via sysctl. */
@@ -1518,15 +1560,9 @@ int main(int argc, char *argv[]) {
                  * need to do that for user instances since they never log
                  * into the console. */
                 log_show_color(colors_enabled());
-                make_null_stdio();
-        }
-
-        /* Initialize default unit */
-        r = free_and_strdup(&arg_default_unit, SPECIAL_DEFAULT_TARGET);
-        if (r < 0) {
-                log_emergency_errno(r, "Failed to set default unit %s: %m", SPECIAL_DEFAULT_TARGET);
-                error_message = "Failed to set default unit";
-                goto finish;
+                r = make_null_stdio();
+                if (r < 0)
+                        log_warning_errno(r, "Failed to redirect standard streams to /dev/null: %m");
         }
 
         r = initialize_join_controllers();
@@ -1554,7 +1590,7 @@ int main(int argc, char *argv[]) {
         (void) reset_all_signal_handlers();
         (void) ignore_signals(SIGNALS_IGNORE, -1);
 
-        arg_default_tasks_max = system_tasks_max_scale(15U, 100U); /* 15% the system PIDs equals 4915 by default. */
+        arg_default_tasks_max = system_tasks_max_scale(DEFAULT_TASKS_MAX_PERCENTAGE, 100U);
 
         if (parse_config_file() < 0) {
                 error_message = "Failed to parse config file";
@@ -1562,7 +1598,7 @@ int main(int argc, char *argv[]) {
         }
 
         if (arg_system) {
-                r = parse_proc_cmdline(parse_proc_cmdline_item);
+                r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0);
                 if (r < 0)
                         log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
         }
@@ -1576,6 +1612,16 @@ int main(int argc, char *argv[]) {
                 goto finish;
         }
 
+        /* Initialize default unit */
+        if (!arg_default_unit) {
+                arg_default_unit = strdup(SPECIAL_DEFAULT_TARGET);
+                if (!arg_default_unit) {
+                        r = log_oom();
+                        error_message = "Failed to set default unit";
+                        goto finish;
+                }
+        }
+
         if (arg_action == ACTION_TEST &&
             geteuid() == 0) {
                 log_error("Don't run test mode as root.");
@@ -1596,11 +1642,10 @@ int main(int argc, char *argv[]) {
                 goto finish;
         }
 
-        if (arg_action == ACTION_TEST)
-                skip_setup = true;
-
-        if (arg_action == ACTION_TEST || arg_action == ACTION_HELP)
+        if (arg_action == ACTION_TEST || arg_action == ACTION_HELP) {
                 pager_open(arg_no_pager, false);
+                skip_setup = true;
+        }
 
         if (arg_action == ACTION_HELP) {
                 retval = help();
@@ -1609,12 +1654,10 @@ int main(int argc, char *argv[]) {
                 retval = version();
                 goto finish;
         } else if (arg_action == ACTION_DUMP_CONFIGURATION_ITEMS) {
+                pager_open(arg_no_pager, false);
                 unit_dump_config_items(stdout);
                 retval = EXIT_SUCCESS;
                 goto finish;
-        } else if (arg_action == ACTION_DONE) {
-                retval = EXIT_SUCCESS;
-                goto finish;
         }
 
         if (!arg_system &&
@@ -1731,7 +1774,7 @@ int main(int argc, char *argv[]) {
                 if (prctl(PR_SET_TIMERSLACK, arg_timer_slack_nsec) < 0)
                         log_error_errno(errno, "Failed to adjust timer slack: %m");
 
-        if (!cap_test_all(arg_capability_bounding_set)) {
+        if (arg_system && !cap_test_all(arg_capability_bounding_set)) {
                 r = capability_bounding_set_drop_usermode(arg_capability_bounding_set);
                 if (r < 0) {
                         log_emergency_errno(r, "Failed to drop capability bounding set of usermode helpers: %m");
@@ -1760,10 +1803,10 @@ int main(int argc, char *argv[]) {
                         log_warning_errno(errno, "Failed to make us a subreaper: %m");
 
         if (arg_system) {
-                bump_rlimit_nofile(&saved_rlimit_nofile);
+                (void) bump_rlimit_nofile(&saved_rlimit_nofile);
 
                 if (empty_etc) {
-                        r = unit_file_preset_all(UNIT_FILE_SYSTEM, false, NULL, UNIT_FILE_PRESET_ENABLE_ONLY, false, NULL, 0);
+                        r = unit_file_preset_all(UNIT_FILE_SYSTEM, 0, NULL, UNIT_FILE_PRESET_ENABLE_ONLY, NULL, 0);
                         if (r < 0)
                                 log_full_errno(r == -EEXIST ? LOG_NOTICE : LOG_WARNING, r, "Failed to populate /etc with preset unit settings, ignoring: %m");
                         else
@@ -1786,6 +1829,7 @@ int main(int argc, char *argv[]) {
         m->initrd_timestamp = initrd_timestamp;
         m->security_start_timestamp = security_start_timestamp;
         m->security_finish_timestamp = security_finish_timestamp;
+        m->cad_burst_action = arg_cad_burst_action;
 
         manager_set_defaults(m);
         manager_set_show_status(m, arg_show_status);
@@ -1797,8 +1841,10 @@ int main(int argc, char *argv[]) {
         before_startup = now(CLOCK_MONOTONIC);
 
         r = manager_startup(m, arg_serialization, fds);
-        if (r < 0)
+        if (r < 0) {
                 log_error_errno(r, "Failed to fully start up daemon: %m");
+                goto finish;
+        }
 
         /* This will close all file descriptors that were opened, but
          * not claimed by any unit. */
@@ -1976,6 +2022,7 @@ finish:
                 arg_default_rlimit[j] = mfree(arg_default_rlimit[j]);
 
         arg_default_unit = mfree(arg_default_unit);
+        arg_confirm_spawn = mfree(arg_confirm_spawn);
         arg_join_controllers = strv_free_free(arg_join_controllers);
         arg_default_environment = strv_free(arg_default_environment);
         arg_syscall_archs = set_free(arg_syscall_archs);
@@ -2010,9 +2057,6 @@ finish:
                                 log_error_errno(r, "Failed to switch root, trying to continue: %m");
                 }
 
-                /* Reopen the console */
-                (void) make_console_stdio();
-
                 args_size = MAX(6, argc+1);
                 args = newa(const char*, args_size);
 
@@ -2060,6 +2104,9 @@ finish:
                 arg_serialization = safe_fclose(arg_serialization);
                 fds = fdset_free(fds);
 
+                /* Reopen the console */
+                (void) make_console_stdio();
+
                 for (j = 1, i = 1; j < (unsigned) argc; j++)
                         args[i++] = argv[j];
                 args[i++] = NULL;
index 76c14b8..1c7abb2 100644 (file)
@@ -17,7 +17,6 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <linux/kd.h>
@@ -45,6 +44,7 @@
 #include "bus-error.h"
 #include "bus-kernel.h"
 #include "bus-util.h"
+#include "clean-ipc.h"
 #include "dbus-job.h"
 #include "dbus-manager.h"
 #include "dbus-unit.h"
@@ -52,6 +52,7 @@
 #include "dirent-util.h"
 #include "env-util.h"
 #include "escape.h"
+#include "exec-util.h"
 #include "exit-status.h"
 #include "fd-util.h"
 #include "fileio.h"
@@ -81,6 +82,7 @@
 #include "transaction.h"
 #include "umask-util.h"
 #include "unit-name.h"
+#include "user-util.h"
 #include "util.h"
 #include "virt.h"
 #include "watchdog.h"
@@ -98,8 +100,10 @@ static int manager_dispatch_cgroups_agent_fd(sd_event_source *source, int fd, ui
 static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
 static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
 static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
+static int manager_dispatch_user_lookup_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
 static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata);
 static int manager_dispatch_run_queue(sd_event_source *source, void *userdata);
+static int manager_run_environment_generators(Manager *m);
 static int manager_run_generators(Manager *m);
 
 static void manager_watch_jobs_in_progress(Manager *m) {
@@ -108,6 +112,12 @@ static void manager_watch_jobs_in_progress(Manager *m) {
 
         assert(m);
 
+        /* We do not want to show the cylon animation if the user
+         * needs to confirm service executions otherwise confirmation
+         * messages will be screwed by the cylon animation. */
+        if (!manager_is_confirm_spawn_disabled(m))
+                return;
+
         if (m->jobs_in_progress_event_source)
                 return;
 
@@ -224,6 +234,7 @@ static void manager_print_jobs_in_progress(Manager *m) {
 
 static int have_ask_password(void) {
         _cleanup_closedir_ DIR *dir;
+        struct dirent *de;
 
         dir = opendir("/run/systemd/ask-password");
         if (!dir) {
@@ -233,19 +244,11 @@ static int have_ask_password(void) {
                         return -errno;
         }
 
-        for (;;) {
-                struct dirent *de;
-
-                errno = 0;
-                de = readdir(dir);
-                if (!de && errno > 0)
-                        return -errno;
-                if (!de)
-                        return false;
-
+        FOREACH_DIRENT_ALL(de, dir, return -errno) {
                 if (startswith(de->d_name, "ask."))
                         return true;
         }
+        return false;
 }
 
 static int manager_dispatch_ask_password_fd(sd_event_source *source,
@@ -519,6 +522,7 @@ static void manager_clean_environment(Manager *m) {
                         "LISTEN_FDNAMES",
                         "WATCHDOG_PID",
                         "WATCHDOG_USEC",
+                        "INVOCATION_ID",
                         NULL);
 }
 
@@ -528,9 +532,9 @@ static int manager_default_environment(Manager *m) {
         if (MANAGER_IS_SYSTEM(m)) {
                 /* The system manager always starts with a clean
                  * environment for its children. It does not import
-                 * the kernel or the parents exported variables.
+                 * the kernel's or the parents' exported variables.
                  *
-                 * The initial passed environ is untouched to keep
+                 * The initial passed environment is untouched to keep
                  * /proc/self/environ valid; it is used for tagging
                  * the init process inside containers. */
                 m->environment = strv_new("PATH=" DEFAULT_PATH,
@@ -538,11 +542,10 @@ static int manager_default_environment(Manager *m) {
 
                 /* Import locale variables LC_*= from configuration */
                 locale_setup(&m->environment);
-        } else {
+        } else
                 /* The user manager passes its own environment
                  * along to its children. */
                 m->environment = strv_copy(environ);
-        }
 
         if (!m->environment)
                 return -ENOMEM;
@@ -553,7 +556,6 @@ static int manager_default_environment(Manager *m) {
         return 0;
 }
 
-
 int manager_new(UnitFileScope scope, bool test_run, Manager **_m) {
         Manager *m;
         int r;
@@ -580,17 +582,25 @@ int manager_new(UnitFileScope scope, bool test_run, Manager **_m) {
         if (MANAGER_IS_SYSTEM(m)) {
                 m->unit_log_field = "UNIT=";
                 m->unit_log_format_string = "UNIT=%s";
+
+                m->invocation_log_field = "INVOCATION_ID=";
+                m->invocation_log_format_string = "INVOCATION_ID=" SD_ID128_FORMAT_STR;
         } else {
                 m->unit_log_field = "USER_UNIT=";
                 m->unit_log_format_string = "USER_UNIT=%s";
+
+                m->invocation_log_field = "USER_INVOCATION_ID=";
+                m->invocation_log_format_string = "USER_INVOCATION_ID=" SD_ID128_FORMAT_STR;
         }
 
         m->idle_pipe[0] = m->idle_pipe[1] = m->idle_pipe[2] = m->idle_pipe[3] = -1;
 
         m->pin_cgroupfs_fd = m->notify_fd = m->cgroups_agent_fd = m->signal_fd = m->time_change_fd =
-                m->dev_autofs_fd = m->private_listen_fd = m->kdbus_fd = m->cgroup_inotify_fd =
+                m->dev_autofs_fd = m->private_listen_fd = m->cgroup_inotify_fd =
                 m->ask_password_inotify_fd = -1;
 
+        m->user_lookup_fds[0] = m->user_lookup_fds[1] = -1;
+
         m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
 
         m->have_ask_password = -EINVAL; /* we don't know */
@@ -657,9 +667,8 @@ int manager_new(UnitFileScope scope, bool test_run, Manager **_m) {
                 goto fail;
         }
 
-        /* Note that we set up neither kdbus, nor the notify fd
-         * here. We do that after deserialization, since they might
-         * have gotten serialized across the reexec. */
+        /* Note that we do not set up the notify fd here. We do that after deserialization,
+         * since they might have gotten serialized across the reexec. */
 
         m->taint_usr = dir_is_empty("/usr") > 0;
 
@@ -767,7 +776,10 @@ static int manager_setup_cgroups_agent(Manager *m) {
         if (!MANAGER_IS_SYSTEM(m))
                 return 0;
 
-        if (cg_unified() > 0) /* We don't need this anymore on the unified hierarchy */
+        r = cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER);
+        if (r < 0)
+                return log_error_errno(r, "Failed to determine whether unified cgroups hierarchy is used: %m");
+        if (r > 0) /* We don't need this anymore on the unified hierarchy */
                 return 0;
 
         if (m->cgroups_agent_fd < 0) {
@@ -813,6 +825,59 @@ static int manager_setup_cgroups_agent(Manager *m) {
         return 0;
 }
 
+static int manager_setup_user_lookup_fd(Manager *m) {
+        int r;
+
+        assert(m);
+
+        /* Set up the socket pair used for passing UID/GID resolution results from forked off processes to PID
+         * 1. Background: we can't do name lookups (NSS) from PID 1, since it might involve IPC and thus activation,
+         * and we might hence deadlock on ourselves. Hence we do all user/group lookups asynchronously from the forked
+         * off processes right before executing the binaries to start. In order to be able to clean up any IPC objects
+         * created by a unit (see RemoveIPC=) we need to know in PID 1 the used UID/GID of the executed processes,
+         * hence we establish this communication channel so that forked off processes can pass their UID/GID
+         * information back to PID 1. The forked off processes send their resolved UID/GID to PID 1 in a simple
+         * datagram, along with their unit name, so that we can share one communication socket pair among all units for
+         * this purpose.
+         *
+         * You might wonder why we need a communication channel for this that is independent of the usual notification
+         * socket scheme (i.e. $NOTIFY_SOCKET). The primary difference is about trust: data sent via the $NOTIFY_SOCKET
+         * channel is only accepted if it originates from the right unit and if reception was enabled for it. The user
+         * lookup socket OTOH is only accessible by PID 1 and its children until they exec(), and always available.
+         *
+         * Note that this function is called under two circumstances: when we first initialize (in which case we
+         * allocate both the socket pair and the event source to listen on it), and when we deserialize after a reload
+         * (in which case the socket pair already exists but we still need to allocate the event source for it). */
+
+        if (m->user_lookup_fds[0] < 0) {
+
+                /* Free all secondary fields */
+                safe_close_pair(m->user_lookup_fds);
+                m->user_lookup_event_source = sd_event_source_unref(m->user_lookup_event_source);
+
+                if (socketpair(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0, m->user_lookup_fds) < 0)
+                        return log_error_errno(errno, "Failed to allocate user lookup socket: %m");
+
+                (void) fd_inc_rcvbuf(m->user_lookup_fds[0], NOTIFY_RCVBUF_SIZE);
+        }
+
+        if (!m->user_lookup_event_source) {
+                r = sd_event_add_io(m->event, &m->user_lookup_event_source, m->user_lookup_fds[0], EPOLLIN, manager_dispatch_user_lookup_fd, m);
+                if (r < 0)
+                        return log_error_errno(errno, "Failed to allocate user lookup event source: %m");
+
+                /* Process even earlier than the notify event source, so that we always know first about valid UID/GID
+                 * resolutions */
+                r = sd_event_source_set_priority(m->user_lookup_event_source, SD_EVENT_PRIORITY_NORMAL-8);
+                if (r < 0)
+                        return log_error_errno(errno, "Failed to set priority ot user lookup event source: %m");
+
+                (void) sd_event_source_set_description(m->user_lookup_event_source, "user-lookup");
+        }
+
+        return 0;
+}
+
 static int manager_connect_bus(Manager *m, bool reexecuting) {
         bool try_bus_connect;
 
@@ -822,7 +887,6 @@ static int manager_connect_bus(Manager *m, bool reexecuting) {
                 return 0;
 
         try_bus_connect =
-                m->kdbus_fd >= 0 ||
                 reexecuting ||
                 (MANAGER_IS_USER(m) && getenv("DBUS_SESSION_BUS_ADDRESS"));
 
@@ -854,8 +918,7 @@ enum {
         _GC_OFFSET_MAX
 };
 
-static void unit_gc_mark_good(Unit *u, unsigned gc_marker)
-{
+static void unit_gc_mark_good(Unit *u, unsigned gc_marker) {
         Iterator i;
         Unit *other;
 
@@ -920,10 +983,9 @@ good:
         unit_gc_mark_good(u, gc_marker);
 }
 
-static unsigned manager_dispatch_gc_queue(Manager *m) {
+static unsigned manager_dispatch_gc_unit_queue(Manager *m) {
+        unsigned n = 0, gc_marker;
         Unit *u;
-        unsigned n = 0;
-        unsigned gc_marker;
 
         assert(m);
 
@@ -935,12 +997,12 @@ static unsigned manager_dispatch_gc_queue(Manager *m) {
 
         gc_marker = m->gc_marker;
 
-        while ((u = m->gc_queue)) {
+        while ((u = m->gc_unit_queue)) {
                 assert(u->in_gc_queue);
 
                 unit_gc_sweep(u, gc_marker);
 
-                LIST_REMOVE(gc_queue, m->gc_queue, u);
+                LIST_REMOVE(gc_queue, m->gc_unit_queue, u);
                 u->in_gc_queue = false;
 
                 n++;
@@ -954,7 +1016,29 @@ static unsigned manager_dispatch_gc_queue(Manager *m) {
                 }
         }
 
-        m->n_in_gc_queue = 0;
+        return n;
+}
+
+static unsigned manager_dispatch_gc_job_queue(Manager *m) {
+        unsigned n = 0;
+        Job *j;
+
+        assert(m);
+
+        while ((j = m->gc_job_queue)) {
+                assert(j->in_gc_queue);
+
+                LIST_REMOVE(gc_queue, m->gc_job_queue, j);
+                j->in_gc_queue = false;
+
+                n++;
+
+                if (job_check_gc(j))
+                        continue;
+
+                log_unit_debug(j->unit, "Collecting job.");
+                (void) job_finish_and_invalidate(j, JOB_COLLECTED, false, false);
+        }
 
         return n;
 }
@@ -974,7 +1058,8 @@ static void manager_clear_jobs_and_units(Manager *m) {
         assert(!m->dbus_unit_queue);
         assert(!m->dbus_job_queue);
         assert(!m->cleanup_queue);
-        assert(!m->gc_queue);
+        assert(!m->gc_unit_queue);
+        assert(!m->gc_job_queue);
 
         assert(hashmap_isempty(m->jobs));
         assert(hashmap_isempty(m->units));
@@ -1004,7 +1089,11 @@ Manager* manager_free(Manager *m) {
 
         bus_done(m);
 
+        dynamic_user_vacuum(m, false);
+        hashmap_free(m->dynamic_users);
+
         hashmap_free(m->units);
+        hashmap_free(m->units_by_invocation_id);
         hashmap_free(m->jobs);
         hashmap_free(m->watch_pids1);
         hashmap_free(m->watch_pids2);
@@ -1019,12 +1108,13 @@ Manager* manager_free(Manager *m) {
         sd_event_source_unref(m->time_change_event_source);
         sd_event_source_unref(m->jobs_in_progress_event_source);
         sd_event_source_unref(m->run_queue_event_source);
+        sd_event_source_unref(m->user_lookup_event_source);
 
         safe_close(m->signal_fd);
         safe_close(m->notify_fd);
         safe_close(m->cgroups_agent_fd);
         safe_close(m->time_change_fd);
-        safe_close(m->kdbus_fd);
+        safe_close_pair(m->user_lookup_fds);
 
         manager_close_ask_password(m);
 
@@ -1050,8 +1140,10 @@ Manager* manager_free(Manager *m) {
         assert(hashmap_isempty(m->units_requiring_mounts_for));
         hashmap_free(m->units_requiring_mounts_for);
 
-        free(m);
-        return NULL;
+        hashmap_free(m->uid_refs);
+        hashmap_free(m->gid_refs);
+
+        return mfree(m);
 }
 
 void manager_enumerate(Manager *m) {
@@ -1128,7 +1220,7 @@ static void manager_build_unit_path_cache(Manager *m) {
                 FOREACH_DIRENT(de, d, r = -errno; goto fail) {
                         char *p;
 
-                        p = strjoin(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL);
+                        p = strjoin(streq(*i, "/") ? "" : *i, "/", de->d_name);
                         if (!p) {
                                 r = -ENOMEM;
                                 goto fail;
@@ -1174,11 +1266,17 @@ int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
         if (r < 0)
                 return r;
 
-        /* Make sure the transient directory always exists, so that it remains in the search path */
-        r = mkdir_p_label(m->lookup_paths.transient, 0755);
+        r = manager_run_environment_generators(m);
         if (r < 0)
                 return r;
 
+        /* Make sure the transient directory always exists, so that it remains in the search path */
+        if (!m->test_run) {
+                r = mkdir_p_label(m->lookup_paths.transient, 0755);
+                if (r < 0)
+                        return r;
+        }
+
         dual_timestamp_get(&m->generators_start_timestamp);
         r = manager_run_generators(m);
         dual_timestamp_get(&m->generators_finish_timestamp);
@@ -1219,14 +1317,26 @@ int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
         if (q < 0 && r == 0)
                 r = q;
 
-        /* We might have deserialized the kdbus control fd, but if we
-         * didn't, then let's create the bus now. */
-        manager_connect_bus(m, !!serialization);
-        bus_track_coldplug(m, &m->subscribed, &m->deserialized_subscribed);
+        q = manager_setup_user_lookup_fd(m);
+        if (q < 0 && r == 0)
+                r = q;
+
+        /* Let's connect to the bus now. */
+        (void) manager_connect_bus(m, !!serialization);
+
+        (void) bus_track_coldplug(m, &m->subscribed, false, m->deserialized_subscribed);
+        m->deserialized_subscribed = strv_free(m->deserialized_subscribed);
 
         /* Third, fire things up! */
         manager_coldplug(m);
 
+        /* Release any dynamic users no longer referenced */
+        dynamic_user_vacuum(m, true);
+
+        /* Release any references to UIDs/GIDs no longer referenced, and destroy any IPC owned by them */
+        manager_vacuum_uid_refs(m);
+        manager_vacuum_gid_refs(m);
+
         if (serialization) {
                 assert(m->n_reloading > 0);
                 m->n_reloading--;
@@ -1296,7 +1406,7 @@ tr_abort:
 }
 
 int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, sd_bus_error *e, Job **ret) {
-        Unit *unit;
+        Unit *unit = NULL;  /* just to appease gcc, initialization is not really necessary */
         int r;
 
         assert(m);
@@ -1307,6 +1417,7 @@ int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode
         r = manager_load_unit(m, name, NULL, NULL, &unit);
         if (r < 0)
                 return r;
+        assert(unit);
 
         return manager_add_job(m, type, unit, mode, e, ret);
 }
@@ -1379,6 +1490,7 @@ int manager_load_unit_prepare(
 
         assert(m);
         assert(name || path);
+        assert(_ret);
 
         /* This will prepare the unit for loading, but not actually
          * load anything from disk. */
@@ -1426,8 +1538,7 @@ int manager_load_unit_prepare(
         unit_add_to_dbus_queue(ret);
         unit_add_to_gc_queue(ret);
 
-        if (_ret)
-                *_ret = ret;
+        *_ret = ret;
 
         return 0;
 }
@@ -1442,6 +1553,7 @@ int manager_load_unit(
         int r;
 
         assert(m);
+        assert(_ret);
 
         /* This will load the service information files, but not actually
          * start any services or anything. */
@@ -1452,8 +1564,7 @@ int manager_load_unit(
 
         manager_dispatch_load_queue(m);
 
-        if (_ret)
-                *_ret = unit_follow_merge(*_ret);
+        *_ret = unit_follow_merge(*_ret);
 
         return 0;
 }
@@ -1632,7 +1743,6 @@ static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t
 
         struct cmsghdr *cmsg;
         struct ucred *ucred = NULL;
-        bool found = false;
         Unit *u1, *u2, *u3;
         int r, *fd_array = NULL;
         unsigned n_fds = 0;
@@ -1646,12 +1756,15 @@ static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t
                 return 0;
         }
 
-        n = recvmsg(m->notify_fd, &msghdr, MSG_DONTWAIT|MSG_CMSG_CLOEXEC);
+        n = recvmsg(m->notify_fd, &msghdr, MSG_DONTWAIT|MSG_CMSG_CLOEXEC|MSG_TRUNC);
         if (n < 0) {
-                if (errno == EAGAIN || errno == EINTR)
-                        return 0;
+                if (IN_SET(errno, EAGAIN, EINTR))
+                        return 0; /* Spurious wakeup, try again */
 
-                return -errno;
+                /* If this is any other, real error, then let's stop processing this socket. This of course means we
+                 * won't take notification messages anymore, but that's still better than busy looping around this:
+                 * being woken up over and over again but being unable to actually read the message off the socket. */
+                return log_error_errno(errno, "Failed to receive notification message: %m");
         }
 
         CMSG_FOREACH(cmsg, &msghdr) {
@@ -1684,40 +1797,40 @@ static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t
                 return 0;
         }
 
-        if ((size_t) n >= sizeof(buf)) {
+        if ((size_t) n >= sizeof(buf) || (msghdr.msg_flags & MSG_TRUNC)) {
                 log_warning("Received notify message exceeded maximum size. Ignoring.");
                 return 0;
         }
 
-        /* The message should be a string. Here we make sure it's NUL-terminated,
-         * but only the part until first NUL will be used anyway. */
+        /* As extra safety check, let's make sure the string we get doesn't contain embedded NUL bytes. We permit one
+         * trailing NUL byte in the message, but don't expect it. */
+        if (n > 1 && memchr(buf, 0, n-1)) {
+                log_warning("Received notify message with embedded NUL bytes. Ignoring.");
+                return 0;
+        }
+
+        /* Make sure it's NUL-terminated. */
         buf[n] = 0;
 
         /* Notify every unit that might be interested, but try
          * to avoid notifying the same one multiple times. */
         u1 = manager_get_unit_by_pid_cgroup(m, ucred->pid);
-        if (u1) {
+        if (u1)
                 manager_invoke_notify_message(m, u1, ucred, buf, fds);
-                found = true;
-        }
 
         u2 = hashmap_get(m->watch_pids1, PID_TO_PTR(ucred->pid));
-        if (u2 && u2 != u1) {
+        if (u2 && u2 != u1)
                 manager_invoke_notify_message(m, u2, ucred, buf, fds);
-                found = true;
-        }
 
         u3 = hashmap_get(m->watch_pids2, PID_TO_PTR(ucred->pid));
-        if (u3 && u3 != u2 && u3 != u1) {
+        if (u3 && u3 != u2 && u3 != u1)
                 manager_invoke_notify_message(m, u3, ucred, buf, fds);
-                found = true;
-        }
 
-        if (!found)
+        if (!u1 && !u2 && !u3)
                 log_warning("Cannot find unit for notify message of PID "PID_FMT".", ucred->pid);
 
         if (fdset_size(fds) > 0)
-                log_warning("Got auxiliary fds with notification message, closing all.");
+                log_warning("Got extra auxiliary fds with notification message, closing them.");
 
         return 0;
 }
@@ -1822,6 +1935,18 @@ static int manager_start_target(Manager *m, const char *name, JobMode mode) {
         return r;
 }
 
+static void manager_handle_ctrl_alt_del(Manager *m) {
+        /* If the user presses C-A-D more than
+         * 7 times within 2s, we reboot/shutdown immediately,
+         * unless it was disabled in system.conf */
+
+        if (ratelimit_test(&m->ctrl_alt_del_ratelimit) || m->cad_burst_action == EMERGENCY_ACTION_NONE)
+                manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
+        else
+                emergency_action(m, m->cad_burst_action, NULL,
+                                "Ctrl-Alt-Del was pressed more than 7 times within 2s");
+}
+
 static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
         Manager *m = userdata;
         ssize_t n;
@@ -1840,14 +1965,17 @@ static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t
         for (;;) {
                 n = read(m->signal_fd, &sfsi, sizeof(sfsi));
                 if (n != sizeof(sfsi)) {
+                        if (n >= 0) {
+                                log_warning("Truncated read from signal fd (%zu bytes)!", n);
+                                return 0;
+                        }
 
-                        if (n >= 0)
-                                return -EIO;
-
-                        if (errno == EINTR || errno == EAGAIN)
+                        if (IN_SET(errno, EINTR, EAGAIN))
                                 break;
 
-                        return -errno;
+                        /* We return an error here, which will kill this handler,
+                         * to avoid a busy loop on read error. */
+                        return log_error_errno(errno, "Reading from signal fd failed: %m");
                 }
 
                 log_received_signal(sfsi.ssi_signo == SIGCHLD ||
@@ -1865,7 +1993,9 @@ static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t
                         if (MANAGER_IS_SYSTEM(m)) {
                                 /* This is for compatibility with the
                                  * original sysvinit */
-                                m->exit_code = MANAGER_REEXECUTE;
+                                r = verify_run_space_and_log("Refusing to reexecute");
+                                if (r >= 0)
+                                        m->exit_code = MANAGER_REEXECUTE;
                                 break;
                         }
 
@@ -1873,19 +2003,7 @@ static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t
 
                 case SIGINT:
                         if (MANAGER_IS_SYSTEM(m)) {
-
-                                /* If the user presses C-A-D more than
-                                 * 7 times within 2s, we reboot
-                                 * immediately. */
-
-                                if (ratelimit_test(&m->ctrl_alt_del_ratelimit))
-                                        manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
-                                else {
-                                        log_notice("Ctrl-Alt-Del was pressed more than 7 times within 2s, rebooting immediately.");
-                                        status_printf(NULL, true, false, "Ctrl-Alt-Del was pressed more than 7 times within 2s, rebooting immediately.");
-                                        m->exit_code = MANAGER_REBOOT;
-                                }
-
+                                manager_handle_ctrl_alt_del(m);
                                 break;
                         }
 
@@ -1954,7 +2072,9 @@ static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t
                 }
 
                 case SIGHUP:
-                        m->exit_code = MANAGER_RELOAD;
+                        r = verify_run_space_and_log("Refusing to reload");
+                        if (r >= 0)
+                                m->exit_code = MANAGER_RELOAD;
                         break;
 
                 default: {
@@ -2058,8 +2178,8 @@ static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint
         assert(m);
         assert(m->time_change_fd == fd);
 
-        log_struct(LOG_INFO,
-                   LOG_MESSAGE_ID(SD_MESSAGE_TIME_CHANGE),
+        log_struct(LOG_DEBUG,
+                   "MESSAGE_ID=" SD_MESSAGE_TIME_CHANGE_STR,
                    LOG_MESSAGE("Time has been changed"),
                    NULL);
 
@@ -2141,7 +2261,10 @@ int manager_loop(Manager *m) {
                 if (manager_dispatch_load_queue(m) > 0)
                         continue;
 
-                if (manager_dispatch_gc_queue(m) > 0)
+                if (manager_dispatch_gc_job_queue(m) > 0)
+                        continue;
+
+                if (manager_dispatch_gc_unit_queue(m) > 0)
                         continue;
 
                 if (manager_dispatch_cleanup_queue(m) > 0)
@@ -2171,6 +2294,7 @@ int manager_loop(Manager *m) {
 
 int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u) {
         _cleanup_free_ char *n = NULL;
+        sd_id128_t invocation_id;
         Unit *u;
         int r;
 
@@ -2182,12 +2306,28 @@ int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e,
         if (r < 0)
                 return r;
 
+        /* Permit addressing units by invocation ID: if the passed bus path is suffixed by a 128bit ID then we use it
+         * as invocation ID. */
+        r = sd_id128_from_string(n, &invocation_id);
+        if (r >= 0) {
+                u = hashmap_get(m->units_by_invocation_id, &invocation_id);
+                if (u) {
+                        *_u = u;
+                        return 0;
+                }
+
+                return sd_bus_error_setf(e, BUS_ERROR_NO_UNIT_FOR_INVOCATION_ID, "No unit with the specified invocation ID " SD_ID128_FORMAT_STR " known.", SD_ID128_FORMAT_VAL(invocation_id));
+        }
+
+        /* If this didn't work, we check if this is a unit name */
+        if (!unit_name_is_valid(n, UNIT_NAME_PLAIN|UNIT_NAME_INSTANCE))
+                return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Unit name %s is neither a valid invocation ID nor unit name.", n);
+
         r = manager_load_unit(m, n, NULL, e, &u);
         if (r < 0)
                 return r;
 
         *_u = u;
-
         return 0;
 }
 
@@ -2308,18 +2448,14 @@ void manager_send_unit_plymouth(Manager *m, Unit *u) {
 }
 
 int manager_open_serialization(Manager *m, FILE **_f) {
-        const char *path;
-        int fd = -1;
+        int fd;
         FILE *f;
 
         assert(_f);
 
-        path = MANAGER_IS_SYSTEM(m) ? "/run/systemd" : "/tmp";
-        fd = open_tmpfile_unlinkable(path, O_RDWR|O_CLOEXEC);
+        fd = open_serialization_fd("systemd-state");
         if (fd < 0)
-                return -errno;
-
-        log_debug("Serializing state to %s", path);
+                return fd;
 
         f = fdopen(fd, "w+");
         if (!f) {
@@ -2328,7 +2464,6 @@ int manager_open_serialization(Manager *m, FILE **_f) {
         }
 
         *_f = f;
-
         return 0;
 }
 
@@ -2336,7 +2471,6 @@ int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
         Iterator i;
         Unit *u;
         const char *t;
-        char **e;
         int r;
 
         assert(m);
@@ -2366,17 +2500,8 @@ int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
                 dual_timestamp_serialize(f, "units-load-finish-timestamp", &m->units_load_finish_timestamp);
         }
 
-        if (!switching_root) {
-                STRV_FOREACH(e, m->environment) {
-                        _cleanup_free_ char *ce;
-
-                        ce = cescape(*e);
-                        if (!ce)
-                                return -ENOMEM;
-
-                        fprintf(f, "env=%s\n", *e);
-                }
-        }
+        if (!switching_root)
+                (void) serialize_environment(f, m->environment);
 
         if (m->notify_fd >= 0) {
                 int copy;
@@ -2399,17 +2524,28 @@ int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
                 fprintf(f, "cgroups-agent-fd=%i\n", copy);
         }
 
-        if (m->kdbus_fd >= 0) {
-                int copy;
+        if (m->user_lookup_fds[0] >= 0) {
+                int copy0, copy1;
 
-                copy = fdset_put_dup(fds, m->kdbus_fd);
-                if (copy < 0)
-                        return copy;
+                copy0 = fdset_put_dup(fds, m->user_lookup_fds[0]);
+                if (copy0 < 0)
+                        return copy0;
 
-                fprintf(f, "kdbus-fd=%i\n", copy);
+                copy1 = fdset_put_dup(fds, m->user_lookup_fds[1]);
+                if (copy1 < 0)
+                        return copy1;
+
+                fprintf(f, "user-lookup=%i %i\n", copy0, copy1);
         }
 
-        bus_track_serialize(m->subscribed, f);
+        bus_track_serialize(m->subscribed, f, "subscribed");
+
+        r = dynamic_user_serialize(m, f, fds);
+        if (r < 0)
+                return r;
+
+        manager_serialize_uid_refs(m, f);
+        manager_serialize_gid_refs(m, f);
 
         fputc('\n', f);
 
@@ -2452,7 +2588,8 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
         m->n_reloading++;
 
         for (;;) {
-                char line[LINE_MAX], *l;
+                char line[LINE_MAX];
+                const char *val, *l;
 
                 if (!fgets(line, sizeof(line), f)) {
                         if (feof(f))
@@ -2469,95 +2606,85 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
                 if (l[0] == 0)
                         break;
 
-                if (startswith(l, "current-job-id=")) {
+                if ((val = startswith(l, "current-job-id="))) {
                         uint32_t id;
 
-                        if (safe_atou32(l+15, &id) < 0)
-                                log_debug("Failed to parse current job id value %s", l+15);
+                        if (safe_atou32(val, &id) < 0)
+                                log_notice("Failed to parse current job id value %s", val);
                         else
                                 m->current_job_id = MAX(m->current_job_id, id);
 
-                } else if (startswith(l, "n-installed-jobs=")) {
+                } else if ((val = startswith(l, "n-installed-jobs="))) {
                         uint32_t n;
 
-                        if (safe_atou32(l+17, &n) < 0)
-                                log_debug("Failed to parse installed jobs counter %s", l+17);
+                        if (safe_atou32(val, &n) < 0)
+                                log_notice("Failed to parse installed jobs counter %s", val);
                         else
                                 m->n_installed_jobs += n;
 
-                } else if (startswith(l, "n-failed-jobs=")) {
+                } else if ((val = startswith(l, "n-failed-jobs="))) {
                         uint32_t n;
 
-                        if (safe_atou32(l+14, &n) < 0)
-                                log_debug("Failed to parse failed jobs counter %s", l+14);
+                        if (safe_atou32(val, &n) < 0)
+                                log_notice("Failed to parse failed jobs counter %s", val);
                         else
                                 m->n_failed_jobs += n;
 
-                } else if (startswith(l, "taint-usr=")) {
+                } else if ((val = startswith(l, "taint-usr="))) {
                         int b;
 
-                        b = parse_boolean(l+10);
+                        b = parse_boolean(val);
                         if (b < 0)
-                                log_debug("Failed to parse taint /usr flag %s", l+10);
+                                log_notice("Failed to parse taint /usr flag %s", val);
                         else
                                 m->taint_usr = m->taint_usr || b;
 
-                } else if (startswith(l, "firmware-timestamp="))
-                        dual_timestamp_deserialize(l+19, &m->firmware_timestamp);
-                else if (startswith(l, "loader-timestamp="))
-                        dual_timestamp_deserialize(l+17, &m->loader_timestamp);
-                else if (startswith(l, "kernel-timestamp="))
-                        dual_timestamp_deserialize(l+17, &m->kernel_timestamp);
-                else if (startswith(l, "initrd-timestamp="))
-                        dual_timestamp_deserialize(l+17, &m->initrd_timestamp);
-                else if (startswith(l, "userspace-timestamp="))
-                        dual_timestamp_deserialize(l+20, &m->userspace_timestamp);
-                else if (startswith(l, "finish-timestamp="))
-                        dual_timestamp_deserialize(l+17, &m->finish_timestamp);
-                else if (startswith(l, "security-start-timestamp="))
-                        dual_timestamp_deserialize(l+25, &m->security_start_timestamp);
-                else if (startswith(l, "security-finish-timestamp="))
-                        dual_timestamp_deserialize(l+26, &m->security_finish_timestamp);
-                else if (startswith(l, "generators-start-timestamp="))
-                        dual_timestamp_deserialize(l+27, &m->generators_start_timestamp);
-                else if (startswith(l, "generators-finish-timestamp="))
-                        dual_timestamp_deserialize(l+28, &m->generators_finish_timestamp);
-                else if (startswith(l, "units-load-start-timestamp="))
-                        dual_timestamp_deserialize(l+27, &m->units_load_start_timestamp);
-                else if (startswith(l, "units-load-finish-timestamp="))
-                        dual_timestamp_deserialize(l+28, &m->units_load_finish_timestamp);
+                } else if ((val = startswith(l, "firmware-timestamp=")))
+                        dual_timestamp_deserialize(val, &m->firmware_timestamp);
+                else if ((val = startswith(l, "loader-timestamp=")))
+                        dual_timestamp_deserialize(val, &m->loader_timestamp);
+                else if ((val = startswith(l, "kernel-timestamp=")))
+                        dual_timestamp_deserialize(val, &m->kernel_timestamp);
+                else if ((val = startswith(l, "initrd-timestamp=")))
+                        dual_timestamp_deserialize(val, &m->initrd_timestamp);
+                else if ((val = startswith(l, "userspace-timestamp=")))
+                        dual_timestamp_deserialize(val, &m->userspace_timestamp);
+                else if ((val = startswith(l, "finish-timestamp=")))
+                        dual_timestamp_deserialize(val, &m->finish_timestamp);
+                else if ((val = startswith(l, "security-start-timestamp=")))
+                        dual_timestamp_deserialize(val, &m->security_start_timestamp);
+                else if ((val = startswith(l, "security-finish-timestamp=")))
+                        dual_timestamp_deserialize(val, &m->security_finish_timestamp);
+                else if ((val = startswith(l, "generators-start-timestamp=")))
+                        dual_timestamp_deserialize(val, &m->generators_start_timestamp);
+                else if ((val = startswith(l, "generators-finish-timestamp=")))
+                        dual_timestamp_deserialize(val, &m->generators_finish_timestamp);
+                else if ((val = startswith(l, "units-load-start-timestamp=")))
+                        dual_timestamp_deserialize(val, &m->units_load_start_timestamp);
+                else if ((val = startswith(l, "units-load-finish-timestamp=")))
+                        dual_timestamp_deserialize(val, &m->units_load_finish_timestamp);
                 else if (startswith(l, "env=")) {
-                        _cleanup_free_ char *uce = NULL;
-                        char **e;
-
-                        r = cunescape(l + 4, UNESCAPE_RELAX, &uce);
-                        if (r < 0)
+                        r = deserialize_environment(&m->environment, l);
+                        if (r == -ENOMEM)
                                 goto finish;
+                        if (r < 0)
+                                log_notice_errno(r, "Failed to parse environment entry: \"%s\": %m", l);
 
-                        e = strv_env_set(m->environment, uce);
-                        if (!e) {
-                                r = -ENOMEM;
-                                goto finish;
-                        }
-
-                        strv_free(m->environment);
-                        m->environment = e;
-
-                } else if (startswith(l, "notify-fd=")) {
+                } else if ((val = startswith(l, "notify-fd="))) {
                         int fd;
 
-                        if (safe_atoi(l + 10, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
-                                log_debug("Failed to parse notify fd: %s", l + 10);
+                        if (safe_atoi(val, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
+                                log_notice("Failed to parse notify fd: \"%s\"", val);
                         else {
                                 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
                                 safe_close(m->notify_fd);
                                 m->notify_fd = fdset_remove(fds, fd);
                         }
 
-                } else if (startswith(l, "notify-socket=")) {
+                } else if ((val = startswith(l, "notify-socket="))) {
                         char *n;
 
-                        n = strdup(l+14);
+                        n = strdup(val);
                         if (!n) {
                                 r = -ENOMEM;
                                 goto finish;
@@ -2566,36 +2693,42 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
                         free(m->notify_socket);
                         m->notify_socket = n;
 
-                } else if (startswith(l, "cgroups-agent-fd=")) {
+                } else if ((val = startswith(l, "cgroups-agent-fd="))) {
                         int fd;
 
-                        if (safe_atoi(l + 17, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
-                                log_debug("Failed to parse cgroups agent fd: %s", l + 10);
+                        if (safe_atoi(val, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
+                                log_notice("Failed to parse cgroups agent fd: %s", val);
                         else {
                                 m->cgroups_agent_event_source = sd_event_source_unref(m->cgroups_agent_event_source);
                                 safe_close(m->cgroups_agent_fd);
                                 m->cgroups_agent_fd = fdset_remove(fds, fd);
                         }
 
-                } else if (startswith(l, "kdbus-fd=")) {
-                        int fd;
+                } else if ((val = startswith(l, "user-lookup="))) {
+                        int fd0, fd1;
 
-                        if (safe_atoi(l + 9, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
-                                log_debug("Failed to parse kdbus fd: %s", l + 9);
+                        if (sscanf(val, "%i %i", &fd0, &fd1) != 2 || fd0 < 0 || fd1 < 0 || fd0 == fd1 || !fdset_contains(fds, fd0) || !fdset_contains(fds, fd1))
+                                log_notice("Failed to parse user lookup fd: %s", val);
                         else {
-                                safe_close(m->kdbus_fd);
-                                m->kdbus_fd = fdset_remove(fds, fd);
+                                m->user_lookup_event_source = sd_event_source_unref(m->user_lookup_event_source);
+                                safe_close_pair(m->user_lookup_fds);
+                                m->user_lookup_fds[0] = fdset_remove(fds, fd0);
+                                m->user_lookup_fds[1] = fdset_remove(fds, fd1);
                         }
 
-                } else {
-                        int k;
+                } else if ((val = startswith(l, "dynamic-user=")))
+                        dynamic_user_deserialize_one(m, val, fds);
+                else if ((val = startswith(l, "destroy-ipc-uid=")))
+                        manager_deserialize_uid_refs_one(m, val);
+                else if ((val = startswith(l, "destroy-ipc-gid=")))
+                        manager_deserialize_gid_refs_one(m, val);
+                else if ((val = startswith(l, "subscribed="))) {
 
-                        k = bus_track_deserialize_item(&m->deserialized_subscribed, l);
-                        if (k < 0)
-                                log_debug_errno(k, "Failed to deserialize bus tracker object: %m");
-                        else if (k == 0)
-                                log_debug("Unknown serialization item '%s'", l);
-                }
+                        if (strv_extend(&m->deserialized_subscribed, val) < 0)
+                                log_oom();
+
+                } else if (!startswith(l, "kdbus-fd=")) /* ignore this one */
+                        log_notice("Unknown serialization item '%s'", l);
         }
 
         for (;;) {
@@ -2668,11 +2801,18 @@ int manager_reload(Manager *m) {
         manager_clear_jobs_and_units(m);
         lookup_paths_flush_generator(&m->lookup_paths);
         lookup_paths_free(&m->lookup_paths);
+        dynamic_user_vacuum(m, false);
+        m->uid_refs = hashmap_free(m->uid_refs);
+        m->gid_refs = hashmap_free(m->gid_refs);
 
         q = lookup_paths_init(&m->lookup_paths, m->unit_file_scope, 0, NULL);
         if (q < 0 && r >= 0)
                 r = q;
 
+        q = manager_run_environment_generators(m);
+        if (q < 0 && r >= 0)
+                r = q;
+
         /* Find new unit paths */
         q = manager_run_generators(m);
         if (q < 0 && r >= 0)
@@ -2701,9 +2841,20 @@ int manager_reload(Manager *m) {
         if (q < 0 && r >= 0)
                 r = q;
 
+        q = manager_setup_user_lookup_fd(m);
+        if (q < 0 && r >= 0)
+                r = q;
+
         /* Third, fire things up! */
         manager_coldplug(m);
 
+        /* Release any dynamic users no longer referenced */
+        dynamic_user_vacuum(m, true);
+
+        /* Release any references to UIDs/GIDs no longer referenced, and destroy any IPC owned by them */
+        manager_vacuum_uid_refs(m);
+        manager_vacuum_gid_refs(m);
+
         /* Sync current state of bus names with our set of listening units */
         if (m->api_bus)
                 manager_sync_bus_names(m, m->api_bus);
@@ -2765,7 +2916,7 @@ static void manager_notify_finished(Manager *m) {
                         initrd_usec = m->userspace_timestamp.monotonic - m->initrd_timestamp.monotonic;
 
                         log_struct(LOG_INFO,
-                                   LOG_MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
+                                   "MESSAGE_ID=" SD_MESSAGE_STARTUP_FINISHED_STR,
                                    "KERNEL_USEC="USEC_FMT, kernel_usec,
                                    "INITRD_USEC="USEC_FMT, initrd_usec,
                                    "USERSPACE_USEC="USEC_FMT, userspace_usec,
@@ -2780,7 +2931,7 @@ static void manager_notify_finished(Manager *m) {
                         initrd_usec = 0;
 
                         log_struct(LOG_INFO,
-                                   LOG_MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
+                                   "MESSAGE_ID=" SD_MESSAGE_STARTUP_FINISHED_STR,
                                    "KERNEL_USEC="USEC_FMT, kernel_usec,
                                    "USERSPACE_USEC="USEC_FMT, userspace_usec,
                                    LOG_MESSAGE("Startup finished in %s (kernel) + %s (userspace) = %s.",
@@ -2794,7 +2945,7 @@ static void manager_notify_finished(Manager *m) {
                 total_usec = userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
 
                 log_struct(LOG_INFO,
-                           LOG_MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
+                           "MESSAGE_ID=" SD_MESSAGE_USER_STARTUP_FINISHED_STR,
                            "USERSPACE_USEC="USEC_FMT, userspace_usec,
                            LOG_MESSAGE("Startup finished in %s.",
                                        format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC)),
@@ -2836,7 +2987,7 @@ void manager_check_finished(Manager *m) {
         manager_close_idle_pipe(m);
 
         /* Turn off confirm spawn now */
-        m->confirm_spawn = false;
+        m->confirm_spawn = NULL;
 
         /* No need to update ask password status when we're going non-interactive */
         manager_close_ask_password(m);
@@ -2854,10 +3005,56 @@ void manager_check_finished(Manager *m) {
         manager_invalidate_startup_units(m);
 }
 
+static bool generator_path_any(const char* const* paths) {
+        char **path;
+        bool found = false;
+
+        /* Optimize by skipping the whole process by not creating output directories
+         * if no generators are found. */
+        STRV_FOREACH(path, (char**) paths)
+                if (access(*path, F_OK) == 0)
+                        found = true;
+                else if (errno != ENOENT)
+                        log_warning_errno(errno, "Failed to open generator directory %s: %m", *path);
+
+        return found;
+}
+
+static const char* system_env_generator_binary_paths[] = {
+        "/run/systemd/system-environment-generators",
+        "/etc/systemd/system-environment-generators",
+        "/usr/local/lib/systemd/system-environment-generators",
+        SYSTEM_ENV_GENERATOR_PATH,
+        NULL
+};
+
+static const char* user_env_generator_binary_paths[] = {
+        "/run/systemd/user-environment-generators",
+        "/etc/systemd/user-environment-generators",
+        "/usr/local/lib/systemd/user-environment-generators",
+        USER_ENV_GENERATOR_PATH,
+        NULL
+};
+
+static int manager_run_environment_generators(Manager *m) {
+        char **tmp = NULL; /* this is only used in the forked process, no cleanup here */
+        const char **paths;
+        void* args[] = {&tmp, &tmp, &m->environment};
+
+        if (m->test_run)
+                return 0;
+
+        paths = MANAGER_IS_SYSTEM(m) ? system_env_generator_binary_paths : user_env_generator_binary_paths;
+
+        if (!generator_path_any(paths))
+                return 0;
+
+        return execute_directories(paths, DEFAULT_TIMEOUT_USEC, gather_environment, args, NULL);
+}
+
 static int manager_run_generators(Manager *m) {
         _cleanup_strv_free_ char **paths = NULL;
         const char *argv[5];
-        char **path;
         int r;
 
         assert(m);
@@ -2869,18 +3066,9 @@ static int manager_run_generators(Manager *m) {
         if (!paths)
                 return log_oom();
 
-        /* Optimize by skipping the whole process by not creating output directories
-         * if no generators are found. */
-        STRV_FOREACH(path, paths) {
-                if (access(*path, F_OK) >= 0)
-                        goto found;
-                if (errno != ENOENT)
-                        log_warning_errno(errno, "Failed to open generator directory %s: %m", *path);
-        }
-
-        return 0;
+        if (!generator_path_any((const char* const*) paths))
+                return 0;
 
- found:
         r = lookup_paths_mkdir_generator(&m->lookup_paths);
         if (r < 0)
                 goto finish;
@@ -2892,7 +3080,8 @@ static int manager_run_generators(Manager *m) {
         argv[4] = NULL;
 
         RUN_WITH_UMASK(0022)
-                execute_directories((const char* const*) paths, DEFAULT_TIMEOUT_USEC, (char**) argv);
+                execute_directories((const char* const*) paths, DEFAULT_TIMEOUT_USEC,
+                                    NULL, NULL, (char**) argv);
 
 finish:
         lookup_paths_trim_generator(&m->lookup_paths);
@@ -2950,7 +3139,7 @@ int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
 
                 m->rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
                 if (!m->rlimit[i])
-                        return -ENOMEM;
+                        return log_oom();
         }
 
         return 0;
@@ -3021,6 +3210,49 @@ static bool manager_get_show_status(Manager *m, StatusType type) {
         return false;
 }
 
+const char *manager_get_confirm_spawn(Manager *m) {
+        static int last_errno = 0;
+        const char *vc = m->confirm_spawn;
+        struct stat st;
+        int r;
+
+        /* Here's the deal: we want to test the validity of the console but don't want
+         * PID1 to go through the whole console process which might block. But we also
+         * want to warn the user only once if something is wrong with the console so we
+         * cannot do the sanity checks after spawning our children. So here we simply do
+         * really basic tests to hopefully trap common errors.
+         *
+         * If the console suddenly disappear at the time our children will really it
+         * then they will simply fail to acquire it and a positive answer will be
+         * assumed. New children will fallback to /dev/console though.
+         *
+         * Note: TTYs are devices that can come and go any time, and frequently aren't
+         * available yet during early boot (consider a USB rs232 dongle...). If for any
+         * reason the configured console is not ready, we fallback to the default
+         * console. */
+
+        if (!vc || path_equal(vc, "/dev/console"))
+                return vc;
+
+        r = stat(vc, &st);
+        if (r < 0)
+                goto fail;
+
+        if (!S_ISCHR(st.st_mode)) {
+                errno = ENOTTY;
+                goto fail;
+        }
+
+        last_errno = 0;
+        return vc;
+fail:
+        if (last_errno != errno) {
+                last_errno = errno;
+                log_warning_errno(errno, "Failed to open %s: %m, using default console", vc);
+        }
+        return "/dev/console";
+}
+
 void manager_set_first_boot(Manager *m, bool b) {
         assert(m);
 
@@ -3037,6 +3269,17 @@ void manager_set_first_boot(Manager *m, bool b) {
         m->first_boot = b;
 }
 
+void manager_disable_confirm_spawn(void) {
+        (void) touch("/run/systemd/confirm_spawn_disabled");
+}
+
+bool manager_is_confirm_spawn_disabled(Manager *m) {
+        if (!m->confirm_spawn)
+                return true;
+
+        return access("/run/systemd/confirm_spawn_disabled", F_OK) >= 0;
+}
+
 void manager_status_printf(Manager *m, StatusType type, const char *status, const char *format, ...) {
         va_list ap;
 
@@ -3138,6 +3381,300 @@ ManagerState manager_state(Manager *m) {
         return MANAGER_RUNNING;
 }
 
+#define DESTROY_IPC_FLAG (UINT32_C(1) << 31)
+
+static void manager_unref_uid_internal(
+                Manager *m,
+                Hashmap **uid_refs,
+                uid_t uid,
+                bool destroy_now,
+                int (*_clean_ipc)(uid_t uid)) {
+
+        uint32_t c, n;
+
+        assert(m);
+        assert(uid_refs);
+        assert(uid_is_valid(uid));
+        assert(_clean_ipc);
+
+        /* A generic implementation, covering both manager_unref_uid() and manager_unref_gid(), under the assumption
+         * that uid_t and gid_t are actually defined the same way, with the same validity rules.
+         *
+         * We store a hashmap where the UID/GID is they key and the value is a 32bit reference counter, whose highest
+         * bit is used as flag for marking UIDs/GIDs whose IPC objects to remove when the last reference to the UID/GID
+         * is dropped. The flag is set to on, once at least one reference from a unit where RemoveIPC= is set is added
+         * on a UID/GID. It is reset when the UID's/GID's reference counter drops to 0 again. */
+
+        assert_cc(sizeof(uid_t) == sizeof(gid_t));
+        assert_cc(UID_INVALID == (uid_t) GID_INVALID);
+
+        if (uid == 0) /* We don't keep track of root, and will never destroy it */
+                return;
+
+        c = PTR_TO_UINT32(hashmap_get(*uid_refs, UID_TO_PTR(uid)));
+
+        n = c & ~DESTROY_IPC_FLAG;
+        assert(n > 0);
+        n--;
+
+        if (destroy_now && n == 0) {
+                hashmap_remove(*uid_refs, UID_TO_PTR(uid));
+
+                if (c & DESTROY_IPC_FLAG) {
+                        log_debug("%s " UID_FMT " is no longer referenced, cleaning up its IPC.",
+                                  _clean_ipc == clean_ipc_by_uid ? "UID" : "GID",
+                                  uid);
+                        (void) _clean_ipc(uid);
+                }
+        } else {
+                c = n | (c & DESTROY_IPC_FLAG);
+                assert_se(hashmap_update(*uid_refs, UID_TO_PTR(uid), UINT32_TO_PTR(c)) >= 0);
+        }
+}
+
+void manager_unref_uid(Manager *m, uid_t uid, bool destroy_now) {
+        manager_unref_uid_internal(m, &m->uid_refs, uid, destroy_now, clean_ipc_by_uid);
+}
+
+void manager_unref_gid(Manager *m, gid_t gid, bool destroy_now) {
+        manager_unref_uid_internal(m, &m->gid_refs, (uid_t) gid, destroy_now, clean_ipc_by_gid);
+}
+
+static int manager_ref_uid_internal(
+                Manager *m,
+                Hashmap **uid_refs,
+                uid_t uid,
+                bool clean_ipc) {
+
+        uint32_t c, n;
+        int r;
+
+        assert(m);
+        assert(uid_refs);
+        assert(uid_is_valid(uid));
+
+        /* A generic implementation, covering both manager_ref_uid() and manager_ref_gid(), under the assumption
+         * that uid_t and gid_t are actually defined the same way, with the same validity rules. */
+
+        assert_cc(sizeof(uid_t) == sizeof(gid_t));
+        assert_cc(UID_INVALID == (uid_t) GID_INVALID);
+
+        if (uid == 0) /* We don't keep track of root, and will never destroy it */
+                return 0;
+
+        r = hashmap_ensure_allocated(uid_refs, &trivial_hash_ops);
+        if (r < 0)
+                return r;
+
+        c = PTR_TO_UINT32(hashmap_get(*uid_refs, UID_TO_PTR(uid)));
+
+        n = c & ~DESTROY_IPC_FLAG;
+        n++;
+
+        if (n & DESTROY_IPC_FLAG) /* check for overflow */
+                return -EOVERFLOW;
+
+        c = n | (c & DESTROY_IPC_FLAG) | (clean_ipc ? DESTROY_IPC_FLAG : 0);
+
+        return hashmap_replace(*uid_refs, UID_TO_PTR(uid), UINT32_TO_PTR(c));
+}
+
+int manager_ref_uid(Manager *m, uid_t uid, bool clean_ipc) {
+        return manager_ref_uid_internal(m, &m->uid_refs, uid, clean_ipc);
+}
+
+int manager_ref_gid(Manager *m, gid_t gid, bool clean_ipc) {
+        return manager_ref_uid_internal(m, &m->gid_refs, (uid_t) gid, clean_ipc);
+}
+
+static void manager_vacuum_uid_refs_internal(
+                Manager *m,
+                Hashmap **uid_refs,
+                int (*_clean_ipc)(uid_t uid)) {
+
+        Iterator i;
+        void *p, *k;
+
+        assert(m);
+        assert(uid_refs);
+        assert(_clean_ipc);
+
+        HASHMAP_FOREACH_KEY(p, k, *uid_refs, i) {
+                uint32_t c, n;
+                uid_t uid;
+
+                uid = PTR_TO_UID(k);
+                c = PTR_TO_UINT32(p);
+
+                n = c & ~DESTROY_IPC_FLAG;
+                if (n > 0)
+                        continue;
+
+                if (c & DESTROY_IPC_FLAG) {
+                        log_debug("Found unreferenced %s " UID_FMT " after reload/reexec. Cleaning up.",
+                                  _clean_ipc == clean_ipc_by_uid ? "UID" : "GID",
+                                  uid);
+                        (void) _clean_ipc(uid);
+                }
+
+                assert_se(hashmap_remove(*uid_refs, k) == p);
+        }
+}
+
+void manager_vacuum_uid_refs(Manager *m) {
+        manager_vacuum_uid_refs_internal(m, &m->uid_refs, clean_ipc_by_uid);
+}
+
+void manager_vacuum_gid_refs(Manager *m) {
+        manager_vacuum_uid_refs_internal(m, &m->gid_refs, clean_ipc_by_gid);
+}
+
+static void manager_serialize_uid_refs_internal(
+                Manager *m,
+                FILE *f,
+                Hashmap **uid_refs,
+                const char *field_name) {
+
+        Iterator i;
+        void *p, *k;
+
+        assert(m);
+        assert(f);
+        assert(uid_refs);
+        assert(field_name);
+
+        /* Serialize the UID reference table. Or actually, just the IPC destruction flag of it, as the actual counter
+         * of it is better rebuild after a reload/reexec. */
+
+        HASHMAP_FOREACH_KEY(p, k, *uid_refs, i) {
+                uint32_t c;
+                uid_t uid;
+
+                uid = PTR_TO_UID(k);
+                c = PTR_TO_UINT32(p);
+
+                if (!(c & DESTROY_IPC_FLAG))
+                        continue;
+
+                fprintf(f, "%s=" UID_FMT "\n", field_name, uid);
+        }
+}
+
+void manager_serialize_uid_refs(Manager *m, FILE *f) {
+        manager_serialize_uid_refs_internal(m, f, &m->uid_refs, "destroy-ipc-uid");
+}
+
+void manager_serialize_gid_refs(Manager *m, FILE *f) {
+        manager_serialize_uid_refs_internal(m, f, &m->gid_refs, "destroy-ipc-gid");
+}
+
+static void manager_deserialize_uid_refs_one_internal(
+                Manager *m,
+                Hashmap** uid_refs,
+                const char *value) {
+
+        uid_t uid;
+        uint32_t c;
+        int r;
+
+        assert(m);
+        assert(uid_refs);
+        assert(value);
+
+        r = parse_uid(value, &uid);
+        if (r < 0 || uid == 0) {
+                log_debug("Unable to parse UID reference serialization");
+                return;
+        }
+
+        r = hashmap_ensure_allocated(uid_refs, &trivial_hash_ops);
+        if (r < 0) {
+                log_oom();
+                return;
+        }
+
+        c = PTR_TO_UINT32(hashmap_get(*uid_refs, UID_TO_PTR(uid)));
+        if (c & DESTROY_IPC_FLAG)
+                return;
+
+        c |= DESTROY_IPC_FLAG;
+
+        r = hashmap_replace(*uid_refs, UID_TO_PTR(uid), UINT32_TO_PTR(c));
+        if (r < 0) {
+                log_debug("Failed to add UID reference entry");
+                return;
+        }
+}
+
+void manager_deserialize_uid_refs_one(Manager *m, const char *value) {
+        manager_deserialize_uid_refs_one_internal(m, &m->uid_refs, value);
+}
+
+void manager_deserialize_gid_refs_one(Manager *m, const char *value) {
+        manager_deserialize_uid_refs_one_internal(m, &m->gid_refs, value);
+}
+
+int manager_dispatch_user_lookup_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
+        struct buffer {
+                uid_t uid;
+                gid_t gid;
+                char unit_name[UNIT_NAME_MAX+1];
+        } _packed_ buffer;
+
+        Manager *m = userdata;
+        ssize_t l;
+        size_t n;
+        Unit *u;
+
+        assert_se(source);
+        assert_se(m);
+
+        /* Invoked whenever a child process succeeded resolving its user/group to use and sent us the resulting UID/GID
+         * in a datagram. We parse the datagram here and pass it off to the unit, so that it can add a reference to the
+         * UID/GID so that it can destroy the UID/GID's IPC objects when the reference counter drops to 0. */
+
+        l = recv(fd, &buffer, sizeof(buffer), MSG_DONTWAIT);
+        if (l < 0) {
+                if (errno == EINTR || errno == EAGAIN)
+                        return 0;
+
+                return log_error_errno(errno, "Failed to read from user lookup fd: %m");
+        }
+
+        if ((size_t) l <= offsetof(struct buffer, unit_name)) {
+                log_warning("Received too short user lookup message, ignoring.");
+                return 0;
+        }
+
+        if ((size_t) l > offsetof(struct buffer, unit_name) + UNIT_NAME_MAX) {
+                log_warning("Received too long user lookup message, ignoring.");
+                return 0;
+        }
+
+        if (!uid_is_valid(buffer.uid) && !gid_is_valid(buffer.gid)) {
+                log_warning("Got user lookup message with invalid UID/GID pair, ignoring.");
+                return 0;
+        }
+
+        n = (size_t) l - offsetof(struct buffer, unit_name);
+        if (memchr(buffer.unit_name, 0, n)) {
+                log_warning("Received lookup message with embedded NUL character, ignoring.");
+                return 0;
+        }
+
+        buffer.unit_name[n] = 0;
+        u = manager_get_unit(m, buffer.unit_name);
+        if (!u) {
+                log_debug("Got user lookup message but unit doesn't exist, ignoring.");
+                return 0;
+        }
+
+        log_unit_debug(u, "User lookup succeeded: uid=" UID_FMT " gid=" GID_FMT, buffer.uid, buffer.gid);
+
+        unit_notify_user_lookup(u, buffer.uid, buffer.gid);
+        return 0;
+}
+
 static const char *const manager_state_table[_MANAGER_STATE_MAX] = {
         [MANAGER_INITIALIZING] = "initializing",
         [MANAGER_STARTING] = "starting",
index 6ed15c1..4a9a37c 100644 (file)
@@ -81,6 +81,7 @@ struct Manager {
 
         /* Active jobs and units */
         Hashmap *units;  /* name string => Unit object n:1 */
+        Hashmap *units_by_invocation_id;
         Hashmap *jobs;   /* job id => Job object 1:1 */
 
         /* To make it easy to iterate through the units of a specific
@@ -103,8 +104,9 @@ struct Manager {
         /* Units to remove */
         LIST_HEAD(Unit, cleanup_queue);
 
-        /* Units to check when doing GC */
-        LIST_HEAD(Unit, gc_queue);
+        /* Units and jobs to check when doing GC */
+        LIST_HEAD(Unit, gc_unit_queue);
+        LIST_HEAD(Job, gc_job_queue);
 
         /* Units that should be realized */
         LIST_HEAD(Unit, cgroup_queue);
@@ -143,6 +145,9 @@ struct Manager {
 
         sd_event_source *jobs_in_progress_event_source;
 
+        int user_lookup_fds[2];
+        sd_event_source *user_lookup_event_source;
+
         UnitFileScope unit_file_scope;
         LookupPaths lookup_paths;
         Set *unit_path_cache;
@@ -225,7 +230,6 @@ struct Manager {
         int pin_cgroupfs_fd;
 
         int gc_marker;
-        unsigned n_in_gc_queue;
 
         /* Flags */
         ManagerExitCode exit_code:5;
@@ -234,7 +238,6 @@ struct Manager {
         bool dispatching_dbus_queue:1;
 
         bool taint_usr:1;
-
         bool test_run:1;
 
         /* If non-zero, exit with the following value when the systemd
@@ -243,7 +246,7 @@ struct Manager {
         uint8_t return_value;
 
         ShowStatus show_status;
-        bool confirm_spawn;
+        char *confirm_spawn;
         bool no_console_output;
 
         ExecOutput default_std_output, default_std_error;
@@ -292,18 +295,26 @@ struct Manager {
          * value where Unit objects are contained. */
         Hashmap *units_requiring_mounts_for;
 
-        /* Reference to the kdbus bus control fd */
-        int kdbus_fd;
-
         /* Used for processing polkit authorization responses */
         Hashmap *polkit_registry;
 
-        /* When the user hits C-A-D more than 7 times per 2s, reboot immediately... */
+        /* Dynamic users/groups, indexed by their name */
+        Hashmap *dynamic_users;
+
+        /* Keep track of all UIDs and GIDs any of our services currently use. This is useful for the RemoveIPC= logic. */
+        Hashmap *uid_refs;
+        Hashmap *gid_refs;
+
+        /* When the user hits C-A-D more than 7 times per 2s, do something immediately... */
         RateLimit ctrl_alt_del_ratelimit;
+        EmergencyAction cad_burst_action;
 
         const char *unit_log_field;
         const char *unit_log_format_string;
 
+        const char *invocation_log_field;
+        const char *invocation_log_format_string;
+
         int first_boot; /* tri-state */
 };
 
@@ -375,5 +386,24 @@ ManagerState manager_state(Manager *m);
 
 int manager_update_failed_units(Manager *m, Unit *u, bool failed);
 
+void manager_unref_uid(Manager *m, uid_t uid, bool destroy_now);
+int manager_ref_uid(Manager *m, uid_t uid, bool clean_ipc);
+
+void manager_unref_gid(Manager *m, gid_t gid, bool destroy_now);
+int manager_ref_gid(Manager *m, gid_t gid, bool destroy_now);
+
+void manager_vacuum_uid_refs(Manager *m);
+void manager_vacuum_gid_refs(Manager *m);
+
+void manager_serialize_uid_refs(Manager *m, FILE *f);
+void manager_deserialize_uid_refs_one(Manager *m, const char *value);
+
+void manager_serialize_gid_refs(Manager *m, FILE *f);
+void manager_deserialize_gid_refs_one(Manager *m, const char *value);
+
 const char *manager_state_to_string(ManagerState m) _const_;
 ManagerState manager_state_from_string(const char *s) _pure_;
+
+const char *manager_get_confirm_spawn(Manager *m);
+bool manager_is_confirm_spawn_disabled(Manager *m);
+void manager_disable_confirm_spawn(void);
diff --git a/src/core/meson.build b/src/core/meson.build
new file mode 100644 (file)
index 0000000..fb8f9dc
--- /dev/null
@@ -0,0 +1,235 @@
+libcore_la_sources = '''
+        unit.c
+        unit.h
+        unit-printf.c
+        unit-printf.h
+        job.c
+        job.h
+        manager.c
+        manager.h
+        transaction.c
+        transaction.h
+        load-fragment.c
+        load-fragment.h
+        service.c
+        service.h
+        socket.c
+        socket.h
+        busname.c
+        busname.h
+        bus-policy.c
+        bus-policy.h
+        target.c
+        target.h
+        device.c
+        device.h
+        mount.c
+        mount.h
+        automount.c
+        automount.h
+        swap.c
+        swap.h
+        timer.c
+        timer.h
+        path.c
+        path.h
+        slice.c
+        slice.h
+        scope.c
+        scope.h
+        load-dropin.c
+        load-dropin.h
+        execute.c
+        execute.h
+        dynamic-user.c
+        dynamic-user.h
+        kill.c
+        kill.h
+        dbus.c
+        dbus.h
+        dbus-manager.c
+        dbus-manager.h
+        dbus-unit.c
+        dbus-unit.h
+        dbus-job.c
+        dbus-job.h
+        dbus-service.c
+        dbus-service.h
+        dbus-socket.c
+        dbus-socket.h
+        dbus-busname.c
+        dbus-busname.h
+        dbus-target.c
+        dbus-target.h
+        dbus-device.c
+        dbus-device.h
+        dbus-mount.c
+        dbus-mount.h
+        dbus-automount.c
+        dbus-automount.h
+        dbus-swap.c
+        dbus-swap.h
+        dbus-timer.c
+        dbus-timer.h
+        dbus-path.c
+        dbus-path.h
+        dbus-slice.c
+        dbus-slice.h
+        dbus-scope.c
+        dbus-scope.h
+        dbus-execute.c
+        dbus-execute.h
+        dbus-kill.c
+        dbus-kill.h
+        dbus-cgroup.c
+        dbus-cgroup.h
+        cgroup.c
+        cgroup.h
+        selinux-access.c
+        selinux-access.h
+        selinux-setup.c
+        selinux-setup.h
+        smack-setup.c
+        smack-setup.h
+        ima-setup.c
+        ima-setup.h
+        locale-setup.h
+        locale-setup.c
+        hostname-setup.c
+        hostname-setup.h
+        machine-id-setup.c
+        machine-id-setup.h
+        mount-setup.c
+        mount-setup.h
+        kmod-setup.c
+        kmod-setup.h
+        loopback-setup.h
+        loopback-setup.c
+        namespace.c
+        namespace.h
+        killall.h
+        killall.c
+        audit-fd.c
+        audit-fd.h
+        show-status.c
+        show-status.h
+        emergency-action.c
+        emergency-action.h
+'''.split()
+
+load_fragment_gperf_gperf = custom_target(
+        'load-fragment-gperf.gperf',
+        input : 'load-fragment-gperf.gperf.m4',
+        output: 'load-fragment-gperf.gperf',
+        command : [m4, '-P'] + m4_defines + ['@INPUT@'],
+        capture : true)
+
+load_fragment_gperf_c = custom_target(
+        'load-fragment-gperf.c',
+        input : load_fragment_gperf_gperf,
+        output : 'load-fragment-gperf.c',
+        command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@'])
+
+awkscript = 'load-fragment-gperf-nulstr.awk'
+load_fragment_gperf_nulstr_c = custom_target(
+        'load-fragment-gperf-nulstr.c',
+        input : [awkscript, load_fragment_gperf_gperf],
+        output : 'load-fragment-gperf-nulstr.c',
+        command : [awk, '-f', '@INPUT0@', '@INPUT1@'],
+        capture : true)
+
+libcore = static_library(
+        'core',
+        libcore_la_sources,
+        load_fragment_gperf_c,
+        load_fragment_gperf_nulstr_c,
+        include_directories : includes,
+        link_with : [libshared_static],
+        dependencies : [threads,
+                        libseccomp,
+                        libpam,
+                        libaudit,
+                        libkmod,
+                        libapparmor,
+                        libmount])
+
+systemd_sources = files('main.c')
+
+systemd_shutdown_sources = files('''
+        shutdown.c
+        umount.c
+        umount.h
+        mount-setup.c
+        mount-setup.h
+        killall.c
+        killall.h
+'''.split())
+
+in_files = [['macros.systemd',   rpmmacrosdir],
+            ['triggers.systemd', ''],
+            ['systemd.pc',       pkgconfigdatadir]]
+
+foreach item : in_files
+        file = item[0]
+        dir = item[1]
+
+        # If 'no', disable generation completely.
+        # If '', generate, but do not install.
+        if dir != 'no'
+                gen = configure_file(
+                        input : file + '.in',
+                        output : file,
+                        configuration : substs)
+                if dir != ''
+                        install_data(gen,
+                                     install_dir : dir)
+                endif
+        endif
+endforeach
+
+install_data('org.freedesktop.systemd1.conf',
+             install_dir : dbuspolicydir)
+install_data('org.freedesktop.systemd1.service',
+             install_dir : dbussystemservicedir)
+
+policy_in = configure_file(
+        input : 'org.freedesktop.systemd1.policy.in.in',
+        output : 'org.freedesktop.systemd1.policy.in',
+        configuration : substs)
+
+custom_target(
+        'org.freedesktop.systemd1.policy',
+        input : policy_in,
+        output : 'org.freedesktop.systemd1.policy',
+        command : intltool_command,
+        install : install_polkit,
+        install_dir : polkitpolicydir)
+
+# TODO: this might work with meson from git, see
+# https://github.com/mesonbuild/meson/issues/1441#issuecomment-283585493
+#
+# i18n.merge_file(
+#   'org.freedesktop.systemd1.policy',
+#   po_dir : po_dir,
+#   input : policy_in,
+#   output : 'org.freedesktop.systemd1.policy',
+#   install : install_polkit,
+#   install_dir : polkitpolicydir)
+
+install_data('system.conf',
+             'user.conf',
+             install_dir : pkgsysconfdir)
+
+meson.add_install_script('sh', '-c', mkdir_p.format(systemshutdowndir))
+meson.add_install_script('sh', '-c', mkdir_p.format(systemsleepdir))
+meson.add_install_script('sh', '-c', mkdir_p.format(systemgeneratordir))
+meson.add_install_script('sh', '-c', mkdir_p.format(usergeneratordir))
+
+meson.add_install_script('sh', '-c',
+                         mkdir_p.format(join_paths(pkgsysconfdir, 'system/multi-user.target.wants')))
+meson.add_install_script('sh', '-c',
+                         mkdir_p.format(join_paths(pkgsysconfdir, 'system/getty.target.wants')))
+meson.add_install_script('sh', '-c',
+                         mkdir_p.format(join_paths(pkgsysconfdir, 'user')))
+meson.add_install_script('sh', '-c',
+                         mkdir_p.format(join_paths(sysconfdir, 'xdg/systemd')))
index 67eac1a..686de66 100644 (file)
@@ -99,12 +99,14 @@ static const MountPoint mount_table[] = {
         { "tmpfs",       "/run",                      "tmpfs",      "mode=755",                MS_NOSUID|MS_NODEV|MS_STRICTATIME|MS_NOEXEC,
           NULL,          MNT_FATAL|MNT_IN_CONTAINER },
         { "cgroup",      "/sys/fs/cgroup",            "cgroup2",    NULL,                      MS_NOSUID|MS_NOEXEC|MS_NODEV,
-          cg_is_unified_wanted, MNT_FATAL|MNT_IN_CONTAINER },
+          cg_is_unified_wanted, MNT_IN_CONTAINER },
         { "tmpfs",       "/sys/fs/cgroup",            "tmpfs",      "mode=755",                MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME,
           cg_is_legacy_wanted, MNT_FATAL|MNT_IN_CONTAINER },
 #endif
+        { "cgroup",      "/sys/fs/cgroup/unified",    "cgroup2",    NULL,                      MS_NOSUID|MS_NOEXEC|MS_NODEV,
+          cg_is_hybrid_wanted, MNT_IN_CONTAINER },
         { "cgroup",      "/sys/fs/cgroup/systemd",    "cgroup",     "none,name=systemd,xattr", MS_NOSUID|MS_NOEXEC|MS_NODEV,
-          cg_is_legacy_wanted, MNT_IN_CONTAINER           },
+          cg_is_legacy_wanted, MNT_IN_CONTAINER     },
         { "cgroup",      "/sys/fs/cgroup/systemd",    "cgroup",     "none,name=systemd",       MS_NOSUID|MS_NOEXEC|MS_NODEV,
           cg_is_legacy_wanted, MNT_FATAL|MNT_IN_CONTAINER },
         { "pstore",      "/sys/fs/pstore",            "pstore",     NULL,                      MS_NOSUID|MS_NOEXEC|MS_NODEV,
@@ -161,7 +163,7 @@ static int mount_one(const MountPoint *p, bool relabel) {
         if (relabel)
                 (void) label_fix(p->where, true, true);
 
-        r = path_is_mount_point(p->where, AT_SYMLINK_FOLLOW);
+        r = path_is_mount_point(p->where, NULL, AT_SYMLINK_FOLLOW);
         if (r < 0 && r != -ENOENT) {
                 log_full_errno((p->mode & MNT_FATAL) ? LOG_ERR : LOG_DEBUG, r, "Failed to determine whether %s is a mount point: %m", p->where);
                 return (p->mode & MNT_FATAL) ? r : 0;
@@ -367,7 +369,6 @@ int mount_setup(bool loaded_policy) {
         int r = 0;
 
         r = mount_points_setup(ELEMENTSOF(mount_table), loaded_policy);
-
         if (r < 0)
                 return r;
 
@@ -398,25 +399,24 @@ int mount_setup(bool loaded_policy) {
          * udevd. */
         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
-         * it makes more sense to have a default of "shared" so that
-         * nspawn and the container tools work out of the box. If
-         * specific setups need other settings they can reset the
-         * propagation mode to private if needed. */
+        /* Mark the root directory as shared in regards to mount propagation. The kernel defaults to "private", but we
+         * think it makes more sense to have a default of "shared" so that nspawn and the container tools work out of
+         * the box. If specific setups need other settings they can reset the propagation mode to private if
+         * needed. Note that we set this only when we are invoked directly by the kernel. If we are invoked by a
+         * container manager we assume the container manager knows what it is doing (for example, because it set up
+         * some directories with different propagation modes). */
         if (detect_container() <= 0)
                 if (mount(NULL, "/", NULL, MS_REC|MS_SHARED, NULL) < 0)
                         log_warning_errno(errno, "Failed to set up the root directory for shared mount propagation: %m");
 
-        /* Create a few directories we always want around, Note that
-         * sd_booted() checks for /run/systemd/system, so this mkdir
-         * really needs to stay for good, otherwise software that
-         * copied sd-daemon.c into their sources will misdetect
-         * systemd. */
+        /* Create a few directories we always want around, Note that sd_booted() checks for /run/systemd/system, so
+         * this mkdir really needs to stay for good, otherwise software that copied sd-daemon.c into their sources will
+         * misdetect systemd. */
         (void) mkdir_label("/run/systemd", 0755);
         (void) mkdir_label("/run/systemd/system", 0755);
-        (void) mkdir_label("/run/systemd/inaccessible", 0000);
+
         /* Set up inaccessible items */
+        (void) mkdir_label("/run/systemd/inaccessible", 0000);
         (void) mknod("/run/systemd/inaccessible/reg", S_IFREG | 0000, 0);
         (void) mkdir_label("/run/systemd/inaccessible/dir", 0000);
         (void) mknod("/run/systemd/inaccessible/chr", S_IFCHR | 0000, makedev(0, 0));
index fda4d65..214364d 100644 (file)
@@ -28,7 +28,7 @@
 #include "dbus-mount.h"
 #include "escape.h"
 #include "exit-status.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fstab-util.h"
 #include "log.h"
 #include "manager.h"
@@ -135,6 +135,16 @@ static bool mount_state_active(MountState state) {
                       MOUNT_REMOUNTING_SIGKILL);
 }
 
+static bool mount_is_bound_to_device(const Mount *m) {
+        const MountParameters *p;
+
+        if (m->from_fragment)
+                return true;
+
+        p = &m->parameters_proc_self_mountinfo;
+        return fstab_test_option(p->options, "x-systemd.device-bound\0");
+}
+
 static bool needs_quota(const MountParameters *p) {
         assert(p);
 
@@ -159,17 +169,6 @@ static void mount_init(Unit *u) {
         m->timeout_usec = u->manager->default_timeout_start_usec;
         m->directory_mode = 0755;
 
-        if (unit_has_name(u, "-.mount")) {
-                /* Don't allow start/stop for root directory */
-                u->refuse_manual_start = true;
-                u->refuse_manual_stop = true;
-        } else {
-                /* The stdio/kmsg bridge socket is on /, in order to avoid a
-                 * dep loop, don't use kmsg logging for -.mount */
-                m->exec_context.std_output = u->manager->default_std_output;
-                m->exec_context.std_error = u->manager->default_std_error;
-        }
-
         /* We need to make sure that /usr/bin/mount is always called
          * in the same process group as us, so that the autofs kernel
          * side doesn't send us another mount request while we are
@@ -245,6 +244,8 @@ static void mount_done(Unit *u) {
         exec_command_done_array(m->exec_command, _MOUNT_EXEC_COMMAND_MAX);
         m->control_command = NULL;
 
+        dynamic_creds_unref(&m->dynamic_creds);
+
         mount_unwatch_control_pid(m);
 
         m->timer_event_source = sd_event_source_unref(m->timer_event_source);
@@ -333,6 +334,7 @@ static int mount_add_mount_links(Mount *m) {
 static int mount_add_device_links(Mount *m) {
         MountParameters *p;
         bool device_wants_mount = false;
+        UnitDependency dep;
         int r;
 
         assert(m);
@@ -362,7 +364,14 @@ static int mount_add_device_links(Mount *m) {
         if (mount_is_auto(p) && !mount_is_automount(p) && MANAGER_IS_SYSTEM(UNIT(m)->manager))
                 device_wants_mount = true;
 
-        r = unit_add_node_link(UNIT(m), p->what, device_wants_mount, m->from_fragment ? UNIT_BINDS_TO : UNIT_REQUIRES);
+        /* Mount units from /proc/self/mountinfo are not bound to devices
+         * by default since they're subject to races when devices are
+         * unplugged. But the user can still force this dep with an
+         * appropriate option (or udev property) so the mount units are
+         * automatically stopped when the device disappears suddenly. */
+        dep = mount_is_bound_to_device(m) ? UNIT_BINDS_TO : UNIT_REQUIRES;
+
+        r = unit_add_node_link(UNIT(m), p->what, device_wants_mount, dep);
         if (r < 0)
                 return r;
 
@@ -396,19 +405,35 @@ static int mount_add_quota_links(Mount *m) {
         return 0;
 }
 
-static bool should_umount(Mount *m) {
+static bool mount_is_extrinsic(Mount *m) {
         MountParameters *p;
+        assert(m);
 
-        if (PATH_IN_SET(m->where, "/", "/usr") ||
-            path_startswith(m->where, "/run/initramfs"))
-                return false;
+        /* Returns true for all units that are "magic" and should be excluded from the usual start-up and shutdown
+         * dependencies. We call them "extrinsic" here, as they are generally mounted outside of the systemd dependency
+         * logic. We shouldn't attempt to manage them ourselves but it's fine if the user operates on them with us. */
+
+        if (!MANAGER_IS_SYSTEM(UNIT(m)->manager)) /* We only automatically manage mounts if we are in system mode */
+                return true;
+
+        if (PATH_IN_SET(m->where,  /* Don't bother with the OS data itself */
+                        "/",
+                        "/usr"))
+                return true;
 
+        if (PATH_STARTSWITH_SET(m->where,
+                                "/run/initramfs",    /* This should stay around from before we boot until after we shutdown */
+                                "/proc",             /* All of this is API VFS */
+                                "/sys",              /* … dito … */
+                                "/dev"))             /* … dito … */
+                return true;
+
+        /* If this is an initrd mount, and we are not in the initrd, then leave this around forever, too. */
         p = get_mount_parameters(m);
-        if (p && fstab_test_option(p->options, "x-initrd.mount\0") &&
-            !in_initrd())
-                return false;
+        if (p && fstab_test_option(p->options, "x-initrd.mount\0") && !in_initrd())
+                return true;
 
-        return true;
+        return false;
 }
 
 static int mount_add_default_dependencies(Mount *m) {
@@ -421,20 +446,10 @@ static int mount_add_default_dependencies(Mount *m) {
         if (!UNIT(m)->default_dependencies)
                 return 0;
 
-        if (!MANAGER_IS_SYSTEM(UNIT(m)->manager))
-                return 0;
-
-        /* We do not add any default dependencies to /, /usr or
-         * /run/initramfs/, since they are guaranteed to stay
-         * mounted the whole time, since our system is on it.
-         * Also, don't bother with anything mounted below virtual
-         * file systems, it's also going to be virtual, and hence
-         * not worth the effort. */
-        if (PATH_IN_SET(m->where, "/", "/usr") ||
-            path_startswith(m->where, "/run/initramfs") ||
-            path_startswith(m->where, "/proc") ||
-            path_startswith(m->where, "/sys") ||
-            path_startswith(m->where, "/dev"))
+        /* We do not add any default dependencies to /, /usr or /run/initramfs/, since they are guaranteed to stay
+         * mounted the whole time, since our system is on it.  Also, don't bother with anything mounted below virtual
+         * file systems, it's also going to be virtual, and hence not worth the effort. */
+        if (mount_is_extrinsic(m))
                 return 0;
 
         p = get_mount_parameters(m);
@@ -471,17 +486,16 @@ static int mount_add_default_dependencies(Mount *m) {
         if (r < 0)
                 return r;
 
-        if (should_umount(m)) {
-                r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
-                if (r < 0)
-                        return r;
-        }
+        r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
+        if (r < 0)
+                return r;
 
         return 0;
 }
 
 static int mount_verify(Mount *m) {
         _cleanup_free_ char *e = NULL;
+        MountParameters *p;
         int r;
 
         assert(m);
@@ -506,7 +520,8 @@ static int mount_verify(Mount *m) {
                 return -EINVAL;
         }
 
-        if (UNIT(m)->fragment_path && !m->parameters_fragment.what) {
+        p = get_mount_parameters_fragment(m);
+        if (p && !p->what) {
                 log_unit_error(UNIT(m), "What= setting is missing. Refusing.");
                 return -EBADMSG;
         }
@@ -573,6 +588,25 @@ static int mount_add_extras(Mount *m) {
         return 0;
 }
 
+static int mount_load_root_mount(Unit *u) {
+        assert(u);
+
+        if (!unit_has_name(u, SPECIAL_ROOT_MOUNT))
+                return 0;
+
+        u->perpetual = true;
+        u->default_dependencies = false;
+
+        /* The stdio/kmsg bridge socket is on /, in order to avoid a dep loop, don't use kmsg logging for -.mount */
+        MOUNT(u)->exec_context.std_output = EXEC_OUTPUT_NULL;
+        MOUNT(u)->exec_context.std_input = EXEC_INPUT_NULL;
+
+        if (!u->description)
+                u->description = strdup("Root Mount");
+
+        return 1;
+}
+
 static int mount_load(Unit *u) {
         Mount *m = MOUNT(u);
         int r;
@@ -580,11 +614,14 @@ static int mount_load(Unit *u) {
         assert(u);
         assert(u->load_state == UNIT_STUB);
 
-        if (m->from_proc_self_mountinfo)
+        r = mount_load_root_mount(u);
+        if (r < 0)
+                return r;
+
+        if (m->from_proc_self_mountinfo || u->perpetual)
                 r = unit_load_fragment_and_dropin_optional(u);
         else
                 r = unit_load_fragment_and_dropin(u);
-
         if (r < 0)
                 return r;
 
@@ -648,6 +685,9 @@ static int mount_coldplug(Unit *u) {
                         return r;
         }
 
+        if (!IN_SET(new_state, MOUNT_DEAD, MOUNT_FAILED))
+                (void) unit_setup_dynamic_creds(u);
+
         mount_set_state(m, new_state);
         return 0;
 }
@@ -670,7 +710,11 @@ static void mount_dump(Unit *u, FILE *f, const char *prefix) {
                 "%sOptions: %s\n"
                 "%sFrom /proc/self/mountinfo: %s\n"
                 "%sFrom fragment: %s\n"
-                "%sDirectoryMode: %04o\n",
+                "%sExtrinsic: %s\n"
+                "%sDirectoryMode: %04o\n"
+                "%sSloppyOptions: %s\n"
+                "%sLazyUnmount: %s\n"
+                "%sForceUnmount: %s\n",
                 prefix, mount_state_to_string(m->state),
                 prefix, mount_result_to_string(m->result),
                 prefix, m->where,
@@ -679,7 +723,11 @@ static void mount_dump(Unit *u, FILE *f, const char *prefix) {
                 prefix, p ? strna(p->options) : "n/a",
                 prefix, yes_no(m->from_proc_self_mountinfo),
                 prefix, yes_no(m->from_fragment),
-                prefix, m->directory_mode);
+                prefix, yes_no(mount_is_extrinsic(m)),
+                prefix, m->directory_mode,
+                prefix, yes_no(m->sloppy_options),
+                prefix, yes_no(m->lazy_unmount),
+                prefix, yes_no(m->force_unmount));
 
         if (m->control_pid > 0)
                 fprintf(f,
@@ -694,12 +742,10 @@ static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
         pid_t pid;
         int r;
         ExecParameters exec_params = {
-                .apply_permissions = true,
-                .apply_chroot      = true,
-                .apply_tty_stdin   = true,
-                .stdin_fd          = -1,
-                .stdout_fd         = -1,
-                .stderr_fd         = -1,
+                .flags      = EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_APPLY_TTY_STDIN,
+                .stdin_fd   = -1,
+                .stdout_fd  = -1,
+                .stderr_fd  = -1,
         };
 
         assert(m);
@@ -716,12 +762,16 @@ static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
         if (r < 0)
                 return r;
 
+        r = unit_setup_dynamic_creds(UNIT(m));
+        if (r < 0)
+                return r;
+
         r = mount_arm_timer(m, usec_add(now(CLOCK_MONOTONIC), m->timeout_usec));
         if (r < 0)
                 return r;
 
         exec_params.environment = UNIT(m)->manager->environment;
-        exec_params.confirm_spawn = UNIT(m)->manager->confirm_spawn;
+        exec_params.confirm_spawn = manager_get_confirm_spawn(UNIT(m)->manager);
         exec_params.cgroup_supported = UNIT(m)->manager->cgroup_supported;
         exec_params.cgroup_path = UNIT(m)->cgroup_path;
         exec_params.cgroup_delegate = m->cgroup_context.delegate;
@@ -732,6 +782,7 @@ static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
                        &m->exec_context,
                        &exec_params,
                        m->exec_runtime,
+                       &m->dynamic_creds,
                        &pid);
         if (r < 0)
                 return r;
@@ -749,21 +800,25 @@ static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
 static void mount_enter_dead(Mount *m, MountResult f) {
         assert(m);
 
-        if (f != MOUNT_SUCCESS)
+        if (m->result == MOUNT_SUCCESS)
                 m->result = f;
 
+        mount_set_state(m, m->result != MOUNT_SUCCESS ? MOUNT_FAILED : MOUNT_DEAD);
+
         exec_runtime_destroy(m->exec_runtime);
         m->exec_runtime = exec_runtime_unref(m->exec_runtime);
 
         exec_context_destroy_runtime_directory(&m->exec_context, manager_get_runtime_prefix(UNIT(m)->manager));
 
-        mount_set_state(m, m->result != MOUNT_SUCCESS ? MOUNT_FAILED : MOUNT_DEAD);
+        unit_unref_uid_gid(UNIT(m), true);
+
+        dynamic_creds_destroy(&m->dynamic_creds);
 }
 
 static void mount_enter_mounted(Mount *m, MountResult f) {
         assert(m);
 
-        if (f != MOUNT_SUCCESS)
+        if (m->result == MOUNT_SUCCESS)
                 m->result = f;
 
         mount_set_state(m, MOUNT_MOUNTED);
@@ -774,7 +829,7 @@ static void mount_enter_signal(Mount *m, MountState state, MountResult f) {
 
         assert(m);
 
-        if (f != MOUNT_SUCCESS)
+        if (m->result == MOUNT_SUCCESS)
                 m->result = f;
 
         r = unit_kill_context(
@@ -810,7 +865,7 @@ static void mount_enter_signal(Mount *m, MountState state, MountResult f) {
 fail:
         log_unit_warning_errno(UNIT(m), r, "Failed to kill processes: %m");
 
-        if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL)
+        if (IN_SET(state, MOUNT_REMOUNTING_SIGTERM, MOUNT_REMOUNTING_SIGKILL))
                 mount_enter_mounted(m, MOUNT_FAILURE_RESOURCES);
         else
                 mount_enter_dead(m, MOUNT_FAILURE_RESOURCES);
@@ -831,7 +886,11 @@ static void mount_enter_unmounting(Mount *m) {
         m->control_command_id = MOUNT_EXEC_UNMOUNT;
         m->control_command = m->exec_command + MOUNT_EXEC_UNMOUNT;
 
-        r = exec_command_set(m->control_command, UMOUNT_PATH, m->where, NULL);
+        r = exec_command_set(m->control_command, UMOUNT_PATH, m->where, "-c", NULL);
+        if (r >= 0 && m->lazy_unmount)
+                r = exec_command_append(m->control_command, "-l", NULL);
+        if (r >= 0 && m->force_unmount)
+                r = exec_command_append(m->control_command, "-f", NULL);
         if (r < 0)
                 goto fail;
 
@@ -850,11 +909,6 @@ fail:
         mount_enter_mounted(m, MOUNT_FAILURE_RESOURCES);
 }
 
-static int mount_get_opts(Mount *m, char **ret) {
-        return fstab_filter_options(m->parameters_fragment.options,
-                                    "nofail\0" "noauto\0" "auto\0", NULL, NULL, ret);
-}
-
 static void mount_enter_mounting(Mount *m) {
         int r;
         MountParameters *p;
@@ -877,19 +931,18 @@ static void mount_enter_mounting(Mount *m) {
         if (p && mount_is_bind(p))
                 (void) mkdir_p_label(p->what, m->directory_mode);
 
-        if (m->from_fragment) {
+        if (p) {
                 _cleanup_free_ char *opts = NULL;
 
-                r = mount_get_opts(m, &opts);
+                r = fstab_filter_options(p->options, "nofail\0" "noauto\0" "auto\0", NULL, NULL, &opts);
                 if (r < 0)
                         goto fail;
 
-                r = exec_command_set(m->control_command, MOUNT_PATH,
-                                     m->parameters_fragment.what, m->where, NULL);
+                r = exec_command_set(m->control_command, MOUNT_PATH, p->what, m->where, NULL);
                 if (r >= 0 && m->sloppy_options)
                         r = exec_command_append(m->control_command, "-s", NULL);
-                if (r >= 0 && m->parameters_fragment.fstype)
-                        r = exec_command_append(m->control_command, "-t", m->parameters_fragment.fstype, NULL);
+                if (r >= 0 && p->fstype)
+                        r = exec_command_append(m->control_command, "-t", p->fstype, NULL);
                 if (r >= 0 && !isempty(opts))
                         r = exec_command_append(m->control_command, "-o", opts, NULL);
         } else
@@ -915,27 +968,29 @@ fail:
 
 static void mount_enter_remounting(Mount *m) {
         int r;
+        MountParameters *p;
 
         assert(m);
 
         m->control_command_id = MOUNT_EXEC_REMOUNT;
         m->control_command = m->exec_command + MOUNT_EXEC_REMOUNT;
 
-        if (m->from_fragment) {
+        p = get_mount_parameters_fragment(m);
+        if (p) {
                 const char *o;
 
-                if (m->parameters_fragment.options)
-                        o = strjoina("remount,", m->parameters_fragment.options);
+                if (p->options)
+                        o = strjoina("remount,", p->options);
                 else
                         o = "remount";
 
                 r = exec_command_set(m->control_command, MOUNT_PATH,
-                                     m->parameters_fragment.what, m->where,
+                                     p->what, m->where,
                                      "-o", o, NULL);
                 if (r >= 0 && m->sloppy_options)
                         r = exec_command_append(m->control_command, "-s", NULL);
-                if (r >= 0 && m->parameters_fragment.fstype)
-                        r = exec_command_append(m->control_command, "-t", m->parameters_fragment.fstype, NULL);
+                if (r >= 0 && p->fstype)
+                        r = exec_command_append(m->control_command, "-t", p->fstype, NULL);
         } else
                 r = -ENOENT;
 
@@ -966,18 +1021,19 @@ static int mount_start(Unit *u) {
 
         /* We cannot fulfill this request right now, try again later
          * please! */
-        if (m->state == MOUNT_UNMOUNTING ||
-            m->state == MOUNT_UNMOUNTING_SIGTERM ||
-            m->state == MOUNT_UNMOUNTING_SIGKILL ||
-            m->state == MOUNT_MOUNTING_SIGTERM ||
-            m->state == MOUNT_MOUNTING_SIGKILL)
+        if (IN_SET(m->state,
+                   MOUNT_UNMOUNTING,
+                   MOUNT_UNMOUNTING_SIGTERM,
+                   MOUNT_UNMOUNTING_SIGKILL,
+                   MOUNT_MOUNTING_SIGTERM,
+                   MOUNT_MOUNTING_SIGKILL))
                 return -EAGAIN;
 
         /* Already on it! */
         if (m->state == MOUNT_MOUNTING)
                 return 0;
 
-        assert(m->state == MOUNT_DEAD || m->state == MOUNT_FAILED);
+        assert(IN_SET(m->state, MOUNT_DEAD, MOUNT_FAILED));
 
         r = unit_start_limit_test(u);
         if (r < 0) {
@@ -985,6 +1041,10 @@ static int mount_start(Unit *u) {
                 return r;
         }
 
+        r = unit_acquire_invocation_id(u);
+        if (r < 0)
+                return r;
+
         m->result = MOUNT_SUCCESS;
         m->reload_result = MOUNT_SUCCESS;
         m->reset_cpu_usage = true;
@@ -999,19 +1059,21 @@ static int mount_stop(Unit *u) {
         assert(m);
 
         /* Already on it */
-        if (m->state == MOUNT_UNMOUNTING ||
-            m->state == MOUNT_UNMOUNTING_SIGKILL ||
-            m->state == MOUNT_UNMOUNTING_SIGTERM ||
-            m->state == MOUNT_MOUNTING_SIGTERM ||
-            m->state == MOUNT_MOUNTING_SIGKILL)
+        if (IN_SET(m->state,
+                   MOUNT_UNMOUNTING,
+                   MOUNT_UNMOUNTING_SIGKILL,
+                   MOUNT_UNMOUNTING_SIGTERM,
+                   MOUNT_MOUNTING_SIGTERM,
+                   MOUNT_MOUNTING_SIGKILL))
                 return 0;
 
-        assert(m->state == MOUNT_MOUNTING ||
-               m->state == MOUNT_MOUNTING_DONE ||
-               m->state == MOUNT_MOUNTED ||
-               m->state == MOUNT_REMOUNTING ||
-               m->state == MOUNT_REMOUNTING_SIGTERM ||
-               m->state == MOUNT_REMOUNTING_SIGKILL);
+        assert(IN_SET(m->state,
+                      MOUNT_MOUNTING,
+                      MOUNT_MOUNTING_DONE,
+                      MOUNT_MOUNTED,
+                      MOUNT_REMOUNTING,
+                      MOUNT_REMOUNTING_SIGTERM,
+                      MOUNT_REMOUNTING_SIGKILL));
 
         mount_enter_unmounting(m);
         return 1;
@@ -1139,7 +1201,7 @@ static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
 
         m->control_pid = 0;
 
-        if (is_clean_exit(code, status, NULL))
+        if (is_clean_exit(code, status, EXIT_CLEAN_COMMAND, NULL))
                 f = MOUNT_SUCCESS;
         else if (code == CLD_EXITED)
                 f = MOUNT_FAILURE_EXIT_CODE;
@@ -1150,7 +1212,7 @@ static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
         else
                 assert_not_reached("Unknown code");
 
-        if (f != MOUNT_SUCCESS)
+        if (m->result == MOUNT_SUCCESS)
                 m->result = f;
 
         if (m->control_command) {
@@ -1177,9 +1239,10 @@ static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
         case MOUNT_MOUNTING_SIGKILL:
         case MOUNT_MOUNTING_SIGTERM:
 
-                if (f == MOUNT_SUCCESS)
-                        mount_enter_mounted(m, f);
-                else if (m->from_proc_self_mountinfo)
+                if (f == MOUNT_SUCCESS || m->from_proc_self_mountinfo)
+                        /* If /bin/mount returned success, or if we see the mount point in /proc/self/mountinfo we are
+                         * happy. If we see the first condition first, we should see the second condition
+                         * immediately after – or /bin/mount lies to us and is broken. */
                         mount_enter_mounted(m, f);
                 else
                         mount_enter_dead(m, f);
@@ -1324,6 +1387,129 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user
         return 0;
 }
 
+typedef struct {
+        bool is_mounted;
+        bool just_mounted;
+        bool just_changed;
+} MountSetupFlags;
+
+static int mount_setup_new_unit(
+                Unit *u,
+                const char *what,
+                const char *where,
+                const char *options,
+                const char *fstype,
+                MountSetupFlags *flags) {
+
+        MountParameters *p;
+
+        assert(u);
+        assert(flags);
+
+        u->source_path = strdup("/proc/self/mountinfo");
+        MOUNT(u)->where = strdup(where);
+        if (!u->source_path || !MOUNT(u)->where)
+                return -ENOMEM;
+
+        /* Make sure to initialize those fields before mount_is_extrinsic(). */
+        MOUNT(u)->from_proc_self_mountinfo = true;
+        p = &MOUNT(u)->parameters_proc_self_mountinfo;
+
+        p->what = strdup(what);
+        p->options = strdup(options);
+        p->fstype = strdup(fstype);
+        if (!p->what || !p->options || !p->fstype)
+                return -ENOMEM;
+
+        if (!mount_is_extrinsic(MOUNT(u))) {
+                const char *target;
+                int r;
+
+                target = mount_is_network(p) ? SPECIAL_REMOTE_FS_TARGET : SPECIAL_LOCAL_FS_TARGET;
+                r = unit_add_dependency_by_name(u, UNIT_BEFORE, target, NULL, true);
+                if (r < 0)
+                        return r;
+
+                r = unit_add_dependency_by_name(u, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
+                if (r < 0)
+                        return r;
+        }
+
+        unit_add_to_load_queue(u);
+        flags->is_mounted = true;
+        flags->just_mounted = true;
+        flags->just_changed = true;
+
+        return 0;
+}
+
+static int mount_setup_existing_unit(
+                Unit *u,
+                const char *what,
+                const char *where,
+                const char *options,
+                const char *fstype,
+                MountSetupFlags *flags) {
+
+        MountParameters *p;
+        bool load_extras = false;
+        int r1, r2, r3;
+
+        assert(u);
+        assert(flags);
+
+        if (!MOUNT(u)->where) {
+                MOUNT(u)->where = strdup(where);
+                if (!MOUNT(u)->where)
+                        return -ENOMEM;
+        }
+
+        /* Make sure to initialize those fields before mount_is_extrinsic(). */
+        p = &MOUNT(u)->parameters_proc_self_mountinfo;
+
+        r1 = free_and_strdup(&p->what, what);
+        r2 = free_and_strdup(&p->options, options);
+        r3 = free_and_strdup(&p->fstype, fstype);
+        if (r1 < 0 || r2 < 0 || r3 < 0)
+                return -ENOMEM;
+
+        flags->just_changed = r1 > 0 || r2 > 0 || r3 > 0;
+        flags->is_mounted = true;
+        flags->just_mounted = !MOUNT(u)->from_proc_self_mountinfo;
+
+        MOUNT(u)->from_proc_self_mountinfo = true;
+
+        if (!mount_is_extrinsic(MOUNT(u)) && mount_is_network(p)) {
+                /* _netdev option may have shown up late, or on a
+                 * remount. Add remote-fs dependencies, even though
+                 * local-fs ones may already be there.
+                 *
+                 * Note: due to a current limitation (we don't track
+                 * in the dependency "Set*" objects who created a
+                 * dependency), we can only add deps, never lose them,
+                 * until the next full daemon-reload. */
+                unit_add_dependency_by_name(u, UNIT_BEFORE, SPECIAL_REMOTE_FS_TARGET, NULL, true);
+                load_extras = true;
+        }
+
+        if (u->load_state == UNIT_NOT_FOUND) {
+                u->load_state = UNIT_LOADED;
+                u->load_error = 0;
+
+                /* Load in the extras later on, after we
+                 * finished initialization of the unit */
+
+                /* FIXME: since we're going to load the unit later on, why setting load_extras=true ? */
+                load_extras = true;
+                flags->just_changed = true;
+        }
+
+        if (load_extras)
+                return mount_add_extras(MOUNT(u));
+
+        return 0;
+}
+
 static int mount_setup_unit(
                 Manager *m,
                 const char *what,
@@ -1332,10 +1518,8 @@ static int mount_setup_unit(
                 const char *fstype,
                 bool set_flags) {
 
-        _cleanup_free_ char *e = NULL, *w = NULL, *o = NULL, *f = NULL;
-        bool load_extras = false;
-        MountParameters *p;
-        bool delete, changed = false;
+        _cleanup_free_ char *e = NULL;
+        MountSetupFlags flags;
         Unit *u;
         int r;
 
@@ -1363,128 +1547,34 @@ static int mount_setup_unit(
 
         u = manager_get_unit(m, e);
         if (!u) {
-                delete = true;
-
-                u = unit_new(m, sizeof(Mount));
-                if (!u)
-                        return log_oom();
-
-                r = unit_add_name(u, e);
+                /* First time we see this mount point meaning that it's
+                 * not been initiated by a mount unit but rather by the
+                 * sysadmin having called mount(8) directly. */
+                r = unit_new_for_name(m, sizeof(Mount), e, &u);
                 if (r < 0)
                         goto fail;
 
-                MOUNT(u)->where = strdup(where);
-                if (!MOUNT(u)->where) {
-                        r = -ENOMEM;
-                        goto fail;
-                }
-
-                u->source_path = strdup("/proc/self/mountinfo");
-                if (!u->source_path) {
-                        r = -ENOMEM;
-                        goto fail;
-                }
-
-                if (MANAGER_IS_SYSTEM(m)) {
-                        const char* target;
-
-                        target = mount_needs_network(options, fstype) ?  SPECIAL_REMOTE_FS_TARGET : SPECIAL_LOCAL_FS_TARGET;
-                        r = unit_add_dependency_by_name(u, UNIT_BEFORE, target, NULL, true);
-                        if (r < 0)
-                                goto fail;
-
-                        if (should_umount(MOUNT(u))) {
-                                r = unit_add_dependency_by_name(u, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
-                                if (r < 0)
-                                        goto fail;
-                        }
-                }
-
-                unit_add_to_load_queue(u);
-                changed = true;
-        } else {
-                delete = false;
-
-                if (!MOUNT(u)->where) {
-                        MOUNT(u)->where = strdup(where);
-                        if (!MOUNT(u)->where) {
-                                r = -ENOMEM;
-                                goto fail;
-                        }
-                }
-
-                if (MANAGER_IS_SYSTEM(m) &&
-                    mount_needs_network(options, fstype)) {
-                        /* _netdev option may have shown up late, or on a
-                         * remount. Add remote-fs dependencies, even though
-                         * local-fs ones may already be there. */
-                        unit_add_dependency_by_name(u, UNIT_BEFORE, SPECIAL_REMOTE_FS_TARGET, NULL, true);
-                        load_extras = true;
-                }
-
-                if (u->load_state == UNIT_NOT_FOUND) {
-                        u->load_state = UNIT_LOADED;
-                        u->load_error = 0;
-
-                        /* Load in the extras later on, after we
-                         * finished initialization of the unit */
-                        load_extras = true;
-                        changed = true;
-                }
-        }
+                r = mount_setup_new_unit(u, what, where, options, fstype, &flags);
+                if (r < 0)
+                        unit_free(u);
+        } else
+                r = mount_setup_existing_unit(u, what, where, options, fstype, &flags);
 
-        w = strdup(what);
-        o = strdup(options);
-        f = strdup(fstype);
-        if (!w || !o || !f) {
-                r = -ENOMEM;
+        if (r < 0)
                 goto fail;
-        }
-
-        p = &MOUNT(u)->parameters_proc_self_mountinfo;
-
-        changed = changed ||
-                !streq_ptr(p->options, options) ||
-                !streq_ptr(p->what, what) ||
-                !streq_ptr(p->fstype, fstype);
 
         if (set_flags) {
-                MOUNT(u)->is_mounted = true;
-                MOUNT(u)->just_mounted = !MOUNT(u)->from_proc_self_mountinfo;
-                MOUNT(u)->just_changed = changed;
+                MOUNT(u)->is_mounted = flags.is_mounted;
+                MOUNT(u)->just_mounted = flags.just_mounted;
+                MOUNT(u)->just_changed = flags.just_changed;
         }
 
-        MOUNT(u)->from_proc_self_mountinfo = true;
-
-        free(p->what);
-        p->what = w;
-        w = NULL;
-
-        free(p->options);
-        p->options = o;
-        o = NULL;
-
-        free(p->fstype);
-        p->fstype = f;
-        f = NULL;
-
-        if (load_extras) {
-                r = mount_add_extras(MOUNT(u));
-                if (r < 0)
-                        goto fail;
-        }
-
-        if (changed)
+        if (flags.just_changed)
                 unit_add_to_dbus_queue(u);
 
         return 0;
-
 fail:
         log_warning_errno(r, "Failed to set up mount unit: %m");
-
-        if (delete && u)
-                unit_free(u);
-
         return r;
 }
 
@@ -1572,11 +1662,46 @@ static int mount_get_timeout(Unit *u, usec_t *timeout) {
         return 1;
 }
 
+static int synthesize_root_mount(Manager *m) {
+        Unit *u;
+        int r;
+
+        assert(m);
+
+        /* Whatever happens, we know for sure that the root directory is around, and cannot go away. Let's
+         * unconditionally synthesize it here and mark it as perpetual. */
+
+        u = manager_get_unit(m, SPECIAL_ROOT_MOUNT);
+        if (!u) {
+                r = unit_new_for_name(m, sizeof(Mount), SPECIAL_ROOT_MOUNT, &u);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to allocate the special " SPECIAL_ROOT_MOUNT " unit: %m");
+        }
+
+        u->perpetual = true;
+        MOUNT(u)->deserialized_state = MOUNT_MOUNTED;
+
+        unit_add_to_load_queue(u);
+        unit_add_to_dbus_queue(u);
+
+        return 0;
+}
+
+static bool mount_is_mounted(Mount *m) {
+        assert(m);
+
+        return UNIT(m)->perpetual || m->is_mounted;
+}
+
 static void mount_enumerate(Manager *m) {
         int r;
 
         assert(m);
 
+        r = synthesize_root_mount(m);
+        if (r < 0)
+                goto fail;
+
         mnt_init_debug(0);
 
         if (!m->mount_monitor) {
@@ -1683,7 +1808,7 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
         LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) {
                 Mount *mount = MOUNT(u);
 
-                if (!mount->is_mounted) {
+                if (!mount_is_mounted(mount)) {
 
                         /* A mount point is not around right now. It
                          * might be gone, or might never have
@@ -1722,9 +1847,10 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
 
                         case MOUNT_DEAD:
                         case MOUNT_FAILED:
-                                /* This has just been mounted by
-                                 * somebody else, follow the state
-                                 * change. */
+
+                                /* This has just been mounted by somebody else, follow the state change, but let's
+                                 * generate a new invocation ID for this implicitly and automatically. */
+                                (void) unit_acquire_invocation_id(UNIT(mount));
                                 mount_enter_mounted(mount, MOUNT_SUCCESS);
                                 break;
 
@@ -1743,7 +1869,7 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
                         }
                 }
 
-                if (mount->is_mounted &&
+                if (mount_is_mounted(mount) &&
                     mount->from_proc_self_mountinfo &&
                     mount->parameters_proc_self_mountinfo.what) {
 
@@ -1817,6 +1943,7 @@ const UnitVTable mount_vtable = {
         .cgroup_context_offset = offsetof(Mount, cgroup_context),
         .kill_context_offset = offsetof(Mount, kill_context),
         .exec_runtime_offset = offsetof(Mount, exec_runtime),
+        .dynamic_creds_offset = offsetof(Mount, dynamic_creds),
 
         .sections =
                 "Unit\0"
index da529c4..9f7326b 100644 (file)
@@ -21,8 +21,8 @@
 
 typedef struct Mount Mount;
 
-#include "execute.h"
 #include "kill.h"
+#include "dynamic-user.h"
 
 typedef enum MountExecCommand {
         MOUNT_EXEC_MOUNT,
@@ -71,6 +71,9 @@ struct Mount {
 
         bool sloppy_options;
 
+        bool lazy_unmount;
+        bool force_unmount;
+
         MountResult result;
         MountResult reload_result;
 
@@ -85,6 +88,7 @@ struct Mount {
         CGroupContext cgroup_context;
 
         ExecRuntime *exec_runtime;
+        DynamicCreds dynamic_creds;
 
         MountState state, deserialized_state;
 
index 52a2505..05175e9 100644 (file)
 #include <linux/fs.h>
 
 #include "alloc-util.h"
+#include "base-filesystem.h"
 #include "dev-setup.h"
 #include "fd-util.h"
+#include "fs-util.h"
+#include "loop-util.h"
 #include "loopback-setup.h"
 #include "missing.h"
 #include "mkdir.h"
 typedef enum MountMode {
         /* This is ordered by priority! */
         INACCESSIBLE,
-        READONLY,
+        BIND_MOUNT,
+        BIND_MOUNT_RECURSIVE,
         PRIVATE_TMP,
         PRIVATE_VAR_TMP,
         PRIVATE_DEV,
-        READWRITE
+        BIND_DEV,
+        SYSFS,
+        PROCFS,
+        READONLY,
+        READWRITE,
 } MountMode;
 
-typedef struct BindMount {
-        const char *path;
-        MountMode mode;
-        bool done;
-        bool ignore;
-} BindMount;
+typedef struct MountEntry {
+        const char *path_const;   /* Memory allocated on stack or static */
+        MountMode mode:5;
+        bool ignore:1;            /* Ignore if path does not exist? */
+        bool has_prefix:1;        /* Already is prefixed by the root dir? */
+        bool read_only:1;         /* Shall this mount point be read-only? */
+        char *path_malloc;        /* Use this instead of 'path' if we had to allocate memory */
+        const char *source_const; /* The source path, for bind mounts */
+        char *source_malloc;
+} MountEntry;
+
+/* If MountAPIVFS= is used, let's mount /sys and /proc into the it, but only as a fallback if the user hasn't mounted
+ * something there already. These mounts are hence overriden by any other explicitly configured mounts. */
+static const MountEntry apivfs_table[] = {
+        { "/proc",               PROCFS,       false },
+        { "/dev",                BIND_DEV,     false },
+        { "/sys",                SYSFS,        false },
+};
+
+/* ProtectKernelTunables= option and the related filesystem APIs */
+static const MountEntry protect_kernel_tunables_table[] = {
+        { "/proc/sys",           READONLY,     false },
+        { "/proc/sysrq-trigger", READONLY,     true  },
+        { "/proc/latency_stats", READONLY,     true  },
+        { "/proc/mtrr",          READONLY,     true  },
+        { "/proc/apm",           READONLY,     true  }, /* Obsolete API, there's no point in permitting access to this, ever */
+        { "/proc/acpi",          READONLY,     true  },
+        { "/proc/timer_stats",   READONLY,     true  },
+        { "/proc/asound",        READONLY,     true  },
+        { "/proc/bus",           READONLY,     true  },
+        { "/proc/fs",            READONLY,     true  },
+        { "/proc/irq",           READONLY,     true  },
+        { "/sys",                READONLY,     false },
+        { "/sys/kernel/debug",   READONLY,     true  },
+        { "/sys/kernel/tracing", READONLY,     true  },
+        { "/sys/fs/cgroup",      READWRITE,    false }, /* READONLY is set by ProtectControlGroups= option */
+};
+
+/* ProtectKernelModules= option */
+static const MountEntry protect_kernel_modules_table[] = {
+#ifdef HAVE_SPLIT_USR
+        { "/lib/modules",        INACCESSIBLE, true  },
+#endif
+        { "/usr/lib/modules",    INACCESSIBLE, true  },
+};
+
+/*
+ * ProtectHome=read-only table, protect $HOME and $XDG_RUNTIME_DIR and rest of
+ * system should be protected by ProtectSystem=
+ */
+static const MountEntry protect_home_read_only_table[] = {
+        { "/home",               READONLY,     true  },
+        { "/run/user",           READONLY,     true  },
+        { "/root",               READONLY,     true  },
+};
+
+/* ProtectHome=yes table */
+static const MountEntry protect_home_yes_table[] = {
+        { "/home",               INACCESSIBLE, true  },
+        { "/run/user",           INACCESSIBLE, true  },
+        { "/root",               INACCESSIBLE, true  },
+};
 
-static int append_mounts(BindMount **p, char **strv, MountMode mode) {
+/* ProtectSystem=yes table */
+static const MountEntry protect_system_yes_table[] = {
+        { "/usr",                READONLY,     false },
+        { "/boot",               READONLY,     true  },
+        { "/efi",                READONLY,     true  },
+};
+
+/* ProtectSystem=full includes ProtectSystem=yes */
+static const MountEntry protect_system_full_table[] = {
+        { "/usr",                READONLY,     false },
+        { "/boot",               READONLY,     true  },
+        { "/efi",                READONLY,     true  },
+        { "/etc",                READONLY,     false },
+};
+
+/*
+ * ProtectSystem=strict table. In this strict mode, we mount everything
+ * read-only, except for /proc, /dev, /sys which are the kernel API VFS,
+ * which are left writable, but PrivateDevices= + ProtectKernelTunables=
+ * protect those, and these options should be fully orthogonal.
+ * (And of course /home and friends are also left writable, as ProtectHome=
+ * shall manage those, orthogonally).
+ */
+static const MountEntry protect_system_strict_table[] = {
+        { "/",                   READONLY,     false },
+        { "/proc",               READWRITE,    false },      /* ProtectKernelTunables= */
+        { "/sys",                READWRITE,    false },      /* ProtectKernelTunables= */
+        { "/dev",                READWRITE,    false },      /* PrivateDevices= */
+        { "/home",               READWRITE,    true  },      /* ProtectHome= */
+        { "/run/user",           READWRITE,    true  },      /* ProtectHome= */
+        { "/root",               READWRITE,    true  },      /* ProtectHome= */
+};
+
+static const char *mount_entry_path(const MountEntry *p) {
+        assert(p);
+
+        /* Returns the path of this bind mount. If the malloc()-allocated ->path_buffer field is set we return that,
+         * otherwise the stack/static ->path field is returned. */
+
+        return p->path_malloc ?: p->path_const;
+}
+
+static bool mount_entry_read_only(const MountEntry *p) {
+        assert(p);
+
+        return p->read_only || IN_SET(p->mode, READONLY, INACCESSIBLE);
+}
+
+static const char *mount_entry_source(const MountEntry *p) {
+        assert(p);
+
+        return p->source_malloc ?: p->source_const;
+}
+
+static void mount_entry_done(MountEntry *p) {
+        assert(p);
+
+        p->path_malloc = mfree(p->path_malloc);
+        p->source_malloc = mfree(p->source_malloc);
+}
+
+static int append_access_mounts(MountEntry **p, char **strv, MountMode mode) {
         char **i;
 
         assert(p);
 
-        STRV_FOREACH(i, strv) {
+        /* Adds a list of user-supplied READWRITE/READONLY/INACCESSIBLE entries */
 
-                (*p)->ignore = false;
-                (*p)->done = false;
+        STRV_FOREACH(i, strv) {
+                bool ignore = false, needs_prefix = false;
+                const char *e = *i;
 
-                if ((mode == INACCESSIBLE || mode == READONLY || mode == READWRITE) && (*i)[0] == '-') {
-                        (*p)->ignore = true;
-                        (*i)++;
+                /* Look for any prefixes */
+                if (startswith(e, "-")) {
+                        e++;
+                        ignore = true;
+                }
+                if (startswith(e, "+")) {
+                        e++;
+                        needs_prefix = true;
                 }
 
-                if (!path_is_absolute(*i))
+                if (!path_is_absolute(e))
                         return -EINVAL;
 
-                (*p)->path = *i;
-                (*p)->mode = mode;
-                (*p)++;
+                *((*p)++) = (MountEntry) {
+                        .path_const = e,
+                        .mode = mode,
+                        .ignore = ignore,
+                        .has_prefix = !needs_prefix,
+                };
         }
 
         return 0;
 }
 
+static int append_bind_mounts(MountEntry **p, const BindMount *binds, unsigned n) {
+        unsigned i;
+
+        assert(p);
+
+        for (i = 0; i < n; i++) {
+                const BindMount *b = binds + i;
+
+                *((*p)++) = (MountEntry) {
+                        .path_const = b->destination,
+                        .mode = b->recursive ? BIND_MOUNT_RECURSIVE : BIND_MOUNT,
+                        .read_only = b->read_only,
+                        .source_const = b->source,
+                };
+        }
+
+        return 0;
+}
+
+static int append_static_mounts(MountEntry **p, const MountEntry *mounts, unsigned n, bool ignore_protect) {
+        unsigned i;
+
+        assert(p);
+        assert(mounts);
+
+        /* Adds a list of static pre-defined entries */
+
+        for (i = 0; i < n; i++)
+                *((*p)++) = (MountEntry) {
+                        .path_const = mount_entry_path(mounts+i),
+                        .mode = mounts[i].mode,
+                        .ignore = mounts[i].ignore || ignore_protect,
+                };
+
+        return 0;
+}
+
+static int append_protect_home(MountEntry **p, ProtectHome protect_home, bool ignore_protect) {
+        assert(p);
+
+        switch (protect_home) {
+
+        case PROTECT_HOME_NO:
+                return 0;
+
+        case PROTECT_HOME_READ_ONLY:
+                return append_static_mounts(p, protect_home_read_only_table, ELEMENTSOF(protect_home_read_only_table), ignore_protect);
+
+        case PROTECT_HOME_YES:
+                return append_static_mounts(p, protect_home_yes_table, ELEMENTSOF(protect_home_yes_table), ignore_protect);
+
+        default:
+                assert_not_reached("Unexpected ProtectHome= value");
+        }
+}
+
+static int append_protect_system(MountEntry **p, ProtectSystem protect_system, bool ignore_protect) {
+        assert(p);
+
+        switch (protect_system) {
+
+        case PROTECT_SYSTEM_NO:
+                return 0;
+
+        case PROTECT_SYSTEM_STRICT:
+                return append_static_mounts(p, protect_system_strict_table, ELEMENTSOF(protect_system_strict_table), ignore_protect);
+
+        case PROTECT_SYSTEM_YES:
+                return append_static_mounts(p, protect_system_yes_table, ELEMENTSOF(protect_system_yes_table), ignore_protect);
+
+        case PROTECT_SYSTEM_FULL:
+                return append_static_mounts(p, protect_system_full_table, ELEMENTSOF(protect_system_full_table), ignore_protect);
+
+        default:
+                assert_not_reached("Unexpected ProtectSystem= value");
+        }
+}
+
 static int mount_path_compare(const void *a, const void *b) {
-        const BindMount *p = a, *q = b;
+        const MountEntry *p = a, *q = b;
         int d;
 
-        d = path_compare(p->path, q->path);
+        /* If the paths are not equal, then order prefixes first */
+        d = path_compare(mount_entry_path(p), mount_entry_path(q));
+        if (d != 0)
+                return d;
+
+        /* If the paths are equal, check the mode */
+        if (p->mode < q->mode)
+                return -1;
+
+        if (p->mode > q->mode)
+                return 1;
+
+        return 0;
+}
 
-        if (d == 0) {
-                /* If the paths are equal, check the mode */
-                if (p->mode < q->mode)
-                        return -1;
+static int prefix_where_needed(MountEntry *m, unsigned n, const char *root_directory) {
+        unsigned i;
 
-                if (p->mode > q->mode)
-                        return 1;
+        /* Prefixes all paths in the bind mount table with the root directory if it is specified and the entry needs
+         * that. */
 
+        if (!root_directory)
                 return 0;
+
+        for (i = 0; i < n; i++) {
+                char *s;
+
+                if (m[i].has_prefix)
+                        continue;
+
+                s = prefix_root(root_directory, mount_entry_path(m+i));
+                if (!s)
+                        return -ENOMEM;
+
+                free(m[i].path_malloc);
+                m[i].path_malloc = s;
+
+                m[i].has_prefix = true;
         }
 
-        /* If the paths are not equal, then order prefixes first */
-        return d;
+        return 0;
 }
 
-static void drop_duplicates(BindMount *m, unsigned *n) {
-        BindMount *f, *t, *previous;
+static void drop_duplicates(MountEntry *m, unsigned *n) {
+        MountEntry *f, *t, *previous;
 
         assert(m);
         assert(n);
 
-        for (f = m, t = m, previous = NULL; f < m+*n; f++) {
+        /* Drops duplicate entries. Expects that the array is properly ordered already. */
+
+        for (f = m, t = m, previous = NULL; f < m + *n; f++) {
 
-                /* The first one wins */
-                if (previous && path_equal(f->path, previous->path))
+                /* The first one wins (which is the one with the more restrictive mode), see mount_path_compare()
+                 * above. */
+                if (previous && path_equal(mount_entry_path(f), mount_entry_path(previous))) {
+                        log_debug("%s is duplicate.", mount_entry_path(f));
+                        previous->read_only = previous->read_only || mount_entry_read_only(f); /* Propagate the read-only flag to the remaining entry */
+                        mount_entry_done(f);
                         continue;
+                }
 
                 *t = *f;
-
                 previous = t;
+                t++;
+        }
+
+        *n = t - m;
+}
+
+static void drop_inaccessible(MountEntry *m, unsigned *n) {
+        MountEntry *f, *t;
+        const char *clear = NULL;
 
+        assert(m);
+        assert(n);
+
+        /* Drops all entries obstructed by another entry further up the tree. Expects that the array is properly
+         * ordered already. */
+
+        for (f = m, t = m; f < m + *n; f++) {
+
+                /* If we found a path set for INACCESSIBLE earlier, and this entry has it as prefix we should drop
+                 * it, as inaccessible paths really should drop the entire subtree. */
+                if (clear && path_startswith(mount_entry_path(f), clear)) {
+                        log_debug("%s is masked by %s.", mount_entry_path(f), clear);
+                        mount_entry_done(f);
+                        continue;
+                }
+
+                clear = f->mode == INACCESSIBLE ? mount_entry_path(f) : NULL;
+
+                *t = *f;
                 t++;
         }
 
         *n = t - m;
 }
 
-static int mount_dev(BindMount *m) {
+static void drop_nop(MountEntry *m, unsigned *n) {
+        MountEntry *f, *t;
+
+        assert(m);
+        assert(n);
+
+        /* Drops all entries which have an immediate parent that has the same type, as they are redundant. Assumes the
+         * list is ordered by prefixes. */
+
+        for (f = m, t = m; f < m + *n; f++) {
+
+                /* Only suppress such subtrees for READONLY and READWRITE entries */
+                if (IN_SET(f->mode, READONLY, READWRITE)) {
+                        MountEntry *p;
+                        bool found = false;
+
+                        /* Now let's find the first parent of the entry we are looking at. */
+                        for (p = t-1; p >= m; p--) {
+                                if (path_startswith(mount_entry_path(f), mount_entry_path(p))) {
+                                        found = true;
+                                        break;
+                                }
+                        }
+
+                        /* We found it, let's see if it's the same mode, if so, we can drop this entry */
+                        if (found && p->mode == f->mode) {
+                                log_debug("%s is redundant by %s", mount_entry_path(f), mount_entry_path(p));
+                                mount_entry_done(f);
+                                continue;
+                        }
+                }
+
+                *t = *f;
+                t++;
+        }
+
+        *n = t - m;
+}
+
+static void drop_outside_root(const char *root_directory, MountEntry *m, unsigned *n) {
+        MountEntry *f, *t;
+
+        assert(m);
+        assert(n);
+
+        /* Nothing to do */
+        if (!root_directory)
+                return;
+
+        /* Drops all mounts that are outside of the root directory. */
+
+        for (f = m, t = m; f < m + *n; f++) {
+
+                if (!path_startswith(mount_entry_path(f), root_directory)) {
+                        log_debug("%s is outside of root directory.", mount_entry_path(f));
+                        mount_entry_done(f);
+                        continue;
+                }
+
+                *t = *f;
+                t++;
+        }
+
+        *n = t - m;
+}
+
+static int mount_private_dev(MountEntry *m) {
         static const char devnodes[] =
                 "/dev/null\0"
                 "/dev/zero\0"
@@ -237,11 +575,11 @@ static int mount_dev(BindMount *m) {
          * missing when the service is started with RootDirectory. This is
          * consistent with mount units creating the mount points when missing.
          */
-        (void) mkdir_p_label(m->path, 0755);
+        (void) mkdir_p_label(mount_entry_path(m), 0755);
 
         /* Unmount everything in old /dev */
-        umount_recursive(m->path, 0);
-        if (mount(dev, m->path, NULL, MS_MOVE, NULL) < 0) {
+        umount_recursive(mount_entry_path(m), 0);
+        if (mount(dev, mount_entry_path(m), NULL, MS_MOVE, NULL) < 0) {
                 r = -errno;
                 goto fail;
         }
@@ -271,31 +609,123 @@ fail:
         return r;
 }
 
+static int mount_bind_dev(MountEntry *m) {
+        int r;
+
+        assert(m);
+
+        /* Implements the little brother of mount_private_dev(): simply bind mounts the host's /dev into the service's
+         * /dev. This is only used when RootDirectory= is set. */
+
+        r = path_is_mount_point(mount_entry_path(m), NULL, 0);
+        if (r < 0)
+                return log_debug_errno(r, "Unable to determine whether /dev is already mounted: %m");
+        if (r > 0) /* make this a NOP if /dev is already a mount point */
+                return 0;
+
+        if (mount("/dev", mount_entry_path(m), NULL, MS_BIND|MS_REC, NULL) < 0)
+                return log_debug_errno(errno, "Failed to bind mount %s: %m", mount_entry_path(m));
+
+        return 1;
+}
+
+static int mount_sysfs(MountEntry *m) {
+        int r;
+
+        assert(m);
+
+        r = path_is_mount_point(mount_entry_path(m), NULL, 0);
+        if (r < 0)
+                return log_debug_errno(r, "Unable to determine whether /sys is already mounted: %m");
+        if (r > 0) /* make this a NOP if /sys is already a mount point */
+                return 0;
+
+        /* Bind mount the host's version so that we get all child mounts of it, too. */
+        if (mount("/sys", mount_entry_path(m), NULL, MS_BIND|MS_REC, NULL) < 0)
+                return log_debug_errno(errno, "Failed to mount %s: %m", mount_entry_path(m));
+
+        return 1;
+}
+
+static int mount_procfs(MountEntry *m) {
+        int r;
+
+        assert(m);
+
+        r = path_is_mount_point(mount_entry_path(m), NULL, 0);
+        if (r < 0)
+                return log_debug_errno(r, "Unable to determine whether /proc is already mounted: %m");
+        if (r > 0) /* make this a NOP if /proc is already a mount point */
+                return 0;
+
+        /* Mount a new instance, so that we get the one that matches our user namespace, if we are running in one */
+        if (mount("proc", mount_entry_path(m), "proc", MS_NOSUID|MS_NOEXEC|MS_NODEV, NULL) < 0)
+                return log_debug_errno(errno, "Failed to mount %s: %m", mount_entry_path(m));
+
+        return 1;
+}
+
+static int mount_entry_chase(
+                const char *root_directory,
+                MountEntry *m,
+                const char *path,
+                char **location) {
+
+        char *chased;
+        int r;
+
+        assert(m);
+
+        /* Since mount() will always follow symlinks and we need to take the different root directory into account we
+         * chase the symlinks on our own first. This is called for the destination path, as well as the source path (if
+         * that applies). The result is stored in "location". */
+
+        r = chase_symlinks(path, root_directory, 0, &chased);
+        if (r == -ENOENT && m->ignore) {
+                log_debug_errno(r, "Path %s does not exist, ignoring.", path);
+                return 0;
+        }
+        if (r < 0)
+                return log_debug_errno(r, "Failed to follow symlinks on %s: %m", path);
+
+        log_debug("Followed symlinks %s → %s.", path, chased);
+
+        free(*location);
+        *location = chased;
+
+        return 1;
+}
+
 static int apply_mount(
-                BindMount *m,
+                const char *root_directory,
+                MountEntry *m,
                 const char *tmp_dir,
                 const char *var_tmp_dir) {
 
         const char *what;
+        bool rbind = true;
         int r;
-        struct stat target;
 
         assert(m);
 
+        r = mount_entry_chase(root_directory, m, mount_entry_path(m), &m->path_malloc);
+        if (r <= 0)
+                return r;
+
+        log_debug("Applying namespace mount on %s", mount_entry_path(m));
+
         switch (m->mode) {
 
-        case INACCESSIBLE:
+        case INACCESSIBLE: {
+                struct stat target;
 
                 /* First, get rid of everything that is below if there
                  * is anything... Then, overmount it with an
                  * inaccessible path. */
-                umount_recursive(m->path, 0);
+                (void) umount_recursive(mount_entry_path(m), 0);
 
-                if (lstat(m->path, &target) < 0) {
-                        if (m->ignore && errno == ENOENT)
-                                return 0;
-                        return -errno;
-                }
+                if (lstat(mount_entry_path(m), &target) < 0)
+                        return log_debug_errno(errno, "Failed to lstat() %s to determine what to mount over it: %m", mount_entry_path(m));
 
                 what = mode_to_inaccessible_node(target.st_mode);
                 if (!what) {
@@ -303,11 +733,32 @@ static int apply_mount(
                         return -ELOOP;
                 }
                 break;
+        }
+
         case READONLY:
         case READWRITE:
-                /* Nothing to mount here, we just later toggle the
-                 * MS_RDONLY bit for the mount point */
-                return 0;
+                r = path_is_mount_point(mount_entry_path(m), root_directory, 0);
+                if (r < 0)
+                        return log_debug_errno(r, "Failed to determine whether %s is already a mount point: %m", mount_entry_path(m));
+                if (r > 0) /* Nothing to do here, it is already a mount. We just later toggle the MS_RDONLY bit for the mount point if needed. */
+                        return 0;
+                /* This isn't a mount point yet, let's make it one. */
+                what = mount_entry_path(m);
+                break;
+
+        case BIND_MOUNT:
+                rbind = false;
+                /* fallthrough */
+
+        case BIND_MOUNT_RECURSIVE:
+                /* Also chase the source mount */
+
+                r = mount_entry_chase(root_directory, m, mount_entry_source(m), &m->source_malloc);
+                if (r <= 0)
+                        return r;
+
+                what = mount_entry_source(m);
+                break;
 
         case PRIVATE_TMP:
                 what = tmp_dir;
@@ -318,7 +769,16 @@ static int apply_mount(
                 break;
 
         case PRIVATE_DEV:
-                return mount_dev(m);
+                return mount_private_dev(m);
+
+        case BIND_DEV:
+                return mount_bind_dev(m);
+
+        case SYSFS:
+                return mount_sysfs(m);
+
+        case PROCFS:
+                return mount_procfs(m);
 
         default:
                 assert_not_reached("Unknown mode");
@@ -326,193 +786,407 @@ static int apply_mount(
 
         assert(what);
 
-        r = mount(what, m->path, NULL, MS_BIND|MS_REC, NULL);
-        if (r >= 0) {
-                log_debug("Successfully mounted %s to %s", what, m->path);
-                return r;
-        } else {
-                if (m->ignore && errno == ENOENT)
-                        return 0;
-                return log_debug_errno(errno, "Failed to mount %s to %s: %m", what, m->path);
-        }
+        if (mount(what, mount_entry_path(m), NULL, MS_BIND|(rbind ? MS_REC : 0), NULL) < 0)
+                return log_debug_errno(errno, "Failed to mount %s to %s: %m", what, mount_entry_path(m));
+
+        log_debug("Successfully mounted %s to %s", what, mount_entry_path(m));
+        return 0;
 }
 
-static int make_read_only(BindMount *m) {
-        int r;
+static int make_read_only(MountEntry *m, char **blacklist, FILE *proc_self_mountinfo) {
+        int r = 0;
 
         assert(m);
+        assert(proc_self_mountinfo);
 
-        if (IN_SET(m->mode, INACCESSIBLE, READONLY))
-                r = bind_remount_recursive(m->path, true);
-        else if (IN_SET(m->mode, READWRITE, PRIVATE_TMP, PRIVATE_VAR_TMP, PRIVATE_DEV)) {
-                r = bind_remount_recursive(m->path, false);
-                if (r == 0 && m->mode == PRIVATE_DEV) /* can be readonly but the submounts can't*/
-                        if (mount(NULL, m->path, NULL, MS_REMOUNT|DEV_MOUNT_OPTIONS|MS_RDONLY, NULL) < 0)
-                                r = -errno;
+        if (mount_entry_read_only(m))
+                r = bind_remount_recursive_with_mountinfo(mount_entry_path(m), true, blacklist, proc_self_mountinfo);
+        else if (m->mode == PRIVATE_DEV) { /* Superblock can be readonly but the submounts can't */
+                if (mount(NULL, mount_entry_path(m), NULL, MS_REMOUNT|DEV_MOUNT_OPTIONS|MS_RDONLY, NULL) < 0)
+                        r = -errno;
         } else
-                r = 0;
-
-        if (m->ignore && r == -ENOENT)
                 return 0;
 
+        /* Not that we only turn on the MS_RDONLY flag here, we never turn it off. Something that was marked read-only
+         * already stays this way. This improves compatibility with container managers, where we won't attempt to undo
+         * read-only mounts already applied. */
+
+        if (r == -ENOENT && m->ignore)
+                r = 0;
+
         return r;
 }
 
+static bool namespace_info_mount_apivfs(const char *root_directory, const NameSpaceInfo *ns_info) {
+        assert(ns_info);
+
+        /*
+         * ProtectControlGroups= and ProtectKernelTunables= imply MountAPIVFS=,
+         * since to protect the API VFS mounts, they need to be around in the
+         * first place... and RootDirectory= or RootImage= need to be set.
+         */
+
+        /* root_directory should point to a mount point */
+        return root_directory &&
+                (ns_info->mount_apivfs ||
+                 ns_info->protect_control_groups ||
+                 ns_info->protect_kernel_tunables);
+}
+
+static unsigned namespace_calculate_mounts(
+                const char* root_directory,
+                const NameSpaceInfo *ns_info,
+                char** read_write_paths,
+                char** read_only_paths,
+                char** inaccessible_paths,
+                const BindMount *bind_mounts,
+                unsigned n_bind_mounts,
+                const char* tmp_dir,
+                const char* var_tmp_dir,
+                ProtectHome protect_home,
+                ProtectSystem protect_system) {
+
+        unsigned protect_home_cnt;
+        unsigned protect_system_cnt =
+                (protect_system == PROTECT_SYSTEM_STRICT ?
+                 ELEMENTSOF(protect_system_strict_table) :
+                 ((protect_system == PROTECT_SYSTEM_FULL) ?
+                  ELEMENTSOF(protect_system_full_table) :
+                  ((protect_system == PROTECT_SYSTEM_YES) ?
+                   ELEMENTSOF(protect_system_yes_table) : 0)));
+
+        protect_home_cnt =
+                (protect_home == PROTECT_HOME_YES ?
+                 ELEMENTSOF(protect_home_yes_table) :
+                 ((protect_home == PROTECT_HOME_READ_ONLY) ?
+                  ELEMENTSOF(protect_home_read_only_table) : 0));
+
+        return !!tmp_dir + !!var_tmp_dir +
+                strv_length(read_write_paths) +
+                strv_length(read_only_paths) +
+                strv_length(inaccessible_paths) +
+                n_bind_mounts +
+                ns_info->private_dev +
+                (ns_info->protect_kernel_tunables ? ELEMENTSOF(protect_kernel_tunables_table) : 0) +
+                (ns_info->protect_control_groups ? 1 : 0) +
+                (ns_info->protect_kernel_modules ? ELEMENTSOF(protect_kernel_modules_table) : 0) +
+                protect_home_cnt + protect_system_cnt +
+                (namespace_info_mount_apivfs(root_directory, ns_info) ? ELEMENTSOF(apivfs_table) : 0);
+}
+
 int setup_namespace(
                 const char* root_directory,
+                const char* root_image,
+                const NameSpaceInfo *ns_info,
                 char** read_write_paths,
                 char** read_only_paths,
                 char** inaccessible_paths,
+                const BindMount *bind_mounts,
+                unsigned n_bind_mounts,
                 const char* tmp_dir,
                 const char* var_tmp_dir,
-                bool private_dev,
                 ProtectHome protect_home,
                 ProtectSystem protect_system,
-                unsigned long mount_flags) {
-
-        BindMount *m, *mounts = NULL;
-        unsigned n;
+                unsigned long mount_flags,
+                DissectImageFlags dissect_image_flags) {
+
+        _cleanup_(loop_device_unrefp) LoopDevice *loop_device = NULL;
+        _cleanup_(decrypted_image_unrefp) DecryptedImage *decrypted_image = NULL;
+        _cleanup_(dissected_image_unrefp) DissectedImage *dissected_image = NULL;
+        _cleanup_free_ void *root_hash = NULL;
+        MountEntry *m, *mounts = NULL;
+        size_t root_hash_size = 0;
+        bool make_slave = false;
+        unsigned n_mounts;
         int r = 0;
 
+        assert(ns_info);
+
         if (mount_flags == 0)
                 mount_flags = MS_SHARED;
 
-        if (unshare(CLONE_NEWNS) < 0)
-                return -errno;
+        if (root_image) {
+                dissect_image_flags |= DISSECT_IMAGE_REQUIRE_ROOT;
 
-        n = !!tmp_dir + !!var_tmp_dir +
-                strv_length(read_write_paths) +
-                strv_length(read_only_paths) +
-                strv_length(inaccessible_paths) +
-                private_dev +
-                (protect_home != PROTECT_HOME_NO ? 3 : 0) +
-                (protect_system != PROTECT_SYSTEM_NO ? 2 : 0) +
-                (protect_system == PROTECT_SYSTEM_FULL ? 1 : 0);
-
-        if (n > 0) {
-                m = mounts = (BindMount *) alloca0(n * sizeof(BindMount));
-                r = append_mounts(&m, read_write_paths, READWRITE);
+                if (protect_system == PROTECT_SYSTEM_STRICT && strv_isempty(read_write_paths))
+                        dissect_image_flags |= DISSECT_IMAGE_READ_ONLY;
+
+                r = loop_device_make_by_path(root_image,
+                                             dissect_image_flags & DISSECT_IMAGE_READ_ONLY ? O_RDONLY : O_RDWR,
+                                             &loop_device);
                 if (r < 0)
                         return r;
 
-                r = append_mounts(&m, read_only_paths, READONLY);
+                r = root_hash_load(root_image, &root_hash, &root_hash_size);
                 if (r < 0)
                         return r;
 
-                r = append_mounts(&m, inaccessible_paths, INACCESSIBLE);
+                r = dissect_image(loop_device->fd, root_hash, root_hash_size, dissect_image_flags, &dissected_image);
                 if (r < 0)
                         return r;
 
+                r = dissected_image_decrypt(dissected_image, NULL, root_hash, root_hash_size, dissect_image_flags, &decrypted_image);
+                if (r < 0)
+                        return r;
+
+                if (!root_directory) {
+                        /* Create a mount point for the image, if it's still missing. We use the same mount point for
+                         * all images, which is safe, since they all live in their own namespaces after all, and hence
+                         * won't see each other. */
+                        root_directory = "/run/systemd/unit-root";
+                        (void) mkdir(root_directory, 0700);
+                }
+        }
+
+        n_mounts = namespace_calculate_mounts(
+                        root_directory,
+                        ns_info,
+                        read_write_paths,
+                        read_only_paths,
+                        inaccessible_paths,
+                        bind_mounts, n_bind_mounts,
+                        tmp_dir, var_tmp_dir,
+                        protect_home, protect_system);
+
+        /* Set mount slave mode */
+        if (root_directory || n_mounts > 0)
+                make_slave = true;
+
+        if (n_mounts > 0) {
+                m = mounts = (MountEntry *) alloca0(n_mounts * sizeof(MountEntry));
+                r = append_access_mounts(&m, read_write_paths, READWRITE);
+                if (r < 0)
+                        goto finish;
+
+                r = append_access_mounts(&m, read_only_paths, READONLY);
+                if (r < 0)
+                        goto finish;
+
+                r = append_access_mounts(&m, inaccessible_paths, INACCESSIBLE);
+                if (r < 0)
+                        goto finish;
+
+                r = append_bind_mounts(&m, bind_mounts, n_bind_mounts);
+                if (r < 0)
+                        goto finish;
+
                 if (tmp_dir) {
-                        m->path = prefix_roota(root_directory, "/tmp");
-                        m->mode = PRIVATE_TMP;
-                        m++;
+                        *(m++) = (MountEntry) {
+                                .path_const = "/tmp",
+                                .mode = PRIVATE_TMP,
+                        };
                 }
 
                 if (var_tmp_dir) {
-                        m->path = prefix_roota(root_directory, "/var/tmp");
-                        m->mode = PRIVATE_VAR_TMP;
-                        m++;
+                        *(m++) = (MountEntry) {
+                                .path_const = "/var/tmp",
+                                .mode = PRIVATE_VAR_TMP,
+                        };
                 }
 
-                if (private_dev) {
-                        m->path = prefix_roota(root_directory, "/dev");
-                        m->mode = PRIVATE_DEV;
-                        m++;
+                if (ns_info->private_dev) {
+                        *(m++) = (MountEntry) {
+                                .path_const = "/dev",
+                                .mode = PRIVATE_DEV,
+                        };
                 }
 
-                if (protect_home != PROTECT_HOME_NO) {
-                        const char *home_dir, *run_user_dir, *root_dir;
-
-                        home_dir = prefix_roota(root_directory, "/home");
-                        home_dir = strjoina("-", home_dir);
-                        run_user_dir = prefix_roota(root_directory, "/run/user");
-                        run_user_dir = strjoina("-", run_user_dir);
-                        root_dir = prefix_roota(root_directory, "/root");
-                        root_dir = strjoina("-", root_dir);
+                if (ns_info->protect_kernel_tunables) {
+                        r = append_static_mounts(&m, protect_kernel_tunables_table, ELEMENTSOF(protect_kernel_tunables_table), ns_info->ignore_protect_paths);
+                        if (r < 0)
+                                goto finish;
+                }
 
-                        r = append_mounts(&m, STRV_MAKE(home_dir, run_user_dir, root_dir),
-                                protect_home == PROTECT_HOME_READ_ONLY ? READONLY : INACCESSIBLE);
+                if (ns_info->protect_kernel_modules) {
+                        r = append_static_mounts(&m, protect_kernel_modules_table, ELEMENTSOF(protect_kernel_modules_table), ns_info->ignore_protect_paths);
                         if (r < 0)
-                                return r;
+                                goto finish;
                 }
 
-                if (protect_system != PROTECT_SYSTEM_NO) {
-                        const char *usr_dir, *boot_dir, *etc_dir;
+                if (ns_info->protect_control_groups) {
+                        *(m++) = (MountEntry) {
+                                .path_const = "/sys/fs/cgroup",
+                                .mode = READONLY,
+                        };
+                }
+
+                r = append_protect_home(&m, protect_home, ns_info->ignore_protect_paths);
+                if (r < 0)
+                        goto finish;
 
-                        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");
+                r = append_protect_system(&m, protect_system, false);
+                if (r < 0)
+                        goto finish;
 
-                        r = append_mounts(&m, protect_system == PROTECT_SYSTEM_FULL
-                                ? STRV_MAKE(usr_dir, boot_dir, etc_dir)
-                                : STRV_MAKE(usr_dir, boot_dir), READONLY);
+                if (namespace_info_mount_apivfs(root_directory, ns_info)) {
+                        r = append_static_mounts(&m, apivfs_table, ELEMENTSOF(apivfs_table), ns_info->ignore_protect_paths);
                         if (r < 0)
-                                return r;
+                                goto finish;
                 }
 
-                assert(mounts + n == m);
+                assert(mounts + n_mounts == m);
+
+                /* Prepend the root directory where that's necessary */
+                r = prefix_where_needed(mounts, n_mounts, root_directory);
+                if (r < 0)
+                        goto finish;
+
+                qsort(mounts, n_mounts, sizeof(MountEntry), mount_path_compare);
+
+                drop_duplicates(mounts, &n_mounts);
+                drop_outside_root(root_directory, mounts, &n_mounts);
+                drop_inaccessible(mounts, &n_mounts);
+                drop_nop(mounts, &n_mounts);
+        }
 
-                qsort(mounts, n, sizeof(BindMount), mount_path_compare);
-                drop_duplicates(mounts, &n);
+        if (unshare(CLONE_NEWNS) < 0) {
+                r = -errno;
+                goto finish;
         }
 
-        if (n > 0 || root_directory) {
+        if (make_slave) {
                 /* Remount / as SLAVE so that nothing now mounted in the namespace
                    shows up in the parent */
-                if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL) < 0)
-                        return -errno;
+                if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL) < 0) {
+                        r = -errno;
+                        goto finish;
+                }
         }
 
-        if (root_directory) {
-                /* Turn directory into bind mount */
-                if (mount(root_directory, root_directory, NULL, MS_BIND|MS_REC, NULL) < 0)
-                        return -errno;
+        /* Try to set up the new root directory before mounting anything there */
+        if (root_directory)
+                (void) base_filesystem_create(root_directory, UID_INVALID, GID_INVALID);
+
+        if (root_image) {
+                r = dissected_image_mount(dissected_image, root_directory, dissect_image_flags);
+                if (r < 0)
+                        goto finish;
+
+                r = decrypted_image_relinquish(decrypted_image);
+                if (r < 0)
+                        goto finish;
+
+                loop_device_relinquish(loop_device);
+
+        } else if (root_directory) {
+
+                /* Turn directory into bind mount, if it isn't one yet */
+                r = path_is_mount_point(root_directory, NULL, AT_SYMLINK_FOLLOW);
+                if (r < 0)
+                        goto finish;
+                if (r == 0) {
+                        if (mount(root_directory, root_directory, NULL, MS_BIND|MS_REC, NULL) < 0) {
+                                r = -errno;
+                                goto finish;
+                        }
+                }
         }
 
-        if (n > 0) {
-                for (m = mounts; m < mounts + n; ++m) {
-                        r = apply_mount(m, tmp_dir, var_tmp_dir);
+        if (n_mounts > 0) {
+                _cleanup_fclose_ FILE *proc_self_mountinfo = NULL;
+                char **blacklist;
+                unsigned j;
+
+                /* Open /proc/self/mountinfo now as it may become unavailable if we mount anything on top of /proc.
+                 * For example, this is the case with the option: 'InaccessiblePaths=/proc' */
+                proc_self_mountinfo = fopen("/proc/self/mountinfo", "re");
+                if (!proc_self_mountinfo) {
+                        r = -errno;
+                        goto finish;
+                }
+
+                /* First round, add in all special mounts we need */
+                for (m = mounts; m < mounts + n_mounts; ++m) {
+                        r = apply_mount(root_directory, m, tmp_dir, var_tmp_dir);
                         if (r < 0)
-                                goto fail;
+                                goto finish;
                 }
 
-                for (m = mounts; m < mounts + n; ++m) {
-                        r = make_read_only(m);
+                /* Create a blacklist we can pass to bind_mount_recursive() */
+                blacklist = newa(char*, n_mounts+1);
+                for (j = 0; j < n_mounts; j++)
+                        blacklist[j] = (char*) mount_entry_path(mounts+j);
+                blacklist[j] = NULL;
+
+                /* Second round, flip the ro bits if necessary. */
+                for (m = mounts; m < mounts + n_mounts; ++m) {
+                        r = make_read_only(m, blacklist, proc_self_mountinfo);
                         if (r < 0)
-                                goto fail;
+                                goto finish;
                 }
         }
 
         if (root_directory) {
                 /* MS_MOVE does not work on MS_SHARED so the remount MS_SHARED will be done later */
                 r = mount_move_root(root_directory);
-
-                /* at this point, we cannot rollback */
                 if (r < 0)
-                        return r;
+                        goto finish;
         }
 
         /* Remount / as the desired mode. Not that this will not
          * reestablish propagation from our side to the host, since
          * what's disconnected is disconnected. */
-        if (mount(NULL, "/", NULL, mount_flags | MS_REC, NULL) < 0)
-                /* at this point, we cannot rollback */
-                return -errno;
+        if (mount(NULL, "/", NULL, mount_flags | MS_REC, NULL) < 0) {
+                r = -errno;
+                goto finish;
+        }
 
-        return 0;
+        r = 0;
 
-fail:
-        if (n > 0) {
-                for (m = mounts; m < mounts + n; ++m)
-                        if (m->done)
-                                (void) umount2(m->path, MNT_DETACH);
-        }
+finish:
+        for (m = mounts; m < mounts + n_mounts; m++)
+                mount_entry_done(m);
 
         return r;
 }
 
+void bind_mount_free_many(BindMount *b, unsigned n) {
+        unsigned i;
+
+        assert(b || n == 0);
+
+        for (i = 0; i < n; i++) {
+                free(b[i].source);
+                free(b[i].destination);
+        }
+
+        free(b);
+}
+
+int bind_mount_add(BindMount **b, unsigned *n, const BindMount *item) {
+        _cleanup_free_ char *s = NULL, *d = NULL;
+        BindMount *c;
+
+        assert(b);
+        assert(n);
+        assert(item);
+
+        s = strdup(item->source);
+        if (!s)
+                return -ENOMEM;
+
+        d = strdup(item->destination);
+        if (!d)
+                return -ENOMEM;
+
+        c = realloc_multiply(*b, sizeof(BindMount), *n + 1);
+        if (!c)
+                return -ENOMEM;
+
+        *b = c;
+
+        c[(*n) ++] = (BindMount) {
+                .source = s,
+                .destination = d,
+                .read_only = item->read_only,
+                .recursive = item->recursive,
+                .ignore_enoent = item->ignore_enoent,
+        };
+
+        s = d = NULL;
+        return 0;
+}
+
 static int setup_one_tmp_dir(const char *id, const char *prefix, char **path) {
         _cleanup_free_ char *x = NULL;
         char bid[SD_ID128_STRING_MAX];
@@ -530,7 +1204,7 @@ static int setup_one_tmp_dir(const char *id, const char *prefix, char **path) {
         if (r < 0)
                 return r;
 
-        x = strjoin(prefix, "/systemd-private-", sd_id128_to_string(boot_id, bid), "-", id, "-XXXXXX", NULL);
+        x = strjoin(prefix, "/systemd-private-", sd_id128_to_string(boot_id, bid), "-", id, "-XXXXXX");
         if (!x)
                 return -ENOMEM;
 
@@ -658,6 +1332,7 @@ static const char *const protect_system_table[_PROTECT_SYSTEM_MAX] = {
         [PROTECT_SYSTEM_NO] = "no",
         [PROTECT_SYSTEM_YES] = "yes",
         [PROTECT_SYSTEM_FULL] = "full",
+        [PROTECT_SYSTEM_STRICT] = "strict",
 };
 
 DEFINE_STRING_TABLE_LOOKUP(protect_system, ProtectSystem);
index 1aedf5f..f54954b 100644 (file)
@@ -4,6 +4,7 @@
   This file is part of systemd.
 
   Copyright 2010 Lennart Poettering
+  Copyright 2016 Djalal Harouni
 
   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
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+typedef struct NameSpaceInfo NameSpaceInfo;
+typedef struct BindMount BindMount;
+
 #include <stdbool.h>
 
+#include "dissect-image.h"
 #include "macro.h"
 
 typedef enum ProtectHome {
@@ -35,24 +40,48 @@ typedef enum ProtectSystem {
         PROTECT_SYSTEM_NO,
         PROTECT_SYSTEM_YES,
         PROTECT_SYSTEM_FULL,
+        PROTECT_SYSTEM_STRICT,
         _PROTECT_SYSTEM_MAX,
         _PROTECT_SYSTEM_INVALID = -1
 } ProtectSystem;
 
-int setup_namespace(const char *chroot,
-                    char **read_write_paths,
-                    char **read_only_paths,
-                    char **inaccessible_paths,
-                    const char *tmp_dir,
-                    const char *var_tmp_dir,
-                    bool private_dev,
-                    ProtectHome protect_home,
-                    ProtectSystem protect_system,
-                    unsigned long mount_flags);
-
-int setup_tmp_dirs(const char *id,
-                  char **tmp_dir,
-                  char **var_tmp_dir);
+struct NameSpaceInfo {
+        bool ignore_protect_paths:1;
+        bool private_dev:1;
+        bool protect_control_groups:1;
+        bool protect_kernel_tunables:1;
+        bool protect_kernel_modules:1;
+        bool mount_apivfs:1;
+};
+
+struct BindMount {
+        char *source;
+        char *destination;
+        bool read_only:1;
+        bool recursive:1;
+        bool ignore_enoent:1;
+};
+
+int setup_namespace(
+                const char *root_directory,
+                const char *root_image,
+                const NameSpaceInfo *ns_info,
+                char **read_write_paths,
+                char **read_only_paths,
+                char **inaccessible_paths,
+                const BindMount *bind_mounts,
+                unsigned n_bind_mounts,
+                const char *tmp_dir,
+                const char *var_tmp_dir,
+                ProtectHome protect_home,
+                ProtectSystem protect_system,
+                unsigned long mount_flags,
+                DissectImageFlags dissected_image_flags);
+
+int setup_tmp_dirs(
+                const char *id,
+                char **tmp_dir,
+                char **var_tmp_dir);
 
 int setup_netns(int netns_storage_socket[2]);
 
@@ -61,3 +90,6 @@ ProtectHome protect_home_from_string(const char *s) _pure_;
 
 const char* protect_system_to_string(ProtectSystem p) _const_;
 ProtectSystem protect_system_from_string(const char *s) _pure_;
+
+void bind_mount_free_many(BindMount *b, unsigned n);
+int bind_mount_add(BindMount **b, unsigned *n, const BindMount *item);
index c229e92..43d85e0 100644 (file)
 
                 <allow send_destination="org.freedesktop.systemd1"
                        send_interface="org.freedesktop.systemd1.Manager"
+                       send_member="GetUnitByInvocationID"/>
+
+                <allow send_destination="org.freedesktop.systemd1"
+                       send_interface="org.freedesktop.systemd1.Manager"
                        send_member="LoadUnit"/>
 
                 <allow send_destination="org.freedesktop.systemd1"
 
                 <allow send_destination="org.freedesktop.systemd1"
                        send_interface="org.freedesktop.systemd1.Manager"
+                       send_member="GetJobAfter"/>
+
+                <allow send_destination="org.freedesktop.systemd1"
+                       send_interface="org.freedesktop.systemd1.Manager"
+                       send_member="GetJobBefore"/>
+
+                <allow send_destination="org.freedesktop.systemd1"
+                       send_interface="org.freedesktop.systemd1.Manager"
                        send_member="ListUnits"/>
 
                 <allow send_destination="org.freedesktop.systemd1"
 
                 <allow send_destination="org.freedesktop.systemd1"
                        send_interface="org.freedesktop.systemd1.Manager"
+                       send_member="GetUnitFileLinks"/>
+
+                <allow send_destination="org.freedesktop.systemd1"
+                       send_interface="org.freedesktop.systemd1.Manager"
                        send_member="ListJobs"/>
 
                 <allow send_destination="org.freedesktop.systemd1"
                        send_interface="org.freedesktop.systemd1.Manager"
                        send_member="GetDefaultTarget"/>
 
+                <allow send_destination="org.freedesktop.systemd1"
+                       send_interface="org.freedesktop.systemd1.Manager"
+                       send_member="LookupDynamicUserByName"/>
+
+                <allow send_destination="org.freedesktop.systemd1"
+                       send_interface="org.freedesktop.systemd1.Manager"
+                       send_member="LookupDynamicUserByUID"/>
+
                 <!-- Managed via polkit or other criteria -->
 
                 <allow send_destination="org.freedesktop.systemd1"
 
                 <allow send_destination="org.freedesktop.systemd1"
                        send_interface="org.freedesktop.systemd1.Manager"
+                       send_member="RefUnit"/>
+
+                <allow send_destination="org.freedesktop.systemd1"
+                       send_interface="org.freedesktop.systemd1.Manager"
+                       send_member="UnrefUnit"/>
+
+                <allow send_destination="org.freedesktop.systemd1"
+                       send_interface="org.freedesktop.systemd1.Manager"
                        send_member="EnableUnitFiles"/>
 
                 <allow send_destination="org.freedesktop.systemd1"
                        send_interface="org.freedesktop.systemd1.Job"
                        send_member="Cancel"/>
 
+                <allow send_destination="org.freedesktop.systemd1"
+                       send_interface="org.freedesktop.systemd1.Job"
+                       send_member="GetAfter"/>
+
+                <allow send_destination="org.freedesktop.systemd1"
+                       send_interface="org.freedesktop.systemd1.Job"
+                       send_member="GetBefore"/>
+
                 <allow receive_sender="org.freedesktop.systemd1"/>
         </policy>
 
index 0dd0d37..83f794b 100644 (file)
@@ -454,7 +454,7 @@ static int path_coldplug(Unit *u) {
 static void path_enter_dead(Path *p, PathResult f) {
         assert(p);
 
-        if (f != PATH_SUCCESS)
+        if (p->result == PATH_SUCCESS)
                 p->result = f;
 
         path_set_state(p, p->result != PATH_SUCCESS ? PATH_FAILED : PATH_DEAD);
@@ -577,6 +577,10 @@ static int path_start(Unit *u) {
                 return r;
         }
 
+        r = unit_acquire_invocation_id(u);
+        if (r < 0)
+                return r;
+
         path_mkdir(p);
 
         p->result = PATH_SUCCESS;
index b45e238..a1d5c1c 100644 (file)
@@ -147,6 +147,32 @@ static int scope_verify(Scope *s) {
         return 0;
 }
 
+static int scope_load_init_scope(Unit *u) {
+        assert(u);
+
+        if (!unit_has_name(u, SPECIAL_INIT_SCOPE))
+                return 0;
+
+        u->transient = true;
+        u->perpetual = true;
+
+        /* init.scope is a bit special, as it has to stick around forever. Because of its special semantics we
+         * synthesize it here, instead of relying on the unit file on disk. */
+
+        u->default_dependencies = false;
+        u->ignore_on_isolate = true;
+
+        SCOPE(u)->kill_context.kill_signal = SIGRTMIN+14;
+
+        /* Prettify things, if we can. */
+        if (!u->description)
+                u->description = strdup("System and Service Manager");
+        if (!u->documentation)
+                (void) strv_extend(&u->documentation, "man:systemd(1)");
+
+        return 1;
+}
+
 static int scope_load(Unit *u) {
         Scope *s = SCOPE(u);
         int r;
@@ -158,6 +184,9 @@ static int scope_load(Unit *u) {
                 /* Refuse to load non-transient scope units, but allow them while reloading. */
                 return -ENOENT;
 
+        r = scope_load_init_scope(u);
+        if (r < 0)
+                return r;
         r = unit_load_fragment_and_dropin_optional(u);
         if (r < 0)
                 return r;
@@ -221,7 +250,7 @@ static void scope_dump(Unit *u, FILE *f, const char *prefix) {
 static void scope_enter_dead(Scope *s, ScopeResult f) {
         assert(s);
 
-        if (f != SCOPE_SUCCESS)
+        if (s->result == SCOPE_SUCCESS)
                 s->result = f;
 
         scope_set_state(s, s->result != SCOPE_SUCCESS ? SCOPE_FAILED : SCOPE_DEAD);
@@ -233,7 +262,7 @@ static void scope_enter_signal(Scope *s, ScopeState state, ScopeResult f) {
 
         assert(s);
 
-        if (f != SCOPE_SUCCESS)
+        if (s->result == SCOPE_SUCCESS)
                 s->result = f;
 
         unit_watch_all_pids(UNIT(s));
@@ -244,7 +273,9 @@ static void scope_enter_signal(Scope *s, ScopeState state, ScopeResult f) {
         if (state == SCOPE_STOP_SIGTERM)
                 skip_signal = bus_scope_send_request_stop(s) > 0;
 
-        if (!skip_signal) {
+        if (skip_signal)
+                r = 1; /* wait */
+        else {
                 r = unit_kill_context(
                                 UNIT(s),
                                 &s->kill_context,
@@ -254,8 +285,7 @@ static void scope_enter_signal(Scope *s, ScopeState state, ScopeResult f) {
                                 -1, -1, false);
                 if (r < 0)
                         goto fail;
-        } else
-                r = 1;
+        }
 
         if (r > 0) {
                 r = scope_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), s->timeout_stop_usec));
@@ -298,6 +328,10 @@ static int scope_start(Unit *u) {
         if (!u->transient && !MANAGER_IS_RELOADING(u->manager))
                 return -ENOENT;
 
+        r = unit_acquire_invocation_id(u);
+        if (r < 0)
+                return r;
+
         (void) unit_realize_cgroup(u);
         (void) unit_reset_cpu_usage(u);
 
@@ -441,7 +475,7 @@ static void scope_sigchld_event(Unit *u, pid_t pid, int code, int status) {
 
         /* If the PID set is empty now, then let's finish this off
            (On unified we use proper notifications) */
-        if (cg_unified() <= 0 && set_isempty(u->pids))
+        if (cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER) == 0 && set_isempty(u->pids))
                 scope_notify_cgroup_empty_event(u);
 }
 
@@ -530,34 +564,16 @@ static void scope_enumerate(Manager *m) {
 
         u = manager_get_unit(m, SPECIAL_INIT_SCOPE);
         if (!u) {
-                u = unit_new(m, sizeof(Scope));
-                if (!u) {
-                        log_oom();
-                        return;
-                }
-
-                r = unit_add_name(u, SPECIAL_INIT_SCOPE);
+                r = unit_new_for_name(m, sizeof(Scope), SPECIAL_INIT_SCOPE, &u);
                 if (r < 0)  {
-                        unit_free(u);
-                        log_error_errno(r, "Failed to add init.scope name");
+                        log_error_errno(r, "Failed to allocate the special " SPECIAL_INIT_SCOPE " unit: %m");
                         return;
                 }
         }
 
         u->transient = true;
-        u->default_dependencies = false;
-        u->no_gc = true;
-        u->ignore_on_isolate = true;
-        u->refuse_manual_start = true;
-        u->refuse_manual_stop = true;
+        u->perpetual = true;
         SCOPE(u)->deserialized_state = SCOPE_RUNNING;
-        SCOPE(u)->kill_context.kill_signal = SIGRTMIN+14;
-
-        /* Prettify things, if we can. */
-        if (!u->description)
-                u->description = strdup("System and Service Manager");
-        if (!u->documentation)
-                (void) strv_extend(&u->documentation, "man:systemd(1)");
 
         unit_add_to_load_queue(u);
         unit_add_to_dbus_queue(u);
index 2b96a95..0f8a2d6 100644 (file)
@@ -135,7 +135,12 @@ _printf_(2, 3) static int log_callback(int type, const char *fmt, ...) {
         fmt2 = strjoina("selinux: ", fmt);
 
         va_start(ap, fmt);
-        log_internalv(LOG_AUTH | callback_type_to_priority(type), 0, __FILE__, __LINE__, __FUNCTION__, fmt2, ap);
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+        log_internalv(LOG_AUTH | callback_type_to_priority(type),
+                      0, __FILE__, __LINE__, __FUNCTION__,
+                      fmt2, ap);
+#pragma GCC diagnostic pop
         va_end(ap);
 
         return 0;
index 8f1f058..f46370d 100644 (file)
@@ -33,7 +33,7 @@ int mac_selinux_generic_access_check(sd_bus_message *message, const char *path,
 
 #define mac_selinux_unit_access_check(unit, message, permission, error) \
         ({                                                              \
-                Unit *_unit = (unit);                                   \
+                const Unit *_unit = (unit);                             \
                 mac_selinux_generic_access_check((message), _unit->source_path ?: _unit->fragment_path, (permission), (error)); \
         })
 
index 59d333c..718c9ac 100644 (file)
@@ -33,7 +33,7 @@
 #include "exit-status.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "load-dropin.h"
 #include "load-fragment.h"
@@ -51,7 +51,6 @@
 #include "string-util.h"
 #include "strv.h"
 #include "unit-name.h"
-#include "unit-printf.h"
 #include "unit.h"
 #include "utf8.h"
 #include "util.h"
@@ -293,7 +292,17 @@ static void service_fd_store_unlink(ServiceFDStore *fs) {
         free(fs);
 }
 
-static void service_release_resources(Unit *u) {
+static void service_release_fd_store(Service *s) {
+        assert(s);
+
+        log_unit_debug(UNIT(s), "Releasing all stored fds");
+        while (s->fd_store)
+                service_fd_store_unlink(s->fd_store);
+
+        assert(s->n_fd_store == 0);
+}
+
+static void service_release_resources(Unit *u, bool inactive) {
         Service *s = SERVICE(u);
 
         assert(s);
@@ -301,16 +310,14 @@ static void service_release_resources(Unit *u) {
         if (!s->fd_store && s->stdin_fd < 0 && s->stdout_fd < 0 && s->stderr_fd < 0)
                 return;
 
-        log_unit_debug(u, "Releasing all resources.");
+        log_unit_debug(u, "Releasing resources.");
 
         s->stdin_fd = safe_close(s->stdin_fd);
         s->stdout_fd = safe_close(s->stdout_fd);
         s->stderr_fd = safe_close(s->stderr_fd);
 
-        while (s->fd_store)
-                service_fd_store_unlink(s->fd_store);
-
-        assert(s->n_fd_store == 0);
+        if (inactive)
+                service_release_fd_store(s);
 }
 
 static void service_done(Unit *u) {
@@ -326,6 +333,8 @@ static void service_done(Unit *u) {
         s->control_command = NULL;
         s->main_command = NULL;
 
+        dynamic_creds_unref(&s->dynamic_creds);
+
         exit_status_set_free(&s->restart_prevent_status);
         exit_status_set_free(&s->restart_force_status);
         exit_status_set_free(&s->success_status);
@@ -344,6 +353,7 @@ static void service_done(Unit *u) {
         s->bus_name_owner = mfree(s->bus_name_owner);
 
         service_close_socket_fd(s);
+        s->peer = socket_peer_unref(s->peer);
 
         unit_ref_unset(&s->accept_socket);
 
@@ -351,7 +361,7 @@ static void service_done(Unit *u) {
 
         s->timer_event_source = sd_event_source_unref(s->timer_event_source);
 
-        service_release_resources(u);
+        service_release_resources(u, true);
 }
 
 static int on_fd_store_io(sd_event_source *e, int fd, uint32_t revents, void *userdata) {
@@ -361,6 +371,10 @@ static int on_fd_store_io(sd_event_source *e, int fd, uint32_t revents, void *us
         assert(fs);
 
         /* If we get either EPOLLHUP or EPOLLERR, it's time to remove this entry from the fd store */
+        log_unit_debug(UNIT(fs->service),
+                       "Received %s on stored fd %d (%s), closing.",
+                       revents & EPOLLERR ? "EPOLLERR" : "EPOLLHUP",
+                       fs->fd, strna(fs->fdname));
         service_fd_store_unlink(fs);
         return 0;
 }
@@ -369,20 +383,23 @@ static int service_add_fd_store(Service *s, int fd, const char *name) {
         ServiceFDStore *fs;
         int r;
 
+        /* fd is always consumed if we return >= 0 */
+
         assert(s);
         assert(fd >= 0);
 
         if (s->n_fd_store >= s->n_fd_store_max)
-                return 0;
+                return -EXFULL; /* Our store is full.
+                                 * Use this errno rather than E[NM]FILE to distinguish from
+                                 * the case where systemd itself hits the file limit. */
 
         LIST_FOREACH(fd_store, fs, s->fd_store) {
                 r = same_fd(fs->fd, fd);
                 if (r < 0)
                         return r;
                 if (r > 0) {
-                        /* Already included */
                         safe_close(fd);
-                        return 1;
+                        return 0; /* fd already included */
                 }
         }
 
@@ -399,18 +416,17 @@ static int service_add_fd_store(Service *s, int fd, const char *name) {
         }
 
         r = sd_event_add_io(UNIT(s)->manager->event, &fs->event_source, fd, 0, on_fd_store_io, fs);
-        if (r < 0) {
+        if (r < 0 && r != -EPERM) { /* EPERM indicates fds that aren't pollable, which is OK */
                 free(fs->fdname);
                 free(fs);
                 return r;
-        }
-
-        (void) sd_event_source_set_description(fs->event_source, "service-fd-store");
+        } else if (r >= 0)
+                (void) sd_event_source_set_description(fs->event_source, "service-fd-store");
 
         LIST_PREPEND(fd_store, s->fd_store, fs);
         s->n_fd_store++;
 
-        return 1;
+        return 1; /* fd newly stored */
 }
 
 static int service_add_fd_store_set(Service *s, FDSet *fds, const char *name) {
@@ -418,10 +434,7 @@ static int service_add_fd_store_set(Service *s, FDSet *fds, const char *name) {
 
         assert(s);
 
-        if (fdset_size(fds) <= 0)
-                return 0;
-
-        while (s->n_fd_store < s->n_fd_store_max) {
+        while (fdset_size(fds) > 0) {
                 _cleanup_close_ int fd = -1;
 
                 fd = fdset_steal_first(fds);
@@ -429,17 +442,17 @@ static int service_add_fd_store_set(Service *s, FDSet *fds, const char *name) {
                         break;
 
                 r = service_add_fd_store(s, fd, name);
+                if (r == -EXFULL)
+                        return log_unit_warning_errno(UNIT(s), r,
+                                                      "Cannot store more fds than FileDescriptorStoreMax=%u, closing remaining.",
+                                                      s->n_fd_store_max);
                 if (r < 0)
-                        return log_unit_error_errno(UNIT(s), r, "Couldn't add fd to fd store: %m");
-                if (r > 0) {
-                        log_unit_debug(UNIT(s), "Added fd to fd store.");
-                        fd = -1;
-                }
+                        return log_unit_error_errno(UNIT(s), r, "Failed to add fd to store: %m");
+                if (r > 0)
+                        log_unit_debug(UNIT(s), "Added fd %u (%s) to fd store.", fd, strna(name));
+                fd = -1;
         }
 
-        if (fdset_size(fds) > 0)
-                log_unit_warning(UNIT(s), "Tried to store more fds than FileDescriptorStoreMax=%u allows, closing remaining.", s->n_fd_store_max);
-
         return 0;
 }
 
@@ -762,6 +775,11 @@ static void service_dump(Unit *u, FILE *f, const char *prefix) {
                         prefix, s->bus_name,
                         prefix, yes_no(s->bus_name_good));
 
+        if (UNIT_ISSET(s->accept_socket))
+                fprintf(f,
+                        "%sAccept Socket: %s\n",
+                        prefix, UNIT_DEREF(s->accept_socket)->id);
+
         kill_context_dump(&s->kill_context, f, prefix);
         exec_context_dump(&s->exec_context, f, prefix);
 
@@ -888,11 +906,8 @@ static int service_load_pid_file(Service *s, bool may_warn) {
                 return r;
 
         r = unit_watch_pid(UNIT(s), pid);
-        if (r < 0) {
-                /* FIXME: we need to do something here */
-                log_unit_warning_errno(UNIT(s), r, "Failed to watch PID "PID_FMT" for service: %m", pid);
-                return r;
-        }
+        if (r < 0) /* FIXME: we need to do something here */
+                return log_unit_warning_errno(UNIT(s), r, "Failed to watch PID "PID_FMT" for service: %m", pid);
 
         return 1;
 }
@@ -1088,18 +1103,42 @@ static int service_coldplug(Unit *u) {
         if (IN_SET(s->deserialized_state, SERVICE_START_POST, SERVICE_RUNNING, SERVICE_RELOAD))
                 service_start_watchdog(s);
 
+        if (!IN_SET(s->deserialized_state, SERVICE_DEAD, SERVICE_FAILED, SERVICE_AUTO_RESTART))
+                (void) unit_setup_dynamic_creds(u);
+
+        if (UNIT_ISSET(s->accept_socket)) {
+                Socket* socket = SOCKET(UNIT_DEREF(s->accept_socket));
+
+                if (socket->max_connections_per_source > 0) {
+                        SocketPeer *peer;
+
+                        /* Make a best-effort attempt at bumping the connection count */
+                        if (socket_acquire_peer(socket, s->socket_fd, &peer) > 0) {
+                                socket_peer_unref(s->peer);
+                                s->peer = peer;
+                        }
+                }
+        }
+
         service_set_state(s, s->deserialized_state);
         return 0;
 }
 
-static int service_collect_fds(Service *s, int **fds, char ***fd_names) {
+static int service_collect_fds(Service *s,
+                               int **fds,
+                               char ***fd_names,
+                               unsigned *n_storage_fds,
+                               unsigned *n_socket_fds) {
+
         _cleanup_strv_free_ char **rfd_names = NULL;
         _cleanup_free_ int *rfds = NULL;
-        int rn_fds = 0, r;
+        unsigned rn_socket_fds = 0, rn_storage_fds = 0;
+        int r;
 
         assert(s);
         assert(fds);
         assert(fd_names);
+        assert(n_socket_fds);
 
         if (s->socket_fd >= 0) {
 
@@ -1114,7 +1153,7 @@ static int service_collect_fds(Service *s, int **fds, char ***fd_names) {
                 if (!rfd_names)
                         return -ENOMEM;
 
-                rn_fds = 1;
+                rn_socket_fds = 1;
         } else {
                 Iterator i;
                 Unit *u;
@@ -1140,20 +1179,20 @@ static int service_collect_fds(Service *s, int **fds, char ***fd_names) {
 
                         if (!rfds) {
                                 rfds = cfds;
-                                rn_fds = cn_fds;
+                                rn_socket_fds = cn_fds;
 
                                 cfds = NULL;
                         } else {
                                 int *t;
 
-                                t = realloc(rfds, (rn_fds + cn_fds) * sizeof(int));
+                                t = realloc(rfds, (rn_socket_fds + cn_fds) * sizeof(int));
                                 if (!t)
                                         return -ENOMEM;
 
-                                memcpy(t + rn_fds, cfds, cn_fds * sizeof(int));
+                                memcpy(t + rn_socket_fds, cfds, cn_fds * sizeof(int));
 
                                 rfds = t;
-                                rn_fds += cn_fds;
+                                rn_socket_fds += cn_fds;
                         }
 
                         r = strv_extend_n(&rfd_names, socket_fdname(sock), cn_fds);
@@ -1164,66 +1203,84 @@ static int service_collect_fds(Service *s, int **fds, char ***fd_names) {
 
         if (s->n_fd_store > 0) {
                 ServiceFDStore *fs;
+                unsigned n_fds;
                 char **nl;
                 int *t;
 
-                t = realloc(rfds, (rn_fds + s->n_fd_store) * sizeof(int));
+                t = realloc(rfds, (rn_socket_fds + s->n_fd_store) * sizeof(int));
                 if (!t)
                         return -ENOMEM;
 
                 rfds = t;
 
-                nl = realloc(rfd_names, (rn_fds + s->n_fd_store + 1) * sizeof(char*));
+                nl = realloc(rfd_names, (rn_socket_fds + s->n_fd_store + 1) * sizeof(char*));
                 if (!nl)
                         return -ENOMEM;
 
                 rfd_names = nl;
+                n_fds = rn_socket_fds;
 
                 LIST_FOREACH(fd_store, fs, s->fd_store) {
-                        rfds[rn_fds] = fs->fd;
-                        rfd_names[rn_fds] = strdup(strempty(fs->fdname));
-                        if (!rfd_names[rn_fds])
+                        rfds[n_fds] = fs->fd;
+                        rfd_names[n_fds] = strdup(strempty(fs->fdname));
+                        if (!rfd_names[n_fds])
                                 return -ENOMEM;
 
-                        rn_fds++;
+                        rn_storage_fds++;
+                        n_fds++;
                 }
 
-                rfd_names[rn_fds] = NULL;
+                rfd_names[n_fds] = NULL;
         }
 
         *fds = rfds;
         *fd_names = rfd_names;
+        *n_socket_fds = rn_socket_fds;
+        *n_storage_fds = rn_storage_fds;
 
         rfds = NULL;
         rfd_names = NULL;
 
-        return rn_fds;
+        return 0;
+}
+
+static bool service_exec_needs_notify_socket(Service *s, ExecFlags flags) {
+        assert(s);
+
+        /* Notifications are accepted depending on the process and
+         * the access setting of the service:
+         *     process: \ access:  NONE  MAIN  EXEC   ALL
+         *     main                  no   yes   yes   yes
+         *     control               no    no   yes   yes
+         *     other (forked)        no    no    no   yes */
+
+        if (flags & EXEC_IS_CONTROL)
+                /* A control process */
+                return IN_SET(s->notify_access, NOTIFY_EXEC, NOTIFY_ALL);
+
+        /* We only spawn main processes and control processes, so any
+         * process that is not a control process is a main process */
+        return s->notify_access != NOTIFY_NONE;
 }
 
 static int service_spawn(
                 Service *s,
                 ExecCommand *c,
                 usec_t timeout,
-                bool pass_fds,
-                bool apply_permissions,
-                bool apply_chroot,
-                bool apply_tty_stdin,
-                bool is_control,
+                ExecFlags flags,
                 pid_t *_pid) {
 
-        _cleanup_strv_free_ char **argv = NULL, **final_env = NULL, **our_env = NULL, **fd_names = NULL;
+        _cleanup_strv_free_ char **final_env = NULL, **our_env = NULL, **fd_names = NULL;
         _cleanup_free_ int *fds = NULL;
-        unsigned n_fds = 0, n_env = 0;
+        unsigned n_storage_fds = 0, n_socket_fds = 0, n_env = 0;
         const char *path;
         pid_t pid;
 
         ExecParameters exec_params = {
-                .apply_permissions = apply_permissions,
-                .apply_chroot      = apply_chroot,
-                .apply_tty_stdin   = apply_tty_stdin,
-                .stdin_fd          = -1,
-                .stdout_fd         = -1,
-                .stderr_fd         = -1,
+                .flags      = flags,
+                .stdin_fd   = -1,
+                .stdout_fd  = -1,
+                .stderr_fd  = -1,
         };
 
         int r;
@@ -1232,6 +1289,14 @@ static int service_spawn(
         assert(c);
         assert(_pid);
 
+        if (flags & EXEC_IS_CONTROL) {
+                /* If this is a control process, mask the permissions/chroot application if this is requested. */
+                if (s->permissions_start_only)
+                        exec_params.flags &= ~EXEC_APPLY_PERMISSIONS;
+                if (s->root_directory_start_only)
+                        exec_params.flags &= ~EXEC_APPLY_CHROOT;
+        }
+
         (void) unit_realize_cgroup(UNIT(s));
         if (s->reset_cpu_usage) {
                 (void) unit_reset_cpu_usage(UNIT(s));
@@ -1242,31 +1307,31 @@ static int service_spawn(
         if (r < 0)
                 return r;
 
-        if (pass_fds ||
+        r = unit_setup_dynamic_creds(UNIT(s));
+        if (r < 0)
+                return r;
+
+        if ((flags & EXEC_PASS_FDS) ||
             s->exec_context.std_input == EXEC_INPUT_SOCKET ||
             s->exec_context.std_output == EXEC_OUTPUT_SOCKET ||
             s->exec_context.std_error == EXEC_OUTPUT_SOCKET) {
 
-                r = service_collect_fds(s, &fds, &fd_names);
+                r = service_collect_fds(s, &fds, &fd_names, &n_storage_fds, &n_socket_fds);
                 if (r < 0)
                         return r;
 
-                n_fds = r;
+                log_unit_debug(UNIT(s), "Passing %i fds to service", n_storage_fds + n_socket_fds);
         }
 
         r = service_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), timeout));
         if (r < 0)
                 return r;
 
-        r = unit_full_printf_strv(UNIT(s), c->argv, &argv);
-        if (r < 0)
-                return r;
-
-        our_env = new0(char*, 6);
+        our_env = new0(char*, 9);
         if (!our_env)
                 return -ENOMEM;
 
-        if (is_control ? s->notify_access == NOTIFY_ALL : s->notify_access != NOTIFY_NONE)
+        if (service_exec_needs_notify_socket(s, flags))
                 if (asprintf(our_env + n_env++, "NOTIFY_SOCKET=%s", UNIT(s)->manager->notify_socket) < 0)
                         return -ENOMEM;
 
@@ -1274,7 +1339,7 @@ static int service_spawn(
                 if (asprintf(our_env + n_env++, "MAINPID="PID_FMT, s->main_pid) < 0)
                         return -ENOMEM;
 
-        if (!MANAGER_IS_SYSTEM(UNIT(s)->manager))
+        if (MANAGER_IS_USER(UNIT(s)->manager))
                 if (asprintf(our_env + n_env++, "MANAGERPID="PID_FMT, getpid()) < 0)
                         return -ENOMEM;
 
@@ -1283,13 +1348,19 @@ static int service_spawn(
                 socklen_t salen = sizeof(sa);
 
                 r = getpeername(s->socket_fd, &sa.sa, &salen);
-                if (r < 0)
-                        return -errno;
+                if (r < 0) {
+                        r = -errno;
+
+                        /* ENOTCONN is legitimate if the endpoint disappeared on shutdown.
+                         * This connection is over, but the socket unit lives on. */
+                        if (r != -ENOTCONN || !IN_SET(s->control_command_id, SERVICE_EXEC_STOP, SERVICE_EXEC_STOP_POST))
+                                return r;
+                }
 
-                if (IN_SET(sa.sa.sa_family, AF_INET, AF_INET6)) {
+                if (r == 0 && IN_SET(sa.sa.sa_family, AF_INET, AF_INET6, AF_VSOCK)) {
                         _cleanup_free_ char *addr = NULL;
                         char *t;
-                        int port;
+                        unsigned port;
 
                         r = sockaddr_pretty(&sa.sa, salen, true, false, &addr);
                         if (r < 0)
@@ -1300,9 +1371,9 @@ static int service_spawn(
                                 return -ENOMEM;
                         our_env[n_env++] = t;
 
-                        port = sockaddr_port(&sa.sa);
-                        if (port < 0)
-                                return port;
+                        r = sockaddr_port(&sa.sa, &port);
+                        if (r < 0)
+                                return r;
 
                         if (asprintf(&t, "REMOTE_PORT=%u", port) < 0)
                                 return -ENOMEM;
@@ -1310,22 +1381,42 @@ static int service_spawn(
                 }
         }
 
+        if (flags & EXEC_SETENV_RESULT) {
+                if (asprintf(our_env + n_env++, "SERVICE_RESULT=%s", service_result_to_string(s->result)) < 0)
+                        return -ENOMEM;
+
+                if (s->main_exec_status.pid > 0 &&
+                    dual_timestamp_is_set(&s->main_exec_status.exit_timestamp)) {
+                        if (asprintf(our_env + n_env++, "EXIT_CODE=%s", sigchld_code_to_string(s->main_exec_status.code)) < 0)
+                                return -ENOMEM;
+
+                        if (s->main_exec_status.code == CLD_EXITED)
+                                r = asprintf(our_env + n_env++, "EXIT_STATUS=%i", s->main_exec_status.status);
+                        else
+                                r = asprintf(our_env + n_env++, "EXIT_STATUS=%s", signal_to_string(s->main_exec_status.status));
+                        if (r < 0)
+                                return -ENOMEM;
+                }
+        }
+
         final_env = strv_env_merge(2, UNIT(s)->manager->environment, our_env, NULL);
         if (!final_env)
                 return -ENOMEM;
 
-        if (is_control && UNIT(s)->cgroup_path) {
+        if ((flags & EXEC_IS_CONTROL) && UNIT(s)->cgroup_path) {
                 path = strjoina(UNIT(s)->cgroup_path, "/control");
                 (void) cg_create(SYSTEMD_CGROUP_CONTROLLER, path);
         } else
                 path = UNIT(s)->cgroup_path;
 
-        exec_params.argv = argv;
+        exec_params.flags |= MANAGER_IS_SYSTEM(UNIT(s)->manager) ? EXEC_NEW_KEYRING : 0;
+        exec_params.argv = c->argv;
+        exec_params.environment = final_env;
         exec_params.fds = fds;
         exec_params.fd_names = fd_names;
-        exec_params.n_fds = n_fds;
-        exec_params.environment = final_env;
-        exec_params.confirm_spawn = UNIT(s)->manager->confirm_spawn;
+        exec_params.n_storage_fds = n_storage_fds;
+        exec_params.n_socket_fds = n_socket_fds;
+        exec_params.confirm_spawn = manager_get_confirm_spawn(UNIT(s)->manager);
         exec_params.cgroup_supported = UNIT(s)->manager->cgroup_supported;
         exec_params.cgroup_path = path;
         exec_params.cgroup_delegate = s->cgroup_context.delegate;
@@ -1343,13 +1434,13 @@ static int service_spawn(
                        &s->exec_context,
                        &exec_params,
                        s->exec_runtime,
+                       &s->dynamic_creds,
                        &pid);
         if (r < 0)
                 return r;
 
         r = unit_watch_pid(UNIT(s), pid);
-        if (r < 0)
-                /* FIXME: we need to do something here */
+        if (r < 0) /* FIXME: we need to do something here */
                 return r;
 
         *_pid = pid;
@@ -1450,14 +1541,14 @@ static void service_enter_dead(Service *s, ServiceResult f, bool allow_restart)
         int r;
         assert(s);
 
-        if (f != SERVICE_SUCCESS)
+        if (s->result == SERVICE_SUCCESS)
                 s->result = f;
 
         service_set_state(s, s->result != SERVICE_SUCCESS ? SERVICE_FAILED : SERVICE_DEAD);
 
         if (s->result != SERVICE_SUCCESS) {
                 log_unit_warning(UNIT(s), "Failed with result '%s'.", service_result_to_string(s->result));
-                failure_action(UNIT(s)->manager, s->failure_action, UNIT(s)->reboot_arg);
+                emergency_action(UNIT(s)->manager, s->emergency_action, UNIT(s)->reboot_arg, "service failed");
         }
 
         if (allow_restart && service_shall_restart(s)) {
@@ -1476,9 +1567,15 @@ static void service_enter_dead(Service *s, ServiceResult f, bool allow_restart)
         exec_runtime_destroy(s->exec_runtime);
         s->exec_runtime = exec_runtime_unref(s->exec_runtime);
 
-        /* Also, remove the runtime directory in */
+        /* Also, remove the runtime directory */
         exec_context_destroy_runtime_directory(&s->exec_context, manager_get_runtime_prefix(UNIT(s)->manager));
 
+        /* Get rid of the IPC bits of the user */
+        unit_unref_uid_gid(UNIT(s), true);
+
+        /* Release the user, and destroy it if we are the only remaining owner */
+        dynamic_creds_destroy(&s->dynamic_creds);
+
         /* Try to delete the pid file. At this point it will be
          * out-of-date, and some software might be confused by it, so
          * let's remove it. */
@@ -1496,7 +1593,7 @@ static void service_enter_stop_post(Service *s, ServiceResult f) {
         int r;
         assert(s);
 
-        if (f != SERVICE_SUCCESS)
+        if (s->result == SERVICE_SUCCESS)
                 s->result = f;
 
         service_unwatch_control_pid(s);
@@ -1509,11 +1606,7 @@ static void service_enter_stop_post(Service *s, ServiceResult f) {
                 r = service_spawn(s,
                                   s->control_command,
                                   s->timeout_stop_usec,
-                                  false,
-                                  !s->permissions_start_only,
-                                  !s->root_directory_start_only,
-                                  true,
-                                  true,
+                                  EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_APPLY_TTY_STDIN|EXEC_IS_CONTROL|EXEC_SETENV_RESULT,
                                   &s->control_pid);
                 if (r < 0)
                         goto fail;
@@ -1553,7 +1646,7 @@ static void service_enter_signal(Service *s, ServiceState state, ServiceResult f
 
         assert(s);
 
-        if (f != SERVICE_SUCCESS)
+        if (s->result == SERVICE_SUCCESS)
                 s->result = f;
 
         unit_watch_all_pids(UNIT(s));
@@ -1611,7 +1704,7 @@ static void service_enter_stop(Service *s, ServiceResult f) {
 
         assert(s);
 
-        if (f != SERVICE_SUCCESS)
+        if (s->result == SERVICE_SUCCESS)
                 s->result = f;
 
         service_unwatch_control_pid(s);
@@ -1624,11 +1717,7 @@ static void service_enter_stop(Service *s, ServiceResult f) {
                 r = service_spawn(s,
                                   s->control_command,
                                   s->timeout_stop_usec,
-                                  false,
-                                  !s->permissions_start_only,
-                                  !s->root_directory_start_only,
-                                  false,
-                                  true,
+                                  EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_IS_CONTROL|EXEC_SETENV_RESULT,
                                   &s->control_pid);
                 if (r < 0)
                         goto fail;
@@ -1667,7 +1756,7 @@ static bool service_good(Service *s) {
 static void service_enter_running(Service *s, ServiceResult f) {
         assert(s);
 
-        if (f != SERVICE_SUCCESS)
+        if (s->result == SERVICE_SUCCESS)
                 s->result = f;
 
         service_unwatch_control_pid(s);
@@ -1685,7 +1774,9 @@ static void service_enter_running(Service *s, ServiceResult f) {
                         service_arm_timer(s, usec_add(UNIT(s)->active_enter_timestamp.monotonic, s->runtime_max_usec));
                 }
 
-        } else if (s->remain_after_exit)
+        } else if (f != SERVICE_SUCCESS)
+                service_enter_signal(s, SERVICE_STOP_SIGTERM, f);
+        else if (s->remain_after_exit)
                 service_set_state(s, SERVICE_EXITED);
         else
                 service_enter_stop(s, SERVICE_SUCCESS);
@@ -1705,11 +1796,7 @@ static void service_enter_start_post(Service *s) {
                 r = service_spawn(s,
                                   s->control_command,
                                   s->timeout_start_usec,
-                                  false,
-                                  !s->permissions_start_only,
-                                  !s->root_directory_start_only,
-                                  false,
-                                  true,
+                                  EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_IS_CONTROL,
                                   &s->control_pid);
                 if (r < 0)
                         goto fail;
@@ -1764,7 +1851,15 @@ static void service_enter_start(Service *s) {
         }
 
         if (!c) {
-                assert(s->type == SERVICE_ONESHOT);
+                if (s->type != SERVICE_ONESHOT) {
+                        /* There's no command line configured for the main command? Hmm, that is strange. This can only
+                         * happen if the configuration changes at runtime. In this case, let's enter a failure
+                         * state. */
+                        log_unit_error(UNIT(s), "There's no 'start' task anymore we could start: %m");
+                        r = -ENXIO;
+                        goto fail;
+                }
+
                 service_enter_start_post(s);
                 return;
         }
@@ -1779,11 +1874,7 @@ static void service_enter_start(Service *s) {
         r = service_spawn(s,
                           c,
                           timeout,
-                          true,
-                          true,
-                          true,
-                          true,
-                          false,
+                          EXEC_PASS_FDS|EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_APPLY_TTY_STDIN|EXEC_SET_WATCHDOG,
                           &pid);
         if (r < 0)
                 goto fail;
@@ -1821,7 +1912,7 @@ static void service_enter_start(Service *s) {
 
 fail:
         log_unit_warning_errno(UNIT(s), r, "Failed to run 'start' task: %m");
-        service_enter_signal(s, SERVICE_FINAL_SIGTERM, SERVICE_FAILURE_RESOURCES);
+        service_enter_signal(s, SERVICE_STOP_SIGTERM, SERVICE_FAILURE_RESOURCES);
 }
 
 static void service_enter_start_pre(Service *s) {
@@ -1842,11 +1933,7 @@ static void service_enter_start_pre(Service *s) {
                 r = service_spawn(s,
                                   s->control_command,
                                   s->timeout_start_usec,
-                                  false,
-                                  !s->permissions_start_only,
-                                  !s->root_directory_start_only,
-                                  true,
-                                  true,
+                                  EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_IS_CONTROL|EXEC_APPLY_TTY_STDIN,
                                   &s->control_pid);
                 if (r < 0)
                         goto fail;
@@ -1921,11 +2008,7 @@ static void service_enter_reload(Service *s) {
                 r = service_spawn(s,
                                   s->control_command,
                                   s->timeout_start_usec,
-                                  false,
-                                  !s->permissions_start_only,
-                                  !s->root_directory_start_only,
-                                  false,
-                                  true,
+                                  EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_IS_CONTROL,
                                   &s->control_pid);
                 if (r < 0)
                         goto fail;
@@ -1963,12 +2046,9 @@ static void service_run_next_control(Service *s) {
         r = service_spawn(s,
                           s->control_command,
                           timeout,
-                          false,
-                          !s->permissions_start_only,
-                          !s->root_directory_start_only,
-                          s->control_command_id == SERVICE_EXEC_START_PRE ||
-                          s->control_command_id == SERVICE_EXEC_STOP_POST,
-                          true,
+                          EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_IS_CONTROL|
+                          (IN_SET(s->control_command_id, SERVICE_EXEC_START_PRE, SERVICE_EXEC_STOP_POST) ? EXEC_APPLY_TTY_STDIN : 0)|
+                          (IN_SET(s->control_command_id, SERVICE_EXEC_STOP, SERVICE_EXEC_STOP_POST) ? EXEC_SETENV_RESULT : 0),
                           &s->control_pid);
         if (r < 0)
                 goto fail;
@@ -1978,9 +2058,7 @@ static void service_run_next_control(Service *s) {
 fail:
         log_unit_warning_errno(UNIT(s), r, "Failed to run next control task: %m");
 
-        if (s->state == SERVICE_START_PRE)
-                service_enter_signal(s, SERVICE_FINAL_SIGTERM, SERVICE_FAILURE_RESOURCES);
-        else if (s->state == SERVICE_STOP)
+        if (IN_SET(s->state, SERVICE_START_PRE, SERVICE_STOP))
                 service_enter_signal(s, SERVICE_STOP_SIGTERM, SERVICE_FAILURE_RESOURCES);
         else if (s->state == SERVICE_STOP_POST)
                 service_enter_dead(s, SERVICE_FAILURE_RESOURCES, true);
@@ -2006,11 +2084,7 @@ static void service_run_next_main(Service *s) {
         r = service_spawn(s,
                           s->main_command,
                           s->timeout_start_usec,
-                          true,
-                          true,
-                          true,
-                          true,
-                          false,
+                          EXEC_PASS_FDS|EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_APPLY_TTY_STDIN|EXEC_SET_WATCHDOG,
                           &pid);
         if (r < 0)
                 goto fail;
@@ -2060,6 +2134,10 @@ static int service_start(Unit *u) {
                 return r;
         }
 
+        r = unit_acquire_invocation_id(u);
+        if (r < 0)
+                return r;
+
         s->result = SERVICE_SUCCESS;
         s->reload_result = SERVICE_SUCCESS;
         s->main_pid_known = false;
@@ -2131,6 +2209,79 @@ _pure_ static bool service_can_reload(Unit *u) {
         return !!s->exec_command[SERVICE_EXEC_RELOAD];
 }
 
+static unsigned service_exec_command_index(Unit *u, ServiceExecCommand id, ExecCommand *current) {
+        Service *s = SERVICE(u);
+        unsigned idx = 0;
+        ExecCommand *first, *c;
+
+        assert(s);
+
+        first = s->exec_command[id];
+
+        /* Figure out where we are in the list by walking back to the beginning */
+        for (c = current; c != first; c = c->command_prev)
+                idx++;
+
+        return idx;
+}
+
+static int service_serialize_exec_command(Unit *u, FILE *f, ExecCommand *command) {
+        Service *s = SERVICE(u);
+        ServiceExecCommand id;
+        unsigned idx;
+        const char *type;
+        char **arg;
+        _cleanup_free_ char *args = NULL, *p = NULL;
+        size_t allocated = 0, length = 0;
+
+        assert(s);
+        assert(f);
+
+        if (!command)
+                return 0;
+
+        if (command == s->control_command) {
+                type = "control";
+                id = s->control_command_id;
+        } else {
+                type = "main";
+                id = SERVICE_EXEC_START;
+        }
+
+        idx = service_exec_command_index(u, id, command);
+
+        STRV_FOREACH(arg, command->argv) {
+                size_t n;
+                _cleanup_free_ char *e = NULL;
+
+                e = xescape(*arg, WHITESPACE);
+                if (!e)
+                        return -ENOMEM;
+
+                n = strlen(e);
+                if (!GREEDY_REALLOC(args, allocated, length + 1 + n + 1))
+                        return -ENOMEM;
+
+                if (length > 0)
+                        args[length++] = ' ';
+
+                memcpy(args + length, e, n);
+                length += n;
+        }
+
+        if (!GREEDY_REALLOC(args, allocated, length + 1))
+                return -ENOMEM;
+        args[length++] = 0;
+
+        p = xescape(command->path, WHITESPACE);
+        if (!p)
+                return -ENOMEM;
+
+        fprintf(f, "%s-command=%s %u %s %s\n", type, service_exec_command_to_string(id), idx, p, args);
+
+        return 0;
+}
+
 static int service_serialize(Unit *u, FILE *f, FDSet *fds) {
         Service *s = SERVICE(u);
         ServiceFDStore *fs;
@@ -2158,11 +2309,8 @@ static int service_serialize(Unit *u, FILE *f, FDSet *fds) {
         if (r < 0)
                 return r;
 
-        /* FIXME: There's a minor uncleanliness here: if there are
-         * multiple commands attached here, we will start from the
-         * first one again */
-        if (s->control_command_id >= 0)
-                unit_serialize_item(u, f, "control-command", service_exec_command_to_string(s->control_command_id));
+        service_serialize_exec_command(u, f, s->control_command);
+        service_serialize_exec_command(u, f, s->main_command);
 
         r = unit_serialize_item_fd(u, f, fds, "stdin-fd", s->stdin_fd);
         if (r < 0)
@@ -2174,6 +2322,12 @@ static int service_serialize(Unit *u, FILE *f, FDSet *fds) {
         if (r < 0)
                 return r;
 
+        if (UNIT_ISSET(s->accept_socket)) {
+                r = unit_serialize_item(u, f, "accept-socket", UNIT_DEREF(s->accept_socket)->id);
+                if (r < 0)
+                        return r;
+        }
+
         r = unit_serialize_item_fd(u, f, fds, "socket-fd", s->socket_fd);
         if (r < 0)
                 return r;
@@ -2212,6 +2366,106 @@ static int service_serialize(Unit *u, FILE *f, FDSet *fds) {
         return 0;
 }
 
+static int service_deserialize_exec_command(Unit *u, const char *key, const char *value) {
+        Service *s = SERVICE(u);
+        int r;
+        unsigned idx = 0, i;
+        bool control, found = false;
+        ServiceExecCommand id = _SERVICE_EXEC_COMMAND_INVALID;
+        ExecCommand *command = NULL;
+        _cleanup_free_ char *path = NULL;
+        _cleanup_strv_free_ char **argv = NULL;
+
+        enum ExecCommandState {
+                STATE_EXEC_COMMAND_TYPE,
+                STATE_EXEC_COMMAND_INDEX,
+                STATE_EXEC_COMMAND_PATH,
+                STATE_EXEC_COMMAND_ARGS,
+                _STATE_EXEC_COMMAND_MAX,
+                _STATE_EXEC_COMMAND_INVALID = -1,
+        } state;
+
+        assert(s);
+        assert(key);
+        assert(value);
+
+        control = streq(key, "control-command");
+
+        state = STATE_EXEC_COMMAND_TYPE;
+
+        for (;;) {
+                _cleanup_free_ char *arg = NULL;
+
+                r = extract_first_word(&value, &arg, NULL, EXTRACT_CUNESCAPE);
+                if (r == 0)
+                        break;
+                else if (r < 0)
+                        return r;
+
+                switch (state) {
+                case STATE_EXEC_COMMAND_TYPE:
+                        id = service_exec_command_from_string(arg);
+                        if (id < 0)
+                                return -EINVAL;
+
+                        state = STATE_EXEC_COMMAND_INDEX;
+                        break;
+                case STATE_EXEC_COMMAND_INDEX:
+                        r = safe_atou(arg, &idx);
+                        if (r < 0)
+                                return -EINVAL;
+
+                        state = STATE_EXEC_COMMAND_PATH;
+                        break;
+                case STATE_EXEC_COMMAND_PATH:
+                        path = arg;
+                        arg = NULL;
+                        state = STATE_EXEC_COMMAND_ARGS;
+
+                        if (!path_is_absolute(path))
+                                return -EINVAL;
+                        break;
+                case STATE_EXEC_COMMAND_ARGS:
+                        r = strv_extend(&argv, arg);
+                        if (r < 0)
+                                return -ENOMEM;
+                        break;
+                default:
+                        assert_not_reached("Unknown error at deserialization of exec command");
+                        break;
+                }
+        }
+
+        if (state != STATE_EXEC_COMMAND_ARGS)
+                return -EINVAL;
+
+        /* Let's check whether exec command on given offset matches data that we just deserialized */
+        for (command = s->exec_command[id], i = 0; command; command = command->command_next, i++) {
+                if (i != idx)
+                        continue;
+
+                found = strv_equal(argv, command->argv) && streq(command->path, path);
+                break;
+        }
+
+        if (!found) {
+                /* Command at the index we serialized is different, let's look for command that exactly
+                 * matches but is on different index. If there is no such command we will not resume execution. */
+                for (command = s->exec_command[id]; command; command = command->command_next)
+                        if (strv_equal(command->argv, argv) && streq(command->path, path))
+                                break;
+        }
+
+        if (command && control)
+                s->control_command = command;
+        else if (command)
+                s->main_command = command;
+        else
+                log_unit_warning(u, "Current command vanished from the unit file, execution of the command list won't be resumed.");
+
+        return 0;
+}
+
 static int service_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
         Service *s = SERVICE(u);
         int r;
@@ -2294,16 +2548,17 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value,
                         s->status_text = t;
                 }
 
-        } else if (streq(key, "control-command")) {
-                ServiceExecCommand id;
+        } else if (streq(key, "accept-socket")) {
+                Unit *socket;
 
-                id = service_exec_command_from_string(value);
-                if (id < 0)
-                        log_unit_debug(u, "Failed to parse exec-command value: %s", value);
+                r = manager_load_unit(u->manager, value, NULL, NULL, &socket);
+                if (r < 0)
+                        log_unit_debug_errno(u, r, "Failed to load accept-socket unit: %s", value);
                 else {
-                        s->control_command_id = id;
-                        s->control_command = s->exec_command[id];
+                        unit_ref_set(&s->accept_socket, socket);
+                        SOCKET(socket)->n_connections++;
                 }
+
         } else if (streq(key, "socket-fd")) {
                 int fd;
 
@@ -2334,7 +2589,7 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value,
                         r = service_add_fd_store(s, fd, t);
                         if (r < 0)
                                 log_unit_error_errno(u, r, "Failed to add fd to store: %m");
-                        else if (r > 0)
+                        else
                                 fdset_remove(fds, fd);
                 }
 
@@ -2411,6 +2666,10 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value,
                         s->watchdog_override_enable = true;
                         s->watchdog_override_usec = watchdog_override_usec;
                 }
+        } else if (STR_IN_SET(key, "main-command", "control-command")) {
+                r = service_deserialize_exec_command(u, key, value);
+                if (r < 0)
+                        log_unit_debug_errno(u, r, "Failed to parse serialized command \"%s\": %m", value);
         } else
                 log_unit_debug(u, "Unknown serialization key: %s", key);
 
@@ -2562,17 +2821,24 @@ static void service_notify_cgroup_empty_event(Unit *u) {
                  * SIGCHLD for. */
 
         case SERVICE_START:
+                if (s->type == SERVICE_NOTIFY) {
+                        /* No chance of getting a ready notification anymore */
+                        service_enter_stop_post(s, SERVICE_FAILURE_PROTOCOL);
+                        break;
+                }
+
+                /* Fall through */
+
         case SERVICE_START_POST:
-                /* If we were hoping for the daemon to write its PID file,
-                 * we can give up now. */
                 if (s->pid_file_pathspec) {
+                        /* Give up hoping for the daemon to write its PID file */
                         log_unit_warning(u, "Daemon never wrote its PID file. Failing.");
 
                         service_unwatch_pid_file(s);
                         if (s->state == SERVICE_START)
-                                service_enter_signal(s, SERVICE_FINAL_SIGTERM, SERVICE_FAILURE_RESOURCES);
+                                service_enter_stop_post(s, SERVICE_FAILURE_PROTOCOL);
                         else
-                                service_enter_stop(s, SERVICE_FAILURE_RESOURCES);
+                                service_enter_stop(s, SERVICE_FAILURE_PROTOCOL);
                 }
                 break;
 
@@ -2610,8 +2876,7 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
         assert(s);
         assert(pid >= 0);
 
-        if (UNIT(s)->fragment_path ? is_clean_exit(code, status, &s->success_status) :
-                                     is_clean_exit_lsb(code, status, &s->success_status))
+        if (is_clean_exit(code, status, s->type == SERVICE_ONESHOT ? EXIT_CLEAN_COMMAND : EXIT_CLEAN_DAEMON, &s->success_status))
                 f = SERVICE_SUCCESS;
         else if (code == CLD_EXITED)
                 f = SERVICE_FAILURE_EXIT_CODE;
@@ -2653,8 +2918,14 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                                 f = SERVICE_SUCCESS;
                 }
 
-                log_struct(f == SERVICE_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
-                           LOG_UNIT_ID(u),
+                /* When this is a successful exit, let's log about the exit code on DEBUG level. If this is a failure
+                 * and the process exited on its own via exit(), then let's make this a NOTICE, under the assumption
+                 * that the service already logged the reason at a higher log level on its own. However, if the service
+                 * died due to a signal, then it most likely didn't say anything about any reason, hence let's raise
+                 * our log level to WARNING then. */
+
+                log_struct(f == SERVICE_SUCCESS ? LOG_DEBUG :
+                           (code == CLD_EXITED ? LOG_NOTICE : LOG_WARNING),
                            LOG_UNIT_MESSAGE(u, "Main process exited, code=%s, status=%i/%s",
                                             sigchld_code_to_string(code), status,
                                             strna(code == CLD_EXITED
@@ -2662,9 +2933,10 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                                                   : signal_to_string(status))),
                            "EXIT_CODE=%s", sigchld_code_to_string(code),
                            "EXIT_STATUS=%i", status,
+                           LOG_UNIT_ID(u),
                            NULL);
 
-                if (f != SERVICE_SUCCESS)
+                if (s->result == SERVICE_SUCCESS)
                         s->result = f;
 
                 if (s->main_command &&
@@ -2698,7 +2970,17 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                                         if (f == SERVICE_SUCCESS)
                                                 service_enter_start_post(s);
                                         else
-                                                service_enter_signal(s, SERVICE_FINAL_SIGTERM, f);
+                                                service_enter_signal(s, SERVICE_STOP_SIGTERM, f);
+                                        break;
+                                } else if (s->type == SERVICE_NOTIFY) {
+                                        /* Only enter running through a notification, so that the
+                                         * SERVICE_START state signifies that no ready notification
+                                         * has been received */
+                                        if (f != SERVICE_SUCCESS)
+                                                service_enter_signal(s, SERVICE_STOP_SIGTERM, f);
+                                        else if (!s->remain_after_exit)
+                                                /* The service has never been active */
+                                                service_enter_signal(s, SERVICE_STOP_SIGTERM, SERVICE_FAILURE_PROTOCOL);
                                         break;
                                 }
 
@@ -2745,7 +3027,7 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                               "Control process exited, code=%s status=%i",
                               sigchld_code_to_string(code), status);
 
-                if (f != SERVICE_SUCCESS)
+                if (s->result == SERVICE_SUCCESS)
                         s->result = f;
 
                 /* Immediately get rid of the cgroup, so that the
@@ -2778,7 +3060,7 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                                 if (f == SERVICE_SUCCESS)
                                         service_enter_start(s);
                                 else
-                                        service_enter_signal(s, SERVICE_FINAL_SIGTERM, f);
+                                        service_enter_signal(s, SERVICE_STOP_SIGTERM, f);
                                 break;
 
                         case SERVICE_START:
@@ -2787,7 +3069,7 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                                         break;
 
                                 if (f != SERVICE_SUCCESS) {
-                                        service_enter_signal(s, SERVICE_FINAL_SIGTERM, f);
+                                        service_enter_signal(s, SERVICE_STOP_SIGTERM, f);
                                         break;
                                 }
 
@@ -2804,7 +3086,7 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                                         if (!has_start_post && r < 0) {
                                                 r = service_demand_pid_file(s);
                                                 if (r < 0 || !cgroup_good(s))
-                                                        service_enter_signal(s, SERVICE_FINAL_SIGTERM, SERVICE_FAILURE_RESOURCES);
+                                                        service_enter_signal(s, SERVICE_STOP_SIGTERM, SERVICE_FAILURE_PROTOCOL);
                                                 break;
                                         }
                                 } else
@@ -2826,7 +3108,7 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                                         if (r < 0) {
                                                 r = service_demand_pid_file(s);
                                                 if (r < 0 || !cgroup_good(s))
-                                                        service_enter_stop(s, SERVICE_FAILURE_RESOURCES);
+                                                        service_enter_stop(s, SERVICE_FAILURE_PROTOCOL);
                                                 break;
                                         }
                                 } else
@@ -2885,7 +3167,7 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
 
         /* If the PID set is empty now, then let's finish this off
            (On unified we use proper notifications) */
-        if (cg_unified() <= 0 && set_isempty(u->pids))
+        if (cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER) == 0 && set_isempty(u->pids))
                 service_notify_cgroup_empty_event(u);
 }
 
@@ -2900,7 +3182,7 @@ static int service_dispatch_timer(sd_event_source *source, usec_t usec, void *us
         case SERVICE_START_PRE:
         case SERVICE_START:
                 log_unit_warning(UNIT(s), "%s operation timed out. Terminating.", s->state == SERVICE_START ? "Start" : "Start-pre");
-                service_enter_signal(s, SERVICE_FINAL_SIGTERM, SERVICE_FAILURE_TIMEOUT);
+                service_enter_signal(s, SERVICE_STOP_SIGTERM, SERVICE_FAILURE_TIMEOUT);
                 break;
 
         case SERVICE_START_POST:
@@ -3132,9 +3414,7 @@ static void service_notify_message(
 
                 if (!streq_ptr(s->status_text, t)) {
 
-                        free(s->status_text);
-                        s->status_text = t;
-                        t = NULL;
+                        free_and_replace(s->status_text, t);
 
                         notify_dbus = true;
                 }
@@ -3259,7 +3539,7 @@ static void service_bus_name_owner_change(
                 if (r >= 0)
                         r = sd_bus_creds_get_pid(creds, &pid);
                 if (r >= 0) {
-                        log_unit_debug(u, "D-Bus name %s is now owned by process %u", name, (unsigned) pid);
+                        log_unit_debug(u, "D-Bus name %s is now owned by process " PID_FMT, name, pid);
 
                         service_set_main_pid(s, pid);
                         unit_watch_pid(UNIT(s), pid);
@@ -3291,7 +3571,7 @@ int service_set_socket_fd(Service *s, int fd, Socket *sock, bool selinux_context
                 if (UNIT(s)->description) {
                         _cleanup_free_ char *a;
 
-                        a = strjoin(UNIT(s)->description, " (", peer, ")", NULL);
+                        a = strjoin(UNIT(s)->description, " (", peer, ")");
                         if (!a)
                                 return -ENOMEM;
 
@@ -3382,14 +3662,6 @@ static const char* const service_exec_command_table[_SERVICE_EXEC_COMMAND_MAX] =
 
 DEFINE_STRING_TABLE_LOOKUP(service_exec_command, ServiceExecCommand);
 
-static const char* const notify_access_table[_NOTIFY_ACCESS_MAX] = {
-        [NOTIFY_NONE] = "none",
-        [NOTIFY_MAIN] = "main",
-        [NOTIFY_ALL] = "all"
-};
-
-DEFINE_STRING_TABLE_LOOKUP(notify_access, NotifyAccess);
-
 static const char* const notify_state_table[_NOTIFY_STATE_MAX] = {
         [NOTIFY_UNKNOWN] = "unknown",
         [NOTIFY_READY] = "ready",
@@ -3402,6 +3674,7 @@ DEFINE_STRING_TABLE_LOOKUP(notify_state, NotifyState);
 static const char* const service_result_table[_SERVICE_RESULT_MAX] = {
         [SERVICE_SUCCESS] = "success",
         [SERVICE_FAILURE_RESOURCES] = "resources",
+        [SERVICE_FAILURE_PROTOCOL] = "protocol",
         [SERVICE_FAILURE_TIMEOUT] = "timeout",
         [SERVICE_FAILURE_EXIT_CODE] = "exit-code",
         [SERVICE_FAILURE_SIGNAL] = "signal",
@@ -3418,6 +3691,7 @@ const UnitVTable service_vtable = {
         .cgroup_context_offset = offsetof(Service, cgroup_context),
         .kill_context_offset = offsetof(Service, kill_context),
         .exec_runtime_offset = offsetof(Service, exec_runtime),
+        .dynamic_creds_offset = offsetof(Service, dynamic_creds),
 
         .sections =
                 "Unit\0"
index cfef375..f4ba604 100644 (file)
@@ -61,14 +61,6 @@ typedef enum ServiceExecCommand {
         _SERVICE_EXEC_COMMAND_INVALID = -1
 } ServiceExecCommand;
 
-typedef enum NotifyAccess {
-        NOTIFY_NONE,
-        NOTIFY_ALL,
-        NOTIFY_MAIN,
-        _NOTIFY_ACCESS_MAX,
-        _NOTIFY_ACCESS_INVALID = -1
-} NotifyAccess;
-
 typedef enum NotifyState {
         NOTIFY_UNKNOWN,
         NOTIFY_READY,
@@ -78,9 +70,12 @@ typedef enum NotifyState {
         _NOTIFY_STATE_INVALID = -1
 } NotifyState;
 
+/* The values of this enum are referenced in man/systemd.exec.xml and src/shared/bus-unit-util.c.
+ * Update those sources for each change to this enum. */
 typedef enum ServiceResult {
         SERVICE_SUCCESS,
         SERVICE_FAILURE_RESOURCES, /* a bit of a misnomer, just our catch-all error for errnos we didn't expect */
+        SERVICE_FAILURE_PROTOCOL,
         SERVICE_FAILURE_TIMEOUT,
         SERVICE_FAILURE_EXIT_CODE,
         SERVICE_FAILURE_SIGNAL,
@@ -148,9 +143,11 @@ struct Service {
 
         /* Runtime data of the execution context */
         ExecRuntime *exec_runtime;
+        DynamicCreds dynamic_creds;
 
         pid_t main_pid, control_pid;
         int socket_fd;
+        SocketPeer *peer;
         bool socket_fd_selinux_context_net;
 
         bool permissions_start_only;
@@ -176,7 +173,7 @@ struct Service {
         char *status_text;
         int status_errno;
 
-        FailureAction failure_action;
+        EmergencyAction emergency_action;
 
         UnitRef accept_socket;
 
@@ -212,9 +209,6 @@ ServiceType service_type_from_string(const char *s) _pure_;
 const char* service_exec_command_to_string(ServiceExecCommand i) _const_;
 ServiceExecCommand service_exec_command_from_string(const char *s) _pure_;
 
-const char* notify_access_to_string(NotifyAccess i) _const_;
-NotifyAccess notify_access_from_string(const char *s) _pure_;
-
 const char* notify_state_to_string(NotifyState i) _const_;
 NotifyState notify_state_from_string(const char *s) _pure_;
 
index 59ebdc7..65f9cb8 100644 (file)
@@ -61,6 +61,11 @@ int status_vprintf(const char *status, bool ellipse, bool ephemeral, const char
         if (vasprintf(&s, format, ap) < 0)
                 return log_oom();
 
+        /* Before you ask: yes, on purpose we open/close the console for each status line we write individually. This
+         * is a good strategy to avoid PID 1 getting killed by the kernel's SAK concept (it doesn't fix this entirely,
+         * but minimizes the time window the kernel might end up killing PID 1 due to SAK). It also makes things easier
+         * for us so that we don't have to recover from hangups and suchlike triggered on the console. */
+
         fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
         if (fd < 0)
                 return fd;
index a795d87..a7d5e57 100644 (file)
@@ -32,6 +32,7 @@
 #include "alloc-util.h"
 #include "cgroup-util.h"
 #include "def.h"
+#include "exec-util.h"
 #include "fileio.h"
 #include "killall.h"
 #include "log.h"
@@ -321,7 +322,7 @@ int main(int argc, char *argv[]) {
         arguments[0] = NULL;
         arguments[1] = arg_verb;
         arguments[2] = NULL;
-        execute_directories(dirs, DEFAULT_TIMEOUT_USEC, arguments);
+        execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL, NULL, arguments);
 
         if (!in_container && !in_initrd() &&
             access("/run/initramfs/shutdown", X_OK) == 0) {
@@ -402,7 +403,7 @@ int main(int argc, char *argv[]) {
                         _cleanup_free_ char *param = NULL;
 
                         r = read_one_line_file("/run/systemd/reboot-param", &param);
-                        if (r < 0)
+                        if (r < 0 && r != -ENOENT)
                                 log_warning_errno(r, "Failed to read reboot parameter file: %m");
 
                         if (!isempty(param)) {
index c7700b8..ed5d3fd 100644 (file)
@@ -130,6 +130,28 @@ static int slice_verify(Slice *s) {
         return 0;
 }
 
+static int slice_load_root_slice(Unit *u) {
+        assert(u);
+
+        if (!unit_has_name(u, SPECIAL_ROOT_SLICE))
+                return 0;
+
+        u->perpetual = true;
+
+        /* The root slice is a bit special. For example it is always running and cannot be terminated. Because of its
+         * special semantics we synthesize it here, instead of relying on the unit file on disk. */
+
+        u->default_dependencies = false;
+        u->ignore_on_isolate = true;
+
+        if (!u->description)
+                u->description = strdup("Root Slice");
+        if (!u->documentation)
+                u->documentation = strv_new("man:systemd.special(7)", NULL);
+
+        return 1;
+}
+
 static int slice_load(Unit *u) {
         Slice *s = SLICE(u);
         int r;
@@ -137,6 +159,9 @@ static int slice_load(Unit *u) {
         assert(s);
         assert(u->load_state == UNIT_STUB);
 
+        r = slice_load_root_slice(u);
+        if (r < 0)
+                return r;
         r = unit_load_fragment_and_dropin_optional(u);
         if (r < 0)
                 return r;
@@ -187,10 +212,15 @@ static void slice_dump(Unit *u, FILE *f, const char *prefix) {
 
 static int slice_start(Unit *u) {
         Slice *t = SLICE(u);
+        int r;
 
         assert(t);
         assert(t->state == SLICE_DEAD);
 
+        r = unit_acquire_invocation_id(u);
+        if (r < 0)
+                return r;
+
         (void) unit_realize_cgroup(u);
         (void) unit_reset_cpu_usage(u);
 
@@ -269,32 +299,16 @@ static void slice_enumerate(Manager *m) {
 
         u = manager_get_unit(m, SPECIAL_ROOT_SLICE);
         if (!u) {
-                u = unit_new(m, sizeof(Slice));
-                if (!u)  {
-                        log_oom();
-                        return;
-                }
-
-                r = unit_add_name(u, SPECIAL_ROOT_SLICE);
+                r = unit_new_for_name(m, sizeof(Slice), SPECIAL_ROOT_SLICE, &u);
                 if (r < 0) {
-                        unit_free(u);
-                        log_error_errno(r, "Failed to add -.slice name");
+                        log_error_errno(r, "Failed to allocate the special " SPECIAL_ROOT_SLICE " unit: %m");
                         return;
                 }
         }
 
-        u->default_dependencies = false;
-        u->no_gc = true;
-        u->ignore_on_isolate = true;
-        u->refuse_manual_start = true;
-        u->refuse_manual_stop = true;
+        u->perpetual = true;
         SLICE(u)->deserialized_state = SLICE_ACTIVE;
 
-        if (!u->description)
-                u->description = strdup("Root Slice");
-        if (!u->documentation)
-                (void) strv_extend(&u->documentation, "man:systemd.special(7)");
-
         unit_add_to_load_queue(u);
         unit_add_to_dbus_queue(u);
 }
index 5a6d11c..adf2293 100644 (file)
@@ -264,6 +264,54 @@ static int write_netlabel_rules(const char* srcdir) {
         return r;
 }
 
+static int write_onlycap_list(void) {
+        _cleanup_close_ int onlycap_fd = -1;
+        _cleanup_free_ char *list = NULL;
+        _cleanup_fclose_ FILE *f = NULL;
+        size_t len = 0, allocated = 0;
+        char buf[LINE_MAX];
+        int r;
+
+        f = fopen("/etc/smack/onlycap", "re");
+        if (!f) {
+                if (errno != ENOENT)
+                        log_warning_errno(errno, "Failed to read '/etc/smack/onlycap'");
+                return errno == ENOENT ? ENOENT : -errno;
+        }
+
+        FOREACH_LINE(buf, f, return -errno) {
+                size_t l;
+
+                if (isempty(truncate_nl(buf)) || strchr(COMMENTS, *buf))
+                        continue;
+
+                l = strlen(buf);
+                if (!GREEDY_REALLOC(list, allocated, len + l + 1))
+                        return log_oom();
+
+                stpcpy(list + len, buf)[0] = ' ';
+                len += l + 1;
+        }
+
+        if (!len)
+                return 0;
+
+        list[len - 1] = 0;
+
+        onlycap_fd = open("/sys/fs/smackfs/onlycap", O_WRONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
+        if (onlycap_fd < 0) {
+                if (errno != ENOENT)
+                        log_warning_errno(errno, "Failed to open '/sys/fs/smackfs/onlycap'");
+                return -errno; /* negative error */
+        }
+
+        r = write(onlycap_fd, list, len);
+        if (r < 0)
+                return log_error_errno(errno, "Failed to write onlycap list(%s) to '/sys/fs/smackfs/onlycap'", list);
+
+        return 0;
+}
+
 #endif
 
 int mac_smack_setup(bool *loaded_policy) {
@@ -338,6 +386,22 @@ int mac_smack_setup(bool *loaded_policy) {
                 break;
         }
 
+        r = write_onlycap_list();
+        switch(r) {
+        case -ENOENT:
+                log_debug("Smack is not enabled in the kernel.");
+                break;
+        case ENOENT:
+                log_debug("Smack onlycap list file '/etc/smack/onlycap' not found");
+                break;
+        case 0:
+                log_info("Successfully wrote Smack onlycap list.");
+                break;
+        default:
+                log_emergency_errno(r, "Failed to write Smack onlycap list.");
+                return r;
+        }
+
         *loaded_policy = true;
 
 #endif
index 09b52e7..7843f7e 100644 (file)
@@ -36,7 +36,7 @@
 #include "def.h"
 #include "exit-status.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "io-util.h"
 #include "label.h"
 #include "log.h"
 #include "string-util.h"
 #include "strv.h"
 #include "unit-name.h"
-#include "unit-printf.h"
 #include "unit.h"
 #include "user-util.h"
+#include "in-addr-util.h"
+
+struct SocketPeer {
+        unsigned n_ref;
+
+        Socket *socket;
+        union sockaddr_union peer;
+        socklen_t peer_salen;
+};
 
 static const UnitActiveState state_translation_table[_SOCKET_STATE_MAX] = {
         [SOCKET_DEAD] = UNIT_INACTIVE,
@@ -141,15 +149,23 @@ void socket_free_ports(Socket *s) {
 
 static void socket_done(Unit *u) {
         Socket *s = SOCKET(u);
+        SocketPeer *p;
 
         assert(s);
 
         socket_free_ports(s);
 
+        while ((p = set_steal_first(s->peers_by_address)))
+                p->socket = NULL;
+
+        s->peers_by_address = set_free(s->peers_by_address);
+
         s->exec_runtime = exec_runtime_unref(s->exec_runtime);
         exec_command_free_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX);
         s->control_command = NULL;
 
+        dynamic_creds_unref(&s->dynamic_creds);
+
         socket_unwatch_control_pid(s);
 
         unit_ref_unset(&s->service);
@@ -408,8 +424,7 @@ static const char *socket_find_symlink_target(Socket *s) {
                         break;
 
                 case SOCKET_SOCKET:
-                        if (p->address.sockaddr.un.sun_path[0] != 0)
-                                f = p->address.sockaddr.un.sun_path;
+                        f = socket_address_get_path(&p->address);
                         break;
 
                 default:
@@ -434,7 +449,7 @@ static int socket_verify(Socket *s) {
                 return 0;
 
         if (!s->ports) {
-                log_unit_error(UNIT(s), "Unit lacks Listen setting. Refusing.");
+                log_unit_error(UNIT(s), "Unit has no Listen setting (ListenStream=, ListenDatagram=, ListenFIFO=, ...). Refusing.");
                 return -EINVAL;
         }
 
@@ -466,6 +481,49 @@ static int socket_verify(Socket *s) {
         return 0;
 }
 
+static void peer_address_hash_func(const void *p, struct siphash *state) {
+        const SocketPeer *s = p;
+
+        assert(s);
+
+        if (s->peer.sa.sa_family == AF_INET)
+                siphash24_compress(&s->peer.in.sin_addr, sizeof(s->peer.in.sin_addr), state);
+        else if (s->peer.sa.sa_family == AF_INET6)
+                siphash24_compress(&s->peer.in6.sin6_addr, sizeof(s->peer.in6.sin6_addr), state);
+        else if (s->peer.sa.sa_family == AF_VSOCK)
+                siphash24_compress(&s->peer.vm.svm_cid, sizeof(s->peer.vm.svm_cid), state);
+        else
+                assert_not_reached("Unknown address family.");
+}
+
+static int peer_address_compare_func(const void *a, const void *b) {
+        const SocketPeer *x = a, *y = b;
+
+        if (x->peer.sa.sa_family < y->peer.sa.sa_family)
+                return -1;
+        if (x->peer.sa.sa_family > y->peer.sa.sa_family)
+                return 1;
+
+        switch(x->peer.sa.sa_family) {
+        case AF_INET:
+                return memcmp(&x->peer.in.sin_addr, &y->peer.in.sin_addr, sizeof(x->peer.in.sin_addr));
+        case AF_INET6:
+                return memcmp(&x->peer.in6.sin6_addr, &y->peer.in6.sin6_addr, sizeof(x->peer.in6.sin6_addr));
+        case AF_VSOCK:
+                if (x->peer.vm.svm_cid < y->peer.vm.svm_cid)
+                        return -1;
+                if (x->peer.vm.svm_cid > y->peer.vm.svm_cid)
+                        return 1;
+                return 0;
+        }
+        assert_not_reached("Black sheep in the family!");
+}
+
+const struct hash_ops peer_address_hash_ops = {
+        .hash = peer_address_hash_func,
+        .compare = peer_address_compare_func
+};
+
 static int socket_load(Unit *u) {
         Socket *s = SOCKET(u);
         int r;
@@ -473,6 +531,10 @@ static int socket_load(Unit *u) {
         assert(u);
         assert(u->load_state == UNIT_STUB);
 
+        r = set_ensure_allocated(&s->peers_by_address, &peer_address_hash_ops);
+        if (r < 0)
+                return r;
+
         r = unit_load_fragment_and_dropin(u);
         if (r < 0)
                 return r;
@@ -487,6 +549,88 @@ static int socket_load(Unit *u) {
         return socket_verify(s);
 }
 
+static SocketPeer *socket_peer_new(void) {
+        SocketPeer *p;
+
+        p = new0(SocketPeer, 1);
+        if (!p)
+                return NULL;
+
+        p->n_ref = 1;
+
+        return p;
+}
+
+SocketPeer *socket_peer_ref(SocketPeer *p) {
+        if (!p)
+                return NULL;
+
+        assert(p->n_ref > 0);
+        p->n_ref++;
+
+        return p;
+}
+
+SocketPeer *socket_peer_unref(SocketPeer *p) {
+        if (!p)
+                return NULL;
+
+        assert(p->n_ref > 0);
+
+        p->n_ref--;
+
+        if (p->n_ref > 0)
+                return NULL;
+
+        if (p->socket)
+                set_remove(p->socket->peers_by_address, p);
+
+        return mfree(p);
+}
+
+int socket_acquire_peer(Socket *s, int fd, SocketPeer **p) {
+        _cleanup_(socket_peer_unrefp) SocketPeer *remote = NULL;
+        SocketPeer sa = {}, *i;
+        socklen_t salen = sizeof(sa.peer);
+        int r;
+
+        assert(fd >= 0);
+        assert(s);
+
+        r = getpeername(fd, &sa.peer.sa, &salen);
+        if (r < 0)
+                return log_error_errno(errno, "getpeername failed: %m");
+
+        if (!IN_SET(sa.peer.sa.sa_family, AF_INET, AF_INET6, AF_VSOCK)) {
+                *p = NULL;
+                return 0;
+        }
+
+        i = set_get(s->peers_by_address, &sa);
+        if (i) {
+                *p = socket_peer_ref(i);
+                return 1;
+        }
+
+        remote = socket_peer_new();
+        if (!remote)
+                return log_oom();
+
+        remote->peer = sa.peer;
+        remote->peer_salen = salen;
+
+        r = set_put(s->peers_by_address, remote);
+        if (r < 0)
+                return r;
+
+        remote->socket = s;
+
+        *p = remote;
+        remote = NULL;
+
+        return 1;
+}
+
 _const_ static const char* listen_lookup(int family, int type) {
 
         if (family == AF_NETLINK)
@@ -804,6 +948,16 @@ static int instance_from_socket(int fd, unsigned nr, char **instance) {
                 break;
         }
 
+        case AF_VSOCK:
+                if (asprintf(&r,
+                             "%u-%u:%u-%u:%u",
+                             nr,
+                             local.vm.svm_cid, local.vm.svm_port,
+                             remote.vm.svm_cid, remote.vm.svm_port) < 0)
+                        return -ENOMEM;
+
+                break;
+
         default:
                 assert_not_reached("Unhandled socket type.");
         }
@@ -1106,7 +1260,7 @@ static int usbffs_address_create(const char *path) {
         if (fstat(fd, &st) < 0)
                 return -errno;
 
-        /* Check whether this is a regular file (ffs endpoint)*/
+        /* Check whether this is a regular file (ffs endpoint) */
         if (!S_ISREG(st.st_mode))
                 return -EEXIST;
 
@@ -1186,11 +1340,11 @@ static int usbffs_write_descs(int fd, Service *s) {
         if (!s->usb_function_descriptors || !s->usb_function_strings)
                 return -EINVAL;
 
-        r = copy_file_fd(s->usb_function_descriptors, fd, false);
+        r = copy_file_fd(s->usb_function_descriptors, fd, 0);
         if (r < 0)
                 return r;
 
-        return copy_file_fd(s->usb_function_strings, fd, false);
+        return copy_file_fd(s->usb_function_strings, fd, 0);
 }
 
 static int usbffs_select_ep(const struct dirent *d) {
@@ -1597,21 +1751,21 @@ static int socket_coldplug(Unit *u) {
                         return r;
         }
 
+        if (!IN_SET(s->deserialized_state, SOCKET_DEAD, SOCKET_FAILED))
+                (void) unit_setup_dynamic_creds(u);
+
         socket_set_state(s, s->deserialized_state);
         return 0;
 }
 
 static int socket_spawn(Socket *s, ExecCommand *c, pid_t *_pid) {
-        _cleanup_free_ char **argv = NULL;
         pid_t pid;
         int r;
         ExecParameters exec_params = {
-                .apply_permissions = true,
-                .apply_chroot      = true,
-                .apply_tty_stdin   = true,
-                .stdin_fd          = -1,
-                .stdout_fd         = -1,
-                .stderr_fd         = -1,
+                .flags      = EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_APPLY_TTY_STDIN,
+                .stdin_fd   = -1,
+                .stdout_fd  = -1,
+                .stderr_fd  = -1,
         };
 
         assert(s);
@@ -1628,17 +1782,17 @@ static int socket_spawn(Socket *s, ExecCommand *c, pid_t *_pid) {
         if (r < 0)
                 return r;
 
-        r = socket_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), s->timeout_usec));
+        r = unit_setup_dynamic_creds(UNIT(s));
         if (r < 0)
                 return r;
 
-        r = unit_full_printf_strv(UNIT(s), c->argv, &argv);
+        r = socket_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), s->timeout_usec));
         if (r < 0)
                 return r;
 
-        exec_params.argv = argv;
+        exec_params.argv = c->argv;
         exec_params.environment = UNIT(s)->manager->environment;
-        exec_params.confirm_spawn = UNIT(s)->manager->confirm_spawn;
+        exec_params.confirm_spawn = manager_get_confirm_spawn(UNIT(s)->manager);
         exec_params.cgroup_supported = UNIT(s)->manager->cgroup_supported;
         exec_params.cgroup_path = UNIT(s)->cgroup_path;
         exec_params.cgroup_delegate = s->cgroup_context.delegate;
@@ -1649,6 +1803,7 @@ static int socket_spawn(Socket *s, ExecCommand *c, pid_t *_pid) {
                        &s->exec_context,
                        &exec_params,
                        s->exec_runtime,
+                       &s->dynamic_creds,
                        &pid);
         if (r < 0)
                 return r;
@@ -1749,15 +1904,19 @@ fail:
 static void socket_enter_dead(Socket *s, SocketResult f) {
         assert(s);
 
-        if (f != SOCKET_SUCCESS)
+        if (s->result == SOCKET_SUCCESS)
                 s->result = f;
 
+        socket_set_state(s, s->result != SOCKET_SUCCESS ? SOCKET_FAILED : SOCKET_DEAD);
+
         exec_runtime_destroy(s->exec_runtime);
         s->exec_runtime = exec_runtime_unref(s->exec_runtime);
 
         exec_context_destroy_runtime_directory(&s->exec_context, manager_get_runtime_prefix(UNIT(s)->manager));
 
-        socket_set_state(s, s->result != SOCKET_SUCCESS ? SOCKET_FAILED : SOCKET_DEAD);
+        unit_unref_uid_gid(UNIT(s), true);
+
+        dynamic_creds_destroy(&s->dynamic_creds);
 }
 
 static void socket_enter_signal(Socket *s, SocketState state, SocketResult f);
@@ -1766,7 +1925,7 @@ static void socket_enter_stop_post(Socket *s, SocketResult f) {
         int r;
         assert(s);
 
-        if (f != SOCKET_SUCCESS)
+        if (s->result == SOCKET_SUCCESS)
                 s->result = f;
 
         socket_unwatch_control_pid(s);
@@ -1794,7 +1953,7 @@ static void socket_enter_signal(Socket *s, SocketState state, SocketResult f) {
 
         assert(s);
 
-        if (f != SOCKET_SUCCESS)
+        if (s->result == SOCKET_SUCCESS)
                 s->result = f;
 
         r = unit_kill_context(
@@ -1838,7 +1997,7 @@ static void socket_enter_stop_pre(Socket *s, SocketResult f) {
         int r;
         assert(s);
 
-        if (f != SOCKET_SUCCESS)
+        if (s->result == SOCKET_SUCCESS)
                 s->result = f;
 
         socket_unwatch_control_pid(s);
@@ -2033,14 +2192,34 @@ static void socket_enter_running(Socket *s, int cfd) {
                 socket_set_state(s, SOCKET_RUNNING);
         } else {
                 _cleanup_free_ char *prefix = NULL, *instance = NULL, *name = NULL;
+                _cleanup_(socket_peer_unrefp) SocketPeer *p = NULL;
                 Service *service;
 
                 if (s->n_connections >= s->max_connections) {
-                        log_unit_warning(UNIT(s), "Too many incoming connections (%u), refusing connection attempt.", s->n_connections);
+                        log_unit_warning(UNIT(s), "Too many incoming connections (%u), dropping connection.",
+                                         s->n_connections);
                         safe_close(cfd);
                         return;
                 }
 
+                if (s->max_connections_per_source > 0) {
+                        r = socket_acquire_peer(s, cfd, &p);
+                        if (r < 0) {
+                                safe_close(cfd);
+                                return;
+                        } else if (r > 0 && p->n_ref > s->max_connections_per_source) {
+                                _cleanup_free_ char *t = NULL;
+
+                                (void) sockaddr_pretty(&p->peer.sa, p->peer_salen, true, false, &t);
+
+                                log_unit_warning(UNIT(s),
+                                                 "Too many incoming connections (%u) from source %s, dropping connection.",
+                                                 p->n_ref, strnull(t));
+                                safe_close(cfd);
+                                return;
+                        }
+                }
+
                 r = socket_instantiate_service(s);
                 if (r < 0)
                         goto fail;
@@ -2082,6 +2261,9 @@ static void socket_enter_running(Socket *s, int cfd) {
                 cfd = -1; /* We passed ownership of the fd to the service now. Forget it here. */
                 s->n_connections++;
 
+                service->peer = p; /* Pass ownership of the peer reference */
+                p = NULL;
+
                 r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT(service), JOB_REPLACE, &error, NULL);
                 if (r < 0) {
                         /* We failed to activate the new service, but it still exists. Let's make sure the service
@@ -2186,11 +2368,14 @@ static int socket_start(Unit *u) {
                 return r;
         }
 
+        r = unit_acquire_invocation_id(u);
+        if (r < 0)
+                return r;
+
         s->result = SOCKET_SUCCESS;
         s->reset_cpu_usage = true;
 
         socket_enter_start_pre(s);
-
         return 1;
 }
 
@@ -2290,6 +2475,11 @@ static int socket_serialize(Unit *u, FILE *f, FDSet *fds) {
         return 0;
 }
 
+static void socket_port_take_fd(SocketPort *p, FDSet *fds, int fd) {
+        safe_close(p->fd);
+        p->fd = fdset_remove(fds, fd);
+}
+
 static int socket_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
         Socket *s = SOCKET(u);
 
@@ -2344,18 +2534,13 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value,
 
                 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
                         log_unit_debug(u, "Failed to parse fifo value: %s", value);
-                else {
-
+                else
                         LIST_FOREACH(port, p, s->ports)
                                 if (p->type == SOCKET_FIFO &&
-                                    path_equal_or_files_same(p->path, value+skip))
+                                    path_equal_or_files_same(p->path, value+skip, 0)) {
+                                        socket_port_take_fd(p, fds, fd);
                                         break;
-
-                        if (p) {
-                                safe_close(p->fd);
-                                p->fd = fdset_remove(fds, fd);
-                        }
-                }
+                                }
 
         } else if (streq(key, "special")) {
                 int fd, skip = 0;
@@ -2363,18 +2548,13 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value,
 
                 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
                         log_unit_debug(u, "Failed to parse special value: %s", value);
-                else {
-
+                else
                         LIST_FOREACH(port, p, s->ports)
                                 if (p->type == SOCKET_SPECIAL &&
-                                    path_equal_or_files_same(p->path, value+skip))
+                                    path_equal_or_files_same(p->path, value+skip, 0)) {
+                                        socket_port_take_fd(p, fds, fd);
                                         break;
-
-                        if (p) {
-                                safe_close(p->fd);
-                                p->fd = fdset_remove(fds, fd);
-                        }
-                }
+                                }
 
         } else if (streq(key, "mqueue")) {
                 int fd, skip = 0;
@@ -2382,18 +2562,13 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value,
 
                 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
                         log_unit_debug(u, "Failed to parse mqueue value: %s", value);
-                else {
-
+                else
                         LIST_FOREACH(port, p, s->ports)
                                 if (p->type == SOCKET_MQUEUE &&
-                                    streq(p->path, value+skip))
+                                    streq(p->path, value+skip)) {
+                                        socket_port_take_fd(p, fds, fd);
                                         break;
-
-                        if (p) {
-                                safe_close(p->fd);
-                                p->fd = fdset_remove(fds, fd);
-                        }
-                }
+                                }
 
         } else if (streq(key, "socket")) {
                 int fd, type, skip = 0;
@@ -2401,17 +2576,12 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value,
 
                 if (sscanf(value, "%i %i %n", &fd, &type, &skip) < 2 || fd < 0 || type < 0 || !fdset_contains(fds, fd))
                         log_unit_debug(u, "Failed to parse socket value: %s", value);
-                else {
-
+                else
                         LIST_FOREACH(port, p, s->ports)
-                                if (socket_address_is(&p->address, value+skip, type))
+                                if (socket_address_is(&p->address, value+skip, type)) {
+                                        socket_port_take_fd(p, fds, fd);
                                         break;
-
-                        if (p) {
-                                safe_close(p->fd);
-                                p->fd = fdset_remove(fds, fd);
-                        }
-                }
+                                }
 
         } else if (streq(key, "netlink")) {
                 int fd, skip = 0;
@@ -2419,17 +2589,12 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value,
 
                 if (sscanf(value, "%i %n", &fd, &skip) < 1 || fd < 0 || !fdset_contains(fds, fd))
                         log_unit_debug(u, "Failed to parse socket value: %s", value);
-                else {
-
+                else
                         LIST_FOREACH(port, p, s->ports)
-                                if (socket_address_is_netlink(&p->address, value+skip))
+                                if (socket_address_is_netlink(&p->address, value+skip)) {
+                                        socket_port_take_fd(p, fds, fd);
                                         break;
-
-                        if (p) {
-                                safe_close(p->fd);
-                                p->fd = fdset_remove(fds, fd);
-                        }
-                }
+                                }
 
         } else if (streq(key, "ffs")) {
                 int fd, skip = 0, n_auxiliary_fds;
@@ -2437,22 +2602,16 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value,
 
                 if (sscanf(value, "%i %i %n", &fd, &n_auxiliary_fds, &skip) < 2 || fd < 0 || !fdset_contains(fds, fd))
                         log_unit_debug(u, "Failed to parse ffs value: %s", value);
-                else {
-
+                else
                         LIST_FOREACH(port, p, s->ports)
                                 if (p->type == SOCKET_USB_FUNCTION &&
-                                    path_equal_or_files_same(p->path, value+skip))
+                                    path_equal_or_files_same(p->path, value+skip, 0)) {
+                                        socket_port_take_fd(p, fds, fd);
+                                        socket_cleanup_fd_list(p);
+                                        p->n_auxiliary_fds = n_auxiliary_fds;
+                                        p->auxiliary_fds = new(int, n_auxiliary_fds);
                                         break;
-
-                        if (p) {
-                                safe_close(p->fd);
-                                socket_cleanup_fd_list(p);
-                                p->fd = fdset_remove(fds, fd);
-                                p->n_auxiliary_fds = n_auxiliary_fds;
-                                p->auxiliary_fds = new(int, n_auxiliary_fds);
-                        }
-                }
-
+                                }
         } else if (streq(key, "aux")) {
                 int fd, skip = 0, idx;
                 SocketPort *p;
@@ -2463,7 +2622,7 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value,
 
                         LIST_FOREACH(port, p, s->ports)
                                 if (p->type == SOCKET_USB_FUNCTION &&
-                                    path_equal_or_files_same(p->path, value+skip))
+                                    path_equal_or_files_same(p->path, value+skip, 0))
                                         break;
 
                         if (p) {
@@ -2541,6 +2700,7 @@ const char* socket_port_type_to_string(SocketPort *p) {
                         if (socket_address_family(&p->address) == AF_NETLINK)
                                 return "Netlink";
 
+                        /* fall through */
                 default:
                         return NULL;
                 }
@@ -2633,7 +2793,7 @@ static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) {
 
         s->control_pid = 0;
 
-        if (is_clean_exit(code, status, NULL))
+        if (is_clean_exit(code, status, EXIT_CLEAN_COMMAND, NULL))
                 f = SOCKET_SUCCESS;
         else if (code == CLD_EXITED)
                 f = SOCKET_FAILURE_EXIT_CODE;
@@ -2655,7 +2815,7 @@ static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                       "Control process exited, code=%s status=%i",
                       sigchld_code_to_string(code), status);
 
-        if (f != SOCKET_SUCCESS)
+        if (s->result == SOCKET_SUCCESS)
                 s->result = f;
 
         if (s->control_command &&
@@ -2958,6 +3118,7 @@ const UnitVTable socket_vtable = {
         .cgroup_context_offset = offsetof(Socket, cgroup_context),
         .kill_context_offset = offsetof(Socket, kill_context),
         .exec_runtime_offset = offsetof(Socket, exec_runtime),
+        .dynamic_creds_offset = offsetof(Socket, dynamic_creds),
 
         .sections =
                 "Unit\0"
index 0f1ac69..89f4664 100644 (file)
@@ -20,6 +20,7 @@
 ***/
 
 typedef struct Socket Socket;
+typedef struct SocketPeer SocketPeer;
 
 #include "mount.h"
 #include "service.h"
@@ -79,9 +80,12 @@ struct Socket {
 
         LIST_HEAD(SocketPort, ports);
 
+        Set *peers_by_address;
+
         unsigned n_accepted;
         unsigned n_connections;
         unsigned max_connections;
+        unsigned max_connections_per_source;
 
         unsigned backlog;
         unsigned keep_alive_cnt;
@@ -94,7 +98,9 @@ struct Socket {
         ExecContext exec_context;
         KillContext kill_context;
         CGroupContext cgroup_context;
+
         ExecRuntime *exec_runtime;
+        DynamicCreds dynamic_creds;
 
         /* For Accept=no sockets refers to the one service we'll
         activate. For Accept=yes sockets is either NULL, or filled
@@ -162,6 +168,12 @@ struct Socket {
         RateLimit trigger_limit;
 };
 
+SocketPeer *socket_peer_ref(SocketPeer *p);
+SocketPeer *socket_peer_unref(SocketPeer *p);
+int socket_acquire_peer(Socket *s, int fd, SocketPeer **p);
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(SocketPeer*, socket_peer_unref);
+
 /* Called from the service code when collecting fds */
 int socket_collect_fds(Socket *s, int **fds);
 
index a532b15..4c3a74c 100644 (file)
@@ -29,7 +29,7 @@
 #include "escape.h"
 #include "exit-status.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fstab-util.h"
 #include "parse-util.h"
 #include "path-util.h"
@@ -153,6 +153,8 @@ static void swap_done(Unit *u) {
         exec_command_done_array(s->exec_command, _SWAP_EXEC_COMMAND_MAX);
         s->control_command = NULL;
 
+        dynamic_creds_unref(&s->dynamic_creds);
+
         swap_unwatch_control_pid(s);
 
         s->timer_event_source = sd_event_source_unref(s->timer_event_source);
@@ -379,11 +381,7 @@ static int swap_setup_unit(
         if (!u) {
                 delete = true;
 
-                u = unit_new(m, sizeof(Swap));
-                if (!u)
-                        return log_oom();
-
-                r = unit_add_name(u, e);
+                r = unit_new_for_name(m, sizeof(Swap), e, &u);
                 if (r < 0)
                         goto fail;
 
@@ -422,7 +420,7 @@ static int swap_setup_unit(
 fail:
         log_unit_warning_errno(u, r, "Failed to load swap unit: %m");
 
-        if (delete && u)
+        if (delete)
                 unit_free(u);
 
         return r;
@@ -489,13 +487,14 @@ static void swap_set_state(Swap *s, SwapState state) {
         old_state = s->state;
         s->state = state;
 
-        if (state != SWAP_ACTIVATING &&
-            state != SWAP_ACTIVATING_SIGTERM &&
-            state != SWAP_ACTIVATING_SIGKILL &&
-            state != SWAP_ACTIVATING_DONE &&
-            state != SWAP_DEACTIVATING &&
-            state != SWAP_DEACTIVATING_SIGTERM &&
-            state != SWAP_DEACTIVATING_SIGKILL) {
+        if (!IN_SET(state,
+                    SWAP_ACTIVATING,
+                    SWAP_ACTIVATING_SIGTERM,
+                    SWAP_ACTIVATING_SIGKILL,
+                    SWAP_ACTIVATING_DONE,
+                    SWAP_DEACTIVATING,
+                    SWAP_DEACTIVATING_SIGTERM,
+                    SWAP_DEACTIVATING_SIGKILL)) {
                 s->timer_event_source = sd_event_source_unref(s->timer_event_source);
                 swap_unwatch_control_pid(s);
                 s->control_command = NULL;
@@ -553,6 +552,9 @@ static int swap_coldplug(Unit *u) {
                         return r;
         }
 
+        if (!IN_SET(new_state, SWAP_DEAD, SWAP_FAILED))
+                (void) unit_setup_dynamic_creds(u);
+
         swap_set_state(s, new_state);
         return 0;
 }
@@ -606,12 +608,10 @@ static int swap_spawn(Swap *s, ExecCommand *c, pid_t *_pid) {
         pid_t pid;
         int r;
         ExecParameters exec_params = {
-                .apply_permissions = true,
-                .apply_chroot      = true,
-                .apply_tty_stdin   = true,
-                .stdin_fd          = -1,
-                .stdout_fd         = -1,
-                .stderr_fd         = -1,
+                .flags     = EXEC_APPLY_PERMISSIONS|EXEC_APPLY_CHROOT|EXEC_APPLY_TTY_STDIN,
+                .stdin_fd  = -1,
+                .stdout_fd = -1,
+                .stderr_fd = -1,
         };
 
         assert(s);
@@ -628,12 +628,16 @@ static int swap_spawn(Swap *s, ExecCommand *c, pid_t *_pid) {
         if (r < 0)
                 goto fail;
 
+        r = unit_setup_dynamic_creds(UNIT(s));
+        if (r < 0)
+                return r;
+
         r = swap_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), s->timeout_usec));
         if (r < 0)
                 goto fail;
 
         exec_params.environment = UNIT(s)->manager->environment;
-        exec_params.confirm_spawn = UNIT(s)->manager->confirm_spawn;
+        exec_params.confirm_spawn = manager_get_confirm_spawn(UNIT(s)->manager);
         exec_params.cgroup_supported = UNIT(s)->manager->cgroup_supported;
         exec_params.cgroup_path = UNIT(s)->cgroup_path;
         exec_params.cgroup_delegate = s->cgroup_context.delegate;
@@ -644,6 +648,7 @@ static int swap_spawn(Swap *s, ExecCommand *c, pid_t *_pid) {
                        &s->exec_context,
                        &exec_params,
                        s->exec_runtime,
+                       &s->dynamic_creds,
                        &pid);
         if (r < 0)
                 goto fail;
@@ -665,21 +670,25 @@ fail:
 static void swap_enter_dead(Swap *s, SwapResult f) {
         assert(s);
 
-        if (f != SWAP_SUCCESS)
+        if (s->result == SWAP_SUCCESS)
                 s->result = f;
 
+        swap_set_state(s, s->result != SWAP_SUCCESS ? SWAP_FAILED : SWAP_DEAD);
+
         exec_runtime_destroy(s->exec_runtime);
         s->exec_runtime = exec_runtime_unref(s->exec_runtime);
 
         exec_context_destroy_runtime_directory(&s->exec_context, manager_get_runtime_prefix(UNIT(s)->manager));
 
-        swap_set_state(s, s->result != SWAP_SUCCESS ? SWAP_FAILED : SWAP_DEAD);
+        unit_unref_uid_gid(UNIT(s), true);
+
+        dynamic_creds_destroy(&s->dynamic_creds);
 }
 
 static void swap_enter_active(Swap *s, SwapResult f) {
         assert(s);
 
-        if (f != SWAP_SUCCESS)
+        if (s->result == SWAP_SUCCESS)
                 s->result = f;
 
         swap_set_state(s, SWAP_ACTIVE);
@@ -687,20 +696,19 @@ static void swap_enter_active(Swap *s, SwapResult f) {
 
 static void swap_enter_signal(Swap *s, SwapState state, SwapResult f) {
         int r;
+        KillOperation kop;
 
         assert(s);
 
-        if (f != SWAP_SUCCESS)
+        if (s->result == SWAP_SUCCESS)
                 s->result = f;
 
-        r = unit_kill_context(
-                        UNIT(s),
-                        &s->kill_context,
-                        (state != SWAP_ACTIVATING_SIGTERM && state != SWAP_DEACTIVATING_SIGTERM) ?
-                        KILL_KILL : KILL_TERMINATE,
-                        -1,
-                        s->control_pid,
-                        false);
+        if (IN_SET(state, SWAP_ACTIVATING_SIGTERM, SWAP_DEACTIVATING_SIGTERM))
+                kop = KILL_TERMINATE;
+        else
+                kop = KILL_KILL;
+
+        r = unit_kill_context(UNIT(s), &s->kill_context, kop, -1, s->control_pid, false);
         if (r < 0)
                 goto fail;
 
@@ -821,17 +829,18 @@ static int swap_start(Unit *u) {
         /* We cannot fulfill this request right now, try again later
          * please! */
 
-        if (s->state == SWAP_DEACTIVATING ||
-            s->state == SWAP_DEACTIVATING_SIGTERM ||
-            s->state == SWAP_DEACTIVATING_SIGKILL ||
-            s->state == SWAP_ACTIVATING_SIGTERM ||
-            s->state == SWAP_ACTIVATING_SIGKILL)
+        if (IN_SET(s->state,
+                   SWAP_DEACTIVATING,
+                   SWAP_DEACTIVATING_SIGTERM,
+                   SWAP_DEACTIVATING_SIGKILL,
+                   SWAP_ACTIVATING_SIGTERM,
+                   SWAP_ACTIVATING_SIGKILL))
                 return -EAGAIN;
 
         if (s->state == SWAP_ACTIVATING)
                 return 0;
 
-        assert(s->state == SWAP_DEAD || s->state == SWAP_FAILED);
+        assert(IN_SET(s->state, SWAP_DEAD, SWAP_FAILED));
 
         if (detect_container() > 0)
                 return -EPERM;
@@ -849,6 +858,10 @@ static int swap_start(Unit *u) {
                 return r;
         }
 
+        r = unit_acquire_invocation_id(u);
+        if (r < 0)
+                return r;
+
         s->result = SWAP_SUCCESS;
         s->reset_cpu_usage = true;
 
@@ -861,16 +874,15 @@ static int swap_stop(Unit *u) {
 
         assert(s);
 
-        if (s->state == SWAP_DEACTIVATING ||
-            s->state == SWAP_DEACTIVATING_SIGTERM ||
-            s->state == SWAP_DEACTIVATING_SIGKILL ||
-            s->state == SWAP_ACTIVATING_SIGTERM ||
-            s->state == SWAP_ACTIVATING_SIGKILL)
+        if (IN_SET(s->state,
+                   SWAP_DEACTIVATING,
+                   SWAP_DEACTIVATING_SIGTERM,
+                   SWAP_DEACTIVATING_SIGKILL,
+                   SWAP_ACTIVATING_SIGTERM,
+                   SWAP_ACTIVATING_SIGKILL))
                 return 0;
 
-        assert(s->state == SWAP_ACTIVATING ||
-               s->state == SWAP_ACTIVATING_DONE ||
-               s->state == SWAP_ACTIVE);
+        assert(IN_SET(s->state, SWAP_ACTIVATING, SWAP_ACTIVATING_DONE, SWAP_ACTIVE));
 
         if (detect_container() > 0)
                 return -EPERM;
@@ -976,7 +988,7 @@ static void swap_sigchld_event(Unit *u, pid_t pid, int code, int status) {
 
         s->control_pid = 0;
 
-        if (is_clean_exit(code, status, NULL))
+        if (is_clean_exit(code, status, EXIT_CLEAN_COMMAND, NULL))
                 f = SWAP_SUCCESS;
         else if (code == CLD_EXITED)
                 f = SWAP_FAILURE_EXIT_CODE;
@@ -987,7 +999,7 @@ static void swap_sigchld_event(Unit *u, pid_t pid, int code, int status) {
         else
                 assert_not_reached("Unknown code");
 
-        if (f != SWAP_SUCCESS)
+        if (s->result == SWAP_SUCCESS)
                 s->result = f;
 
         if (s->control_command) {
@@ -1177,6 +1189,7 @@ static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v
 
                         case SWAP_DEAD:
                         case SWAP_FAILED:
+                                (void) unit_acquire_invocation_id(UNIT(swap));
                                 swap_enter_active(swap, SWAP_SUCCESS);
                                 break;
 
@@ -1327,7 +1340,7 @@ int swap_process_device_new(Manager *m, struct udev_device *dev) {
         struct udev_list_entry *item = NULL, *first = NULL;
         _cleanup_free_ char *e = NULL;
         const char *dn;
-        Swap *s;
+        Unit *u;
         int r = 0;
 
         assert(m);
@@ -1341,9 +1354,9 @@ int swap_process_device_new(Manager *m, struct udev_device *dev) {
         if (r < 0)
                 return r;
 
-        s = hashmap_get(m->units, e);
-        if (s)
-                r = swap_set_devnode(s, dn);
+        u = manager_get_unit(m, e);
+        if (u)
+                r = swap_set_devnode(SWAP(u), dn);
 
         first = udev_device_get_devlinks_list_entry(dev);
         udev_list_entry_foreach(item, first) {
@@ -1354,9 +1367,9 @@ int swap_process_device_new(Manager *m, struct udev_device *dev) {
                 if (q < 0)
                         return q;
 
-                s = hashmap_get(m->units, n);
-                if (s) {
-                        q = swap_set_devnode(s, dn);
+                u = manager_get_unit(m, n);
+                if (u) {
+                        q = swap_set_devnode(SWAP(u), dn);
                         if (q < 0)
                                 r = q;
                 }
@@ -1466,6 +1479,7 @@ const UnitVTable swap_vtable = {
         .cgroup_context_offset = offsetof(Swap, cgroup_context),
         .kill_context_offset = offsetof(Swap, kill_context),
         .exec_runtime_offset = offsetof(Swap, exec_runtime),
+        .dynamic_creds_offset = offsetof(Swap, dynamic_creds),
 
         .sections =
                 "Unit\0"
index fbf66de..b0ef50f 100644 (file)
@@ -82,6 +82,7 @@ struct Swap {
         CGroupContext cgroup_context;
 
         ExecRuntime *exec_runtime;
+        DynamicCreds dynamic_creds;
 
         SwapState state, deserialized_state;
 
index c6bb050..746572b 100644 (file)
@@ -21,6 +21,7 @@
 #CrashChangeVT=no
 #CrashShell=no
 #CrashReboot=no
+#CtrlAltDelBurstAction=reboot-force
 #CPUAffinity=1 2
 #JoinControllers=cpu,cpuacct net_cls,net_prio
 #RuntimeWatchdogSec=0
index 61a91aa..2a58dd3 100644 (file)
@@ -63,6 +63,9 @@ static int target_add_default_dependencies(Target *t) {
 
         assert(t);
 
+        if (!UNIT(t)->default_dependencies)
+                return 0;
+
         /* Imply ordering for requirement dependencies on target
          * units. Note that when the user created a contradicting
          * ordering manually we won't add anything in here to make
@@ -75,8 +78,11 @@ static int target_add_default_dependencies(Target *t) {
                                 return r;
                 }
 
+        if (unit_has_name(UNIT(t), SPECIAL_SHUTDOWN_TARGET))
+                return 0;
+
         /* Make sure targets are unloaded on shutdown */
-        return unit_add_dependency_by_name(UNIT(t), UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true);
+        return unit_add_two_dependencies_by_name(UNIT(t), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true);
 }
 
 static int target_load(Unit *u) {
@@ -90,7 +96,7 @@ static int target_load(Unit *u) {
                 return r;
 
         /* This is a new unit? Then let's add in some extras */
-        if (u->load_state == UNIT_LOADED && u->default_dependencies) {
+        if (u->load_state == UNIT_LOADED) {
                 r = target_add_default_dependencies(t);
                 if (r < 0)
                         return r;
@@ -124,10 +130,15 @@ static void target_dump(Unit *u, FILE *f, const char *prefix) {
 
 static int target_start(Unit *u) {
         Target *t = TARGET(u);
+        int r;
 
         assert(t);
         assert(t->state == TARGET_DEAD);
 
+        r = unit_acquire_invocation_id(u);
+        if (r < 0)
+                return r;
+
         target_set_state(t, TARGET_ACTIVE);
         return 1;
 }
index 8056f8d..2b2370d 100644 (file)
@@ -147,7 +147,7 @@ static int timer_setup_persistent(Timer *t) {
 
                 e = getenv("XDG_DATA_HOME");
                 if (e)
-                        t->stamp_path = strjoin(e, "/systemd/timers/stamp-", UNIT(t)->id, NULL);
+                        t->stamp_path = strjoin(e, "/systemd/timers/stamp-", UNIT(t)->id);
                 else {
 
                         _cleanup_free_ char *h = NULL;
@@ -156,7 +156,7 @@ static int timer_setup_persistent(Timer *t) {
                         if (r < 0)
                                 return log_unit_error_errno(UNIT(t), r, "Failed to determine home directory: %m");
 
-                        t->stamp_path = strjoin(h, "/.local/share/systemd/timers/stamp-", UNIT(t)->id, NULL);
+                        t->stamp_path = strjoin(h, "/.local/share/systemd/timers/stamp-", UNIT(t)->id);
                 }
         }
 
@@ -232,7 +232,7 @@ static void timer_dump(Unit *u, FILE *f, const char *prefix) {
                 if (v->base == TIMER_CALENDAR) {
                         _cleanup_free_ char *p = NULL;
 
-                        calendar_spec_to_string(v->calendar_spec, &p);
+                        (void) calendar_spec_to_string(v->calendar_spec, &p);
 
                         fprintf(f,
                                 "%s%s: %s\n",
@@ -261,6 +261,8 @@ static void timer_set_state(Timer *t, TimerState state) {
         if (state != TIMER_WAITING) {
                 t->monotonic_event_source = sd_event_source_unref(t->monotonic_event_source);
                 t->realtime_event_source = sd_event_source_unref(t->realtime_event_source);
+                t->next_elapse_monotonic_or_boottime = USEC_INFINITY;
+                t->next_elapse_realtime = USEC_INFINITY;
         }
 
         if (state != old_state)
@@ -291,7 +293,7 @@ static int timer_coldplug(Unit *u) {
 static void timer_enter_dead(Timer *t, TimerResult f) {
         assert(t);
 
-        if (f != TIMER_SUCCESS)
+        if (t->result == TIMER_SUCCESS)
                 t->result = f;
 
         timer_set_state(t, t->result != TIMER_SUCCESS ? TIMER_FAILED : TIMER_DEAD);
@@ -314,21 +316,6 @@ static void timer_enter_elapsed(Timer *t, bool leave_around) {
                 timer_enter_dead(t, TIMER_SUCCESS);
 }
 
-static usec_t monotonic_to_boottime(usec_t t) {
-        usec_t a, b;
-
-        if (t <= 0)
-                return 0;
-
-        a = now(clock_boottime_or_monotonic());
-        b = now(CLOCK_MONOTONIC);
-
-        if (t + a > b)
-                return t + a - b;
-        else
-                return 0;
-}
-
 static void add_random(Timer *t, usec_t *v) {
         char s[FORMAT_TIMESPAN_MAX];
         usec_t add;
@@ -348,14 +335,14 @@ static void add_random(Timer *t, usec_t *v) {
         else
                 *v += add;
 
-        log_unit_info(UNIT(t), "Adding %s random time.", format_timespan(s, sizeof(s), add, 0));
+        log_unit_debug(UNIT(t), "Adding %s random time.", format_timespan(s, sizeof(s), add, 0));
 }
 
 static void timer_enter_waiting(Timer *t, bool initial, bool time_change) {
         bool found_monotonic = false, found_realtime = false;
-        usec_t ts_realtime, ts_monotonic;
-        usec_t base = 0;
         bool leave_around = false;
+        triple_timestamp ts;
+        usec_t base = 0;
         TimerValue *v;
         Unit *trigger;
         int r;
@@ -369,11 +356,7 @@ static void timer_enter_waiting(Timer *t, bool initial, bool time_change) {
                 return;
         }
 
-        /* If we shall wake the system we use the boottime clock
-         * rather than the monotonic clock. */
-
-        ts_realtime = now(CLOCK_REALTIME);
-        ts_monotonic = now(t->wake_system ? clock_boottime_or_monotonic() : CLOCK_MONOTONIC);
+        triple_timestamp_get(&ts);
         t->next_elapse_monotonic_or_boottime = t->next_elapse_realtime = 0;
 
         LIST_FOREACH(value, v, t->values) {
@@ -389,7 +372,7 @@ static void timer_enter_waiting(Timer *t, bool initial, bool time_change) {
                          * to that. If we don't just start from
                          * now. */
 
-                        b = t->last_trigger.realtime > 0 ? t->last_trigger.realtime : ts_realtime;
+                        b = t->last_trigger.realtime > 0 ? t->last_trigger.realtime : ts.realtime;
 
                         r = calendar_spec_next_usec(v->calendar_spec, b, &v->next_elapse);
                         if (r < 0)
@@ -403,13 +386,14 @@ static void timer_enter_waiting(Timer *t, bool initial, bool time_change) {
                         found_realtime = true;
 
                 } else  {
+
                         switch (v->base) {
 
                         case TIMER_ACTIVE:
                                 if (state_translation_table[t->state] == UNIT_ACTIVE)
                                         base = UNIT(t)->inactive_exit_timestamp.monotonic;
                                 else
-                                        base = ts_monotonic;
+                                        base = ts.monotonic;
                                 break;
 
                         case TIMER_BOOT:
@@ -420,7 +404,8 @@ static void timer_enter_waiting(Timer *t, bool initial, bool time_change) {
                                 }
                                 /* In a container we don't want to include the time the host
                                  * was already up when the container started, so count from
-                                 * our own startup. Fall through. */
+                                 * our own startup. */
+                                /* fall through */
                         case TIMER_STARTUP:
                                 base = UNIT(t)->manager->userspace_timestamp.monotonic;
                                 break;
@@ -453,13 +438,12 @@ static void timer_enter_waiting(Timer *t, bool initial, bool time_change) {
                                 assert_not_reached("Unknown timer base");
                         }
 
-                        if (t->wake_system)
-                                base = monotonic_to_boottime(base);
+                        v->next_elapse = usec_add(usec_shift_clock(base, CLOCK_MONOTONIC, TIMER_MONOTONIC_CLOCK(t)), v->value);
 
-                        v->next_elapse = base + v->value;
 
                         if (!initial && !time_change &&
-                            v->next_elapse < ts_monotonic && IN_SET(v->base, TIMER_ACTIVE, TIMER_BOOT, TIMER_STARTUP)) {
+                            v->next_elapse < triple_timestamp_by_clock(&ts, TIMER_MONOTONIC_CLOCK(t)) &&
+                            IN_SET(v->base, TIMER_ACTIVE, TIMER_BOOT, TIMER_STARTUP)) {
                                 /* This is a one time trigger, disable it now */
                                 v->disabled = true;
                                 continue;
@@ -486,7 +470,7 @@ static void timer_enter_waiting(Timer *t, bool initial, bool time_change) {
 
                 add_random(t, &t->next_elapse_monotonic_or_boottime);
 
-                left = t->next_elapse_monotonic_or_boottime > ts_monotonic ? t->next_elapse_monotonic_or_boottime - ts_monotonic : 0;
+                left = usec_sub_unsigned(t->next_elapse_monotonic_or_boottime, triple_timestamp_by_clock(&ts, TIMER_MONOTONIC_CLOCK(t)));
                 log_unit_debug(UNIT(t), "Monotonic timer elapses in %s.", format_timespan(buf, sizeof(buf), left, 0));
 
                 if (t->monotonic_event_source) {
@@ -617,6 +601,10 @@ static int timer_start(Unit *u) {
                 return r;
         }
 
+        r = unit_acquire_invocation_id(u);
+        if (r < 0)
+                return r;
+
         t->last_trigger = DUAL_TIMESTAMP_NULL;
 
         /* Reenable all timers that depend on unit activation time */
@@ -633,7 +621,7 @@ static int timer_start(Unit *u) {
                         /* The timer has never run before,
                          * make sure a stamp file exists.
                          */
-                        touch_file(t->stamp_path, true, USEC_INFINITY, UID_INVALID, GID_INVALID, MODE_INVALID);
+                        (void) touch_file(t->stamp_path, true, USEC_INFINITY, UID_INVALID, GID_INVALID, MODE_INVALID);
         }
 
         t->result = TIMER_SUCCESS;
index 9c4b64f..546c60d 100644 (file)
@@ -78,6 +78,8 @@ struct Timer {
         char *stamp_path;
 };
 
+#define TIMER_MONOTONIC_CLOCK(t) ((t)->wake_system && clock_boottime_supported() ? CLOCK_BOOTTIME_ALARM : CLOCK_MONOTONIC)
+
 void timer_free_values(Timer *t);
 
 extern const UnitVTable timer_vtable;
index 8370b86..a2dfd8a 100644 (file)
@@ -632,7 +632,7 @@ static int transaction_apply(Transaction *tr, Manager *m, JobMode mode) {
 
                 job_add_to_run_queue(j);
                 job_add_to_dbus_queue(j);
-                job_start_timer(j);
+                job_start_timer(j, false);
                 job_shutdown_magic(j);
         }
 
@@ -907,7 +907,10 @@ int transaction_add_job_and_dependencies(
                         SET_FOREACH(dep, following, i) {
                                 r = transaction_add_job_and_dependencies(tr, type, dep, ret, false, false, false, ignore_order, e);
                                 if (r < 0) {
-                                        log_unit_warning(dep, "Cannot add dependency job for, ignoring: %s", bus_error_message(e, r));
+                                        log_unit_full(dep,
+                                                      r == -ERFKILL ? LOG_INFO : LOG_WARNING,
+                                                      r, "Cannot add dependency job, ignoring: %s",
+                                                      bus_error_message(e, r));
                                         sd_bus_error_free(e);
                                 }
                         }
@@ -1085,10 +1088,8 @@ Transaction *transaction_new(bool irreversible) {
                 return NULL;
 
         tr->jobs = hashmap_new(NULL);
-        if (!tr->jobs) {
-                free(tr);
-                return NULL;
-        }
+        if (!tr->jobs)
+                return mfree(tr);
 
         tr->irreversible = irreversible;
 
index 0d8c303..f8c8cbc 100644 (file)
 -- installed, because other cases are covered by the *un scriptlets,
 -- so sometimes we will reload needlessly.
 
-pid = posix.fork()
-if pid == 0 then
-    assert(posix.exec("%{_bindir}/systemctl", "daemon-reload"))
-elseif pid > 0 then
-    posix.wait(pid)
+if posix.access("/run/systemd/system") then
+    pid = posix.fork()
+    if pid == 0 then
+        assert(posix.exec("%{_bindir}/systemctl", "daemon-reload"))
+    elseif pid > 0 then
+        posix.wait(pid)
+    end
 end
 
 %transfiletriggerun -p <lua> -- @systemunitdir@ /etc/systemd/system
@@ -48,10 +50,12 @@ end
 -- file in %transfiletriggerun and execute the daemon-reload in
 -- the first %filetriggerpostun.
 
-posix.mkdir("%{_localstatedir}/lib")
-posix.mkdir("%{_localstatedir}/lib/rpm-state")
-posix.mkdir("%{_localstatedir}/lib/rpm-state/systemd")
-io.open("%{_localstatedir}/lib/rpm-state/systemd/needs-reload", "w")
+if posix.access("/run/systemd/system") then
+    posix.mkdir("%{_localstatedir}/lib")
+    posix.mkdir("%{_localstatedir}/lib/rpm-state")
+    posix.mkdir("%{_localstatedir}/lib/rpm-state/systemd")
+    io.open("%{_localstatedir}/lib/rpm-state/systemd/needs-reload", "w")
+end
 
 %filetriggerpostun -P 1000100 -p <lua> -- @systemunitdir@ /etc/systemd/system
 if posix.access("%{_localstatedir}/lib/rpm-state/systemd/needs-reload") then
index c21a2be..591dac7 100644 (file)
@@ -19,7 +19,6 @@
 
 #include <errno.h>
 #include <fcntl.h>
-#include <linux/dm-ioctl.h>
 #include <linux/loop.h>
 #include <string.h>
 #include <sys/mount.h>
@@ -31,6 +30,7 @@
 #include "escape.h"
 #include "fd-util.h"
 #include "fstab-util.h"
+#include "linux-3.13/dm-ioctl.h"
 #include "list.h"
 #include "mount-setup.h"
 #include "path-util.h"
@@ -344,24 +344,37 @@ static int delete_loopback(const char *device) {
 }
 
 static int delete_dm(dev_t devnum) {
-        _cleanup_close_ int fd = -1;
-        int r;
+
         struct dm_ioctl dm = {
-                .version = {DM_VERSION_MAJOR,
-                            DM_VERSION_MINOR,
-                            DM_VERSION_PATCHLEVEL},
+                .version = {
+                        DM_VERSION_MAJOR,
+                        DM_VERSION_MINOR,
+                        DM_VERSION_PATCHLEVEL
+                },
                 .data_size = sizeof(dm),
                 .dev = devnum,
         };
 
+        _cleanup_close_ int fd = -1;
+
         assert(major(devnum) != 0);
 
         fd = open("/dev/mapper/control", O_RDWR|O_CLOEXEC);
         if (fd < 0)
                 return -errno;
 
-        r = ioctl(fd, DM_DEV_REMOVE, &dm);
-        return r >= 0 ? 0 : -errno;
+        if (ioctl(fd, DM_DEV_REMOVE, &dm) < 0)
+                return -errno;
+
+        return 0;
+}
+
+static bool nonunmountable_path(const char *path) {
+        return path_equal(path, "/")
+#ifndef HAVE_SPLIT_USR
+                || path_equal(path, "/usr")
+#endif
+                || path_startswith(path, "/run/initramfs");
 }
 
 static int mount_points_list_umount(MountPoint **head, bool *changed, bool log_error) {
@@ -375,7 +388,7 @@ static int mount_points_list_umount(MountPoint **head, bool *changed, bool log_e
                 /* If we are in a container, don't attempt to
                    read-only mount anything as that brings no real
                    benefits, but might confuse the host, as we remount
-                   the superblock here, not the bind mound. */
+                   the superblock here, not the bind mount. */
                 if (detect_container() <= 0)  {
                         _cleanup_free_ char *options = NULL;
                         /* MS_REMOUNT requires that the data parameter
@@ -399,21 +412,21 @@ static int mount_points_list_umount(MountPoint **head, bool *changed, bool log_e
                          * somehwere else via a bind mount. If we
                          * explicitly remount the super block of that
                          * alias read-only we hence should be
-                         * relatively safe regarding keeping the fs we
-                         * can otherwise not see dirty. */
+                         * relatively safe regarding keeping dirty an fs
+                         * we cannot otherwise see. */
                         log_info("Remounting '%s' read-only with options '%s'.", m->path, options);
-                        (void) mount(NULL, m->path, NULL, MS_REMOUNT|MS_RDONLY, options);
+                        if (mount(NULL, m->path, NULL, MS_REMOUNT|MS_RDONLY, options) < 0) {
+                                if (log_error)
+                                        log_notice_errno(errno, "Failed to remount '%s' read-only: %m", m->path);
+                                if (nonunmountable_path(m->path))
+                                        n_failed++;
+                        }
                 }
 
                 /* Skip / and /usr since we cannot unmount that
                  * anyway, since we are running from it. They have
                  * already been remounted ro. */
-                if (path_equal(m->path, "/")
-#ifndef HAVE_SPLIT_USR
-                    || path_equal(m->path, "/usr")
-#endif
-                    || path_startswith(m->path, "/run/initramfs")
-                )
+                if (nonunmountable_path(m->path))
                         continue;
 
                 /* Trying to umount. We don't force here since we rely
@@ -425,8 +438,9 @@ static int mount_points_list_umount(MountPoint **head, bool *changed, bool log_e
                                 *changed = true;
 
                         mount_point_free(head, m);
-                } else if (log_error) {
-                        log_warning_errno(errno, "Could not unmount %s: %m", m->path);
+                } else {
+                        if (log_error)
+                                log_warning_errno(errno, "Could not unmount %s: %m", m->path);
                         n_failed++;
                 }
         }
@@ -550,8 +564,6 @@ int umount_all(bool *changed) {
 
         /* umount one more time with logging enabled */
         r = mount_points_list_umount(&mp_list_head, &umount_changed, true);
-        if (r <= 0)
-                goto end;
 
   end:
         mount_points_list_free(&mp_list_head);
index f11df42..746e1a4 100644 (file)
@@ -19,7 +19,7 @@
 
 #include "alloc-util.h"
 #include "cgroup-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "macro.h"
 #include "specifier.h"
 #include "string-util.h"
@@ -78,12 +78,18 @@ static int specifier_filename(char specifier, void *data, void *userdata, char *
                 return unit_name_to_path(u->id, ret);
 }
 
+static void bad_specifier(Unit *u, char specifier) {
+        log_unit_warning(u, "Specifier '%%%c' used in unit configuration, which is deprecated. Please update your unit file, as it does not work as intended.", specifier);
+}
+
 static int specifier_cgroup(char specifier, void *data, void *userdata, char **ret) {
         Unit *u = userdata;
         char *n;
 
         assert(u);
 
+        bad_specifier(u, specifier);
+
         if (u->cgroup_path)
                 n = strdup(u->cgroup_path);
         else
@@ -101,6 +107,8 @@ static int specifier_cgroup_root(char specifier, void *data, void *userdata, cha
 
         assert(u);
 
+        bad_specifier(u, specifier);
+
         n = strdup(u->manager->cgroup_root);
         if (!n)
                 return -ENOMEM;
@@ -115,6 +123,8 @@ static int specifier_cgroup_slice(char specifier, void *data, void *userdata, ch
 
         assert(u);
 
+        bad_specifier(u, specifier);
+
         if (UNIT_ISSET(u->slice)) {
                 Unit *slice;
 
@@ -194,13 +204,20 @@ static int specifier_user_shell(char specifier, void *data, void *userdata, char
 int unit_name_printf(Unit *u, const char* format, char **ret) {
 
         /*
-         * This will use the passed string as format string and
-         * replace the following specifiers:
+         * This will use the passed string as format string and replace the following specifiers (which should all be
+         * safe for inclusion in unit names):
          *
          * %n: the full id of the unit                 (foo@bar.waldo)
          * %N: the id of the unit without the suffix   (foo@bar)
          * %p: the prefix                              (foo)
          * %i: the instance                            (bar)
+         *
+         * %U: the UID of the running user
+         * %u: the username of the running user
+         *
+         * %m: the machine ID of the running system
+         * %H: the host name of the running system
+         * %b: the boot ID of the running system
          */
 
         const Specifier table[] = {
@@ -208,7 +225,14 @@ int unit_name_printf(Unit *u, const char* format, char **ret) {
                 { 'N', specifier_prefix_and_instance, NULL },
                 { 'p', specifier_prefix,              NULL },
                 { 'i', specifier_string,              u->instance },
-                { 0, NULL, NULL }
+
+                { 'U', specifier_user_id,             NULL },
+                { 'u', specifier_user_name,           NULL },
+
+                { 'm', specifier_machine_id,          NULL },
+                { 'H', specifier_host_name,           NULL },
+                { 'b', specifier_boot_id,             NULL },
+                {}
         };
 
         assert(u);
@@ -220,22 +244,23 @@ int unit_name_printf(Unit *u, const char* format, char **ret) {
 
 int unit_full_printf(Unit *u, const char *format, char **ret) {
 
-        /* This is similar to unit_name_printf() but also supports
-         * unescaping. Also, adds a couple of additional codes:
+        /* This is similar to unit_name_printf() but also supports unescaping. Also, adds a couple of additional codes
+         * (which are likely not suitable for unescaped inclusion in unit names):
+         *
+         * %f: the unescaped instance if set, otherwise the id unescaped as path
+         * %c: cgroup path of unit (deprecated)
+         * %r: where units in this slice are placed in the cgroup tree (deprecated)
+         * %R: the root of this systemd's instance tree (deprecated)
+         * %t: the runtime directory to place sockets in (e.g. "/run" or $XDG_RUNTIME_DIR)
+         *
+         * %h: the homedir of the running user
+         * %s: the shell of the running user
+         *
+         * %v: `uname -r` of the running system
          *
-         * %f the instance if set, otherwise the id
-         * %c cgroup path of unit
-         * %r where units in this slice are placed in the cgroup tree
-         * %R the root of this systemd's instance tree
-         * %t the runtime directory to place sockets in (e.g. "/run" or $XDG_RUNTIME_DIR)
-         * %U the UID of the running user
-         * %u the username of the running user
-         * %h the homedir of the running user
-         * %s the shell of the running user
-         * %m the machine ID of the running system
-         * %H the host name of the running system
-         * %b the boot ID of the running system
-         * %v `uname -r` of the running system
+         * NOTICE: When you add new entries here, please be careful: specifiers which depend on settings of the unit
+         * file itself are broken by design, as they would resolve differently depending on whether they are used
+         * before or after the relevant configuration setting. Hence: don't add them.
          */
 
         const Specifier table[] = {
index 4934a0e..b28eeb2 100644 (file)
@@ -36,7 +36,8 @@
 #include "escape.h"
 #include "execute.h"
 #include "fileio-label.h"
-#include "formats-util.h"
+#include "format-util.h"
+#include "id128-util.h"
 #include "load-dropin.h"
 #include "load-fragment.h"
 #include "log.h"
@@ -87,10 +88,8 @@ Unit *unit_new(Manager *m, size_t size) {
                 return NULL;
 
         u->names = set_new(&string_hash_ops);
-        if (!u->names) {
-                free(u);
-                return NULL;
-        }
+        if (!u->names)
+                return mfree(u);
 
         u->manager = m;
         u->type = _UNIT_TYPE_INVALID;
@@ -100,7 +99,10 @@ Unit *unit_new(Manager *m, size_t size) {
         u->on_failure_job_mode = JOB_REPLACE;
         u->cgroup_inotify_wd = -1;
         u->job_timeout = USEC_INFINITY;
-        u->sigchldgen = 0;
+        u->job_running_timeout = USEC_INFINITY;
+        u->ref_uid = UID_INVALID;
+        u->ref_gid = GID_INVALID;
+        u->cpu_usage_last = NSEC_INFINITY;
 
         RATELIMIT_INIT(u->start_limit, m->default_start_limit_interval, m->default_start_limit_burst);
         RATELIMIT_INIT(u->auto_stop_ratelimit, 10 * USEC_PER_SEC, 16);
@@ -108,11 +110,29 @@ Unit *unit_new(Manager *m, size_t size) {
         return u;
 }
 
+int unit_new_for_name(Manager *m, size_t size, const char *name, Unit **ret) {
+        Unit *u;
+        int r;
+
+        u = unit_new(m, size);
+        if (!u)
+                return -ENOMEM;
+
+        r = unit_add_name(u, name);
+        if (r < 0) {
+                unit_free(u);
+                return r;
+        }
+
+        *ret = u;
+        return r;
+}
+
 bool unit_has_name(Unit *u, const char *name) {
         assert(u);
         assert(name);
 
-        return !!set_get(u->names, (char*) name);
+        return set_contains(u->names, (char*) name);
 }
 
 static void unit_init(Unit *u) {
@@ -301,6 +321,7 @@ int unit_set_description(Unit *u, const char *description) {
 
 bool unit_check_gc(Unit *u) {
         UnitActiveState state;
+        bool inactive;
         assert(u);
 
         if (u->job)
@@ -310,24 +331,28 @@ bool unit_check_gc(Unit *u) {
                 return true;
 
         state = unit_active_state(u);
+        inactive = state == UNIT_INACTIVE;
 
         /* If the unit is inactive and failed and no job is queued for
          * it, then release its runtime resources */
         if (UNIT_IS_INACTIVE_OR_FAILED(state) &&
             UNIT_VTABLE(u)->release_resources)
-                UNIT_VTABLE(u)->release_resources(u);
+                UNIT_VTABLE(u)->release_resources(u, inactive);
 
         /* But we keep the unit object around for longer when it is
          * referenced or configured to not be gc'ed */
-        if (state != UNIT_INACTIVE)
+        if (!inactive)
                 return true;
 
-        if (u->no_gc)
+        if (u->perpetual)
                 return true;
 
         if (u->refs)
                 return true;
 
+        if (sd_bus_track_count(u->bus_track) > 0)
+                return true;
+
         if (UNIT_VTABLE(u)->check_gc)
                 if (UNIT_VTABLE(u)->check_gc(u))
                         return true;
@@ -365,10 +390,8 @@ void unit_add_to_gc_queue(Unit *u) {
         if (unit_check_gc(u))
                 return;
 
-        LIST_PREPEND(gc_queue, u->manager->gc_queue, u);
+        LIST_PREPEND(gc_queue, u->manager->gc_unit_queue, u);
         u->in_gc_queue = true;
-
-        u->manager->n_in_gc_queue++;
 }
 
 void unit_add_to_dbus_queue(Unit *u) {
@@ -380,6 +403,7 @@ void unit_add_to_dbus_queue(Unit *u) {
 
         /* Shortcut things if nobody cares */
         if (sd_bus_track_count(u->manager->subscribed) <= 0 &&
+            sd_bus_track_count(u->bus_track) <= 0 &&
             set_isempty(u->manager->private_buses)) {
                 u->sent_dbus_new_signal = true;
                 return;
@@ -494,7 +518,8 @@ void unit_free(Unit *u) {
         Iterator i;
         char *t;
 
-        assert(u);
+        if (!u)
+                return;
 
         if (u->transient_file)
                 fclose(u->transient_file);
@@ -508,11 +533,17 @@ void unit_free(Unit *u) {
 
         sd_bus_slot_unref(u->match_bus_slot);
 
+        sd_bus_track_unref(u->bus_track);
+        u->deserialized_refs = strv_free(u->deserialized_refs);
+
         unit_free_requires_mounts_for(u);
 
         SET_FOREACH(t, u->names, i)
                 hashmap_remove_value(u->manager->units, t, u);
 
+        if (!sd_id128_is_null(u->invocation_id))
+                hashmap_remove_value(u->manager->units_by_invocation_id, &u->invocation_id, u);
+
         if (u->job) {
                 Job *j = u->job;
                 job_uninstall(j);
@@ -540,16 +571,16 @@ void unit_free(Unit *u) {
         if (u->in_cleanup_queue)
                 LIST_REMOVE(cleanup_queue, u->manager->cleanup_queue, u);
 
-        if (u->in_gc_queue) {
-                LIST_REMOVE(gc_queue, u->manager->gc_queue, u);
-                u->manager->n_in_gc_queue--;
-        }
+        if (u->in_gc_queue)
+                LIST_REMOVE(gc_queue, u->manager->gc_unit_queue, u);
 
         if (u->in_cgroup_queue)
                 LIST_REMOVE(cgroup_queue, u->manager->cgroup_queue, u);
 
         unit_release_cgroup(u);
 
+        unit_unref_uid_gid(u, false);
+
         (void) manager_update_failed_units(u->manager, u, false);
         set_remove(u->manager->startup_units, u);
 
@@ -833,31 +864,37 @@ int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
                         return r;
         }
 
+        if (c->root_image) {
+                r = unit_require_mounts_for(u, c->root_image);
+                if (r < 0)
+                        return r;
+        }
+
         if (!MANAGER_IS_SYSTEM(u->manager))
                 return 0;
 
         if (c->private_tmp) {
-                r = unit_require_mounts_for(u, "/tmp");
-                if (r < 0)
-                        return r;
+                const char *p;
+
+                FOREACH_STRING(p, "/tmp", "/var/tmp") {
+                        r = unit_require_mounts_for(u, p);
+                        if (r < 0)
+                                return r;
+                }
 
-                r = unit_require_mounts_for(u, "/var/tmp");
+                r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_TMPFILES_SETUP_SERVICE, NULL, true);
                 if (r < 0)
                         return r;
         }
 
-        if (c->std_output != EXEC_OUTPUT_KMSG &&
-            c->std_output != EXEC_OUTPUT_SYSLOG &&
-            c->std_output != EXEC_OUTPUT_JOURNAL &&
-            c->std_output != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
-            c->std_output != EXEC_OUTPUT_SYSLOG_AND_CONSOLE &&
-            c->std_output != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
-            c->std_error != EXEC_OUTPUT_KMSG &&
-            c->std_error != EXEC_OUTPUT_SYSLOG &&
-            c->std_error != EXEC_OUTPUT_JOURNAL &&
-            c->std_error != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
-            c->std_error != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
-            c->std_error != EXEC_OUTPUT_SYSLOG_AND_CONSOLE)
+        if (!IN_SET(c->std_output,
+                    EXEC_OUTPUT_JOURNAL, EXEC_OUTPUT_JOURNAL_AND_CONSOLE,
+                    EXEC_OUTPUT_KMSG, EXEC_OUTPUT_KMSG_AND_CONSOLE,
+                    EXEC_OUTPUT_SYSLOG, EXEC_OUTPUT_SYSLOG_AND_CONSOLE) &&
+            !IN_SET(c->std_error,
+                    EXEC_OUTPUT_JOURNAL, EXEC_OUTPUT_JOURNAL_AND_CONSOLE,
+                    EXEC_OUTPUT_KMSG, EXEC_OUTPUT_KMSG_AND_CONSOLE,
+                    EXEC_OUTPUT_SYSLOG, EXEC_OUTPUT_SYSLOG_AND_CONSOLE))
                 return 0;
 
         /* If syslog or kernel logging is requested, make sure our own
@@ -894,6 +931,7 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
         Unit *following;
         _cleanup_set_free_ Set *following_set = NULL;
         int r;
+        const char *n;
 
         assert(u);
         assert(u->type >= 0);
@@ -915,11 +953,10 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
                 "%s\tGC Check Good: %s\n"
                 "%s\tNeed Daemon Reload: %s\n"
                 "%s\tTransient: %s\n"
+                "%s\tPerpetual: %s\n"
                 "%s\tSlice: %s\n"
                 "%s\tCGroup: %s\n"
-                "%s\tCGroup realized: %s\n"
-                "%s\tCGroup mask: 0x%x\n"
-                "%s\tCGroup members mask: 0x%x\n",
+                "%s\tCGroup realized: %s\n",
                 prefix, u->id,
                 prefix, unit_description(u),
                 prefix, strna(u->instance),
@@ -933,15 +970,29 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
                 prefix, yes_no(unit_check_gc(u)),
                 prefix, yes_no(unit_need_daemon_reload(u)),
                 prefix, yes_no(u->transient),
+                prefix, yes_no(u->perpetual),
                 prefix, strna(unit_slice_name(u)),
                 prefix, strna(u->cgroup_path),
-                prefix, yes_no(u->cgroup_realized),
-                prefix, u->cgroup_realized_mask,
-                prefix, u->cgroup_members_mask);
+                prefix, yes_no(u->cgroup_realized));
+
+        if (u->cgroup_realized_mask != 0) {
+                _cleanup_free_ char *s = NULL;
+                (void) cg_mask_to_string(u->cgroup_realized_mask, &s);
+                fprintf(f, "%s\tCGroup mask: %s\n", prefix, strnull(s));
+        }
+        if (u->cgroup_members_mask != 0) {
+                _cleanup_free_ char *s = NULL;
+                (void) cg_mask_to_string(u->cgroup_members_mask, &s);
+                fprintf(f, "%s\tCGroup members mask: %s\n", prefix, strnull(s));
+        }
 
         SET_FOREACH(t, u->names, i)
                 fprintf(f, "%s\tName: %s\n", prefix, t);
 
+        if (!sd_id128_is_null(u->invocation_id))
+                fprintf(f, "%s\tInvocation ID: " SD_ID128_FORMAT_STR "\n",
+                        prefix, SD_ID128_FORMAT_VAL(u->invocation_id));
+
         STRV_FOREACH(j, u->documentation)
                 fprintf(f, "%s\tDocumentation: %s\n", prefix, *j);
 
@@ -969,8 +1020,8 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
         if (u->job_timeout != USEC_INFINITY)
                 fprintf(f, "%s\tJob Timeout: %s\n", prefix, format_timespan(timespan, sizeof(timespan), u->job_timeout, 0));
 
-        if (u->job_timeout_action != FAILURE_ACTION_NONE)
-                fprintf(f, "%s\tJob Timeout Action: %s\n", prefix, failure_action_to_string(u->job_timeout_action));
+        if (u->job_timeout_action != EMERGENCY_ACTION_NONE)
+                fprintf(f, "%s\tJob Timeout Action: %s\n", prefix, emergency_action_to_string(u->job_timeout_action));
 
         if (u->job_timeout_reboot_arg)
                 fprintf(f, "%s\tJob Timeout Reboot Argument: %s\n", prefix, u->job_timeout_reboot_arg);
@@ -1035,17 +1086,19 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
         else if (u->load_state == UNIT_ERROR)
                 fprintf(f, "%s\tLoad Error Code: %s\n", prefix, strerror(-u->load_error));
 
+        for (n = sd_bus_track_first(u->bus_track); n; n = sd_bus_track_next(u->bus_track))
+                fprintf(f, "%s\tBus Ref: %s\n", prefix, n);
 
         if (u->job)
                 job_dump(u->job, f, prefix2);
 
         if (u->nop_job)
                 job_dump(u->nop_job, f, prefix2);
-
 }
 
 /* Common implementation for multiple backends */
 int unit_load_fragment_and_dropin(Unit *u) {
+        Unit *t;
         int r;
 
         assert(u);
@@ -1058,16 +1111,18 @@ int unit_load_fragment_and_dropin(Unit *u) {
         if (u->load_state == UNIT_STUB)
                 return -ENOENT;
 
-        /* Load drop-in directory data */
-        r = unit_load_dropin(unit_follow_merge(u));
-        if (r < 0)
-                return r;
+        /* If the unit is an alias and the final unit has already been
+         * loaded, there's no point in reloading the dropins one more time. */
+        t = unit_follow_merge(u);
+        if (t != u && t->load_state != UNIT_STUB)
+                return 0;
 
-        return 0;
+        return unit_load_dropin(t);
 }
 
 /* Common implementation for multiple backends */
 int unit_load_fragment_and_dropin_optional(Unit *u) {
+        Unit *t;
         int r;
 
         assert(u);
@@ -1083,12 +1138,13 @@ int unit_load_fragment_and_dropin_optional(Unit *u) {
         if (u->load_state == UNIT_STUB)
                 u->load_state = UNIT_LOADED;
 
-        /* Load drop-in directory data */
-        r = unit_load_dropin(unit_follow_merge(u));
-        if (r < 0)
-                return r;
+        /* If the unit is an alias and the final unit has already been
+         * loaded, there's no point in reloading the dropins one more time. */
+        t = unit_follow_merge(u);
+        if (t != u && t->load_state != UNIT_STUB)
+                return 0;
 
-        return 0;
+        return unit_load_dropin(t);
 }
 
 int unit_add_default_target_dependency(Unit *u, Unit *target) {
@@ -1288,6 +1344,9 @@ int unit_load(Unit *u) {
                         goto fail;
                 }
 
+                if (u->job_running_timeout != USEC_INFINITY && u->job_running_timeout > u->job_timeout)
+                        log_unit_warning(u, "JobRunningTimeoutSec= is greater than JobTimeoutSec=, it has no effect.");
+
                 unit_update_cgroup_members_masks(u);
         }
 
@@ -1419,9 +1478,8 @@ static void unit_status_print_starting_stopping(Unit *u, JobType t) {
 }
 
 static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
-        const char *format;
+        const char *format, *mid;
         char buf[LINE_MAX];
-        sd_id128_t mid;
 
         assert(u);
 
@@ -1436,12 +1494,12 @@ static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
         format = unit_get_status_message_format(u, t);
 
         DISABLE_WARNING_FORMAT_NONLITERAL;
-        xsprintf(buf, format, unit_description(u));
+        snprintf(buf, sizeof buf, format, unit_description(u));
         REENABLE_WARNING;
 
-        mid = t == JOB_START ? SD_MESSAGE_UNIT_STARTING :
-              t == JOB_STOP  ? SD_MESSAGE_UNIT_STOPPING :
-                               SD_MESSAGE_UNIT_RELOADING;
+        mid = t == JOB_START ? "MESSAGE_ID=" SD_MESSAGE_UNIT_STARTING_STR :
+              t == JOB_STOP  ? "MESSAGE_ID=" SD_MESSAGE_UNIT_STOPPING_STR :
+                               "MESSAGE_ID=" SD_MESSAGE_UNIT_RELOADING_STR;
 
         /* Note that we deliberately use LOG_MESSAGE() instead of
          * LOG_UNIT_MESSAGE() here, since this is supposed to mimic
@@ -1450,9 +1508,9 @@ static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
          * possible, which means we should avoid the low-level unit
          * name. */
         log_struct(LOG_INFO,
-                   LOG_MESSAGE_ID(mid),
-                   LOG_UNIT_ID(u),
                    LOG_MESSAGE("%s", buf),
+                   LOG_UNIT_ID(u),
+                   mid,
                    NULL);
 }
 
@@ -1476,7 +1534,44 @@ int unit_start_limit_test(Unit *u) {
         log_unit_warning(u, "Start request repeated too quickly.");
         u->start_limit_hit = true;
 
-        return failure_action(u->manager, u->start_limit_action, u->reboot_arg);
+        return emergency_action(u->manager, u->start_limit_action, u->reboot_arg, "unit failed");
+}
+
+bool unit_shall_confirm_spawn(Unit *u) {
+        assert(u);
+
+        if (manager_is_confirm_spawn_disabled(u->manager))
+                return false;
+
+        /* For some reasons units remaining in the same process group
+         * as PID 1 fail to acquire the console even if it's not used
+         * by any process. So skip the confirmation question for them. */
+        return !unit_get_exec_context(u)->same_pgrp;
+}
+
+static bool unit_verify_deps(Unit *u) {
+        Unit *other;
+        Iterator j;
+
+        assert(u);
+
+        /* Checks whether all BindsTo= dependencies of this unit are fulfilled — if they are also combined with
+         * After=. We do not check Requires= or Requisite= here as they only should have an effect on the job
+         * processing, but do not have any effect afterwards. We don't check BindsTo= dependencies that are not used in
+         * conjunction with After= as for them any such check would make things entirely racy. */
+
+        SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], j) {
+
+                if (!set_contains(u->dependencies[UNIT_AFTER], other))
+                        continue;
+
+                if (!UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(other))) {
+                        log_unit_notice(u, "Bound to unit %s, but unit isn't active.", other->id);
+                        return false;
+                }
+        }
+
+        return true;
 }
 
 /* Errors:
@@ -1487,6 +1582,7 @@ int unit_start_limit_test(Unit *u) {
  *         -EPROTO:     Assert failed
  *         -EINVAL:     Unit not loaded
  *         -EOPNOTSUPP: Unit type not supported
+ *         -ENOLINK:    The necessary dependencies are not fulfilled.
  */
 int unit_start(Unit *u) {
         UnitActiveState state;
@@ -1532,6 +1628,12 @@ int unit_start(Unit *u) {
         if (!unit_supported(u))
                 return -EOPNOTSUPP;
 
+        /* Let's make sure that the deps really are in order before we start this. Normally the job engine should have
+         * taken care of this already, but let's check this here again. After all, our dependencies might not be in
+         * effect anymore, due to a reload or due to a failed condition. */
+        if (!unit_verify_deps(u))
+                return -ENOLINK;
+
         /* Forward to the main object, if we aren't it. */
         following = unit_following(u);
         if (following) {
@@ -1602,6 +1704,18 @@ int unit_stop(Unit *u) {
         return UNIT_VTABLE(u)->stop(u);
 }
 
+bool unit_can_stop(Unit *u) {
+        assert(u);
+
+        if (!unit_supported(u))
+                return false;
+
+        if (u->perpetual)
+                return false;
+
+        return !!UNIT_VTABLE(u)->stop;
+}
+
 /* Errors:
  *         -EBADR:    This unit type does not support reloading.
  *         -ENOEXEC:  Unit is not started.
@@ -1718,6 +1832,10 @@ static void unit_check_binds_to(Unit *u) {
                 if (other->job)
                         continue;
 
+                if (!other->coldplugged)
+                        /* We might yet create a job for the other unit… */
+                        continue;
+
                 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
                         continue;
 
@@ -2136,13 +2254,20 @@ bool unit_job_is_applicable(Unit *u, JobType j) {
 
         case JOB_VERIFY_ACTIVE:
         case JOB_START:
-        case JOB_STOP:
         case JOB_NOP:
+                /* Note that we don't check unit_can_start() here. That's because .device units and suchlike are not
+                 * startable by us but may appear due to external events, and it thus makes sense to permit enqueing
+                 * jobs for it. */
                 return true;
 
+        case JOB_STOP:
+                /* Similar as above. However, perpetual units can never be stopped (neither explicitly nor due to
+                 * external events), hence it makes no sense to permit enqueing such a request either. */
+                return !u->perpetual;
+
         case JOB_RESTART:
         case JOB_TRY_RESTART:
-                return unit_can_start(u);
+                return unit_can_stop(u) && unit_can_start(u);
 
         case JOB_RELOAD:
         case JOB_TRY_RELOAD:
@@ -2212,6 +2337,11 @@ int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_referen
                 return 0;
         }
 
+        if (d == UNIT_BEFORE && other->type == UNIT_DEVICE) {
+                log_unit_warning(u, "Dependency Before=%s ignored (.device units cannot be delayed)", other->id);
+                return 0;
+        }
+
         r = set_ensure_allocated(&u->dependencies[d], NULL);
         if (r < 0)
                 return r;
@@ -2374,6 +2504,15 @@ char *unit_dbus_path(Unit *u) {
         return unit_dbus_path_from_name(u->id);
 }
 
+char *unit_dbus_path_invocation_id(Unit *u) {
+        assert(u);
+
+        if (sd_id128_is_null(u->invocation_id))
+                return NULL;
+
+        return unit_dbus_path_from_name(u->invocation_id_string);
+}
+
 int unit_set_slice(Unit *u, Unit *slice) {
         assert(u);
         assert(slice);
@@ -2441,7 +2580,7 @@ int unit_set_default_slice(Unit *u) {
                         return -ENOMEM;
 
                 if (MANAGER_IS_SYSTEM(u->manager))
-                        b = strjoin("system-", escaped, ".slice", NULL);
+                        b = strjoin("system-", escaped, ".slice");
                 else
                         b = strappend(escaped, ".slice");
                 if (!b)
@@ -2503,6 +2642,9 @@ static int signal_name_owner_changed(sd_bus_message *message, void *userdata, sd
                 return 0;
         }
 
+        old_owner = isempty(old_owner) ? NULL : old_owner;
+        new_owner = isempty(new_owner) ? NULL : new_owner;
+
         if (UNIT_VTABLE(u)->bus_name_owner_change)
                 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
 
@@ -2559,7 +2701,7 @@ void unit_unwatch_bus_name(Unit *u, const char *name) {
         assert(u);
         assert(name);
 
-        hashmap_remove_value(u->manager->watch_bus, name, u);
+        (void) hashmap_remove_value(u->manager->watch_bus, name, u);
         u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot);
 }
 
@@ -2569,6 +2711,25 @@ bool unit_can_serialize(Unit *u) {
         return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
 }
 
+static int unit_serialize_cgroup_mask(FILE *f, const char *key, CGroupMask mask) {
+        _cleanup_free_ char *s = NULL;
+        int r = 0;
+
+        assert(f);
+        assert(key);
+
+        if (mask != 0) {
+                r = cg_mask_to_string(mask, &s);
+                if (r >= 0) {
+                        fputs(key, f);
+                        fputc('=', f);
+                        fputs(s, f);
+                        fputc('\n', f);
+                }
+        }
+        return r;
+}
+
 int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
         int r;
 
@@ -2608,21 +2769,36 @@ int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
                 unit_serialize_item(u, f, "assert-result", yes_no(u->assert_result));
 
         unit_serialize_item(u, f, "transient", yes_no(u->transient));
-        unit_serialize_item_format(u, f, "cpuacct-usage-base", "%" PRIu64, u->cpuacct_usage_base);
+
+        unit_serialize_item_format(u, f, "cpu-usage-base", "%" PRIu64, u->cpu_usage_base);
+        if (u->cpu_usage_last != NSEC_INFINITY)
+                unit_serialize_item_format(u, f, "cpu-usage-last", "%" PRIu64, u->cpu_usage_last);
 
         if (u->cgroup_path)
                 unit_serialize_item(u, f, "cgroup", u->cgroup_path);
         unit_serialize_item(u, f, "cgroup-realized", yes_no(u->cgroup_realized));
+        (void) unit_serialize_cgroup_mask(f, "cgroup-realized-mask", u->cgroup_realized_mask);
+        (void) unit_serialize_cgroup_mask(f, "cgroup-enabled-mask", u->cgroup_enabled_mask);
+
+        if (uid_is_valid(u->ref_uid))
+                unit_serialize_item_format(u, f, "ref-uid", UID_FMT, u->ref_uid);
+        if (gid_is_valid(u->ref_gid))
+                unit_serialize_item_format(u, f, "ref-gid", GID_FMT, u->ref_gid);
+
+        if (!sd_id128_is_null(u->invocation_id))
+                unit_serialize_item_format(u, f, "invocation-id", SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(u->invocation_id));
+
+        bus_track_serialize(u->bus_track, f, "ref");
 
         if (serialize_jobs) {
                 if (u->job) {
                         fprintf(f, "job\n");
-                        job_serialize(u->job, f, fds);
+                        job_serialize(u->job, f);
                 }
 
                 if (u->nop_job) {
                         fprintf(f, "job\n");
-                        job_serialize(u->nop_job, f, fds);
+                        job_serialize(u->nop_job, f);
                 }
         }
 
@@ -2752,7 +2928,7 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
                                 if (!j)
                                         return log_oom();
 
-                                r = job_deserialize(j, f, fds);
+                                r = job_deserialize(j, f);
                                 if (r < 0) {
                                         job_free(j);
                                         return r;
@@ -2824,11 +3000,19 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
 
                         continue;
 
-                } else if (streq(l, "cpuacct-usage-base")) {
+                } else if (STR_IN_SET(l, "cpu-usage-base", "cpuacct-usage-base")) {
+
+                        r = safe_atou64(v, &u->cpu_usage_base);
+                        if (r < 0)
+                                log_unit_debug(u, "Failed to parse CPU usage base %s, ignoring.", v);
+
+                        continue;
+
+                } else if (streq(l, "cpu-usage-last")) {
 
-                        r = safe_atou64(v, &u->cpuacct_usage_base);
+                        r = safe_atou64(v, &u->cpu_usage_last);
                         if (r < 0)
-                                log_unit_debug(u, "Failed to parse CPU usage %s, ignoring.", v);
+                                log_unit_debug(u, "Failed to read CPU usage last %s, ignoring.", v);
 
                         continue;
 
@@ -2851,6 +3035,61 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
                                 u->cgroup_realized = b;
 
                         continue;
+
+                } else if (streq(l, "cgroup-realized-mask")) {
+
+                        r = cg_mask_from_string(v, &u->cgroup_realized_mask);
+                        if (r < 0)
+                                log_unit_debug(u, "Failed to parse cgroup-realized-mask %s, ignoring.", v);
+                        continue;
+
+                } else if (streq(l, "cgroup-enabled-mask")) {
+
+                        r = cg_mask_from_string(v, &u->cgroup_enabled_mask);
+                        if (r < 0)
+                                log_unit_debug(u, "Failed to parse cgroup-enabled-mask %s, ignoring.", v);
+                        continue;
+
+                } else if (streq(l, "ref-uid")) {
+                        uid_t uid;
+
+                        r = parse_uid(v, &uid);
+                        if (r < 0)
+                                log_unit_debug(u, "Failed to parse referenced UID %s, ignoring.", v);
+                        else
+                                unit_ref_uid_gid(u, uid, GID_INVALID);
+
+                        continue;
+
+                } else if (streq(l, "ref-gid")) {
+                        gid_t gid;
+
+                        r = parse_gid(v, &gid);
+                        if (r < 0)
+                                log_unit_debug(u, "Failed to parse referenced GID %s, ignoring.", v);
+                        else
+                                unit_ref_uid_gid(u, UID_INVALID, gid);
+
+                } else if (streq(l, "ref")) {
+
+                        r = strv_extend(&u->deserialized_refs, v);
+                        if (r < 0)
+                                log_oom();
+
+                        continue;
+                } else if (streq(l, "invocation-id")) {
+                        sd_id128_t id;
+
+                        r = sd_id128_from_string(v, &id);
+                        if (r < 0)
+                                log_unit_debug(u, "Failed to parse invocation id %s, ignoring.", v);
+                        else {
+                                r = unit_set_invocation_id(u, id);
+                                if (r < 0)
+                                        log_unit_warning_errno(u, r, "Failed to set invocation ID for unit: %m");
+                        }
+
+                        continue;
                 }
 
                 if (unit_can_serialize(u)) {
@@ -2909,6 +3148,9 @@ int unit_add_node_link(Unit *u, const char *what, bool wants, UnitDependency dep
         if (r < 0)
                 return r;
 
+        if (dep == UNIT_REQUIRES && device_shall_be_bound_by(device, u))
+                dep = UNIT_BINDS_TO;
+
         r = unit_add_two_dependencies(u, UNIT_AFTER,
                                       MANAGER_IS_SYSTEM(u->manager) ? dep : UNIT_WANTS,
                                       device, true);
@@ -2925,7 +3167,8 @@ int unit_add_node_link(Unit *u, const char *what, bool wants, UnitDependency dep
 }
 
 int unit_coldplug(Unit *u) {
-        int r = 0, q = 0;
+        int r = 0, q;
+        char **i;
 
         assert(u);
 
@@ -2936,36 +3179,49 @@ int unit_coldplug(Unit *u) {
 
         u->coldplugged = true;
 
-        if (UNIT_VTABLE(u)->coldplug)
-                r = UNIT_VTABLE(u)->coldplug(u);
+        STRV_FOREACH(i, u->deserialized_refs) {
+                q = bus_unit_track_add_name(u, *i);
+                if (q < 0 && r >= 0)
+                        r = q;
+        }
+        u->deserialized_refs = strv_free(u->deserialized_refs);
 
-        if (u->job)
-                q = job_coldplug(u->job);
+        if (UNIT_VTABLE(u)->coldplug) {
+                q = UNIT_VTABLE(u)->coldplug(u);
+                if (q < 0 && r >= 0)
+                        r = q;
+        }
 
-        if (r < 0)
-                return r;
-        if (q < 0)
-                return q;
+        if (u->job) {
+                q = job_coldplug(u->job);
+                if (q < 0 && r >= 0)
+                        r = q;
+        }
 
-        return 0;
+        return r;
 }
 
-static bool fragment_mtime_newer(const char *path, usec_t mtime) {
+static bool fragment_mtime_newer(const char *path, usec_t mtime, bool path_masked) {
         struct stat st;
 
         if (!path)
                 return false;
 
+        /* If the source is some virtual kernel file system, then we assume we watch it anyway, and hence pretend we
+         * are never out-of-date. */
+        if (PATH_STARTSWITH_SET(path, "/proc", "/sys"))
+                return false;
+
         if (stat(path, &st) < 0)
                 /* What, cannot access this anymore? */
                 return true;
 
-        if (mtime > 0)
+        if (path_masked)
+                /* For masked files check if they are still so */
+                return !null_or_empty(&st);
+        else
                 /* For non-empty files check the mtime */
                 return timespec_load(&st.st_mtim) > mtime;
-        else if (!null_or_empty(&st))
-                /* For masked files check if they are still so */
-                return true;
 
         return false;
 }
@@ -2976,18 +3232,22 @@ bool unit_need_daemon_reload(Unit *u) {
 
         assert(u);
 
-        if (fragment_mtime_newer(u->fragment_path, u->fragment_mtime))
+        /* For unit files, we allow masking… */
+        if (fragment_mtime_newer(u->fragment_path, u->fragment_mtime,
+                                 u->load_state == UNIT_MASKED))
                 return true;
 
-        if (fragment_mtime_newer(u->source_path, u->source_mtime))
+        /* Source paths should not be masked… */
+        if (fragment_mtime_newer(u->source_path, u->source_mtime, false))
                 return true;
 
         (void) unit_find_dropin_paths(u, &t);
         if (!strv_equal(u->dropin_paths, t))
                 return true;
 
+        /* … any drop-ins that are masked are simply omitted from the list. */
         STRV_FOREACH(path, u->dropin_paths)
-                if (fragment_mtime_newer(*path, u->dropin_mtime))
+                if (fragment_mtime_newer(*path, u->dropin_mtime, false))
                         return true;
 
         return false;
@@ -3224,6 +3484,33 @@ void unit_ref_unset(UnitRef *ref) {
         ref->unit = NULL;
 }
 
+static int user_from_unit_name(Unit *u, char **ret) {
+
+        static const uint8_t hash_key[] = {
+                0x58, 0x1a, 0xaf, 0xe6, 0x28, 0x58, 0x4e, 0x96,
+                0xb4, 0x4e, 0xf5, 0x3b, 0x8c, 0x92, 0x07, 0xec
+        };
+
+        _cleanup_free_ char *n = NULL;
+        int r;
+
+        r = unit_name_to_prefix(u->id, &n);
+        if (r < 0)
+                return r;
+
+        if (valid_user_group_name(n)) {
+                *ret = n;
+                n = NULL;
+                return 0;
+        }
+
+        /* If we can't use the unit name as a user name, then let's hash it and use that */
+        if (asprintf(ret, "_du%016" PRIx64, siphash24(n, strlen(n), hash_key)) < 0)
+                return -ENOMEM;
+
+        return 0;
+}
+
 int unit_patch_contexts(Unit *u) {
         CGroupContext *cc;
         ExecContext *ec;
@@ -3258,16 +3545,34 @@ int unit_patch_contexts(Unit *u) {
                         ec->working_directory_missing_ok = true;
                 }
 
-                if (MANAGER_IS_USER(u->manager) &&
-                    (ec->syscall_whitelist ||
-                     !set_isempty(ec->syscall_filter) ||
-                     !set_isempty(ec->syscall_archs) ||
-                     ec->address_families_whitelist ||
-                     !set_isempty(ec->address_families)))
-                        ec->no_new_privileges = true;
-
                 if (ec->private_devices)
-                        ec->capability_bounding_set &= ~(UINT64_C(1) << CAP_MKNOD);
+                        ec->capability_bounding_set &= ~((UINT64_C(1) << CAP_MKNOD) | (UINT64_C(1) << CAP_SYS_RAWIO));
+
+                if (ec->protect_kernel_modules)
+                        ec->capability_bounding_set &= ~(UINT64_C(1) << CAP_SYS_MODULE);
+
+                if (ec->dynamic_user) {
+                        if (!ec->user) {
+                                r = user_from_unit_name(u, &ec->user);
+                                if (r < 0)
+                                        return r;
+                        }
+
+                        if (!ec->group) {
+                                ec->group = strdup(ec->user);
+                                if (!ec->group)
+                                        return -ENOMEM;
+                        }
+
+                        /* If the dynamic user option is on, let's make sure that the unit can't leave its UID/GID
+                         * around in the file system or on IPC objects. Hence enforce a strict sandbox. */
+
+                        ec->private_tmp = true;
+                        ec->remove_ipc = true;
+                        ec->protect_system = PROTECT_SYSTEM_STRICT;
+                        if (ec->protect_home == PROTECT_HOME_NO)
+                                ec->protect_home = PROTECT_HOME_READ_ONLY;
+                }
         }
 
         cc = unit_get_cgroup_context(u);
@@ -3473,7 +3778,7 @@ int unit_make_transient(Unit *u) {
         if (!UNIT_VTABLE(u)->can_transient)
                 return -EOPNOTSUPP;
 
-        path = strjoin(u->manager->lookup_paths.transient, "/", u->id, NULL);
+        path = strjoin(u->manager->lookup_paths.transient, "/", u->id);
         if (!path)
                 return -ENOMEM;
 
@@ -3558,14 +3863,14 @@ int unit_kill_context(
                 bool main_pid_alien) {
 
         bool wait_for_exit = false, send_sighup;
-        cg_kill_log_func_t log_func;
+        cg_kill_log_func_t log_func = NULL;
         int sig, r;
 
         assert(u);
         assert(c);
 
-        /* Kill the processes belonging to this unit, in preparation for shutting the unit down. Returns > 0 if we
-         * killed something worth waiting for, 0 otherwise. */
+        /* Kill the processes belonging to this unit, in preparation for shutting the unit down.
+         * Returns > 0 if we killed something worth waiting for, 0 otherwise. */
 
         if (c->kill_mode == KILL_NONE)
                 return 0;
@@ -3577,9 +3882,8 @@ int unit_kill_context(
                 IN_SET(k, KILL_TERMINATE, KILL_TERMINATE_AND_LOG) &&
                 sig != SIGHUP;
 
-        log_func =
-                k != KILL_TERMINATE ||
-                IN_SET(sig, SIGKILL, SIGABRT) ? log_kill : NULL;
+        if (k != KILL_TERMINATE || IN_SET(sig, SIGKILL, SIGABRT))
+                log_func = log_kill;
 
         if (main_pid > 0) {
                 if (log_func)
@@ -3650,10 +3954,10 @@ int unit_kill_context(
                          * should not exist in non-delegated units. On
                          * the unified hierarchy that's different,
                          * there we get proper events. Hence rely on
-                         * them.*/
+                         * them. */
 
-                        if  (cg_unified() > 0 ||
-                             (detect_container() == 0 && !unit_cgroup_delegate(u)))
+                        if (cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER) > 0 ||
+                            (detect_container() == 0 && !unit_cgroup_delegate(u)))
                                 wait_for_exit = true;
 
                         if (send_sighup) {
@@ -3776,6 +4080,26 @@ int unit_setup_exec_runtime(Unit *u) {
         return exec_runtime_make(rt, unit_get_exec_context(u), u->id);
 }
 
+int unit_setup_dynamic_creds(Unit *u) {
+        ExecContext *ec;
+        DynamicCreds *dcreds;
+        size_t offset;
+
+        assert(u);
+
+        offset = UNIT_VTABLE(u)->dynamic_creds_offset;
+        assert(offset > 0);
+        dcreds = (DynamicCreds*) ((uint8_t*) u + offset);
+
+        ec = unit_get_exec_context(u);
+        assert(ec);
+
+        if (!ec->dynamic_user)
+                return 0;
+
+        return dynamic_creds_acquire(dcreds, u->manager, ec->user, ec->group);
+}
+
 bool unit_type_supported(UnitType t) {
         if (_unlikely_(t < 0))
                 return false;
@@ -3803,7 +4127,7 @@ void unit_warn_if_dir_nonempty(Unit *u, const char* where) {
         }
 
         log_struct(LOG_NOTICE,
-                   LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING),
+                   "MESSAGE_ID=" SD_MESSAGE_OVERMOUNTING_STR,
                    LOG_UNIT_ID(u),
                    LOG_UNIT_MESSAGE(u, "Directory %s to mount over is not empty, mounting anyway.", where),
                    "WHERE=%s", where,
@@ -3825,7 +4149,7 @@ int unit_fail_if_symlink(Unit *u, const char* where) {
                 return 0;
 
         log_struct(LOG_ERR,
-                   LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING),
+                   "MESSAGE_ID=" SD_MESSAGE_OVERMOUNTING_STR,
                    LOG_UNIT_ID(u),
                    LOG_UNIT_MESSAGE(u, "Mount on symlink %s not allowed.", where),
                    "WHERE=%s", where,
@@ -3869,3 +4193,198 @@ pid_t unit_main_pid(Unit *u) {
 
         return 0;
 }
+
+static void unit_unref_uid_internal(
+                Unit *u,
+                uid_t *ref_uid,
+                bool destroy_now,
+                void (*_manager_unref_uid)(Manager *m, uid_t uid, bool destroy_now)) {
+
+        assert(u);
+        assert(ref_uid);
+        assert(_manager_unref_uid);
+
+        /* Generic implementation of both unit_unref_uid() and unit_unref_gid(), under the assumption that uid_t and
+         * gid_t are actually the same time, with the same validity rules.
+         *
+         * Drops a reference to UID/GID from a unit. */
+
+        assert_cc(sizeof(uid_t) == sizeof(gid_t));
+        assert_cc(UID_INVALID == (uid_t) GID_INVALID);
+
+        if (!uid_is_valid(*ref_uid))
+                return;
+
+        _manager_unref_uid(u->manager, *ref_uid, destroy_now);
+        *ref_uid = UID_INVALID;
+}
+
+void unit_unref_uid(Unit *u, bool destroy_now) {
+        unit_unref_uid_internal(u, &u->ref_uid, destroy_now, manager_unref_uid);
+}
+
+void unit_unref_gid(Unit *u, bool destroy_now) {
+        unit_unref_uid_internal(u, (uid_t*) &u->ref_gid, destroy_now, manager_unref_gid);
+}
+
+static int unit_ref_uid_internal(
+                Unit *u,
+                uid_t *ref_uid,
+                uid_t uid,
+                bool clean_ipc,
+                int (*_manager_ref_uid)(Manager *m, uid_t uid, bool clean_ipc)) {
+
+        int r;
+
+        assert(u);
+        assert(ref_uid);
+        assert(uid_is_valid(uid));
+        assert(_manager_ref_uid);
+
+        /* Generic implementation of both unit_ref_uid() and unit_ref_guid(), under the assumption that uid_t and gid_t
+         * are actually the same type, and have the same validity rules.
+         *
+         * Adds a reference on a specific UID/GID to this unit. Each unit referencing the same UID/GID maintains a
+         * reference so that we can destroy the UID/GID's IPC resources as soon as this is requested and the counter
+         * drops to zero. */
+
+        assert_cc(sizeof(uid_t) == sizeof(gid_t));
+        assert_cc(UID_INVALID == (uid_t) GID_INVALID);
+
+        if (*ref_uid == uid)
+                return 0;
+
+        if (uid_is_valid(*ref_uid)) /* Already set? */
+                return -EBUSY;
+
+        r = _manager_ref_uid(u->manager, uid, clean_ipc);
+        if (r < 0)
+                return r;
+
+        *ref_uid = uid;
+        return 1;
+}
+
+int unit_ref_uid(Unit *u, uid_t uid, bool clean_ipc) {
+        return unit_ref_uid_internal(u, &u->ref_uid, uid, clean_ipc, manager_ref_uid);
+}
+
+int unit_ref_gid(Unit *u, gid_t gid, bool clean_ipc) {
+        return unit_ref_uid_internal(u, (uid_t*) &u->ref_gid, (uid_t) gid, clean_ipc, manager_ref_gid);
+}
+
+static int unit_ref_uid_gid_internal(Unit *u, uid_t uid, gid_t gid, bool clean_ipc) {
+        int r = 0, q = 0;
+
+        assert(u);
+
+        /* Reference both a UID and a GID in one go. Either references both, or neither. */
+
+        if (uid_is_valid(uid)) {
+                r = unit_ref_uid(u, uid, clean_ipc);
+                if (r < 0)
+                        return r;
+        }
+
+        if (gid_is_valid(gid)) {
+                q = unit_ref_gid(u, gid, clean_ipc);
+                if (q < 0) {
+                        if (r > 0)
+                                unit_unref_uid(u, false);
+
+                        return q;
+                }
+        }
+
+        return r > 0 || q > 0;
+}
+
+int unit_ref_uid_gid(Unit *u, uid_t uid, gid_t gid) {
+        ExecContext *c;
+        int r;
+
+        assert(u);
+
+        c = unit_get_exec_context(u);
+
+        r = unit_ref_uid_gid_internal(u, uid, gid, c ? c->remove_ipc : false);
+        if (r < 0)
+                return log_unit_warning_errno(u, r, "Couldn't add UID/GID reference to unit, proceeding without: %m");
+
+        return r;
+}
+
+void unit_unref_uid_gid(Unit *u, bool destroy_now) {
+        assert(u);
+
+        unit_unref_uid(u, destroy_now);
+        unit_unref_gid(u, destroy_now);
+}
+
+void unit_notify_user_lookup(Unit *u, uid_t uid, gid_t gid) {
+        int r;
+
+        assert(u);
+
+        /* This is invoked whenever one of the forked off processes let's us know the UID/GID its user name/group names
+         * resolved to. We keep track of which UID/GID is currently assigned in order to be able to destroy its IPC
+         * objects when no service references the UID/GID anymore. */
+
+        r = unit_ref_uid_gid(u, uid, gid);
+        if (r > 0)
+                bus_unit_send_change_signal(u);
+}
+
+int unit_set_invocation_id(Unit *u, sd_id128_t id) {
+        int r;
+
+        assert(u);
+
+        /* Set the invocation ID for this unit. If we cannot, this will not roll back, but reset the whole thing. */
+
+        if (sd_id128_equal(u->invocation_id, id))
+                return 0;
+
+        if (!sd_id128_is_null(u->invocation_id))
+                (void) hashmap_remove_value(u->manager->units_by_invocation_id, &u->invocation_id, u);
+
+        if (sd_id128_is_null(id)) {
+                r = 0;
+                goto reset;
+        }
+
+        r = hashmap_ensure_allocated(&u->manager->units_by_invocation_id, &id128_hash_ops);
+        if (r < 0)
+                goto reset;
+
+        u->invocation_id = id;
+        sd_id128_to_string(id, u->invocation_id_string);
+
+        r = hashmap_put(u->manager->units_by_invocation_id, &u->invocation_id, u);
+        if (r < 0)
+                goto reset;
+
+        return 0;
+
+reset:
+        u->invocation_id = SD_ID128_NULL;
+        u->invocation_id_string[0] = 0;
+        return r;
+}
+
+int unit_acquire_invocation_id(Unit *u) {
+        sd_id128_t id;
+        int r;
+
+        assert(u);
+
+        r = sd_id128_randomize(&id);
+        if (r < 0)
+                return log_unit_error_errno(u, r, "Failed to generate invocation ID for unit: %m");
+
+        r = unit_set_invocation_id(u, id);
+        if (r < 0)
+                return log_unit_error_errno(u, r, "Failed to set invocation ID for unit: %m");
+
+        return 0;
+}
index 0f82cf3..cbca6a8 100644 (file)
@@ -29,7 +29,7 @@ typedef struct UnitRef UnitRef;
 typedef struct UnitStatusMessageFormats UnitStatusMessageFormats;
 
 #include "condition.h"
-#include "failure-action.h"
+#include "emergency-action.h"
 #include "install.h"
 #include "list.h"
 #include "unit-name.h"
@@ -108,9 +108,14 @@ struct Unit {
         /* The slot used for watching NameOwnerChanged signals */
         sd_bus_slot *match_bus_slot;
 
+        /* References to this unit from clients */
+        sd_bus_track *bus_track;
+        char **deserialized_refs;
+
         /* Job timeout and action to take */
         usec_t job_timeout;
-        FailureAction job_timeout_action;
+        usec_t job_running_timeout;
+        EmergencyAction job_timeout_action;
         char *job_timeout_reboot_arg;
 
         /* References to this */
@@ -174,18 +179,23 @@ struct Unit {
 
         /* Put a ratelimit on unit starting */
         RateLimit start_limit;
-        FailureAction start_limit_action;
+        EmergencyAction start_limit_action;
         char *reboot_arg;
 
         /* Make sure we never enter endless loops with the check unneeded logic, or the BindsTo= logic */
         RateLimit auto_stop_ratelimit;
 
+        /* Reference to a specific UID/GID */
+        uid_t ref_uid;
+        gid_t ref_gid;
+
         /* Cached unit file state and preset */
         UnitFileState unit_file_state;
         int unit_file_preset;
 
-        /* Where the cpuacct.usage cgroup counter was at the time the unit was started */
-        nsec_t cpuacct_usage_base;
+        /* Where the cpu.stat or cpuacct.usage was at the time the unit was started */
+        nsec_t cpu_usage_base;
+        nsec_t cpu_usage_last; /* the most recently read value */
 
         /* Counterparts in the cgroup filesystem */
         char *cgroup_path;
@@ -195,11 +205,13 @@ struct Unit {
         CGroupMask cgroup_members_mask;
         int cgroup_inotify_wd;
 
-        uint32_t cgroup_netclass_id;
-
         /* How to start OnFailure units */
         JobMode on_failure_job_mode;
 
+        /* The current invocation ID */
+        sd_id128_t invocation_id;
+        char invocation_id_string[SD_ID128_STRING_MAX]; /* useful when logging */
+
         /* Garbage collect us we nobody wants or requires us anymore */
         bool stop_when_unneeded;
 
@@ -225,6 +237,9 @@ struct Unit {
         /* Is this a transient unit? */
         bool transient;
 
+        /* Is this a unit that is always running and cannot be stopped? */
+        bool perpetual;
+
         bool in_load_queue:1;
         bool in_dbus_queue:1;
         bool in_cleanup_queue:1;
@@ -233,8 +248,6 @@ struct Unit {
 
         bool sent_dbus_new_signal:1;
 
-        bool no_gc:1;
-
         bool in_audit:1;
 
         bool cgroup_realized:1;
@@ -245,6 +258,9 @@ struct Unit {
 
         /* Did we already invoke unit_coldplug() for this unit? */
         bool coldplugged:1;
+
+        /* For transient units: whether to add a bus track reference after creating the unit */
+        bool bus_track_add:1;
 };
 
 struct UnitStatusMessageFormats {
@@ -291,6 +307,10 @@ struct UnitVTable {
          * that */
         size_t exec_runtime_offset;
 
+        /* If greater than 0, the offset into the object where the pointer to DynamicCreds is found, if the unit type
+         * has that. */
+        size_t dynamic_creds_offset;
+
         /* The name of the configuration file section with the private settings of this unit */
         const char *private_section;
 
@@ -354,7 +374,7 @@ struct UnitVTable {
 
         /* When the unit is not running and no job for it queued we
          * shall release its runtime resources */
-        void (*release_resources)(Unit *u);
+        void (*release_resources)(Unit *u, bool inactive);
 
         /* Invoked on every child that died */
         void (*sigchld_event)(Unit *u, pid_t pid, int code, int status);
@@ -369,8 +389,7 @@ struct UnitVTable {
         /* Called whenever a process of this unit sends us a message */
         void (*notify_message)(Unit *u, const struct ucred *ucred, char **tags, FDSet *fds);
 
-        /* Called whenever a name this Unit registered for comes or
-         * goes away. */
+        /* Called whenever a name this Unit registered for comes or goes away. */
         void (*bus_name_owner_change)(Unit *u, const char *name, const char *old_owner, const char *new_owner);
 
         /* Called for each property that is being set */
@@ -423,6 +442,9 @@ struct UnitVTable {
 
         /* True if transient units of this type are OK */
         bool can_transient:1;
+
+        /* True if queued jobs of this type should be GC'ed if no other job needs them anymore */
+        bool gc_jobs:1;
 };
 
 extern const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX];
@@ -463,6 +485,7 @@ DEFINE_CAST(SCOPE, Scope);
 Unit *unit_new(Manager *m, size_t size);
 void unit_free(Unit *u);
 
+int unit_new_for_name(Manager *m, size_t size, const char *name, Unit **ret);
 int unit_add_name(Unit *u, const char *name);
 
 int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference);
@@ -507,6 +530,7 @@ void unit_dump(Unit *u, FILE *f, const char *prefix);
 
 bool unit_can_reload(Unit *u) _pure_;
 bool unit_can_start(Unit *u) _pure_;
+bool unit_can_stop(Unit *u) _pure_;
 bool unit_can_isolate(Unit *u) _pure_;
 
 int unit_start(Unit *u);
@@ -533,6 +557,7 @@ bool unit_job_is_applicable(Unit *u, JobType j);
 int set_unit_path(const char *p);
 
 char *unit_dbus_path(Unit *u);
+char *unit_dbus_path_invocation_id(Unit *u);
 
 int unit_load_related_unit(Unit *u, const char *type, Unit **_found);
 
@@ -589,6 +614,7 @@ CGroupContext *unit_get_cgroup_context(Unit *u) _pure_;
 ExecRuntime *unit_get_exec_runtime(Unit *u) _pure_;
 
 int unit_setup_exec_runtime(Unit *u);
+int unit_setup_dynamic_creds(Unit *u);
 
 int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data);
 int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) _printf_(4,5);
@@ -618,12 +644,28 @@ int unit_fail_if_symlink(Unit *u, const char* where);
 
 int unit_start_limit_test(Unit *u);
 
+void unit_unref_uid(Unit *u, bool destroy_now);
+int unit_ref_uid(Unit *u, uid_t uid, bool clean_ipc);
+
+void unit_unref_gid(Unit *u, bool destroy_now);
+int unit_ref_gid(Unit *u, gid_t gid, bool clean_ipc);
+
+int unit_ref_uid_gid(Unit *u, uid_t uid, gid_t gid);
+void unit_unref_uid_gid(Unit *u, bool destroy_now);
+
+void unit_notify_user_lookup(Unit *u, uid_t uid, gid_t gid);
+
+int unit_set_invocation_id(Unit *u, sd_id128_t id);
+int unit_acquire_invocation_id(Unit *u);
+
+bool unit_shall_confirm_spawn(Unit *u);
+
 /* Macros which append UNIT= or USER_UNIT= to the message */
 
 #define log_unit_full(unit, level, error, ...)                          \
         ({                                                              \
-                Unit *_u = (unit);                                      \
-                _u ? log_object_internal(level, error, __FILE__, __LINE__, __func__, _u->manager->unit_log_field, _u->id, ##__VA_ARGS__) : \
+                const Unit *_u = (unit);                                \
+                _u ? log_object_internal(level, error, __FILE__, __LINE__, __func__, _u->manager->unit_log_field, _u->id, _u->manager->invocation_log_field, _u->invocation_id_string, ##__VA_ARGS__) : \
                         log_internal(level, error, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
         })
 
index dcc09fc..a2c62e5 100644 (file)
 #include <elfutils/libdwfl.h>
 #endif
 
+#include "sd-daemon.h"
 #include "sd-journal.h"
 #include "sd-login.h"
-#include "sd-daemon.h"
+#include "sd-messages.h"
 
 #include "acl-util.h"
 #include "alloc-util.h"
 #include "fileio.h"
 #include "fs-util.h"
 #include "io-util.h"
-#include "journald-native.h"
+#include "journal-importer.h"
 #include "log.h"
 #include "macro.h"
 #include "missing.h"
 #include "mkdir.h"
 #include "parse-util.h"
 #include "process-util.h"
+#include "signal-util.h"
 #include "socket-util.h"
 #include "special.h"
 #include "stacktrace.h"
 assert_cc(JOURNAL_SIZE_MAX <= DATA_SIZE_MAX);
 
 enum {
-        /* We use this as array indexes for a couple of special fields we use for naming coredumping files, and
-         * attaching xattrs */
+        /* We use this as array indexes for a couple of special fields we use for
+         * naming coredump files, and attaching xattrs, and for indexing argv[].
+
+         * Our pattern for man:systectl(1) kernel.core_pattern is such that the
+         * kernel passes fields until CONTEXT_RLIMIT as arguments in argv[]. After
+         * that it gets complicated: the kernel passes "comm" as one or more fields
+         * starting at index CONTEXT_COMM (in other words, full "comm" is under index
+         * CONTEXT_COMM when it does not contain spaces, which is the common
+         * case). This mapping is not reversible, so we prefer to retrieve "comm"
+         * from /proc. We only fall back to argv[CONTEXT_COMM...] when that fails.
+         *
+         * In the internal context[] array, fields before CONTEXT_COMM are the
+         * strings from argv[], so they should not be freed. The strings at indices
+         * CONTEXT_COMM and higher are allocated by us and should be freed at the
+         * end.
+         */
         CONTEXT_PID,
         CONTEXT_UID,
         CONTEXT_GID,
@@ -86,6 +102,7 @@ enum {
         CONTEXT_RLIMIT,
         CONTEXT_COMM,
         CONTEXT_EXE,
+        CONTEXT_UNIT,
         _CONTEXT_MAX
 };
 
@@ -93,7 +110,6 @@ typedef enum CoredumpStorage {
         COREDUMP_STORAGE_NONE,
         COREDUMP_STORAGE_EXTERNAL,
         COREDUMP_STORAGE_JOURNAL,
-        COREDUMP_STORAGE_BOTH,
         _COREDUMP_STORAGE_MAX,
         _COREDUMP_STORAGE_INVALID = -1
 } CoredumpStorage;
@@ -102,7 +118,6 @@ static const char* const coredump_storage_table[_COREDUMP_STORAGE_MAX] = {
         [COREDUMP_STORAGE_NONE] = "none",
         [COREDUMP_STORAGE_EXTERNAL] = "external",
         [COREDUMP_STORAGE_JOURNAL] = "journal",
-        [COREDUMP_STORAGE_BOTH] = "both",
 };
 
 DEFINE_PRIVATE_STRING_TABLE_LOOKUP(coredump_storage, CoredumpStorage);
@@ -112,7 +127,7 @@ static CoredumpStorage arg_storage = COREDUMP_STORAGE_EXTERNAL;
 static bool arg_compress = true;
 static uint64_t arg_process_size_max = PROCESS_SIZE_MAX;
 static uint64_t arg_external_size_max = EXTERNAL_SIZE_MAX;
-static size_t arg_journal_size_max = JOURNAL_SIZE_MAX;
+static uint64_t arg_journal_size_max = JOURNAL_SIZE_MAX;
 static uint64_t arg_keep_free = (uint64_t) -1;
 static uint64_t arg_max_use = (uint64_t) -1;
 
@@ -128,11 +143,15 @@ static int parse_config(void) {
                 {}
         };
 
-        return config_parse_many(PKGSYSCONFDIR "/coredump.conf",
-                                 CONF_PATHS_NULSTR("systemd/coredump.conf.d"),
-                                 "Coredump\0",
-                                 config_item_table_lookup, items,
-                                 false, NULL);
+        return config_parse_many_nulstr(PKGSYSCONFDIR "/coredump.conf",
+                                        CONF_PATHS_NULSTR("systemd/coredump.conf.d"),
+                                        "Coredump\0",
+                                        config_item_table_lookup, items,
+                                        false, NULL);
+}
+
+static inline uint64_t storage_size_max(void) {
+        return arg_storage == COREDUMP_STORAGE_EXTERNAL ? arg_external_size_max : arg_journal_size_max;
 }
 
 static int fix_acl(int fd, uid_t uid) {
@@ -183,6 +202,7 @@ static int fix_xattr(int fd, const char *context[_CONTEXT_MAX]) {
                 [CONTEXT_GID] = "user.coredump.gid",
                 [CONTEXT_SIGNAL] = "user.coredump.signal",
                 [CONTEXT_TIMESTAMP] = "user.coredump.timestamp",
+                [CONTEXT_RLIMIT] = "user.coredump.rlimit",
                 [CONTEXT_COMM] = "user.coredump.comm",
                 [CONTEXT_EXE] = "user.coredump.exe",
         };
@@ -247,7 +267,7 @@ static int maybe_remove_external_coredump(const char *filename, uint64_t size) {
 
         /* Returns 1 if might remove, 0 if will not remove, < 0 on error. */
 
-        if (IN_SET(arg_storage, COREDUMP_STORAGE_EXTERNAL, COREDUMP_STORAGE_BOTH) &&
+        if (arg_storage == COREDUMP_STORAGE_EXTERNAL &&
             size <= arg_external_size_max)
                 return 0;
 
@@ -305,7 +325,8 @@ static int save_external_coredump(
                 char **ret_filename,
                 int *ret_node_fd,
                 int *ret_data_fd,
-                uint64_t *ret_size) {
+                uint64_t *ret_size,
+                bool *ret_truncated) {
 
         _cleanup_free_ char *fn = NULL, *tmp = NULL;
         _cleanup_close_ int fd = -1;
@@ -327,14 +348,17 @@ static int save_external_coredump(
         r = safe_atou64(context[CONTEXT_RLIMIT], &rlimit);
         if (r < 0)
                 return log_error_errno(r, "Failed to parse resource limit: %s", context[CONTEXT_RLIMIT]);
-        if (rlimit <= 0) {
-                /* Is coredumping disabled? Then don't bother saving/processing the coredump */
-                log_info("Core Dumping has been disabled for process %s (%s).", context[CONTEXT_PID], context[CONTEXT_COMM]);
+        if (rlimit < page_size()) {
+                /* Is coredumping disabled? Then don't bother saving/processing the coredump.
+                 * Anything below PAGE_SIZE cannot give a readable coredump (the kernel uses
+                 * ELF_EXEC_PAGESIZE which is not easily accessible, but is usually the same as PAGE_SIZE. */
+                log_info("Resource limits disable core dumping for process %s (%s).",
+                         context[CONTEXT_PID], context[CONTEXT_COMM]);
                 return -EBADSLT;
         }
 
         /* Never store more than the process configured, or than we actually shall keep or process */
-        max_size = MIN(rlimit, MAX(arg_process_size_max, arg_external_size_max));
+        max_size = MIN(rlimit, MAX(arg_process_size_max, storage_size_max()));
 
         r = make_filename(context, &fn);
         if (r < 0)
@@ -346,20 +370,21 @@ static int save_external_coredump(
         if (fd < 0)
                 return log_error_errno(fd, "Failed to create temporary file for coredump %s: %m", fn);
 
-        r = copy_bytes(input_fd, fd, max_size, false);
-        if (r == -EFBIG) {
-                log_error("Coredump of %s (%s) is larger than configured processing limit, refusing.", context[CONTEXT_PID], context[CONTEXT_COMM]);
-                goto fail;
-        } else if (IN_SET(r, -EDQUOT, -ENOSPC)) {
-                log_error("Not enough disk space for coredump of %s (%s), refusing.", context[CONTEXT_PID], context[CONTEXT_COMM]);
-                goto fail;
-        } else if (r < 0) {
-                log_error_errno(r, "Failed to dump coredump to file: %m");
+        r = copy_bytes(input_fd, fd, max_size, 0);
+        if (r < 0) {
+                log_error_errno(r, "Cannot store coredump of %s (%s): %m", context[CONTEXT_PID], context[CONTEXT_COMM]);
                 goto fail;
         }
+        *ret_truncated = r == 1;
+        if (*ret_truncated)
+                log_struct(LOG_INFO,
+                           LOG_MESSAGE("Core file was truncated to %zu bytes.", max_size),
+                           "SIZE_LIMIT=%zu", max_size,
+                           "MESSAGE_ID=" SD_MESSAGE_TRUNCATED_CORE_STR,
+                           NULL);
 
         if (fstat(fd, &st) < 0) {
-                log_error_errno(errno, "Failed to fstat coredump %s: %m", coredump_tmpfile_name(tmp));
+                log_error_errno(errno, "Failed to fstat core file %s: %m", coredump_tmpfile_name(tmp));
                 goto fail;
         }
 
@@ -370,8 +395,7 @@ static int save_external_coredump(
 
 #if defined(HAVE_XZ) || defined(HAVE_LZ4)
         /* If we will remove the coredump anyway, do not compress. */
-        if (maybe_remove_external_coredump(NULL, st.st_size) == 0
-            && arg_compress) {
+        if (arg_compress && !maybe_remove_external_coredump(NULL, st.st_size)) {
 
                 _cleanup_free_ char *fn_compressed = NULL, *tmp_compressed = NULL;
                 _cleanup_close_ int fd_compressed = -1;
@@ -558,6 +582,93 @@ static int compose_open_fds(pid_t pid, char **open_fds) {
         return 0;
 }
 
+static int get_process_ns(pid_t pid, const char *namespace, ino_t *ns) {
+        const char *p;
+        struct stat stbuf;
+        _cleanup_close_ int proc_ns_dir_fd;
+
+        p = procfs_file_alloca(pid, "ns");
+
+        proc_ns_dir_fd = open(p, O_DIRECTORY | O_CLOEXEC | O_RDONLY);
+        if (proc_ns_dir_fd < 0)
+                return -errno;
+
+        if (fstatat(proc_ns_dir_fd, namespace, &stbuf, /* flags */0) < 0)
+                return -errno;
+
+        *ns = stbuf.st_ino;
+        return 0;
+}
+
+static int get_mount_namespace_leader(pid_t pid, pid_t *container_pid) {
+        pid_t cpid = pid, ppid = 0;
+        ino_t proc_mntns;
+        int r = 0;
+
+        r = get_process_ns(pid, "mnt", &proc_mntns);
+        if (r < 0)
+                return r;
+
+        for (;;) {
+                ino_t parent_mntns;
+
+                r = get_process_ppid(cpid, &ppid);
+                if (r < 0)
+                        return r;
+
+                r = get_process_ns(ppid, "mnt", &parent_mntns);
+                if (r < 0)
+                        return r;
+
+                if (proc_mntns != parent_mntns)
+                        break;
+
+                if (ppid == 1)
+                        return -ENOENT;
+
+                cpid = ppid;
+        }
+
+        *container_pid = ppid;
+        return 0;
+}
+
+/* Returns 1 if the parent was found.
+ * Returns 0 if there is not a process we can call the pid's
+ * container parent (the pid's process isn't 'containerized').
+ * Returns a negative number on errors.
+ */
+static int get_process_container_parent_cmdline(pid_t pid, char** cmdline) {
+        int r = 0;
+        pid_t container_pid;
+        const char *proc_root_path;
+        struct stat root_stat, proc_root_stat;
+
+        /* To compare inodes of / and /proc/[pid]/root */
+        if (stat("/", &root_stat) < 0)
+                return -errno;
+
+        proc_root_path = procfs_file_alloca(pid, "root");
+        if (stat(proc_root_path, &proc_root_stat) < 0)
+                return -errno;
+
+        /* The process uses system root. */
+        if (proc_root_stat.st_ino == root_stat.st_ino) {
+                *cmdline = NULL;
+                return 0;
+        }
+
+        r = get_mount_namespace_leader(pid, &container_pid);
+        if (r < 0)
+                return r;
+
+        r = get_process_cmdline(container_pid, 0, false, cmdline);
+        if (r < 0)
+                return r;
+
+        return 1;
+}
+
 static int change_uid_gid(const char *context[]) {
         uid_t uid;
         gid_t gid;
@@ -584,6 +695,21 @@ static int change_uid_gid(const char *context[]) {
         return drop_privileges(uid, gid, 0);
 }
 
+static bool is_journald_crash(const char *context[_CONTEXT_MAX]) {
+        assert(context);
+
+        return streq_ptr(context[CONTEXT_UNIT], SPECIAL_JOURNALD_SERVICE);
+}
+
+static bool is_pid1_crash(const char *context[_CONTEXT_MAX]) {
+        assert(context);
+
+        return streq_ptr(context[CONTEXT_UNIT], SPECIAL_INIT_SCOPE) ||
+                streq_ptr(context[CONTEXT_PID], "1");
+}
+
+#define SUBMIT_COREDUMP_FIELDS 4
+
 static int submit_coredump(
                 const char *context[_CONTEXT_MAX],
                 struct iovec *iovec,
@@ -593,19 +719,23 @@ static int submit_coredump(
 
         _cleanup_close_ int coredump_fd = -1, coredump_node_fd = -1;
         _cleanup_free_ char *core_message = NULL, *filename = NULL, *coredump_data = NULL;
-        uint64_t coredump_size;
+        uint64_t coredump_size = UINT64_MAX;
+        bool truncated = false, journald_crash;
         int r;
 
         assert(context);
         assert(iovec);
-        assert(n_iovec_allocated >= n_iovec + 3);
+        assert(n_iovec_allocated >= n_iovec + SUBMIT_COREDUMP_FIELDS);
         assert(input_fd >= 0);
 
+        journald_crash = is_journald_crash(context);
+
         /* Vacuum before we write anything again */
         (void) coredump_vacuum(-1, arg_keep_free, arg_max_use);
 
         /* Always stream the coredump to disk, if that's possible */
-        r = save_external_coredump(context, input_fd, &filename, &coredump_node_fd, &coredump_fd, &coredump_size);
+        r = save_external_coredump(context, input_fd,
+                                   &filename, &coredump_node_fd, &coredump_fd, &coredump_size, &truncated);
         if (r < 0)
                 /* Skip whole core dumping part */
                 goto log;
@@ -620,7 +750,9 @@ static int submit_coredump(
 
                 coredump_filename = strjoina("COREDUMP_FILENAME=", filename);
                 IOVEC_SET_STRING(iovec[n_iovec++], coredump_filename);
-        }
+        } else if (arg_storage == COREDUMP_STORAGE_EXTERNAL)
+                log_info("The core will not be stored: size %"PRIu64" is greater than %"PRIu64" (the configured maximum)",
+                         coredump_size, arg_external_size_max);
 
         /* Vacuum again, but exclude the coredump we just created */
         (void) coredump_vacuum(coredump_node_fd >= 0 ? coredump_node_fd : coredump_fd, arg_keep_free, arg_max_use);
@@ -640,33 +772,60 @@ static int submit_coredump(
 
                 r = coredump_make_stack_trace(coredump_fd, context[CONTEXT_EXE], &stacktrace);
                 if (r >= 0)
-                        core_message = strjoin("MESSAGE=Process ", context[CONTEXT_PID], " (", context[CONTEXT_COMM], ") of user ", context[CONTEXT_UID], " dumped core.\n\n", stacktrace, NULL);
+                        core_message = strjoin("MESSAGE=Process ", context[CONTEXT_PID],
+                                               " (", context[CONTEXT_COMM], ") of user ",
+                                               context[CONTEXT_UID], " dumped core.",
+                                               journald_crash ? "\nCoredump diverted to " : "",
+                                               journald_crash ? filename : "",
+                                               "\n\n", stacktrace);
                 else if (r == -EINVAL)
                         log_warning("Failed to generate stack trace: %s", dwfl_errmsg(dwfl_errno()));
                 else
                         log_warning_errno(r, "Failed to generate stack trace: %m");
-        }
+        } else
+                log_debug("Not generating stack trace: core size %"PRIu64" is greater than %"PRIu64" (the configured maximum)",
+                          coredump_size, arg_process_size_max);
 
         if (!core_message)
 #endif
 log:
-        core_message = strjoin("MESSAGE=Process ", context[CONTEXT_PID], " (", context[CONTEXT_COMM], ") of user ", context[CONTEXT_UID], " dumped core.", NULL);
-        if (core_message)
-                IOVEC_SET_STRING(iovec[n_iovec++], core_message);
+        core_message = strjoin("MESSAGE=Process ", context[CONTEXT_PID],
+                               " (", context[CONTEXT_COMM], ") of user ",
+                               context[CONTEXT_UID], " dumped core.",
+                               journald_crash ? "\nCoredump diverted to " : NULL,
+                               journald_crash ? filename : NULL);
+        if (!core_message)
+                return log_oom();
 
-        /* Optionally store the entire coredump in the journal */
-        if (IN_SET(arg_storage, COREDUMP_STORAGE_JOURNAL, COREDUMP_STORAGE_BOTH) &&
-            coredump_size <= arg_journal_size_max) {
-                size_t sz = 0;
+        if (journald_crash) {
+                /* We cannot log to the journal, so just print the MESSAGE.
+                 * The target was set previously to something safe. */
+                log_dispatch(LOG_ERR, 0, core_message);
+                return 0;
+        }
 
-                /* Store the coredump itself in the journal */
+        IOVEC_SET_STRING(iovec[n_iovec++], core_message);
 
-                r = allocate_journal_field(coredump_fd, (size_t) coredump_size, &coredump_data, &sz);
-                if (r >= 0) {
-                        iovec[n_iovec].iov_base = coredump_data;
-                        iovec[n_iovec].iov_len = sz;
-                        n_iovec++;
-                }
+        if (truncated)
+                IOVEC_SET_STRING(iovec[n_iovec++], "COREDUMP_TRUNCATED=1");
+
+        /* Optionally store the entire coredump in the journal */
+        if (arg_storage == COREDUMP_STORAGE_JOURNAL) {
+                if (coredump_size <= arg_journal_size_max) {
+                        size_t sz = 0;
+
+                        /* Store the coredump itself in the journal */
+
+                        r = allocate_journal_field(coredump_fd, (size_t) coredump_size, &coredump_data, &sz);
+                        if (r >= 0) {
+                                iovec[n_iovec].iov_base = coredump_data;
+                                iovec[n_iovec].iov_len = sz;
+                                n_iovec++;
+                        } else
+                                log_warning_errno(r, "Failed to attach the core to the journal entry: %m");
+                } else
+                        log_info("The core will not be stored: size %"PRIu64" is greater than %"PRIu64" (the configured maximum)",
+                                 coredump_size, arg_journal_size_max);
         }
 
         assert(n_iovec <= n_iovec_allocated);
@@ -678,17 +837,17 @@ log:
         return 0;
 }
 
-static void map_context_fields(const struct iovec *iovec, const char *context[]) {
+static void map_context_fields(const struct iovec *iovec, const charcontext[]) {
 
-        static const char * const context_field_names[_CONTEXT_MAX] = {
+        static const char * const context_field_names[] = {
                 [CONTEXT_PID] = "COREDUMP_PID=",
                 [CONTEXT_UID] = "COREDUMP_UID=",
                 [CONTEXT_GID] = "COREDUMP_GID=",
                 [CONTEXT_SIGNAL] = "COREDUMP_SIGNAL=",
                 [CONTEXT_TIMESTAMP] = "COREDUMP_TIMESTAMP=",
+                [CONTEXT_RLIMIT] = "COREDUMP_RLIMIT=",
                 [CONTEXT_COMM] = "COREDUMP_COMM=",
                 [CONTEXT_EXE] = "COREDUMP_EXE=",
-                [CONTEXT_RLIMIT] = "COREDUMP_RLIMIT=",
         };
 
         unsigned i;
@@ -696,9 +855,12 @@ static void map_context_fields(const struct iovec *iovec, const char *context[])
         assert(iovec);
         assert(context);
 
-        for (i = 0; i < _CONTEXT_MAX; i++) {
+        for (i = 0; i < ELEMENTSOF(context_field_names); i++) {
                 size_t l;
 
+                if (!context_field_names[i])
+                        continue;
+
                 l = strlen(context_field_names[i]);
                 if (iovec->iov_len < l)
                         continue;
@@ -716,7 +878,7 @@ static void map_context_fields(const struct iovec *iovec, const char *context[])
 static int process_socket(int fd) {
         _cleanup_close_ int coredump_fd = -1;
         struct iovec *iovec = NULL;
-        size_t n_iovec = 0, n_iovec_allocated = 0, i;
+        size_t n_iovec = 0, n_allocated = 0, i, k;
         const char *context[_CONTEXT_MAX] = {};
         int r;
 
@@ -726,6 +888,8 @@ static int process_socket(int fd) {
         log_parse_environment();
         log_open();
 
+        log_debug("Processing coredump received on stdin...");
+
         for (;;) {
                 union {
                         struct cmsghdr cmsghdr;
@@ -739,7 +903,7 @@ static int process_socket(int fd) {
                 ssize_t n;
                 ssize_t l;
 
-                if (!GREEDY_REALLOC(iovec, n_iovec_allocated, n_iovec + 3)) {
+                if (!GREEDY_REALLOC(iovec, n_allocated, n_iovec + SUBMIT_COREDUMP_FIELDS)) {
                         r = log_oom();
                         goto finish;
                 }
@@ -803,7 +967,7 @@ static int process_socket(int fd) {
                 n_iovec++;
         }
 
-        if (!GREEDY_REALLOC(iovec, n_iovec_allocated, n_iovec + 3)) {
+        if (!GREEDY_REALLOC(iovec, n_allocated, n_iovec + SUBMIT_COREDUMP_FIELDS)) {
                 r = log_oom();
                 goto finish;
         }
@@ -818,7 +982,14 @@ static int process_socket(int fd) {
         assert(context[CONTEXT_COMM]);
         assert(coredump_fd >= 0);
 
-        r = submit_coredump(context, iovec, n_iovec_allocated, n_iovec, coredump_fd);
+        /* Small quirk: the journal fields contain the timestamp padded with six zeroes, so that the kernel-supplied 1s
+         * granularity timestamps becomes 1µs granularity, i.e. the granularity systemd usually operates in. Since we
+         * are reconstructing the original kernel context, we chop this off again, here. */
+        k = strlen(context[CONTEXT_TIMESTAMP]);
+        if (k > 6)
+                context[CONTEXT_TIMESTAMP] = strndupa(context[CONTEXT_TIMESTAMP], k - 6);
+
+        r = submit_coredump(context, iovec, n_allocated, n_iovec, coredump_fd);
 
 finish:
         for (i = 0; i < n_iovec; i++)
@@ -894,262 +1065,318 @@ static int send_iovec(const struct iovec iovec[], size_t n_iovec, int input_fd)
         return 0;
 }
 
-static int process_special_crash(const char *context[], int input_fd) {
-        _cleanup_close_ int coredump_fd = -1, coredump_node_fd = -1;
-        _cleanup_free_ char *filename = NULL;
-        uint64_t coredump_size;
-        int r;
-
-        assert(context);
-        assert(input_fd >= 0);
-
-        /* If we are pid1 or journald, we cut things short, don't write to the journal, but still create a coredump. */
-
-        if (arg_storage != COREDUMP_STORAGE_NONE)
-                arg_storage = COREDUMP_STORAGE_EXTERNAL;
+static char* set_iovec_field(struct iovec iovec[27], size_t *n_iovec, const char *field, const char *value) {
+        char *x;
 
-        r = save_external_coredump(context, input_fd, &filename, &coredump_node_fd, &coredump_fd, &coredump_size);
-        if (r < 0)
-                return r;
-
-        r = maybe_remove_external_coredump(filename, coredump_size);
-        if (r < 0)
-                return r;
+        x = strappend(field, value);
+        if (x)
+                IOVEC_SET_STRING(iovec[(*n_iovec)++], x);
+        return x;
+}
 
-        log_notice("Detected coredump of the journal daemon or PID 1, diverted to %s.", filename);
+static char* set_iovec_field_free(struct iovec iovec[27], size_t *n_iovec, const char *field, char *value) {
+        char *x;
 
-        return 0;
+        x = set_iovec_field(iovec, n_iovec, field, value);
+        free(value);
+        return x;
 }
 
-static int process_kernel(int argc, char* argv[]) {
+static int gather_pid_metadata(
+                char* context[_CONTEXT_MAX],
+                char **comm_fallback,
+                struct iovec *iovec, size_t *n_iovec) {
+
+        /* We need 26 empty slots in iovec!
+         *
+         * Note that if we fail on oom later on, we do not roll-back changes to the iovec structure. (It remains valid,
+         * with the first n_iovec fields initialized.) */
 
-        /* The small core field we allocate on the stack, to keep things simple */
-        char
-                *core_pid = NULL, *core_uid = NULL, *core_gid = NULL, *core_signal = NULL,
-                *core_session = NULL, *core_exe = NULL, *core_comm = NULL, *core_cmdline = NULL,
-                *core_cgroup = NULL, *core_cwd = NULL, *core_root = NULL, *core_unit = NULL,
-                *core_user_unit = NULL, *core_slice = NULL, *core_timestamp = NULL, *core_rlimit = NULL;
-
-        /* The larger ones we allocate on the heap */
-        _cleanup_free_ char
-                *core_owner_uid = NULL, *core_open_fds = NULL, *core_proc_status = NULL,
-                *core_proc_maps = NULL, *core_proc_limits = NULL, *core_proc_cgroup = NULL, *core_environ = NULL;
-
-        _cleanup_free_ char *exe = NULL, *comm = NULL;
-        const char *context[_CONTEXT_MAX];
-        struct iovec iovec[25];
-        size_t n_iovec = 0;
         uid_t owner_uid;
-        const char *p;
         pid_t pid;
         char *t;
-        int r;
-
-        if (argc < CONTEXT_COMM + 1) {
-                log_error("Not enough arguments passed from kernel (%i, expected %i).", argc - 1, CONTEXT_COMM + 1 - 1);
-                return -EINVAL;
-        }
+        const char *p;
+        int r, signo;
 
-        r = parse_pid(argv[CONTEXT_PID + 1], &pid);
+        r = parse_pid(context[CONTEXT_PID], &pid);
         if (r < 0)
-                return log_error_errno(r, "Failed to parse PID.");
+                return log_error_errno(r, "Failed to parse PID \"%s\": %m", context[CONTEXT_PID]);
 
-        r = get_process_comm(pid, &comm);
+        r = get_process_comm(pid, &context[CONTEXT_COMM]);
         if (r < 0) {
                 log_warning_errno(r, "Failed to get COMM, falling back to the command line: %m");
-                comm = strv_join(argv + CONTEXT_COMM + 1, " ");
-                if (!comm)
+                context[CONTEXT_COMM] = strv_join(comm_fallback, " ");
+                if (!context[CONTEXT_COMM])
                         return log_oom();
         }
 
-        r = get_process_exe(pid, &exe);
+        r = get_process_exe(pid, &context[CONTEXT_EXE]);
         if (r < 0)
                 log_warning_errno(r, "Failed to get EXE, ignoring: %m");
 
-        context[CONTEXT_PID] = argv[CONTEXT_PID + 1];
-        context[CONTEXT_UID] = argv[CONTEXT_UID + 1];
-        context[CONTEXT_GID] = argv[CONTEXT_GID + 1];
-        context[CONTEXT_SIGNAL] = argv[CONTEXT_SIGNAL + 1];
-        context[CONTEXT_TIMESTAMP] = argv[CONTEXT_TIMESTAMP + 1];
-        context[CONTEXT_RLIMIT] = argv[CONTEXT_RLIMIT + 1];
-        context[CONTEXT_COMM] = comm;
-        context[CONTEXT_EXE] = exe;
-
-        if (cg_pid_get_unit(pid, &t) >= 0) {
+        if (cg_pid_get_unit(pid, &context[CONTEXT_UNIT]) >= 0) {
+                if (!is_journald_crash((const char**) context)) {
+                        /* OK, now we know it's not the journal, hence we can make use of it now. */
+                        log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
+                        log_open();
+                }
 
                 /* If this is PID 1 disable coredump collection, we'll unlikely be able to process it later on. */
-                if (streq(t, SPECIAL_INIT_SCOPE)) {
+                if (is_pid1_crash((const char**) context)) {
                         log_notice("Due to PID 1 having crashed coredump collection will now be turned off.");
                         (void) write_string_file("/proc/sys/kernel/core_pattern", "|/bin/false", 0);
                 }
 
-                /* Let's avoid dead-locks when processing journald and init crashes, as socket activation and logging
-                 * are unlikely to work then. */
-                if (STR_IN_SET(t, SPECIAL_JOURNALD_SERVICE, SPECIAL_INIT_SCOPE)) {
-                        free(t);
-                        return process_special_crash(context, STDIN_FILENO);
-                }
-
-                core_unit = strjoina("COREDUMP_UNIT=", t);
-                free(t);
-
-                IOVEC_SET_STRING(iovec[n_iovec++], core_unit);
+                set_iovec_field(iovec, n_iovec, "COREDUMP_UNIT=", context[CONTEXT_UNIT]);
         }
 
-        /* OK, now we know it's not the journal, hence we can make use of it now. */
-        log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
-        log_open();
-
-        if (cg_pid_get_user_unit(pid, &t) >= 0) {
-                core_user_unit = strjoina("COREDUMP_USER_UNIT=", t);
-                free(t);
+        if (cg_pid_get_user_unit(pid, &t) >= 0)
+                set_iovec_field_free(iovec, n_iovec, "COREDUMP_USER_UNIT=", t);
 
-                IOVEC_SET_STRING(iovec[n_iovec++], core_user_unit);
-        }
+        /* The next few are mandatory */
+        if (!set_iovec_field(iovec, n_iovec, "COREDUMP_PID=", context[CONTEXT_PID]))
+                return log_oom();
 
-        core_pid = strjoina("COREDUMP_PID=", context[CONTEXT_PID]);
-        IOVEC_SET_STRING(iovec[n_iovec++], core_pid);
+        if (!set_iovec_field(iovec, n_iovec, "COREDUMP_UID=", context[CONTEXT_UID]))
+                return log_oom();
 
-        core_uid = strjoina("COREDUMP_UID=", context[CONTEXT_UID]);
-        IOVEC_SET_STRING(iovec[n_iovec++], core_uid);
+        if (!set_iovec_field(iovec, n_iovec, "COREDUMP_GID=", context[CONTEXT_GID]))
+                return log_oom();
 
-        core_gid = strjoina("COREDUMP_GID=", context[CONTEXT_GID]);
-        IOVEC_SET_STRING(iovec[n_iovec++], core_gid);
+        if (!set_iovec_field(iovec, n_iovec, "COREDUMP_SIGNAL=", context[CONTEXT_SIGNAL]))
+                return log_oom();
 
-        core_signal = strjoina("COREDUMP_SIGNAL=", context[CONTEXT_SIGNAL]);
-        IOVEC_SET_STRING(iovec[n_iovec++], core_signal);
+        if (!set_iovec_field(iovec, n_iovec, "COREDUMP_RLIMIT=", context[CONTEXT_RLIMIT]))
+                return log_oom();
 
-        core_rlimit = strjoina("COREDUMP_RLIMIT=", context[CONTEXT_RLIMIT]);
-        IOVEC_SET_STRING(iovec[n_iovec++], core_rlimit);
+        if (!set_iovec_field(iovec, n_iovec, "COREDUMP_COMM=", context[CONTEXT_COMM]))
+                return log_oom();
 
-        if (sd_pid_get_session(pid, &t) >= 0) {
-                core_session = strjoina("COREDUMP_SESSION=", t);
-                free(t);
+        if (context[CONTEXT_EXE] &&
+            !set_iovec_field(iovec, n_iovec, "COREDUMP_EXE=", context[CONTEXT_EXE]))
+                return log_oom();
 
-                IOVEC_SET_STRING(iovec[n_iovec++], core_session);
-        }
+        if (sd_pid_get_session(pid, &t) >= 0)
+                set_iovec_field_free(iovec, n_iovec, "COREDUMP_SESSION=", t);
 
         if (sd_pid_get_owner_uid(pid, &owner_uid) >= 0) {
-                r = asprintf(&core_owner_uid, "COREDUMP_OWNER_UID=" UID_FMT, owner_uid);
+                r = asprintf(&t, "COREDUMP_OWNER_UID=" UID_FMT, owner_uid);
                 if (r > 0)
-                        IOVEC_SET_STRING(iovec[n_iovec++], core_owner_uid);
+                        IOVEC_SET_STRING(iovec[(*n_iovec)++], t);
         }
 
-        if (sd_pid_get_slice(pid, &t) >= 0) {
-                core_slice = strjoina("COREDUMP_SLICE=", t);
-                free(t);
+        if (sd_pid_get_slice(pid, &t) >= 0)
+                set_iovec_field_free(iovec, n_iovec, "COREDUMP_SLICE=", t);
 
-                IOVEC_SET_STRING(iovec[n_iovec++], core_slice);
-        }
+        if (get_process_cmdline(pid, 0, false, &t) >= 0)
+                set_iovec_field_free(iovec, n_iovec, "COREDUMP_CMDLINE=", t);
 
-        if (comm) {
-                core_comm = strjoina("COREDUMP_COMM=", comm);
-                IOVEC_SET_STRING(iovec[n_iovec++], core_comm);
-        }
+        if (cg_pid_get_path_shifted(pid, NULL, &t) >= 0)
+                set_iovec_field_free(iovec, n_iovec, "COREDUMP_CGROUP=", t);
 
-        if (exe) {
-                core_exe = strjoina("COREDUMP_EXE=", exe);
-                IOVEC_SET_STRING(iovec[n_iovec++], core_exe);
-        }
+        if (compose_open_fds(pid, &t) >= 0)
+                set_iovec_field_free(iovec, n_iovec, "COREDUMP_OPEN_FDS=", t);
+
+        p = procfs_file_alloca(pid, "status");
+        if (read_full_file(p, &t, NULL) >= 0)
+                set_iovec_field_free(iovec, n_iovec, "COREDUMP_PROC_STATUS=", t);
 
-        if (get_process_cmdline(pid, 0, false, &t) >= 0) {
-                core_cmdline = strjoina("COREDUMP_CMDLINE=", t);
-                free(t);
+        p = procfs_file_alloca(pid, "maps");
+        if (read_full_file(p, &t, NULL) >= 0)
+                set_iovec_field_free(iovec, n_iovec, "COREDUMP_PROC_MAPS=", t);
 
-                IOVEC_SET_STRING(iovec[n_iovec++], core_cmdline);
-        }
+        p = procfs_file_alloca(pid, "limits");
+        if (read_full_file(p, &t, NULL) >= 0)
+                set_iovec_field_free(iovec, n_iovec, "COREDUMP_PROC_LIMITS=", t);
 
-        if (cg_pid_get_path_shifted(pid, NULL, &t) >= 0) {
-                core_cgroup = strjoina("COREDUMP_CGROUP=", t);
-                free(t);
+        p = procfs_file_alloca(pid, "cgroup");
+        if (read_full_file(p, &t, NULL) >=0)
+                set_iovec_field_free(iovec, n_iovec, "COREDUMP_PROC_CGROUP=", t);
 
-                IOVEC_SET_STRING(iovec[n_iovec++], core_cgroup);
-        }
+        p = procfs_file_alloca(pid, "mountinfo");
+        if (read_full_file(p, &t, NULL) >=0)
+                set_iovec_field_free(iovec, n_iovec, "COREDUMP_PROC_MOUNTINFO=", t);
 
-        if (compose_open_fds(pid, &t) >= 0) {
-                core_open_fds = strappend("COREDUMP_OPEN_FDS=", t);
-                free(t);
+        if (get_process_cwd(pid, &t) >= 0)
+                set_iovec_field_free(iovec, n_iovec, "COREDUMP_CWD=", t);
 
-                if (core_open_fds)
-                        IOVEC_SET_STRING(iovec[n_iovec++], core_open_fds);
-        }
+        if (get_process_root(pid, &t) >= 0) {
+                bool proc_self_root_is_slash;
 
-        p = procfs_file_alloca(pid, "status");
-        if (read_full_file(p, &t, NULL) >= 0) {
-                core_proc_status = strappend("COREDUMP_PROC_STATUS=", t);
-                free(t);
+                proc_self_root_is_slash = strcmp(t, "/") == 0;
 
-                if (core_proc_status)
-                        IOVEC_SET_STRING(iovec[n_iovec++], core_proc_status);
+                set_iovec_field_free(iovec, n_iovec, "COREDUMP_ROOT=", t);
+
+                /* If the process' root is "/", then there is a chance it has
+                 * mounted own root and hence being containerized. */
+                if (proc_self_root_is_slash && get_process_container_parent_cmdline(pid, &t) > 0)
+                        set_iovec_field_free(iovec, n_iovec, "COREDUMP_CONTAINER_CMDLINE=", t);
         }
 
-        p = procfs_file_alloca(pid, "maps");
-        if (read_full_file(p, &t, NULL) >= 0) {
-                core_proc_maps = strappend("COREDUMP_PROC_MAPS=", t);
-                free(t);
+        if (get_process_environ(pid, &t) >= 0)
+                set_iovec_field_free(iovec, n_iovec, "COREDUMP_ENVIRON=", t);
 
-                if (core_proc_maps)
-                        IOVEC_SET_STRING(iovec[n_iovec++], core_proc_maps);
-        }
+        t = strjoin("COREDUMP_TIMESTAMP=", context[CONTEXT_TIMESTAMP], "000000", NULL);
+        if (t)
+                IOVEC_SET_STRING(iovec[(*n_iovec)++], t);
 
-        p = procfs_file_alloca(pid, "limits");
-        if (read_full_file(p, &t, NULL) >= 0) {
-                core_proc_limits = strappend("COREDUMP_PROC_LIMITS=", t);
-                free(t);
+        if (safe_atoi(context[CONTEXT_SIGNAL], &signo) >= 0 && SIGNAL_VALID(signo))
+                set_iovec_field(iovec, n_iovec, "COREDUMP_SIGNAL_NAME=SIG", signal_to_string(signo));
 
-                if (core_proc_limits)
-                        IOVEC_SET_STRING(iovec[n_iovec++], core_proc_limits);
-        }
+        return 0; /* we successfully acquired all metadata */
+}
 
-        p = procfs_file_alloca(pid, "cgroup");
-        if (read_full_file(p, &t, NULL) >=0) {
-                core_proc_cgroup = strappend("COREDUMP_PROC_CGROUP=", t);
-                free(t);
+static int process_kernel(int argc, char* argv[]) {
 
-                if (core_proc_cgroup)
-                        IOVEC_SET_STRING(iovec[n_iovec++], core_proc_cgroup);
-        }
+        char* context[_CONTEXT_MAX] = {};
+        struct iovec iovec[28 + SUBMIT_COREDUMP_FIELDS];
+        size_t i, n_iovec, n_to_free = 0;
+        int r;
 
-        if (get_process_cwd(pid, &t) >= 0) {
-                core_cwd = strjoina("COREDUMP_CWD=", t);
-                free(t);
+        log_debug("Processing coredump received from the kernel...");
 
-                IOVEC_SET_STRING(iovec[n_iovec++], core_cwd);
+        if (argc < CONTEXT_COMM + 1) {
+                log_error("Not enough arguments passed by the kernel (%i, expected %i).", argc - 1, CONTEXT_COMM + 1 - 1);
+                return -EINVAL;
         }
 
-        if (get_process_root(pid, &t) >= 0) {
-                core_root = strjoina("COREDUMP_ROOT=", t);
-                free(t);
+        context[CONTEXT_PID]       = argv[1 + CONTEXT_PID];
+        context[CONTEXT_UID]       = argv[1 + CONTEXT_UID];
+        context[CONTEXT_GID]       = argv[1 + CONTEXT_GID];
+        context[CONTEXT_SIGNAL]    = argv[1 + CONTEXT_SIGNAL];
+        context[CONTEXT_TIMESTAMP] = argv[1 + CONTEXT_TIMESTAMP];
+        context[CONTEXT_RLIMIT]    = argv[1 + CONTEXT_RLIMIT];
+
+        r = gather_pid_metadata(context, argv + 1 + CONTEXT_COMM, iovec, &n_to_free);
+        if (r < 0)
+                goto finish;
+
+        n_iovec = n_to_free;
+
+        IOVEC_SET_STRING(iovec[n_iovec++], "MESSAGE_ID=" SD_MESSAGE_COREDUMP_STR);
+
+        assert_cc(2 == LOG_CRIT);
+        IOVEC_SET_STRING(iovec[n_iovec++], "PRIORITY=2");
+
+        assert(n_iovec <= ELEMENTSOF(iovec));
+
+        if (is_journald_crash((const char**) context) || is_pid1_crash((const char**) context))
+                r = submit_coredump((const char**) context,
+                                    iovec, ELEMENTSOF(iovec), n_iovec,
+                                    STDIN_FILENO);
+        else
+                r = send_iovec(iovec, n_iovec, STDIN_FILENO);
+
+ finish:
+        for (i = 0; i < n_to_free; i++)
+                free(iovec[i].iov_base);
+
+        /* Those fields are allocated by gather_pid_metadata */
+        free(context[CONTEXT_COMM]);
+        free(context[CONTEXT_EXE]);
+        free(context[CONTEXT_UNIT]);
 
-                IOVEC_SET_STRING(iovec[n_iovec++], core_root);
+        return r;
+}
+
+static int process_backtrace(int argc, char *argv[]) {
+        char *context[_CONTEXT_MAX] = {};
+        _cleanup_free_ char *message = NULL;
+        _cleanup_free_ struct iovec *iovec = NULL;
+        size_t n_iovec, n_allocated, n_to_free = 0, i;
+        int r;
+        JournalImporter importer = {
+                .fd = STDIN_FILENO,
+        };
+
+        log_debug("Processing backtrace on stdin...");
+
+        if (argc < CONTEXT_COMM + 1) {
+                log_error("Not enough arguments passed (%i, expected %i).", argc - 1, CONTEXT_COMM + 1 - 1);
+                return -EINVAL;
         }
 
-        if (get_process_environ(pid, &t) >= 0) {
-                core_environ = strappend("COREDUMP_ENVIRON=", t);
-                free(t);
+        context[CONTEXT_PID]       = argv[2 + CONTEXT_PID];
+        context[CONTEXT_UID]       = argv[2 + CONTEXT_UID];
+        context[CONTEXT_GID]       = argv[2 + CONTEXT_GID];
+        context[CONTEXT_SIGNAL]    = argv[2 + CONTEXT_SIGNAL];
+        context[CONTEXT_TIMESTAMP] = argv[2 + CONTEXT_TIMESTAMP];
+        context[CONTEXT_RLIMIT]    = argv[2 + CONTEXT_RLIMIT];
+
+        n_allocated = 33 + COREDUMP_STORAGE_EXTERNAL;
+        /* 25 metadata, 2 static, +unknown input, 4 storage, rounded up */
+        iovec = new(struct iovec, n_allocated);
+        if (!iovec)
+                return log_oom();
+
+        r = gather_pid_metadata(context, argv + 2 + CONTEXT_COMM, iovec, &n_to_free);
+        if (r < 0)
+                goto finish;
+        if (r > 0) {
+                /* This was a special crash, and has already been processed. */
+                r = 0;
+                goto finish;
+        }
+        n_iovec = n_to_free;
 
-                if (core_environ)
-                        IOVEC_SET_STRING(iovec[n_iovec++], core_environ);
+        for (;;) {
+                r = journal_importer_process_data(&importer);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to parse journal entry on stdin: %m");
+                        goto finish;
+                }
+                if (r == 1 ||                        /* complete entry */
+                    journal_importer_eof(&importer)) /* end of data */
+                        break;
         }
 
-        core_timestamp = strjoina("COREDUMP_TIMESTAMP=", context[CONTEXT_TIMESTAMP], "000000");
-        IOVEC_SET_STRING(iovec[n_iovec++], core_timestamp);
+        if (!GREEDY_REALLOC(iovec, n_allocated, n_iovec + importer.iovw.count + 2))
+                return log_oom();
+
+        if (journal_importer_eof(&importer)) {
+                log_warning("Did not receive a full journal entry on stdin, ignoring message sent by reporter");
 
-        IOVEC_SET_STRING(iovec[n_iovec++], "MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1");
+                message = strjoin("MESSAGE=Process ", context[CONTEXT_PID],
+                                  " (", context[CONTEXT_COMM], ")"
+                                  " of user ", context[CONTEXT_UID],
+                                  " failed with ", context[CONTEXT_SIGNAL]);
+                if (!message) {
+                        r = log_oom();
+                        goto finish;
+                }
+                IOVEC_SET_STRING(iovec[n_iovec++], message);
+        } else {
+                for (i = 0; i < importer.iovw.count; i++)
+                        iovec[n_iovec++] = importer.iovw.iovec[i];
+        }
 
+        IOVEC_SET_STRING(iovec[n_iovec++], "MESSAGE_ID=" SD_MESSAGE_BACKTRACE_STR);
         assert_cc(2 == LOG_CRIT);
         IOVEC_SET_STRING(iovec[n_iovec++], "PRIORITY=2");
 
-        assert(n_iovec <= ELEMENTSOF(iovec));
+        assert(n_iovec <= n_allocated);
+
+        r = sd_journal_sendv(iovec, n_iovec);
+        if (r < 0)
+                log_error_errno(r, "Failed to log backtrace: %m");
 
-        return send_iovec(iovec, n_iovec, STDIN_FILENO);
+ finish:
+        for (i = 0; i < n_to_free; i++)
+                free(iovec[i].iov_base);
+
+        /* Those fields are allocated by gather_pid_metadata */
+        free(context[CONTEXT_COMM]);
+        free(context[CONTEXT_EXE]);
+        free(context[CONTEXT_UNIT]);
+
+        return r;
 }
 
 int main(int argc, char *argv[]) {
         int r;
 
-        /* First, log to a safe place, since we don't know what crashed and it might be journald which we'd rather not
-         * log to then. */
+        /* First, log to a safe place, since we don't know what crashed and it might
+         * be journald which we'd rather not log to then. */
 
         log_set_target(LOG_TARGET_KMSG);
         log_open();
@@ -1169,11 +1396,14 @@ int main(int argc, char *argv[]) {
                 goto finish;
         }
 
-        /* If we got an fd passed, we are running in coredumpd mode. Otherwise we are invoked from the kernel as
-         * coredump handler */
-        if (r == 0)
-                r = process_kernel(argc, argv);
-        else if (r == 1)
+        /* If we got an fd passed, we are running in coredumpd mode. Otherwise we
+         * are invoked from the kernel as coredump handler. */
+        if (r == 0) {
+                if (streq_ptr(argv[1], "--backtrace"))
+                        r = process_backtrace(argc, argv);
+                else
+                        r = process_kernel(argc, argv);
+        } else if (r == 1)
                 r = process_socket(SD_LISTEN_FDS_START);
         else {
                 log_error("Received unexpected number of file descriptors.");
index 27b1e0f..114a13f 100644 (file)
 #include <string.h>
 #include <unistd.h>
 
+#include "sd-bus.h"
 #include "sd-journal.h"
+#include "sd-messages.h"
 
 #include "alloc-util.h"
+#include "bus-error.h"
+#include "bus-util.h"
 #include "compress.h"
 #include "fd-util.h"
 #include "fileio.h"
+#include "fs-util.h"
 #include "journal-internal.h"
+#include "journal-util.h"
 #include "log.h"
 #include "macro.h"
 #include "pager.h"
 #include "parse-util.h"
 #include "path-util.h"
 #include "process-util.h"
-#include "set.h"
 #include "sigbus.h"
 #include "signal-util.h"
 #include "string-util.h"
+#include "strv.h"
 #include "terminal-util.h"
 #include "user-util.h"
 #include "util.h"
 
+#define SHORT_BUS_CALL_TIMEOUT_USEC (3 * USEC_PER_SEC)
+
+static usec_t arg_since = USEC_INFINITY, arg_until = USEC_INFINITY;
+
 static enum {
         ACTION_NONE,
         ACTION_INFO,
@@ -58,36 +68,11 @@ static bool arg_no_pager = false;
 static int arg_no_legend = false;
 static int arg_one = false;
 static FILE* arg_output = NULL;
+static bool arg_reverse = false;
+static char** arg_matches = NULL;
+static bool arg_quiet = false;
 
-static Set *new_matches(void) {
-        Set *set;
-        char *tmp;
-        int r;
-
-        set = set_new(NULL);
-        if (!set) {
-                log_oom();
-                return NULL;
-        }
-
-        tmp = strdup("MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1");
-        if (!tmp) {
-                log_oom();
-                set_free(set);
-                return NULL;
-        }
-
-        r = set_consume(set, tmp);
-        if (r < 0) {
-                log_error_errno(r, "failed to add to set: %m");
-                set_free(set);
-                return NULL;
-        }
-
-        return set;
-}
-
-static int add_match(Set *set, const char *match) {
+static int add_match(sd_journal *j, const char *match) {
         _cleanup_free_ char *p = NULL;
         char *pattern = NULL;
         const char* prefix;
@@ -99,7 +84,8 @@ static int add_match(Set *set, const char *match) {
         else if (strchr(match, '/')) {
                 r = path_make_absolute_cwd(match, &p);
                 if (r < 0)
-                        goto fail;
+                        return log_error_errno(r, "path_make_absolute_cwd(\"%s\"): %m", match);
+
                 match = p;
                 prefix = "COREDUMP_EXE=";
         } else if (parse_pid(match, &pid) >= 0)
@@ -107,20 +93,36 @@ static int add_match(Set *set, const char *match) {
         else
                 prefix = "COREDUMP_COMM=";
 
-        pattern = strjoin(prefix, match, NULL);
-        if (!pattern) {
-                r = -ENOMEM;
-                goto fail;
-        }
+        pattern = strjoin(prefix, match);
+        if (!pattern)
+                return log_oom();
+
+        log_debug("Adding match: %s", pattern);
+        r = sd_journal_add_match(j, pattern, 0);
+        if (r < 0)
+                return log_error_errno(r, "Failed to add match \"%s\": %m", match);
+        return 0;
+}
 
-        log_debug("Adding pattern: %s", pattern);
-        r = set_consume(set, pattern);
+static int add_matches(sd_journal *j) {
+        char **match;
+        int r;
+
+        r = sd_journal_add_match(j, "MESSAGE_ID=" SD_MESSAGE_COREDUMP_STR, 0);
         if (r < 0)
-                goto fail;
+                return log_error_errno(r, "Failed to add match \"%s\": %m", "MESSAGE_ID=" SD_MESSAGE_COREDUMP_STR);
+
+        r = sd_journal_add_match(j, "MESSAGE_ID=" SD_MESSAGE_BACKTRACE_STR, 0);
+        if (r < 0)
+                return log_error_errno(r, "Failed to add match \"%s\": %m", "MESSAGE_ID=" SD_MESSAGE_BACKTRACE_STR);
+
+        STRV_FOREACH(match, arg_matches) {
+                r = add_match(j, *match);
+                if (r < 0)
+                        return r;
+        }
 
         return 0;
-fail:
-        return log_error_errno(r, "Failed to add match: %m");
 }
 
 static void help(void) {
@@ -132,10 +134,13 @@ static void help(void) {
                "     --no-pager      Do not pipe output into a pager\n"
                "     --no-legend     Do not print the column headers.\n"
                "  -1                 Show information about most recent entry only\n"
+               "  -S --since=DATE    Only print coredumps since the date\n"
+               "  -U --until=DATE    Only print coredumps until the date\n"
+               "  -r --reverse       Show the newest entries first\n"
                "  -F --field=FIELD   List all values a certain field takes\n"
-               "  -o --output=FILE   Write output to FILE\n\n"
+               "  -o --output=FILE   Write output to FILE\n"
                "  -D --directory=DIR Use journal files from directory\n\n"
-
+               "  -q --quiet         Do not show info messages and privilege warning\n"
                "Commands:\n"
                "  list [MATCHES...]  List available coredumps (default)\n"
                "  info [MATCHES...]  Show detailed information about one or more coredumps\n"
@@ -144,14 +149,14 @@ static void help(void) {
                , program_invocation_short_name);
 }
 
-static int parse_argv(int argc, char *argv[], Set *matches) {
+static int parse_argv(int argc, char *argv[]) {
         enum {
                 ARG_VERSION = 0x100,
                 ARG_NO_PAGER,
                 ARG_NO_LEGEND,
         };
 
-        int r, c;
+        int c, r;
 
         static const struct option options[] = {
                 { "help",         no_argument,       NULL, 'h'           },
@@ -161,15 +166,18 @@ static int parse_argv(int argc, char *argv[], Set *matches) {
                 { "output",       required_argument, NULL, 'o'           },
                 { "field",        required_argument, NULL, 'F'           },
                 { "directory",    required_argument, NULL, 'D'           },
+                { "reverse",      no_argument,       NULL, 'r'           },
+                { "since",        required_argument, NULL, 'S'           },
+                { "until",        required_argument, NULL, 'U'           },
+                { "quiet",        no_argument,       NULL, 'q'           },
                 {}
         };
 
         assert(argc >= 0);
         assert(argv);
 
-        while ((c = getopt_long(argc, argv, "ho:F:1D:", options, NULL)) >= 0)
+        while ((c = getopt_long(argc, argv, "ho:F:1D:rS:U:q", options, NULL)) >= 0)
                 switch(c) {
-
                 case 'h':
                         arg_action = ACTION_NONE;
                         help();
@@ -199,6 +207,18 @@ static int parse_argv(int argc, char *argv[], Set *matches) {
 
                         break;
 
+                case 'S':
+                        r = parse_timestamp(optarg, &arg_since);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse timestamp: %s", optarg);
+                        break;
+
+                case 'U':
+                        r = parse_timestamp(optarg, &arg_until);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse timestamp: %s", optarg);
+                        break;
+
                 case 'F':
                         if (arg_field) {
                                 log_error("cannot use --field/-F more than once");
@@ -215,6 +235,14 @@ static int parse_argv(int argc, char *argv[], Set *matches) {
                         arg_directory = optarg;
                         break;
 
+                case 'r':
+                        arg_reverse = true;
+                        break;
+
+                case 'q':
+                        arg_quiet = true;
+                        break;
+
                 case '?':
                         return -EINVAL;
 
@@ -222,6 +250,12 @@ static int parse_argv(int argc, char *argv[], Set *matches) {
                         assert_not_reached("Unhandled option");
                 }
 
+        if (arg_since != USEC_INFINITY && arg_until != USEC_INFINITY &&
+            arg_since > arg_until) {
+                log_error("--since= must be before --until=.");
+                return -EINVAL;
+        }
+
         if (optind < argc) {
                 const char *cmd = argv[optind++];
                 if (streq(cmd, "list"))
@@ -243,12 +277,8 @@ static int parse_argv(int argc, char *argv[], Set *matches) {
                 return -EINVAL;
         }
 
-        while (optind < argc) {
-                r = add_match(matches, argv[optind]);
-                if (r != 0)
-                        return r;
-                optind++;
-        }
+        if (optind < argc)
+                arg_matches = argv + optind;
 
         return 0;
 }
@@ -279,11 +309,10 @@ static int retrieve(const void *data,
         free(*var);
         *var = v;
 
-        return 0;
+        return 1;
 }
 
-static void print_field(FILE* file, sd_journal *j) {
-        _cleanup_free_ char *value = NULL;
+static int print_field(FILE* file, sd_journal *j) {
         const void *d;
         size_t l;
 
@@ -292,37 +321,62 @@ static void print_field(FILE* file, sd_journal *j) {
 
         assert(arg_field);
 
-        SD_JOURNAL_FOREACH_DATA(j, d, l)
-                retrieve(d, l, arg_field, &value);
+        /* A (user-specified) field may appear more than once for a given entry.
+         * We will print all of the occurences.
+         * This is different below for fields that systemd-coredump uses,
+         * because they cannot meaningfully appear more than once.
+         */
+        SD_JOURNAL_FOREACH_DATA(j, d, l) {
+                _cleanup_free_ char *value = NULL;
+                int r;
+
+                r = retrieve(d, l, arg_field, &value);
+                if (r < 0)
+                        return r;
+                if (r > 0)
+                        fprintf(file, "%s\n", value);
+        }
 
-        if (value)
-                fprintf(file, "%s\n", value);
+        return 0;
 }
 
+#define RETRIEVE(d, l, name, arg)                    \
+        {                                            \
+                int _r = retrieve(d, l, name, &arg); \
+                if (_r < 0)                          \
+                        return _r;                   \
+                if (_r > 0)                          \
+                        continue;                    \
+        }
+
 static int print_list(FILE* file, sd_journal *j, int had_legend) {
         _cleanup_free_ char
-                *pid = NULL, *uid = NULL, *gid = NULL,
+                *mid = NULL, *pid = NULL, *uid = NULL, *gid = NULL,
                 *sgnl = NULL, *exe = NULL, *comm = NULL, *cmdline = NULL,
-                *filename = NULL;
+                *filename = NULL, *truncated = NULL, *coredump = NULL;
         const void *d;
         size_t l;
         usec_t t;
         char buf[FORMAT_TIMESTAMP_MAX];
         int r;
-        bool present;
+        const char *present;
+        bool normal_coredump;
 
         assert(file);
         assert(j);
 
         SD_JOURNAL_FOREACH_DATA(j, d, l) {
-                retrieve(d, l, "COREDUMP_PID", &pid);
-                retrieve(d, l, "COREDUMP_UID", &uid);
-                retrieve(d, l, "COREDUMP_GID", &gid);
-                retrieve(d, l, "COREDUMP_SIGNAL", &sgnl);
-                retrieve(d, l, "COREDUMP_EXE", &exe);
-                retrieve(d, l, "COREDUMP_COMM", &comm);
-                retrieve(d, l, "COREDUMP_CMDLINE", &cmdline);
-                retrieve(d, l, "COREDUMP_FILENAME", &filename);
+                RETRIEVE(d, l, "MESSAGE_ID", mid);
+                RETRIEVE(d, l, "COREDUMP_PID", pid);
+                RETRIEVE(d, l, "COREDUMP_UID", uid);
+                RETRIEVE(d, l, "COREDUMP_GID", gid);
+                RETRIEVE(d, l, "COREDUMP_SIGNAL", sgnl);
+                RETRIEVE(d, l, "COREDUMP_EXE", exe);
+                RETRIEVE(d, l, "COREDUMP_COMM", comm);
+                RETRIEVE(d, l, "COREDUMP_CMDLINE", cmdline);
+                RETRIEVE(d, l, "COREDUMP_FILENAME", filename);
+                RETRIEVE(d, l, "COREDUMP_TRUNCATED", truncated);
+                RETRIEVE(d, l, "COREDUMP", coredump);
         }
 
         if (!pid && !uid && !gid && !sgnl && !exe && !comm && !cmdline && !filename) {
@@ -335,25 +389,43 @@ static int print_list(FILE* file, sd_journal *j, int had_legend) {
                 return log_error_errno(r, "Failed to get realtime timestamp: %m");
 
         format_timestamp(buf, sizeof(buf), t);
-        present = filename && access(filename, F_OK) == 0;
 
         if (!had_legend && !arg_no_legend)
-                fprintf(file, "%-*s %*s %*s %*s %*s %*s %s\n",
+                fprintf(file, "%-*s %*s %*s %*s %*s %-*s %s\n",
                         FORMAT_TIMESTAMP_WIDTH, "TIME",
                         6, "PID",
                         5, "UID",
                         5, "GID",
                         3, "SIG",
-                        1, "PRESENT",
+                        9, "COREFILE",
                            "EXE");
 
-        fprintf(file, "%-*s %*s %*s %*s %*s %*s %s\n",
+        normal_coredump = streq_ptr(mid, SD_MESSAGE_COREDUMP_STR);
+
+        if (filename)
+                if (access(filename, R_OK) == 0)
+                        present = "present";
+                else if (errno == ENOENT)
+                        present = "missing";
+                else
+                        present = "error";
+        else if (coredump)
+                present = "journal";
+        else if (normal_coredump)
+                present = "none";
+        else
+                present = "-";
+
+        if (STR_IN_SET(present, "present", "journal") && truncated && parse_boolean(truncated) > 0)
+                present = "truncated";
+
+        fprintf(file, "%-*s %*s %*s %*s %*s %-*s %s\n",
                 FORMAT_TIMESTAMP_WIDTH, buf,
                 6, strna(pid),
                 5, strna(uid),
                 5, strna(gid),
-                3, strna(sgnl),
-                1, present ? "*" : "",
+                3, normal_coredump ? strna(sgnl) : "-",
+                9, present,
                 strna(exe ?: (comm ?: cmdline)));
 
         return 0;
@@ -361,44 +433,51 @@ static int print_list(FILE* file, sd_journal *j, int had_legend) {
 
 static int print_info(FILE *file, sd_journal *j, bool need_space) {
         _cleanup_free_ char
-                *pid = NULL, *uid = NULL, *gid = NULL,
+                *mid = NULL, *pid = NULL, *uid = NULL, *gid = NULL,
                 *sgnl = NULL, *exe = NULL, *comm = NULL, *cmdline = NULL,
                 *unit = NULL, *user_unit = NULL, *session = NULL,
                 *boot_id = NULL, *machine_id = NULL, *hostname = NULL,
                 *slice = NULL, *cgroup = NULL, *owner_uid = NULL,
-                *message = NULL, *timestamp = NULL, *filename = NULL;
+                *message = NULL, *timestamp = NULL, *filename = NULL,
+                *truncated = NULL, *coredump = NULL;
         const void *d;
         size_t l;
+        bool normal_coredump;
         int r;
 
         assert(file);
         assert(j);
 
         SD_JOURNAL_FOREACH_DATA(j, d, l) {
-                retrieve(d, l, "COREDUMP_PID", &pid);
-                retrieve(d, l, "COREDUMP_UID", &uid);
-                retrieve(d, l, "COREDUMP_GID", &gid);
-                retrieve(d, l, "COREDUMP_SIGNAL", &sgnl);
-                retrieve(d, l, "COREDUMP_EXE", &exe);
-                retrieve(d, l, "COREDUMP_COMM", &comm);
-                retrieve(d, l, "COREDUMP_CMDLINE", &cmdline);
-                retrieve(d, l, "COREDUMP_UNIT", &unit);
-                retrieve(d, l, "COREDUMP_USER_UNIT", &user_unit);
-                retrieve(d, l, "COREDUMP_SESSION", &session);
-                retrieve(d, l, "COREDUMP_OWNER_UID", &owner_uid);
-                retrieve(d, l, "COREDUMP_SLICE", &slice);
-                retrieve(d, l, "COREDUMP_CGROUP", &cgroup);
-                retrieve(d, l, "COREDUMP_TIMESTAMP", &timestamp);
-                retrieve(d, l, "COREDUMP_FILENAME", &filename);
-                retrieve(d, l, "_BOOT_ID", &boot_id);
-                retrieve(d, l, "_MACHINE_ID", &machine_id);
-                retrieve(d, l, "_HOSTNAME", &hostname);
-                retrieve(d, l, "MESSAGE", &message);
+                RETRIEVE(d, l, "MESSAGE_ID", mid);
+                RETRIEVE(d, l, "COREDUMP_PID", pid);
+                RETRIEVE(d, l, "COREDUMP_UID", uid);
+                RETRIEVE(d, l, "COREDUMP_GID", gid);
+                RETRIEVE(d, l, "COREDUMP_SIGNAL", sgnl);
+                RETRIEVE(d, l, "COREDUMP_EXE", exe);
+                RETRIEVE(d, l, "COREDUMP_COMM", comm);
+                RETRIEVE(d, l, "COREDUMP_CMDLINE", cmdline);
+                RETRIEVE(d, l, "COREDUMP_UNIT", unit);
+                RETRIEVE(d, l, "COREDUMP_USER_UNIT", user_unit);
+                RETRIEVE(d, l, "COREDUMP_SESSION", session);
+                RETRIEVE(d, l, "COREDUMP_OWNER_UID", owner_uid);
+                RETRIEVE(d, l, "COREDUMP_SLICE", slice);
+                RETRIEVE(d, l, "COREDUMP_CGROUP", cgroup);
+                RETRIEVE(d, l, "COREDUMP_TIMESTAMP", timestamp);
+                RETRIEVE(d, l, "COREDUMP_FILENAME", filename);
+                RETRIEVE(d, l, "COREDUMP_TRUNCATED", truncated);
+                RETRIEVE(d, l, "COREDUMP", coredump);
+                RETRIEVE(d, l, "_BOOT_ID", boot_id);
+                RETRIEVE(d, l, "_MACHINE_ID", machine_id);
+                RETRIEVE(d, l, "_HOSTNAME", hostname);
+                RETRIEVE(d, l, "MESSAGE", message);
         }
 
         if (need_space)
                 fputs("\n", file);
 
+        normal_coredump = streq_ptr(mid, SD_MESSAGE_COREDUMP_STR);
+
         if (comm)
                 fprintf(file,
                         "           PID: %s%s%s (%s)\n",
@@ -444,11 +523,12 @@ static int print_info(FILE *file, sd_journal *j, bool need_space) {
 
         if (sgnl) {
                 int sig;
+                const char *name = normal_coredump ? "Signal" : "Reason";
 
-                if (safe_atoi(sgnl, &sig) >= 0)
-                        fprintf(file, "        Signal: %s (%s)\n", sgnl, signal_to_string(sig));
+                if (normal_coredump && safe_atoi(sgnl, &sig) >= 0)
+                        fprintf(file, "        %s: %s (%s)\n", name, sgnl, signal_to_string(sig));
                 else
-                        fprintf(file, "        Signal: %s\n", sgnl);
+                        fprintf(file, "        %s: %s\n", name, sgnl);
         }
 
         if (timestamp) {
@@ -476,7 +556,7 @@ static int print_info(FILE *file, sd_journal *j, bool need_space) {
         if (unit)
                 fprintf(file, "          Unit: %s\n", unit);
         if (user_unit)
-                fprintf(file, "     User Unit: %s\n", unit);
+                fprintf(file, "     User Unit: %s\n", user_unit);
         if (slice)
                 fprintf(file, "         Slice: %s\n", slice);
         if (session)
@@ -504,8 +584,28 @@ static int print_info(FILE *file, sd_journal *j, bool need_space) {
         if (hostname)
                 fprintf(file, "      Hostname: %s\n", hostname);
 
-        if (filename && access(filename, F_OK) == 0)
-                fprintf(file, "      Coredump: %s\n", filename);
+        if (filename) {
+                bool inacc, trunc;
+
+                inacc = access(filename, R_OK) < 0;
+                trunc = truncated && parse_boolean(truncated) > 0;
+
+                if (inacc || trunc)
+                        fprintf(file, "       Storage: %s%s (%s%s%s)%s\n",
+                                ansi_highlight_red(),
+                                filename,
+                                inacc ? "inaccessible" : "",
+                                inacc && trunc ? ", " : "",
+                                trunc ? "truncated" : "",
+                                ansi_normal());
+                else
+                        fprintf(file, "       Storage: %s\n", filename);
+        }
+
+        else if (coredump)
+                fprintf(file, "       Storage: journal\n");
+        else
+                fprintf(file, "       Storage: none\n");
 
         if (message) {
                 _cleanup_free_ char *m = NULL;
@@ -533,15 +633,15 @@ static int focus(sd_journal *j) {
         return r;
 }
 
-static void print_entry(sd_journal *j, unsigned n_found) {
+static int print_entry(sd_journal *j, unsigned n_found) {
         assert(j);
 
         if (arg_action == ACTION_INFO)
-                print_info(stdout, j, n_found);
+                return print_info(stdout, j, n_found);
         else if (arg_field)
-                print_field(stdout, j);
+                return print_field(stdout, j);
         else
-                print_list(stdout, j, n_found);
+                return print_list(stdout, j, n_found);
 }
 
 static int dump_list(sd_journal *j) {
@@ -560,13 +660,59 @@ static int dump_list(sd_journal *j) {
                 if (r < 0)
                         return r;
 
-                print_entry(j, 0);
+                return print_entry(j, 0);
         } else {
-                SD_JOURNAL_FOREACH(j)
-                        print_entry(j, n_found++);
+                if (arg_since != USEC_INFINITY && !arg_reverse)
+                        r = sd_journal_seek_realtime_usec(j, arg_since);
+                else if (arg_until != USEC_INFINITY && arg_reverse)
+                        r = sd_journal_seek_realtime_usec(j, arg_until);
+                else if (arg_reverse)
+                        r = sd_journal_seek_tail(j);
+                else
+                        r = sd_journal_seek_head(j);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to seek to date: %m");
+
+                for (;;) {
+                        if (!arg_reverse)
+                                r = sd_journal_next(j);
+                        else
+                                r = sd_journal_previous(j);
+
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to iterate through journal: %m");
+
+                        if (r == 0)
+                                break;
+
+                        if (arg_until != USEC_INFINITY && !arg_reverse) {
+                                usec_t usec;
+
+                                r = sd_journal_get_realtime_usec(j, &usec);
+                                if (r < 0)
+                                        return log_error_errno(r, "Failed to determine timestamp: %m");
+                                if (usec > arg_until)
+                                        continue;
+                        }
+
+                        if (arg_since != USEC_INFINITY && arg_reverse) {
+                                usec_t usec;
+
+                                r = sd_journal_get_realtime_usec(j, &usec);
+                                if (r < 0)
+                                        return log_error_errno(r, "Failed to determine timestamp: %m");
+                                if (usec < arg_since)
+                                        continue;
+                        }
+
+                        r = print_entry(j, n_found++);
+                        if (r < 0)
+                                return r;
+                }
 
                 if (!arg_field && n_found <= 0) {
-                        log_notice("No coredumps found.");
+                        if (!arg_quiet)
+                                log_notice("No coredumps found.");
                         return -ESRCH;
                 }
         }
@@ -574,116 +720,142 @@ static int dump_list(sd_journal *j) {
         return 0;
 }
 
-static int save_core(sd_journal *j, int fd, char **path, bool *unlink_temp) {
+static int save_core(sd_journal *j, FILE *file, char **path, bool *unlink_temp) {
         const char *data;
         _cleanup_free_ char *filename = NULL;
         size_t len;
-        int r;
+        int r, fd;
+        _cleanup_close_ int fdt = -1;
+        char *temp = NULL;
 
-        assert((fd >= 0) != !!path);
-        assert(!!path == !!unlink_temp);
+        assert(!(file && path));         /* At most one can be specified */
+        assert(!!path == !!unlink_temp); /* Those must be specified together */
 
-        /* Prefer uncompressed file to journal (probably cached) to
-         * compressed file (probably uncached). */
+        /* Look for a coredump on disk first. */
         r = sd_journal_get_data(j, "COREDUMP_FILENAME", (const void**) &data, &len);
-        if (r < 0 && r != -ENOENT)
-                log_warning_errno(r, "Failed to retrieve COREDUMP_FILENAME: %m");
-        else if (r == 0)
+        if (r == 0)
                 retrieve(data, len, "COREDUMP_FILENAME", &filename);
+        else {
+                if (r != -ENOENT)
+                        return log_error_errno(r, "Failed to retrieve COREDUMP_FILENAME field: %m");
+                /* Check that we can have a COREDUMP field. We still haven't set a high
+                 * data threshold, so we'll get a few kilobytes at most.
+                 */
 
-        if (filename && access(filename, R_OK) < 0) {
-                log_full(errno == ENOENT ? LOG_DEBUG : LOG_WARNING,
-                         "File %s is not readable: %m", filename);
-                filename = mfree(filename);
+                r = sd_journal_get_data(j, "COREDUMP", (const void**) &data, &len);
+                if (r == -ENOENT)
+                        return log_error_errno(r, "Coredump entry has no core attached (neither internally in the journal nor externally on disk).");
+                if (r < 0)
+                        return log_error_errno(r, "Failed to retrieve COREDUMP field: %m");
         }
 
-        if (filename && !endswith(filename, ".xz") && !endswith(filename, ".lz4")) {
-                if (path) {
+        if (filename) {
+                if (access(filename, R_OK) < 0)
+                        return log_error_errno(errno, "File \"%s\" is not readable: %m", filename);
+
+                if (path && !endswith(filename, ".xz") && !endswith(filename, ".lz4")) {
                         *path = filename;
                         filename = NULL;
+
+                        return 0;
                 }
+        }
 
-                return 0;
-        } else {
-                _cleanup_close_ int fdt = -1;
-                char *temp = NULL;
+        if (path) {
+                const char *vt;
+
+                /* Create a temporary file to write the uncompressed core to. */
+
+                r = var_tmp_dir(&vt);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to acquire temporary directory path: %m");
 
-                if (fd < 0) {
-                        temp = strdup("/var/tmp/coredump-XXXXXX");
-                        if (!temp)
-                                return log_oom();
+                temp = strjoin(vt, "/coredump-XXXXXX");
+                if (!temp)
+                        return log_oom();
 
-                        fdt = mkostemp_safe(temp, O_WRONLY|O_CLOEXEC);
-                        if (fdt < 0)
-                                return log_error_errno(fdt, "Failed to create temporary file: %m");
-                        log_debug("Created temporary file %s", temp);
+                fdt = mkostemp_safe(temp);
+                if (fdt < 0)
+                        return log_error_errno(fdt, "Failed to create temporary file: %m");
+                log_debug("Created temporary file %s", temp);
 
-                        fd = fdt;
+                fd = fdt;
+        } else {
+                /* If neither path or file are specified, we will write to stdout. Let's now check
+                 * if stdout is connected to a tty. We checked that the file exists, or that the
+                 * core might be stored in the journal. In this second case, if we found the entry,
+                 * in all likelyhood we will be able to access the COREDUMP= field.  In either case,
+                 * we stop before doing any "real" work, i.e. before starting decompression or
+                 * reading from the file or creating temporary files.
+                 */
+                if (!file) {
+                        if (on_tty())
+                                return log_error_errno(ENOTTY, "Refusing to dump core to tty"
+                                                       " (use shell redirection or specify --output).");
+                        file = stdout;
                 }
 
-                r = sd_journal_get_data(j, "COREDUMP", (const void**) &data, &len);
-                if (r == 0) {
-                        ssize_t sz;
-
-                        assert(len >= 9);
-                        data += 9;
-                        len -= 9;
-
-                        sz = write(fdt, data, len);
-                        if (sz < 0) {
-                                r = log_error_errno(errno,
-                                                    "Failed to write temporary file: %m");
-                                goto error;
-                        }
-                        if (sz != (ssize_t) len) {
-                                log_error("Short write to temporary file.");
-                                r = -EIO;
-                                goto error;
-                        }
-                } else if (filename) {
+                fd = fileno(file);
+        }
+
+        if (filename) {
 #if defined(HAVE_XZ) || defined(HAVE_LZ4)
-                        _cleanup_close_ int fdf;
-
-                        fdf = open(filename, O_RDONLY | O_CLOEXEC);
-                        if (fdf < 0) {
-                                r = log_error_errno(errno,
-                                                    "Failed to open %s: %m",
-                                                    filename);
-                                goto error;
-                        }
+                _cleanup_close_ int fdf;
 
-                        r = decompress_stream(filename, fdf, fd, -1);
-                        if (r < 0) {
-                                log_error_errno(r, "Failed to decompress %s: %m", filename);
-                                goto error;
-                        }
-#else
-                        log_error("Cannot decompress file. Compiled without compression support.");
-                        r = -EOPNOTSUPP;
+                fdf = open(filename, O_RDONLY | O_CLOEXEC);
+                if (fdf < 0) {
+                        r = log_error_errno(errno, "Failed to open %s: %m", filename);
                         goto error;
-#endif
-                } else {
-                        if (r == -ENOENT)
-                                log_error("Cannot retrieve coredump from journal or disk.");
-                        else
-                                log_error_errno(r, "Failed to retrieve COREDUMP field: %m");
+                }
+
+                r = decompress_stream(filename, fdf, fd, -1);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to decompress %s: %m", filename);
                         goto error;
                 }
+#else
+                log_error("Cannot decompress file. Compiled without compression support.");
+                r = -EOPNOTSUPP;
+                goto error;
+#endif
+        } else {
+                ssize_t sz;
+
+                /* We want full data, nothing truncated. */
+                sd_journal_set_data_threshold(j, 0);
 
-                if (temp) {
-                        *path = temp;
-                        *unlink_temp = true;
+                r = sd_journal_get_data(j, "COREDUMP", (const void**) &data, &len);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to retrieve COREDUMP field: %m");
+
+                assert(len >= 9);
+                data += 9;
+                len -= 9;
+
+                sz = write(fd, data, len);
+                if (sz < 0) {
+                        r = log_error_errno(errno, "Failed to write output: %m");
+                        goto error;
                 }
+                if (sz != (ssize_t) len) {
+                        log_error("Short write to output.");
+                        r = -EIO;
+                        goto error;
+                }
+        }
 
-                return 0;
+        if (temp) {
+                *path = temp;
+                *unlink_temp = true;
+        }
+        return 0;
 
 error:
-                if (temp) {
-                        unlink(temp);
-                        log_debug("Removed temporary file %s", temp);
-                }
-                return r;
+        if (temp) {
+                unlink(temp);
+                log_debug("Removed temporary file %s", temp);
         }
+        return r;
 }
 
 static int dump_core(sd_journal* j) {
@@ -697,18 +869,13 @@ static int dump_core(sd_journal* j) {
 
         print_info(arg_output ? stdout : stderr, j, false);
 
-        if (on_tty() && !arg_output) {
-                log_error("Refusing to dump core to tty.");
-                return -ENOTTY;
-        }
-
-        r = save_core(j, arg_output ? fileno(arg_output) : STDOUT_FILENO, NULL, NULL);
+        r = save_core(j, arg_output, NULL, NULL);
         if (r < 0)
-                return log_error_errno(r, "Coredump retrieval failed: %m");
+                return r;
 
         r = sd_journal_previous(j);
-        if (r >= 0)
-                log_warning("More than one entry matches, ignoring rest.");
+        if (r > 0 && !arg_quiet)
+                log_notice("More than one entry matches, ignoring rest.");
 
         return 0;
 }
@@ -753,9 +920,12 @@ static int run_gdb(sd_journal *j) {
                 return -ENOENT;
         }
 
-        r = save_core(j, -1, &path, &unlink_path);
+        r = save_core(j, NULL, &path, &unlink_path);
         if (r < 0)
-                return log_error_errno(r, "Failed to retrieve core: %m");
+                return r;
+
+        /* Don't interfere with gdb and its handling of SIGINT. */
+        (void) ignore_signals(SIGINT, -1);
 
         pid = fork();
         if (pid < 0) {
@@ -781,6 +951,8 @@ static int run_gdb(sd_journal *j) {
         r = st.si_code == CLD_EXITED ? st.si_status : 255;
 
 finish:
+        (void) default_signals(SIGINT, -1);
+
         if (unlink_path) {
                 log_debug("Removed temporary file %s", path);
                 unlink(path);
@@ -789,24 +961,75 @@ finish:
         return r;
 }
 
+static int check_units_active(void) {
+        _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+        int c = 0, r;
+        const char *id, *state, *substate;
+
+        if (arg_quiet)
+                return false;
+
+        r = sd_bus_default_system(&bus);
+        if (r < 0)
+                return log_error_errno(r, "Failed to acquire bus: %m");
+
+        r = sd_bus_message_new_method_call(
+                        bus,
+                        &m,
+                        "org.freedesktop.systemd1",
+                        "/org/freedesktop/systemd1",
+                        "org.freedesktop.systemd1.Manager",
+                        "ListUnitsByPatterns");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_append_strv(m, NULL);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_append_strv(m, STRV_MAKE("systemd-coredump@*.service"));
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_call(bus, m, SHORT_BUS_CALL_TIMEOUT_USEC, &error, &reply);
+        if (r < 0)
+                return log_error_errno(r, "Failed to check if any systemd-coredump@.service units are running: %s",
+                                       bus_error_message(&error, r));
+
+        r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "(ssssssouso)");
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        while ((r = sd_bus_message_read(
+                                reply, "(ssssssouso)",
+                                &id,  NULL,  NULL,  &state,  &substate,
+                                NULL,  NULL,  NULL,  NULL,  NULL)) > 0) {
+                bool found = !STR_IN_SET(state, "inactive", "dead", "failed");
+                log_debug("Unit %s is %s/%s, %scounting it.", id, state, substate, found ? "" : "not ");
+                c += found;
+        }
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        r = sd_bus_message_exit_container(reply);
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        return c;
+}
+
 int main(int argc, char *argv[]) {
         _cleanup_(sd_journal_closep) sd_journal*j = NULL;
-        const char* match;
-        Iterator it;
-        int r = 0;
-        _cleanup_set_free_free_ Set *matches = NULL;
+        int r = 0, units_active;
 
         setlocale(LC_ALL, "");
         log_parse_environment();
         log_open();
 
-        matches = new_matches();
-        if (!matches) {
-                r = -ENOMEM;
-                goto end;
-        }
-
-        r = parse_argv(argc, argv, matches);
+        r = parse_argv(argc, argv);
         if (r < 0)
                 goto end;
 
@@ -829,17 +1052,13 @@ int main(int argc, char *argv[]) {
                 }
         }
 
-        /* We want full data, nothing truncated. */
-        sd_journal_set_data_threshold(j, 0);
+        r = journal_access_check_and_warn(j, arg_quiet);
+        if (r < 0)
+                goto end;
 
-        SET_FOREACH(match, matches, it) {
-                r = sd_journal_add_match(j, match, strlen(match));
-                if (r != 0) {
-                        log_error_errno(r, "Failed to add match '%s': %m",
-                                        match);
-                        goto end;
-                }
-        }
+        r = add_matches(j);
+        if (r < 0)
+                goto end;
 
         if (_unlikely_(log_get_max_level() >= LOG_DEBUG)) {
                 _cleanup_free_ char *filter;
@@ -848,6 +1067,8 @@ int main(int argc, char *argv[]) {
                 log_debug("Journal filter: %s", filter);
         }
 
+        units_active = check_units_active(); /* error is treated the same as 0 */
+
         switch(arg_action) {
 
         case ACTION_LIST:
@@ -868,6 +1089,11 @@ int main(int argc, char *argv[]) {
                 assert_not_reached("Shouldn't be here");
         }
 
+        if (units_active > 0)
+                printf("%s-- Notice: %d systemd-coredump@.service %s, output may be incomplete.%s\n",
+                       ansi_highlight_red(),
+                       units_active, units_active == 1 ? "unit is running" : "units are running",
+                       ansi_normal());
 end:
         pager_close();
 
diff --git a/src/coredump/meson.build b/src/coredump/meson.build
new file mode 100644 (file)
index 0000000..8f7d898
--- /dev/null
@@ -0,0 +1,24 @@
+systemd_coredump_sources = files('''
+        coredump.c
+        coredump-vacuum.c
+        coredump-vacuum.h
+'''.split())
+
+if conf.get('HAVE_ELFUTILS', false)
+        systemd_coredump_sources += files(['stacktrace.c',
+                                           'stacktrace.h'])
+endif
+
+coredumpctl_sources = files('coredumpctl.c')
+
+install_data('coredump.conf',
+             install_dir : pkgsysconfdir)
+
+tests += [
+        [['src/coredump/test-coredump-vacuum.c',
+          'src/coredump/coredump-vacuum.c',
+          'src/coredump/coredump-vacuum.h'],
+         [],
+         [],
+         'ENABLE_COREDUMP', 'manual'],
+]
index cc4dad9..778bee9 100644 (file)
@@ -22,7 +22,7 @@
 
 #include "alloc-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "macro.h"
 #include "stacktrace.h"
 #include "string-util.h"
index 8ac5ab7..b58b6db 100644 (file)
@@ -86,7 +86,7 @@ static int create_disk(
         if (r < 0)
                 return log_error_errno(r, "Failed to generate unit name: %m");
 
-        p = strjoin(arg_dest, "/", n, NULL);
+        p = strjoin(arg_dest, "/", n);
         if (!p)
                 return log_oom();
 
@@ -102,18 +102,17 @@ static int create_disk(
         if (!f)
                 return log_error_errno(errno, "Failed to create unit file %s: %m", p);
 
-        fputs(
-                "# Automatically generated by systemd-cryptsetup-generator\n\n"
-                "[Unit]\n"
-                "Description=Cryptography Setup for %I\n"
-                "Documentation=man:crypttab(5) man:systemd-cryptsetup-generator(8) man:systemd-cryptsetup@.service(8)\n"
-                "SourcePath=/etc/crypttab\n"
-                "DefaultDependencies=no\n"
-                "Conflicts=umount.target\n"
-                "BindsTo=dev-mapper-%i.device\n"
-                "IgnoreOnIsolate=true\n"
-                "After=cryptsetup-pre.target\n",
-                f);
+        fputs("# Automatically generated by systemd-cryptsetup-generator\n\n"
+              "[Unit]\n"
+              "Description=Cryptography Setup for %I\n"
+              "Documentation=man:crypttab(5) man:systemd-cryptsetup-generator(8) man:systemd-cryptsetup@.service(8)\n"
+              "SourcePath=/etc/crypttab\n"
+              "DefaultDependencies=no\n"
+              "Conflicts=umount.target\n"
+              "BindsTo=dev-mapper-%i.device\n"
+              "IgnoreOnIsolate=true\n"
+              "After=cryptsetup-pre.target\n",
+              f);
 
         if (!nofail)
                 fprintf(f,
@@ -145,13 +144,17 @@ static int create_disk(
                 }
         }
 
-        if (is_device_path(u))
+        if (is_device_path(u)) {
                 fprintf(f,
                         "BindsTo=%s\n"
                         "After=%s\n"
                         "Before=umount.target\n",
                         d, d);
-        else
+
+                if (swap)
+                        fputs("Before=dev-mapper-%i.swap\n",
+                              f);
+        } else
                 fprintf(f,
                         "RequiresMountsFor=%s\n",
                         u);
@@ -188,7 +191,7 @@ static int create_disk(
 
         if (!noauto) {
 
-                to = strjoin(arg_dest, "/", d, ".wants/", n, NULL);
+                to = strjoin(arg_dest, "/", d, ".wants/", n);
                 if (!to)
                         return log_oom();
 
@@ -198,9 +201,9 @@ static int create_disk(
 
                 free(to);
                 if (!nofail)
-                        to = strjoin(arg_dest, "/cryptsetup.target.requires/", n, NULL);
+                        to = strjoin(arg_dest, "/cryptsetup.target.requires/", n);
                 else
-                        to = strjoin(arg_dest, "/cryptsetup.target.wants/", n, NULL);
+                        to = strjoin(arg_dest, "/cryptsetup.target.wants/", n);
                 if (!to)
                         return log_oom();
 
@@ -210,7 +213,7 @@ static int create_disk(
         }
 
         free(to);
-        to = strjoin(arg_dest, "/dev-mapper-", e, ".device.requires/", n, NULL);
+        to = strjoin(arg_dest, "/dev-mapper-", e, ".device.requires/", n);
         if (!to)
                 return log_oom();
 
@@ -220,7 +223,7 @@ static int create_disk(
 
         if (!noauto && !nofail) {
                 _cleanup_free_ char *dmname;
-                dmname = strjoin("dev-mapper-", e, ".device", NULL);
+                dmname = strjoin("dev-mapper-", e, ".device");
                 if (!dmname)
                         return log_oom();
 
@@ -264,44 +267,44 @@ static crypto_device *get_crypto_device(const char *uuid) {
                 d->keyfile = d->options = d->name = NULL;
 
                 d->uuid = strdup(uuid);
-                if (!d->uuid) {
-                        free(d);
-                        return NULL;
-                }
+                if (!d->uuid)
+                        return mfree(d);
 
                 r = hashmap_put(arg_disks, d->uuid, d);
                 if (r < 0) {
                         free(d->uuid);
-                        free(d);
-                        return NULL;
+                        return mfree(d);
                 }
         }
 
         return d;
 }
 
-static int parse_proc_cmdline_item(const char *key, const char *value) {
-        int r;
-        crypto_device *d;
+static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
         _cleanup_free_ char *uuid = NULL, *uuid_value = NULL;
+        crypto_device *d;
+        int r;
 
-        if (STR_IN_SET(key, "luks", "rd.luks") && value) {
+        if (streq(key, "luks")) {
 
-                r = parse_boolean(value);
+                r = value ? parse_boolean(value) : 1;
                 if (r < 0)
-                        log_warning("Failed to parse luks switch %s. Ignoring.", value);
+                        log_warning("Failed to parse luks= kernel command line switch %s. Ignoring.", value);
                 else
                         arg_enabled = r;
 
-        } else if (STR_IN_SET(key, "luks.crypttab", "rd.luks.crypttab") && value) {
+        } else if (streq(key, "luks.crypttab")) {
 
-                r = parse_boolean(value);
+                r = value ? parse_boolean(value) : 1;
                 if (r < 0)
-                        log_warning("Failed to parse luks crypttab switch %s. Ignoring.", value);
+                        log_warning("Failed to parse luks.crypttab= kernel command line switch %s. Ignoring.", value);
                 else
                         arg_read_crypttab = r;
 
-        } else if (STR_IN_SET(key, "luks.uuid", "rd.luks.uuid") && value) {
+        } else if (streq(key, "luks.uuid")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 d = get_crypto_device(startswith(value, "luks-") ? value+5 : value);
                 if (!d)
@@ -309,7 +312,10 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
 
                 d->create = arg_whitelist = true;
 
-        } else if (STR_IN_SET(key, "luks.options", "rd.luks.options") && value) {
+        } else if (streq(key, "luks.options")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 r = sscanf(value, "%m[0-9a-fA-F-]=%ms", &uuid, &uuid_value);
                 if (r == 2) {
@@ -317,13 +323,14 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
                         if (!d)
                                 return log_oom();
 
-                        free(d->options);
-                        d->options = uuid_value;
-                        uuid_value = NULL;
+                        free_and_replace(d->options, uuid_value);
                 } else if (free_and_strdup(&arg_default_options, value) < 0)
                         return log_oom();
 
-        } else if (STR_IN_SET(key, "luks.key", "rd.luks.key") && value) {
+        } else if (streq(key, "luks.key")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 r = sscanf(value, "%m[0-9a-fA-F-]=%ms", &uuid, &uuid_value);
                 if (r == 2) {
@@ -331,13 +338,14 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
                         if (!d)
                                 return log_oom();
 
-                        free(d->keyfile);
-                        d->keyfile = uuid_value;
-                        uuid_value = NULL;
+                        free_and_replace(d->keyfile, uuid_value);
                 } else if (free_and_strdup(&arg_default_keyfile, value) < 0)
                         return log_oom();
 
-        } else if (STR_IN_SET(key, "luks.name", "rd.luks.name") && value) {
+        } else if (streq(key, "luks.name")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 r = sscanf(value, "%m[0-9a-fA-F-]=%ms", &uuid, &uuid_value);
                 if (r == 2) {
@@ -352,7 +360,6 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
                         uuid_value = NULL;
                 } else
                         log_warning("Failed to parse luks name switch %s. Ignoring.", value);
-
         }
 
         return 0;
@@ -461,7 +468,7 @@ static int add_proc_cmdline_devices(void) {
 }
 
 int main(int argc, char *argv[]) {
-        int r = EXIT_FAILURE;
+        int r;
 
         if (argc > 1 && argc != 4) {
                 log_error("This program takes three or no arguments.");
@@ -478,32 +485,36 @@ int main(int argc, char *argv[]) {
         umask(0022);
 
         arg_disks = hashmap_new(&string_hash_ops);
-        if (!arg_disks)
-                goto cleanup;
+        if (!arg_disks) {
+                r = log_oom();
+                goto finish;
+        }
 
-        r = parse_proc_cmdline(parse_proc_cmdline_item);
+        r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
         if (r < 0) {
-                log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
-                r = EXIT_FAILURE;
+                log_warning_errno(r, "Failed to parse kernel command line: %m");
+                goto finish;
         }
 
         if (!arg_enabled) {
-                r = EXIT_SUCCESS;
-                goto cleanup;
+                r = 0;
+                goto finish;
         }
 
-        if (add_crypttab_devices() < 0)
-                goto cleanup;
+        r = add_crypttab_devices();
+        if (r < 0)
+                goto finish;
 
-        if (add_proc_cmdline_devices() < 0)
-                goto cleanup;
+        r = add_proc_cmdline_devices();
+        if (r < 0)
+                goto finish;
 
-        r = EXIT_SUCCESS;
+        r = 0;
 
-cleanup:
+finish:
         free_arg_disks();
         free(arg_default_options);
         free(arg_default_keyfile);
 
-        return r;
+        return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }
index 9927621..3b4c086 100644 (file)
@@ -52,6 +52,7 @@ static bool arg_verify = false;
 static bool arg_discards = false;
 static bool arg_tcrypt_hidden = false;
 static bool arg_tcrypt_system = false;
+static bool arg_tcrypt_veracrypt = false;
 static char **arg_tcrypt_keyfiles = NULL;
 static uint64_t arg_offset = 0;
 static uint64_t arg_skip = 0;
@@ -68,26 +69,25 @@ static usec_t arg_timeout = 0;
 */
 
 static int parse_one_option(const char *option) {
+        const char *val;
+        int r;
+
         assert(option);
 
         /* Handled outside of this tool */
         if (STR_IN_SET(option, "noauto", "auto", "nofail", "fail"))
                 return 0;
 
-        if (startswith(option, "cipher=")) {
-                char *t;
-
-                t = strdup(option+7);
-                if (!t)
+        if ((val = startswith(option, "cipher="))) {
+                r = free_and_strdup(&arg_cipher, val);
+                if (r < 0)
                         return log_oom();
 
-                free(arg_cipher);
-                arg_cipher = t;
-
-        } else if (startswith(option, "size=")) {
+        } else if ((val = startswith(option, "size="))) {
 
-                if (safe_atou(option+5, &arg_key_size) < 0) {
-                        log_error("size= parse failure, ignoring.");
+                r = safe_atou(val, &arg_key_size);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to parse %s, ignoring: %m", option);
                         return 0;
                 }
 
@@ -98,68 +98,67 @@ static int parse_one_option(const char *option) {
 
                 arg_key_size /= 8;
 
-        } else if (startswith(option, "key-slot=")) {
+        } else if ((val = startswith(option, "key-slot="))) {
 
                 arg_type = CRYPT_LUKS1;
-                if (safe_atoi(option+9, &arg_key_slot) < 0) {
-                        log_error("key-slot= parse failure, ignoring.");
+                r = safe_atoi(val, &arg_key_slot);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to parse %s, ignoring: %m", option);
                         return 0;
                 }
 
-        } else if (startswith(option, "tcrypt-keyfile=")) {
+        } else if ((val = startswith(option, "tcrypt-keyfile="))) {
 
                 arg_type = CRYPT_TCRYPT;
-                if (path_is_absolute(option+15)) {
-                        if (strv_extend(&arg_tcrypt_keyfiles, option + 15) < 0)
+                if (path_is_absolute(val)) {
+                        if (strv_extend(&arg_tcrypt_keyfiles, val) < 0)
                                 return log_oom();
                 } else
-                        log_error("Key file path '%s' is not absolute. Ignoring.", option+15);
+                        log_error("Key file path \"%s\" is not absolute. Ignoring.", val);
 
-        } else if (startswith(option, "keyfile-size=")) {
+        } else if ((val = startswith(option, "keyfile-size="))) {
 
-                if (safe_atou(option+13, &arg_keyfile_size) < 0) {
-                        log_error("keyfile-size= parse failure, ignoring.");
+                r = safe_atou(val, &arg_keyfile_size);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to parse %s, ignoring: %m", option);
                         return 0;
                 }
 
-        } else if (startswith(option, "keyfile-offset=")) {
+        } else if ((val = startswith(option, "keyfile-offset="))) {
 
-                if (safe_atou(option+15, &arg_keyfile_offset) < 0) {
-                        log_error("keyfile-offset= parse failure, ignoring.");
+                r = safe_atou(val, &arg_keyfile_offset);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to parse %s, ignoring: %m", option);
                         return 0;
                 }
 
-        } else if (startswith(option, "hash=")) {
-                char *t;
-
-                t = strdup(option+5);
-                if (!t)
+        } else if ((val = startswith(option, "hash="))) {
+                r = free_and_strdup(&arg_hash, val);
+                if (r < 0)
                         return log_oom();
 
-                free(arg_hash);
-                arg_hash = t;
-
-        } else if (startswith(option, "header=")) {
+        } else if ((val = startswith(option, "header="))) {
                 arg_type = CRYPT_LUKS1;
 
-                if (!path_is_absolute(option+7)) {
-                        log_error("Header path '%s' is not absolute, refusing.", option+7);
+                if (!path_is_absolute(val)) {
+                        log_error("Header path \"%s\" is not absolute, refusing.", val);
                         return -EINVAL;
                 }
 
                 if (arg_header) {
-                        log_error("Duplicate header= options, refusing.");
+                        log_error("Duplicate header= option, refusing.");
                         return -EINVAL;
                 }
 
-                arg_header = strdup(option+7);
+                arg_header = strdup(val);
                 if (!arg_header)
                         return log_oom();
 
-        } else if (startswith(option, "tries=")) {
+        } else if ((val = startswith(option, "tries="))) {
 
-                if (safe_atou(option+6, &arg_tries) < 0) {
-                        log_error("tries= parse failure, ignoring.");
+                r = safe_atou(val, &arg_tries);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to parse %s, ignoring: %m", option);
                         return 0;
                 }
 
@@ -179,31 +178,38 @@ static int parse_one_option(const char *option) {
         } else if (streq(option, "tcrypt-system")) {
                 arg_type = CRYPT_TCRYPT;
                 arg_tcrypt_system = true;
+        } else if (streq(option, "tcrypt-veracrypt")) {
+#ifdef CRYPT_TCRYPT_VERA_MODES
+                arg_type = CRYPT_TCRYPT;
+                arg_tcrypt_veracrypt = true;
+#else
+                log_error("This version of cryptsetup does not support tcrypt-veracrypt; refusing.");
+                return -EINVAL;
+#endif
         } else if (STR_IN_SET(option, "plain", "swap", "tmp"))
                 arg_type = CRYPT_PLAIN;
-        else if (startswith(option, "timeout=")) {
+        else if ((val = startswith(option, "timeout="))) {
 
-                if (parse_sec(option+8, &arg_timeout) < 0) {
-                        log_error("timeout= parse failure, ignoring.");
+                r = parse_sec_fix_0(val, &arg_timeout);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to parse %s, ignoring: %m", option);
                         return 0;
                 }
 
-        } else if (startswith(option, "offset=")) {
+        } else if ((val = startswith(option, "offset="))) {
 
-                if (safe_atou64(option+7, &arg_offset) < 0) {
-                        log_error("offset= parse failure, refusing.");
-                        return -EINVAL;
-                }
+                r = safe_atou64(val, &arg_offset);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to parse %s: %m", option);
 
-        } else if (startswith(option, "skip=")) {
+        } else if ((val = startswith(option, "skip="))) {
 
-                if (safe_atou64(option+5, &arg_skip) < 0) {
-                        log_error("skip= parse failure, refusing.");
-                        return -EINVAL;
-                }
+                r = safe_atou64(val, &arg_skip);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to parse %s: %m", option);
 
         } else if (!streq(option, "none"))
-                log_error("Encountered unknown /etc/crypttab option '%s', ignoring.", option);
+                log_warning("Encountered unknown /etc/crypttab option '%s', ignoring.", option);
 
         return 0;
 }
@@ -304,7 +310,7 @@ static char *disk_mount_point(const char *label) {
         if (asprintf(&device, "/dev/mapper/%s", label) < 0)
                 return NULL;
 
-        f = setmntent("/etc/fstab", "r");
+        f = setmntent("/etc/fstab", "re");
         if (!f)
                 return NULL;
 
@@ -441,6 +447,11 @@ static int attach_tcrypt(
         if (arg_tcrypt_system)
                 params.flags |= CRYPT_TCRYPT_SYSTEM_HEADER;
 
+#ifdef CRYPT_TCRYPT_VERA_MODES
+        if (arg_tcrypt_veracrypt)
+                params.flags |= CRYPT_TCRYPT_VERA_MODES;
+#endif
+
         if (key_file) {
                 r = read_one_line_file(key_file, &passphrase);
                 if (r < 0) {
@@ -582,17 +593,17 @@ static int help(void) {
 }
 
 int main(int argc, char *argv[]) {
-        int r = EXIT_FAILURE;
         struct crypt_device *cd = NULL;
+        int r = -EINVAL;
 
         if (argc <= 1) {
-                help();
-                return EXIT_SUCCESS;
+                r = help();
+                goto finish;
         }
 
         if (argc < 3) {
                 log_error("This program requires at least two arguments.");
-                return EXIT_FAILURE;
+                goto finish;
         }
 
         log_set_target(LOG_TARGET_AUTO);
@@ -603,7 +614,6 @@ int main(int argc, char *argv[]) {
 
         if (streq(argv[1], "attach")) {
                 uint32_t flags = 0;
-                int k;
                 unsigned tries;
                 usec_t until;
                 crypt_status_info status;
@@ -637,11 +647,11 @@ int main(int argc, char *argv[]) {
 
                 if (arg_header) {
                         log_debug("LUKS header: %s", arg_header);
-                        k = crypt_init(&cd, arg_header);
+                        r = crypt_init(&cd, arg_header);
                 } else
-                        k = crypt_init(&cd, argv[3]);
-                if (k) {
-                        log_error_errno(k, "crypt_init() failed: %m");
+                        r = crypt_init(&cd, argv[3]);
+                if (r < 0) {
+                        log_error_errno(r, "crypt_init() failed: %m");
                         goto finish;
                 }
 
@@ -650,7 +660,7 @@ int main(int argc, char *argv[]) {
                 status = crypt_status(cd, argv[2]);
                 if (status == CRYPT_ACTIVE || status == CRYPT_BUSY) {
                         log_info("Volume %s already active.", argv[2]);
-                        r = EXIT_SUCCESS;
+                        r = 0;
                         goto finish;
                 }
 
@@ -680,29 +690,30 @@ int main(int argc, char *argv[]) {
                         _cleanup_strv_free_erase_ char **passwords = NULL;
 
                         if (!key_file) {
-                                k = get_password(argv[2], argv[3], until, tries == 0 && !arg_verify, &passwords);
-                                if (k == -EAGAIN)
+                                r = get_password(argv[2], argv[3], until, tries == 0 && !arg_verify, &passwords);
+                                if (r == -EAGAIN)
                                         continue;
-                                else if (k < 0)
+                                if (r < 0)
                                         goto finish;
                         }
 
                         if (streq_ptr(arg_type, CRYPT_TCRYPT))
-                                k = attach_tcrypt(cd, argv[2], key_file, passwords, flags);
+                                r = attach_tcrypt(cd, argv[2], key_file, passwords, flags);
                         else
-                                k = attach_luks_or_plain(cd,
+                                r = attach_luks_or_plain(cd,
                                                          argv[2],
                                                          key_file,
                                                          arg_header ? argv[3] : NULL,
                                                          passwords,
                                                          flags);
-                        if (k >= 0)
+                        if (r >= 0)
                                 break;
-                        else if (k == -EAGAIN) {
+                        if (r == -EAGAIN) {
                                 key_file = NULL;
                                 continue;
-                        } else if (k != -EPERM) {
-                                log_error_errno(k, "Failed to activate: %m");
+                        }
+                        if (r != -EPERM) {
+                                log_error_errno(r, "Failed to activate: %m");
                                 goto finish;
                         }
 
@@ -711,28 +722,28 @@ int main(int argc, char *argv[]) {
 
                 if (arg_tries != 0 && tries >= arg_tries) {
                         log_error("Too many attempts; giving up.");
-                        r = EXIT_FAILURE;
+                        r = -EPERM;
                         goto finish;
                 }
 
         } else if (streq(argv[1], "detach")) {
-                int k;
 
-                k = crypt_init_by_name(&cd, argv[2]);
-                if (k == -ENODEV) {
+                r = crypt_init_by_name(&cd, argv[2]);
+                if (r == -ENODEV) {
                         log_info("Volume %s already inactive.", argv[2]);
-                        r = EXIT_SUCCESS;
+                        r = 0;
                         goto finish;
-                } else if (k) {
-                        log_error_errno(k, "crypt_init_by_name() failed: %m");
+                }
+                if (r < 0) {
+                        log_error_errno(r, "crypt_init_by_name() failed: %m");
                         goto finish;
                 }
 
                 crypt_set_log_callback(cd, log_glue, NULL);
 
-                k = crypt_deactivate(cd, argv[2]);
-                if (k < 0) {
-                        log_error_errno(k, "Failed to deactivate: %m");
+                r = crypt_deactivate(cd, argv[2]);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to deactivate: %m");
                         goto finish;
                 }
 
@@ -741,10 +752,9 @@ int main(int argc, char *argv[]) {
                 goto finish;
         }
 
-        r = EXIT_SUCCESS;
+        r = 0;
 
 finish:
-
         if (cd)
                 crypt_free(cd);
 
@@ -753,5 +763,5 @@ finish:
         free(arg_header);
         strv_free(arg_tcrypt_keyfiles);
 
-        return r;
+        return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }
index 7e80af7..1d8bc71 100644 (file)
@@ -33,62 +33,59 @@ static char **arg_mask = NULL;
 static char **arg_wants = NULL;
 static bool arg_debug_shell = false;
 
-static int parse_proc_cmdline_item(const char *key, const char *value) {
+static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
         int r;
 
         assert(key);
 
         if (streq(key, "systemd.mask")) {
+                char *n;
 
-                if (!value)
-                        log_error("Missing argument for systemd.mask= kernel command line parameter.");
-                else {
-                        char *n;
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
-                        r = unit_name_mangle(value, UNIT_NAME_NOGLOB, &n);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to glob unit name: %m");
+                r = unit_name_mangle(value, UNIT_NAME_NOGLOB, &n);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to glob unit name: %m");
 
-                        r = strv_consume(&arg_mask, n);
-                        if (r < 0)
-                                return log_oom();
-                }
+                r = strv_consume(&arg_mask, n);
+                if (r < 0)
+                        return log_oom();
 
         } else if (streq(key, "systemd.wants")) {
+                char *n;
 
-                if (!value)
-                        log_error("Missing argument for systemd.want= kernel command line parameter.");
-                else {
-                        char *n;
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
-                        r = unit_name_mangle(value, UNIT_NAME_NOGLOB, &n);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to glob unit name: %m");
+                r = unit_name_mangle(value, UNIT_NAME_NOGLOB, &n);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to glob unit name: %m");
 
-                        r = strv_consume(&arg_wants, n);
-                        if (r < 0)
-                                return log_oom();
-                }
+                r = strv_consume(&arg_wants, n);
+                if (r < 0)
+                        return log_oom();
 
-        } else if (streq(key, "systemd.debug-shell")) {
+        } else if (proc_cmdline_key_streq(key, "systemd.debug_shell")) {
 
                 if (value) {
                         r = parse_boolean(value);
                         if (r < 0)
-                                log_error("Failed to parse systemd.debug-shell= argument '%s', ignoring.", value);
+                                log_error("Failed to parse systemd.debug_shell= argument '%s', ignoring.", value);
                         else
                                 arg_debug_shell = r;
                 } else
                         arg_debug_shell = true;
+
         } else if (streq(key, "systemd.unit")) {
 
-                if (!value)
-                        log_error("Missing argument for systemd.unit= kernel command line parameter.");
-                else {
-                        r = free_and_strdup(&arg_default_unit, value);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to set default unit %s: %m", value);
-                }
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
+                r = free_and_strdup(&arg_default_unit, value);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to set default unit %s: %m", value);
+
         } else if (!value) {
                 const char *target;
 
@@ -113,7 +110,7 @@ static int generate_mask_symlinks(void) {
         STRV_FOREACH(u, arg_mask) {
                 _cleanup_free_ char *p = NULL;
 
-                p = strjoin(arg_dest, "/", *u, NULL);
+                p = strjoin(arg_dest, "/", *u);
                 if (!p)
                         return log_oom();
 
@@ -135,8 +132,9 @@ static int generate_wants_symlinks(void) {
 
         STRV_FOREACH(u, arg_wants) {
                 _cleanup_free_ char *p = NULL, *f = NULL;
+                const char *target = arg_default_unit ?: SPECIAL_DEFAULT_TARGET;
 
-                p = strjoin(arg_dest, "/", arg_default_unit, ".wants/", *u, NULL);
+                p = strjoin(arg_dest, "/", target, ".wants/", *u);
                 if (!p)
                         return log_oom();
 
@@ -172,13 +170,7 @@ int main(int argc, char *argv[]) {
 
         umask(0022);
 
-        r = free_and_strdup(&arg_default_unit, SPECIAL_DEFAULT_TARGET);
-        if (r < 0) {
-                log_error_errno(r, "Failed to set default unit %s: %m", SPECIAL_DEFAULT_TARGET);
-                goto finish;
-        }
-
-        r = parse_proc_cmdline(parse_proc_cmdline_item);
+        r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0);
         if (r < 0)
                 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
 
@@ -197,6 +189,7 @@ int main(int argc, char *argv[]) {
                 r = q;
 
 finish:
-        return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+        arg_default_unit = mfree(arg_default_unit);
 
+        return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }
index f32744d..b0689ff 100644 (file)
@@ -87,14 +87,15 @@ static enum {
 
 static int equivalent(const char *a, const char *b) {
         _cleanup_free_ char *x = NULL, *y = NULL;
+        int r;
 
-        x = canonicalize_file_name(a);
-        if (!x)
-                return -errno;
+        r = chase_symlinks(a, NULL, 0, &x);
+        if (r < 0)
+                return r;
 
-        y = canonicalize_file_name(b);
-        if (!y)
-                return -errno;
+        r = chase_symlinks(b, NULL, 0, &y);
+        if (r < 0)
+                return r;
 
         return path_equal(x, y);
 }
@@ -204,7 +205,12 @@ static int found_override(const char *top, const char *bottom) {
         return k;
 }
 
-static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const char *toppath, const char *drop) {
+static int enumerate_dir_d(
+                OrderedHashmap *top,
+                OrderedHashmap *bottom,
+                OrderedHashmap *drops,
+                const char *toppath, const char *drop) {
+
         _cleanup_free_ char *unit = NULL;
         _cleanup_free_ char *path = NULL;
         _cleanup_strv_free_ char **list = NULL;
@@ -214,7 +220,7 @@ static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const
 
         assert(!endswith(drop, "/"));
 
-        path = strjoin(toppath, "/", drop, NULL);
+        path = strjoin(toppath, "/", drop);
         if (!path)
                 return -ENOMEM;
 
@@ -233,8 +239,10 @@ static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const
         if (r < 0)
                 return log_error_errno(r, "Failed to enumerate %s: %m", path);
 
+        strv_sort(list);
+
         STRV_FOREACH(file, list) {
-                Hashmap *h;
+                OrderedHashmap *h;
                 int k;
                 char *p;
                 char *d;
@@ -242,13 +250,13 @@ static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const
                 if (!endswith(*file, ".conf"))
                         continue;
 
-                p = strjoin(path, "/", *file, NULL);
+                p = strjoin(path, "/", *file);
                 if (!p)
                         return -ENOMEM;
                 d = p + strlen(toppath) + 1;
 
                 log_debug("Adding at top: %s %s %s", d, special_glyph(ARROW), p);
-                k = hashmap_put(top, d, p);
+                k = ordered_hashmap_put(top, d, p);
                 if (k >= 0) {
                         p = strdup(p);
                         if (!p)
@@ -260,19 +268,19 @@ static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const
                 }
 
                 log_debug("Adding at bottom: %s %s %s", d, special_glyph(ARROW), p);
-                free(hashmap_remove(bottom, d));
-                k = hashmap_put(bottom, d, p);
+                free(ordered_hashmap_remove(bottom, d));
+                k = ordered_hashmap_put(bottom, d, p);
                 if (k < 0) {
                         free(p);
                         return k;
                 }
 
-                h = hashmap_get(drops, unit);
+                h = ordered_hashmap_get(drops, unit);
                 if (!h) {
-                        h = hashmap_new(&string_hash_ops);
+                        h = ordered_hashmap_new(&string_hash_ops);
                         if (!h)
                                 return -ENOMEM;
-                        hashmap_put(drops, unit, h);
+                        ordered_hashmap_put(drops, unit, h);
                         unit = strdup(unit);
                         if (!unit)
                                 return -ENOMEM;
@@ -284,7 +292,7 @@ static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const
 
                 log_debug("Adding to drops: %s %s %s %s %s",
                           unit, special_glyph(ARROW), basename(p), special_glyph(ARROW), p);
-                k = hashmap_put(h, basename(p), p);
+                k = ordered_hashmap_put(h, basename(p), p);
                 if (k < 0) {
                         free(p);
                         if (k != -EEXIST)
@@ -294,8 +302,18 @@ static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const
         return 0;
 }
 
-static int enumerate_dir(Hashmap *top, Hashmap *bottom, Hashmap *drops, const char *path, bool dropins) {
-        _cleanup_closedir_ DIR *d;
+static int enumerate_dir(
+                OrderedHashmap *top,
+                OrderedHashmap *bottom,
+                OrderedHashmap *drops,
+                const char *path, bool dropins) {
+
+        _cleanup_closedir_ DIR *d = NULL;
+        struct dirent *de;
+        _cleanup_strv_free_ char **files = NULL, **dirs = NULL;
+        size_t n_files = 0, allocated_files = 0, n_dirs = 0, allocated_dirs = 0;
+        char **t;
+        int r;
 
         assert(top);
         assert(bottom);
@@ -312,54 +330,87 @@ static int enumerate_dir(Hashmap *top, Hashmap *bottom, Hashmap *drops, const ch
                 return log_error_errno(errno, "Failed to open %s: %m", path);
         }
 
-        for (;;) {
-                struct dirent *de;
-                int k;
-                char *p;
-
-                errno = 0;
-                de = readdir(d);
-                if (!de)
-                        return -errno;
-
+        FOREACH_DIRENT_ALL(de, d, return -errno) {
                 dirent_ensure_type(d, de);
 
-                if (dropins && de->d_type == DT_DIR && endswith(de->d_name, ".d"))
-                        enumerate_dir_d(top, bottom, drops, path, de->d_name);
+                if (dropins && de->d_type == DT_DIR && endswith(de->d_name, ".d")) {
+                        if (!GREEDY_REALLOC0(dirs, allocated_dirs, n_dirs + 2))
+                                return -ENOMEM;
+
+                        dirs[n_dirs] = strdup(de->d_name);
+                        if (!dirs[n_dirs])
+                                return -ENOMEM;
+                        n_dirs ++;
+                }
 
                 if (!dirent_is_file(de))
                         continue;
 
-                p = strjoin(path, "/", de->d_name, NULL);
+                if (!GREEDY_REALLOC0(files, allocated_files, n_files + 2))
+                        return -ENOMEM;
+
+                files[n_files] = strdup(de->d_name);
+                if (!files[n_files])
+                        return -ENOMEM;
+                n_files ++;
+        }
+
+        strv_sort(dirs);
+        strv_sort(files);
+
+        STRV_FOREACH(t, dirs) {
+                r = enumerate_dir_d(top, bottom, drops, path, *t);
+                if (r < 0)
+                        return r;
+        }
+
+        STRV_FOREACH(t, files) {
+                _cleanup_free_ char *p = NULL;
+
+                p = strjoin(path, "/", *t);
                 if (!p)
                         return -ENOMEM;
 
                 log_debug("Adding at top: %s %s %s", basename(p), special_glyph(ARROW), p);
-                k = hashmap_put(top, basename(p), p);
-                if (k >= 0) {
+                r = ordered_hashmap_put(top, basename(p), p);
+                if (r >= 0) {
                         p = strdup(p);
                         if (!p)
                                 return -ENOMEM;
-                } else if (k != -EEXIST) {
-                        free(p);
-                        return k;
-                }
+                } else if (r != -EEXIST)
+                        return r;
 
                 log_debug("Adding at bottom: %s %s %s", basename(p), special_glyph(ARROW), p);
-                free(hashmap_remove(bottom, basename(p)));
-                k = hashmap_put(bottom, basename(p), p);
-                if (k < 0) {
-                        free(p);
-                        return k;
-                }
+                free(ordered_hashmap_remove(bottom, basename(p)));
+                r = ordered_hashmap_put(bottom, basename(p), p);
+                if (r < 0)
+                        return r;
+                p = NULL;
         }
+
+        return 0;
+}
+
+static int should_skip_prefix(const char* p) {
+#ifdef HAVE_SPLIT_USR
+        int r;
+        _cleanup_free_ char *target = NULL;
+
+        r = chase_symlinks(p, NULL, 0, &target);
+        if (r < 0)
+                return r;
+
+        return !streq(p, target) && nulstr_contains(prefixes, target);
+#else
+        return 0;
+#endif
 }
 
 static int process_suffix(const char *suffix, const char *onlyprefix) {
         const char *p;
         char *f;
-        Hashmap *top, *bottom, *drops;
-        Hashmap *h;
+        OrderedHashmap *top, *bottom, *drops;
+        OrderedHashmap *h;
         char *key;
         int r = 0, k;
         Iterator i, j;
@@ -372,9 +423,9 @@ static int process_suffix(const char *suffix, const char *onlyprefix) {
 
         dropins = nulstr_contains(have_dropins, suffix);
 
-        top = hashmap_new(&string_hash_ops);
-        bottom = hashmap_new(&string_hash_ops);
-        drops = hashmap_new(&string_hash_ops);
+        top = ordered_hashmap_new(&string_hash_ops);
+        bottom = ordered_hashmap_new(&string_hash_ops);
+        drops = ordered_hashmap_new(&string_hash_ops);
         if (!top || !bottom || !drops) {
                 r = -ENOMEM;
                 goto finish;
@@ -382,8 +433,17 @@ static int process_suffix(const char *suffix, const char *onlyprefix) {
 
         NULSTR_FOREACH(p, prefixes) {
                 _cleanup_free_ char *t = NULL;
+                int skip;
 
-                t = strjoin(p, "/", suffix, NULL);
+                skip = should_skip_prefix(p);
+                if (skip < 0) {
+                        r = skip;
+                        goto finish;
+                }
+                if (skip)
+                        continue;
+
+                t = strjoin(p, "/", suffix);
                 if (!t) {
                         r = -ENOMEM;
                         goto finish;
@@ -394,10 +454,10 @@ static int process_suffix(const char *suffix, const char *onlyprefix) {
                         r = k;
         }
 
-        HASHMAP_FOREACH_KEY(f, key, top, i) {
+        ORDERED_HASHMAP_FOREACH_KEY(f, key, top, i) {
                 char *o;
 
-                o = hashmap_get(bottom, key);
+                o = ordered_hashmap_get(bottom, key);
                 assert(o);
 
                 if (!onlyprefix || startswith(o, onlyprefix)) {
@@ -412,23 +472,23 @@ static int process_suffix(const char *suffix, const char *onlyprefix) {
                         }
                 }
 
-                h = hashmap_get(drops, key);
+                h = ordered_hashmap_get(drops, key);
                 if (h)
-                        HASHMAP_FOREACH(o, h, j)
+                        ORDERED_HASHMAP_FOREACH(o, h, j)
                                 if (!onlyprefix || startswith(o, onlyprefix))
                                         n_found += notify_override_extended(f, o);
         }
 
 finish:
-        hashmap_free_free(top);
-        hashmap_free_free(bottom);
+        ordered_hashmap_free_free(top);
+        ordered_hashmap_free_free(bottom);
 
-        HASHMAP_FOREACH_KEY(h, key, drops, i) {
-                hashmap_free_free(hashmap_remove(drops, key));
-                hashmap_remove(drops, key);
+        ORDERED_HASHMAP_FOREACH_KEY(h, key, drops, i) {
+                ordered_hashmap_free_free(ordered_hashmap_remove(drops, key));
+                ordered_hashmap_remove(drops, key);
                 free(key);
         }
-        hashmap_free(drops);
+        ordered_hashmap_free(drops);
 
         return r < 0 ? r : n_found;
 }
@@ -459,6 +519,13 @@ static int process_suffix_chop(const char *arg) {
         /* Strip prefix from the suffix */
         NULSTR_FOREACH(p, prefixes) {
                 const char *suffix;
+                int skip;
+
+                skip = should_skip_prefix(p);
+                if (skip < 0)
+                        return skip;
+                if (skip)
+                        continue;
 
                 suffix = startswith(arg, p);
                 if (suffix) {
index 5d51589..4b8956f 100644 (file)
@@ -31,6 +31,7 @@ static enum {
         ONLY_VM,
         ONLY_CONTAINER,
         ONLY_CHROOT,
+        ONLY_PRIVATE_USERS,
 } arg_mode = ANY_VIRTUALIZATION;
 
 static void help(void) {
@@ -41,6 +42,7 @@ static void help(void) {
                "  -c --container        Only detect whether we are run in a container\n"
                "  -v --vm               Only detect whether we are run in a VM\n"
                "  -r --chroot           Detect whether we are run in a chroot() environment\n"
+               "     --private-users    Only detect whether we are running in a user namespace\n"
                "  -q --quiet            Don't output anything, just set return value\n"
                , program_invocation_short_name);
 }
@@ -48,16 +50,18 @@ static void help(void) {
 static int parse_argv(int argc, char *argv[]) {
 
         enum {
-                ARG_VERSION = 0x100
+                ARG_VERSION = 0x100,
+                ARG_PRIVATE_USERS,
         };
 
         static const struct option options[] = {
-                { "help",      no_argument,       NULL, 'h'           },
-                { "version",   no_argument,       NULL, ARG_VERSION   },
-                { "container", no_argument,       NULL, 'c'           },
-                { "vm",        no_argument,       NULL, 'v'           },
-                { "chroot",    no_argument,       NULL, 'r'           },
-                { "quiet",     no_argument,       NULL, 'q'           },
+                { "help",          no_argument, NULL, 'h'               },
+                { "version",       no_argument, NULL, ARG_VERSION       },
+                { "container",     no_argument, NULL, 'c'               },
+                { "vm",            no_argument, NULL, 'v'               },
+                { "chroot",        no_argument, NULL, 'r'               },
+                { "private-users", no_argument, NULL, ARG_PRIVATE_USERS },
+                { "quiet",         no_argument, NULL, 'q'               },
                 {}
         };
 
@@ -85,6 +89,10 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_mode = ONLY_CONTAINER;
                         break;
 
+                case ARG_PRIVATE_USERS:
+                        arg_mode = ONLY_PRIVATE_USERS;
+                        break;
+
                 case 'v':
                         arg_mode = ONLY_VM;
                         break;
@@ -151,6 +159,15 @@ int main(int argc, char *argv[]) {
 
                 return r ? EXIT_SUCCESS : EXIT_FAILURE;
 
+        case ONLY_PRIVATE_USERS:
+                r = running_in_userns();
+                if (r < 0) {
+                        log_error_errno(r, "Failed to check for user namespace: %m");
+                        return EXIT_FAILURE;
+                }
+
+                return r ? EXIT_SUCCESS : EXIT_FAILURE;
+
         case ANY_VIRTUALIZATION:
         default:
                 r = detect_virtualization();
diff --git a/src/dissect/Makefile b/src/dissect/Makefile
new file mode 120000 (symlink)
index 0000000..d0b0e8e
--- /dev/null
@@ -0,0 +1 @@
+../Makefile
\ No newline at end of file
diff --git a/src/dissect/dissect.c b/src/dissect/dissect.c
new file mode 100644 (file)
index 0000000..06564e9
--- /dev/null
@@ -0,0 +1,294 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <fcntl.h>
+#include <stdio.h>
+#include <getopt.h>
+
+#include "architecture.h"
+#include "dissect-image.h"
+#include "hexdecoct.h"
+#include "log.h"
+#include "loop-util.h"
+#include "string-util.h"
+#include "util.h"
+
+static enum {
+        ACTION_DISSECT,
+        ACTION_MOUNT,
+} arg_action = ACTION_DISSECT;
+static const char *arg_image = NULL;
+static const char *arg_path = NULL;
+static DissectImageFlags arg_flags = DISSECT_IMAGE_REQUIRE_ROOT|DISSECT_IMAGE_DISCARD_ON_LOOP;
+static void *arg_root_hash = NULL;
+static size_t arg_root_hash_size = 0;
+
+static void help(void) {
+        printf("%s [OPTIONS...] IMAGE\n"
+               "%s [OPTIONS...] --mount IMAGE PATH\n"
+               "Dissect a file system OS image.\n\n"
+               "  -h --help            Show this help\n"
+               "     --version         Show package version\n"
+               "  -m --mount           Mount the image to the specified directory\n"
+               "  -r --read-only       Mount read-only\n"
+               "     --discard=MODE    Choose 'discard' mode (disabled, loop, all, crypto)\n"
+               "     --root-hash=HASH  Specify root hash for verity\n",
+               program_invocation_short_name,
+               program_invocation_short_name);
+}
+
+static int parse_argv(int argc, char *argv[]) {
+
+        enum {
+                ARG_VERSION = 0x100,
+                ARG_DISCARD,
+                ARG_ROOT_HASH,
+        };
+
+        static const struct option options[] = {
+                { "help",      no_argument,       NULL, 'h'           },
+                { "version",   no_argument,       NULL, ARG_VERSION   },
+                { "mount",     no_argument,       NULL, 'm'           },
+                { "read-only", no_argument,       NULL, 'r'           },
+                { "discard",   required_argument, NULL, ARG_DISCARD   },
+                { "root-hash", required_argument, NULL, ARG_ROOT_HASH },
+                {}
+        };
+
+        int c, r;
+
+        assert(argc >= 0);
+        assert(argv);
+
+        while ((c = getopt_long(argc, argv, "hmr", options, NULL)) >= 0) {
+
+                switch (c) {
+
+                case 'h':
+                        help();
+                        return 0;
+
+                case ARG_VERSION:
+                        return version();
+
+                case 'm':
+                        arg_action = ACTION_MOUNT;
+                        break;
+
+                case 'r':
+                        arg_flags |= DISSECT_IMAGE_READ_ONLY;
+                        break;
+
+                case ARG_DISCARD: {
+                        DissectImageFlags flags;
+
+                        if (streq(optarg, "disabled"))
+                                flags = 0;
+                        else if (streq(optarg, "loop"))
+                                flags = DISSECT_IMAGE_DISCARD_ON_LOOP;
+                        else if (streq(optarg, "all"))
+                                flags = DISSECT_IMAGE_DISCARD_ON_LOOP | DISSECT_IMAGE_DISCARD;
+                        else if (streq(optarg, "crypt"))
+                                flags = DISSECT_IMAGE_DISCARD_ANY;
+                        else {
+                                log_error("Unknown --discard= parameter: %s", optarg);
+                                return -EINVAL;
+                        }
+                        arg_flags = (arg_flags & ~DISSECT_IMAGE_DISCARD_ANY) | flags;
+
+                        break;
+                }
+
+                case ARG_ROOT_HASH: {
+                        void *p;
+                        size_t l;
+
+                        r = unhexmem(optarg, strlen(optarg), &p, &l);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse root hash: %s", optarg);
+                        if (l < sizeof(sd_id128_t)) {
+                                log_error("Root hash must be at least 128bit long: %s", optarg);
+                                free(p);
+                                return -EINVAL;
+                        }
+
+                        free(arg_root_hash);
+                        arg_root_hash = p;
+                        arg_root_hash_size = l;
+                        break;
+                }
+
+                case '?':
+                        return -EINVAL;
+
+                default:
+                        assert_not_reached("Unhandled option");
+                }
+
+        }
+
+        switch (arg_action) {
+
+        case ACTION_DISSECT:
+                if (optind + 1 != argc) {
+                        log_error("Expected a file path as only argument.");
+                        return -EINVAL;
+                }
+
+                arg_image = argv[optind];
+                arg_flags |= DISSECT_IMAGE_READ_ONLY;
+                break;
+
+        case ACTION_MOUNT:
+                if (optind + 2 != argc) {
+                        log_error("Expected a file path and mount point path as only arguments.");
+                        return -EINVAL;
+                }
+
+                arg_image = argv[optind];
+                arg_path = argv[optind + 1];
+                break;
+
+        default:
+                assert_not_reached("Unknown action.");
+        }
+
+        return 1;
+}
+
+int main(int argc, char *argv[]) {
+        _cleanup_(loop_device_unrefp) LoopDevice *d = NULL;
+        _cleanup_(decrypted_image_unrefp) DecryptedImage *di = NULL;
+        _cleanup_(dissected_image_unrefp) DissectedImage *m = NULL;
+        int r;
+
+        log_parse_environment();
+        log_open();
+
+        r = parse_argv(argc, argv);
+        if (r <= 0)
+                goto finish;
+
+        r = loop_device_make_by_path(arg_image, (arg_flags & DISSECT_IMAGE_READ_ONLY) ? O_RDONLY : O_RDWR, &d);
+        if (r < 0) {
+                log_error_errno(r, "Failed to set up loopback device: %m");
+                goto finish;
+        }
+
+        if (!arg_root_hash) {
+                r = root_hash_load(arg_image, &arg_root_hash, &arg_root_hash_size);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to read root hash file for %s: %m", arg_image);
+                        goto finish;
+                }
+        }
+
+        r = dissect_image(d->fd, arg_root_hash, arg_root_hash_size, arg_flags, &m);
+        if (r == -ENOPKG) {
+                log_error_errno(r, "Couldn't identify a suitable partition table or file system in %s.", arg_image);
+                goto finish;
+        }
+        if (r == -EADDRNOTAVAIL) {
+                log_error_errno(r, "No root partition for specified root hash found in %s.", arg_image);
+                goto finish;
+        }
+        if (r == -ENOTUNIQ) {
+                log_error_errno(r, "Multiple suitable root partitions found in image %s.", arg_image);
+                goto finish;
+        }
+        if (r == -ENXIO) {
+                log_error_errno(r, "No suitable root partition found in image %s.", arg_image);
+                goto finish;
+        }
+        if (r < 0) {
+                log_error_errno(r, "Failed to dissect image: %m");
+                goto finish;
+        }
+
+        switch (arg_action) {
+
+        case ACTION_DISSECT: {
+                unsigned i;
+
+                for (i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
+                        DissectedPartition *p = m->partitions + i;
+                        int k;
+
+                        if (!p->found)
+                                continue;
+
+                        printf("Found %s '%s' partition",
+                               p->rw ? "writable" : "read-only",
+                               partition_designator_to_string(i));
+
+                        if (!sd_id128_is_null(p->uuid))
+                                printf(" (UUID " SD_ID128_FORMAT_STR ")", SD_ID128_FORMAT_VAL(p->uuid));
+
+                        if (p->fstype)
+                                printf(" of type %s", p->fstype);
+
+                        if (p->architecture != _ARCHITECTURE_INVALID)
+                                printf(" for %s", architecture_to_string(p->architecture));
+
+                        k = PARTITION_VERITY_OF(i);
+                        if (k >= 0)
+                                printf(" %s verity", m->partitions[k].found ? "with" : "without");
+
+                        if (p->partno >= 0)
+                                printf(" on partition #%i", p->partno);
+
+                        if (p->node)
+                                printf(" (%s)", p->node);
+
+                        putchar('\n');
+                }
+
+                break;
+        }
+
+        case ACTION_MOUNT:
+                r = dissected_image_decrypt_interactively(m, NULL, arg_root_hash, arg_root_hash_size, arg_flags, &di);
+                if (r < 0)
+                        goto finish;
+
+                r = dissected_image_mount(m, arg_path, arg_flags);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to mount image: %m");
+                        goto finish;
+                }
+
+                if (di) {
+                        r = decrypted_image_relinquish(di);
+                        if (r < 0) {
+                                log_error_errno(r, "Failed to relinquish DM devices: %m");
+                                goto finish;
+                        }
+                }
+
+                loop_device_relinquish(d);
+                break;
+
+        default:
+                assert_not_reached("Unknown action.");
+        }
+
+finish:
+        free(arg_root_hash);
+        return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+}
diff --git a/src/environment-d-generator/Makefile b/src/environment-d-generator/Makefile
new file mode 120000 (symlink)
index 0000000..d0b0e8e
--- /dev/null
@@ -0,0 +1 @@
+../Makefile
\ No newline at end of file
diff --git a/src/environment-d-generator/environment-d-generator.c b/src/environment-d-generator/environment-d-generator.c
new file mode 100644 (file)
index 0000000..9c72502
--- /dev/null
@@ -0,0 +1,107 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2017 Zbigniew Jędrzejewski-Szmek
+
+  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 "sd-path.h"
+
+#include "conf-files.h"
+#include "def.h"
+#include "escape.h"
+#include "fileio.h"
+#include "log.h"
+#include "path-lookup.h"
+
+static int environment_dirs(char ***ret) {
+        _cleanup_strv_free_ char **dirs = NULL;
+        _cleanup_free_ char *c = NULL;
+        int r;
+
+        dirs = strv_split_nulstr(CONF_PATHS_NULSTR("environment.d"));
+        if (!dirs)
+                return -ENOMEM;
+
+        /* ~/.config/systemd/environment.d */
+        r = sd_path_home(SD_PATH_USER_CONFIGURATION, "environment.d", &c);
+        if (r < 0)
+                return r;
+
+        r = strv_extend_front(&dirs, c);
+        if (r < 0)
+                return r;
+
+        *ret = dirs;
+        dirs = NULL;
+        return 0;
+}
+
+static int load_and_print(void) {
+        _cleanup_strv_free_ char **dirs = NULL, **files = NULL, **env = NULL;
+        char **i;
+        int r;
+
+        r = environment_dirs(&dirs);
+        if (r < 0)
+                return r;
+
+        r = conf_files_list_strv(&files, ".conf", NULL, (const char **) dirs);
+        if (r < 0)
+                return r;
+
+        /* This will mutate the existing environment, based on the presumption
+         * that in case of failure, a partial update is better than none. */
+
+        STRV_FOREACH(i, files) {
+                r = merge_env_file(&env, NULL, *i);
+                if (r == -ENOMEM)
+                        return r;
+        }
+
+        STRV_FOREACH(i, env) {
+                char *t;
+                _cleanup_free_ char *q = NULL;
+
+                t = strchr(*i, '=');
+                assert(t);
+
+                q = shell_maybe_quote(t + 1, ESCAPE_BACKSLASH);
+                if (!q)
+                        return log_oom();
+
+                printf("%.*s=%s\n", (int) (t - *i), *i, q);
+        }
+
+        return 0;
+}
+
+int main(int argc, char *argv[]) {
+        int r;
+
+        log_parse_environment();
+        log_open();
+
+        if (argc > 1) {
+                log_error("This program takes no arguments.");
+                return EXIT_FAILURE;
+        }
+
+        r = load_and_print();
+        if (r < 0)
+                log_error_errno(r, "Failed to load environment.d: %m");
+
+        return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+}
index 9f39049..af98c98 100644 (file)
@@ -191,7 +191,7 @@ int main(int argc, char *argv[]) {
                         } else if (arg_suffix) {
                                 char *x;
 
-                                x = strjoin(e, ".", arg_suffix, NULL);
+                                x = strjoin(e, ".", arg_suffix);
                                 if (!x) {
                                         r = log_oom();
                                         goto finish;
index c9e8e54..b3578d3 100644 (file)
@@ -33,6 +33,7 @@
 #include "mkdir.h"
 #include "parse-util.h"
 #include "path-util.h"
+#include "proc-cmdline.h"
 #include "random-util.h"
 #include "string-util.h"
 #include "strv.h"
@@ -251,7 +252,7 @@ static int process_locale(void) {
         if (arg_copy_locale && arg_root) {
 
                 mkdir_parents(etc_localeconf, 0755);
-                r = copy_file("/etc/locale.conf", etc_localeconf, 0, 0644, 0);
+                r = copy_file("/etc/locale.conf", etc_localeconf, 0, 0644, 0, COPY_REFLINK);
                 if (r != -ENOENT) {
                         if (r < 0)
                                 return log_error_errno(r, "Failed to copy %s: %m", etc_localeconf);
@@ -571,7 +572,7 @@ static int process_root_password(void) {
         if (!arg_root_password)
                 return 0;
 
-        r = dev_urandom(raw, 16);
+        r = acquire_random_bytes(raw, 16, true);
         if (r < 0)
                 return log_error_errno(r, "Failed to get salt: %m");
 
@@ -825,6 +826,7 @@ static int parse_argv(int argc, char *argv[]) {
 }
 
 int main(int argc, char *argv[]) {
+        bool enabled;
         int r;
 
         r = parse_argv(argc, argv);
@@ -837,6 +839,16 @@ int main(int argc, char *argv[]) {
 
         umask(0022);
 
+        r = proc_cmdline_get_bool("systemd.firstboot", &enabled);
+        if (r < 0) {
+                log_error_errno(r, "Failed to parse systemd.firstboot= kernel command line argument, ignoring.");
+                goto finish;
+        }
+        if (r > 0 && !enabled) {
+                r = 0; /* disabled */
+                goto finish;
+        }
+
         r = process_locale();
         if (r < 0)
                 goto finish;
index d32e1d9..2100681 100644 (file)
@@ -94,12 +94,15 @@ static void start_target(const char *target, const char *mode) {
                 log_error("Failed to start unit: %s", bus_error_message(&error, r));
 }
 
-static int parse_proc_cmdline_item(const char *key, const char *value) {
+static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
         int r;
 
         assert(key);
 
-        if (streq(key, "fsck.mode") && value) {
+        if (streq(key, "fsck.mode")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 if (streq(value, "auto"))
                         arg_force = arg_skip = false;
@@ -110,7 +113,10 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
                 else
                         log_warning("Invalid fsck.mode= parameter '%s'. Ignoring.", value);
 
-        } else if (streq(key, "fsck.repair") && value) {
+        } else if (streq(key, "fsck.repair")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 if (streq(value, "preen"))
                         arg_repair = "-a";
@@ -293,7 +299,7 @@ int main(int argc, char *argv[]) {
 
         umask(0022);
 
-        r = parse_proc_cmdline(parse_proc_cmdline_item);
+        r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
         if (r < 0)
                 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
 
index 33af553..7f23b9f 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "alloc-util.h"
 #include "fd-util.h"
+#include "fs-util.h"
 #include "fileio.h"
 #include "fstab-util.h"
 #include "generator.h"
 #include "unit-name.h"
 #include "util.h"
 #include "virt.h"
+#include "volatile-util.h"
 
 static const char *arg_dest = "/tmp";
+static const char *arg_dest_late = "/tmp";
 static bool arg_fstab_enabled = true;
 static char *arg_root_what = NULL;
 static char *arg_root_fstype = NULL;
 static char *arg_root_options = NULL;
+static char *arg_root_hash = NULL;
 static int arg_root_rw = -1;
 static char *arg_usr_what = NULL;
 static char *arg_usr_fstype = NULL;
 static char *arg_usr_options = NULL;
+static VolatileMode arg_volatile_mode = _VOLATILE_MODE_INVALID;
+
+static int write_options(FILE *f, const char *options) {
+        _cleanup_free_ char *o = NULL;
+
+        if (isempty(options))
+                return 0;
+
+        if (streq(options, "defaults"))
+                return 0;
+
+        o = strreplace(options, "%", "%%");
+        if (!o)
+                return log_oom();
+
+        fprintf(f, "Options=%s\n", o);
+        return 1;
+}
+
+static int write_what(FILE *f, const char *what) {
+        _cleanup_free_ char *w = NULL;
+
+        w = strreplace(what, "%", "%%");
+        if (!w)
+                return log_oom();
+
+        fprintf(f, "What=%s\n", w);
+        return 1;
+}
 
 static int add_swap(
                 const char *what,
@@ -80,7 +113,7 @@ static int add_swap(
         if (r < 0)
                 return log_error_errno(r, "Failed to generate unit name: %m");
 
-        unit = strjoin(arg_dest, "/", name, NULL);
+        unit = strjoin(arg_dest, "/", name);
         if (!unit)
                 return log_oom();
 
@@ -92,17 +125,19 @@ static int add_swap(
                                        "Failed to create unit file %s: %m",
                                        unit);
 
-        fprintf(f,
-                "# Automatically generated by systemd-fstab-generator\n\n"
-                "[Unit]\n"
-                "SourcePath=/etc/fstab\n"
-                "Documentation=man:fstab(5) man:systemd-fstab-generator(8)\n\n"
-                "[Swap]\n"
-                "What=%s\n",
-                what);
+        fputs("# Automatically generated by systemd-fstab-generator\n\n"
+              "[Unit]\n"
+              "SourcePath=/etc/fstab\n"
+              "Documentation=man:fstab(5) man:systemd-fstab-generator(8)\n\n"
+              "[Swap]\n", f);
 
-        if (!isempty(me->mnt_opts) && !streq(me->mnt_opts, "defaults"))
-                fprintf(f, "Options=%s\n", me->mnt_opts);
+        r = write_what(f, what);
+        if (r < 0)
+                return r;
+
+        r = write_options(f, me->mnt_opts);
+        if (r < 0)
+                return r;
 
         r = fflush_and_check(f);
         if (r < 0)
@@ -141,30 +176,42 @@ static bool mount_in_initrd(struct mntent *me) {
                streq(me->mnt_dir, "/usr");
 }
 
-static int write_idle_timeout(FILE *f, const char *where, const char *opts) {
+static int write_timeout(FILE *f, const char *where, const char *opts,
+                         const char *filter, const char *variable) {
         _cleanup_free_ char *timeout = NULL;
         char timespan[FORMAT_TIMESPAN_MAX];
         usec_t u;
         int r;
 
-        r = fstab_filter_options(opts, "x-systemd.idle-timeout\0", NULL, &timeout, NULL);
+        r = fstab_filter_options(opts, filter, NULL, &timeout, NULL);
         if (r < 0)
                 return log_warning_errno(r, "Failed to parse options: %m");
         if (r == 0)
                 return 0;
 
-        r = parse_sec(timeout, &u);
+        r = parse_sec_fix_0(timeout, &u);
         if (r < 0) {
                 log_warning("Failed to parse timeout for %s, ignoring: %s", where, timeout);
                 return 0;
         }
 
-        fprintf(f, "TimeoutIdleSec=%s\n", format_timespan(timespan, sizeof(timespan), u, 0));
+        fprintf(f, "%s=%s\n", variable, format_timespan(timespan, sizeof(timespan), u, 0));
 
         return 0;
 }
 
-static int write_requires_after(FILE *f, const char *opts) {
+static int write_idle_timeout(FILE *f, const char *where, const char *opts) {
+        return write_timeout(f, where, opts,
+                             "x-systemd.idle-timeout\0", "TimeoutIdleSec");
+}
+
+static int write_mount_timeout(FILE *f, const char *where, const char *opts) {
+        return write_timeout(f, where, opts,
+                             "x-systemd.mount-timeout\0", "TimeoutSec");
+}
+
+static int write_dependency(FILE *f, const char *opts,
+                const char *filter, const char *format) {
         _cleanup_strv_free_ char **names = NULL, **units = NULL;
         _cleanup_free_ char *res = NULL;
         char **s;
@@ -173,7 +220,7 @@ static int write_requires_after(FILE *f, const char *opts) {
         assert(f);
         assert(opts);
 
-        r = fstab_extract_values(opts, "x-systemd.requires", &names);
+        r = fstab_extract_values(opts, filter, &names);
         if (r < 0)
                 return log_warning_errno(r, "Failed to parse options: %m");
         if (r == 0)
@@ -194,12 +241,29 @@ static int write_requires_after(FILE *f, const char *opts) {
                 res = strv_join(units, " ");
                 if (!res)
                         return log_oom();
-                fprintf(f, "After=%1$s\nRequires=%1$s\n", res);
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+                fprintf(f, format, res);
+#pragma GCC diagnostic pop
         }
 
         return 0;
 }
 
+static int write_after(FILE *f, const char *opts) {
+        return write_dependency(f, opts, "x-systemd.after", "After=%1$s\n");
+}
+
+static int write_requires_after(FILE *f, const char *opts) {
+        return write_dependency(f, opts,
+                                "x-systemd.requires", "After=%1$s\nRequires=%1$s\n");
+}
+
+static int write_before(FILE *f, const char *opts) {
+        return write_dependency(f, opts,
+                                "x-systemd.before", "Before=%1$s\n");
+}
+
 static int write_requires_mounts_for(FILE *f, const char *opts) {
         _cleanup_strv_free_ char **paths = NULL;
         _cleanup_free_ char *res = NULL;
@@ -224,8 +288,10 @@ static int write_requires_mounts_for(FILE *f, const char *opts) {
 }
 
 static int add_mount(
+                const char *dest,
                 const char *what,
                 const char *where,
+                const char *original_where,
                 const char *fstype,
                 const char *opts,
                 int passno,
@@ -275,7 +341,7 @@ static int add_mount(
         if (r < 0)
                 return log_error_errno(r, "Failed to generate unit name: %m");
 
-        unit = strjoin(arg_dest, "/", name, NULL);
+        unit = strjoin(dest, "/", name);
         if (!unit)
                 return log_oom();
 
@@ -294,48 +360,78 @@ static int add_mount(
                 "Documentation=man:fstab(5) man:systemd-fstab-generator(8)\n",
                 source);
 
-        if (!noauto && !nofail && !automount)
+        if (STRPTR_IN_SET(fstype, "nfs", "nfs4") && !automount &&
+            fstab_test_yes_no_option(opts, "bg\0" "fg\0")) {
+                /* The default retry timeout that mount.nfs uses for 'bg' mounts
+                 * is 10000 minutes, where as it uses 2 minutes for 'fg' mounts.
+                 * As we are making  'bg' mounts look like an 'fg' mount to
+                 * mount.nfs (so systemd can manage the job-control aspects of 'bg'),
+                 * we need to explicitly preserve that default, and also ensure
+                 * the systemd mount-timeout doesn't interfere.
+                 * By placing these options first, they can be over-ridden by
+                 * settings in /etc/fstab. */
+                opts = strjoina("x-systemd.mount-timeout=infinity,retry=10000,", opts, ",fg");
+                nofail = true;
+        }
+
+        if (!nofail && !automount)
                 fprintf(f, "Before=%s\n", post);
 
         if (!automount && opts) {
+                 r = write_after(f, opts);
+                 if (r < 0)
+                         return r;
                  r = write_requires_after(f, opts);
                  if (r < 0)
                          return r;
+                 r = write_before(f, opts);
+                 if (r < 0)
+                         return r;
                  r = write_requires_mounts_for(f, opts);
                  if (r < 0)
                          return r;
         }
 
         if (passno != 0) {
-                r = generator_write_fsck_deps(f, arg_dest, what, where, fstype);
+                r = generator_write_fsck_deps(f, dest, what, where, fstype);
                 if (r < 0)
                         return r;
         }
 
-        fprintf(f,
-                "\n"
-                "[Mount]\n"
-                "What=%s\n"
-                "Where=%s\n",
-                what,
-                where);
+        fprintf(f, "\n[Mount]\n");
+        if (original_where)
+                fprintf(f, "# Canonicalized from %s\n", original_where);
+        fprintf(f, "Where=%s\n", where);
+
+        r = write_what(f, what);
+        if (r < 0)
+                return r;
 
         if (!isempty(fstype) && !streq(fstype, "auto"))
                 fprintf(f, "Type=%s\n", fstype);
 
-        r = generator_write_timeouts(arg_dest, what, where, opts, &filtered);
+        r = generator_write_timeouts(dest, what, where, opts, &filtered);
         if (r < 0)
                 return r;
 
-        if (!isempty(filtered) && !streq(filtered, "defaults"))
-                fprintf(f, "Options=%s\n", filtered);
+        r = generator_write_device_deps(dest, what, where, opts);
+        if (r < 0)
+                return r;
+
+        r = write_mount_timeout(f, where, opts);
+        if (r < 0)
+                return r;
+
+        r = write_options(f, filtered);
+        if (r < 0)
+                return r;
 
         r = fflush_and_check(f);
         if (r < 0)
                 return log_error_errno(r, "Failed to write unit file %s: %m", unit);
 
         if (!noauto && !automount) {
-                lnk = strjoin(arg_dest, "/", post, nofail ? ".wants/" : ".requires/", name, NULL);
+                lnk = strjoin(dest, "/", post, nofail ? ".wants/" : ".requires/", name);
                 if (!lnk)
                         return log_oom();
 
@@ -349,7 +445,7 @@ static int add_mount(
                 if (r < 0)
                         return log_error_errno(r, "Failed to generate unit name: %m");
 
-                automount_unit = strjoin(arg_dest, "/", automount_name, NULL);
+                automount_unit = strjoin(dest, "/", automount_name);
                 if (!automount_unit)
                         return log_oom();
 
@@ -368,9 +464,15 @@ static int add_mount(
                 fprintf(f, "Before=%s\n", post);
 
                 if (opts) {
+                        r = write_after(f, opts);
+                        if (r < 0)
+                                return r;
                         r = write_requires_after(f, opts);
                         if (r < 0)
                                 return r;
+                        r = write_before(f, opts);
+                        if (r < 0)
+                                return r;
                         r = write_requires_mounts_for(f, opts);
                         if (r < 0)
                                 return r;
@@ -391,7 +493,7 @@ static int add_mount(
                         return log_error_errno(r, "Failed to write unit file %s: %m", automount_unit);
 
                 free(lnk);
-                lnk = strjoin(arg_dest, "/", post, nofail ? ".wants/" : ".requires/", automount_name, NULL);
+                lnk = strjoin(dest, "/", post, nofail ? ".wants/" : ".requires/", automount_name);
                 if (!lnk)
                         return log_oom();
 
@@ -419,7 +521,7 @@ static int parse_fstab(bool initrd) {
         }
 
         while ((me = getmntent(f))) {
-                _cleanup_free_ char *where = NULL, *what = NULL;
+                _cleanup_free_ char *where = NULL, *what = NULL, *canonical_where = NULL;
                 bool noauto, nofail;
                 int k;
 
@@ -439,8 +541,28 @@ static int parse_fstab(bool initrd) {
                 if (!where)
                         return log_oom();
 
-                if (is_path(where))
+                if (is_path(where)) {
                         path_kill_slashes(where);
+                        /* Follow symlinks here; see 5261ba901845c084de5a8fd06500ed09bfb0bd80 which makes sense for
+                         * mount units, but causes problems since it historically worked to have symlinks in e.g.
+                         * /etc/fstab. So we canonicalize here. Note that we use CHASE_NONEXISTENT to handle the case
+                         * where a symlink refers to another mount target; this works assuming the sub-mountpoint
+                         * target is the final directory.
+                         */
+                        r = chase_symlinks(where, initrd ? "/sysroot" : NULL,
+                                           CHASE_PREFIX_ROOT | CHASE_NONEXISTENT,
+                                           &canonical_where);
+                        if (r < 0)
+                                /* In this case for now we continue on as if it wasn't a symlink */
+                                log_warning_errno(r, "Failed to read symlink target for %s: %m", where);
+                        else {
+                                if (streq(canonical_where, where))
+                                        canonical_where = mfree(canonical_where);
+                                else
+                                        log_debug("Canonicalized what=%s where=%s to %s",
+                                                  what, where, canonical_where);
+                        }
+                }
 
                 noauto = fstab_test_yes_no_option(me->mnt_opts, "noauto\0" "auto\0");
                 nofail = fstab_test_yes_no_option(me->mnt_opts, "nofail\0" "fail\0");
@@ -464,8 +586,10 @@ static int parse_fstab(bool initrd) {
                         else
                                 post = SPECIAL_LOCAL_FS_TARGET;
 
-                        k = add_mount(what,
-                                      where,
+                        k = add_mount(arg_dest,
+                                      what,
+                                      canonical_where ?: where,
+                                      canonical_where ? where: NULL,
                                       me->mnt_type,
                                       me->mnt_opts,
                                       me->mnt_passno,
@@ -525,8 +649,10 @@ static int add_sysroot_mount(void) {
                         return r;
         }
 
-        return add_mount(what,
+        return add_mount(arg_dest,
+                         what,
                          "/sysroot",
+                         NULL,
                          arg_root_fstype,
                          opts,
                          is_device_path(what) ? 1 : 0, /* passno */
@@ -578,8 +704,10 @@ static int add_sysroot_usr_mount(void) {
                 opts = arg_usr_options;
 
         log_debug("Found entry what=%s where=/sysroot/usr type=%s", what, strna(arg_usr_fstype));
-        return add_mount(what,
+        return add_mount(arg_dest,
+                         what,
                          "/sysroot/usr",
+                         NULL,
                          arg_usr_fstype,
                          opts,
                          is_device_path(what) ? 1 : 0, /* passno */
@@ -590,58 +718,124 @@ static int add_sysroot_usr_mount(void) {
                          "/proc/cmdline");
 }
 
-static int parse_proc_cmdline_item(const char *key, const char *value) {
+static int add_volatile_root(void) {
+        const char *from, *to;
+
+        if (arg_volatile_mode != VOLATILE_YES)
+                return 0;
+
+        /* Let's add in systemd-remount-volatile.service which will remount the root device to tmpfs if this is
+         * requested, leaving only /usr from the root mount inside. */
+
+        from = strjoina(SYSTEM_DATA_UNIT_PATH "/systemd-volatile-root.service");
+        to = strjoina(arg_dest, "/" SPECIAL_INITRD_ROOT_FS_TARGET, ".requires/systemd-volatile-root.service");
+
+        (void) mkdir_parents(to, 0755);
+
+        if (symlink(from, to) < 0)
+                return log_error_errno(errno, "Failed to hook in volatile remount service: %m");
+
+        return 0;
+}
+
+static int add_volatile_var(void) {
+
+        if (arg_volatile_mode != VOLATILE_STATE)
+                return 0;
+
+        /* If requested, mount /var as tmpfs, but do so only if there's nothing else defined for this. */
+
+        return add_mount(arg_dest_late,
+                         "tmpfs",
+                         "/var",
+                         NULL,
+                         "tmpfs",
+                         "mode=0755",
+                         0,
+                         false,
+                         false,
+                         false,
+                         SPECIAL_LOCAL_FS_TARGET,
+                         "/proc/cmdline");
+}
+
+static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
         int r;
 
         /* root=, usr=, usrfstype= and roofstype= may occur more than once, the last
          * instance should take precedence.  In the case of multiple rootflags=
          * or usrflags= the arguments should be concatenated */
 
-        if (STR_IN_SET(key, "fstab", "rd.fstab") && value) {
+        if (STR_IN_SET(key, "fstab", "rd.fstab")) {
 
-                r = parse_boolean(value);
+                r = value ? parse_boolean(value) : 1;
                 if (r < 0)
                         log_warning("Failed to parse fstab switch %s. Ignoring.", value);
                 else
                         arg_fstab_enabled = r;
 
-        } else if (streq(key, "root") && value) {
+        } else if (streq(key, "root")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 if (free_and_strdup(&arg_root_what, value) < 0)
                         return log_oom();
 
-        } else if (streq(key, "rootfstype") && value) {
+        } else if (streq(key, "rootfstype")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 if (free_and_strdup(&arg_root_fstype, value) < 0)
                         return log_oom();
 
-        } else if (streq(key, "rootflags") && value) {
+        } else if (streq(key, "rootflags")) {
                 char *o;
 
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
                 o = arg_root_options ?
-                        strjoin(arg_root_options, ",", value, NULL) :
+                        strjoin(arg_root_options, ",", value) :
                         strdup(value);
                 if (!o)
                         return log_oom();
 
                 free(arg_root_options);
                 arg_root_options = o;
+        } else if (streq(key, "roothash")) {
 
-        } else if (streq(key, "mount.usr") && value) {
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
+                if (free_and_strdup(&arg_root_hash, value) < 0)
+                        return log_oom();
+
+        } else if (streq(key, "mount.usr")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 if (free_and_strdup(&arg_usr_what, value) < 0)
                         return log_oom();
 
-        } else if (streq(key, "mount.usrfstype") && value) {
+        } else if (streq(key, "mount.usrfstype")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 if (free_and_strdup(&arg_usr_fstype, value) < 0)
                         return log_oom();
 
-        } else if (streq(key, "mount.usrflags") && value) {
+        } else if (streq(key, "mount.usrflags")) {
                 char *o;
 
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
                 o = arg_usr_options ?
-                        strjoin(arg_usr_options, ",", value, NULL) :
+                        strjoin(arg_usr_options, ",", value) :
                         strdup(value);
                 if (!o)
                         return log_oom();
@@ -653,10 +847,40 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
                 arg_root_rw = true;
         else if (streq(key, "ro") && !value)
                 arg_root_rw = false;
+        else if (streq(key, "systemd.volatile")) {
+                VolatileMode m;
+
+                if (value) {
+                        m = volatile_mode_from_string(value);
+                        if (m < 0)
+                                log_warning("Failed to parse systemd.volatile= argument: %s", value);
+                        else
+                                arg_volatile_mode = m;
+                } else
+                        arg_volatile_mode = VOLATILE_YES;
+        }
 
         return 0;
 }
 
+static int determine_root(void) {
+        /* If we have a root hash but no root device then Verity is used, and we use the "root" DM device as root. */
+
+        if (arg_root_what)
+                return 0;
+
+        if (!arg_root_hash)
+                return 0;
+
+        arg_root_what = strdup("/dev/mapper/root");
+        if (!arg_root_what)
+                return log_oom();
+
+        log_info("Using verity root device %s.", arg_root_what);
+
+        return 1;
+}
+
 int main(int argc, char *argv[]) {
         int r = 0;
 
@@ -667,6 +891,8 @@ int main(int argc, char *argv[]) {
 
         if (argc > 1)
                 arg_dest = argv[1];
+        if (argc > 3)
+                arg_dest_late = argv[3];
 
         log_set_target(LOG_TARGET_SAFE);
         log_parse_environment();
@@ -674,10 +900,12 @@ int main(int argc, char *argv[]) {
 
         umask(0022);
 
-        r = parse_proc_cmdline(parse_proc_cmdline_item);
+        r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0);
         if (r < 0)
                 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
 
+        (void) determine_root();
+
         /* Always honour root= and usr= in the kernel command line if we are in an initrd */
         if (in_initrd()) {
                 int k;
@@ -687,8 +915,12 @@ int main(int argc, char *argv[]) {
                 k = add_sysroot_usr_mount();
                 if (k < 0)
                         r = k;
+
+                k = add_volatile_root();
+                if (k < 0)
+                        r = k;
         } else
-                r = 0;
+                r = add_volatile_var();
 
         /* Honour /etc/fstab only when that's enabled */
         if (arg_fstab_enabled) {
@@ -714,6 +946,7 @@ int main(int argc, char *argv[]) {
         free(arg_root_what);
         free(arg_root_fstype);
         free(arg_root_options);
+        free(arg_root_hash);
 
         free(arg_usr_what);
         free(arg_usr_fstype);
index 39355de..a072242 100644 (file)
@@ -17,7 +17,7 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <blkid/blkid.h>
+#include <blkid.h>
 #include <stdlib.h>
 #include <sys/statfs.h>
 #include <unistd.h>
@@ -29,6 +29,7 @@
 #include "blkid-util.h"
 #include "btrfs-util.h"
 #include "dirent-util.h"
+#include "dissect-image.h"
 #include "efivars.h"
 #include "fd-util.h"
 #include "fileio.h"
@@ -54,7 +55,7 @@ static bool arg_enabled = true;
 static bool arg_root_enabled = true;
 static bool arg_root_rw = false;
 
-static int add_cryptsetup(const char *id, const char *what, bool rw, char **device) {
+static int add_cryptsetup(const char *id, const char *what, bool rw, bool require, char **device) {
         _cleanup_free_ char *e = NULL, *n = NULL, *p = NULL, *d = NULL, *to = NULL;
         _cleanup_fclose_ FILE *f = NULL;
         char *from, *ret;
@@ -62,7 +63,6 @@ static int add_cryptsetup(const char *id, const char *what, bool rw, char **devi
 
         assert(id);
         assert(what);
-        assert(device);
 
         r = unit_name_from_path(what, ".device", &d);
         if (r < 0)
@@ -76,7 +76,7 @@ static int add_cryptsetup(const char *id, const char *what, bool rw, char **devi
         if (r < 0)
                 return log_error_errno(r, "Failed to generate unit name: %m");
 
-        p = strjoin(arg_dest, "/", n, NULL);
+        p = strjoin(arg_dest, "/", n);
         if (!p)
                 return log_oom();
 
@@ -111,7 +111,7 @@ static int add_cryptsetup(const char *id, const char *what, bool rw, char **devi
 
         from = strjoina("../", n);
 
-        to = strjoin(arg_dest, "/", d, ".wants/", n, NULL);
+        to = strjoin(arg_dest, "/", d, ".wants/", n);
         if (!to)
                 return log_oom();
 
@@ -119,26 +119,29 @@ static int add_cryptsetup(const char *id, const char *what, bool rw, char **devi
         if (symlink(from, to) < 0)
                 return log_error_errno(errno, "Failed to create symlink %s: %m", to);
 
-        free(to);
-        to = strjoin(arg_dest, "/cryptsetup.target.requires/", n, NULL);
-        if (!to)
-                return log_oom();
+        if (require) {
+                free(to);
 
-        mkdir_parents_label(to, 0755);
-        if (symlink(from, to) < 0)
-                return log_error_errno(errno, "Failed to create symlink %s: %m", to);
+                to = strjoin(arg_dest, "/cryptsetup.target.requires/", n);
+                if (!to)
+                        return log_oom();
 
-        free(to);
-        to = strjoin(arg_dest, "/dev-mapper-", e, ".device.requires/", n, NULL);
-        if (!to)
-                return log_oom();
+                mkdir_parents_label(to, 0755);
+                if (symlink(from, to) < 0)
+                        return log_error_errno(errno, "Failed to create symlink %s: %m", to);
 
-        mkdir_parents_label(to, 0755);
-        if (symlink(from, to) < 0)
-                return log_error_errno(errno, "Failed to create symlink %s: %m", to);
+                free(to);
+                to = strjoin(arg_dest, "/dev-mapper-", e, ".device.requires/", n);
+                if (!to)
+                        return log_oom();
+
+                mkdir_parents_label(to, 0755);
+                if (symlink(from, to) < 0)
+                        return log_error_errno(errno, "Failed to create symlink %s: %m", to);
+        }
 
         free(p);
-        p = strjoin(arg_dest, "/dev-mapper-", e, ".device.d/50-job-timeout-sec-0.conf", NULL);
+        p = strjoin(arg_dest, "/dev-mapper-", e, ".device.d/50-job-timeout-sec-0.conf");
         if (!p)
                 return log_oom();
 
@@ -155,7 +158,8 @@ static int add_cryptsetup(const char *id, const char *what, bool rw, char **devi
         if (!ret)
                 return log_oom();
 
-        *device = ret;
+        if (device)
+                *device = ret;
         return 0;
 }
 
@@ -182,7 +186,7 @@ static int add_mount(
 
         if (streq_ptr(fstype, "crypto_LUKS")) {
 
-                r = add_cryptsetup(id, what, rw, &crypto_what);
+                r = add_cryptsetup(id, what, rw, true, &crypto_what);
                 if (r < 0)
                         return r;
 
@@ -194,7 +198,7 @@ static int add_mount(
         if (r < 0)
                 return log_error_errno(r, "Failed to generate unit name: %m");
 
-        p = strjoin(arg_dest, "/", unit, NULL);
+        p = strjoin(arg_dest, "/", unit);
         if (!p)
                 return log_oom();
 
@@ -236,7 +240,7 @@ static int add_mount(
                 return log_error_errno(r, "Failed to write unit file %s: %m", p);
 
         if (post) {
-                lnk = strjoin(arg_dest, "/", post, ".requires/", unit, NULL);
+                lnk = strjoin(arg_dest, "/", post, ".requires/", unit);
                 if (!lnk)
                         return log_oom();
 
@@ -252,7 +256,7 @@ static bool path_is_busy(const char *where) {
         int r;
 
         /* already a mountpoint; generators run during reload */
-        r = path_is_mount_point(where, AT_SYMLINK_FOLLOW);
+        r = path_is_mount_point(where, NULL, AT_SYMLINK_FOLLOW);
         if (r > 0)
                 return false;
 
@@ -270,61 +274,28 @@ static bool path_is_busy(const char *where) {
         return false;
 }
 
-static int probe_and_add_mount(
+static int add_partition_mount(
+                DissectedPartition *p,
                 const char *id,
-                const char *what,
                 const char *where,
-                bool rw,
-                const char *description,
-                const char *post) {
-
-        _cleanup_blkid_free_probe_ blkid_probe b = NULL;
-        const char *fstype = NULL;
-        int r;
+                const char *description) {
 
-        assert(id);
-        assert(what);
-        assert(where);
-        assert(description);
+        assert(p);
 
         if (path_is_busy(where)) {
                 log_debug("%s already populated, ignoring.", where);
                 return 0;
         }
 
-        /* Let's check the partition type here, so that we know
-         * whether to do LUKS magic. */
-
-        errno = 0;
-        b = blkid_new_probe_from_filename(what);
-        if (!b) {
-                if (errno == 0)
-                        return log_oom();
-                return log_error_errno(errno, "Failed to allocate prober: %m");
-        }
-
-        blkid_probe_enable_superblocks(b, 1);
-        blkid_probe_set_superblocks_flags(b, BLKID_SUBLKS_TYPE);
-
-        errno = 0;
-        r = blkid_do_safeprobe(b);
-        if (r == -2 || r == 1) /* no result or uncertain */
-                return 0;
-        else if (r != 0)
-                return log_error_errno(errno ?: EIO, "Failed to probe %s: %m", what);
-
-        /* add_mount is OK with fstype being NULL. */
-        (void) blkid_probe_lookup_value(b, "TYPE", &fstype, NULL);
-
         return add_mount(
                         id,
-                        what,
+                        p->node,
                         where,
-                        fstype,
-                        rw,
+                        p->fstype,
+                        p->rw,
                         NULL,
                         description,
-                        post);
+                        SPECIAL_LOCAL_FS_TARGET);
 }
 
 static int add_swap(const char *path) {
@@ -334,13 +305,22 @@ static int add_swap(const char *path) {
 
         assert(path);
 
+        /* Disable the swap auto logic if at least one swap is defined in /etc/fstab, see #6192. */
+        r = fstab_has_fstype("swap");
+        if (r < 0)
+                return log_error_errno(r, "Failed to parse fstab: %m");
+        if (r > 0) {
+                log_debug("swap specified in fstab, ignoring.");
+                return 0;
+        }
+
         log_debug("Adding swap: %s", path);
 
         r = unit_name_from_path(path, ".swap", &name);
         if (r < 0)
                 return log_error_errno(r, "Failed to generate unit name: %m");
 
-        unit = strjoin(arg_dest, "/", name, NULL);
+        unit = strjoin(arg_dest, "/", name);
         if (!unit)
                 return log_oom();
 
@@ -361,7 +341,7 @@ static int add_swap(const char *path) {
         if (r < 0)
                 return log_error_errno(r, "Failed to write unit file %s: %m", unit);
 
-        lnk = strjoin(arg_dest, "/" SPECIAL_SWAP_TARGET ".wants/", name, NULL);
+        lnk = strjoin(arg_dest, "/" SPECIAL_SWAP_TARGET ".wants/", name);
         if (!lnk)
                 return log_oom();
 
@@ -393,7 +373,7 @@ static int add_automount(
         assert(description);
 
         if (options)
-                opt = strjoin(options, ",noauto", NULL);
+                opt = strjoin(options, ",noauto");
         else
                 opt = strdup("noauto");
         if (!opt)
@@ -414,7 +394,7 @@ static int add_automount(
         if (r < 0)
                 return log_error_errno(r, "Failed to generate unit name: %m");
 
-        p = strjoin(arg_dest, "/", unit, NULL);
+        p = strjoin(arg_dest, "/", unit);
         if (!p)
                 return log_oom();
 
@@ -429,16 +409,16 @@ static int add_automount(
                 "Documentation=man:systemd-gpt-auto-generator(8)\n"
                 "[Automount]\n"
                 "Where=%s\n"
-                "TimeoutIdleSec=%lld\n",
+                "TimeoutIdleSec="USEC_FMT"\n",
                 description,
                 where,
-                (unsigned long long)timeout / USEC_PER_SEC);
+                timeout / USEC_PER_SEC);
 
         r = fflush_and_check(f);
         if (r < 0)
                 return log_error_errno(r, "Failed to write unit file %s: %m", p);
 
-        lnk = strjoin(arg_dest, "/" SPECIAL_LOCAL_FS_TARGET ".wants/", unit, NULL);
+        lnk = strjoin(arg_dest, "/" SPECIAL_LOCAL_FS_TARGET ".wants/", unit);
         if (!lnk)
                 return log_oom();
         mkdir_parents_label(lnk, 0755);
@@ -449,122 +429,78 @@ static int add_automount(
         return 0;
 }
 
-static int add_boot(const char *what) {
-        _cleanup_blkid_free_probe_ blkid_probe b = NULL;
-        const char *fstype = NULL, *uuid = NULL;
-        sd_id128_t id, type_id;
+static int add_esp(DissectedPartition *p) {
+        const char *esp;
         int r;
 
-        assert(what);
-
-        if (!is_efi_boot()) {
-                log_debug("Not an EFI boot, ignoring /boot.");
-                return 0;
-        }
+        assert(p);
 
         if (in_initrd()) {
-                log_debug("In initrd, ignoring /boot.");
+                log_debug("In initrd, ignoring the ESP.");
                 return 0;
         }
 
-        if (detect_container() > 0) {
-                log_debug("In a container, ignoring /boot.");
-                return 0;
-        }
+        /* If /efi exists we'll use that. Otherwise we'll use /boot, as that's usually the better choice */
+        esp = access("/efi/", F_OK) >= 0 ? "/efi" : "/boot";
 
         /* We create an .automount which is not overridden by the .mount from the fstab generator. */
-        if (fstab_is_mount_point("/boot")) {
-                log_debug("/boot specified in fstab, ignoring.");
-                return 0;
-        }
-
-        if (path_is_busy("/boot")) {
-                log_debug("/boot already populated, ignoring.");
-                return 0;
-        }
-
-        r = efi_loader_get_device_part_uuid(&id);
-        if (r == -ENOENT) {
-                log_debug("EFI loader partition unknown.");
-                return 0;
-        }
-
+        r = fstab_is_mount_point(esp);
         if (r < 0)
-                return log_error_errno(r, "Failed to read ESP partition UUID: %m");
-
-        errno = 0;
-        b = blkid_new_probe_from_filename(what);
-        if (!b) {
-                if (errno == 0)
-                        return log_oom();
-                return log_error_errno(errno, "Failed to allocate prober: %m");
-        }
-
-        blkid_probe_enable_partitions(b, 1);
-        blkid_probe_set_partitions_flags(b, BLKID_PARTS_ENTRY_DETAILS);
-
-        errno = 0;
-        r = blkid_do_safeprobe(b);
-        if (r == -2 || r == 1) /* no result or uncertain */
-                return 0;
-        else if (r != 0)
-                return log_error_errno(errno ?: EIO, "Failed to probe %s: %m", what);
-
-        (void) blkid_probe_lookup_value(b, "TYPE", &fstype, NULL);
-        if (!streq_ptr(fstype, "vfat")) {
-                log_debug("Partition for /boot is not a FAT filesystem, ignoring.");
+                return log_error_errno(r, "Failed to parse fstab: %m");
+        if (r > 0) {
+                log_debug("%s specified in fstab, ignoring.", esp);
                 return 0;
         }
 
-        errno = 0;
-        r = blkid_probe_lookup_value(b, "PART_ENTRY_UUID", &uuid, NULL);
-        if (r != 0) {
-                log_debug_errno(errno, "Partition for /boot does not have a UUID, ignoring.");
+        if (path_is_busy(esp)) {
+                log_debug("%s already populated, ignoring.", esp);
                 return 0;
         }
 
-        if (sd_id128_from_string(uuid, &type_id) < 0) {
-                log_debug("Partition for /boot does not have a valid UUID, ignoring.");
-                return 0;
-        }
+        if (is_efi_boot()) {
+                sd_id128_t loader_uuid;
 
-        if (!sd_id128_equal(type_id, id)) {
-                log_debug("Partition for /boot does not appear to be the partition we are booted from.");
-                return 0;
-        }
+                /* If this is an EFI boot, be extra careful, and only mount the ESP if it was the ESP used for booting. */
 
-        r = add_automount("boot",
-                       what,
-                       "/boot",
-                       "vfat",
-                       true,
-                       "umask=0077",
-                       "EFI System Partition Automount",
-                       120 * USEC_PER_SEC);
+                r = efi_loader_get_device_part_uuid(&loader_uuid);
+                if (r == -ENOENT) {
+                        log_debug("EFI loader partition unknown.");
+                        return 0;
+                }
+                if (r < 0)
+                        return log_error_errno(r, "Failed to read ESP partition UUID: %m");
 
-        return r;
+                if (!sd_id128_equal(p->uuid, loader_uuid)) {
+                        log_debug("Partition for %s does not appear to be the partition we are booted from.", esp);
+                        return 0;
+                }
+        } else
+                log_debug("Not an EFI boot, skipping ESP check.");
+
+        return add_automount("boot",
+                             p->node,
+                             esp,
+                             p->fstype,
+                             true,
+                             "umask=0077",
+                             "EFI System Partition Automount",
+                             120 * USEC_PER_SEC);
 }
 #else
-static int add_boot(const char *what) {
+static int add_esp(DissectedPartition *p) {
         return 0;
 }
 #endif
 
-static int enumerate_partitions(dev_t devnum) {
-
-        _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
+static int open_parent(dev_t devnum, int *ret) {
         _cleanup_udev_device_unref_ struct udev_device *d = NULL;
-        _cleanup_blkid_free_probe_ blkid_probe b = NULL;
         _cleanup_udev_unref_ struct udev *udev = NULL;
-        _cleanup_free_ char *boot = NULL, *home = NULL, *srv = NULL;
-        struct udev_list_entry *first, *item;
-        struct udev_device *parent = NULL;
-        const char *name, *node, *pttype, *devtype;
-        int boot_nr = -1, home_nr = -1, srv_nr = -1;
-        bool home_rw = true, srv_rw = true;
-        blkid_partlist pl;
-        int r, k;
+        const char *name, *devtype, *node;
+        struct udev_device *parent;
         dev_t pn;
+        int fd;
+
+        assert(ret);
 
         udev = udev_new();
         if (!udev)
@@ -578,228 +514,94 @@ static int enumerate_partitions(dev_t devnum) {
         if (!name)
                 name = udev_device_get_syspath(d);
         if (!name) {
-                log_debug("Device %u:%u does not have a name, ignoring.",
-                          major(devnum), minor(devnum));
-                return 0;
+                log_debug("Device %u:%u does not have a name, ignoring.", major(devnum), minor(devnum));
+                goto not_found;
         }
 
         parent = udev_device_get_parent(d);
         if (!parent) {
                 log_debug("%s: not a partitioned device, ignoring.", name);
-                return 0;
+                goto not_found;
         }
 
         /* Does it have a devtype? */
         devtype = udev_device_get_devtype(parent);
         if (!devtype) {
                 log_debug("%s: parent doesn't have a device type, ignoring.", name);
-                return 0;
+                goto not_found;
         }
 
         /* Is this a disk or a partition? We only care for disks... */
         if (!streq(devtype, "disk")) {
                 log_debug("%s: parent isn't a raw disk, ignoring.", name);
-                return 0;
+                goto not_found;
         }
 
         /* Does it have a device node? */
         node = udev_device_get_devnode(parent);
         if (!node) {
                 log_debug("%s: parent device does not have device node, ignoring.", name);
-                return 0;
+                goto not_found;
         }
 
         log_debug("%s: root device %s.", name, node);
 
         pn = udev_device_get_devnum(parent);
-        if (major(pn) == 0)
-                return 0;
-
-        errno = 0;
-        b = blkid_new_probe_from_filename(node);
-        if (!b) {
-                if (errno == 0)
-                        return log_oom();
-
-                return log_error_errno(errno, "%s: failed to allocate prober: %m", node);
+        if (major(pn) == 0) {
+                log_debug("%s: parent device is not a proper block device, ignoring.", name);
+                goto not_found;
         }
 
-        blkid_probe_enable_partitions(b, 1);
-        blkid_probe_set_partitions_flags(b, BLKID_PARTS_ENTRY_DETAILS);
+        fd = open(node, O_RDONLY|O_CLOEXEC|O_NOCTTY);
+        if (fd < 0)
+                return log_error_errno(errno, "Failed to open %s: %m", node);
 
-        errno = 0;
-        r = blkid_do_safeprobe(b);
-        if (r == 1)
-                return 0; /* no results */
-        else if (r == -2) {
-                log_warning("%s: probe gave ambiguous results, ignoring.", node);
-                return 0;
-        } else if (r != 0)
-                return log_error_errno(errno ?: EIO, "%s: failed to probe: %m", node);
+        *ret = fd;
+        return 1;
 
-        errno = 0;
-        r = blkid_probe_lookup_value(b, "PTTYPE", &pttype, NULL);
-        if (r != 0) {
-                if (errno == 0)
-                        return 0; /* No partition table found. */
+not_found:
+        *ret = -1;
+        return 0;
+}
 
-                return log_error_errno(errno, "%s: failed to determine partition table type: %m", node);
-        }
+static int enumerate_partitions(dev_t devnum) {
 
-        /* We only do this all for GPT... */
-        if (!streq_ptr(pttype, "gpt")) {
-                log_debug("%s: not a GPT partition table, ignoring.", node);
-                return 0;
-        }
+        _cleanup_close_ int fd = -1;
+        _cleanup_(dissected_image_unrefp) DissectedImage *m = NULL;
+        int r, k;
 
-        errno = 0;
-        pl = blkid_probe_get_partitions(b);
-        if (!pl) {
-                if (errno == 0)
-                        return log_oom();
+        r = open_parent(devnum, &fd);
+        if (r <= 0)
+                return r;
 
-                return log_error_errno(errno, "%s: failed to list partitions: %m", node);
+        r = dissect_image(fd, NULL, 0, DISSECT_IMAGE_GPT_ONLY, &m);
+        if (r == -ENOPKG) {
+                log_debug_errno(r, "No suitable partition table found, ignoring.");
+                return 0;
         }
-
-        e = udev_enumerate_new(udev);
-        if (!e)
-                return log_oom();
-
-        r = udev_enumerate_add_match_parent(e, parent);
-        if (r < 0)
-                return log_oom();
-
-        r = udev_enumerate_add_match_subsystem(e, "block");
         if (r < 0)
-                return log_oom();
-
-        r = udev_enumerate_scan_devices(e);
-        if (r < 0)
-                return log_error_errno(r, "%s: failed to enumerate partitions: %m", node);
-
-        first = udev_enumerate_get_list_entry(e);
-        udev_list_entry_foreach(item, first) {
-                _cleanup_udev_device_unref_ struct udev_device *q;
-                unsigned long long flags;
-                const char *stype, *subnode;
-                sd_id128_t type_id;
-                blkid_partition pp;
-                dev_t qn;
-                int nr;
-
-                q = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item));
-                if (!q)
-                        continue;
-
-                qn = udev_device_get_devnum(q);
-                if (major(qn) == 0)
-                        continue;
-
-                if (qn == devnum)
-                        continue;
-
-                if (qn == pn)
-                        continue;
-
-                subnode = udev_device_get_devnode(q);
-                if (!subnode)
-                        continue;
-
-                pp = blkid_partlist_devno_to_partition(pl, qn);
-                if (!pp)
-                        continue;
-
-                nr = blkid_partition_get_partno(pp);
-                if (nr < 0)
-                        continue;
-
-                stype = blkid_partition_get_type_string(pp);
-                if (!stype)
-                        continue;
-
-                if (sd_id128_from_string(stype, &type_id) < 0)
-                        continue;
-
-                flags = blkid_partition_get_flags(pp);
-
-                if (sd_id128_equal(type_id, GPT_SWAP)) {
-
-                        if (flags & GPT_FLAG_NO_AUTO)
-                                continue;
-
-                        if (flags & GPT_FLAG_READ_ONLY) {
-                                log_debug("%s marked as read-only swap partition, which is bogus. Ignoring.", subnode);
-                                continue;
-                        }
-
-                        k = add_swap(subnode);
-                        if (k < 0)
-                                r = k;
-
-                } else if (sd_id128_equal(type_id, GPT_ESP)) {
+                return log_error_errno(r, "Failed to dissect: %m");
 
-                        /* We only care for the first /boot partition */
-                        if (boot && nr >= boot_nr)
-                                continue;
-
-                        /* Note that we do not honour the "no-auto"
-                         * flag for the ESP, as it is often unset, to
-                         * hide it from Windows. */
-
-                        boot_nr = nr;
-
-                        r = free_and_strdup(&boot, subnode);
-                        if (r < 0)
-                                return log_oom();
-
-                } else if (sd_id128_equal(type_id, GPT_HOME)) {
-
-                        if (flags & GPT_FLAG_NO_AUTO)
-                                continue;
-
-                        /* We only care for the first /home partition */
-                        if (home && nr >= home_nr)
-                                continue;
-
-                        home_nr = nr;
-                        home_rw = !(flags & GPT_FLAG_READ_ONLY),
-
-                        r = free_and_strdup(&home, subnode);
-                        if (r < 0)
-                                return log_oom();
-
-                } else if (sd_id128_equal(type_id, GPT_SRV)) {
-
-                        if (flags & GPT_FLAG_NO_AUTO)
-                                continue;
-
-                        /* We only care for the first /srv partition */
-                        if (srv && nr >= srv_nr)
-                                continue;
-
-                        srv_nr = nr;
-                        srv_rw = !(flags & GPT_FLAG_READ_ONLY),
-
-                        r = free_and_strdup(&srv, subnode);
-                        if (r < 0)
-                                return log_oom();
-                }
+        if (m->partitions[PARTITION_SWAP].found) {
+                k = add_swap(m->partitions[PARTITION_SWAP].node);
+                if (k < 0)
+                        r = k;
         }
 
-        if (boot) {
-                k = add_boot(boot);
+        if (m->partitions[PARTITION_ESP].found) {
+                k = add_esp(m->partitions + PARTITION_ESP);
                 if (k < 0)
                         r = k;
         }
 
-        if (home) {
-                k = probe_and_add_mount("home", home, "/home", home_rw, "Home Partition", SPECIAL_LOCAL_FS_TARGET);
+        if (m->partitions[PARTITION_HOME].found) {
+                k = add_partition_mount(m->partitions + PARTITION_HOME, "home", "/home", "Home Partition");
                 if (k < 0)
                         r = k;
         }
 
-        if (srv) {
-                k = probe_and_add_mount("srv", srv, "/srv", srv_rw, "Server Data Partition", SPECIAL_LOCAL_FS_TARGET);
+        if (m->partitions[PARTITION_SRV].found) {
+                k = add_partition_mount(m->partitions + PARTITION_SRV, "srv", "/srv", "Server Data Partition");
                 if (k < 0)
                         r = k;
         }
@@ -868,14 +670,46 @@ static int get_block_device_harder(const char *path, dev_t *dev) {
 
         FOREACH_DIRENT_ALL(de, d, return -errno) {
 
-                if (STR_IN_SET(de->d_name, ".", ".."))
+                if (dot_or_dot_dot(de->d_name))
                         continue;
 
                 if (!IN_SET(de->d_type, DT_LNK, DT_UNKNOWN))
                         continue;
 
-                if (found) /* Don't try to support multiple backing block devices */
-                        goto fallback;
+                if (found) {
+                        _cleanup_free_ char *u = NULL, *v = NULL, *a = NULL, *b = NULL;
+
+                        /* We found a device backed by multiple other devices. We don't really support automatic
+                         * discovery on such setups, with the exception of dm-verity partitions. In this case there are
+                         * two backing devices: the data partition and the hash partition. We are fine with such
+                         * setups, however, only if both partitions are on the same physical device. Hence, let's
+                         * verify this. */
+
+                        u = strjoin(p, "/", de->d_name, "/../dev");
+                        if (!u)
+                                return -ENOMEM;
+
+                        v = strjoin(p, "/", found->d_name, "/../dev");
+                        if (!v)
+                                return -ENOMEM;
+
+                        r = read_one_line_file(u, &a);
+                        if (r < 0) {
+                                log_debug_errno(r, "Failed to read %s: %m", u);
+                                goto fallback;
+                        }
+
+                        r = read_one_line_file(v, &b);
+                        if (r < 0) {
+                                log_debug_errno(r, "Failed to read %s: %m", v);
+                                goto fallback;
+                        }
+
+                        /* Check if the parent device is the same. If not, then the two backing devices are on
+                         * different physical devices, and we don't support that. */
+                        if (!streq(a, b))
+                                goto fallback;
+                }
 
                 found = de;
         }
@@ -905,26 +739,38 @@ fallback:
         return 1;
 }
 
-static int parse_proc_cmdline_item(const char *key, const char *value) {
+static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
         int r;
 
         assert(key);
 
-        if (STR_IN_SET(key, "systemd.gpt_auto", "rd.systemd.gpt_auto") && value) {
+        if (STR_IN_SET(key, "systemd.gpt_auto", "rd.systemd.gpt_auto")) {
 
-                r = parse_boolean(value);
+                r = value ? parse_boolean(value) : 1;
                 if (r < 0)
                         log_warning("Failed to parse gpt-auto switch \"%s\". Ignoring.", value);
                 else
                         arg_enabled = r;
 
-        } else if (streq(key, "root") && value) {
+        } else if (streq(key, "root")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 /* Disable root disk logic if there's a root= value
                  * specified (unless it happens to be "gpt-auto") */
 
                 arg_root_enabled = streq(value, "gpt-auto");
 
+        } else if (streq(key, "roothash")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
+                /* Disable root disk logic if there's roothash= defined (i.e. verity enabled) */
+
+                arg_root_enabled = false;
+
         } else if (streq(key, "rw") && !value)
                 arg_root_rw = true;
         else if (streq(key, "ro") && !value)
@@ -933,6 +779,16 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
         return 0;
 }
 
+#ifdef ENABLE_EFI
+static int add_root_cryptsetup(void) {
+
+        /* If a device /dev/gpt-auto-root-luks appears, then make it pull in systemd-cryptsetup-root.service, which
+         * sets it up, and causes /dev/gpt-auto-root to appear which is all we are looking for. */
+
+        return add_cryptsetup("root", "/dev/gpt-auto-root-luks", true, false, NULL);
+}
+#endif
+
 static int add_root_mount(void) {
 
 #ifdef ENABLE_EFI
@@ -958,6 +814,10 @@ static int add_root_mount(void) {
                 r = generator_write_initrd_root_device_deps(arg_dest, "/dev/gpt-auto-root");
                 if (r < 0)
                         return 0;
+
+                r = add_root_cryptsetup();
+                if (r < 0)
+                        return r;
         }
 
         return add_mount(
@@ -981,11 +841,11 @@ static int add_mounts(void) {
         r = get_block_device_harder("/", &devno);
         if (r < 0)
                 return log_error_errno(r, "Failed to determine block device of root file system: %m");
-        else if (r == 0) {
+        if (r == 0) {
                 r = get_block_device_harder("/usr", &devno);
                 if (r < 0)
                         return log_error_errno(r, "Failed to determine block device of /usr file system: %m");
-                else if (r == 0) {
+                if (r == 0) {
                         log_debug("Neither root nor /usr file system are on a (single) block device.");
                         return 0;
                 }
@@ -995,7 +855,7 @@ static int add_mounts(void) {
 }
 
 int main(int argc, char *argv[]) {
-        int r = 0;
+        int r = 0, k;
 
         if (argc > 1 && argc != 4) {
                 log_error("This program takes three or no arguments.");
@@ -1016,7 +876,7 @@ int main(int argc, char *argv[]) {
                 return EXIT_SUCCESS;
         }
 
-        r = parse_proc_cmdline(parse_proc_cmdline_item);
+        r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0);
         if (r < 0)
                 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
 
@@ -1029,8 +889,6 @@ int main(int argc, char *argv[]) {
                 r = add_root_mount();
 
         if (!in_initrd()) {
-                int k;
-
                 k = add_mounts();
                 if (k < 0)
                         r = k;
index d7ee80d..a97fe66 100644 (file)
 #include "util.h"
 
 static const char *arg_dest = "/tmp";
-static char *arg_resume_dev = NULL;
+static char *arg_resume_device = NULL;
 
-static int parse_proc_cmdline_item(const char *key, const char *value) {
+static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
 
-        if (streq(key, "resume") && value) {
-                free(arg_resume_dev);
-                arg_resume_dev = fstab_node_to_udev_node(value);
-                if (!arg_resume_dev)
+        if (streq(key, "resume")) {
+                char *s;
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
+                s = fstab_node_to_udev_node(value);
+                if (!s)
                         return log_oom();
+
+                free(arg_resume_device);
+                arg_resume_device = s;
         }
 
         return 0;
@@ -49,14 +56,14 @@ static int process_resume(void) {
         _cleanup_free_ char *name = NULL, *lnk = NULL;
         int r;
 
-        if (!arg_resume_dev)
+        if (!arg_resume_device)
                 return 0;
 
-        r = unit_name_from_path_instance("systemd-hibernate-resume", arg_resume_dev, ".service", &name);
+        r = unit_name_from_path_instance("systemd-hibernate-resume", arg_resume_device, ".service", &name);
         if (r < 0)
                 return log_error_errno(r, "Failed to generate unit name: %m");
 
-        lnk = strjoin(arg_dest, "/" SPECIAL_SYSINIT_TARGET ".wants/", name, NULL);
+        lnk = strjoin(arg_dest, "/" SPECIAL_SYSINIT_TARGET ".wants/", name);
         if (!lnk)
                 return log_oom();
 
@@ -88,12 +95,12 @@ int main(int argc, char *argv[]) {
         if (!in_initrd())
                 return EXIT_SUCCESS;
 
-        r = parse_proc_cmdline(parse_proc_cmdline_item);
+        r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0);
         if (r < 0)
                 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
 
         r = process_resume();
-        free(arg_resume_dev);
+        free(arg_resume_device);
 
         return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }
index c16a324..f5a9de9 100644 (file)
@@ -137,10 +137,8 @@ static int show_one_name(sd_bus *bus, const char* attr) {
                         "org.freedesktop.hostname1",
                         attr,
                         &error, &reply, "s");
-        if (r < 0) {
-                log_error("Could not get property: %s", bus_error_message(&error, -r));
-                return r;
-        }
+        if (r < 0)
+                return log_error_errno(r, "Could not get property: %s", bus_error_message(&error, r));
 
         r = sd_bus_message_read(reply, "s", &s);
         if (r < 0)
@@ -151,7 +149,7 @@ static int show_one_name(sd_bus *bus, const char* attr) {
         return 0;
 }
 
-static int show_all_names(sd_bus *bus) {
+static int show_all_names(sd_bus *bus, sd_bus_error *error) {
         StatusInfo info = {};
 
         static const struct bus_properties_map hostname_map[]  = {
@@ -181,6 +179,7 @@ static int show_all_names(sd_bus *bus) {
                                    "org.freedesktop.hostname1",
                                    "/org/freedesktop/hostname1",
                                    hostname_map,
+                                   error,
                                    &info);
         if (r < 0)
                 goto fail;
@@ -189,6 +188,7 @@ static int show_all_names(sd_bus *bus) {
                                "org.freedesktop.systemd1",
                                "/org/freedesktop/systemd1",
                                manager_map,
+                               error,
                                &info);
 
         print_status_info(&info);
@@ -212,6 +212,8 @@ fail:
 }
 
 static int show_status(sd_bus *bus, char **args, unsigned n) {
+        int r;
+
         assert(args);
 
         if (arg_pretty || arg_static || arg_transient) {
@@ -226,8 +228,15 @@ static int show_status(sd_bus *bus, char **args, unsigned n) {
                         arg_static ? "StaticHostname" : "Hostname";
 
                 return show_one_name(bus, attr);
-        } else
-                return show_all_names(bus);
+        } else {
+                _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+
+                r = show_all_names(bus, &error);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to query system properties: %s", bus_error_message(&error, r));
+
+                return 0;
+        }
 }
 
 static int set_simple_string(sd_bus *bus, const char *method, const char *value) {
@@ -251,7 +260,7 @@ static int set_simple_string(sd_bus *bus, const char *method, const char *value)
 
 static int set_hostname(sd_bus *bus, char **args, unsigned n) {
         _cleanup_free_ char *h = NULL;
-        char *hostname = args[1];
+        const char *hostname = args[1];
         int r;
 
         assert(args);
@@ -263,27 +272,29 @@ static int set_hostname(sd_bus *bus, char **args, unsigned n) {
         if (arg_pretty) {
                 const char *p;
 
-                /* If the passed hostname is already valid, then
-                 * assume the user doesn't know anything about pretty
-                 * hostnames, so let's unset the pretty hostname, and
-                 * just set the passed hostname as static/dynamic
+                /* If the passed hostname is already valid, then assume the user doesn't know anything about pretty
+                 * hostnames, so let's unset the pretty hostname, and just set the passed hostname as static/dynamic
                  * hostname. */
-
-                if (arg_static && hostname_is_valid(hostname, true)) {
-                        p = "";
-                        /* maybe get rid of trailing dot */
-                        hostname = hostname_cleanup(hostname);
-                } else {
-                        p = h = strdup(hostname);
-                        if (!p)
-                                return log_oom();
-
-                        hostname_cleanup(hostname);
-                }
+                if (arg_static && hostname_is_valid(hostname, true))
+                        p = ""; /* No pretty hostname (as it is redundant), just a static one */
+                else
+                        p = hostname; /* Use the passed name as pretty hostname */
 
                 r = set_simple_string(bus, "SetPrettyHostname", p);
                 if (r < 0)
                         return r;
+
+                /* Now that we set the pretty hostname, let's clean up the parameter and use that as static
+                 * hostname. If the hostname was already valid as static hostname, this will only chop off the trailing
+                 * dot if there is one. If it was not valid, then it will be made fully valid by truncating, dropping
+                 * multiple dots, and dropping weird chars. Note that we clean the name up only if we also are
+                 * supposed to set the pretty name. If the pretty name is not being set we assume the user knows what
+                 * he does and pass the name as-is. */
+                h = strdup(hostname);
+                if (!h)
+                        return log_oom();
+
+                hostname = hostname_cleanup(h); /* Use the cleaned up name as static hostname */
         }
 
         if (arg_static) {
index fe8bb62..fe0aa00 100644 (file)
@@ -133,6 +133,7 @@ static bool valid_chassis(const char *chassis) {
                         "container\0"
                         "desktop\0"
                         "laptop\0"
+                        "convertible\0"
                         "server\0"
                         "tablet\0"
                         "handset\0"
@@ -148,56 +149,65 @@ static bool valid_deployment(const char *deployment) {
 }
 
 static const char* fallback_chassis(void) {
-        int r;
         char *type;
         unsigned t;
-        int v;
+        int v, r;
 
         v = detect_virtualization();
-
         if (VIRTUALIZATION_IS_VM(v))
                 return "vm";
         if (VIRTUALIZATION_IS_CONTAINER(v))
                 return "container";
 
-        r = read_one_line_file("/sys/firmware/acpi/pm_profile", &type);
+        r = read_one_line_file("/sys/class/dmi/id/chassis_type", &type);
         if (r < 0)
-                goto try_dmi;
+                goto try_acpi;
 
         r = safe_atou(type, &t);
         free(type);
         if (r < 0)
-                goto try_dmi;
+                goto try_acpi;
 
-        /* We only list the really obvious cases here as the ACPI data
-         * is not really super reliable.
-         *
-         * See the ACPI 5.0 Spec Section 5.2.9.1 for details:
-         *
-         * http://www.acpi.info/DOWNLOADS/ACPIspec50.pdf
+        /* We only list the really obvious cases here. The DMI data is unreliable enough, so let's not do any
+           additional guesswork on top of that.
+
+           See the SMBIOS Specification 3.0 section 7.4.1 for details about the values listed here:
+
+           https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.0.0.pdf
          */
 
-        switch(t) {
+        switch (t) {
 
-        case 1:
-        case 3:
-        case 6:
+        case 0x3: /* Desktop */
+        case 0x4: /* Low Profile Desktop */
+        case 0x6: /* Mini Tower */
+        case 0x7: /* Tower */
                 return "desktop";
 
-        case 2:
+        case 0x8: /* Portable */
+        case 0x9: /* Laptop */
+        case 0xA: /* Notebook */
+        case 0xE: /* Sub Notebook */
                 return "laptop";
 
-        case 4:
-        case 5:
-        case 7:
+        case 0xB: /* Hand Held */
+                return "handset";
+
+        case 0x11: /* Main Server Chassis */
+        case 0x1C: /* Blade */
+        case 0x1D: /* Blade Enclosure */
                 return "server";
 
-        case 8:
+        case 0x1E: /* Tablet */
                 return "tablet";
+
+        case 0x1F: /* Convertible */
+        case 0x20: /* Detachable */
+                return "convertible";
         }
 
-try_dmi:
-        r = read_one_line_file("/sys/class/dmi/id/chassis_type", &type);
+try_acpi:
+        r = read_one_line_file("/sys/firmware/acpi/pm_profile", &type);
         if (r < 0)
                 return NULL;
 
@@ -206,39 +216,29 @@ try_dmi:
         if (r < 0)
                 return NULL;
 
-        /* We only list the really obvious cases here. The DMI data is
-           unreliable enough, so let's not do any additional guesswork
-           on top of that.
-
-           See the SMBIOS Specification 3.0 section 7.4.1 for
-           details about the values listed here:
-
-           https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.0.0.pdf
+        /* We only list the really obvious cases here as the ACPI data is not really super reliable.
+         *
+         * See the ACPI 5.0 Spec Section 5.2.9.1 for details:
+         *
+         * http://www.acpi.info/DOWNLOADS/ACPIspec50.pdf
          */
 
-        switch (t) {
+        switch(t) {
 
-        case 0x3:
-        case 0x4:
-        case 0x6:
-        case 0x7:
+        case 1: /* Desktop */
+        case 3: /* Workstation */
+        case 6: /* Appliance PC */
                 return "desktop";
 
-        case 0x8:
-        case 0x9:
-        case 0xA:
-        case 0xE:
+        case 2: /* Mobile */
                 return "laptop";
 
-        case 0xB:
-                return "handset";
-
-        case 0x11:
-        case 0x1C:
-        case 0x1D:
+        case 4: /* Enterprise Server */
+        case 5: /* SOHO Server */
+        case 7: /* Performance Server */
                 return "server";
 
-        case 0x1E:
+        case 8: /* Tablet */
                 return "tablet";
         }
 
@@ -288,7 +288,7 @@ static int context_update_kernel_hostname(Context *c) {
 
         /* ... and the ultimate fallback */
         else
-                hn = "localhost";
+                hn = FALLBACK_HOSTNAME;
 
         if (sethostname_idempotent(hn) < 0)
                 return -errno;
@@ -340,7 +340,7 @@ static int context_write_data_machine_info(Context *c) {
                         continue;
                 }
 
-                t = strjoin(name[p], "=", c->data[p], NULL);
+                t = strjoin(name[p], "=", c->data[p]);
                 if (!t)
                         return -ENOMEM;
 
@@ -424,7 +424,7 @@ static int method_set_hostname(sd_bus_message *m, void *userdata, sd_bus_error *
                 name = c->data[PROP_STATIC_HOSTNAME];
 
         if (isempty(name))
-                name = "localhost";
+                name = FALLBACK_HOSTNAME;
 
         if (!hostname_is_valid(name, false))
                 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid hostname '%s'", name);
@@ -456,7 +456,7 @@ static int method_set_hostname(sd_bus_message *m, void *userdata, sd_bus_error *
         r = context_update_kernel_hostname(c);
         if (r < 0) {
                 log_error_errno(r, "Failed to set host name: %m");
-                return sd_bus_error_set_errnof(error, r, "Failed to set hostname: %s", strerror(-r));
+                return sd_bus_error_set_errnof(error, r, "Failed to set hostname: %m");
         }
 
         log_info("Changed host name to '%s'", strna(c->data[PROP_HOSTNAME]));
@@ -517,13 +517,13 @@ static int method_set_static_hostname(sd_bus_message *m, void *userdata, sd_bus_
         r = context_update_kernel_hostname(c);
         if (r < 0) {
                 log_error_errno(r, "Failed to set host name: %m");
-                return sd_bus_error_set_errnof(error, r, "Failed to set hostname: %s", strerror(-r));
+                return sd_bus_error_set_errnof(error, r, "Failed to set hostname: %m");
         }
 
         r = context_write_data_static_hostname(c);
         if (r < 0) {
                 log_error_errno(r, "Failed to write static host name: %m");
-                return sd_bus_error_set_errnof(error, r, "Failed to set static hostname: %s", strerror(-r));
+                return sd_bus_error_set_errnof(error, r, "Failed to set static hostname: %m");
         }
 
         log_info("Changed static host name to '%s'", strna(c->data[PROP_STATIC_HOSTNAME]));
@@ -598,7 +598,7 @@ static int set_machine_info(Context *c, sd_bus_message *m, int prop, sd_bus_mess
         r = context_write_data_machine_info(c);
         if (r < 0) {
                 log_error_errno(r, "Failed to write machine info: %m");
-                return sd_bus_error_set_errnof(error, r, "Failed to write machine info: %s", strerror(-r));
+                return sd_bus_error_set_errnof(error, r, "Failed to write machine info: %m");
         }
 
         log_info("Changed %s to '%s'",
diff --git a/src/hostname/meson.build b/src/hostname/meson.build
new file mode 100644 (file)
index 0000000..d58caa6
--- /dev/null
@@ -0,0 +1,14 @@
+if conf.get('ENABLE_HOSTNAMED', false)
+        install_data('org.freedesktop.hostname1.conf',
+                     install_dir : dbuspolicydir)
+        install_data('org.freedesktop.hostname1.service',
+                     install_dir : dbussystemservicedir)
+
+        custom_target(
+                'org.freedesktop.hostname1.policy',
+                input : 'org.freedesktop.hostname1.policy.in',
+                output : 'org.freedesktop.hostname1.policy',
+                command : intltool_command,
+                install : install_polkit,
+                install_dir : polkitpolicydir)
+endif
index e12cd93..793398c 100644 (file)
@@ -31,6 +31,7 @@
 #include "hwdb-util.h"
 #include "label.h"
 #include "mkdir.h"
+#include "path-util.h"
 #include "selinux-util.h"
 #include "strbuf.h"
 #include "string-util.h"
@@ -39,7 +40,7 @@
 #include "verbs.h"
 
 /*
- * Generic udev properties, key/value database based on modalias strings.
+ * Generic udev properties, key-value database based on modalias strings.
  * Uses a Patricia/radix trie to index all matches for efficient lookup.
  */
 
@@ -70,7 +71,7 @@ struct trie_node {
         struct trie_child_entry *children;
         uint8_t children_count;
 
-        /* sorted array of key/value pairs */
+        /* sorted array of key-value pairs */
         struct trie_value_entry *values;
         size_t values_count;
 };
@@ -81,10 +82,13 @@ struct trie_child_entry {
         struct trie_node *child;
 };
 
-/* value array item with key/value pairs */
+/* value array item with key-value pairs */
 struct trie_value_entry {
         size_t key_off;
         size_t value_off;
+        size_t filename_off;
+        uint32_t line_number;
+        uint16_t file_priority;
 };
 
 static int trie_children_cmp(const void *v1, const void *v2) {
@@ -157,8 +161,9 @@ static int trie_values_cmp(const void *v1, const void *v2, void *arg) {
 }
 
 static int trie_node_add_value(struct trie *trie, struct trie_node *node,
-                          const char *key, const char *value) {
-        ssize_t k, v;
+                               const char *key, const char *value,
+                               const char *filename, uint16_t file_priority, uint32_t line_number) {
+        ssize_t k, v, fn;
         struct trie_value_entry *val;
 
         k = strbuf_add_string(trie->strings, key, strlen(key));
@@ -167,6 +172,9 @@ static int trie_node_add_value(struct trie *trie, struct trie_node *node,
         v = strbuf_add_string(trie->strings, value, strlen(value));
         if (v < 0)
                 return v;
+        fn = strbuf_add_string(trie->strings, filename, strlen(filename));
+        if (fn < 0)
+                return fn;
 
         if (node->values_count) {
                 struct trie_value_entry search = {
@@ -176,8 +184,13 @@ static int trie_node_add_value(struct trie *trie, struct trie_node *node,
 
                 val = xbsearch_r(&search, node->values, node->values_count, sizeof(struct trie_value_entry), trie_values_cmp, trie);
                 if (val) {
-                        /* replace existing earlier key with new value */
+                        /* At this point we have 2 identical properties on the same match-string.
+                         * Since we process files in order, we just replace the previous value.
+                         */
                         val->value_off = v;
+                        val->filename_off = fn;
+                        val->file_priority = file_priority;
+                        val->line_number = line_number;
                         return 0;
                 }
         }
@@ -190,15 +203,19 @@ static int trie_node_add_value(struct trie *trie, struct trie_node *node,
         node->values = val;
         node->values[node->values_count].key_off = k;
         node->values[node->values_count].value_off = v;
+        node->values[node->values_count].filename_off = fn;
+        node->values[node->values_count].file_priority = file_priority;
+        node->values[node->values_count].line_number = line_number;
         node->values_count++;
         qsort_r(node->values, node->values_count, sizeof(struct trie_value_entry), trie_values_cmp, trie);
         return 0;
 }
 
 static int trie_insert(struct trie *trie, struct trie_node *node, const char *search,
-                       const char *key, const char *value) {
+                       const char *key, const char *value,
+                       const char *filename, uint16_t file_priority, uint32_t line_number) {
         size_t i = 0;
-        int err = 0;
+        int r = 0;
 
         for (;;) {
                 size_t p;
@@ -239,9 +256,9 @@ static int trie_insert(struct trie *trie, struct trie_node *node, const char *se
                         node->children_count = 0;
                         node->values = NULL;
                         node->values_count = 0;
-                        err = node_add_child(trie, node, new_child, c);
-                        if (err < 0)
-                                return err;
+                        r = node_add_child(trie, node, new_child, c);
+                        if (r < 0)
+                                return r;
 
                         new_child = NULL; /* avoid cleanup */
                         break;
@@ -250,7 +267,7 @@ static int trie_insert(struct trie *trie, struct trie_node *node, const char *se
 
                 c = search[i];
                 if (c == '\0')
-                        return trie_node_add_value(trie, node, key, value);
+                        return trie_node_add_value(trie, node, key, value, filename, file_priority, line_number);
 
                 child = node_lookup(node, c);
                 if (!child) {
@@ -268,13 +285,13 @@ static int trie_insert(struct trie *trie, struct trie_node *node, const char *se
                         }
 
                         child->prefix_off = off;
-                        err = node_add_child(trie, node, child, c);
-                        if (err < 0) {
+                        r = node_add_child(trie, node, child, c);
+                        if (r < 0) {
                                 free(child);
-                                return err;
+                                return r;
                         }
 
-                        return trie_node_add_value(trie, child, key, value);
+                        return trie_node_add_value(trie, child, key, value, filename, file_priority, line_number);
                 }
 
                 node = child;
@@ -303,7 +320,7 @@ static void trie_store_nodes_size(struct trie_f *trie, struct trie_node *node) {
         for (i = 0; i < node->children_count; i++)
                 trie->strings_off += sizeof(struct trie_child_entry_f);
         for (i = 0; i < node->values_count; i++)
-                trie->strings_off += sizeof(struct trie_value_entry_f);
+                trie->strings_off += sizeof(struct trie_value_entry2_f);
 }
 
 static int64_t trie_store_nodes(struct trie_f *trie, struct trie_node *node) {
@@ -313,11 +330,11 @@ static int64_t trie_store_nodes(struct trie_f *trie, struct trie_node *node) {
                 .children_count = node->children_count,
                 .values_count = htole64(node->values_count),
         };
-        struct trie_child_entry_f *children = NULL;
+        _cleanup_free_ struct trie_child_entry_f *children = NULL;
         int64_t node_off;
 
         if (node->children_count) {
-                children = new0(struct trie_child_entry_f, node->children_count);
+                children = new(struct trie_child_entry_f, node->children_count);
                 if (!children)
                         return -ENOMEM;
         }
@@ -327,12 +344,13 @@ static int64_t trie_store_nodes(struct trie_f *trie, struct trie_node *node) {
                 int64_t child_off;
 
                 child_off = trie_store_nodes(trie, node->children[i].child);
-                if (child_off < 0) {
-                        free(children);
+                if (child_off < 0)
                         return child_off;
-                }
-                children[i].c = node->children[i].c;
-                children[i].child_off = htole64(child_off);
+
+                children[i] = (struct trie_child_entry_f) {
+                        .c = node->children[i].c,
+                        .child_off = htole64(child_off),
+                };
         }
 
         /* write node */
@@ -344,19 +362,21 @@ static int64_t trie_store_nodes(struct trie_f *trie, struct trie_node *node) {
         if (node->children_count) {
                 fwrite(children, sizeof(struct trie_child_entry_f), node->children_count, trie->f);
                 trie->children_count += node->children_count;
-                free(children);
         }
 
         /* append values array */
         for (i = 0; i < node->values_count; i++) {
-                struct trie_value_entry_f v = {
+                struct trie_value_entry2_f v = {
                         .key_off = htole64(trie->strings_off + node->values[i].key_off),
                         .value_off = htole64(trie->strings_off + node->values[i].value_off),
+                        .filename_off = htole64(trie->strings_off + node->values[i].filename_off),
+                        .line_number = htole32(node->values[i].line_number),
+                        .file_priority = htole16(node->values[i].file_priority),
                 };
 
-                fwrite(&v, sizeof(struct trie_value_entry_f), 1, trie->f);
-                trie->values_count++;
+                fwrite(&v, sizeof(struct trie_value_entry2_f), 1, trie->f);
         }
+        trie->values_count += node->values_count;
 
         return node_off;
 }
@@ -371,30 +391,27 @@ static int trie_store(struct trie *trie, const char *filename) {
         int64_t size;
         struct trie_header_f h = {
                 .signature = HWDB_SIG,
-                .tool_version = htole64(atoi(VERSION)),
+                .tool_version = htole64(atoi(PACKAGE_VERSION)),
                 .header_size = htole64(sizeof(struct trie_header_f)),
                 .node_size = htole64(sizeof(struct trie_node_f)),
                 .child_entry_size = htole64(sizeof(struct trie_child_entry_f)),
-                .value_entry_size = htole64(sizeof(struct trie_value_entry_f)),
+                .value_entry_size = htole64(sizeof(struct trie_value_entry2_f)),
         };
-        int err;
+        int r;
 
         /* calculate size of header, nodes, children entries, value entries */
         t.strings_off = sizeof(struct trie_header_f);
         trie_store_nodes_size(&t, trie->root);
 
-        err = fopen_temporary(filename , &t.f, &filename_tmp);
-        if (err < 0)
-                return err;
+        r = fopen_temporary(filename , &t.f, &filename_tmp);
+        if (r < 0)
+                return r;
         fchmod(fileno(t.f), 0444);
 
         /* write nodes */
-        err = fseeko(t.f, sizeof(struct trie_header_f), SEEK_SET);
-        if (err < 0) {
-                fclose(t.f);
-                unlink_noerrno(filename_tmp);
-                return -errno;
-        }
+        if (fseeko(t.f, sizeof(struct trie_header_f), SEEK_SET) < 0)
+                goto error;
+
         root_off = trie_store_nodes(&t, trie->root);
         h.nodes_root_off = htole64(root_off);
         pos = ftello(t.f);
@@ -407,20 +424,13 @@ static int trie_store(struct trie *trie, const char *filename) {
         /* write header */
         size = ftello(t.f);
         h.file_size = htole64(size);
-        err = fseeko(t.f, 0, SEEK_SET);
-        if (err < 0) {
-                fclose(t.f);
-                unlink_noerrno(filename_tmp);
-                return -errno;
-        }
+        if (fseeko(t.f, 0, SEEK_SET) < 0)
+                goto error;
+
         fwrite(&h, sizeof(struct trie_header_f), 1, t.f);
-        err = ferror(t.f);
-        if (err)
-                err = -errno;
-        fclose(t.f);
-        if (err < 0 || rename(filename_tmp, filename) < 0) {
+        if (fclose(t.f) < 0 || rename(filename_tmp, filename) < 0) {
                 unlink_noerrno(filename_tmp);
-                return err < 0 ? err : -errno;
+                return -errno;
         }
 
         log_debug("=== trie on-disk ===");
@@ -431,41 +441,49 @@ static int trie_store(struct trie *trie, const char *filename) {
         log_debug("child pointers:   %8"PRIu64" bytes (%8"PRIu64")",
                   t.children_count * sizeof(struct trie_child_entry_f), t.children_count);
         log_debug("value pointers:   %8"PRIu64" bytes (%8"PRIu64")",
-                  t.values_count * sizeof(struct trie_value_entry_f), t.values_count);
+                  t.values_count * sizeof(struct trie_value_entry2_f), t.values_count);
         log_debug("string store:     %8zu bytes", trie->strings->len);
         log_debug("strings start:    %8"PRIu64, t.strings_off);
-
         return 0;
+
+ error:
+        r = -errno;
+        fclose(t.f);
+        unlink(filename_tmp);
+        return r;
 }
 
-static int insert_data(struct trie *trie, char **match_list, char *line, const char *filename) {
+static int insert_data(struct trie *trie, char **match_list, char *line,
+                       const char *filename, uint16_t file_priority, uint32_t line_number) {
         char *value, **entry;
 
+        assert(line[0] == ' ');
+
         value = strchr(line, '=');
-        if (!value) {
-                log_error("Error, key/value pair expected but got '%s' in '%s':", line, filename);
-                return -EINVAL;
-        }
+        if (!value)
+                return log_syntax(NULL, LOG_WARNING, filename, line_number, EINVAL,
+                                  "Key-value pair expected but got \"%s\", ignoring", line);
 
         value[0] = '\0';
         value++;
 
-        /* libudev requires properties to start with a space */
+        /* Replace multiple leading spaces by a single space */
         while (isblank(line[0]) && isblank(line[1]))
                 line++;
 
-        if (line[0] == '\0' || value[0] == '\0') {
-                log_error("Error, empty key or value '%s' in '%s':", line, filename);
-                return -EINVAL;
-        }
+        if (isempty(line + 1) || isempty(value))
+                return log_syntax(NULL, LOG_WARNING, filename, line_number, EINVAL,
+                                  "Empty %s in \"%s=%s\", ignoring",
+                                  isempty(line + 1) ? "key" : "value",
+                                  line, value);
 
         STRV_FOREACH(entry, match_list)
-                trie_insert(trie, trie->root, *entry, line, value);
+                trie_insert(trie, trie->root, *entry, line, value, filename, file_priority, line_number);
 
         return 0;
 }
 
-static int import_file(struct trie *trie, const char *filename) {
+static int import_file(struct trie *trie, const char *filename, uint16_t file_priority) {
         enum {
                 HW_NONE,
                 HW_MATCH,
@@ -474,6 +492,7 @@ static int import_file(struct trie *trie, const char *filename) {
         _cleanup_fclose_ FILE *f = NULL;
         char line[LINE_MAX];
         _cleanup_strv_free_ char **match_list = NULL;
+        uint32_t line_number = 0;
         char *match = NULL;
         int r;
 
@@ -485,6 +504,8 @@ static int import_file(struct trie *trie, const char *filename) {
                 size_t len;
                 char *pos;
 
+                ++line_number;
+
                 /* comment line */
                 if (line[0] == '#')
                         continue;
@@ -506,7 +527,8 @@ static int import_file(struct trie *trie, const char *filename) {
                                 break;
 
                         if (line[0] == ' ') {
-                                log_error("Error, MATCH expected but got '%s' in '%s':", line, filename);
+                                log_syntax(NULL, LOG_WARNING, filename, line_number, EINVAL,
+                                           "Match expected but got indented property \"%s\", ignoring line", line);
                                 break;
                         }
 
@@ -525,14 +547,16 @@ static int import_file(struct trie *trie, const char *filename) {
 
                 case HW_MATCH:
                         if (len == 0) {
-                                log_error("Error, DATA expected but got empty line in '%s':", filename);
+                                log_syntax(NULL, LOG_WARNING, filename, line_number, EINVAL,
+                                           "Property expected, ignoring record with no properties");
+
                                 state = HW_NONE;
                                 strv_clear(match_list);
                                 break;
                         }
 
-                        /* another match */
                         if (line[0] != ' ') {
+                                /* another match */
                                 match = strdup(line);
                                 if (!match)
                                         return -ENOMEM;
@@ -546,29 +570,34 @@ static int import_file(struct trie *trie, const char *filename) {
 
                         /* first data */
                         state = HW_DATA;
-                        insert_data(trie, match_list, line, filename);
+                        insert_data(trie, match_list, line, filename, file_priority, line_number);
                         break;
 
                 case HW_DATA:
-                        /* end of record */
                         if (len == 0) {
+                                /* end of record */
                                 state = HW_NONE;
                                 strv_clear(match_list);
                                 break;
                         }
 
                         if (line[0] != ' ') {
-                                log_error("Error, DATA expected but got '%s' in '%s':", line, filename);
+                                log_syntax(NULL, LOG_WARNING, filename, line_number, EINVAL,
+                                           "Property or empty line expected, got \"%s\", ignoring record", line);
                                 state = HW_NONE;
                                 strv_clear(match_list);
                                 break;
                         }
 
-                        insert_data(trie, match_list, line, filename);
+                        insert_data(trie, match_list, line, filename, file_priority, line_number);
                         break;
                 };
         }
 
+        if (state == HW_MATCH)
+                log_syntax(NULL, LOG_WARNING, filename, line_number, EINVAL,
+                           "Property expected, ignoring record with no properties");
+
         return 0;
 }
 
@@ -596,7 +625,9 @@ static int hwdb_query(int argc, char *argv[], void *userdata) {
 static int hwdb_update(int argc, char *argv[], void *userdata) {
         _cleanup_free_ char *hwdb_bin = NULL;
         _cleanup_(trie_freep) struct trie *trie = NULL;
-        char **files, **f;
+        _cleanup_strv_free_ char **files = NULL;
+        char **f;
+        uint16_t file_priority = 1;
         int r;
 
         trie = new0(struct trie, 1);
@@ -617,13 +648,12 @@ static int hwdb_update(int argc, char *argv[], void *userdata) {
 
         r = conf_files_list_strv(&files, ".hwdb", arg_root, conf_file_dirs);
         if (r < 0)
-                return log_error_errno(r, "failed to enumerate hwdb files: %m");
+                return log_error_errno(r, "Failed to enumerate hwdb files: %m");
 
         STRV_FOREACH(f, files) {
-                log_debug("reading file '%s'", *f);
-                import_file(trie, *f);
+                log_debug("Reading file \"%s\"", *f);
+                import_file(trie, *f, file_priority++);
         }
-        strv_free(files);
 
         strbuf_complete(trie->strings);
 
@@ -641,7 +671,7 @@ static int hwdb_update(int argc, char *argv[], void *userdata) {
         log_debug("strings dedup'ed: %8zu bytes (%8zu)",
                   trie->strings->dedup_len, trie->strings->dedup_count);
 
-        hwdb_bin = strjoin(arg_root, "/", arg_hwdb_bin_dir, "/hwdb.bin", NULL);
+        hwdb_bin = path_join(arg_root, arg_hwdb_bin_dir, "hwdb.bin");
         if (!hwdb_bin)
                 return -ENOMEM;
 
index 6990c47..0e8f3fb 100644 (file)
@@ -235,9 +235,7 @@ CurlGlue *curl_glue_unref(CurlGlue *g) {
 
         sd_event_source_unref(g->timer);
         sd_event_unref(g->event);
-        free(g);
-
-        return NULL;
+        return mfree(g);
 }
 
 int curl_glue_new(CurlGlue **glue, sd_event *event) {
@@ -402,7 +400,7 @@ int curl_header_strdup(const void *contents, size_t sz, const char *field, char
                 sz--;
         }
 
-        /* Truncate trailing whitespace*/
+        /* Truncate trailing whitespace */
         while (sz > 0 && strchr(WHITESPACE, p[sz-1]))
                 sz--;
 
index db06e11..a3dbce1 100644 (file)
@@ -34,6 +34,7 @@
 #include "fd-util.h"
 #include "fileio.h"
 #include "import-common.h"
+#include "missing.h"
 #include "ratelimit.h"
 #include "string-util.h"
 #include "util.h"
@@ -86,9 +87,7 @@ RawExport *raw_export_unref(RawExport *e) {
 
         free(e->buffer);
         free(e->path);
-        free(e);
-
-        return NULL;
+        return mfree(e);
 }
 
 int raw_export_new(
index d79c27f..3bb6027 100644 (file)
@@ -91,9 +91,7 @@ TarExport *tar_export_unref(TarExport *e) {
 
         free(e->buffer);
         free(e->path);
-        free(e);
-
-        return NULL;
+        return mfree(e);
 }
 
 int tar_export_new(
index fd6b9f7..55cf8e8 100644 (file)
@@ -100,9 +100,7 @@ RawImport* raw_import_unref(RawImport *i) {
         free(i->final_path);
         free(i->image_root);
         free(i->local);
-        free(i);
-
-        return NULL;
+        return mfree(i);
 }
 
 int raw_import_new(
@@ -269,7 +267,7 @@ static int raw_import_open_disk(RawImport *i) {
         assert(!i->temp_path);
         assert(i->output_fd < 0);
 
-        i->final_path = strjoin(i->image_root, "/", i->local, ".raw", NULL);
+        i->final_path = strjoin(i->image_root, "/", i->local, ".raw");
         if (!i->final_path)
                 return log_oom();
 
@@ -357,7 +355,7 @@ static int raw_import_process(RawImport *i) {
         }
         if (l == 0) {
                 if (i->compress.type == IMPORT_COMPRESS_UNKNOWN) {
-                        log_error("Premature end of file: %m");
+                        log_error("Premature end of file.");
                         r = -EIO;
                         goto finish;
                 }
@@ -371,7 +369,7 @@ static int raw_import_process(RawImport *i) {
         if (i->compress.type == IMPORT_COMPRESS_UNKNOWN) {
                 r = import_uncompress_detect(&i->compress, i->buffer, i->buffer_size);
                 if (r < 0) {
-                        log_error("Failed to detect file compression: %m");
+                        log_error_errno(r, "Failed to detect file compression: %m");
                         goto finish;
                 }
                 if (r == 0) /* Need more data */
index 8b81324..ba140bc 100644 (file)
@@ -107,9 +107,7 @@ TarImport* tar_import_unref(TarImport *i) {
         free(i->final_path);
         free(i->image_root);
         free(i->local);
-        free(i);
-
-        return NULL;
+        return mfree(i);
 }
 
 int tar_import_new(
@@ -224,7 +222,7 @@ static int tar_import_fork_tar(TarImport *i) {
         assert(!i->temp_path);
         assert(i->tar_fd < 0);
 
-        i->final_path = strjoin(i->image_root, "/", i->local, NULL);
+        i->final_path = strjoin(i->image_root, "/", i->local);
         if (!i->final_path)
                 return log_oom();
 
@@ -286,7 +284,7 @@ static int tar_import_process(TarImport *i) {
         }
         if (l == 0) {
                 if (i->compress.type == IMPORT_COMPRESS_UNKNOWN) {
-                        log_error("Premature end of file: %m");
+                        log_error("Premature end of file.");
                         r = -EIO;
                         goto finish;
                 }
@@ -300,7 +298,7 @@ static int tar_import_process(TarImport *i) {
         if (i->compress.type == IMPORT_COMPRESS_UNKNOWN) {
                 r = import_uncompress_detect(&i->compress, i->buffer, i->buffer_size);
                 if (r < 0) {
-                        log_error("Failed to detect file compression: %m");
+                        log_error_errno(r, "Failed to detect file compression: %m");
                         goto finish;
                 }
                 if (r == 0) /* Need more data */
index 28b4302..3d379d6 100644 (file)
@@ -141,8 +141,7 @@ static Transfer *transfer_unref(Transfer *t) {
         safe_close(t->stdin_fd);
         safe_close(t->stdout_fd);
 
-        free(t);
-        return NULL;
+        return mfree(t);
 }
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(Transfer*, transfer_unref);
@@ -450,8 +449,11 @@ static int transfer_start(Transfer *t) {
 
                 stdio_unset_cloexec();
 
-                setenv("SYSTEMD_LOG_TARGET", "console-prefixed", 1);
-                setenv("NOTIFY_SOCKET", "/run/systemd/import/notify", 1);
+                if (setenv("SYSTEMD_LOG_TARGET", "console-prefixed", 1) < 0 ||
+                    setenv("NOTIFY_SOCKET", "/run/systemd/import/notify", 1) < 0) {
+                        log_error_errno(errno, "setenv() failed: %m");
+                        _exit(EXIT_FAILURE);
+                }
 
                 if (IN_SET(t->type, TRANSFER_IMPORT_TAR, TRANSFER_IMPORT_RAW))
                         cmd[k++] = SYSTEMD_IMPORT_PATH;
@@ -548,8 +550,7 @@ static Manager *manager_unref(Manager *m) {
         m->bus = sd_bus_flush_close_unref(m->bus);
         sd_event_unref(m->event);
 
-        free(m);
-        return NULL;
+        return mfree(m);
 }
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_unref);
diff --git a/src/import/meson.build b/src/import/meson.build
new file mode 100644 (file)
index 0000000..3fd58cc
--- /dev/null
@@ -0,0 +1,77 @@
+systemd_importd_sources = files('''
+        importd.c
+'''.split())
+
+systemd_pull_sources = files('''
+        pull.c
+        pull-raw.c
+        pull-raw.h
+        pull-tar.c
+        pull-tar.h
+        pull-job.c
+        pull-job.h
+        pull-common.c
+        pull-common.h
+        import-common.c
+        import-common.h
+        import-compress.c
+        import-compress.h
+        curl-util.c
+        curl-util.h
+        qcow2-util.c
+        qcow2-util.h
+'''.split())
+
+systemd_import_sources = files('''
+        import.c
+        import-raw.c
+        import-raw.h
+        import-tar.c
+        import-tar.h
+        import-common.c
+        import-common.h
+        import-compress.c
+        import-compress.h
+        qcow2-util.c
+        qcow2-util.h
+'''.split())
+
+systemd_export_sources = files('''
+        export.c
+        export-tar.c
+        export-tar.h
+        export-raw.c
+        export-raw.h
+        import-common.c
+        import-common.h
+        import-compress.c
+        import-compress.h
+'''.split())
+
+if conf.get('ENABLE_IMPORTD', false)
+        install_data('org.freedesktop.import1.conf',
+                     install_dir : dbuspolicydir)
+        install_data('org.freedesktop.import1.service',
+                     install_dir : dbussystemservicedir)
+
+        custom_target(
+                'org.freedesktop.import1.policy',
+                input : 'org.freedesktop.import1.policy.in',
+                output : 'org.freedesktop.import1.policy',
+                command : intltool_command,
+                install : install_polkit,
+                install_dir : polkitpolicydir)
+
+        install_data('import-pubring.gpg',
+                     install_dir : rootlibexecdir)
+        # TODO: shouldn't this be in pkgdatadir?
+endif
+
+tests += [
+        [['src/import/test-qcow2.c',
+          'src/import/qcow2-util.c',
+          'src/import/qcow2-util.h'],
+         [libshared],
+         [libz],
+         'HAVE_ZLIB', 'manual'],
+]
index 2ae2a41..78840dd 100644 (file)
@@ -144,12 +144,12 @@ int pull_make_local_copy(const char *final, const char *image_root, const char *
         if (force_local)
                 (void) rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_SUBVOLUME);
 
-        r = btrfs_subvol_snapshot(final, p, BTRFS_SNAPSHOT_QUOTA);
-        if (r == -ENOTTY) {
-                r = copy_tree(final, p, false);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to copy image: %m");
-        } else if (r < 0)
+        r = btrfs_subvol_snapshot(final, p,
+                                  BTRFS_SNAPSHOT_QUOTA|
+                                  BTRFS_SNAPSHOT_FALLBACK_COPY|
+                                  BTRFS_SNAPSHOT_FALLBACK_DIRECTORY|
+                                  BTRFS_SNAPSHOT_RECURSIVE);
+        if (r < 0)
                 return log_error_errno(r, "Failed to create local image: %m");
 
         log_info("Created new local image '%s'.", local);
@@ -218,37 +218,40 @@ int pull_make_path(const char *url, const char *etag, const char *image_root, co
         return 0;
 }
 
-int pull_make_settings_job(
+int pull_make_auxiliary_job(
                 PullJob **ret,
                 const char *url,
+                int (*strip_suffixes)(const char *name, char **ret),
+                const char *suffix,
                 CurlGlue *glue,
                 PullJobFinished on_finished,
                 void *userdata) {
 
-        _cleanup_free_ char *last_component = NULL, *ll = NULL, *settings_url = NULL;
+        _cleanup_free_ char *last_component = NULL, *ll = NULL, *auxiliary_url = NULL;
         _cleanup_(pull_job_unrefp) PullJob *job = NULL;
         const char *q;
         int r;
 
         assert(ret);
         assert(url);
+        assert(strip_suffixes);
         assert(glue);
 
         r = import_url_last_component(url, &last_component);
         if (r < 0)
                 return r;
 
-        r = tar_strip_suffixes(last_component, &ll);
+        r = strip_suffixes(last_component, &ll);
         if (r < 0)
                 return r;
 
-        q = strjoina(ll, ".nspawn");
+        q = strjoina(ll, suffix);
 
-        r = import_url_change_last_component(url, q, &settings_url);
+        r = import_url_change_last_component(url, q, &auxiliary_url);
         if (r < 0)
                 return r;
 
-        r = pull_job_new(&job, settings_url, glue, userdata);
+        r = pull_job_new(&job, auxiliary_url, glue, userdata);
         if (r < 0)
                 return r;
 
@@ -272,6 +275,7 @@ int pull_make_verification_jobs(
 
         _cleanup_(pull_job_unrefp) PullJob *checksum_job = NULL, *signature_job = NULL;
         int r;
+        const char *chksums = NULL;
 
         assert(ret_checksum_job);
         assert(ret_signature_job);
@@ -281,10 +285,16 @@ int pull_make_verification_jobs(
         assert(glue);
 
         if (verify != IMPORT_VERIFY_NO) {
-                _cleanup_free_ char *checksum_url = NULL;
+                _cleanup_free_ char *checksum_url = NULL, *fn = NULL;
 
-                /* Queue job for the SHA256SUMS file for the image */
-                r = import_url_change_last_component(url, "SHA256SUMS", &checksum_url);
+                /* Queue jobs for the checksum file for the image. */
+                r = import_url_last_component(url, &fn);
+                if (r < 0)
+                        return r;
+
+                chksums = strjoina(fn, ".sha256");
+
+                r = import_url_change_last_component(url, chksums, &checksum_url);
                 if (r < 0)
                         return r;
 
@@ -320,97 +330,110 @@ int pull_make_verification_jobs(
         return 0;
 }
 
-int pull_verify(PullJob *main_job,
-                PullJob *settings_job,
-                PullJob *checksum_job,
-                PullJob *signature_job) {
-
-        _cleanup_close_pair_ int gpg_pipe[2] = { -1, -1 };
+static int verify_one(PullJob *checksum_job, PullJob *job) {
         _cleanup_free_ char *fn = NULL;
-        _cleanup_close_ int sig_file = -1;
-        const char *p, *line;
-        char sig_file_path[] = "/tmp/sigXXXXXX", gpg_home[] = "/tmp/gpghomeXXXXXX";
-        _cleanup_(sigkill_waitp) pid_t pid = 0;
-        bool gpg_home_created = false;
+        const char *line, *p;
         int r;
 
-        assert(main_job);
-        assert(main_job->state == PULL_JOB_DONE);
+        assert(checksum_job);
 
-        if (!checksum_job)
+        if (!job)
                 return 0;
 
-        assert(main_job->calc_checksum);
-        assert(main_job->checksum);
-        assert(checksum_job->state == PULL_JOB_DONE);
+        assert(IN_SET(job->state, PULL_JOB_DONE, PULL_JOB_FAILED));
 
-        if (!checksum_job->payload || checksum_job->payload_size <= 0) {
-                log_error("Checksum is empty, cannot verify.");
-                return -EBADMSG;
-        }
+        /* Don't verify the checksum if we didn't actually successfully download something new */
+        if (job->state != PULL_JOB_DONE)
+                return 0;
+        if (job->error != 0)
+                return 0;
+        if (job->etag_exists)
+                return 0;
+
+        assert(job->calc_checksum);
+        assert(job->checksum);
 
-        r = import_url_last_component(main_job->url, &fn);
+        r = import_url_last_component(job->url, &fn);
         if (r < 0)
                 return log_oom();
 
         if (!filename_is_valid(fn)) {
-                log_error("Cannot verify checksum, could not determine valid server-side file name.");
+                log_error("Cannot verify checksum, could not determine server-side file name.");
                 return -EBADMSG;
         }
 
-        line = strjoina(main_job->checksum, " *", fn, "\n");
+        line = strjoina(job->checksum, " *", fn, "\n");
 
         p = memmem(checksum_job->payload,
                    checksum_job->payload_size,
                    line,
                    strlen(line));
 
+        if (!p) {
+                line = strjoina(job->checksum, "  ", fn, "\n");
+
+                p = memmem(checksum_job->payload,
+                        checksum_job->payload_size,
+                        line,
+                        strlen(line));
+        }
+
         if (!p || (p != (char*) checksum_job->payload && p[-1] != '\n')) {
-                log_error("DOWNLOAD INVALID: Checksum did not check out, payload has been tampered with.");
+                log_error("DOWNLOAD INVALID: Checksum of %s file did not checkout, file has been tampered with.", fn);
                 return -EBADMSG;
         }
 
-        log_info("SHA256 checksum of %s is valid.", main_job->url);
+        log_info("SHA256 checksum of %s is valid.", job->url);
+        return 1;
+}
 
-        assert(!settings_job || IN_SET(settings_job->state, PULL_JOB_DONE, PULL_JOB_FAILED));
+int pull_verify(PullJob *main_job,
+                PullJob *roothash_job,
+                PullJob *settings_job,
+                PullJob *checksum_job,
+                PullJob *signature_job) {
 
-        if (settings_job &&
-            settings_job->state == PULL_JOB_DONE &&
-            settings_job->error == 0 &&
-            !settings_job->etag_exists) {
+        _cleanup_close_pair_ int gpg_pipe[2] = { -1, -1 };
+        _cleanup_close_ int sig_file = -1;
+        char sig_file_path[] = "/tmp/sigXXXXXX", gpg_home[] = "/tmp/gpghomeXXXXXX";
+        _cleanup_(sigkill_waitp) pid_t pid = 0;
+        bool gpg_home_created = false;
+        int r;
 
-                _cleanup_free_ char *settings_fn = NULL;
+        assert(main_job);
+        assert(main_job->state == PULL_JOB_DONE);
 
-                assert(settings_job->calc_checksum);
-                assert(settings_job->checksum);
+        if (!checksum_job)
+                return 0;
 
-                r = import_url_last_component(settings_job->url, &settings_fn);
-                if (r < 0)
-                        return log_oom();
+        assert(main_job->calc_checksum);
+        assert(main_job->checksum);
 
-                if (!filename_is_valid(settings_fn)) {
-                        log_error("Cannot verify checksum, could not determine server-side settings file name.");
-                        return -EBADMSG;
-                }
+        assert(checksum_job->state == PULL_JOB_DONE);
 
-                line = strjoina(settings_job->checksum, " *", settings_fn, "\n");
+        if (!checksum_job->payload || checksum_job->payload_size <= 0) {
+                log_error("Checksum is empty, cannot verify.");
+                return -EBADMSG;
+        }
 
-                p = memmem(checksum_job->payload,
-                           checksum_job->payload_size,
-                           line,
-                           strlen(line));
+        r = verify_one(checksum_job, main_job);
+        if (r < 0)
+                return r;
 
-                if (!p || (p != (char*) checksum_job->payload && p[-1] != '\n')) {
-                        log_error("DOWNLOAD INVALID: Checksum of settings file did not checkout, settings file has been tampered with.");
-                        return -EBADMSG;
-                }
+        r = verify_one(checksum_job, roothash_job);
+        if (r < 0)
+                return r;
 
-                log_info("SHA256 checksum of %s is valid.", settings_job->url);
-        }
+        r = verify_one(checksum_job, settings_job);
+        if (r < 0)
+                return r;
 
         if (!signature_job)
                 return 0;
 
+        if (checksum_job->style == VERIFICATION_PER_FILE)
+                signature_job = checksum_job;
+
         assert(signature_job->state == PULL_JOB_DONE);
 
         if (!signature_job->payload || signature_job->payload_size <= 0) {
@@ -502,9 +525,11 @@ int pull_verify(PullJob *main_job,
                         cmd[k++] = "--keyring=" VENDOR_KEYRING_PATH;
 
                 cmd[k++] = "--verify";
-                cmd[k++] = sig_file_path;
-                cmd[k++] = "-";
-                cmd[k++] = NULL;
+                if (checksum_job->style == VERIFICATION_PER_DIRECTORY) {
+                        cmd[k++] = sig_file_path;
+                        cmd[k++] = "-";
+                        cmd[k++] = NULL;
+                }
 
                 stdio_unset_cloexec();
 
index 929a131..f1f1a17 100644 (file)
@@ -30,7 +30,7 @@ int pull_find_old_etags(const char *url, const char *root, int dt, const char *p
 
 int pull_make_path(const char *url, const char *etag, const char *image_root, const char *prefix, const char *suffix, char **ret);
 
-int pull_make_settings_job(PullJob **ret, const char *url, CurlGlue *glue, PullJobFinished on_finished, void *userdata);
+int pull_make_auxiliary_job(PullJob **ret, const char *url, int (*strip_suffixes)(const char *name, char **ret), const char *suffix, CurlGlue *glue, PullJobFinished on_finished, void *userdata);
 int pull_make_verification_jobs(PullJob **ret_checksum_job, PullJob **ret_signature_job, ImportVerify verify, const char *url, CurlGlue *glue, PullJobFinished on_finished, void *userdata);
 
-int pull_verify(PullJob *main_job, PullJob *settings_job, PullJob *checksum_job, PullJob *signature_job);
+int pull_verify(PullJob *main_job, PullJob *roothash_job, PullJob *settings_job, PullJob *checksum_job, PullJob *signature_job);
index 6bcf35e..320c213 100644 (file)
 #include "alloc-util.h"
 #include "fd-util.h"
 #include "hexdecoct.h"
+#include "import-util.h"
 #include "io-util.h"
 #include "machine-pool.h"
 #include "parse-util.h"
+#include "pull-common.h"
 #include "pull-job.h"
 #include "string-util.h"
 #include "strv.h"
@@ -50,9 +52,7 @@ PullJob* pull_job_unref(PullJob *j) {
         free(j->payload);
         free(j->checksum);
 
-        free(j);
-
-        return NULL;
+        return mfree(j);
 }
 
 static void pull_job_finish(PullJob *j, int ret) {
@@ -75,6 +75,31 @@ static void pull_job_finish(PullJob *j, int ret) {
                 j->on_finished(j);
 }
 
+static int pull_job_restart(PullJob *j) {
+        int r;
+        char *chksum_url = NULL;
+
+        r = import_url_change_last_component(j->url, "SHA256SUMS", &chksum_url);
+        if (r < 0)
+                return r;
+
+        free(j->url);
+        j->url = chksum_url;
+        j->state = PULL_JOB_INIT;
+        j->payload = mfree(j->payload);
+        j->payload_size = 0;
+        j->payload_allocated = 0;
+        j->written_compressed = 0;
+        j->written_uncompressed = 0;
+        j->written_since_last_grow = 0;
+
+        r = pull_job_begin(j);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
 void pull_job_curl_on_finished(CurlGlue *g, CURL *curl, CURLcode result) {
         PullJob *j = NULL;
         CURLcode code;
@@ -104,6 +129,26 @@ void pull_job_curl_on_finished(CurlGlue *g, CURL *curl, CURLcode result) {
                 r = 0;
                 goto finish;
         } else if (status >= 300) {
+                if (status == 404 && j->style == VERIFICATION_PER_FILE) {
+
+                        /* retry pull job with SHA256SUMS file */
+                        r = pull_job_restart(j);
+                        if (r < 0)
+                                goto finish;
+
+                        code = curl_easy_getinfo(j->curl, CURLINFO_RESPONSE_CODE, &status);
+                        if (code != CURLE_OK) {
+                                log_error("Failed to retrieve response code: %s", curl_easy_strerror(code));
+                                r = -EIO;
+                                goto finish;
+                        }
+
+                        if (status == 0) {
+                                j->style = VERIFICATION_PER_DIRECTORY;
+                                return;
+                        }
+                }
+
                 log_error("HTTP request to %s failed with code %li.", j->url, status);
                 r = -EIO;
                 goto finish;
@@ -529,7 +574,8 @@ int pull_job_new(PullJob **ret, const char *url, CurlGlue *glue, void *userdata)
         j->glue = glue;
         j->content_length = (uint64_t) -1;
         j->start_usec = now(CLOCK_MONOTONIC);
-        j->compressed_max = j->uncompressed_max = 8LLU * 1024LLU * 1024LLU * 1024LLU; /* 8GB */
+        j->compressed_max = j->uncompressed_max = 64LLU * 1024LLU * 1024LLU * 1024LLU; /* 64GB safety limit */
+        j->style = VERIFICATION_STYLE_UNSET;
 
         j->url = strdup(url);
         if (!j->url)
index 3a152a5..412b66c 100644 (file)
@@ -42,6 +42,12 @@ typedef enum PullJobState {
         _PULL_JOB_STATE_INVALID = -1,
 } PullJobState;
 
+typedef enum VerificationStyle {
+        VERIFICATION_STYLE_UNSET,
+        VERIFICATION_PER_FILE,        /* SuSE-style ".sha256" files with inline signature */
+        VERIFICATION_PER_DIRECTORY,   /* Ubuntu-style SHA256SUM files with detach SHA256SUM.gpg signatures */
+} VerificationStyle;
+
 #define PULL_JOB_IS_COMPLETE(j) (IN_SET((j)->state, PULL_JOB_DONE, PULL_JOB_FAILED))
 
 struct PullJob {
@@ -94,6 +100,8 @@ struct PullJob {
 
         bool grow_machine_directory;
         uint64_t written_since_last_grow;
+
+        VerificationStyle style;
 };
 
 int pull_job_new(PullJob **job, const char *url, CurlGlue *glue, void *userdata);
index 8993402..b45ac81 100644 (file)
@@ -63,6 +63,7 @@ struct RawPull {
         char *image_root;
 
         PullJob *raw_job;
+        PullJob *roothash_job;
         PullJob *settings_job;
         PullJob *checksum_job;
         PullJob *signature_job;
@@ -74,6 +75,7 @@ struct RawPull {
         bool force_local;
         bool grow_machine_directory;
         bool settings;
+        bool roothash;
 
         char *final_path;
         char *temp_path;
@@ -81,6 +83,9 @@ struct RawPull {
         char *settings_path;
         char *settings_temp_path;
 
+        char *roothash_path;
+        char *roothash_temp_path;
+
         ImportVerify verify;
 };
 
@@ -90,6 +95,7 @@ RawPull* raw_pull_unref(RawPull *i) {
 
         pull_job_unref(i->raw_job);
         pull_job_unref(i->settings_job);
+        pull_job_unref(i->roothash_job);
         pull_job_unref(i->checksum_job);
         pull_job_unref(i->signature_job);
 
@@ -101,18 +107,22 @@ RawPull* raw_pull_unref(RawPull *i) {
                 free(i->temp_path);
         }
 
+        if (i->roothash_temp_path) {
+                (void) unlink(i->roothash_temp_path);
+                free(i->roothash_temp_path);
+        }
+
         if (i->settings_temp_path) {
                 (void) unlink(i->settings_temp_path);
                 free(i->settings_temp_path);
         }
 
         free(i->final_path);
+        free(i->roothash_path);
         free(i->settings_path);
         free(i->image_root);
         free(i->local);
-        free(i);
-
-        return NULL;
+        return mfree(i);
 }
 
 int raw_pull_new(
@@ -178,6 +188,11 @@ static void raw_pull_report_progress(RawPull *i, RawProgress p) {
                         remain -= 5;
                 }
 
+                if (i->roothash_job) {
+                        percent += i->roothash_job->progress_percent * 5 / 100;
+                        remain -= 5;
+                }
+
                 if (i->checksum_job) {
                         percent += i->checksum_job->progress_percent * 5 / 100;
                         remain -= 5;
@@ -264,6 +279,55 @@ static int raw_pull_maybe_convert_qcow2(RawPull *i) {
         return 1;
 }
 
+static int raw_pull_determine_path(RawPull *i, const char *suffix, char **field) {
+        int r;
+
+        assert(i);
+        assert(field);
+
+        if (*field)
+                return 0;
+
+        assert(i->raw_job);
+
+        r = pull_make_path(i->raw_job->url, i->raw_job->etag, i->image_root, ".raw-", suffix, field);
+        if (r < 0)
+                return log_oom();
+
+        return 1;
+}
+
+static int raw_pull_copy_auxiliary_file(
+                RawPull *i,
+                const char *suffix,
+                char **path) {
+
+        const char *local;
+        int r;
+
+        assert(i);
+        assert(suffix);
+        assert(path);
+
+        r = raw_pull_determine_path(i, suffix, path);
+        if (r < 0)
+                return r;
+
+        local = strjoina(i->image_root, "/", i->local, suffix);
+
+        r = copy_file_atomic(*path, local, 0644, 0, COPY_REFLINK | (i->force_local ? COPY_REPLACE : 0));
+        if (r == -EEXIST)
+                log_warning_errno(r, "File %s already exists, not replacing.", local);
+        else if (r == -ENOENT)
+                log_debug_errno(r, "Skipping creation of auxiliary file, since none was found.");
+        else if (r < 0)
+                log_warning_errno(r, "Failed to copy file %s, ignoring: %m", local);
+        else
+                log_info("Created new file %s.", local);
+
+        return 0;
+}
+
 static int raw_pull_make_local_copy(RawPull *i) {
         _cleanup_free_ char *tp = NULL;
         _cleanup_close_ int dfd = -1;
@@ -276,12 +340,6 @@ static int raw_pull_make_local_copy(RawPull *i) {
         if (!i->local)
                 return 0;
 
-        if (!i->final_path) {
-                r = pull_make_path(i->raw_job->url, i->raw_job->etag, i->image_root, ".raw-", ".raw", &i->final_path);
-                if (r < 0)
-                        return log_oom();
-        }
-
         if (i->raw_job->etag_exists) {
                 /* We have downloaded this one previously, reopen it */
 
@@ -320,7 +378,7 @@ static int raw_pull_make_local_copy(RawPull *i) {
         if (r < 0)
                 log_warning_errno(r, "Failed to set file attributes on %s: %m", tp);
 
-        r = copy_bytes(i->raw_job->disk_fd, dfd, (uint64_t) -1, true);
+        r = copy_bytes(i->raw_job->disk_fd, dfd, (uint64_t) -1, COPY_REFLINK);
         if (r < 0) {
                 unlink(tp);
                 return log_error_errno(r, "Failed to make writable copy of image: %m");
@@ -340,27 +398,16 @@ static int raw_pull_make_local_copy(RawPull *i) {
 
         log_info("Created new local image '%s'.", i->local);
 
-        if (i->settings) {
-                const char *local_settings;
-                assert(i->settings_job);
-
-                if (!i->settings_path) {
-                        r = pull_make_path(i->settings_job->url, i->settings_job->etag, i->image_root, ".settings-", NULL, &i->settings_path);
-                        if (r < 0)
-                                return log_oom();
-                }
-
-                local_settings = strjoina(i->image_root, "/", i->local, ".nspawn");
+        if (i->roothash) {
+                r = raw_pull_copy_auxiliary_file(i, ".roothash", &i->roothash_path);
+                if (r < 0)
+                        return r;
+        }
 
-                r = copy_file_atomic(i->settings_path, local_settings, 0644, i->force_local, 0);
-                if (r == -EEXIST)
-                        log_warning_errno(r, "Settings file %s already exists, not replacing.", local_settings);
-                else if (r == -ENOENT)
-                        log_debug_errno(r, "Skipping creation of settings file, since none was found.");
-                else if (r < 0)
-                        log_warning_errno(r, "Failed to copy settings files %s, ignoring: %m", local_settings);
-                else
-                        log_info("Created new settings file %s.", local_settings);
+        if (i->settings) {
+                r = raw_pull_copy_auxiliary_file(i, ".nspawn", &i->settings_path);
+                if (r < 0)
+                        return r;
         }
 
         return 0;
@@ -372,6 +419,8 @@ static bool raw_pull_is_done(RawPull *i) {
 
         if (!PULL_JOB_IS_COMPLETE(i->raw_job))
                 return false;
+        if (i->roothash_job && !PULL_JOB_IS_COMPLETE(i->roothash_job))
+                return false;
         if (i->settings_job && !PULL_JOB_IS_COMPLETE(i->settings_job))
                 return false;
         if (i->checksum_job && !PULL_JOB_IS_COMPLETE(i->checksum_job))
@@ -382,6 +431,39 @@ static bool raw_pull_is_done(RawPull *i) {
         return true;
 }
 
+static int raw_pull_rename_auxiliary_file(
+                RawPull *i,
+                const char *suffix,
+                char **temp_path,
+                char **path) {
+
+        int r;
+
+        assert(i);
+        assert(temp_path);
+        assert(suffix);
+        assert(path);
+
+        /* Regenerate final name for this auxiliary file, we might know the etag of the file now, and we should
+         * incorporate it in the file name if we can */
+        *path = mfree(*path);
+        r = raw_pull_determine_path(i, suffix, path);
+        if (r < 0)
+                return r;
+
+        r = import_make_read_only(*temp_path);
+        if (r < 0)
+                return r;
+
+        r = rename_noreplace(AT_FDCWD, *temp_path, AT_FDCWD, *path);
+        if (r < 0)
+                return log_error_errno(r, "Failed to rename file %s to %s: %m", *temp_path, *path);
+
+        *temp_path = mfree(*temp_path);
+
+        return 1;
+}
+
 static void raw_pull_job_on_finished(PullJob *j) {
         RawPull *i;
         int r;
@@ -390,14 +472,15 @@ static void raw_pull_job_on_finished(PullJob *j) {
         assert(j->userdata);
 
         i = j->userdata;
-        if (j == i->settings_job) {
+        if (j == i->roothash_job) {
+                if (j->error != 0)
+                        log_info_errno(j->error, "Root hash file could not be retrieved, proceeding without.");
+        } else if (j == i->settings_job) {
                 if (j->error != 0)
                         log_info_errno(j->error, "Settings file could not be retrieved, proceeding without.");
-        } else if (j->error != 0) {
+        } else if (j->error != 0 && j != i->signature_job) {
                 if (j == i->checksum_job)
                         log_error_errno(j->error, "Failed to retrieve SHA256 checksum, cannot verify. (Try --verify=no?)");
-                else if (j == i->signature_job)
-                        log_error_errno(j->error, "Failed to retrieve signature file, cannot verify. (Try --verify=no?)");
                 else
                         log_error_errno(j->error, "Failed to retrieve image file. (Wrong URL?)");
 
@@ -415,16 +498,29 @@ static void raw_pull_job_on_finished(PullJob *j) {
         if (!raw_pull_is_done(i))
                 return;
 
+        if (i->signature_job && i->checksum_job->style == VERIFICATION_PER_DIRECTORY && i->signature_job->error != 0) {
+                log_error_errno(j->error, "Failed to retrieve signature file, cannot verify. (Try --verify=no?)");
+
+                r = i->signature_job->error;
+                goto finish;
+        }
+
+        if (i->roothash_job)
+                i->roothash_job->disk_fd = safe_close(i->roothash_job->disk_fd);
         if (i->settings_job)
                 i->settings_job->disk_fd = safe_close(i->settings_job->disk_fd);
 
+        r = raw_pull_determine_path(i, ".raw", &i->final_path);
+        if (r < 0)
+                goto finish;
+
         if (!i->raw_job->etag_exists) {
                 /* This is a new download, verify it, and move it into place */
                 assert(i->raw_job->disk_fd >= 0);
 
                 raw_pull_report_progress(i, RAW_VERIFYING);
 
-                r = pull_verify(i->raw_job, i->settings_job, i->checksum_job, i->signature_job);
+                r = pull_verify(i->raw_job, i->roothash_job, i->settings_job, i->checksum_job, i->signature_job);
                 if (r < 0)
                         goto finish;
 
@@ -442,30 +538,24 @@ static void raw_pull_job_on_finished(PullJob *j) {
 
                 r = rename_noreplace(AT_FDCWD, i->temp_path, AT_FDCWD, i->final_path);
                 if (r < 0) {
-                        log_error_errno(r, "Failed to move RAW file into place: %m");
+                        log_error_errno(r, "Failed to rename raw file to %s: %m", i->final_path);
                         goto finish;
                 }
 
                 i->temp_path = mfree(i->temp_path);
 
-                if (i->settings_job &&
-                    i->settings_job->error == 0 &&
-                    !i->settings_job->etag_exists) {
-
-                        assert(i->settings_temp_path);
-                        assert(i->settings_path);
-
-                        r = import_make_read_only(i->settings_temp_path);
+                if (i->roothash_job &&
+                    i->roothash_job->error == 0) {
+                        r = raw_pull_rename_auxiliary_file(i, ".roothash", &i->roothash_temp_path, &i->roothash_path);
                         if (r < 0)
                                 goto finish;
+                }
 
-                        r = rename_noreplace(AT_FDCWD, i->settings_temp_path, AT_FDCWD, i->settings_path);
-                        if (r < 0) {
-                                log_error_errno(r, "Failed to rename settings file: %m");
+                if (i->settings_job &&
+                    i->settings_job->error == 0) {
+                        r = raw_pull_rename_auxiliary_file(i, ".nspawn", &i->settings_temp_path, &i->settings_path);
+                        if (r < 0)
                                 goto finish;
-                        }
-
-                        i->settings_temp_path = mfree(i->settings_temp_path);
                 }
         }
 
@@ -484,6 +574,34 @@ finish:
                 sd_event_exit(i->event, r);
 }
 
+static int raw_pull_job_on_open_disk_generic(
+                RawPull *i,
+                PullJob *j,
+                const char *extra,
+                char **temp_path) {
+
+        int r;
+
+        assert(i);
+        assert(j);
+        assert(extra);
+        assert(temp_path);
+
+        if (!*temp_path) {
+                r = tempfn_random_child(i->image_root, extra, temp_path);
+                if (r < 0)
+                        return log_oom();
+        }
+
+        (void) mkdir_parents_label(*temp_path, 0700);
+
+        j->disk_fd = open(*temp_path, O_RDWR|O_CREAT|O_EXCL|O_NOCTTY|O_CLOEXEC, 0664);
+        if (j->disk_fd < 0)
+                return log_error_errno(errno, "Failed to create %s: %m", *temp_path);
+
+        return 0;
+}
+
 static int raw_pull_job_on_open_disk_raw(PullJob *j) {
         RawPull *i;
         int r;
@@ -493,57 +611,40 @@ static int raw_pull_job_on_open_disk_raw(PullJob *j) {
 
         i = j->userdata;
         assert(i->raw_job == j);
-        assert(!i->final_path);
-        assert(!i->temp_path);
 
-        r = pull_make_path(j->url, j->etag, i->image_root, ".raw-", ".raw", &i->final_path);
+        r = raw_pull_job_on_open_disk_generic(i, j, "raw", &i->temp_path);
         if (r < 0)
-                return log_oom();
-
-        r = tempfn_random(i->final_path, NULL, &i->temp_path);
-        if (r < 0)
-                return log_oom();
-
-        (void) mkdir_parents_label(i->temp_path, 0700);
-
-        j->disk_fd = open(i->temp_path, O_RDWR|O_CREAT|O_EXCL|O_NOCTTY|O_CLOEXEC, 0664);
-        if (j->disk_fd < 0)
-                return log_error_errno(errno, "Failed to create %s: %m", i->temp_path);
+                return r;
 
         r = chattr_fd(j->disk_fd, FS_NOCOW_FL, FS_NOCOW_FL);
         if (r < 0)
-                log_warning_errno(r, "Failed to set file attributes on %s: %m", i->temp_path);
+                log_warning_errno(r, "Failed to set file attributes on %s, ignoring: %m", i->temp_path);
 
         return 0;
 }
 
-static int raw_pull_job_on_open_disk_settings(PullJob *j) {
+static int raw_pull_job_on_open_disk_roothash(PullJob *j) {
         RawPull *i;
-        int r;
 
         assert(j);
         assert(j->userdata);
 
         i = j->userdata;
-        assert(i->settings_job == j);
-        assert(!i->settings_path);
-        assert(!i->settings_temp_path);
+        assert(i->roothash_job == j);
 
-        r = pull_make_path(j->url, j->etag, i->image_root, ".settings-", NULL, &i->settings_path);
-        if (r < 0)
-                return log_oom();
+        return raw_pull_job_on_open_disk_generic(i, j, "roothash", &i->roothash_temp_path);
+}
 
-        r = tempfn_random(i->settings_path, NULL, &i->settings_temp_path);
-        if (r < 0)
-                return log_oom();
+static int raw_pull_job_on_open_disk_settings(PullJob *j) {
+        RawPull *i;
 
-        mkdir_parents_label(i->settings_temp_path, 0700);
+        assert(j);
+        assert(j->userdata);
 
-        j->disk_fd = open(i->settings_temp_path, O_RDWR|O_CREAT|O_EXCL|O_NOCTTY|O_CLOEXEC, 0664);
-        if (j->disk_fd < 0)
-                return log_error_errno(errno, "Failed to create %s: %m", i->settings_temp_path);
+        i = j->userdata;
+        assert(i->settings_job == j);
 
-        return 0;
+        return raw_pull_job_on_open_disk_generic(i, j, "settings", &i->settings_temp_path);
 }
 
 static void raw_pull_job_on_progress(PullJob *j) {
@@ -563,7 +664,8 @@ int raw_pull_start(
                 const char *local,
                 bool force_local,
                 ImportVerify verify,
-                bool settings) {
+                bool settings,
+                bool roothash) {
 
         int r;
 
@@ -587,6 +689,7 @@ int raw_pull_start(
         i->force_local = force_local;
         i->verify = verify;
         i->settings = settings;
+        i->roothash = roothash;
 
         /* Queue job for the image itself */
         r = pull_job_new(&i->raw_job, url, i->glue, i);
@@ -603,18 +706,24 @@ int raw_pull_start(
         if (r < 0)
                 return r;
 
+        if (roothash) {
+                r = pull_make_auxiliary_job(&i->roothash_job, url, raw_strip_suffixes, ".roothash", i->glue, raw_pull_job_on_finished, i);
+                if (r < 0)
+                        return r;
+
+                i->roothash_job->on_open_disk = raw_pull_job_on_open_disk_roothash;
+                i->roothash_job->on_progress = raw_pull_job_on_progress;
+                i->roothash_job->calc_checksum = verify != IMPORT_VERIFY_NO;
+        }
+
         if (settings) {
-                r = pull_make_settings_job(&i->settings_job, url, i->glue, raw_pull_job_on_finished, i);
+                r = pull_make_auxiliary_job(&i->settings_job, url, raw_strip_suffixes, ".nspawn", i->glue, raw_pull_job_on_finished, i);
                 if (r < 0)
                         return r;
 
                 i->settings_job->on_open_disk = raw_pull_job_on_open_disk_settings;
                 i->settings_job->on_progress = raw_pull_job_on_progress;
                 i->settings_job->calc_checksum = verify != IMPORT_VERIFY_NO;
-
-                r = pull_find_old_etags(i->settings_job->url, i->image_root, DT_REG, ".settings-", NULL, &i->settings_job->old_etags);
-                if (r < 0)
-                        return r;
         }
 
         r = pull_make_verification_jobs(&i->checksum_job, &i->signature_job, verify, url, i->glue, raw_pull_job_on_finished, i);
@@ -625,6 +734,12 @@ int raw_pull_start(
         if (r < 0)
                 return r;
 
+        if (i->roothash_job) {
+                r = pull_job_begin(i->roothash_job);
+                if (r < 0)
+                        return r;
+        }
+
         if (i->settings_job) {
                 r = pull_job_begin(i->settings_job);
                 if (r < 0)
@@ -633,6 +748,7 @@ int raw_pull_start(
 
         if (i->checksum_job) {
                 i->checksum_job->on_progress = raw_pull_job_on_progress;
+                i->checksum_job->style = VERIFICATION_PER_FILE;
 
                 r = pull_job_begin(i->checksum_job);
                 if (r < 0)
index 8f6d16e..6954d98 100644 (file)
@@ -33,4 +33,4 @@ RawPull* raw_pull_unref(RawPull *pull);
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(RawPull*, raw_pull_unref);
 
-int raw_pull_start(RawPull *pull, const char *url, const char *local, bool force_local, ImportVerify verify, bool settings);
+int raw_pull_start(RawPull *pull, const char *url, const char *local, bool force_local, ImportVerify verify, bool settings, bool roothash);
index 8c61c46..12211a6 100644 (file)
@@ -114,9 +114,8 @@ TarPull* tar_pull_unref(TarPull *i) {
         free(i->settings_path);
         free(i->image_root);
         free(i->local);
-        free(i);
 
-        return NULL;
+        return mfree(i);
 }
 
 int tar_pull_new(
@@ -217,6 +216,24 @@ static void tar_pull_report_progress(TarPull *i, TarProgress p) {
         log_debug("Combined progress %u%%", percent);
 }
 
+static int tar_pull_determine_path(TarPull *i, const char *suffix, char **field) {
+        int r;
+
+        assert(i);
+        assert(field);
+
+        if (*field)
+                return 0;
+
+        assert(i->tar_job);
+
+        r = pull_make_path(i->tar_job->url, i->tar_job->etag, i->image_root, ".tar-", suffix, field);
+        if (r < 0)
+                return log_oom();
+
+        return 1;
+}
+
 static int tar_pull_make_local_copy(TarPull *i) {
         int r;
 
@@ -226,12 +243,6 @@ static int tar_pull_make_local_copy(TarPull *i) {
         if (!i->local)
                 return 0;
 
-        if (!i->final_path) {
-                r = pull_make_path(i->tar_job->url, i->tar_job->etag, i->image_root, ".tar-", NULL, &i->final_path);
-                if (r < 0)
-                        return log_oom();
-        }
-
         r = pull_make_local_copy(i->final_path, i->image_root, i->local, i->force_local);
         if (r < 0)
                 return r;
@@ -240,15 +251,13 @@ static int tar_pull_make_local_copy(TarPull *i) {
                 const char *local_settings;
                 assert(i->settings_job);
 
-                if (!i->settings_path) {
-                        r = pull_make_path(i->settings_job->url, i->settings_job->etag, i->image_root, ".settings-", NULL, &i->settings_path);
-                        if (r < 0)
-                                return log_oom();
-                }
+                r = tar_pull_determine_path(i, ".nspawn", &i->settings_path);
+                if (r < 0)
+                        return r;
 
                 local_settings = strjoina(i->image_root, "/", i->local, ".nspawn");
 
-                r = copy_file_atomic(i->settings_path, local_settings, 0664, i->force_local, 0);
+                r = copy_file_atomic(i->settings_path, local_settings, 0664, 0, COPY_REFLINK | (i->force_local ? COPY_REPLACE : 0));
                 if (r == -EEXIST)
                         log_warning_errno(r, "Settings file %s already exists, not replacing.", local_settings);
                 else if (r == -ENOENT)
@@ -290,11 +299,9 @@ static void tar_pull_job_on_finished(PullJob *j) {
         if (j == i->settings_job) {
                 if (j->error != 0)
                         log_info_errno(j->error, "Settings file could not be retrieved, proceeding without.");
-        } else if (j->error != 0) {
+        } else if (j->error != 0 && j != i->signature_job) {
                 if (j == i->checksum_job)
                         log_error_errno(j->error, "Failed to retrieve SHA256 checksum, cannot verify. (Try --verify=no?)");
-                else if (j == i->signature_job)
-                        log_error_errno(j->error, "Failed to retrieve signature file, cannot verify. (Try --verify=no?)");
                 else
                         log_error_errno(j->error, "Failed to retrieve image file. (Wrong URL?)");
 
@@ -309,10 +316,21 @@ static void tar_pull_job_on_finished(PullJob *j) {
         if (!tar_pull_is_done(i))
                 return;
 
+        if (i->signature_job && i->checksum_job->style == VERIFICATION_PER_DIRECTORY && i->signature_job->error != 0) {
+                log_error_errno(j->error, "Failed to retrieve signature file, cannot verify. (Try --verify=no?)");
+
+                r = i->signature_job->error;
+                goto finish;
+        }
+
         i->tar_job->disk_fd = safe_close(i->tar_job->disk_fd);
         if (i->settings_job)
                 i->settings_job->disk_fd = safe_close(i->settings_job->disk_fd);
 
+        r = tar_pull_determine_path(i, NULL, &i->final_path);
+        if (r < 0)
+                goto finish;
+
         if (i->tar_pid > 0) {
                 r = wait_for_terminate_and_warn("tar", i->tar_pid, true);
                 i->tar_pid = 0;
@@ -329,7 +347,7 @@ static void tar_pull_job_on_finished(PullJob *j) {
 
                 tar_pull_report_progress(i, TAR_VERIFYING);
 
-                r = pull_verify(i->tar_job, i->settings_job, i->checksum_job, i->signature_job);
+                r = pull_verify(i->tar_job, NULL, i->settings_job, i->checksum_job, i->signature_job);
                 if (r < 0)
                         goto finish;
 
@@ -341,23 +359,26 @@ static void tar_pull_job_on_finished(PullJob *j) {
 
                 r = rename_noreplace(AT_FDCWD, i->temp_path, AT_FDCWD, i->final_path);
                 if (r < 0) {
-                        log_error_errno(r, "Failed to rename to final image name: %m");
+                        log_error_errno(r, "Failed to rename to final image name to %s: %m", i->final_path);
                         goto finish;
                 }
 
                 i->temp_path = mfree(i->temp_path);
 
                 if (i->settings_job &&
-                    i->settings_job->error == 0 &&
-                    !i->settings_job->etag_exists) {
+                    i->settings_job->error == 0) {
 
+                        /* Also move the settings file into place, if it exists. Note that we do so only if we also
+                         * moved the tar file in place, to keep things strictly in sync. */
                         assert(i->settings_temp_path);
-                        assert(i->settings_path);
 
-                        /* Also move the settings file into place, if
-                         * it exist. Note that we do so only if we
-                         * also moved the tar file in place, to keep
-                         * things strictly in sync. */
+                        /* Regenerate final name for this auxiliary file, we might know the etag of the file now, and
+                         * we should incorporate it in the file name if we can */
+                        i->settings_path = mfree(i->settings_path);
+
+                        r = tar_pull_determine_path(i, ".nspawn", &i->settings_path);
+                        if (r < 0)
+                                goto finish;
 
                         r = import_make_read_only(i->settings_temp_path);
                         if (r < 0)
@@ -365,7 +386,7 @@ static void tar_pull_job_on_finished(PullJob *j) {
 
                         r = rename_noreplace(AT_FDCWD, i->settings_temp_path, AT_FDCWD, i->settings_path);
                         if (r < 0) {
-                                log_error_errno(r, "Failed to rename settings file: %m");
+                                log_error_errno(r, "Failed to rename settings file to %s: %m", i->settings_path);
                                 goto finish;
                         }
 
@@ -397,17 +418,13 @@ static int tar_pull_job_on_open_disk_tar(PullJob *j) {
 
         i = j->userdata;
         assert(i->tar_job == j);
-        assert(!i->final_path);
-        assert(!i->temp_path);
         assert(i->tar_pid <= 0);
 
-        r = pull_make_path(j->url, j->etag, i->image_root, ".tar-", NULL, &i->final_path);
-        if (r < 0)
-                return log_oom();
-
-        r = tempfn_random(i->final_path, NULL, &i->temp_path);
-        if (r < 0)
-                return log_oom();
+        if (!i->temp_path) {
+                r = tempfn_random_child(i->image_root, "tar", &i->temp_path);
+                if (r < 0)
+                        return log_oom();
+        }
 
         mkdir_parents_label(i->temp_path, 0700);
 
@@ -436,16 +453,12 @@ static int tar_pull_job_on_open_disk_settings(PullJob *j) {
 
         i = j->userdata;
         assert(i->settings_job == j);
-        assert(!i->settings_path);
-        assert(!i->settings_temp_path);
-
-        r = pull_make_path(j->url, j->etag, i->image_root, ".settings-", NULL, &i->settings_path);
-        if (r < 0)
-                return log_oom();
 
-        r = tempfn_random(i->settings_path, NULL, &i->settings_temp_path);
-        if (r < 0)
-                return log_oom();
+        if (!i->settings_temp_path) {
+                r = tempfn_random_child(i->image_root, "settings", &i->settings_temp_path);
+                if (r < 0)
+                        return log_oom();
+        }
 
         mkdir_parents_label(i->settings_temp_path, 0700);
 
@@ -515,17 +528,13 @@ int tar_pull_start(
 
         /* Set up download job for the settings file (.nspawn) */
         if (settings) {
-                r = pull_make_settings_job(&i->settings_job, url, i->glue, tar_pull_job_on_finished, i);
+                r = pull_make_auxiliary_job(&i->settings_job, url, tar_strip_suffixes, ".nspawn", i->glue, tar_pull_job_on_finished, i);
                 if (r < 0)
                         return r;
 
                 i->settings_job->on_open_disk = tar_pull_job_on_open_disk_settings;
                 i->settings_job->on_progress = tar_pull_job_on_progress;
                 i->settings_job->calc_checksum = verify != IMPORT_VERIFY_NO;
-
-                r = pull_find_old_etags(i->settings_job->url, i->image_root, DT_REG, ".settings-", NULL, &i->settings_job->old_etags);
-                if (r < 0)
-                        return r;
         }
 
         /* Set up download of checksum/signature files */
@@ -545,6 +554,7 @@ int tar_pull_start(
 
         if (i->checksum_job) {
                 i->checksum_job->on_progress = tar_pull_job_on_progress;
+                i->checksum_job->style = VERIFICATION_PER_FILE;
 
                 r = pull_job_begin(i->checksum_job);
                 if (r < 0)
index 53b1211..4af5d9c 100644 (file)
@@ -37,6 +37,7 @@ static bool arg_force = false;
 static const char *arg_image_root = "/var/lib/machines";
 static ImportVerify arg_verify = IMPORT_VERIFY_SIGNATURE;
 static bool arg_settings = true;
+static bool arg_roothash = true;
 
 static int interrupt_signal_handler(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
         log_notice("Transfer aborted.");
@@ -204,7 +205,7 @@ static int pull_raw(int argc, char *argv[], void *userdata) {
         if (r < 0)
                 return log_error_errno(r, "Failed to allocate puller: %m");
 
-        r = raw_pull_start(pull, url, local, arg_force, arg_verify, arg_settings);
+        r = raw_pull_start(pull, url, local, arg_force, arg_verify, arg_settings, arg_roothash);
         if (r < 0)
                 return log_error_errno(r, "Failed to pull image: %m");
 
@@ -226,6 +227,7 @@ static int help(int argc, char *argv[], void *userdata) {
                "     --verify=MODE            Verify downloaded image, one of: 'no',\n"
                "                              'checksum', 'signature'\n"
                "     --settings=BOOL          Download settings file with image\n"
+               "     --roothash=BOOL          Download root hash file with image\n"
                "     --image-root=PATH        Image root directory\n\n"
                "Commands:\n"
                "  tar URL [NAME]              Download a TAR image\n"
@@ -243,6 +245,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_IMAGE_ROOT,
                 ARG_VERIFY,
                 ARG_SETTINGS,
+                ARG_ROOTHASH,
         };
 
         static const struct option options[] = {
@@ -252,6 +255,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "image-root",      required_argument, NULL, ARG_IMAGE_ROOT      },
                 { "verify",          required_argument, NULL, ARG_VERIFY          },
                 { "settings",        required_argument, NULL, ARG_SETTINGS        },
+                { "roothash",        required_argument, NULL, ARG_ROOTHASH        },
                 {}
         };
 
@@ -295,6 +299,14 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_settings = r;
                         break;
 
+                case ARG_ROOTHASH:
+                        r = parse_boolean(optarg);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse --roothash= parameter '%s'", optarg);
+
+                        arg_roothash = r;
+                        break;
+
                 case '?':
                         return -EINVAL;
 
index 41b2237..6aeb5ad 100644 (file)
@@ -31,7 +31,7 @@
 #include "bus-util.h"
 #include "def.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "initreq.h"
 #include "list.h"
 #include "log.h"
index 4ad9184..9a1c5b7 100644 (file)
@@ -19,9 +19,6 @@
 
 #include <fcntl.h>
 #include <getopt.h>
-#ifdef HAVE_GNUTLS
-#include <gnutls/gnutls.h>
-#endif
 #include <microhttpd.h>
 #include <stdlib.h>
 #include <string.h>
@@ -48,6 +45,7 @@
 static char *arg_key_pem = NULL;
 static char *arg_cert_pem = NULL;
 static char *arg_trust_pem = NULL;
+static char *arg_directory = NULL;
 
 typedef struct RequestMeta {
         sd_journal *journal;
@@ -118,7 +116,10 @@ static int open_journal(RequestMeta *m) {
         if (m->journal)
                 return 0;
 
-        return sd_journal_open(&m->journal, SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_SYSTEM);
+        if (arg_directory)
+                return sd_journal_open_directory(&m->journal, arg_directory, 0);
+        else
+                return sd_journal_open(&m->journal, SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_SYSTEM);
 }
 
 static int request_meta_ensure_tmp(RequestMeta *m) {
@@ -239,6 +240,9 @@ static ssize_t request_reader_entries(
                 m->size = (uint64_t) sz;
         }
 
+        if (m->tmp == NULL && m->follow)
+                return 0;
+
         if (fseeko(m->tmp, pos, SEEK_SET) < 0) {
                 log_error_errno(errno, "Failed to seek to position: %m");
                 return MHD_CONTENT_READER_END_WITH_ERROR;
@@ -430,7 +434,7 @@ static int request_parse_arguments_iterator(
                 return MHD_YES;
         }
 
-        p = strjoin(key, "=", strempty(value), NULL);
+        p = strjoin(key, "=", strempty(value));
         if (!p) {
                 m->argument_parse_error = log_oom();
                 return MHD_NO;
@@ -471,20 +475,20 @@ static int request_handler_entries(
 
         r = open_journal(m);
         if (r < 0)
-                return mhd_respondf(connection, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to open journal: %s\n", strerror(-r));
+                return mhd_respondf(connection, r, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to open journal: %m");
 
         if (request_parse_accept(m, connection) < 0)
-                return mhd_respond(connection, MHD_HTTP_BAD_REQUEST, "Failed to parse Accept header.\n");
+                return mhd_respond(connection, MHD_HTTP_BAD_REQUEST, "Failed to parse Accept header.");
 
         if (request_parse_range(m, connection) < 0)
-                return mhd_respond(connection, MHD_HTTP_BAD_REQUEST, "Failed to parse Range header.\n");
+                return mhd_respond(connection, MHD_HTTP_BAD_REQUEST, "Failed to parse Range header.");
 
         if (request_parse_arguments(m, connection) < 0)
-                return mhd_respond(connection, MHD_HTTP_BAD_REQUEST, "Failed to parse URL arguments.\n");
+                return mhd_respond(connection, MHD_HTTP_BAD_REQUEST, "Failed to parse URL arguments.");
 
         if (m->discrete) {
                 if (!m->cursor)
-                        return mhd_respond(connection, MHD_HTTP_BAD_REQUEST, "Discrete seeks require a cursor specification.\n");
+                        return mhd_respond(connection, MHD_HTTP_BAD_REQUEST, "Discrete seeks require a cursor specification.");
 
                 m->n_entries = 1;
                 m->n_entries_set = true;
@@ -497,7 +501,7 @@ static int request_handler_entries(
         else if (m->n_skip < 0)
                 r = sd_journal_seek_tail(m->journal);
         if (r < 0)
-                return mhd_respond(connection, MHD_HTTP_BAD_REQUEST, "Failed to seek in journal.\n");
+                return mhd_respond(connection, MHD_HTTP_BAD_REQUEST, "Failed to seek in journal.");
 
         response = MHD_create_response_from_callback(MHD_SIZE_UNKNOWN, 4*1024, request_reader_entries, m, NULL);
         if (!response)
@@ -629,14 +633,14 @@ static int request_handler_fields(
 
         r = open_journal(m);
         if (r < 0)
-                return mhd_respondf(connection, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to open journal: %s\n", strerror(-r));
+                return mhd_respondf(connection, r, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to open journal: %m");
 
         if (request_parse_accept(m, connection) < 0)
-                return mhd_respond(connection, MHD_HTTP_BAD_REQUEST, "Failed to parse Accept header.\n");
+                return mhd_respond(connection, MHD_HTTP_BAD_REQUEST, "Failed to parse Accept header.");
 
         r = sd_journal_query_unique(m->journal, field);
         if (r < 0)
-                return mhd_respond(connection, MHD_HTTP_BAD_REQUEST, "Failed to query unique fields.\n");
+                return mhd_respond(connection, MHD_HTTP_BAD_REQUEST, "Failed to query unique fields.");
 
         response = MHD_create_response_from_callback(MHD_SIZE_UNKNOWN, 4*1024, request_reader_fields, m, NULL);
         if (!response)
@@ -695,10 +699,10 @@ static int request_handler_file(
 
         fd = open(path, O_RDONLY|O_CLOEXEC);
         if (fd < 0)
-                return mhd_respondf(connection, MHD_HTTP_NOT_FOUND, "Failed to open file %s: %m\n", path);
+                return mhd_respondf(connection, errno, MHD_HTTP_NOT_FOUND, "Failed to open file %s: %m", path);
 
         if (fstat(fd, &st) < 0)
-                return mhd_respondf(connection, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to stat file: %m\n");
+                return mhd_respondf(connection, errno, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to stat file: %m");
 
         response = MHD_create_response_from_fd_at_offset64(st.st_size, fd, 0);
         if (!response)
@@ -762,15 +766,15 @@ static int request_handler_machine(
 
         r = open_journal(m);
         if (r < 0)
-                return mhd_respondf(connection, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to open journal: %s\n", strerror(-r));
+                return mhd_respondf(connection, r, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to open journal: %m");
 
         r = sd_id128_get_machine(&mid);
         if (r < 0)
-                return mhd_respondf(connection, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to determine machine ID: %s\n", strerror(-r));
+                return mhd_respondf(connection, r, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to determine machine ID: %m");
 
         r = sd_id128_get_boot(&bid);
         if (r < 0)
-                return mhd_respondf(connection, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to determine boot ID: %s\n", strerror(-r));
+                return mhd_respondf(connection, r, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to determine boot ID: %m");
 
         hostname = gethostname_malloc();
         if (!hostname)
@@ -778,11 +782,11 @@ static int request_handler_machine(
 
         r = sd_journal_get_usage(m->journal, &usage);
         if (r < 0)
-                return mhd_respondf(connection, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to determine disk usage: %s\n", strerror(-r));
+                return mhd_respondf(connection, r, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to determine disk usage: %m");
 
         r = sd_journal_get_cutoff_realtime_usec(m->journal, &cutoff_from, &cutoff_to);
         if (r < 0)
-                return mhd_respondf(connection, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to determine disk usage: %s\n", strerror(-r));
+                return mhd_respondf(connection, r, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to determine disk usage: %m");
 
         if (parse_env_file("/etc/os-release", NEWLINE, "PRETTY_NAME", &os_name, NULL) == -ENOENT)
                 (void) parse_env_file("/usr/lib/os-release", NEWLINE, "PRETTY_NAME", &os_name, NULL);
@@ -840,8 +844,7 @@ static int request_handler(
         assert(method);
 
         if (!streq(method, "GET"))
-                return mhd_respond(connection, MHD_HTTP_NOT_ACCEPTABLE,
-                                   "Unsupported method.\n");
+                return mhd_respond(connection, MHD_HTTP_NOT_ACCEPTABLE, "Unsupported method.");
 
 
         if (!*connection_cls) {
@@ -871,7 +874,7 @@ static int request_handler(
         if (streq(url, "/machine"))
                 return request_handler_machine(connection, *connection_cls);
 
-        return mhd_respond(connection, MHD_HTTP_NOT_FOUND, "Not found.\n");
+        return mhd_respond(connection, MHD_HTTP_NOT_FOUND, "Not found.");
 }
 
 static void help(void) {
@@ -881,7 +884,8 @@ static void help(void) {
                "     --version        Show package version\n"
                "     --cert=CERT.PEM  Server certificate in PEM format\n"
                "     --key=KEY.PEM    Server key in PEM format\n"
-               "     --trust=CERT.PEM Certificat authority certificate in PEM format\n",
+               "     --trust=CERT.PEM Certificate authority certificate in PEM format\n"
+               "  -D --directory=PATH Serve journal files in directory\n",
                program_invocation_short_name);
 }
 
@@ -896,18 +900,19 @@ static int parse_argv(int argc, char *argv[]) {
         int r, c;
 
         static const struct option options[] = {
-                { "help",    no_argument,       NULL, 'h'         },
-                { "version", no_argument,       NULL, ARG_VERSION },
-                { "key",     required_argument, NULL, ARG_KEY     },
-                { "cert",    required_argument, NULL, ARG_CERT    },
-                { "trust",   required_argument, NULL, ARG_TRUST   },
+                { "help",      no_argument,       NULL, 'h'           },
+                { "version",   no_argument,       NULL, ARG_VERSION   },
+                { "key",       required_argument, NULL, ARG_KEY       },
+                { "cert",      required_argument, NULL, ARG_CERT      },
+                { "trust",     required_argument, NULL, ARG_TRUST     },
+                { "directory", required_argument, NULL, 'D'           },
                 {}
         };
 
         assert(argc >= 0);
         assert(argv);
 
-        while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0)
+        while ((c = getopt_long(argc, argv, "hD:", options, NULL)) >= 0)
 
                 switch(c) {
 
@@ -953,7 +958,11 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 #else
                         log_error("Option --trust is not available.");
+                        return -EINVAL;
 #endif
+                case 'D':
+                        arg_directory = optarg;
+                        break;
 
                 case '?':
                         return -EINVAL;
@@ -1020,10 +1029,9 @@ int main(int argc, char *argv[]) {
                         { MHD_OPTION_END, 0, NULL }};
                 int opts_pos = 2;
 
-                /* We force MHD_USE_PIPE_FOR_SHUTDOWN here, in order
-                 * to make sure libmicrohttpd doesn't use shutdown()
-                 * on our listening socket, which would break socket
-                 * re-activation. See
+                /* We force MHD_USE_ITC here, in order to make sure
+                 * libmicrohttpd doesn't use shutdown() on our listening
+                 * socket, which would break socket re-activation. See
                  *
                  * https://lists.gnu.org/archive/html/libmicrohttpd/2015-09/msg00014.html
                  * https://github.com/systemd/systemd/pull/1286
@@ -1032,7 +1040,7 @@ int main(int argc, char *argv[]) {
                 int flags =
                         MHD_USE_DEBUG |
                         MHD_USE_DUAL_STACK |
-                        MHD_USE_PIPE_FOR_SHUTDOWN |
+                        MHD_USE_ITC |
                         MHD_USE_POLL |
                         MHD_USE_THREAD_PER_CONNECTION;
 
index 9ba9ee3..d61d1c1 100644 (file)
 #include "parse-util.h"
 #include "string-util.h"
 
-#define LINE_CHUNK 8*1024u
-
 void source_free(RemoteSource *source) {
         if (!source)
                 return;
 
-        if (source->fd >= 0 && !source->passive_fd) {
-                log_debug("Closing fd:%d (%s)", source->fd, source->name);
-                safe_close(source->fd);
-        }
-
-        free(source->name);
-        free(source->buf);
-        iovw_free_contents(&source->iovw);
+        journal_importer_cleanup(&source->importer);
 
         log_debug("Writer ref count %i", source->writer->n_ref);
         writer_unref(source->writer);
@@ -50,7 +41,7 @@ void source_free(RemoteSource *source) {
 
 /**
  * Initialize zero-filled source with given values. On success, takes
- * ownerhship of fd and writer, otherwise does not touch them.
+ * ownership of fd, name, and writer, otherwise does not touch them.
  */
 RemoteSource* source_new(int fd, bool passive_fd, char *name, Writer *writer) {
 
@@ -65,442 +56,44 @@ RemoteSource* source_new(int fd, bool passive_fd, char *name, Writer *writer) {
         if (!source)
                 return NULL;
 
-        source->fd = fd;
-        source->passive_fd = passive_fd;
-        source->name = name;
+        source->importer.fd = fd;
+        source->importer.passive_fd = passive_fd;
+        source->importer.name = name;
+
         source->writer = writer;
 
         return source;
 }
 
-static char* realloc_buffer(RemoteSource *source, size_t size) {
-        char *b, *old = source->buf;
-
-        b = GREEDY_REALLOC(source->buf, source->size, size);
-        if (!b)
-                return NULL;
-
-        iovw_rebase(&source->iovw, old, source->buf);
-
-        return b;
-}
-
-static int get_line(RemoteSource *source, char **line, size_t *size) {
-        ssize_t n;
-        char *c = NULL;
-
-        assert(source);
-        assert(source->state == STATE_LINE);
-        assert(source->offset <= source->filled);
-        assert(source->filled <= source->size);
-        assert(source->buf == NULL || source->size > 0);
-        assert(source->fd >= 0);
-
-        for (;;) {
-                if (source->buf) {
-                        size_t start = MAX(source->scanned, source->offset);
-
-                        c = memchr(source->buf + start, '\n',
-                                   source->filled - start);
-                        if (c != NULL)
-                                break;
-                }
-
-                source->scanned = source->filled;
-                if (source->scanned >= DATA_SIZE_MAX) {
-                        log_error("Entry is bigger than %u bytes.", DATA_SIZE_MAX);
-                        return -E2BIG;
-                }
-
-                if (source->passive_fd)
-                        /* we have to wait for some data to come to us */
-                        return -EAGAIN;
-
-                /* We know that source->filled is at most DATA_SIZE_MAX, so if
-                   we reallocate it, we'll increase the size at least a bit. */
-                assert_cc(DATA_SIZE_MAX < ENTRY_SIZE_MAX);
-                if (source->size - source->filled < LINE_CHUNK &&
-                    !realloc_buffer(source, MIN(source->filled + LINE_CHUNK, ENTRY_SIZE_MAX)))
-                                return log_oom();
-
-                assert(source->buf);
-                assert(source->size - source->filled >= LINE_CHUNK ||
-                       source->size == ENTRY_SIZE_MAX);
-
-                n = read(source->fd,
-                         source->buf + source->filled,
-                         source->size - source->filled);
-                if (n < 0) {
-                        if (errno != EAGAIN)
-                                log_error_errno(errno, "read(%d, ..., %zu): %m",
-                                                source->fd,
-                                                source->size - source->filled);
-                        return -errno;
-                } else if (n == 0)
-                        return 0;
-
-                source->filled += n;
-        }
-
-        *line = source->buf + source->offset;
-        *size = c + 1 - source->buf - source->offset;
-        source->offset += *size;
-
-        return 1;
-}
-
-int push_data(RemoteSource *source, const char *data, size_t size) {
-        assert(source);
-        assert(source->state != STATE_EOF);
-
-        if (!realloc_buffer(source, source->filled + size)) {
-                log_error("Failed to store received data of size %zu "
-                          "(in addition to existing %zu bytes with %zu filled): %s",
-                          size, source->size, source->filled, strerror(ENOMEM));
-                return -ENOMEM;
-        }
-
-        memcpy(source->buf + source->filled, data, size);
-        source->filled += size;
-
-        return 0;
-}
-
-static int fill_fixed_size(RemoteSource *source, void **data, size_t size) {
-
-        assert(source);
-        assert(source->state == STATE_DATA_START ||
-               source->state == STATE_DATA ||
-               source->state == STATE_DATA_FINISH);
-        assert(size <= DATA_SIZE_MAX);
-        assert(source->offset <= source->filled);
-        assert(source->filled <= source->size);
-        assert(source->buf != NULL || source->size == 0);
-        assert(source->buf == NULL || source->size > 0);
-        assert(source->fd >= 0);
-        assert(data);
-
-        while (source->filled - source->offset < size) {
-                int n;
-
-                if (source->passive_fd)
-                        /* we have to wait for some data to come to us */
-                        return -EAGAIN;
-
-                if (!realloc_buffer(source, source->offset + size))
-                        return log_oom();
-
-                n = read(source->fd, source->buf + source->filled,
-                         source->size - source->filled);
-                if (n < 0) {
-                        if (errno != EAGAIN)
-                                log_error_errno(errno, "read(%d, ..., %zu): %m", source->fd,
-                                                source->size - source->filled);
-                        return -errno;
-                } else if (n == 0)
-                        return 0;
-
-                source->filled += n;
-        }
-
-        *data = source->buf + source->offset;
-        source->offset += size;
-
-        return 1;
-}
-
-static int get_data_size(RemoteSource *source) {
-        int r;
-        void *data;
-
-        assert(source);
-        assert(source->state == STATE_DATA_START);
-        assert(source->data_size == 0);
-
-        r = fill_fixed_size(source, &data, sizeof(uint64_t));
-        if (r <= 0)
-                return r;
-
-        source->data_size = le64toh( *(uint64_t *) data );
-        if (source->data_size > DATA_SIZE_MAX) {
-                log_error("Stream declares field with size %zu > DATA_SIZE_MAX = %u",
-                          source->data_size, DATA_SIZE_MAX);
-                return -EINVAL;
-        }
-        if (source->data_size == 0)
-                log_warning("Binary field with zero length");
-
-        return 1;
-}
-
-static int get_data_data(RemoteSource *source, void **data) {
-        int r;
-
-        assert(source);
-        assert(data);
-        assert(source->state == STATE_DATA);
-
-        r = fill_fixed_size(source, data, source->data_size);
-        if (r <= 0)
-                return r;
-
-        return 1;
-}
-
-static int get_data_newline(RemoteSource *source) {
-        int r;
-        char *data;
-
-        assert(source);
-        assert(source->state == STATE_DATA_FINISH);
-
-        r = fill_fixed_size(source, (void**) &data, 1);
-        if (r <= 0)
-                return r;
-
-        assert(data);
-        if (*data != '\n') {
-                log_error("expected newline, got '%c'", *data);
-                return -EINVAL;
-        }
-
-        return 1;
-}
-
-static int process_dunder(RemoteSource *source, char *line, size_t n) {
-        const char *timestamp;
-        int r;
-
-        assert(line);
-        assert(n > 0);
-        assert(line[n-1] == '\n');
-
-        /* XXX: is it worth to support timestamps in extended format?
-         * We don't produce them, but who knows... */
-
-        timestamp = startswith(line, "__CURSOR=");
-        if (timestamp)
-                /* ignore __CURSOR */
-                return 1;
-
-        timestamp = startswith(line, "__REALTIME_TIMESTAMP=");
-        if (timestamp) {
-                long long unsigned x;
-                line[n-1] = '\0';
-                r = safe_atollu(timestamp, &x);
-                if (r < 0)
-                        log_warning("Failed to parse __REALTIME_TIMESTAMP: '%s'", timestamp);
-                else
-                        source->ts.realtime = x;
-                return r < 0 ? r : 1;
-        }
-
-        timestamp = startswith(line, "__MONOTONIC_TIMESTAMP=");
-        if (timestamp) {
-                long long unsigned x;
-                line[n-1] = '\0';
-                r = safe_atollu(timestamp, &x);
-                if (r < 0)
-                        log_warning("Failed to parse __MONOTONIC_TIMESTAMP: '%s'", timestamp);
-                else
-                        source->ts.monotonic = x;
-                return r < 0 ? r : 1;
-        }
-
-        timestamp = startswith(line, "__");
-        if (timestamp) {
-                log_notice("Unknown dunder line %s", line);
-                return 1;
-        }
-
-        /* no dunder */
-        return 0;
-}
-
-static int process_data(RemoteSource *source) {
-        int r;
-
-        switch(source->state) {
-        case STATE_LINE: {
-                char *line, *sep;
-                size_t n = 0;
-
-                assert(source->data_size == 0);
-
-                r = get_line(source, &line, &n);
-                if (r < 0)
-                        return r;
-                if (r == 0) {
-                        source->state = STATE_EOF;
-                        return r;
-                }
-                assert(n > 0);
-                assert(line[n-1] == '\n');
-
-                if (n == 1) {
-                        log_trace("Received empty line, event is ready");
-                        return 1;
-                }
-
-                r = process_dunder(source, line, n);
-                if (r != 0)
-                        return r < 0 ? r : 0;
-
-                /* MESSAGE=xxx\n
-                   or
-                   COREDUMP\n
-                   LLLLLLLL0011223344...\n
-                */
-                sep = memchr(line, '=', n);
-                if (sep) {
-                        /* chomp newline */
-                        n--;
-
-                        r = iovw_put(&source->iovw, line, n);
-                        if (r < 0)
-                                return r;
-                } else {
-                        /* replace \n with = */
-                        line[n-1] = '=';
-
-                        source->field_len = n;
-                        source->state = STATE_DATA_START;
-
-                        /* we cannot put the field in iovec until we have all data */
-                }
-
-                log_trace("Received: %.*s (%s)", (int) n, line, sep ? "text" : "binary");
-
-                return 0; /* continue */
-        }
-
-        case STATE_DATA_START:
-                assert(source->data_size == 0);
-
-                r = get_data_size(source);
-                // log_debug("get_data_size() -> %d", r);
-                if (r < 0)
-                        return r;
-                if (r == 0) {
-                        source->state = STATE_EOF;
-                        return 0;
-                }
-
-                source->state = source->data_size > 0 ?
-                        STATE_DATA : STATE_DATA_FINISH;
-
-                return 0; /* continue */
-
-        case STATE_DATA: {
-                void *data;
-                char *field;
-
-                assert(source->data_size > 0);
-
-                r = get_data_data(source, &data);
-                // log_debug("get_data_data() -> %d", r);
-                if (r < 0)
-                        return r;
-                if (r == 0) {
-                        source->state = STATE_EOF;
-                        return 0;
-                }
-
-                assert(data);
-
-                field = (char*) data - sizeof(uint64_t) - source->field_len;
-                memmove(field + sizeof(uint64_t), field, source->field_len);
-
-                r = iovw_put(&source->iovw, field + sizeof(uint64_t), source->field_len + source->data_size);
-                if (r < 0)
-                        return r;
-
-                source->state = STATE_DATA_FINISH;
-
-                return 0; /* continue */
-        }
-
-        case STATE_DATA_FINISH:
-                r = get_data_newline(source);
-                // log_debug("get_data_newline() -> %d", r);
-                if (r < 0)
-                        return r;
-                if (r == 0) {
-                        source->state = STATE_EOF;
-                        return 0;
-                }
-
-                source->data_size = 0;
-                source->state = STATE_LINE;
-
-                return 0; /* continue */
-        default:
-                assert_not_reached("wtf?");
-        }
-}
-
 int process_source(RemoteSource *source, bool compress, bool seal) {
-        size_t remain, target;
         int r;
 
         assert(source);
         assert(source->writer);
 
-        r = process_data(source);
+        r = journal_importer_process_data(&source->importer);
         if (r <= 0)
                 return r;
 
         /* We have a full event */
         log_trace("Received full event from source@%p fd:%d (%s)",
-                  source, source->fd, source->name);
+                  source, source->importer.fd, source->importer.name);
 
-        if (!source->iovw.count) {
+        if (source->importer.iovw.count == 0) {
                 log_warning("Entry with no payload, skipping");
                 goto freeing;
         }
 
-        assert(source->iovw.iovec);
-        assert(source->iovw.count);
+        assert(source->importer.iovw.iovec);
 
-        r = writer_write(source->writer, &source->iovw, &source->ts, compress, seal);
+        r = writer_write(source->writer, &source->importer.iovw, &source->importer.ts, compress, seal);
         if (r < 0)
                 log_error_errno(r, "Failed to write entry of %zu bytes: %m",
-                                iovw_size(&source->iovw));
+                                iovw_size(&source->importer.iovw));
         else
                 r = 1;
 
  freeing:
-        iovw_free_contents(&source->iovw);
-
-        /* possibly reset buffer position */
-        remain = source->filled - source->offset;
-
-        if (remain == 0) /* no brainer */
-                source->offset = source->scanned = source->filled = 0;
-        else if (source->offset > source->size - source->filled &&
-                 source->offset > remain) {
-                memcpy(source->buf, source->buf + source->offset, remain);
-                source->offset = source->scanned = 0;
-                source->filled = remain;
-        }
-
-        target = source->size;
-        while (target > 16 * LINE_CHUNK && source->filled < target / 2)
-                target /= 2;
-        if (target < source->size) {
-                char *tmp;
-
-                tmp = realloc(source->buf, target);
-                if (!tmp)
-                        log_warning("Failed to reallocate buffer to (smaller) size %zu",
-                                    target);
-                else {
-                        log_debug("Reallocated buffer from %zu to %zu bytes",
-                                  source->size, target);
-                        source->buf = tmp;
-                        source->size = target;
-                }
-        }
-
+        journal_importer_drop_iovw(&source->importer);
         return r;
 }
index 1740a21..e363252 100644 (file)
 
 #include "sd-event.h"
 
+#include "journal-importer.h"
 #include "journal-remote-write.h"
 
-typedef enum {
-        STATE_LINE = 0,    /* waiting to read, or reading line */
-        STATE_DATA_START,  /* reading binary data header */
-        STATE_DATA,        /* reading binary data */
-        STATE_DATA_FINISH, /* expecting newline */
-        STATE_EOF,         /* done */
-} source_state;
-
 typedef struct RemoteSource {
-        char *name;
-        int fd;
-        bool passive_fd;
-
-        char *buf;
-        size_t size;       /* total size of the buffer */
-        size_t offset;     /* offset to the beginning of live data in the buffer */
-        size_t scanned;    /* number of bytes since the beginning of data without a newline */
-        size_t filled;     /* total number of bytes in the buffer */
-
-        size_t field_len;  /* used for binary fields: the field name length */
-        size_t data_size;  /* and the size of the binary data chunk being processed */
-
-        struct iovec_wrapper iovw;
-
-        source_state state;
-        dual_timestamp ts;
+        JournalImporter importer;
 
         Writer *writer;
 
@@ -57,13 +34,5 @@ typedef struct RemoteSource {
 } RemoteSource;
 
 RemoteSource* source_new(int fd, bool passive_fd, char *name, Writer *writer);
-
-static inline size_t source_non_empty(RemoteSource *source) {
-        assert(source);
-
-        return source->filled;
-}
-
 void source_free(RemoteSource *source);
-int push_data(RemoteSource *source, const char *data, size_t size);
 int process_source(RemoteSource *source, bool compress, bool seal);
index 7bba525..734cad3 100644 (file)
 #include "alloc-util.h"
 #include "journal-remote.h"
 
-int iovw_put(struct iovec_wrapper *iovw, void* data, size_t len) {
-        if (!GREEDY_REALLOC(iovw->iovec, iovw->size_bytes, iovw->count + 1))
-                return log_oom();
-
-        iovw->iovec[iovw->count++] = (struct iovec) {data, len};
-        return 0;
-}
-
-void iovw_free_contents(struct iovec_wrapper *iovw) {
-        iovw->iovec = mfree(iovw->iovec);
-        iovw->size_bytes = iovw->count = 0;
-}
-
-size_t iovw_size(struct iovec_wrapper *iovw) {
-        size_t n = 0, i;
-
-        for (i = 0; i < iovw->count; i++)
-                n += iovw->iovec[i].iov_len;
-
-        return n;
-}
-
-void iovw_rebase(struct iovec_wrapper *iovw, char *old, char *new) {
-        size_t i;
-
-        for (i = 0; i < iovw->count; i++)
-                iovw->iovec[i].iov_base = (char*) iovw->iovec[i].iov_base - old + new;
-}
-
-/**********************************************************************
- **********************************************************************
- **********************************************************************/
-
 static int do_rotate(JournalFile **f, bool compress, bool seal) {
         int r = journal_file_rotate(f, compress, seal, NULL);
         if (r < 0) {
@@ -75,10 +42,8 @@ Writer* writer_new(RemoteServer *server) {
         memset(&w->metrics, 0xFF, sizeof(w->metrics));
 
         w->mmap = mmap_cache_new();
-        if (!w->mmap) {
-                free(w);
-                return NULL;
-        }
+        if (!w->mmap)
+                return mfree(w);
 
         w->n_ref = 1;
         w->server = server;
@@ -103,9 +68,7 @@ Writer* writer_free(Writer *w) {
         if (w->mmap)
                 mmap_cache_unref(w->mmap);
 
-        free(w);
-
-        return NULL;
+        return mfree(w);
 }
 
 Writer* writer_unref(Writer *w) {
index 53ba45f..e04af54 100644 (file)
 ***/
 
 #include "journal-file.h"
+#include "journal-importer.h"
 
 typedef struct RemoteServer RemoteServer;
 
-struct iovec_wrapper {
-        struct iovec *iovec;
-        size_t size_bytes;
-        size_t count;
-};
-
-int iovw_put(struct iovec_wrapper *iovw, void* data, size_t len);
-void iovw_free_contents(struct iovec_wrapper *iovw);
-size_t iovw_size(struct iovec_wrapper *iovw);
-void iovw_rebase(struct iovec_wrapper *iovw, char *old, char *new);
-
 typedef struct Writer {
         JournalFile *journal;
         JournalMetrics metrics;
index 35a1e55..36c1a32 100644 (file)
 #include <sys/socket.h>
 #include <unistd.h>
 
-#ifdef HAVE_GNUTLS
-#include <gnutls/gnutls.h>
-#endif
-
 #include "sd-daemon.h"
 
 #include "alloc-util.h"
@@ -131,6 +127,10 @@ static int spawn_child(const char* child, char** argv) {
         if (r < 0)
                 log_warning_errno(errno, "Failed to close write end of pipe: %m");
 
+        r = fd_nonblock(fd[0], true);
+        if (r < 0)
+                log_warning_errno(errno, "Failed to set child pipe to non-blocking: %m");
+
         return fd[0];
 }
 
@@ -512,7 +512,8 @@ static int process_http_upload(
         if (*upload_data_size) {
                 log_trace("Received %zu bytes", *upload_data_size);
 
-                r = push_data(source, upload_data, *upload_data_size);
+                r = journal_importer_push_data(&source->importer,
+                                               upload_data, *upload_data_size);
                 if (r < 0)
                         return mhd_respond_oom(connection);
 
@@ -528,13 +529,12 @@ static int process_http_upload(
                         log_warning("Failed to process data for connection %p", connection);
                         if (r == -E2BIG)
                                 return mhd_respondf(connection,
-                                                    MHD_HTTP_REQUEST_ENTITY_TOO_LARGE,
-                                                    "Entry is too large, maximum is %u bytes.\n",
-                                                    DATA_SIZE_MAX);
+                                                    r, MHD_HTTP_PAYLOAD_TOO_LARGE,
+                                                    "Entry is too large, maximum is " STRINGIFY(DATA_SIZE_MAX) " bytes.");
                         else
                                 return mhd_respondf(connection,
-                                                    MHD_HTTP_UNPROCESSABLE_ENTITY,
-                                                    "Processing failed: %s.", strerror(-r));
+                                                    r, MHD_HTTP_UNPROCESSABLE_ENTITY,
+                                                    "Processing failed: %m.");
                 }
         }
 
@@ -543,15 +543,16 @@ static int process_http_upload(
 
         /* The upload is finished */
 
-        remaining = source_non_empty(source);
+        remaining = journal_importer_bytes_remaining(&source->importer);
         if (remaining > 0) {
-                log_warning("Premature EOFbyte. %zu bytes lost.", remaining);
-                return mhd_respondf(connection, MHD_HTTP_EXPECTATION_FAILED,
+                log_warning("Premature EOF byte. %zu bytes lost.", remaining);
+                return mhd_respondf(connection,
+                                    0, MHD_HTTP_EXPECTATION_FAILED,
                                     "Premature EOF. %zu bytes of trailing data not processed.",
                                     remaining);
         }
 
-        return mhd_respond(connection, MHD_HTTP_ACCEPTED, "OK.\n");
+        return mhd_respond(connection, MHD_HTTP_ACCEPTED, "OK.");
 };
 
 static int request_handler(
@@ -581,19 +582,16 @@ static int request_handler(
                                            *connection_cls);
 
         if (!streq(method, "POST"))
-                return mhd_respond(connection, MHD_HTTP_NOT_ACCEPTABLE,
-                                   "Unsupported method.\n");
+                return mhd_respond(connection, MHD_HTTP_NOT_ACCEPTABLE, "Unsupported method.");
 
         if (!streq(url, "/upload"))
-                return mhd_respond(connection, MHD_HTTP_NOT_FOUND,
-                                   "Not found.\n");
+                return mhd_respond(connection, MHD_HTTP_NOT_FOUND, "Not found.");
 
         header = MHD_lookup_connection_value(connection,
                                              MHD_HEADER_KIND, "Content-Type");
         if (!header || !streq(header, "application/vnd.fdo.journal"))
                 return mhd_respond(connection, MHD_HTTP_UNSUPPORTED_MEDIA_TYPE,
-                                   "Content-Type: application/vnd.fdo.journal"
-                                   " is required.\n");
+                                   "Content-Type: application/vnd.fdo.journal is required.");
 
         {
                 const union MHD_ConnectionInfo *ci;
@@ -603,7 +601,7 @@ static int request_handler(
                 if (!ci) {
                         log_error("MHD_get_connection_info failed: cannot get remote fd");
                         return mhd_respond(connection, MHD_HTTP_INTERNAL_SERVER_ERROR,
-                                           "Cannot check remote address");
+                                           "Cannot check remote address.");
                 }
 
                 fd = ci->connect_fd;
@@ -618,7 +616,7 @@ static int request_handler(
                 r = getpeername_pretty(fd, false, &hostname);
                 if (r < 0)
                         return mhd_respond(connection, MHD_HTTP_INTERNAL_SERVER_ERROR,
-                                           "Cannot check remote hostname");
+                                           "Cannot check remote hostname.");
         }
 
         assert(hostname);
@@ -627,8 +625,7 @@ static int request_handler(
         if (r == -ENOMEM)
                 return respond_oom(connection);
         else if (r < 0)
-                return mhd_respond(connection, MHD_HTTP_INTERNAL_SERVER_ERROR,
-                                   strerror(-r));
+                return mhd_respondf(connection, r, MHD_HTTP_INTERNAL_SERVER_ERROR, "%m");
 
         hostname = NULL;
         return MHD_YES;
@@ -652,9 +649,9 @@ static int setup_microhttpd_server(RemoteServer *s,
         int flags =
                 MHD_USE_DEBUG |
                 MHD_USE_DUAL_STACK |
-                MHD_USE_EPOLL_LINUX_ONLY |
+                MHD_USE_EPOLL |
                 MHD_USE_PEDANTIC_CHECKS |
-                MHD_USE_PIPE_FOR_SHUTDOWN;
+                MHD_USE_ITC;
 
         const union MHD_DaemonInfo *info;
         int r, epoll_fd;
@@ -1040,19 +1037,19 @@ static int handle_raw_source(sd_event_source *event,
 
         assert(fd >= 0 && fd < (ssize_t) s->sources_size);
         source = s->sources[fd];
-        assert(source->fd == fd);
+        assert(source->importer.fd == fd);
 
         r = process_source(source, arg_compress, arg_seal);
-        if (source->state == STATE_EOF) {
+        if (journal_importer_eof(&source->importer)) {
                 size_t remaining;
 
-                log_debug("EOF reached with source fd:%d (%s)",
-                          source->fd, source->name);
+                log_debug("EOF reached with source %s (fd=%d)",
+                          source->importer.name, source->importer.fd);
 
-                remaining = source_non_empty(source);
+                remaining = journal_importer_bytes_remaining(&source->importer);
                 if (remaining > 0)
                         log_notice("Premature EOF. %zu bytes lost.", remaining);
-                remove_source(s, source->fd);
+                remove_source(s, source->importer.fd);
                 log_debug("%zu active sources remaining", s->active);
                 return 0;
         } else if (r == -E2BIG) {
@@ -1076,7 +1073,7 @@ static int dispatch_raw_source_until_block(sd_event_source *event,
         /* Make sure event stays around even if source is destroyed */
         sd_event_source_ref(event);
 
-        r = handle_raw_source(event, source->fd, EPOLLIN, server);
+        r = handle_raw_source(event, source->importer.fd, EPOLLIN, server);
         if (r != 1)
                 /* No more data for now */
                 sd_event_source_set_enabled(event, SD_EVENT_OFF);
@@ -1109,7 +1106,7 @@ static int dispatch_blocking_source_event(sd_event_source *event,
                                           void *userdata) {
         RemoteSource *source = userdata;
 
-        return handle_raw_source(event, source->fd, EPOLLIN, server);
+        return handle_raw_source(event, source->importer.fd, EPOLLIN, server);
 }
 
 static int accept_connection(const char* type, int fd,
@@ -1202,10 +1199,10 @@ static int parse_config(void) {
                 { "Remote",  "TrustedCertificateFile", config_parse_path,             0, &arg_trust      },
                 {}};
 
-        return config_parse_many(PKGSYSCONFDIR "/journal-remote.conf",
-                                 CONF_PATHS_NULSTR("systemd/journal-remote.conf.d"),
-                                 "Remote\0", config_item_table_lookup, items,
-                                 false, NULL);
+        return config_parse_many_nulstr(PKGSYSCONFDIR "/journal-remote.conf",
+                                        CONF_PATHS_NULSTR("systemd/journal-remote.conf.d"),
+                                        "Remote\0", config_item_table_lookup, items,
+                                        false, NULL);
 }
 
 static void help(void) {
@@ -1564,7 +1561,7 @@ int main(int argc, char **argv) {
         if (r < 0)
                 log_error_errno(r, "Failed to enable watchdog: %m");
         else
-                log_debug("Watchdog is %s.", r > 0 ? "enabled" : "disabled");
+                log_debug("Watchdog is %sd.", enable_disable(r > 0));
 
         log_debug("%s running as pid "PID_FMT,
                   program_invocation_short_name, getpid());
index 8ce8e18..3a36e46 100644 (file)
@@ -251,7 +251,7 @@ static inline void check_update_watchdog(Uploader *u) {
                 return;
 
         after = now(CLOCK_MONOTONIC);
-        elapsed_time = usec_sub(after, u->watchdog_timestamp);
+        elapsed_time = usec_sub_unsigned(after, u->watchdog_timestamp);
         if (elapsed_time > u->watchdog_usec / 2) {
                 log_debug("Update watchdog timer");
                 sd_notify(false, "WATCHDOG=1");
index 4647cfd..e0858dd 100644 (file)
@@ -30,7 +30,7 @@
 #include "def.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "glob-util.h"
 #include "journal-upload.h"
 #include "log.h"
@@ -438,7 +438,7 @@ static int setup_uploader(Uploader *u, const char *url, const char *state_file)
         }
 
         if (strchr(host, ':'))
-                u->url = strjoin(proto, url, "/upload", NULL);
+                u->url = strjoin(proto, url, "/upload");
         else {
                 char *t;
                 size_t x;
@@ -448,7 +448,7 @@ static int setup_uploader(Uploader *u, const char *url, const char *state_file)
                 while (x > 0 && t[x - 1] == '/')
                         t[x - 1] = '\0';
 
-                u->url = strjoin(proto, t, ":" STRINGIFY(DEFAULT_PORT), "/upload", NULL);
+                u->url = strjoin(proto, t, ":" STRINGIFY(DEFAULT_PORT), "/upload");
         }
         if (!u->url)
                 return log_oom();
@@ -527,9 +527,7 @@ static int perform_upload(Uploader *u) {
                 log_debug("Upload finished successfully with code %ld: %s",
                           status, strna(u->answer));
 
-        free(u->last_cursor);
-        u->last_cursor = u->current_cursor;
-        u->current_cursor = NULL;
+        free_and_replace(u->last_cursor, u->current_cursor);
 
         return update_cursor_state(u);
 }
@@ -542,10 +540,10 @@ static int parse_config(void) {
                 { "Upload",  "TrustedCertificateFile", config_parse_path,   0, &arg_trust  },
                 {}};
 
-        return config_parse_many(PKGSYSCONFDIR "/journal-upload.conf",
-                                 CONF_PATHS_NULSTR("systemd/journal-upload.conf.d"),
-                                 "Upload\0", config_item_table_lookup, items,
-                                 false, NULL);
+        return config_parse_many_nulstr(PKGSYSCONFDIR "/journal-upload.conf",
+                                        CONF_PATHS_NULSTR("systemd/journal-upload.conf.d"),
+                                        "Upload\0", config_item_table_lookup, items,
+                                        false, NULL);
 }
 
 static void help(void) {
index fd6964e..c2f945b 100755 (executable)
@@ -1,5 +1,4 @@
-#!/usr/bin/python
-from __future__ import print_function
+#!/usr/bin/env python3
 import sys
 import argparse
 
@@ -30,7 +29,7 @@ _SOURCE_REALTIME_TIMESTAMP={source_realtime_ts}
 DATA={data}
 """
 
-m  = 0x198603b12d7
+m = 0x198603b12d7
 realtime_ts = 1404101101501873
 monotonic_ts = 1753961140951
 source_realtime_ts = 1404101101483516
@@ -72,5 +71,5 @@ for i in range(OPTIONS.n):
         print('.', file=sys.stderr, end='', flush=True)
 
 if OPTIONS.dots:
-        print(file=sys.stderr)
+    print(file=sys.stderr)
 print('Wrote {} bytes'.format(bytes), file=sys.stderr)
diff --git a/src/journal-remote/meson.build b/src/journal-remote/meson.build
new file mode 100644 (file)
index 0000000..d266b34
--- /dev/null
@@ -0,0 +1,49 @@
+systemd_journal_upload_sources = files('''
+        journal-upload.h
+        journal-upload.c
+        journal-upload-journal.c
+'''.split())
+
+systemd_journal_remote_sources = files('''
+        journal-remote-parse.h
+        journal-remote-parse.c
+        journal-remote-write.h
+        journal-remote-write.c
+        journal-remote.h
+        journal-remote.c
+        microhttpd-util.h
+        microhttpd-util.c
+'''.split())
+
+systemd_journal_gatewayd_sources = files('''
+        journal-gatewayd.c
+        microhttpd-util.h
+        microhttpd-util.c
+'''.split())
+
+if conf.get('ENABLE_REMOTE', false) and conf.get('HAVE_LIBCURL', false)
+        journal_upload_conf = configure_file(
+                input : 'journal-upload.conf.in',
+                output : 'journal-upload.conf',
+                configuration : substs)
+        install_data(journal_upload_conf,
+                     install_dir : pkgsysconfdir)
+endif
+
+if conf.get('ENABLE_REMOTE', false) and conf.get('HAVE_MICROHTTPD', false)
+        journal_remote_conf = configure_file(
+                input : 'journal-remote.conf.in',
+                output : 'journal-remote.conf',
+                configuration : substs)
+        install_data(journal_remote_conf,
+                     install_dir : pkgsysconfdir)
+
+        install_data('browse.html',
+                     install_dir : join_paths(pkgdatadir, 'gatewayd'))
+
+        meson.add_install_script('sh', '-c',
+                                 mkdir_p.format('/var/log/journal/remote'))
+        meson.add_install_script('sh', '-c',
+                                 'chown 0:0 $DESTDIR/var/log/journal/remote &&
+                                 chmod 755 $DESTDIR/var/log/journal/remote || :')
+endif
index 2f16b02..f5d2d79 100644 (file)
@@ -48,7 +48,7 @@ void microhttpd_logger(void *arg, const char *fmt, va_list ap) {
 
 static int mhd_respond_internal(struct MHD_Connection *connection,
                                 enum MHD_RequestTerminationCode code,
-                                char *buffer,
+                                const char *buffer,
                                 size_t size,
                                 enum MHD_ResponseMemoryMode mode) {
         struct MHD_Response *response;
@@ -56,7 +56,7 @@ static int mhd_respond_internal(struct MHD_Connection *connection,
 
         assert(connection);
 
-        response = MHD_create_response_from_buffer(size, buffer, mode);
+        response = MHD_create_response_from_buffer(size, (char*) buffer, mode);
         if (!response)
                 return MHD_NO;
 
@@ -72,19 +72,25 @@ int mhd_respond(struct MHD_Connection *connection,
                 enum MHD_RequestTerminationCode code,
                 const char *message) {
 
+        const char *fmt;
+
+        fmt = strjoina(message, "\n");
+
         return mhd_respond_internal(connection, code,
-                                    (char*) message, strlen(message),
+                                    fmt, strlen(message) + 1,
                                     MHD_RESPMEM_PERSISTENT);
 }
 
 int mhd_respond_oom(struct MHD_Connection *connection) {
-        return mhd_respond(connection, MHD_HTTP_SERVICE_UNAVAILABLE,  "Out of memory.\n");
+        return mhd_respond(connection, MHD_HTTP_SERVICE_UNAVAILABLE,  "Out of memory.");
 }
 
 int mhd_respondf(struct MHD_Connection *connection,
+                 int error,
                  enum MHD_RequestTerminationCode code,
                  const char *format, ...) {
 
+        const char *fmt;
         char *m;
         int r;
         va_list ap;
@@ -92,8 +98,15 @@ int mhd_respondf(struct MHD_Connection *connection,
         assert(connection);
         assert(format);
 
+        if (error < 0)
+                error = -error;
+        errno = -error;
+        fmt = strjoina(format, "\n");
         va_start(ap, format);
-        r = vasprintf(&m, format, ap);
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+        r = vasprintf(&m, fmt, ap);
+#pragma GCC diagnostic pop
         va_end(ap);
 
         if (r < 0)
index ea160f2..7f88c2c 100644 (file)
 
 #include "macro.h"
 
+/* Those defines are added when options are renamed, hence the check for the *old* name. */
+
 /* Compatiblity with libmicrohttpd < 0.9.38 */
 #ifndef MHD_HTTP_NOT_ACCEPTABLE
-#define MHD_HTTP_NOT_ACCEPTABLE MHD_HTTP_METHOD_NOT_ACCEPTABLE
+#  define MHD_HTTP_NOT_ACCEPTABLE MHD_HTTP_METHOD_NOT_ACCEPTABLE
+#endif
+
+/* Renamed in µhttpd 0.9.51 */
+#ifndef MHD_USE_PIPE_FOR_SHUTDOWN
+#  define MHD_USE_ITC MHD_USE_PIPE_FOR_SHUTDOWN
+#endif
+
+/* Renamed in µhttpd 0.9.52 */
+#ifndef MHD_USE_EPOLL_LINUX_ONLY
+#  define MHD_USE_EPOLL MHD_USE_EPOLL_LINUX_ONLY
+#endif
+
+/* Both the old and new names are defines, check for the new one. */
+
+/* Renamed in µhttpd 0.9.53 */
+#ifndef MHD_HTTP_PAYLOAD_TOO_LARGE
+#  define MHD_HTTP_PAYLOAD_TOO_LARGE MHD_HTTP_REQUEST_ENTITY_TOO_LARGE
 #endif
 
 #if MHD_VERSION < 0x00094203
-#define MHD_create_response_from_fd_at_offset64 MHD_create_response_from_fd_at_offset
+#  define MHD_create_response_from_fd_at_offset64 MHD_create_response_from_fd_at_offset
 #endif
 
 void microhttpd_logger(void *arg, const char *fmt, va_list ap) _printf_(2, 0);
@@ -39,8 +58,9 @@ void microhttpd_logger(void *arg, const char *fmt, va_list ap) _printf_(2, 0);
 #define respond_oom(connection) log_oom(), mhd_respond_oom(connection)
 
 int mhd_respondf(struct MHD_Connection *connection,
+                 int error,
                  unsigned code,
-                 const char *format, ...) _printf_(3,4);
+                 const char *format, ...) _printf_(4,5);
 
 int mhd_respond(struct MHD_Connection *connection,
                 unsigned code,
index 04d5852..b93a946 100644 (file)
@@ -1,4 +1,3 @@
 /journald-gperf.c
-/libsystemd-journal.pc
 /audit_type-list.txt
 /audit_type-*-name.*
diff --git a/src/journal/audit_type-to-name.awk b/src/journal/audit_type-to-name.awk
new file mode 100644 (file)
index 0000000..44fc702
--- /dev/null
@@ -0,0 +1,9 @@
+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"
+}
index ba734b5..818a720 100644 (file)
@@ -112,7 +112,11 @@ int compress_blob_lz4(const void *src, uint64_t src_size,
         if (src_size < 9)
                 return -ENOBUFS;
 
+#if LZ4_VERSION_NUMBER >= 10700
+        r = LZ4_compress_default(src, (char*)dst + 8, src_size, (int) dst_alloc_size - 8);
+#else
         r = LZ4_compress_limitedOutput(src, (char*)dst + 8, src_size, (int) dst_alloc_size - 8);
+#endif
         if (r <= 0)
                 return -ENOBUFS;
 
index 612b10f..e7c2288 100644 (file)
@@ -40,6 +40,9 @@
 #define RND_GEN_Q 0x02
 #define RND_GEN_X 0x03
 
+#pragma GCC diagnostic ignored "-Wpointer-arith"
+/* TODO: remove void* arithmetic and this work-around */
+
 /******************************************************************************/
 
 static void mpi_export(void *buf, size_t buflen, const gcry_mpi_t x) {
diff --git a/src/journal/generate-audit_type-list.sh b/src/journal/generate-audit_type-list.sh
new file mode 100755 (executable)
index 0000000..18cbe05
--- /dev/null
@@ -0,0 +1,14 @@
+#!/bin/sh -eu
+
+cpp="$1"
+shift
+
+includes=""
+for i in "$@"; do
+        includes="$includes -include $i"
+done
+
+$cpp -dM $includes - </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
index 7504326..4ff38de 100644 (file)
@@ -42,6 +42,7 @@
 #include "sd-event.h"
 #include "set.h"
 #include "string-util.h"
+#include "strv.h"
 #include "xattr-util.h"
 
 #define DEFAULT_DATA_HASH_TABLE_SIZE (2047ULL*sizeof(HashItem))
@@ -161,7 +162,7 @@ static int journal_file_set_offline_thread_join(JournalFile *f) {
 
         f->offline_state = OFFLINE_JOINED;
 
-        if (mmap_cache_got_sigbus(f->mmap, f->fd))
+        if (mmap_cache_got_sigbus(f->mmap, f->cache_fd))
                 return -EIO;
 
         return 0;
@@ -285,7 +286,7 @@ static int journal_file_set_online(JournalFile *f) {
                                 continue;
                         /* Canceled restart from offlining, must wait for offlining to complete however. */
 
-                        /* fall through to wait */
+                        /* fall through */
                 default: {
                         int r;
 
@@ -299,7 +300,7 @@ static int journal_file_set_online(JournalFile *f) {
                 }
         }
 
-        if (mmap_cache_got_sigbus(f->mmap, f->fd))
+        if (mmap_cache_got_sigbus(f->mmap, f->cache_fd))
                 return -EIO;
 
         switch (f->header->state) {
@@ -333,8 +334,13 @@ JournalFile* journal_file_close(JournalFile *f) {
 
 #ifdef HAVE_GCRYPT
         /* Write the final tag */
-        if (f->seal && f->writable)
-                journal_file_append_tag(f);
+        if (f->seal && f->writable) {
+                int r;
+
+                r = journal_file_append_tag(f);
+                if (r < 0)
+                        log_error_errno(r, "Failed to append tag when closing journal: %m");
+        }
 #endif
 
         if (f->post_change_timer) {
@@ -350,8 +356,8 @@ JournalFile* journal_file_close(JournalFile *f) {
 
         journal_file_set_offline(f, true);
 
-        if (f->mmap && f->fd >= 0)
-                mmap_cache_close_fd(f->mmap, f->fd);
+        if (f->mmap && f->cache_fd)
+                mmap_cache_free_fd(f->mmap, f->cache_fd);
 
         if (f->fd >= 0 && f->defrag_on_close) {
 
@@ -389,8 +395,7 @@ JournalFile* journal_file_close(JournalFile *f) {
                 gcry_md_close(f->hmac);
 #endif
 
-        free(f);
-        return NULL;
+        return mfree(f);
 }
 
 void journal_file_close_set(Set *s) {
@@ -503,57 +508,79 @@ static int journal_file_refresh_header(JournalFile *f) {
         return r;
 }
 
-static int journal_file_verify_header(JournalFile *f) {
+static bool warn_wrong_flags(const JournalFile *f, bool compatible) {
+        const uint32_t any = compatible ? HEADER_COMPATIBLE_ANY : HEADER_INCOMPATIBLE_ANY,
+                supported = compatible ? HEADER_COMPATIBLE_SUPPORTED : HEADER_INCOMPATIBLE_SUPPORTED;
+        const char *type = compatible ? "compatible" : "incompatible";
         uint32_t flags;
 
+        flags = le32toh(compatible ? f->header->compatible_flags : f->header->incompatible_flags);
+
+        if (flags & ~supported) {
+                if (flags & ~any)
+                        log_debug("Journal file %s has unknown %s flags 0x%"PRIx32,
+                                  f->path, type, flags & ~any);
+                flags = (flags & any) & ~supported;
+                if (flags) {
+                        const char* strv[3];
+                        unsigned n = 0;
+                        _cleanup_free_ char *t = NULL;
+
+                        if (compatible && (flags & HEADER_COMPATIBLE_SEALED))
+                                strv[n++] = "sealed";
+                        if (!compatible && (flags & HEADER_INCOMPATIBLE_COMPRESSED_XZ))
+                                strv[n++] = "xz-compressed";
+                        if (!compatible && (flags & HEADER_INCOMPATIBLE_COMPRESSED_LZ4))
+                                strv[n++] = "lz4-compressed";
+                        strv[n] = NULL;
+                        assert(n < ELEMENTSOF(strv));
+
+                        t = strv_join((char**) strv, ", ");
+                        log_debug("Journal file %s uses %s %s %s disabled at compilation time.",
+                                  f->path, type, n > 1 ? "flags" : "flag", strnull(t));
+                }
+                return true;
+        }
+
+        return false;
+}
+
+static int journal_file_verify_header(JournalFile *f) {
+        uint64_t arena_size, header_size;
+
         assert(f);
         assert(f->header);
 
         if (memcmp(f->header->signature, HEADER_SIGNATURE, 8))
                 return -EBADMSG;
 
-        /* In both read and write mode we refuse to open files with
-         * incompatible flags we don't know */
-        flags = le32toh(f->header->incompatible_flags);
-        if (flags & ~HEADER_INCOMPATIBLE_SUPPORTED) {
-                if (flags & ~HEADER_INCOMPATIBLE_ANY)
-                        log_debug("Journal file %s has unknown incompatible flags %"PRIx32,
-                                  f->path, flags & ~HEADER_INCOMPATIBLE_ANY);
-                flags = (flags & HEADER_INCOMPATIBLE_ANY) & ~HEADER_INCOMPATIBLE_SUPPORTED;
-                if (flags)
-                        log_debug("Journal file %s uses incompatible flags %"PRIx32
-                                  " disabled at compilation time.", f->path, flags);
+        /* In both read and write mode we refuse to open files with incompatible
+         * flags we don't know. */
+        if (warn_wrong_flags(f, false))
                 return -EPROTONOSUPPORT;
-        }
 
-        /* When open for writing we refuse to open files with
-         * compatible flags, too */
-        flags = le32toh(f->header->compatible_flags);
-        if (f->writable && (flags & ~HEADER_COMPATIBLE_SUPPORTED)) {
-                if (flags & ~HEADER_COMPATIBLE_ANY)
-                        log_debug("Journal file %s has unknown compatible flags %"PRIx32,
-                                  f->path, flags & ~HEADER_COMPATIBLE_ANY);
-                flags = (flags & HEADER_COMPATIBLE_ANY) & ~HEADER_COMPATIBLE_SUPPORTED;
-                if (flags)
-                        log_debug("Journal file %s uses compatible flags %"PRIx32
-                                  " disabled at compilation time.", f->path, flags);
+        /* When open for writing we refuse to open files with compatible flags, too. */
+        if (f->writable && warn_wrong_flags(f, true))
                 return -EPROTONOSUPPORT;
-        }
 
         if (f->header->state >= _STATE_MAX)
                 return -EBADMSG;
 
+        header_size = le64toh(f->header->header_size);
+
         /* The first addition was n_data, so check that we are at least this large */
-        if (le64toh(f->header->header_size) < HEADER_SIZE_MIN)
+        if (header_size < HEADER_SIZE_MIN)
                 return -EBADMSG;
 
         if (JOURNAL_HEADER_SEALED(f->header) && !JOURNAL_HEADER_CONTAINS(f->header, n_entry_arrays))
                 return -EBADMSG;
 
-        if ((le64toh(f->header->header_size) + le64toh(f->header->arena_size)) > (uint64_t) f->last_stat.st_size)
+        arena_size = le64toh(f->header->arena_size);
+
+        if (UINT64_MAX - header_size < arena_size || header_size + arena_size > (uint64_t) f->last_stat.st_size)
                 return -ENODATA;
 
-        if (le64toh(f->header->tail_object_offset) > (le64toh(f->header->header_size) + le64toh(f->header->arena_size)))
+        if (le64toh(f->header->tail_object_offset) > header_size + arena_size)
                 return -ENODATA;
 
         if (!VALID64(le64toh(f->header->data_hash_table_offset)) ||
@@ -563,8 +590,8 @@ static int journal_file_verify_header(JournalFile *f) {
                 return -ENODATA;
 
         if (f->writable) {
-                uint8_t state;
                 sd_id128_t machine_id;
+                uint8_t state;
                 int r;
 
                 r = sd_id128_get_machine(&machine_id);
@@ -576,15 +603,26 @@ static int journal_file_verify_header(JournalFile *f) {
 
                 state = f->header->state;
 
-                if (state == STATE_ONLINE) {
+                if (state == STATE_ARCHIVED)
+                        return -ESHUTDOWN; /* Already archived */
+                else if (state == STATE_ONLINE) {
                         log_debug("Journal file %s is already online. Assuming unclean closing.", f->path);
                         return -EBUSY;
-                } else if (state == STATE_ARCHIVED)
-                        return -ESHUTDOWN;
-                else if (state != STATE_OFFLINE) {
+                } else if (state != STATE_OFFLINE) {
                         log_debug("Journal file %s has unknown state %i.", f->path, state);
                         return -EBUSY;
                 }
+
+                if (f->header->field_hash_table_size == 0 || f->header->data_hash_table_size == 0)
+                        return -EBADMSG;
+
+                /* Don't permit appending to files from the future. Because otherwise the realtime timestamps wouldn't
+                 * be strictly ordered in the entries in the file anymore, and we can't have that since it breaks
+                 * bisection. */
+                if (le64toh(f->header->tail_entry_realtime) > now(CLOCK_REALTIME)) {
+                        log_debug("Journal file %s is from the future, refusing to append new data to it that'd be older.", f->path);
+                        return -ETXTBSY;
+                }
         }
 
         f->compress_xz = JOURNAL_HEADER_COMPRESSED_XZ(f->header);
@@ -622,7 +660,7 @@ static int journal_file_allocate(JournalFile *f, uint64_t offset, uint64_t size)
          * for sure, since we always call posix_fallocate()
          * ourselves */
 
-        if (mmap_cache_got_sigbus(f->mmap, f->fd))
+        if (mmap_cache_got_sigbus(f->mmap, f->cache_fd))
                 return -EIO;
 
         old_size =
@@ -711,7 +749,7 @@ static int journal_file_move_to(JournalFile *f, ObjectType type, bool keep_alway
                         return -EADDRNOTAVAIL;
         }
 
-        return mmap_cache_get(f->mmap, f->fd, f->prot, type_to_context(type), keep_always, offset, size, &f->last_stat, ret);
+        return mmap_cache_get(f->mmap, f->cache_fd, f->prot, type_to_context(type), keep_always, offset, size, &f->last_stat, ret);
 }
 
 static uint64_t minimum_header_size(Object *o) {
@@ -742,12 +780,16 @@ int journal_file_move_to_object(JournalFile *f, ObjectType type, uint64_t offset
         assert(ret);
 
         /* Objects may only be located at multiple of 64 bit */
-        if (!VALID64(offset))
+        if (!VALID64(offset)) {
+                log_debug("Attempt to move to object at non-64bit boundary: %" PRIu64, offset);
                 return -EBADMSG;
+        }
 
         /* Object may not be located in the file header */
-        if (offset < le64toh(f->header->header_size))
+        if (offset < le64toh(f->header->header_size)) {
+                log_debug("Attempt to move to object located in file header: %" PRIu64, offset);
                 return -EBADMSG;
+        }
 
         r = journal_file_move_to(f, type, false, offset, sizeof(ObjectHeader), &t);
         if (r < 0)
@@ -756,17 +798,29 @@ int journal_file_move_to_object(JournalFile *f, ObjectType type, uint64_t offset
         o = (Object*) t;
         s = le64toh(o->object.size);
 
-        if (s < sizeof(ObjectHeader))
+        if (s == 0) {
+                log_debug("Attempt to move to uninitialized object: %" PRIu64, offset);
+                return -EBADMSG;
+        }
+        if (s < sizeof(ObjectHeader)) {
+                log_debug("Attempt to move to overly short object: %" PRIu64, offset);
                 return -EBADMSG;
+        }
 
-        if (o->object.type <= OBJECT_UNUSED)
+        if (o->object.type <= OBJECT_UNUSED) {
+                log_debug("Attempt to move to object with invalid type: %" PRIu64, offset);
                 return -EBADMSG;
+        }
 
-        if (s < minimum_header_size(o))
+        if (s < minimum_header_size(o)) {
+                log_debug("Attempt to move to truncated object: %" PRIu64, offset);
                 return -EBADMSG;
+        }
 
-        if (type > OBJECT_UNUSED && o->object.type != type)
+        if (type > OBJECT_UNUSED && o->object.type != type) {
+                log_debug("Attempt to move to object of unexpected type: %" PRIu64, offset);
                 return -EBADMSG;
+        }
 
         if (s > sizeof(ObjectHeader)) {
                 r = journal_file_move_to(f, type, false, offset, s, &t);
@@ -1369,6 +1423,12 @@ static int journal_file_append_data(
         if (r < 0)
                 return r;
 
+#ifdef HAVE_GCRYPT
+        r = journal_file_hmac_put_object(f, OBJECT_DATA, o, p);
+        if (r < 0)
+                return r;
+#endif
+
         /* The linking might have altered the window, so let's
          * refresh our pointer */
         r = journal_file_move_to_object(f, OBJECT_DATA, p, &o);
@@ -1393,12 +1453,6 @@ static int journal_file_append_data(
                 fo->field.head_data_offset = le64toh(p);
         }
 
-#ifdef HAVE_GCRYPT
-        r = journal_file_hmac_put_object(f, OBJECT_DATA, o, p);
-        if (r < 0)
-                return r;
-#endif
-
         if (ret)
                 *ret = o;
 
@@ -1803,7 +1857,7 @@ int journal_file_append_entry(JournalFile *f, const dual_timestamp *ts, const st
          * it is very likely just an effect of a nullified replacement
          * mapping page */
 
-        if (mmap_cache_got_sigbus(f->mmap, f->fd))
+        if (mmap_cache_got_sigbus(f->mmap, f->cache_fd))
                 r = -EIO;
 
         if (f->post_change_timer)
@@ -2467,6 +2521,37 @@ int journal_file_compare_locations(JournalFile *af, JournalFile *bf) {
         return 0;
 }
 
+static int bump_array_index(uint64_t *i, direction_t direction, uint64_t n) {
+
+        /* Increase or decrease the specified index, in the right direction. */
+
+        if (direction == DIRECTION_DOWN) {
+                if (*i >= n - 1)
+                        return 0;
+
+                (*i) ++;
+        } else {
+                if (*i <= 0)
+                        return 0;
+
+                (*i) --;
+        }
+
+        return 1;
+}
+
+static bool check_properly_ordered(uint64_t new_offset, uint64_t old_offset, direction_t direction) {
+
+        /* Consider it an error if any of the two offsets is uninitialized */
+        if (old_offset == 0 || new_offset == 0)
+                return false;
+
+        /* If we go down, the new offset must be larger than the old one. */
+        return direction == DIRECTION_DOWN ?
+                new_offset > old_offset  :
+                new_offset < old_offset;
+}
+
 int journal_file_next_entry(
                 JournalFile *f,
                 uint64_t p,
@@ -2497,36 +2582,34 @@ int journal_file_next_entry(
                 if (r <= 0)
                         return r;
 
-                if (direction == DIRECTION_DOWN) {
-                        if (i >= n - 1)
-                                return 0;
-
-                        i++;
-                } else {
-                        if (i <= 0)
-                                return 0;
-
-                        i--;
-                }
+                r = bump_array_index(&i, direction, n);
+                if (r <= 0)
+                        return r;
         }
 
         /* And jump to it */
-        r = generic_array_get(f,
-                              le64toh(f->header->entry_array_offset),
-                              i,
-                              ret, &ofs);
-        if (r == -EBADMSG && direction == DIRECTION_DOWN) {
-                /* Special case: when we iterate throught the journal file linearly, and hit an entry we can't read,
-                 * consider this the end of the journal file. */
-                log_debug_errno(r, "Encountered entry we can't read while iterating through journal file. Considering this the end of the file.");
-                return 0;
+        for (;;) {
+                r = generic_array_get(f,
+                                      le64toh(f->header->entry_array_offset),
+                                      i,
+                                      ret, &ofs);
+                if (r > 0)
+                        break;
+                if (r != -EBADMSG)
+                        return r;
+
+                /* OK, so this entry is borked. Most likely some entry didn't get synced to disk properly, let's see if
+                 * the next one might work for us instead. */
+                log_debug_errno(r, "Entry item %" PRIu64 " is bad, skipping over it.", i);
+
+                r = bump_array_index(&i, direction, n);
+                if (r <= 0)
+                        return r;
         }
-        if (r <= 0)
-                return r;
 
-        if (p > 0 &&
-            (direction == DIRECTION_DOWN ? ofs <= p : ofs >= p)) {
-                log_debug("%s: entry array corrupted at entry %" PRIu64, f->path, i);
+        /* Ensure our array is properly ordered. */
+        if (p > 0 && !check_properly_ordered(ofs, p, direction)) {
+                log_debug("%s: entry array not properly ordered at entry %" PRIu64, f->path, i);
                 return -EBADMSG;
         }
 
@@ -2543,9 +2626,9 @@ int journal_file_next_entry_for_data(
                 direction_t direction,
                 Object **ret, uint64_t *offset) {
 
-        uint64_t n, i;
-        int r;
+        uint64_t i, n, ofs;
         Object *d;
+        int r;
 
         assert(f);
         assert(p > 0 || !o);
@@ -2577,25 +2660,39 @@ int journal_file_next_entry_for_data(
                 if (r <= 0)
                         return r;
 
-                if (direction == DIRECTION_DOWN) {
-                        if (i >= n - 1)
-                                return 0;
+                r = bump_array_index(&i, direction, n);
+                if (r <= 0)
+                        return r;
+        }
 
-                        i++;
-                } else {
-                        if (i <= 0)
-                                return 0;
+        for (;;) {
+                r = generic_array_get_plus_one(f,
+                                               le64toh(d->data.entry_offset),
+                                               le64toh(d->data.entry_array_offset),
+                                               i,
+                                               ret, &ofs);
+                if (r > 0)
+                        break;
+                if (r != -EBADMSG)
+                        return r;
 
-                        i--;
-                }
+                log_debug_errno(r, "Data entry item %" PRIu64 " is bad, skipping over it.", i);
+
+                r = bump_array_index(&i, direction, n);
+                if (r <= 0)
+                        return r;
+        }
 
+        /* Ensure our array is properly ordered. */
+        if (p > 0 && check_properly_ordered(ofs, p, direction)) {
+                log_debug("%s data entry array not properly ordered at entry %" PRIu64, f->path, i);
+                return -EBADMSG;
         }
 
-        return generic_array_get_plus_one(f,
-                                          le64toh(d->data.entry_offset),
-                                          le64toh(d->data.entry_array_offset),
-                                          i,
-                                          ret, offset);
+        if (offset)
+                *offset = ofs;
+
+        return 1;
 }
 
 int journal_file_move_to_entry_by_offset_for_data(
@@ -3016,13 +3113,18 @@ int journal_file_open(
                 }
         }
 
-        if (fname)
+        if (fname) {
                 f->path = strdup(fname);
-        else /* If we don't know the path, fill in something explanatory and vaguely useful */
-                asprintf(&f->path, "/proc/self/%i", fd);
-        if (!f->path) {
-                r = -ENOMEM;
-                goto fail;
+                if (!f->path) {
+                        r = -ENOMEM;
+                        goto fail;
+                }
+        } else {
+                /* If we don't know the path, fill in something explanatory and vaguely useful */
+                if (asprintf(&f->path, "/proc/self/%i", fd) < 0) {
+                        r = -ENOMEM;
+                        goto fail;
+                }
         }
 
         f->chain_cache = ordered_hashmap_new(&uint64_hash_ops);
@@ -3042,6 +3144,12 @@ int journal_file_open(
                 f->close_fd = true;
         }
 
+        f->cache_fd = mmap_cache_add_fd(f->mmap, f->fd);
+        if (!f->cache_fd) {
+                r = -ENOMEM;
+                goto fail;
+        }
+
         r = journal_file_fstat(f);
         if (r < 0)
                 goto fail;
@@ -3088,7 +3196,7 @@ int journal_file_open(
                 goto fail;
         }
 
-        r = mmap_cache_get(f->mmap, f->fd, f->prot, CONTEXT_HEADER, true, 0, PAGE_ALIGN(sizeof(Header)), &f->last_stat, &h);
+        r = mmap_cache_get(f->mmap, f->cache_fd, f->prot, CONTEXT_HEADER, true, 0, PAGE_ALIGN(sizeof(Header)), &f->last_stat, &h);
         if (r < 0)
                 goto fail;
 
@@ -3145,7 +3253,7 @@ int journal_file_open(
 #endif
         }
 
-        if (mmap_cache_got_sigbus(f->mmap, f->fd)) {
+        if (mmap_cache_got_sigbus(f->mmap, f->cache_fd)) {
                 r = -EIO;
                 goto fail;
         }
@@ -3167,7 +3275,7 @@ int journal_file_open(
         return 0;
 
 fail:
-        if (f->fd >= 0 && mmap_cache_got_sigbus(f->mmap, f->fd))
+        if (f->cache_fd && mmap_cache_got_sigbus(f->mmap, f->cache_fd))
                 r = -EIO;
 
         (void) journal_file_close(f);
@@ -3190,7 +3298,7 @@ int journal_file_rotate(JournalFile **f, bool compress, bool seal, Set *deferred
                 return -EINVAL;
 
         /* Is this a journal file that was passed to us as fd? If so, we synthesized a path name for it, and we refuse
-         * rotation, since we don't know the actual path, and couldn't rename the file hence.*/
+         * rotation, since we don't know the actual path, and couldn't rename the file hence. */
         if (path_startswith(old_file->path, "/proc/self/fd"))
                 return -EINVAL;
 
@@ -3259,14 +3367,15 @@ int journal_file_open_reliably(
 
         r = journal_file_open(-1, fname, flags, mode, compress, seal, metrics, mmap_cache, deferred_closes, template, ret);
         if (!IN_SET(r,
-                    -EBADMSG,           /* corrupted */
-                    -ENODATA,           /* truncated */
-                    -EHOSTDOWN,         /* other machine */
-                    -EPROTONOSUPPORT,   /* incompatible feature */
-                    -EBUSY,             /* unclean shutdown */
-                    -ESHUTDOWN,         /* already archived */
+                    -EBADMSG,           /* Corrupted */
+                    -ENODATA,           /* Truncated */
+                    -EHOSTDOWN,         /* Other machine */
+                    -EPROTONOSUPPORT,   /* Incompatible feature */
+                    -EBUSY,             /* Unclean shutdown */
+                    -ESHUTDOWN,         /* Already archived */
                     -EIO,               /* IO error, including SIGBUS on mmap */
-                    -EIDRM              /* File has been deleted */))
+                    -EIDRM,             /* File has been deleted */
+                    -ETXTBSY))          /* File is from the future */
                 return r;
 
         if ((flags & O_ACCMODE) == O_RDONLY)
@@ -3379,7 +3488,7 @@ int journal_file_copy_entry(JournalFile *from, JournalFile *to, Object *o, uint6
 
         r = journal_file_append_entry_internal(to, &ts, xor_hash, items, n, seqnum, ret, offset);
 
-        if (mmap_cache_got_sigbus(to->mmap, to->fd))
+        if (mmap_cache_got_sigbus(to->mmap, to->cache_fd))
                 return -EIO;
 
         return r;
index 564e1a8..df457c9 100644 (file)
@@ -75,6 +75,7 @@ typedef enum OfflineState {
 
 typedef struct JournalFile {
         int fd;
+        MMapFileDescriptor *cache_fd;
 
         mode_t mode;
 
index e38730d..5ee1049 100644 (file)
@@ -17,7 +17,6 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <assert.h>
 #include <errno.h>
 #include <qrencode.h>
 #include <stdbool.h>
@@ -25,6 +24,7 @@
 #include <stdlib.h>
 
 #include "journal-qrcode.h"
+#include "macro.h"
 
 #define WHITE_ON_BLACK "\033[40;37;1m"
 #define NORMAL "\033[0m"
index f09dc66..12ce2fd 100644 (file)
@@ -343,7 +343,7 @@ finish:
                 free(list[i].filename);
         free(list);
 
-        log_full(verbose ? LOG_INFO : LOG_DEBUG, "Vacuuming done, freed %s of archived journals on disk.", format_bytes(sbytes, sizeof(sbytes), freed));
+        log_full(verbose ? LOG_INFO : LOG_DEBUG, "Vacuuming done, freed %s of archived journals from %s.", format_bytes(sbytes, sizeof(sbytes), freed), directory);
 
         return r;
 }
index f61f158..9feb5b5 100644 (file)
@@ -118,6 +118,11 @@ static void flush_progress(void) {
                 log_error(OFSfmt": " _fmt, (uint64_t)_offset, ##__VA_ARGS__); \
         } while (0)
 
+#define error_errno(_offset, error, _fmt, ...) do {               \
+                flush_progress();                                       \
+                log_error_errno(error, OFSfmt": " _fmt, (uint64_t)_offset, ##__VA_ARGS__); \
+        } while (0)
+
 static int journal_file_object_verify(JournalFile *f, uint64_t offset, Object *o) {
         uint64_t i;
 
@@ -168,8 +173,8 @@ static int journal_file_object_verify(JournalFile *f, uint64_t offset, Object *o
                                             le64toh(o->object.size) - offsetof(Object, data.payload),
                                             &b, &alloc, &b_size, 0);
                         if (r < 0) {
-                                error(offset, "%s decompression failed: %s",
-                                      object_compressed_to_string(compression), strerror(-r));
+                                error_errno(offset, r, "%s decompression failed: %m",
+                                            object_compressed_to_string(compression));
                                 return r;
                         }
 
@@ -372,12 +377,12 @@ static int write_uint64(int fd, uint64_t p) {
         return 0;
 }
 
-static int contains_uint64(MMapCache *m, int fd, uint64_t n, uint64_t p) {
+static int contains_uint64(MMapCache *m, MMapFileDescriptor *f, uint64_t n, uint64_t p) {
         uint64_t a, b;
         int r;
 
         assert(m);
-        assert(fd >= 0);
+        assert(f);
 
         /* Bisection ... */
 
@@ -387,7 +392,7 @@ static int contains_uint64(MMapCache *m, int fd, uint64_t n, uint64_t p) {
 
                 c = (a + b) / 2;
 
-                r = mmap_cache_get(m, fd, PROT_READ|PROT_WRITE, 0, false, c * sizeof(uint64_t), sizeof(uint64_t), NULL, (void **) &z);
+                r = mmap_cache_get(m, f, PROT_READ|PROT_WRITE, 0, false, c * sizeof(uint64_t), sizeof(uint64_t), NULL, (void **) &z);
                 if (r < 0)
                         return r;
 
@@ -408,7 +413,7 @@ static int contains_uint64(MMapCache *m, int fd, uint64_t n, uint64_t p) {
 
 static int entry_points_to_data(
                 JournalFile *f,
-                int entry_fd,
+                MMapFileDescriptor *cache_entry_fd,
                 uint64_t n_entries,
                 uint64_t entry_p,
                 uint64_t data_p) {
@@ -419,9 +424,9 @@ static int entry_points_to_data(
         bool found = false;
 
         assert(f);
-        assert(entry_fd >= 0);
+        assert(cache_entry_fd);
 
-        if (!contains_uint64(f->mmap, entry_fd, n_entries, entry_p)) {
+        if (!contains_uint64(f->mmap, cache_entry_fd, n_entries, entry_p)) {
                 error(data_p, "Data object references invalid entry at "OFSfmt, entry_p);
                 return -EBADMSG;
         }
@@ -495,16 +500,16 @@ static int entry_points_to_data(
 static int verify_data(
                 JournalFile *f,
                 Object *o, uint64_t p,
-                int entry_fd, uint64_t n_entries,
-                int entry_array_fd, uint64_t n_entry_arrays) {
+                MMapFileDescriptor *cache_entry_fd, uint64_t n_entries,
+                MMapFileDescriptor *cache_entry_array_fd, uint64_t n_entry_arrays) {
 
         uint64_t i, n, a, last, q;
         int r;
 
         assert(f);
         assert(o);
-        assert(entry_fd >= 0);
-        assert(entry_array_fd >= 0);
+        assert(cache_entry_fd);
+        assert(cache_entry_array_fd);
 
         n = le64toh(o->data.n_entries);
         a = le64toh(o->data.entry_array_offset);
@@ -522,7 +527,7 @@ static int verify_data(
         assert(o->data.entry_offset);
 
         last = q = le64toh(o->data.entry_offset);
-        r = entry_points_to_data(f, entry_fd, n_entries, q, p);
+        r = entry_points_to_data(f, cache_entry_fd, n_entries, q, p);
         if (r < 0)
                 return r;
 
@@ -535,7 +540,7 @@ static int verify_data(
                         return -EBADMSG;
                 }
 
-                if (!contains_uint64(f->mmap, entry_array_fd, n_entry_arrays, a)) {
+                if (!contains_uint64(f->mmap, cache_entry_array_fd, n_entry_arrays, a)) {
                         error(p, "Invalid array offset "OFSfmt, a);
                         return -EBADMSG;
                 }
@@ -560,7 +565,7 @@ static int verify_data(
                         }
                         last = q;
 
-                        r = entry_points_to_data(f, entry_fd, n_entries, q, p);
+                        r = entry_points_to_data(f, cache_entry_fd, n_entries, q, p);
                         if (r < 0)
                                 return r;
 
@@ -578,9 +583,9 @@ static int verify_data(
 
 static int verify_hash_table(
                 JournalFile *f,
-                int data_fd, uint64_t n_data,
-                int entry_fd, uint64_t n_entries,
-                int entry_array_fd, uint64_t n_entry_arrays,
+                MMapFileDescriptor *cache_data_fd, uint64_t n_data,
+                MMapFileDescriptor *cache_entry_fd, uint64_t n_entries,
+                MMapFileDescriptor *cache_entry_array_fd, uint64_t n_entry_arrays,
                 usec_t *last_usec,
                 bool show_progress) {
 
@@ -588,9 +593,9 @@ static int verify_hash_table(
         int r;
 
         assert(f);
-        assert(data_fd >= 0);
-        assert(entry_fd >= 0);
-        assert(entry_array_fd >= 0);
+        assert(cache_data_fd);
+        assert(cache_entry_fd);
+        assert(cache_entry_array_fd);
         assert(last_usec);
 
         n = le64toh(f->header->data_hash_table_size) / sizeof(HashItem);
@@ -612,7 +617,7 @@ static int verify_hash_table(
                         Object *o;
                         uint64_t next;
 
-                        if (!contains_uint64(f->mmap, data_fd, n_data, p)) {
+                        if (!contains_uint64(f->mmap, cache_data_fd, n_data, p)) {
                                 error(p, "Invalid data object at hash entry %"PRIu64" of %"PRIu64, i, n);
                                 return -EBADMSG;
                         }
@@ -632,7 +637,7 @@ static int verify_hash_table(
                                 return -EBADMSG;
                         }
 
-                        r = verify_data(f, o, p, entry_fd, n_entries, entry_array_fd, n_entry_arrays);
+                        r = verify_data(f, o, p, cache_entry_fd, n_entries, cache_entry_array_fd, n_entry_arrays);
                         if (r < 0)
                                 return r;
 
@@ -684,14 +689,14 @@ static int data_object_in_hash_table(JournalFile *f, uint64_t hash, uint64_t p)
 static int verify_entry(
                 JournalFile *f,
                 Object *o, uint64_t p,
-                int data_fd, uint64_t n_data) {
+                MMapFileDescriptor *cache_data_fd, uint64_t n_data) {
 
         uint64_t i, n;
         int r;
 
         assert(f);
         assert(o);
-        assert(data_fd >= 0);
+        assert(cache_data_fd);
 
         n = journal_file_entry_n_items(o);
         for (i = 0; i < n; i++) {
@@ -701,7 +706,7 @@ static int verify_entry(
                 q = le64toh(o->entry.items[i].object_offset);
                 h = le64toh(o->entry.items[i].hash);
 
-                if (!contains_uint64(f->mmap, data_fd, n_data, q)) {
+                if (!contains_uint64(f->mmap, cache_data_fd, n_data, q)) {
                         error(p, "Invalid data object of entry");
                         return -EBADMSG;
                 }
@@ -729,9 +734,9 @@ static int verify_entry(
 
 static int verify_entry_array(
                 JournalFile *f,
-                int data_fd, uint64_t n_data,
-                int entry_fd, uint64_t n_entries,
-                int entry_array_fd, uint64_t n_entry_arrays,
+                MMapFileDescriptor *cache_data_fd, uint64_t n_data,
+                MMapFileDescriptor *cache_entry_fd, uint64_t n_entries,
+                MMapFileDescriptor *cache_entry_array_fd, uint64_t n_entry_arrays,
                 usec_t *last_usec,
                 bool show_progress) {
 
@@ -739,9 +744,9 @@ static int verify_entry_array(
         int r;
 
         assert(f);
-        assert(data_fd >= 0);
-        assert(entry_fd >= 0);
-        assert(entry_array_fd >= 0);
+        assert(cache_data_fd);
+        assert(cache_entry_fd);
+        assert(cache_entry_array_fd);
         assert(last_usec);
 
         n = le64toh(f->header->n_entries);
@@ -758,7 +763,7 @@ static int verify_entry_array(
                         return -EBADMSG;
                 }
 
-                if (!contains_uint64(f->mmap, entry_array_fd, n_entry_arrays, a)) {
+                if (!contains_uint64(f->mmap, cache_entry_array_fd, n_entry_arrays, a)) {
                         error(a, "Invalid array %"PRIu64" of %"PRIu64, i, n);
                         return -EBADMSG;
                 }
@@ -784,7 +789,7 @@ static int verify_entry_array(
                         }
                         last = p;
 
-                        if (!contains_uint64(f->mmap, entry_fd, n_entries, p)) {
+                        if (!contains_uint64(f->mmap, cache_entry_fd, n_entries, p)) {
                                 error(a, "Invalid array entry at %"PRIu64" of %"PRIu64, i, n);
                                 return -EBADMSG;
                         }
@@ -793,7 +798,7 @@ static int verify_entry_array(
                         if (r < 0)
                                 return r;
 
-                        r = verify_entry(f, o, p, data_fd, n_data);
+                        r = verify_entry(f, o, p, cache_data_fd, n_data);
                         if (r < 0)
                                 return r;
 
@@ -824,9 +829,10 @@ int journal_file_verify(
         uint64_t n_weird = 0, n_objects = 0, n_entries = 0, n_data = 0, n_fields = 0, n_data_hash_tables = 0, n_field_hash_tables = 0, n_entry_arrays = 0, n_tags = 0;
         usec_t last_usec = 0;
         int data_fd = -1, entry_fd = -1, entry_array_fd = -1;
+        MMapFileDescriptor *cache_data_fd = NULL, *cache_entry_fd = NULL, *cache_entry_array_fd = NULL;
         unsigned i;
         bool found_last = false;
-        _cleanup_free_ char *tmp_dir = NULL;
+        const char *tmp_dir = NULL;
 
 #ifdef HAVE_GCRYPT
         uint64_t last_tag = 0;
@@ -846,7 +852,7 @@ int journal_file_verify(
         } else if (f->seal)
                 return -ENOKEY;
 
-        r = var_tmp(&tmp_dir);
+        r = var_tmp_dir(&tmp_dir);
         if (r < 0) {
                 log_error_errno(r, "Failed to determine temporary directory: %m");
                 goto fail;
@@ -871,6 +877,24 @@ int journal_file_verify(
                 goto fail;
         }
 
+        cache_data_fd = mmap_cache_add_fd(f->mmap, data_fd);
+        if (!cache_data_fd) {
+                r = log_oom();
+                goto fail;
+        }
+
+        cache_entry_fd = mmap_cache_add_fd(f->mmap, entry_fd);
+        if (!cache_entry_fd) {
+                r = log_oom();
+                goto fail;
+        }
+
+        cache_entry_array_fd = mmap_cache_add_fd(f->mmap, entry_array_fd);
+        if (!cache_entry_array_fd) {
+                r = log_oom();
+                goto fail;
+        }
+
         if (le32toh(f->header->compatible_flags) & ~HEADER_COMPATIBLE_SUPPORTED) {
                 log_error("Cannot verify file with unknown extensions.");
                 r = -EOPNOTSUPP;
@@ -912,7 +936,7 @@ int journal_file_verify(
 
                 r = journal_file_object_verify(f, p, o);
                 if (r < 0) {
-                        error(p, "Invalid object contents: %s", strerror(-r));
+                        error_errno(p, r, "Invalid object contents: %m");
                         goto fail;
                 }
 
@@ -1242,18 +1266,18 @@ int journal_file_verify(
          * referenced is consistent. */
 
         r = verify_entry_array(f,
-                               data_fd, n_data,
-                               entry_fd, n_entries,
-                               entry_array_fd, n_entry_arrays,
+                               cache_data_fd, n_data,
+                               cache_entry_fd, n_entries,
+                               cache_entry_array_fd, n_entry_arrays,
                                &last_usec,
                                show_progress);
         if (r < 0)
                 goto fail;
 
         r = verify_hash_table(f,
-                              data_fd, n_data,
-                              entry_fd, n_entries,
-                              entry_array_fd, n_entry_arrays,
+                              cache_data_fd, n_data,
+                              cache_entry_fd, n_entries,
+                              cache_entry_array_fd, n_entry_arrays,
                               &last_usec,
                               show_progress);
         if (r < 0)
@@ -1262,9 +1286,9 @@ int journal_file_verify(
         if (show_progress)
                 flush_progress();
 
-        mmap_cache_close_fd(f->mmap, data_fd);
-        mmap_cache_close_fd(f->mmap, entry_fd);
-        mmap_cache_close_fd(f->mmap, entry_array_fd);
+        mmap_cache_free_fd(f->mmap, cache_data_fd);
+        mmap_cache_free_fd(f->mmap, cache_entry_fd);
+        mmap_cache_free_fd(f->mmap, cache_entry_array_fd);
 
         safe_close(data_fd);
         safe_close(entry_fd);
@@ -1289,20 +1313,23 @@ fail:
                   (unsigned long long) f->last_stat.st_size,
                   100 * p / f->last_stat.st_size);
 
-        if (data_fd >= 0) {
-                mmap_cache_close_fd(f->mmap, data_fd);
+        if (data_fd >= 0)
                 safe_close(data_fd);
-        }
 
-        if (entry_fd >= 0) {
-                mmap_cache_close_fd(f->mmap, entry_fd);
+        if (entry_fd >= 0)
                 safe_close(entry_fd);
-        }
 
-        if (entry_array_fd >= 0) {
-                mmap_cache_close_fd(f->mmap, entry_array_fd);
+        if (entry_array_fd >= 0)
                 safe_close(entry_array_fd);
-        }
+
+        if (cache_data_fd)
+                mmap_cache_free_fd(f->mmap, cache_data_fd);
+
+        if (cache_entry_fd)
+                mmap_cache_free_fd(f->mmap, cache_entry_fd);
+
+        if (cache_entry_array_fd)
+                mmap_cache_free_fd(f->mmap, cache_entry_array_fd);
 
         return r;
 }
index 53c6180..2313c8c 100644 (file)
@@ -52,6 +52,7 @@
 #include "journal-def.h"
 #include "journal-internal.h"
 #include "journal-qrcode.h"
+#include "journal-util.h"
 #include "journal-vacuum.h"
 #include "journal-verify.h"
 #include "locale-util.h"
@@ -103,7 +104,7 @@ static const char *arg_directory = NULL;
 static char **arg_file = NULL;
 static bool arg_file_stdin = false;
 static int arg_priorities = 0xFF;
-static const char *arg_verify_key = NULL;
+static char *arg_verify_key = NULL;
 #ifdef HAVE_GCRYPT
 static usec_t arg_interval = DEFAULT_FSS_INTERVAL_USEC;
 static bool arg_force = false;
@@ -192,7 +193,7 @@ static int add_matches_for_device(sd_journal *j, const char *devpath) {
                         continue;
                 }
 
-                match = strjoin("_KERNEL_DEVICE=+", subsys, ":", sysname, NULL);
+                match = strjoin("_KERNEL_DEVICE=+", subsys, ":", sysname);
                 if (!match)
                         return log_oom();
 
@@ -297,9 +298,10 @@ static void help(void) {
                "  -n --lines[=INTEGER]     Number of journal entries to show\n"
                "     --no-tail             Show all lines, even in follow mode\n"
                "  -r --reverse             Show the newest entries first\n"
-               "  -o --output=STRING       Change journal output mode (short, short-iso,\n"
-               "                                   short-precise, short-monotonic, verbose,\n"
-               "                                   export, json, json-pretty, json-sse, cat)\n"
+               "  -o --output=STRING       Change journal output mode (short, short-precise,\n"
+               "                             short-iso, short-iso-precise, short-full,\n"
+               "                             short-monotonic, short-unix, verbose, export,\n"
+               "                             json, json-pretty, json-sse, cat)\n"
                "     --utc                 Express time in Coordinated Universal Time (UTC)\n"
                "  -x --catalog             Add message explanations where available\n"
                "     --no-full             Ellipsize fields\n"
@@ -310,7 +312,7 @@ static void help(void) {
                "  -m --merge               Show entries from all available journals\n"
                "  -D --directory=PATH      Show journal files from directory\n"
                "     --file=PATH           Show journal file\n"
-               "     --root=ROOT           Operate on catalog files below a root directory\n"
+               "     --root=ROOT           Operate on files below a root directory\n"
 #ifdef HAVE_GCRYPT
                "     --interval=TIME       Time interval for changing the FSS sealing key\n"
                "     --verify-key=KEY      Specify FSS verification key\n"
@@ -683,7 +685,13 @@ static int parse_argv(int argc, char *argv[]) {
 
                 case ARG_VERIFY_KEY:
                         arg_action = ACTION_VERIFY;
-                        arg_verify_key = optarg;
+                        r = free_and_strdup(&arg_verify_key, optarg);
+                        if (r < 0)
+                                return r;
+                        /* Use memset not string_erase so this doesn't look confusing
+                         * in ps or htop output. */
+                        memset(optarg, 'x', strlen(optarg));
+
                         arg_merge = false;
                         break;
 
@@ -848,8 +856,8 @@ static int parse_argv(int argc, char *argv[]) {
         if (arg_follow && !arg_no_tail && !arg_since && arg_lines == ARG_LINES_DEFAULT)
                 arg_lines = 10;
 
-        if (!!arg_directory + !!arg_file + !!arg_machine > 1) {
-                log_error("Please specify either -D/--directory= or --file= or -M/--machine=, not more than one.");
+        if (!!arg_directory + !!arg_file + !!arg_machine + !!arg_root > 1) {
+                log_error("Please specify at most one of -D/--directory=, --file=, -M/--machine=, --root.");
                 return -EINVAL;
         }
 
@@ -885,7 +893,7 @@ static int parse_argv(int argc, char *argv[]) {
                  * to users, and automatically turn --unit= into --user-unit= if combined with --user. */
                 r = strv_extend_strv(&arg_user_units, arg_system_units, true);
                 if (r < 0)
-                        return -ENOMEM;
+                        return r;
 
                 arg_system_units = strv_free(arg_system_units);
         }
@@ -906,7 +914,7 @@ static int generate_new_id128(void) {
                SD_ID128_FORMAT_STR "\n\n"
                "As UUID:\n"
                "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n\n"
-               "As macro:\n"
+               "As man:sd-id128(3) macro:\n"
                "#define MESSAGE_XYZ SD_ID128_MAKE(",
                SD_ID128_FORMAT_VAL(id),
                SD_ID128_FORMAT_VAL(id));
@@ -938,21 +946,21 @@ static int add_matches(sd_journal *j, char **args) {
                         have_term = false;
 
                 } else if (path_is_absolute(*i)) {
-                        _cleanup_free_ char *p, *t = NULL, *t2 = NULL, *interpreter = NULL;
-                        const char *path;
+                        _cleanup_free_ char *p = NULL, *t = NULL, *t2 = NULL, *interpreter = NULL;
                         struct stat st;
 
-                        p = canonicalize_file_name(*i);
-                        path = p ?: *i;
+                        r = chase_symlinks(*i, NULL, 0, &p);
+                        if (r < 0)
+                                return log_error_errno(r, "Couldn't canonicalize path: %m");
 
-                        if (lstat(path, &st) < 0)
+                        if (lstat(p, &st) < 0)
                                 return log_error_errno(errno, "Couldn't stat file: %m");
 
                         if (S_ISREG(st.st_mode) && (0111 & st.st_mode)) {
-                                if (executable_is_script(path, &interpreter) > 0) {
+                                if (executable_is_script(p, &interpreter) > 0) {
                                         _cleanup_free_ char *comm;
 
-                                        comm = strndup(basename(path), 15);
+                                        comm = strndup(basename(p), 15);
                                         if (!comm)
                                                 return log_oom();
 
@@ -968,7 +976,7 @@ static int add_matches(sd_journal *j, char **args) {
                                                         return log_oom();
                                         }
                                 } else {
-                                        t = strappend("_EXE=", path);
+                                        t = strappend("_EXE=", p);
                                         if (!t)
                                                 return log_oom();
                                 }
@@ -979,7 +987,7 @@ static int add_matches(sd_journal *j, char **args) {
                                         r = sd_journal_add_match(j, t2, 0);
 
                         } else if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
-                                r = add_matches_for_device(j, path);
+                                r = add_matches_for_device(j, p);
                                 if (r < 0)
                                         return r;
                         } else {
@@ -1091,8 +1099,10 @@ static int discover_next_boot(sd_journal *j,
                 r = sd_journal_previous(j);
         if (r < 0)
                 return r;
-        else if (r == 0)
+        else if (r == 0) {
+                log_debug("Whoopsie! We found a boot ID but can't read its last entry.");
                 return -ENODATA; /* This shouldn't happen. We just came from this very boot ID. */
+        }
 
         r = sd_journal_get_realtime_usec(j, &next_boot->last);
         if (r < 0)
@@ -1112,7 +1122,7 @@ static int get_boots(
 
         bool skip_once;
         int r, count = 0;
-        BootId *head = NULL, *tail = NULL;
+        BootId *head = NULL, *tail = NULL, *id;
         const bool advance_older = boot_id && offset <= 0;
         sd_id128_t previous_boot_id;
 
@@ -1203,6 +1213,13 @@ static int get_boots(
                                 break;
                         }
                 } else {
+                        LIST_FOREACH(boot_list, id, head) {
+                                if (sd_id128_equal(id->id, current->id)) {
+                                        /* boot id already stored, something wrong with the journal files */
+                                        /* exiting as otherwise this problem would cause forever loop */
+                                        goto finish;
+                                }
+                        }
                         LIST_INSERT_AFTER(boot_list, head, tail, current);
                         tail = current;
                         current = NULL;
@@ -1267,7 +1284,7 @@ static int add_boot(sd_journal *j) {
          * We can do this only when we logs are coming from the current machine,
          * so take the slow path if log location is specified. */
         if (arg_boot_offset == 0 && sd_id128_is_null(arg_boot_id) &&
-            !arg_directory && !arg_file)
+            !arg_directory && !arg_file && !arg_root)
 
                 return add_match_this_boot(j, arg_machine);
 
@@ -1632,7 +1649,7 @@ static int setup_keys(void) {
         n /= arg_interval;
 
         safe_close(fd);
-        fd = mkostemp_safe(k, O_WRONLY|O_CLOEXEC);
+        fd = mkostemp_safe(k);
         if (fd < 0) {
                 r = log_error_errno(fd, "Failed to open %s: %m", k);
                 goto finish;
@@ -1684,9 +1701,9 @@ static int setup_keys(void) {
                         "at a safe location and should not be saved locally on disk.\n"
                         "\n\t%s",
                         ansi_highlight(), ansi_normal(),
+                        p,
                         ansi_highlight(), ansi_normal(),
-                        ansi_highlight_red(),
-                        p);
+                        ansi_highlight_red());
                 fflush(stderr);
         }
         for (i = 0; i < seed_size; i++) {
@@ -1790,129 +1807,6 @@ static int verify(sd_journal *j) {
         return r;
 }
 
-static int access_check_var_log_journal(sd_journal *j) {
-#ifdef HAVE_ACL
-        _cleanup_strv_free_ char **g = NULL;
-        const char* dir;
-#endif
-        int r;
-
-        assert(j);
-
-        if (arg_quiet)
-                return 0;
-
-        /* If we are root, we should have access, don't warn. */
-        if (getuid() == 0)
-                return 0;
-
-        /* If we are in the 'systemd-journal' group, we should have
-         * access too. */
-        r = in_group("systemd-journal");
-        if (r < 0)
-                return log_error_errno(r, "Failed to check if we are in the 'systemd-journal' group: %m");
-        if (r > 0)
-                return 0;
-
-#ifdef HAVE_ACL
-        if (laccess("/run/log/journal", F_OK) >= 0)
-                dir = "/run/log/journal";
-        else
-                dir = "/var/log/journal";
-
-        /* If we are in any of the groups listed in the journal ACLs,
-         * then all is good, too. Let's enumerate all groups from the
-         * default ACL of the directory, which generally should allow
-         * access to most journal files too. */
-        r = acl_search_groups(dir, &g);
-        if (r < 0)
-                return log_error_errno(r, "Failed to search journal ACL: %m");
-        if (r > 0)
-                return 0;
-
-        /* Print a pretty list, if there were ACLs set. */
-        if (!strv_isempty(g)) {
-                _cleanup_free_ char *s = NULL;
-
-                /* Thre are groups in the ACL, let's list them */
-                r = strv_extend(&g, "systemd-journal");
-                if (r < 0)
-                        return log_oom();
-
-                strv_sort(g);
-                strv_uniq(g);
-
-                s = strv_join(g, "', '");
-                if (!s)
-                        return log_oom();
-
-                log_notice("Hint: You are currently not seeing messages from other users and the system.\n"
-                           "      Users in groups '%s' can see all messages.\n"
-                           "      Pass -q to turn off this notice.", s);
-                return 1;
-        }
-#endif
-
-        /* If no ACLs were found, print a short version of the message. */
-        log_notice("Hint: You are currently not seeing messages from other users and the system.\n"
-                   "      Users in the 'systemd-journal' group can see all messages. Pass -q to\n"
-                   "      turn off this notice.");
-
-        return 1;
-}
-
-static int access_check(sd_journal *j) {
-        Iterator it;
-        void *code;
-        char *path;
-        int r = 0;
-
-        assert(j);
-
-        if (hashmap_isempty(j->errors)) {
-                if (ordered_hashmap_isempty(j->files))
-                        log_notice("No journal files were found.");
-
-                return 0;
-        }
-
-        if (hashmap_contains(j->errors, INT_TO_PTR(-EACCES))) {
-                (void) access_check_var_log_journal(j);
-
-                if (ordered_hashmap_isempty(j->files))
-                        r = log_error_errno(EACCES, "No journal files were opened due to insufficient permissions.");
-        }
-
-        HASHMAP_FOREACH_KEY(path, code, j->errors, it) {
-                int err;
-
-                err = abs(PTR_TO_INT(code));
-
-                switch (err) {
-                case EACCES:
-                        continue;
-
-                case ENODATA:
-                        log_warning_errno(err, "Journal file %s is truncated, ignoring file.", path);
-                        break;
-
-                case EPROTONOSUPPORT:
-                        log_warning_errno(err, "Journal file %s uses an unsupported feature, ignoring file.", path);
-                        break;
-
-                case EBADMSG:
-                        log_warning_errno(err, "Journal file %s corrupted, ignoring file.", path);
-                        break;
-
-                default:
-                        log_warning_errno(err, "An error was encountered while opening journal file or directory %s, ignoring file: %m", path);
-                        break;
-                }
-        }
-
-        return r;
-}
-
 static int flush_to_var(void) {
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
@@ -2161,6 +2055,8 @@ int main(int argc, char *argv[]) {
 
         if (arg_directory)
                 r = sd_journal_open_directory(&j, arg_directory, arg_journal_type);
+        else if (arg_root)
+                r = sd_journal_open_directory(&j, arg_root, arg_journal_type | SD_JOURNAL_OS_ROOT);
         else if (arg_file_stdin) {
                 int ifd = STDIN_FILENO;
                 r = sd_journal_open_files_fd(&j, &ifd, 1, 0);
@@ -2222,7 +2118,7 @@ int main(int argc, char *argv[]) {
                 goto finish;
         }
 
-        r = access_check(j);
+        r = journal_access_check_and_warn(j, arg_quiet);
         if (r < 0)
                 goto finish;
 
@@ -2255,7 +2151,7 @@ int main(int argc, char *argv[]) {
                 if (r < 0)
                         goto finish;
 
-                printf("Archived and active journals take up %s on disk.\n",
+                printf("Archived and active journals take up %s in the file system.\n",
                        format_bytes(sbytes, sizeof(sbytes), bytes));
                 goto finish;
         }
@@ -2307,7 +2203,7 @@ int main(int argc, char *argv[]) {
         if (arg_boot_offset != 0 &&
             sd_journal_has_runtime_files(j) > 0 &&
             sd_journal_has_persistent_files(j) == 0) {
-                log_info("Specifying boot ID has no effect, no persistent journal was found");
+                log_info("Specifying boot ID or boot offset has no effect, no persistent journal was found.");
                 r = 0;
                 goto finish;
         }
@@ -2469,20 +2365,13 @@ int main(int argc, char *argv[]) {
                 log_error_errno(r, "Failed to iterate through journal: %m");
                 goto finish;
         }
-        if (r == 0) {
-                if (arg_follow)
-                        need_seek = true;
-                else {
-                        if (!arg_quiet)
-                                printf("-- No entries --\n");
-                        goto finish;
-                }
-        }
+        if (r == 0)
+                need_seek = true;
 
         if (!arg_follow)
                 pager_open(arg_no_pager, arg_pager_end);
 
-        if (!arg_quiet) {
+        if (!arg_quiet && (arg_lines != 0 || arg_follow)) {
                 usec_t start, end;
                 char start_buf[FORMAT_TIMESTAMP_MAX], end_buf[FORMAT_TIMESTAMP_MAX];
 
@@ -2578,6 +2467,9 @@ int main(int argc, char *argv[]) {
                 }
 
                 if (!arg_follow) {
+                        if (n_shown == 0 && !arg_quiet)
+                                printf("-- No entries --\n");
+
                         if (arg_show_cursor) {
                                 _cleanup_free_ char *cursor = NULL;
 
@@ -2591,6 +2483,7 @@ int main(int argc, char *argv[]) {
                         break;
                 }
 
+                fflush(stdout);
                 r = sd_journal_wait(j, (uint64_t) -1);
                 if (r < 0) {
                         log_error_errno(r, "Couldn't wait for journal event: %m");
@@ -2601,6 +2494,7 @@ int main(int argc, char *argv[]) {
         }
 
 finish:
+        fflush(stdout);
         pager_close();
 
         strv_free(arg_file);
@@ -2610,6 +2504,7 @@ finish:
         strv_free(arg_user_units);
 
         free(arg_root);
+        free(arg_verify_key);
 
         return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }
index fcc9f25..5fbcdb4 100644 (file)
@@ -24,7 +24,7 @@
 #include "alloc-util.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "io-util.h"
 #include "journald-console.h"
 #include "journald-server.h"
@@ -72,9 +72,9 @@ void server_forward_console(
         /* First: timestamp */
         if (prefix_timestamp()) {
                 assert_se(clock_gettime(CLOCK_MONOTONIC, &ts) == 0);
-                xsprintf(tbuf, "[%5"PRI_TIME".%06ld] ",
+                xsprintf(tbuf, "[%5"PRI_TIME".%06"PRI_NSEC"] ",
                          ts.tv_sec,
-                         ts.tv_nsec / 1000);
+                         (nsec_t)ts.tv_nsec / 1000);
                 IOVEC_SET_STRING(iovec[n++], tbuf);
         }
 
@@ -102,6 +102,11 @@ void server_forward_console(
 
         tty = s->tty_path ? s->tty_path : "/dev/console";
 
+        /* Before you ask: yes, on purpose we open/close the console for each log line we write individually. This is a
+         * good strategy to avoid journald getting killed by the kernel's SAK concept (it doesn't fix this entirely,
+         * but minimizes the time window the kernel might end up killing journald due to SAK). It also makes things
+         * easier for us so that we don't have to recover from hangups and suchlike triggered on the console. */
+
         fd = open_terminal(tty, O_WRONLY|O_NOCTTY|O_CLOEXEC);
         if (fd < 0) {
                 log_debug_errno(fd, "Failed to open %s for logging: %m", tty);
index 7fecd7a..654fd76 100644 (file)
@@ -23,14 +23,14 @@ Journal.SyncIntervalSec,    config_parse_sec,        0, offsetof(Server, sync_in
 Journal.RateLimitInterval,  config_parse_sec,        0, offsetof(Server, rate_limit_interval)
 Journal.RateLimitIntervalSec,config_parse_sec,       0, offsetof(Server, rate_limit_interval)
 Journal.RateLimitBurst,     config_parse_unsigned,   0, offsetof(Server, rate_limit_burst)
-Journal.SystemMaxUse,       config_parse_iec_uint64, 0, offsetof(Server, system_metrics.max_use)
-Journal.SystemMaxFileSize,  config_parse_iec_uint64, 0, offsetof(Server, system_metrics.max_size)
-Journal.SystemKeepFree,     config_parse_iec_uint64, 0, offsetof(Server, system_metrics.keep_free)
-Journal.SystemMaxFiles,     config_parse_uint64,     0, offsetof(Server, system_metrics.n_max_files)
-Journal.RuntimeMaxUse,      config_parse_iec_uint64, 0, offsetof(Server, runtime_metrics.max_use)
-Journal.RuntimeMaxFileSize, config_parse_iec_uint64, 0, offsetof(Server, runtime_metrics.max_size)
-Journal.RuntimeKeepFree,    config_parse_iec_uint64, 0, offsetof(Server, runtime_metrics.keep_free)
-Journal.RuntimeMaxFiles,    config_parse_uint64,     0, offsetof(Server, runtime_metrics.n_max_files)
+Journal.SystemMaxUse,       config_parse_iec_uint64, 0, offsetof(Server, system_storage.metrics.max_use)
+Journal.SystemMaxFileSize,  config_parse_iec_uint64, 0, offsetof(Server, system_storage.metrics.max_size)
+Journal.SystemKeepFree,     config_parse_iec_uint64, 0, offsetof(Server, system_storage.metrics.keep_free)
+Journal.SystemMaxFiles,     config_parse_uint64,     0, offsetof(Server, system_storage.metrics.n_max_files)
+Journal.RuntimeMaxUse,      config_parse_iec_uint64, 0, offsetof(Server, runtime_storage.metrics.max_use)
+Journal.RuntimeMaxFileSize, config_parse_iec_uint64, 0, offsetof(Server, runtime_storage.metrics.max_size)
+Journal.RuntimeKeepFree,    config_parse_iec_uint64, 0, offsetof(Server, runtime_storage.metrics.keep_free)
+Journal.RuntimeMaxFiles,    config_parse_uint64,     0, offsetof(Server, runtime_storage.metrics.n_max_files)
 Journal.MaxRetentionSec,    config_parse_sec,        0, offsetof(Server, max_retention_usec)
 Journal.MaxFileSec,         config_parse_sec,        0, offsetof(Server, max_file_usec)
 Journal.ForwardToSyslog,    config_parse_bool,       0, offsetof(Server, forward_to_syslog)
index a2b6a15..90658a2 100644 (file)
@@ -28,7 +28,7 @@
 
 #include "escape.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "io-util.h"
 #include "journald-kmsg.h"
 #include "journald-server.h"
@@ -156,7 +156,8 @@ static void dev_kmsg_record(Server *s, const char *p, size_t l) {
 
                 /* Did we lose any? */
                 if (serial > *s->kernel_seqnum)
-                        server_driver_message(s, SD_MESSAGE_JOURNAL_MISSED,
+                        server_driver_message(s,
+                                              "MESSAGE_ID=" SD_MESSAGE_JOURNAL_MISSED_STR,
                                               LOG_MESSAGE("Missed %"PRIu64" kernel messages",
                                                           serial - *s->kernel_seqnum),
                                               NULL);
index 0a1ce20..abd06b1 100644 (file)
@@ -27,6 +27,7 @@
 #include "fd-util.h"
 #include "fs-util.h"
 #include "io-util.h"
+#include "journal-importer.h"
 #include "journald-console.h"
 #include "journald-kmsg.h"
 #include "journald-native.h"
@@ -39,6 +40,7 @@
 #include "selinux-util.h"
 #include "socket-util.h"
 #include "string-util.h"
+#include "unaligned.h"
 
 bool valid_user_field(const char *p, size_t l, bool allow_protected) {
         const char *a;
@@ -79,60 +81,110 @@ static bool allow_object_pid(const struct ucred *ucred) {
         return ucred && ucred->uid == 0;
 }
 
-void server_process_native_message(
+static void server_process_entry_meta(
+                const char *p, size_t l,
+                const struct ucred *ucred,
+                int *priority,
+                char **identifier,
+                char **message,
+                pid_t *object_pid) {
+
+        /* We need to determine the priority of this entry for the rate limiting logic */
+
+        if (l == 10 &&
+            startswith(p, "PRIORITY=") &&
+            p[9] >= '0' && p[9] <= '9')
+                *priority = (*priority & LOG_FACMASK) | (p[9] - '0');
+
+        else if (l == 17 &&
+                 startswith(p, "SYSLOG_FACILITY=") &&
+                 p[16] >= '0' && p[16] <= '9')
+                *priority = (*priority & LOG_PRIMASK) | ((p[16] - '0') << 3);
+
+        else if (l == 18 &&
+                 startswith(p, "SYSLOG_FACILITY=") &&
+                 p[16] >= '0' && p[16] <= '9' &&
+                 p[17] >= '0' && p[17] <= '9')
+                *priority = (*priority & LOG_PRIMASK) | (((p[16] - '0')*10 + (p[17] - '0')) << 3);
+
+        else if (l >= 19 &&
+                 startswith(p, "SYSLOG_IDENTIFIER=")) {
+                char *t;
+
+                t = strndup(p + 18, l - 18);
+                if (t) {
+                        free(*identifier);
+                        *identifier = t;
+                }
+
+        } else if (l >= 8 &&
+                   startswith(p, "MESSAGE=")) {
+                char *t;
+
+                t = strndup(p + 8, l - 8);
+                if (t) {
+                        free(*message);
+                        *message = t;
+                }
+
+        } else if (l > strlen("OBJECT_PID=") &&
+                   l < strlen("OBJECT_PID=")  + DECIMAL_STR_MAX(pid_t) &&
+                   startswith(p, "OBJECT_PID=") &&
+                   allow_object_pid(ucred)) {
+                char buf[DECIMAL_STR_MAX(pid_t)];
+                memcpy(buf, p + strlen("OBJECT_PID="), l - strlen("OBJECT_PID="));
+                buf[l-strlen("OBJECT_PID=")] = '\0';
+
+                (void) parse_pid(buf, object_pid);
+        }
+}
+
+static int server_process_entry(
                 Server *s,
-                const void *buffer, size_t buffer_size,
+                const void *buffer, size_t *remaining,
                 const struct ucred *ucred,
                 const struct timeval *tv,
                 const char *label, size_t label_len) {
 
+        /* Process a single entry from a native message.
+         * Returns 0 if nothing special happened and the message processing should continue,
+         * and a negative or positive value otherwise.
+         *
+         * Note that *remaining is altered on both success and failure. */
+
         struct iovec *iovec = NULL;
         unsigned n = 0, j, tn = (unsigned) -1;
         const char *p;
-        size_t remaining, m = 0, entry_size = 0;
+        size_t m = 0, entry_size = 0;
         int priority = LOG_INFO;
         char *identifier = NULL, *message = NULL;
         pid_t object_pid = 0;
-
-        assert(s);
-        assert(buffer || buffer_size == 0);
+        int r = 0;
 
         p = buffer;
-        remaining = buffer_size;
 
-        while (remaining > 0) {
+        while (*remaining > 0) {
                 const char *e, *q;
 
-                e = memchr(p, '\n', remaining);
+                e = memchr(p, '\n', *remaining);
 
                 if (!e) {
                         /* Trailing noise, let's ignore it, and flush what we collected */
                         log_debug("Received message with trailing noise, ignoring.");
+                        r = 1; /* finish processing of the message */
                         break;
                 }
 
                 if (e == p) {
                         /* Entry separator */
-
-                        if (entry_size + n + 1 > ENTRY_SIZE_MAX) { /* data + separators + trailer */
-                                log_debug("Entry is too big with %u properties and %zu bytes, ignoring.", n, entry_size);
-                                continue;
-                        }
-
-                        server_dispatch_message(s, iovec, n, m, ucred, tv, label, label_len, NULL, priority, object_pid);
-                        n = 0;
-                        priority = LOG_INFO;
-                        entry_size = 0;
-
-                        p++;
-                        remaining--;
-                        continue;
+                        *remaining -= 1;
+                        break;
                 }
 
                 if (*p == '.' || *p == '#') {
                         /* Ignore control commands for now, and
                          * comments too. */
-                        remaining -= (e - p) + 1;
+                        *remaining -= (e - p) + 1;
                         p = e + 1;
                         continue;
                 }
@@ -141,7 +193,7 @@ void server_process_native_message(
 
                 /* n existing properties, 1 new, +1 for _TRANSPORT */
                 if (!GREEDY_REALLOC(iovec, m, n + 2 + N_IOVEC_META_FIELDS + N_IOVEC_OBJECT_FIELDS)) {
-                        log_oom();
+                        r = log_oom();
                         break;
                 }
 
@@ -154,87 +206,40 @@ void server_process_native_message(
 
                                 /* If the field name starts with an
                                  * underscore, skip the variable,
-                                 * since that indidates a trusted
+                                 * since that indicates a trusted
                                  * field */
                                 iovec[n].iov_base = (char*) p;
                                 iovec[n].iov_len = l;
-                                entry_size += iovec[n].iov_len;
+                                entry_size += l;
                                 n++;
 
-                                /* We need to determine the priority
-                                 * of this entry for the rate limiting
-                                 * logic */
-                                if (l == 10 &&
-                                    startswith(p, "PRIORITY=") &&
-                                    p[9] >= '0' && p[9] <= '9')
-                                        priority = (priority & LOG_FACMASK) | (p[9] - '0');
-
-                                else if (l == 17 &&
-                                         startswith(p, "SYSLOG_FACILITY=") &&
-                                         p[16] >= '0' && p[16] <= '9')
-                                        priority = (priority & LOG_PRIMASK) | ((p[16] - '0') << 3);
-
-                                else if (l == 18 &&
-                                         startswith(p, "SYSLOG_FACILITY=") &&
-                                         p[16] >= '0' && p[16] <= '9' &&
-                                         p[17] >= '0' && p[17] <= '9')
-                                        priority = (priority & LOG_PRIMASK) | (((p[16] - '0')*10 + (p[17] - '0')) << 3);
-
-                                else if (l >= 19 &&
-                                         startswith(p, "SYSLOG_IDENTIFIER=")) {
-                                        char *t;
-
-                                        t = strndup(p + 18, l - 18);
-                                        if (t) {
-                                                free(identifier);
-                                                identifier = t;
-                                        }
-
-                                } else if (l >= 8 &&
-                                           startswith(p, "MESSAGE=")) {
-                                        char *t;
-
-                                        t = strndup(p + 8, l - 8);
-                                        if (t) {
-                                                free(message);
-                                                message = t;
-                                        }
-
-                                } else if (l > strlen("OBJECT_PID=") &&
-                                           l < strlen("OBJECT_PID=")  + DECIMAL_STR_MAX(pid_t) &&
-                                           startswith(p, "OBJECT_PID=") &&
-                                           allow_object_pid(ucred)) {
-                                        char buf[DECIMAL_STR_MAX(pid_t)];
-                                        memcpy(buf, p + strlen("OBJECT_PID="), l - strlen("OBJECT_PID="));
-                                        buf[l-strlen("OBJECT_PID=")] = '\0';
-
-                                        /* ignore error */
-                                        parse_pid(buf, &object_pid);
-                                }
+                                server_process_entry_meta(p, l, ucred,
+                                                          &priority,
+                                                          &identifier,
+                                                          &message,
+                                                          &object_pid);
                         }
 
-                        remaining -= (e - p) + 1;
+                        *remaining -= (e - p) + 1;
                         p = e + 1;
                         continue;
                 } else {
-                        le64_t l_le;
                         uint64_t l;
                         char *k;
 
-                        if (remaining < e - p + 1 + sizeof(uint64_t) + 1) {
+                        if (*remaining < e - p + 1 + sizeof(uint64_t) + 1) {
                                 log_debug("Failed to parse message, ignoring.");
                                 break;
                         }
 
-                        memcpy(&l_le, e + 1, sizeof(uint64_t));
-                        l = le64toh(l_le);
+                        l = unaligned_read_le64(e + 1);
 
                         if (l > DATA_SIZE_MAX) {
                                 log_debug("Received binary data block of %"PRIu64" bytes is too large, ignoring.", l);
                                 break;
                         }
 
-                        if ((uint64_t) remaining < e - p + 1 + sizeof(uint64_t) + l + 1 ||
+                        if ((uint64_t) *remaining < e - p + 1 + sizeof(uint64_t) + l + 1 ||
                             e[1+sizeof(uint64_t)+l] != '\n') {
                                 log_debug("Failed to parse message, ignoring.");
                                 break;
@@ -255,16 +260,24 @@ void server_process_native_message(
                                 iovec[n].iov_len = (e - p) + 1 + l;
                                 entry_size += iovec[n].iov_len;
                                 n++;
+
+                                server_process_entry_meta(k, (e - p) + 1 + l, ucred,
+                                                          &priority,
+                                                          &identifier,
+                                                          &message,
+                                                          &object_pid);
                         } else
                                 free(k);
 
-                        remaining -= (e - p) + 1 + sizeof(uint64_t) + l + 1;
+                        *remaining -= (e - p) + 1 + sizeof(uint64_t) + l + 1;
                         p = e + 1 + sizeof(uint64_t) + l + 1;
                 }
         }
 
-        if (n <= 0)
+        if (n <= 0) {
+                r = 1;
                 goto finish;
+        }
 
         tn = n++;
         IOVEC_SET_STRING(iovec[tn], "_TRANSPORT=journal");
@@ -278,7 +291,7 @@ void server_process_native_message(
 
         if (message) {
                 if (s->forward_to_syslog)
-                        server_forward_syslog(s, priority, identifier, message, ucred, tv);
+                        server_forward_syslog(s, syslog_fixup_facility(priority), identifier, message, ucred, tv);
 
                 if (s->forward_to_kmsg)
                         server_forward_kmsg(s, priority, identifier, message, ucred);
@@ -298,13 +311,35 @@ finish:
                         continue;
 
                 if (iovec[j].iov_base < buffer ||
-                    (const uint8_t*) iovec[j].iov_base >= (const uint8_t*) buffer + buffer_size)
+                    (const char*) iovec[j].iov_base >= p + *remaining)
                         free(iovec[j].iov_base);
         }
 
         free(iovec);
         free(identifier);
         free(message);
+
+        return r;
+}
+
+void server_process_native_message(
+                Server *s,
+                const void *buffer, size_t buffer_size,
+                const struct ucred *ucred,
+                const struct timeval *tv,
+                const char *label, size_t label_len) {
+
+        int r;
+        size_t remaining = buffer_size;
+
+        assert(s);
+        assert(buffer || buffer_size == 0);
+
+        do {
+                r = server_process_entry(s,
+                                         (const uint8_t*) buffer + (buffer_size - remaining), &remaining,
+                                         ucred, tv, label, label_len);
+        } while (r == 0);
 }
 
 void server_process_native_file(
@@ -478,7 +513,7 @@ int server_open_native_socket(Server*s) {
                 return log_error_errno(errno, "SO_PASSCRED failed: %m");
 
 #ifdef HAVE_SELINUX
-        if (mac_selinux_have()) {
+        if (mac_selinux_use()) {
                 r = setsockopt(s->native_fd, SOL_SOCKET, SO_PASSSEC, &one, sizeof(one));
                 if (r < 0)
                         log_warning_errno(errno, "SO_PASSSEC failed: %m");
index c13b80a..1ab415a 100644 (file)
 
 #include "journald-server.h"
 
-/* Make sure not to make this smaller than the maximum coredump
- * size. See COREDUMP_MAX in coredump.c */
-#define ENTRY_SIZE_MAX (1024*1024*770u)
-#define DATA_SIZE_MAX (1024*1024*768u)
-
 bool valid_user_field(const char *p, size_t l, bool allow_protected);
 
 void server_process_native_message(Server *s, const void *buffer, size_t buffer_size, const struct ucred *ucred, const struct timeval *tv, const char *label, size_t label_len);
index fce799a..f48639c 100644 (file)
@@ -190,7 +190,7 @@ static unsigned burst_modulate(unsigned burst, uint64_t available) {
         if (k <= 20)
                 return burst;
 
-        burst = (burst * (k-20)) / 4;
+        burst = (burst * (k-16)) / 4;
 
         /*
          * Example:
@@ -261,7 +261,7 @@ int journal_rate_limit_test(JournalRateLimit *r, const char *id, int priority, u
                 return 1 + s;
         }
 
-        if (p->num <= burst) {
+        if (p->num < burst) {
                 p->num++;
                 return 1;
         }
index 587c343..05a1254 100644 (file)
 #include "extract-word.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "hashmap.h"
 #include "hostname-util.h"
+#include "id128-util.h"
 #include "io-util.h"
 #include "journal-authenticate.h"
 #include "journal-file.h"
@@ -56,6 +57,7 @@
 #include "journald-server.h"
 #include "journald-stream.h"
 #include "journald-syslog.h"
+#include "log.h"
 #include "missing.h"
 #include "mkdir.h"
 #include "parse-util.h"
@@ -69,7 +71,7 @@
 #include "string-table.h"
 #include "string-util.h"
 #include "user-util.h"
-#include "log.h"
+#include "syslog-util.h"
 
 #define USER_JOURNALS_MAX 1024
 
 /* The period to insert between posting changes for coalescing */
 #define POST_CHANGE_TIMER_INTERVAL_USEC (250*USEC_PER_MSEC)
 
-static int determine_space_for(
-                Server *s,
-                JournalMetrics *metrics,
-                const char *path,
-                const char *name,
-                bool verbose,
-                bool patch_min_use,
-                uint64_t *available,
-                uint64_t *limit) {
-
-        uint64_t sum = 0, ss_avail, avail;
+static int determine_path_usage(Server *s, const char *path, uint64_t *ret_used, uint64_t *ret_free) {
         _cleanup_closedir_ DIR *d = NULL;
         struct dirent *de;
         struct statvfs ss;
-        const char *p;
-        usec_t ts;
 
-        assert(s);
-        assert(metrics);
-        assert(path);
-        assert(name);
+        assert(ret_used);
+        assert(ret_free);
 
-        ts = now(CLOCK_MONOTONIC);
-
-        if (!verbose && s->cached_space_timestamp + RECHECK_SPACE_USEC > ts) {
-
-                if (available)
-                        *available = s->cached_space_available;
-                if (limit)
-                        *limit = s->cached_space_limit;
-
-                return 0;
-        }
-
-        p = strjoina(path, SERVER_MACHINE_ID(s));
-        d = opendir(p);
+        d = opendir(path);
         if (!d)
-                return log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_ERR, errno, "Failed to open %s: %m", p);
+                return log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_ERR,
+                                      errno, "Failed to open %s: %m", path);
 
         if (fstatvfs(dirfd(d), &ss) < 0)
-                return log_error_errno(errno, "Failed to fstatvfs(%s): %m", p);
+                return log_error_errno(errno, "Failed to fstatvfs(%s): %m", path);
 
+        *ret_free = ss.f_bsize * ss.f_bavail;
+        *ret_used = 0;
         FOREACH_DIRENT_ALL(de, d, break) {
                 struct stat st;
 
@@ -135,88 +113,125 @@ static int determine_space_for(
                         continue;
 
                 if (fstatat(dirfd(d), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
-                        log_debug_errno(errno, "Failed to stat %s/%s, ignoring: %m", p, de->d_name);
+                        log_debug_errno(errno, "Failed to stat %s/%s, ignoring: %m", path, de->d_name);
                         continue;
                 }
 
                 if (!S_ISREG(st.st_mode))
                         continue;
 
-                sum += (uint64_t) st.st_blocks * 512UL;
+                *ret_used += (uint64_t) st.st_blocks * 512UL;
         }
 
-        /* If requested, then let's bump the min_use limit to the
-         * current usage on disk. We do this when starting up and
-         * first opening the journal files. This way sudden spikes in
-         * disk usage will not cause journald to vacuum files without
-         * bounds. Note that this means that only a restart of
-         * journald will make it reset this value. */
-
-        if (patch_min_use)
-                metrics->min_use = MAX(metrics->min_use, sum);
-
-        ss_avail = ss.f_bsize * ss.f_bavail;
-        avail = LESS_BY(ss_avail, metrics->keep_free);
-
-        s->cached_space_limit = MIN(MAX(sum + avail, metrics->min_use), metrics->max_use);
-        s->cached_space_available = LESS_BY(s->cached_space_limit, sum);
-        s->cached_space_timestamp = ts;
-
-        if (verbose) {
-                char    fb1[FORMAT_BYTES_MAX], fb2[FORMAT_BYTES_MAX], fb3[FORMAT_BYTES_MAX],
-                        fb4[FORMAT_BYTES_MAX], fb5[FORMAT_BYTES_MAX], fb6[FORMAT_BYTES_MAX];
-                format_bytes(fb1, sizeof(fb1), sum);
-                format_bytes(fb2, sizeof(fb2), metrics->max_use);
-                format_bytes(fb3, sizeof(fb3), metrics->keep_free);
-                format_bytes(fb4, sizeof(fb4), ss_avail);
-                format_bytes(fb5, sizeof(fb5), s->cached_space_limit);
-                format_bytes(fb6, sizeof(fb6), s->cached_space_available);
-
-                server_driver_message(s, SD_MESSAGE_JOURNAL_USAGE,
-                                      LOG_MESSAGE("%s (%s) is %s, max %s, %s free.",
-                                                  name, path, fb1, fb5, fb6),
-                                      "JOURNAL_NAME=%s", name,
-                                      "JOURNAL_PATH=%s", path,
-                                      "CURRENT_USE=%"PRIu64, sum,
-                                      "CURRENT_USE_PRETTY=%s", fb1,
-                                      "MAX_USE=%"PRIu64, metrics->max_use,
-                                      "MAX_USE_PRETTY=%s", fb2,
-                                      "DISK_KEEP_FREE=%"PRIu64, metrics->keep_free,
-                                      "DISK_KEEP_FREE_PRETTY=%s", fb3,
-                                      "DISK_AVAILABLE=%"PRIu64, ss_avail,
-                                      "DISK_AVAILABLE_PRETTY=%s", fb4,
-                                      "LIMIT=%"PRIu64, s->cached_space_limit,
-                                      "LIMIT_PRETTY=%s", fb5,
-                                      "AVAILABLE=%"PRIu64, s->cached_space_available,
-                                      "AVAILABLE_PRETTY=%s", fb6,
-                                      NULL);
-        }
+        return 0;
+}
+
+static void cache_space_invalidate(JournalStorageSpace *space) {
+        memset(space, 0, sizeof(*space));
+}
 
-        if (available)
-                *available = s->cached_space_available;
-        if (limit)
-                *limit = s->cached_space_limit;
+static int cache_space_refresh(Server *s, JournalStorage *storage) {
+        JournalStorageSpace *space;
+        JournalMetrics *metrics;
+        uint64_t vfs_used, vfs_avail, avail;
+        usec_t ts;
+        int r;
+
+        assert(s);
+
+        metrics = &storage->metrics;
+        space = &storage->space;
 
+        ts = now(CLOCK_MONOTONIC);
+
+        if (space->timestamp != 0 && space->timestamp + RECHECK_SPACE_USEC > ts)
+                return 0;
+
+        r = determine_path_usage(s, storage->path, &vfs_used, &vfs_avail);
+        if (r < 0)
+                return r;
+
+        space->vfs_used = vfs_used;
+        space->vfs_available = vfs_avail;
+
+        avail = LESS_BY(vfs_avail, metrics->keep_free);
+
+        space->limit = MIN(MAX(vfs_used + avail, metrics->min_use), metrics->max_use);
+        space->available = LESS_BY(space->limit, vfs_used);
+        space->timestamp = ts;
         return 1;
 }
 
-static int determine_space(Server *s, bool verbose, bool patch_min_use, uint64_t *available, uint64_t *limit) {
-        JournalMetrics *metrics;
-        const char *path, *name;
+static void patch_min_use(JournalStorage *storage) {
+        assert(storage);
+
+        /* Let's bump the min_use limit to the current usage on disk. We do
+         * this when starting up and first opening the journal files. This way
+         * sudden spikes in disk usage will not cause journald to vacuum files
+         * without bounds. Note that this means that only a restart of journald
+         * will make it reset this value. */
+
+        storage->metrics.min_use = MAX(storage->metrics.min_use, storage->space.vfs_used);
+}
+
+
+static int determine_space(Server *s, uint64_t *available, uint64_t *limit) {
+        JournalStorage *js;
+        int r;
 
         assert(s);
 
-        if (s->system_journal) {
-                path = "/var/log/journal/";
-                metrics = &s->system_metrics;
-                name = "System journal";
-        } else {
-                path = "/run/log/journal/";
-                metrics = &s->runtime_metrics;
-                name = "Runtime journal";
+        js = s->system_journal ? &s->system_storage : &s->runtime_storage;
+
+        r = cache_space_refresh(s, js);
+        if (r >= 0) {
+                if (available)
+                        *available = js->space.available;
+                if (limit)
+                        *limit = js->space.limit;
         }
+        return r;
+}
+
+void server_space_usage_message(Server *s, JournalStorage *storage) {
+        char fb1[FORMAT_BYTES_MAX], fb2[FORMAT_BYTES_MAX], fb3[FORMAT_BYTES_MAX],
+             fb4[FORMAT_BYTES_MAX], fb5[FORMAT_BYTES_MAX], fb6[FORMAT_BYTES_MAX];
+        JournalMetrics *metrics;
 
-        return determine_space_for(s, metrics, path, name, verbose, patch_min_use, available, limit);
+        assert(s);
+
+        if (!storage)
+                storage = s->system_journal ? &s->system_storage : &s->runtime_storage;
+
+        if (cache_space_refresh(s, storage) < 0)
+                return;
+
+        metrics = &storage->metrics;
+        format_bytes(fb1, sizeof(fb1), storage->space.vfs_used);
+        format_bytes(fb2, sizeof(fb2), metrics->max_use);
+        format_bytes(fb3, sizeof(fb3), metrics->keep_free);
+        format_bytes(fb4, sizeof(fb4), storage->space.vfs_available);
+        format_bytes(fb5, sizeof(fb5), storage->space.limit);
+        format_bytes(fb6, sizeof(fb6), storage->space.available);
+
+        server_driver_message(s, "MESSAGE_ID=" SD_MESSAGE_JOURNAL_USAGE_STR,
+                              LOG_MESSAGE("%s (%s) is %s, max %s, %s free.",
+                                          storage->name, storage->path, fb1, fb5, fb6),
+                              "JOURNAL_NAME=%s", storage->name,
+                              "JOURNAL_PATH=%s", storage->path,
+                              "CURRENT_USE=%"PRIu64, storage->space.vfs_used,
+                              "CURRENT_USE_PRETTY=%s", fb1,
+                              "MAX_USE=%"PRIu64, metrics->max_use,
+                              "MAX_USE_PRETTY=%s", fb2,
+                              "DISK_KEEP_FREE=%"PRIu64, metrics->keep_free,
+                              "DISK_KEEP_FREE_PRETTY=%s", fb3,
+                              "DISK_AVAILABLE=%"PRIu64, storage->space.vfs_available,
+                              "DISK_AVAILABLE_PRETTY=%s", fb4,
+                              "LIMIT=%"PRIu64, storage->space.limit,
+                              "LIMIT_PRETTY=%s", fb5,
+                              "AVAILABLE=%"PRIu64, storage->space.available,
+                              "AVAILABLE_PRETTY=%s", fb6,
+                              NULL);
 }
 
 static void server_add_acls(JournalFile *f, uid_t uid) {
@@ -267,6 +282,96 @@ static int open_journal(
         return r;
 }
 
+static bool flushed_flag_is_set(void) {
+        return access("/run/systemd/journal/flushed", F_OK) >= 0;
+}
+
+static int system_journal_open(Server *s, bool flush_requested) {
+        const char *fn;
+        int r = 0;
+
+        if (!s->system_journal &&
+            IN_SET(s->storage, STORAGE_PERSISTENT, STORAGE_AUTO) &&
+            (flush_requested || flushed_flag_is_set())) {
+
+                /* If in auto mode: first try to create the machine
+                 * path, but not the prefix.
+                 *
+                 * If in persistent mode: create /var/log/journal and
+                 * the machine path */
+
+                if (s->storage == STORAGE_PERSISTENT)
+                        (void) mkdir_p("/var/log/journal/", 0755);
+
+                (void) mkdir(s->system_storage.path, 0755);
+
+                fn = strjoina(s->system_storage.path, "/system.journal");
+                r = open_journal(s, true, fn, O_RDWR|O_CREAT, s->seal, &s->system_storage.metrics, &s->system_journal);
+                if (r >= 0) {
+                        server_add_acls(s->system_journal, 0);
+                        (void) cache_space_refresh(s, &s->system_storage);
+                        patch_min_use(&s->system_storage);
+                } else if (r < 0) {
+                        if (r != -ENOENT && r != -EROFS)
+                                log_warning_errno(r, "Failed to open system journal: %m");
+
+                        r = 0;
+                }
+
+                /* If the runtime journal is open, and we're post-flush, we're
+                 * recovering from a failed system journal rotate (ENOSPC)
+                 * for which the runtime journal was reopened.
+                 *
+                 * Perform an implicit flush to var, leaving the runtime
+                 * journal closed, now that the system journal is back.
+                 */
+                if (!flush_requested)
+                        (void) server_flush_to_var(s, true);
+        }
+
+        if (!s->runtime_journal &&
+            (s->storage != STORAGE_NONE)) {
+
+                fn = strjoina(s->runtime_storage.path, "/system.journal");
+
+                if (s->system_journal) {
+
+                        /* Try to open the runtime journal, but only
+                         * if it already exists, so that we can flush
+                         * it into the system journal */
+
+                        r = open_journal(s, false, fn, O_RDWR, false, &s->runtime_storage.metrics, &s->runtime_journal);
+                        if (r < 0) {
+                                if (r != -ENOENT)
+                                        log_warning_errno(r, "Failed to open runtime journal: %m");
+
+                                r = 0;
+                        }
+
+                } else {
+
+                        /* OK, we really need the runtime journal, so create
+                         * it if necessary. */
+
+                        (void) mkdir("/run/log", 0755);
+                        (void) mkdir("/run/log/journal", 0755);
+                        (void) mkdir_parents(fn, 0750);
+
+                        r = open_journal(s, true, fn, O_RDWR|O_CREAT, false, &s->runtime_storage.metrics, &s->runtime_journal);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to open runtime journal: %m");
+                }
+
+                if (s->runtime_journal) {
+                        server_add_acls(s->runtime_journal, 0);
+                        (void) cache_space_refresh(s, &s->runtime_storage);
+                        patch_min_use(&s->runtime_storage);
+                }
+        }
+
+        return r;
+}
+
 static JournalFile* find_journal(Server *s, uid_t uid) {
         _cleanup_free_ char *p = NULL;
         int r;
@@ -275,6 +380,17 @@ static JournalFile* find_journal(Server *s, uid_t uid) {
 
         assert(s);
 
+        /* A rotate that fails to create the new journal (ENOSPC) leaves the
+         * rotated journal as NULL.  Unless we revisit opening, even after
+         * space is made available we'll continue to return NULL indefinitely.
+         *
+         * system_journal_open() is a noop if the journals are already open, so
+         * we can just call it here to recover from failed rotates (or anything
+         * else that's left the journals as NULL).
+         *
+         * Fixes https://github.com/systemd/systemd/issues/3968 */
+        (void) system_journal_open(s, false);
+
         /* We split up user logs only on /var, not on /run. If the
          * runtime file is open, we write to it exclusively, in order
          * to guarantee proper order as soon as we flush /run to
@@ -283,7 +399,7 @@ static JournalFile* find_journal(Server *s, uid_t uid) {
         if (s->runtime_journal)
                 return s->runtime_journal;
 
-        if (uid <= SYSTEM_UID_MAX)
+        if (uid <= SYSTEM_UID_MAX || uid_is_dynamic(uid))
                 return s->system_journal;
 
         r = sd_id128_get_machine(&machine);
@@ -305,7 +421,7 @@ static JournalFile* find_journal(Server *s, uid_t uid) {
                 (void) journal_file_close(f);
         }
 
-        r = open_journal(s, true, p, O_RDWR|O_CREAT, s->seal, &s->system_metrics, &f);
+        r = open_journal(s, true, p, O_RDWR|O_CREAT, s->seal, &s->system_storage.metrics, &f);
         if (r < 0)
                 return s->system_journal;
 
@@ -399,50 +515,38 @@ void server_sync(Server *s) {
         s->sync_scheduled = false;
 }
 
-static void do_vacuum(
-                Server *s,
-                JournalFile *f,
-                JournalMetrics *metrics,
-                const char *path,
-                const char *name,
-                bool verbose,
-                bool patch_min_use) {
+static void do_vacuum(Server *s, JournalStorage *storage, bool verbose) {
 
-        const char *p;
-        uint64_t limit;
         int r;
 
         assert(s);
-        assert(metrics);
-        assert(path);
-        assert(name);
+        assert(storage);
 
-        if (!f)
-                return;
+        (void) cache_space_refresh(s, storage);
 
-        p = strjoina(path, SERVER_MACHINE_ID(s));
+        if (verbose)
+                server_space_usage_message(s, storage);
 
-        limit = metrics->max_use;
-        (void) determine_space_for(s, metrics, path, name, verbose, patch_min_use, NULL, &limit);
-
-        r = journal_directory_vacuum(p, limit, metrics->n_max_files, s->max_retention_usec, &s->oldest_file_usec,  verbose);
+        r = journal_directory_vacuum(storage->path, storage->space.limit,
+                                     storage->metrics.n_max_files, s->max_retention_usec,
+                                     &s->oldest_file_usec, verbose);
         if (r < 0 && r != -ENOENT)
-                log_warning_errno(r, "Failed to vacuum %s, ignoring: %m", p);
+                log_warning_errno(r, "Failed to vacuum %s, ignoring: %m", storage->path);
+
+        cache_space_invalidate(&storage->space);
 }
 
-int server_vacuum(Server *s, bool verbose, bool patch_min_use) {
+int server_vacuum(Server *s, bool verbose) {
         assert(s);
 
         log_debug("Vacuuming...");
 
         s->oldest_file_usec = 0;
 
-        do_vacuum(s, s->system_journal, &s->system_metrics, "/var/log/journal/", "System journal", verbose, patch_min_use);
-        do_vacuum(s, s->runtime_journal, &s->runtime_metrics, "/run/log/journal/", "Runtime journal", verbose, patch_min_use);
-
-        s->cached_space_limit = 0;
-        s->cached_space_available = 0;
-        s->cached_space_timestamp = 0;
+        if (s->system_journal)
+                do_vacuum(s, &s->system_storage, verbose);
+        if (s->runtime_journal)
+                do_vacuum(s, &s->runtime_storage, verbose);
 
         return 0;
 }
@@ -493,54 +597,88 @@ static void server_cache_hostname(Server *s) {
 
 static bool shall_try_append_again(JournalFile *f, int r) {
         switch(r) {
+
         case -E2BIG:           /* Hit configured limit          */
         case -EFBIG:           /* Hit fs limit                  */
         case -EDQUOT:          /* Quota limit hit               */
         case -ENOSPC:          /* Disk full                     */
                 log_debug("%s: Allocation limit reached, rotating.", f->path);
                 return true;
+
         case -EIO:             /* I/O error of some kind (mmap) */
                 log_warning("%s: IO error, rotating.", f->path);
                 return true;
+
         case -EHOSTDOWN:       /* Other machine                 */
                 log_info("%s: Journal file from other machine, rotating.", f->path);
                 return true;
+
         case -EBUSY:           /* Unclean shutdown              */
                 log_info("%s: Unclean shutdown, rotating.", f->path);
                 return true;
+
         case -EPROTONOSUPPORT: /* Unsupported feature           */
                 log_info("%s: Unsupported feature, rotating.", f->path);
                 return true;
+
         case -EBADMSG:         /* Corrupted                     */
         case -ENODATA:         /* Truncated                     */
         case -ESHUTDOWN:       /* Already archived              */
                 log_warning("%s: Journal file corrupted, rotating.", f->path);
                 return true;
+
         case -EIDRM:           /* Journal file has been deleted */
                 log_warning("%s: Journal file has been deleted, rotating.", f->path);
                 return true;
+
+        case -ETXTBSY:         /* Journal file is from the future */
+                log_warning("%s: Journal file is from the future, rotating.", f->path);
+                return true;
+
         default:
                 return false;
         }
 }
 
 static void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, unsigned n, int priority) {
+        bool vacuumed = false, rotate = false;
+        struct dual_timestamp ts;
         JournalFile *f;
-        bool vacuumed = false;
         int r;
 
         assert(s);
         assert(iovec);
         assert(n > 0);
 
-        f = find_journal(s, uid);
-        if (!f)
-                return;
+        /* Get the closest, linearized time we have for this log event from the event loop. (Note that we do not use
+         * the source time, and not even the time the event was originally seen, but instead simply the time we started
+         * processing it, as we want strictly linear ordering in what we write out.) */
+        assert_se(sd_event_now(s->event, CLOCK_REALTIME, &ts.realtime) >= 0);
+        assert_se(sd_event_now(s->event, CLOCK_MONOTONIC, &ts.monotonic) >= 0);
 
-        if (journal_file_rotate_suggested(f, s->max_file_usec)) {
-                log_debug("%s: Journal header limits reached or header out-of-date, rotating.", f->path);
+        if (ts.realtime < s->last_realtime_clock) {
+                /* When the time jumps backwards, let's immediately rotate. Of course, this should not happen during
+                 * regular operation. However, when it does happen, then we should make sure that we start fresh files
+                 * to ensure that the entries in the journal files are strictly ordered by time, in order to ensure
+                 * bisection works correctly. */
+
+                log_debug("Time jumped backwards, rotating.");
+                rotate = true;
+        } else {
+
+                f = find_journal(s, uid);
+                if (!f)
+                        return;
+
+                if (journal_file_rotate_suggested(f, s->max_file_usec)) {
+                        log_debug("%s: Journal header limits reached or header out-of-date, rotating.", f->path);
+                        rotate = true;
+                }
+        }
+
+        if (rotate) {
                 server_rotate(s);
-                server_vacuum(s, false, false);
+                server_vacuum(s, false);
                 vacuumed = true;
 
                 f = find_journal(s, uid);
@@ -548,7 +686,9 @@ static void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, unsigned
                         return;
         }
 
-        r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL);
+        s->last_realtime_clock = ts.realtime;
+
+        r = journal_file_append_entry(f, &ts, iovec, n, &s->seqnum, NULL, NULL);
         if (r >= 0) {
                 server_schedule_sync(s, priority);
                 return;
@@ -560,20 +700,58 @@ static void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, unsigned
         }
 
         server_rotate(s);
-        server_vacuum(s, false, false);
+        server_vacuum(s, false);
 
         f = find_journal(s, uid);
         if (!f)
                 return;
 
         log_debug("Retrying write.");
-        r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL);
+        r = journal_file_append_entry(f, &ts, iovec, n, &s->seqnum, NULL, NULL);
         if (r < 0)
                 log_error_errno(r, "Failed to write entry (%d items, %zu bytes) despite vacuuming, ignoring: %m", n, IOVEC_TOTAL_SIZE(iovec, n));
         else
                 server_schedule_sync(s, priority);
 }
 
+static int get_invocation_id(const char *cgroup_root, const char *slice, const char *unit, char **ret) {
+        _cleanup_free_ char *escaped = NULL, *slice_path = NULL, *p = NULL;
+        char *copy, ids[SD_ID128_STRING_MAX];
+        int r;
+
+        /* Read the invocation ID of a unit off a unit. It's stored in the "trusted.invocation_id" extended attribute
+         * on the cgroup path. */
+
+        r = cg_slice_to_path(slice, &slice_path);
+        if (r < 0)
+                return r;
+
+        escaped = cg_escape(unit);
+        if (!escaped)
+                return -ENOMEM;
+
+        p = strjoin(cgroup_root, "/", slice_path, "/", escaped);
+        if (!p)
+                return -ENOMEM;
+
+        r = cg_get_xattr(SYSTEMD_CGROUP_CONTROLLER, p, "trusted.invocation_id", ids, 32);
+        if (r < 0)
+                return r;
+        if (r != 32)
+                return -EINVAL;
+        ids[32] = 0;
+
+        if (!id128_is_valid(ids))
+                return -EINVAL;
+
+        copy = strdup(ids);
+        if (!copy)
+                return -ENOMEM;
+
+        *ret = copy;
+        return 0;
+}
+
 static void dispatch_message_real(
                 Server *s,
                 struct iovec *iovec, unsigned n, unsigned m,
@@ -582,7 +760,8 @@ static void dispatch_message_real(
                 const char *label, size_t label_len,
                 const char *unit_id,
                 int priority,
-                pid_t object_pid) {
+                pid_t object_pid,
+                char *cgroup) {
 
         char    pid[sizeof("_PID=") + DECIMAL_STR_MAX(pid_t)],
                 uid[sizeof("_UID=") + DECIMAL_STR_MAX(uid_t)],
@@ -612,7 +791,7 @@ static void dispatch_message_real(
         assert(s);
         assert(iovec);
         assert(n > 0);
-        assert(n + N_IOVEC_META_FIELDS + (object_pid ? N_IOVEC_OBJECT_FIELDS : 0) <= m);
+        assert(n + N_IOVEC_META_FIELDS + (object_pid > 0 ? N_IOVEC_OBJECT_FIELDS : 0) <= m);
 
         if (ucred) {
                 realuid = ucred->uid;
@@ -668,8 +847,14 @@ static void dispatch_message_real(
                 }
 #endif
 
-                r = cg_pid_get_path_shifted(ucred->pid, s->cgroup_root, &c);
+                r = 0;
+                if (cgroup)
+                        c = cgroup;
+                else
+                        r = cg_pid_get_path_shifted(ucred->pid, s->cgroup_root, &c);
+
                 if (r >= 0) {
+                        _cleanup_free_ char *raw_unit = NULL, *raw_slice = NULL;
                         char *session = NULL;
 
                         x = strjoina("_SYSTEMD_CGROUP=", c);
@@ -689,9 +874,8 @@ static void dispatch_message_real(
                                 IOVEC_SET_STRING(iovec[n++], owner_uid);
                         }
 
-                        if (cg_path_get_unit(c, &t) >= 0) {
-                                x = strjoina("_SYSTEMD_UNIT=", t);
-                                free(t);
+                        if (cg_path_get_unit(c, &raw_unit) >= 0) {
+                                x = strjoina("_SYSTEMD_UNIT=", raw_unit);
                                 IOVEC_SET_STRING(iovec[n++], x);
                         } else if (unit_id && !session) {
                                 x = strjoina("_SYSTEMD_UNIT=", unit_id);
@@ -707,20 +891,34 @@ static void dispatch_message_real(
                                 IOVEC_SET_STRING(iovec[n++], x);
                         }
 
-                        if (cg_path_get_slice(c, &t) >= 0) {
-                                x = strjoina("_SYSTEMD_SLICE=", t);
+                        if (cg_path_get_slice(c, &raw_slice) >= 0) {
+                                x = strjoina("_SYSTEMD_SLICE=", raw_slice);
+                                IOVEC_SET_STRING(iovec[n++], x);
+                        }
+
+                        if (cg_path_get_user_slice(c, &t) >= 0) {
+                                x = strjoina("_SYSTEMD_USER_SLICE=", t);
                                 free(t);
                                 IOVEC_SET_STRING(iovec[n++], x);
                         }
 
-                        free(c);
+                        if (raw_slice && raw_unit) {
+                                if (get_invocation_id(s->cgroup_root, raw_slice, raw_unit, &t) >= 0) {
+                                        x = strjoina("_SYSTEMD_INVOCATION_ID=", t);
+                                        free(t);
+                                        IOVEC_SET_STRING(iovec[n++], x);
+                                }
+                        }
+
+                        if (!cgroup)
+                                free(c);
                 } else if (unit_id) {
                         x = strjoina("_SYSTEMD_UNIT=", unit_id);
                         IOVEC_SET_STRING(iovec[n++], x);
                 }
 
 #ifdef HAVE_SELINUX
-                if (mac_selinux_have()) {
+                if (mac_selinux_use()) {
                         if (label) {
                                 x = alloca(strlen("_SELINUX_CONTEXT=") + label_len + 1);
 
@@ -818,13 +1016,25 @@ static void dispatch_message_real(
                                 IOVEC_SET_STRING(iovec[n++], x);
                         }
 
+                        if (cg_path_get_slice(c, &t) >= 0) {
+                                x = strjoina("OBJECT_SYSTEMD_SLICE=", t);
+                                free(t);
+                                IOVEC_SET_STRING(iovec[n++], x);
+                        }
+
+                        if (cg_path_get_user_slice(c, &t) >= 0) {
+                                x = strjoina("OBJECT_SYSTEMD_USER_SLICE=", t);
+                                free(t);
+                                IOVEC_SET_STRING(iovec[n++], x);
+                        }
+
                         free(c);
                 }
         }
         assert(n <= m);
 
         if (tv) {
-                sprintf(source_time, "_SOURCE_REALTIME_TIMESTAMP=%llu", (unsigned long long) timeval_load(tv));
+                sprintf(source_time, "_SOURCE_REALTIME_TIMESTAMP=" USEC_FMT, timeval_load(tv));
                 IOVEC_SET_STRING(iovec[n++], source_time);
         }
 
@@ -858,8 +1068,7 @@ static void dispatch_message_real(
         write_to_journal(s, journal_uid, iovec, n, priority);
 }
 
-void server_driver_message(Server *s, sd_id128_t message_id, const char *format, ...) {
-        char mid[11 + 32 + 1];
+void server_driver_message(Server *s, const char *message_id, const char *format, ...) {
         struct iovec iovec[N_IOVEC_META_FIELDS + 5 + N_IOVEC_PAYLOAD_FIELDS];
         unsigned n = 0, m;
         int r;
@@ -877,11 +1086,8 @@ void server_driver_message(Server *s, sd_id128_t message_id, const char *format,
         assert_cc(6 == LOG_INFO);
         IOVEC_SET_STRING(iovec[n++], "PRIORITY=6");
 
-        if (!sd_id128_is_null(message_id)) {
-                snprintf(mid, sizeof(mid), LOG_MESSAGE_ID(message_id));
-                IOVEC_SET_STRING(iovec[n++], mid);
-        }
-
+        if (message_id)
+                IOVEC_SET_STRING(iovec[n++], message_id);
         m = n;
 
         va_start(ap, format);
@@ -894,7 +1100,7 @@ void server_driver_message(Server *s, sd_id128_t message_id, const char *format,
         ucred.gid = getgid();
 
         if (r >= 0)
-                dispatch_message_real(s, iovec, n, ELEMENTSOF(iovec), &ucred, NULL, NULL, 0, NULL, LOG_INFO, 0);
+                dispatch_message_real(s, iovec, n, ELEMENTSOF(iovec), &ucred, NULL, NULL, 0, NULL, LOG_INFO, 0, NULL);
 
         while (m < n)
                 free(iovec[m++].iov_base);
@@ -908,7 +1114,7 @@ void server_driver_message(Server *s, sd_id128_t message_id, const char *format,
                 n = 3;
                 IOVEC_SET_STRING(iovec[n++], "PRIORITY=4");
                 IOVEC_SET_STRING(iovec[n++], buf);
-                dispatch_message_real(s, iovec, n, ELEMENTSOF(iovec), &ucred, NULL, NULL, 0, NULL, LOG_INFO, 0);
+                dispatch_message_real(s, iovec, n, ELEMENTSOF(iovec), &ucred, NULL, NULL, 0, NULL, LOG_INFO, 0, NULL);
         }
 }
 
@@ -925,7 +1131,7 @@ void server_dispatch_message(
         int rl, r;
         _cleanup_free_ char *path = NULL;
         uint64_t available = 0;
-        char *c;
+        char *c = NULL;
 
         assert(s);
         assert(iovec || n == 0);
@@ -964,99 +1170,25 @@ void server_dispatch_message(
                 }
         }
 
-        (void) determine_space(s, false, false, &available, NULL);
+        (void) determine_space(s, &available, NULL);
         rl = journal_rate_limit_test(s->rate_limit, path, priority & LOG_PRIMASK, available);
         if (rl == 0)
                 return;
 
         /* Write a suppression message if we suppressed something */
         if (rl > 1)
-                server_driver_message(s, SD_MESSAGE_JOURNAL_DROPPED,
+                server_driver_message(s, "MESSAGE_ID=" SD_MESSAGE_JOURNAL_DROPPED_STR,
                                       LOG_MESSAGE("Suppressed %u messages from %s", rl - 1, path),
                                       NULL);
 
 finish:
-        dispatch_message_real(s, iovec, n, m, ucred, tv, label, label_len, unit_id, priority, object_pid);
-}
-
-
-static int system_journal_open(Server *s, bool flush_requested) {
-        const char *fn;
-        int r = 0;
-
-        if (!s->system_journal &&
-            (s->storage == STORAGE_PERSISTENT || s->storage == STORAGE_AUTO) &&
-            (flush_requested
-             || access("/run/systemd/journal/flushed", F_OK) >= 0)) {
-
-                /* If in auto mode: first try to create the machine
-                 * path, but not the prefix.
-                 *
-                 * If in persistent mode: create /var/log/journal and
-                 * the machine path */
-
-                if (s->storage == STORAGE_PERSISTENT)
-                        (void) mkdir_p("/var/log/journal/", 0755);
-
-                fn = strjoina("/var/log/journal/", SERVER_MACHINE_ID(s));
-                (void) mkdir(fn, 0755);
-
-                fn = strjoina(fn, "/system.journal");
-                r = open_journal(s, true, fn, O_RDWR|O_CREAT, s->seal, &s->system_metrics, &s->system_journal);
-                if (r >= 0) {
-                        server_add_acls(s->system_journal, 0);
-                        (void) determine_space_for(s, &s->system_metrics, "/var/log/journal/", "System journal", true, true, NULL, NULL);
-                } else if (r < 0) {
-                        if (r != -ENOENT && r != -EROFS)
-                                log_warning_errno(r, "Failed to open system journal: %m");
-
-                        r = 0;
-                }
-        }
-
-        if (!s->runtime_journal &&
-            (s->storage != STORAGE_NONE)) {
-
-                fn = strjoina("/run/log/journal/", SERVER_MACHINE_ID(s), "/system.journal");
-
-                if (s->system_journal) {
-
-                        /* Try to open the runtime journal, but only
-                         * if it already exists, so that we can flush
-                         * it into the system journal */
-
-                        r = open_journal(s, false, fn, O_RDWR, false, &s->runtime_metrics, &s->runtime_journal);
-                        if (r < 0) {
-                                if (r != -ENOENT)
-                                        log_warning_errno(r, "Failed to open runtime journal: %m");
-
-                                r = 0;
-                        }
-
-                } else {
-
-                        /* OK, we really need the runtime journal, so create
-                         * it if necessary. */
-
-                        (void) mkdir("/run/log", 0755);
-                        (void) mkdir("/run/log/journal", 0755);
-                        (void) mkdir_parents(fn, 0750);
-
-                        r = open_journal(s, true, fn, O_RDWR|O_CREAT, false, &s->runtime_metrics, &s->runtime_journal);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to open runtime journal: %m");
-                }
-
-                if (s->runtime_journal) {
-                        server_add_acls(s->runtime_journal, 0);
-                        (void) determine_space_for(s, &s->runtime_metrics, "/run/log/journal/", "Runtime journal", true, true, NULL, NULL);
-                }
-        }
-
-        return r;
+        /* restore cgroup path for logging */
+        if (c)
+                *c = '/';
+        dispatch_message_real(s, iovec, n, m, ucred, tv, label, label_len, unit_id, priority, object_pid, path);
 }
 
-int server_flush_to_var(Server *s) {
+int server_flush_to_var(Server *s, bool require_flag_file) {
         sd_id128_t machine;
         sd_journal *j = NULL;
         char ts[FORMAT_TIMESPAN_MAX];
@@ -1066,13 +1198,15 @@ int server_flush_to_var(Server *s) {
 
         assert(s);
 
-        if (s->storage != STORAGE_AUTO &&
-            s->storage != STORAGE_PERSISTENT)
+        if (!IN_SET(s->storage, STORAGE_AUTO, STORAGE_PERSISTENT))
                 return 0;
 
         if (!s->runtime_journal)
                 return 0;
 
+        if (require_flag_file && !flushed_flag_is_set())
+                return 0;
+
         (void) system_journal_open(s, true);
 
         if (!s->system_journal)
@@ -1117,7 +1251,7 @@ int server_flush_to_var(Server *s) {
                 }
 
                 server_rotate(s);
-                server_vacuum(s, false, false);
+                server_vacuum(s, false);
 
                 if (!s->system_journal) {
                         log_notice("Didn't flush runtime journal since rotation of system journal wasn't successful.");
@@ -1145,7 +1279,7 @@ finish:
 
         sd_journal_close(j);
 
-        server_driver_message(s, SD_ID128_NULL,
+        server_driver_message(s, NULL,
                               LOG_MESSAGE("Time spent on flushing to /var is %s for %u entries.",
                                           format_timespan(ts, sizeof(ts), now(CLOCK_MONOTONIC) - start, 0),
                                           n),
@@ -1284,14 +1418,15 @@ static int dispatch_sigusr1(sd_event_source *es, const struct signalfd_siginfo *
 
         log_info("Received request to flush runtime journal from PID " PID_FMT, si->ssi_pid);
 
-        server_flush_to_var(s);
+        (void) server_flush_to_var(s, false);
         server_sync(s);
-        server_vacuum(s, false, false);
+        server_vacuum(s, false);
 
         r = touch("/run/systemd/journal/flushed");
         if (r < 0)
                 log_warning_errno(r, "Failed to touch /run/systemd/journal/flushed, ignoring: %m");
 
+        server_space_usage_message(s, NULL);
         return 0;
 }
 
@@ -1303,7 +1438,12 @@ static int dispatch_sigusr2(sd_event_source *es, const struct signalfd_siginfo *
 
         log_info("Received request to rotate journal from PID " PID_FMT, si->ssi_pid);
         server_rotate(s);
-        server_vacuum(s, true, true);
+        server_vacuum(s, true);
+
+        if (s->system_journal)
+                patch_min_use(&s->system_storage);
+        if (s->runtime_journal)
+                patch_min_use(&s->runtime_storage);
 
         /* Let clients know when the most recent rotation happened. */
         r = write_timestamp_file_atomic("/run/systemd/journal/rotated", now(CLOCK_MONOTONIC));
@@ -1347,7 +1487,7 @@ static int setup_signals(Server *s) {
 
         assert(s);
 
-        assert(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, SIGTERM, SIGUSR1, SIGUSR2, SIGRTMIN+1, -1) >= 0);
+        assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, SIGTERM, SIGUSR1, SIGUSR2, SIGRTMIN+1, -1) >= 0);
 
         r = sd_event_add_signal(s->event, &s->sigusr1_event_source, SIGUSR1, dispatch_sigusr1, s);
         if (r < 0)
@@ -1393,55 +1533,101 @@ static int setup_signals(Server *s) {
         return 0;
 }
 
-static int server_parse_proc_cmdline(Server *s) {
-        _cleanup_free_ char *line = NULL;
-        const char *p;
+static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
+        Server *s = data;
         int r;
 
-        r = proc_cmdline(&line);
-        if (r < 0) {
-                log_warning_errno(r, "Failed to read /proc/cmdline, ignoring: %m");
-                return 0;
-        }
+        assert(s);
 
-        p = line;
-        for (;;) {
-                _cleanup_free_ char *word = NULL;
+        if (proc_cmdline_key_streq(key, "systemd.journald.forward_to_syslog")) {
 
-                r = extract_first_word(&p, &word, NULL, 0);
+                r = value ? parse_boolean(value) : true;
                 if (r < 0)
-                        return log_error_errno(r, "Failed to parse journald syntax \"%s\": %m", line);
+                        log_warning("Failed to parse forward to syslog switch \"%s\". Ignoring.", value);
+                else
+                        s->forward_to_syslog = r;
 
-                if (r == 0)
-                        break;
+        } else if (proc_cmdline_key_streq(key, "systemd.journald.forward_to_kmsg")) {
 
-                if (startswith(word, "systemd.journald.forward_to_syslog=")) {
-                        r = parse_boolean(word + 35);
-                        if (r < 0)
-                                log_warning("Failed to parse forward to syslog switch %s. Ignoring.", word + 35);
-                        else
-                                s->forward_to_syslog = r;
-                } else if (startswith(word, "systemd.journald.forward_to_kmsg=")) {
-                        r = parse_boolean(word + 33);
-                        if (r < 0)
-                                log_warning("Failed to parse forward to kmsg switch %s. Ignoring.", word + 33);
-                        else
-                                s->forward_to_kmsg = r;
-                } else if (startswith(word, "systemd.journald.forward_to_console=")) {
-                        r = parse_boolean(word + 36);
-                        if (r < 0)
-                                log_warning("Failed to parse forward to console switch %s. Ignoring.", word + 36);
-                        else
-                                s->forward_to_console = r;
-                } else if (startswith(word, "systemd.journald.forward_to_wall=")) {
-                        r = parse_boolean(word + 33);
-                        if (r < 0)
-                                log_warning("Failed to parse forward to wall switch %s. Ignoring.", word + 33);
-                        else
-                                s->forward_to_wall = r;
-                } else if (startswith(word, "systemd.journald"))
-                        log_warning("Invalid systemd.journald parameter. Ignoring.");
-        }
+                r = value ? parse_boolean(value) : true;
+                if (r < 0)
+                        log_warning("Failed to parse forward to kmsg switch \"%s\". Ignoring.", value);
+                else
+                        s->forward_to_kmsg = r;
+
+        } else if (proc_cmdline_key_streq(key, "systemd.journald.forward_to_console")) {
+
+                r = value ? parse_boolean(value) : true;
+                if (r < 0)
+                        log_warning("Failed to parse forward to console switch \"%s\". Ignoring.", value);
+                else
+                        s->forward_to_console = r;
+
+        } else if (proc_cmdline_key_streq(key, "systemd.journald.forward_to_wall")) {
+
+                r = value ? parse_boolean(value) : true;
+                if (r < 0)
+                        log_warning("Failed to parse forward to wall switch \"%s\". Ignoring.", value);
+                else
+                        s->forward_to_wall = r;
+
+        } else if (proc_cmdline_key_streq(key, "systemd.journald.max_level_console")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
+                r = log_level_from_string(value);
+                if (r < 0)
+                        log_warning("Failed to parse max level console value \"%s\". Ignoring.", value);
+                else
+                        s->max_level_console = r;
+
+        } else if (proc_cmdline_key_streq(key, "systemd.journald.max_level_store")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
+                r = log_level_from_string(value);
+                if (r < 0)
+                        log_warning("Failed to parse max level store value \"%s\". Ignoring.", value);
+                else
+                        s->max_level_store = r;
+
+        } else if (proc_cmdline_key_streq(key, "systemd.journald.max_level_syslog")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
+                r = log_level_from_string(value);
+                if (r < 0)
+                        log_warning("Failed to parse max level syslog value \"%s\". Ignoring.", value);
+                else
+                        s->max_level_syslog = r;
+
+        } else if (proc_cmdline_key_streq(key, "systemd.journald.max_level_kmsg")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
+                r = log_level_from_string(value);
+                if (r < 0)
+                        log_warning("Failed to parse max level kmsg value \"%s\". Ignoring.", value);
+                else
+                        s->max_level_kmsg = r;
+
+        } else if (proc_cmdline_key_streq(key, "systemd.journald.max_level_wall")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
+                r = log_level_from_string(value);
+                if (r < 0)
+                        log_warning("Failed to parse max level wall value \"%s\". Ignoring.", value);
+                else
+                        s->max_level_wall = r;
+
+        } else if (startswith(key, "systemd.journald"))
+                log_warning("Unknown journald kernel command line option \"%s\". Ignoring.", key);
 
         /* do not warn about state here, since probably systemd already did */
         return 0;
@@ -1450,11 +1636,11 @@ static int server_parse_proc_cmdline(Server *s) {
 static int server_parse_config_file(Server *s) {
         assert(s);
 
-        return config_parse_many(PKGSYSCONFDIR "/journald.conf",
-                                 CONF_PATHS_NULSTR("systemd/journald.conf.d"),
-                                 "Journal\0",
-                                 config_item_perf_lookup, journald_gperf_lookup,
-                                 false, s);
+        return config_parse_many_nulstr(PKGSYSCONFDIR "/journald.conf",
+                                        CONF_PATHS_NULSTR("systemd/journald.conf.d"),
+                                        "Journal\0",
+                                        config_item_perf_lookup, journald_gperf_lookup,
+                                        false, s);
 }
 
 static int server_dispatch_sync(sd_event_source *es, usec_t t, void *userdata) {
@@ -1563,7 +1749,7 @@ static int dispatch_notify_event(sd_event_source *es, int fd, uint32_t revents,
         assert(s->notify_fd == fd);
 
         /* The $NOTIFY_SOCKET is writable again, now send exactly one
-         * message on it. Either it's the wtachdog event, the initial
+         * message on it. Either it's the watchdog event, the initial
          * READY=1 event or an stdout stream event. If there's nothing
          * to write anymore, turn our event source off. The next time
          * there's something to send it will be turned on again. */
@@ -1748,11 +1934,14 @@ int server_init(Server *s) {
         s->max_level_console = LOG_INFO;
         s->max_level_wall = LOG_EMERG;
 
-        journal_reset_metrics(&s->system_metrics);
-        journal_reset_metrics(&s->runtime_metrics);
+        journal_reset_metrics(&s->system_storage.metrics);
+        journal_reset_metrics(&s->runtime_storage.metrics);
 
         server_parse_config_file(s);
-        server_parse_proc_cmdline(s);
+
+        r = proc_cmdline_parse(parse_proc_cmdline_item, s, PROC_CMDLINE_STRIP_RD_PREFIX);
+        if (r < 0)
+                log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
 
         if (!!s->rate_limit_interval ^ !!s->rate_limit_burst) {
                 log_debug("Setting both rate limit interval and burst from "USEC_FMT",%u to 0,0",
@@ -1902,6 +2091,14 @@ int server_init(Server *s) {
         server_cache_boot_id(s);
         server_cache_machine_id(s);
 
+        s->runtime_storage.name = "Runtime journal";
+        s->system_storage.name = "System journal";
+
+        s->runtime_storage.path = strjoin("/run/log/journal/", SERVER_MACHINE_ID(s));
+        s->system_storage.path  = strjoin("/var/log/journal/", SERVER_MACHINE_ID(s));
+        if (!s->runtime_storage.path || !s->system_storage.path)
+                return -ENOMEM;
+
         (void) server_connect_notify(s);
 
         return system_journal_open(s, false);
@@ -1980,6 +2177,8 @@ void server_done(Server *s) {
         free(s->tty_path);
         free(s->cgroup_root);
         free(s->hostname_field);
+        free(s->runtime_storage.path);
+        free(s->system_storage.path);
 
         if (s->mmap)
                 mmap_cache_unref(s->mmap);
index e025a4c..203460c 100644 (file)
@@ -43,12 +43,30 @@ typedef enum Storage {
 
 typedef enum SplitMode {
         SPLIT_UID,
-        SPLIT_LOGIN,
+        SPLIT_LOGIN, /* deprecated */
         SPLIT_NONE,
         _SPLIT_MAX,
         _SPLIT_INVALID = -1
 } SplitMode;
 
+typedef struct JournalStorageSpace {
+        usec_t   timestamp;
+
+        uint64_t available;
+        uint64_t limit;
+
+        uint64_t vfs_used; /* space used by journal files */
+        uint64_t vfs_available;
+} JournalStorageSpace;
+
+typedef struct JournalStorage {
+        const char *name;
+        char *path;
+
+        JournalMetrics metrics;
+        JournalStorageSpace space;
+} JournalStorage;
+
 struct Server {
         int syslog_fd;
         int native_fd;
@@ -89,8 +107,8 @@ struct Server {
         usec_t rate_limit_interval;
         unsigned rate_limit_burst;
 
-        JournalMetrics runtime_metrics;
-        JournalMetrics system_metrics;
+        JournalStorage runtime_storage;
+        JournalStorage system_storage;
 
         bool compress;
         bool seal;
@@ -103,10 +121,6 @@ struct Server {
         unsigned n_forward_syslog_missed;
         usec_t last_warn_forward_syslog_missed;
 
-        uint64_t cached_space_available;
-        uint64_t cached_space_limit;
-        usec_t cached_space_timestamp;
-
         uint64_t var_available_timestamp;
 
         usec_t max_retention_usec;
@@ -149,21 +163,23 @@ struct Server {
         char *cgroup_root;
 
         usec_t watchdog_usec;
+
+        usec_t last_realtime_clock;
 };
 
 #define SERVER_MACHINE_ID(s) ((s)->machine_id_field + strlen("_MACHINE_ID="))
 
-#define N_IOVEC_META_FIELDS 20
+#define N_IOVEC_META_FIELDS 22
 #define N_IOVEC_KERNEL_FIELDS 64
 #define N_IOVEC_UDEV_FIELDS 32
-#define N_IOVEC_OBJECT_FIELDS 12
+#define N_IOVEC_OBJECT_FIELDS 14
 #define N_IOVEC_PAYLOAD_FIELDS 15
 
 void server_dispatch_message(Server *s, struct iovec *iovec, unsigned n, unsigned m, const struct ucred *ucred, const struct timeval *tv, const char *label, size_t label_len, const char *unit_id, int priority, pid_t object_pid);
-void server_driver_message(Server *s, sd_id128_t message_id, const char *format, ...) _printf_(3,0) _sentinel_;
+void server_driver_message(Server *s, const char *message_id, const char *format, ...) _printf_(3,0) _sentinel_;
 
 /* gperf lookup function */
-const struct ConfigPerfItem* journald_gperf_lookup(const char *key, unsigned length);
+const struct ConfigPerfItem* journald_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
 
 int config_parse_storage(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 
@@ -178,9 +194,10 @@ SplitMode split_mode_from_string(const char *s) _pure_;
 int server_init(Server *s);
 void server_done(Server *s);
 void server_sync(Server *s);
-int server_vacuum(Server *s, bool verbose, bool patch_min_use);
+int server_vacuum(Server *s, bool verbose);
 void server_rotate(Server *s);
 int server_schedule_sync(Server *s, int priority);
-int server_flush_to_var(Server *s);
+int server_flush_to_var(Server *s, bool require_flag_file);
 void server_maybe_append_tags(Server *s);
 int server_process_datagram(sd_event_source *es, int fd, uint32_t revents, void *userdata);
+void server_space_usage_message(Server *s, JournalStorage *storage);
index 4ad16ee..77551dc 100644 (file)
@@ -393,6 +393,9 @@ static int stdout_stream_scan(StdoutStream *s, bool force_flush) {
 
         p = s->buffer;
         remaining = s->length;
+
+        /* XXX: This function does nothing if (s->length == 0) */
+
         for (;;) {
                 char *end;
                 size_t skip;
@@ -491,7 +494,7 @@ static int stdout_stream_install(Server *s, int fd, StdoutStream **ret) {
         if (r < 0)
                 return log_error_errno(r, "Failed to determine peer credentials: %m");
 
-        if (mac_selinux_have()) {
+        if (mac_selinux_use()) {
                 r = getpeersec(fd, &stream->label);
                 if (r < 0 && r != -EOPNOTSUPP)
                         (void) log_warning_errno(r, "Failed to determine peer security context: %m");
index 59b68df..0685563 100644 (file)
@@ -25,7 +25,7 @@
 
 #include "alloc-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "io-util.h"
 #include "journald-console.h"
 #include "journald-kmsg.h"
@@ -412,7 +412,7 @@ int server_open_syslog_socket(Server *s) {
                 return log_error_errno(errno, "SO_PASSCRED failed: %m");
 
 #ifdef HAVE_SELINUX
-        if (mac_selinux_have()) {
+        if (mac_selinux_use()) {
                 r = setsockopt(s->syslog_fd, SOL_SOCKET, SO_PASSSEC, &one, sizeof(one));
                 if (r < 0)
                         log_warning_errno(errno, "SO_PASSSEC failed: %m");
@@ -446,7 +446,8 @@ void server_maybe_warn_forward_syslog_missed(Server *s) {
         if (s->last_warn_forward_syslog_missed + WARN_FORWARD_SYSLOG_MISSED_USEC > n)
                 return;
 
-        server_driver_message(s, SD_MESSAGE_FORWARD_SYSLOG_MISSED,
+        server_driver_message(s,
+                              "MESSAGE_ID=" SD_MESSAGE_FORWARD_SYSLOG_MISSED_STR,
                               LOG_MESSAGE("Forwarding to syslog missed %u messages.",
                                           s->n_forward_syslog_missed),
                               NULL);
index 4d91faf..bfe53ce 100644 (file)
@@ -18,7 +18,7 @@
 ***/
 
 #include "alloc-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "journald-server.h"
 #include "journald-wall.h"
 #include "process-util.h"
@@ -57,7 +57,7 @@ void server_forward_wall(
 
         } else if (identifier) {
 
-                l = l_buf = strjoin(identifier, ": ", message, NULL);
+                l = l_buf = strjoin(identifier, ": ", message);
                 if (!l_buf) {
                         log_oom();
                         return;
index 272acb7..1aaef38 100644 (file)
@@ -22,7 +22,7 @@
 #include "sd-daemon.h"
 #include "sd-messages.h"
 
-#include "formats-util.h"
+#include "format-util.h"
 #include "journal-authenticate.h"
 #include "journald-kmsg.h"
 #include "journald-server.h"
@@ -51,15 +51,21 @@ int main(int argc, char *argv[]) {
         if (r < 0)
                 goto finish;
 
-        server_vacuum(&server, false, false);
-        server_flush_to_var(&server);
+        server_vacuum(&server, false);
+        server_flush_to_var(&server, true);
         server_flush_dev_kmsg(&server);
 
         log_debug("systemd-journald running as pid "PID_FMT, getpid());
-        server_driver_message(&server, SD_MESSAGE_JOURNAL_START,
+        server_driver_message(&server,
+                              "MESSAGE_ID=" SD_MESSAGE_JOURNAL_START_STR,
                               LOG_MESSAGE("Journal started"),
                               NULL);
 
+        /* Make sure to send the usage message *after* flushing the
+         * journal so entries from the runtime journals are ordered
+         * before this message. See #4190 for some details. */
+        server_space_usage_message(&server, NULL);
+
         for (;;) {
                 usec_t t = USEC_INFINITY, n;
 
@@ -77,7 +83,7 @@ int main(int argc, char *argv[]) {
                         if (server.oldest_file_usec + server.max_retention_usec < n) {
                                 log_info("Retention time reached.");
                                 server_rotate(&server);
-                                server_vacuum(&server, false, false);
+                                server_vacuum(&server, false);
                                 continue;
                         }
 
@@ -109,7 +115,8 @@ int main(int argc, char *argv[]) {
         }
 
         log_debug("systemd-journald stopped as pid "PID_FMT, getpid());
-        server_driver_message(&server, SD_MESSAGE_JOURNAL_STOP,
+        server_driver_message(&server,
+                              "MESSAGE_ID=" SD_MESSAGE_JOURNAL_STOP_STR,
                               LOG_MESSAGE("Journal stopped"),
                               NULL);
 
index d8f1a49..ec725ce 100644 (file)
@@ -48,6 +48,10 @@ on 1 byte), but shoehorning those bytes into integers efficiently is messy.
 # include <endian.h>    /* attempt to define endianness */
 #endif
 
+#if __GNUC__ >= 7
+_Pragma("GCC diagnostic ignored \"-Wimplicit-fallthrough\"")
+#endif
+
 /*
  * My best guess at if you are big-endian or little-endian.  This may
  * need adjustment.
diff --git a/src/journal/meson.build b/src/journal/meson.build
new file mode 100644 (file)
index 0000000..582f83a
--- /dev/null
@@ -0,0 +1,122 @@
+journal_internal_sources = files('''
+        audit-type.c
+        audit-type.h
+        catalog.c
+        catalog.h
+        compress.c
+        compress.h
+        journal-def.h
+        journal-file.c
+        journal-file.h
+        journal-send.c
+        journal-vacuum.c
+        journal-vacuum.h
+        journal-verify.c
+        journal-verify.h
+        lookup3.c
+        lookup3.h
+        mmap-cache.c
+        mmap-cache.h
+        sd-journal.c
+'''.split())
+
+if conf.get('HAVE_GCRYPT', false)
+        journal_internal_sources += files('''
+                journal-authenticate.c
+                journal-authenticate.h
+                fsprg.c
+                fsprg.h
+        '''.split())
+
+        journal_internal_sources += gcrypt_util_sources
+endif
+
+############################################################
+
+audit_type_includes = [config_h,
+                       missing_h,
+                       'linux/audit.h']
+if conf.get('HAVE_AUDIT', false)
+        audit_type_includes += 'libaudit.h'
+endif
+
+generate_audit_type_list = find_program('generate-audit_type-list.sh')
+audit_type_list_txt = custom_target(
+        'audit_type-list.txt',
+        output : 'audit_type-list.txt',
+        command : [generate_audit_type_list, cpp] + audit_type_includes,
+        capture : true)
+
+audit_type_to_name = custom_target(
+        'audit_type-to-name.h',
+        input : ['audit_type-to-name.awk', audit_type_list_txt],
+        output : 'audit_type-to-name.h',
+        command : [awk, '-f', '@INPUT0@', '@INPUT1@'],
+        capture : true)
+
+journal_internal_sources += [audit_type_to_name]
+
+############################################################
+
+libjournal_core_sources = files('''
+        journald-kmsg.c
+        journald-kmsg.h
+        journald-syslog.c
+        journald-syslog.h
+        journald-stream.c
+        journald-stream.h
+        journald-server.c
+        journald-server.h
+        journald-console.c
+        journald-console.h
+        journald-wall.c
+        journald-wall.h
+        journald-native.c
+        journald-native.h
+        journald-audit.c
+        journald-audit.h
+        journald-rate-limit.c
+        journald-rate-limit.h
+        journal-internal.h
+'''.split())
+
+systemd_journald_sources = files('''
+        journald.c
+        journald-server.h
+'''.split())
+
+journald_gperf_c = custom_target(
+        'journald-gperf.c',
+        input : 'journald-gperf.gperf',
+        output : 'journald-gperf.c',
+        command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@'])
+
+systemd_cat_sources = files('cat.c')
+
+journalctl_sources = files('journalctl.c')
+
+if conf.get('HAVE_QRENCODE', false)
+        journalctl_sources += files('journal-qrcode.c',
+                                    'journal-qrcode.h')
+endif
+
+install_data('journald.conf',
+             install_dir : pkgsysconfdir)
+
+meson.add_install_script(
+        'sh', '-c',
+        mkdir_p.format('/var/log/journal'))
+meson.add_install_script(
+        'sh', '-c',
+        'chown 0:0 $DESTDIR/var/log/journal &&
+         chmod 755 $DESTDIR/var/log/journal || :')
+if get_option('adm-group')
+        meson.add_install_script(
+                'sh', '-c',
+                'setfacl -nm g:adm:rx,d:g:adm:rx $DESTDIR/var/log/journal || :')
+endif
+if get_option('wheel-group')
+        meson.add_install_script(
+                'sh', '-c',
+                'setfacl -nm g:wheel:rx,d:g:wheel:rx $DESTDIR/var/log/journal || :')
+endif
index 293d270..5dfda73 100644 (file)
@@ -33,7 +33,6 @@
 
 typedef struct Window Window;
 typedef struct Context Context;
-typedef struct FileDescriptor FileDescriptor;
 
 struct Window {
         MMapCache *cache;
@@ -47,7 +46,7 @@ struct Window {
         uint64_t offset;
         size_t size;
 
-        FileDescriptor *fd;
+        MMapFileDescriptor *fd;
 
         LIST_FIELDS(Window, by_fd);
         LIST_FIELDS(Window, unused);
@@ -63,7 +62,7 @@ struct Context {
         LIST_FIELDS(Context, by_window);
 };
 
-struct FileDescriptor {
+struct MMapFileDescriptor {
         MMapCache *cache;
         int fd;
         bool sigbus;
@@ -158,24 +157,24 @@ static void window_free(Window *w) {
         free(w);
 }
 
-_pure_ static bool window_matches(Window *w, int fd, int prot, uint64_t offset, size_t size) {
+_pure_ static bool window_matches(Window *w, MMapFileDescriptor *f, int prot, uint64_t offset, size_t size) {
         assert(w);
-        assert(fd >= 0);
+        assert(f);
         assert(size > 0);
 
         return
                 w->fd &&
-                fd == w->fd->fd &&
+                f->fd == w->fd->fd &&
                 prot == w->prot &&
                 offset >= w->offset &&
                 offset + size <= w->offset + w->size;
 }
 
-static Window *window_add(MMapCache *m, FileDescriptor *fd, int prot, bool keep_always, uint64_t offset, size_t size, void *ptr) {
+static Window *window_add(MMapCache *m, MMapFileDescriptor *f, int prot, bool keep_always, uint64_t offset, size_t size, void *ptr) {
         Window *w;
 
         assert(m);
-        assert(fd);
+        assert(f);
 
         if (!m->last_unused || m->n_windows <= WINDOWS_MIN) {
 
@@ -193,14 +192,14 @@ static Window *window_add(MMapCache *m, FileDescriptor *fd, int prot, bool keep_
         }
 
         w->cache = m;
-        w->fd = fd;
+        w->fd = f;
         w->prot = prot;
         w->keep_always = keep_always;
         w->offset = offset;
         w->size = size;
         w->ptr = ptr;
 
-        LIST_PREPEND(by_fd, fd->windows, w);
+        LIST_PREPEND(by_fd, f->windows, w);
 
         return w;
 }
@@ -290,51 +289,7 @@ static void context_free(Context *c) {
         free(c);
 }
 
-static void fd_free(FileDescriptor *f) {
-        assert(f);
-
-        while (f->windows)
-                window_free(f->windows);
-
-        if (f->cache)
-                assert_se(hashmap_remove(f->cache->fds, FD_TO_PTR(f->fd)));
-
-        free(f);
-}
-
-static FileDescriptor* fd_add(MMapCache *m, int fd) {
-        FileDescriptor *f;
-        int r;
-
-        assert(m);
-        assert(fd >= 0);
-
-        f = hashmap_get(m->fds, FD_TO_PTR(fd));
-        if (f)
-                return f;
-
-        r = hashmap_ensure_allocated(&m->fds, NULL);
-        if (r < 0)
-                return NULL;
-
-        f = new0(FileDescriptor, 1);
-        if (!f)
-                return NULL;
-
-        f->cache = m;
-        f->fd = fd;
-
-        r = hashmap_put(m->fds, FD_TO_PTR(fd), f);
-        if (r < 0) {
-                free(f);
-                return NULL;
-        }
-
-        return f;
-}
-
 static void mmap_cache_free(MMapCache *m) {
-        FileDescriptor *f;
         int i;
 
         assert(m);
@@ -343,9 +298,6 @@ static void mmap_cache_free(MMapCache *m) {
                 if (m->contexts[i])
                         context_free(m->contexts[i]);
 
-        while ((f = hashmap_first(m->fds)))
-                fd_free(f);
-
         hashmap_free(m->fds);
 
         while (m->unused)
@@ -380,7 +332,7 @@ static int make_room(MMapCache *m) {
 
 static int try_context(
                 MMapCache *m,
-                int fd,
+                MMapFileDescriptor *f,
                 int prot,
                 unsigned context,
                 bool keep_always,
@@ -392,7 +344,7 @@ static int try_context(
 
         assert(m);
         assert(m->n_ref > 0);
-        assert(fd >= 0);
+        assert(f);
         assert(size > 0);
         assert(ret);
 
@@ -405,7 +357,7 @@ static int try_context(
         if (!c->window)
                 return 0;
 
-        if (!window_matches(c->window, fd, prot, offset, size)) {
+        if (!window_matches(c->window, f, prot, offset, size)) {
 
                 /* Drop the reference to the window, since it's unnecessary now */
                 context_detach_window(c);
@@ -423,7 +375,7 @@ static int try_context(
 
 static int find_mmap(
                 MMapCache *m,
-                int fd,
+                MMapFileDescriptor *f,
                 int prot,
                 unsigned context,
                 bool keep_always,
@@ -431,26 +383,19 @@ static int find_mmap(
                 size_t size,
                 void **ret) {
 
-        FileDescriptor *f;
         Window *w;
         Context *c;
 
         assert(m);
         assert(m->n_ref > 0);
-        assert(fd >= 0);
+        assert(f);
         assert(size > 0);
 
-        f = hashmap_get(m->fds, FD_TO_PTR(fd));
-        if (!f)
-                return 0;
-
-        assert(f->fd == fd);
-
         if (f->sigbus)
                 return -EIO;
 
         LIST_FOREACH(by_fd, w, f->windows)
-                if (window_matches(w, fd, prot, offset, size))
+                if (window_matches(w, f, prot, offset, size))
                         break;
 
         if (!w)
@@ -467,17 +412,17 @@ static int find_mmap(
         return 1;
 }
 
-static int mmap_try_harder(MMapCache *m, void *addr, int fd, int prot, int flags, uint64_t offset, size_t size, void **res) {
+static int mmap_try_harder(MMapCache *m, void *addr, MMapFileDescriptor *f, int prot, int flags, uint64_t offset, size_t size, void **res) {
         void *ptr;
 
         assert(m);
-        assert(fd >= 0);
+        assert(f);
         assert(res);
 
         for (;;) {
                 int r;
 
-                ptr = mmap(addr, size, prot, flags, fd, offset);
+                ptr = mmap(addr, size, prot, flags, f->fd, offset);
                 if (ptr != MAP_FAILED)
                         break;
                 if (errno != ENOMEM)
@@ -496,7 +441,7 @@ static int mmap_try_harder(MMapCache *m, void *addr, int fd, int prot, int flags
 
 static int add_mmap(
                 MMapCache *m,
-                int fd,
+                MMapFileDescriptor *f,
                 int prot,
                 unsigned context,
                 bool keep_always,
@@ -507,14 +452,13 @@ static int add_mmap(
 
         uint64_t woffset, wsize;
         Context *c;
-        FileDescriptor *f;
         Window *w;
         void *d;
         int r;
 
         assert(m);
         assert(m->n_ref > 0);
-        assert(fd >= 0);
+        assert(f);
         assert(size > 0);
         assert(ret);
 
@@ -547,7 +491,7 @@ static int add_mmap(
                         wsize = PAGE_ALIGN(st->st_size - woffset);
         }
 
-        r = mmap_try_harder(m, NULL, fd, prot, MAP_SHARED, woffset, wsize, &d);
+        r = mmap_try_harder(m, NULL, f, prot, MAP_SHARED, woffset, wsize, &d);
         if (r < 0)
                 return r;
 
@@ -555,10 +499,6 @@ static int add_mmap(
         if (!c)
                 goto outofmem;
 
-        f = fd_add(m, fd);
-        if (!f)
-                goto outofmem;
-
         w = window_add(m, f, prot, keep_always, woffset, wsize, d);
         if (!w)
                 goto outofmem;
@@ -577,7 +517,7 @@ outofmem:
 
 int mmap_cache_get(
                 MMapCache *m,
-                int fd,
+                MMapFileDescriptor *f,
                 int prot,
                 unsigned context,
                 bool keep_always,
@@ -590,20 +530,20 @@ int mmap_cache_get(
 
         assert(m);
         assert(m->n_ref > 0);
-        assert(fd >= 0);
+        assert(f);
         assert(size > 0);
         assert(ret);
         assert(context < MMAP_CACHE_MAX_CONTEXTS);
 
         /* Check whether the current context is the right one already */
-        r = try_context(m, fd, prot, context, keep_always, offset, size, ret);
+        r = try_context(m, f, prot, context, keep_always, offset, size, ret);
         if (r != 0) {
                 m->n_hit++;
                 return r;
         }
 
         /* Search for a matching mmap */
-        r = find_mmap(m, fd, prot, context, keep_always, offset, size, ret);
+        r = find_mmap(m, f, prot, context, keep_always, offset, size, ret);
         if (r != 0) {
                 m->n_hit++;
                 return r;
@@ -612,7 +552,7 @@ int mmap_cache_get(
         m->n_missed++;
 
         /* Create a new mmap */
-        return add_mmap(m, fd, prot, context, keep_always, offset, size, st, ret);
+        return add_mmap(m, f, prot, context, keep_always, offset, size, st, ret);
 }
 
 unsigned mmap_cache_get_hit(MMapCache *m) {
@@ -629,7 +569,7 @@ unsigned mmap_cache_get_missed(MMapCache *m) {
 
 static void mmap_cache_process_sigbus(MMapCache *m) {
         bool found = false;
-        FileDescriptor *f;
+        MMapFileDescriptor *f;
         Iterator i;
         int r;
 
@@ -690,36 +630,59 @@ static void mmap_cache_process_sigbus(MMapCache *m) {
         }
 }
 
-bool mmap_cache_got_sigbus(MMapCache *m, int fd) {
-        FileDescriptor *f;
-
+bool mmap_cache_got_sigbus(MMapCache *m, MMapFileDescriptor *f) {
         assert(m);
-        assert(fd >= 0);
+        assert(f);
 
         mmap_cache_process_sigbus(m);
 
-        f = hashmap_get(m->fds, FD_TO_PTR(fd));
-        if (!f)
-                return false;
-
         return f->sigbus;
 }
 
-void mmap_cache_close_fd(MMapCache *m, int fd) {
-        FileDescriptor *f;
+MMapFileDescriptor* mmap_cache_add_fd(MMapCache *m, int fd) {
+        MMapFileDescriptor *f;
+        int r;
 
         assert(m);
         assert(fd >= 0);
 
+        f = hashmap_get(m->fds, FD_TO_PTR(fd));
+        if (f)
+                return f;
+
+        r = hashmap_ensure_allocated(&m->fds, NULL);
+        if (r < 0)
+                return NULL;
+
+        f = new0(MMapFileDescriptor, 1);
+        if (!f)
+                return NULL;
+
+        f->cache = m;
+        f->fd = fd;
+
+        r = hashmap_put(m->fds, FD_TO_PTR(fd), f);
+        if (r < 0)
+                return mfree(f);
+
+        return f;
+}
+
+void mmap_cache_free_fd(MMapCache *m, MMapFileDescriptor *f) {
+        assert(m);
+        assert(f);
+
         /* Make sure that any queued SIGBUS are first dispatched, so
          * that we don't end up with a SIGBUS entry we cannot relate
          * to any existing memory map */
 
         mmap_cache_process_sigbus(m);
 
-        f = hashmap_get(m->fds, FD_TO_PTR(fd));
-        if (!f)
-                return;
+        while (f->windows)
+                window_free(f->windows);
+
+        if (f->cache)
+                assert_se(hashmap_remove(f->cache->fds, FD_TO_PTR(f->fd)));
 
-        fd_free(f);
+        free(f);
 }
index 199d944..7b33218 100644 (file)
@@ -26,6 +26,7 @@
 #define MMAP_CACHE_MAX_CONTEXTS 9
 
 typedef struct MMapCache MMapCache;
+typedef struct MMapFileDescriptor MMapFileDescriptor;
 
 MMapCache* mmap_cache_new(void);
 MMapCache* mmap_cache_ref(MMapCache *m);
@@ -33,7 +34,7 @@ MMapCache* mmap_cache_unref(MMapCache *m);
 
 int mmap_cache_get(
         MMapCache *m,
-        int fd,
+        MMapFileDescriptor *f,
         int prot,
         unsigned context,
         bool keep_always,
@@ -41,9 +42,10 @@ int mmap_cache_get(
         size_t size,
         struct stat *st,
         void **ret);
-void mmap_cache_close_fd(MMapCache *m, int fd);
+MMapFileDescriptor * mmap_cache_add_fd(MMapCache *m, int fd);
+void mmap_cache_free_fd(MMapCache *m, MMapFileDescriptor *f);
 
 unsigned mmap_cache_get_hit(MMapCache *m);
 unsigned mmap_cache_get_missed(MMapCache *m);
 
-bool mmap_cache_got_sigbus(MMapCache *m, int fd);
+bool mmap_cache_got_sigbus(MMapCache *m, MMapFileDescriptor *f);
index 75a0ffb..cd56470 100644 (file)
@@ -35,7 +35,7 @@
 #include "dirent-util.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "hashmap.h"
 #include "hostname-util.h"
@@ -387,7 +387,7 @@ _public_ int sd_journal_add_disjunction(sd_journal *j) {
 }
 
 static char *match_make_string(Match *m) {
-        char *p, *r;
+        char *p = NULL, *r;
         Match *i;
         bool enclose = false;
 
@@ -397,18 +397,15 @@ static char *match_make_string(Match *m) {
         if (m->type == MATCH_DISCRETE)
                 return strndup(m->data, m->size);
 
-        p = NULL;
         LIST_FOREACH(matches, i, m->matches) {
                 char *t, *k;
 
                 t = match_make_string(i);
-                if (!t) {
-                        free(p);
-                        return NULL;
-                }
+                if (!t)
+                        return mfree(p);
 
                 if (p) {
-                        k = strjoin(p, m->type == MATCH_OR_TERM ? " OR " : " AND ", t, NULL);
+                        k = strjoin(p, m->type == MATCH_OR_TERM ? " OR " : " AND ", t);
                         free(p);
                         free(t);
 
@@ -423,7 +420,7 @@ static char *match_make_string(Match *m) {
         }
 
         if (enclose) {
-                r = strjoin("(", p, ")", NULL);
+                r = strjoin("(", p, ")");
                 free(p);
                 return r;
         }
@@ -885,8 +882,11 @@ static int real_journal_next_skip(sd_journal *j, direction_t direction, uint64_t
         if (skip == 0) {
                 /* If this is not a discrete skip, then at least
                  * resolve the current location */
-                if (j->current_location.type != LOCATION_DISCRETE)
-                        return real_journal_next(j, direction);
+                if (j->current_location.type != LOCATION_DISCRETE) {
+                        r = real_journal_next(j, direction);
+                        if (r < 0)
+                                return r;
+                }
 
                 return 0;
         }
@@ -1419,7 +1419,7 @@ static int add_directory(sd_journal *j, const char *prefix, const char *dirname)
          * and reenumerates directory contents */
 
         if (dirname)
-                path = strjoin(prefix, "/", dirname, NULL);
+                path = strjoin(prefix, "/", dirname);
         else
                 path = strdup(prefix);
         if (!path) {
@@ -1664,6 +1664,9 @@ static int add_search_paths(sd_journal *j) {
         NULSTR_FOREACH(p, search_paths)
                 (void) add_root_directory(j, p, true);
 
+        if (!(j->flags & SD_JOURNAL_LOCAL_ONLY))
+                (void) add_root_directory(j, "/var/log/journal/remote", true);
+
         return 0;
 }
 
@@ -1719,9 +1722,16 @@ static sd_journal *journal_new(int flags, const char *path) {
         j->data_threshold = DEFAULT_DATA_THRESHOLD;
 
         if (path) {
-                j->path = strdup(path);
-                if (!j->path)
+                char *t;
+
+                t = strdup(path);
+                if (!t)
                         goto fail;
+
+                if (flags & SD_JOURNAL_OS_ROOT)
+                        j->prefix = t;
+                else
+                        j->path = t;
         }
 
         j->files = ordered_hashmap_new(&string_hash_ops);
@@ -1737,12 +1747,17 @@ fail:
         return NULL;
 }
 
+#define OPEN_ALLOWED_FLAGS                              \
+        (SD_JOURNAL_LOCAL_ONLY |                        \
+         SD_JOURNAL_RUNTIME_ONLY |                      \
+         SD_JOURNAL_SYSTEM | SD_JOURNAL_CURRENT_USER)
+
 _public_ int sd_journal_open(sd_journal **ret, int flags) {
         sd_journal *j;
         int r;
 
         assert_return(ret, -EINVAL);
-        assert_return((flags & ~(SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_RUNTIME_ONLY|SD_JOURNAL_SYSTEM|SD_JOURNAL_CURRENT_USER)) == 0, -EINVAL);
+        assert_return((flags & ~OPEN_ALLOWED_FLAGS) == 0, -EINVAL);
 
         j = journal_new(flags, NULL);
         if (!j)
@@ -1761,6 +1776,9 @@ fail:
         return r;
 }
 
+#define OPEN_CONTAINER_ALLOWED_FLAGS                    \
+        (SD_JOURNAL_LOCAL_ONLY | SD_JOURNAL_SYSTEM)
+
 _public_ int sd_journal_open_container(sd_journal **ret, const char *machine, int flags) {
         _cleanup_free_ char *root = NULL, *class = NULL;
         sd_journal *j;
@@ -1772,7 +1790,7 @@ _public_ int sd_journal_open_container(sd_journal **ret, const char *machine, in
 
         assert_return(machine, -EINVAL);
         assert_return(ret, -EINVAL);
-        assert_return((flags & ~(SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_SYSTEM)) == 0, -EINVAL);
+        assert_return((flags & ~OPEN_CONTAINER_ALLOWED_FLAGS) == 0, -EINVAL);
         assert_return(machine_name_is_valid(machine), -EINVAL);
 
         p = strjoina("/run/systemd/machines/", machine);
@@ -1787,13 +1805,10 @@ _public_ int sd_journal_open_container(sd_journal **ret, const char *machine, in
         if (!streq_ptr(class, "container"))
                 return -EIO;
 
-        j = journal_new(flags, NULL);
+        j = journal_new(flags, root);
         if (!j)
                 return -ENOMEM;
 
-        j->prefix = root;
-        root = NULL;
-
         r = add_search_paths(j);
         if (r < 0)
                 goto fail;
@@ -1806,13 +1821,17 @@ fail:
         return r;
 }
 
+#define OPEN_DIRECTORY_ALLOWED_FLAGS                    \
+        (SD_JOURNAL_OS_ROOT |                           \
+         SD_JOURNAL_SYSTEM | SD_JOURNAL_CURRENT_USER )
+
 _public_ int sd_journal_open_directory(sd_journal **ret, const char *path, int flags) {
         sd_journal *j;
         int r;
 
         assert_return(ret, -EINVAL);
         assert_return(path, -EINVAL);
-        assert_return((flags & ~SD_JOURNAL_OS_ROOT) == 0, -EINVAL);
+        assert_return((flags & ~OPEN_DIRECTORY_ALLOWED_FLAGS) == 0, -EINVAL);
 
         j = journal_new(flags, path);
         if (!j)
@@ -1861,6 +1880,10 @@ fail:
         return r;
 }
 
+#define OPEN_DIRECTORY_FD_ALLOWED_FLAGS         \
+        (SD_JOURNAL_OS_ROOT |                           \
+         SD_JOURNAL_SYSTEM | SD_JOURNAL_CURRENT_USER )
+
 _public_ int sd_journal_open_directory_fd(sd_journal **ret, int fd, int flags) {
         sd_journal *j;
         struct stat st;
@@ -1868,7 +1891,7 @@ _public_ int sd_journal_open_directory_fd(sd_journal **ret, int fd, int flags) {
 
         assert_return(ret, -EINVAL);
         assert_return(fd >= 0, -EBADF);
-        assert_return((flags & ~SD_JOURNAL_OS_ROOT) == 0, -EINVAL);
+        assert_return((flags & ~OPEN_DIRECTORY_FD_ALLOWED_FLAGS) == 0, -EINVAL);
 
         if (fstat(fd, &st) < 0)
                 return -errno;
@@ -2290,6 +2313,8 @@ _public_ int sd_journal_get_fd(sd_journal *j) {
          * inotify */
         if (j->no_new_files)
                 r = add_current_paths(j);
+        else if (j->flags & SD_JOURNAL_OS_ROOT)
+                r = add_search_paths(j);
         else if (j->toplevel_fd >= 0)
                 r = add_root_directory(j, NULL, false);
         else if (j->path)
@@ -2402,6 +2427,7 @@ _public_ int sd_journal_process(sd_journal *j) {
         assert_return(!journal_pid_changed(j), -ECHILD);
 
         j->last_process_usec = now(CLOCK_MONOTONIC);
+        j->last_invalidate_counter = j->current_invalidate_counter;
 
         for (;;) {
                 union inotify_event_buffer buffer;
index 898c876..b7d9e7b 100644 (file)
@@ -55,7 +55,7 @@ static Hashmap * test_import(const char* contents, ssize_t size, int code) {
 
         assert_se(h = hashmap_new(&catalog_hash_ops));
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
         assert_se(write(fd, contents, size) == size);
 
@@ -182,7 +182,7 @@ static void test_catalog_update(void) {
         static char name[] = "/tmp/test-catalog.XXXXXX";
         int r;
 
-        r = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        r = mkostemp_safe(name);
         assert_se(r >= 0);
 
         database = name;
index 6f6d714..4fb93de 100644 (file)
@@ -30,6 +30,8 @@ typedef int (compress_t)(const void *src, uint64_t src_size, void *dst,
 typedef int (decompress_t)(const void *src, uint64_t src_size,
                            void **dst, size_t *dst_alloc_size, size_t* dst_size, size_t dst_max);
 
+#if defined(HAVE_XZ) || defined(HAVE_LZ4)
+
 static usec_t arg_duration = 2 * USEC_PER_SEC;
 static size_t arg_start;
 
@@ -151,8 +153,10 @@ static void test_compress_decompress(const char* label, const char* type,
                  100 - compressed * 100. / total,
                  skipped);
 }
+#endif
 
 int main(int argc, char *argv[]) {
+#if defined(HAVE_XZ) || defined(HAVE_LZ4)
         const char *i;
 
         log_set_max_level(LOG_INFO);
@@ -177,4 +181,7 @@ int main(int argc, char *argv[]) {
 #endif
         }
         return 0;
+#else
+        return EXIT_TEST_SKIP;
+#endif
 }
index 68c9a4d..92108a8 100644 (file)
@@ -54,6 +54,7 @@ typedef int (decompress_sw_t)(const void *src, uint64_t src_size,
 typedef int (compress_stream_t)(int fdf, int fdt, uint64_t max_bytes);
 typedef int (decompress_stream_t)(int fdf, int fdt, uint64_t max_size);
 
+#if defined(HAVE_XZ) || defined(HAVE_LZ4)
 static void test_compress_decompress(int compression,
                                      compress_blob_t compress,
                                      decompress_blob_t decompress,
@@ -109,7 +110,7 @@ static void test_decompress_startswith(int compression,
         size_t csize, usize = 0, len;
         int r;
 
-        log_info("/* testing decompress_startswith with %s on %.20s text*/",
+        log_info("/* testing decompress_startswith with %s on %.20s text */",
                  object_compressed_to_string(compression), data);
 
 #define BUFSIZE_1 512
@@ -167,7 +168,7 @@ static void test_compress_stream(int compression,
 
         log_debug("/* test compression */");
 
-        assert_se((dst = mkostemp_safe(pattern, O_RDWR|O_CLOEXEC)) >= 0);
+        assert_se((dst = mkostemp_safe(pattern)) >= 0);
 
         assert_se(compress(src, dst, -1) == 0);
 
@@ -178,7 +179,7 @@ static void test_compress_stream(int compression,
 
         log_debug("/* test decompression */");
 
-        assert_se((dst2 = mkostemp_safe(pattern2, O_RDWR|O_CLOEXEC)) >= 0);
+        assert_se((dst2 = mkostemp_safe(pattern2)) >= 0);
 
         assert_se(stat(srcfile, &st) == 0);
 
@@ -203,6 +204,7 @@ static void test_compress_stream(int compression,
         assert_se(unlink(pattern) == 0);
         assert_se(unlink(pattern2) == 0);
 }
+#endif
 
 #ifdef HAVE_LZ4
 static void test_lz4_decompress_partial(void) {
@@ -216,7 +218,11 @@ static void test_lz4_decompress_partial(void) {
         memset(huge, 'x', HUGE_SIZE);
         memcpy(huge, "HUGE=", 5);
 
+#if LZ4_VERSION_NUMBER >= 10700
+        r = LZ4_compress_default(huge, buf, HUGE_SIZE, buf_size);
+#else
         r = LZ4_compress_limitedOutput(huge, buf, HUGE_SIZE, buf_size);
+#endif
         assert_se(r >= 0);
         compressed = r;
         log_info("Compressed %i → %zu", HUGE_SIZE, compressed);
@@ -243,10 +249,14 @@ static void test_lz4_decompress_partial(void) {
 #endif
 
 int main(int argc, char *argv[]) {
+#if defined(HAVE_XZ) || defined(HAVE_LZ4)
         const char text[] =
                 "text\0foofoofoofoo AAAA aaaaaaaaa ghost busters barbarbar FFF"
                 "foofoofoofoo AAAA aaaaaaaaa ghost busters barbarbar FFF";
 
+        /* The file to test compression on can be specified as the first argument */
+        const char *srcfile = argc > 1 ? argv[1] : argv[0];
+
         char data[512] = "random\0";
 
         char huge[4096*1024];
@@ -275,7 +285,7 @@ int main(int argc, char *argv[]) {
                                    huge, sizeof(huge), true);
 
         test_compress_stream(OBJECT_COMPRESSED_XZ, "xzcat",
-                             compress_stream_xz, decompress_stream_xz, argv[0]);
+                             compress_stream_xz, decompress_stream_xz, srcfile);
 #else
         log_info("/* XZ test skipped */");
 #endif
@@ -297,7 +307,7 @@ int main(int argc, char *argv[]) {
                                    huge, sizeof(huge), true);
 
         test_compress_stream(OBJECT_COMPRESSED_LZ4, "lz4cat",
-                             compress_stream_lz4, decompress_stream_lz4, argv[0]);
+                             compress_stream_lz4, decompress_stream_lz4, srcfile);
 
         test_lz4_decompress_partial();
 #else
@@ -305,4 +315,7 @@ int main(int argc, char *argv[]) {
 #endif
 
         return 0;
+#else
+        return EXIT_TEST_SKIP;
+#endif
 }
index 5e063f4..35cae23 100644 (file)
 
 static bool arg_keep = false;
 
-noreturn static void log_assert_errno(const char *text, int eno, const char *file, int line, const char *func) {
-        log_internal(LOG_CRIT, 0, file, line, func,
-                     "'%s' failed at %s:%u (%s): %s.",
-                     text, file, line, func, strerror(eno));
+noreturn static void log_assert_errno(const char *text, int error, const char *file, int line, const char *func) {
+        log_internal(LOG_CRIT, error, file, line, func,
+                     "'%s' failed at %s:%u (%s): %m", text, file, line, func);
         abort();
 }
 
index 009aabf..c51b069 100644 (file)
@@ -29,6 +29,7 @@
 #include "util.h"
 
 int main(int argc, char *argv[]) {
+        MMapFileDescriptor *fx;
         int x, y, z, r;
         char px[] = "/tmp/testmmapXXXXXXX", py[] = "/tmp/testmmapYXXXXXX", pz[] = "/tmp/testmmapZXXXXXX";
         MMapCache *m;
@@ -36,39 +37,42 @@ int main(int argc, char *argv[]) {
 
         assert_se(m = mmap_cache_new());
 
-        x = mkostemp_safe(px, O_RDWR|O_CLOEXEC);
+        x = mkostemp_safe(px);
         assert_se(x >= 0);
         unlink(px);
 
-        y = mkostemp_safe(py, O_RDWR|O_CLOEXEC);
+        assert_se(fx = mmap_cache_add_fd(m, x));
+
+        y = mkostemp_safe(py);
         assert_se(y >= 0);
         unlink(py);
 
-        z = mkostemp_safe(pz, O_RDWR|O_CLOEXEC);
+        z = mkostemp_safe(pz);
         assert_se(z >= 0);
         unlink(pz);
 
-        r = mmap_cache_get(m, x, PROT_READ, 0, false, 1, 2, NULL, &p);
+        r = mmap_cache_get(m, fx, PROT_READ, 0, false, 1, 2, NULL, &p);
         assert_se(r >= 0);
 
-        r = mmap_cache_get(m, x, PROT_READ, 0, false, 2, 2, NULL, &q);
+        r = mmap_cache_get(m, fx, PROT_READ, 0, false, 2, 2, NULL, &q);
         assert_se(r >= 0);
 
         assert_se((uint8_t*) p + 1 == (uint8_t*) q);
 
-        r = mmap_cache_get(m, x, PROT_READ, 1, false, 3, 2, NULL, &q);
+        r = mmap_cache_get(m, fx, PROT_READ, 1, false, 3, 2, NULL, &q);
         assert_se(r >= 0);
 
         assert_se((uint8_t*) p + 2 == (uint8_t*) q);
 
-        r = mmap_cache_get(m, x, PROT_READ, 0, false, 16ULL*1024ULL*1024ULL, 2, NULL, &p);
+        r = mmap_cache_get(m, fx, PROT_READ, 0, false, 16ULL*1024ULL*1024ULL, 2, NULL, &p);
         assert_se(r >= 0);
 
-        r = mmap_cache_get(m, x, PROT_READ, 1, false, 16ULL*1024ULL*1024ULL+1, 2, NULL, &q);
+        r = mmap_cache_get(m, fx, PROT_READ, 1, false, 16ULL*1024ULL*1024ULL+1, 2, NULL, &q);
         assert_se(r >= 0);
 
         assert_se((uint8_t*) p + 1 == (uint8_t*) q);
 
+        mmap_cache_free_fd(m, fx);
         mmap_cache_unref(m);
 
         safe_close(x);
index 8985780..704c1bd 100644 (file)
@@ -7,4 +7,13 @@ PATH=/bin:/usr/bin:/sbin:/usr/sbin
 [[ $1 == "add" ]] || exit 0
 [[ $2 ]] || exit 1
 
-exec depmod -a "$2"
+case "$1" in
+    add)
+        exec depmod -a "$2"
+        ;;
+    remove)
+        exec rm -f /lib/modules/"$2"/modules.{alias{,.bin},builtin.bin,dep{,.bin},devname,softdep,symbols{,.bin}}
+        ;;
+    *)
+        exit 0
+esac
index b0842c9..c2d12be 100644 (file)
@@ -9,13 +9,11 @@ KERNEL_VERSION="$2"
 BOOT_DIR_ABS="$3"
 KERNEL_IMAGE="$4"
 
-if [[ -f /etc/machine-id ]]; then
-    read MACHINE_ID < /etc/machine-id
+if ! [[ $KERNEL_INSTALL_MACHINE_ID ]]; then
+    exit 0
 fi
 
-if ! [[ $MACHINE_ID ]]; then
-    exit 1
-fi
+MACHINE_ID=$KERNEL_INSTALL_MACHINE_ID
 
 BOOT_DIR="/$MACHINE_ID/$KERNEL_VERSION"
 BOOT_ROOT=${BOOT_DIR_ABS%$BOOT_DIR}
index cce3273..d6b062b 100644 (file)
@@ -20,6 +20,7 @@
 # along with systemd; If not, see <http://www.gnu.org/licenses/>.
 
 PATH=/bin:/usr/bin:/sbin:/usr/sbin
+SKIP_REMAINING=77
 
 usage()
 {
@@ -34,7 +35,7 @@ dropindirs_sort()
     local -a files
     local f d i
 
-    readarray -t files < <(
+    readarray -t files <<<"$(
         for d in "$@"; do
             for i in "$d/"*"$suffix"; do
                 if [[ -e "$i" ]]; then
@@ -42,7 +43,7 @@ dropindirs_sort()
                 fi
             done
         done | sort -Vu
-    )
+    )"
 
     for f in "${files[@]}"; do
         for d in "$@"; do
@@ -77,33 +78,37 @@ if [[ -f /etc/machine-id ]]; then
     read MACHINE_ID < /etc/machine-id
 fi
 
-if ! [[ $MACHINE_ID ]]; then
-    echo "Could not determine your machine ID from /etc/machine-id." >&2
-    echo "Please run 'systemd-machine-id-setup' as root. See man:machine-id(5)" >&2
-    exit 1
-fi
-
 if [[ ! $COMMAND ]] || [[ ! $KERNEL_VERSION ]]; then
     echo "Not enough arguments" >&2
     exit 1
 fi
 
-if [[ -d /boot/loader/entries ]] || [[ -d /boot/$MACHINE_ID ]]; then
+if ! [[ $MACHINE_ID ]]; then
+    BOOT_DIR_ABS=$(mktemp -d /tmp/kernel-install.XXXXX) || exit 1
+    trap "rm -rf '$BOOT_DIR_ABS'" EXIT INT QUIT PIPE
+elif [[ -d /efi/loader/entries ]] || [[ -d /efi/$MACHINE_ID ]]; then
+    BOOT_DIR_ABS="/efi/$MACHINE_ID/$KERNEL_VERSION"
+elif [[ -d /boot/loader/entries ]] || [[ -d /boot/$MACHINE_ID ]]; then
     BOOT_DIR_ABS="/boot/$MACHINE_ID/$KERNEL_VERSION"
-elif [[ -d /boot/efi/loader/entries ]] || [[ -d /boot/efi/$MACHINE_ID ]] \
-         || mountpoint -q /boot/efi; then
+elif [[ -d /boot/efi/loader/entries ]] || [[ -d /boot/efi/$MACHINE_ID ]]; then
+    BOOT_DIR_ABS="/boot/efi/$MACHINE_ID/$KERNEL_VERSION"
+elif mountpoint -q /efi; then
+    BOOT_DIR_ABS="/efi/$MACHINE_ID/$KERNEL_VERSION"
+elif mountpoint -q /boot/efi; then
     BOOT_DIR_ABS="/boot/efi/$MACHINE_ID/$KERNEL_VERSION"
 else
     BOOT_DIR_ABS="/boot/$MACHINE_ID/$KERNEL_VERSION"
 fi
 
+export KERNEL_INSTALL_MACHINE_ID=$MACHINE_ID
+
 ret=0
 
-readarray -t PLUGINS < <(
+readarray -t PLUGINS <<<"$(
     dropindirs_sort ".install" \
         "/etc/kernel/install.d" \
         "/usr/lib/kernel/install.d"
-)
+)"
 
 case $COMMAND in
     add)
@@ -120,16 +125,34 @@ case $COMMAND in
         for f in "${PLUGINS[@]}"; do
             if [[ -x $f ]]; then
                 "$f" add "$KERNEL_VERSION" "$BOOT_DIR_ABS" "$KERNEL_IMAGE"
-                ((ret+=$?))
+                x=$?
+                if [[ $x == $SKIP_REMAINING ]]; then
+                    ret=0
+                    break
+                fi
+                ((ret+=$x))
             fi
         done
+
+        if ! [[ $MACHINE_ID ]] && ! rmdir "$BOOT_DIR_ABS"; then
+            echo "Warning: In kernel-install plugins, requiring BOOT_DIR_ABS to be preset is deprecated." >&2
+            echo "         All plugins should not put anything in BOOT_DIR_ABS if the environment" >&2
+            echo "         variable KERNEL_INSTALL_MACHINE_ID is empty." >&2
+            rm -rf "$BOOT_DIR_ABS"
+            ((ret+=$?))
+        fi
         ;;
 
     remove)
         for f in "${PLUGINS[@]}"; do
             if [[ -x $f ]]; then
                 "$f" remove "$KERNEL_VERSION" "$BOOT_DIR_ABS"
-                ((ret+=$?))
+                x=$?
+                if [[ $x == $SKIP_REMAINING ]]; then
+                    ret=0
+                    break
+                fi
+                ((ret+=$x))
             fi
         done
 
diff --git a/src/kernel-install/meson.build b/src/kernel-install/meson.build
new file mode 100644 (file)
index 0000000..ede3323
--- /dev/null
@@ -0,0 +1,11 @@
+install_data('kernel-install',
+             install_mode : 'rwxr-xr-x',
+             install_dir : bindir)
+
+install_data('50-depmod.install',
+             '90-loaderentry.install',
+             install_mode : 'rwxr-xr-x',
+             install_dir : kernelinstalldir)
+
+meson.add_install_script('sh', '-c',
+                         mkdir_p.format(join_paths(sysconfdir, 'kernel/install.d')))
index 02028bf..2e02b3f 100644 (file)
@@ -58,7 +58,7 @@ int arp_network_bind_raw_socket(int ifindex, be32_t address, const struct ether_
                 BPF_STMT(BPF_ALU + BPF_XOR + BPF_X, 0),                                        /* A xor X */
                 BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0, 0, 1),                                  /* A == 0 ? */
                 BPF_STMT(BPF_RET + BPF_K, 0),                                                  /* ignore */
-                /* Sender Protocol Address or Target Protocol Address must be equal to the one we care about*/
+                /* Sender Protocol Address or Target Protocol Address must be equal to the one we care about */
                 BPF_STMT(BPF_LD + BPF_IMM, htobe32(address)),                                  /* A <- clients IP */
                 BPF_STMT(BPF_MISC + BPF_TAX, 0),                                               /* X <- A */
                 BPF_STMT(BPF_LD + BPF_W + BPF_ABS, offsetof(struct ether_arp, arp_spa)),       /* A <- SPA */
index 99f6908..3fdf02d 100644 (file)
 #include "dhcp-protocol.h"
 #include "socket-util.h"
 
-int dhcp_network_bind_raw_socket(int index, union sockaddr_union *link,
+int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link,
                                  uint32_t xid, const uint8_t *mac_addr,
-                                 size_t mac_addr_len, uint16_t arp_type);
-int dhcp_network_bind_udp_socket(be32_t address, uint16_t port);
+                                 size_t mac_addr_len, uint16_t arp_type,
+                                 uint16_t port);
+int dhcp_network_bind_udp_socket(int ifindex, be32_t address, uint16_t port);
 int dhcp_network_send_raw_socket(int s, const union sockaddr_union *link,
                                  const void *packet, size_t len);
 int dhcp_network_send_udp_socket(int s, be32_t address, uint16_t port,
@@ -57,7 +58,7 @@ void dhcp_packet_append_ip_headers(DHCPPacket *packet, be32_t source_addr,
                                    uint16_t source, be32_t destination_addr,
                                    uint16_t destination, uint16_t len);
 
-int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len, bool checksum);
+int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len, bool checksum, uint16_t port);
 
 /* If we are invoking callbacks of a dhcp-client, ensure unreffing the
  * client from the callback doesn't destroy the object we are working
index 82cae23..7847ce0 100644 (file)
@@ -75,6 +75,7 @@ struct sd_dhcp_lease {
         uint16_t mtu; /* 0 if unset */
 
         char *domainname;
+        char **search_domains;
         char *hostname;
         char *root_path;
 
@@ -92,6 +93,7 @@ struct sd_dhcp_lease {
 int dhcp_lease_new(sd_dhcp_lease **ret);
 
 int dhcp_lease_parse_options(uint8_t code, uint8_t len, const void *option, void *userdata);
+int dhcp_lease_parse_search_domains(const uint8_t *option, size_t len, char ***domains);
 int dhcp_lease_insert_private_option(sd_dhcp_lease *lease, uint8_t tag, const void *data, uint8_t len);
 
 int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease);
index a9f5a0a..65405dc 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <errno.h>
 #include <net/ethernet.h>
+#include <net/if.h>
 #include <net/if_arp.h>
 #include <stdio.h>
 #include <string.h>
@@ -36,7 +37,8 @@ static int _bind_raw_socket(int ifindex, union sockaddr_union *link,
                             size_t mac_addr_len,
                             const uint8_t *bcast_addr,
                             const struct ether_addr *eth_mac,
-                            uint16_t arp_type, uint8_t dhcp_hlen) {
+                            uint16_t arp_type, uint8_t dhcp_hlen,
+                            uint16_t port) {
         struct sock_filter filter[] = {
                 BPF_STMT(BPF_LD + BPF_W + BPF_LEN, 0),                                 /* A <- packet length */
                 BPF_JUMP(BPF_JMP + BPF_JGE + BPF_K, sizeof(DHCPPacket), 1, 0),         /* packet >= DHCPPacket ? */
@@ -53,7 +55,7 @@ static int _bind_raw_socket(int ifindex, union sockaddr_union *link,
                 BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0, 1, 0),                          /* A == 0 ? */
                 BPF_STMT(BPF_RET + BPF_K, 0),                                          /* ignore */
                 BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(DHCPPacket, udp.dest)),    /* A <- UDP destination port */
-                BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, DHCP_PORT_CLIENT, 1, 0),           /* UDP destination port == DHCP client port ? */
+                BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, port, 1, 0),                       /* UDP destination port == DHCP client port ? */
                 BPF_STMT(BPF_RET + BPF_K, 0),                                          /* ignore */
                 BPF_STMT(BPF_LD + BPF_B + BPF_ABS, offsetof(DHCPPacket, dhcp.op)),     /* A <- DHCP op */
                 BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, BOOTREPLY, 1, 0),                  /* op == BOOTREPLY ? */
@@ -125,7 +127,8 @@ static int _bind_raw_socket(int ifindex, union sockaddr_union *link,
 
 int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link,
                                  uint32_t xid, const uint8_t *mac_addr,
-                                 size_t mac_addr_len, uint16_t arp_type) {
+                                 size_t mac_addr_len, uint16_t arp_type,
+                                 uint16_t port) {
         static const uint8_t eth_bcast[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
         /* Default broadcast address for IPoIB */
         static const uint8_t ib_bcast[] = {
@@ -151,16 +154,17 @@ int dhcp_network_bind_raw_socket(int ifindex, union sockaddr_union *link,
                 return -EINVAL;
 
         return _bind_raw_socket(ifindex, link, xid, mac_addr, mac_addr_len,
-                                bcast_addr, &eth_mac, arp_type, dhcp_hlen);
+                                bcast_addr, &eth_mac, arp_type, dhcp_hlen, port);
 }
 
-int dhcp_network_bind_udp_socket(be32_t address, uint16_t port) {
+int dhcp_network_bind_udp_socket(int ifindex, be32_t address, uint16_t port) {
         union sockaddr_union src = {
                 .in.sin_family = AF_INET,
                 .in.sin_port = htobe16(port),
                 .in.sin_addr.s_addr = address,
         };
         _cleanup_close_ int s = -1;
+        char ifname[IF_NAMESIZE] = "";
         int r, on = 1, tos = IPTOS_CLASS_CS6;
 
         s = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0);
@@ -175,6 +179,15 @@ int dhcp_network_bind_udp_socket(be32_t address, uint16_t port) {
         if (r < 0)
                 return -errno;
 
+        if (ifindex > 0) {
+                if (if_indextoname(ifindex, ifname) == 0)
+                        return -errno;
+
+                r = setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, ifname, strlen(ifname));
+                if (r < 0)
+                        return -errno;
+        }
+
         if (address == INADDR_ANY) {
                 r = setsockopt(s, IPPROTO_IP, IP_PKTINFO, &on, sizeof(on));
                 if (r < 0)
@@ -183,6 +196,7 @@ int dhcp_network_bind_udp_socket(be32_t address, uint16_t port) {
                 r = setsockopt(s, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
                 if (r < 0)
                         return -errno;
+
         } else {
                 r = setsockopt(s, IPPROTO_IP, IP_FREEBIND, &on, sizeof(on));
                 if (r < 0)
index 8be7740..40442b3 100644 (file)
@@ -114,7 +114,7 @@ void dhcp_packet_append_ip_headers(DHCPPacket *packet, be32_t source_addr,
         packet->ip.check = dhcp_packet_checksum((uint8_t*)&packet->ip, DHCP_IP_SIZE);
 }
 
-int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len, bool checksum) {
+int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len, bool checksum, uint16_t port) {
         size_t hdrlen;
 
         assert(packet);
@@ -160,10 +160,10 @@ int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len, bool checksum) {
                 return -EINVAL;
         }
 
-        if (be16toh(packet->udp.dest) != DHCP_PORT_CLIENT) {
+        if (be16toh(packet->udp.dest) != port) {
                 log_debug("ignoring packet: to port %u, which "
                           "is not the DHCP client port (%u)",
-                          be16toh(packet->udp.dest), DHCP_PORT_CLIENT);
+                          be16toh(packet->udp.dest), port);
                 return -EINVAL;
         }
 
index 5462e03..f8056db 100644 (file)
@@ -339,7 +339,7 @@ int dhcp6_option_parse_ip6addrs(uint8_t *optval, uint16_t optlen,
 
 int dhcp6_option_parse_domainname(const uint8_t *optval, uint16_t optlen, char ***str_arr) {
         size_t pos = 0, idx = 0;
-        _cleanup_free_ char **names = NULL;
+        _cleanup_strv_free_ char **names = NULL;
         int r;
 
         assert_return(optlen > 1, -ENODATA);
index c2e4b0e..7fbebd6 100644 (file)
@@ -32,6 +32,7 @@
 #include "fd-util.h"
 #include "icmp6-util.h"
 #include "socket-util.h"
+#include "in-addr-util.h"
 
 #define IN6ADDR_ALL_ROUTERS_MULTICAST_INIT \
         { { { 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
         { { { 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } } }
 
-int icmp6_bind_router_solicitation(int index) {
-        struct icmp6_filter filter = { };
-        struct ipv6_mreq mreq = {
-                .ipv6mr_multiaddr = IN6ADDR_ALL_NODES_MULTICAST_INIT,
-                .ipv6mr_interface = index,
-        };
+static int icmp6_bind_router_message(const struct icmp6_filter *filter,
+                                     const struct ipv6_mreq *mreq) {
+        int index = mreq->ipv6mr_interface;
         _cleanup_close_ int s = -1;
         char ifname[IF_NAMESIZE] = "";
         static const int zero = 0, one = 1, hops = 255;
@@ -56,9 +54,11 @@ int icmp6_bind_router_solicitation(int index) {
         if (s < 0)
                 return -errno;
 
-        ICMP6_FILTER_SETBLOCKALL(&filter);
-        ICMP6_FILTER_SETPASS(ND_ROUTER_ADVERT, &filter);
-        r = setsockopt(s, IPPROTO_ICMPV6, ICMP6_FILTER, &filter, sizeof(filter));
+        r = setsockopt(s, IPPROTO_ICMPV6, ICMP6_FILTER, filter, sizeof(*filter));
+        if (r < 0)
+                return -errno;
+
+        r = setsockopt(s, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, mreq, sizeof(*mreq));
         if (r < 0)
                 return -errno;
 
@@ -78,7 +78,7 @@ int icmp6_bind_router_solicitation(int index) {
         if (r < 0)
                 return -errno;
 
-        r = setsockopt(s, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
+        r = setsockopt(s, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &hops, sizeof(hops));
         if (r < 0)
                 return -errno;
 
@@ -102,6 +102,32 @@ int icmp6_bind_router_solicitation(int index) {
         return r;
 }
 
+int icmp6_bind_router_solicitation(int index) {
+        struct icmp6_filter filter = {};
+        struct ipv6_mreq mreq = {
+                .ipv6mr_multiaddr = IN6ADDR_ALL_NODES_MULTICAST_INIT,
+                .ipv6mr_interface = index,
+        };
+
+        ICMP6_FILTER_SETBLOCKALL(&filter);
+        ICMP6_FILTER_SETPASS(ND_ROUTER_ADVERT, &filter);
+
+        return icmp6_bind_router_message(&filter, &mreq);
+}
+
+int icmp6_bind_router_advertisement(int index) {
+        struct icmp6_filter filter = {};
+        struct ipv6_mreq mreq = {
+                .ipv6mr_multiaddr = IN6ADDR_ALL_ROUTERS_MULTICAST_INIT,
+                .ipv6mr_interface = index,
+        };
+
+        ICMP6_FILTER_SETBLOCKALL(&filter);
+        ICMP6_FILTER_SETPASS(ND_ROUTER_SOLICIT, &filter);
+
+        return icmp6_bind_router_message(&filter, &mreq);
+}
+
 int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr) {
         struct sockaddr_in6 dst = {
                 .sin6_family = AF_INET6,
@@ -139,3 +165,74 @@ int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr) {
 
         return 0;
 }
+
+int icmp6_receive(int fd, void *buffer, size_t size, struct in6_addr *dst,
+                  triple_timestamp *timestamp) {
+        union {
+                struct cmsghdr cmsghdr;
+                uint8_t buf[CMSG_SPACE(sizeof(int)) + /* ttl */
+                            CMSG_SPACE(sizeof(struct timeval))];
+        } control = {};
+        struct iovec iov = {};
+        union sockaddr_union sa = {};
+        struct msghdr msg = {
+                .msg_name = &sa.sa,
+                .msg_namelen = sizeof(sa),
+                .msg_iov = &iov,
+                .msg_iovlen = 1,
+                .msg_control = &control,
+                .msg_controllen = sizeof(control),
+        };
+        struct cmsghdr *cmsg;
+        ssize_t len;
+
+        iov.iov_base = buffer;
+        iov.iov_len = size;
+
+        len = recvmsg(fd, &msg, MSG_DONTWAIT);
+        if (len < 0) {
+                if (errno == EAGAIN || errno == EINTR)
+                        return 0;
+
+                return -errno;
+        }
+
+        if ((size_t) len != size)
+                return -EINVAL;
+
+        if (msg.msg_namelen == sizeof(struct sockaddr_in6) &&
+            sa.in6.sin6_family == AF_INET6)  {
+
+                *dst = sa.in6.sin6_addr;
+                if (in_addr_is_link_local(AF_INET6, (union in_addr_union*) dst) <= 0)
+                        return -EADDRNOTAVAIL;
+
+        } else if (msg.msg_namelen > 0)
+                return -EPFNOSUPPORT;
+
+        /* namelen == 0 only happens when running the test-suite over a socketpair */
+
+        assert(!(msg.msg_flags & MSG_CTRUNC));
+        assert(!(msg.msg_flags & MSG_TRUNC));
+
+        CMSG_FOREACH(cmsg, &msg) {
+                if (cmsg->cmsg_level == SOL_IPV6 &&
+                    cmsg->cmsg_type == IPV6_HOPLIMIT &&
+                    cmsg->cmsg_len == CMSG_LEN(sizeof(int))) {
+                        int hops = *(int*) CMSG_DATA(cmsg);
+
+                        if (hops != 255)
+                                return -EMULTIHOP;
+                }
+
+                if (cmsg->cmsg_level == SOL_SOCKET &&
+                    cmsg->cmsg_type == SO_TIMESTAMP &&
+                    cmsg->cmsg_len == CMSG_LEN(sizeof(struct timeval)))
+                        triple_timestamp_from_realtime(timestamp, timeval_load((struct timeval*) CMSG_DATA(cmsg)));
+        }
+
+        if (!triple_timestamp_is_set(timestamp))
+                triple_timestamp_get(timestamp);
+
+        return 0;
+}
index 2b4dbc7..16b8be8 100644 (file)
 
 #include <net/ethernet.h>
 
+#include "time-util.h"
+
+#define IN6ADDR_ALL_ROUTERS_MULTICAST_INIT \
+        { { { 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 } } }
+
+#define IN6ADDR_ALL_NODES_MULTICAST_INIT \
+        { { { 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } } }
+
 int icmp6_bind_router_solicitation(int index);
+int icmp6_bind_router_advertisement(int index);
 int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr);
+int icmp6_receive(int fd, void *buffer, size_t size, struct in6_addr *dst,
+                  triple_timestamp *timestamp);
index 53e2937..f1fecba 100644 (file)
@@ -249,10 +249,9 @@ int lldp_neighbor_parse(sd_lldp_neighbor *n) {
                                 log_lldp("End marker TLV not zero-sized, ignoring datagram.");
                                 return -EBADMSG;
                         }
-                        if (left != 0) {
-                                log_lldp("Trailing garbage in datagram, ignoring datagram.");
-                                return -EBADMSG;
-                        }
+
+                        /* Note that after processing the SD_LLDP_TYPE_END left could still be > 0
+                         * as the message may contain padding (see IEEE 802.1AB-2016, sec. 8.5.12) */
 
                         goto end_marker;
 
index 59c2559..ae2f674 100644 (file)
@@ -47,6 +47,13 @@ int lldp_network_bind_raw_socket(int ifindex) {
                 .filter = (struct sock_filter*) filter,
         };
 
+        struct packet_mreq mreq = {
+                .mr_ifindex = ifindex,
+                .mr_type = PACKET_MR_MULTICAST,
+                .mr_alen = ETH_ALEN,
+                .mr_address = { 0x01, 0x80, 0xC2, 0x00, 0x00, 0x00 }
+        };
+
         union sockaddr_union saddrll = {
                 .ll.sll_family = AF_PACKET,
                 .ll.sll_ifindex = ifindex,
@@ -66,6 +73,20 @@ int lldp_network_bind_raw_socket(int ifindex) {
         if (r < 0)
                 return -errno;
 
+        r = setsockopt(fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
+        if (r < 0)
+                return -errno;
+
+        mreq.mr_address[ETH_ALEN - 1] = 0x03;
+        r = setsockopt(fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
+        if (r < 0)
+                return -errno;
+
+        mreq.mr_address[ETH_ALEN - 1] = 0x0E;
+        r = setsockopt(fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
+        if (r < 0)
+                return -errno;
+
         r = bind(fd, &saddrll.sa, sizeof(saddrll.ll));
         if (r < 0)
                 return -errno;
diff --git a/src/libsystemd-network/meson.build b/src/libsystemd-network/meson.build
new file mode 100644 (file)
index 0000000..78c7456
--- /dev/null
@@ -0,0 +1,48 @@
+sources = files('''
+        sd-dhcp-client.c
+        sd-dhcp-server.c
+        dhcp-network.c
+        dhcp-option.c
+        dhcp-packet.c
+        dhcp-internal.h
+        dhcp-server-internal.h
+        dhcp-protocol.h
+        dhcp-lease-internal.h
+        sd-dhcp-lease.c
+        sd-ipv4ll.c
+        sd-ipv4acd.c
+        arp-util.h
+        arp-util.c
+        network-internal.c
+        sd-ndisc.c
+        ndisc-internal.h
+        ndisc-router.h
+        ndisc-router.c
+        sd-radv.c
+        radv-internal.h
+        icmp6-util.h
+        icmp6-util.c
+        sd-dhcp6-client.c
+        dhcp6-internal.h
+        dhcp6-protocol.h
+        dhcp6-network.c
+        dhcp6-option.c
+        dhcp6-lease-internal.h
+        sd-dhcp6-lease.c
+        dhcp-identifier.h
+        dhcp-identifier.c
+        lldp-internal.h
+        lldp-network.h
+        lldp-network.c
+        lldp-neighbor.h
+        lldp-neighbor.c
+        sd-lldp.c
+'''.split())
+
+network_internal_h = files('network-internal.h')
+
+libsystemd_network = static_library(
+        'systemd-network',
+        sources,
+        network_internal_h,
+        include_directories : includes)
index 60e183f..82b896d 100644 (file)
 
 #include "sd-ndisc.h"
 
+#define NDISC_ROUTER_SOLICITATION_INTERVAL (4U * USEC_PER_SEC)
+#define NDISC_MAX_ROUTER_SOLICITATION_INTERVAL (3600U * USEC_PER_SEC)
+#define NDISC_MAX_ROUTER_SOLICITATIONS 3U
+
 struct sd_ndisc {
         unsigned n_ref;
 
@@ -38,8 +42,9 @@ struct sd_ndisc {
 
         sd_event_source *recv_event_source;
         sd_event_source *timeout_event_source;
+        sd_event_source *timeout_no_ra;
 
-        unsigned nd_sent;
+        usec_t retransmit_time;
 
         sd_ndisc_callback_t callback;
         void *userdata;
index d9950b6..845a6b7 100644 (file)
@@ -49,8 +49,7 @@ _public_ sd_ndisc_router* sd_ndisc_router_unref(sd_ndisc_router *rt) {
         if (rt->n_ref > 0)
                 return NULL;
 
-        free(rt);
-        return NULL;
+        return mfree(rt);
 }
 
 sd_ndisc_router *ndisc_router_new(size_t raw_size) {
@@ -92,7 +91,7 @@ _public_ int sd_ndisc_router_get_address(sd_ndisc_router *rt, struct in6_addr *r
         assert_return(rt, -EINVAL);
         assert_return(ret_addr, -EINVAL);
 
-        if (in6_addr_is_null(&rt->address))
+        if (IN6_IS_ADDR_UNSPECIFIED(&rt->address))
                 return -ENODATA;
 
         *ret_addr = rt->address;
@@ -460,6 +459,7 @@ _public_ int sd_ndisc_router_prefix_get_preferred_lifetime(sd_ndisc_router *rt,
 
 _public_ int sd_ndisc_router_prefix_get_flags(sd_ndisc_router *rt, uint8_t *ret) {
         struct nd_opt_prefix_info *pi;
+        uint8_t flags;
         int r;
 
         assert_return(rt, -EINVAL);
@@ -469,7 +469,14 @@ _public_ int sd_ndisc_router_prefix_get_flags(sd_ndisc_router *rt, uint8_t *ret)
         if (r < 0)
                 return r;
 
-        *ret = pi->nd_opt_pi_flags_reserved;
+        flags = pi->nd_opt_pi_flags_reserved;
+
+        if ((flags & ND_OPT_PI_FLAG_AUTO) && (pi->nd_opt_pi_prefix_len != 64)) {
+                log_ndisc("Invalid prefix length, ignoring prefix for stateless autoconfiguration.");
+                flags &= ~ND_OPT_PI_FLAG_AUTO;
+        }
+
+        *ret = flags;
         return 0;
 }
 
index 9d78b95..337241a 100644 (file)
@@ -86,6 +86,28 @@ int net_get_unique_predictable_data(struct udev_device *device, uint64_t *result
         return 0;
 }
 
+static bool net_condition_test_strv(char * const *raw_patterns,
+                                    const char *string) {
+        if (strv_isempty(raw_patterns))
+                return true;
+
+        /* If the patterns begin with "!", edit it out and negate the test. */
+        if (raw_patterns[0][0] == '!') {
+                char **patterns;
+                unsigned i, length;
+
+                length = strv_length(raw_patterns) + 1; /* Include the NULL. */
+                patterns = newa(char*, length);
+                patterns[0] = raw_patterns[0] + 1; /* Skip the "!". */
+                for (i = 1; i < length; i++)
+                        patterns[i] = raw_patterns[i];
+
+                return !string || !strv_fnmatch(patterns, string, 0);
+        }
+
+        return string && strv_fnmatch(raw_patterns, string, 0);
+}
+
 bool net_match_config(const struct ether_addr *match_mac,
                       char * const *match_paths,
                       char * const *match_drivers,
@@ -117,20 +139,16 @@ bool net_match_config(const struct ether_addr *match_mac,
         if (match_mac && (!dev_mac || memcmp(match_mac, dev_mac, ETH_ALEN)))
                 return false;
 
-        if (!strv_isempty(match_paths) &&
-            (!dev_path || !strv_fnmatch(match_paths, dev_path, 0)))
+        if (!net_condition_test_strv(match_paths, dev_path))
                 return false;
 
-        if (!strv_isempty(match_drivers) &&
-            (!dev_driver || !strv_fnmatch(match_drivers, dev_driver, 0)))
+        if (!net_condition_test_strv(match_drivers, dev_driver))
                 return false;
 
-        if (!strv_isempty(match_types) &&
-            (!dev_type || !strv_fnmatch_or_empty(match_types, dev_type, 0)))
+        if (!net_condition_test_strv(match_types, dev_type))
                 return false;
 
-        if (!strv_isempty(match_names) &&
-            (!dev_name || !strv_fnmatch_or_empty(match_names, dev_name, 0)))
+        if (!net_condition_test_strv(match_names, dev_name))
                 return false;
 
         return true;
@@ -331,6 +349,45 @@ int config_parse_iaid(const char *unit,
         return 0;
 }
 
+int config_parse_bridge_port_priority(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        uint16_t i;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = safe_atou16(rvalue, &i);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Failed to parse bridge port priority, ignoring: %s", rvalue);
+                return 0;
+        }
+
+        if (i > LINK_BRIDGE_PORT_PRIORITY_MAX) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Bridge port priority is larger than maximum %u, ignoring: %s", LINK_BRIDGE_PORT_PRIORITY_MAX, rvalue);
+                return 0;
+        }
+
+        *((uint16_t *)data) = i;
+
+        return 0;
+}
+
+
 void serialize_in_addrs(FILE *f, const struct in_addr *addresses, size_t size) {
         unsigned i;
 
index 5bcd577..4666f17 100644 (file)
@@ -26,6 +26,9 @@
 #include "condition.h"
 #include "udev.h"
 
+#define LINK_BRIDGE_PORT_PRIORITY_INVALID 128
+#define LINK_BRIDGE_PORT_PRIORITY_MAX 63
+
 bool net_match_config(const struct ether_addr *match_mac,
                       char * const *match_path,
                       char * const *match_driver,
@@ -62,6 +65,10 @@ int config_parse_iaid(const char *unit, const char *filename, unsigned line,
                       const char *section, unsigned section_line, const char *lvalue,
                       int ltype, const char *rvalue, void *data, void *userdata);
 
+int config_parse_bridge_port_priority(const char *unit, const char *filename, unsigned line,
+                      const char *section, unsigned section_line, const char *lvalue,
+                      int ltype, const char *rvalue, void *data, void *userdata);
+
 int net_get_unique_predictable_data(struct udev_device *device, uint64_t *result);
 const char *net_get_name(struct udev_device *device);
 
diff --git a/src/libsystemd-network/radv-internal.h b/src/libsystemd-network/radv-internal.h
new file mode 100644 (file)
index 0000000..b21d4e5
--- /dev/null
@@ -0,0 +1,88 @@
+#pragma once
+
+/***
+  This file is part of systemd.
+
+  Copyright (C) 2017 Intel Corporation. All rights reserved.
+
+  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 "sd-radv.h"
+
+#include "log.h"
+#include "list.h"
+#include "sparse-endian.h"
+
+#define SD_RADV_DEFAULT_MIN_TIMEOUT_USEC        (200*USEC_PER_SEC)
+#define SD_RADV_DEFAULT_MAX_TIMEOUT_USEC        (600*USEC_PER_SEC)
+assert_cc(SD_RADV_DEFAULT_MIN_TIMEOUT_USEC <= SD_RADV_DEFAULT_MAX_TIMEOUT_USEC)
+
+#define SD_RADV_MAX_INITIAL_RTR_ADVERT_INTERVAL_USEC (16*USEC_PER_SEC)
+#define SD_RADV_MAX_INITIAL_RTR_ADVERTISEMENTS  3
+#define SD_RADV_MAX_FINAL_RTR_ADVERTISEMENTS    3
+#define SD_RADV_MIN_DELAY_BETWEEN_RAS           3
+#define SD_RADV_MAX_RA_DELAY_TIME_USEC          (500*USEC_PER_MSEC)
+
+enum RAdvState {
+        SD_RADV_STATE_IDLE                      = 0,
+        SD_RADV_STATE_ADVERTISING               = 1,
+};
+typedef enum RAdvState RAdvState;
+
+struct sd_radv {
+        unsigned n_ref;
+        RAdvState state;
+
+        int ifindex;
+
+        sd_event *event;
+        int event_priority;
+
+        struct ether_addr mac_addr;
+        uint8_t hop_limit;
+        uint8_t flags;
+        uint32_t mtu;
+        uint16_t lifetime;
+
+        int fd;
+        unsigned ra_sent;
+        sd_event_source *recv_event_source;
+        sd_event_source *timeout_event_source;
+
+        unsigned n_prefixes;
+        LIST_HEAD(sd_radv_prefix, prefixes);
+};
+
+struct sd_radv_prefix {
+        unsigned n_ref;
+
+        struct {
+                uint8_t type;
+                uint8_t length;
+                uint8_t prefixlen;
+                uint8_t flags;
+                be32_t valid_lifetime;
+                be32_t preferred_lifetime;
+                uint32_t reserved;
+                struct in6_addr in6_addr;
+        } _packed_ opt;
+
+        LIST_FIELDS(struct sd_radv_prefix, prefix);
+};
+
+#define log_radv_full(level, error, fmt, ...) log_internal(level, error, __FILE__, __LINE__, __func__, "RADV: " fmt, ##__VA_ARGS__)
+#define log_radv_errno(error, fmt, ...) log_radv_full(LOG_DEBUG, error, fmt, ##__VA_ARGS__)
+#define log_radv_warning_errno(error, fmt, ...) log_radv_full(LOG_WARNING, error, fmt, ##__VA_ARGS__)
+#define log_radv(fmt, ...) log_radv_errno(0, fmt, ##__VA_ARGS__)
index 179e595..e20d339 100644 (file)
@@ -55,6 +55,7 @@ struct sd_dhcp_client {
         sd_event_source *timeout_resend;
         int ifindex;
         int fd;
+        uint16_t port;
         union sockaddr_union link;
         sd_event_source *receive_message;
         bool request_broadcast;
@@ -385,43 +386,32 @@ int sd_dhcp_client_set_hostname(
                 sd_dhcp_client *client,
                 const char *hostname) {
 
-        char *new_hostname = NULL;
-
         assert_return(client, -EINVAL);
 
-        if (!hostname_is_valid(hostname, false) && !dns_name_is_valid(hostname))
+        /* Refuse hostnames that neither qualify as DNS nor as Linux hosntames */
+        if (hostname &&
+            !(hostname_is_valid(hostname, false) || dns_name_is_valid(hostname) > 0))
                 return -EINVAL;
 
-        if (streq_ptr(client->hostname, hostname))
-                return 0;
-
-        if (hostname) {
-                new_hostname = strdup(hostname);
-                if (!new_hostname)
-                        return -ENOMEM;
-        }
-
-        free(client->hostname);
-        client->hostname = new_hostname;
-
-        return 0;
+        return free_and_strdup(&client->hostname, hostname);
 }
 
 int sd_dhcp_client_set_vendor_class_identifier(
                 sd_dhcp_client *client,
                 const char *vci) {
 
-        char *new_vci = NULL;
-
         assert_return(client, -EINVAL);
 
-        new_vci = strdup(vci);
-        if (!new_vci)
-                return -ENOMEM;
+        return free_and_strdup(&client->vendor_class_identifier, vci);
+}
 
-        free(client->vendor_class_identifier);
+int sd_dhcp_client_set_client_port(
+                sd_dhcp_client *client,
+                uint16_t port) {
 
-        client->vendor_class_identifier = new_vci;
+        assert_return(client, -EINVAL);
+
+        client->port = port;
 
         return 0;
 }
@@ -668,7 +658,7 @@ static int dhcp_client_send_raw(
                 DHCPPacket *packet,
                 size_t len) {
 
-        dhcp_packet_append_ip_headers(packet, INADDR_ANY, DHCP_PORT_CLIENT,
+        dhcp_packet_append_ip_headers(packet, INADDR_ANY, client->port,
                                       INADDR_BROADCAST, DHCP_PORT_SERVER, len);
 
         return dhcp_network_send_raw_socket(client->fd, &client->link,
@@ -835,6 +825,15 @@ static int client_send_request(sd_dhcp_client *client) {
                         return r;
         }
 
+        if (client->vendor_class_identifier) {
+                r = dhcp_option_append(&request->dhcp, optlen, &optoffset, 0,
+                                       SD_DHCP_OPTION_VENDOR_CLASS_IDENTIFIER,
+                                       strlen(client->vendor_class_identifier),
+                                       client->vendor_class_identifier);
+                if (r < 0)
+                        return r;
+        }
+
         r = dhcp_option_append(&request->dhcp, optlen, &optoffset, 0,
                                SD_DHCP_OPTION_END, 0, NULL);
         if (r < 0)
@@ -1120,7 +1119,7 @@ static int client_start_delayed(sd_dhcp_client *client) {
 
         r = dhcp_network_bind_raw_socket(client->ifindex, &client->link,
                                          client->xid, client->mac_addr,
-                                         client->mac_addr_len, client->arp_type);
+                                         client->mac_addr_len, client->arp_type, client->port);
         if (r < 0) {
                 client_stop(client, r);
                 return r;
@@ -1170,7 +1169,8 @@ static int client_timeout_t2(sd_event_source *s, uint64_t usec, void *userdata)
 
         r = dhcp_network_bind_raw_socket(client->ifindex, &client->link,
                                          client->xid, client->mac_addr,
-                                         client->mac_addr_len, client->arp_type);
+                                         client->mac_addr_len, client->arp_type,
+                                         client->port);
         if (r < 0) {
                 client_stop(client, r);
                 return 0;
@@ -1555,8 +1555,7 @@ static int client_handle_message(sd_dhcp_client *client, DHCPMessage *message, i
                                 goto error;
                         }
 
-                        r = dhcp_network_bind_udp_socket(client->lease->address,
-                                                         DHCP_PORT_CLIENT);
+                        r = dhcp_network_bind_udp_socket(client->ifindex, client->lease->address, client->port);
                         if (r < 0) {
                                 log_dhcp_client(client, "could not bind UDP socket");
                                 goto error;
@@ -1656,7 +1655,8 @@ static int client_receive_message_udp(
                 if (errno == EAGAIN || errno == EINTR)
                         return 0;
 
-                return log_dhcp_client_errno(client, errno, "Could not receive message from UDP socket: %m");
+                return log_dhcp_client_errno(client, errno,
+                                             "Could not receive message from UDP socket: %m");
         }
         if ((size_t) len < sizeof(DHCPMessage)) {
                 log_dhcp_client(client, "Too small to be a DHCP message: ignoring");
@@ -1749,9 +1749,8 @@ static int client_receive_message_raw(
                 if (errno == EAGAIN || errno == EINTR)
                         return 0;
 
-                log_dhcp_client(client, "Could not receive message from raw socket: %m");
-
-                return -errno;
+                return log_dhcp_client_errno(client, errno,
+                                             "Could not receive message from raw socket: %m");
         } else if ((size_t)len < sizeof(DHCPPacket))
                 return 0;
 
@@ -1766,7 +1765,7 @@ static int client_receive_message_raw(
                 }
         }
 
-        r = dhcp_packet_verify_headers(packet, len, checksum);
+        r = dhcp_packet_verify_headers(packet, len, checksum, client->port);
         if (r < 0)
                 return 0;
 
@@ -1873,9 +1872,7 @@ sd_dhcp_client *sd_dhcp_client_unref(sd_dhcp_client *client) {
         free(client->req_opts);
         free(client->hostname);
         free(client->vendor_class_identifier);
-        free(client);
-
-        return NULL;
+        return mfree(client);
 }
 
 int sd_dhcp_client_new(sd_dhcp_client **ret) {
@@ -1893,6 +1890,7 @@ int sd_dhcp_client_new(sd_dhcp_client **ret) {
         client->fd = -1;
         client->attempt = 1;
         client->mtu = DHCP_DEFAULT_MIN_SIZE;
+        client->port = DHCP_PORT_CLIENT;
 
         client->req_opts_size = ELEMENTSOF(default_req_opts);
         client->req_opts = memdup(default_req_opts, client->req_opts_size);
index ef50ed1..1661874 100644 (file)
@@ -231,6 +231,21 @@ int sd_dhcp_lease_get_routes(sd_dhcp_lease *lease, sd_dhcp_route ***routes) {
         return (int) lease->static_route_size;
 }
 
+int sd_dhcp_lease_get_search_domains(sd_dhcp_lease *lease, char ***domains) {
+        unsigned r;
+
+        assert_return(lease, -EINVAL);
+        assert_return(domains, -EINVAL);
+
+        r = strv_length(lease->search_domains);
+        if (r > 0) {
+                *domains = lease->search_domains;
+                return (int) r;
+        }
+
+        return -ENODATA;
+}
+
 int sd_dhcp_lease_get_vendor_specific(sd_dhcp_lease *lease, const void **data, size_t *data_len) {
         assert_return(lease, -EINVAL);
         assert_return(data, -EINVAL);
@@ -282,9 +297,8 @@ sd_dhcp_lease *sd_dhcp_lease_unref(sd_dhcp_lease *lease) {
         free(lease->static_route);
         free(lease->client_id);
         free(lease->vendor_specific);
-        free(lease);
-
-        return NULL;
+        strv_free(lease->search_domains);
+        return mfree(lease);
 }
 
 static int lease_parse_u32(const uint8_t *option, size_t len, uint32_t *ret, uint32_t min) {
@@ -385,6 +399,23 @@ static int lease_parse_domain(const uint8_t *option, size_t len, char **ret) {
         return 0;
 }
 
+static void filter_bogus_addresses(struct in_addr *addresses, size_t *n) {
+        size_t i, j;
+
+        /* Silently filter DNS/NTP servers supplied to us that do not make outside of the local scope. */
+
+        for (i = 0, j = 0; i < *n; i ++) {
+
+                if (in4_addr_is_null(addresses+i) ||
+                    in4_addr_is_localhost(addresses+i))
+                        continue;
+
+                addresses[j++] = addresses[i];
+        }
+
+        *n = j;
+}
+
 static int lease_parse_in_addrs(const uint8_t *option, size_t len, struct in_addr **ret, size_t *n_ret) {
         assert(option);
         assert(ret);
@@ -406,6 +437,8 @@ static int lease_parse_in_addrs(const uint8_t *option, size_t len, struct in_add
                 if (!addresses)
                         return -ENOMEM;
 
+                filter_bogus_addresses(addresses, &n_addresses);
+
                 free(*ret);
                 *ret = addresses;
                 *n_ret = n_addresses;
@@ -577,6 +610,11 @@ int dhcp_lease_parse_options(uint8_t code, uint8_t len, const void *option, void
                 r = lease_parse_u16(option, len, &lease->mtu, 68);
                 if (r < 0)
                         log_debug_errno(r, "Failed to parse MTU, ignoring: %m");
+                if (lease->mtu < DHCP_DEFAULT_MIN_SIZE) {
+                        log_debug("MTU value of %" PRIu16 " too small. Using default MTU value of %d instead.", lease->mtu, DHCP_DEFAULT_MIN_SIZE);
+                        lease->mtu = DHCP_DEFAULT_MIN_SIZE;
+                }
+
                 break;
 
         case SD_DHCP_OPTION_DOMAIN_NAME:
@@ -588,6 +626,12 @@ int dhcp_lease_parse_options(uint8_t code, uint8_t len, const void *option, void
 
                 break;
 
+        case SD_DHCP_OPTION_DOMAIN_SEARCH_LIST:
+                r = dhcp_lease_parse_search_domains(option, len, &lease->search_domains);
+                if (r < 0)
+                        log_debug_errno(r, "Failed to parse Domain Search List, ignoring: %m");
+                break;
+
         case SD_DHCP_OPTION_HOST_NAME:
                 r = lease_parse_domain(option, len, &lease->hostname);
                 if (r < 0) {
@@ -679,6 +723,96 @@ int dhcp_lease_parse_options(uint8_t code, uint8_t len, const void *option, void
         return 0;
 }
 
+/* Parses compressed domain names. */
+int dhcp_lease_parse_search_domains(const uint8_t *option, size_t len, char ***domains) {
+        _cleanup_strv_free_ char **names = NULL;
+        size_t pos = 0, cnt = 0;
+        int r;
+
+        assert(domains);
+        assert_return(option && len > 0, -ENODATA);
+
+        while (pos < len) {
+                _cleanup_free_ char *name = NULL;
+                size_t n = 0, allocated = 0;
+                size_t jump_barrier = pos, next_chunk = 0;
+                bool first = true;
+
+                for (;;) {
+                        uint8_t c;
+                        c = option[pos++];
+
+                        if (c == 0) {
+                                /* End of name */
+                                break;
+                        } else if (c <= 63) {
+                                const char *label;
+
+                                /* Literal label */
+                                label = (const char*) (option + pos);
+                                pos += c;
+                                if (pos >= len)
+                                        return -EBADMSG;
+
+                                if (!GREEDY_REALLOC(name, allocated, n + !first + DNS_LABEL_ESCAPED_MAX))
+                                        return -ENOMEM;
+
+                                if (first)
+                                        first = false;
+                                else
+                                        name[n++] = '.';
+
+                                r = dns_label_escape(label, c, name + n, DNS_LABEL_ESCAPED_MAX);
+                                if (r < 0)
+                                        return r;
+
+                                n += r;
+                        } else if ((c & 0xc0) == 0xc0) {
+                                /* Pointer */
+
+                                uint8_t d;
+                                uint16_t ptr;
+
+                                if (pos >= len)
+                                        return -EBADMSG;
+
+                                d = option[pos++];
+                                ptr = (uint16_t) (c & ~0xc0) << 8 | (uint16_t) d;
+
+                                /* Jumps are limited to a "prior occurrence" (RFC-1035 4.1.4) */
+                                if (ptr >= jump_barrier)
+                                        return -EBADMSG;
+                                jump_barrier = ptr;
+
+                                /* Save current location so we don't end up re-parsing what's parsed so far. */
+                                if (next_chunk == 0)
+                                        next_chunk = pos;
+
+                                pos = ptr;
+                        } else
+                                return -EBADMSG;
+                }
+
+                if (!GREEDY_REALLOC(name, allocated, n + 1))
+                        return -ENOMEM;
+                name[n] = 0;
+
+                r = strv_extend(&names, name);
+                if (r < 0)
+                        return r;
+
+                cnt++;
+
+                if (next_chunk != 0)
+                      pos = next_chunk;
+        }
+
+        *domains = names;
+        names = NULL;
+
+        return cnt;
+}
+
 int dhcp_lease_insert_private_option(sd_dhcp_lease *lease, uint8_t tag, const void *data, uint8_t len) {
         struct sd_dhcp_raw_option *cur, *option;
 
@@ -734,6 +868,7 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
         const char *string;
         uint16_t mtu;
         _cleanup_free_ sd_dhcp_route **routes = NULL;
+        char **search_domains = NULL;
         uint32_t t1, t2, lifetime;
         int r;
 
@@ -807,6 +942,13 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
         if (r >= 0)
                 fprintf(f, "DOMAINNAME=%s\n", string);
 
+        r = sd_dhcp_lease_get_search_domains(lease, &search_domains);
+        if (r > 0) {
+                fputs("DOMAIN_SEARCH_LIST=", f);
+                fputstrv(f, search_domains, NULL, NULL);
+                fputs("\n", f);
+        }
+
         r = sd_dhcp_lease_get_hostname(lease, &string);
         if (r >= 0)
                 fprintf(f, "HOSTNAME=%s\n", string);
@@ -888,6 +1030,7 @@ int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
                 *ntp = NULL,
                 *mtu = NULL,
                 *routes = NULL,
+                *domains = NULL,
                 *client_id_hex = NULL,
                 *vendor_specific_hex = NULL,
                 *lifetime = NULL,
@@ -916,6 +1059,7 @@ int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
                            "MTU", &mtu,
                            "DOMAINNAME", &lease->domainname,
                            "HOSTNAME", &lease->hostname,
+                           "DOMAIN_SEARCH_LIST", &domains,
                            "ROOT_PATH", &lease->root_path,
                            "ROUTES", &routes,
                            "CLIENTID", &client_id_hex,
@@ -1021,6 +1165,18 @@ int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
                         log_debug_errno(r, "Failed to parse MTU %s, ignoring: %m", mtu);
         }
 
+        if (domains) {
+                _cleanup_strv_free_ char **a = NULL;
+                a = strv_split(domains, " ");
+                if (!a)
+                        return -ENOMEM;
+
+                if (!strv_isempty(a)) {
+                        lease->search_domains = a;
+                        a = NULL;
+                }
+        }
+
         if (routes) {
                 r = deserialize_dhcp_routes(
                                 &lease->static_route,
index 11ee2e2..5a59c37 100644 (file)
 #define DHCP_DEFAULT_LEASE_TIME_USEC USEC_PER_HOUR
 #define DHCP_MAX_LEASE_TIME_USEC (USEC_PER_HOUR*12)
 
+static void dhcp_lease_free(DHCPLease *lease) {
+        if (!lease)
+                return;
+
+        free(lease->client_id.data);
+        free(lease);
+}
+
 /* configures the server's address and subnet, and optionally the pool's size and offset into the subnet
  * the whole pool must fit into the subnet, and may not contain the first (any) nor last (broadcast) address
  * moreover, the server's own address may be in the pool, and is in that case reserved in order not to
@@ -47,7 +55,6 @@ int sd_dhcp_server_configure_pool(sd_dhcp_server *server, struct in_addr *addres
         assert_return(address, -EINVAL);
         assert_return(address->s_addr != INADDR_ANY, -EINVAL);
         assert_return(prefixlen <= 32, -ERANGE);
-        assert_return(server->address == INADDR_ANY, -EBUSY);
 
         assert_se(in_addr_prefixlen_to_netmask(&netmask_addr, prefixlen));
         netmask = netmask_addr.s_addr;
@@ -78,19 +85,28 @@ int sd_dhcp_server_configure_pool(sd_dhcp_server *server, struct in_addr *addres
         else
                 size = size_max;
 
-        server->bound_leases = new0(DHCPLease*, size);
-        if (!server->bound_leases)
-                return -ENOMEM;
+        if (server->address != address->s_addr || server->netmask != netmask || server->pool_size != size || server->pool_offset != offset) {
+                DHCPLease *lease;
+
+                free(server->bound_leases);
+                server->bound_leases = new0(DHCPLease*, size);
+                if (!server->bound_leases)
+                        return -ENOMEM;
+
+                server->pool_offset = offset;
+                server->pool_size = size;
 
-        server->pool_offset = offset;
-        server->pool_size = size;
+                server->address = address->s_addr;
+                server->netmask = netmask;
+                server->subnet = address->s_addr & netmask;
 
-        server->address = address->s_addr;
-        server->netmask = netmask;
-        server->subnet = address->s_addr & netmask;
+                if (server_off >= offset && server_off - offset < size)
+                        server->bound_leases[server_off - offset] = &server->invalid_lease;
 
-        if (server_off >= offset && server_off - offset < size)
-                server->bound_leases[server_off - offset] = &server->invalid_lease;
+                /* Drop any leases associated with the old address range */
+                while ((lease = hashmap_steal_first(server->leases_by_client_id)))
+                        dhcp_lease_free(lease);
+        }
 
         return 0;
 }
@@ -143,14 +159,6 @@ static const struct hash_ops client_id_hash_ops = {
         .compare = client_id_compare_func
 };
 
-static void dhcp_lease_free(DHCPLease *lease) {
-        if (!lease)
-                return;
-
-        free(lease->client_id.data);
-        free(lease);
-}
-
 sd_dhcp_server *sd_dhcp_server_unref(sd_dhcp_server *server) {
         DHCPLease *lease;
 
@@ -178,9 +186,7 @@ sd_dhcp_server *sd_dhcp_server_unref(sd_dhcp_server *server) {
         hashmap_free(server->leases_by_client_id);
 
         free(server->bound_leases);
-        free(server);
-
-        return NULL;
+        return mfree(server);
 }
 
 int sd_dhcp_server_new(sd_dhcp_server **ret, int ifindex) {
@@ -199,7 +205,11 @@ int sd_dhcp_server_new(sd_dhcp_server **ret, int ifindex) {
         server->address = htobe32(INADDR_ANY);
         server->netmask = htobe32(INADDR_ANY);
         server->ifindex = ifindex;
+
         server->leases_by_client_id = hashmap_new(&client_id_hash_ops);
+        if (!server->leases_by_client_id)
+                return -ENOMEM;
+
         server->default_lease_time = DIV_ROUND_UP(DHCP_DEFAULT_LEASE_TIME_USEC, USEC_PER_SEC);
         server->max_lease_time = DIV_ROUND_UP(DHCP_MAX_LEASE_TIME_USEC, USEC_PER_SEC);
 
@@ -859,7 +869,9 @@ int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message,
 
                         if (!existing_lease) {
                                 lease = new0(DHCPLease, 1);
-                                lease->address = req->requested_ip;
+                                if (!lease)
+                                        return -ENOMEM;
+                                lease->address = address;
                                 lease->client_id.data = memdup(req->client_id.data,
                                                                req->client_id.length);
                                 if (!lease->client_id.data) {
@@ -1024,7 +1036,7 @@ int sd_dhcp_server_start(sd_dhcp_server *server) {
         }
         server->fd_raw = r;
 
-        r = dhcp_network_bind_udp_socket(INADDR_ANY, DHCP_PORT_SERVER);
+        r = dhcp_network_bind_udp_socket(server->ifindex, INADDR_ANY, DHCP_PORT_SERVER);
         if (r < 0) {
                 sd_dhcp_server_stop(server);
                 return r;
index 463fde4..6444b0c 100644 (file)
@@ -999,7 +999,7 @@ static int client_receive_message(
                         break;
                 }
 
-                /* fall through for Soliciation Rapid Commit option check */
+                /* fall through */ /* for Soliciation Rapid Commit option check */
         case DHCP6_STATE_REQUEST:
         case DHCP6_STATE_RENEW:
         case DHCP6_STATE_REBIND:
@@ -1300,9 +1300,7 @@ sd_dhcp6_client *sd_dhcp6_client_unref(sd_dhcp6_client *client) {
         sd_dhcp6_client_detach_event(client);
 
         free(client->req_opts);
-        free(client);
-
-        return NULL;
+        return mfree(client);
 }
 
 int sd_dhcp6_client_new(sd_dhcp6_client **ret) {
index 5c10a63..8396407 100644 (file)
@@ -226,7 +226,7 @@ int dhcp6_lease_set_domains(sd_dhcp6_lease *lease, uint8_t *optval,
         if (r < 0)
                 return 0;
 
-        free(lease->domains);
+        strv_free(lease->domains);
         lease->domains = domains;
         lease->domains_count = r;
 
@@ -389,9 +389,7 @@ sd_dhcp6_lease *sd_dhcp6_lease_unref(sd_dhcp6_lease *lease) {
         free(lease->ntp);
 
         lease->ntp_fqdn = strv_free(lease->ntp_fqdn);
-        free(lease);
-
-        return NULL;
+        return mfree(lease);
 }
 
 int dhcp6_lease_new(sd_dhcp6_lease **ret) {
index 6628858..2ebc00f 100644 (file)
@@ -135,9 +135,7 @@ sd_ipv4acd *sd_ipv4acd_unref(sd_ipv4acd *acd) {
         ipv4acd_reset(acd);
         sd_ipv4acd_detach_event(acd);
 
-        free(acd);
-
-        return NULL;
+        return mfree(acd);
 }
 
 int sd_ipv4acd_new(sd_ipv4acd **ret) {
@@ -244,8 +242,6 @@ static int ipv4acd_on_timeout(sd_event_source *s, uint64_t usec, void *userdata)
                         r = ipv4acd_set_next_wakeup(acd, RATE_LIMIT_INTERVAL_USEC, PROBE_WAIT_USEC);
                         if (r < 0)
                                 goto fail;
-
-                        acd->n_conflict = 0;
                 } else {
                         r = ipv4acd_set_next_wakeup(acd, 0, PROBE_WAIT_USEC);
                         if (r < 0)
index 5603a53..88a90e5 100644 (file)
@@ -90,9 +90,7 @@ sd_ipv4ll *sd_ipv4ll_unref(sd_ipv4ll *ll) {
                 return NULL;
 
         sd_ipv4acd_unref(ll->acd);
-        free(ll);
-
-        return NULL;
+        return mfree(ll);
 }
 
 int sd_ipv4ll_new(sd_ipv4ll **ret) {
@@ -250,6 +248,12 @@ static int ipv4ll_pick_address(sd_ipv4ll *ll) {
         return sd_ipv4ll_set_address(ll, &(struct in_addr) { addr });
 }
 
+int sd_ipv4ll_restart(sd_ipv4ll *ll) {
+        ll->address = 0;
+
+        return sd_ipv4ll_start(ll);
+}
+
 #define MAC_HASH_KEY SD_ID128_MAKE(df,04,22,98,3f,ad,14,52,f9,87,2e,d1,9c,70,e2,f2)
 
 int sd_ipv4ll_start(sd_ipv4ll *ll) {
index 4accb7e..39ddb24 100644 (file)
@@ -375,9 +375,7 @@ _public_ sd_lldp* sd_lldp_unref(sd_lldp *lldp) {
 
         hashmap_free(lldp->neighbor_by_id);
         prioq_free(lldp->neighbor_by_expiry);
-        free(lldp);
-
-        return NULL;
+        return mfree(lldp);
 }
 
 _public_ int sd_lldp_new(sd_lldp **ret) {
index 07b0d7f..4bf558b 100644 (file)
 #include "in-addr-util.h"
 #include "ndisc-internal.h"
 #include "ndisc-router.h"
+#include "random-util.h"
 #include "socket-util.h"
 #include "string-util.h"
 #include "util.h"
 
-#define NDISC_ROUTER_SOLICITATION_INTERVAL (4U * USEC_PER_SEC)
-#define NDISC_MAX_ROUTER_SOLICITATIONS 3U
+#define NDISC_TIMEOUT_NO_RA_USEC (NDISC_ROUTER_SOLICITATION_INTERVAL * NDISC_MAX_ROUTER_SOLICITATIONS)
 
 static void ndisc_callback(sd_ndisc *ndisc, sd_ndisc_event event, sd_ndisc_router *rt) {
         assert(ndisc);
@@ -129,6 +129,8 @@ static int ndisc_reset(sd_ndisc *nd) {
         assert(nd);
 
         nd->timeout_event_source = sd_event_source_unref(nd->timeout_event_source);
+        nd->timeout_no_ra = sd_event_source_unref(nd->timeout_no_ra);
+        nd->retransmit_time = 0;
         nd->recv_event_source = sd_event_source_unref(nd->recv_event_source);
         nd->fd = safe_close(nd->fd);
 
@@ -148,9 +150,7 @@ _public_ sd_ndisc *sd_ndisc_unref(sd_ndisc *nd) {
 
         ndisc_reset(nd);
         sd_ndisc_detach_event(nd);
-        free(nd);
-
-        return NULL;
+        return mfree(nd);
 }
 
 _public_ int sd_ndisc_new(sd_ndisc **ret) {
@@ -223,23 +223,9 @@ static int ndisc_handle_datagram(sd_ndisc *nd, sd_ndisc_router *rt) {
 static int ndisc_recv(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
         _cleanup_(sd_ndisc_router_unrefp) sd_ndisc_router *rt = NULL;
         sd_ndisc *nd = userdata;
-        union {
-                struct cmsghdr cmsghdr;
-                uint8_t buf[CMSG_SPACE(sizeof(int)) + /* ttl */
-                            CMSG_SPACE(sizeof(struct timeval))];
-        } control = {};
-        struct iovec iov = {};
-        union sockaddr_union sa = {};
-        struct msghdr msg = {
-                .msg_name = &sa.sa,
-                .msg_namelen = sizeof(sa),
-                .msg_iov = &iov,
-                .msg_iovlen = 1,
-                .msg_control = &control,
-                .msg_controllen = sizeof(control),
-        };
-        struct cmsghdr *cmsg;
-        ssize_t len, buflen;
+        ssize_t buflen;
+        int r;
+        _cleanup_free_ char *addr = NULL;
 
         assert(s);
         assert(nd);
@@ -253,110 +239,90 @@ static int ndisc_recv(sd_event_source *s, int fd, uint32_t revents, void *userda
         if (!rt)
                 return -ENOMEM;
 
-        iov.iov_base = NDISC_ROUTER_RAW(rt);
-        iov.iov_len = rt->raw_size;
-
-        len = recvmsg(fd, &msg, MSG_DONTWAIT);
-        if (len < 0) {
-                if (errno == EAGAIN || errno == EINTR)
-                        return 0;
-
-                return log_ndisc_errno(errno, "Could not receive message from ICMPv6 socket: %m");
-        }
-
-        if ((size_t) len != rt->raw_size) {
-                log_ndisc("Packet size mismatch.");
-                return -EINVAL;
-        }
-
-        if (msg.msg_namelen == sizeof(struct sockaddr_in6) &&
-            sa.in6.sin6_family == AF_INET6)  {
-
-                if (in_addr_is_link_local(AF_INET6, (union in_addr_union*) &sa.in6.sin6_addr) <= 0) {
-                        _cleanup_free_ char *addr = NULL;
-
-                        (void) in_addr_to_string(AF_INET6, (union in_addr_union*) &sa.in6.sin6_addr, &addr);
-                        log_ndisc("Received RA from non-link-local address %s. Ignoring.", strna(addr));
-                        return 0;
-                }
-
-                rt->address = sa.in6.sin6_addr;
-
-        } else if (msg.msg_namelen > 0) {
-                log_ndisc("Received invalid source address size from ICMPv6 socket: %zu bytes", (size_t) msg.msg_namelen);
-                return -EINVAL;
-        }
-
-        /* namelen == 0 only happens when running the test-suite over a socketpair */
-
-        assert(!(msg.msg_flags & MSG_CTRUNC));
-        assert(!(msg.msg_flags & MSG_TRUNC));
-
-        CMSG_FOREACH(cmsg, &msg) {
-                if (cmsg->cmsg_level == SOL_IPV6 &&
-                    cmsg->cmsg_type == IPV6_HOPLIMIT &&
-                    cmsg->cmsg_len == CMSG_LEN(sizeof(int))) {
-                        int hops = *(int*) CMSG_DATA(cmsg);
-
-                        if (hops != 255) {
-                                log_ndisc("Received RA with invalid hop limit %d. Ignoring.", hops);
-                                return 0;
-                        }
+        r = icmp6_receive(fd, NDISC_ROUTER_RAW(rt), rt->raw_size, &rt->address,
+                     &rt->timestamp);
+        if (r < 0) {
+                switch (r) {
+                case -EADDRNOTAVAIL:
+                        (void) in_addr_to_string(AF_INET6, (union in_addr_union*) &rt->address, &addr);
+                        log_ndisc("Received RA from non-link-local address %s. Ignoring", addr);
+                        break;
+
+                case -EMULTIHOP:
+                        log_ndisc("Received RA with invalid hop limit. Ignoring.");
+                        break;
+
+                case -EPFNOSUPPORT:
+                        log_ndisc("Received invalid source address from ICMPv6 socket.");
+                        break;
                 }
 
-                if (cmsg->cmsg_level == SOL_SOCKET &&
-                    cmsg->cmsg_type == SO_TIMESTAMP &&
-                    cmsg->cmsg_len == CMSG_LEN(sizeof(struct timeval)))
-                        triple_timestamp_from_realtime(&rt->timestamp, timeval_load((struct timeval*) CMSG_DATA(cmsg)));
+                return 0;
         }
 
-        if (!triple_timestamp_is_set(&rt->timestamp))
-                triple_timestamp_get(&rt->timestamp);
-
         nd->timeout_event_source = sd_event_source_unref(nd->timeout_event_source);
 
         return ndisc_handle_datagram(nd, rt);
 }
 
+static usec_t ndisc_timeout_compute_random(usec_t val) {
+        /* compute a time that is random within ±10% of the given value */
+        return val - val / 10 +
+                (random_u64() % (2 * USEC_PER_SEC)) * val / 10 / USEC_PER_SEC;
+}
+
 static int ndisc_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
         sd_ndisc *nd = userdata;
-        usec_t time_now, next_timeout;
+        usec_t time_now;
         int r;
+        char time_string[FORMAT_TIMESPAN_MAX];
 
         assert(s);
         assert(nd);
         assert(nd->event);
 
-        if (nd->nd_sent >= NDISC_MAX_ROUTER_SOLICITATIONS) {
-                nd->timeout_event_source = sd_event_source_unref(nd->timeout_event_source);
-                ndisc_callback(nd, SD_NDISC_EVENT_TIMEOUT, NULL);
-                return 0;
+        assert_se(sd_event_now(nd->event, clock_boottime_or_monotonic(), &time_now) >= 0);
+
+        nd->timeout_event_source = sd_event_source_unref(nd->timeout_event_source);
+
+        if (!nd->retransmit_time)
+                nd->retransmit_time = ndisc_timeout_compute_random(NDISC_ROUTER_SOLICITATION_INTERVAL);
+        else {
+                if (nd->retransmit_time > NDISC_MAX_ROUTER_SOLICITATION_INTERVAL / 2)
+                        nd->retransmit_time = ndisc_timeout_compute_random(NDISC_MAX_ROUTER_SOLICITATION_INTERVAL);
+                else
+                        nd->retransmit_time += ndisc_timeout_compute_random(nd->retransmit_time);
         }
 
-        r = icmp6_send_router_solicitation(nd->fd, &nd->mac_addr);
-        if (r < 0) {
-                log_ndisc_errno(r, "Error sending Router Solicitation: %m");
+        r = sd_event_add_time(nd->event, &nd->timeout_event_source,
+                              clock_boottime_or_monotonic(),
+                              time_now + nd->retransmit_time,
+                              10 * USEC_PER_MSEC, ndisc_timeout, nd);
+        if (r < 0)
                 goto fail;
-        }
 
-        log_ndisc("Sent Router Solicitation");
-        nd->nd_sent++;
+        r = sd_event_source_set_priority(nd->timeout_event_source, nd->event_priority);
+        if (r < 0)
+                goto fail;
 
-        assert_se(sd_event_now(nd->event, clock_boottime_or_monotonic(), &time_now) >= 0);
-        next_timeout = time_now + NDISC_ROUTER_SOLICITATION_INTERVAL;
+        (void) sd_event_source_set_description(nd->timeout_event_source, "ndisc-timeout-no-ra");
 
-        r = sd_event_source_set_time(nd->timeout_event_source, next_timeout);
+        r = sd_event_source_set_enabled(nd->timeout_event_source, SD_EVENT_ONESHOT);
         if (r < 0) {
-                log_ndisc_errno(r, "Error updating timer: %m");
+                log_ndisc_errno(r, "Error reenabling timer: %m");
                 goto fail;
         }
 
-        r = sd_event_source_set_enabled(nd->timeout_event_source, SD_EVENT_ONESHOT);
+        r = icmp6_send_router_solicitation(nd->fd, &nd->mac_addr);
         if (r < 0) {
-                log_ndisc_errno(r, "Error reenabling timer: %m");
+                log_ndisc_errno(r, "Error sending Router Solicitation: %m");
                 goto fail;
         }
 
+        log_ndisc("Sent Router Solicitation, next solicitation in %s",
+                  format_timespan(time_string, FORMAT_TIMESPAN_MAX,
+                                  nd->retransmit_time, USEC_PER_SEC));
+
         return 0;
 
 fail:
@@ -364,6 +330,20 @@ fail:
         return 0;
 }
 
+static int ndisc_timeout_no_ra(sd_event_source *s, uint64_t usec, void *userdata) {
+        sd_ndisc *nd = userdata;
+
+        assert(s);
+        assert(nd);
+
+        log_ndisc("No RA received before link confirmation timeout");
+
+        nd->timeout_no_ra = sd_event_source_unref(nd->timeout_no_ra);
+        ndisc_callback(nd, SD_NDISC_EVENT_TIMEOUT, NULL);
+
+        return 0;
+}
+
 _public_ int sd_ndisc_stop(sd_ndisc *nd) {
         assert_return(nd, -EINVAL);
 
@@ -378,6 +358,7 @@ _public_ int sd_ndisc_stop(sd_ndisc *nd) {
 
 _public_ int sd_ndisc_start(sd_ndisc *nd) {
         int r;
+        usec_t time_now;
 
         assert_return(nd, -EINVAL);
         assert_return(nd->event, -EINVAL);
@@ -389,6 +370,10 @@ _public_ int sd_ndisc_start(sd_ndisc *nd) {
         assert(!nd->recv_event_source);
         assert(!nd->timeout_event_source);
 
+        r = sd_event_now(nd->event, clock_boottime_or_monotonic(), &time_now);
+        if (r < 0)
+                goto fail;
+
         nd->fd = icmp6_bind_router_solicitation(nd->ifindex);
         if (nd->fd < 0)
                 return nd->fd;
@@ -413,6 +398,19 @@ _public_ int sd_ndisc_start(sd_ndisc *nd) {
 
         (void) sd_event_source_set_description(nd->timeout_event_source, "ndisc-timeout");
 
+        r = sd_event_add_time(nd->event, &nd->timeout_no_ra,
+                              clock_boottime_or_monotonic(),
+                              time_now + NDISC_TIMEOUT_NO_RA_USEC,
+                              10 * USEC_PER_MSEC, ndisc_timeout_no_ra, nd);
+        if (r < 0)
+                goto fail;
+
+        r = sd_event_source_set_priority(nd->timeout_no_ra, nd->event_priority);
+        if (r < 0)
+                goto fail;
+
+        (void) sd_event_source_set_description(nd->timeout_no_ra, "ndisc-timeout-no-ra");
+
         log_ndisc("Started IPv6 Router Solicitation client");
         return 1;
 
diff --git a/src/libsystemd-network/sd-radv.c b/src/libsystemd-network/sd-radv.c
new file mode 100644 (file)
index 0000000..f23275a
--- /dev/null
@@ -0,0 +1,653 @@
+/***
+  This file is part of systemd.
+
+  Copyright (C) 2017 Intel Corporation. All rights reserved.
+
+  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 <netinet/icmp6.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <linux/in6.h>
+
+#include "sd-radv.h"
+
+#include "macro.h"
+#include "alloc-util.h"
+#include "fd-util.h"
+#include "icmp6-util.h"
+#include "in-addr-util.h"
+#include "radv-internal.h"
+#include "socket-util.h"
+#include "string-util.h"
+#include "util.h"
+#include "random-util.h"
+
+_public_ int sd_radv_new(sd_radv **ret) {
+        _cleanup_(sd_radv_unrefp) sd_radv *ra = NULL;
+
+        assert_return(ret, -EINVAL);
+
+        ra = new0(sd_radv, 1);
+        if (!ra)
+                return -ENOMEM;
+
+        ra->n_ref = 1;
+        ra->fd = -1;
+
+        LIST_HEAD_INIT(ra->prefixes);
+
+        *ret = ra;
+        ra = NULL;
+
+        return 0;
+}
+
+_public_ int sd_radv_attach_event(sd_radv *ra, sd_event *event, int64_t priority) {
+        int r;
+
+        assert_return(ra, -EINVAL);
+        assert_return(!ra->event, -EBUSY);
+
+        if (event)
+                ra->event = sd_event_ref(event);
+        else {
+                r = sd_event_default(&ra->event);
+                if (r < 0)
+                        return 0;
+        }
+
+        ra->event_priority = priority;
+
+        return 0;
+}
+
+_public_ int sd_radv_detach_event(sd_radv *ra) {
+
+        assert_return(ra, -EINVAL);
+
+        ra->event = sd_event_unref(ra->event);
+        return 0;
+}
+
+_public_ sd_event *sd_radv_get_event(sd_radv *ra) {
+        assert_return(ra, NULL);
+
+        return ra->event;
+}
+
+static void radv_reset(sd_radv *ra) {
+
+        ra->timeout_event_source =
+                sd_event_source_unref(ra->timeout_event_source);
+
+        ra->recv_event_source =
+                sd_event_source_unref(ra->recv_event_source);
+
+        ra->ra_sent = 0;
+}
+
+_public_ sd_radv *sd_radv_ref(sd_radv *ra) {
+        if (!ra)
+                return NULL;
+
+        assert(ra->n_ref > 0);
+        ra->n_ref++;
+
+        return ra;
+}
+
+_public_ sd_radv *sd_radv_unref(sd_radv *ra) {
+        if (!ra)
+                return NULL;
+
+        assert(ra->n_ref > 0);
+        ra->n_ref--;
+
+        if (ra->n_ref > 0)
+                return NULL;
+
+        while (ra->prefixes) {
+                sd_radv_prefix *p = ra->prefixes;
+
+                LIST_REMOVE(prefix, ra->prefixes, p);
+                sd_radv_prefix_unref(p);
+        }
+
+        radv_reset(ra);
+
+        sd_radv_detach_event(ra);
+        return mfree(ra);
+}
+
+static int radv_send(sd_radv *ra, const struct in6_addr *dst,
+                     const uint32_t router_lifetime) {
+        static const struct ether_addr mac_zero = {};
+        sd_radv_prefix *p;
+        struct sockaddr_in6 dst_addr = {
+                .sin6_family = AF_INET6,
+                .sin6_addr = IN6ADDR_ALL_NODES_MULTICAST_INIT,
+        };
+        struct nd_router_advert adv = {};
+        struct {
+                struct nd_opt_hdr opthdr;
+                struct ether_addr slladdr;
+        } _packed_ opt_mac = {
+                .opthdr = {
+                        .nd_opt_type = ND_OPT_SOURCE_LINKADDR,
+                        .nd_opt_len = (sizeof(struct nd_opt_hdr) +
+                                       sizeof(struct ether_addr) - 1) /8 + 1,
+                },
+        };
+        struct nd_opt_mtu opt_mtu =  {
+                .nd_opt_mtu_type = ND_OPT_MTU,
+                .nd_opt_mtu_len = 1,
+        };
+        /* Reserve iov space for RA header, linkaddr, MTU + N prefixes */
+        struct iovec iov[3 + ra->n_prefixes];
+        struct msghdr msg = {
+                .msg_name = &dst_addr,
+                .msg_namelen = sizeof(dst_addr),
+                .msg_iov = iov,
+        };
+
+        if (dst && !in_addr_is_null(AF_INET6, (union in_addr_union*) dst))
+                dst_addr.sin6_addr = *dst;
+
+        adv.nd_ra_type = ND_ROUTER_ADVERT;
+        adv.nd_ra_curhoplimit = ra->hop_limit;
+        adv.nd_ra_flags_reserved = ra->flags;
+        adv.nd_ra_router_lifetime = htobe16(router_lifetime);
+        iov[msg.msg_iovlen].iov_base = &adv;
+        iov[msg.msg_iovlen].iov_len = sizeof(adv);
+        msg.msg_iovlen++;
+
+        /* MAC address is optional, either because the link does not use L2
+           addresses or load sharing is desired. See RFC 4861, Section 4.2 */
+        if (memcmp(&mac_zero, &ra->mac_addr, sizeof(mac_zero))) {
+                opt_mac.slladdr = ra->mac_addr;
+                iov[msg.msg_iovlen].iov_base = &opt_mac;
+                iov[msg.msg_iovlen].iov_len = sizeof(opt_mac);
+                msg.msg_iovlen++;
+        }
+
+        if (ra->mtu) {
+                opt_mtu.nd_opt_mtu_mtu = htobe32(ra->mtu);
+                iov[msg.msg_iovlen].iov_base = &opt_mtu;
+                iov[msg.msg_iovlen].iov_len = sizeof(opt_mtu);
+                msg.msg_iovlen++;
+        }
+
+        LIST_FOREACH(prefix, p, ra->prefixes) {
+                iov[msg.msg_iovlen].iov_base = &p->opt;
+                iov[msg.msg_iovlen].iov_len = sizeof(p->opt);
+                msg.msg_iovlen++;
+        }
+
+        if (sendmsg(ra->fd, &msg, 0) < 0)
+                return -errno;
+
+        return 0;
+}
+
+static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
+        sd_radv *ra = userdata;
+        _cleanup_free_ char *addr = NULL;
+        struct in6_addr src;
+        triple_timestamp timestamp;
+        int r;
+        ssize_t buflen;
+        _cleanup_free_ char *buf = NULL;
+
+        assert(s);
+        assert(ra);
+        assert(ra->event);
+
+        buflen = next_datagram_size_fd(fd);
+
+        if ((unsigned) buflen < sizeof(struct nd_router_solicit))
+                return log_radv("Too short packet received");
+
+        buf = new0(char, buflen);
+        if (!buf)
+                return 0;
+
+        r = icmp6_receive(fd, buf, buflen, &src, &timestamp);
+        if (r < 0) {
+                switch (r) {
+                case -EADDRNOTAVAIL:
+                        (void) in_addr_to_string(AF_INET6, (union in_addr_union*) &src, &addr);
+                        log_radv("Received RS from non-link-local address %s. Ignoring", addr);
+                        break;
+
+                case -EMULTIHOP:
+                        log_radv("Received RS with invalid hop limit. Ignoring.");
+                        break;
+
+                case -EPFNOSUPPORT:
+                        log_radv("Received invalid source address from ICMPv6 socket. Ignoring.");
+                        break;
+
+                default:
+                        log_radv_warning_errno(r, "Error receiving from ICMPv6 socket: %m");
+                        break;
+                }
+
+                return 0;
+        }
+
+        (void) in_addr_to_string(AF_INET6, (union in_addr_union*) &src, &addr);
+
+        r = radv_send(ra, &src, ra->lifetime);
+        if (r < 0)
+                log_radv_warning_errno(r, "Unable to send solicited Router Advertisment to %s: %m", addr);
+        else
+                log_radv("Sent solicited Router Advertisement to %s", addr);
+
+        return 0;
+}
+
+static usec_t radv_compute_timeout(usec_t min, usec_t max) {
+        assert_return(min <= max, SD_RADV_DEFAULT_MIN_TIMEOUT_USEC);
+
+        return min + (random_u32() % (max - min));
+}
+
+static int radv_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
+        int r;
+        sd_radv *ra = userdata;
+        usec_t min_timeout = SD_RADV_DEFAULT_MIN_TIMEOUT_USEC;
+        usec_t max_timeout = SD_RADV_DEFAULT_MAX_TIMEOUT_USEC;
+        usec_t time_now, timeout;
+        char time_string[FORMAT_TIMESPAN_MAX];
+
+        assert(s);
+        assert(ra);
+        assert(ra->event);
+
+        ra->timeout_event_source = sd_event_source_unref(ra->timeout_event_source);
+
+        r = sd_event_now(ra->event, clock_boottime_or_monotonic(), &time_now);
+        if (r < 0)
+                goto fail;
+
+        r = radv_send(ra, NULL, ra->lifetime);
+        if (r < 0)
+                log_radv_warning_errno(r, "Unable to send Router Advertisement: %m");
+
+        /* RFC 4861, Section 6.2.4, sending initial Router Advertisements */
+        if (ra->ra_sent < SD_RADV_MAX_INITIAL_RTR_ADVERTISEMENTS) {
+                max_timeout = SD_RADV_MAX_INITIAL_RTR_ADVERT_INTERVAL_USEC;
+                min_timeout = SD_RADV_MAX_INITIAL_RTR_ADVERT_INTERVAL_USEC / 3;
+        }
+
+        timeout = radv_compute_timeout(min_timeout, max_timeout);
+
+        log_radv("Next Router Advertisement in %s",
+                 format_timespan(time_string, FORMAT_TIMESPAN_MAX,
+                                 timeout, USEC_PER_SEC));
+
+        r = sd_event_add_time(ra->event, &ra->timeout_event_source,
+                              clock_boottime_or_monotonic(),
+                              time_now + timeout, MSEC_PER_SEC,
+                              radv_timeout, ra);
+        if (r < 0)
+                goto fail;
+
+        r = sd_event_source_set_priority(ra->timeout_event_source,
+                                         ra->event_priority);
+        if (r < 0)
+                goto fail;
+
+        r = sd_event_source_set_description(ra->timeout_event_source,
+                                            "radv-timeout");
+        if (r < 0)
+                goto fail;
+
+        ra->ra_sent++;
+
+fail:
+        if (r < 0)
+                sd_radv_stop(ra);
+
+        return 0;
+}
+
+_public_ int sd_radv_stop(sd_radv *ra) {
+        int r;
+
+        assert_return(ra, -EINVAL);
+
+        log_radv("Stopping IPv6 Router Advertisement daemon");
+
+        /* RFC 4861, Section 6.2.5, send at least one Router Advertisement
+           with zero lifetime  */
+        r = radv_send(ra, NULL, 0);
+        if (r < 0)
+                log_radv_warning_errno(r, "Unable to send last Router Advertisement with router lifetime set to zero: %m");
+
+        radv_reset(ra);
+        ra->fd = safe_close(ra->fd);
+        ra->state = SD_RADV_STATE_IDLE;
+
+        return 0;
+}
+
+_public_ int sd_radv_start(sd_radv *ra) {
+        int r = 0;
+
+        assert_return(ra, -EINVAL);
+        assert_return(ra->event, -EINVAL);
+        assert_return(ra->ifindex > 0, -EINVAL);
+
+        if (ra->state != SD_RADV_STATE_IDLE)
+                return 0;
+
+        r = sd_event_add_time(ra->event, &ra->timeout_event_source,
+                              clock_boottime_or_monotonic(), 0, 0,
+                              radv_timeout, ra);
+        if (r < 0)
+                goto fail;
+
+        r = sd_event_source_set_priority(ra->timeout_event_source,
+                                         ra->event_priority);
+        if (r < 0)
+                goto fail;
+
+        (void) sd_event_source_set_description(ra->timeout_event_source,
+                                               "radv-timeout");
+
+        r = icmp6_bind_router_advertisement(ra->ifindex);
+        if (r < 0)
+                goto fail;
+
+        ra->fd = r;
+
+        r = sd_event_add_io(ra->event, &ra->recv_event_source, ra->fd, EPOLLIN, radv_recv, ra);
+        if (r < 0)
+                goto fail;
+
+        r = sd_event_source_set_priority(ra->recv_event_source, ra->event_priority);
+        if (r < 0)
+                goto fail;
+
+        (void) sd_event_source_set_description(ra->recv_event_source, "radv-receive-message");
+
+        ra->state = SD_RADV_STATE_ADVERTISING;
+
+        log_radv("Started IPv6 Router Advertisement daemon");
+
+        return 0;
+
+ fail:
+        radv_reset(ra);
+
+        return r;
+}
+
+_public_ int sd_radv_set_ifindex(sd_radv *ra, int ifindex) {
+        assert_return(ra, -EINVAL);
+        assert_return(ifindex >= -1, -EINVAL);
+
+        if (ra->state != SD_RADV_STATE_IDLE)
+                return -EBUSY;
+
+        ra->ifindex = ifindex;
+
+        return 0;
+}
+
+_public_ int sd_radv_set_mac(sd_radv *ra, const struct ether_addr *mac_addr) {
+        assert_return(ra, -EINVAL);
+
+        if (ra->state != SD_RADV_STATE_IDLE)
+                return -EBUSY;
+
+        if (mac_addr)
+                ra->mac_addr = *mac_addr;
+        else
+                zero(ra->mac_addr);
+
+        return 0;
+}
+
+_public_ int sd_radv_set_mtu(sd_radv *ra, uint32_t mtu) {
+        assert_return(ra, -EINVAL);
+        assert_return(mtu >= 1280, -EINVAL);
+
+        if (ra->state != SD_RADV_STATE_IDLE)
+                return -EBUSY;
+
+        ra->mtu = mtu;
+
+        return 0;
+}
+
+_public_ int sd_radv_set_hop_limit(sd_radv *ra, uint8_t hop_limit) {
+        assert_return(ra, -EINVAL);
+
+        if (ra->state != SD_RADV_STATE_IDLE)
+                return -EBUSY;
+
+        ra->hop_limit = hop_limit;
+
+        return 0;
+}
+
+_public_ int sd_radv_set_router_lifetime(sd_radv *ra, uint32_t router_lifetime) {
+        assert_return(ra, -EINVAL);
+
+        if (ra->state != SD_RADV_STATE_IDLE)
+                return -EBUSY;
+
+        /* RFC 4191, Section 2.2, "...If the Router Lifetime is zero, the
+           preference value MUST be set to (00) by the sender..." */
+        if (router_lifetime == 0 &&
+            (ra->flags & (0x3 << 3)) != (SD_NDISC_PREFERENCE_MEDIUM << 3))
+                return -ETIME;
+
+        ra->lifetime = router_lifetime;
+
+        return 0;
+}
+
+_public_ int sd_radv_set_managed_information(sd_radv *ra, int managed) {
+        assert_return(ra, -EINVAL);
+
+        if (ra->state != SD_RADV_STATE_IDLE)
+                return -EBUSY;
+
+        SET_FLAG(ra->flags, ND_RA_FLAG_MANAGED, managed);
+
+        return 0;
+}
+
+_public_ int sd_radv_set_other_information(sd_radv *ra, int other) {
+        assert_return(ra, -EINVAL);
+
+        if (ra->state != SD_RADV_STATE_IDLE)
+                return -EBUSY;
+
+        SET_FLAG(ra->flags, ND_RA_FLAG_OTHER, other);
+
+        return 0;
+}
+
+_public_ int sd_radv_set_preference(sd_radv *ra, unsigned preference) {
+        int r = 0;
+
+        assert_return(ra, -EINVAL);
+        assert_return(IN_SET(preference,
+                             SD_NDISC_PREFERENCE_LOW,
+                             SD_NDISC_PREFERENCE_MEDIUM,
+                             SD_NDISC_PREFERENCE_HIGH), -EINVAL);
+
+        ra->flags = (ra->flags & ~(0x3 << 3)) | (preference << 3);
+
+        return r;
+}
+
+_public_ int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p) {
+        sd_radv_prefix *cur;
+        _cleanup_free_ char *addr_p = NULL;
+
+        assert_return(ra, -EINVAL);
+
+        if (!p)
+                return -EINVAL;
+
+        LIST_FOREACH(prefix, cur, ra->prefixes) {
+                int r;
+
+                r = in_addr_prefix_intersect(AF_INET6,
+                                             (union in_addr_union*) &cur->opt.in6_addr,
+                                             cur->opt.prefixlen,
+                                             (union in_addr_union*) &p->opt.in6_addr,
+                                             p->opt.prefixlen);
+                if (r > 0) {
+                        _cleanup_free_ char *addr_cur = NULL;
+
+                        (void) in_addr_to_string(AF_INET6,
+                                                 (union in_addr_union*) &cur->opt.in6_addr,
+                                                 &addr_cur);
+                        (void) in_addr_to_string(AF_INET6,
+                                                 (union in_addr_union*) &p->opt.in6_addr,
+                                                 &addr_p);
+
+                        log_radv("IPv6 prefix %s/%u already configured, ignoring %s/%u",
+                                 addr_cur, cur->opt.prefixlen,
+                                 addr_p, p->opt.prefixlen);
+
+                        return -EEXIST;
+                }
+        }
+
+        p = sd_radv_prefix_ref(p);
+
+        LIST_APPEND(prefix, ra->prefixes, p);
+
+        ra->n_prefixes++;
+
+        (void) in_addr_to_string(AF_INET6, (union in_addr_union*) &p->opt.in6_addr, &addr_p);
+        log_radv("Added prefix %s/%d", addr_p, p->opt.prefixlen);
+
+        return 0;
+}
+
+_public_ int sd_radv_prefix_new(sd_radv_prefix **ret) {
+        _cleanup_(sd_radv_prefix_unrefp) sd_radv_prefix *p = NULL;
+
+        assert_return(ret, -EINVAL);
+
+        p = new0(sd_radv_prefix, 1);
+        if (!p)
+                return -ENOMEM;
+
+        p->n_ref = 1;
+
+        p->opt.type = ND_OPT_PREFIX_INFORMATION;
+        p->opt.length = (sizeof(p->opt) - 1) /8 + 1;
+
+        p->opt.prefixlen = 64;
+
+        /* RFC 4861, Section 6.2.1 */
+        SET_FLAG(p->opt.flags, ND_OPT_PI_FLAG_ONLINK, true);
+        SET_FLAG(p->opt.flags, ND_OPT_PI_FLAG_AUTO, true);
+        p->opt.preferred_lifetime = htobe32(604800);
+        p->opt.valid_lifetime = htobe32(2592000);
+
+        LIST_INIT(prefix, p);
+
+        *ret = p;
+        p = NULL;
+
+        return 0;
+}
+
+_public_ sd_radv_prefix *sd_radv_prefix_ref(sd_radv_prefix *p) {
+        if (!p)
+                return NULL;
+
+        assert(p->n_ref > 0);
+        p->n_ref++;
+
+        return p;
+}
+
+_public_ sd_radv_prefix *sd_radv_prefix_unref(sd_radv_prefix *p) {
+        if (!p)
+                return NULL;
+
+        assert(p->n_ref > 0);
+        p->n_ref--;
+
+        if (p->n_ref > 0)
+                return NULL;
+
+        return mfree(p);
+}
+
+_public_ int sd_radv_prefix_set_prefix(sd_radv_prefix *p, struct in6_addr *in6_addr,
+                                       unsigned char prefixlen) {
+        assert_return(p, -EINVAL);
+        assert_return(in6_addr, -EINVAL);
+
+        if (prefixlen < 3 || prefixlen > 128)
+                return -EINVAL;
+
+        if (prefixlen > 64)
+                /* unusual but allowed, log it */
+                log_radv("Unusual prefix length %d greater than 64", prefixlen);
+
+        p->opt.in6_addr = *in6_addr;
+        p->opt.prefixlen = prefixlen;
+
+        return 0;
+}
+
+_public_ int sd_radv_prefix_set_onlink(sd_radv_prefix *p, int onlink) {
+        assert_return(p, -EINVAL);
+
+        SET_FLAG(p->opt.flags, ND_OPT_PI_FLAG_ONLINK, onlink);
+
+        return 0;
+}
+
+_public_ int sd_radv_prefix_set_address_autoconfiguration(sd_radv_prefix *p,
+                                                          int address_autoconfiguration) {
+        assert_return(p, -EINVAL);
+
+        SET_FLAG(p->opt.flags, ND_OPT_PI_FLAG_AUTO, address_autoconfiguration);
+
+        return 0;
+}
+
+_public_ int sd_radv_prefix_set_valid_lifetime(sd_radv_prefix *p,
+                                               uint32_t valid_lifetime) {
+        assert_return(p, -EINVAL);
+
+        p->opt.valid_lifetime = htobe32(valid_lifetime);
+
+        return 0;
+}
+
+_public_ int sd_radv_prefix_set_preferred_lifetime(sd_radv_prefix *p,
+                                                   uint32_t preferred_lifetime) {
+        assert_return(p, -EINVAL);
+
+        p->opt.preferred_lifetime = htobe32(preferred_lifetime);
+
+        return 0;
+}
index 2a101cb..f5f1284 100644 (file)
@@ -195,7 +195,7 @@ int dhcp_network_bind_raw_socket(
                 union sockaddr_union *link,
                 uint32_t id,
                 const uint8_t *addr, size_t addr_len,
-                uint16_t arp_type) {
+                uint16_t arp_type, uint16_t port) {
 
         if (socketpair(AF_UNIX, SOCK_STREAM, 0, test_fd) < 0)
                 return -errno;
@@ -203,7 +203,7 @@ int dhcp_network_bind_raw_socket(
         return test_fd[0];
 }
 
-int dhcp_network_bind_udp_socket(be32_t address, uint16_t port) {
+int dhcp_network_bind_udp_socket(int ifindex, be32_t address, uint16_t port) {
         int fd;
 
         fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC, 0);
index e81c508..26f2178 100644 (file)
@@ -63,7 +63,7 @@ static int test_basic(sd_event *event) {
         assert_se(sd_dhcp_server_configure_pool(server, &address_any, 28, 0, 0) == -EINVAL);
         assert_se(sd_dhcp_server_configure_pool(server, &address_lo, 38, 0, 0) == -ERANGE);
         assert_se(sd_dhcp_server_configure_pool(server, &address_lo, 8, 0, 0) >= 0);
-        assert_se(sd_dhcp_server_configure_pool(server, &address_lo, 8, 0, 0) == -EBUSY);
+        assert_se(sd_dhcp_server_configure_pool(server, &address_lo, 8, 0, 0) >= 0);
 
         test_pool(&address_any, 1, -EINVAL);
         test_pool(&address_lo, 1, 0);
index fe70697..89864fd 100644 (file)
@@ -17,7 +17,6 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <assert.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -72,10 +71,10 @@ int arp_send_probe(int fd, int ifindex,
                     be32_t pa, const struct ether_addr *ha) {
         struct ether_arp ea = {};
 
-        assert(fd >= 0);
-        assert(ifindex > 0);
-        assert(pa != 0);
-        assert(ha);
+        assert_se(fd >= 0);
+        assert_se(ifindex > 0);
+        assert_se(pa != 0);
+        assert_se(ha);
 
         return arp_network_send_raw_socket(fd, ifindex, &ea);
 }
@@ -84,10 +83,10 @@ int arp_send_announcement(int fd, int ifindex,
                           be32_t pa, const struct ether_addr *ha) {
         struct ether_arp ea = {};
 
-        assert(fd >= 0);
-        assert(ifindex > 0);
-        assert(pa != 0);
-        assert(ha);
+        assert_se(fd >= 0);
+        assert_se(ifindex > 0);
+        assert_se(pa != 0);
+        assert_se(ha);
 
         return arp_network_send_raw_socket(fd, ifindex, &ea);
 }
index 6bcd65d..430c58a 100644 (file)
@@ -98,14 +98,14 @@ static void test_receive_basic_packet(sd_event *e) {
 
         static const uint8_t frame[] = {
                 /* Ethernet header */
-                0x01, 0x80, 0xc2, 0x00, 0x00, 0x03,     /* Destination MAC*/
+                0x01, 0x80, 0xc2, 0x00, 0x00, 0x03,     /* Destination MAC */
                 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,     /* Source MAC */
                 0x88, 0xcc,                             /* Ethertype */
                 /* LLDP mandatory TLVs */
                 0x02, 0x07, 0x04, 0x00, 0x01, 0x02,     /* Chassis: MAC, 00:01:02:03:04:05 */
                 0x03, 0x04, 0x05,
                 0x04, 0x04, 0x05, 0x31, 0x2f, 0x33,     /* Port: interface name, "1/3" */
-                0x06, 0x02, 0x00, 0x78,                 /* TTL: 120 seconds*/
+                0x06, 0x02, 0x00, 0x78,                 /* TTL: 120 seconds */
                 /* LLDP optional TLVs */
                 0x08, 0x04, 0x50, 0x6f, 0x72, 0x74,     /* Port Description: "Port" */
                 0x0a, 0x03, 0x53, 0x59, 0x53,           /* System Name: "SYS" */
@@ -162,7 +162,7 @@ static void test_receive_incomplete_packet(sd_event *e) {
         sd_lldp_neighbor **neighbors;
         uint8_t frame[] = {
                 /* Ethernet header */
-                0x01, 0x80, 0xc2, 0x00, 0x00, 0x03,     /* Destination MAC*/
+                0x01, 0x80, 0xc2, 0x00, 0x00, 0x03,     /* Destination MAC */
                 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,     /* Source MAC */
                 0x88, 0xcc,                             /* Ethertype */
                 /* LLDP mandatory TLVs */
@@ -189,14 +189,14 @@ static void test_receive_oui_packet(sd_event *e) {
         sd_lldp_neighbor **neighbors;
         uint8_t frame[] = {
                 /* Ethernet header */
-                0x01, 0x80, 0xc2, 0x00, 0x00, 0x03,     /* Destination MAC*/
+                0x01, 0x80, 0xc2, 0x00, 0x00, 0x03,     /* Destination MAC */
                 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,     /* Source MAC */
                 0x88, 0xcc,                             /* Ethertype */
                 /* LLDP mandatory TLVs */
                 0x02, 0x07, 0x04, 0x00, 0x01, 0x02,     /* Chassis: MAC, 00:01:02:03:04:05 */
                 0x03, 0x04, 0x05,
                 0x04, 0x04, 0x05, 0x31, 0x2f, 0x33,     /* Port TLV: interface name, "1/3" */
-                0x06, 0x02, 0x00, 0x78,                 /* TTL: 120 seconds*/
+                0x06, 0x02, 0x00, 0x78,                 /* TTL: 120 seconds */
                 /* LLDP optional TLVs */
                 0xfe, 0x06, 0x00, 0x80, 0xc2, 0x01,     /* Port VLAN ID: 0x1234 */
                 0x12, 0x34,
diff --git a/src/libsystemd-network/test-ndisc-ra.c b/src/libsystemd-network/test-ndisc-ra.c
new file mode 100644 (file)
index 0000000..6e6d056
--- /dev/null
@@ -0,0 +1,359 @@
+/***
+  This file is part of systemd.
+
+  Copyright (C) 2017 Intel Corporation. All rights reserved.
+
+  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 <netinet/icmp6.h>
+#include <arpa/inet.h>
+
+#include "sd-radv.h"
+
+#include "alloc-util.h"
+#include "hexdecoct.h"
+#include "icmp6-util.h"
+#include "socket-util.h"
+#include "strv.h"
+
+static struct ether_addr mac_addr = {
+        .ether_addr_octet = { 0x78, 0x2b, 0xcb, 0xb3, 0x6d, 0x53 }
+};
+
+static uint8_t advertisement[] = {
+        /* ICMPv6 Router Advertisement, no checksum */
+        0x86, 0x00, 0x00, 0x00,  0x40, 0xc0, 0x00, 0xb4,
+        0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
+        /* Source Link Layer Address Option */
+        0x01, 0x01, 0x78, 0x2b,  0xcb, 0xb3, 0x6d, 0x53,
+        /* Prefix Information Option */
+        0x03, 0x04, 0x40, 0xc0,  0x00, 0x00, 0x01, 0xf4,
+        0x00, 0x00, 0x01, 0xb8,  0x00, 0x00, 0x00, 0x00,
+        0x20, 0x01, 0x0d, 0xb8,  0xde, 0xad, 0xbe, 0xef,
+        0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
+        /* Prefix Information Option */
+        0x03, 0x04, 0x40, 0xc0,  0x00, 0x27, 0x8d, 0x00,
+        0x00, 0x09, 0x3a, 0x80,  0x00, 0x00, 0x00, 0x00,
+        0x20, 0x01, 0x0d, 0xb8,  0x0b, 0x16, 0xd0, 0x0d,
+        0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
+        /* Prefix Information Option */
+        0x03, 0x04, 0x30, 0xc0,  0x00, 0x27, 0x8d, 0x00,
+        0x00, 0x09, 0x3a, 0x80,  0x00, 0x00, 0x00, 0x00,
+        0x20, 0x01, 0x0d, 0xb8,  0xc0, 0x01, 0x0d, 0xad,
+        0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
+        /* Recursive DNS Server Option - not yet supported */
+        0x19, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
+        0x20, 0x01, 0x0d, 0xb8, 0xde, 0xad, 0xbe, 0xef,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+        /* DNS Search List Option - not yet supported */
+        0x1f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
+        0x03, 0x6c, 0x61, 0x62, 0x05, 0x69, 0x6e, 0x74,
+        0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+static sd_event_source *test_hangcheck;
+static bool test_stopped;
+static int test_fd[2];
+static sd_event_source *recv_router_advertisement;
+static struct {
+        struct in6_addr address;
+        unsigned char prefixlen;
+        uint32_t valid;
+        uint32_t preferred;
+        bool succesful;
+} prefix[] = {
+        { { { { 0x20, 0x01, 0x0d, 0xb8, 0xde, 0xad, 0xbe, 0xef,
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 64,
+          500, 440, true },
+        { { { { 0x20, 0x01, 0x0d, 0xb8, 0x0b, 0x16, 0xd0, 0x0d,
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 64,
+          /* indicate default valid and preferred lifetimes for the test code */
+          0, 0, true },
+        { { { { 0x20, 0x01, 0x0d, 0xb8, 0x0b, 0x16, 0xd0, 0x0d,
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 58,
+          0, 0,
+          /* indicate that this prefix already exists */
+          false },
+        { { { { 0x20, 0x01, 0x0d, 0xb8, 0x0b, 0x16, 0xd0, 0x0d,
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 120,
+          0, 0,
+          /* indicate that this prefix already exists */
+          false },
+        { { { { 0x20, 0x01, 0x0d, 0xb8, 0x0b, 0x16, 0xd0, 0x0d,
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 12,
+          0, 0,
+          /* indicate that this prefix already exists */
+          false },
+        { { { { 0x20, 0x01, 0x0d, 0xb8, 0xc0, 0x01, 0x0d, 0xad,
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 48,
+          0, 0, true },
+        { { { { 0x20, 0x01, 0x0d, 0xb8, 0xc0, 0x01, 0x0d, 0xad,
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 60,
+          0, 0,
+          /* indicate that this prefix already exists */
+          false },
+};
+
+static int test_rs_hangcheck(sd_event_source *s, uint64_t usec,
+                             void *userdata) {
+        assert_se(false);
+
+        return 0;
+}
+
+static void test_radv_prefix(void) {
+        sd_radv_prefix *p;
+
+        printf("* %s\n", __FUNCTION__);
+
+        assert_se(sd_radv_prefix_new(&p) >= 0);
+
+        assert_se(sd_radv_prefix_set_onlink(NULL, true) < 0);
+        assert_se(sd_radv_prefix_set_onlink(p, true) >= 0);
+        assert_se(sd_radv_prefix_set_onlink(p, false) >= 0);
+
+        assert_se(sd_radv_prefix_set_address_autoconfiguration(NULL, true) < 0);
+        assert_se(sd_radv_prefix_set_address_autoconfiguration(p, true) >= 0);
+        assert_se(sd_radv_prefix_set_address_autoconfiguration(p, false) >= 0);
+
+        assert_se(sd_radv_prefix_set_valid_lifetime(NULL, true) < 0);
+        assert_se(sd_radv_prefix_set_valid_lifetime(p, ~0) >= 0);
+        assert_se(sd_radv_prefix_set_valid_lifetime(p, 42) >= 0);
+        assert_se(sd_radv_prefix_set_valid_lifetime(p, 0) >= 0);
+
+        assert_se(sd_radv_prefix_set_preferred_lifetime(NULL, true) < 0);
+        assert_se(sd_radv_prefix_set_preferred_lifetime(p, ~0) >= 0);
+        assert_se(sd_radv_prefix_set_preferred_lifetime(p, 42) >= 0);
+        assert_se(sd_radv_prefix_set_preferred_lifetime(p, 0) >= 0);
+
+        assert_se(sd_radv_prefix_set_prefix(NULL, NULL, 0) < 0);
+        assert_se(sd_radv_prefix_set_prefix(p, NULL, 0) < 0);
+
+        assert_se(sd_radv_prefix_set_prefix(p, &prefix[0].address, 64) >= 0);
+        assert_se(sd_radv_prefix_set_prefix(p, &prefix[0].address, 0) < 0);
+        assert_se(sd_radv_prefix_set_prefix(p, &prefix[0].address, 1) < 0);
+        assert_se(sd_radv_prefix_set_prefix(p, &prefix[0].address, 2) < 0);
+        assert_se(sd_radv_prefix_set_prefix(p, &prefix[0].address, 3) >= 0);
+        assert_se(sd_radv_prefix_set_prefix(p, &prefix[0].address, 125) >= 0);
+        assert_se(sd_radv_prefix_set_prefix(p, &prefix[0].address, 128) >= 0);
+        assert_se(sd_radv_prefix_set_prefix(p, &prefix[0].address, 129) < 0);
+        assert_se(sd_radv_prefix_set_prefix(p, &prefix[0].address, 255) < 0);
+
+        p = sd_radv_prefix_unref(p);
+        assert_se(!p);
+}
+
+static void test_radv(void) {
+        sd_radv *ra;
+
+        printf("* %s\n", __FUNCTION__);
+
+        assert_se(sd_radv_new(&ra) >= 0);
+        assert_se(ra);
+
+        assert_se(sd_radv_set_ifindex(NULL, 0) < 0);
+        assert_se(sd_radv_set_ifindex(ra, 0) >= 0);
+        assert_se(sd_radv_set_ifindex(ra, -1) >= 0);
+        assert_se(sd_radv_set_ifindex(ra, -2) < 0);
+        assert_se(sd_radv_set_ifindex(ra, 42) >= 0);
+
+        assert_se(sd_radv_set_mac(NULL, NULL) < 0);
+        assert_se(sd_radv_set_mac(ra, NULL) >= 0);
+        assert_se(sd_radv_set_mac(ra, &mac_addr) >= 0);
+
+        assert_se(sd_radv_set_mtu(NULL, 0) < 0);
+        assert_se(sd_radv_set_mtu(ra, 0) < 0);
+        assert_se(sd_radv_set_mtu(ra, 1279) < 0);
+        assert_se(sd_radv_set_mtu(ra, 1280) >= 0);
+        assert_se(sd_radv_set_mtu(ra, ~0) >= 0);
+
+        assert_se(sd_radv_set_hop_limit(NULL, 0) < 0);
+        assert_se(sd_radv_set_hop_limit(ra, 0) >= 0);
+        assert_se(sd_radv_set_hop_limit(ra, ~0) >= 0);
+
+        assert_se(sd_radv_set_router_lifetime(NULL, 0) < 0);
+        assert_se(sd_radv_set_router_lifetime(ra, 0) >= 0);
+        assert_se(sd_radv_set_router_lifetime(ra, ~0) >= 0);
+
+        assert_se(sd_radv_set_preference(NULL, 0) < 0);
+        assert_se(sd_radv_set_preference(ra, SD_NDISC_PREFERENCE_LOW) >= 0);
+        assert_se(sd_radv_set_preference(ra, SD_NDISC_PREFERENCE_MEDIUM) >= 0);
+        assert_se(sd_radv_set_preference(ra, SD_NDISC_PREFERENCE_HIGH) >= 0);
+        assert_se(sd_radv_set_preference(ra, ~0) < 0);
+
+        assert_se(sd_radv_set_preference(ra, SD_NDISC_PREFERENCE_HIGH) >= 0);
+        assert_se(sd_radv_set_router_lifetime(ra, 42000) >= 0);
+        assert_se(sd_radv_set_router_lifetime(ra, 0) < 0);
+        assert_se(sd_radv_set_preference(ra, SD_NDISC_PREFERENCE_MEDIUM) >= 0);
+        assert_se(sd_radv_set_router_lifetime(ra, 0) >= 0);
+
+        assert_se(sd_radv_set_managed_information(NULL, true) < 0);
+        assert_se(sd_radv_set_managed_information(ra, true) >= 0);
+        assert_se(sd_radv_set_managed_information(ra, false) >= 0);
+
+        assert_se(sd_radv_set_other_information(NULL, true) < 0);
+        assert_se(sd_radv_set_other_information(ra, true) >= 0);
+        assert_se(sd_radv_set_other_information(ra, false) >= 0);
+
+        ra = sd_radv_unref(ra);
+        assert_se(!ra);
+}
+
+int icmp6_bind_router_solicitation(int index) {
+        return -ENOSYS;
+}
+
+int icmp6_bind_router_advertisement(int index) {
+        assert_se(index == 42);
+
+        return test_fd[1];
+}
+
+int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr) {
+
+        return 0;
+}
+
+int icmp6_receive(int fd, void *iov_base, size_t iov_len,
+                  struct in6_addr *dst, triple_timestamp *timestamp) {
+        assert_se(read (fd, iov_base, iov_len) == (ssize_t)iov_len);
+
+        if (timestamp)
+                triple_timestamp_get(timestamp);
+
+        return 0;
+}
+
+static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
+        sd_radv *ra = userdata;
+        unsigned char buf[120];
+        size_t i;
+
+        read(test_fd[0], &buf, sizeof(buf));
+
+        /* router lifetime must be zero when test is stopped */
+        if (test_stopped) {
+                advertisement[6] = 0x00;
+                advertisement[7] = 0x00;
+        }
+
+        printf ("Received Router Advertisement with lifetime %u\n",
+                (advertisement[6] << 8) + advertisement[7]);
+
+        /* test only up to buf size, rest is not yet implemented */
+        for (i = 0; i < sizeof(buf); i++) {
+                printf("0x%02x", buf[i]);
+
+                assert_se(buf[i] == advertisement[i]);
+
+                if ((i + 1) % 8)
+                        printf(", ");
+                else
+                        printf("\n");
+        }
+
+        if (test_stopped) {
+                sd_event *e;
+
+                e = sd_radv_get_event(ra);
+                sd_event_exit(e, 0);
+
+                return 0;
+        }
+
+        assert_se(sd_radv_stop(ra) >= 0);
+        test_stopped = true;
+
+        return 0;
+}
+
+static void test_ra(void) {
+        sd_event *e;
+        sd_radv *ra;
+        usec_t time_now = now(clock_boottime_or_monotonic());
+        unsigned int i;
+
+        printf("* %s\n", __FUNCTION__);
+
+        assert_se(socketpair(AF_UNIX, SOCK_SEQPACKET, 0, test_fd) >= 0);
+
+        assert_se(sd_event_new(&e) >= 0);
+
+        assert_se(sd_radv_new(&ra) >= 0);
+        assert_se(ra);
+
+        assert_se(sd_radv_attach_event(ra, e, 0) >= 0);
+
+        assert_se(sd_radv_set_ifindex(ra, 42) >= 0);
+        assert_se(sd_radv_set_mac(ra, &mac_addr) >= 0);
+        assert_se(sd_radv_set_router_lifetime(ra, 180) >= 0);
+        assert_se(sd_radv_set_hop_limit(ra, 64) >= 0);
+        assert_se(sd_radv_set_managed_information(ra, true) >= 0);
+        assert_se(sd_radv_set_other_information(ra, true) >= 0);
+
+        for (i = 0; i < ELEMENTSOF(prefix); i++) {
+                sd_radv_prefix *p;
+
+                printf("Test prefix %u\n", i);
+                assert_se(sd_radv_prefix_new(&p) >= 0);
+
+                assert_se(sd_radv_prefix_set_prefix(p, &prefix[i].address,
+                                                    prefix[i].prefixlen) >= 0);
+                if (prefix[i].valid)
+                        assert_se(sd_radv_prefix_set_valid_lifetime(p, prefix[i].valid) >= 0);
+                if (prefix[i].preferred)
+                        assert_se(sd_radv_prefix_set_preferred_lifetime(p, prefix[i].preferred) >= 0);
+
+                assert_se((sd_radv_add_prefix(ra, p) >= 0) == prefix[i].succesful);
+                assert_se(sd_radv_add_prefix(ra, p) < 0);
+
+                p = sd_radv_prefix_unref(p);
+                assert_se(!p);
+        }
+
+        assert_se(sd_event_add_io(e, &recv_router_advertisement, test_fd[0],
+                                  EPOLLIN, radv_recv, ra) >= 0);
+
+        assert_se(sd_event_add_time(e, &test_hangcheck, clock_boottime_or_monotonic(),
+                                 time_now + 2 *USEC_PER_SEC, 0,
+                                 test_rs_hangcheck, NULL) >= 0);
+
+        assert_se(sd_radv_start(ra) >= 0);
+
+        sd_event_loop(e);
+
+        test_hangcheck = sd_event_source_unref(test_hangcheck);
+
+        ra = sd_radv_unref(ra);
+        assert_se(!ra);
+
+        close(test_fd[0]);
+
+        sd_event_unref(e);
+}
+
+int main(int argc, char *argv[]) {
+
+        log_set_max_level(LOG_DEBUG);
+        log_parse_environment();
+        log_open();
+
+        test_radv_prefix();
+        test_radv();
+        test_ra();
+
+        printf("* done\n");
+        return 0;
+}
index d966948..c3e1a8e 100644 (file)
@@ -27,6 +27,7 @@
 #include "icmp6-util.h"
 #include "socket-util.h"
 #include "strv.h"
+#include "ndisc-internal.h"
 
 static struct ether_addr mac_addr = {
         .ether_addr_octet = {'A', 'B', 'C', '1', '2', '3'}
@@ -35,6 +36,7 @@ static struct ether_addr mac_addr = {
 static bool verbose = false;
 static sd_event_source *test_hangcheck;
 static int test_fd[2];
+static sd_ndisc *test_timeout_nd;
 
 typedef int (*send_ra_t)(uint8_t flags);
 static send_ra_t send_ra_function;
@@ -193,6 +195,21 @@ int icmp6_bind_router_solicitation(int index) {
         return test_fd[0];
 }
 
+int icmp6_bind_router_advertisement(int index) {
+
+        return -ENOSYS;
+}
+
+int icmp6_receive(int fd, void *iov_base, size_t iov_len,
+                  struct in6_addr *dst, triple_timestamp *timestamp) {
+        assert (read (fd, iov_base, iov_len) == (ssize_t)iov_len);
+
+        if (timestamp)
+                triple_timestamp_get(timestamp);
+
+        return 0;
+}
+
 static int send_ra(uint8_t flags) {
         uint8_t advertisement[] = {
                 0x86, 0x00, 0xde, 0x83, 0x40, 0xc0, 0x00, 0xb4,
@@ -222,6 +239,9 @@ static int send_ra(uint8_t flags) {
 }
 
 int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr) {
+        if (!send_ra_function)
+                return 0;
+
         return send_ra_function(0);
 }
 
@@ -305,6 +325,100 @@ static void test_rs(void) {
         sd_event_unref(e);
 }
 
+static int test_timeout_value(uint8_t flags) {
+        static int count = 0;
+        static usec_t last = 0;
+        sd_ndisc *nd = test_timeout_nd;
+        usec_t min, max;
+        char time_string_min[FORMAT_TIMESPAN_MAX];
+        char time_string_nd[FORMAT_TIMESPAN_MAX];
+        char time_string_max[FORMAT_TIMESPAN_MAX];
+
+        assert_se(nd);
+        assert_se(nd->event);
+
+        if (++count >= 20)
+                sd_event_exit(nd->event, 0);
+
+        if (last == 0) {
+                /* initial RT = IRT + RAND*IRT  */
+                min = NDISC_ROUTER_SOLICITATION_INTERVAL -
+                        NDISC_ROUTER_SOLICITATION_INTERVAL / 10;
+                max = NDISC_ROUTER_SOLICITATION_INTERVAL +
+                        NDISC_ROUTER_SOLICITATION_INTERVAL / 10;
+        } else {
+                /* next RT = 2*RTprev + RAND*RTprev */
+                min = 2 * last - last / 10;
+                max = 2 * last + last / 10;
+        }
+
+        /* final RT > MRT */
+        if (last * 2 > NDISC_MAX_ROUTER_SOLICITATION_INTERVAL) {
+                min = NDISC_MAX_ROUTER_SOLICITATION_INTERVAL -
+                        NDISC_MAX_ROUTER_SOLICITATION_INTERVAL / 10;
+                max = NDISC_MAX_ROUTER_SOLICITATION_INTERVAL +
+                        NDISC_MAX_ROUTER_SOLICITATION_INTERVAL / 10;
+        }
+
+        format_timespan(time_string_min, FORMAT_TIMESPAN_MAX,
+                        min, USEC_PER_MSEC);
+        format_timespan(time_string_nd, FORMAT_TIMESPAN_MAX,
+                        nd->retransmit_time, USEC_PER_MSEC);
+        format_timespan(time_string_max, FORMAT_TIMESPAN_MAX,
+                        max, USEC_PER_MSEC);
+
+        log_info("backoff timeout interval %2d %s%s <= %s <= %s",
+                 count,
+                 (last * 2 > NDISC_MAX_ROUTER_SOLICITATION_INTERVAL)? "(max) ": "",
+                 time_string_min, time_string_nd, time_string_max);
+
+        assert_se(min <= nd->retransmit_time);
+        assert_se(max >= nd->retransmit_time);
+
+        last = nd->retransmit_time;
+
+        assert_se(sd_event_source_set_time(nd->timeout_event_source, 0) >= 0);
+
+        return 0;
+}
+
+static void test_timeout(void) {
+        sd_event *e;
+        sd_ndisc *nd;
+        usec_t time_now = now(clock_boottime_or_monotonic());
+
+        if (verbose)
+                printf("* %s\n", __FUNCTION__);
+
+        send_ra_function = test_timeout_value;
+
+        assert_se(sd_event_new(&e) >= 0);
+
+        assert_se(sd_ndisc_new(&nd) >= 0);
+        assert_se(nd);
+
+        test_timeout_nd = nd;
+
+        assert_se(sd_ndisc_attach_event(nd, e, 0) >= 0);
+
+        assert_se(sd_ndisc_set_ifindex(nd, 42) >= 0);
+        assert_se(sd_ndisc_set_mac(nd, &mac_addr) >= 0);
+
+        assert_se(sd_event_add_time(e, &test_hangcheck, clock_boottime_or_monotonic(),
+                                 time_now + 2U * USEC_PER_SEC, 0,
+                                 test_rs_hangcheck, NULL) >= 0);
+
+        assert_se(sd_ndisc_start(nd) >= 0);
+
+        sd_event_loop(e);
+
+        test_hangcheck = sd_event_source_unref(test_hangcheck);
+
+        nd = sd_ndisc_unref(nd);
+
+        sd_event_unref(e);
+}
+
 int main(int argc, char *argv[]) {
 
         log_set_max_level(LOG_DEBUG);
@@ -312,6 +426,7 @@ int main(int argc, char *argv[]) {
         log_open();
 
         test_rs();
+        test_timeout();
 
         return 0;
 }
diff --git a/src/libsystemd-network/test-sd-dhcp-lease.c b/src/libsystemd-network/test-sd-dhcp-lease.c
new file mode 100644 (file)
index 0000000..0f88180
--- /dev/null
@@ -0,0 +1,90 @@
+#include <errno.h>
+
+#include "dhcp-lease-internal.h"
+#include "macro.h"
+#include "string-util.h"
+#include "strv.h"
+
+/* According to RFC1035 section 4.1.4, a domain name in a message can be either:
+ *      - a sequence of labels ending in a zero octet
+ *      - a pointer
+ *      - a sequence of labels ending with a pointer
+ */
+static void test_dhcp_lease_parse_search_domains_basic(void) {
+        int r;
+        _cleanup_strv_free_ char **domains = NULL;
+        static const uint8_t optionbuf[] = {
+                0x03, 'F', 'O', 'O', 0x03, 'B', 'A', 'R', 0x00,
+                0x04, 'A', 'B', 'C', 'D', 0x03, 'E', 'F', 'G', 0x00,
+        };
+
+        r = dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains);
+        assert_se(r == 2);
+        assert_se(streq(domains[0], "FOO.BAR"));
+        assert_se(streq(domains[1], "ABCD.EFG"));
+}
+
+static void test_dhcp_lease_parse_search_domains_ptr(void) {
+        int r;
+        _cleanup_strv_free_ char **domains = NULL;
+        static const uint8_t optionbuf[] = {
+                0x03, 'F', 'O', 'O', 0x00, 0xC0, 0x00,
+        };
+
+        r = dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains);
+        assert_se(r == 2);
+        assert_se(streq(domains[0], "FOO"));
+        assert_se(streq(domains[1], "FOO"));
+}
+
+static void test_dhcp_lease_parse_search_domains_labels_and_ptr(void) {
+        int r;
+        _cleanup_strv_free_ char **domains = NULL;
+        static const uint8_t optionbuf[] = {
+                0x03, 'F', 'O', 'O', 0x03, 'B', 'A', 'R', 0x00,
+                0x03, 'A', 'B', 'C', 0xC0, 0x04,
+        };
+
+        r = dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains);
+        assert_se(r == 2);
+        assert_se(streq(domains[0], "FOO.BAR"));
+        assert_se(streq(domains[1], "ABC.BAR"));
+}
+
+/* Tests for exceptions. */
+
+static void test_dhcp_lease_parse_search_domains_no_data(void) {
+        _cleanup_strv_free_ char **domains = NULL;
+        static const uint8_t optionbuf[3] = {0, 0, 0};
+
+        assert_se(dhcp_lease_parse_search_domains(NULL, 0, &domains) == -ENODATA);
+        assert_se(dhcp_lease_parse_search_domains(optionbuf, 0, &domains) == -ENODATA);
+}
+
+static void test_dhcp_lease_parse_search_domains_loops(void) {
+        _cleanup_strv_free_ char **domains = NULL;
+        static const uint8_t optionbuf[] = {
+                0x03, 'F', 'O', 'O', 0x00, 0x03, 'B', 'A', 'R', 0xC0, 0x06,
+        };
+
+        assert_se(dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains) == -EBADMSG);
+}
+
+static void test_dhcp_lease_parse_search_domains_wrong_len(void) {
+        _cleanup_strv_free_ char **domains = NULL;
+        static const uint8_t optionbuf[] = {
+                0x03, 'F', 'O', 'O', 0x03, 'B', 'A', 'R', 0x00,
+                0x04, 'A', 'B', 'C', 'D', 0x03, 'E', 'F', 'G', 0x00,
+        };
+
+        assert_se(dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf) - 5, &domains) == -EBADMSG);
+}
+
+int main(int argc, char *argv[]) {
+        test_dhcp_lease_parse_search_domains_basic();
+        test_dhcp_lease_parse_search_domains_ptr();
+        test_dhcp_lease_parse_search_domains_labels_and_ptr();
+        test_dhcp_lease_parse_search_domains_no_data();
+        test_dhcp_lease_parse_search_domains_loops();
+        test_dhcp_lease_parse_search_domains_wrong_len();
+}
index e8f7950..7e6d499 100644 (file)
@@ -7,7 +7,7 @@
 
 prefix=@prefix@
 exec_prefix=@exec_prefix@
-libdir=@libdir@
+libdir=@rootlibdir@
 includedir=@includedir@
 
 Name: systemd
index 8e2b220..92cb790 100644 (file)
@@ -501,8 +501,24 @@ global:
         sd_event_get_iteration;
 } LIBSYSTEMD_230;
 
+LIBSYSTEMD_232 {
+global:
+        sd_bus_track_set_recursive;
+        sd_bus_track_get_recursive;
+        sd_bus_track_count_name;
+        sd_bus_track_count_sender;
+        sd_bus_set_exit_on_disconnect;
+        sd_bus_get_exit_on_disconnect;
+        sd_id128_get_invocation;
+} LIBSYSTEMD_231;
+
+LIBSYSTEMD_233 {
+global:
+        sd_id128_get_machine_app_specific;
+        sd_is_socket_sockaddr;
+} LIBSYSTEMD_232;
 
 LIBSYSTEMD_234 {
 global:
         sd_bus_message_appendv;
-} LIBSYSTEMD_231;
\ No newline at end of file
+} LIBSYSTEMD_233;
diff --git a/src/libsystemd/meson.build b/src/libsystemd/meson.build
new file mode 100644 (file)
index 0000000..bf73bd5
--- /dev/null
@@ -0,0 +1,96 @@
+sd_login_c = files('sd-login/sd-login.c')
+
+libsystemd_internal_sources = files('''
+        sd-bus/bus-bloom.c
+        sd-bus/bus-bloom.h
+        sd-bus/bus-common-errors.c
+        sd-bus/bus-common-errors.h
+        sd-bus/bus-container.c
+        sd-bus/bus-container.h
+        sd-bus/bus-control.c
+        sd-bus/bus-control.h
+        sd-bus/bus-convenience.c
+        sd-bus/bus-creds.c
+        sd-bus/bus-creds.h
+        sd-bus/bus-dump.c
+        sd-bus/bus-dump.h
+        sd-bus/bus-error.c
+        sd-bus/bus-error.h
+        sd-bus/bus-gvariant.c
+        sd-bus/bus-gvariant.h
+        sd-bus/bus-internal.c
+        sd-bus/bus-internal.h
+        sd-bus/bus-introspect.c
+        sd-bus/bus-introspect.h
+        sd-bus/bus-kernel.c
+        sd-bus/bus-kernel.h
+        sd-bus/bus-match.c
+        sd-bus/bus-match.h
+        sd-bus/bus-message.c
+        sd-bus/bus-message.h
+        sd-bus/bus-objects.c
+        sd-bus/bus-objects.h
+        sd-bus/bus-protocol.h
+        sd-bus/bus-signature.c
+        sd-bus/bus-signature.h
+        sd-bus/bus-slot.c
+        sd-bus/bus-slot.h
+        sd-bus/bus-socket.c
+        sd-bus/bus-socket.h
+        sd-bus/bus-track.c
+        sd-bus/bus-track.h
+        sd-bus/bus-type.c
+        sd-bus/bus-type.h
+        sd-bus/sd-bus.c
+        sd-daemon/sd-daemon.c
+        sd-device/device-enumerator-private.h
+        sd-device/device-enumerator.c
+        sd-device/device-internal.h
+        sd-device/device-private.c
+        sd-device/device-private.h
+        sd-device/device-util.h
+        sd-device/sd-device.c
+        sd-event/sd-event.c
+        sd-hwdb/hwdb-internal.h
+        sd-hwdb/hwdb-util.h
+        sd-hwdb/sd-hwdb.c
+        sd-id128/id128-util.c
+        sd-id128/id128-util.h
+        sd-id128/sd-id128.c
+        sd-netlink/local-addresses.c
+        sd-netlink/local-addresses.h
+        sd-netlink/netlink-internal.h
+        sd-netlink/netlink-message.c
+        sd-netlink/netlink-socket.c
+        sd-netlink/netlink-types.c
+        sd-netlink/netlink-types.h
+        sd-netlink/netlink-util.c
+        sd-netlink/netlink-util.h
+        sd-netlink/rtnl-message.c
+        sd-netlink/sd-netlink.c
+        sd-network/network-util.c
+        sd-network/network-util.h
+        sd-network/sd-network.c
+        sd-path/sd-path.c
+        sd-resolve/sd-resolve.c
+        sd-utf8/sd-utf8.c
+'''.split()) + sd_login_c
+
+libsystemd_internal = static_library(
+        'systemd',
+        libsystemd_internal_sources,
+        install : false,
+        include_directories : includes,
+        link_with : libbasic,
+        dependencies : [threads,
+                        librt])
+
+libsystemd_sym = 'src/libsystemd/libsystemd.sym'
+
+libsystemd_pc = configure_file(
+        input : 'libsystemd.pc.in',
+        output : 'libsystemd.pc',
+        configuration : substs)
+install_data(libsystemd_pc,
+             install_dir : pkgconfiglibdir)
+install_data('sd-bus/graphinfo.gvpr', install_dir : pkgdatadir)
diff --git a/src/libsystemd/sd-bus/DIFFERENCES b/src/libsystemd/sd-bus/DIFFERENCES
deleted file mode 100644 (file)
index db26967..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-Known differences between dbus1 and kdbus:
-
-- NameAcquired/NameLost is gone entirely on kdbus backends if
-  libsystemd is used. It is still added in by systemd-bus-proxyd
-  for old dbus1 clients, and it is available if libsystemd is used
-  against the classic dbus1 daemon. If you want to write compatible
-  code with libsystem-bus you need to explicitly subscribe to
-  NameOwnerChanged signals and just ignore NameAcquired/NameLost
-
-- Applications have to deal with spurious signals they didn't expect,
-  due to the probabilistic bloom filters. They need to handle this
-  anyway, given that any client can send anything to arbitrary clients
-  anyway, even in dbus1, so not much changes.
-
-- clients of the system bus when kdbus is used must roll their own
-  security. Only legacy dbus1 clients get the old XML policy enforced,
-  which is implemented by systemd-bus-proxyd.
-
-- Serial numbers of synthesized messages are always (uint32_t) -1.
-
-- NameOwnerChanged is a synthetic message, generated locally and not
-  by the driver. On dbus1 only the Disconnected message was
-  synthesized like this.
-
-- There's no standard per-session bus anymore. Only a per-user bus.
index 6aeb113..3110d57 100644 (file)
@@ -73,10 +73,9 @@ the reply_cookie/reply_serial additional header field has been
 increased from 32bit to 64bit, too!
 
 The header field identifiers have been extended from 8bit to
-64bit. This has been done to simplify things (as kdbus otherwise uses
-exclusively 64bit types, unless there is a strong reason not to), and
-has no effect on the serialization size, as due to alignment for each
-8bit header field identifier 56 bits of padding had to be added.
+64bit. This has been done to simplify things, and has no effect
+on the serialization size, as due to alignment for each 8bit
+header field identifier 56 bits of padding had to be added.
 
 Note that the header size changed, due to these changes. However,
 consider that on dbus1 the beginning of the fields array contains the
@@ -94,16 +93,12 @@ array, the size of the header on dbus1 and dbus2 stays identical, at
 
 And that's already it.
 
-Note: to simplify parsing, valid kdbus/dbus2 messages must include the
-entire fixed header and additional header fields in a single non-memfd
-message part. Also, the signature string of the body variant all the
-way to the end of the message must be in a single non-memfd part
-too. The parts for this extended header and footer can be the same
-one, and can also continue any amount of additional body bytes.
-
-Note: on kdbus only native endian messages marshalled in gvariant may
-      be sent. If a client receives a message in non-native endianness
-      or in dbus1 marshalling it shall ignore the message.
+Note: To simplify parsing, valid dbus2 messages must include the entire
+      fixed header and additional header fields in a single non-memfd
+      message part. Also, the signature string of the body variant all the
+      way to the end of the message must be in a single non-memfd part
+      too. The parts for this extended header and footer can be the same
+      one, and can also continue any amount of additional body bytes.
 
 Note: The GVariant "MAYBE" type is not supported, so that messages can
       be fully converted forth and back between dbus1 and gvariant
diff --git a/src/libsystemd/sd-bus/PORTING-DBUS1 b/src/libsystemd/sd-bus/PORTING-DBUS1
deleted file mode 100644 (file)
index 2dedb28..0000000
+++ /dev/null
@@ -1,535 +0,0 @@
-A few hints on supporting kdbus as backend in your favorite D-Bus library.
-
-~~~
-
-Before you read this, have a look at the DIFFERENCES and
-GVARIANT_SERIALIZATION texts you find in the same directory where you
-found this.
-
-We invite you to port your favorite D-Bus protocol implementation
-over to kdbus. However, there are a couple of complexities
-involved. On kdbus we only speak GVariant marshaling, kdbus clients
-ignore traffic in dbus1 marshaling. Thus, you need to add a second,
-GVariant compatible marshaler to your library first.
-
-After you have done that: here's the basic principle how kdbus works:
-
-You connect to a bus by opening its bus node in /sys/fs/kdbus/. All
-buses have a device node there, it starts with a numeric UID of the
-owner of the bus, followed by a dash and a string identifying the
-bus. The system bus is thus called /sys/fs/kdbus/0-system, and for user
-buses the device node is /sys/fs/kdbus/1000-user (if 1000 is your user
-id).
-
-(Before we proceed, please always keep a copy of libsystemd next
-to you, ultimately that's where the details are, this document simply
-is a rough overview to help you grok things.)
-
-CONNECTING
-
-To connect to a bus, simply open() its device node and issue the
-KDBUS_CMD_HELLO call. That's it. Now you are connected. Do not send
-Hello messages or so (as you would on dbus1), that does not exist for
-kdbus.
-
-The structure you pass to the ioctl will contain a couple of
-parameters that you need to know, to operate on the bus.
-
-There are two flags fields, one indicating features of the kdbus
-kernel side ("conn_flags"), the other one ("bus_flags") indicating
-features of the bus owner (i.e. systemd). Both flags fields are 64bit
-in width.
-
-When calling into the ioctl, you need to place your own supported
-feature bits into these fields. This tells the kernel about the
-features you support. When the ioctl returns, it will contain the
-features the kernel supports.
-
-If any of the higher 32bit are set on the two flags fields and your
-client does not know what they mean, it must disconnect. The upper
-32bit are used to indicate "incompatible" feature additions on the bus
-system, the lower 32bit indicate "compatible" feature additions. A
-client that does not support a "compatible" feature addition can go on
-communicating with the bus, however a client that does not support an
-"incompatible" feature must not proceed with the connection. When a
-client encountes such an "incompatible" feature it should immediately
-try the next bus address configured in the bus address string.
-
-The hello structure also contains another flags field "attach_flags"
-which indicates metadata that is optionally attached to all incoming
-messages. You probably want to set KDBUS_ATTACH_NAMES unconditionally
-in it. This has the effect that all well-known names of a sender are
-attached to all incoming messages. You need this information to
-implement matches that match on a message sender name correctly. Of
-course, you should only request the attachment of as little metadata
-fields as you need.
-
-The kernel will return in the "id" field your unique id. This is a
-simple numeric value. For compatibility with classic dbus1 simply
-format this as string and prefix ":1.".
-
-The kernel will also return the bloom filter size and bloom filter
-hash function number used for the signal broadcast bloom filter (see
-below).
-
-The kernel will also return the bus ID of the bus in a 128bit field.
-
-The pool size field specifies the size of the memory mapped buffer.
-After the calling the hello ioctl, you should memory map the kdbus
-fd. In this memory mapped region, the kernel will place all your incoming
-messages.
-
-SENDING MESSAGES
-
-Use the MSG_SEND ioctl to send a message to another peer. The ioctl
-takes a structure that contains a variety of fields:
-
-The flags field corresponds closely to the old dbus1 message header
-flags field, though the DONT_EXPECT_REPLY field got inverted into
-EXPECT_REPLY.
-
-The dst_id/src_id field contains the unique id of the destination and
-the sender. The sender field is overridden by the kernel usually, hence
-you shouldn't fill it in. The destination field can also take the
-special value KDBUS_DST_ID_BROADCAST for broadcast messages. For
-messages intended to a well-known name set the field to
-KDBUS_DST_ID_NAME, and attach the name in a special "items" entry to
-the message (see below).
-
-The payload field indicates the payload. For all dbus traffic it
-should carry the value 0x4442757344427573ULL. (Which encodes
-'DBusDBus').
-
-The cookie field corresponds with the "serial" field of classic
-dbus1. We simply renamed it here (and extended it to 64bit) since we
-didn't want to imply the monotonicity of the assignment the way the
-word "serial" indicates it.
-
-When sending a message that expects a reply, you need to set the
-EXPECT_REPLY flag in the message flag field. In this case you should
-also fill out the "timeout_ns" value which indicates the timeout in
-nsec for this call. If the peer does not respond in this time you will
-get a notification of a timeout. Note that this is also used for
-security purposes: a single reply messages is only allowed through the
-bus as long as the timeout has not ended. With this timeout value you
-hence "open a time window" in which the peer might respond to your
-request and the policy allows the response to go through.
-
-When sending a message that is a reply, you need to fill in the
-cookie_reply field, which is similar to the reply_serial field of
-dbus1. Note that a message cannot have EXPECT_REPLY and a reply_serial
-at the same time!
-
-This pretty much explains the ioctl header. The actual payload of the
-data is now referenced in additional items that are attached to this
-ioctl header structure at the end. When sending a message, you attach
-items of the type PAYLOAD_VEC, PAYLOAD_MEMFD, FDS, BLOOM_FILTER,
-DST_NAME to it:
-
-   KDBUS_ITEM_PAYLOAD_VEC: contains a pointer + length pair for
-   referencing arbitrary user memory. This is how you reference most
-   of your data. It's a lot like the good old iovec structure of glibc.
-
-   KDBUS_ITEM_PAYLOAD_MEMFD: for large data blocks it is preferable
-   to send prepared "memfds" (see below) over. This item contains an
-   fd for a memfd plus a size.
-
-   KDBUS_ITEM_FDS: for sending over fds attach an item of this type with
-   an array of fds.
-
-   KDBUS_ITEM_BLOOM_FILTER: the calculated bloom filter of this message,
-   only for undirected (broadcast) message.
-
-   KDBUS_ITEM_DST_NAME: for messages that are directed to a well-known
-   name (instead of a unique name), this item contains the well-known
-   name field.
-
-A single message may consists of no, one or more payload items of type
-PAYLOAD_VEC or PAYLOAD_MEMFD. D-Bus protocol implementations should
-treat them as a single block that just happens to be split up into
-multiple items. Some restrictions apply however:
-
-   The message header in its entirety must be contained in a single
-   PAYLOAD_VEC item.
-
-   You may only split your message up right in front of each GVariant
-   contained in the payload, as well is immediately before framing of a
-   Gvariant, as well after as any padding bytes if there are any. The
-   padding bytes must be wholly contained in the preceding
-   PAYLOAD_VEC/PAYLOAD_MEMFD item. You may not split up basic types
-   nor arrays of fixed types. The latter is necessary to allow APIs
-   to return direct pointers to linear arrays of numeric
-   values. Examples: The basic types "u", "s", "t" have to be in the
-   same payload item. The array of fixed types "ay", "ai" have to be
-   fully in contained in the same payload item. For an array "as" or
-   "a(si)" the only restriction however is to keep each string
-   individually in an uninterrupted item, to keep the framing of each
-   element and the array in a single uninterrupted item, however the
-   various strings might end up in different items.
-
-Note again, that splitting up messages into separate items is up to the
-implementation. Also note that the kdbus kernel side might merge
-separate items if it deems this to be useful. However, the order in
-which items are contained in the message is left untouched.
-
-PAYLOAD_MEMFD items allow zero-copy data transfer (see below regarding
-the memfd concept). Note however that the overhead of mapping these
-makes them relatively expensive, and only worth the trouble for memory
-blocks > 512K (this value appears to be quite universal across
-architectures, as we tested). Thus we recommend sending PAYLOAD_VEC
-items over for small messages and restore to PAYLOAD_MEMFD items for
-messages > 512K. Since while building up the message you might not
-know yet whether it will grow beyond this boundary a good approach is
-to simply build the message unconditionally in a memfd
-object. However, when the message is sealed to be sent away check for
-the size limit. If the size of the message is < 512K, then simply send
-the data as PAYLOAD_VEC and reuse the memfd. If it is >= 512K, seal
-the memfd and send it as PAYLOAD_MEMFD, and allocate a new memfd for
-the next message.
-
-RECEIVING MESSAGES
-
-Use the MSG_RECV ioctl to read a message from kdbus. This will return
-an offset into the pool memory map, relative to its beginning.
-
-The received message structure more or less follows the structure of
-the message originally sent. However, certain changes have been
-made. In the header the src_id field will be filled in.
-
-The payload items might have gotten merged and PAYLOAD_VEC items are
-not used. Instead, you will only find PAYLOAD_OFF and PAYLOAD_MEMFD
-items. The former contain an offset and size into your memory mapped
-pool where you find the payload.
-
-If during the HELLO ioctl you asked for getting metadata attached to
-your message, you will find additional KDBUS_ITEM_CREDS,
-KDBUS_ITEM_PID_COMM, KDBUS_ITEM_TID_COMM, KDBUS_ITEM_TIMESTAMP,
-KDBUS_ITEM_EXE, KDBUS_ITEM_CMDLINE, KDBUS_ITEM_CGROUP,
-KDBUS_ITEM_CAPS, KDBUS_ITEM_SECLABEL, KDBUS_ITEM_AUDIT items that
-contain this metadata. This metadata will be gathered from the sender
-at the point in time it sends the message. This information is
-uncached, and since it is appended by the kernel, trustable. The
-KDBUS_ITEM_SECLABEL item usually contains the SELinux security label,
-if it is used.
-
-After processing the message you need to call the KDBUS_CMD_FREE
-ioctl, which releases the message from the pool, and allows the kernel
-to store another message there. Note that the memory used by the pool
-is ordinary anonymous, swappable memory that is backed by tmpfs. Hence
-there is no need to copy the message out of it quickly, instead you
-can just leave it there as long as you need it and release it via the
-FREE ioctl only after that's done.
-
-BLOOM FILTERS
-
-The kernel does not understand dbus marshaling, it will not look into
-the message payload. To allow clients to subscribe to specific subsets
-of the broadcast matches we employ bloom filters.
-
-When broadcasting messages, a bloom filter needs to be attached to the
-message in a KDBUS_ITEM_BLOOM item (and only for broadcasting
-messages!). If you don't know what bloom filters are, read up now on
-Wikipedia. In short: they are a very efficient way how to
-probabilistically check whether a certain word is contained in a
-vocabulary. It knows no false negatives, but it does know false
-positives.
-
-The parameters for the bloom filters that need to be included in
-broadcast message is communicated to userspace as part of the hello
-response structure (see above). By default it has the parameters m=512
-(bits in the filter), k=8 (nr of hash functions). Note however, that
-this is subject to change in later versions, and userspace
-implementations must be capable of handling m values between at least
-m=8 and m=2^32, and k values between at least k=1 and k=32. The
-underlying hash function is SipHash-2-4. It is used with a number of
-constant (yet originally randomly generated) 128bit hash keys, more
-specifically:
-
-   b9,66,0b,f0,46,70,47,c1,88,75,c4,9c,54,b9,bd,15,
-   aa,a1,54,a2,e0,71,4b,39,bf,e1,dd,2e,9f,c5,4a,3b,
-   63,fd,ae,be,cd,82,48,12,a1,6e,41,26,cb,fa,a0,c8,
-   23,be,45,29,32,d2,46,2d,82,03,52,28,fe,37,17,f5,
-   56,3b,bf,ee,5a,4f,43,39,af,aa,94,08,df,f0,fc,10,
-   31,80,c8,73,c7,ea,46,d3,aa,25,75,0f,9e,4c,09,29,
-   7d,f7,18,4b,7b,a4,44,d5,85,3c,06,e0,65,53,96,6d,
-   f2,77,e9,6f,93,b5,4e,71,9a,0c,34,88,39,25,bf,35
-
-When calculating the first bit index into the bloom filter, the
-SipHash-2-4 hash value is calculated for the input data and the first
-16 bytes of the array above as hash key. Of the resulting 8 bytes of
-output, as many full bytes are taken for the bit index as necessary,
-starting from the output's first byte. For the second bit index the
-same hash value is used, continuing with the next unused output byte,
-and so on. Each time the bytes returned by the hash function are
-depleted it is recalculated with the next 16 byte hash key from the
-array above and the same input data.
-
-For each message to send across the bus we populate the bloom filter
-with all possible matchable strings. If a client then wants to
-subscribe to messages of this type, it simply tells the kernel to test
-its own calculated bit mask against the bloom filter of each message.
-
-More specifically, the following strings are added to the bloom filter
-of each message that is broadcasted:
-
-  The string "interface:" suffixed by the interface name
-
-  The string "member:" suffixed by the member name
-
-  The string "path:" suffixed by the path name
-
-  The string "path-slash-prefix:" suffixed with the path name, and
-  also all prefixes of the path name (cut off at "/"), also prefixed
-  with "path-slash-prefix".
-
-  The string "message-type:" suffixed with the strings "signal",
-  "method_call", "error" or "method_return" for the respective message
-  type of the message.
-
-  If the first argument of the message is a string, "arg0:" suffixed
-  with the first argument.
-
-  If the first argument of the message is a string, "arg0-dot-prefix"
-  suffixed with the first argument, and also all prefixes of the
-  argument (cut off at "."), also prefixed with "arg0-dot-prefix".
-
-  If the first argument of the message is a string,
-  "arg0-slash-prefix" suffixed with the first argument, and also all
-  prefixes of the argument (cut off at "/"), also prefixed with
-  "arg0-slash-prefix".
-
-  Similar for all further arguments that are strings up to 63, for the
-  arguments and their "dot" and "slash" prefixes. On the first
-  argument that is not a string, addition to the bloom filter should be
-  stopped however.
-
-(Note that the bloom filter does not contain sender nor receiver
-names!)
-
-When a client wants to subscribe to messages matching a certain
-expression, it should calculate the bloom mask following the same
-algorithm. The kernel will then simply test the mask against the
-attached bloom filters.
-
-Note that bloom filters are probabilistic, which means that clients
-might get messages they did not expect. Your bus protocol
-implementation must be capable of dealing with these unexpected
-messages (which it needs to anyway, given that transfers are
-relatively unrestricted on kdbus and people can send you all kinds of
-non-sense).
-
-If a client connects to a bus whose bloom filter metrics (i.e. filter
-size and number of hash functions) are outside of the range the client
-supports it must immediately disconnect and continue connection with
-the next bus address of the bus connection string.
-
-INSTALLING MATCHES
-
-To install matches for broadcast messages, use the KDBUS_CMD_ADD_MATCH
-ioctl. It takes a structure that contains an encoded match expression,
-and that is followed by one or more items, which are combined in an
-AND way. (Meaning: a message is matched exactly when all items
-attached to the original ioctl struct match).
-
-To match against other user messages add a KDBUS_ITEM_BLOOM item in
-the match (see above). Note that the bloom filter does not include
-matches to the sender names. To additionally check against sender
-names, use the KDBUS_ITEM_ID (for unique id matches) and
-KDBUS_ITEM_NAME (for well-known name matches) item types.
-
-To match against kernel generated messages (see below) you should add
-items of the same type as the kernel messages include,
-i.e. KDBUS_ITEM_NAME_ADD, KDBUS_ITEM_NAME_REMOVE,
-KDBUS_ITEM_NAME_CHANGE, KDBUS_ITEM_ID_ADD, KDBUS_ITEM_ID_REMOVE and
-fill them out. Note however, that you have some wildcards in this
-case, for example the .id field of KDBUS_ITEM_ID_ADD/KDBUS_ITEM_ID_REMOVE
-structures may be set to 0 to match against any id addition/removal.
-
-Note that dbus match strings do no map 1:1 to these ioctl() calls. In
-many cases (where the match string is "underspecified") you might need
-to issue up to six different ioctl() calls for the same match. For
-example, the empty match (which matches against all messages), would
-translate into one KDBUS_ITEM_BLOOM ioctl, one KDBUS_ITEM_NAME_ADD,
-one KDBUS_ITEM_NAME_CHANGE, one KDBUS_ITEM_NAME_REMOVE, one
-KDBUS_ITEM_ID_ADD and one KDBUS_ITEM_ID_REMOVE.
-
-When creating a match, you may attach a "cookie" value to them, which
-is used for deleting this match again. The cookie can be selected freely
-by the client. When issuing KDBUS_CMD_REMOVE_MATCH, simply pass the
-same cookie as before and all matches matching the same "cookie" value
-will be removed. This is particularly handy for the case where multiple
-ioctl()s are added for a single match strings.
-
-MEMFDS
-
-memfds may be sent across kdbus via KDBUS_ITEM_PAYLOAD_MEMFD items
-attached to messages. If this is done, the data included in the memfd
-is considered part of the payload stream of a message, and are treated
-the same way as KDBUS_ITEM_PAYLOAD_VEC by the receiving side. It is
-possible to interleave KDBUS_ITEM_PAYLOAD_MEMFD and
-KDBUS_ITEM_PAYLOAD_VEC items freely, by the reader they will be
-considered a single stream of bytes in the order these items appear in
-the message, that just happens to be split up at various places
-(regarding rules how they may be split up, see above). The kernel will
-refuse taking KDBUS_ITEM_PAYLOAD_MEMFD items that refer to memfds that
-are not sealed.
-
-Note that sealed memfds may be unsealed again if they are not mapped
-you have the only fd reference to them.
-
-Alternatively to sending memfds as KDBUS_ITEM_PAYLOAD_MEMFD items
-(where they are just a part of the payload stream of a message) you can
-also simply attach any memfd to a message using
-KDBUS_ITEM_PAYLOAD_FDS. In this case, the memfd contents is not
-considered part of the payload stream of the message, but simply fds
-like any other, that happen to be attached to the message.
-
-MESSAGES FROM THE KERNEL
-
-A couple of messages previously generated by the dbus1 bus driver are
-now generated by the kernel. Since the kernel does not understand the
-payload marshaling, they are generated by the kernel  in a different
-format. This is indicated with the "payload type" field of the
-messages set to 0. Library implementations should take these messages
-and synthesize traditional driver messages for them on reception.
-
-More specifically:
-
-   Instead of the NameOwnerChanged, NameLost, NameAcquired signals
-   there are kernel messages containing KDBUS_ITEM_NAME_ADD,
-   KDBUS_ITEM_NAME_REMOVE, KDBUS_ITEM_NAME_CHANGE, KDBUS_ITEM_ID_ADD,
-   KDBUS_ITEM_ID_REMOVE items are generated (each message will contain
-   exactly one of these items). Note that in libsystemd we have
-   obsoleted NameLost/NameAcquired messages, since they are entirely
-   redundant to NameOwnerChanged. This library will hence only
-   synthesize NameOwnerChanged messages from these kernel messages,
-   and never generate NameLost/NameAcquired. If your library needs to
-   stay compatible to the old dbus1 userspace, you possibly might need
-   to synthesize both a NameOwnerChanged and NameLost/NameAcquired
-   message from the same kernel message.
-
-   When a method call times out, a KDBUS_ITEM_REPLY_TIMEOUT message is
-   generated. This should be synthesized into a method error reply
-   message to the original call.
-
-   When a method call fails because the peer terminated the connection
-   before responding, a KDBUS_ITEM_REPLY_DEAD message is
-   generated. Similarly, it should be synthesized into a method error
-   reply message.
-
-For synthesized messages we recommend setting the cookie field to
-(uint32_t) -1 (and not (uint64_t) -1!), so that the cookie is not 0
-(which the dbus1 spec does not allow), but clearly recognizable as
-synthetic.
-
-Note that the KDBUS_ITEM_NAME_XYZ messages will actually inform you
-about all kinds of names, including activatable ones. Classic dbus1
-NameOwnerChanged messages OTOH are only generated when a name is
-really acquired on the bus and not just simply activatable. This means
-you must explicitly check for the case where an activatable name
-becomes acquired or an acquired name is lost and returns to be
-activatable.
-
-NAME REGISTRY
-
-To acquire names on the bus, use the KDBUS_CMD_NAME_ACQUIRE ioctl(). It
-takes a flags field similar to dbus1's RequestName() bus driver call,
-however the NO_QUEUE flag got inverted into a QUEUE flag instead.
-
-To release a previously acquired name use the KDBUS_CMD_NAME_RELEASE
-ioctl().
-
-To list acquired names use the KDBUS_CMD_CONN_INFO ioctl. It may be
-used to list unique names, well known names as well as activatable
-names and clients currently queuing for ownership of a well-known
-name. The ioctl will return an offset into the memory pool. After
-reading all the data you need, you need to release this via the
-KDBUS_CMD_FREE ioctl(), similar how you release a received message.
-
-CREDENTIALS
-
-kdbus can optionally attach various kinds of metadata about the sender at
-the point of time of sending ("credentials") to messages, on request
-of the receiver. This is both supported on directed and undirected
-(broadcast) messages. The metadata to attach is selected at time of
-the HELLO ioctl of the receiver via a flags field (see above). Note
-that clients must be able to handle that messages contain more
-metadata than they asked for themselves, to simplify implementation of
-broadcasting in the kernel. The receiver should not rely on this data
-to be around though, even though it will be correct if it happens to
-be attached. In order to avoid programming errors in applications, we
-recommend though not passing this data on to clients that did not
-explicitly ask for it.
-
-Credentials may also be queried for a well-known or unique name. Use
-the KDBUS_CMD_CONN_INFO for this. It will return an offset to the pool
-area again, which will contain the same credential items as messages
-have attached. Note that when issuing the ioctl, you can select a
-different set of credentials to gather, than what was originally requested
-for being attached to incoming messages.
-
-Credentials are always specific to the sender's domain that was
-current at the time of sending, and of the process that opened the
-bus connection at the time of opening it. Note that this latter data
-is cached!
-
-POLICY
-
-The kernel enforces only very limited policy on names. It will not do
-access filtering by userspace payload, and thus not by interface or
-method name.
-
-This ultimately means that most fine-grained policy enforcement needs
-to be done by the receiving process. We recommend using PolicyKit for
-any more complex checks. However, libraries should make simple static
-policy decisions regarding privileged/unprivileged method calls
-easy. We recommend doing this by enabling KDBUS_ATTACH_CAPS and
-KDBUS_ATTACH_CREDS for incoming messages, and then discerning client
-access by some capability, or if sender and receiver UIDs match.
-
-BUS ADDRESSES
-
-When connecting to kdbus use the "kernel:" protocol prefix in DBus
-address strings. The device node path is encoded in its "path="
-parameter.
-
-Client libraries should use the following connection string when
-connecting to the system bus:
-
-   kernel:path=/sys/fs/kdbus/0-system/bus;unix:path=/var/run/dbus/system_bus_socket
-
-This will ensure that kdbus is preferred over the legacy AF_UNIX
-socket, but compatibility is kept. For the user bus use:
-
-   kernel:path=/sys/fs/kdbus/$UID-user/bus;unix:path=$XDG_RUNTIME_DIR/bus
-
-With $UID replaced by the callers numer user ID, and $XDG_RUNTIME_DIR
-following the XDG basedir spec.
-
-Of course the $DBUS_SYSTEM_BUS_ADDRESS and $DBUS_SESSION_BUS_ADDRESS
-variables should still take precedence.
-
-DBUS SERVICE FILES
-
-Activatable services for kdbus may not use classic dbus1 service
-activation files. Instead, programs should drop in native systemd
-.service and .busname unit files, so that they are treated uniformly
-with other types of units and activation of the system.
-
-Note that this results in a major difference to classic dbus1:
-activatable bus names can be established at any time in the boot process.
-This is unlike dbus1 where activatable names are unconditionally available
-as long as dbus-daemon is running. Being able to control when
-activatable names are established is essential to allow usage of kdbus
-during early boot and in initrds, without the risk of triggering
-services too early.
-
-DISCLAIMER
-
-This all is so far just the status quo. We are putting this together, because
-we are quite confident that further API changes will be smaller, but
-to make this very clear: this is all subject to change, still!
-
-We invite you to port over your favorite dbus library to this new
-scheme, but please be prepared to make minor changes when we still
-change these interfaces!
index 02e3bf9..b40ba25 100644 (file)
@@ -27,6 +27,7 @@
 BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map bus_common_errors[] = {
         SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_UNIT,                 ENOENT),
         SD_BUS_ERROR_MAP(BUS_ERROR_NO_UNIT_FOR_PID,              ESRCH),
+        SD_BUS_ERROR_MAP(BUS_ERROR_NO_UNIT_FOR_INVOCATION_ID,    ENOENT),
         SD_BUS_ERROR_MAP(BUS_ERROR_UNIT_EXISTS,                  EEXIST),
         SD_BUS_ERROR_MAP(BUS_ERROR_LOAD_FAILED,                  EIO),
         SD_BUS_ERROR_MAP(BUS_ERROR_JOB_FAILED,                   EREMOTEIO),
@@ -37,19 +38,24 @@ BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map bus_common_errors[] = {
         SD_BUS_ERROR_MAP(BUS_ERROR_TRANSACTION_JOBS_CONFLICTING, EDEADLK),
         SD_BUS_ERROR_MAP(BUS_ERROR_TRANSACTION_ORDER_IS_CYCLIC,  EDEADLK),
         SD_BUS_ERROR_MAP(BUS_ERROR_TRANSACTION_IS_DESTRUCTIVE,   EDEADLK),
-        SD_BUS_ERROR_MAP(BUS_ERROR_UNIT_MASKED,                  ESHUTDOWN),
+        SD_BUS_ERROR_MAP(BUS_ERROR_UNIT_MASKED,                  ERFKILL),
         SD_BUS_ERROR_MAP(BUS_ERROR_UNIT_GENERATED,               EADDRNOTAVAIL),
         SD_BUS_ERROR_MAP(BUS_ERROR_UNIT_LINKED,                  ELOOP),
         SD_BUS_ERROR_MAP(BUS_ERROR_JOB_TYPE_NOT_APPLICABLE,      EBADR),
         SD_BUS_ERROR_MAP(BUS_ERROR_NO_ISOLATION,                 EPERM),
         SD_BUS_ERROR_MAP(BUS_ERROR_SHUTTING_DOWN,                ECANCELED),
         SD_BUS_ERROR_MAP(BUS_ERROR_SCOPE_NOT_RUNNING,            EHOSTDOWN),
+        SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_DYNAMIC_USER,         ESRCH),
+        SD_BUS_ERROR_MAP(BUS_ERROR_NOT_REFERENCED,               EUNATCH),
+        SD_BUS_ERROR_MAP(BUS_ERROR_DISK_FULL,                    ENOSPC),
 
         SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_MACHINE,              ENXIO),
         SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_IMAGE,                ENOENT),
         SD_BUS_ERROR_MAP(BUS_ERROR_NO_MACHINE_FOR_PID,           ENXIO),
         SD_BUS_ERROR_MAP(BUS_ERROR_MACHINE_EXISTS,               EEXIST),
         SD_BUS_ERROR_MAP(BUS_ERROR_NO_PRIVATE_NETWORKING,        ENOSYS),
+        SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_USER_MAPPING,         ENXIO),
+        SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_GROUP_MAPPING,        ENXIO),
 
         SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_SESSION,              ENXIO),
         SD_BUS_ERROR_MAP(BUS_ERROR_NO_SESSION_FOR_PID,           ENXIO),
@@ -62,6 +68,7 @@ BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map bus_common_errors[] = {
         SD_BUS_ERROR_MAP(BUS_ERROR_DEVICE_NOT_TAKEN,             EINVAL),
         SD_BUS_ERROR_MAP(BUS_ERROR_OPERATION_IN_PROGRESS,        EINPROGRESS),
         SD_BUS_ERROR_MAP(BUS_ERROR_SLEEP_VERB_NOT_SUPPORTED,     EOPNOTSUPP),
+        SD_BUS_ERROR_MAP(BUS_ERROR_SESSION_BUSY,                 EBUSY),
 
         SD_BUS_ERROR_MAP(BUS_ERROR_AUTOMATIC_TIME_SYNC_ENABLED,  EALREADY),
 
@@ -80,6 +87,25 @@ BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map bus_common_errors[] = {
         SD_BUS_ERROR_MAP(BUS_ERROR_LINK_BUSY,                    EBUSY),
         SD_BUS_ERROR_MAP(BUS_ERROR_NETWORK_DOWN,                 ENETDOWN),
 
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "FORMERR",               EBADMSG),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "SERVFAIL",              EHOSTDOWN),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "NXDOMAIN",              ENXIO),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "NOTIMP",                ENOSYS),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "REFUSED",               EACCES),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "YXDOMAIN",              EEXIST),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "YRRSET",                EEXIST),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "NXRRSET",               ENOENT),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "NOTAUTH",               EACCES),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "NOTZONE",               EREMOTE),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "BADVERS",               EBADMSG),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "BADKEY",                EKEYREJECTED),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "BADTIME",               EBADMSG),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "BADMODE",               EBADMSG),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "BADNAME",               EBADMSG),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "BADALG",                EBADMSG),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "BADTRUNC",              EBADMSG),
+        SD_BUS_ERROR_MAP(_BUS_ERROR_DNS "BADCOOKIE",             EBADR),
+
         SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_TRANSFER,             ENXIO),
         SD_BUS_ERROR_MAP(BUS_ERROR_TRANSFER_IN_PROGRESS,         EBUSY),
 
index c8f369c..4523be0 100644 (file)
@@ -23,6 +23,7 @@
 
 #define BUS_ERROR_NO_SUCH_UNIT "org.freedesktop.systemd1.NoSuchUnit"
 #define BUS_ERROR_NO_UNIT_FOR_PID "org.freedesktop.systemd1.NoUnitForPID"
+#define BUS_ERROR_NO_UNIT_FOR_INVOCATION_ID "org.freedesktop.systemd1.NoUnitForInvocationID"
 #define BUS_ERROR_UNIT_EXISTS "org.freedesktop.systemd1.UnitExists"
 #define BUS_ERROR_LOAD_FAILED "org.freedesktop.systemd1.LoadFailed"
 #define BUS_ERROR_JOB_FAILED "org.freedesktop.systemd1.JobFailed"
@@ -40,6 +41,9 @@
 #define BUS_ERROR_NO_ISOLATION "org.freedesktop.systemd1.NoIsolation"
 #define BUS_ERROR_SHUTTING_DOWN "org.freedesktop.systemd1.ShuttingDown"
 #define BUS_ERROR_SCOPE_NOT_RUNNING "org.freedesktop.systemd1.ScopeNotRunning"
+#define BUS_ERROR_NO_SUCH_DYNAMIC_USER "org.freedesktop.systemd1.NoSuchDynamicUser"
+#define BUS_ERROR_NOT_REFERENCED "org.freedesktop.systemd1.NotReferenced"
+#define BUS_ERROR_DISK_FULL "org.freedesktop.systemd1.DiskFull"
 
 #define BUS_ERROR_NO_SUCH_MACHINE "org.freedesktop.machine1.NoSuchMachine"
 #define BUS_ERROR_NO_SUCH_IMAGE "org.freedesktop.machine1.NoSuchImage"
index 52128e7..b56bb07 100644 (file)
@@ -264,10 +264,13 @@ static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) {
                 if ((flags & KDBUS_LIST_UNIQUE) && name->id != previous_id && !(name->flags & KDBUS_HELLO_ACTIVATOR)) {
                         char *n;
 
-                        if (asprintf(&n, ":1.%llu", (unsigned long long) name->id) < 0) {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat"
+                        if (asprintf(&n, ":1.%llu", name->id) < 0) {
                                 r = -ENOMEM;
                                 goto fail;
                         }
+#pragma GCC diagnostic pop
 
                         r = strv_consume(x, n);
                         if (r < 0)
@@ -711,10 +714,13 @@ int bus_get_name_creds_kdbus(
         }
 
         if (mask & SD_BUS_CREDS_UNIQUE_NAME) {
-                if (asprintf(&c->unique_name, ":1.%llu", (unsigned long long) conn_info->id) < 0) {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat"
+                if (asprintf(&c->unique_name, ":1.%llu", conn_info->id) < 0) {
                         r = -ENOMEM;
                         goto fail;
                 }
+#pragma GCC diagnostic pop
 
                 c->mask |= SD_BUS_CREDS_UNIQUE_NAME;
         }
@@ -780,6 +786,8 @@ static int bus_get_name_creds_dbus1(
         }
 
         if (mask != 0) {
+                _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+                bool need_pid, need_uid, need_selinux, need_separate_calls;
                 c = bus_creds_new();
                 if (!c)
                         return -ENOMEM;
@@ -792,99 +800,216 @@ static int bus_get_name_creds_dbus1(
                         c->mask |= SD_BUS_CREDS_UNIQUE_NAME;
                 }
 
-                if ((mask & SD_BUS_CREDS_PID) ||
-                    ((mask & SD_BUS_CREDS_AUGMENT) &&
-                     (mask & (SD_BUS_CREDS_UID|SD_BUS_CREDS_SUID|SD_BUS_CREDS_FSUID|
-                              SD_BUS_CREDS_GID|SD_BUS_CREDS_EGID|SD_BUS_CREDS_SGID|SD_BUS_CREDS_FSGID|
-                              SD_BUS_CREDS_SUPPLEMENTARY_GIDS|
-                              SD_BUS_CREDS_COMM|SD_BUS_CREDS_EXE|SD_BUS_CREDS_CMDLINE|
-                              SD_BUS_CREDS_CGROUP|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_USER_UNIT|SD_BUS_CREDS_SLICE|SD_BUS_CREDS_SESSION|SD_BUS_CREDS_OWNER_UID|
-                              SD_BUS_CREDS_EFFECTIVE_CAPS|SD_BUS_CREDS_PERMITTED_CAPS|SD_BUS_CREDS_INHERITABLE_CAPS|SD_BUS_CREDS_BOUNDING_CAPS|
-                              SD_BUS_CREDS_SELINUX_CONTEXT|
-                              SD_BUS_CREDS_AUDIT_SESSION_ID|SD_BUS_CREDS_AUDIT_LOGIN_UID)))) {
+                need_pid = (mask & SD_BUS_CREDS_PID) ||
+                        ((mask & SD_BUS_CREDS_AUGMENT) &&
+                         (mask & (SD_BUS_CREDS_UID|SD_BUS_CREDS_SUID|SD_BUS_CREDS_FSUID|
+                                  SD_BUS_CREDS_GID|SD_BUS_CREDS_EGID|SD_BUS_CREDS_SGID|SD_BUS_CREDS_FSGID|
+                                  SD_BUS_CREDS_SUPPLEMENTARY_GIDS|
+                                  SD_BUS_CREDS_COMM|SD_BUS_CREDS_EXE|SD_BUS_CREDS_CMDLINE|
+                                  SD_BUS_CREDS_CGROUP|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_USER_UNIT|SD_BUS_CREDS_SLICE|SD_BUS_CREDS_SESSION|SD_BUS_CREDS_OWNER_UID|
+                                  SD_BUS_CREDS_EFFECTIVE_CAPS|SD_BUS_CREDS_PERMITTED_CAPS|SD_BUS_CREDS_INHERITABLE_CAPS|SD_BUS_CREDS_BOUNDING_CAPS|
+                                  SD_BUS_CREDS_SELINUX_CONTEXT|
+                                  SD_BUS_CREDS_AUDIT_SESSION_ID|SD_BUS_CREDS_AUDIT_LOGIN_UID)));
+                need_uid = mask & SD_BUS_CREDS_EUID;
+                need_selinux = mask & SD_BUS_CREDS_SELINUX_CONTEXT;
 
-                        uint32_t u;
+                if (need_pid + need_uid + need_selinux > 1) {
+
+                        /* If we need more than one of the credentials, then use GetConnectionCredentials() */
 
                         r = sd_bus_call_method(
                                         bus,
                                         "org.freedesktop.DBus",
                                         "/org/freedesktop/DBus",
                                         "org.freedesktop.DBus",
-                                        "GetConnectionUnixProcessID",
-                                        NULL,
+                                        "GetConnectionCredentials",
+                                        &error,
                                         &reply,
                                         "s",
-                                        unique ? unique : name);
-                        if (r < 0)
-                                return r;
+                                        unique ?: name);
 
-                        r = sd_bus_message_read(reply, "u", &u);
-                        if (r < 0)
-                                return r;
+                        if (r < 0) {
 
-                        pid = u;
-                        if (mask & SD_BUS_CREDS_PID) {
-                                c->pid = u;
-                                c->mask |= SD_BUS_CREDS_PID;
-                        }
+                                if (!sd_bus_error_has_name(&error, SD_BUS_ERROR_UNKNOWN_METHOD))
+                                        return r;
 
-                        reply = sd_bus_message_unref(reply);
-                }
+                                /* If we got an unknown method error, fall back to the invidual calls... */
+                                need_separate_calls = true;
+                                sd_bus_error_free(&error);
 
-                if (mask & SD_BUS_CREDS_EUID) {
-                        uint32_t u;
+                        } else {
+                                need_separate_calls = false;
 
-                        r = sd_bus_call_method(
-                                        bus,
-                                        "org.freedesktop.DBus",
-                                        "/org/freedesktop/DBus",
-                                        "org.freedesktop.DBus",
-                                        "GetConnectionUnixUser",
-                                        NULL,
-                                        &reply,
-                                        "s",
-                                        unique ? unique : name);
-                        if (r < 0)
-                                return r;
+                                r = sd_bus_message_enter_container(reply, 'a', "{sv}");
+                                if (r < 0)
+                                        return r;
 
-                        r = sd_bus_message_read(reply, "u", &u);
-                        if (r < 0)
-                                return r;
+                                for (;;) {
+                                        const char *m;
 
-                        c->euid = u;
-                        c->mask |= SD_BUS_CREDS_EUID;
+                                        r = sd_bus_message_enter_container(reply, 'e', "sv");
+                                        if (r < 0)
+                                                return r;
+                                        if (r == 0)
+                                                break;
 
-                        reply = sd_bus_message_unref(reply);
-                }
+                                        r = sd_bus_message_read(reply, "s", &m);
+                                        if (r < 0)
+                                                return r;
 
-                if (mask & SD_BUS_CREDS_SELINUX_CONTEXT) {
-                        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
-                        const void *p = NULL;
-                        size_t sz = 0;
+                                        if (need_uid && streq(m, "UnixUserID")) {
+                                                uint32_t u;
 
-                        r = sd_bus_call_method(
-                                        bus,
-                                        "org.freedesktop.DBus",
-                                        "/org/freedesktop/DBus",
-                                        "org.freedesktop.DBus",
-                                        "GetConnectionSELinuxSecurityContext",
-                                        &error,
-                                        &reply,
-                                        "s",
-                                        unique ? unique : name);
-                        if (r < 0) {
-                                if (!sd_bus_error_has_name(&error, "org.freedesktop.DBus.Error.SELinuxSecurityContextUnknown"))
+                                                r = sd_bus_message_read(reply, "v", "u", &u);
+                                                if (r < 0)
+                                                        return r;
+
+                                                c->euid = u;
+                                                c->mask |= SD_BUS_CREDS_EUID;
+
+                                        } else if (need_pid && streq(m, "ProcessID")) {
+                                                uint32_t p;
+
+                                                r = sd_bus_message_read(reply, "v", "u", &p);
+                                                if (r < 0)
+                                                        return r;
+
+                                                pid = p;
+                                                if (mask & SD_BUS_CREDS_PID) {
+                                                        c->pid = p;
+                                                        c->mask |= SD_BUS_CREDS_PID;
+                                                }
+
+                                        } else if (need_selinux && streq(m, "LinuxSecurityLabel")) {
+                                                const void *p = NULL;
+                                                size_t sz = 0;
+
+                                                r = sd_bus_message_enter_container(reply, 'v', "ay");
+                                                if (r < 0)
+                                                        return r;
+
+                                                r = sd_bus_message_read_array(reply, 'y', &p, &sz);
+                                                if (r < 0)
+                                                        return r;
+
+                                                free(c->label);
+                                                c->label = strndup(p, sz);
+                                                if (!c->label)
+                                                        return -ENOMEM;
+
+                                                c->mask |= SD_BUS_CREDS_SELINUX_CONTEXT;
+
+                                                r = sd_bus_message_exit_container(reply);
+                                                if (r < 0)
+                                                        return r;
+                                        } else {
+                                                r = sd_bus_message_skip(reply, "v");
+                                                if (r < 0)
+                                                        return r;
+                                        }
+
+                                        r = sd_bus_message_exit_container(reply);
+                                        if (r < 0)
+                                                return r;
+                                }
+
+                                r = sd_bus_message_exit_container(reply);
+                                if (r < 0)
                                         return r;
-                        } else {
-                                r = sd_bus_message_read_array(reply, 'y', &p, &sz);
+
+                                if (need_pid && pid == 0)
+                                        return -EPROTO;
+                        }
+
+                } else /* When we only need a single field, then let's use separate calls */
+                        need_separate_calls = true;
+
+                if (need_separate_calls) {
+                        if (need_pid) {
+                                uint32_t u;
+
+                                r = sd_bus_call_method(
+                                                bus,
+                                                "org.freedesktop.DBus",
+                                                "/org/freedesktop/DBus",
+                                                "org.freedesktop.DBus",
+                                                "GetConnectionUnixProcessID",
+                                                NULL,
+                                                &reply,
+                                                "s",
+                                                unique ?: name);
                                 if (r < 0)
                                         return r;
 
-                                c->label = strndup(p, sz);
-                                if (!c->label)
-                                        return -ENOMEM;
+                                r = sd_bus_message_read(reply, "u", &u);
+                                if (r < 0)
+                                        return r;
 
-                                c->mask |= SD_BUS_CREDS_SELINUX_CONTEXT;
+                                pid = u;
+                                if (mask & SD_BUS_CREDS_PID) {
+                                        c->pid = u;
+                                        c->mask |= SD_BUS_CREDS_PID;
+                                }
+
+                                reply = sd_bus_message_unref(reply);
+                        }
+
+                        if (need_uid) {
+                                uint32_t u;
+
+                                r = sd_bus_call_method(
+                                                bus,
+                                                "org.freedesktop.DBus",
+                                                "/org/freedesktop/DBus",
+                                                "org.freedesktop.DBus",
+                                                "GetConnectionUnixUser",
+                                                NULL,
+                                                &reply,
+                                                "s",
+                                                unique ? unique : name);
+                                if (r < 0)
+                                        return r;
+
+                                r = sd_bus_message_read(reply, "u", &u);
+                                if (r < 0)
+                                        return r;
+
+                                c->euid = u;
+                                c->mask |= SD_BUS_CREDS_EUID;
+
+                                reply = sd_bus_message_unref(reply);
+                        }
+
+                        if (need_selinux) {
+                                const void *p = NULL;
+                                size_t sz = 0;
+
+                                r = sd_bus_call_method(
+                                                bus,
+                                                "org.freedesktop.DBus",
+                                                "/org/freedesktop/DBus",
+                                                "org.freedesktop.DBus",
+                                                "GetConnectionSELinuxSecurityContext",
+                                                &error,
+                                                &reply,
+                                                "s",
+                                                unique ? unique : name);
+                                if (r < 0) {
+                                        if (!sd_bus_error_has_name(&error, "org.freedesktop.DBus.Error.SELinuxSecurityContextUnknown"))
+                                                return r;
+
+                                        /* no data is fine */
+                                } else {
+                                        r = sd_bus_message_read_array(reply, 'y', &p, &sz);
+                                        if (r < 0)
+                                                return r;
+
+                                        c->label = strndup(p, sz);
+                                        if (!c->label)
+                                                return -ENOMEM;
+
+                                        c->mask |= SD_BUS_CREDS_SELINUX_CONTEXT;
+                                }
                         }
                 }
 
@@ -917,9 +1042,17 @@ _public_ int sd_bus_get_name_creds(
         if (!bus->bus_client)
                 return -EINVAL;
 
+        /* Turn off augmenting if this isn't a local connection. If the connection is not local, then /proc is not
+         * going to match. */
+        if (!bus->is_local)
+                mask &= ~SD_BUS_CREDS_AUGMENT;
+
         if (streq(name, "org.freedesktop.DBus.Local"))
                 return -EINVAL;
 
+        if (streq(name, "org.freedesktop.DBus"))
+                return sd_bus_get_owner_creds(bus, mask, creds);
+
         if (!BUS_IS_OPEN(bus->state))
                 return -ENOTCONN;
 
@@ -1040,6 +1173,9 @@ _public_ int sd_bus_get_owner_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **r
         if (!BUS_IS_OPEN(bus->state))
                 return -ENOTCONN;
 
+        if (!bus->is_local)
+                mask &= ~SD_BUS_CREDS_AUGMENT;
+
         if (bus->is_kernel)
                 return bus_get_owner_creds_kdbus(bus, mask, ret);
         else
index c4f693d..349fa57 100644 (file)
@@ -30,7 +30,7 @@
 #include "cgroup-util.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "hexdecoct.h"
 #include "parse-util.h"
 #include "process-util.h"
index 5936601..c316e4d 100644 (file)
@@ -25,7 +25,7 @@
 #include "cap-list.h"
 #include "capability-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "locale-util.h"
 #include "macro.h"
 #include "string-util.h"
index 26219bd..378f7a3 100644 (file)
@@ -70,11 +70,9 @@ BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map bus_standard_errors[] = {
         SD_BUS_ERROR_MAP_END
 };
 
-/* GCC maps this magically to the beginning and end of the BUS_ERROR_MAP section.
- * Hide them; for currently unknown reasons they get exported to the shared libries
- * even without being listed in the sym file. */
-extern const sd_bus_error_map __start_BUS_ERROR_MAP[] _hidden_;
-extern const sd_bus_error_map __stop_BUS_ERROR_MAP[] _hidden_;
+/* GCC maps this magically to the beginning and end of the BUS_ERROR_MAP section */
+extern const sd_bus_error_map __start_BUS_ERROR_MAP[];
+extern const sd_bus_error_map __stop_BUS_ERROR_MAP[];
 
 /* Additional maps registered with sd_bus_error_add_map() are in this
  * NULL terminated array */
index 452b63f..ad4b4a0 100644 (file)
@@ -209,6 +209,10 @@ struct sd_bus {
         bool is_system:1;
         bool is_user:1;
         bool allow_interactive_authorization:1;
+        bool exit_on_disconnect:1;
+        bool exited:1;
+        bool exit_triggered:1;
+        bool is_local:1;
 
         int use_memfd;
 
@@ -320,12 +324,13 @@ struct sd_bus {
         sd_bus_track *track_queue;
 
         LIST_HEAD(sd_bus_slot, slots);
+        LIST_HEAD(sd_bus_track, tracks);
 };
 
 #define BUS_DEFAULT_TIMEOUT ((usec_t) (25 * USEC_PER_SEC))
 
-#define BUS_WQUEUE_MAX 1024
-#define BUS_RQUEUE_MAX 64*1024
+#define BUS_WQUEUE_MAX (192*1024)
+#define BUS_RQUEUE_MAX (192*1024)
 
 #define BUS_MESSAGE_SIZE_MAX (64*1024*1024)
 #define BUS_AUTH_SIZE_MAX (64*1024)
index 59398b8..ca6aee7 100644 (file)
@@ -42,7 +42,7 @@
 #include "capability-util.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "memfd-util.h"
 #include "parse-util.h"
 #include "stdio-util.h"
@@ -51,6 +51,8 @@
 #include "user-util.h"
 #include "util.h"
 
+#pragma GCC diagnostic ignored "-Wformat"
+
 #define UNIQUE_NAME_MAX (3+DECIMAL_STR_MAX(uint64_t))
 
 int bus_kernel_parse_unique_name(const char *s, uint64_t *id) {
@@ -848,8 +850,7 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
         if (k->src_id == KDBUS_SRC_ID_KERNEL)
                 bus_message_set_sender_driver(bus, m);
         else {
-                xsprintf(m->sender_buffer, ":1.%llu",
-                         (unsigned long long)k->src_id);
+                xsprintf(m->sender_buffer, ":1.%llu", k->src_id);
                 m->sender = m->creds.unique_name = m->sender_buffer;
         }
 
@@ -860,8 +861,7 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
         else if (k->dst_id == KDBUS_DST_ID_NAME)
                 m->destination = bus->unique_name; /* fill in unique name if the well-known name is missing */
         else {
-                xsprintf(m->destination_buffer, ":1.%llu",
-                         (unsigned long long)k->dst_id);
+                xsprintf(m->destination_buffer, ":1.%llu", k->dst_id);
                 m->destination = m->destination_buffer;
         }
 
@@ -1035,7 +1035,7 @@ int bus_kernel_take_fd(sd_bus *b) {
         b->bloom_size = (size_t) bloom->size;
         b->bloom_n_hash = (unsigned) bloom->n_hash;
 
-        if (asprintf(&b->unique_name, ":1.%llu", (unsigned long long) hello->id) < 0) {
+        if (asprintf(&b->unique_name, ":1.%llu", hello->id) < 0) {
                 r = -ENOMEM;
                 goto fail;
         }
@@ -1207,7 +1207,7 @@ int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call
                                         return r;
                         }
                 } else {
-                        log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k->payload_type);
+                        log_debug("Ignoring message with unknown payload type %llu.", k->payload_type);
                         close_kdbus_msg(bus, k);
                 }
         }
@@ -1268,7 +1268,7 @@ static int translate_name_change(
         if (d->type == KDBUS_ITEM_NAME_ADD || (d->name_change.old_id.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR)))
                 old_owner[0] = 0;
         else
-                sprintf(old_owner, ":1.%llu", (unsigned long long) d->name_change.old_id.id);
+                sprintf(old_owner, ":1.%llu", d->name_change.old_id.id);
 
         if (d->type == KDBUS_ITEM_NAME_REMOVE || (d->name_change.new_id.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR))) {
 
@@ -1277,7 +1277,7 @@ static int translate_name_change(
 
                 new_owner[0] = 0;
         } else
-                sprintf(new_owner, ":1.%llu", (unsigned long long) d->name_change.new_id.id);
+                sprintf(new_owner, ":1.%llu", d->name_change.new_id.id);
 
         return push_name_owner_changed(bus, d->name_change.name, old_owner, new_owner, ts);
 }
@@ -1419,7 +1419,7 @@ int bus_kernel_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
                 r = bus_kernel_translate_message(bus, k);
                 close_kdbus_msg(bus, k);
         } else {
-                log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k->payload_type);
+                log_debug("Ignoring message with unknown payload type %llu.", k->payload_type);
                 r = 0;
                 close_kdbus_msg(bus, k);
         }
@@ -1649,7 +1649,7 @@ int bus_kernel_create_bus(const char *name, bool world, char **s) {
         if (s) {
                 char *p;
 
-                p = strjoin("/sys/fs/kdbus/", n->str, "/bus", NULL);
+                p = strjoin("/sys/fs/kdbus/", n->str, "/bus");
                 if (!p) {
                         safe_close(fd);
                         return -ENOMEM;
index 9bd07ff..98911d5 100644 (file)
@@ -974,8 +974,10 @@ static int process_introspect(
                 /* Nothing?, let's see if we exist at all, and if not
                  * refuse to do anything */
                 r = bus_node_exists(bus, n, m->path, require_fallback);
-                if (r <= 0)
+                if (r <= 0) {
+                        r = bus_maybe_reply_error(m, r, &error);
                         goto finish;
+                }
                 if (bus->nodes_modified) {
                         r = 0;
                         goto finish;
@@ -1057,6 +1059,22 @@ static int object_manager_serialize_path(
                         if (r < 0)
                                 return r;
 
+                        r = sd_bus_message_append(reply, "{sa{sv}}", "org.freedesktop.DBus.Peer", 0);
+                        if (r < 0)
+                                return r;
+
+                        r = sd_bus_message_append(reply, "{sa{sv}}", "org.freedesktop.DBus.Introspectable", 0);
+                        if (r < 0)
+                                return r;
+
+                        r = sd_bus_message_append(reply, "{sa{sv}}", "org.freedesktop.DBus.Properties", 0);
+                        if (r < 0)
+                                return r;
+
+                        r = sd_bus_message_append(reply, "{sa{sv}}", "org.freedesktop.DBus.ObjectManager", 0);
+                        if (r < 0)
+                                return r;
+
                         found_something = true;
                 }
 
@@ -1183,7 +1201,7 @@ static int process_get_managed_objects(
 
         r = get_child_nodes(bus, m->path, n, CHILDREN_RECURSIVE, &s, &error);
         if (r < 0)
-                return r;
+                return bus_maybe_reply_error(m, r, &error);
         if (bus->nodes_modified)
                 return 0;
 
@@ -1198,7 +1216,7 @@ static int process_get_managed_objects(
         SET_FOREACH(path, s, i) {
                 r = object_manager_serialize_path_and_fallbacks(bus, reply, path, &error);
                 if (r < 0)
-                        return r;
+                        return bus_maybe_reply_error(m, r, &error);
 
                 if (bus->nodes_modified)
                         return 0;
@@ -1328,7 +1346,7 @@ static int object_find_and_run(
         if (!*found_object) {
                 r = bus_node_exists(bus, n, m->path, require_fallback);
                 if (r < 0)
-                        return r;
+                        return bus_maybe_reply_error(m, r, NULL);
                 if (bus->nodes_modified)
                         return 0;
                 if (r > 0)
index 8e9074c..33590c3 100644 (file)
@@ -212,9 +212,7 @@ _public_ sd_bus_slot* sd_bus_slot_unref(sd_bus_slot *slot) {
 
         bus_slot_disconnect(slot);
         free(slot->description);
-        free(slot);
-
-        return NULL;
+        return mfree(slot);
 }
 
 _public_ sd_bus* sd_bus_slot_get_bus(sd_bus_slot *slot) {
index cfd7753..8b25002 100644 (file)
@@ -30,7 +30,7 @@
 #include "bus-message.h"
 #include "bus-socket.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "hexdecoct.h"
 #include "macro.h"
 #include "missing.h"
@@ -607,7 +607,7 @@ static void bus_get_peercred(sd_bus *b) {
         b->ucred_valid = getpeercred(b->input_fd, &b->ucred) >= 0;
 
         /* Get the SELinux context of the peer */
-        if (mac_selinux_have()) {
+        if (mac_selinux_use()) {
                 r = getpeersec(b->input_fd, &b->label);
                 if (r < 0 && r != -EOPNOTSUPP)
                         log_debug_errno(r, "Failed to determine peer security context: %m");
index 1f436fe..4acaf24 100644 (file)
 #include "bus-track.h"
 #include "bus-util.h"
 
+struct track_item {
+        unsigned n_ref;
+        char *name;
+        sd_bus_slot *slot;
+};
+
 struct sd_bus_track {
         unsigned n_ref;
+        unsigned n_adding; /* are we in the process of adding a new name? */
         sd_bus *bus;
         sd_bus_track_handler_t handler;
         void *userdata;
         Hashmap *names;
         LIST_FIELDS(sd_bus_track, queue);
         Iterator iterator;
-        bool in_queue;
-        bool modified;
+        bool in_list:1;    /* In bus->tracks? */
+        bool in_queue:1;   /* In bus->track_queue? */
+        bool modified:1;
+        bool recursive:1;
+
+        LIST_FIELDS(sd_bus_track, tracks);
 };
 
 #define MATCH_PREFIX                                        \
@@ -56,15 +67,45 @@ struct sd_bus_track {
                 _x;                                                     \
         })
 
+static struct track_item* track_item_free(struct track_item *i) {
+
+        if (!i)
+                return NULL;
+
+        sd_bus_slot_unref(i->slot);
+        free(i->name);
+        return mfree(i);
+}
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(struct track_item*, track_item_free);
+
 static void bus_track_add_to_queue(sd_bus_track *track) {
         assert(track);
 
+        /* Adds the bus track object to the queue of objects we should dispatch next, subject to a number of
+         * conditions. */
+
+        /* Already in the queue? */
         if (track->in_queue)
                 return;
 
+        /* if we are currently in the process of adding a new name, then let's not enqueue this just yet, let's wait
+         * until the addition is complete. */
+        if (track->n_adding > 0)
+                return;
+
+        /* still referenced? */
+        if (hashmap_size(track->names) > 0)
+                return;
+
+        /* Nothing to call? */
         if (!track->handler)
                 return;
 
+        /* Already closed? */
+        if (!track->in_list)
+                return;
+
         LIST_PREPEND(queue, track->bus->track_queue, track);
         track->in_queue = true;
 }
@@ -79,6 +120,24 @@ static void bus_track_remove_from_queue(sd_bus_track *track) {
         track->in_queue = false;
 }
 
+static int bus_track_remove_name_fully(sd_bus_track *track, const char *name) {
+        struct track_item *i;
+
+        assert(track);
+        assert(name);
+
+        i = hashmap_remove(track->names, name);
+        if (!i)
+                return 0;
+
+        track_item_free(i);
+
+        bus_track_add_to_queue(track);
+
+        track->modified = true;
+        return 1;
+}
+
 _public_ int sd_bus_track_new(
                 sd_bus *bus,
                 sd_bus_track **track,
@@ -102,6 +161,9 @@ _public_ int sd_bus_track_new(
         t->userdata = userdata;
         t->bus = sd_bus_ref(bus);
 
+        LIST_PREPEND(tracks, bus->tracks, t);
+        t->in_list = true;
+
         bus_track_add_to_queue(t);
 
         *track = t;
@@ -121,7 +183,7 @@ _public_ sd_bus_track* sd_bus_track_ref(sd_bus_track *track) {
 }
 
 _public_ sd_bus_track* sd_bus_track_unref(sd_bus_track *track) {
-        const char *n;
+        struct track_item *i;
 
         if (!track)
                 return NULL;
@@ -133,15 +195,16 @@ _public_ sd_bus_track* sd_bus_track_unref(sd_bus_track *track) {
                 return NULL;
         }
 
-        while ((n = hashmap_first_key(track->names)))
-                sd_bus_track_remove_name(track, n);
+        while ((i = hashmap_steal_first(track->names)))
+                track_item_free(i);
+
+        if (track->in_list)
+                LIST_REMOVE(tracks, track->bus->tracks, track);
 
         bus_track_remove_from_queue(track);
         hashmap_free(track->names);
         sd_bus_unref(track->bus);
-        free(track);
-
-        return NULL;
+        return mfree(track);
 }
 
 static int on_name_owner_changed(sd_bus_message *message, void *userdata, sd_bus_error *error) {
@@ -156,49 +219,76 @@ static int on_name_owner_changed(sd_bus_message *message, void *userdata, sd_bus
         if (r < 0)
                 return 0;
 
-        sd_bus_track_remove_name(track, name);
+        bus_track_remove_name_fully(track, name);
         return 0;
 }
 
 _public_ int sd_bus_track_add_name(sd_bus_track *track, const char *name) {
-        _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *slot = NULL;
-        _cleanup_free_ char *n = NULL;
+        _cleanup_(track_item_freep) struct track_item *n = NULL;
+        struct track_item *i;
         const char *match;
         int r;
 
         assert_return(track, -EINVAL);
         assert_return(service_name_is_valid(name), -EINVAL);
 
+        i = hashmap_get(track->names, name);
+        if (i) {
+                if (track->recursive) {
+                        unsigned k = track->n_ref + 1;
+
+                        if (k < track->n_ref) /* Check for overflow */
+                                return -EOVERFLOW;
+
+                        track->n_ref = k;
+                }
+
+                bus_track_remove_from_queue(track);
+                return 0;
+        }
+
         r = hashmap_ensure_allocated(&track->names, &string_hash_ops);
         if (r < 0)
                 return r;
 
-        n = strdup(name);
+        n = new0(struct track_item, 1);
         if (!n)
                 return -ENOMEM;
+        n->name = strdup(name);
+        if (!n->name)
+                return -ENOMEM;
 
         /* First, subscribe to this name */
-        match = MATCH_FOR_NAME(n);
-        r = sd_bus_add_match(track->bus, &slot, match, on_name_owner_changed, track);
-        if (r < 0)
+        match = MATCH_FOR_NAME(name);
+
+        bus_track_remove_from_queue(track); /* don't dispatch this while we work in it */
+
+        track->n_adding++; /* make sure we aren't dispatched while we synchronously add this match */
+        r = sd_bus_add_match(track->bus, &n->slot, match, on_name_owner_changed, track);
+        track->n_adding--;
+        if (r < 0) {
+                bus_track_add_to_queue(track);
                 return r;
+        }
 
-        r = hashmap_put(track->names, n, slot);
-        if (r == -EEXIST)
-                return 0;
-        if (r < 0)
+        r = hashmap_put(track->names, n->name, n);
+        if (r < 0) {
+                bus_track_add_to_queue(track);
                 return r;
+        }
 
-        /* Second, check if it is currently existing, or maybe
-         * doesn't, or maybe disappeared already. */
-        r = sd_bus_get_name_creds(track->bus, n, 0, NULL);
+        /* Second, check if it is currently existing, or maybe doesn't, or maybe disappeared already. */
+        track->n_adding++; /* again, make sure this isn't dispatch while we are working in it */
+        r = sd_bus_get_name_creds(track->bus, name, 0, NULL);
+        track->n_adding--;
         if (r < 0) {
-                hashmap_remove(track->names, n);
+                hashmap_remove(track->names, name);
+                bus_track_add_to_queue(track);
                 return r;
         }
 
+        n->n_ref = 1;
         n = NULL;
-        slot = NULL;
 
         bus_track_remove_from_queue(track);
         track->modified = true;
@@ -207,37 +297,48 @@ _public_ int sd_bus_track_add_name(sd_bus_track *track, const char *name) {
 }
 
 _public_ int sd_bus_track_remove_name(sd_bus_track *track, const char *name) {
-        _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *slot = NULL;
-        _cleanup_free_ char *n = NULL;
+        struct track_item *i;
 
         assert_return(name, -EINVAL);
 
-        if (!track)
+        if (!track) /* Treat a NULL track object as an empty track object */
                 return 0;
 
-        slot = hashmap_remove2(track->names, (char*) name, (void**) &n);
-        if (!slot)
-                return 0;
+        if (!track->recursive)
+                return bus_track_remove_name_fully(track, name);
 
-        if (hashmap_isempty(track->names))
-                bus_track_add_to_queue(track);
+        i = hashmap_get(track->names, name);
+        if (!i)
+                return -EUNATCH;
+        if (i->n_ref <= 0)
+                return -EUNATCH;
 
-        track->modified = true;
+        i->n_ref--;
+
+        if (i->n_ref <= 0)
+                return bus_track_remove_name_fully(track, name);
 
         return 1;
 }
 
 _public_ unsigned sd_bus_track_count(sd_bus_track *track) {
-        if (!track)
+
+        if (!track) /* Let's consider a NULL object equivalent to an empty object */
                 return 0;
 
+        /* This signature really should have returned an int, so that we can propagate errors. But well, ... Also, note
+         * that this returns the number of names being watched, and multiple references to the same name are not
+         * counted. */
+
         return hashmap_size(track->names);
 }
 
 _public_ const char* sd_bus_track_contains(sd_bus_track *track, const char *name) {
-        assert_return(track, NULL);
         assert_return(name, NULL);
 
+        if (!track) /* Let's consider a NULL object equivalent to an empty object */
+                return NULL;
+
         return hashmap_get(track->names, (void*) name) ? name : NULL;
 }
 
@@ -273,6 +374,9 @@ _public_ int sd_bus_track_add_sender(sd_bus_track *track, sd_bus_message *m) {
         assert_return(track, -EINVAL);
         assert_return(m, -EINVAL);
 
+        if (sd_bus_message_get_bus(m) != track->bus)
+                return -EINVAL;
+
         sender = sd_bus_message_get_sender(m);
         if (!sender)
                 return -EINVAL;
@@ -283,9 +387,14 @@ _public_ int sd_bus_track_add_sender(sd_bus_track *track, sd_bus_message *m) {
 _public_ int sd_bus_track_remove_sender(sd_bus_track *track, sd_bus_message *m) {
         const char *sender;
 
-        assert_return(track, -EINVAL);
         assert_return(m, -EINVAL);
 
+        if (!track) /* Treat a NULL track object as an empty track object */
+                return 0;
+
+        if (sd_bus_message_get_bus(m) != track->bus)
+                return -EINVAL;
+
         sender = sd_bus_message_get_sender(m);
         if (!sender)
                 return -EINVAL;
@@ -303,7 +412,6 @@ void bus_track_dispatch(sd_bus_track *track) {
         int r;
 
         assert(track);
-        assert(track->in_queue);
         assert(track->handler);
 
         bus_track_remove_from_queue(track);
@@ -319,6 +427,34 @@ void bus_track_dispatch(sd_bus_track *track) {
         sd_bus_track_unref(track);
 }
 
+void bus_track_close(sd_bus_track *track) {
+        struct track_item *i;
+
+        assert(track);
+
+        /* Called whenever our bus connected is closed. If so, and our track object is non-empty, dispatch it
+         * immediately, as we are closing now, but first flush out all names. */
+
+        if (!track->in_list)
+                return; /* We already closed this one, don't close it again. */
+
+        /* Remember that this one is closed now */
+        LIST_REMOVE(tracks, track->bus->tracks, track);
+        track->in_list = false;
+
+        /* If there's no name in this one anyway, we don't have to dispatch */
+        if (hashmap_isempty(track->names))
+                return;
+
+        /* Let's flush out all names */
+        while ((i = hashmap_steal_first(track->names)))
+                track_item_free(i);
+
+        /* Invoke handler */
+        if (track->handler)
+                bus_track_dispatch(track);
+}
+
 _public_ void *sd_bus_track_get_userdata(sd_bus_track *track) {
         assert_return(track, NULL);
 
@@ -335,3 +471,55 @@ _public_ void *sd_bus_track_set_userdata(sd_bus_track *track, void *userdata) {
 
         return ret;
 }
+
+_public_ int sd_bus_track_set_recursive(sd_bus_track *track, int b) {
+        assert_return(track, -EINVAL);
+
+        if (track->recursive == !!b)
+                return 0;
+
+        if (!hashmap_isempty(track->names))
+                return -EBUSY;
+
+        track->recursive = b;
+        return 0;
+}
+
+_public_ int sd_bus_track_get_recursive(sd_bus_track *track) {
+        assert_return(track, -EINVAL);
+
+        return track->recursive;
+}
+
+_public_ int sd_bus_track_count_sender(sd_bus_track *track, sd_bus_message *m) {
+        const char *sender;
+
+        assert_return(m, -EINVAL);
+
+        if (!track) /* Let's consider a NULL object equivalent to an empty object */
+                return 0;
+
+        if (sd_bus_message_get_bus(m) != track->bus)
+                return -EINVAL;
+
+        sender = sd_bus_message_get_sender(m);
+        if (!sender)
+                return -EINVAL;
+
+        return sd_bus_track_count_name(track, sender);
+}
+
+_public_ int sd_bus_track_count_name(sd_bus_track *track, const char *name) {
+        struct track_item *i;
+
+        assert_return(service_name_is_valid(name), -EINVAL);
+
+        if (!track) /* Let's consider a NULL object equivalent to an empty object */
+                return 0;
+
+        i = hashmap_get(track->names, name);
+        if (!i)
+                return 0;
+
+        return i->n_ref;
+}
index 7d93a72..26bd05f 100644 (file)
@@ -20,3 +20,4 @@
 ***/
 
 void bus_track_dispatch(sd_bus_track *track);
+void bus_track_close(sd_bus_track *track);
index ed5f94e..2f065c2 100644 (file)
@@ -107,6 +107,7 @@ static void bus_free(sd_bus *b) {
 
         assert(b);
         assert(!b->track_queue);
+        assert(!b->tracks);
 
         b->state = BUS_CLOSED;
 
@@ -587,6 +588,8 @@ static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
                 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
         }
 
+        b->is_local = true;
+
         return 0;
 }
 
@@ -654,6 +657,8 @@ static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
 
         freeaddrinfo(result);
 
+        b->is_local = false;
+
         return 0;
 }
 
@@ -736,6 +741,9 @@ static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
 
         b->exec_path = path;
         b->exec_argv = argv;
+
+        b->is_local = false;
+
         return 0;
 
 fail:
@@ -779,6 +787,8 @@ static int parse_kernel_address(sd_bus *b, const char **p, char **guid) {
         b->kernel = path;
         path = NULL;
 
+        b->is_local = true;
+
         return 0;
 }
 
@@ -837,6 +847,7 @@ static int parse_container_unix_address(sd_bus *b, const char **p, char **guid)
         b->sockaddr.un.sun_family = AF_UNIX;
         strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
         b->sockaddr_size = SOCKADDR_UN_LEN(b->sockaddr.un);
+        b->is_local = false;
 
         return 0;
 }
@@ -897,6 +908,8 @@ static int parse_container_kernel_address(sd_bus *b, const char **p, char **guid
         if (r < 0)
                 return r;
 
+        b->is_local = false;
+
         return 0;
 }
 
@@ -1178,6 +1191,7 @@ _public_ int sd_bus_open(sd_bus **ret) {
         /* We don't know whether the bus is trusted or not, so better
          * be safe, and authenticate everything */
         b->trusted = false;
+        b->is_local = false;
         b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
         b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
 
@@ -1226,6 +1240,7 @@ _public_ int sd_bus_open_system(sd_bus **ret) {
         b->trusted = false;
         b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
         b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
+        b->is_local = true;
 
         r = sd_bus_start(b);
         if (r < 0)
@@ -1292,6 +1307,7 @@ _public_ int sd_bus_open_user(sd_bus **ret) {
         /* We don't do any per-method access control on the user
          * bus. */
         b->trusted = true;
+        b->is_local = true;
 
         r = sd_bus_start(b);
         if (r < 0)
@@ -1338,7 +1354,7 @@ int bus_set_address_system_remote(sd_bus *b, const char *host) {
                         return -ENOMEM;
         }
 
-        b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", c, NULL);
+        b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", c);
         if (!b->address)
                 return -ENOMEM;
 
@@ -1363,6 +1379,7 @@ _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
         bus->bus_client = true;
         bus->trusted = false;
         bus->is_system = true;
+        bus->is_local = false;
 
         r = sd_bus_start(bus);
         if (r < 0)
@@ -1386,7 +1403,7 @@ int bus_set_address_system_machine(sd_bus *b, const char *machine) {
         if (!e)
                 return -ENOMEM;
 
-        b->address = strjoin("x-machine-kernel:machine=", e, ";x-machine-unix:machine=", e, NULL);
+        b->address = strjoin("x-machine-kernel:machine=", e, ";x-machine-unix:machine=", e);
         if (!b->address)
                 return -ENOMEM;
 
@@ -1412,6 +1429,7 @@ _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
         bus->bus_client = true;
         bus->trusted = false;
         bus->is_system = true;
+        bus->is_local = false;
 
         r = sd_bus_start(bus);
         if (r < 0)
@@ -2640,62 +2658,101 @@ null_message:
         return r;
 }
 
-static int process_closing(sd_bus *bus, sd_bus_message **ret) {
+static int bus_exit_now(sd_bus *bus) {
+        assert(bus);
+
+        /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
+         * sd_event_exit(), otherwise invokes libc exit(). */
+
+        if (bus->exited) /* did we already exit? */
+                return 0;
+        if (!bus->exit_triggered) /* was the exit condition triggered? */
+                return 0;
+        if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
+                return 0;
+
+        bus->exited = true; /* never exit more than once */
+
+        log_debug("Bus connection disconnected, exiting.");
+
+        if (bus->event)
+                return sd_event_exit(bus->event, EXIT_FAILURE);
+        else
+                exit(EXIT_FAILURE);
+
+        assert_not_reached("exit() didn't exit?");
+}
+
+static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
+        _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
-        struct reply_callback *c;
+        sd_bus_slot *slot;
         int r;
 
         assert(bus);
-        assert(bus->state == BUS_CLOSING);
+        assert(c);
 
-        c = ordered_hashmap_first(bus->reply_callbacks);
-        if (c) {
-                _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
-                sd_bus_slot *slot;
+        r = bus_message_new_synthetic_error(
+                        bus,
+                        c->cookie,
+                        &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
+                        &m);
+        if (r < 0)
+                return r;
 
-                /* First, fail all outstanding method calls */
-                r = bus_message_new_synthetic_error(
-                                bus,
-                                c->cookie,
-                                &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
-                                &m);
-                if (r < 0)
-                        return r;
+        r = bus_seal_synthetic_message(bus, m);
+        if (r < 0)
+                return r;
 
-                r = bus_seal_synthetic_message(bus, m);
-                if (r < 0)
-                        return r;
+        if (c->timeout != 0) {
+                prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
+                c->timeout = 0;
+        }
 
-                if (c->timeout != 0) {
-                        prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
-                        c->timeout = 0;
-                }
+        ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
+        c->cookie = 0;
 
-                ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
-                c->cookie = 0;
+        slot = container_of(c, sd_bus_slot, reply_callback);
 
-                slot = container_of(c, sd_bus_slot, reply_callback);
+        bus->iteration_counter++;
 
-                bus->iteration_counter++;
+        bus->current_message = m;
+        bus->current_slot = sd_bus_slot_ref(slot);
+        bus->current_handler = c->callback;
+        bus->current_userdata = slot->userdata;
+        r = c->callback(m, slot->userdata, &error_buffer);
+        bus->current_userdata = NULL;
+        bus->current_handler = NULL;
+        bus->current_slot = NULL;
+        bus->current_message = NULL;
 
-                bus->current_message = m;
-                bus->current_slot = sd_bus_slot_ref(slot);
-                bus->current_handler = c->callback;
-                bus->current_userdata = slot->userdata;
-                r = c->callback(m, slot->userdata, &error_buffer);
-                bus->current_userdata = NULL;
-                bus->current_handler = NULL;
-                bus->current_slot = NULL;
-                bus->current_message = NULL;
+        if (slot->floating) {
+                bus_slot_disconnect(slot);
+                sd_bus_slot_unref(slot);
+        }
 
-                if (slot->floating) {
-                        bus_slot_disconnect(slot);
-                        sd_bus_slot_unref(slot);
-                }
+        sd_bus_slot_unref(slot);
 
-                sd_bus_slot_unref(slot);
+        return bus_maybe_reply_error(m, r, &error_buffer);
+}
+
+static int process_closing(sd_bus *bus, sd_bus_message **ret) {
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+        struct reply_callback *c;
+        int r;
+
+        assert(bus);
+        assert(bus->state == BUS_CLOSING);
+
+        /* First, fail all outstanding method calls */
+        c = ordered_hashmap_first(bus->reply_callbacks);
+        if (c)
+                return process_closing_reply_callback(bus, c);
 
-                return bus_maybe_reply_error(m, r, &error_buffer);
+        /* Then, fake-drop all remaining bus tracking references */
+        if (bus->tracks) {
+                bus_track_close(bus->tracks);
+                return 1;
         }
 
         /* Then, synthesize a Disconnected message */
@@ -2727,6 +2784,10 @@ static int process_closing(sd_bus *bus, sd_bus_message **ret) {
         if (r != 0)
                 goto finish;
 
+        /* Nothing else to do, exit now, if the condition holds */
+        bus->exit_triggered = true;
+        (void) bus_exit_now(bus);
+
         if (ret) {
                 *ret = m;
                 m = NULL;
@@ -3426,7 +3487,7 @@ _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, cha
         if (!e)
                 return -ENOMEM;
 
-        ret = strjoin(prefix, "/", e, NULL);
+        ret = strjoin(prefix, "/", e);
         if (!ret)
                 return -ENOMEM;
 
@@ -3789,3 +3850,21 @@ _public_ void sd_bus_default_flush_close(void) {
         flush_close(default_user_bus);
         flush_close(default_system_bus);
 }
+
+_public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
+        assert_return(bus, -EINVAL);
+
+        /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
+         * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
+         * from the client side. */
+        bus->exit_on_disconnect = b;
+
+        /* If the exit condition was triggered already, exit immediately. */
+        return bus_exit_now(bus);
+}
+
+_public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
+        assert_return(bus, -EINVAL);
+
+        return bus->exit_on_disconnect;
+}
index 048c0d1..0fc6fc9 100644 (file)
@@ -30,7 +30,7 @@
 #include "bus-match.h"
 #include "bus-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "log.h"
 #include "macro.h"
 #include "util.h"
@@ -351,7 +351,7 @@ finish:
 static int quit_callback(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
         bool *x = userdata;
 
-        log_error("Quit callback: %s", strerror(sd_bus_message_get_errno(m)));
+        log_error_errno(sd_bus_message_get_errno(m), "Quit callback: %m");
 
         *x = 1;
         return 1;
index e9ef483..64bd76a 100644 (file)
@@ -27,12 +27,17 @@ int main(int argc, char *argv[]) {
         _cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
         int r;
 
-        if (cg_unified() == -ENOMEDIUM) {
-                puts("Skipping test: /sys/fs/cgroup/ not available");
+        log_set_max_level(LOG_DEBUG);
+        log_parse_environment();
+        log_open();
+
+        if (cg_unified_flush() == -ENOMEDIUM) {
+                log_info("Skipping test: /sys/fs/cgroup/ not available");
                 return EXIT_TEST_SKIP;
         }
 
         r = sd_bus_creds_new_from_pid(&creds, 0, _SD_BUS_CREDS_ALL);
+        log_full_errno(r < 0 ? LOG_ERR : LOG_DEBUG, r, "sd_bus_creds_new_from_pid: %m");
         assert_se(r >= 0);
 
         bus_creds_dump(creds, NULL, true);
index f11cafd..0b33ab7 100644 (file)
@@ -49,7 +49,7 @@ static int something_handler(sd_bus_message *m, void *userdata, sd_bus_error *er
         r = sd_bus_message_read(m, "s", &s);
         assert_se(r > 0);
 
-        n = strjoin("<<<", s, ">>>", NULL);
+        n = strjoin("<<<", s, ">>>");
         assert_se(n);
 
         free(c->something);
@@ -525,8 +525,6 @@ int main(int argc, char *argv[]) {
         void *p;
         int r, q;
 
-        zero(c);
-
         c.automatic_integer_property = 4711;
         assert_se(c.automatic_string_property = strdup("dudeldu"));
 
diff --git a/src/libsystemd/sd-bus/test-bus-track.c b/src/libsystemd/sd-bus/test-bus-track.c
new file mode 100644 (file)
index 0000000..06c6167
--- /dev/null
@@ -0,0 +1,113 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 "sd-bus.h"
+
+#include "macro.h"
+
+static bool track_cb_called_x = false;
+static bool track_cb_called_y = false;
+
+static int track_cb_x(sd_bus_track *t, void *userdata) {
+
+        log_error("TRACK CB X");
+
+        assert_se(!track_cb_called_x);
+        track_cb_called_x = true;
+
+        /* This means b's name disappeared. Let's now disconnect, to make sure the track handling on disconnect works
+         * as it should. */
+
+        assert_se(shutdown(sd_bus_get_fd(sd_bus_track_get_bus(t)), SHUT_RDWR) >= 0);
+        return 1;
+}
+
+static int track_cb_y(sd_bus_track *t, void *userdata) {
+        int r;
+
+        log_error("TRACK CB Y");
+
+        assert_se(!track_cb_called_y);
+        track_cb_called_y = true;
+
+        /* We got disconnected, let's close everything */
+
+        r = sd_event_exit(sd_bus_get_event(sd_bus_track_get_bus(t)), EXIT_SUCCESS);
+        assert_se(r >= 0);
+
+        return 0;
+}
+
+int main(int argc, char *argv[]) {
+        _cleanup_(sd_event_unrefp) sd_event *event = NULL;
+        _cleanup_(sd_bus_track_unrefp) sd_bus_track *x = NULL, *y = NULL;
+        _cleanup_(sd_bus_unrefp) sd_bus *a = NULL, *b = NULL;
+        const char *unique;
+        int r;
+
+        r = sd_event_default(&event);
+        assert_se(r >= 0);
+
+        r = sd_bus_open_system(&a);
+        if (IN_SET(r, -ECONNREFUSED, -ENOENT)) {
+                log_info("Failed to connect to bus, skipping tests.");
+                return EXIT_TEST_SKIP;
+        }
+        assert_se(r >= 0);
+
+        r = sd_bus_attach_event(a, event, SD_EVENT_PRIORITY_NORMAL);
+        assert_se(r >= 0);
+
+        r = sd_bus_open_system(&b);
+        assert_se(r >= 0);
+
+        r = sd_bus_attach_event(b, event, SD_EVENT_PRIORITY_NORMAL);
+        assert_se(r >= 0);
+
+        /* Watch b's name from a */
+        r = sd_bus_track_new(a, &x, track_cb_x, NULL);
+        assert_se(r >= 0);
+
+        r = sd_bus_get_unique_name(b, &unique);
+        assert_se(r >= 0);
+
+        r = sd_bus_track_add_name(x, unique);
+        assert_se(r >= 0);
+
+        /* Watch's a's own name from a */
+        r = sd_bus_track_new(a, &y, track_cb_y, NULL);
+        assert_se(r >= 0);
+
+        r = sd_bus_get_unique_name(a, &unique);
+        assert_se(r >= 0);
+
+        r = sd_bus_track_add_name(y, unique);
+        assert_se(r >= 0);
+
+        /* Now make b's name disappear */
+        sd_bus_close(b);
+
+        r = sd_event_loop(event);
+        assert_se(r >= 0);
+
+        assert_se(track_cb_called_x);
+        assert_se(track_cb_called_y);
+
+        return 0;
+}
diff --git a/src/libsystemd/sd-bus/test-bus-vtable-cc.cc b/src/libsystemd/sd-bus/test-bus-vtable-cc.cc
new file mode 120000 (symlink)
index 0000000..abee398
--- /dev/null
@@ -0,0 +1 @@
+test-bus-vtable.c
\ No newline at end of file
diff --git a/src/libsystemd/sd-bus/test-bus-vtable.c b/src/libsystemd/sd-bus/test-bus-vtable.c
new file mode 100644 (file)
index 0000000..fd9ad81
--- /dev/null
@@ -0,0 +1,81 @@
+#include <stdbool.h>
+#include <stddef.h>
+
+/* We use system assert.h here, because we don't want to keep macro.h and log.h C++ compatible */
+#undef NDEBUG
+#include <assert.h>
+#include <errno.h>
+
+#include "sd-bus-vtable.h"
+
+#define DEFAULT_BUS_PATH "unix:path=/run/dbus/system_bus_socket"
+
+struct context {
+        bool quit;
+        char *something;
+        char *automatic_string_property;
+        uint32_t automatic_integer_property;
+};
+
+static int handler(sd_bus_message *m, void *userdata, sd_bus_error *error) {
+        return 1;
+}
+
+static int value_handler(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
+        return 1;
+}
+
+static int get_handler(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
+        return 1;
+}
+
+static int set_handler(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *value, void *userdata, sd_bus_error *error) {
+        return 1;
+}
+
+static const sd_bus_vtable vtable[] = {
+        SD_BUS_VTABLE_START(0),
+        SD_BUS_METHOD("AlterSomething", "s", "s", handler, 0),
+        SD_BUS_METHOD("Exit", "", "", handler, 0),
+        SD_BUS_METHOD_WITH_OFFSET("AlterSomething2", "s", "s", handler, 200, 0),
+        SD_BUS_METHOD_WITH_OFFSET("Exit2", "", "", handler, 200, 0),
+        SD_BUS_PROPERTY("Value", "s", value_handler, 10, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("Value2", "s", value_handler, 10, SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
+        SD_BUS_PROPERTY("Value3", "s", value_handler, 10, SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("Value4", "s", value_handler, 10, 0),
+        SD_BUS_PROPERTY("AnExplicitProperty", "s", NULL, offsetof(struct context, something),
+                        SD_BUS_VTABLE_PROPERTY_EXPLICIT|SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
+        SD_BUS_WRITABLE_PROPERTY("Something", "s", get_handler, set_handler, 0, 0),
+        SD_BUS_WRITABLE_PROPERTY("AutomaticStringProperty", "s", NULL, NULL,
+                                 offsetof(struct context, automatic_string_property), 0),
+        SD_BUS_WRITABLE_PROPERTY("AutomaticIntegerProperty", "u", NULL, NULL,
+                                 offsetof(struct context, automatic_integer_property), 0),
+        SD_BUS_METHOD("NoOperation", NULL, NULL, NULL, 0),
+        SD_BUS_SIGNAL("DummySignal", "b", 0),
+        SD_BUS_SIGNAL("DummySignal2", "so", 0),
+        SD_BUS_VTABLE_END
+};
+
+static void test_vtable(void) {
+        sd_bus *bus = NULL;
+        struct context c = {};
+        int r;
+
+        assert(sd_bus_new(&bus) >= 0);
+
+        assert(sd_bus_add_object_vtable(bus, NULL, "/foo", "org.freedesktop.systemd.testVtable", vtable, &c) >= 0);
+        assert(sd_bus_add_object_vtable(bus, NULL, "/foo", "org.freedesktop.systemd.testVtable2", vtable, &c) >= 0);
+
+        assert(sd_bus_set_address(bus, DEFAULT_BUS_PATH) >= 0);
+        r = sd_bus_start(bus);
+        assert(r == 0 ||     /* success */
+               r == -ENOENT  /* dbus is inactive */ );
+
+        sd_bus_unref(bus);
+}
+
+int main(int argc, char **argv) {
+        test_vtable();
+
+        return 0;
+}
index b0ce9fc..2624ec1 100644 (file)
@@ -322,6 +322,64 @@ _public_ int sd_is_socket_inet(int fd, int family, int type, int listening, uint
         return 1;
 }
 
+_public_ int sd_is_socket_sockaddr(int fd, int type, const struct sockaddr* addr, unsigned addr_len, int listening) {
+        union sockaddr_union sockaddr = {};
+        socklen_t l = sizeof(sockaddr);
+        int r;
+
+        assert_return(fd >= 0, -EBADF);
+        assert_return(addr, -EINVAL);
+        assert_return(addr_len >= sizeof(sa_family_t), -ENOBUFS);
+        assert_return(IN_SET(addr->sa_family, AF_INET, AF_INET6), -EPFNOSUPPORT);
+
+        r = sd_is_socket_internal(fd, type, listening);
+        if (r <= 0)
+                return r;
+
+        if (getsockname(fd, &sockaddr.sa, &l) < 0)
+                return -errno;
+
+        if (l < sizeof(sa_family_t))
+                return -EINVAL;
+
+        if (sockaddr.sa.sa_family != addr->sa_family)
+                return 0;
+
+        if (sockaddr.sa.sa_family == AF_INET) {
+                const struct sockaddr_in *in = (const struct sockaddr_in *) addr;
+
+                if (l < sizeof(struct sockaddr_in) || addr_len < sizeof(struct sockaddr_in))
+                        return -EINVAL;
+
+                if (in->sin_port != 0 &&
+                    sockaddr.in.sin_port != in->sin_port)
+                        return false;
+
+                return sockaddr.in.sin_addr.s_addr == in->sin_addr.s_addr;
+
+        } else {
+                const struct sockaddr_in6 *in = (const struct sockaddr_in6 *) addr;
+
+                if (l < sizeof(struct sockaddr_in6) || addr_len < sizeof(struct sockaddr_in6))
+                        return -EINVAL;
+
+                if (in->sin6_port != 0 &&
+                    sockaddr.in6.sin6_port != in->sin6_port)
+                        return false;
+
+                if (in->sin6_flowinfo != 0 &&
+                    sockaddr.in6.sin6_flowinfo != in->sin6_flowinfo)
+                        return false;
+
+                if (in->sin6_scope_id != 0 &&
+                    sockaddr.in6.sin6_scope_id != in->sin6_scope_id)
+                        return false;
+
+                return memcmp(sockaddr.in6.sin6_addr.s6_addr, in->sin6_addr.s6_addr,
+                              sizeof(in->sin6_addr.s6_addr)) == 0;
+        }
+}
+
 _public_ int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length) {
         union sockaddr_union sockaddr = {};
         socklen_t l = sizeof(sockaddr);
index 62d03ae..ebb8b2d 100644 (file)
@@ -631,10 +631,8 @@ static int enumerator_scan_devices_tag(sd_device_enumerator *enumerator, const c
         if (!dir) {
                 if (errno == ENOENT)
                         return 0;
-                else {
-                        log_error("sd-device-enumerator: could not open tags directory %s: %m", path);
-                        return -errno;
-                }
+                else
+                        return log_error_errno(errno, "sd-device-enumerator: could not open tags directory %s: %m", path);
         }
 
         /* TODO: filter away subsystems? */
@@ -758,10 +756,8 @@ static int parent_crawl_children(sd_device_enumerator *enumerator, const char *p
         int r = 0;
 
         dir = opendir(path);
-        if (!dir) {
-                log_debug("sd-device-enumerate: could not open parent directory %s: %m", path);
-                return -errno;
-        }
+        if (!dir)
+                return log_debug_errno(errno, "sd-device-enumerate: could not open parent directory %s: %m", path);
 
         FOREACH_DIRENT_ALL(dent, dir, return -errno) {
                 _cleanup_free_ char *child = NULL;
@@ -773,7 +769,7 @@ static int parent_crawl_children(sd_device_enumerator *enumerator, const char *p
                 if (dent->d_type != DT_DIR)
                         continue;
 
-                child = strjoin(path, "/", dent->d_name, NULL);
+                child = strjoin(path, "/", dent->d_name);
                 if (!child)
                         return -ENOMEM;
 
index 9fad388..f4783de 100644 (file)
@@ -34,7 +34,7 @@ struct sd_device {
         uint64_t properties_generation; /* changes whenever the properties are changed */
         uint64_t properties_iterator_generation; /* generation when iteration was started */
 
-        /* the subset of the properties that should be written to the db*/
+        /* the subset of the properties that should be written to the db */
         OrderedHashmap *properties_db;
 
         Hashmap *sysattr_values; /* cached sysattr values */
index 9082d37..b4cd676 100644 (file)
@@ -778,12 +778,12 @@ int device_rename(sd_device *device, const char *name) {
 
         r = sd_device_get_property_value(device, "INTERFACE", &interface);
         if (r >= 0) {
-                r = device_add_property_internal(device, "INTERFACE", name);
+                /* like DEVPATH_OLD, INTERFACE_OLD is not saved to the db, but only stays around for the current event */
+                r = device_add_property_internal(device, "INTERFACE_OLD", interface);
                 if (r < 0)
                         return r;
 
-                /* like DEVPATH_OLD, INTERFACE_OLD is not saved to the db, but only stays around for the current event */
-                r = device_add_property_internal(device, "INTERFACE_OLD", interface);
+                r = device_add_property_internal(device, "INTERFACE", name);
                 if (r < 0)
                         return r;
         } else if (r != -ENOENT)
index 0c4ad96..ab36aa2 100644 (file)
@@ -28,6 +28,7 @@
 #include "device-internal.h"
 #include "device-private.h"
 #include "device-util.h"
+#include "dirent-util.h"
 #include "fd-util.h"
 #include "fileio.h"
 #include "fs-util.h"
@@ -36,6 +37,7 @@
 #include "parse-util.h"
 #include "path-util.h"
 #include "set.h"
+#include "socket-util.h"
 #include "stat-util.h"
 #include "string-util.h"
 #include "strv.h"
@@ -163,7 +165,7 @@ int device_set_syspath(sd_device *device, const char *_syspath, bool verify) {
         }
 
         if (verify) {
-                r = readlink_and_canonicalize(_syspath, &syspath);
+                r = readlink_and_canonicalize(_syspath, NULL, &syspath);
                 if (r == -ENOENT)
                         /* the device does not exist (any more?) */
                         return -ENODEV;
@@ -193,8 +195,7 @@ int device_set_syspath(sd_device *device, const char *_syspath, bool verify) {
                                         /* this is not a valid device */
                                         return -ENODEV;
 
-                                log_debug("sd-device: %s does not have an uevent file: %m", syspath);
-                                return -errno;
+                                return log_debug_errno(errno, "sd-device: %s does not have an uevent file: %m", syspath);
                         }
                 } else {
                         /* everything else just needs to be a directory */
@@ -323,6 +324,10 @@ _public_ int sd_device_new_from_subsystem_sysname(sd_device **ret, const char *s
         if (access(syspath, F_OK) >= 0)
                 return sd_device_new_from_syspath(ret, syspath);
 
+        syspath = strjoina("/sys/firmware/", subsystem, "/", sysname);
+        if (access(syspath, F_OK) >= 0)
+                return sd_device_new_from_syspath(ret, syspath);
+
         return -ENODEV;
 }
 
@@ -558,7 +563,7 @@ int device_read_uevent_file(sd_device *device) {
                         value = &uevent[i];
                         state = VALUE;
 
-                        /* fall through to handle empty property */
+                        /* fall through */ /* to handle empty property */
                 case VALUE:
                         if (strchr(NEWLINE, uevent[i])) {
                                 uevent[i] = '\0';
@@ -629,9 +634,9 @@ _public_ int sd_device_new_from_device_id(sd_device **ret, const char *id) {
                 if (r < 0)
                         return r;
 
-                sk = socket(PF_INET, SOCK_DGRAM, 0);
+                sk = socket_ioctl_fd();
                 if (sk < 0)
-                        return -errno;
+                        return sk;
 
                 r = ioctl(sk, SIOCGIFNAME, &ifr);
                 if (r < 0)
@@ -1626,7 +1631,7 @@ static int device_sysattrs_read_all(sd_device *device) {
         if (r < 0)
                 return r;
 
-        for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
+        FOREACH_DIRENT_ALL(dent, dir, return -errno) {
                 char *path;
                 struct stat statbuf;
 
@@ -1857,8 +1862,7 @@ _public_ int sd_device_set_sysattr_value(sd_device *device, const char *sysattr,
         _cleanup_free_ char *value = NULL;
         const char *syspath;
         char *path;
-        struct stat statbuf;
-        size_t value_len = 0;
+        size_t len = 0;
         ssize_t size;
         int r;
 
@@ -1876,8 +1880,14 @@ _public_ int sd_device_set_sysattr_value(sd_device *device, const char *sysattr,
                 return r;
 
         path = strjoina(syspath, "/", sysattr);
-        r = lstat(path, &statbuf);
-        if (r < 0) {
+
+        fd = open(path, O_WRONLY | O_CLOEXEC | O_NOFOLLOW);
+        if (fd < 0) {
+                if (errno == ELOOP)
+                        return -EINVAL;
+                if (errno == EISDIR)
+                        return -EISDIR;
+
                 value = strdup("");
                 if (!value)
                         return -ENOMEM;
@@ -1885,50 +1895,35 @@ _public_ int sd_device_set_sysattr_value(sd_device *device, const char *sysattr,
                 r = device_add_sysattr_value(device, sysattr, value);
                 if (r < 0)
                         return r;
+                value = NULL;
 
                 return -ENXIO;
         }
 
-        if (S_ISLNK(statbuf.st_mode))
-                return -EINVAL;
-
-        /* skip directories */
-        if (S_ISDIR(statbuf.st_mode))
-                return -EISDIR;
-
-        /* skip non-readable files */
-        if ((statbuf.st_mode & S_IRUSR) == 0)
-                return -EACCES;
-
-        value_len = strlen(_value);
+        len = strlen(_value);
 
         /* drop trailing newlines */
-        while (value_len > 0 && _value[value_len - 1] == '\n')
-                _value[--value_len] = '\0';
+        while (len > 0 && _value[len - 1] == '\n')
+                len --;
 
         /* value length is limited to 4k */
-        if (value_len > 4096)
+        if (len > 4096)
                 return -EINVAL;
 
-        fd = open(path, O_WRONLY | O_CLOEXEC);
-        if (fd < 0)
-                return -errno;
-
-        value = strdup(_value);
+        value = strndup(_value, len);
         if (!value)
                 return -ENOMEM;
 
-        size = write(fd, value, value_len);
+        size = write(fd, value, len);
         if (size < 0)
                 return -errno;
 
-        if ((size_t)size != value_len)
+        if ((size_t)size != len)
                 return -EIO;
 
         r = device_add_sysattr_value(device, sysattr, value);
         if (r < 0)
                 return r;
-
         value = NULL;
 
         return 0;
index 9857f8b..b4686d0 100644 (file)
@@ -730,7 +730,6 @@ static void event_unmask_signal_data(sd_event *e, struct signal_data *d, int sig
 
                 /* If all the mask is all-zero we can get rid of the structure */
                 hashmap_remove(e->signal_data, &d->priority);
-                assert(!d->current);
                 safe_close(d->fd);
                 free(d);
                 return;
@@ -1539,7 +1538,8 @@ _public_ int sd_event_source_get_priority(sd_event_source *s, int64_t *priority)
         assert_return(s, -EINVAL);
         assert_return(!event_pid_changed(s->event), -ECHILD);
 
-        return s->priority;
+        *priority = s->priority;
+        return 0;
 }
 
 _public_ int sd_event_source_set_priority(sd_event_source *s, int64_t priority) {
@@ -2225,11 +2225,16 @@ static int process_signal(sd_event *e, struct signal_data *d, uint32_t events) {
 }
 
 static int source_dispatch(sd_event_source *s) {
+        EventSourceType saved_type;
         int r = 0;
 
         assert(s);
         assert(s->pending || s->type == SOURCE_EXIT);
 
+        /* Save the event source type, here, so that we still know it after the event callback which might invalidate
+         * the event. */
+        saved_type = s->type;
+
         if (s->type != SOURCE_DEFER && s->type != SOURCE_EXIT) {
                 r = source_set_pending(s, false);
                 if (r < 0)
@@ -2317,7 +2322,7 @@ static int source_dispatch(sd_event_source *s) {
 
         if (r < 0)
                 log_debug_errno(r, "Event source %s (type %s) returned error, disabling: %m",
-                                strna(s->description), event_source_type_to_string(s->type));
+                                strna(s->description), event_source_type_to_string(saved_type));
 
         if (s->n_ref == 0)
                 source_free(s);
index 2891144..8425378 100644 (file)
@@ -17,6 +17,8 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+#include <sys/wait.h>
+
 #include "sd-event.h"
 
 #include "fd-util.h"
@@ -172,6 +174,7 @@ static void test_basic(void) {
         static const char ch = 'x';
         int a[2] = { -1, -1 }, b[2] = { -1, -1}, d[2] = { -1, -1}, k[2] = { -1, -1 };
         uint64_t event_now;
+        int64_t priority;
 
         assert_se(pipe(a) >= 0);
         assert_se(pipe(b) >= 0);
@@ -209,6 +212,8 @@ static void test_basic(void) {
         assert_se(sd_event_add_exit(e, &q, exit_handler, INT_TO_PTR('g')) >= 0);
 
         assert_se(sd_event_source_set_priority(x, 99) >= 0);
+        assert_se(sd_event_source_get_priority(x, &priority) >= 0);
+        assert_se(priority == 99);
         assert_se(sd_event_source_set_enabled(y, SD_EVENT_ONESHOT) >= 0);
         assert_se(sd_event_source_set_prepare(x, prepare_handler) >= 0);
         assert_se(sd_event_source_set_priority(z, 50) >= 0);
index 8ffb5e5..2f4934a 100644 (file)
@@ -70,3 +70,13 @@ struct trie_value_entry_f {
         le64_t key_off;
         le64_t value_off;
 } _packed_;
+
+/* v2 extends v1 with filename and line-number */
+struct trie_value_entry2_f {
+        le64_t key_off;
+        le64_t value_off;
+        le64_t filename_off;
+        le32_t line_number;
+        le16_t file_priority;
+        le16_t padding;
+} _packed_;
index 062fa97..c155c70 100644 (file)
@@ -48,8 +48,6 @@ struct sd_hwdb {
                 const char *map;
         };
 
-        char *modalias;
-
         OrderedHashmap *properties;
         Iterator properties_iterator;
         bool properties_modified;
@@ -97,15 +95,20 @@ static void linebuf_rem_char(struct linebuf *buf) {
         linebuf_rem(buf, 1);
 }
 
-static const struct trie_child_entry_f *trie_node_children(sd_hwdb *hwdb, const struct trie_node_f *node) {
-        return (const struct trie_child_entry_f *)((const char *)node + le64toh(hwdb->head->node_size));
+static const struct trie_child_entry_f *trie_node_child(sd_hwdb *hwdb, const struct trie_node_f *node, size_t idx) {
+        const char *base = (const char *)node;
+
+        base += le64toh(hwdb->head->node_size);
+        base += idx * le64toh(hwdb->head->child_entry_size);
+        return (const struct trie_child_entry_f *)base;
 }
 
-static const struct trie_value_entry_f *trie_node_values(sd_hwdb *hwdb, const struct trie_node_f *node) {
+static const struct trie_value_entry_f *trie_node_value(sd_hwdb *hwdb, const struct trie_node_f *node, size_t idx) {
         const char *base = (const char *)node;
 
         base += le64toh(hwdb->head->node_size);
         base += node->children_count * le64toh(hwdb->head->child_entry_size);
+        base += idx * le64toh(hwdb->head->value_entry_size);
         return (const struct trie_value_entry_f *)base;
 }
 
@@ -129,19 +132,20 @@ static const struct trie_node_f *node_lookup_f(sd_hwdb *hwdb, const struct trie_
         struct trie_child_entry_f search;
 
         search.c = c;
-        child = bsearch(&search, trie_node_children(hwdb, node), node->children_count,
+        child = bsearch(&search, (const char *)node + le64toh(hwdb->head->node_size), node->children_count,
                         le64toh(hwdb->head->child_entry_size), trie_children_cmp_f);
         if (child)
                 return trie_node_from_off(hwdb, child->child_off);
         return NULL;
 }
 
-static int hwdb_add_property(sd_hwdb *hwdb, const char *key, const char *value) {
+static int hwdb_add_property(sd_hwdb *hwdb, const struct trie_value_entry_f *entry) {
+        const char *key;
         int r;
 
         assert(hwdb);
-        assert(key);
-        assert(value);
+
+        key = trie_string(hwdb, entry->key_off);
 
         /*
          * Silently ignore all properties which do not start with a
@@ -152,11 +156,53 @@ static int hwdb_add_property(sd_hwdb *hwdb, const char *key, const char *value)
 
         key++;
 
+        if (le64toh(hwdb->head->value_entry_size) >= sizeof(struct trie_value_entry2_f)) {
+                const struct trie_value_entry2_f *old, *entry2;
+
+                entry2 = (const struct trie_value_entry2_f *)entry;
+                old = ordered_hashmap_get(hwdb->properties, key);
+                if (old) {
+                        /* On duplicates, we order by filename priority and line-number.
+                         *
+                         *
+                         * v2 of the format had 64 bits for the line number.
+                         * v3 reuses top 32 bits of line_number to store the priority.
+                         * We check the top bits — if they are zero we have v2 format.
+                         * This means that v2 clients will print wrong line numbers with
+                         * v3 data.
+                         *
+                         * For v3 data: we compare the priority (of the source file)
+                         * and the line number.
+                         *
+                         * For v2 data: we rely on the fact that the filenames in the hwdb
+                         * are added in the order of priority (higher later), because they
+                         * are *processed* in the order of priority. So we compare the
+                         * indices to determine which file had higher priority. Comparing
+                         * the strings alphabetically would be useless, because those are
+                         * full paths, and e.g. /usr/lib would sort after /etc, even
+                         * though it has lower priority. This is not reliable because of
+                         * suffix compression, but should work for the most common case of
+                         * /usr/lib/udev/hwbd.d and /etc/udev/hwdb.d, and is better than
+                         * not doing the comparison at all.
+                         */
+                        bool lower;
+
+                        if (entry2->file_priority == 0)
+                                lower = entry2->filename_off < old->filename_off ||
+                                        (entry2->filename_off == old->filename_off && entry2->line_number < old->line_number);
+                        else
+                                lower = entry2->file_priority < old->file_priority ||
+                                        (entry2->file_priority == old->file_priority && entry2->line_number < old->line_number);
+                        if (lower)
+                                return 0;
+                }
+        }
+
         r = ordered_hashmap_ensure_allocated(&hwdb->properties, &string_hash_ops);
         if (r < 0)
                 return r;
 
-        r = ordered_hashmap_replace(hwdb->properties, key, (char*)value);
+        r = ordered_hashmap_replace(hwdb->properties, key, (void *)entry);
         if (r < 0)
                 return r;
 
@@ -177,7 +223,7 @@ static int trie_fnmatch_f(sd_hwdb *hwdb, const struct trie_node_f *node, size_t
         linebuf_add(buf, prefix + p, len);
 
         for (i = 0; i < node->children_count; i++) {
-                const struct trie_child_entry_f *child = &trie_node_children(hwdb, node)[i];
+                const struct trie_child_entry_f *child = trie_node_child(hwdb, node, i);
 
                 linebuf_add_char(buf, child->c);
                 err = trie_fnmatch_f(hwdb, trie_node_from_off(hwdb, child->child_off), 0, buf, search);
@@ -188,8 +234,7 @@ static int trie_fnmatch_f(sd_hwdb *hwdb, const struct trie_node_f *node, size_t
 
         if (le64toh(node->values_count) && fnmatch(linebuf_get(buf), search, 0) == 0)
                 for (i = 0; i < le64toh(node->values_count); i++) {
-                        err = hwdb_add_property(hwdb, trie_string(hwdb, trie_node_values(hwdb, node)[i].key_off),
-                                                trie_string(hwdb, trie_node_values(hwdb, node)[i].value_off));
+                        err = hwdb_add_property(hwdb, trie_node_value(hwdb, node, i));
                         if (err < 0)
                                 return err;
                 }
@@ -215,7 +260,7 @@ static int trie_search_f(sd_hwdb *hwdb, const char *search) {
                         uint8_t c;
 
                         for (; (c = trie_string(hwdb, node->prefix_off)[p]); p++) {
-                                if (c == '*' || c == '?' || c == '[')
+                                if (IN_SET(c, '*', '?', '['))
                                         return trie_fnmatch_f(hwdb, node, p, &buf, search + i + p);
                                 if (c != search[i + p])
                                         return 0;
@@ -254,8 +299,7 @@ static int trie_search_f(sd_hwdb *hwdb, const char *search) {
                         size_t n;
 
                         for (n = 0; n < le64toh(node->values_count); n++) {
-                                err = hwdb_add_property(hwdb, trie_string(hwdb, trie_node_values(hwdb, node)[n].key_off),
-                                                        trie_string(hwdb, trie_node_values(hwdb, node)[n].value_off));
+                                err = hwdb_add_property(hwdb, trie_node_value(hwdb, node, n));
                                 if (err < 0)
                                         return err;
                         }
@@ -303,7 +347,7 @@ _public_ int sd_hwdb_new(sd_hwdb **ret) {
         }
 
         if (!hwdb->f) {
-                log_debug("hwdb.bin does not exist, please run udevadm hwdb --update");
+                log_debug("hwdb.bin does not exist, please run systemd-hwdb update");
                 return -ENOENT;
         }
 
@@ -347,7 +391,6 @@ _public_ sd_hwdb *sd_hwdb_unref(sd_hwdb *hwdb) {
                 if (hwdb->map)
                         munmap((void *)hwdb->map, hwdb->st.st_size);
                 safe_fclose(hwdb->f);
-                free(hwdb->modalias);
                 ordered_hashmap_free(hwdb->properties);
                 free(hwdb);
         }
@@ -381,36 +424,17 @@ bool hwdb_validate(sd_hwdb *hwdb) {
 }
 
 static int properties_prepare(sd_hwdb *hwdb, const char *modalias) {
-        _cleanup_free_ char *mod = NULL;
-        int r;
-
         assert(hwdb);
         assert(modalias);
 
-        if (streq_ptr(modalias, hwdb->modalias))
-                return 0;
-
-        mod = strdup(modalias);
-        if (!mod)
-                return -ENOMEM;
-
         ordered_hashmap_clear(hwdb->properties);
-
         hwdb->properties_modified = true;
 
-        r = trie_search_f(hwdb, modalias);
-        if (r < 0)
-                return r;
-
-        free(hwdb->modalias);
-        hwdb->modalias = mod;
-        mod = NULL;
-
-        return 0;
+        return trie_search_f(hwdb, modalias);
 }
 
 _public_ int sd_hwdb_get(sd_hwdb *hwdb, const char *modalias, const char *key, const char **_value) {
-        const char *value;
+        const struct trie_value_entry_f *entry;
         int r;
 
         assert_return(hwdb, -EINVAL);
@@ -422,11 +446,11 @@ _public_ int sd_hwdb_get(sd_hwdb *hwdb, const char *modalias, const char *key, c
         if (r < 0)
                 return r;
 
-        value = ordered_hashmap_get(hwdb->properties, key);
-        if (!value)
+        entry = ordered_hashmap_get(hwdb->properties, key);
+        if (!entry)
                 return -ENOENT;
 
-        *_value = value;
+        *_value = trie_string(hwdb, entry->value_off);
 
         return 0;
 }
@@ -449,8 +473,8 @@ _public_ int sd_hwdb_seek(sd_hwdb *hwdb, const char *modalias) {
 }
 
 _public_ int sd_hwdb_enumerate(sd_hwdb *hwdb, const char **key, const char **value) {
+        const struct trie_value_entry_f *entry;
         const void *k;
-        void *v;
 
         assert_return(hwdb, -EINVAL);
         assert_return(key, -EINVAL);
@@ -459,12 +483,12 @@ _public_ int sd_hwdb_enumerate(sd_hwdb *hwdb, const char **key, const char **val
         if (hwdb->properties_modified)
                 return -EAGAIN;
 
-        ordered_hashmap_iterate(hwdb->properties, &hwdb->properties_iterator, &v, &k);
+        ordered_hashmap_iterate(hwdb->properties, &hwdb->properties_iterator, (void **)&entry, &k);
         if (!k)
                 return 0;
 
         *key = k;
-        *value = v;
+        *value = trie_string(hwdb, entry->value_off);
 
         return 1;
 }
index c3f527d..e6d45c1 100644 (file)
@@ -186,9 +186,22 @@ int id128_write_fd(int fd, Id128Format f, sd_id128_t id, bool do_sync) {
 int id128_write(const char *p, Id128Format f, sd_id128_t id, bool do_sync) {
         _cleanup_close_ int fd = -1;
 
-        fd = open(p, O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY, 0444);
+        fd = open(p, O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY|O_TRUNC, 0444);
         if (fd < 0)
                 return -errno;
 
         return id128_write_fd(fd, f, id, do_sync);
 }
+
+void id128_hash_func(const void *p, struct siphash *state) {
+        siphash24_compress(p, 16, state);
+}
+
+int id128_compare_func(const void *a, const void *b) {
+        return memcmp(a, b, 16);
+}
+
+const struct hash_ops id128_hash_ops = {
+        .hash = id128_hash_func,
+        .compare = id128_compare_func,
+};
index 3ba59ac..6b3855a 100644 (file)
@@ -22,6 +22,8 @@
 #include <stdbool.h>
 
 #include "sd-id128.h"
+
+#include "hash-funcs.h"
 #include "macro.h"
 
 char *id128_to_uuid_string(sd_id128_t id, char s[37]);
@@ -43,3 +45,7 @@ int id128_read(const char *p, Id128Format f, sd_id128_t *ret);
 
 int id128_write_fd(int fd, Id128Format f, sd_id128_t id, bool do_sync);
 int id128_write(const char *p, Id128Format f, sd_id128_t id, bool do_sync);
+
+void id128_hash_func(const void *p, struct siphash *state);
+int id128_compare_func(const void *a, const void *b) _pure_;
+extern const struct hash_ops id128_hash_ops;
index 9f47d04..b1f6c53 100644 (file)
 
 #include "sd-id128.h"
 
+#include "alloc-util.h"
 #include "fd-util.h"
 #include "hexdecoct.h"
 #include "id128-util.h"
 #include "io-util.h"
+#include "khash.h"
 #include "macro.h"
+#include "missing.h"
 #include "random-util.h"
+#include "user-util.h"
 #include "util.h"
 
 _public_ char *sd_id128_to_string(sd_id128_t id, char s[SD_ID128_STRING_MAX]) {
@@ -129,6 +133,143 @@ _public_ int sd_id128_get_boot(sd_id128_t *ret) {
         return 0;
 }
 
+static int get_invocation_from_keyring(sd_id128_t *ret) {
+
+        _cleanup_free_ char *description = NULL;
+        char *d, *p, *g, *u, *e;
+        unsigned long perms;
+        key_serial_t key;
+        size_t sz = 256;
+        uid_t uid;
+        gid_t gid;
+        int r, c;
+
+#define MAX_PERMS ((unsigned long) (KEY_POS_VIEW|KEY_POS_READ|KEY_POS_SEARCH| \
+                                    KEY_USR_VIEW|KEY_USR_READ|KEY_USR_SEARCH))
+
+        assert(ret);
+
+        key = request_key("user", "invocation_id", NULL, 0);
+        if (key == -1) {
+                /* Keyring support not available? No invocation key stored? */
+                if (IN_SET(errno, ENOSYS, ENOKEY))
+                        return 0;
+
+                return -errno;
+        }
+
+        for (;;) {
+                description = new(char, sz);
+                if (!description)
+                        return -ENOMEM;
+
+                c = keyctl(KEYCTL_DESCRIBE, key, (unsigned long) description, sz, 0);
+                if (c < 0)
+                        return -errno;
+
+                if ((size_t) c <= sz)
+                        break;
+
+                sz = c;
+                free(description);
+        }
+
+        /* The kernel returns a final NUL in the string, verify that. */
+        assert(description[c-1] == 0);
+
+        /* Chop off the final description string */
+        d = strrchr(description, ';');
+        if (!d)
+                return -EIO;
+        *d = 0;
+
+        /* Look for the permissions */
+        p = strrchr(description, ';');
+        if (!p)
+                return -EIO;
+
+        errno = 0;
+        perms = strtoul(p + 1, &e, 16);
+        if (errno > 0)
+                return -errno;
+        if (e == p + 1) /* Read at least one character */
+                return -EIO;
+        if (e != d) /* Must reached the end */
+                return -EIO;
+
+        if ((perms & ~MAX_PERMS) != 0)
+                return -EPERM;
+
+        *p = 0;
+
+        /* Look for the group ID */
+        g = strrchr(description, ';');
+        if (!g)
+                return -EIO;
+        r = parse_gid(g + 1, &gid);
+        if (r < 0)
+                return r;
+        if (gid != 0)
+                return -EPERM;
+        *g = 0;
+
+        /* Look for the user ID */
+        u = strrchr(description, ';');
+        if (!u)
+                return -EIO;
+        r = parse_uid(u + 1, &uid);
+        if (r < 0)
+                return r;
+        if (uid != 0)
+                return -EPERM;
+
+        c = keyctl(KEYCTL_READ, key, (unsigned long) ret, sizeof(sd_id128_t), 0);
+        if (c < 0)
+                return -errno;
+        if (c != sizeof(sd_id128_t))
+                return -EIO;
+
+        return 1;
+}
+
+_public_ int sd_id128_get_invocation(sd_id128_t *ret) {
+        static thread_local sd_id128_t saved_invocation_id = {};
+        int r;
+
+        assert_return(ret, -EINVAL);
+
+        if (sd_id128_is_null(saved_invocation_id)) {
+
+                /* We first try to read the invocation ID from the kernel keyring. This has the benefit that it is not
+                 * fakeable by unprivileged code. If the information is not available in the keyring, we use
+                 * $INVOCATION_ID but ignore the data if our process was called by less privileged code
+                 * (i.e. secure_getenv() instead of getenv()).
+                 *
+                 * The kernel keyring is only relevant for system services (as for user services we don't store the
+                 * invocation ID in the keyring, as there'd be no trust benefit in that). The environment variable is
+                 * primarily relevant for user services, and sufficiently safe as no privilege boundary is involved. */
+
+                r = get_invocation_from_keyring(&saved_invocation_id);
+                if (r < 0)
+                        return r;
+
+                if (r == 0) {
+                        const char *e;
+
+                        e = secure_getenv("INVOCATION_ID");
+                        if (!e)
+                                return -ENXIO;
+
+                        r = sd_id128_from_string(e, &saved_invocation_id);
+                        if (r < 0)
+                                return r;
+                }
+        }
+
+        *ret = saved_invocation_id;
+        return 0;
+}
+
 static sd_id128_t make_v4_uuid(sd_id128_t id) {
         /* Stolen from generate_random_uuid() of drivers/char/random.c
          * in the kernel sources */
@@ -148,7 +289,7 @@ _public_ int sd_id128_randomize(sd_id128_t *ret) {
 
         assert_return(ret, -EINVAL);
 
-        r = dev_urandom(&t, sizeof(t));
+        r = acquire_random_bytes(&t, sizeof t, true);
         if (r < 0)
                 return r;
 
@@ -159,3 +300,34 @@ _public_ int sd_id128_randomize(sd_id128_t *ret) {
         *ret = make_v4_uuid(t);
         return 0;
 }
+
+_public_ int sd_id128_get_machine_app_specific(sd_id128_t app_id, sd_id128_t *ret) {
+        _cleanup_(khash_unrefp) khash *h = NULL;
+        sd_id128_t m, result;
+        const void *p;
+        int r;
+
+        assert_return(ret, -EINVAL);
+
+        r = sd_id128_get_machine(&m);
+        if (r < 0)
+                return r;
+
+        r = khash_new_with_key(&h, "hmac(sha256)", &m, sizeof(m));
+        if (r < 0)
+                return r;
+
+        r = khash_put(h, &app_id, sizeof(app_id));
+        if (r < 0)
+                return r;
+
+        r = khash_digest_data(h, &p);
+        if (r < 0)
+                return r;
+
+        /* We chop off the trailing 16 bytes */
+        memcpy(&result, p, MIN(khash_get_size(h), sizeof(result)));
+
+        *ret = make_v4_uuid(result);
+        return 0;
+}
index 3fcefad..5fb7fd9 100644 (file)
@@ -31,7 +31,7 @@
 #include "escape.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "hostname-util.h"
 #include "io-util.h"
  */
 
 _public_ int sd_pid_get_session(pid_t pid, char **session) {
+        int r;
 
         assert_return(pid >= 0, -EINVAL);
         assert_return(session, -EINVAL);
 
-        return cg_pid_get_session(pid, session);
+        r = cg_pid_get_session(pid, session);
+        return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r;
 }
 
 _public_ int sd_pid_get_unit(pid_t pid, char **unit) {
+        int r;
 
         assert_return(pid >= 0, -EINVAL);
         assert_return(unit, -EINVAL);
 
-        return cg_pid_get_unit(pid, unit);
+        r = cg_pid_get_unit(pid, unit);
+        return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r;
 }
 
 _public_ int sd_pid_get_user_unit(pid_t pid, char **unit) {
+        int r;
 
         assert_return(pid >= 0, -EINVAL);
         assert_return(unit, -EINVAL);
 
-        return cg_pid_get_user_unit(pid, unit);
+        r = cg_pid_get_user_unit(pid, unit);
+        return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r;
 }
 
 _public_ int sd_pid_get_machine_name(pid_t pid, char **name) {
+        int r;
 
         assert_return(pid >= 0, -EINVAL);
         assert_return(name, -EINVAL);
 
-        return cg_pid_get_machine_name(pid, name);
+        r = cg_pid_get_machine_name(pid, name);
+        return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r;
 }
 
 _public_ int sd_pid_get_slice(pid_t pid, char **slice) {
+        int r;
 
         assert_return(pid >= 0, -EINVAL);
         assert_return(slice, -EINVAL);
 
-        return cg_pid_get_slice(pid, slice);
+        r = cg_pid_get_slice(pid, slice);
+        return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r;
 }
 
 _public_ int sd_pid_get_user_slice(pid_t pid, char **slice) {
+        int r;
 
         assert_return(pid >= 0, -EINVAL);
         assert_return(slice, -EINVAL);
 
-        return cg_pid_get_user_slice(pid, slice);
+        r = cg_pid_get_user_slice(pid, slice);
+        return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r;
 }
 
 _public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) {
+        int r;
 
         assert_return(pid >= 0, -EINVAL);
         assert_return(uid, -EINVAL);
 
-        return cg_pid_get_owner_uid(pid, uid);
+        r = cg_pid_get_owner_uid(pid, uid);
+        return IN_SET(r, -ENXIO, -ENOMEDIUM) ? -ENODATA : r;
 }
 
 _public_ int sd_pid_get_cgroup(pid_t pid, char **cgroup) {
@@ -279,7 +293,7 @@ _public_ int sd_uid_get_state(uid_t uid, char**state) {
                         return -ENOMEM;
 
         }
-        if (r < 0) {
+        else if (r < 0) {
                 free(s);
                 return r;
         }
@@ -687,7 +701,7 @@ _public_ int sd_seat_get_sessions(const char *seat, char ***sessions, uid_t **ui
 
         r = parse_env_file(p, NEWLINE,
                            "SESSIONS", &s,
-                           "ACTIVE_SESSIONS", &t,
+                           "UIDS", &t,
                            NULL);
         if (r == -ENOENT)
                 return -ENXIO;
@@ -723,7 +737,7 @@ _public_ int sd_seat_get_sessions(const char *seat, char ***sessions, uid_t **ui
 
                                 r = parse_uid(k, b + i);
                                 if (r < 0)
-                                        continue;
+                                        return r;
 
                                 i++;
                         }
@@ -784,36 +798,50 @@ _public_ int sd_seat_can_graphical(const char *seat) {
 }
 
 _public_ int sd_get_seats(char ***seats) {
-        return get_files_in_directory("/run/systemd/seats/", seats);
+        int r;
+
+        r = get_files_in_directory("/run/systemd/seats/", seats);
+        if (r == -ENOENT) {
+                if (seats)
+                        *seats = NULL;
+                return 0;
+        }
+        return r;
 }
 
 _public_ int sd_get_sessions(char ***sessions) {
-        return get_files_in_directory("/run/systemd/sessions/", sessions);
+        int r;
+
+        r = get_files_in_directory("/run/systemd/sessions/", sessions);
+        if (r == -ENOENT) {
+                if (sessions)
+                        *sessions = NULL;
+                return 0;
+        }
+        return r;
 }
 
 _public_ int sd_get_uids(uid_t **users) {
         _cleanup_closedir_ DIR *d;
+        struct dirent *de;
         int r = 0;
         unsigned n = 0;
         _cleanup_free_ uid_t *l = NULL;
 
         d = opendir("/run/systemd/users/");
-        if (!d)
+        if (!d) {
+                if (errno == ENOENT) {
+                        if (users)
+                                *users = NULL;
+                        return 0;
+                }
                 return -errno;
+        }
 
-        for (;;) {
-                struct dirent *de;
+        FOREACH_DIRENT_ALL(de, d, return -errno) {
                 int k;
                 uid_t uid;
 
-                errno = 0;
-                de = readdir(d);
-                if (!de && errno > 0)
-                        return -errno;
-
-                if (!de)
-                        break;
-
                 dirent_ensure_type(d, de);
 
                 if (!dirent_is_file(de))
@@ -850,12 +878,16 @@ _public_ int sd_get_uids(uid_t **users) {
 }
 
 _public_ int sd_get_machine_names(char ***machines) {
-        char **l = NULL, **a, **b;
+        _cleanup_strv_free_ char **l = NULL;
+        char **a, **b;
         int r;
 
-        assert_return(machines, -EINVAL);
-
         r = get_files_in_directory("/run/systemd/machines/", &l);
+        if (r == -ENOENT) {
+                if (machines)
+                        *machines = NULL;
+                return 0;
+        }
         if (r < 0)
                 return r;
 
@@ -863,7 +895,7 @@ _public_ int sd_get_machine_names(char ***machines) {
                 r = 0;
 
                 /* Filter out the unit: symlinks */
-                for (a = l, b = l; *a; a++) {
+                for (a = b = l; *a; a++) {
                         if (startswith(*a, "unit:") || !machine_name_is_valid(*a))
                                 free(*a);
                         else {
@@ -876,7 +908,10 @@ _public_ int sd_get_machine_names(char ***machines) {
                 *b = NULL;
         }
 
-        *machines = l;
+        if (machines) {
+                *machines = l;
+                l = NULL;
+        }
         return r;
 }
 
index c1fd7dd..b618b79 100644 (file)
 
 #include "alloc-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
+#include "log.h"
 #include "string-util.h"
 #include "strv.h"
 #include "util.h"
 
+static char* format_uids(char **buf, uid_t* uids, int count) {
+        int pos = 0, k, inc;
+        size_t size = (DECIMAL_STR_MAX(uid_t) + 1) * count + 1;
+
+        assert_se(*buf = malloc(size));
+
+        for (k = 0; k < count; k++) {
+                sprintf(*buf + pos, "%s"UID_FMT"%n", k > 0 ? " " : "", uids[k], &inc);
+                pos += inc;
+        }
+
+        assert_se(pos < (ssize_t)size);
+        (*buf)[pos] = '\0';
+
+        return *buf;
+}
+
 static void test_login(void) {
         _cleanup_close_pair_ int pair[2] = { -1, -1 };
-        _cleanup_free_ char *pp = NULL, *qq = NULL;
+        _cleanup_free_ char *pp = NULL, *qq = NULL,
+                *display_session = NULL, *cgroup = NULL,
+                *display = NULL, *remote_user = NULL, *remote_host = NULL,
+                *type = NULL, *class = NULL, *state = NULL, *state2 = NULL,
+                *seat = NULL, *session = NULL,
+                *unit = NULL, *user_unit = NULL, *slice = NULL;
         int r, k;
         uid_t u, u2;
-        char *seat, *type, *class, *display, *remote_user, *remote_host, *display_session, *cgroup;
-        char *session;
-        char *state;
-        char *session2;
-        char *t;
-        char **seats, **sessions, **machines;
-        uid_t *uids;
-        unsigned n;
-        struct pollfd pollfd;
-        sd_login_monitor *m = NULL;
+        char *t, **seats, **sessions;
 
-        assert_se(sd_pid_get_session(0, &session) == 0);
-        printf("session = %s\n", session);
-
-        assert_se(sd_pid_get_owner_uid(0, &u2) == 0);
-        printf("user = "UID_FMT"\n", u2);
+        r = sd_pid_get_unit(0, &unit);
+        assert_se(r >= 0 || r == -ENODATA);
+        log_info("sd_pid_get_unit(0, …) → \"%s\"", strna(unit));
 
-        assert_se(sd_pid_get_cgroup(0, &cgroup) == 0);
-        printf("cgroup = %s\n", cgroup);
-        free(cgroup);
+        r = sd_pid_get_user_unit(0, &user_unit);
+        assert_se(r >= 0 || r == -ENODATA);
+        log_info("sd_pid_get_user_unit(0, …) → \"%s\"", strna(user_unit));
 
-        display_session = NULL;
-        r = sd_uid_get_display(u2, &display_session);
+        r = sd_pid_get_slice(0, &slice);
         assert_se(r >= 0 || r == -ENODATA);
-        printf("user's display session = %s\n", strna(display_session));
-        free(display_session);
+        log_info("sd_pid_get_slice(0, …) → \"%s\"", strna(slice));
 
-        assert_se(socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == 0);
-        sd_peer_get_session(pair[0], &pp);
-        sd_peer_get_session(pair[1], &qq);
-        assert_se(streq_ptr(pp, qq));
+        r = sd_pid_get_session(0, &session);
+        if (r < 0) {
+                log_warning_errno(r, "sd_pid_get_session(0, …): %m");
+                if (r == -ENODATA)
+                        log_info("Seems we are not running in a session, skipping some tests.");
+        } else {
+                log_info("sd_pid_get_session(0, …) → \"%s\"", session);
 
-        r = sd_uid_get_sessions(u2, false, &sessions);
-        assert_se(r >= 0);
-        assert_se(r == (int) strv_length(sessions));
-        assert_se(t = strv_join(sessions, ", "));
-        strv_free(sessions);
-        printf("sessions = %s\n", t);
-        free(t);
+                assert_se(sd_pid_get_owner_uid(0, &u2) == 0);
+                log_info("sd_pid_get_owner_uid(0, …) → "UID_FMT, u2);
 
-        assert_se(r == sd_uid_get_sessions(u2, false, NULL));
+                assert_se(sd_pid_get_cgroup(0, &cgroup) == 0);
+                log_info("sd_pid_get_cgroup(0, …) → \"%s\"", cgroup);
 
-        r = sd_uid_get_seats(u2, false, &seats);
-        assert_se(r >= 0);
-        assert_se(r == (int) strv_length(seats));
-        assert_se(t = strv_join(seats, ", "));
-        strv_free(seats);
-        printf("seats = %s\n", t);
-        free(t);
+                r = sd_uid_get_display(u2, &display_session);
+                assert_se(r >= 0 || r == -ENODATA);
+                log_info("sd_uid_get_display("UID_FMT", …) → \"%s\"",
+                         u2, strnull(display_session));
 
-        assert_se(r == sd_uid_get_seats(u2, false, NULL));
+                assert_se(socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == 0);
+                sd_peer_get_session(pair[0], &pp);
+                sd_peer_get_session(pair[1], &qq);
+                assert_se(streq_ptr(pp, qq));
 
-        r = sd_session_is_active(session);
-        assert_se(r >= 0);
-        printf("active = %s\n", yes_no(r));
+                r = sd_uid_get_sessions(u2, false, &sessions);
+                assert_se(r >= 0);
+                assert_se(r == (int) strv_length(sessions));
+                assert_se(t = strv_join(sessions, " "));
+                strv_free(sessions);
+                log_info("sd_uid_get_sessions("UID_FMT", …) → [%i] \"%s\"", u2, r, t);
+                free(t);
 
-        r = sd_session_is_remote(session);
-        assert_se(r >= 0);
-        printf("remote = %s\n", yes_no(r));
+                assert_se(r == sd_uid_get_sessions(u2, false, NULL));
 
-        r = sd_session_get_state(session, &state);
-        assert_se(r >= 0);
-        printf("state = %s\n", state);
-        free(state);
+                r = sd_uid_get_seats(u2, false, &seats);
+                assert_se(r >= 0);
+                assert_se(r == (int) strv_length(seats));
+                assert_se(t = strv_join(seats, " "));
+                strv_free(seats);
+                log_info("sd_uid_get_seats("UID_FMT", …) → [%i] \"%s\"", u2, r, t);
+                free(t);
 
-        assert_se(sd_session_get_uid(session, &u) >= 0);
-        printf("uid = "UID_FMT"\n", u);
-        assert_se(u == u2);
+                assert_se(r == sd_uid_get_seats(u2, false, NULL));
+        }
 
-        assert_se(sd_session_get_type(session, &type) >= 0);
-        printf("type = %s\n", type);
-        free(type);
+        if (session) {
+                r = sd_session_is_active(session);
+                assert_se(r >= 0);
+                log_info("sd_session_is_active(\"%s\") → %s", session, yes_no(r));
 
-        assert_se(sd_session_get_class(session, &class) >= 0);
-        printf("class = %s\n", class);
-        free(class);
+                r = sd_session_is_remote(session);
+                assert_se(r >= 0);
+                log_info("sd_session_is_remote(\"%s\") → %s", session, yes_no(r));
 
-        display = NULL;
-        r = sd_session_get_display(session, &display);
-        assert_se(r >= 0 || r == -ENODATA);
-        printf("display = %s\n", strna(display));
-        free(display);
+                r = sd_session_get_state(session, &state);
+                assert_se(r >= 0);
+                log_info("sd_session_get_state(\"%s\") → \"%s\"", session, state);
 
-        remote_user = NULL;
-        r = sd_session_get_remote_user(session, &remote_user);
-        assert_se(r >= 0 || r == -ENODATA);
-        printf("remote_user = %s\n", strna(remote_user));
-        free(remote_user);
+                assert_se(sd_session_get_uid(session, &u) >= 0);
+                log_info("sd_session_get_uid(\"%s\") → "UID_FMT, session, u);
+                assert_se(u == u2);
 
-        remote_host = NULL;
-        r = sd_session_get_remote_host(session, &remote_host);
-        assert_se(r >= 0 || r == -ENODATA);
-        printf("remote_host = %s\n", strna(remote_host));
-        free(remote_host);
+                assert_se(sd_session_get_type(session, &type) >= 0);
+                log_info("sd_session_get_type(\"%s\") → \"%s\"", session, type);
 
-        assert_se(sd_session_get_seat(session, &seat) >= 0);
-        printf("seat = %s\n", seat);
+                assert_se(sd_session_get_class(session, &class) >= 0);
+                log_info("sd_session_get_class(\"%s\") → \"%s\"", session, class);
 
-        r = sd_seat_can_multi_session(seat);
-        assert_se(r >= 0);
-        printf("can do multi session = %s\n", yes_no(r));
+                r = sd_session_get_display(session, &display);
+                assert_se(r >= 0 || r == -ENODATA);
+                log_info("sd_session_get_display(\"%s\") → \"%s\"", session, strna(display));
 
-        r = sd_seat_can_tty(seat);
-        assert_se(r >= 0);
-        printf("can do tty = %s\n", yes_no(r));
+                r = sd_session_get_remote_user(session, &remote_user);
+                assert_se(r >= 0 || r == -ENODATA);
+                log_info("sd_session_get_remote_user(\"%s\") → \"%s\"",
+                         session, strna(remote_user));
 
-        r = sd_seat_can_graphical(seat);
-        assert_se(r >= 0);
-        printf("can do graphical = %s\n", yes_no(r));
+                r = sd_session_get_remote_host(session, &remote_host);
+                assert_se(r >= 0 || r == -ENODATA);
+                log_info("sd_session_get_remote_host(\"%s\") → \"%s\"",
+                         session, strna(remote_host));
 
-        assert_se(sd_uid_get_state(u, &state) >= 0);
-        printf("state = %s\n", state);
+                r = sd_session_get_seat(session, &seat);
+                if (r >= 0) {
+                        assert_se(seat);
 
-        assert_se(sd_uid_is_on_seat(u, 0, seat) > 0);
+                        log_info("sd_session_get_display(\"%s\") → \"%s\"", session, seat);
 
-        k = sd_uid_is_on_seat(u, 1, seat);
-        assert_se(k >= 0);
-        assert_se(!!r == !!r);
+                        r = sd_seat_can_multi_session(seat);
+                        assert_se(r >= 0);
+                        log_info("sd_session_can_multi_seat(\"%s\") → %s", seat, yes_no(r));
 
-        assert_se(sd_seat_get_active(seat, &session2, &u2) >= 0);
-        printf("session2 = %s\n", session2);
-        printf("uid2 = "UID_FMT"\n", u2);
+                        r = sd_seat_can_tty(seat);
+                        assert_se(r >= 0);
+                        log_info("sd_session_can_tty(\"%s\") → %s", seat, yes_no(r));
 
-        r = sd_seat_get_sessions(seat, &sessions, &uids, &n);
-        assert_se(r >= 0);
-        printf("n_sessions = %i\n", r);
-        assert_se(r == (int) strv_length(sessions));
-        assert_se(t = strv_join(sessions, ", "));
-        strv_free(sessions);
-        printf("sessions = %s\n", t);
-        free(t);
-        printf("uids =");
-        for (k = 0; k < (int) n; k++)
-                printf(" "UID_FMT, uids[k]);
-        printf("\n");
-        free(uids);
+                        r = sd_seat_can_graphical(seat);
+                        assert_se(r >= 0);
+                        log_info("sd_session_can_graphical(\"%s\") → %s", seat, yes_no(r));
+                } else {
+                        log_info_errno(r, "sd_session_get_display(\"%s\"): %m", session);
+                        assert_se(r == -ENODATA);
+                }
 
-        assert_se(sd_seat_get_sessions(seat, NULL, NULL, NULL) == r);
+                assert_se(sd_uid_get_state(u, &state2) >= 0);
+                log_info("sd_uid_get_state("UID_FMT", …) → %s", u, state2);
+        }
+
+        if (seat) {
+                _cleanup_free_ char *session2 = NULL, *buf = NULL;
+                _cleanup_free_ uid_t *uids = NULL;
+                unsigned n;
+
+                assert_se(sd_uid_is_on_seat(u, 0, seat) > 0);
+
+                k = sd_uid_is_on_seat(u, 1, seat);
+                assert_se(k >= 0);
+                assert_se(!!k == !!r);
 
-        free(session);
-        free(state);
-        free(session2);
-        free(seat);
+                assert_se(sd_seat_get_active(seat, &session2, &u2) >= 0);
+                log_info("sd_seat_get_active(\"%s\", …) → \"%s\", "UID_FMT, seat, session2, u2);
+
+                r = sd_seat_get_sessions(seat, &sessions, &uids, &n);
+                assert_se(r >= 0);
+                assert_se(r == (int) strv_length(sessions));
+                assert_se(t = strv_join(sessions, " "));
+                strv_free(sessions);
+                log_info("sd_seat_get_sessions(\"%s\", …) → %i, \"%s\", [%i] {%s}",
+                         seat, r, t, n, format_uids(&buf, uids, n));
+                free(t);
+
+                assert_se(sd_seat_get_sessions(seat, NULL, NULL, NULL) == r);
+        }
 
         r = sd_get_seats(&seats);
         assert_se(r >= 0);
         assert_se(r == (int) strv_length(seats));
         assert_se(t = strv_join(seats, ", "));
         strv_free(seats);
-        printf("n_seats = %i\n", r);
-        printf("seats = %s\n", t);
-        free(t);
+        log_info("sd_get_seats(…) → [%i] \"%s\"", r, t);
+        t = mfree(t);
 
         assert_se(sd_get_seats(NULL) == r);
 
         r = sd_seat_get_active(NULL, &t, NULL);
-        assert_se(r >= 0);
-        printf("active session on current seat = %s\n", t);
+        assert_se(IN_SET(r, 0, -ENODATA));
+        log_info("sd_seat_get_active(NULL, …) (active session on current seat) → %s", strnull(t));
         free(t);
 
         r = sd_get_sessions(&sessions);
@@ -199,40 +225,48 @@ static void test_login(void) {
         assert_se(r == (int) strv_length(sessions));
         assert_se(t = strv_join(sessions, ", "));
         strv_free(sessions);
-        printf("n_sessions = %i\n", r);
-        printf("sessions = %s\n", t);
+        log_info("sd_get_sessions(…) → [%i] \"%s\"", r, t);
         free(t);
 
         assert_se(sd_get_sessions(NULL) == r);
 
-        r = sd_get_uids(&uids);
-        assert_se(r >= 0);
+        {
+                _cleanup_free_ uid_t *uids = NULL;
+                _cleanup_free_ char *buf = NULL;
+
+                r = sd_get_uids(&uids);
+                assert_se(r >= 0);
+                log_info("sd_get_uids(…) → [%i] {%s}", r, format_uids(&buf, uids, r));
 
-        printf("uids =");
-        for (k = 0; k < r; k++)
-                printf(" "UID_FMT, uids[k]);
-        printf("\n");
-        free(uids);
+                assert_se(sd_get_uids(NULL) == r);
+        }
 
-        printf("n_uids = %i\n", r);
-        assert_se(sd_get_uids(NULL) == r);
+        {
+                _cleanup_strv_free_ char **machines = NULL;
+                _cleanup_free_ char *buf = NULL;
 
-        r = sd_get_machine_names(&machines);
-        assert_se(r >= 0);
-        assert_se(r == (int) strv_length(machines));
-        assert_se(t = strv_join(machines, ", "));
-        strv_free(machines);
-        printf("n_machines = %i\n", r);
-        printf("machines = %s\n", t);
-        free(t);
+                r = sd_get_machine_names(&machines);
+                assert_se(r >= 0);
+                assert_se(r == (int) strv_length(machines));
+                assert_se(buf = strv_join(machines, " "));
+                log_info("sd_get_machines(…) → [%i] \"%s\"", r, buf);
+
+                assert_se(sd_get_machine_names(NULL) == r);
+        }
+}
+
+static void test_monitor(void) {
+        sd_login_monitor *m = NULL;
+        unsigned n;
+        int r;
 
         r = sd_login_monitor_new("session", &m);
         assert_se(r >= 0);
 
         for (n = 0; n < 5; n++) {
+                struct pollfd pollfd = {};
                 usec_t timeout, nw;
 
-                zero(pollfd);
                 assert_se((pollfd.fd = sd_login_monitor_get_fd(m)) >= 0);
                 assert_se((pollfd.events = sd_login_monitor_get_events(m)) >= 0);
 
@@ -258,7 +292,12 @@ int main(int argc, char* argv[]) {
         log_parse_environment();
         log_open();
 
+        log_info("/* Information printed is from the live system */");
+
         test_login();
 
+        if (streq_ptr(argv[1], "-m"))
+                test_monitor();
+
         return 0;
 }
index df3b3c9..e8c8aba 100644 (file)
@@ -24,7 +24,7 @@
 #include "sd-netlink.h"
 
 #include "alloc-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "missing.h"
 #include "netlink-internal.h"
 #include "netlink-types.h"
@@ -104,7 +104,8 @@ int sd_netlink_message_request_dump(sd_netlink_message *m, int dump) {
         assert_return(m->hdr->nlmsg_type == RTM_GETLINK  ||
                       m->hdr->nlmsg_type == RTM_GETADDR  ||
                       m->hdr->nlmsg_type == RTM_GETROUTE ||
-                      m->hdr->nlmsg_type == RTM_GETNEIGH,
+                      m->hdr->nlmsg_type == RTM_GETNEIGH ||
+                      m->hdr->nlmsg_type == RTM_GETADDRLABEL ,
                       -EINVAL);
 
         SET_FLAG(m->hdr->nlmsg_flags, NLM_F_DUMP, dump);
index c165fa3..129bfd2 100644 (file)
@@ -24,7 +24,7 @@
 #include "sd-netlink.h"
 
 #include "alloc-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "missing.h"
 #include "netlink-internal.h"
 #include "netlink-types.h"
@@ -281,7 +281,7 @@ static int socket_recv_message(int fd, struct iovec *iov, uint32_t *_group, bool
                 else if (errno == EAGAIN)
                         log_debug("rtnl: no data in socket");
 
-                return (errno == EAGAIN || errno == EINTR) ? 0 : -errno;
+                return IN_SET(errno, EAGAIN, EINTR) ? 0 : -errno;
         }
 
         if (sender.nl.nl_pid != 0) {
@@ -292,7 +292,7 @@ static int socket_recv_message(int fd, struct iovec *iov, uint32_t *_group, bool
                         /* drop the message */
                         r = recvmsg(fd, &msg, 0);
                         if (r < 0)
-                                return (errno == EAGAIN || errno == EINTR) ? 0 : -errno;
+                                return IN_SET(errno, EAGAIN, EINTR) ? 0 : -errno;
                 }
 
                 return 0;
index 566a050..923f7dd 100644 (file)
 #include <sys/socket.h>
 #include <linux/netlink.h>
 #include <linux/rtnetlink.h>
+#include <linux/can/netlink.h>
 #include <linux/in6.h>
 #include <linux/veth.h>
 #include <linux/if_bridge.h>
 #include <linux/if_addr.h>
+#include <linux/if_addrlabel.h>
 #include <linux/if.h>
 #include <linux/ip.h>
 #include <linux/if_link.h>
@@ -148,7 +150,7 @@ static const NLType rtnl_link_info_data_vxlan_types[] = {
         [IFLA_VXLAN_ID]                = { .type = NETLINK_TYPE_U32 },
         [IFLA_VXLAN_GROUP]             = { .type = NETLINK_TYPE_IN_ADDR },
         [IFLA_VXLAN_LINK]              = { .type = NETLINK_TYPE_U32 },
-        [IFLA_VXLAN_LOCAL]             = { .type = NETLINK_TYPE_U32},
+        [IFLA_VXLAN_LOCAL]             = { .type = NETLINK_TYPE_IN_ADDR },
         [IFLA_VXLAN_TTL]               = { .type = NETLINK_TYPE_U8 },
         [IFLA_VXLAN_TOS]               = { .type = NETLINK_TYPE_U8 },
         [IFLA_VXLAN_LEARNING]          = { .type = NETLINK_TYPE_U8 },
@@ -169,6 +171,9 @@ static const NLType rtnl_link_info_data_vxlan_types[] = {
         [IFLA_VXLAN_REMCSUM_RX]        = { .type = NETLINK_TYPE_U8 },
         [IFLA_VXLAN_GBP]               = { .type = NETLINK_TYPE_FLAG },
         [IFLA_VXLAN_REMCSUM_NOPARTIAL] = { .type = NETLINK_TYPE_FLAG },
+        [IFLA_VXLAN_COLLECT_METADATA]  = { .type = NETLINK_TYPE_U8 },
+        [IFLA_VXLAN_LABEL]             = { .type = NETLINK_TYPE_U32 },
+        [IFLA_VXLAN_GPE]               = { .type = NETLINK_TYPE_FLAG },
 };
 
 static const NLType rtnl_bond_arp_target_types[] = {
@@ -282,6 +287,19 @@ static const NLType rtnl_link_info_data_vrf_types[] = {
         [IFLA_VRF_TABLE]                 = { .type = NETLINK_TYPE_U32 },
 };
 
+static const NLType rtnl_link_info_data_geneve_types[] = {
+        [IFLA_GENEVE_ID]                = { .type = NETLINK_TYPE_U32 },
+        [IFLA_GENEVE_TTL]               = { .type = NETLINK_TYPE_U8 },
+        [IFLA_GENEVE_TOS]               = { .type = NETLINK_TYPE_U8 },
+        [IFLA_GENEVE_PORT]              = { .type = NETLINK_TYPE_U16 },
+        [IFLA_GENEVE_REMOTE]            = { .type = NETLINK_TYPE_IN_ADDR },
+        [IFLA_GENEVE_REMOTE6]           = { .type = NETLINK_TYPE_IN_ADDR },
+        [IFLA_GENEVE_UDP_CSUM]          = { .type = NETLINK_TYPE_U8 },
+        [IFLA_GENEVE_UDP_ZERO_CSUM6_TX] = { .type = NETLINK_TYPE_U8 },
+        [IFLA_GENEVE_UDP_ZERO_CSUM6_RX] = { .type = NETLINK_TYPE_U8 },
+        [IFLA_GENEVE_LABEL]             = { .type = NETLINK_TYPE_U32 },
+};
+
 /* these strings must match the .kind entries in the kernel */
 static const char* const nl_union_link_info_data_table[] = {
         [NL_UNION_LINK_INFO_DATA_BOND] = "bond",
@@ -303,49 +321,51 @@ static const char* const nl_union_link_info_data_table[] = {
         [NL_UNION_LINK_INFO_DATA_VTI6_TUNNEL] = "vti6",
         [NL_UNION_LINK_INFO_DATA_IP6TNL_TUNNEL] = "ip6tnl",
         [NL_UNION_LINK_INFO_DATA_VRF] = "vrf",
+        [NL_UNION_LINK_INFO_DATA_VCAN] = "vcan",
+        [NL_UNION_LINK_INFO_DATA_GENEVE] = "geneve",
 };
 
 DEFINE_STRING_TABLE_LOOKUP(nl_union_link_info_data, NLUnionLinkInfoData);
 
 static const NLTypeSystem rtnl_link_info_data_type_systems[] = {
-        [NL_UNION_LINK_INFO_DATA_BOND] =        { .count = ELEMENTSOF(rtnl_link_info_data_bond_types),
-                                                  .types = rtnl_link_info_data_bond_types },
-        [NL_UNION_LINK_INFO_DATA_BRIDGE] =      { .count = ELEMENTSOF(rtnl_link_info_data_bridge_types),
-                                                  .types = rtnl_link_info_data_bridge_types },
-        [NL_UNION_LINK_INFO_DATA_VLAN] =        { .count = ELEMENTSOF(rtnl_link_info_data_vlan_types),
-                                                  .types = rtnl_link_info_data_vlan_types },
-        [NL_UNION_LINK_INFO_DATA_VETH] =        { .count = ELEMENTSOF(rtnl_link_info_data_veth_types),
-                                                  .types = rtnl_link_info_data_veth_types },
-        [NL_UNION_LINK_INFO_DATA_MACVLAN] =     { .count = ELEMENTSOF(rtnl_link_info_data_macvlan_types),
-                                                  .types = rtnl_link_info_data_macvlan_types },
-        [NL_UNION_LINK_INFO_DATA_MACVTAP] =     { .count = ELEMENTSOF(rtnl_link_info_data_macvlan_types),
-                                                  .types = rtnl_link_info_data_macvlan_types },
-        [NL_UNION_LINK_INFO_DATA_IPVLAN] =      { .count = ELEMENTSOF(rtnl_link_info_data_ipvlan_types),
-                                                  .types = rtnl_link_info_data_ipvlan_types },
-        [NL_UNION_LINK_INFO_DATA_VXLAN] =       { .count = ELEMENTSOF(rtnl_link_info_data_vxlan_types),
-                                                  .types = rtnl_link_info_data_vxlan_types },
-        [NL_UNION_LINK_INFO_DATA_IPIP_TUNNEL] = { .count = ELEMENTSOF(rtnl_link_info_data_iptun_types),
-                                                  .types = rtnl_link_info_data_iptun_types },
-        [NL_UNION_LINK_INFO_DATA_IPGRE_TUNNEL] =  { .count = ELEMENTSOF(rtnl_link_info_data_ipgre_types),
-                                                    .types = rtnl_link_info_data_ipgre_types },
+        [NL_UNION_LINK_INFO_DATA_BOND] =             { .count = ELEMENTSOF(rtnl_link_info_data_bond_types),
+                                                       .types = rtnl_link_info_data_bond_types },
+        [NL_UNION_LINK_INFO_DATA_BRIDGE] =           { .count = ELEMENTSOF(rtnl_link_info_data_bridge_types),
+                                                       .types = rtnl_link_info_data_bridge_types },
+        [NL_UNION_LINK_INFO_DATA_VLAN] =             { .count = ELEMENTSOF(rtnl_link_info_data_vlan_types),
+                                                       .types = rtnl_link_info_data_vlan_types },
+        [NL_UNION_LINK_INFO_DATA_VETH] =             { .count = ELEMENTSOF(rtnl_link_info_data_veth_types),
+                                                       .types = rtnl_link_info_data_veth_types },
+        [NL_UNION_LINK_INFO_DATA_MACVLAN] =          { .count = ELEMENTSOF(rtnl_link_info_data_macvlan_types),
+                                                       .types = rtnl_link_info_data_macvlan_types },
+        [NL_UNION_LINK_INFO_DATA_MACVTAP] =          { .count = ELEMENTSOF(rtnl_link_info_data_macvlan_types),
+                                                       .types = rtnl_link_info_data_macvlan_types },
+        [NL_UNION_LINK_INFO_DATA_IPVLAN] =           { .count = ELEMENTSOF(rtnl_link_info_data_ipvlan_types),
+                                                       .types = rtnl_link_info_data_ipvlan_types },
+        [NL_UNION_LINK_INFO_DATA_VXLAN] =            { .count = ELEMENTSOF(rtnl_link_info_data_vxlan_types),
+                                                       .types = rtnl_link_info_data_vxlan_types },
+        [NL_UNION_LINK_INFO_DATA_IPIP_TUNNEL] =      { .count = ELEMENTSOF(rtnl_link_info_data_iptun_types),
+                                                       .types = rtnl_link_info_data_iptun_types },
+        [NL_UNION_LINK_INFO_DATA_IPGRE_TUNNEL] =     { .count = ELEMENTSOF(rtnl_link_info_data_ipgre_types),
+                                                       .types = rtnl_link_info_data_ipgre_types },
         [NL_UNION_LINK_INFO_DATA_IPGRETAP_TUNNEL] =  { .count = ELEMENTSOF(rtnl_link_info_data_ipgre_types),
-                                                    .types = rtnl_link_info_data_ipgre_types },
-        [NL_UNION_LINK_INFO_DATA_IP6GRE_TUNNEL] =  { .count = ELEMENTSOF(rtnl_link_info_data_ipgre_types),
-                                                    .types = rtnl_link_info_data_ipgre_types },
-        [NL_UNION_LINK_INFO_DATA_IP6GRETAP_TUNNEL] =  { .count = ELEMENTSOF(rtnl_link_info_data_ipgre_types),
-                                                    .types = rtnl_link_info_data_ipgre_types },
-        [NL_UNION_LINK_INFO_DATA_SIT_TUNNEL] =  { .count = ELEMENTSOF(rtnl_link_info_data_iptun_types),
-                                                  .types = rtnl_link_info_data_iptun_types },
-        [NL_UNION_LINK_INFO_DATA_VTI_TUNNEL] =  { .count = ELEMENTSOF(rtnl_link_info_data_ipvti_types),
-                                                  .types = rtnl_link_info_data_ipvti_types },
-        [NL_UNION_LINK_INFO_DATA_VTI6_TUNNEL] =  { .count = ELEMENTSOF(rtnl_link_info_data_ipvti_types),
-                                                  .types = rtnl_link_info_data_ipvti_types },
-        [NL_UNION_LINK_INFO_DATA_IP6TNL_TUNNEL] =  { .count = ELEMENTSOF(rtnl_link_info_data_ip6tnl_types),
-                                                     .types = rtnl_link_info_data_ip6tnl_types },
-
-        [NL_UNION_LINK_INFO_DATA_VRF] =  { .count = ELEMENTSOF(rtnl_link_info_data_vrf_types),
-                                                     .types = rtnl_link_info_data_vrf_types },
-
+                                                       .types = rtnl_link_info_data_ipgre_types },
+        [NL_UNION_LINK_INFO_DATA_IP6GRE_TUNNEL] =    { .count = ELEMENTSOF(rtnl_link_info_data_ipgre_types),
+                                                       .types = rtnl_link_info_data_ipgre_types },
+        [NL_UNION_LINK_INFO_DATA_IP6GRETAP_TUNNEL] = { .count = ELEMENTSOF(rtnl_link_info_data_ipgre_types),
+                                                       .types = rtnl_link_info_data_ipgre_types },
+        [NL_UNION_LINK_INFO_DATA_SIT_TUNNEL] =       { .count = ELEMENTSOF(rtnl_link_info_data_iptun_types),
+                                                       .types = rtnl_link_info_data_iptun_types },
+        [NL_UNION_LINK_INFO_DATA_VTI_TUNNEL] =       { .count = ELEMENTSOF(rtnl_link_info_data_ipvti_types),
+                                                       .types = rtnl_link_info_data_ipvti_types },
+        [NL_UNION_LINK_INFO_DATA_VTI6_TUNNEL] =      { .count = ELEMENTSOF(rtnl_link_info_data_ipvti_types),
+                                                       .types = rtnl_link_info_data_ipvti_types },
+        [NL_UNION_LINK_INFO_DATA_IP6TNL_TUNNEL] =    { .count = ELEMENTSOF(rtnl_link_info_data_ip6tnl_types),
+                                                       .types = rtnl_link_info_data_ip6tnl_types },
+        [NL_UNION_LINK_INFO_DATA_VRF] =              { .count = ELEMENTSOF(rtnl_link_info_data_vrf_types),
+                                                       .types = rtnl_link_info_data_vrf_types },
+        [NL_UNION_LINK_INFO_DATA_GENEVE] =           { .count = ELEMENTSOF(rtnl_link_info_data_geneve_types),
+                                                       .types = rtnl_link_info_data_geneve_types },
 };
 
 static const NLTypeSystemUnion rtnl_link_info_data_type_system_union = {
@@ -500,6 +520,28 @@ static const NLTypeSystem rtnl_address_type_system = {
         .types = rtnl_address_types,
 };
 
+/* RTM_METRICS --- array of struct rtattr with types of RTAX_* */
+
+static const NLType rtnl_route_metrics_types[] = {
+        [RTAX_MTU]               = { .type = NETLINK_TYPE_U32 },
+        [RTAX_WINDOW]            = { .type = NETLINK_TYPE_U32 },
+        [RTAX_RTT]               = { .type = NETLINK_TYPE_U32 },
+        [RTAX_RTTVAR]            = { .type = NETLINK_TYPE_U32 },
+        [RTAX_SSTHRESH]          = { .type = NETLINK_TYPE_U32 },
+        [RTAX_CWND]              = { .type = NETLINK_TYPE_U32 },
+        [RTAX_ADVMSS]            = { .type = NETLINK_TYPE_U32 },
+        [RTAX_REORDERING]        = { .type = NETLINK_TYPE_U32 },
+        [RTAX_HOPLIMIT]          = { .type = NETLINK_TYPE_U32 },
+        [RTAX_INITCWND]          = { .type = NETLINK_TYPE_U32 },
+        [RTAX_FEATURES]          = { .type = NETLINK_TYPE_U32 },
+        [RTAX_RTO_MIN]           = { .type = NETLINK_TYPE_U32 },
+};
+
+static const NLTypeSystem rtnl_route_metrics_type_system = {
+        .count = ELEMENTSOF(rtnl_route_metrics_types),
+        .types = rtnl_route_metrics_types,
+};
+
 static const NLType rtnl_route_types[] = {
         [RTA_DST]               = { .type = NETLINK_TYPE_IN_ADDR }, /* 6? */
         [RTA_SRC]               = { .type = NETLINK_TYPE_IN_ADDR }, /* 6? */
@@ -508,9 +550,8 @@ static const NLType rtnl_route_types[] = {
         [RTA_GATEWAY]           = { .type = NETLINK_TYPE_IN_ADDR },
         [RTA_PRIORITY]          = { .type = NETLINK_TYPE_U32 },
         [RTA_PREFSRC]           = { .type = NETLINK_TYPE_IN_ADDR }, /* 6? */
-/*
-        [RTA_METRICS]           = { .type = NETLINK_TYPE_NESTED },
-        [RTA_MULTIPATH]         = { .len = sizeof(struct rtnexthop) },
+        [RTA_METRICS]           = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_route_metrics_type_system},
+/*      [RTA_MULTIPATH]         = { .len = sizeof(struct rtnexthop) },
 */
         [RTA_FLOW]              = { .type = NETLINK_TYPE_U32 }, /* 6? */
 /*
@@ -546,22 +587,35 @@ static const NLTypeSystem rtnl_neigh_type_system = {
         .types = rtnl_neigh_types,
 };
 
+static const NLType rtnl_addrlabel_types[] = {
+        [IFAL_ADDRESS]         = { .type = NETLINK_TYPE_IN_ADDR, .size = sizeof(struct in6_addr) },
+        [IFAL_LABEL]           = { .type = NETLINK_TYPE_U32 },
+};
+
+static const NLTypeSystem rtnl_addrlabel_type_system = {
+        .count = ELEMENTSOF(rtnl_addrlabel_types),
+        .types = rtnl_addrlabel_types,
+};
+
 static const NLType rtnl_types[] = {
-        [NLMSG_DONE]   = { .type = NETLINK_TYPE_NESTED, .type_system = &empty_type_system, .size = 0 },
-        [NLMSG_ERROR]  = { .type = NETLINK_TYPE_NESTED, .type_system = &empty_type_system, .size = sizeof(struct nlmsgerr) },
-        [RTM_NEWLINK]  = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
-        [RTM_DELLINK]  = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
-        [RTM_GETLINK]  = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
-        [RTM_SETLINK]  = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
-        [RTM_NEWADDR]  = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_address_type_system, .size = sizeof(struct ifaddrmsg) },
-        [RTM_DELADDR]  = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_address_type_system, .size = sizeof(struct ifaddrmsg) },
-        [RTM_GETADDR]  = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_address_type_system, .size = sizeof(struct ifaddrmsg) },
-        [RTM_NEWROUTE] = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_route_type_system, .size = sizeof(struct rtmsg) },
-        [RTM_DELROUTE] = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_route_type_system, .size = sizeof(struct rtmsg) },
-        [RTM_GETROUTE] = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_route_type_system, .size = sizeof(struct rtmsg) },
-        [RTM_NEWNEIGH] = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_neigh_type_system, .size = sizeof(struct ndmsg) },
-        [RTM_DELNEIGH] = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_neigh_type_system, .size = sizeof(struct ndmsg) },
-        [RTM_GETNEIGH] = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_neigh_type_system, .size = sizeof(struct ndmsg) },
+        [NLMSG_DONE]       = { .type = NETLINK_TYPE_NESTED, .type_system = &empty_type_system, .size = 0 },
+        [NLMSG_ERROR]      = { .type = NETLINK_TYPE_NESTED, .type_system = &empty_type_system, .size = sizeof(struct nlmsgerr) },
+        [RTM_NEWLINK]      = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
+        [RTM_DELLINK]      = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
+        [RTM_GETLINK]      = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
+        [RTM_SETLINK]      = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
+        [RTM_NEWADDR]      = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_address_type_system, .size = sizeof(struct ifaddrmsg) },
+        [RTM_DELADDR]      = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_address_type_system, .size = sizeof(struct ifaddrmsg) },
+        [RTM_GETADDR]      = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_address_type_system, .size = sizeof(struct ifaddrmsg) },
+        [RTM_NEWROUTE]     = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_route_type_system, .size = sizeof(struct rtmsg) },
+        [RTM_DELROUTE]     = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_route_type_system, .size = sizeof(struct rtmsg) },
+        [RTM_GETROUTE]     = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_route_type_system, .size = sizeof(struct rtmsg) },
+        [RTM_NEWNEIGH]     = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_neigh_type_system, .size = sizeof(struct ndmsg) },
+        [RTM_DELNEIGH]     = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_neigh_type_system, .size = sizeof(struct ndmsg) },
+        [RTM_GETNEIGH]     = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_neigh_type_system, .size = sizeof(struct ndmsg) },
+        [RTM_NEWADDRLABEL] = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_addrlabel_type_system, .size = sizeof(struct ifaddrlblmsg) },
+        [RTM_DELADDRLABEL] = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_addrlabel_type_system, .size = sizeof(struct ifaddrlblmsg) },
+        [RTM_GETADDRLABEL] = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_addrlabel_type_system, .size = sizeof(struct ifaddrlblmsg) },
 };
 
 const NLTypeSystem type_system_root = {
index 7c0e598..ae65c1d 100644 (file)
@@ -87,6 +87,8 @@ typedef enum NLUnionLinkInfoData {
         NL_UNION_LINK_INFO_DATA_VTI6_TUNNEL,
         NL_UNION_LINK_INFO_DATA_IP6TNL_TUNNEL,
         NL_UNION_LINK_INFO_DATA_VRF,
+        NL_UNION_LINK_INFO_DATA_VCAN,
+        NL_UNION_LINK_INFO_DATA_GENEVE,
         _NL_UNION_LINK_INFO_DATA_MAX,
         _NL_UNION_LINK_INFO_DATA_INVALID = -1
 } NLUnionLinkInfoData;
index 73b9ac0..6b660b7 100644 (file)
@@ -116,51 +116,6 @@ int rtnl_message_new_synthetic_error(int error, uint32_t serial, sd_netlink_mess
         return 0;
 }
 
-bool rtnl_message_type_is_neigh(uint16_t type) {
-        switch (type) {
-                case RTM_NEWNEIGH:
-                case RTM_GETNEIGH:
-                case RTM_DELNEIGH:
-                        return true;
-                default:
-                        return false;
-        }
-}
-
-bool rtnl_message_type_is_route(uint16_t type) {
-        switch (type) {
-                case RTM_NEWROUTE:
-                case RTM_GETROUTE:
-                case RTM_DELROUTE:
-                        return true;
-                default:
-                        return false;
-        }
-}
-
-bool rtnl_message_type_is_link(uint16_t type) {
-        switch (type) {
-                case RTM_NEWLINK:
-                case RTM_SETLINK:
-                case RTM_GETLINK:
-                case RTM_DELLINK:
-                        return true;
-                default:
-                        return false;
-        }
-}
-
-bool rtnl_message_type_is_addr(uint16_t type) {
-        switch (type) {
-                case RTM_NEWADDR:
-                case RTM_GETADDR:
-                case RTM_DELADDR:
-                        return true;
-                default:
-                        return false;
-        }
-}
-
 int rtnl_log_parse_error(int r) {
         return log_error_errno(r, "Failed to parse netlink message: %m");
 }
index f49bf4e..215af12 100644 (file)
@@ -27,10 +27,25 @@ int rtnl_message_new_synthetic_error(int error, uint32_t serial, sd_netlink_mess
 uint32_t rtnl_message_get_serial(sd_netlink_message *m);
 void rtnl_message_seal(sd_netlink_message *m);
 
-bool rtnl_message_type_is_link(uint16_t type);
-bool rtnl_message_type_is_addr(uint16_t type);
-bool rtnl_message_type_is_route(uint16_t type);
-bool rtnl_message_type_is_neigh(uint16_t type);
+static inline bool rtnl_message_type_is_neigh(uint16_t type) {
+        return IN_SET(type, RTM_NEWNEIGH, RTM_GETNEIGH, RTM_DELNEIGH);
+}
+
+static inline bool rtnl_message_type_is_route(uint16_t type) {
+        return IN_SET(type, RTM_NEWROUTE, RTM_GETROUTE, RTM_DELROUTE);
+}
+
+static inline bool rtnl_message_type_is_link(uint16_t type) {
+        return IN_SET(type, RTM_NEWLINK, RTM_SETLINK, RTM_GETLINK, RTM_DELLINK);
+}
+
+static inline bool rtnl_message_type_is_addr(uint16_t type) {
+        return IN_SET(type, RTM_NEWADDR, RTM_GETADDR, RTM_DELADDR);
+}
+
+static inline bool rtnl_message_type_is_addrlabel(uint16_t type) {
+        return IN_SET(type, RTM_NEWADDRLABEL, RTM_DELADDRLABEL, RTM_GETADDRLABEL);
+}
 
 int rtnl_set_link_name(sd_netlink **rtnl, int ifindex, const char *name);
 int rtnl_set_link_properties(sd_netlink **rtnl, int ifindex, const char *alias, const struct ether_addr *mac, unsigned mtu);
index 09240c7..12c51ff 100644 (file)
 ***/
 
 #include <netinet/in.h>
+#include <linux/if_addrlabel.h>
 #include <stdbool.h>
 #include <unistd.h>
 
 #include "sd-netlink.h"
 
-#include "formats-util.h"
+#include "format-util.h"
 #include "missing.h"
 #include "netlink-internal.h"
 #include "netlink-types.h"
@@ -700,3 +701,56 @@ int sd_rtnl_message_get_family(sd_netlink_message *m, int *family) {
 
         return -EOPNOTSUPP;
 }
+
+int sd_rtnl_message_new_addrlabel(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int ifindex, int ifal_family) {
+        struct ifaddrlblmsg *addrlabel;
+        int r;
+
+        assert_return(rtnl_message_type_is_addrlabel(nlmsg_type), -EINVAL);
+        assert_return(ret, -EINVAL);
+
+        r = message_new(rtnl, ret, nlmsg_type);
+        if (r < 0)
+                return r;
+
+        if (nlmsg_type == RTM_NEWADDRLABEL)
+                (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_EXCL;
+
+        addrlabel = NLMSG_DATA((*ret)->hdr);
+
+        addrlabel->ifal_family = ifal_family;
+        addrlabel->ifal_index = ifindex;
+
+        return 0;
+}
+
+int sd_rtnl_message_addrlabel_set_prefixlen(sd_netlink_message *m, unsigned char prefixlen) {
+        struct ifaddrlblmsg *addrlabel;
+
+        assert_return(m, -EINVAL);
+        assert_return(m->hdr, -EINVAL);
+        assert_return(rtnl_message_type_is_addrlabel(m->hdr->nlmsg_type), -EINVAL);
+
+        addrlabel = NLMSG_DATA(m->hdr);
+
+        if (prefixlen > 128)
+                return -ERANGE;
+
+        addrlabel->ifal_prefixlen = prefixlen;
+
+        return 0;
+}
+
+int sd_rtnl_message_addrlabel_get_prefixlen(sd_netlink_message *m, unsigned char *prefixlen) {
+        struct ifaddrlblmsg *addrlabel;
+
+        assert_return(m, -EINVAL);
+        assert_return(m->hdr, -EINVAL);
+        assert_return(rtnl_message_type_is_addrlabel(m->hdr->nlmsg_type), -EINVAL);
+
+        addrlabel = NLMSG_DATA(m->hdr);
+
+        *prefixlen = addrlabel->ifal_prefixlen;
+
+        return 0;
+}
index 43114eb..6843556 100644 (file)
@@ -276,6 +276,10 @@ static int dispatch_rqueue(sd_netlink *rtnl, sd_netlink_message **message) {
         if (rtnl->rqueue_size <= 0) {
                 /* Try to read a new message */
                 r = socket_read_message(rtnl);
+                if (r == -ENOBUFS) { /* FIXME: ignore buffer overruns for now */
+                        log_debug_errno(r, "Got ENOBUFS from netlink socket, ignoring.");
+                        return 1;
+                }
                 if (r <= 0)
                         return r;
         }
index f8e18f2..8b4af5a 100644 (file)
@@ -224,13 +224,8 @@ static int network_link_get_ifindexes(int ifindex, const char *key, int **ret) {
                 return -ENODATA;
         if (r < 0)
                 return r;
-        if (isempty(s)) {
-                *ret = NULL;
-                return 0;
-        }
 
-        x = s;
-        for (;;) {
+        for (x = s;;) {
                 _cleanup_free_ char *word = NULL;
 
                 r = extract_first_word(&x, &word, NULL, 0);
@@ -243,15 +238,14 @@ static int network_link_get_ifindexes(int ifindex, const char *key, int **ret) {
                 if (r < 0)
                         return r;
 
-                if (!GREEDY_REALLOC(ifis, allocated, c + 1))
+                if (!GREEDY_REALLOC(ifis, allocated, c + 2))
                         return -ENOMEM;
 
                 ifis[c++] = ifindex;
         }
 
-        if (!GREEDY_REALLOC(ifis, allocated, c + 1))
-                return -ENOMEM;
-        ifis[c] = 0; /* Let's add a 0 ifindex to the end, to be nice*/
+        if (ifis)
+                ifis[c] = 0; /* Let's add a 0 ifindex to the end, to be nice */
 
         *ret = ifis;
         ifis = NULL;
index b7aec1f..752c1ba 100644 (file)
@@ -77,7 +77,7 @@ static int from_home_dir(const char *envname, const char *suffix, char **buffer,
         if (endswith(h, "/"))
                 cc = strappend(h, suffix);
         else
-                cc = strjoin(h, "/", suffix, NULL);
+                cc = strjoin(h, "/", suffix);
         if (!cc)
                 return -ENOMEM;
 
@@ -387,7 +387,7 @@ _public_ int sd_path_home(uint64_t type, const char *suffix, char **path) {
         if (endswith(ret, "/"))
                 cc = strappend(ret, suffix);
         else
-                cc = strjoin(ret, "/", suffix, NULL);
+                cc = strjoin(ret, "/", suffix);
 
         free(buffer);
 
@@ -455,7 +455,7 @@ static int search_from_environment(
                         if (endswith(e, "/"))
                                 h = strappend(e, home_suffix);
                         else
-                                h = strjoin(e, "/", home_suffix, NULL);
+                                h = strjoin(e, "/", home_suffix);
 
                         if (!h) {
                                 strv_free(l);
@@ -621,7 +621,7 @@ _public_ int sd_path_search(uint64_t type, const char *suffix, char ***paths) {
                 if (endswith(*i, "/"))
                         *j = strappend(*i, suffix);
                 else
-                        *j = strjoin(*i, "/", suffix, NULL);
+                        *j = strjoin(*i, "/", suffix);
 
                 if (!*j) {
                         strv_free(l);
index 995bf56..c5f3672 100644 (file)
@@ -495,7 +495,7 @@ _public_ struct udev_device *udev_device_get_parent_with_subsystem_devtype(struc
                 return NULL;
         }
 
-        /* then walk the chain of udev_device parents until the correspanding
+        /* then walk the chain of udev_device parents until the corresponding
            one is found */
         while ((udev_device = udev_device_get_parent(udev_device))) {
                 if (udev_device->device == parent)
index da496ed..0d51322 100644 (file)
@@ -166,17 +166,16 @@ struct udev_list_entry *udev_list_entry_add(struct udev_list *list, const char *
         entry = new0(struct udev_list_entry, 1);
         if (entry == NULL)
                 return NULL;
+
         entry->name = strdup(name);
-        if (entry->name == NULL) {
-                free(entry);
-                return NULL;
-        }
+        if (entry->name == NULL)
+                return mfree(entry);
+
         if (value != NULL) {
                 entry->value = strdup(value);
                 if (entry->value == NULL) {
                         free(entry->name);
-                        free(entry);
-                        return NULL;
+                        return mfree(entry);
                 }
         }
 
@@ -193,8 +192,7 @@ struct udev_list_entry *udev_list_entry_add(struct udev_list *list, const char *
                         if (entries == NULL) {
                                 free(entry->name);
                                 free(entry->value);
-                                free(entry);
-                                return NULL;
+                                return mfree(entry);
                         }
                         list->entries = entries;
                         list->entries_max += add;
index 1f9d16c..8287694 100644 (file)
@@ -33,7 +33,7 @@
 #include "alloc-util.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "libudev-private.h"
 #include "missing.h"
 #include "mount-util.h"
@@ -207,8 +207,7 @@ struct udev_monitor *udev_monitor_new_from_netlink_fd(struct udev *udev, const c
                 udev_monitor->sock = socket(PF_NETLINK, SOCK_RAW|SOCK_CLOEXEC|SOCK_NONBLOCK, NETLINK_KOBJECT_UEVENT);
                 if (udev_monitor->sock < 0) {
                         log_debug_errno(errno, "error getting socket: %m");
-                        free(udev_monitor);
-                        return NULL;
+                        return mfree(udev_monitor);
                 }
         } else {
                 udev_monitor->bound = true;
@@ -682,7 +681,7 @@ retry:
 
         udev_device = udev_device_new_from_nulstr(udev_monitor->udev, &buf.raw[bufpos], buflen - bufpos);
         if (!udev_device) {
-                log_debug("could not create device: %m");
+                log_debug_errno(errno, "could not create device: %m");
                 return NULL;
         }
 
index 574cfea..1d73d8f 100644 (file)
@@ -161,6 +161,20 @@ void util_remove_trailing_chars(char *path, char c)
                 path[--len] = '\0';
 }
 
+/*
+ * Copy from 'str' to 'to', while removing all leading and trailing whitespace,
+ * and replacing each run of consecutive whitespace with a single underscore.
+ * The chars from 'str' are copied up to the \0 at the end of the string, or
+ * at most 'len' chars.  This appends \0 to 'to', at the end of the copied
+ * characters.
+ *
+ * If 'len' chars are copied into 'to', the final \0 is placed at len+1
+ * (i.e. 'to[len] = \0'), so the 'to' buffer must have at least len+1
+ * chars available.
+ *
+ * Note this may be called with 'str' == 'to', i.e. to replace whitespace
+ * in-place in a buffer.  This function can handle that situation.
+ */
 int util_replace_whitespace(const char *str, char *to, size_t len)
 {
         size_t i, j;
@@ -186,7 +200,7 @@ int util_replace_whitespace(const char *str, char *to, size_t len)
                 to[j++] = str[i++];
         }
         to[j] = '\0';
-        return 0;
+        return j;
 }
 
 /* allow chars in whitelist, plain ascii, hex-escaping and valid utf8 */
index 63fb055..5f2225f 100644 (file)
@@ -97,85 +97,11 @@ _public_ struct udev *udev_new(void) {
         _cleanup_fclose_ FILE *f = NULL;
 
         udev = new0(struct udev, 1);
-        if (udev == NULL)
+        if (!udev) {
+                errno = -ENOMEM;
                 return NULL;
-        udev->refcount = 1;
-
-        f = fopen("/etc/udev/udev.conf", "re");
-        if (f != NULL) {
-                char line[UTIL_LINE_SIZE];
-                unsigned line_nr = 0;
-
-                while (fgets(line, sizeof(line), f)) {
-                        size_t len;
-                        char *key;
-                        char *val;
-
-                        line_nr++;
-
-                        /* find key */
-                        key = line;
-                        while (isspace(key[0]))
-                                key++;
-
-                        /* comment or empty line */
-                        if (key[0] == '#' || key[0] == '\0')
-                                continue;
-
-                        /* split key/value */
-                        val = strchr(key, '=');
-                        if (val == NULL) {
-                                log_debug("/etc/udev/udev.conf:%u: missing assignment,  skipping line.", line_nr);
-                                continue;
-                        }
-                        val[0] = '\0';
-                        val++;
-
-                        /* find value */
-                        while (isspace(val[0]))
-                                val++;
-
-                        /* terminate key */
-                        len = strlen(key);
-                        if (len == 0)
-                                continue;
-                        while (isspace(key[len-1]))
-                                len--;
-                        key[len] = '\0';
-
-                        /* terminate value */
-                        len = strlen(val);
-                        if (len == 0)
-                                continue;
-                        while (isspace(val[len-1]))
-                                len--;
-                        val[len] = '\0';
-
-                        if (len == 0)
-                                continue;
-
-                        /* unquote */
-                        if (val[0] == '"' || val[0] == '\'') {
-                                if (val[len-1] != val[0]) {
-                                        log_debug("/etc/udev/udev.conf:%u: inconsistent quoting, skipping line.", line_nr);
-                                        continue;
-                                }
-                                val[len-1] = '\0';
-                                val++;
-                        }
-
-                        if (streq(key, "udev_log")) {
-                                int prio;
-
-                                prio = util_log_priority(val);
-                                if (prio < 0)
-                                        log_debug("/etc/udev/udev.conf:%u: invalid log level '%s', ignoring.", line_nr, val);
-                                else
-                                        log_set_max_level(prio);
-                                continue;
-                        }
-                }
         }
+        udev->refcount = 1;
 
         return udev;
 }
index a0f3f52..1becae4 100644 (file)
@@ -7,11 +7,11 @@
 
 prefix=@prefix@
 exec_prefix=@exec_prefix@
-libdir=@libdir@
+libdir=@rootlibdir@
 includedir=@includedir@
 
 Name: libudev
 Description: Library to access udev device information
-Version: @VERSION@
+Version: @PACKAGE_VERSION@
 Libs: -L${libdir} -ludev
 Cflags: -I${includedir}
diff --git a/src/libudev/meson.build b/src/libudev/meson.build
new file mode 100644 (file)
index 0000000..1378f9a
--- /dev/null
@@ -0,0 +1,41 @@
+libudev_sources = files('''
+        libudev-private.h
+        libudev-device-internal.h
+        libudev.c
+        libudev-list.c
+        libudev-util.c
+        libudev-device.c
+        libudev-device-private.c
+        libudev-enumerate.c
+        libudev-monitor.c
+        libudev-queue.c
+        libudev-hwdb.c
+'''.split())
+
+############################################################
+
+libudev_sym = 'libudev.sym'
+libudev_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libudev_sym)
+libudev = shared_library(
+        'udev',
+        libudev_sources,
+        version : '1.6.6',
+        include_directories : includes,
+        link_args : ['-shared',
+                     '-Wl,--version-script=' + libudev_sym_path],
+        link_with : [libbasic,
+                     libsystemd_internal],
+        dependencies : [threads],
+        link_depends : libudev_sym,
+        install : true,
+        install_dir : rootlibdir)
+
+install_headers('libudev.h')
+libudev_h_path = '@0@/libudev.h'.format(meson.current_source_dir())
+
+libudev_pc = configure_file(
+        input : 'libudev.pc.in',
+        output : 'libudev.pc',
+        configuration : substs)
+install_data(libudev_pc,
+             install_dir : pkgconfiglibdir)
index a6bcd1a..105d9b0 100644 (file)
@@ -361,8 +361,9 @@ int x11_write_data(Context *c) {
 
         fchmod(fileno(f), 0644);
 
-        fputs("# Read and parsed by systemd-localed. It's probably wise not to edit this file\n"
-              "# manually too freely.\n"
+        fputs("# Written by systemd-localed(8), read by systemd-localed and Xorg. It's\n"
+              "# probably wise not to edit this file manually. Use localectl(1) to\n"
+              "# instruct systemd-localed to update it.\n"
               "Section \"InputClass\"\n"
               "        Identifier \"system-keyboard\"\n"
               "        MatchIsKeyboard \"on\"\n", f);
@@ -519,7 +520,7 @@ int find_converted_keymap(const char *x11_layout, const char *x11_variant, char
         _cleanup_free_ char *n;
 
         if (x11_variant)
-                n = strjoin(x11_layout, "-", x11_variant, NULL);
+                n = strjoin(x11_layout, "-", x11_variant);
         else
                 n = strdup(x11_layout);
         if (!n)
@@ -529,8 +530,8 @@ int find_converted_keymap(const char *x11_layout, const char *x11_variant, char
                 _cleanup_free_ char *p = NULL, *pz = NULL;
                 bool uncompressed;
 
-                p = strjoin(dir, "xkb/", n, ".map", NULL);
-                pz = strjoin(dir, "xkb/", n, ".map.gz", NULL);
+                p = strjoin(dir, "xkb/", n, ".map");
+                pz = strjoin(dir, "xkb/", n, ".map.gz");
                 if (!p || !pz)
                         return -ENOMEM;
 
index 81afb49..0bd18a5 100644 (file)
@@ -166,6 +166,8 @@ static int show_status(sd_bus *bus, char **args, unsigned n) {
                 { "Locale",               "as", NULL, offsetof(StatusInfo, locale) },
                 {}
         };
+
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         int r;
 
         assert(bus);
@@ -174,9 +176,10 @@ static int show_status(sd_bus *bus, char **args, unsigned n) {
                                    "org.freedesktop.locale1",
                                    "/org/freedesktop/locale1",
                                    map,
+                                   &error,
                                    &info);
         if (r < 0)
-                return log_error_errno(r, "Could not get properties: %m");
+                return log_error_errno(r, "Could not get properties: %s", bus_error_message(&error, r));
 
         print_overridden_variables();
         print_status_info(&info);
index 298f176..b4798d6 100644 (file)
@@ -334,7 +334,7 @@ static int method_set_locale(sd_bus_message *m, void *userdata, sd_bus_error *er
                 r = locale_write_data(c, &settings);
                 if (r < 0) {
                         log_error_errno(r, "Failed to set locale: %m");
-                        return sd_bus_error_set_errnof(error, r, "Failed to set locale: %s", strerror(-r));
+                        return sd_bus_error_set_errnof(error, r, "Failed to set locale: %m");
                 }
 
                 locale_update_system_manager(c, sd_bus_message_get_bus(m));
@@ -403,7 +403,7 @@ static int method_set_vc_keyboard(sd_bus_message *m, void *userdata, sd_bus_erro
                 r = vconsole_write_data(c);
                 if (r < 0) {
                         log_error_errno(r, "Failed to set virtual console keymap: %m");
-                        return sd_bus_error_set_errnof(error, r, "Failed to set virtual console keymap: %s", strerror(-r));
+                        return sd_bus_error_set_errnof(error, r, "Failed to set virtual console keymap: %m");
                 }
 
                 log_info("Changed virtual console keymap to '%s' toggle '%s'",
@@ -436,7 +436,10 @@ static void log_xkb(struct xkb_context *ctx, enum xkb_log_level lvl, const char
         const char *fmt;
 
         fmt = strjoina("libxkbcommon: ", format);
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
         log_internalv(LOG_DEBUG, 0, __FILE__, __LINE__, __func__, fmt, args);
+#pragma GCC diagnostic pop
 }
 
 #define LOAD_SYMBOL(symbol, dl, name)                                   \
@@ -592,7 +595,7 @@ static int method_set_x11_keyboard(sd_bus_message *m, void *userdata, sd_bus_err
                 r = x11_write_data(c);
                 if (r < 0) {
                         log_error_errno(r, "Failed to set X11 keyboard layout: %m");
-                        return sd_bus_error_set_errnof(error, r, "Failed to set X11 keyboard layout: %s", strerror(-r));
+                        return sd_bus_error_set_errnof(error, r, "Failed to set X11 keyboard layout: %m");
                 }
 
                 log_info("Changed X11 keyboard layout to '%s' model '%s' variant '%s' options '%s'",
diff --git a/src/locale/meson.build b/src/locale/meson.build
new file mode 100644 (file)
index 0000000..d7dd113
--- /dev/null
@@ -0,0 +1,42 @@
+systemd_localed_sources = files('''
+        localed.c
+        keymap-util.c
+        keymap-util.h
+'''.split())
+
+localectl_sources = files('localectl.c')
+
+if conf.get('ENABLE_LOCALED', false)
+        install_data('org.freedesktop.locale1.conf',
+                     install_dir : dbuspolicydir)
+        install_data('org.freedesktop.locale1.service',
+                     install_dir : dbussystemservicedir)
+
+        custom_target(
+                'org.freedesktop.locale1.policy',
+                input : 'org.freedesktop.locale1.policy.in',
+                output : 'org.freedesktop.locale1.policy',
+                command : intltool_command,
+                install : install_polkit,
+                install_dir : polkitpolicydir)
+endif
+
+# If you know a way that allows the same variables to be used
+# in sources list and concatenated to a string for test_env,
+# let me know.
+kbd_model_map = join_paths(meson.current_source_dir(),  'kbd-model-map')
+language_fallback_map = join_paths(meson.current_source_dir(), 'language-fallback-map')
+
+if conf.get('ENABLE_LOCALED', false)
+        install_data('kbd-model-map',
+                     'language-fallback-map',
+                     install_dir : pkgdatadir)
+endif
+
+tests += [
+        [['src/locale/test-keymap-util.c',
+          'src/locale/keymap-util.c',
+          'src/locale/keymap-util.h'],
+         [libshared],
+         [libdl]],
+]
index 70cf60a..141dae4 100644 (file)
@@ -14,5 +14,7 @@
 #SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="* WMI hotkeys", TAG+="power-switch"
 #SUBSYSTEM=="input", KERNEL=="event*", \
 #  SUBSYSTEMS=="platform", DRIVERS=="gpio-keys", ATTRS{keys}=="*,116|116,*|116|*,116,*", TAG+="power-switch"
+#SUBSYSTEM=="input", KERNEL=="event*", ENV{ID_INPUT_SWITCH}=="1", TAG+="power-switch"
+#SUBSYSTEM=="input", KERNEL=="event*", ENV{ID_INPUT_KEY}=="1", TAG+="power-switch"
 
 #LABEL="power_switch_end"
index f2c37a8..7e5a093 100644 (file)
@@ -29,7 +29,7 @@
 #include "bus-error.h"
 #include "bus-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "process-util.h"
 #include "signal-util.h"
 #include "strv.h"
index 0fc33cf..1862e89 100644 (file)
@@ -83,6 +83,34 @@ static OutputFlags get_output_flags(void) {
                 colors_enabled() * OUTPUT_COLOR;
 }
 
+static int get_session_path(sd_bus *bus, const char *session_id, sd_bus_error *error, char **path) {
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+        int r;
+        char *ans;
+
+        r = sd_bus_call_method(
+                        bus,
+                        "org.freedesktop.login1",
+                        "/org/freedesktop/login1",
+                        "org.freedesktop.login1.Manager",
+                        "GetSession",
+                        error, &reply,
+                        "s", session_id);
+        if (r < 0)
+                return r;
+
+        r = sd_bus_message_read(reply, "o", &ans);
+        if (r < 0)
+                return r;
+
+        ans = strdup(ans);
+        if (!ans)
+                return -ENOMEM;
+
+        *path = ans;
+        return 0;
+}
+
 static int list_sessions(int argc, char *argv[], void *userdata) {
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
@@ -115,10 +143,38 @@ static int list_sessions(int argc, char *argv[], void *userdata) {
                 return bus_log_parse_error(r);
 
         if (arg_legend)
-                printf("%10s %10s %-16s %-16s\n", "SESSION", "UID", "USER", "SEAT");
+                printf("%10s %10s %-16s %-16s %-16s\n", "SESSION", "UID", "USER", "SEAT", "TTY");
 
         while ((r = sd_bus_message_read(reply, "(susso)", &id, &uid, &user, &seat, &object)) > 0) {
-                printf("%10s %10u %-16s %-16s\n", id, (unsigned) uid, user, seat);
+                _cleanup_(sd_bus_error_free) sd_bus_error error2 = SD_BUS_ERROR_NULL;
+                _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply2 = NULL;
+                _cleanup_free_ char *path = NULL;
+                const char *tty = NULL;
+
+                r = get_session_path(bus, id, &error2, &path);
+                if (r < 0)
+                        log_warning("Failed to get session path: %s", bus_error_message(&error, r));
+                else {
+                        r = sd_bus_get_property(
+                                        bus,
+                                        "org.freedesktop.login1",
+                                        path,
+                                        "org.freedesktop.login1.Session",
+                                        "TTY",
+                                        &error2,
+                                        &reply2,
+                                        "s");
+                        if (r < 0)
+                                log_warning("Failed to get TTY for session %s: %s",
+                                            id, bus_error_message(&error2, r));
+                        else {
+                                r = sd_bus_message_read(reply2, "s", &tty);
+                                if (r < 0)
+                                        return bus_log_parse_error(r);
+                        }
+                }
+
+                printf("%10s %10"PRIu32" %-16s %-16s %-16s\n", id, uid, user, seat, strna(tty));
                 k++;
         }
         if (r < 0)
@@ -165,7 +221,7 @@ static int list_users(int argc, char *argv[], void *userdata) {
                 printf("%10s %-16s\n", "UID", "USER");
 
         while ((r = sd_bus_message_read(reply, "(uso)", &uid, &user, &object)) > 0) {
-                printf("%10u %-16s\n", (unsigned) uid, user);
+                printf("%10"PRIu32" %-16s\n", uid, user);
                 k++;
         }
         if (r < 0)
@@ -184,7 +240,6 @@ static int list_seats(int argc, char *argv[], void *userdata) {
         sd_bus *bus = userdata;
         unsigned k = 0;
         int r;
-
         assert(bus);
         assert(argv);
 
@@ -224,35 +279,17 @@ static int list_seats(int argc, char *argv[], void *userdata) {
 }
 
 static int show_unit_cgroup(sd_bus *bus, const char *interface, const char *unit, pid_t leader) {
+        _cleanup_free_ char *cgroup = NULL;
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
-        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
-        _cleanup_free_ char *path = NULL;
-        const char *cgroup;
         unsigned c;
         int r;
 
         assert(bus);
         assert(unit);
 
-        path = unit_dbus_path_from_name(unit);
-        if (!path)
-                return log_oom();
-
-        r = sd_bus_get_property(
-                        bus,
-                        "org.freedesktop.systemd1",
-                        path,
-                        interface,
-                        "ControlGroup",
-                        &error,
-                        &reply,
-                        "s");
-        if (r < 0)
-                return log_error_errno(r, "Failed to query ControlGroup: %s", bus_error_message(&error, r));
-
-        r = sd_bus_message_read(reply, "s", &cgroup);
+        r = show_cgroup_get_unit_path_and_warn(bus, unit, &cgroup);
         if (r < 0)
-                return bus_log_parse_error(r);
+                return r;
 
         if (isempty(cgroup))
                 return 0;
@@ -445,14 +482,15 @@ static int print_session_status_info(sd_bus *bus, const char *path, bool *new_li
                 {}
         };
 
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         char since1[FORMAT_TIMESTAMP_RELATIVE_MAX], *s1;
         char since2[FORMAT_TIMESTAMP_MAX], *s2;
         _cleanup_(session_status_info_clear) SessionStatusInfo i = {};
         int r;
 
-        r = bus_map_all_properties(bus, "org.freedesktop.login1", path, map, &i);
+        r = bus_map_all_properties(bus, "org.freedesktop.login1", path, map, &error, &i);
         if (r < 0)
-                return log_error_errno(r, "Could not get properties: %m");
+                return log_error_errno(r, "Could not get properties: %s", bus_error_message(&error, r));
 
         if (*new_line)
                 printf("\n");
@@ -462,9 +500,9 @@ static int print_session_status_info(sd_bus *bus, const char *path, bool *new_li
         printf("%s - ", strna(i.id));
 
         if (i.name)
-                printf("%s (%u)\n", i.name, (unsigned) i.uid);
+                printf("%s (%"PRIu32")\n", i.name, i.uid);
         else
-                printf("%u\n", (unsigned) i.uid);
+                printf("%"PRIu32"\n", i.uid);
 
         s1 = format_timestamp_relative(since1, sizeof(since1), i.timestamp.realtime);
         s2 = format_timestamp(since2, sizeof(since2), i.timestamp.realtime);
@@ -477,7 +515,7 @@ static int print_session_status_info(sd_bus *bus, const char *path, bool *new_li
         if (i.leader > 0) {
                 _cleanup_free_ char *t = NULL;
 
-                printf("\t  Leader: %u", (unsigned) i.leader);
+                printf("\t  Leader: %"PRIu32, i.leader);
 
                 get_process_comm(i.leader, &t);
                 if (t)
@@ -574,14 +612,15 @@ static int print_user_status_info(sd_bus *bus, const char *path, bool *new_line)
                 {}
         };
 
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         char since1[FORMAT_TIMESTAMP_RELATIVE_MAX], *s1;
         char since2[FORMAT_TIMESTAMP_MAX], *s2;
         _cleanup_(user_status_info_clear) UserStatusInfo i = {};
         int r;
 
-        r = bus_map_all_properties(bus, "org.freedesktop.login1", path, map, &i);
+        r = bus_map_all_properties(bus, "org.freedesktop.login1", path, map, &error, &i);
         if (r < 0)
-                return log_error_errno(r, "Could not get properties: %m");
+                return log_error_errno(r, "Could not get properties: %s", bus_error_message(&error, r));
 
         if (*new_line)
                 printf("\n");
@@ -589,9 +628,9 @@ static int print_user_status_info(sd_bus *bus, const char *path, bool *new_line)
         *new_line = true;
 
         if (i.name)
-                printf("%s (%u)\n", i.name, (unsigned) i.uid);
+                printf("%s (%"PRIu32")\n", i.name, i.uid);
         else
-                printf("%u\n", (unsigned) i.uid);
+                printf("%"PRIu32"\n", i.uid);
 
         s1 = format_timestamp_relative(since1, sizeof(since1), i.timestamp.realtime);
         s2 = format_timestamp(since2, sizeof(since2), i.timestamp.realtime);
@@ -648,12 +687,13 @@ static int print_seat_status_info(sd_bus *bus, const char *path, bool *new_line)
                 {}
         };
 
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_(seat_status_info_clear) SeatStatusInfo i = {};
         int r;
 
-        r = bus_map_all_properties(bus, "org.freedesktop.login1", path, map, &i);
+        r = bus_map_all_properties(bus, "org.freedesktop.login1", path, map, &error, &i);
         if (r < 0)
-                return log_error_errno(r, "Could not get properties: %m");
+                return log_error_errno(r, "Could not get properties: %s", bus_error_message(&error, r));
 
         if (*new_line)
                 printf("\n");
@@ -867,6 +907,8 @@ static int show_session(int argc, char *argv[], void *userdata) {
         bool properties, new_line = false;
         sd_bus *bus = userdata;
         int r, i;
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        _cleanup_free_ char *path = NULL;
 
         assert(bus);
         assert(argv);
@@ -876,37 +918,33 @@ static int show_session(int argc, char *argv[], void *userdata) {
         pager_open(arg_no_pager, false);
 
         if (argc <= 1) {
-                /* If not argument is specified inspect the manager
-                 * itself */
+                const char *session, *p = "/org/freedesktop/login1/session/self";
+
                 if (properties)
+                        /* If no argument is specified inspect the manager itself */
                         return show_properties(bus, "/org/freedesktop/login1", &new_line);
 
                 /* And in the pretty case, show data of the calling session */
-                return print_session_status_info(bus, "/org/freedesktop/login1/session/self", &new_line);
+                session = getenv("XDG_SESSION_ID");
+                if (session) {
+                        r = get_session_path(bus, session, &error, &path);
+                        if (r < 0) {
+                                log_error("Failed to get session path: %s", bus_error_message(&error, r));
+                                return r;
+                        }
+                        p = path;
+                }
+
+                return print_session_status_info(bus, p, &new_line);
         }
 
         for (i = 1; i < argc; i++) {
-                _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
-                _cleanup_(sd_bus_message_unrefp) sd_bus_message * reply = NULL;
-                const char *path = NULL;
-
-                r = sd_bus_call_method(
-                                bus,
-                                "org.freedesktop.login1",
-                                "/org/freedesktop/login1",
-                                "org.freedesktop.login1.Manager",
-                                "GetSession",
-                                &error, &reply,
-                                "s", argv[i]);
+                r = get_session_path(bus, argv[i], &error, &path);
                 if (r < 0) {
-                        log_error("Failed to get session: %s", bus_error_message(&error, r));
+                        log_error("Failed to get session path: %s", bus_error_message(&error, r));
                         return r;
                 }
 
-                r = sd_bus_message_read(reply, "o", &path);
-                if (r < 0)
-                        return bus_log_parse_error(r);
-
                 if (properties)
                         r = show_properties(bus, path, &new_line);
                 else
@@ -1046,12 +1084,11 @@ static int activate(int argc, char *argv[], void *userdata) {
         polkit_agent_open_if_enabled();
 
         if (argc < 2) {
-                /* No argument? Let's convert this into the empty
-                 * session name, which the calls will then resolve to
-                 * the caller's session. */
+                /* No argument? Let's either use $XDG_SESSION_ID (if specified), or an empty
+                 * session name, in which case logind will try to guess our session. */
 
                 short_argv[0] = argv[0];
-                short_argv[1] = (char*) "";
+                short_argv[1] = getenv("XDG_SESSION_ID") ?: (char*) "";
                 short_argv[2] = NULL;
 
                 argv = short_argv;
@@ -1127,8 +1164,11 @@ static int enable_linger(int argc, char *argv[], void *userdata) {
         b = streq(argv[0], "enable-linger");
 
         if (argc < 2) {
+                /* No argument? Let's either use $XDG_SESSION_ID (if specified), or an empty
+                 * session name, in which case logind will try to guess our session. */
+
                 short_argv[0] = argv[0];
-                short_argv[1] = (char*) "";
+                short_argv[1] = getenv("XDG_SESSION_ID") ?: (char*) "";
                 short_argv[2] = NULL;
                 argv = short_argv;
                 argc = 2;
@@ -1358,8 +1398,10 @@ static int help(int argc, char *argv[], void *userdata) {
                "     --kill-who=WHO        Who to send signal to\n"
                "  -s --signal=SIGNAL       Which signal to send\n"
                "  -n --lines=INTEGER       Number of journal entries to show\n"
-               "  -o --output=STRING       Change journal output mode (short, short-monotonic,\n"
-               "                           verbose, export, json, json-pretty, json-sse, cat)\n\n"
+               "  -o --output=STRING       Change journal output mode (short, short-precise,\n"
+               "                             short-iso, short-iso-precise, short-full,\n"
+               "                             short-monotonic, short-unix, verbose, export,\n"
+               "                             json, json-pretty, json-sse, cat)\n"
                "Session Commands:\n"
                "  list-sessions            List sessions\n"
                "  session-status [ID...]   Show session status\n"
index 0cef88a..1b69f4b 100644 (file)
@@ -25,7 +25,7 @@
 #include "dirent-util.h"
 #include "escape.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "logind-acl.h"
 #include "set.h"
 #include "string-util.h"
index 8ef48db..91225a5 100644 (file)
@@ -23,7 +23,7 @@
 #include "bus-error.h"
 #include "bus-util.h"
 #include "conf-parser.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "logind-action.h"
 #include "process-util.h"
 #include "sleep-config.h"
@@ -85,7 +85,7 @@ int manager_handle_action(
         }
 
         /* If the key handling is inhibited, don't do anything */
-        if (!ignore_inhibited && inhibit_key > 0) {
+        if (inhibit_key > 0) {
                 if (manager_is_inhibited(m, inhibit_key, INHIBIT_BLOCK, NULL, true, false, 0, NULL)) {
                         log_debug("Refusing operation, %s is inhibited.", inhibit_what_to_string(inhibit_key));
                         return 0;
index baa6b71..e53dd63 100644 (file)
 #include "string-util.h"
 #include "util.h"
 
+#define CONST_MAX4(a, b, c, d) CONST_MAX(CONST_MAX(a, b), CONST_MAX(c, d))
+
+#define ULONG_BITS (sizeof(unsigned long)*8)
+
+static bool bitset_get(const unsigned long *bits, unsigned i) {
+        return (bits[i / ULONG_BITS] >> (i % ULONG_BITS)) & 1UL;
+}
+
+static void bitset_put(unsigned long *bits, unsigned i) {
+        bits[i / ULONG_BITS] |= (unsigned long) 1 << (i % ULONG_BITS);
+}
+
 Button* button_new(Manager *m, const char *name) {
         Button *b;
 
@@ -43,15 +55,12 @@ Button* button_new(Manager *m, const char *name) {
                 return NULL;
 
         b->name = strdup(name);
-        if (!b->name) {
-                free(b);
-                return NULL;
-        }
+        if (!b->name)
+                return mfree(b);
 
         if (hashmap_put(m->buttons, b->name, b) < 0) {
                 free(b->name);
-                free(b);
-                return NULL;
+                return mfree(b);
         }
 
         b->manager = m;
@@ -158,7 +167,7 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u
                 case KEY_POWER2:
                         log_struct(LOG_INFO,
                                    LOG_MESSAGE("Power key pressed."),
-                                   LOG_MESSAGE_ID(SD_MESSAGE_POWER_KEY),
+                                   "MESSAGE_ID=" SD_MESSAGE_POWER_KEY_STR,
                                    NULL);
 
                         manager_handle_action(b->manager, INHIBIT_HANDLE_POWER_KEY, b->manager->handle_power_key, b->manager->power_key_ignore_inhibited, true);
@@ -173,7 +182,7 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u
                 case KEY_SLEEP:
                         log_struct(LOG_INFO,
                                    LOG_MESSAGE("Suspend key pressed."),
-                                   LOG_MESSAGE_ID(SD_MESSAGE_SUSPEND_KEY),
+                                   "MESSAGE_ID=" SD_MESSAGE_SUSPEND_KEY_STR,
                                    NULL);
 
                         manager_handle_action(b->manager, INHIBIT_HANDLE_SUSPEND_KEY, b->manager->handle_suspend_key, b->manager->suspend_key_ignore_inhibited, true);
@@ -182,7 +191,7 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u
                 case KEY_SUSPEND:
                         log_struct(LOG_INFO,
                                    LOG_MESSAGE("Hibernate key pressed."),
-                                   LOG_MESSAGE_ID(SD_MESSAGE_HIBERNATE_KEY),
+                                   "MESSAGE_ID=" SD_MESSAGE_HIBERNATE_KEY_STR,
                                    NULL);
 
                         manager_handle_action(b->manager, INHIBIT_HANDLE_HIBERNATE_KEY, b->manager->handle_hibernate_key, b->manager->hibernate_key_ignore_inhibited, true);
@@ -194,7 +203,7 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u
                 if (ev.code == SW_LID) {
                         log_struct(LOG_INFO,
                                    LOG_MESSAGE("Lid closed."),
-                                   LOG_MESSAGE_ID(SD_MESSAGE_LID_CLOSED),
+                                   "MESSAGE_ID=" SD_MESSAGE_LID_CLOSED_STR,
                                    NULL);
 
                         b->lid_closed = true;
@@ -204,7 +213,7 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u
                 } else if (ev.code == SW_DOCK) {
                         log_struct(LOG_INFO,
                                    LOG_MESSAGE("System docked."),
-                                   LOG_MESSAGE_ID(SD_MESSAGE_SYSTEM_DOCKED),
+                                   "MESSAGE_ID=" SD_MESSAGE_SYSTEM_DOCKED_STR,
                                    NULL);
 
                         b->docked = true;
@@ -215,7 +224,7 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u
                 if (ev.code == SW_LID) {
                         log_struct(LOG_INFO,
                                    LOG_MESSAGE("Lid opened."),
-                                   LOG_MESSAGE_ID(SD_MESSAGE_LID_OPENED),
+                                   "MESSAGE_ID=" SD_MESSAGE_LID_OPENED_STR,
                                    NULL);
 
                         b->lid_closed = false;
@@ -224,7 +233,7 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u
                 } else if (ev.code == SW_DOCK) {
                         log_struct(LOG_INFO,
                                    LOG_MESSAGE("System undocked."),
-                                   LOG_MESSAGE_ID(SD_MESSAGE_SYSTEM_UNDOCKED),
+                                   "MESSAGE_ID=" SD_MESSAGE_SYSTEM_UNDOCKED_STR,
                                    NULL);
 
                         b->docked = false;
@@ -234,6 +243,95 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u
         return 0;
 }
 
+static int button_suitable(Button *b) {
+        unsigned long types[CONST_MAX(EV_KEY, EV_SW)/ULONG_BITS+1];
+
+        assert(b);
+        assert(b->fd);
+
+        if (ioctl(b->fd, EVIOCGBIT(EV_SYN, sizeof(types)), types) < 0)
+                return -errno;
+
+        if (bitset_get(types, EV_KEY)) {
+                unsigned long keys[CONST_MAX4(KEY_POWER, KEY_POWER2, KEY_SLEEP, KEY_SUSPEND)/ULONG_BITS+1];
+
+                if (ioctl(b->fd, EVIOCGBIT(EV_KEY, sizeof(keys)), keys) < 0)
+                        return -errno;
+
+                if (bitset_get(keys, KEY_POWER) ||
+                    bitset_get(keys, KEY_POWER2) ||
+                    bitset_get(keys, KEY_SLEEP) ||
+                    bitset_get(keys, KEY_SUSPEND))
+                        return true;
+        }
+
+        if (bitset_get(types, EV_SW)) {
+                unsigned long switches[CONST_MAX(SW_LID, SW_DOCK)/ULONG_BITS+1];
+
+                if (ioctl(b->fd, EVIOCGBIT(EV_SW, sizeof(switches)), switches) < 0)
+                        return -errno;
+
+                if (bitset_get(switches, SW_LID) ||
+                    bitset_get(switches, SW_DOCK))
+                        return true;
+        }
+
+        return false;
+}
+
+static int button_set_mask(Button *b) {
+        unsigned long
+                types[CONST_MAX(EV_KEY, EV_SW)/ULONG_BITS+1] = {},
+                keys[CONST_MAX4(KEY_POWER, KEY_POWER2, KEY_SLEEP, KEY_SUSPEND)/ULONG_BITS+1] = {},
+                switches[CONST_MAX(SW_LID, SW_DOCK)/ULONG_BITS+1] = {};
+        struct input_mask mask;
+
+        assert(b);
+        assert(b->fd >= 0);
+
+        bitset_put(types, EV_KEY);
+        bitset_put(types, EV_SW);
+
+        mask = (struct input_mask) {
+                .type = EV_SYN,
+                .codes_size = sizeof(types),
+                .codes_ptr = PTR_TO_UINT64(types),
+        };
+
+        if (ioctl(b->fd, EVIOCSMASK, &mask) < 0)
+                /* Log only at debug level if the kernel doesn't do EVIOCSMASK yet */
+                return log_full_errno(IN_SET(errno, ENOTTY, EOPNOTSUPP, EINVAL) ? LOG_DEBUG : LOG_WARNING,
+                                      errno, "Failed to set EV_SYN event mask on /dev/input/%s: %m", b->name);
+
+        bitset_put(keys, KEY_POWER);
+        bitset_put(keys, KEY_POWER2);
+        bitset_put(keys, KEY_SLEEP);
+        bitset_put(keys, KEY_SUSPEND);
+
+        mask = (struct input_mask) {
+                .type = EV_KEY,
+                .codes_size = sizeof(keys),
+                .codes_ptr = PTR_TO_UINT64(keys),
+        };
+
+        if (ioctl(b->fd, EVIOCSMASK, &mask) < 0)
+                return log_warning_errno(errno, "Failed to set EV_KEY event mask on /dev/input/%s: %m", b->name);
+
+        bitset_put(switches, SW_LID);
+        bitset_put(switches, SW_DOCK);
+
+        mask = (struct input_mask) {
+                .type = EV_SW,
+                .codes_size = sizeof(switches),
+                .codes_ptr = PTR_TO_UINT64(switches),
+        };
+
+        if (ioctl(b->fd, EVIOCSMASK, &mask) < 0)
+                return log_warning_errno(errno, "Failed to set EV_SW event mask on /dev/input/%s: %m", b->name);
+
+        return 0;
+}
+
 int button_open(Button *b) {
         char *p, name[256];
         int r;
@@ -246,13 +344,23 @@ int button_open(Button *b) {
 
         b->fd = open(p, O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK);
         if (b->fd < 0)
-                return log_warning_errno(errno, "Failed to open %s: %m", b->name);
+                return log_warning_errno(errno, "Failed to open %s: %m", p);
+
+        r = button_suitable(b);
+        if (r < 0)
+                return log_warning_errno(r, "Failed to determine whether input device is relevant to us: %m");
+        if (r == 0) {
+                log_debug("Device %s does not expose keys or switches relevant to us, ignoring.", p);
+                return -EADDRNOTAVAIL;
+        }
 
         if (ioctl(b->fd, EVIOCGNAME(sizeof(name)), name) < 0) {
                 r = log_error_errno(errno, "Failed to get input name: %m");
                 goto fail;
         }
 
+        (void) button_set_mask(b);
+
         r = sd_event_add_io(b->manager->event, &b->io_event_source, b->fd, EPOLLIN, button_dispatch, b);
         if (r < 0) {
                 log_error_errno(r, "Failed to add button event: %m");
@@ -269,7 +377,7 @@ fail:
 }
 
 int button_check_switches(Button *b) {
-        uint8_t switches[SW_MAX/8+1] = {};
+        unsigned long switches[CONST_MAX(SW_LID, SW_DOCK)/ULONG_BITS+1] = {};
         assert(b);
 
         if (b->fd < 0)
@@ -278,8 +386,8 @@ int button_check_switches(Button *b) {
         if (ioctl(b->fd, EVIOCGSW(sizeof(switches)), switches) < 0)
                 return -errno;
 
-        b->lid_closed = (switches[SW_LID/8] >> (SW_LID % 8)) & 1;
-        b->docked = (switches[SW_DOCK/8] >> (SW_DOCK % 8)) & 1;
+        b->lid_closed = bitset_get(switches, SW_LID);
+        b->docked = bitset_get(switches, SW_DOCK);
 
         if (b->lid_closed)
                 button_install_check_event_source(b);
index eff5a4a..ebe1d68 100644 (file)
@@ -269,7 +269,11 @@ int manager_process_button_device(Manager *m, struct udev_device *d) {
                         sn = "seat0";
 
                 button_set_seat(b, sn);
-                button_open(b);
+
+                r = button_open(b);
+                if (r < 0) /* event device doesn't have any keys or switches relevant to us? (or any other error
+                            * opening the device?) let's close the button again. */
+                        button_free(b);
         }
 
         return 0;
index 0a84d75..c9b7d99 100644 (file)
@@ -34,7 +34,7 @@
 #include "escape.h"
 #include "fd-util.h"
 #include "fileio-label.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "logind.h"
 #include "mkdir.h"
@@ -65,6 +65,9 @@ int manager_get_session_from_creds(Manager *m, sd_bus_message *message, const ch
                         return r;
 
                 r = sd_bus_creds_get_session(creds, &name);
+                if (r == -ENXIO)
+                        return sd_bus_error_setf(error, BUS_ERROR_NO_SESSION_FOR_PID,
+                                                 "Caller does not belong to any known session");
                 if (r < 0)
                         return r;
         }
@@ -1286,8 +1289,7 @@ static int flush_devices(Manager *m) {
         } else {
                 struct dirent *de;
 
-                while ((de = readdir(d))) {
-
+                FOREACH_DIRENT_ALL(de, d, break) {
                         if (!dirent_is_file(de))
                                 continue;
 
@@ -1431,7 +1433,7 @@ static int bus_manager_log_shutdown(
                 p = strjoina(p, " (", m->wall_message, ").");
 
         return log_struct(LOG_NOTICE,
-                          LOG_MESSAGE_ID(SD_MESSAGE_SHUTDOWN),
+                          "MESSAGE_ID=" SD_MESSAGE_SHUTDOWN_STR,
                           p,
                           q,
                           NULL);
@@ -2397,13 +2399,9 @@ static int method_set_wall_message(
         if (r == 0)
                 return 1; /* Will call us back */
 
-        if (isempty(wall_message))
-                m->wall_message = mfree(m->wall_message);
-        else {
-                r = free_and_strdup(&m->wall_message, wall_message);
-                if (r < 0)
-                        return log_oom();
-        }
+        r = free_and_strdup(&m->wall_message, empty_to_null(wall_message));
+        if (r < 0)
+                return log_oom();
 
         m->enable_wall_messages = enable_wall_messages;
 
index eb5edd1..6537fa0 100644 (file)
@@ -34,15 +34,12 @@ Device* device_new(Manager *m, const char *sysfs, bool master) {
                 return NULL;
 
         d->sysfs = strdup(sysfs);
-        if (!d->sysfs) {
-                free(d);
-                return NULL;
-        }
+        if (!d->sysfs)
+                return mfree(d);
 
         if (hashmap_put(m->devices, d->sysfs, d) < 0) {
                 free(d->sysfs);
-                free(d);
-                return NULL;
+                return mfree(d);
         }
 
         d->manager = m;
index 6c78e0d..1e6f383 100644 (file)
@@ -26,7 +26,7 @@
 #include "escape.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "logind-inhibit.h"
 #include "mkdir.h"
 #include "parse-util.h"
@@ -45,17 +45,14 @@ Inhibitor* inhibitor_new(Manager *m, const char* id) {
                 return NULL;
 
         i->state_file = strappend("/run/systemd/inhibit/", id);
-        if (!i->state_file) {
-                free(i);
-                return NULL;
-        }
+        if (!i->state_file)
+                return mfree(i);
 
         i->id = basename(i->state_file);
 
         if (hashmap_put(m->inhibitors, i->id, i) < 0) {
                 free(i->state_file);
-                free(i);
-                return NULL;
+                return mfree(i);
         }
 
         i->manager = m;
@@ -297,7 +294,7 @@ int inhibitor_create_fifo(Inhibitor *i) {
                 if (r < 0)
                         return r;
 
-                i->fifo_path = strjoin("/run/systemd/inhibit/", i->id, ".ref", NULL);
+                i->fifo_path = strjoin("/run/systemd/inhibit/", i->id, ".ref");
                 if (!i->fifo_path)
                         return -ENOMEM;
 
@@ -350,7 +347,7 @@ InhibitWhat manager_inhibit_what(Manager *m, InhibitMode mm) {
         assert(m);
 
         HASHMAP_FOREACH(i, m->inhibitors, j)
-                if (i->mode == mm)
+                if (i->mode == mm && i->started)
                         what |= i->what;
 
         return what;
@@ -391,6 +388,9 @@ bool manager_is_inhibited(
         assert(w > 0 && w < _INHIBIT_WHAT_MAX);
 
         HASHMAP_FOREACH(i, m->inhibitors, j) {
+                if (!i->started)
+                        continue;
+
                 if (!(i->what & w))
                         continue;
 
index b519232..30dac79 100644 (file)
@@ -27,7 +27,7 @@
 #include "alloc-util.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "logind-acl.h"
 #include "logind-seat.h"
 #include "mkdir.h"
@@ -48,18 +48,15 @@ Seat *seat_new(Manager *m, const char *id) {
                 return NULL;
 
         s->state_file = strappend("/run/systemd/seats/", id);
-        if (!s->state_file) {
-                free(s);
-                return NULL;
-        }
+        if (!s->state_file)
+                return mfree(s);
 
         s->id = basename(s->state_file);
         s->manager = m;
 
         if (hashmap_put(m->seats, s->id, s) < 0) {
                 free(s->state_file);
-                free(s);
-                return NULL;
+                return mfree(s);
         }
 
         return s;
@@ -382,7 +379,8 @@ int seat_read_active_vt(Seat *s) {
         if (!seat_has_vts(s))
                 return 0;
 
-        lseek(s->manager->console_active_fd, SEEK_SET, 0);
+        if (lseek(s->manager->console_active_fd, SEEK_SET, 0) < 0)
+                return log_error_errno(errno, "lseek on console_active_fd failed: %m");
 
         k = read(s->manager->console_active_fd, t, sizeof(t)-1);
         if (k <= 0) {
@@ -399,10 +397,8 @@ int seat_read_active_vt(Seat *s) {
         }
 
         r = safe_atou(t+3, &vtnr);
-        if (r < 0) {
-                log_error("Failed to parse VT number %s", t+3);
-                return r;
-        }
+        if (r < 0)
+                return log_error_errno(r, "Failed to parse VT number \"%s\": %m", t+3);
 
         if (!vtnr) {
                 log_error("VT number invalid: %s", t+3);
@@ -419,7 +415,7 @@ int seat_start(Seat *s) {
                 return 0;
 
         log_struct(LOG_INFO,
-                   LOG_MESSAGE_ID(SD_MESSAGE_SEAT_START),
+                   "MESSAGE_ID=" SD_MESSAGE_SEAT_START_STR,
                    "SEAT_ID=%s", s->id,
                    LOG_MESSAGE("New seat %s.", s->id),
                    NULL);
@@ -447,7 +443,7 @@ int seat_stop(Seat *s, bool force) {
 
         if (s->started)
                 log_struct(LOG_INFO,
-                           LOG_MESSAGE_ID(SD_MESSAGE_SEAT_STOP),
+                           "MESSAGE_ID=" SD_MESSAGE_SEAT_STOP_STR,
                            "SEAT_ID=%s", s->id,
                            LOG_MESSAGE("Removed seat %s.", s->id),
                            NULL);
@@ -544,8 +540,6 @@ int seat_attach_session(Seat *s, Session *session) {
         LIST_PREPEND(sessions_by_seat, s->sessions, session);
         seat_assign_position(s, session);
 
-        seat_send_changed(s, "Sessions", NULL);
-
         /* On seats with VTs, the VT logic defines which session is active. On
          * seats without VTs, we automatically activate new sessions. */
         if (!seat_has_vts(s))
index 22dea5d..22e5349 100644 (file)
@@ -396,7 +396,7 @@ static int method_take_control(sd_bus_message *message, void *userdata, sd_bus_e
         if (uid != 0 && (force || uid != s->user->uid))
                 return sd_bus_error_setf(error, SD_BUS_ERROR_ACCESS_DENIED, "Only owner of session may take control");
 
-        r = session_set_controller(s, sd_bus_message_get_sender(message), force);
+        r = session_set_controller(s, sd_bus_message_get_sender(message), force, true);
         if (r < 0)
                 return r;
 
@@ -444,14 +444,23 @@ static int method_take_device(sd_bus_message *message, void *userdata, sd_bus_er
                  * equivalent). */
                 return sd_bus_error_setf(error, BUS_ERROR_DEVICE_IS_TAKEN, "Device already taken");
 
-        r = session_device_new(s, dev, &sd);
+        r = session_device_new(s, dev, true, &sd);
         if (r < 0)
                 return r;
 
+        r = session_device_save(sd);
+        if (r < 0)
+                goto error;
+
         r = sd_bus_reply_method_return(message, "hb", sd->fd, !sd->active);
         if (r < 0)
-                session_device_free(sd);
+                goto error;
+
+        session_save(s);
+        return 0;
 
+error:
+        session_device_free(sd);
         return r;
 }
 
@@ -478,6 +487,8 @@ static int method_release_device(sd_bus_message *message, void *userdata, sd_bus
                 return sd_bus_error_setf(error, BUS_ERROR_DEVICE_NOT_TAKEN, "Device not taken");
 
         session_device_free(sd);
+        session_save(s);
+
         return sd_bus_reply_method_return(message, NULL);
 }
 
index 4055a23..05af204 100644 (file)
@@ -30,6 +30,8 @@
 #include "fd-util.h"
 #include "logind-session-device.h"
 #include "missing.h"
+#include "parse-util.h"
+#include "sd-daemon.h"
 #include "util.h"
 
 enum SessionDeviceNotifications {
@@ -206,7 +208,10 @@ static int session_device_start(SessionDevice *sd) {
                 r = session_device_open(sd, true);
                 if (r < 0)
                         return r;
-                close_nointr(sd->fd);
+                /* For evdev devices, the file descriptor might be left
+                 * uninitialized. This might happen while resuming into a
+                 * session and logind has been restarted right before. */
+                safe_close(sd->fd);
                 sd->fd = r;
                 break;
         case DEVICE_TYPE_UNKNOWN:
@@ -341,7 +346,7 @@ err_dev:
         return r;
 }
 
-int session_device_new(Session *s, dev_t dev, SessionDevice **out) {
+int session_device_new(Session *s, dev_t dev, bool open_device, SessionDevice **out) {
         SessionDevice *sd;
         int r;
 
@@ -370,22 +375,24 @@ int session_device_new(Session *s, dev_t dev, SessionDevice **out) {
                 goto error;
         }
 
-        /* Open the device for the first time. We need a valid fd to pass back
-         * to the caller. If the session is not active, this _might_ immediately
-         * revoke access and thus invalidate the fd. But this is still needed
-         * to pass a valid fd back. */
-        sd->active = session_is_active(s);
-        r = session_device_open(sd, sd->active);
-        if (r < 0) {
-                /* EINVAL _may_ mean a master is active; retry inactive */
-                if (sd->active && r == -EINVAL) {
-                        sd->active = false;
-                        r = session_device_open(sd, false);
+        if (open_device) {
+                /* Open the device for the first time. We need a valid fd to pass back
+                 * to the caller. If the session is not active, this _might_ immediately
+                 * revoke access and thus invalidate the fd. But this is still needed
+                 * to pass a valid fd back. */
+                sd->active = session_is_active(s);
+                r = session_device_open(sd, sd->active);
+                if (r < 0) {
+                        /* EINVAL _may_ mean a master is active; retry inactive */
+                        if (sd->active && r == -EINVAL) {
+                                sd->active = false;
+                                r = session_device_open(sd, false);
+                        }
+                        if (r < 0)
+                                goto error;
                 }
-                if (r < 0)
-                        goto error;
+                sd->fd = r;
         }
-        sd->fd = r;
 
         LIST_PREPEND(sd_by_device, sd->device->session_devices, sd);
 
@@ -435,15 +442,16 @@ void session_device_complete_pause(SessionDevice *sd) {
 void session_device_resume_all(Session *s) {
         SessionDevice *sd;
         Iterator i;
-        int r;
 
         assert(s);
 
         HASHMAP_FOREACH(sd, s->devices, i) {
                 if (!sd->active) {
-                        r = session_device_start(sd);
-                        if (!r)
-                                session_device_notify(sd, SESSION_DEVICE_RESUME);
+                        if (session_device_start(sd) < 0)
+                                continue;
+                        if (session_device_save(sd) < 0)
+                                continue;
+                        session_device_notify(sd, SESSION_DEVICE_RESUME);
                 }
         }
 }
@@ -478,3 +486,36 @@ unsigned int session_device_try_pause_all(Session *s) {
 
         return num_pending;
 }
+
+int session_device_save(SessionDevice *sd) {
+        _cleanup_free_ char *state = NULL;
+        int r;
+
+        assert(sd);
+
+        /* Store device fd in PID1. It will send it back to us on
+         * restart so revocation will continue to work. To make things
+         * simple, send fds for all type of devices even if they don't
+         * support the revocation mechanism so we don't have to handle
+         * them differently later.
+         *
+         * Note: for device supporting revocation, PID1 will drop a
+         * stored fd automatically if the corresponding device is
+         * revoked. */
+        r = asprintf(&state, "FDSTORE=1\n"
+                             "FDNAME=session-%s", sd->session->id);
+        if (r < 0)
+                return -ENOMEM;
+
+        return sd_pid_notify_with_fds(0, false, state, &sd->fd, 1);
+}
+
+void session_device_attach_fd(SessionDevice *sd, int fd, bool active) {
+        assert(fd > 0);
+        assert(sd);
+        assert(sd->fd < 0);
+        assert(!sd->active);
+
+        sd->fd = fd;
+        sd->active = active;
+}
index 7c85035..83aef1e 100644 (file)
@@ -44,10 +44,13 @@ struct SessionDevice {
         LIST_FIELDS(struct SessionDevice, sd_by_device);
 };
 
-int session_device_new(Session *s, dev_t dev, SessionDevice **out);
+int session_device_new(Session *s, dev_t dev, bool open_device, SessionDevice **out);
 void session_device_free(SessionDevice *sd);
 void session_device_complete_pause(SessionDevice *sd);
 
 void session_device_resume_all(Session *s);
 void session_device_pause_all(Session *s);
 unsigned int session_device_try_pause_all(Session *s);
+
+int session_device_save(SessionDevice *sd);
+void session_device_attach_fd(SessionDevice *sd, int fd, bool active);
index b6da237..42dfeca 100644 (file)
@@ -35,7 +35,7 @@
 #include "escape.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "io-util.h"
 #include "logind-session.h"
 #include "mkdir.h"
@@ -62,16 +62,13 @@ Session* session_new(Manager *m, const char *id) {
                 return NULL;
 
         s->state_file = strappend("/run/systemd/sessions/", id);
-        if (!s->state_file) {
-                free(s);
-                return NULL;
-        }
+        if (!s->state_file)
+                return mfree(s);
 
         s->devices = hashmap_new(&devt_hash_ops);
         if (!s->devices) {
                 free(s->state_file);
-                free(s);
-                return NULL;
+                return mfree(s);
         }
 
         s->id = basename(s->state_file);
@@ -79,8 +76,7 @@ Session* session_new(Manager *m, const char *id) {
         if (hashmap_put(m->sessions, s->id, s) < 0) {
                 hashmap_free(s->devices);
                 free(s->state_file);
-                free(s);
-                return NULL;
+                return mfree(s);
         }
 
         s->manager = m;
@@ -156,6 +152,18 @@ void session_set_user(Session *s, User *u) {
         LIST_PREPEND(sessions_by_user, u->sessions, s);
 }
 
+static void session_save_devices(Session *s, FILE *f) {
+        SessionDevice *sd;
+        Iterator i;
+
+        if (!hashmap_isempty(s->devices)) {
+                fprintf(f, "DEVICES=");
+                HASHMAP_FOREACH(sd, s->devices, i)
+                        fprintf(f, "%u:%u ", major(sd->dev), minor(sd->dev));
+                fprintf(f, "\n");
+        }
+}
+
 int session_save(Session *s) {
         _cleanup_free_ char *temp_path = NULL;
         _cleanup_fclose_ FILE *f = NULL;
@@ -285,8 +293,10 @@ int session_save(Session *s) {
                         s->timestamp.realtime,
                         s->timestamp.monotonic);
 
-        if (s->controller)
+        if (s->controller) {
                 fprintf(f, "CONTROLLER=%s\n", s->controller);
+                session_save_devices(s, f);
+        }
 
         r = fflush_and_check(f);
         if (r < 0)
@@ -308,6 +318,43 @@ fail:
         return log_error_errno(r, "Failed to save session data %s: %m", s->state_file);
 }
 
+static int session_load_devices(Session *s, const char *devices) {
+        const char *p;
+        int r = 0;
+
+        assert(s);
+
+        for (p = devices;;) {
+                _cleanup_free_ char *word = NULL;
+                SessionDevice *sd;
+                dev_t dev;
+                int k;
+
+                k = extract_first_word(&p, &word, NULL, 0);
+                if (k == 0)
+                        break;
+                if (k < 0) {
+                        r = k;
+                        break;
+                }
+
+                k = parse_dev(word, &dev);
+                if (k < 0) {
+                        r = k;
+                        continue;
+                }
+
+                /* The file descriptors for loaded devices will be reattached later. */
+                k = session_device_new(s, dev, false, &sd);
+                if (k < 0)
+                        r = k;
+        }
+
+        if (r < 0)
+                log_error_errno(r, "Loading session devices for session %s failed: %m", s->id);
+
+        return r;
+}
 
 int session_load(Session *s) {
         _cleanup_free_ char *remote = NULL,
@@ -321,7 +368,9 @@ int session_load(Session *s) {
                 *uid = NULL,
                 *realtime = NULL,
                 *monotonic = NULL,
-                *controller = NULL;
+                *controller = NULL,
+                *active = NULL,
+                *devices = NULL;
 
         int k, r;
 
@@ -349,6 +398,8 @@ int session_load(Session *s) {
                            "REALTIME",       &realtime,
                            "MONOTONIC",      &monotonic,
                            "CONTROLLER",     &controller,
+                           "ACTIVE",         &active,
+                           "DEVICES",        &devices,
                            NULL);
 
         if (r < 0)
@@ -451,10 +502,17 @@ int session_load(Session *s) {
         if (monotonic)
                 timestamp_deserialize(monotonic, &s->timestamp.monotonic);
 
+        if (active) {
+                k = parse_boolean(active);
+                if (k >= 0)
+                        s->was_active = k;
+        }
+
         if (controller) {
-                if (bus_name_has_owner(s->manager->bus, controller, NULL) > 0)
-                        session_set_controller(s, controller, false);
-                else
+                if (bus_name_has_owner(s->manager->bus, controller, NULL) > 0) {
+                        session_set_controller(s, controller, false, false);
+                        session_load_devices(s, devices);
+                } else
                         session_restore_vt(s);
         }
 
@@ -509,7 +567,7 @@ static int session_start_scope(Session *s) {
                 char *scope, *job = NULL;
                 const char *description;
 
-                scope = strjoin("session-", s->id, ".scope", NULL);
+                scope = strjoin("session-", s->id, ".scope");
                 if (!scope)
                         return log_oom();
 
@@ -565,7 +623,7 @@ int session_start(Session *s) {
                 return r;
 
         log_struct(s->class == SESSION_BACKGROUND ? LOG_DEBUG : LOG_INFO,
-                   LOG_MESSAGE_ID(SD_MESSAGE_SESSION_START),
+                   "MESSAGE_ID=" SD_MESSAGE_SESSION_START_STR,
                    "SESSION_ID=%s", s->id,
                    "USER_ID=%s", s->user->name,
                    "LEADER="PID_FMT, s->leader,
@@ -590,12 +648,10 @@ int session_start(Session *s) {
 
         /* Send signals */
         session_send_signal(s, true);
-        user_send_changed(s->user, "Sessions", "Display", NULL);
+        user_send_changed(s->user, "Display", NULL);
         if (s->seat) {
                 if (s->seat->active == s)
-                        seat_send_changed(s->seat, "Sessions", "ActiveSession", NULL);
-                else
-                        seat_send_changed(s->seat, "Sessions", NULL);
+                        seat_send_changed(s->seat, "ActiveSession", NULL);
         }
 
         return 0;
@@ -611,7 +667,7 @@ static int session_stop_scope(Session *s, bool force) {
                 return 0;
 
         /* Let's always abandon the scope first. This tells systemd that we are not interested anymore, and everything
-         * that is left in in the scope is "left-over". Informing systemd about this has the benefit that it will log
+         * that is left in the scope is "left-over". Informing systemd about this has the benefit that it will log
          * when killing any processes left after this point. */
         r = manager_abandon_scope(s->manager, s->scope, &error);
         if (r < 0)
@@ -672,7 +728,7 @@ int session_finalize(Session *s) {
 
         if (s->started)
                 log_struct(s->class == SESSION_BACKGROUND ? LOG_DEBUG : LOG_INFO,
-                           LOG_MESSAGE_ID(SD_MESSAGE_SESSION_STOP),
+                           "MESSAGE_ID=" SD_MESSAGE_SESSION_STOP_STR,
                            "SESSION_ID=%s", s->id,
                            "USER_ID=%s", s->user->name,
                            "LEADER="PID_FMT, s->leader,
@@ -702,11 +758,10 @@ int session_finalize(Session *s) {
                         seat_set_active(s->seat, NULL);
 
                 seat_save(s->seat);
-                seat_send_changed(s->seat, "Sessions", NULL);
         }
 
         user_save(s->user);
-        user_send_changed(s->user, "Sessions", "Display", NULL);
+        user_send_changed(s->user, "Display", NULL);
 
         return 0;
 }
@@ -1177,7 +1232,7 @@ static int on_bus_track(sd_bus_track *track, void *userdata) {
         return 0;
 }
 
-int session_set_controller(Session *s, const char *sender, bool force) {
+int session_set_controller(Session *s, const char *sender, bool force, bool prepare) {
         _cleanup_free_ char *name = NULL;
         int r;
 
@@ -1209,11 +1264,14 @@ int session_set_controller(Session *s, const char *sender, bool force) {
          * Note that we reset the VT on ReleaseControl() and if the controller
          * exits.
          * If logind crashes/restarts, we restore the controller during restart
-         * or reset the VT in case it crashed/exited, too. */
-        r = session_prepare_vt(s);
-        if (r < 0) {
-                s->track = sd_bus_track_unref(s->track);
-                return r;
+         * (without preparing the VT since the controller has probably overridden
+         * VT state by now) or reset the VT in case it crashed/exited, too. */
+        if (prepare) {
+                r = session_prepare_vt(s);
+                if (r < 0) {
+                        s->track = sd_bus_track_unref(s->track);
+                        return r;
+                }
         }
 
         session_release_controller(s, true);
index ffb7cd2..12b9d86 100644 (file)
@@ -111,6 +111,8 @@ struct Session {
         bool started:1;
         bool stopping:1;
 
+        bool was_active:1;
+
         sd_bus_message *create_message;
 
         sd_event_source *timer_event_source;
@@ -176,7 +178,7 @@ void session_restore_vt(Session *s);
 void session_leave_vt(Session *s);
 
 bool session_is_controller(Session *s, const char *sender);
-int session_set_controller(Session *s, const char *sender, bool force);
+int session_set_controller(Session *s, const char *sender, bool force, bool prepare);
 void session_drop_controller(Session *s);
 
 int bus_session_method_activate(sd_bus_message *message, void *userdata, sd_bus_error *error);
index af6392e..987c630 100644 (file)
@@ -22,7 +22,7 @@
 
 #include "alloc-util.h"
 #include "bus-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "logind-user.h"
 #include "logind.h"
 #include "signal-util.h"
index d4b6e05..1f4a67b 100644 (file)
 #include "bus-common-errors.h"
 #include "bus-error.h"
 #include "bus-util.h"
+#include "cgroup-util.h"
 #include "clean-ipc.h"
 #include "conf-parser.h"
 #include "escape.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "hashmap.h"
 #include "label.h"
@@ -370,7 +371,7 @@ static int user_mkdir_runtime_path(User *u) {
         if (r < 0)
                 return log_error_errno(r, "Failed to create /run/user: %m");
 
-        if (path_is_mount_point(u->runtime_path, 0) <= 0) {
+        if (path_is_mount_point(u->runtime_path, NULL, 0) <= 0) {
                 _cleanup_free_ char *t = NULL;
 
                 (void) mkdir_label(u->runtime_path, 0700);
@@ -386,14 +387,12 @@ static int user_mkdir_runtime_path(User *u) {
 
                 r = mount("tmpfs", u->runtime_path, "tmpfs", MS_NODEV|MS_NOSUID|MS_NOEXEC, t);
                 if (r < 0) {
-                        if (errno != EPERM) {
+                        if (errno != EPERM && errno != EACCES) {
                                 r = log_error_errno(errno, "Failed to mount per-user tmpfs directory %s: %m", u->runtime_path);
                                 goto fail;
                         }
 
-                        /* Lacking permissions, maybe
-                         * CAP_SYS_ADMIN-less container? In this case,
-                         * just use a normal directory. */
+                        log_debug_errno(errno, "Failed to mount per-user tmpfs directory %s, assuming containerized execution, ignoring: %m", u->runtime_path);
 
                         r = chmod_and_chown(u->runtime_path, 0700, u->uid, u->gid);
                         if (r < 0) {
@@ -649,9 +648,14 @@ int user_finalize(User *u) {
         if (k < 0)
                 r = k;
 
-        /* Clean SysV + POSIX IPC objects */
-        if (u->manager->remove_ipc) {
-                k = clean_ipc(u->uid);
+        /* Clean SysV + POSIX IPC objects, but only if this is not a system user. Background: in many setups cronjobs
+         * are run in full PAM and thus logind sessions, even if the code run doesn't belong to actual users but to
+         * system components. Since enable RemoveIPC= globally for all users, we need to be a bit careful with such
+         * cases, as we shouldn't accidentally remove a system service's IPC objects while it is running, just because
+         * a cronjob running as the same user just finished. Hence: exclude system users generally from IPC clean-up,
+         * and do it only for normal users. */
+        if (u->manager->remove_ipc && u->uid > SYSTEM_UID_MAX) {
+                k = clean_ipc_by_uid(u->uid);
                 if (k < 0)
                         r = k;
         }
@@ -928,9 +932,19 @@ int config_parse_user_tasks_max(
         assert(rvalue);
         assert(data);
 
-        /* First, try to parse as percentage */
+        if (isempty(rvalue)) {
+                *m = system_tasks_max_scale(DEFAULT_USER_TASKS_MAX_PERCENTAGE, 100U);
+                return 0;
+        }
+
+        if (streq(rvalue, "infinity")) {
+                *m = CGROUP_LIMIT_MAX;
+                return 0;
+        }
+
+        /* Try to parse as percentage */
         r = parse_percent(rvalue);
-        if (r > 0 && r < 100)
+        if (r >0)
                 k = system_tasks_max_scale(r, 100U);
         else {
 
index 29ab00e..311751c 100644 (file)
@@ -29,7 +29,7 @@
 #include "bus-common-errors.h"
 #include "bus-error.h"
 #include "bus-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "logind.h"
 #include "special.h"
 #include "strv.h"
index 5ce36d2..fb70972 100644 (file)
 #include "def.h"
 #include "dirent-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "logind.h"
 #include "selinux-util.h"
 #include "signal-util.h"
 #include "strv.h"
 #include "udev-util.h"
+#include "cgroup-util.h"
 
 static void manager_free(Manager *m);
 
@@ -62,7 +63,7 @@ static void manager_reset_config(Manager *m) {
         m->idle_action = HANDLE_IGNORE;
 
         m->runtime_dir_size = physical_memory_scale(10U, 100U); /* 10% */
-        m->user_tasks_max = system_tasks_max_scale(33U, 100U); /* 33% */
+        m->user_tasks_max = system_tasks_max_scale(DEFAULT_USER_TASKS_MAX_PERCENTAGE, 100U); /* 33% */
         m->sessions_max = 8192;
         m->inhibitors_max = 8192;
 
@@ -125,7 +126,8 @@ static void manager_free(Manager *m) {
         Inhibitor *i;
         Button *b;
 
-        assert(m);
+        if (!m)
+                return;
 
         while ((session = hashmap_first(m->sessions)))
                 session_free(session);
@@ -407,10 +409,71 @@ static int manager_enumerate_users(Manager *m) {
         return r;
 }
 
+static int manager_attach_fds(Manager *m) {
+        _cleanup_strv_free_ char **fdnames = NULL;
+        int n, i, fd;
+
+        /* Upon restart, PID1 will send us back all fds of session devices
+         * that we previously opened. Each file descriptor is associated
+         * with a given session. The session ids are passed through FDNAMES. */
+
+        n = sd_listen_fds_with_names(true, &fdnames);
+        if (n <= 0)
+                return n;
+
+        for (i = 0; i < n; i++) {
+                struct stat st;
+                SessionDevice *sd;
+                Session *s;
+                char *id;
+
+                fd = SD_LISTEN_FDS_START + i;
+
+                id = startswith(fdnames[i], "session-");
+                if (!id)
+                        continue;
+
+                s = hashmap_get(m->sessions, id);
+                if (!s) {
+                        /* If the session doesn't exist anymore, the associated session
+                         * device attached to this fd doesn't either. Let's simply close
+                         * this fd. */
+                        log_debug("Failed to attach fd for unknown session: %s", id);
+                        close_nointr(fd);
+                        continue;
+                }
+
+                if (fstat(fd, &st) < 0) {
+                        /* The device is allowed to go away at a random point, in which
+                         * case fstat failing is expected. */
+                        log_debug_errno(errno, "Failed to stat device fd for session %s: %m", id);
+                        close_nointr(fd);
+                        continue;
+                }
+
+                sd = hashmap_get(s->devices, &st.st_rdev);
+                if (!sd) {
+                        /* Weird we got an fd for a session device which wasn't
+                        * recorded in the session state file... */
+                        log_warning("Got fd for missing session device [%u:%u] in session %s",
+                                    major(st.st_rdev), minor(st.st_rdev), s->id);
+                        close_nointr(fd);
+                        continue;
+                }
+
+                log_debug("Attaching fd to session device [%u:%u] for session %s",
+                          major(st.st_rdev), minor(st.st_rdev), s->id);
+
+                session_device_attach_fd(sd, fd, s->was_active);
+        }
+
+        return 0;
+}
+
 static int manager_enumerate_sessions(Manager *m) {
         _cleanup_closedir_ DIR *d = NULL;
         struct dirent *de;
-        int r = 0;
+        int r = 0, k;
 
         assert(m);
 
@@ -425,7 +488,6 @@ static int manager_enumerate_sessions(Manager *m) {
 
         FOREACH_DIRENT(de, d, return -errno) {
                 struct Session *s;
-                int k;
 
                 if (!dirent_is_file(de))
                         continue;
@@ -439,7 +501,6 @@ static int manager_enumerate_sessions(Manager *m) {
                 k = manager_add_session(m, de->d_name, &s);
                 if (k < 0) {
                         log_error_errno(k, "Failed to add session by file name %s: %m", de->d_name);
-
                         r = k;
                         continue;
                 }
@@ -451,6 +512,12 @@ static int manager_enumerate_sessions(Manager *m) {
                         r = k;
         }
 
+        /* We might be restarted and PID1 could have sent us back the
+         * session device fds we previously saved. */
+        k = manager_attach_fds(m);
+        if (k < 0)
+                log_warning_errno(k, "Failed to reattach session device fds: %m");
+
         return r;
 }
 
@@ -1001,11 +1068,11 @@ static int manager_dispatch_idle_action(sd_event_source *s, uint64_t t, void *us
 static int manager_parse_config_file(Manager *m) {
         assert(m);
 
-        return config_parse_many(PKGSYSCONFDIR "/logind.conf",
-                                 CONF_PATHS_NULSTR("systemd/logind.conf.d"),
-                                 "Login\0",
-                                 config_item_perf_lookup, logind_gperf_lookup,
-                                 false, m);
+        return config_parse_many_nulstr(PKGSYSCONFDIR "/logind.conf",
+                                        CONF_PATHS_NULSTR("systemd/logind.conf.d"),
+                                        "Login\0",
+                                        config_item_perf_lookup, logind_gperf_lookup,
+                                        false, m);
 }
 
 static int manager_dispatch_reload_signal(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
index 086fa1e..7556ee2 100644 (file)
@@ -182,7 +182,7 @@ int manager_unit_is_active(Manager *manager, const char *unit);
 int manager_job_is_active(Manager *manager, const char *path);
 
 /* gperf lookup function */
-const struct ConfigPerfItem* logind_gperf_lookup(const char *key, unsigned length);
+const struct ConfigPerfItem* logind_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
 
 int manager_set_lid_switch_ignore(Manager *m, usec_t until);
 
diff --git a/src/login/meson.build b/src/login/meson.build
new file mode 100644 (file)
index 0000000..26bdbec
--- /dev/null
@@ -0,0 +1,104 @@
+systemd_logind_sources = files('''
+        logind.c
+        logind.h
+'''.split())
+
+logind_gperf_c = custom_target(
+        'logind_gperf.c',
+        input : 'logind-gperf.gperf',
+        output : 'logind-gperf.c',
+        command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@'])
+
+systemd_logind_sources += [logind_gperf_c]
+
+
+liblogind_core_sources = files('''
+        logind-core.c
+        logind-device.c
+        logind-device.h
+        logind-button.c
+        logind-button.h
+        logind-action.c
+        logind-action.h
+        logind-seat.c
+        logind-seat.h
+        logind-session.c
+        logind-session.h
+        logind-session-device.c
+        logind-session-device.h
+        logind-user.c
+        logind-user.h
+        logind-inhibit.c
+        logind-inhibit.h
+        logind-dbus.c
+        logind-session-dbus.c
+        logind-seat-dbus.c
+        logind-user-dbus.c
+        logind-utmp.c
+        logind-acl.h
+'''.split())
+
+logind_acl_c = files('logind-acl.c')
+if conf.get('HAVE_ACL', false)
+        liblogind_core_sources += logind_acl_c
+endif
+
+liblogind_core = static_library(
+        'logind-core',
+        liblogind_core_sources,
+        include_directories : includes,
+        dependencies : [libacl])
+
+loginctl_sources = files('''
+        loginctl.c
+        sysfs-show.h
+        sysfs-show.c
+'''.split())
+
+if conf.get('ENABLE_LOGIND', false)
+        logind_conf = configure_file(
+                input : 'logind.conf.in',
+                output : 'logind.conf',
+                configuration : substs)
+        install_data(logind_conf,
+                     install_dir : pkgsysconfdir)
+
+        pam_systemd_sym = 'src/login/pam_systemd.sym'
+        pam_systemd_c = files('pam_systemd.c')
+
+        install_data('org.freedesktop.login1.conf',
+                     install_dir : dbuspolicydir)
+        install_data('org.freedesktop.login1.service',
+                     install_dir : dbussystemservicedir)
+
+        custom_target(
+                'org.freedesktop.login1.policy',
+                input : 'org.freedesktop.login1.policy.in',
+                output : 'org.freedesktop.login1.policy',
+                command : intltool_command,
+                install : install_polkit,
+                install_dir : polkitpolicydir)
+
+        install_data('70-power-switch.rules',
+                     '70-uaccess.rules',
+                     install_dir : udevrulesdir)
+
+        foreach file : ['71-seat.rules',
+                        '73-seat-late.rules']
+                gen = configure_file(
+                        input : file + '.in',
+                        output : file,
+                        configuration : substs)
+                install_data(gen,
+                             install_dir : udevrulesdir)
+        endforeach
+
+        custom_target(
+                'systemd-user',
+                input : 'systemd-user.m4',
+                output: 'systemd-user',
+                command : [m4, '-P'] + m4_defines + ['@INPUT@'],
+                capture : true,
+                install : pamconfdir != 'no',
+                install_dir : pamconfdir)
+endif
index 4f02364..a670ad1 100644 (file)
@@ -36,7 +36,7 @@
 #include "def.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "hostname-util.h"
 #include "login-util.h"
 #include "macro.h"
index f188a8e..4f85b4b 100644 (file)
@@ -2,11 +2,11 @@
 #
 # Used by systemd --user instances.
 
-account  include system-auth
-
+account required pam_unix.so
 m4_ifdef(`HAVE_SELINUX',
-session  required pam_selinux.so close
-session  required pam_selinux.so nottys open
+session required pam_selinux.so close
+session required pam_selinux.so nottys open
 )m4_dnl
-session  required pam_loginuid.so
-session  include system-auth
+session required pam_loginuid.so
+session optional pam_keyinit.so force revoke
+session optional pam_systemd.so
index cc9b1b3..2244b1c 100644 (file)
@@ -22,6 +22,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include "id128-util.h"
 #include "log.h"
 #include "machine-id-setup.h"
 #include "path-util.h"
@@ -118,11 +119,14 @@ int main(int argc, char *argv[]) {
                 goto finish;
 
         if (arg_commit) {
+                const char *etc_machine_id;
+
                 r = machine_id_commit(arg_root);
                 if (r < 0)
                         goto finish;
 
-                r = sd_id128_get_machine(&id);
+                etc_machine_id = prefix_roota(arg_root, "/etc/machine-id");
+                r = id128_read(etc_machine_id, ID128_PLAIN, &id);
                 if (r < 0) {
                         log_error_errno(r, "Failed to read machine ID back: %m");
                         goto finish;
index 867bbc4..18e0e34 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+#include <sys/file.h>
+#include <sys/mount.h>
+
 #include "alloc-util.h"
 #include "bus-label.h"
 #include "bus-util.h"
+#include "copy.h"
+#include "dissect-image.h"
 #include "fd-util.h"
+#include "fileio.h"
+#include "fs-util.h"
 #include "image-dbus.h"
 #include "io-util.h"
+#include "loop-util.h"
 #include "machine-image.h"
+#include "mount-util.h"
 #include "process-util.h"
+#include "raw-clone.h"
 #include "strv.h"
 #include "user-util.h"
 
@@ -279,6 +289,160 @@ int bus_image_method_set_limit(
         return sd_bus_reply_method_return(message, NULL);
 }
 
+#define EXIT_NOT_FOUND 2
+
+static int directory_image_get_os_release(Image *image, char ***ret, sd_bus_error *error) {
+
+        _cleanup_free_ char *path = NULL;
+        int r;
+
+        assert(image);
+        assert(ret);
+
+        r = chase_symlinks("/etc/os-release", image->path, CHASE_PREFIX_ROOT, &path);
+        if (r == -ENOENT)
+                r = chase_symlinks("/usr/lib/os-release", image->path, CHASE_PREFIX_ROOT, &path);
+        if (r == -ENOENT)
+                return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Image does not contain OS release information");
+        if (r < 0)
+                return sd_bus_error_set_errnof(error, r, "Failed to resolve %s: %m", image->path);
+
+        r = load_env_file_pairs(NULL, path, NULL, ret);
+        if (r < 0)
+                return sd_bus_error_set_errnof(error, r, "Failed to open %s: %m", path);
+
+        return 0;
+}
+
+static int raw_image_get_os_release(Image *image, char ***ret, sd_bus_error *error) {
+        _cleanup_(rmdir_and_freep) char *t = NULL;
+        _cleanup_(loop_device_unrefp) LoopDevice *d = NULL;
+        _cleanup_(dissected_image_unrefp) DissectedImage *m = NULL;
+        _cleanup_(sigkill_waitp) pid_t child = 0;
+        _cleanup_close_pair_ int pair[2] = { -1, -1 };
+        _cleanup_fclose_ FILE *f = NULL;
+        _cleanup_strv_free_ char **v = NULL;
+        siginfo_t si;
+        int r;
+
+        assert(image);
+        assert(ret);
+
+        r = mkdtemp_malloc("/tmp/machined-root-XXXXXX", &t);
+        if (r < 0)
+                return sd_bus_error_set_errnof(error, r, "Failed to create temporary directory: %m");
+
+        r = loop_device_make_by_path(image->path, O_RDONLY, &d);
+        if (r < 0)
+                return sd_bus_error_set_errnof(error, r, "Failed to set up loop block device for %s: %m", image->path);
+
+        r = dissect_image(d->fd, NULL, 0, DISSECT_IMAGE_REQUIRE_ROOT, &m);
+        if (r == -ENOPKG)
+                return sd_bus_error_set_errnof(error, r, "Disk image %s not understood: %m", image->path);
+        if (r < 0)
+                return sd_bus_error_set_errnof(error, r, "Failed to dissect image %s: %m", image->path);
+
+        if (pipe2(pair, O_CLOEXEC) < 0)
+                return sd_bus_error_set_errnof(error, errno, "Failed to create communication pipe: %m");
+
+        child = raw_clone(SIGCHLD|CLONE_NEWNS);
+        if (child < 0)
+                return sd_bus_error_set_errnof(error, errno, "Failed to fork(): %m");
+
+        if (child == 0) {
+                int fd;
+
+                pair[0] = safe_close(pair[0]);
+
+                /* Make sure we never propagate to the host */
+                if (mount(NULL, "/", NULL, MS_SLAVE | MS_REC, NULL) < 0)
+                        _exit(EXIT_FAILURE);
+
+                r = dissected_image_mount(m, t, DISSECT_IMAGE_READ_ONLY);
+                if (r < 0)
+                        _exit(EXIT_FAILURE);
+
+                r = mount_move_root(t);
+                if (r < 0)
+                        _exit(EXIT_FAILURE);
+
+                fd = open("/etc/os-release", O_RDONLY|O_CLOEXEC|O_NOCTTY);
+                if (fd < 0 && errno == ENOENT) {
+                        fd = open("/usr/lib/os-release", O_RDONLY|O_CLOEXEC|O_NOCTTY);
+                        if (fd < 0 && errno == ENOENT)
+                                _exit(EXIT_NOT_FOUND);
+                }
+                if (fd < 0)
+                        _exit(EXIT_FAILURE);
+
+                r = copy_bytes(fd, pair[1], (uint64_t) -1, 0);
+                if (r < 0)
+                        _exit(EXIT_FAILURE);
+
+                _exit(EXIT_SUCCESS);
+        }
+
+        pair[1] = safe_close(pair[1]);
+
+        f = fdopen(pair[0], "re");
+        if (!f)
+                return -errno;
+
+        pair[0] = -1;
+
+        r = load_env_file_pairs(f, "os-release", NULL, &v);
+        if (r < 0)
+                return r;
+
+        r = wait_for_terminate(child, &si);
+        if (r < 0)
+                return sd_bus_error_set_errnof(error, r, "Failed to wait for child: %m");
+        child = 0;
+        if (si.si_code == CLD_EXITED && si.si_status == EXIT_NOT_FOUND)
+                return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Image does not contain OS release information");
+        if (si.si_code != CLD_EXITED || si.si_status != EXIT_SUCCESS)
+                return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Child died abnormally.");
+
+        *ret = v;
+        v = NULL;
+
+        return 0;
+}
+
+int bus_image_method_get_os_release(
+                sd_bus_message *message,
+                void *userdata,
+                sd_bus_error *error) {
+
+        _cleanup_release_lock_file_ LockFile tree_global_lock = LOCK_FILE_INIT, tree_local_lock = LOCK_FILE_INIT;
+        _cleanup_strv_free_ char **v = NULL;
+        Image *image = userdata;
+        int r;
+
+        r = image_path_lock(image->path, LOCK_SH|LOCK_NB, &tree_global_lock, &tree_local_lock);
+        if (r < 0)
+                return sd_bus_error_set_errnof(error, r, "Failed to lock image: %m");
+
+        switch (image->type) {
+
+        case IMAGE_DIRECTORY:
+        case IMAGE_SUBVOLUME:
+                r = directory_image_get_os_release(image, &v, error);
+                break;
+
+        case IMAGE_RAW:
+                r = raw_image_get_os_release(image, &v, error);
+                break;
+
+        default:
+                assert_not_reached("Unknown image type");
+        }
+        if (r < 0)
+                return r;
+
+        return bus_reply_pair_array(message, v);
+}
+
 const sd_bus_vtable image_vtable[] = {
         SD_BUS_VTABLE_START(0),
         SD_BUS_PROPERTY("Name", "s", NULL, offsetof(Image, name), 0),
@@ -296,6 +460,7 @@ const sd_bus_vtable image_vtable[] = {
         SD_BUS_METHOD("Clone", "sb", NULL, bus_image_method_clone, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("MarkReadOnly", "b", NULL, bus_image_method_mark_read_only, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("SetLimit", "t", NULL, bus_image_method_set_limit, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("GetOSRelease", NULL, "a{ss}", bus_image_method_get_os_release, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_VTABLE_END
 };
 
index b62da99..bc8a6c3 100644 (file)
@@ -33,3 +33,4 @@ int bus_image_method_rename(sd_bus_message *message, void *userdata, sd_bus_erro
 int bus_image_method_clone(sd_bus_message *message, void *userdata, sd_bus_error *error);
 int bus_image_method_mark_read_only(sd_bus_message *message, void *userdata, sd_bus_error *error);
 int bus_image_method_set_limit(sd_bus_message *message, void *userdata, sd_bus_error *error);
+int bus_image_method_get_os_release(sd_bus_message *message, void *userdata, sd_bus_error *error);
index ba7ac04..36568b6 100644 (file)
@@ -37,7 +37,7 @@
 #include "env-util.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "in-addr-util.h"
 #include "local-addresses.h"
 #include "terminal-util.h"
 #include "user-util.h"
 
-static int property_get_id(
-                sd_bus *bus,
-                const char *path,
-                const char *interface,
-                const char *property,
-                sd_bus_message *reply,
-                void *userdata,
-                sd_bus_error *error) {
-
-        Machine *m = userdata;
-
-        assert(bus);
-        assert(reply);
-        assert(m);
-
-        return sd_bus_message_append_array(reply, 'y', &m->id, 16);
-}
-
 static int property_get_state(
                 sd_bus *bus,
                 const char *path,
@@ -374,11 +356,11 @@ int bus_machine_method_get_addresses(sd_bus_message *message, void *userdata, sd
         return sd_bus_send(NULL, reply, NULL);
 }
 
+#define EXIT_NOT_FOUND 2
+
 int bus_machine_method_get_os_release(sd_bus_message *message, void *userdata, sd_bus_error *error) {
-        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
         _cleanup_strv_free_ char **l = NULL;
         Machine *m = userdata;
-        char **k, **v;
         int r;
 
         assert(message);
@@ -412,7 +394,7 @@ int bus_machine_method_get_os_release(sd_bus_message *message, void *userdata, s
                         return sd_bus_error_set_errnof(error, errno, "Failed to fork(): %m");
 
                 if (child == 0) {
-                        _cleanup_close_ int fd = -1;
+                        int fd = -1;
 
                         pair[0] = safe_close(pair[0]);
 
@@ -420,14 +402,16 @@ int bus_machine_method_get_os_release(sd_bus_message *message, void *userdata, s
                         if (r < 0)
                                 _exit(EXIT_FAILURE);
 
-                        fd = open("/etc/os-release", O_RDONLY|O_CLOEXEC);
-                        if (fd < 0) {
-                                fd = open("/usr/lib/os-release", O_RDONLY|O_CLOEXEC);
-                                if (fd < 0)
-                                        _exit(EXIT_FAILURE);
+                        fd = open("/etc/os-release", O_RDONLY|O_CLOEXEC|O_NOCTTY);
+                        if (fd < 0 && errno == ENOENT) {
+                                fd = open("/usr/lib/os-release", O_RDONLY|O_CLOEXEC|O_NOCTTY);
+                                if (fd < 0 && errno == ENOENT)
+                                        _exit(EXIT_NOT_FOUND);
                         }
+                        if (fd < 0)
+                                _exit(EXIT_FAILURE);
 
-                        r = copy_bytes(fd, pair[1], (uint64_t) -1, false);
+                        r = copy_bytes(fd, pair[1], (uint64_t) -1, 0);
                         if (r < 0)
                                 _exit(EXIT_FAILURE);
 
@@ -449,6 +433,8 @@ int bus_machine_method_get_os_release(sd_bus_message *message, void *userdata, s
                 r = wait_for_terminate(child, &si);
                 if (r < 0)
                         return sd_bus_error_set_errnof(error, r, "Failed to wait for child: %m");
+                if (si.si_code == CLD_EXITED && si.si_status == EXIT_NOT_FOUND)
+                        return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Machine does not contain OS release information");
                 if (si.si_code != CLD_EXITED || si.si_status != EXIT_SUCCESS)
                         return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Child died abnormally.");
 
@@ -459,25 +445,7 @@ int bus_machine_method_get_os_release(sd_bus_message *message, void *userdata, s
                 return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Requesting OS release data is only supported on container machines.");
         }
 
-        r = sd_bus_message_new_method_return(message, &reply);
-        if (r < 0)
-                return r;
-
-        r = sd_bus_message_open_container(reply, 'a', "{ss}");
-        if (r < 0)
-                return r;
-
-        STRV_FOREACH_PAIR(k, v, l) {
-                r = sd_bus_message_append(reply, "{ss}", *k, *v);
-                if (r < 0)
-                        return r;
-        }
-
-        r = sd_bus_message_close_container(reply);
-        if (r < 0)
-                return r;
-
-        return sd_bus_send(NULL, reply, NULL);
+        return bus_reply_pair_array(message, l);
 }
 
 int bus_machine_method_open_pty(sd_bus_message *message, void *userdata, sd_bus_error *error) {
@@ -873,6 +841,7 @@ int bus_machine_method_bind_mount(sd_bus_message *message, void *userdata, sd_bu
         int read_only, make_directory;
         pid_t child;
         siginfo_t si;
+        uid_t uid;
         int r;
 
         assert(message);
@@ -907,6 +876,12 @@ int bus_machine_method_bind_mount(sd_bus_message *message, void *userdata, sd_bu
         if (r == 0)
                 return 1; /* Will call us back */
 
+        r = machine_get_uid_shift(m, &uid);
+        if (r < 0)
+                return r;
+        if (uid != 0)
+                return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Can't bind mount on container with user namespacing applied.");
+
         /* One day, when bind mounting /proc/self/fd/n works across
          * namespace boundaries we should rework this logic to make
          * use of it... */
@@ -1087,10 +1062,12 @@ finish:
 int bus_machine_method_copy(sd_bus_message *message, void *userdata, sd_bus_error *error) {
         const char *src, *dest, *host_path, *container_path, *host_basename, *host_dirname, *container_basename, *container_dirname;
         _cleanup_close_pair_ int errno_pipe_fd[2] = { -1, -1 };
+        CopyFlags copy_flags = COPY_REFLINK|COPY_MERGE;
         _cleanup_close_ int hostfd = -1;
         Machine *m = userdata;
         bool copy_from;
         pid_t child;
+        uid_t uid_shift;
         char *t;
         int r;
 
@@ -1129,6 +1106,10 @@ int bus_machine_method_copy(sd_bus_message *message, void *userdata, sd_bus_erro
         if (r == 0)
                 return 1; /* Will call us back */
 
+        r = machine_get_uid_shift(m, &uid_shift);
+        if (r < 0)
+                return r;
+
         copy_from = strstr(sd_bus_message_get_member(message), "CopyFrom");
 
         if (copy_from) {
@@ -1183,10 +1164,13 @@ int bus_machine_method_copy(sd_bus_message *message, void *userdata, sd_bus_erro
                         goto child_fail;
                 }
 
+                /* Run the actual copy operation. Note that when an UID shift is set we'll either clamp the UID/GID to
+                 * 0 or to the actual UID shift depending on the direction we copy. If no UID shift is set we'll copy
+                 * the UID/GIDs as they are. */
                 if (copy_from)
-                        r = copy_tree_at(containerfd, container_basename, hostfd, host_basename, true);
+                        r = copy_tree_at(containerfd, container_basename, hostfd, host_basename, uid_shift == 0 ? UID_INVALID : 0, uid_shift == 0 ? GID_INVALID : 0, copy_flags);
                 else
-                        r = copy_tree_at(hostfd, host_basename, containerfd, container_basename, true);
+                        r = copy_tree_at(hostfd, host_basename, containerfd, container_basename, uid_shift == 0 ? UID_INVALID : uid_shift, uid_shift == 0 ? GID_INVALID : uid_shift, copy_flags);
 
                 hostfd = safe_close(hostfd);
                 containerfd = safe_close(containerfd);
@@ -1308,10 +1292,36 @@ int bus_machine_method_open_root_directory(sd_bus_message *message, void *userda
         return sd_bus_reply_method_return(message, "h", fd);
 }
 
+int bus_machine_method_get_uid_shift(sd_bus_message *message, void *userdata, sd_bus_error *error) {
+        Machine *m = userdata;
+        uid_t shift = 0;
+        int r;
+
+        assert(message);
+        assert(m);
+
+        /* You wonder why this is a method and not a property? Well, properties are not supposed to return errors, but
+         * we kinda have to for this. */
+
+        if (m->class == MACHINE_HOST)
+                return sd_bus_reply_method_return(message, "u", UINT32_C(0));
+
+        if (m->class != MACHINE_CONTAINER)
+                return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "UID/GID shift may only be determined for container machines.");
+
+        r = machine_get_uid_shift(m, &shift);
+        if (r == -ENXIO)
+                return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Machine %s uses a complex UID/GID mapping, cannot determine shift", m->name);
+        if (r < 0)
+                return r;
+
+        return sd_bus_reply_method_return(message, "u", (uint32_t) shift);
+}
+
 const sd_bus_vtable machine_vtable[] = {
         SD_BUS_VTABLE_START(0),
         SD_BUS_PROPERTY("Name", "s", NULL, offsetof(Machine, name), SD_BUS_VTABLE_PROPERTY_CONST),
-        SD_BUS_PROPERTY("Id", "ay", property_get_id, 0, SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("Id", "ay", bus_property_get_id128, offsetof(Machine, id), SD_BUS_VTABLE_PROPERTY_CONST),
         BUS_PROPERTY_DUAL_TIMESTAMP("Timestamp", offsetof(Machine, timestamp), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("Service", "s", NULL, offsetof(Machine, service), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("Unit", "s", NULL, offsetof(Machine, unit), SD_BUS_VTABLE_PROPERTY_CONST),
@@ -1325,6 +1335,7 @@ const sd_bus_vtable machine_vtable[] = {
         SD_BUS_METHOD("Kill", "si", NULL, bus_machine_method_kill, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("GetAddresses", NULL, "a(iay)", bus_machine_method_get_addresses, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("GetOSRelease", NULL, "a{ss}", bus_machine_method_get_os_release, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("GetUIDShift", NULL, "u", bus_machine_method_get_uid_shift, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("OpenPTY", NULL, "hs", bus_machine_method_open_pty, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("OpenLogin", NULL, "hs", bus_machine_method_open_login, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("OpenShell", "ssasas", "hs", bus_machine_method_open_shell, SD_BUS_VTABLE_UNPRIVILEGED),
index 241b23c..2aa7b4c 100644 (file)
@@ -39,6 +39,9 @@ int bus_machine_method_open_shell(sd_bus_message *message, void *userdata, sd_bu
 int bus_machine_method_bind_mount(sd_bus_message *message, void *userdata, sd_bus_error *error);
 int bus_machine_method_copy(sd_bus_message *message, void *userdata, sd_bus_error *error);
 int bus_machine_method_open_root_directory(sd_bus_message *message, void *userdata, sd_bus_error *error);
+int bus_machine_method_get_uid_shift(sd_bus_message *message, void *userdata, sd_bus_error *error);
 
 int machine_send_signal(Machine *m, bool new_machine);
 int machine_send_create_reply(Machine *m, sd_bus_error *error);
+
+int bus_reply_pair_array(sd_bus_message *m, char **l);
index dd046d6..d3433d9 100644 (file)
@@ -30,7 +30,7 @@
 #include "extract-word.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "hashmap.h"
 #include "machine-dbus.h"
 #include "machine.h"
@@ -38,6 +38,7 @@
 #include "parse-util.h"
 #include "process-util.h"
 #include "special.h"
+#include "stdio-util.h"
 #include "string-table.h"
 #include "terminal-util.h"
 #include "unit-name.h"
@@ -80,9 +81,7 @@ Machine* machine_new(Manager *manager, MachineClass class, const char *name) {
 fail:
         free(m->state_file);
         free(m->name);
-        free(m);
-
-        return NULL;
+        return mfree(m);
 }
 
 void machine_free(Machine *m) {
@@ -357,7 +356,7 @@ static int machine_start_scope(Machine *m, sd_bus_message *properties, sd_bus_er
                 if (!escaped)
                         return log_oom();
 
-                scope = strjoin("machine-", escaped, ".scope", NULL);
+                scope = strjoin("machine-", escaped, ".scope");
                 if (!scope)
                         return log_oom();
 
@@ -403,7 +402,7 @@ int machine_start(Machine *m, sd_bus_message *properties, sd_bus_error *error) {
                 return r;
 
         log_struct(LOG_INFO,
-                   LOG_MESSAGE_ID(SD_MESSAGE_MACHINE_START),
+                   "MESSAGE_ID=" SD_MESSAGE_MACHINE_START_STR,
                    "NAME=%s", m->name,
                    "LEADER="PID_FMT, m->leader,
                    LOG_MESSAGE("New machine %s.", m->name),
@@ -466,7 +465,7 @@ int machine_finalize(Machine *m) {
 
         if (m->started)
                 log_struct(LOG_INFO,
-                           LOG_MESSAGE_ID(SD_MESSAGE_MACHINE_STOP),
+                           "MESSAGE_ID=" SD_MESSAGE_MACHINE_STOP_STR,
                            "NAME=%s", m->name,
                            "LEADER="PID_FMT, m->leader,
                            LOG_MESSAGE("Machine %s terminated.", m->name),
@@ -606,6 +605,96 @@ void machine_release_unit(Machine *m) {
         m->unit = mfree(m->unit);
 }
 
+int machine_get_uid_shift(Machine *m, uid_t *ret) {
+        char p[strlen("/proc//uid_map") + DECIMAL_STR_MAX(pid_t) + 1];
+        uid_t uid_base, uid_shift, uid_range;
+        gid_t gid_base, gid_shift, gid_range;
+        _cleanup_fclose_ FILE *f = NULL;
+        int k;
+
+        assert(m);
+        assert(ret);
+
+        /* Return the base UID/GID of the specified machine. Note that this only works for containers with simple
+         * mappings. In most cases setups should be simple like this, and administrators should only care about the
+         * basic offset a container has relative to the host. This is what this function exposes.
+         *
+         * If we encounter any more complex mappings we politely refuse this with ENXIO. */
+
+        if (m->class == MACHINE_HOST) {
+                *ret = 0;
+                return 0;
+        }
+
+        if (m->class != MACHINE_CONTAINER)
+                return -EOPNOTSUPP;
+
+        xsprintf(p, "/proc/" PID_FMT "/uid_map", m->leader);
+        f = fopen(p, "re");
+        if (!f) {
+                if (errno == ENOENT) {
+                        /* If the file doesn't exist, user namespacing is off in the kernel, return a zero mapping hence. */
+                        *ret = 0;
+                        return 0;
+                }
+
+                return -errno;
+        }
+
+        /* Read the first line. There's at least one. */
+        errno = 0;
+        k = fscanf(f, UID_FMT " " UID_FMT " " UID_FMT "\n", &uid_base, &uid_shift, &uid_range);
+        if (k != 3) {
+                if (ferror(f))
+                        return -errno;
+
+                return -EBADMSG;
+        }
+
+        /* Not a mapping starting at 0? Then it's a complex mapping we can't expose here. */
+        if (uid_base != 0)
+                return -ENXIO;
+        /* Insist that at least the nobody user is mapped, everything else is weird, and hence complex, and we don't support it */
+        if (uid_range < (uid_t) 65534U)
+                return -ENXIO;
+
+        /* If there's more than one line, then we don't support this mapping. */
+        if (fgetc(f) != EOF)
+                return -ENXIO;
+
+        fclose(f);
+
+        xsprintf(p, "/proc/" PID_FMT "/gid_map", m->leader);
+        f = fopen(p, "re");
+        if (!f)
+                return -errno;
+
+        /* Read the first line. There's at least one. */
+        errno = 0;
+        k = fscanf(f, GID_FMT " " GID_FMT " " GID_FMT "\n", &gid_base, &gid_shift, &gid_range);
+        if (k != 3) {
+                if (ferror(f))
+                        return -errno;
+
+                return -EBADMSG;
+        }
+
+        /* If there's more than one line, then we don't support this file. */
+        if (fgetc(f) != EOF)
+                return -ENXIO;
+
+        /* If the UID and GID mapping doesn't match, we don't support this mapping. */
+        if (uid_base != (uid_t) gid_base)
+                return -ENXIO;
+        if (uid_shift != (uid_t) gid_shift)
+                return -ENXIO;
+        if (uid_range != (uid_t) gid_range)
+                return -ENXIO;
+
+        *ret = uid_shift;
+        return 0;
+}
+
 static const char* const machine_class_table[_MACHINE_CLASS_MAX] = {
         [MACHINE_CONTAINER] = "container",
         [MACHINE_VM] = "vm",
index e5d7536..6bdb204 100644 (file)
@@ -108,3 +108,5 @@ KillWho kill_who_from_string(const char *s) _pure_;
 
 int machine_openpt(Machine *m, int flags);
 int machine_open_terminal(Machine *m, const char *path, int mode);
+
+int machine_get_uid_shift(Machine *m, uid_t *ret);
index ddec6cb..a385e68 100644 (file)
@@ -60,6 +60,9 @@
 #include "util.h"
 #include "verbs.h"
 #include "web-util.h"
+#include "stdio-util.h"
+
+#define ALL_IP_ADDRESSES -1
 
 static char **arg_property = NULL;
 static bool arg_all = false;
@@ -82,6 +85,9 @@ static ImportVerify arg_verify = IMPORT_VERIFY_SIGNATURE;
 static const char* arg_format = NULL;
 static const char *arg_uid = NULL;
 static char **arg_setenv = NULL;
+static int arg_addrs = 1;
+
+static int print_addresses(sd_bus *bus, const char *name, int, const char *pr1, const char *pr2, int n_addr);
 
 static void polkit_agent_open_if_enabled(void) {
 
@@ -109,6 +115,8 @@ typedef struct MachineInfo {
         const char *name;
         const char *class;
         const char *service;
+        char *os;
+        char *version_id;
 } MachineInfo;
 
 static int compare_machine_info(const void *a, const void *b) {
@@ -117,12 +125,93 @@ static int compare_machine_info(const void *a, const void *b) {
         return strcmp(x->name, y->name);
 }
 
+static void clean_machine_info(MachineInfo *machines, size_t n_machines) {
+        size_t i;
+
+        if (!machines || n_machines == 0)
+                return;
+
+        for (i = 0; i < n_machines; i++) {
+                free(machines[i].os);
+                free(machines[i].version_id);
+        }
+        free(machines);
+}
+
+static int call_get_os_release(sd_bus *bus, const char *method, const char *name, const char *query, ...) {
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+        const char *k, *v, *iter, **query_res = NULL;
+        size_t count = 0, awaited_args = 0;
+        va_list ap;
+        int r;
+
+        assert(bus);
+        assert(name);
+        assert(query);
+
+        NULSTR_FOREACH(iter, query)
+                awaited_args++;
+        query_res = newa0(const char *, awaited_args);
+
+        r = sd_bus_call_method(
+                        bus,
+                        "org.freedesktop.machine1",
+                        "/org/freedesktop/machine1",
+                        "org.freedesktop.machine1.Manager",
+                        method,
+                        NULL, &reply, "s", name);
+        if (r < 0)
+                return r;
+
+        r = sd_bus_message_enter_container(reply, 'a', "{ss}");
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        while ((r = sd_bus_message_read(reply, "{ss}", &k, &v)) > 0) {
+                count = 0;
+                NULSTR_FOREACH(iter, query) {
+                        if (streq(k, iter)) {
+                                query_res[count] = v;
+                                break;
+                        }
+                        count++;
+                }
+        }
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        r = sd_bus_message_exit_container(reply);
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        va_start(ap, query);
+        for (count = 0; count < awaited_args; count++) {
+                char *val, **out;
+
+                out = va_arg(ap, char **);
+                assert(out);
+                if (query_res[count]) {
+                        val = strdup(query_res[count]);
+                        if (!val) {
+                                va_end(ap);
+                                return -ENOMEM;
+                        }
+                        *out = val;
+                }
+        }
+        va_end(ap);
+
+        return 0;
+}
+
 static int list_machines(int argc, char *argv[], void *userdata) {
 
-        size_t max_name = strlen("MACHINE"), max_class = strlen("CLASS"), max_service = strlen("SERVICE");
+        size_t max_name = strlen("MACHINE"), max_class = strlen("CLASS"),
+               max_service = strlen("SERVICE"), max_os = strlen("OS"), max_version_id = strlen("VERSION");
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
-        _cleanup_free_ MachineInfo *machines = NULL;
+        _cleanup_free_ char *prefix = NULL;
+        MachineInfo *machines = NULL;
         const char *name, *class, *service, *object;
         size_t n_machines = 0, n_allocated = 0, j;
         sd_bus *bus = userdata;
@@ -148,20 +237,30 @@ static int list_machines(int argc, char *argv[], void *userdata) {
         r = sd_bus_message_enter_container(reply, 'a', "(ssso)");
         if (r < 0)
                 return bus_log_parse_error(r);
-
         while ((r = sd_bus_message_read(reply, "(ssso)", &name, &class, &service, &object)) > 0) {
                 size_t l;
 
                 if (name[0] == '.' && !arg_all)
                         continue;
 
-                if (!GREEDY_REALLOC(machines, n_allocated, n_machines + 1))
-                        return log_oom();
+                if (!GREEDY_REALLOC0(machines, n_allocated, n_machines + 1)) {
+                        r = log_oom();
+                        goto out;
+                }
 
                 machines[n_machines].name = name;
                 machines[n_machines].class = class;
                 machines[n_machines].service = service;
 
+                (void) call_get_os_release(
+                                bus,
+                                "GetMachineOSRelease",
+                                name,
+                                "ID\0"
+                                "VERSION_ID\0",
+                                &machines[n_machines].os,
+                                &machines[n_machines].version_id);
+
                 l = strlen(name);
                 if (l > max_name)
                         max_name = l;
@@ -174,33 +273,77 @@ static int list_machines(int argc, char *argv[], void *userdata) {
                 if (l > max_service)
                         max_service = l;
 
+                l = machines[n_machines].os ? strlen(machines[n_machines].os) : 1;
+                if (l > max_os)
+                        max_os = l;
+
+                l = machines[n_machines].version_id ? strlen(machines[n_machines].version_id) : 1;
+                if (l > max_version_id)
+                        max_version_id = l;
+
                 n_machines++;
         }
-        if (r < 0)
-                return bus_log_parse_error(r);
+        if (r < 0) {
+                r = bus_log_parse_error(r);
+                goto out;
+        }
 
         r = sd_bus_message_exit_container(reply);
-        if (r < 0)
-                return bus_log_parse_error(r);
+        if (r < 0) {
+                r = bus_log_parse_error(r);
+                goto out;
+        }
 
         qsort_safe(machines, n_machines, sizeof(MachineInfo), compare_machine_info);
 
-        if (arg_legend)
-                printf("%-*s %-*s %-*s\n",
+        /* Allocate for prefix max characters for all fields + spaces between them + strlen(",\n") */
+        r = asprintf(&prefix, "%-*s",
+                        (int) (max_name +
+                        max_class +
+                        max_service +
+                        max_os +
+                        max_version_id + 5 + strlen(",\n")),
+                        ",\n");
+        if (r < 0) {
+                r = log_oom();
+                goto out;
+        }
+
+        if (arg_legend && n_machines > 0)
+                printf("%-*s %-*s %-*s %-*s %-*s %s\n",
                        (int) max_name, "MACHINE",
                        (int) max_class, "CLASS",
-                       (int) max_service, "SERVICE");
+                       (int) max_service, "SERVICE",
+                       (int) max_os, "OS",
+                       (int) max_version_id, "VERSION",
+                       "ADDRESSES");
 
-        for (j = 0; j < n_machines; j++)
-                printf("%-*s %-*s %-*s\n",
+        for (j = 0; j < n_machines; j++) {
+                printf("%-*s %-*s %-*s %-*s %-*s ",
                        (int) max_name, machines[j].name,
                        (int) max_class, machines[j].class,
-                       (int) max_service, machines[j].service);
+                       (int) max_service, strdash_if_empty(machines[j].service),
+                       (int) max_os, strdash_if_empty(machines[j].os),
+                       (int) max_version_id, strdash_if_empty(machines[j].version_id));
+
+                r = print_addresses(bus, machines[j].name, 0, "", prefix, arg_addrs);
+                if (r <= 0) /* error or no addresses defined? */
+                        fputs("-\n", stdout);
+                else
+                        fputc('\n', stdout);
+        }
 
-        if (arg_legend)
-                printf("\n%zu machines listed.\n", n_machines);
+        if (arg_legend) {
+                if (n_machines > 0)
+                        printf("\n%zu machines listed.\n", n_machines);
+                else
+                        printf("No machines.\n");
+        }
 
-        return 0;
+        r = 0;
+out:
+        clean_machine_info(machines, n_machines);
+        return r;
 }
 
 typedef struct ImageInfo {
@@ -305,7 +448,7 @@ static int list_images(int argc, char *argv[], void *userdata) {
 
         qsort_safe(images, n_images, sizeof(ImageInfo), compare_image_info);
 
-        if (arg_legend)
+        if (arg_legend && n_images > 0)
                 printf("%-*s %-*s %-3s %-*s %-*s %-*s\n",
                        (int) max_name, "NAME",
                        (int) max_type, "TYPE",
@@ -326,42 +469,28 @@ static int list_images(int argc, char *argv[], void *userdata) {
                        (int) max_mtime, strna(format_timestamp(mtime_buf, sizeof(mtime_buf), images[j].mtime)));
         }
 
-        if (arg_legend)
-                printf("\n%zu images listed.\n", n_images);
+        if (arg_legend) {
+                if (n_images > 0)
+                        printf("\n%zu images listed.\n", n_images);
+                else
+                        printf("No images.\n");
+        }
 
         return 0;
 }
 
 static int show_unit_cgroup(sd_bus *bus, const char *unit, pid_t leader) {
+        _cleanup_free_ char *cgroup = NULL;
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
-        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
-        _cleanup_free_ char *path = NULL;
-        const char *cgroup;
         int r;
         unsigned c;
 
         assert(bus);
         assert(unit);
 
-        path = unit_dbus_path_from_name(unit);
-        if (!path)
-                return log_oom();
-
-        r = sd_bus_get_property(
-                        bus,
-                        "org.freedesktop.systemd1",
-                        path,
-                        unit_dbus_interface_from_name(unit),
-                        "ControlGroup",
-                        &error,
-                        &reply,
-                        "s");
+        r = show_cgroup_get_unit_path_and_warn(bus, unit, &cgroup);
         if (r < 0)
-                return log_error_errno(r, "Failed to query ControlGroup: %s", bus_error_message(&error, r));
-
-        r = sd_bus_message_read(reply, "s", &cgroup);
-        if (r < 0)
-                return bus_log_parse_error(r);
+                return r;
 
         if (isempty(cgroup))
                 return 0;
@@ -390,8 +519,11 @@ static int show_unit_cgroup(sd_bus *bus, const char *unit, pid_t leader) {
         return 0;
 }
 
-static int print_addresses(sd_bus *bus, const char *name, int ifi, const char *prefix, const char *prefix2) {
+static int print_addresses(sd_bus *bus, const char *name, int ifi, const char *prefix, const char *prefix2, int n_addr) {
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+        _cleanup_free_ char *addresses = NULL;
+        bool truncate = false;
+        unsigned n = 0;
         int r;
 
         assert(bus);
@@ -410,6 +542,11 @@ static int print_addresses(sd_bus *bus, const char *name, int ifi, const char *p
         if (r < 0)
                 return r;
 
+        addresses = strdup(prefix);
+        if (!addresses)
+                return log_oom();
+        prefix = "";
+
         r = sd_bus_message_enter_container(reply, 'a', "(iay)");
         if (r < 0)
                 return bus_log_parse_error(r);
@@ -418,7 +555,7 @@ static int print_addresses(sd_bus *bus, const char *name, int ifi, const char *p
                 int family;
                 const void *a;
                 size_t sz;
-                char buffer[MAX(INET6_ADDRSTRLEN, INET_ADDRSTRLEN)];
+                char buf_ifi[DECIMAL_STR_MAX(int) + 2], buffer[MAX(INET6_ADDRSTRLEN, INET_ADDRSTRLEN)];
 
                 r = sd_bus_message_read(reply, "i", &family);
                 if (r < 0)
@@ -428,11 +565,16 @@ static int print_addresses(sd_bus *bus, const char *name, int ifi, const char *p
                 if (r < 0)
                         return bus_log_parse_error(r);
 
-                fputs(prefix, stdout);
-                fputs(inet_ntop(family, a, buffer, sizeof(buffer)), stdout);
-                if (family == AF_INET6 && ifi > 0)
-                        printf("%%%i", ifi);
-                fputc('\n', stdout);
+                if (n_addr != 0) {
+                        if (family == AF_INET6 && ifi > 0)
+                                xsprintf(buf_ifi, "%%%i", ifi);
+                        else
+                                strcpy(buf_ifi, "");
+
+                        if (!strextend(&addresses, prefix, inet_ntop(family, a, buffer, sizeof(buffer)), buf_ifi, NULL))
+                                return log_oom();
+                } else
+                        truncate = true;
 
                 r = sd_bus_message_exit_container(reply);
                 if (r < 0)
@@ -440,6 +582,11 @@ static int print_addresses(sd_bus *bus, const char *name, int ifi, const char *p
 
                 if (prefix != prefix2)
                         prefix = prefix2;
+
+                if (n_addr > 0)
+                        n_addr -= 1;
+
+                n++;
         }
         if (r < 0)
                 return bus_log_parse_error(r);
@@ -448,48 +595,58 @@ static int print_addresses(sd_bus *bus, const char *name, int ifi, const char *p
         if (r < 0)
                 return bus_log_parse_error(r);
 
+        if (n > 0)
+                fprintf(stdout, "%s%s", addresses, truncate ? "..." : "");
+
+        return (int) n;
+}
+
+static int print_os_release(sd_bus *bus, const char *method, const char *name, const char *prefix) {
+        _cleanup_free_ char *pretty = NULL;
+        int r;
+
+        assert(bus);
+        assert(name);
+        assert(prefix);
+
+        r = call_get_os_release(bus, method, name, "PRETTY_NAME\0", &pretty, NULL);
+        if (r < 0)
+                return r;
+
+        if (pretty)
+                printf("%s%s\n", prefix, pretty);
+
         return 0;
 }
 
-static int print_os_release(sd_bus *bus, const char *name, const char *prefix) {
+static int print_uid_shift(sd_bus *bus, const char *name) {
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
-        const char *k, *v, *pretty = NULL;
+        uint32_t shift;
         int r;
 
         assert(bus);
         assert(name);
-        assert(prefix);
 
         r = sd_bus_call_method(bus,
                                "org.freedesktop.machine1",
                                "/org/freedesktop/machine1",
                                "org.freedesktop.machine1.Manager",
-                               "GetMachineOSRelease",
-                               NULL,
+                               "GetMachineUIDShift",
+                               &error,
                                &reply,
                                "s", name);
         if (r < 0)
-                return r;
+                return log_debug_errno(r, "Failed to query UID/GID shift: %s", bus_error_message(&error, r));
 
-        r = sd_bus_message_enter_container(reply, 'a', "{ss}");
+        r = sd_bus_message_read(reply, "u", &shift);
         if (r < 0)
-                return bus_log_parse_error(r);
-
-        while ((r = sd_bus_message_read(reply, "{ss}", &k, &v)) > 0) {
-                if (streq(k, "PRETTY_NAME"))
-                        pretty = v;
-
-        }
-        if (r < 0)
-                return bus_log_parse_error(r);
-
-        r = sd_bus_message_exit_container(reply);
-        if (r < 0)
-                return bus_log_parse_error(r);
+                return r;
 
-        if (pretty)
-                printf("%s%s\n", prefix, pretty);
+        if (shift == 0) /* Don't show trivial mappings */
+                return 0;
 
+        printf("       UID Shift: %" PRIu32 "\n", shift);
         return 0;
 }
 
@@ -589,11 +746,15 @@ static void print_machine_status_info(sd_bus *bus, MachineStatusInfo *i) {
                 fputc('\n', stdout);
         }
 
-        print_addresses(bus, i->name, ifi,
-                       "\t Address: ",
-                       "\t          ");
+        if (print_addresses(bus, i->name, ifi,
+                            "\t Address: ",
+                            "\n\t          ",
+                            ALL_IP_ADDRESSES) > 0)
+                fputc('\n', stdout);
+
+        print_os_release(bus, "GetMachineOSRelease", i->name, "\t      OS: ");
 
-        print_os_release(bus, i->name, "\t      OS: ");
+        print_uid_shift(bus, i->name);
 
         if (i->unit) {
                 printf("\t    Unit: %s\n", i->unit);
@@ -653,6 +814,7 @@ static int show_machine_info(const char *verb, sd_bus *bus, const char *path, bo
                 {}
         };
 
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_(machine_status_info_clear) MachineStatusInfo info = {};
         int r;
 
@@ -665,9 +827,10 @@ static int show_machine_info(const char *verb, sd_bus *bus, const char *path, bo
                                    "org.freedesktop.machine1",
                                    path,
                                    map,
+                                   &error,
                                    &info);
         if (r < 0)
-                return log_error_errno(r, "Could not get properties: %m");
+                return log_error_errno(r, "Could not get properties: %s", bus_error_message(&error, r));
 
         if (*new_line)
                 printf("\n");
@@ -791,6 +954,8 @@ static void print_image_status_info(sd_bus *bus, ImageStatusInfo *i) {
         if (i->path)
                 printf("\t    Path: %s\n", i->path);
 
+        print_os_release(bus, "GetImageOSRelease", i->name, "\t      OS: ");
+
         printf("\t      RO: %s%s%s\n",
                i->read_only ? ansi_highlight_red() : "",
                i->read_only ? "read-only" : "writable",
@@ -841,6 +1006,7 @@ static int show_image_info(sd_bus *bus, const char *path, bool *new_line) {
                 {}
         };
 
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_(image_status_info_clear) ImageStatusInfo info = {};
         int r;
 
@@ -852,9 +1018,10 @@ static int show_image_info(sd_bus *bus, const char *path, bool *new_line) {
                                    "org.freedesktop.machine1",
                                    path,
                                    map,
+                                   &error,
                                    &info);
         if (r < 0)
-                return log_error_errno(r, "Could not get properties: %m");
+                return log_error_errno(r, "Could not get properties: %s", bus_error_message(&error, r));
 
         if (*new_line)
                 printf("\n");
@@ -908,6 +1075,8 @@ static int show_pool_info(sd_bus *bus) {
                 .usage = (uint64_t) -1,
                 .limit = (uint64_t) -1,
         };
+
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         int r;
 
         assert(bus);
@@ -916,9 +1085,10 @@ static int show_pool_info(sd_bus *bus) {
                                    "org.freedesktop.machine1",
                                    "/org/freedesktop/machine1",
                                    map,
+                                   &error,
                                    &info);
         if (r < 0)
-                return log_error_errno(r, "Could not get properties: %m");
+                return log_error_errno(r, "Could not get properties: %s", bus_error_message(&error, r));
 
         print_pool_status_info(bus, &info);
 
@@ -1194,10 +1364,12 @@ static int process_forward(sd_event *event, PTYForward **forward, int master, PT
 
         assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGWINCH, SIGTERM, SIGINT, -1) >= 0);
 
-        if (streq(name, ".host"))
-                log_info("Connected to the local host. Press ^] three times within 1s to exit session.");
-        else
-                log_info("Connected to machine %s. Press ^] three times within 1s to exit session.", name);
+        if (!arg_quiet) {
+                if (streq(name, ".host"))
+                        log_info("Connected to the local host. Press ^] three times within 1s to exit session.");
+                else
+                        log_info("Connected to machine %s. Press ^] three times within 1s to exit session.", name);
+        }
 
         sd_event_add_signal(event, NULL, SIGINT, NULL, NULL);
         sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL);
@@ -1221,17 +1393,54 @@ static int process_forward(sd_event *event, PTYForward **forward, int master, PT
         if (last_char != '\n')
                 fputc('\n', stdout);
 
-        if (machine_died)
-                log_info("Machine %s terminated.", name);
-        else if (streq(name, ".host"))
-                log_info("Connection to the local host terminated.");
-        else
-                log_info("Connection to machine %s terminated.", name);
+        if (!arg_quiet) {
+                if (machine_died)
+                        log_info("Machine %s terminated.", name);
+                else if (streq(name, ".host"))
+                        log_info("Connection to the local host terminated.");
+                else
+                        log_info("Connection to machine %s terminated.", name);
+        }
 
         sd_event_get_exit_code(event, &ret);
         return ret;
 }
 
+static int parse_machine_uid(const char *spec, const char **machine, char **uid) {
+        /*
+         * Whatever is specified in the spec takes priority over global arguments.
+         */
+        char *_uid = NULL;
+        const char *_machine = NULL;
+
+        if (spec) {
+                const char *at;
+
+                at = strchr(spec, '@');
+                if (at) {
+                        if (at == spec)
+                                /* Do the same as ssh and refuse "@host". */
+                                return -EINVAL;
+
+                        _machine = at + 1;
+                        _uid = strndup(spec, at - spec);
+                        if (!_uid)
+                                return -ENOMEM;
+                } else
+                        _machine = spec;
+        };
+
+        if (arg_uid && !_uid) {
+                _uid = strdup(arg_uid);
+                if (!_uid)
+                        return -ENOMEM;
+        }
+
+        *uid = _uid;
+        *machine = isempty(_machine) ? ".host" : _machine;
+        return 0;
+}
+
 static int login_machine(int argc, char *argv[], void *userdata) {
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
@@ -1307,7 +1516,8 @@ static int shell_machine(int argc, char *argv[], void *userdata) {
         _cleanup_(sd_event_unrefp) sd_event *event = NULL;
         int master = -1, r;
         sd_bus *bus = userdata;
-        const char *pty, *match, *machine, *path, *uid = NULL;
+        const char *pty, *match, *machine, *path;
+        _cleanup_free_ char *uid = NULL;
 
         assert(bus);
 
@@ -1338,22 +1548,9 @@ static int shell_machine(int argc, char *argv[], void *userdata) {
         if (r < 0)
                 return log_error_errno(r, "Failed to attach bus to event loop: %m");
 
-        machine = argc < 2 || isempty(argv[1]) ? NULL : argv[1];
-
-        if (arg_uid)
-                uid = arg_uid;
-        else if (machine) {
-                const char *at;
-
-                at = strchr(machine, '@');
-                if (at) {
-                        uid = strndupa(machine, at - machine);
-                        machine = at + 1;
-                }
-        }
-
-        if (isempty(machine))
-                machine = ".host";
+        r = parse_machine_uid(argc >= 2 ? argv[1] : NULL, &machine, &uid);
+        if (r < 0)
+                return log_error_errno(r, "Failed to parse machine specification: %m");
 
         match = strjoina("type='signal',"
                          "sender='org.freedesktop.machine1',"
@@ -2314,7 +2511,7 @@ static int list_transfers(int argc, char *argv[], void *userdata) {
 
         qsort_safe(transfers, n_transfers, sizeof(TransferInfo), compare_transfer_info);
 
-        if (arg_legend)
+        if (arg_legend && n_transfers > 0)
                 printf("%-*s %-*s %-*s %-*s %-*s\n",
                        (int) MAX(2U, DECIMAL_STR_WIDTH(max_id)), "ID",
                        (int) 7, "PERCENT",
@@ -2330,8 +2527,12 @@ static int list_transfers(int argc, char *argv[], void *userdata) {
                        (int) max_local, transfers[j].local,
                        (int) max_remote, transfers[j].remote);
 
-        if (arg_legend)
-                printf("\n%zu transfers listed.\n", n_transfers);
+        if (arg_legend) {
+                if (n_transfers > 0)
+                        printf("\n%zu transfers listed.\n", n_transfers);
+                else
+                        printf("No transfers.\n");
+        }
 
         return 0;
 }
@@ -2468,6 +2669,7 @@ static int clean_images(int argc, char *argv[], void *userdata) {
 }
 
 static int help(int argc, char *argv[], void *userdata) {
+        pager_open(arg_no_pager, false);
 
         printf("%s [OPTIONS...] {COMMAND} ...\n\n"
                "Send control commands to or query the virtual machine and container\n"
@@ -2491,12 +2693,14 @@ static int help(int argc, char *argv[], void *userdata) {
                "     --read-only              Create read-only bind mount\n"
                "     --mkdir                  Create directory before bind mounting, if missing\n"
                "  -n --lines=INTEGER          Number of journal entries to show\n"
-               "  -o --output=STRING          Change journal output mode (short,\n"
-               "                              short-monotonic, verbose, export, json,\n"
-               "                              json-pretty, json-sse, cat)\n"
-               "      --verify=MODE           Verification mode for downloaded images (no,\n"
+               "     --max-addresses=INTEGER  Number of internet addresses to show at most\n"
+               "  -o --output=STRING          Change journal output mode (short, short-precise,\n"
+               "                               short-iso, short-iso-precise, short-full,\n"
+               "                               short-monotonic, short-unix, verbose, export,\n"
+               "                               json, json-pretty, json-sse, cat)\n"
+               "     --verify=MODE            Verification mode for downloaded images (no,\n"
                "                              checksum, signature)\n"
-               "      --force                 Download image even if already exists\n\n"
+               "     --force                  Download image even if already exists\n\n"
                "Machine Commands:\n"
                "  list                        List running VMs and containers\n"
                "  status NAME...              Show VM/container details\n"
@@ -2555,6 +2759,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_FORCE,
                 ARG_FORMAT,
                 ARG_UID,
+                ARG_NUMBER_IPS,
         };
 
         static const struct option options[] = {
@@ -2581,6 +2786,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "format",          required_argument, NULL, ARG_FORMAT          },
                 { "uid",             required_argument, NULL, ARG_UID             },
                 { "setenv",          required_argument, NULL, 'E'                 },
+                { "max-addresses",   required_argument, NULL, ARG_NUMBER_IPS      },
                 {}
         };
 
@@ -2591,7 +2797,7 @@ static int parse_argv(int argc, char *argv[]) {
         assert(argv);
 
         for (;;) {
-                static const char option_string[] = "-hp:als:H:M:qn:o:";
+                static const char option_string[] = "-hp:als:H:M:qn:o:E:";
 
                 c = getopt_long(argc, argv, option_string + reorder, options, NULL);
                 if (c < 0)
@@ -2771,6 +2977,18 @@ static int parse_argv(int argc, char *argv[]) {
                                 return log_oom();
                         break;
 
+                case ARG_NUMBER_IPS:
+                        if (streq(optarg, "all"))
+                                arg_addrs = ALL_IP_ADDRESSES;
+                        else if (safe_atoi(optarg, &arg_addrs) < 0) {
+                                log_error("Invalid number of IPs");
+                                return -EINVAL;
+                        } else if (arg_addrs < 0) {
+                                log_error("Number of IPs cannot be negative");
+                                return -EINVAL;
+                        }
+                        break;
+
                 case '?':
                         return -EINVAL;
 
index 1923e8b..c9b92d2 100644 (file)
@@ -30,7 +30,7 @@
 #include "cgroup-util.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "hostname-util.h"
 #include "image-dbus.h"
 #include "io-util.h"
@@ -444,7 +444,9 @@ static int method_register_machine_internal(sd_bus_message *message, bool read_n
 
         r = cg_pid_get_unit(m->leader, &m->unit);
         if (r < 0) {
-                r = sd_bus_error_set_errnof(error, r, "Failed to determine unit of process "PID_FMT" : %s", m->leader, strerror(-r));
+                r = sd_bus_error_set_errnof(error, r,
+                                            "Failed to determine unit of process "PID_FMT" : %m",
+                                            m->leader);
                 goto fail;
         }
 
@@ -727,6 +729,26 @@ static int method_open_machine_root_directory(sd_bus_message *message, void *use
         return bus_machine_method_open_root_directory(message, machine, error);
 }
 
+static int method_get_machine_uid_shift(sd_bus_message *message, void *userdata, sd_bus_error *error) {
+        Manager *m = userdata;
+        Machine *machine;
+        const char *name;
+        int r;
+
+        assert(message);
+        assert(m);
+
+        r = sd_bus_message_read(message, "s", &name);
+        if (r < 0)
+                return r;
+
+        machine = hashmap_get(m->machines, name);
+        if (!machine)
+                return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_MACHINE, "No machine '%s' known", name);
+
+        return bus_machine_method_get_uid_shift(message, machine, error);
+}
+
 static int method_remove_image(sd_bus_message *message, void *userdata, sd_bus_error *error) {
         _cleanup_(image_unrefp) Image* i = NULL;
         const char *name;
@@ -823,6 +845,30 @@ static int method_mark_image_read_only(sd_bus_message *message, void *userdata,
         return bus_image_method_mark_read_only(message, i, error);
 }
 
+static int method_get_image_os_release(sd_bus_message *message, void *userdata, sd_bus_error *error) {
+        _cleanup_(image_unrefp) Image *i = NULL;
+        const char *name;
+        int r;
+
+        assert(message);
+
+        r = sd_bus_message_read(message, "s", &name);
+        if (r < 0)
+                return r;
+
+        if (!image_name_is_valid(name))
+                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Image name '%s' is invalid.", name);
+
+        r = image_find(name, &i);
+        if (r < 0)
+                return r;
+        if (r == 0)
+                return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_IMAGE, "No image '%s' known", name);
+
+        i->userdata = userdata;
+        return bus_image_method_get_os_release(message, i, error);
+}
+
 static int clean_pool_done(Operation *operation, int ret, sd_bus_error *error) {
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
         _cleanup_fclose_ FILE *f = NULL;
@@ -954,7 +1000,7 @@ static int method_clean_pool(sd_bus_message *message, void *userdata, sd_bus_err
         /* Create a temporary file we can dump information about deleted images into. We use a temporary file for this
          * instead of a pipe or so, since this might grow quit large in theory and we don't want to process this
          * continuously */
-        result_fd = open_tmpfile_unlinkable("/tmp/", O_RDWR|O_CLOEXEC);
+        result_fd = open_tmpfile_unlinkable(NULL, O_RDWR|O_CLOEXEC);
         if (result_fd < 0)
                 return -errno;
 
@@ -1390,10 +1436,12 @@ const sd_bus_vtable manager_vtable[] = {
         SD_BUS_METHOD("CopyFromMachine", "sss", NULL, method_copy_machine, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("CopyToMachine", "sss", NULL, method_copy_machine, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("OpenMachineRootDirectory", "s", "h", method_open_machine_root_directory, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("GetMachineUIDShift", "s", "u", method_get_machine_uid_shift, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("RemoveImage", "s", NULL, method_remove_image, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("RenameImage", "ss", NULL, method_rename_image, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("CloneImage", "ssb", NULL, method_clone_image, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("MarkImageReadOnly", "sb", NULL, method_mark_image_read_only, SD_BUS_VTABLE_UNPRIVILEGED),
+        SD_BUS_METHOD("GetImageOSRelease", "s", "a{ss}", method_get_image_os_release, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("SetPoolLimit", "t", NULL, method_set_pool_limit, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("SetImageLimit", "st", NULL, method_set_image_limit, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("CleanPool", "s", "a(st)", method_clean_pool, SD_BUS_VTABLE_UNPRIVILEGED),
@@ -1802,3 +1850,30 @@ int manager_add_machine(Manager *m, const char *name, Machine **_machine) {
 
         return 0;
 }
+
+int bus_reply_pair_array(sd_bus_message *m, char **l) {
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+        char **k, **v;
+        int r;
+
+        r = sd_bus_message_new_method_return(m, &reply);
+        if (r < 0)
+                return r;
+
+        r = sd_bus_message_open_container(reply, 'a', "{ss}");
+        if (r < 0)
+                return r;
+
+        STRV_FOREACH_PAIR(k, v, l) {
+                r = sd_bus_message_append(reply, "{ss}", *k, *v);
+                if (r < 0)
+                        return r;
+        }
+
+        r = sd_bus_message_close_container(reply);
+        if (r < 0)
+                return r;
+
+        return sd_bus_send(NULL, reply, NULL);
+
+}
index 5712194..8719e01 100644 (file)
@@ -29,7 +29,7 @@
 #include "cgroup-util.h"
 #include "dirent-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "hostname-util.h"
 #include "label.h"
 #include "machine-image.h"
diff --git a/src/machine/meson.build b/src/machine/meson.build
new file mode 100644 (file)
index 0000000..1a08133
--- /dev/null
@@ -0,0 +1,45 @@
+systemd_machined_sources = files('''
+        machined.c
+        machined.h
+'''.split())
+
+libmachine_core_sources = files('''
+        machine.c
+        machine.h
+        machined-dbus.c
+        machine-dbus.c
+        machine-dbus.h
+        image-dbus.c
+        image-dbus.h
+        operation.c
+        operation.h
+'''.split())
+
+libmachine_core = static_library(
+        'machine-core',
+        libmachine_core_sources,
+        include_directories : includes,
+        dependencies : [threads])
+
+if conf.get('ENABLE_MACHINED', false)
+        install_data('org.freedesktop.machine1.conf',
+                     install_dir : dbuspolicydir)
+        install_data('org.freedesktop.machine1.service',
+                     install_dir : dbussystemservicedir)
+
+        custom_target(
+                'org.freedesktop.machine1.policy',
+                input : 'org.freedesktop.machine1.policy.in',
+                output : 'org.freedesktop.machine1.policy',
+                command : intltool_command,
+                install : install_polkit,
+                install_dir : polkitpolicydir)
+endif
+
+tests += [
+        [['src/machine/test-machine-tables.c'],
+         [libmachine_core,
+          libshared],
+         [threads],
+         'ENABLE_MACHINED'],
+]
index 2bf93cb..9b2d13d 100644 (file)
@@ -17,6 +17,8 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+#include <sys/wait.h>
+
 #include "alloc-util.h"
 #include "fd-util.h"
 #include "operation.h"
@@ -61,8 +63,10 @@ static int operation_done(sd_event_source *s, const siginfo_t *si, void *userdat
         } else {
                 /* The default operation when done is to simply return an error on failure or an empty success
                  * message on success. */
-                if (r < 0)
+                if (r < 0) {
+                        sd_bus_error_set_errno(&error, r);
                         goto fail;
+                }
 
                 r = sd_bus_reply_method_return(o->message, NULL);
                 if (r < 0)
@@ -147,6 +151,5 @@ Operation *operation_free(Operation *o) {
         if (o->machine)
                 LIST_REMOVE(operations_by_machine, o->machine->operations, o);
 
-        free(o);
-        return NULL;
+        return mfree(o);
 }
index 562b9d3..daa365a 100644 (file)
 
                 <allow send_destination="org.freedesktop.machine1"
                        send_interface="org.freedesktop.machine1.Manager"
+                       send_member="GetMachineUIDShift"/>
+
+                <allow send_destination="org.freedesktop.machine1"
+                       send_interface="org.freedesktop.machine1.Manager"
                        send_member="OpenMachineLogin"/>
 
                 <allow send_destination="org.freedesktop.machine1"
 
                 <allow send_destination="org.freedesktop.machine1"
                        send_interface="org.freedesktop.machine1.Manager"
+                       send_member="GetImageOSRelease"/>
+
+                <allow send_destination="org.freedesktop.machine1"
+                       send_interface="org.freedesktop.machine1.Manager"
                        send_member="CleanPool"/>
 
                 <allow send_destination="org.freedesktop.machine1"
 
                 <allow send_destination="org.freedesktop.machine1"
                        send_interface="org.freedesktop.machine1.Machine"
+                       send_member="GetUIDShift"/>
+
+                <allow send_destination="org.freedesktop.machine1"
+                       send_interface="org.freedesktop.machine1.Machine"
                        send_member="OpenLogin"/>
 
                 <allow send_destination="org.freedesktop.machine1"
                        send_interface="org.freedesktop.machine1.Image"
                        send_member="MarkReadOnly"/>
 
+                <allow send_destination="org.freedesktop.machine1"
+                       send_interface="org.freedesktop.machine1.Image"
+                       send_member="GetOSRelease"/>
+
                 <allow receive_sender="org.freedesktop.machine1"/>
         </policy>
 
index f75015d..615998a 100644 (file)
@@ -59,10 +59,14 @@ static int add_modules(const char *p) {
         return 0;
 }
 
-static int parse_proc_cmdline_item(const char *key, const char *value) {
+static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
         int r;
 
-        if (STR_IN_SET(key, "modules-load", "rd.modules-load") && value) {
+        if (proc_cmdline_key_streq(key, "modules_load")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
                 r = add_modules(value);
                 if (r < 0)
                         return r;
@@ -226,7 +230,7 @@ int main(int argc, char *argv[]) {
 
         umask(0022);
 
-        r = parse_proc_cmdline(parse_proc_cmdline_item);
+        r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
         if (r < 0)
                 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
 
diff --git a/src/mount/Makefile b/src/mount/Makefile
new file mode 120000 (symlink)
index 0000000..d0b0e8e
--- /dev/null
@@ -0,0 +1 @@
+../Makefile
\ No newline at end of file
diff --git a/src/mount/mount-tool.c b/src/mount/mount-tool.c
new file mode 100644 (file)
index 0000000..ed6578d
--- /dev/null
@@ -0,0 +1,1637 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <getopt.h>
+
+#include "libudev.h"
+#include "sd-bus.h"
+
+#include "bus-error.h"
+#include "bus-unit-util.h"
+#include "bus-util.h"
+#include "dirent-util.h"
+#include "escape.h"
+#include "fd-util.h"
+#include "fileio.h"
+#include "fstab-util.h"
+#include "pager.h"
+#include "parse-util.h"
+#include "path-util.h"
+#include "spawn-polkit-agent.h"
+#include "stat-util.h"
+#include "strv.h"
+#include "udev-util.h"
+#include "unit-name.h"
+#include "terminal-util.h"
+
+enum {
+        ACTION_DEFAULT,
+        ACTION_MOUNT,
+        ACTION_AUTOMOUNT,
+        ACTION_UMOUNT,
+        ACTION_LIST,
+} arg_action = ACTION_DEFAULT;
+
+static bool arg_no_block = false;
+static bool arg_no_pager = false;
+static bool arg_ask_password = true;
+static bool arg_quiet = false;
+static BusTransport arg_transport = BUS_TRANSPORT_LOCAL;
+static bool arg_user = false;
+static const char *arg_host = NULL;
+static bool arg_discover = false;
+static char *arg_mount_what = NULL;
+static char *arg_mount_where = NULL;
+static char *arg_mount_type = NULL;
+static char *arg_mount_options = NULL;
+static char *arg_description = NULL;
+static char **arg_property = NULL;
+static usec_t arg_timeout_idle = USEC_INFINITY;
+static bool arg_timeout_idle_set = false;
+static char **arg_automount_property = NULL;
+static int arg_bind_device = -1;
+static bool arg_fsck = true;
+
+static void polkit_agent_open_if_enabled(void) {
+
+        /* Open the polkit agent as a child process if necessary */
+        if (!arg_ask_password)
+                return;
+
+        if (arg_transport != BUS_TRANSPORT_LOCAL)
+                return;
+
+        polkit_agent_open();
+}
+
+static void help(void) {
+        printf("systemd-mount [OPTIONS...] WHAT [WHERE]\n"
+               "systemd-mount [OPTIONS...] --list\n"
+               "%s [OPTIONS...] %sWHAT|WHERE...\n\n"
+               "Establish a mount or auto-mount point transiently.\n\n"
+               "  -h --help                       Show this help\n"
+               "     --version                    Show package version\n"
+               "     --no-block                   Do not wait until operation finished\n"
+               "     --no-pager                   Do not pipe output into a pager\n"
+               "     --no-ask-password            Do not prompt for password\n"
+               "  -q --quiet                      Suppress information messages during runtime\n"
+               "     --user                       Run as user unit\n"
+               "  -H --host=[USER@]HOST           Operate on remote host\n"
+               "  -M --machine=CONTAINER          Operate on local container\n"
+               "     --discover                   Discover mount device metadata\n"
+               "  -t --type=TYPE                  File system type\n"
+               "  -o --options=OPTIONS            Mount options\n"
+               "     --fsck=no                    Don't run file system check before mount\n"
+               "     --description=TEXT           Description for unit\n"
+               "  -p --property=NAME=VALUE        Set mount unit property\n"
+               "  -A --automount=BOOL             Create an auto-mount point\n"
+               "     --timeout-idle-sec=SEC       Specify automount idle timeout\n"
+               "     --automount-property=NAME=VALUE\n"
+               "                                  Set automount unit property\n"
+               "     --bind-device                Bind automount unit to device\n"
+               "     --list                       List mountable block devices\n"
+               "  -u --umount                     Unmount mount points\n",
+               program_invocation_short_name,
+               streq(program_invocation_short_name, "systemd-umount") ? "" : "--umount ");
+}
+
+static int parse_argv(int argc, char *argv[]) {
+
+        enum {
+                ARG_VERSION = 0x100,
+                ARG_NO_BLOCK,
+                ARG_NO_PAGER,
+                ARG_NO_ASK_PASSWORD,
+                ARG_USER,
+                ARG_SYSTEM,
+                ARG_DISCOVER,
+                ARG_MOUNT_TYPE,
+                ARG_MOUNT_OPTIONS,
+                ARG_FSCK,
+                ARG_DESCRIPTION,
+                ARG_TIMEOUT_IDLE,
+                ARG_AUTOMOUNT,
+                ARG_AUTOMOUNT_PROPERTY,
+                ARG_BIND_DEVICE,
+                ARG_LIST,
+        };
+
+        static const struct option options[] = {
+                { "help",               no_argument,       NULL, 'h'                    },
+                { "version",            no_argument,       NULL, ARG_VERSION            },
+                { "no-block",           no_argument,       NULL, ARG_NO_BLOCK           },
+                { "no-pager",           no_argument,       NULL, ARG_NO_PAGER           },
+                { "no-ask-password",    no_argument,       NULL, ARG_NO_ASK_PASSWORD    },
+                { "quiet",              no_argument,       NULL, 'q'                    },
+                { "user",               no_argument,       NULL, ARG_USER               },
+                { "system",             no_argument,       NULL, ARG_SYSTEM             },
+                { "host",               required_argument, NULL, 'H'                    },
+                { "machine",            required_argument, NULL, 'M'                    },
+                { "discover",           no_argument,       NULL, ARG_DISCOVER           },
+                { "type",               required_argument, NULL, 't'                    },
+                { "options",            required_argument, NULL, 'o'                    },
+                { "fsck",               required_argument, NULL, ARG_FSCK               },
+                { "description",        required_argument, NULL, ARG_DESCRIPTION        },
+                { "property",           required_argument, NULL, 'p'                    },
+                { "automount",          required_argument, NULL, ARG_AUTOMOUNT          },
+                { "timeout-idle-sec",   required_argument, NULL, ARG_TIMEOUT_IDLE       },
+                { "automount-property", required_argument, NULL, ARG_AUTOMOUNT_PROPERTY },
+                { "bind-device",        no_argument,       NULL, ARG_BIND_DEVICE        },
+                { "list",               no_argument,       NULL, ARG_LIST               },
+                { "umount",             no_argument,       NULL, 'u'                    },
+                { "unmount",            no_argument,       NULL, 'u'                    },
+                {},
+        };
+
+        int r, c;
+
+        assert(argc >= 0);
+        assert(argv);
+
+        if (strstr(program_invocation_short_name, "systemd-umount"))
+                        arg_action = ACTION_UMOUNT;
+
+        while ((c = getopt_long(argc, argv, "hqH:M:t:o:p:Au", options, NULL)) >= 0)
+
+                switch (c) {
+
+                case 'h':
+                        help();
+                        return 0;
+
+                case ARG_VERSION:
+                        return version();
+
+                case ARG_NO_BLOCK:
+                        arg_no_block = true;
+                        break;
+
+                case ARG_NO_PAGER:
+                        arg_no_pager = true;
+                        break;
+
+                case ARG_NO_ASK_PASSWORD:
+                        arg_ask_password = false;
+                        break;
+
+                case 'q':
+                        arg_quiet = true;
+                        break;
+
+                case ARG_USER:
+                        arg_user = true;
+                        break;
+
+                case ARG_SYSTEM:
+                        arg_user = false;
+                        break;
+
+                case 'H':
+                        arg_transport = BUS_TRANSPORT_REMOTE;
+                        arg_host = optarg;
+                        break;
+
+                case 'M':
+                        arg_transport = BUS_TRANSPORT_MACHINE;
+                        arg_host = optarg;
+                        break;
+
+                case ARG_DISCOVER:
+                        arg_discover = true;
+                        break;
+
+                case 't':
+                        if (free_and_strdup(&arg_mount_type, optarg) < 0)
+                                return log_oom();
+                        break;
+
+                case 'o':
+                        if (free_and_strdup(&arg_mount_options, optarg) < 0)
+                                return log_oom();
+                        break;
+
+                case ARG_FSCK:
+                        r = parse_boolean(optarg);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse --fsck= argument: %s", optarg);
+
+                        arg_fsck = r;
+                        break;
+
+                case ARG_DESCRIPTION:
+                        if (free_and_strdup(&arg_description, optarg) < 0)
+                                return log_oom();
+                        break;
+
+                case 'p':
+                        if (strv_extend(&arg_property, optarg) < 0)
+                                return log_oom();
+
+                        break;
+
+                case 'A':
+                        arg_action = ACTION_AUTOMOUNT;
+                        break;
+
+                case ARG_AUTOMOUNT:
+                        r = parse_boolean(optarg);
+                        if (r < 0)
+                                return log_error_errno(r, "--automount= expects a valid boolean parameter: %s", optarg);
+
+                        arg_action = r ? ACTION_AUTOMOUNT : ACTION_MOUNT;
+                        break;
+
+                case ARG_TIMEOUT_IDLE:
+                        r = parse_sec(optarg, &arg_timeout_idle);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse timeout: %s", optarg);
+
+                        break;
+
+                case ARG_AUTOMOUNT_PROPERTY:
+                        if (strv_extend(&arg_automount_property, optarg) < 0)
+                                return log_oom();
+
+                        break;
+
+                case ARG_BIND_DEVICE:
+                        arg_bind_device = true;
+                        break;
+
+                case ARG_LIST:
+                        arg_action = ACTION_LIST;
+                        break;
+
+                case 'u':
+                        arg_action = ACTION_UMOUNT;
+                        break;
+
+                case '?':
+                        return -EINVAL;
+
+                default:
+                        assert_not_reached("Unhandled option");
+                }
+
+        if (arg_user && arg_transport != BUS_TRANSPORT_LOCAL) {
+                log_error("Execution in user context is not supported on non-local systems.");
+                return -EINVAL;
+        }
+
+        if (arg_action == ACTION_LIST) {
+                if (optind < argc) {
+                        log_error("Too many arguments.");
+                        return -EINVAL;
+                }
+
+                if (arg_transport != BUS_TRANSPORT_LOCAL) {
+                        log_error("Listing devices only supported locally.");
+                        return -EOPNOTSUPP;
+                }
+        } else if (arg_action == ACTION_UMOUNT) {
+                if (optind >= argc) {
+                        log_error("At least one argument required.");
+                        return -EINVAL;
+                }
+
+                if (arg_transport != BUS_TRANSPORT_LOCAL) {
+                        int i;
+
+                        for (i = optind; i < argc; i++)
+                                if (!path_is_absolute(argv[i]) ) {
+                                        log_error("Only absolute path is supported: %s", argv[i]);
+                                        return -EINVAL;
+                                }
+                }
+        } else {
+                if (optind >= argc) {
+                        log_error("At least one argument required.");
+                        return -EINVAL;
+                }
+
+                if (argc > optind+2) {
+                        log_error("At most two arguments required.");
+                        return -EINVAL;
+                }
+
+                if (arg_transport == BUS_TRANSPORT_LOCAL) {
+                        _cleanup_free_ char *u = NULL, *p = NULL;
+
+                        u = fstab_node_to_udev_node(argv[optind]);
+                        if (!u)
+                                return log_oom();
+
+                        r = path_make_absolute_cwd(u, &p);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to make path absolute: %m");
+
+                        arg_mount_what = canonicalize_file_name(p);
+                        if (!arg_mount_what)
+                                return log_error_errno(errno, "Failed to canonicalize path: %m");
+
+                } else {
+                        arg_mount_what = strdup(argv[optind+1]);
+                        if (!arg_mount_what)
+                                return log_oom();
+
+                        path_kill_slashes(arg_mount_what);
+
+                        if (!path_is_absolute(arg_mount_what)) {
+                                log_error("Only absolute path is supported: %s", arg_mount_what);
+                                return -EINVAL;
+                        }
+                }
+
+                if (argc > optind+1) {
+                        if (arg_transport == BUS_TRANSPORT_LOCAL) {
+                                _cleanup_free_ char *p = NULL;
+
+                                r = path_make_absolute_cwd(argv[optind+1], &p);
+                                if (r < 0)
+                                        return log_error_errno(r, "Failed to make path absolute: %m");
+
+                                arg_mount_where = canonicalize_file_name(p);
+                                if (!arg_mount_where)
+                                        return log_error_errno(errno, "Failed to canonicalize path: %m");
+
+                        } else {
+                                arg_mount_where = strdup(argv[optind+1]);
+                                if (!arg_mount_where)
+                                        return log_oom();
+
+                                path_kill_slashes(arg_mount_where);
+
+                                if (!path_is_absolute(arg_mount_where)) {
+                                        log_error("Only absolute path is supported: %s", arg_mount_where);
+                                        return -EINVAL;
+                                }
+                        }
+                } else
+                        arg_discover = true;
+
+                if (arg_discover && arg_transport != BUS_TRANSPORT_LOCAL) {
+                        log_error("Automatic mount location discovery is only supported locally.");
+                        return -EOPNOTSUPP;
+                }
+        }
+
+        return 1;
+}
+
+static int transient_unit_set_properties(sd_bus_message *m, char **properties) {
+        int r;
+
+        if (!isempty(arg_description)) {
+                r = sd_bus_message_append(m, "(sv)", "Description", "s", arg_description);
+                if (r < 0)
+                        return r;
+        }
+
+        if (arg_bind_device && is_device_path(arg_mount_what)) {
+                _cleanup_free_ char *device_unit = NULL;
+
+                r = unit_name_from_path(arg_mount_what, ".device", &device_unit);
+                if (r < 0)
+                        return r;
+
+                r = sd_bus_message_append(m, "(sv)(sv)",
+                                          "After", "as", 1, device_unit,
+                                          "BindsTo", "as", 1, device_unit);
+                if (r < 0)
+                        return r;
+        }
+
+        r = bus_append_unit_property_assignment_many(m, properties);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
+static int transient_mount_set_properties(sd_bus_message *m) {
+        int r;
+
+        assert(m);
+
+        r = transient_unit_set_properties(m, arg_property);
+        if (r < 0)
+                return r;
+
+        if (arg_mount_what) {
+                r = sd_bus_message_append(m, "(sv)", "What", "s", arg_mount_what);
+                if (r < 0)
+                        return r;
+        }
+
+        if (arg_mount_type) {
+                r = sd_bus_message_append(m, "(sv)", "Type", "s", arg_mount_type);
+                if (r < 0)
+                        return r;
+        }
+
+        if (arg_mount_options) {
+                r = sd_bus_message_append(m, "(sv)", "Options", "s", arg_mount_options);
+                if (r < 0)
+                        return r;
+        }
+
+        if (arg_fsck) {
+                _cleanup_free_ char *fsck = NULL;
+
+                r = unit_name_from_path_instance("systemd-fsck", arg_mount_what, ".service", &fsck);
+                if (r < 0)
+                        return r;
+
+                r = sd_bus_message_append(m,
+                                          "(sv)(sv)",
+                                          "Requires", "as", 1, fsck,
+                                          "After", "as", 1, fsck);
+                if (r < 0)
+                        return r;
+        }
+
+        return 0;
+}
+
+static int transient_automount_set_properties(sd_bus_message *m) {
+        int r;
+
+        assert(m);
+
+        r = transient_unit_set_properties(m, arg_automount_property);
+        if (r < 0)
+                return r;
+
+        if (arg_timeout_idle != USEC_INFINITY) {
+                r = sd_bus_message_append(m, "(sv)", "TimeoutIdleUSec", "t", arg_timeout_idle);
+                if (r < 0)
+                        return r;
+        }
+
+        return 0;
+}
+
+static int start_transient_mount(
+                sd_bus *bus,
+                char **argv) {
+
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        _cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
+        _cleanup_free_ char *mount_unit = NULL;
+        int r;
+
+        if (!arg_no_block) {
+                r = bus_wait_for_jobs_new(bus, &w);
+                if (r < 0)
+                        return log_error_errno(r, "Could not watch jobs: %m");
+        }
+
+        r = unit_name_from_path(arg_mount_where, ".mount", &mount_unit);
+        if (r < 0)
+                return log_error_errno(r, "Failed to make mount unit name: %m");
+
+        r = sd_bus_message_new_method_call(
+                        bus,
+                        &m,
+                        "org.freedesktop.systemd1",
+                        "/org/freedesktop/systemd1",
+                        "org.freedesktop.systemd1.Manager",
+                        "StartTransientUnit");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_set_allow_interactive_authorization(m, arg_ask_password);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        /* Name and mode */
+        r = sd_bus_message_append(m, "ss", mount_unit, "fail");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        /* Properties */
+        r = sd_bus_message_open_container(m, 'a', "(sv)");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = transient_mount_set_properties(m);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_close_container(m);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        /* Auxiliary units */
+        r = sd_bus_message_append(m, "a(sa(sv))", 0);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        polkit_agent_open_if_enabled();
+
+        r = sd_bus_call(bus, m, 0, &error, &reply);
+        if (r < 0)
+                return log_error_errno(r, "Failed to start transient mount unit: %s", bus_error_message(&error, r));
+
+        if (w) {
+                const char *object;
+
+                r = sd_bus_message_read(reply, "o", &object);
+                if (r < 0)
+                        return bus_log_parse_error(r);
+
+                r = bus_wait_for_jobs_one(w, object, arg_quiet);
+                if (r < 0)
+                        return r;
+        }
+
+        if (!arg_quiet)
+                log_info("Started unit %s%s%s for mount point: %s%s%s",
+                         ansi_highlight(), mount_unit, ansi_normal(),
+                         ansi_highlight(), arg_mount_where, ansi_normal());
+
+        return 0;
+}
+
+static int start_transient_automount(
+                sd_bus *bus,
+                char **argv) {
+
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        _cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
+        _cleanup_free_ char *automount_unit = NULL, *mount_unit = NULL;
+        int r;
+
+        if (!arg_no_block) {
+                r = bus_wait_for_jobs_new(bus, &w);
+                if (r < 0)
+                        return log_error_errno(r, "Could not watch jobs: %m");
+        }
+
+        r = unit_name_from_path(arg_mount_where, ".automount", &automount_unit);
+        if (r < 0)
+                return log_error_errno(r, "Failed to make automount unit name: %m");
+
+        r = unit_name_from_path(arg_mount_where, ".mount", &mount_unit);
+        if (r < 0)
+                return log_error_errno(r, "Failed to make mount unit name: %m");
+
+        r = sd_bus_message_new_method_call(
+                        bus,
+                        &m,
+                        "org.freedesktop.systemd1",
+                        "/org/freedesktop/systemd1",
+                        "org.freedesktop.systemd1.Manager",
+                        "StartTransientUnit");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_set_allow_interactive_authorization(m, arg_ask_password);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        /* Name and mode */
+        r = sd_bus_message_append(m, "ss", automount_unit, "fail");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        /* Properties */
+        r = sd_bus_message_open_container(m, 'a', "(sv)");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = transient_automount_set_properties(m);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_close_container(m);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        /* Auxiliary units */
+        r = sd_bus_message_open_container(m, 'a', "(sa(sv))");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_open_container(m, 'r', "sa(sv)");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_append(m, "s", mount_unit);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_open_container(m, 'a', "(sv)");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = transient_mount_set_properties(m);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_close_container(m);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_close_container(m);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_close_container(m);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        polkit_agent_open_if_enabled();
+
+        r = sd_bus_call(bus, m, 0, &error, &reply);
+        if (r < 0)
+                return log_error_errno(r, "Failed to start transient automount unit: %s", bus_error_message(&error, r));
+
+        if (w) {
+                const char *object;
+
+                r = sd_bus_message_read(reply, "o", &object);
+                if (r < 0)
+                        return bus_log_parse_error(r);
+
+                r = bus_wait_for_jobs_one(w, object, arg_quiet);
+                if (r < 0)
+                        return r;
+        }
+
+        if (!arg_quiet)
+                log_info("Started unit %s%s%s for mount point: %s%s%s",
+                         ansi_highlight(), automount_unit, ansi_normal(),
+                         ansi_highlight(), arg_mount_where, ansi_normal());
+
+        return 0;
+}
+
+static int find_mount_points(const char *what, char ***list) {
+        _cleanup_fclose_ FILE *proc_self_mountinfo = NULL;
+        _cleanup_strv_free_ char **l = NULL;
+        size_t bufsize = 0, n = 0;
+
+        assert(what);
+        assert(list);
+
+        /* Returns all mount points obtained from /proc/self/mountinfo in *list,
+         * and the number of mount points as return value. */
+
+        proc_self_mountinfo = fopen("/proc/self/mountinfo", "re");
+        if (!proc_self_mountinfo)
+                return log_error_errno(errno, "Can't open /proc/self/mountinfo: %m");
+
+        for (;;) {
+                _cleanup_free_ char *path = NULL, *where = NULL, *dev = NULL;
+                int r;
+
+                r = fscanf(proc_self_mountinfo,
+                           "%*s "       /* (1) mount id */
+                           "%*s "       /* (2) parent id */
+                           "%*s "       /* (3) major:minor */
+                           "%*s "       /* (4) root */
+                           "%ms "       /* (5) mount point */
+                           "%*s"        /* (6) mount options */
+                           "%*[^-]"     /* (7) optional fields */
+                           "- "         /* (8) separator */
+                           "%*s "       /* (9) file system type */
+                           "%ms"        /* (10) mount source */
+                           "%*s"        /* (11) mount options 2 */
+                           "%*[^\n]",   /* some rubbish at the end */
+                           &path, &dev);
+                if (r != 2) {
+                        if (r == EOF)
+                                break;
+
+                        continue;
+                }
+
+                if (!streq(what, dev))
+                        continue;
+
+                r = cunescape(path, UNESCAPE_RELAX, &where);
+                if (r < 0)
+                        continue;
+
+                /* one extra slot is needed for the terminating NULL */
+                if (!GREEDY_REALLOC(l, bufsize, n + 2))
+                        return log_oom();
+
+                l[n++] = where;
+                where = NULL;
+        }
+
+        if (!GREEDY_REALLOC(l, bufsize, n + 1))
+                return log_oom();
+
+        l[n] = NULL;
+        *list = l;
+        l = NULL; /* avoid freeing */
+
+        return n;
+}
+
+static int find_loop_device(const char *backing_file, char **loop_dev) {
+        _cleanup_closedir_ DIR *d = NULL;
+        struct dirent *de;
+        _cleanup_free_ char *l = NULL;
+
+        assert(backing_file);
+        assert(loop_dev);
+
+        d = opendir("/sys/devices/virtual/block");
+        if (!d)
+                return -errno;
+
+        FOREACH_DIRENT(de, d, return -errno) {
+                _cleanup_free_ char *sys = NULL, *fname = NULL;
+                int r;
+
+                dirent_ensure_type(d, de);
+
+                if (de->d_type != DT_DIR)
+                        continue;
+
+                if (!startswith(de->d_name, "loop"))
+                        continue;
+
+                sys = strjoin("/sys/devices/virtual/block/", de->d_name, "/loop/backing_file");
+                if (!sys)
+                        return -ENOMEM;
+
+                r = read_one_line_file(sys, &fname);
+                if (r < 0) {
+                        log_debug_errno(r, "Failed to read %s, ignoring: %m", sys);
+                        continue;
+                }
+
+                if (files_same(fname, backing_file, 0) <= 0)
+                        continue;
+
+                l = strjoin("/dev/", de->d_name);
+                if (!l)
+                        return -ENOMEM;
+
+                break;
+        }
+
+        if (!l)
+                return -ENXIO;
+
+        *loop_dev = l;
+        l = NULL; /* avoid freeing */
+
+        return 0;
+}
+
+static int stop_mount(
+                sd_bus *bus,
+                const char *where,
+                const char *suffix) {
+
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        _cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
+        _cleanup_free_ char *mount_unit = NULL;
+        int r;
+
+        if (!arg_no_block) {
+                r = bus_wait_for_jobs_new(bus, &w);
+                if (r < 0)
+                        return log_error_errno(r, "Could not watch jobs: %m");
+        }
+
+        r = unit_name_from_path(where, suffix, &mount_unit);
+        if (r < 0)
+                return log_error_errno(r, "Failed to make mount unit name from path %s: %m", where);
+
+        r = sd_bus_message_new_method_call(
+                        bus,
+                        &m,
+                        "org.freedesktop.systemd1",
+                        "/org/freedesktop/systemd1",
+                        "org.freedesktop.systemd1.Manager",
+                        "StopUnit");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_set_allow_interactive_authorization(m, arg_ask_password);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        /* Name and mode */
+        r = sd_bus_message_append(m, "ss", mount_unit, "fail");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        polkit_agent_open_if_enabled();
+
+        r = sd_bus_call(bus, m, 0, &error, &reply);
+        if (r < 0)
+                return log_error_errno(r, "Failed to stop mount unit: %s", bus_error_message(&error, r));
+
+        if (w) {
+                const char *object;
+
+                r = sd_bus_message_read(reply, "o", &object);
+                if (r < 0)
+                        return bus_log_parse_error(r);
+
+                r = bus_wait_for_jobs_one(w, object, arg_quiet);
+                if (r < 0)
+                        return r;
+        }
+
+        if (!arg_quiet)
+                log_info("Stopped unit %s%s%s for mount point: %s%s%s",
+                         ansi_highlight(), mount_unit, ansi_normal(),
+                         ansi_highlight(), where, ansi_normal());
+
+        return 0;
+}
+
+static int stop_mounts(
+                sd_bus *bus,
+                const char *where) {
+
+        int r;
+
+        if (path_equal(where, "/")) {
+                log_error("Refusing to operate on root directory: %s", where);
+                return -EINVAL;
+        }
+
+        if (!path_is_safe(where)) {
+                log_error("Path contains unsafe components: %s", where);
+                return -EINVAL;
+        }
+
+        r = stop_mount(bus, where, ".mount");
+        if (r < 0)
+                return r;
+
+        r = stop_mount(bus, where, ".automount");
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
+static int umount_by_device(sd_bus *bus, const char *what) {
+        _cleanup_udev_device_unref_ struct udev_device *d = NULL;
+        _cleanup_udev_unref_ struct udev *udev = NULL;
+        _cleanup_strv_free_ char **list = NULL;
+        struct stat st;
+        const char *v;
+        char **l;
+        int r, r2 = 0;
+
+        assert(what);
+
+        if (stat(what, &st) < 0)
+                return log_error_errno(errno, "Can't stat %s: %m", what);
+
+        if (!S_ISBLK(st.st_mode)) {
+                log_error("Not a block device: %s", what);
+                return -ENOTBLK;
+        }
+
+        udev = udev_new();
+        if (!udev)
+                return log_oom();
+
+        d = udev_device_new_from_devnum(udev, 'b', st.st_rdev);
+        if (!d)
+                return log_oom();
+
+        v = udev_device_get_property_value(d, "ID_FS_USAGE");
+        if (!streq_ptr(v, "filesystem")) {
+                log_error("%s does not contain a known file system.", what);
+                return -EINVAL;
+        }
+
+        v = udev_device_get_property_value(d, "SYSTEMD_MOUNT_WHERE");
+        if (!isempty(v))
+                r2 = stop_mounts(bus, v);
+
+        r = find_mount_points(what, &list);
+        if (r < 0)
+                return r;
+
+        for (l = list; *l; l++) {
+                r = stop_mounts(bus, *l);
+                if (r < 0)
+                        r2 = r;
+        }
+
+        return r2;
+}
+
+static int umount_loop(sd_bus *bus, const char *backing_file) {
+        _cleanup_free_ char *loop_dev = NULL;
+        int r;
+
+        assert(backing_file);
+
+        r = find_loop_device(backing_file, &loop_dev);
+        if (r < 0)
+                return log_error_errno(r, r == -ENXIO ? "File %s is not mounted." : "Can't get loop device for %s: %m", backing_file);
+
+        return umount_by_device(bus, loop_dev);
+}
+
+static int action_umount(
+                sd_bus *bus,
+                int argc,
+                char **argv) {
+
+        int i, r, r2 = 0;
+
+        if (arg_transport != BUS_TRANSPORT_LOCAL) {
+                for (i = optind; i < argc; i++) {
+                        _cleanup_free_ char *p = NULL;
+
+                        p = strdup(argv[i]);
+                        if (!p)
+                                return log_oom();
+
+                        path_kill_slashes(p);
+
+                        r = stop_mounts(bus, p);
+                        if (r < 0)
+                                r2 = r;
+                }
+                return r2;
+        }
+
+        for (i = optind; i < argc; i++) {
+                _cleanup_free_ char *u = NULL, *a = NULL, *p = NULL;
+                struct stat st;
+
+                u = fstab_node_to_udev_node(argv[i]);
+                if (!u)
+                        return log_oom();
+
+                r = path_make_absolute_cwd(u, &a);
+                if (r < 0) {
+                        r2 = log_error_errno(r, "Failed to make path absolute: %m");
+                        continue;
+                }
+
+                p = canonicalize_file_name(a);
+
+                if (stat(p, &st) < 0)
+                        return log_error_errno(errno, "Can't stat %s: %m", p);
+
+                if (S_ISBLK(st.st_mode))
+                        r = umount_by_device(bus, p);
+                else if (S_ISREG(st.st_mode))
+                        r = umount_loop(bus, p);
+                else if (S_ISDIR(st.st_mode))
+                        r = stop_mounts(bus, p);
+                else {
+                        log_error("Invalid file type: %s", p);
+                        r = -EINVAL;
+                }
+
+                if (r < 0)
+                        r2 = r;
+        }
+
+        return r2;
+}
+
+static int acquire_mount_type(struct udev_device *d) {
+        const char *v;
+
+        assert(d);
+
+        if (arg_mount_type)
+                return 0;
+
+        v = udev_device_get_property_value(d, "ID_FS_TYPE");
+        if (isempty(v))
+                return 0;
+
+        arg_mount_type = strdup(v);
+        if (!arg_mount_type)
+                return log_oom();
+
+        log_debug("Discovered type=%s", arg_mount_type);
+        return 1;
+}
+
+static int acquire_mount_options(struct udev_device *d) {
+        const char *v;
+
+        if (arg_mount_options)
+                return 0;
+
+        v = udev_device_get_property_value(d, "SYSTEMD_MOUNT_OPTIONS");
+        if (isempty(v))
+                return 0;
+
+        arg_mount_options = strdup(v);
+        if (!arg_mount_options)
+                return log_oom();
+
+        log_debug("Discovered options=%s", arg_mount_options);
+        return 1;
+}
+
+static const char *get_model(struct udev_device *d) {
+        const char *model;
+
+        assert(d);
+
+        model = udev_device_get_property_value(d, "ID_MODEL_FROM_DATABASE");
+        if (model)
+                return model;
+
+        return udev_device_get_property_value(d, "ID_MODEL");
+}
+
+static const char* get_label(struct udev_device *d) {
+        const char *label;
+
+        assert(d);
+
+        label = udev_device_get_property_value(d, "ID_FS_LABEL");
+        if (label)
+                return label;
+
+        return udev_device_get_property_value(d, "ID_PART_ENTRY_NAME");
+}
+
+static int acquire_mount_where(struct udev_device *d) {
+        const char *v;
+
+        if (arg_mount_where)
+                return 0;
+
+        v = udev_device_get_property_value(d, "SYSTEMD_MOUNT_WHERE");
+        if (isempty(v)) {
+                _cleanup_free_ char *escaped = NULL;
+                const char *name;
+
+                name = get_label(d);
+                if (!name)
+                        name = get_model(d);
+                if (!name) {
+                        const char *dn;
+
+                        dn = udev_device_get_devnode(d);
+                        if (!dn)
+                                return 0;
+
+                        name = basename(dn);
+                }
+
+                escaped = xescape(name, "\\");
+                if (!escaped)
+                        return log_oom();
+                if (!filename_is_valid(escaped))
+                        return 0;
+
+                arg_mount_where = strjoin("/run/media/system/", escaped);
+        } else
+                arg_mount_where = strdup(v);
+
+        if (!arg_mount_where)
+                return log_oom();
+
+        log_debug("Discovered where=%s", arg_mount_where);
+        return 1;
+}
+
+static int acquire_mount_where_for_loop_dev(const char *loop_dev) {
+        _cleanup_strv_free_ char **list = NULL;
+        int r;
+
+        if (arg_mount_where)
+                return 0;
+
+        r = find_mount_points(loop_dev, &list);
+        if (r < 0)
+                return r;
+        else if (r == 0) {
+                log_error("Can't find mount point of %s. It is expected that %s is already mounted on a place.", loop_dev, loop_dev);
+                return -EINVAL;
+        } else if (r >= 2) {
+                log_error("%s is mounted on %d places. It is expected that %s is mounted on a place.", loop_dev, r, loop_dev);
+                return -EINVAL;
+        }
+
+        arg_mount_where = strdup(list[0]);
+        if (!arg_mount_where)
+                return log_oom();
+
+        log_debug("Discovered where=%s", arg_mount_where);
+        return 1;
+}
+
+static int acquire_description(struct udev_device *d) {
+        const char *model, *label;
+
+        if (arg_description)
+                return 0;
+
+        model = get_model(d);
+
+        label = get_label(d);
+        if (!label)
+                label = udev_device_get_property_value(d, "ID_PART_ENTRY_NUMBER");
+
+        if (model && label)
+                arg_description = strjoin(model, " ", label);
+        else if (label)
+                arg_description = strdup(label);
+        else if (model)
+                arg_description = strdup(model);
+        else
+                return 0;
+
+        if (!arg_description)
+                return log_oom();
+
+        log_debug("Discovered description=%s", arg_description);
+        return 1;
+}
+
+static int acquire_removable(struct udev_device *d) {
+        const char *v;
+
+        /* Shortcut this if there's no reason to check it */
+        if (arg_action != ACTION_DEFAULT && arg_timeout_idle_set && arg_bind_device >= 0)
+                return 0;
+
+        for (;;) {
+                v = udev_device_get_sysattr_value(d, "removable");
+                if (v)
+                        break;
+
+                d = udev_device_get_parent(d);
+                if (!d)
+                        return 0;
+
+                if (!streq_ptr(udev_device_get_subsystem(d), "block"))
+                        return 0;
+        }
+
+        if (parse_boolean(v) <= 0)
+                return 0;
+
+        log_debug("Discovered removable device.");
+
+        if (arg_action == ACTION_DEFAULT) {
+                log_debug("Automatically turning on automount.");
+                arg_action = ACTION_AUTOMOUNT;
+        }
+
+        if (!arg_timeout_idle_set) {
+                log_debug("Setting idle timeout to 1s.");
+                arg_timeout_idle = USEC_PER_SEC;
+        }
+
+        if (arg_bind_device < 0) {
+                log_debug("Binding automount unit to device.");
+                arg_bind_device = true;
+        }
+
+        return 1;
+}
+
+static int discover_loop_backing_file(void) {
+        _cleanup_udev_device_unref_ struct udev_device *d = NULL;
+        _cleanup_udev_unref_ struct udev *udev = NULL;
+        _cleanup_free_ char *loop_dev = NULL;
+        struct stat st;
+        const char *v;
+        int r;
+
+        r = find_loop_device(arg_mount_what, &loop_dev);
+        if (r < 0 && r != -ENXIO)
+                return log_error_errno(errno, "Can't get loop device for %s: %m", arg_mount_what);
+
+        if (r == -ENXIO) {
+                _cleanup_free_ char *escaped = NULL;
+
+                if (arg_mount_where)
+                        return 0;
+
+                escaped = xescape(basename(arg_mount_what), "\\");
+                if (!escaped)
+                        return log_oom();
+                if (!filename_is_valid(escaped)) {
+                        log_error("Escaped name %s is not a valid filename.", escaped);
+                        return -EINVAL;
+                }
+
+                arg_mount_where = strjoin("/run/media/system/", escaped);
+                if (!arg_mount_where)
+                        return log_oom();
+
+                log_debug("Discovered where=%s", arg_mount_where);
+                return 0;
+        }
+
+        if (stat(loop_dev, &st) < 0)
+                return log_error_errno(errno, "Can't stat %s: %m", loop_dev);
+
+        if (!S_ISBLK(st.st_mode)) {
+                log_error("Invalid file type: %s", loop_dev);
+                return -EINVAL;
+        }
+
+        udev = udev_new();
+        if (!udev)
+                return log_oom();
+
+        d = udev_device_new_from_devnum(udev, 'b', st.st_rdev);
+        if (!d)
+                return log_oom();
+
+        v = udev_device_get_property_value(d, "ID_FS_USAGE");
+        if (!streq_ptr(v, "filesystem")) {
+                log_error("%s does not contain a known file system.", arg_mount_what);
+                return -EINVAL;
+        }
+
+        r = acquire_mount_type(d);
+        if (r < 0)
+                return r;
+
+        r = acquire_mount_options(d);
+        if (r < 0)
+                return r;
+
+        r = acquire_mount_where_for_loop_dev(loop_dev);
+        if (r < 0)
+                return r;
+
+        r = acquire_description(d);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
+static int discover_device(void) {
+        _cleanup_udev_device_unref_ struct udev_device *d = NULL;
+        _cleanup_udev_unref_ struct udev *udev = NULL;
+        struct stat st;
+        const char *v;
+        int r;
+
+        if (stat(arg_mount_what, &st) < 0)
+                return log_error_errno(errno, "Can't stat %s: %m", arg_mount_what);
+
+        if (S_ISREG(st.st_mode))
+                return discover_loop_backing_file();
+
+        if (!S_ISBLK(st.st_mode)) {
+                log_error("Invalid file type: %s", arg_mount_what);
+                return -EINVAL;
+        }
+
+        udev = udev_new();
+        if (!udev)
+                return log_oom();
+
+        d = udev_device_new_from_devnum(udev, 'b', st.st_rdev);
+        if (!d)
+                return log_oom();
+
+        v = udev_device_get_property_value(d, "ID_FS_USAGE");
+        if (!streq_ptr(v, "filesystem")) {
+                log_error("%s does not contain a known file system.", arg_mount_what);
+                return -EINVAL;
+        }
+
+        r = acquire_mount_type(d);
+        if (r < 0)
+                return r;
+
+        r = acquire_mount_options(d);
+        if (r < 0)
+                return r;
+
+        r = acquire_mount_where(d);
+        if (r < 0)
+                return r;
+
+        r = acquire_description(d);
+        if (r < 0)
+                return r;
+
+        r = acquire_removable(d);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
+enum {
+        COLUMN_NODE,
+        COLUMN_PATH,
+        COLUMN_MODEL,
+        COLUMN_WWN,
+        COLUMN_FSTYPE,
+        COLUMN_LABEL,
+        COLUMN_UUID,
+        _COLUMN_MAX,
+};
+
+struct item {
+        char* columns[_COLUMN_MAX];
+};
+
+static int compare_item(const void *a, const void *b) {
+        const struct item *x = a, *y = b;
+
+        if (x->columns[COLUMN_NODE] == y->columns[COLUMN_NODE])
+                return 0;
+        if (!x->columns[COLUMN_NODE])
+                return 1;
+        if (!y->columns[COLUMN_NODE])
+                return -1;
+
+        return path_compare(x->columns[COLUMN_NODE], y->columns[COLUMN_NODE]);
+}
+
+static int list_devices(void) {
+
+        static const char * const titles[_COLUMN_MAX] = {
+                [COLUMN_NODE] = "NODE",
+                [COLUMN_PATH] = "PATH",
+                [COLUMN_MODEL] = "MODEL",
+                [COLUMN_WWN] = "WWN",
+                [COLUMN_FSTYPE] = "TYPE",
+                [COLUMN_LABEL] = "LABEL",
+                [COLUMN_UUID] = "UUID"
+        };
+
+        _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
+        _cleanup_udev_unref_ struct udev *udev = NULL;
+        struct udev_list_entry *item = NULL, *first = NULL;
+        size_t n_allocated = 0, n = 0, i;
+        size_t column_width[_COLUMN_MAX];
+        struct item *items = NULL;
+        unsigned c;
+        int r;
+
+        for (c = 0; c < _COLUMN_MAX; c++)
+                column_width[c] = strlen(titles[c]);
+
+        udev = udev_new();
+        if (!udev)
+                return log_oom();
+
+        e = udev_enumerate_new(udev);
+        if (!e)
+                return log_oom();
+
+        r = udev_enumerate_add_match_subsystem(e, "block");
+        if (r < 0)
+                return log_error_errno(r, "Failed to add block match: %m");
+
+        r = udev_enumerate_add_match_property(e, "ID_FS_USAGE", "filesystem");
+        if (r < 0)
+                return log_error_errno(r, "Failed to add property match: %m");
+
+        r = udev_enumerate_scan_devices(e);
+        if (r < 0)
+                return log_error_errno(r, "Failed to scan devices: %m");
+
+        first = udev_enumerate_get_list_entry(e);
+        udev_list_entry_foreach(item, first) {
+                _cleanup_udev_device_unref_ struct udev_device *d;
+                struct item *j;
+
+                d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item));
+                if (!d) {
+                        r = log_oom();
+                        goto finish;
+                }
+
+                if (!GREEDY_REALLOC0(items, n_allocated, n+1)) {
+                        r = log_oom();
+                        goto finish;
+                }
+
+                j = items + n++;
+
+                for (c = 0; c < _COLUMN_MAX; c++) {
+                        const char *x = NULL;
+                        size_t k;
+
+                        switch (c) {
+
+                        case COLUMN_NODE:
+                                x = udev_device_get_devnode(d);
+                                break;
+
+                        case COLUMN_PATH:
+                                x = udev_device_get_property_value(d, "ID_PATH");
+                                break;
+
+                        case COLUMN_MODEL:
+                                x = get_model(d);
+                                break;
+
+                        case COLUMN_WWN:
+                                x = udev_device_get_property_value(d, "ID_WWN");
+                                break;
+
+                        case COLUMN_FSTYPE:
+                                x = udev_device_get_property_value(d, "ID_FS_TYPE");
+                                break;
+
+                        case COLUMN_LABEL:
+                                x = get_label(d);
+                                break;
+
+                        case COLUMN_UUID:
+                                x = udev_device_get_property_value(d, "ID_FS_UUID");
+                                break;
+                        }
+
+                        if (isempty(x))
+                                continue;
+
+                        j->columns[c] = strdup(x);
+                        if (!j->columns[c]) {
+                                r = log_oom();
+                                goto finish;
+                        }
+
+                        k = strlen(x);
+                        if (k > column_width[c])
+                                column_width[c] = k;
+                }
+        }
+
+        if (n == 0) {
+                log_info("No devices found.");
+                goto finish;
+        }
+
+        qsort_safe(items, n, sizeof(struct item), compare_item);
+
+        pager_open(arg_no_pager, false);
+
+        fputs(ansi_underline(), stdout);
+        for (c = 0; c < _COLUMN_MAX; c++) {
+                if (c > 0)
+                        fputc(' ', stdout);
+
+                printf("%-*s", (int) column_width[c], titles[c]);
+        }
+        fputs(ansi_normal(), stdout);
+        fputc('\n', stdout);
+
+        for (i = 0; i < n; i++) {
+                for (c = 0; c < _COLUMN_MAX; c++) {
+                        if (c > 0)
+                                fputc(' ', stdout);
+
+                        printf("%-*s", (int) column_width[c], strna(items[i].columns[c]));
+                }
+                fputc('\n', stdout);
+        }
+
+        r = 0;
+
+finish:
+        for (i = 0; i < n; i++)
+                for (c = 0; c < _COLUMN_MAX; c++)
+                        free(items[i].columns[c]);
+
+        free(items);
+        return r;
+}
+
+int main(int argc, char* argv[]) {
+        _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+        int r;
+
+        log_parse_environment();
+        log_open();
+
+        r = parse_argv(argc, argv);
+        if (r <= 0)
+                goto finish;
+
+        if (arg_action == ACTION_LIST) {
+                r = list_devices();
+                goto finish;
+        }
+
+        r = bus_connect_transport_systemd(arg_transport, arg_host, arg_user, &bus);
+        if (r < 0) {
+                log_error_errno(r, "Failed to create bus connection: %m");
+                goto finish;
+        }
+
+        if (arg_action == ACTION_UMOUNT) {
+                r = action_umount(bus, argc, argv);
+                goto finish;
+        }
+
+        if (!path_is_safe(arg_mount_what)) {
+                log_error("Path contains unsafe components: %s", arg_mount_what);
+                r = -EINVAL;
+                goto finish;
+        }
+
+        if (arg_discover) {
+                r = discover_device();
+                if (r < 0)
+                        goto finish;
+        }
+
+        if (!arg_mount_where) {
+                log_error("Can't figure out where to mount %s.", arg_mount_what);
+                r = -EINVAL;
+                goto finish;
+        }
+
+        if (path_equal(arg_mount_where, "/")) {
+                log_error("Refusing to operate on root directory.");
+                r = -EINVAL;
+                goto finish;
+        }
+
+        if (!path_is_safe(arg_mount_where)) {
+                log_error("Path contains unsafe components: %s", arg_mount_where);
+                r = -EINVAL;
+                goto finish;
+        }
+
+        if (streq_ptr(arg_mount_type, "auto"))
+                arg_mount_type = mfree(arg_mount_type);
+        if (streq_ptr(arg_mount_options, "defaults"))
+                arg_mount_options = mfree(arg_mount_options);
+
+        if (!is_device_path(arg_mount_what))
+                arg_fsck = false;
+
+        if (arg_fsck && arg_mount_type && arg_transport == BUS_TRANSPORT_LOCAL) {
+                r = fsck_exists(arg_mount_type);
+                if (r < 0)
+                        log_warning_errno(r, "Couldn't determine whether fsck for %s exists, proceeding anyway.", arg_mount_type);
+                else if (r == 0) {
+                        log_debug("Disabling file system check as fsck for %s doesn't exist.", arg_mount_type);
+                        arg_fsck = false; /* fsck doesn't exist, let's not attempt it */
+                }
+        }
+
+        switch (arg_action) {
+
+        case ACTION_MOUNT:
+        case ACTION_DEFAULT:
+                r = start_transient_mount(bus, argv + optind);
+                break;
+
+        case ACTION_AUTOMOUNT:
+                r = start_transient_automount(bus, argv + optind);
+                break;
+
+        default:
+                assert_not_reached("Unexpected action.");
+        }
+
+finish:
+        bus = sd_bus_flush_close_unref(bus);
+
+        pager_close();
+
+        free(arg_mount_what);
+        free(arg_mount_where);
+        free(arg_mount_type);
+        free(arg_mount_options);
+        free(arg_description);
+        strv_free(arg_property);
+        strv_free(arg_automount_property);
+
+        return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+}
index aca5520..2306717 100644 (file)
@@ -1,3 +1,2 @@
 /networkd-network-gperf.c
-/networkd-netdev-gperf.c
 /networkd-gperf.c
diff --git a/src/network/meson.build b/src/network/meson.build
new file mode 100644 (file)
index 0000000..35ecd86
--- /dev/null
@@ -0,0 +1,150 @@
+sources = files('''
+        netdev/bond.c
+        netdev/bond.h
+        netdev/bridge.c
+        netdev/bridge.h
+        netdev/dummy.c
+        netdev/dummy.h
+        netdev/ipvlan.c
+        netdev/ipvlan.h
+        netdev/macvlan.c
+        netdev/macvlan.h
+        netdev/netdev.c
+        netdev/netdev.h
+        netdev/tunnel.c
+        netdev/tunnel.h
+        netdev/tuntap.c
+        netdev/tuntap.h
+        netdev/vcan.c
+        netdev/vcan.h
+        netdev/veth.c
+        netdev/veth.h
+        netdev/vlan.c
+        netdev/vlan.h
+        netdev/vrf.c
+        netdev/vrf.h
+        netdev/vxlan.c
+        netdev/vxlan.h
+        netdev/geneve.c
+        netdev/geneve.h
+        networkd-address-label.c
+        networkd-address-label.h
+        networkd-address-pool.c
+        networkd-address-pool.h
+        networkd-address.c
+        networkd-address.h
+        networkd-brvlan.c
+        networkd-brvlan.h
+        networkd-conf.c
+        networkd-conf.h
+        networkd-dhcp4.c
+        networkd-dhcp6.c
+        networkd-fdb.c
+        networkd-fdb.h
+        networkd-ipv4ll.c
+        networkd-ipv6-proxy-ndp.c
+        networkd-ipv6-proxy-ndp.h
+        networkd-link-bus.c
+        networkd-link.c
+        networkd-link.h
+        networkd-lldp-tx.c
+        networkd-lldp-tx.h
+        networkd-manager-bus.c
+        networkd-manager.c
+        networkd-manager.h
+        networkd-ndisc.c
+        networkd-ndisc.h
+        networkd-radv.c
+        networkd-radv.h
+        networkd-network-bus.c
+        networkd-network.c
+        networkd-network.h
+        networkd-route.c
+        networkd-route.h
+        networkd-util.c
+        networkd-util.h
+'''.split())
+
+systemd_networkd_sources = files('networkd.c')
+
+systemd_networkd_wait_online_sources = files('''
+        wait-online/link.c
+        wait-online/link.h
+        wait-online/manager.c
+        wait-online/manager.h
+        wait-online/wait-online.c
+'''.split()) + network_internal_h
+
+networkctl_sources = files('networkctl.c')
+
+network_include_dir = include_directories('.')
+
+if conf.get('ENABLE_NETWORKD', false)
+        networkd_gperf_c = custom_target(
+                'networkd-gperf.c',
+                input : 'networkd-gperf.gperf',
+                output : 'networkd-gperf.c',
+                command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@'])
+
+        networkd_network_gperf_c = custom_target(
+                'networkd-network-gperf.c',
+                input : 'networkd-network-gperf.gperf',
+                output : 'networkd-network-gperf.c',
+                command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@'])
+
+        netdev_gperf_c = custom_target(
+                'netdev-gperf.c',
+                input : 'netdev/netdev-gperf.gperf',
+                output : 'netdev-gperf.c',
+                command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@'])
+
+        libnetworkd_core = static_library(
+                'networkd-core',
+                sources,
+                network_internal_h,
+                networkd_gperf_c,
+                networkd_network_gperf_c,
+                netdev_gperf_c,
+                include_directories : includes,
+                link_with : [libshared])
+
+        install_data('org.freedesktop.network1.conf',
+                     install_dir : dbuspolicydir)
+        install_data('org.freedesktop.network1.service',
+                     install_dir : dbussystemservicedir)
+        if install_polkit
+                install_data('systemd-networkd.rules',
+                             install_dir : polkitrulesdir)
+        endif
+        if install_polkit_pkla
+                install_data('systemd-networkd.pkla',
+                             install_dir : polkitpkladir)
+        endif
+
+        tests += [
+    [['src/network/test-networkd-conf.c'],
+     [libnetworkd_core,
+      libsystemd_network,
+      libudev],
+     []],
+
+    [['src/network/test-network.c'],
+     [libnetworkd_core,
+      libudev_internal,
+      libsystemd_network,
+      libshared],
+     [threads]],
+
+    [['src/network/test-network-tables.c',
+      'src/network/test-network-tables.c',
+      test_tables_h],
+     [libnetworkd_core,
+      libudev_internal,
+      libudev_core,
+      libsystemd_network,
+      libshared],
+     [threads],
+     '', '', [],
+     [network_include_dir] + libudev_core_includes],
+  ]
+endif
diff --git a/src/network/netdev/.gitignore b/src/network/netdev/.gitignore
new file mode 100644 (file)
index 0000000..0f1a65d
--- /dev/null
@@ -0,0 +1 @@
+/netdev-gperf.c
diff --git a/src/network/netdev/Makefile b/src/network/netdev/Makefile
new file mode 120000 (symlink)
index 0000000..94aaae2
--- /dev/null
@@ -0,0 +1 @@
+../../Makefile
\ No newline at end of file
similarity index 98%
rename from src/network/networkd-netdev-bond.c
rename to src/network/netdev/bond.c
index 7913b00..19b0e8d 100644 (file)
@@ -27,7 +27,7 @@
 #include "conf-parser.h"
 #include "extract-word.h"
 #include "missing.h"
-#include "networkd-netdev-bond.h"
+#include "netdev/bond.h"
 #include "string-table.h"
 #include "string-util.h"
 
@@ -268,13 +268,13 @@ static int netdev_bond_fill_message_create(NetDev *netdev, Link *link, sd_netlin
         if (b->arp_all_targets != _NETDEV_BOND_ARP_ALL_TARGETS_INVALID) {
                 r = sd_netlink_message_append_u32(m, IFLA_BOND_ARP_ALL_TARGETS, b->arp_all_targets);
                 if (r < 0)
-                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_BOND_ARP_VALIDATE attribute: %m");
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_BOND_ARP_ALL_TARGETS attribute: %m");
         }
 
         if (b->primary_reselect != _NETDEV_BOND_PRIMARY_RESELECT_INVALID) {
-                r = sd_netlink_message_append_u32(m, IFLA_BOND_ARP_ALL_TARGETS, b->primary_reselect);
+                r = sd_netlink_message_append_u8(m, IFLA_BOND_PRIMARY_RESELECT, b->primary_reselect);
                 if (r < 0)
-                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_BOND_ARP_ALL_TARGETS attribute: %m");
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_BOND_PRIMARY_RESELECT attribute: %m");
         }
 
         if (b->resend_igmp <= RESEND_IGMP_MAX) {
similarity index 99%
rename from src/network/networkd-netdev-bond.h
rename to src/network/netdev/bond.h
index b941edb..fb88b53 100644 (file)
@@ -22,7 +22,7 @@
 #include "in-addr-util.h"
 #include "list.h"
 
-#include "networkd-netdev.h"
+#include "netdev/netdev.h"
 
 /*
  * Maximum number of targets supported by the kernel for a single
similarity index 78%
rename from src/network/networkd-netdev-bridge.c
rename to src/network/netdev/bridge.c
index a5085d2..cf6c591 100644 (file)
@@ -22,8 +22,9 @@
 
 #include "missing.h"
 #include "netlink-util.h"
-#include "networkd.h"
-#include "networkd-netdev-bridge.h"
+#include "netdev/bridge.h"
+#include "networkd-manager.h"
+#include "vlan-util.h"
 
 /* callback for brige netdev's parameter set */
 static int netdev_bridge_set_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
@@ -39,7 +40,7 @@ static int netdev_bridge_set_handler(sd_netlink *rtnl, sd_netlink_message *m, vo
                 return 1;
         }
 
-        log_netdev_debug(netdev, "Bridge parametres set success");
+        log_netdev_debug(netdev, "Bridge parameters set success");
 
         return 1;
 }
@@ -72,7 +73,7 @@ static int netdev_bridge_post_create(NetDev *netdev, Link *link, sd_netlink_mess
                 return log_netdev_error_errno(netdev, r, "Could not append IFLA_INFO_DATA attribute: %m");
 
         /* convert to jiffes */
-        if (b->forward_delay > 0) {
+        if (b->forward_delay != USEC_INFINITY) {
                 r = sd_netlink_message_append_u32(req, IFLA_BR_FORWARD_DELAY, usec_to_jiffies(b->forward_delay));
                 if (r < 0)
                         return log_netdev_error_errno(netdev, r, "Could not append IFLA_BR_FORWARD_DELAY attribute: %m");
@@ -90,6 +91,24 @@ static int netdev_bridge_post_create(NetDev *netdev, Link *link, sd_netlink_mess
                         return log_netdev_error_errno(netdev, r, "Could not append IFLA_BR_MAX_AGE attribute: %m");
         }
 
+        if (b->ageing_time > 0) {
+                r = sd_netlink_message_append_u32(req, IFLA_BR_AGEING_TIME, usec_to_jiffies(b->ageing_time));
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_BR_AGEING_TIME attribute: %m");
+        }
+
+        if (b->priority > 0) {
+                r = sd_netlink_message_append_u16(req, IFLA_BR_PRIORITY, b->priority);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_BR_PRIORITY attribute: %m");
+        }
+
+        if (b->default_pvid != VLANID_INVALID) {
+                r = sd_netlink_message_append_u16(req, IFLA_BR_VLAN_DEFAULT_PVID, b->default_pvid);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_BR_VLAN_DEFAULT_PVID attribute: %m");
+        }
+
         if (b->mcast_querier >= 0) {
                 r = sd_netlink_message_append_u8(req, IFLA_BR_MCAST_QUERIER, b->mcast_querier);
                 if (r < 0)
@@ -108,6 +127,12 @@ static int netdev_bridge_post_create(NetDev *netdev, Link *link, sd_netlink_mess
                         return log_netdev_error_errno(netdev, r, "Could not append IFLA_BR_VLAN_FILTERING attribute: %m");
         }
 
+        if (b->stp >= 0) {
+                r = sd_netlink_message_append_u32(req, IFLA_BR_STP_STATE, b->stp);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_BR_STP_STATE attribute: %m");
+        }
+
         r = sd_netlink_message_close_container(req);
         if (r < 0)
                 return log_netdev_error_errno(netdev, r, "Could not append IFLA_LINKINFO attribute: %m");
@@ -135,6 +160,9 @@ static void bridge_init(NetDev *n) {
         b->mcast_querier = -1;
         b->mcast_snooping = -1;
         b->vlan_filtering = -1;
+        b->stp = -1;
+        b->default_pvid = VLANID_INVALID;
+        b->forward_delay = USEC_INFINITY;
 }
 
 const NetDevVTable bridge_vtable = {
similarity index 88%
rename from src/network/networkd-netdev-bridge.h
rename to src/network/netdev/bridge.h
index a637aea..093c60d 100644 (file)
@@ -19,7 +19,7 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include "networkd-netdev.h"
+#include "netdev/netdev.h"
 
 typedef struct Bridge {
         NetDev meta;
@@ -27,10 +27,14 @@ typedef struct Bridge {
         int mcast_querier;
         int mcast_snooping;
         int vlan_filtering;
+        int stp;
+        uint16_t priority;
+        uint16_t default_pvid;
 
         usec_t forward_delay;
         usec_t hello_time;
         usec_t max_age;
+        usec_t ageing_time;
 } Bridge;
 
 DEFINE_NETDEV_CAST(BRIDGE, Bridge);
similarity index 96%
rename from src/network/networkd-netdev-dummy.c
rename to src/network/netdev/dummy.c
index 6617a86..5e6e162 100644 (file)
@@ -19,7 +19,7 @@
 ***/
 
 
-#include "networkd-netdev-dummy.h"
+#include "netdev/dummy.h"
 
 const NetDevVTable dummy_vtable = {
         .object_size = sizeof(Dummy),
similarity index 96%
rename from src/network/networkd-netdev-dummy.h
rename to src/network/netdev/dummy.h
index efe3022..a908400 100644 (file)
@@ -19,7 +19,7 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include "networkd-netdev.h"
+#include "netdev/netdev.h"
 
 typedef struct Dummy {
         NetDev meta;
diff --git a/src/network/netdev/geneve.c b/src/network/netdev/geneve.c
new file mode 100644 (file)
index 0000000..e71ea58
--- /dev/null
@@ -0,0 +1,315 @@
+/***
+    This file is part of systemd.
+
+    Copyright 2017 Susant Sahani
+
+    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 <net/if.h>
+
+#include "alloc-util.h"
+#include "conf-parser.h"
+#include "extract-word.h"
+#include "geneve.h"
+#include "parse-util.h"
+#include "sd-netlink.h"
+#include "string-util.h"
+#include "strv.h"
+#include "missing.h"
+#include "networkd-manager.h"
+
+#define GENEVE_FLOW_LABEL_MAX_MASK 0xFFFFFU
+#define DEFAULT_GENEVE_DESTINATION_PORT 6081
+
+/* callback for geneve netdev's created without a backing Link */
+static int geneve_netdev_create_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
+        _cleanup_netdev_unref_ NetDev *netdev = userdata;
+        int r;
+
+        assert(netdev->state != _NETDEV_STATE_INVALID);
+
+        r = sd_netlink_message_get_errno(m);
+        if (r == -EEXIST)
+                log_netdev_info(netdev, "Geneve netdev exists, using existing without changing its parameters");
+        else if (r < 0) {
+                log_netdev_warning_errno(netdev, r, "Geneve netdev could not be created: %m");
+                netdev_drop(netdev);
+
+                return 1;
+        }
+
+        log_netdev_debug(netdev, "Geneve created");
+
+        return 1;
+}
+
+static int netdev_geneve_create(NetDev *netdev) {
+        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
+        Geneve *v;
+        int r;
+
+        assert(netdev);
+
+        v = GENEVE(netdev);
+
+        r = sd_rtnl_message_new_link(netdev->manager->rtnl, &m, RTM_NEWLINK, 0);
+        if (r < 0)
+                return log_netdev_error_errno(netdev, r, "Could not allocate RTM_NEWLINK message: %m");
+
+        r = sd_netlink_message_append_string(m, IFLA_IFNAME, netdev->ifname);
+        if (r < 0)
+                return log_netdev_error_errno(netdev, r, "Could not append IFLA_IFNAME, attribute: %m");
+
+        if (netdev->mac) {
+                r = sd_netlink_message_append_ether_addr(m, IFLA_ADDRESS, netdev->mac);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_ADDRESS attribute: %m");
+        }
+
+        if (netdev->mtu) {
+                r = sd_netlink_message_append_u32(m, IFLA_MTU, netdev->mtu);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_MTU attribute: %m");
+        }
+
+        r = sd_netlink_message_open_container(m, IFLA_LINKINFO);
+        if (r < 0)
+                return log_netdev_error_errno(netdev, r, "Could not append IFLA_LINKINFO attribute: %m");
+
+        r = sd_netlink_message_open_container_union(m, IFLA_INFO_DATA, netdev_kind_to_string(netdev->kind));
+        if (r < 0)
+                return log_netdev_error_errno(netdev, r, "Could not append IFLA_INFO_DATA attribute: %m");
+
+        if (v->id <= GENEVE_VID_MAX) {
+                r = sd_netlink_message_append_u32(m, IFLA_GENEVE_ID, v->id);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_ID attribute: %m");
+        }
+
+        if (!in_addr_is_null(v->remote_family, &v->remote)) {
+
+                if (v->remote_family == AF_INET)
+                        r = sd_netlink_message_append_in_addr(m, IFLA_GENEVE_REMOTE, &v->remote.in);
+                else
+                        r = sd_netlink_message_append_in6_addr(m, IFLA_GENEVE_REMOTE6, &v->remote.in6);
+
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_GROUP attribute: %m");
+
+        }
+
+        if (v->ttl) {
+                r = sd_netlink_message_append_u8(m, IFLA_GENEVE_TTL, v->ttl);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_TTL attribute: %m");
+        }
+
+        r = sd_netlink_message_append_u8(m, IFLA_GENEVE_TOS, v->tos);
+        if (r < 0)
+                return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_TOS attribute: %m");
+
+        r = sd_netlink_message_append_u8(m, IFLA_GENEVE_UDP_CSUM, v->udpcsum);
+        if (r < 0)
+                return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_UDP_CSUM attribute: %m");
+
+        r = sd_netlink_message_append_u8(m, IFLA_GENEVE_UDP_ZERO_CSUM6_TX, v->udp6zerocsumtx);
+        if (r < 0)
+                return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_UDP_ZERO_CSUM6_TX attribute: %m");
+
+        r = sd_netlink_message_append_u8(m, IFLA_GENEVE_UDP_ZERO_CSUM6_RX, v->udp6zerocsumrx);
+        if (r < 0)
+                return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_UDP_ZERO_CSUM6_RX attribute: %m");
+
+        if (v->dest_port != DEFAULT_GENEVE_DESTINATION_PORT) {
+                r = sd_netlink_message_append_u16(m, IFLA_GENEVE_PORT, htobe16(v->dest_port));
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_PORT attribute: %m");
+        }
+
+        if (v->flow_label > 0) {
+                r = sd_netlink_message_append_u32(m, IFLA_GENEVE_LABEL, htobe32(v->flow_label));
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_LABEL attribute: %m");
+        }
+
+        r = sd_netlink_message_close_container(m);
+        if (r < 0)
+                return log_netdev_error_errno(netdev, r, "Could not append IFLA_INFO_DATA attribute: %m");
+
+        r = sd_netlink_message_close_container(m);
+        if (r < 0)
+                return log_netdev_error_errno(netdev, r, "Could not append IFLA_LINKINFO attribute: %m");
+
+        r = sd_netlink_call_async(netdev->manager->rtnl, m, geneve_netdev_create_handler, netdev, 0, NULL);
+        if (r < 0)
+                return log_netdev_error_errno(netdev, r, "Could not send rtnetlink message: %m");
+
+        netdev_ref(netdev);
+
+        netdev->state = NETDEV_STATE_CREATING;
+
+        log_netdev_debug(netdev, "Creating");
+
+
+        return r;
+}
+
+int config_parse_geneve_vni(const char *unit,
+                           const char *filename,
+                           unsigned line,
+                           const char *section,
+                           unsigned section_line,
+                           const char *lvalue,
+                           int ltype,
+                           const char *rvalue,
+                           void *data,
+                           void *userdata) {
+        Geneve *v = userdata;
+        uint32_t f;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = safe_atou32(rvalue, &f);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse Geneve VNI '%s'.", rvalue);
+                return 0;
+        }
+
+        if (f > GENEVE_VID_MAX){
+                log_syntax(unit, LOG_ERR, filename, line, r, "Geneve VNI out is of range '%s'.", rvalue);
+                return 0;
+        }
+
+        v->id = f;
+
+        return 0;
+}
+
+int config_parse_geneve_address(const char *unit,
+                                const char *filename,
+                                unsigned line,
+                                const char *section,
+                                unsigned section_line,
+                                const char *lvalue,
+                                int ltype,
+                                const char *rvalue,
+                                void *data,
+                                void *userdata) {
+        Geneve *v = userdata;
+        union in_addr_union *addr = data, buffer;
+        int r, f;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = in_addr_from_string_auto(rvalue, &f, &buffer);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "geneve '%s' address is invalid, ignoring assignment: %s", lvalue, rvalue);
+                return 0;
+        }
+
+        r = in_addr_is_multicast(f, &buffer);
+        if (r > 0) {
+                log_syntax(unit, LOG_ERR, filename, line, 0, "geneve invalid multicast '%s' address, ignoring assignment: %s", lvalue, rvalue);
+                return 0;
+        }
+
+        v->remote_family = f;
+        *addr = buffer;
+
+        return 0;
+}
+
+int config_parse_geneve_flow_label(const char *unit,
+                                   const char *filename,
+                                   unsigned line,
+                                   const char *section,
+                                   unsigned section_line,
+                                   const char *lvalue,
+                                   int ltype,
+                                   const char *rvalue,
+                                   void *data,
+                                   void *userdata) {
+        Geneve *v = userdata;
+        uint32_t f;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = safe_atou32(rvalue, &f);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse Geneve flow label '%s'.", rvalue);
+                return 0;
+        }
+
+        if (f & ~GENEVE_FLOW_LABEL_MAX_MASK) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Geneve flow label '%s' not valid. Flow label range should be [0-1048575].", rvalue);
+                return 0;
+        }
+
+        v->flow_label = f;
+
+        return 0;
+}
+
+static int netdev_geneve_verify(NetDev *netdev, const char *filename) {
+        Geneve *v = GENEVE(netdev);
+
+        assert(netdev);
+        assert(v);
+        assert(filename);
+
+        if (v->ttl == 0) {
+                log_warning("Invalid Geneve TTL value '0' configured in '%s'. Ignoring", filename);
+                return -EINVAL;
+        }
+
+        return 0;
+}
+
+static void geneve_init(NetDev *netdev) {
+        Geneve *v;
+
+        assert(netdev);
+
+        v = GENEVE(netdev);
+
+        assert(v);
+
+        v->id = GENEVE_VID_MAX + 1;
+        v->dest_port = DEFAULT_GENEVE_DESTINATION_PORT;
+        v->udpcsum = false;
+        v->udp6zerocsumtx = false;
+        v->udp6zerocsumrx = false;
+}
+
+const NetDevVTable geneve_vtable = {
+        .object_size = sizeof(Geneve),
+        .init = geneve_init,
+        .sections = "Match\0NetDev\0GENEVE\0",
+        .create = netdev_geneve_create,
+        .create_type = NETDEV_CREATE_INDEPENDENT,
+        .config_verify = netdev_geneve_verify,
+};
diff --git a/src/network/netdev/geneve.h b/src/network/netdev/geneve.h
new file mode 100644 (file)
index 0000000..bde28ba
--- /dev/null
@@ -0,0 +1,85 @@
+#pragma once
+
+/***
+  This file is part of systemd.
+
+  Copyright 2017 Susant Sahani
+
+  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/>.
+***/
+
+typedef struct Geneve Geneve;
+
+#include "in-addr-util.h"
+#include "netdev.h"
+#include "networkd-link.h"
+#include "networkd-network.h"
+
+#define GENEVE_VID_MAX (1u << 24) - 1
+
+struct Geneve {
+        NetDev meta;
+
+        uint32_t id;
+        uint32_t flow_label;
+
+        int remote_family;
+
+        uint8_t tos;
+        uint8_t ttl;
+
+        uint16_t dest_port;
+
+        bool udpcsum;
+        bool udp6zerocsumtx;
+        bool udp6zerocsumrx;
+
+        union in_addr_union remote;
+};
+
+DEFINE_NETDEV_CAST(GENEVE, Geneve);
+extern const NetDevVTable geneve_vtable;
+
+int config_parse_geneve_vni(const char *unit,
+                            const char *filename,
+                            unsigned line,
+                            const char *section,
+                            unsigned section_line,
+                            const char *lvalue,
+                            int ltype,
+                            const char *rvalue,
+                            void *data,
+                            void *userdata);
+
+int config_parse_geneve_address(const char *unit,
+                               const char *filename,
+                               unsigned line,
+                               const char *section,
+                               unsigned section_line,
+                               const char *lvalue,
+                               int ltype,
+                               const char *rvalue,
+                               void *data,
+                               void *userdata);
+
+int config_parse_geneve_flow_label(const char *unit,
+                                   const char *filename,
+                                   unsigned line,
+                                   const char *section,
+                                   unsigned section_line,
+                                   const char *lvalue,
+                                   int ltype,
+                                   const char *rvalue,
+                                   void *data,
+                                   void *userdata);
similarity index 98%
rename from src/network/networkd-netdev-ipvlan.c
rename to src/network/netdev/ipvlan.c
index af4177e..3b5c30f 100644 (file)
@@ -20,7 +20,7 @@
 #include <net/if.h>
 
 #include "conf-parser.h"
-#include "networkd-netdev-ipvlan.h"
+#include "netdev/ipvlan.h"
 #include "string-table.h"
 
 static const char* const ipvlan_mode_table[_NETDEV_IPVLAN_MODE_MAX] = {
similarity index 98%
rename from src/network/networkd-netdev-ipvlan.h
rename to src/network/netdev/ipvlan.h
index 10d4079..7d7d018 100644 (file)
@@ -20,7 +20,7 @@
 ***/
 
 #include "missing.h"
-#include "networkd-netdev.h"
+#include "netdev/netdev.h"
 
 typedef enum IPVlanMode {
         NETDEV_IPVLAN_MODE_L2 = IPVLAN_MODE_L2,
similarity index 98%
rename from src/network/networkd-netdev-macvlan.c
rename to src/network/netdev/macvlan.c
index 48e98aa..93f650d 100644 (file)
@@ -20,7 +20,7 @@
 #include <net/if.h>
 
 #include "conf-parser.h"
-#include "networkd-netdev-macvlan.h"
+#include "netdev/macvlan.h"
 #include "string-table.h"
 
 static const char* const macvlan_mode_table[_NETDEV_MACVLAN_MODE_MAX] = {
similarity index 98%
rename from src/network/networkd-netdev-macvlan.h
rename to src/network/netdev/macvlan.h
index 3663f4f..118d556 100644 (file)
@@ -21,7 +21,7 @@
 
 typedef struct MacVlan MacVlan;
 
-#include "networkd-netdev.h"
+#include "netdev/netdev.h"
 
 typedef enum MacVlanMode {
         NETDEV_MACVLAN_MODE_PRIVATE = MACVLAN_MODE_PRIVATE,
diff --git a/src/network/netdev/netdev-gperf.gperf b/src/network/netdev/netdev-gperf.gperf
new file mode 100644 (file)
index 0000000..8b235a4
--- /dev/null
@@ -0,0 +1,136 @@
+%{
+#include <stddef.h>
+#include "conf-parser.h"
+#include "network-internal.h"
+#include "netdev/bond.h"
+#include "netdev/bridge.h"
+#include "netdev/geneve.h"
+#include "netdev/ipvlan.h"
+#include "netdev/macvlan.h"
+#include "netdev/tunnel.h"
+#include "netdev/tuntap.h"
+#include "netdev/veth.h"
+#include "netdev/vlan.h"
+#include "netdev/vxlan.h"
+#include "netdev/vrf.h"
+#include "netdev/netdev.h"
+#include "vlan-util.h"
+%}
+struct ConfigPerfItem;
+%null_strings
+%language=ANSI-C
+%define slot-name section_and_lvalue
+%define hash-function-name network_netdev_gperf_hash
+%define lookup-function-name network_netdev_gperf_lookup
+%readonly-tables
+%omit-struct-type
+%struct-type
+%includes
+%%
+Match.Host,                  config_parse_net_condition,           CONDITION_HOST,                offsetof(NetDev, match_host)
+Match.Virtualization,        config_parse_net_condition,           CONDITION_VIRTUALIZATION,      offsetof(NetDev, match_virt)
+Match.KernelCommandLine,     config_parse_net_condition,           CONDITION_KERNEL_COMMAND_LINE, offsetof(NetDev, match_kernel)
+Match.Architecture,          config_parse_net_condition,           CONDITION_ARCHITECTURE,        offsetof(NetDev, match_arch)
+NetDev.Description,          config_parse_string,                  0,                             offsetof(NetDev, description)
+NetDev.Name,                 config_parse_ifname,                  0,                             offsetof(NetDev, ifname)
+NetDev.Kind,                 config_parse_netdev_kind,             0,                             offsetof(NetDev, kind)
+NetDev.MTUBytes,             config_parse_iec_size,                0,                             offsetof(NetDev, mtu)
+NetDev.MACAddress,           config_parse_hwaddr,                  0,                             offsetof(NetDev, mac)
+VLAN.Id,                     config_parse_vlanid,                  0,                             offsetof(VLan, id)
+VLAN.GVRP,                   config_parse_tristate,                0,                             offsetof(VLan, gvrp)
+VLAN.MVRP,                   config_parse_tristate,                0,                             offsetof(VLan, mvrp)
+VLAN.LooseBinding,           config_parse_tristate,                0,                             offsetof(VLan, loose_binding)
+VLAN.ReorderHeader,          config_parse_tristate,                0,                             offsetof(VLan, reorder_hdr)
+MACVLAN.Mode,                config_parse_macvlan_mode,            0,                             offsetof(MacVlan, mode)
+MACVTAP.Mode,                config_parse_macvlan_mode,            0,                             offsetof(MacVlan, mode)
+IPVLAN.Mode,                 config_parse_ipvlan_mode,             0,                             offsetof(IPVlan, mode)
+Tunnel.Local,                config_parse_tunnel_address,          0,                             offsetof(Tunnel, local)
+Tunnel.Remote,               config_parse_tunnel_address,          0,                             offsetof(Tunnel, remote)
+Tunnel.TOS,                  config_parse_unsigned,                0,                             offsetof(Tunnel, tos)
+Tunnel.TTL,                  config_parse_unsigned,                0,                             offsetof(Tunnel, ttl)
+Tunnel.Key,                  config_parse_tunnel_key,              0,                             offsetof(Tunnel, key)
+Tunnel.InputKey,             config_parse_tunnel_key,              0,                             offsetof(Tunnel, ikey)
+Tunnel.OutputKey,            config_parse_tunnel_key,              0,                             offsetof(Tunnel, okey)
+Tunnel.DiscoverPathMTU,      config_parse_bool,                    0,                             offsetof(Tunnel, pmtudisc)
+Tunnel.Mode,                 config_parse_ip6tnl_mode,             0,                             offsetof(Tunnel, ip6tnl_mode)
+Tunnel.IPv6FlowLabel,        config_parse_ipv6_flowlabel,          0,                             offsetof(Tunnel, ipv6_flowlabel)
+Tunnel.CopyDSCP,             config_parse_bool,                    0,                             offsetof(Tunnel, copy_dscp)
+Tunnel.EncapsulationLimit,   config_parse_encap_limit,             0,                             offsetof(Tunnel, encap_limit)
+Peer.Name,                   config_parse_ifname,                  0,                             offsetof(Veth, ifname_peer)
+Peer.MACAddress,             config_parse_hwaddr,                  0,                             offsetof(Veth, mac_peer)
+VXLAN.Id,                    config_parse_uint64,                  0,                             offsetof(VxLan, id)
+VXLAN.Group,                 config_parse_vxlan_address,           0,                             offsetof(VxLan, remote)
+VXLAN.Local,                 config_parse_vxlan_address,           0,                             offsetof(VxLan, local)
+VXLAN.Remote,                config_parse_vxlan_address,           0,                             offsetof(VxLan, remote)
+VXLAN.TOS,                   config_parse_unsigned,                0,                             offsetof(VxLan, tos)
+VXLAN.TTL,                   config_parse_unsigned,                0,                             offsetof(VxLan, ttl)
+VXLAN.MacLearning,           config_parse_bool,                    0,                             offsetof(VxLan, learning)
+VXLAN.ARPProxy,              config_parse_bool,                    0,                             offsetof(VxLan, arp_proxy)
+VXLAN.ReduceARPProxy,        config_parse_bool,                    0,                             offsetof(VxLan, arp_proxy)
+VXLAN.L2MissNotification,    config_parse_bool,                    0,                             offsetof(VxLan, l2miss)
+VXLAN.L3MissNotification,    config_parse_bool,                    0,                             offsetof(VxLan, l3miss)
+VXLAN.RouteShortCircuit,     config_parse_bool,                    0,                             offsetof(VxLan, route_short_circuit)
+VXLAN.UDPCheckSum,           config_parse_bool,                    0,                             offsetof(VxLan, udpcsum)
+VXLAN.UDPChecksum,           config_parse_bool,                    0,                             offsetof(VxLan, udpcsum)
+VXLAN.UDP6ZeroCheckSumRx,    config_parse_bool,                    0,                             offsetof(VxLan, udp6zerocsumrx)
+VXLAN.UDP6ZeroChecksumRx,    config_parse_bool,                    0,                             offsetof(VxLan, udp6zerocsumrx)
+VXLAN.UDP6ZeroCheckSumTx,    config_parse_bool,                    0,                             offsetof(VxLan, udp6zerocsumtx)
+VXLAN.UDP6ZeroChecksumTx,    config_parse_bool,                    0,                             offsetof(VxLan, udp6zerocsumtx)
+VXLAN.RemoteChecksumTx,      config_parse_bool,                    0,                             offsetof(VxLan, remote_csum_tx)
+VXLAN.RemoteChecksumRx,      config_parse_bool,                    0,                             offsetof(VxLan, remote_csum_rx)
+VXLAN.FDBAgeingSec,          config_parse_sec,                     0,                             offsetof(VxLan, fdb_ageing)
+VXLAN.GroupPolicyExtension,  config_parse_bool,                    0,                             offsetof(VxLan, group_policy)
+VXLAN.MaximumFDBEntries,     config_parse_unsigned,                0,                             offsetof(VxLan, max_fdb)
+VXLAN.PortRange,             config_parse_port_range,              0,                             0
+VXLAN.DestinationPort,       config_parse_ip_port,                 0,                             offsetof(VxLan, dest_port)
+VXLAN.FlowLabel,             config_parse_flow_label,              0,                             0
+GENEVE.Id,                   config_parse_geneve_vni,              0,                             offsetof(Geneve, id)
+GENEVE.Remote,               config_parse_geneve_address,          0,                             offsetof(Geneve, remote)
+GENEVE.TOS,                  config_parse_uint8,                   0,                             offsetof(Geneve, tos)
+GENEVE.TTL,                  config_parse_uint8,                   0,                             offsetof(Geneve, ttl)
+GENEVE.UDPChecksum,          config_parse_bool,                    0,                             offsetof(Geneve, udpcsum)
+GENEVE.UDP6ZeroCheckSumRx,   config_parse_bool,                    0,                             offsetof(Geneve, udp6zerocsumrx)
+GENEVE.UDP6ZeroCheckSumTx,   config_parse_bool,                    0,                             offsetof(Geneve, udp6zerocsumtx)
+GENEVE.DestinationPort,      config_parse_ip_port,                 0,                             offsetof(Geneve, dest_port)
+GENEVE.FlowLabel,            config_parse_geneve_flow_label,       0,                             0
+Tun.OneQueue,                config_parse_bool,                    0,                             offsetof(TunTap, one_queue)
+Tun.MultiQueue,              config_parse_bool,                    0,                             offsetof(TunTap, multi_queue)
+Tun.PacketInfo,              config_parse_bool,                    0,                             offsetof(TunTap, packet_info)
+Tun.User,                    config_parse_string,                  0,                             offsetof(TunTap, user_name)
+Tun.Group,                   config_parse_string,                  0,                             offsetof(TunTap, group_name)
+Tap.OneQueue,                config_parse_bool,                    0,                             offsetof(TunTap, one_queue)
+Tap.MultiQueue,              config_parse_bool,                    0,                             offsetof(TunTap, multi_queue)
+Tap.PacketInfo,              config_parse_bool,                    0,                             offsetof(TunTap, packet_info)
+Tap.VNetHeader,              config_parse_bool,                    0,                             offsetof(TunTap, vnet_hdr)
+Tap.User,                    config_parse_string,                  0,                             offsetof(TunTap, user_name)
+Tap.Group,                   config_parse_string,                  0,                             offsetof(TunTap, group_name)
+Bond.Mode,                   config_parse_bond_mode,               0,                             offsetof(Bond, mode)
+Bond.TransmitHashPolicy,     config_parse_bond_xmit_hash_policy,   0,                             offsetof(Bond, xmit_hash_policy)
+Bond.LACPTransmitRate,       config_parse_bond_lacp_rate,          0,                             offsetof(Bond, lacp_rate)
+Bond.AdSelect,               config_parse_bond_ad_select,          0,                             offsetof(Bond, ad_select)
+Bond.FailOverMACPolicy,      config_parse_bond_fail_over_mac,      0,                             offsetof(Bond, fail_over_mac)
+Bond.ARPIPTargets,           config_parse_arp_ip_target_address,   0,                             0
+Bond.ARPValidate,            config_parse_bond_arp_validate,       0,                             offsetof(Bond, arp_validate)
+Bond.ARPAllTargets,          config_parse_bond_arp_all_targets,    0,                             offsetof(Bond, arp_all_targets)
+Bond.PrimaryReselectPolicy,  config_parse_bond_primary_reselect,   0,                             offsetof(Bond, primary_reselect)
+Bond.ResendIGMP,             config_parse_unsigned,                0,                             offsetof(Bond, resend_igmp)
+Bond.PacketsPerSlave,        config_parse_unsigned,                0,                             offsetof(Bond, packets_per_slave)
+Bond.GratuitousARP,          config_parse_unsigned,                0,                             offsetof(Bond, num_grat_arp)
+Bond.AllSlavesActive,        config_parse_unsigned,                0,                             offsetof(Bond, all_slaves_active)
+Bond.MinLinks,               config_parse_unsigned,                0,                             offsetof(Bond, min_links)
+Bond.MIIMonitorSec,          config_parse_sec,                     0,                             offsetof(Bond, miimon)
+Bond.UpDelaySec,             config_parse_sec,                     0,                             offsetof(Bond, updelay)
+Bond.DownDelaySec,           config_parse_sec,                     0,                             offsetof(Bond, downdelay)
+Bond.ARPIntervalSec,         config_parse_sec,                     0,                             offsetof(Bond, arp_interval)
+Bond.LearnPacketIntervalSec, config_parse_sec,                     0,                             offsetof(Bond, lp_interval)
+Bridge.HelloTimeSec,         config_parse_sec,                     0,                             offsetof(Bridge, hello_time)
+Bridge.MaxAgeSec,            config_parse_sec,                     0,                             offsetof(Bridge, max_age)
+Bridge.AgeingTimeSec,        config_parse_sec,                     0,                             offsetof(Bridge, ageing_time)
+Bridge.ForwardDelaySec,      config_parse_sec,                     0,                             offsetof(Bridge, forward_delay)
+Bridge.Priority,             config_parse_uint16,                  0,                             offsetof(Bridge, priority)
+Bridge.DefaultPVID,          config_parse_default_port_vlanid,     0,                             offsetof(Bridge, default_pvid)
+Bridge.MulticastQuerier,     config_parse_tristate,                0,                             offsetof(Bridge, mcast_querier)
+Bridge.MulticastSnooping,    config_parse_tristate,                0,                             offsetof(Bridge, mcast_snooping)
+Bridge.VLANFiltering,        config_parse_tristate,                0,                             offsetof(Bridge, vlan_filtering)
+Bridge.STP,                  config_parse_tristate,                0,                             offsetof(Bridge, stp)
+VRF.TableId,                 config_parse_uint32,                  0,                             offsetof(Vrf, table_id)
similarity index 94%
rename from src/network/networkd-netdev.c
rename to src/network/netdev/netdev.c
index e7edc36..4388458 100644 (file)
 #include "list.h"
 #include "netlink-util.h"
 #include "network-internal.h"
-#include "networkd-netdev.h"
-#include "networkd.h"
+#include "netdev/netdev.h"
+#include "networkd-manager.h"
+#include "networkd-link.h"
 #include "siphash24.h"
 #include "stat-util.h"
 #include "string-table.h"
 #include "string-util.h"
 
-const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX] = {
+#include "netdev/bridge.h"
+#include "netdev/bond.h"
+#include "netdev/geneve.h"
+#include "netdev/vlan.h"
+#include "netdev/macvlan.h"
+#include "netdev/ipvlan.h"
+#include "netdev/vxlan.h"
+#include "netdev/tunnel.h"
+#include "netdev/tuntap.h"
+#include "netdev/veth.h"
+#include "netdev/dummy.h"
+#include "netdev/vrf.h"
+#include "netdev/vcan.h"
 
+const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX] = {
         [NETDEV_KIND_BRIDGE] = &bridge_vtable,
         [NETDEV_KIND_BOND] = &bond_vtable,
         [NETDEV_KIND_VLAN] = &vlan_vtable,
@@ -56,7 +70,8 @@ const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX] = {
         [NETDEV_KIND_TAP] = &tap_vtable,
         [NETDEV_KIND_IP6TNL] = &ip6tnl_vtable,
         [NETDEV_KIND_VRF] = &vrf_vtable,
-
+        [NETDEV_KIND_VCAN] = &vcan_vtable,
+        [NETDEV_KIND_GENEVE] = &geneve_vtable,
 };
 
 static const char* const netdev_kind_table[_NETDEV_KIND_MAX] = {
@@ -81,7 +96,8 @@ static const char* const netdev_kind_table[_NETDEV_KIND_MAX] = {
         [NETDEV_KIND_TAP] = "tap",
         [NETDEV_KIND_IP6TNL] = "ip6tnl",
         [NETDEV_KIND_VRF] = "vrf",
-
+        [NETDEV_KIND_VCAN] = "vcan",
+        [NETDEV_KIND_GENEVE] = "geneve",
 };
 
 DEFINE_STRING_TABLE_LOOKUP(netdev_kind, NetDevKind);
@@ -206,6 +222,13 @@ static int netdev_enslave_ready(NetDev *netdev, Link* link, sd_netlink_message_h
         assert(link);
         assert(callback);
 
+        if (link->flags & IFF_UP) {
+                log_netdev_debug(netdev, "Link '%s' was up when attempting to enslave it. Bringing link down.", link->ifname);
+                r = link_down(link);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not bring link down: %m");
+        }
+
         r = sd_rtnl_message_new_link(netdev->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
         if (r < 0)
                 return log_netdev_error_errno(netdev, r, "Could not allocate RTM_SETLINK message: %m");
@@ -516,7 +539,7 @@ static int netdev_create(NetDev *netdev, Link *link,
 
                 r = sd_netlink_message_close_container(m);
                 if (r < 0)
-                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_LINKINFO attribute: %m");
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_INFO_DATA attribute: %m");
 
                 r = sd_netlink_message_close_container(m);
                 if (r < 0)
@@ -577,6 +600,7 @@ static int netdev_load_one(Manager *manager, const char *filename) {
         _cleanup_netdev_unref_ NetDev *netdev = NULL;
         _cleanup_free_ NetDev *netdev_raw = NULL;
         _cleanup_fclose_ FILE *file = NULL;
+        const char *dropin_dirname;
         int r;
 
         assert(manager);
@@ -600,11 +624,12 @@ static int netdev_load_one(Manager *manager, const char *filename) {
                 return log_oom();
 
         netdev_raw->kind = _NETDEV_KIND_INVALID;
+        dropin_dirname = strjoina(basename(filename), ".d");
 
-        r = config_parse(NULL, filename, file,
-                         "Match\0NetDev\0",
-                         config_item_perf_lookup, network_netdev_gperf_lookup,
-                         true, false, true, netdev_raw);
+        r = config_parse_many(filename, network_dirs, dropin_dirname,
+                              "Match\0NetDev\0",
+                              config_item_perf_lookup, network_netdev_gperf_lookup,
+                              true, netdev_raw);
         if (r < 0)
                 return r;
 
@@ -620,7 +645,7 @@ static int netdev_load_one(Manager *manager, const char *filename) {
                 return 0;
 
         if (netdev_raw->kind == _NETDEV_KIND_INVALID) {
-                log_warning("NetDev with invalid Kind configured in %s. Ignoring", filename);
+                log_warning("NetDev has no Kind configured in %s. Ignoring", filename);
                 return 0;
         }
 
similarity index 96%
rename from src/network/networkd-netdev.h
rename to src/network/netdev/netdev.h
index b92a973..a961e2a 100644 (file)
@@ -56,6 +56,8 @@ typedef enum NetDevKind {
         NETDEV_KIND_TUN,
         NETDEV_KIND_TAP,
         NETDEV_KIND_VRF,
+        NETDEV_KIND_VCAN,
+        NETDEV_KIND_GENEVE,
         _NETDEV_KIND_MAX,
         _NETDEV_KIND_INVALID = -1
 } NetDevKind;
@@ -174,14 +176,14 @@ NetDevKind netdev_kind_from_string(const char *d) _pure_;
 int config_parse_netdev_kind(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 
 /* gperf */
-const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, unsigned length);
+const struct ConfigPerfItem* network_netdev_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
 
 /* Macros which append INTERFACE= to the message */
 
 #define log_netdev_full(netdev, level, error, ...)                      \
         ({                                                              \
-                NetDev *_n = (netdev);                                  \
-                _n ? log_object_internal(level, error, __FILE__, __LINE__, __func__, "INTERFACE=", _n->ifname, ##__VA_ARGS__) : \
+                const NetDev *_n = (netdev);                            \
+                _n ? log_object_internal(level, error, __FILE__, __LINE__, __func__, "INTERFACE=", _n->ifname, NULL, NULL, ##__VA_ARGS__) : \
                         log_internal(level, error, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
         })
 
similarity index 90%
rename from src/network/networkd-netdev-tunnel.c
rename to src/network/netdev/tunnel.c
index 77a4734..67f4fab 100644 (file)
@@ -28,7 +28,7 @@
 #include "conf-parser.h"
 #include "missing.h"
 #include "networkd-link.h"
-#include "networkd-netdev-tunnel.h"
+#include "netdev/tunnel.h"
 #include "parse-util.h"
 #include "string-table.h"
 #include "string-util.h"
@@ -201,12 +201,18 @@ static int netdev_ip6gre_fill_message_create(NetDev *netdev, Link *link, sd_netl
 }
 
 static int netdev_vti_fill_message_key(NetDev *netdev, Link *link, sd_netlink_message *m) {
-        Tunnel *t = VTI(netdev);
         uint32_t ikey, okey;
+        Tunnel *t;
         int r;
 
         assert(link);
         assert(m);
+
+        if (netdev->kind == NETDEV_KIND_VTI)
+                t = VTI(netdev);
+        else
+                t = VTI6(netdev);
+
         assert(t);
 
         if (t->key != 0)
@@ -391,16 +397,31 @@ static int netdev_tunnel_verify(NetDev *netdev, const char *filename) {
 
         assert(t);
 
-        if (t->family != AF_INET && t->family != AF_INET6 && t->family != 0) {
-                log_warning("Tunnel with invalid address family configured in %s. Ignoring", filename);
+        if (!IN_SET(t->family, AF_INET, AF_INET6, AF_UNSPEC)) {
+                log_netdev_error(netdev,
+                                 "Tunnel with invalid address family configured in %s. Ignoring", filename);
                 return -EINVAL;
         }
 
-        if (netdev->kind == NETDEV_KIND_IP6TNL) {
-                if (t->ip6tnl_mode == _NETDEV_IP6_TNL_MODE_INVALID) {
-                        log_warning("IP6 Tunnel without mode configured in %s. Ignoring", filename);
-                        return -EINVAL;
-                }
+        if (netdev->kind == NETDEV_KIND_VTI &&
+            (t->family != AF_INET || in_addr_is_null(t->family, &t->local))) {
+                log_netdev_error(netdev,
+                                 "vti tunnel without a local IPv4 address configured in %s. Ignoring", filename);
+                return -EINVAL;
+        }
+
+        if (IN_SET(netdev->kind, NETDEV_KIND_VTI6, NETDEV_KIND_IP6TNL, NETDEV_KIND_IP6GRE) &&
+            (t->family != AF_INET6 || in_addr_is_null(t->family, &t->local))) {
+                log_netdev_error(netdev,
+                                 "vti6/ip6tnl/ip6gre tunnel without a local IPv6 address configured in %s. Ignoring", filename);
+                return -EINVAL;
+        }
+
+        if (netdev->kind == NETDEV_KIND_IP6TNL &&
+            t->ip6tnl_mode == _NETDEV_IP6_TNL_MODE_INVALID) {
+                log_netdev_error(netdev,
+                                 "ip6tnl without mode configured in %s. Ignoring", filename);
+                return -EINVAL;
         }
 
         return 0;
@@ -425,26 +446,40 @@ int config_parse_tunnel_address(const char *unit,
         assert(rvalue);
         assert(data);
 
+        /* This is used to parse addresses on both local and remote ends of the tunnel.
+         * Address families must match.
+         *
+         * "any" is a special value which means that the address is unspecified.
+         */
+
         if (streq(rvalue, "any")) {
-                t->family = 0;
+                *addr = IN_ADDR_NULL;
+
+                /* As a special case, if both the local and remote addresses are
+                 * unspecified, also clear the address family.
+                 */
+                if (t->family != AF_UNSPEC &&
+                    in_addr_is_null(t->family, &t->local) &&
+                    in_addr_is_null(t->family, &t->remote))
+                        t->family = AF_UNSPEC;
                 return 0;
-        } else {
+        }
 
-                r = in_addr_from_string_auto(rvalue, &f, &buffer);
-                if (r < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, r, "Tunnel address is invalid, ignoring assignment: %s", rvalue);
-                        return 0;
-                }
+        r = in_addr_from_string_auto(rvalue, &f, &buffer);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Tunnel address \"%s\" invalid, ignoring assignment: %m", rvalue);
+                return 0;
+        }
 
-                if (t->family != AF_UNSPEC && t->family != f) {
-                        log_syntax(unit, LOG_ERR, filename, line, 0, "Tunnel addresses incompatible, ignoring assignment: %s", rvalue);
-                        return 0;
-                }
+        if (t->family != AF_UNSPEC && t->family != f) {
+                log_syntax(unit, LOG_ERR, filename, line, 0,
+                           "Tunnel addresses incompatible, ignoring assignment: %s", rvalue);
+                return 0;
         }
 
         t->family = f;
         *addr = buffer;
-
         return 0;
 }
 
@@ -572,7 +607,6 @@ static void ipip_init(NetDev *n) {
         assert(t);
 
         t->pmtudisc = true;
-        t->family = AF_UNSPEC;
 }
 
 static void sit_init(NetDev *n) {
@@ -582,7 +616,6 @@ static void sit_init(NetDev *n) {
         assert(t);
 
         t->pmtudisc = true;
-        t->family = AF_UNSPEC;
 }
 
 static void vti_init(NetDev *n) {
@@ -613,7 +646,6 @@ static void gre_init(NetDev *n) {
         assert(t);
 
         t->pmtudisc = true;
-        t->family = AF_UNSPEC;
 }
 
 static void ip6gre_init(NetDev *n) {
similarity index 99%
rename from src/network/networkd-netdev-tunnel.h
rename to src/network/netdev/tunnel.h
index 32a46bd..d78c613 100644 (file)
@@ -21,7 +21,7 @@
 
 #include "in-addr-util.h"
 
-#include "networkd-netdev.h"
+#include "netdev/netdev.h"
 
 typedef enum Ip6TnlMode {
         NETDEV_IP6_TNL_MODE_IP6IP6,
similarity index 99%
rename from src/network/networkd-netdev-tuntap.c
rename to src/network/netdev/tuntap.c
index 088a4d8..3d62808 100644 (file)
@@ -27,7 +27,7 @@
 
 #include "alloc-util.h"
 #include "fd-util.h"
-#include "networkd-netdev-tuntap.h"
+#include "netdev/tuntap.h"
 #include "user-util.h"
 
 #define TUN_DEV "/dev/net/tun"
similarity index 97%
rename from src/network/networkd-netdev-tuntap.h
rename to src/network/netdev/tuntap.h
index 120f00a..95d3fcf 100644 (file)
@@ -21,7 +21,7 @@
 
 typedef struct TunTap TunTap;
 
-#include "networkd-netdev.h"
+#include "netdev/netdev.h"
 
 struct TunTap {
         NetDev meta;
diff --git a/src/network/netdev/vcan.c b/src/network/netdev/vcan.c
new file mode 100644 (file)
index 0000000..7f56702
--- /dev/null
@@ -0,0 +1,25 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 Susant Sahani
+
+  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 "netdev/vcan.h"
+
+const NetDevVTable vcan_vtable = {
+        .object_size = sizeof(VCan),
+        .create_type = NETDEV_CREATE_INDEPENDENT,
+};
diff --git a/src/network/netdev/vcan.h b/src/network/netdev/vcan.h
new file mode 100644 (file)
index 0000000..00838b7
--- /dev/null
@@ -0,0 +1,34 @@
+#pragma once
+
+/***
+  This file is part of systemd.
+
+  Copyright 2016 Susant Sahani
+
+  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/>.
+***/
+
+typedef struct VCan VCan;
+
+#include <linux/can/netlink.h>
+
+#include "netdev/netdev.h"
+
+struct VCan {
+        NetDev meta;
+};
+
+DEFINE_NETDEV_CAST(VCAN, VCan);
+
+extern const NetDevVTable vcan_vtable;
similarity index 98%
rename from src/network/networkd-netdev-veth.c
rename to src/network/netdev/veth.c
index b122a06..350b59b 100644 (file)
@@ -22,7 +22,7 @@
 
 #include "sd-netlink.h"
 
-#include "networkd-netdev-veth.h"
+#include "netdev/veth.h"
 
 static int netdev_veth_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *m) {
         Veth *v;
similarity index 97%
rename from src/network/networkd-netdev-veth.h
rename to src/network/netdev/veth.h
index e69bfbc..b00ce47 100644 (file)
@@ -21,7 +21,7 @@
 
 typedef struct Veth Veth;
 
-#include "networkd-netdev.h"
+#include "netdev/netdev.h"
 
 struct Veth {
         NetDev meta;
similarity index 65%
rename from src/network/networkd-netdev-vlan.c
rename to src/network/netdev/vlan.c
index 3cc0723..6f41633 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+#include <linux/if_vlan.h>
 #include <net/if.h>
 
-#include "networkd-netdev-vlan.h"
+#include "netdev/vlan.h"
 #include "vlan-util.h"
 
 static int netdev_vlan_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *req) {
+        struct ifla_vlan_flags flags = {};
         VLan *v;
         int r;
 
@@ -38,6 +40,30 @@ static int netdev_vlan_fill_message_create(NetDev *netdev, Link *link, sd_netlin
         if (r < 0)
                 return log_netdev_error_errno(netdev, r, "Could not append IFLA_VLAN_ID attribute: %m");
 
+        if (v->gvrp != -1) {
+                flags.mask |= VLAN_FLAG_GVRP;
+                SET_FLAG(flags.flags, VLAN_FLAG_GVRP, v->gvrp);
+        }
+
+        if (v->mvrp != -1) {
+                flags.mask |= VLAN_FLAG_MVRP;
+                SET_FLAG(flags.flags, VLAN_FLAG_MVRP, v->mvrp);
+        }
+
+        if (v->reorder_hdr != -1) {
+                flags.mask |= VLAN_FLAG_REORDER_HDR;
+                SET_FLAG(flags.flags, VLAN_FLAG_REORDER_HDR, v->reorder_hdr);
+        }
+
+        if (v->loose_binding != -1) {
+                flags.mask |= VLAN_FLAG_LOOSE_BINDING;
+                SET_FLAG(flags.flags, VLAN_FLAG_LOOSE_BINDING, v->loose_binding);
+        }
+
+        r = sd_netlink_message_append_data(req, IFLA_VLAN_FLAGS, &flags, sizeof(struct ifla_vlan_flags));
+        if (r < 0)
+                return log_netdev_error_errno(netdev, r, "Could not append IFLA_VLAN_FLAGS attribute: %m");
+
         return 0;
 }
 
@@ -66,6 +92,10 @@ static void vlan_init(NetDev *netdev) {
         assert(v);
 
         v->id = VLANID_INVALID;
+        v->gvrp = -1;
+        v->mvrp = -1;
+        v->loose_binding = -1;
+        v->reorder_hdr = -1;
 }
 
 const NetDevVTable vlan_vtable = {
similarity index 88%
rename from src/network/networkd-netdev-vlan.h
rename to src/network/netdev/vlan.h
index 2dfe314..780d612 100644 (file)
 
 typedef struct VLan VLan;
 
-#include "networkd-netdev.h"
+#include "netdev/netdev.h"
 
 struct VLan {
         NetDev meta;
 
         uint16_t id;
+
+        int gvrp;
+        int mvrp;
+        int loose_binding;
+        int reorder_hdr;
 };
 
 DEFINE_NETDEV_CAST(VLAN, VLan);
similarity index 97%
rename from src/network/networkd-netdev-vrf.c
rename to src/network/netdev/vrf.c
index 89bd142..f48b413 100644 (file)
@@ -21,7 +21,7 @@
 
 #include "sd-netlink.h"
 #include "missing.h"
-#include "networkd-netdev-vrf.h"
+#include "netdev/vrf.h"
 
 static int netdev_vrf_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *m) {
         Vrf *v;
similarity index 96%
rename from src/network/networkd-netdev-vrf.h
rename to src/network/netdev/vrf.h
index 3d92a26..00f54ed 100644 (file)
@@ -21,7 +21,7 @@
 
 typedef struct Vrf Vrf;
 
-#include "networkd-netdev.h"
+#include "netdev/netdev.h"
 
 struct Vrf {
         NetDev meta;
similarity index 70%
rename from src/network/networkd-netdev-vxlan.c
rename to src/network/netdev/vxlan.c
index 724f986..b5b7aec 100644 (file)
 #include "conf-parser.h"
 #include "alloc-util.h"
 #include "extract-word.h"
+#include "string-util.h"
+#include "strv.h"
 #include "parse-util.h"
 #include "missing.h"
 
 #include "networkd-link.h"
-#include "networkd-netdev-vxlan.h"
+#include "netdev/vxlan.h"
 
 static int netdev_vxlan_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *m) {
         VxLan *v;
@@ -48,9 +50,29 @@ static int netdev_vxlan_fill_message_create(NetDev *netdev, Link *link, sd_netli
                         return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_ID attribute: %m");
         }
 
-        r = sd_netlink_message_append_in_addr(m, IFLA_VXLAN_GROUP, &v->group.in);
-        if (r < 0)
-                return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_GROUP attribute: %m");
+        if (!in_addr_is_null(v->remote_family, &v->remote)) {
+
+                if (v->remote_family == AF_INET)
+                        r = sd_netlink_message_append_in_addr(m, IFLA_VXLAN_GROUP, &v->remote.in);
+                else
+                        r = sd_netlink_message_append_in6_addr(m, IFLA_VXLAN_GROUP6, &v->remote.in6);
+
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_GROUP attribute: %m");
+
+        }
+
+        if (!in_addr_is_null(v->local_family, &v->local)) {
+
+                if (v->local_family == AF_INET)
+                        r = sd_netlink_message_append_in_addr(m, IFLA_VXLAN_LOCAL, &v->local.in);
+                else
+                        r = sd_netlink_message_append_in6_addr(m, IFLA_VXLAN_LOCAL6, &v->local.in6);
+
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_LOCAL attribute: %m");
+
+        }
 
         r = sd_netlink_message_append_u32(m, IFLA_VXLAN_LINK, link->ifindex);
         if (r < 0)
@@ -112,6 +134,14 @@ static int netdev_vxlan_fill_message_create(NetDev *netdev, Link *link, sd_netli
         if (r < 0)
                 return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_UDP_ZERO_CSUM6_RX attribute: %m");
 
+        r = sd_netlink_message_append_u8(m, IFLA_VXLAN_REMCSUM_TX, v->remote_csum_tx);
+        if (r < 0)
+                return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_REMCSUM_TX attribute: %m");
+
+        r = sd_netlink_message_append_u8(m, IFLA_VXLAN_REMCSUM_RX, v->remote_csum_rx);
+        if (r < 0)
+                return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_REMCSUM_RX attribute: %m");
+
         r = sd_netlink_message_append_u16(m, IFLA_VXLAN_PORT, htobe16(v->dest_port));
         if (r < 0)
                 return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_PORT attribute: %m");
@@ -127,6 +157,10 @@ static int netdev_vxlan_fill_message_create(NetDev *netdev, Link *link, sd_netli
                         return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_PORT_RANGE attribute: %m");
         }
 
+        r = sd_netlink_message_append_u32(m, IFLA_VXLAN_LABEL, htobe32(v->flow_label));
+        if (r < 0)
+                return log_netdev_error_errno(netdev, r, "Could not append IFLA_VXLAN_LABEL attribute: %m");
+
         if (v->group_policy) {
                 r = sd_netlink_message_append_flag(m, IFLA_VXLAN_GBP);
                 if (r < 0)
@@ -136,16 +170,16 @@ static int netdev_vxlan_fill_message_create(NetDev *netdev, Link *link, sd_netli
         return r;
 }
 
-int config_parse_vxlan_group_address(const char *unit,
-                                     const char *filename,
-                                     unsigned line,
-                                     const char *section,
-                                     unsigned section_line,
-                                     const char *lvalue,
-                                     int ltype,
-                                     const char *rvalue,
-                                     void *data,
-                                     void *userdata) {
+int config_parse_vxlan_address(const char *unit,
+                               const char *filename,
+                               unsigned line,
+                               const char *section,
+                               unsigned section_line,
+                               const char *lvalue,
+                               int ltype,
+                               const char *rvalue,
+                               void *data,
+                               void *userdata) {
         VxLan *v = userdata;
         union in_addr_union *addr = data, buffer;
         int r, f;
@@ -157,16 +191,28 @@ int config_parse_vxlan_group_address(const char *unit,
 
         r = in_addr_from_string_auto(rvalue, &f, &buffer);
         if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, r, "vxlan multicast group address is invalid, ignoring assignment: %s", rvalue);
+                log_syntax(unit, LOG_ERR, filename, line, r, "vxlan '%s' address is invalid, ignoring assignment: %s", lvalue, rvalue);
                 return 0;
         }
 
-        if (v->family != AF_UNSPEC && v->family != f) {
-                log_syntax(unit, LOG_ERR, filename, line, 0, "vxlan multicast group incompatible, ignoring assignment: %s", rvalue);
-                return 0;
+        r = in_addr_is_multicast(f, &buffer);
+
+        if (STR_IN_SET(lvalue, "Group", "Remote")) {
+                if (r <= 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "vxlan invalid multicast '%s' address, ignoring assignment: %s", lvalue, rvalue);
+                        return 0;
+                }
+
+                v->remote_family = f;
+        } else {
+                if (r > 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, 0, "vxlan %s can not be multicast address, ignoring assignment: %s", lvalue, rvalue);
+                        return 0;
+                }
+
+                v->local_family = f;
         }
 
-        v->family = f;
         *addr = buffer;
 
         return 0;
@@ -225,18 +271,18 @@ int config_parse_port_range(const char *unit,
         return 0;
 }
 
-int config_parse_destination_port(const char *unit,
-                                  const char *filename,
-                                  unsigned line,
-                                  const char *section,
-                                  unsigned section_line,
-                                  const char *lvalue,
-                                  int ltype,
-                                  const char *rvalue,
-                                  void *data,
-                                  void *userdata) {
+int config_parse_flow_label(const char *unit,
+                            const char *filename,
+                            unsigned line,
+                            const char *section,
+                            unsigned section_line,
+                            const char *lvalue,
+                            int ltype,
+                            const char *rvalue,
+                            void *data,
+                            void *userdata) {
         VxLan *v = userdata;
-        uint16_t port;
+        unsigned f;
         int r;
 
         assert(filename);
@@ -244,13 +290,19 @@ int config_parse_destination_port(const char *unit,
         assert(rvalue);
         assert(data);
 
-        r = safe_atou16(rvalue, &port);
-        if (r < 0 || port <= 0) {
-                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse VXLAN destination port '%s'.", rvalue);
+        r = safe_atou(rvalue, &f);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse VXLAN flow label '%s'.", rvalue);
+                return 0;
+        }
+
+        if (f & ~VXLAN_FLOW_LABEL_MAX_MASK) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "VXLAN flow label '%s' not valid. Flow label range should be [0-1048575].", rvalue);
                 return 0;
         }
 
-        v->dest_port = port;
+        v->flow_label = f;
 
         return 0;
 }
similarity index 59%
rename from src/network/networkd-netdev-vxlan.h
rename to src/network/netdev/vxlan.h
index 4614c66..1eeda02 100644 (file)
 typedef struct VxLan VxLan;
 
 #include "in-addr-util.h"
-#include "networkd-netdev.h"
+#include "netdev/netdev.h"
 
 #define VXLAN_VID_MAX (1u << 24) - 1
+#define VXLAN_FLOW_LABEL_MAX_MASK 0xFFFFFU
 
 struct VxLan {
         NetDev meta;
 
         uint64_t id;
 
-        int family;
-        union in_addr_union group;
+        int remote_family;
+        int local_family;
+
+        union in_addr_union remote;
+        union in_addr_union local;
 
         unsigned tos;
         unsigned ttl;
         unsigned max_fdb;
+        unsigned flow_label;
 
         uint16_t dest_port;
 
@@ -50,6 +55,8 @@ struct VxLan {
         bool udpcsum;
         bool udp6zerocsumtx;
         bool udp6zerocsumrx;
+        bool remote_csum_tx;
+        bool remote_csum_rx;
         bool group_policy;
 
         struct ifla_vxlan_port_range port_range;
@@ -58,16 +65,16 @@ struct VxLan {
 DEFINE_NETDEV_CAST(VXLAN, VxLan);
 extern const NetDevVTable vxlan_vtable;
 
-int config_parse_vxlan_group_address(const char *unit,
-                                     const char *filename,
-                                     unsigned line,
-                                     const char *section,
-                                     unsigned section_line,
-                                     const char *lvalue,
-                                     int ltype,
-                                     const char *rvalue,
-                                     void *data,
-                                     void *userdata);
+int config_parse_vxlan_address(const char *unit,
+                               const char *filename,
+                               unsigned line,
+                               const char *section,
+                               unsigned section_line,
+                               const char *lvalue,
+                               int ltype,
+                               const char *rvalue,
+                               void *data,
+                               void *userdata);
 int config_parse_port_range(const char *unit,
                             const char *filename,
                             unsigned line,
@@ -79,13 +86,13 @@ int config_parse_port_range(const char *unit,
                             void *data,
                             void *userdata);
 
-int config_parse_destination_port(const char *unit,
-                                  const char *filename,
-                                  unsigned line,
-                                  const char *section,
-                                  unsigned section_line,
-                                  const char *lvalue,
-                                  int ltype,
-                                  const char *rvalue,
-                                  void *data,
-                                  void *userdata);
+int config_parse_flow_label(const char *unit,
+                            const char *filename,
+                            unsigned line,
+                            const char *section,
+                            unsigned section_line,
+                            const char *lvalue,
+                            int ltype,
+                            const char *rvalue,
+                            void *data,
+                            void *userdata);
index d2df9b7..54d54c8 100644 (file)
@@ -18,6 +18,7 @@
 ***/
 
 #include <getopt.h>
+#include <linux/if_addrlabel.h>
 #include <net/if.h>
 #include <stdbool.h>
 
@@ -35,6 +36,7 @@
 #include "hwdb-util.h"
 #include "local-addresses.h"
 #include "locale-util.h"
+#include "macro.h"
 #include "netlink-util.h"
 #include "pager.h"
 #include "parse-util.h"
@@ -122,7 +124,7 @@ static void setup_state_to_color(const char *state, const char **on, const char
         } else if (streq_ptr(state, "configuring")) {
                 *on = ansi_highlight_yellow();
                 *off = ansi_normal();
-        } else if (streq_ptr(state, "failed") || streq_ptr(state, "linger")) {
+        } else if (STRPTR_IN_SET(state, "failed", "linger")) {
                 *on = ansi_highlight_red();
                 *off = ansi_normal();
         } else
@@ -569,6 +571,76 @@ static int dump_addresses(
         return 0;
 }
 
+static int dump_address_labels(sd_netlink *rtnl) {
+        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL, *reply = NULL;
+        sd_netlink_message *m;
+        int r;
+
+        assert(rtnl);
+
+        r = sd_rtnl_message_new_addrlabel(rtnl, &req, RTM_GETADDRLABEL, 0, AF_INET6);
+        if (r < 0)
+                return log_error_errno(r, "Could not allocate RTM_GETADDRLABEL message: %m");
+
+        r = sd_netlink_message_request_dump(req, true);
+        if (r < 0)
+                return r;
+
+        r = sd_netlink_call(rtnl, req, 0, &reply);
+        if (r < 0)
+                return r;
+
+        printf("%10s/%s %30s\n", "Prefix", "Prefixlen", "Label");
+
+        for (m = reply; m; m = sd_netlink_message_next(m)) {
+                _cleanup_free_ char *pretty = NULL;
+                union in_addr_union prefix = {};
+                uint8_t prefixlen;
+                uint32_t label;
+
+                r = sd_netlink_message_get_errno(m);
+                if (r < 0) {
+                        log_error_errno(r, "got error: %m");
+                        continue;
+                }
+
+                r = sd_netlink_message_read_u32(m, IFAL_LABEL, &label);
+                if (r < 0 && r != -ENODATA) {
+                        log_error_errno(r, "Could not read IFAL_LABEL, ignoring: %m");
+                        continue;
+                }
+
+                r = sd_netlink_message_read_in6_addr(m, IFAL_ADDRESS, &prefix.in6);
+                if (r < 0)
+                        continue;
+
+                r = in_addr_to_string(AF_INET6, &prefix, &pretty);
+                if (r < 0)
+                        continue;
+
+                r = sd_rtnl_message_addrlabel_get_prefixlen(m, &prefixlen);
+                if (r < 0)
+                        continue;
+
+                printf("%10s/%-5u %30u\n", pretty, prefixlen, label);
+        }
+
+        return 0;
+}
+
+static int list_address_labels(int argc, char *argv[], void *userdata) {
+        _cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
+        int r;
+
+        r = sd_netlink_open(&rtnl);
+        if (r < 0)
+                return log_error_errno(r, "Failed to connect to netlink: %m");
+
+        dump_address_labels(rtnl);
+
+        return 0;
+}
+
 static int open_lldp_neighbors(int ifindex, FILE **ret) {
         _cleanup_free_ char *p = NULL;
         FILE *f;
@@ -1043,6 +1115,7 @@ static void help(void) {
                "  list [LINK...]        List links\n"
                "  status [LINK...]      Show link status\n"
                "  lldp [LINK...]        Show LLDP neighbors\n"
+               "  label                 Show current address label entries in the kernel\n"
                , program_invocation_short_name);
 }
 
@@ -1107,6 +1180,7 @@ static int networkctl_main(int argc, char *argv[]) {
                 { "list",   VERB_ANY, VERB_ANY, VERB_DEFAULT, list_links       },
                 { "status", VERB_ANY, VERB_ANY, 0,            link_status      },
                 { "lldp",   VERB_ANY, VERB_ANY, 0,            link_lldp_status },
+                { "label",  VERB_ANY, VERB_ANY, 0,            list_address_labels},
                 {}
         };
 
diff --git a/src/network/networkd-address-label.c b/src/network/networkd-address-label.c
new file mode 100644 (file)
index 0000000..b89995e
--- /dev/null
@@ -0,0 +1,223 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2017 Susant Sahani
+
+  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 <net/if.h>
+#include <linux/if_addrlabel.h>
+
+#include "alloc-util.h"
+#include "conf-parser.h"
+#include "networkd-address-label.h"
+#include "netlink-util.h"
+#include "networkd-manager.h"
+#include "parse-util.h"
+#include "socket-util.h"
+
+int address_label_new(AddressLabel **ret) {
+        _cleanup_address_label_free_ AddressLabel *addrlabel = NULL;
+
+        addrlabel = new0(AddressLabel, 1);
+        if (!addrlabel)
+                return -ENOMEM;
+
+        *ret = addrlabel;
+        addrlabel = NULL;
+
+        return 0;
+}
+
+void address_label_free(AddressLabel *label) {
+        if (!label)
+                return;
+
+        if (label->network) {
+                LIST_REMOVE(labels, label->network->address_labels, label);
+                assert(label->network->n_address_labels > 0);
+                label->network->n_address_labels--;
+
+                if (label->section) {
+                        hashmap_remove(label->network->address_labels_by_section, label->section);
+                        network_config_section_free(label->section);
+                }
+        }
+
+        free(label);
+}
+
+static int address_label_new_static(Network *network, const char *filename, unsigned section_line, AddressLabel **ret) {
+        _cleanup_network_config_section_free_ NetworkConfigSection *n = NULL;
+        _cleanup_address_label_free_ AddressLabel *label = NULL;
+        int r;
+
+        assert(network);
+        assert(ret);
+        assert(!!filename == (section_line > 0));
+
+        r = network_config_section_new(filename, section_line, &n);
+        if (r < 0)
+                return r;
+
+        label = hashmap_get(network->address_labels_by_section, n);
+        if (label) {
+                *ret = label;
+                label = NULL;
+
+                return 0;
+        }
+
+        r = address_label_new(&label);
+        if (r < 0)
+                return r;
+
+        label->section = n;
+        n = NULL;
+
+        r = hashmap_put(network->address_labels_by_section, label->section, label);
+        if (r < 0)
+                return r;
+
+        label->network = network;
+        LIST_APPEND(labels, network->address_labels, label);
+        network->n_address_labels++;
+
+        *ret = label;
+        label = NULL;
+
+        return 0;
+}
+
+int address_label_configure(
+                AddressLabel *label,
+                Link *link,
+                sd_netlink_message_handler_t callback,
+                bool update) {
+
+        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
+        int r;
+
+        assert(label);
+        assert(link);
+        assert(link->ifindex > 0);
+        assert(link->manager);
+        assert(link->manager->rtnl);
+
+        r = sd_rtnl_message_new_addrlabel(link->manager->rtnl, &req, RTM_NEWADDRLABEL,
+                                          link->ifindex, AF_INET6);
+        if (r < 0)
+                return log_error_errno(r, "Could not allocate RTM_NEWADDR message: %m");
+
+        r = sd_rtnl_message_addrlabel_set_prefixlen(req, label->prefixlen);
+        if (r < 0)
+                return log_error_errno(r, "Could not set prefixlen: %m");
+
+        r = sd_netlink_message_append_u32(req, IFAL_LABEL, label->label);
+        if (r < 0)
+                return log_error_errno(r, "Could not append IFAL_LABEL attribute: %m");
+
+        r = sd_netlink_message_append_in6_addr(req, IFA_ADDRESS, &label->in_addr.in6);
+        if (r < 0)
+                return log_error_errno(r, "Could not append IFA_ADDRESS attribute: %m");
+
+        r = sd_netlink_call_async(link->manager->rtnl, req, callback, link, 0, NULL);
+        if (r < 0)
+                return log_error_errno(r, "Could not send rtnetlink message: %m");
+
+        link_ref(link);
+
+        return 0;
+}
+
+int config_parse_address_label_prefix(const char *unit,
+                                      const char *filename,
+                                      unsigned line,
+                                      const char *section,
+                                      unsigned section_line,
+                                      const char *lvalue,
+                                      int ltype,
+                                      const char *rvalue,
+                                      void *data,
+                                      void *userdata) {
+
+        _cleanup_address_label_free_ AddressLabel *n = NULL;
+        Network *network = userdata;
+        int r;
+
+        assert(filename);
+        assert(section);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = address_label_new_static(network, filename, section_line, &n);
+        if (r < 0)
+                return r;
+
+        r = in_addr_prefix_from_string(rvalue, AF_INET6, &n->in_addr, &n->prefixlen);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "Address label is invalid, ignoring assignment: %s", rvalue);
+                return 0;
+        }
+
+        n = NULL;
+
+        return 0;
+}
+
+int config_parse_address_label(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        _cleanup_address_label_free_ AddressLabel *n = NULL;
+        Network *network = userdata;
+        uint32_t k;
+        int r;
+
+        assert(filename);
+        assert(section);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = address_label_new_static(network, filename, section_line, &n);
+        if (r < 0)
+                return r;
+
+        r = safe_atou32(rvalue, &k);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse address label, ignoring: %s", rvalue);
+                return 0;
+        }
+
+        if (k == 0xffffffffUL) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "Adress label is invalid, ignoring: %s", rvalue);
+                return 0;
+        }
+
+        n->label = k;
+        n = NULL;
+
+        return 0;
+}
diff --git a/src/network/networkd-address-label.h b/src/network/networkd-address-label.h
new file mode 100644 (file)
index 0000000..8724ea8
--- /dev/null
@@ -0,0 +1,58 @@
+#pragma once
+
+/***
+  This file is part of systemd.
+
+  Copyright 2017 Susant Sahani
+
+  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 <inttypes.h>
+#include <stdbool.h>
+
+#include "in-addr-util.h"
+
+typedef struct AddressLabel AddressLabel;
+
+#include "networkd-link.h"
+#include "networkd-network.h"
+
+typedef struct Network Network;
+typedef struct Link Link;
+typedef struct NetworkConfigSection NetworkConfigSection;
+
+struct AddressLabel {
+        Network *network;
+        Link *link;
+        NetworkConfigSection *section;
+
+        unsigned char prefixlen;
+        uint32_t label;
+
+        union in_addr_union in_addr;
+
+        LIST_FIELDS(AddressLabel, labels);
+};
+
+int address_label_new(AddressLabel **ret);
+void address_label_free(AddressLabel *label);
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(AddressLabel*, address_label_free);
+#define _cleanup_address_label_free_ _cleanup_(address_label_freep)
+
+int address_label_configure(AddressLabel *address, Link *link, sd_netlink_message_handler_t callback, bool update);
+
+int config_parse_address_label(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_address_label_prefix(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
index ebc6c9e..a63b925 100644 (file)
@@ -19,7 +19,7 @@
 
 #include "alloc-util.h"
 #include "networkd-address-pool.h"
-#include "networkd.h"
+#include "networkd-manager.h"
 #include "set.h"
 #include "string-util.h"
 
index 5498e35..d66b3a2 100644 (file)
@@ -24,7 +24,7 @@
 #include "firewall-util.h"
 #include "netlink-util.h"
 #include "networkd-address.h"
-#include "networkd.h"
+#include "networkd-manager.h"
 #include "parse-util.h"
 #include "set.h"
 #include "socket-util.h"
@@ -53,15 +53,21 @@ int address_new(Address **ret) {
         return 0;
 }
 
-int address_new_static(Network *network, unsigned section, Address **ret) {
+int address_new_static(Network *network, const char *filename, unsigned section_line, Address **ret) {
+        _cleanup_network_config_section_free_ NetworkConfigSection *n = NULL;
         _cleanup_address_free_ Address *address = NULL;
         int r;
 
         assert(network);
         assert(ret);
+        assert(!!filename == (section_line > 0));
 
-        if (section) {
-                address = hashmap_get(network->addresses_by_section, UINT_TO_PTR(section));
+        if (filename) {
+                r = network_config_section_new(filename, section_line, &n);
+                if (r < 0)
+                        return r;
+
+                address = hashmap_get(network->addresses_by_section, n);
                 if (address) {
                         *ret = address;
                         address = NULL;
@@ -77,9 +83,13 @@ int address_new_static(Network *network, unsigned section, Address **ret) {
         if (r < 0)
                 return r;
 
-        if (section) {
-                address->section = section;
-                hashmap_put(network->addresses_by_section, UINT_TO_PTR(address->section), address);
+        if (filename) {
+                address->section = n;
+                n = NULL;
+
+                r = hashmap_put(network->addresses_by_section, address->section, address);
+                if (r < 0)
+                        return r;
         }
 
         address->network = network;
@@ -101,8 +111,10 @@ void address_free(Address *address) {
                 assert(address->network->n_static_addresses > 0);
                 address->network->n_static_addresses--;
 
-                if (address->section)
-                        hashmap_remove(address->network->addresses_by_section, UINT_TO_PTR(address->section));
+                if (address->section) {
+                        hashmap_remove(address->network->addresses_by_section, address->section);
+                        network_config_section_free(address->section);
+                }
         }
 
         if (address->link) {
@@ -571,6 +583,21 @@ int address_configure(
 
         address->flags |= IFA_F_PERMANENT;
 
+        if (address->home_address)
+                address->flags |= IFA_F_HOMEADDRESS;
+
+        if (address->duplicate_address_detection)
+                address->flags |= IFA_F_NODAD;
+
+        if (address->manage_temporary_address)
+                address->flags |= IFA_F_MANAGETEMPADDR;
+
+        if (address->prefix_route)
+                address->flags |= IFA_F_NOPREFIXROUTE;
+
+        if (address->autojoin)
+                address->flags |= IFA_F_MCAUTOJOIN;
+
         r = sd_rtnl_message_addr_set_flags(req, (address->flags & 0xff));
         if (r < 0)
                 return log_error_errno(r, "Could not set flags: %m");
@@ -661,7 +688,7 @@ int config_parse_broadcast(
         assert(rvalue);
         assert(data);
 
-        r = address_new_static(network, section_line, &n);
+        r = address_new_static(network, filename, section_line, &n);
         if (r < 0)
                 return r;
 
@@ -708,10 +735,10 @@ int config_parse_address(const char *unit,
         if (streq(section, "Network")) {
                 /* we are not in an Address section, so treat
                  * this as the special '0' section */
-                section_line = 0;
-        }
+                r = address_new_static(network, NULL, 0, &n);
+        } else
+                r = address_new_static(network, filename, section_line, &n);
 
-        r = address_new_static(network, section_line, &n);
         if (r < 0)
                 return r;
 
@@ -790,12 +817,12 @@ int config_parse_label(
         assert(rvalue);
         assert(data);
 
-        r = address_new_static(network, section_line, &n);
+        r = address_new_static(network, filename, section_line, &n);
         if (r < 0)
                 return r;
 
-        if (!ifname_valid(rvalue)) {
-                log_syntax(unit, LOG_ERR, filename, line, 0, "Interface label is not valid or too long, ignoring assignment: %s", rvalue);
+        if (!address_label_valid(rvalue)) {
+                log_syntax(unit, LOG_ERR, filename, line, 0, "Interface label is too long or invalid, ignoring assignment: %s", rvalue);
                 return 0;
         }
 
@@ -829,7 +856,7 @@ int config_parse_lifetime(const char *unit,
         assert(rvalue);
         assert(data);
 
-        r = address_new_static(network, section_line, &n);
+        r = address_new_static(network, filename, section_line, &n);
         if (r < 0)
                 return r;
 
@@ -856,8 +883,300 @@ int config_parse_lifetime(const char *unit,
         return 0;
 }
 
+int config_parse_address_flags(const char *unit,
+                               const char *filename,
+                               unsigned line,
+                               const char *section,
+                               unsigned section_line,
+                               const char *lvalue,
+                               int ltype,
+                               const char *rvalue,
+                               void *data,
+                               void *userdata) {
+        Network *network = userdata;
+        _cleanup_address_free_ Address *n = NULL;
+        int r;
+
+        assert(filename);
+        assert(section);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = address_new_static(network, filename, section_line, &n);
+        if (r < 0)
+                return r;
+
+        r = parse_boolean(rvalue);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse address flag, ignoring: %s", rvalue);
+                return 0;
+        }
+
+        if (streq(lvalue, "HomeAddress"))
+                n->home_address = r;
+        else if (streq(lvalue, "DuplicateAddressDetection"))
+                n->duplicate_address_detection = r;
+        else if (streq(lvalue, "ManageTemporaryAddress"))
+                n->manage_temporary_address = r;
+        else if (streq(lvalue, "PrefixRoute"))
+                n->prefix_route = r;
+        else if (streq(lvalue, "AutoJoin"))
+                n->autojoin = r;
+
+        return 0;
+}
+
 bool address_is_ready(const Address *a) {
         assert(a);
 
         return !(a->flags & (IFA_F_TENTATIVE | IFA_F_DEPRECATED));
 }
+
+int config_parse_router_preference(const char *unit,
+                                   const char *filename,
+                                   unsigned line,
+                                   const char *section,
+                                   unsigned section_line,
+                                   const char *lvalue,
+                                   int ltype,
+                                   const char *rvalue,
+                                   void *data,
+                                   void *userdata) {
+        Network *network = userdata;
+
+        assert(filename);
+        assert(section);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        if (streq(rvalue, "high"))
+                network->router_preference = SD_NDISC_PREFERENCE_HIGH;
+        else if (STR_IN_SET(rvalue, "medium", "normal", "default"))
+                network->router_preference = SD_NDISC_PREFERENCE_MEDIUM;
+        else if (streq(rvalue, "low"))
+                network->router_preference = SD_NDISC_PREFERENCE_LOW;
+        else
+                log_syntax(unit, LOG_ERR, filename, line, -EINVAL, "Router preference '%s' is invalid, ignoring assignment: %m", rvalue);
+
+        return 0;
+}
+
+void prefix_free(Prefix *prefix) {
+        if (!prefix)
+                return;
+
+        if (prefix->network) {
+                LIST_REMOVE(prefixes, prefix->network->static_prefixes, prefix);
+                assert(prefix->network->n_static_prefixes > 0);
+                prefix->network->n_static_prefixes--;
+
+                if (prefix->section)
+                        hashmap_remove(prefix->network->prefixes_by_section,
+                                       prefix->section);
+        }
+
+        prefix->radv_prefix = sd_radv_prefix_unref(prefix->radv_prefix);
+
+        free(prefix);
+}
+
+int prefix_new(Prefix **ret) {
+        Prefix *prefix = NULL;
+
+        prefix = new0(Prefix, 1);
+        if (!prefix)
+                return -ENOMEM;
+
+        if (sd_radv_prefix_new(&prefix->radv_prefix) < 0)
+                return -ENOMEM;
+
+        *ret = prefix;
+        prefix = NULL;
+
+        return 0;
+}
+
+int prefix_new_static(Network *network, const char *filename,
+                      unsigned section_line, Prefix **ret) {
+        _cleanup_network_config_section_free_ NetworkConfigSection *n = NULL;
+        _cleanup_prefix_free_ Prefix *prefix = NULL;
+        int r;
+
+        assert(network);
+        assert(ret);
+        assert(!!filename == (section_line > 0));
+
+        if (filename) {
+                r = network_config_section_new(filename, section_line, &n);
+                if (r < 0)
+                        return r;
+
+                if (section_line) {
+                        prefix = hashmap_get(network->prefixes_by_section, n);
+                        if (prefix) {
+                                *ret = prefix;
+                                prefix = NULL;
+
+                                return 0;
+                        }
+                }
+        }
+
+        r = prefix_new(&prefix);
+        if (r < 0)
+                return r;
+
+        if (filename) {
+                prefix->section = n;
+                n = NULL;
+
+                r = hashmap_put(network->prefixes_by_section, prefix->section,
+                                prefix);
+                if (r < 0)
+                        return r;
+        }
+
+        prefix->network = network;
+        LIST_APPEND(prefixes, network->static_prefixes, prefix);
+        network->n_static_prefixes++;
+
+        *ret = prefix;
+        prefix = NULL;
+
+        return 0;
+}
+
+int config_parse_prefix(const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        Network *network = userdata;
+        _cleanup_prefix_free_ Prefix *p = NULL;
+        uint8_t prefixlen = 64;
+        union in_addr_union in6addr;
+        int r;
+
+        assert(filename);
+        assert(section);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = prefix_new_static(network, filename, section_line, &p);
+        if (r < 0)
+                return r;
+
+        r = in_addr_prefix_from_string(rvalue, AF_INET6, &in6addr, &prefixlen);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "Prefix is invalid, ignoring assignment: %s", rvalue);
+                return 0;
+        }
+
+        if (sd_radv_prefix_set_prefix(p->radv_prefix, &in6addr.in6, prefixlen) < 0)
+                return -EADDRNOTAVAIL;
+
+        log_syntax(unit, LOG_INFO, filename, line, r, "Found prefix %s", rvalue);
+
+        p = NULL;
+
+        return 0;
+}
+
+int config_parse_prefix_flags(const char *unit,
+                              const char *filename,
+                              unsigned line,
+                              const char *section,
+                              unsigned section_line,
+                              const char *lvalue,
+                              int ltype,
+                              const char *rvalue,
+                              void *data,
+                              void *userdata) {
+        Network *network = userdata;
+        _cleanup_prefix_free_ Prefix *p = NULL;
+        int r, val;
+
+        assert(filename);
+        assert(section);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = prefix_new_static(network, filename, section_line, &p);
+        if (r < 0)
+                return r;
+
+        r = parse_boolean(rvalue);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse address flag, ignoring: %s", rvalue);
+                return 0;
+        }
+
+        val = r;
+
+        if (streq(lvalue, "OnLink"))
+                r = sd_radv_prefix_set_onlink(p->radv_prefix, val);
+        else if (streq(lvalue, "AddressAutoconfiguration"))
+                r = sd_radv_prefix_set_address_autoconfiguration(p->radv_prefix, val);
+        if (r < 0)
+                return r;
+
+        p = NULL;
+
+        return 0;
+}
+
+int config_parse_prefix_lifetime(const char *unit,
+                                 const char *filename,
+                                 unsigned line,
+                                 const char *section,
+                                 unsigned section_line,
+                                 const char *lvalue,
+                                 int ltype,
+                                 const char *rvalue,
+                                 void *data,
+                                 void *userdata) {
+        Network *network = userdata;
+        _cleanup_prefix_free_ Prefix *p = NULL;
+        usec_t usec;
+        int r;
+
+        assert(filename);
+        assert(section);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = prefix_new_static(network, filename, section_line, &p);
+        if (r < 0)
+                return r;
+
+        r = parse_sec(rvalue, &usec);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "Lifetime is invalid, ignoring assignment: %s", rvalue);
+                return 0;
+        }
+
+        /* a value of 0xffffffff represents infinity */
+        if (streq(lvalue, "PreferredLifetimeSec"))
+                r = sd_radv_prefix_set_preferred_lifetime(p->radv_prefix,
+                                                          DIV_ROUND_UP(usec, USEC_PER_SEC));
+        else if (streq(lvalue, "ValidLifetimeSec"))
+                r = sd_radv_prefix_set_valid_lifetime(p->radv_prefix,
+                                                      DIV_ROUND_UP(usec, USEC_PER_SEC));
+        if (r < 0)
+                return r;
+
+        p = NULL;
+
+        return 0;
+};
index 03c4bea..0653284 100644 (file)
@@ -25,6 +25,7 @@
 #include "in-addr-util.h"
 
 typedef struct Address Address;
+typedef struct Prefix Prefix;
 
 #include "networkd-link.h"
 #include "networkd-network.h"
@@ -33,10 +34,20 @@ typedef struct Address Address;
 
 typedef struct Network Network;
 typedef struct Link Link;
+typedef struct NetworkConfigSection NetworkConfigSection;
+
+struct Prefix {
+        Network *network;
+        NetworkConfigSection *section;
+
+        sd_radv_prefix *radv_prefix;
+
+        LIST_FIELDS(Prefix, prefixes);
+};
 
 struct Address {
         Network *network;
-        unsigned section;
+        NetworkConfigSection *section;
 
         Link *link;
 
@@ -53,11 +64,16 @@ struct Address {
         union in_addr_union in_addr_peer;
 
         bool ip_masquerade_done:1;
+        bool duplicate_address_detection;
+        bool manage_temporary_address;
+        bool home_address;
+        bool prefix_route;
+        bool autojoin;
 
         LIST_FIELDS(Address, addresses);
 };
 
-int address_new_static(Network *network, unsigned section, Address **ret);
+int address_new_static(Network *network, const char *filename, unsigned section, Address **ret);
 int address_new(Address **ret);
 void address_free(Address *address);
 int address_add_foreign(Link *link, int family, const union in_addr_union *in_addr, unsigned char prefixlen, Address **ret);
@@ -73,7 +89,20 @@ bool address_is_ready(const Address *a);
 DEFINE_TRIVIAL_CLEANUP_FUNC(Address*, address_free);
 #define _cleanup_address_free_ _cleanup_(address_freep)
 
+int prefix_new(Prefix **ret);
+void prefix_free(Prefix *prefix);
+int prefix_new_static(Network *network, const char *filename, unsigned section,
+                      Prefix **ret);
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(Prefix*, prefix_free);
+#define _cleanup_prefix_free_ _cleanup_(prefix_freep)
+
 int config_parse_address(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_broadcast(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_label(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_lifetime(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_address_flags(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_router_preference(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_prefix(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_prefix_flags(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_prefix_lifetime(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
index 8bc330e..fa5d3ee 100644 (file)
@@ -25,7 +25,9 @@
 #include "conf-parser.h"
 #include "netlink-util.h"
 #include "networkd-brvlan.h"
-#include "networkd.h"
+#include "networkd-link.h"
+#include "networkd-manager.h"
+#include "networkd-network.h"
 #include "parse-util.h"
 #include "vlan-util.h"
 
@@ -257,6 +259,24 @@ static int parse_vid_range(const char *rvalue, uint16_t *vid, uint16_t *vid_end)
         return r;
 }
 
+int config_parse_brvlan_pvid(const char *unit, const char *filename,
+                             unsigned line, const char *section,
+                             unsigned section_line, const char *lvalue,
+                             int ltype, const char *rvalue, void *data,
+                             void *userdata) {
+        Network *network = userdata;
+        int r;
+        uint16_t pvid;
+        r = parse_vlanid(rvalue, &pvid);
+        if (r < 0)
+                return r;
+
+        network->pvid = pvid;
+        network->use_br_vlan = true;
+
+        return 0;
+}
+
 int config_parse_brvlan_vlan(const char *unit, const char *filename,
                              unsigned line, const char *section,
                              unsigned section_line, const char *lvalue,
@@ -288,6 +308,7 @@ int config_parse_brvlan_vlan(const char *unit, const char *filename,
                 for (; vid <= vid_end; vid++)
                         set_bit(vid, network->br_vid_bitmap);
         }
+        network->use_br_vlan = true;
         return 0;
 }
 
@@ -325,5 +346,6 @@ int config_parse_brvlan_untagged(const char *unit, const char *filename,
                         set_bit(vid, network->br_untagged_bitmap);
                 }
         }
+        network->use_br_vlan = true;
         return 0;
 }
index 6aa6883..b37633f 100644 (file)
@@ -25,5 +25,6 @@ typedef struct Link Link;
 
 int br_vlan_configure(Link *link, uint16_t pvid, uint32_t *br_vid_bitmap, uint32_t *br_untagged_bitmap);
 
+int config_parse_brvlan_pvid(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_brvlan_vlan(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_brvlan_untagged(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
index c03e2b2..e28e018 100644 (file)
 #include "conf-parser.h"
 #include "def.h"
 #include "dhcp-identifier.h"
+#include "extract-word.h"
 #include "hexdecoct.h"
 #include "networkd-conf.h"
+#include "networkd-network.h"
 #include "string-table.h"
 
 int manager_parse_config_file(Manager *m) {
         assert(m);
 
-        return config_parse_many(PKGSYSCONFDIR "/networkd.conf",
-                                 CONF_PATHS_NULSTR("systemd/networkd.conf.d"),
-                                 "DHCP\0",
-                                 config_item_perf_lookup, networkd_gperf_lookup,
-                                 false, m);
+        return config_parse_many_nulstr(PKGSYSCONFDIR "/networkd.conf",
+                                        CONF_PATHS_NULSTR("systemd/networkd.conf.d"),
+                                        "DHCP\0",
+                                        config_item_perf_lookup, networkd_gperf_lookup,
+                                        false, m);
 }
 
 static const char* const duid_type_table[_DUID_TYPE_MAX] = {
index c7bfb42..1136975 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include "networkd.h"
+typedef struct Manager Manager;
 
 int manager_parse_config_file(Manager *m);
 
-const struct ConfigPerfItem* networkd_gperf_lookup(const char *key, unsigned length);
+const struct ConfigPerfItem* networkd_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
 
 int config_parse_duid_type(
                 const char *unit,
index 12fb8e3..9229b57 100644 (file)
@@ -24,7 +24,9 @@
 #include "dhcp-lease-internal.h"
 #include "hostname-util.h"
 #include "network-internal.h"
-#include "networkd.h"
+#include "networkd-link.h"
+#include "networkd-manager.h"
+#include "networkd-network.h"
 
 static int dhcp4_route_handler(sd_netlink *rtnl, sd_netlink_message *m,
                                void *userdata) {
@@ -50,8 +52,21 @@ static int dhcp4_route_handler(sd_netlink *rtnl, sd_netlink_message *m,
         return 1;
 }
 
+static int route_scope_from_address(const Route *route, const struct in_addr *self_addr) {
+        assert(route);
+        assert(self_addr);
+
+        if (in_addr_is_localhost(AF_INET, &route->dst) ||
+            (self_addr->s_addr && route->dst.in.s_addr == self_addr->s_addr))
+                return RT_SCOPE_HOST;
+        else if (in4_addr_is_null(&route->gw.in))
+                return RT_SCOPE_LINK;
+        else
+                return RT_SCOPE_UNIVERSE;
+}
+
 static int link_set_dhcp_routes(Link *link) {
-        struct in_addr gateway;
+        struct in_addr gateway, address;
         _cleanup_free_ sd_dhcp_route **static_routes = NULL;
         int r, n, i;
 
@@ -62,19 +77,18 @@ static int link_set_dhcp_routes(Link *link) {
         if (!link->network->dhcp_use_routes)
                 return 0;
 
+        r = sd_dhcp_lease_get_address(link->dhcp_lease, &address);
+        if (r < 0)
+                return log_link_warning_errno(link, r, "DHCP error: could not get address: %m");
+
         r = sd_dhcp_lease_get_router(link->dhcp_lease, &gateway);
         if (r < 0 && r != -ENODATA)
                 return log_link_warning_errno(link, r, "DHCP error: could not get gateway: %m");
 
         if (r >= 0) {
-                struct in_addr address;
                 _cleanup_route_free_ Route *route = NULL;
                 _cleanup_route_free_ Route *route_gw = NULL;
 
-                r = sd_dhcp_lease_get_address(link->dhcp_lease, &address);
-                if (r < 0)
-                        return log_link_warning_errno(link, r, "DHCP error: could not get address: %m");
-
                 r = route_new(&route);
                 if (r < 0)
                         return log_link_error_errno(link, r, "Could not allocate route: %m");
@@ -95,6 +109,7 @@ static int link_set_dhcp_routes(Link *link) {
                 route_gw->scope = RT_SCOPE_LINK;
                 route_gw->protocol = RTPROT_DHCP;
                 route_gw->priority = link->network->dhcp_route_metric;
+                route_gw->table = link->network->dhcp_route_table;
 
                 r = route_configure(route_gw, link, dhcp4_route_handler);
                 if (r < 0)
@@ -106,6 +121,7 @@ static int link_set_dhcp_routes(Link *link) {
                 route->gw.in = gateway;
                 route->prefsrc.in = address;
                 route->priority = link->network->dhcp_route_metric;
+                route->table = link->network->dhcp_route_table;
 
                 r = route_configure(route, link, dhcp4_route_handler);
                 if (r < 0) {
@@ -136,6 +152,8 @@ static int link_set_dhcp_routes(Link *link) {
                 assert_se(sd_dhcp_route_get_destination(static_routes[i], &route->dst.in) >= 0);
                 assert_se(sd_dhcp_route_get_destination_prefix_length(static_routes[i], &route->dst_prefixlen) >= 0);
                 route->priority = link->network->dhcp_route_metric;
+                route->table = link->network->dhcp_route_table;
+                route->scope = route_scope_from_address(route, &address);
 
                 r = route_configure(route, link, dhcp4_route_handler);
                 if (r < 0)
@@ -250,7 +268,7 @@ static int dhcp_lease_lost(Link *link) {
 
                 if (hostname) {
                         /* If a hostname was set due to the lease, then unset it now. */
-                        r = link_set_hostname(link, NULL);
+                        r = manager_set_hostname(link->manager, NULL);
                         if (r < 0)
                                 log_link_warning_errno(link, r, "Failed to reset transient hostname: %m");
                 }
@@ -434,7 +452,7 @@ static int dhcp_lease_acquired(sd_dhcp_client *client, Link *link) {
                         (void) sd_dhcp_lease_get_hostname(lease, &hostname);
 
                 if (hostname) {
-                        r = link_set_hostname(link, hostname);
+                        r = manager_set_hostname(link->manager, hostname);
                         if (r < 0)
                                 log_link_error_errno(link, r, "Failed to set transient hostname to '%s': %m", hostname);
                 }
@@ -446,7 +464,7 @@ static int dhcp_lease_acquired(sd_dhcp_client *client, Link *link) {
                 (void) sd_dhcp_lease_get_timezone(link->dhcp_lease, &tz);
 
                 if (tz) {
-                        r = link_set_timezone(link, tz);
+                        r = manager_set_timezone(link->manager, tz);
                         if (r < 0)
                                 log_link_error_errno(link, r, "Failed to set timezone to '%s': %m", tz);
                 }
@@ -531,6 +549,28 @@ static void dhcp4_handler(sd_dhcp_client *client, int event, void *userdata) {
         return;
 }
 
+static int dhcp4_set_hostname(Link *link) {
+        _cleanup_free_ char *hostname = NULL;
+        const char *hn;
+        int r;
+
+        assert(link);
+
+        if (!link->network->dhcp_send_hostname)
+                hn = NULL;
+        else if (link->network->dhcp_hostname)
+                hn = link->network->dhcp_hostname;
+        else {
+                r = gethostname_strict(&hostname);
+                if (r < 0 && r != -ENXIO) /* ENXIO: no hostname set or hostname is "localhost" */
+                        return r;
+
+                hn = hostname;
+        }
+
+        return sd_dhcp_client_set_hostname(link->dhcp_client, hn);
+}
+
 int dhcp4_configure(Link *link) {
         int r;
 
@@ -600,25 +640,9 @@ int dhcp4_configure(Link *link) {
         if (r < 0)
                 return r;
 
-        if (link->network->dhcp_send_hostname) {
-                _cleanup_free_ char *hostname = NULL;
-                const char *hn = NULL;
-
-                if (!link->network->dhcp_hostname) {
-                        hostname = gethostname_malloc();
-                        if (!hostname)
-                                return -ENOMEM;
-
-                        hn = hostname;
-                } else
-                        hn = link->network->dhcp_hostname;
-
-                if (!is_localhost(hn)) {
-                        r = sd_dhcp_client_set_hostname(link->dhcp_client, hn);
-                        if (r < 0)
-                                return r;
-                }
-        }
+        r = dhcp4_set_hostname(link);
+        if (r < 0)
+                return r;
 
         if (link->network->dhcp_vendor_class_identifier) {
                 r = sd_dhcp_client_set_vendor_class_identifier(link->dhcp_client,
@@ -627,6 +651,12 @@ int dhcp4_configure(Link *link) {
                         return r;
         }
 
+        if (link->network->dhcp_client_port) {
+                r = sd_dhcp_client_set_client_port(link->dhcp_client, link->network->dhcp_client_port);
+                if (r < 0)
+                        return r;
+        }
+
         switch (link->network->dhcp_client_identifier) {
         case DHCP_CLIENT_ID_DUID: {
                 /* If configured, apply user specified DUID and/or IAID */
index 15acf56..6ba2d17 100644 (file)
@@ -23,7 +23,8 @@
 #include "sd-dhcp6-client.h"
 
 #include "network-internal.h"
-#include "networkd.h"
+#include "networkd-link.h"
+#include "networkd-manager.h"
 
 static int dhcp6_lease_address_acquired(sd_dhcp6_client *client, Link *link);
 
@@ -125,7 +126,6 @@ static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) {
 
         assert(link);
         assert(link->network);
-        assert(link->manager);
 
         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
                 return;
index be8aebe..3d7f4d2 100644 (file)
 
 #include "alloc-util.h"
 #include "conf-parser.h"
+#include "netdev/bridge.h"
 #include "netlink-util.h"
 #include "networkd-fdb.h"
-#include "networkd.h"
+#include "networkd-manager.h"
 #include "util.h"
 #include "vlan-util.h"
 
@@ -107,20 +108,28 @@ int fdb_entry_configure(Link *link, FdbEntry *fdb_entry) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
         sd_netlink *rtnl;
         int r;
+        uint8_t flags;
+        Bridge *bridge;
 
         assert(link);
+        assert(link->network);
         assert(link->manager);
         assert(fdb_entry);
 
         rtnl = link->manager->rtnl;
+        bridge = BRIDGE(link->network->bridge);
 
         /* create new RTM message */
         r = sd_rtnl_message_new_neigh(rtnl, &req, RTM_NEWNEIGH, link->ifindex, PF_BRIDGE);
         if (r < 0)
                 return rtnl_log_create_error(r);
 
-        /* only NTF_SELF flag supported. */
-        r = sd_rtnl_message_neigh_set_flags(req, NTF_SELF);
+        if (bridge)
+                flags = NTF_MASTER;
+        else
+                flags = NTF_SELF;
+
+        r = sd_rtnl_message_neigh_set_flags(req, flags);
         if (r < 0)
                 return rtnl_log_create_error(r);
 
index 3fdfe74..eca436d 100644 (file)
@@ -2,6 +2,7 @@
 #include <stddef.h>
 #include "conf-parser.h"
 #include "networkd-conf.h"
+#include "networkd-manager.h"
 %}
 struct ConfigPerfItem;
 %null_strings
index 2d81311..d2b1010 100644 (file)
@@ -21,7 +21,9 @@
 #include <linux/if.h>
 
 #include "network-internal.h"
-#include "networkd.h"
+#include "networkd-address.h"
+#include "networkd-manager.h"
+#include "networkd-link.h"
 
 static int ipv4ll_address_lost(Link *link) {
         _cleanup_address_free_ Address *address = NULL;
@@ -107,7 +109,7 @@ static int ipv4ll_address_handler(sd_netlink *rtnl, sd_netlink_message *m, void
 
         link->ipv4ll_address = true;
 
-        if (link->ipv4ll_route == true)
+        if (link->ipv4ll_route)
                 link_check_ready(link);
 
         return 1;
@@ -171,19 +173,28 @@ static void ipv4ll_handler(sd_ipv4ll *ll, int event, void *userdata) {
 
         assert(link);
         assert(link->network);
-        assert(link->manager);
 
         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
                 return;
 
         switch(event) {
                 case SD_IPV4LL_EVENT_STOP:
+                        r = ipv4ll_address_lost(link);
+                        if (r < 0) {
+                                link_enter_failed(link);
+                                return;
+                        }
+                        break;
                 case SD_IPV4LL_EVENT_CONFLICT:
                         r = ipv4ll_address_lost(link);
                         if (r < 0) {
                                 link_enter_failed(link);
                                 return;
                         }
+
+                        r = sd_ipv4ll_restart(ll);
+                        if (r < 0)
+                                log_link_warning(link, "Could not acquire IPv4 link-local address");
                         break;
                 case SD_IPV4LL_EVENT_BIND:
                         r = ipv4ll_address_claimed(ll, link);
diff --git a/src/network/networkd-ipv6-proxy-ndp.c b/src/network/networkd-ipv6-proxy-ndp.c
new file mode 100644 (file)
index 0000000..00790c0
--- /dev/null
@@ -0,0 +1,212 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2017 Florian Klink <flokli@flokli.de>
+
+  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 <netinet/ether.h>
+#include <linux/if.h>
+#include <unistd.h>
+
+#include "fileio.h"
+#include "netlink-util.h"
+#include "networkd-ipv6-proxy-ndp.h"
+#include "networkd-link.h"
+#include "networkd-manager.h"
+#include "networkd-network.h"
+#include "string-util.h"
+
+static bool ipv6_proxy_ndp_is_needed(Link *link) {
+        assert(link);
+
+        if (link->flags & IFF_LOOPBACK)
+                return false;
+
+        if (!link->network)
+                return false;
+
+        if (link->network->ipv6_proxy_ndp != -1)
+                return link->network->ipv6_proxy_ndp;
+
+        if (link->network->n_ipv6_proxy_ndp_addresses == 0)
+                return false;
+
+        return true;
+}
+
+static int ipv6_proxy_ndp_set(Link *link) {
+        const char *p = NULL;
+        int r, v;
+
+        assert(link);
+
+        v = ipv6_proxy_ndp_is_needed(link);
+        p = strjoina("/proc/sys/net/ipv6/conf/", link->ifname, "/proxy_ndp");
+
+        r = write_string_file(p, one_zero(v), WRITE_STRING_FILE_VERIFY_ON_FAILURE);
+        if (r < 0)
+                log_link_warning_errno(link, r, "Cannot configure proxy NDP for interface: %m");
+
+        return 0;
+}
+
+int ipv6_proxy_ndp_address_new_static(Network *network, IPv6ProxyNDPAddress **ret) {
+        _cleanup_(ipv6_proxy_ndp_address_freep) IPv6ProxyNDPAddress *ipv6_proxy_ndp_address = NULL;
+
+        assert(network);
+        assert(ret);
+
+        /* allocate space for IPv6ProxyNDPAddress entry */
+        ipv6_proxy_ndp_address = new0(IPv6ProxyNDPAddress, 1);
+        if (!ipv6_proxy_ndp_address)
+                return -ENOMEM;
+
+        ipv6_proxy_ndp_address->network = network;
+
+        LIST_PREPEND(ipv6_proxy_ndp_addresses, network->ipv6_proxy_ndp_addresses, ipv6_proxy_ndp_address);
+        network->n_ipv6_proxy_ndp_addresses++;
+
+        *ret = ipv6_proxy_ndp_address;
+        ipv6_proxy_ndp_address = NULL;
+
+        return 0;
+}
+
+void ipv6_proxy_ndp_address_free(IPv6ProxyNDPAddress *ipv6_proxy_ndp_address) {
+        if (!ipv6_proxy_ndp_address)
+                return;
+
+        if (ipv6_proxy_ndp_address->network) {
+                LIST_REMOVE(ipv6_proxy_ndp_addresses, ipv6_proxy_ndp_address->network->ipv6_proxy_ndp_addresses,
+                            ipv6_proxy_ndp_address);
+
+                assert(ipv6_proxy_ndp_address->network->n_ipv6_proxy_ndp_addresses > 0);
+                ipv6_proxy_ndp_address->network->n_ipv6_proxy_ndp_addresses--;
+        }
+
+        free(ipv6_proxy_ndp_address);
+}
+
+int config_parse_ipv6_proxy_ndp_address(
+        const char *unit,
+        const char *filename,
+        unsigned line,
+        const char *section,
+        unsigned section_line,
+        const char *lvalue,
+        int ltype,
+        const char *rvalue,
+        void *data,
+        void *userdata) {
+
+        Network *network = userdata;
+        _cleanup_(ipv6_proxy_ndp_address_freep) IPv6ProxyNDPAddress *ipv6_proxy_ndp_address = NULL;
+        int r;
+        union in_addr_union buffer;
+
+        assert(filename);
+        assert(section);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = ipv6_proxy_ndp_address_new_static(network, &ipv6_proxy_ndp_address);
+        if (r < 0)
+                return r;
+
+        r = in_addr_from_string(AF_INET6, rvalue, &buffer);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse IPv6 proxy NDP address, ignoring: %s",
+                           rvalue);
+                return 0;
+        }
+
+        r = in_addr_is_null(AF_INET6, &buffer);
+        if (r != 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "IPv6 proxy NDP address can not be the ANY address, ignoring: %s", rvalue);
+                return 0;
+        }
+
+        ipv6_proxy_ndp_address->in_addr = buffer.in6;
+        ipv6_proxy_ndp_address = NULL;
+
+        return 0;
+}
+
+static int set_ipv6_proxy_ndp_address_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
+        Link *link = userdata;
+        int r;
+
+        assert(link);
+
+        r = sd_netlink_message_get_errno(m);
+        if (r < 0 && r != -EEXIST)
+                log_link_error_errno(link, r, "Could not add IPv6 proxy ndp address entry: %m");
+
+        return 1;
+}
+
+/* send a request to the kernel to add a IPv6 Proxy entry to the neighbour table */
+int ipv6_proxy_ndp_address_configure(Link *link, IPv6ProxyNDPAddress *ipv6_proxy_ndp_address) {
+        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
+        sd_netlink *rtnl;
+        int r;
+
+        assert(link);
+        assert(link->network);
+        assert(link->manager);
+        assert(ipv6_proxy_ndp_address);
+
+        rtnl = link->manager->rtnl;
+
+        /* create new netlink message */
+        r = sd_rtnl_message_new_neigh(rtnl, &req, RTM_NEWNEIGH, link->ifindex, AF_INET6);
+        if (r < 0)
+                return rtnl_log_create_error(r);
+
+        r = sd_rtnl_message_neigh_set_flags(req, NLM_F_REQUEST | NTF_PROXY);
+        if (r < 0)
+                return rtnl_log_create_error(r);
+
+        r = sd_netlink_message_append_in6_addr(req, NDA_DST, &ipv6_proxy_ndp_address->in_addr);
+        if (r < 0)
+                return rtnl_log_create_error(r);
+
+        r = sd_netlink_call_async(rtnl, req, set_ipv6_proxy_ndp_address_handler, link, 0, NULL);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
+
+        return 0;
+}
+
+/* configure all ipv6 proxy ndp addresses */
+int ipv6_proxy_ndp_addresses_configure(Link *link) {
+        IPv6ProxyNDPAddress *ipv6_proxy_ndp_address;
+        int r;
+
+        /* enable or disable proxy_ndp itself depending on whether ipv6_proxy_ndp_addresses are set or not */
+        r = ipv6_proxy_ndp_set(link);
+        if (r != 0)
+                return r;
+
+        LIST_FOREACH(ipv6_proxy_ndp_addresses, ipv6_proxy_ndp_address, link->network->ipv6_proxy_ndp_addresses) {
+                r = ipv6_proxy_ndp_address_configure(link, ipv6_proxy_ndp_address);
+                if (r != 0)
+                        return r;
+        }
+        return 0;
+}
diff --git a/src/network/networkd-ipv6-proxy-ndp.h b/src/network/networkd-ipv6-proxy-ndp.h
new file mode 100644 (file)
index 0000000..f09169f
--- /dev/null
@@ -0,0 +1,44 @@
+#pragma once
+
+/***
+  This file is part of systemd.
+
+  Copyright 2017 Florian Klink <flokli@flokli.de>
+
+  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 "list.h"
+#include "macro.h"
+
+typedef struct Network Network;
+typedef struct IPv6ProxyNDPAddress IPv6ProxyNDPAddress;
+typedef struct Link Link;
+
+struct IPv6ProxyNDPAddress {
+    Network *network;
+    struct in6_addr in_addr;
+
+    LIST_FIELDS(IPv6ProxyNDPAddress, ipv6_proxy_ndp_addresses);
+};
+
+
+int ipv6_proxy_ndp_address_new_static(Network *network, IPv6ProxyNDPAddress ** ipv6_proxy_ndp_address);
+void ipv6_proxy_ndp_address_free(IPv6ProxyNDPAddress *ipv6_proxy_ndp_address);
+int ipv6_proxy_ndp_address_configure(Link *link, IPv6ProxyNDPAddress *ipv6_proxy_ndp_address);
+int ipv6_proxy_ndp_addresses_configure(Link *link);
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(IPv6ProxyNDPAddress*, ipv6_proxy_ndp_address_free);
+
+int config_parse_ipv6_proxy_ndp_address(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
index 532557e..c39c648 100644 (file)
@@ -20,7 +20,7 @@
 #include "alloc-util.h"
 #include "bus-util.h"
 #include "networkd-link.h"
-#include "networkd.h"
+#include "networkd-manager.h"
 #include "parse-util.h"
 #include "strv.h"
 
index 82f5615..4c57fa1 100644 (file)
 #include "fileio.h"
 #include "netlink-util.h"
 #include "network-internal.h"
+#include "networkd-ipv6-proxy-ndp.h"
 #include "networkd-lldp-tx.h"
+#include "networkd-manager.h"
 #include "networkd-ndisc.h"
-#include "networkd.h"
+#include "networkd-radv.h"
 #include "set.h"
 #include "socket-util.h"
 #include "stdio-util.h"
@@ -118,6 +120,15 @@ static bool link_ipv6_enabled(Link *link) {
         return link_ipv6ll_enabled(link) || network_has_static_ipv6_addresses(link->network);
 }
 
+static bool link_radv_enabled(Link *link) {
+        assert(link);
+
+        if (!link_ipv6ll_enabled(link))
+                return false;
+
+        return link->network->router_prefix_delegation;
+}
+
 static bool link_lldp_rx_enabled(Link *link) {
         assert(link);
 
@@ -130,7 +141,10 @@ static bool link_lldp_rx_enabled(Link *link) {
         if (!link->network)
                 return false;
 
-        if (link->network->bridge)
+        /* LLDP should be handled on bridge slaves as those have a direct
+         * connection to their peers not on the bridge master. Linux doesn't
+         * even (by default) forward lldp packets to the bridge master.*/
+        if (streq_ptr("bridge", link->kind))
                 return false;
 
         return link->network->lldp_mode != LLDP_MODE_NO;
@@ -255,13 +269,10 @@ static int link_enable_ipv6(Link *link) {
 
         r = write_string_file(p, one_zero(disabled), WRITE_STRING_FILE_VERIFY_ON_FAILURE);
         if (r < 0)
-                log_link_warning_errno(link, r, "Cannot %s IPv6 for interface %s: %m", disabled ? "disable" : "enable", link->ifname);
-        else {
-                if (disabled)
-                        log_link_info(link, "IPv6 disabled for interface: %m");
-                else
-                        log_link_info(link, "IPv6 enabled for interface: %m");
-        }
+                log_link_warning_errno(link, r, "Cannot %s IPv6 for interface %s: %m",
+                                       enable_disable(!disabled), link->ifname);
+        else
+                log_link_info(link, "IPv6 successfully %sd", enable_disable(!disabled));
 
         return 0;
 }
@@ -518,12 +529,12 @@ static void link_free(Link *link) {
         sd_lldp_unref(link->lldp);
         free(link->lldp_file);
 
+        ndisc_flush(link);
+
         sd_ipv4ll_unref(link->ipv4ll);
         sd_dhcp6_client_unref(link->dhcp6_client);
         sd_ndisc_unref(link->ndisc);
-
-        set_free_free(link->ndisc_rdnss);
-        set_free_free(link->ndisc_dnssl);
+        sd_radv_unref(link->radv);
 
         if (link->manager)
                 hashmap_remove(link->manager->links, INT_TO_PTR(link->ifindex));
@@ -643,6 +654,12 @@ static int link_stop_clients(Link *link) {
                         r = log_link_warning_errno(link, k, "Could not stop IPv6 Router Discovery: %m");
         }
 
+        if (link->radv) {
+                k = sd_radv_stop(link->radv);
+                if (k < 0)
+                        r = log_link_warning_errno(link, k, "Could not stop IPv6 Router Advertisement: %m");
+        }
+
         link_lldp_emit_stop(link);
         return r;
 }
@@ -691,18 +708,18 @@ static Address* link_find_dhcp_server_address(Link *link) {
         return NULL;
 }
 
-static int link_enter_configured(Link *link) {
+static void link_enter_configured(Link *link) {
         assert(link);
         assert(link->network);
-        assert(link->state == LINK_STATE_SETTING_ROUTES);
+
+        if (link->state != LINK_STATE_SETTING_ROUTES)
+                return;
 
         log_link_info(link, "Configured");
 
         link_set_state(link, LINK_STATE_CONFIGURED);
 
         link_dirty(link);
-
-        return 0;
 }
 
 void link_check_ready(Link *link) {
@@ -856,21 +873,56 @@ static int address_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userda
         return 1;
 }
 
-static int link_push_dns_to_dhcp_server(Link *link, sd_dhcp_server *s) {
+static int address_label_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
+        _cleanup_link_unref_ Link *link = userdata;
+        int r;
+
+        assert(rtnl);
+        assert(m);
+        assert(link);
+        assert(link->ifname);
+        assert(link->link_messages > 0);
+
+        link->link_messages--;
+
+        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
+                return 1;
+
+        r = sd_netlink_message_get_errno(m);
+        if (r < 0 && r != -EEXIST)
+                log_link_warning_errno(link, r, "could not set address label: %m");
+        else if (r >= 0)
+                manager_rtnl_process_address(rtnl, m, link->manager);
+
+        if (link->link_messages == 0) {
+                log_link_debug(link, "Addresses label set");
+                link_enter_set_routes(link);
+        }
+
+        return 1;
+}
+
+static int link_push_uplink_dns_to_dhcp_server(Link *link, sd_dhcp_server *s) {
         _cleanup_free_ struct in_addr *addresses = NULL;
         size_t n_addresses = 0, n_allocated = 0;
-        char **a;
+        unsigned i;
 
         log_debug("Copying DNS server information from %s", link->ifname);
 
         if (!link->network)
                 return 0;
 
-        STRV_FOREACH(a, link->network->dns) {
+        for (i = 0; i < link->network->n_dns; i++) {
                 struct in_addr ia;
 
                 /* Only look for IPv4 addresses */
-                if (inet_pton(AF_INET, *a, &ia) <= 0)
+                if (link->network->dns[i].family != AF_INET)
+                        continue;
+
+                ia = link->network->dns[i].address.in;
+
+                /* Never propagate obviously borked data */
+                if (in4_addr_is_null(&ia) || in4_addr_is_localhost(&ia))
                         continue;
 
                 if (!GREEDY_REALLOC(addresses, n_allocated, n_addresses + 1))
@@ -879,8 +931,7 @@ static int link_push_dns_to_dhcp_server(Link *link, sd_dhcp_server *s) {
                 addresses[n_addresses++] = ia;
         }
 
-        if (link->network->dhcp_use_dns &&
-            link->dhcp_lease) {
+        if (link->network->dhcp_use_dns && link->dhcp_lease) {
                 const struct in_addr *da = NULL;
                 int n;
 
@@ -901,7 +952,7 @@ static int link_push_dns_to_dhcp_server(Link *link, sd_dhcp_server *s) {
         return sd_dhcp_server_set_dns(s, addresses, n_addresses);
 }
 
-static int link_push_ntp_to_dhcp_server(Link *link, sd_dhcp_server *s) {
+static int link_push_uplink_ntp_to_dhcp_server(Link *link, sd_dhcp_server *s) {
         _cleanup_free_ struct in_addr *addresses = NULL;
         size_t n_addresses = 0, n_allocated = 0;
         char **a;
@@ -918,14 +969,17 @@ static int link_push_ntp_to_dhcp_server(Link *link, sd_dhcp_server *s) {
                 if (inet_pton(AF_INET, *a, &ia) <= 0)
                         continue;
 
+                /* Never propagate obviously borked data */
+                if (in4_addr_is_null(&ia) || in4_addr_is_localhost(&ia))
+                        continue;
+
                 if (!GREEDY_REALLOC(addresses, n_allocated, n_addresses + 1))
                         return log_oom();
 
                 addresses[n_addresses++] = ia;
         }
 
-        if (link->network->dhcp_use_ntp &&
-            link->dhcp_lease) {
+        if (link->network->dhcp_use_ntp && link->dhcp_lease) {
                 const struct in_addr *da = NULL;
                 int n;
 
@@ -946,7 +1000,21 @@ static int link_push_ntp_to_dhcp_server(Link *link, sd_dhcp_server *s) {
         return sd_dhcp_server_set_ntp(s, addresses, n_addresses);
 }
 
+static int link_set_bridge_fdb(Link *link) {
+        FdbEntry *fdb_entry;
+        int r;
+
+        LIST_FOREACH(static_fdb_entries, fdb_entry, link->network->static_fdb_entries) {
+                r = fdb_entry_configure(link, fdb_entry);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Failed to add MAC entry to static MAC table: %m");
+        }
+
+        return 0;
+}
+
 static int link_enter_set_addresses(Link *link) {
+        AddressLabel *label;
         Address *ad;
         int r;
 
@@ -954,6 +1022,10 @@ static int link_enter_set_addresses(Link *link) {
         assert(link->network);
         assert(link->state != _LINK_STATE_INVALID);
 
+        r = link_set_bridge_fdb(link);
+        if (r < 0)
+                return r;
+
         link_set_state(link, LINK_STATE_SETTING_ADDRESSES);
 
         LIST_FOREACH(addresses, ad, link->network->static_addresses) {
@@ -967,6 +1039,17 @@ static int link_enter_set_addresses(Link *link) {
                 link->link_messages++;
         }
 
+        LIST_FOREACH(labels, label, link->network->address_labels) {
+                r = address_label_configure(label, link, address_label_handler, false);
+                if (r < 0) {
+                        log_link_warning_errno(link, r, "Could not set address label: %m");
+                        link_enter_failed(link);
+                        return r;
+                }
+
+                link->link_messages++;
+        }
+
         /* now that we can figure out a default address for the dhcp server,
            start it */
         if (link_dhcp4_server_enabled(link)) {
@@ -1022,7 +1105,7 @@ static int link_enter_set_addresses(Link *link) {
                                         log_link_debug(link, "Not emitting DNS server information on link, couldn't find suitable uplink.");
                                         r = 0;
                                 } else
-                                        r = link_push_dns_to_dhcp_server(uplink, link->dhcp_server);
+                                        r = link_push_uplink_dns_to_dhcp_server(uplink, link->dhcp_server);
                         }
                         if (r < 0)
                                 log_link_warning_errno(link, r, "Failed to set DNS server for DHCP server, ignoring: %m");
@@ -1041,7 +1124,7 @@ static int link_enter_set_addresses(Link *link) {
                                         log_link_debug(link, "Not emitting NTP server information on link, couldn't find suitable uplink.");
                                         r = 0;
                                 } else
-                                        r = link_push_ntp_to_dhcp_server(uplink, link->dhcp_server);
+                                        r = link_push_uplink_ntp_to_dhcp_server(uplink, link->dhcp_server);
 
                         }
                         if (r < 0)
@@ -1123,21 +1206,6 @@ static int link_set_bridge_vlan(Link *link) {
         return r;
 }
 
-static int link_set_bridge_fdb(Link *link) {
-        FdbEntry *fdb_entry;
-        int r = 0;
-
-        LIST_FOREACH(static_fdb_entries, fdb_entry, link->network->static_fdb_entries) {
-                r = fdb_entry_configure(link, fdb_entry);
-                if (r < 0) {
-                        log_link_error_errno(link, r, "Failed to add MAC entry to static MAC table: %m");
-                        break;
-                }
-        }
-
-        return r;
-}
-
 static int link_set_proxy_arp(Link *link) {
         const char *p = NULL;
         int r;
@@ -1170,110 +1238,52 @@ static int link_set_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userd
         return 0;
 }
 
-static int set_hostname_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
+static int set_mtu_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
         _cleanup_link_unref_ Link *link = userdata;
-        const sd_bus_error *e;
+        int r;
 
         assert(m);
         assert(link);
+        assert(link->ifname);
 
         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
                 return 1;
 
-        e = sd_bus_message_get_error(m);
-        if (e)
-                log_link_warning_errno(link, sd_bus_error_get_errno(e), "Could not set hostname: %s", e->message);
+        r = sd_netlink_message_get_errno(m);
+        if (r < 0)
+                log_link_warning_errno(link, r, "Could not set MTU: %m");
 
         return 1;
 }
 
-int link_set_hostname(Link *link, const char *hostname) {
+int link_set_mtu(Link *link, uint32_t mtu) {
+        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
         int r;
 
         assert(link);
         assert(link->manager);
+        assert(link->manager->rtnl);
 
-        log_link_debug(link, "Setting transient hostname: '%s'", strna(hostname));
-
-        if (!link->manager->bus) {
-                /* TODO: replace by assert when we can rely on kdbus */
-                log_link_info(link, "Not connected to system bus, ignoring transient hostname.");
-                return 0;
-        }
-
-        r = sd_bus_call_method_async(
-                        link->manager->bus,
-                        NULL,
-                        "org.freedesktop.hostname1",
-                        "/org/freedesktop/hostname1",
-                        "org.freedesktop.hostname1",
-                        "SetHostname",
-                        set_hostname_handler,
-                        link,
-                        "sb",
-                        hostname,
-                        false);
+        log_link_debug(link, "Setting MTU: %" PRIu32, mtu);
 
+        r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
         if (r < 0)
-                return log_link_error_errno(link, r, "Could not set transient hostname: %m");
-
-        link_ref(link);
-
-        return 0;
-}
-
-static int set_timezone_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
-        _cleanup_link_unref_ Link *link = userdata;
-        const sd_bus_error *e;
-
-        assert(m);
-        assert(link);
-
-        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
-                return 1;
-
-        e = sd_bus_message_get_error(m);
-        if (e)
-                log_link_warning_errno(link, sd_bus_error_get_errno(e), "Could not set timezone: %s", e->message);
-
-        return 1;
-}
-
-int link_set_timezone(Link *link, const char *tz) {
-        int r;
-
-        assert(link);
-        assert(link->manager);
-        assert(tz);
-
-        log_link_debug(link, "Setting system timezone: '%s'", tz);
+                return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
 
-        if (!link->manager->bus) {
-                log_link_info(link, "Not connected to system bus, ignoring timezone.");
-                return 0;
-        }
+        r = sd_netlink_message_append_u32(req, IFLA_MTU, mtu);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not append MTU: %m");
 
-        r = sd_bus_call_method_async(
-                        link->manager->bus,
-                        NULL,
-                        "org.freedesktop.timedate1",
-                        "/org/freedesktop/timedate1",
-                        "org.freedesktop.timedate1",
-                        "SetTimezone",
-                        set_timezone_handler,
-                        link,
-                        "sb",
-                        tz,
-                        false);
+        r = sd_netlink_call_async(link->manager->rtnl, req, set_mtu_handler, link, 0, NULL);
         if (r < 0)
-                return log_link_error_errno(link, r, "Could not set timezone: %m");
+                return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
 
         link_ref(link);
 
         return 0;
 }
 
-static int set_mtu_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
+static int set_flags_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
         _cleanup_link_unref_ Link *link = userdata;
         int r;
 
@@ -1286,30 +1296,44 @@ static int set_mtu_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userda
 
         r = sd_netlink_message_get_errno(m);
         if (r < 0)
-                log_link_warning_errno(link, r, "Could not set MTU: %m");
+                log_link_warning_errno(link, r, "Could not set link flags: %m");
 
         return 1;
 }
 
-int link_set_mtu(Link *link, uint32_t mtu) {
+static int link_set_flags(Link *link) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
+        unsigned ifi_change = 0;
+        unsigned ifi_flags = 0;
         int r;
 
         assert(link);
         assert(link->manager);
         assert(link->manager->rtnl);
 
-        log_link_debug(link, "Setting MTU: %" PRIu32, mtu);
+        if (link->flags & IFF_LOOPBACK)
+                return 0;
+
+        if (!link->network)
+                return 0;
+
+        if (link->network->arp < 0)
+                return 0;
 
         r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
 
-        r = sd_netlink_message_append_u32(req, IFLA_MTU, mtu);
+        if (link->network->arp >= 0) {
+                ifi_change |= IFF_NOARP;
+                ifi_flags |= link->network->arp ? 0 : IFF_NOARP;
+        }
+
+        r = sd_rtnl_message_link_set_flags(req, ifi_flags, ifi_change);
         if (r < 0)
-                return log_link_error_errno(link, r, "Could not append MTU: %m");
+                return log_link_error_errno(link, r, "Could not set link flags: %m");
 
-        r = sd_netlink_call_async(link->manager->rtnl, req, set_mtu_handler, link, 0, NULL);
+        r = sd_netlink_call_async(link->manager->rtnl, req, set_flags_handler, link, 0, NULL);
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
 
@@ -1362,6 +1386,11 @@ static int link_set_bridge(Link *link) {
                 if (r < 0)
                         return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_COST attribute: %m");
         }
+        if (link->network->priority != LINK_BRIDGE_PORT_PRIORITY_INVALID) {
+                r = sd_netlink_message_append_u16(req, IFLA_BRPORT_PRIORITY, link->network->priority);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_PRIORITY attribute: %m");
+        }
 
         r = sd_netlink_message_close_container(req);
         if (r < 0)
@@ -1376,6 +1405,58 @@ static int link_set_bridge(Link *link) {
         return r;
 }
 
+static int link_bond_set(Link *link) {
+        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
+        int r;
+
+        assert(link);
+        assert(link->network);
+
+        r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_NEWLINK, link->network->bond->ifindex);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
+
+        r = sd_netlink_message_set_flags(req, NLM_F_REQUEST | NLM_F_ACK);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not set netlink flags: %m");
+
+        r = sd_netlink_message_open_container(req, IFLA_LINKINFO);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not append IFLA_PROTINFO attribute: %m");
+
+        r = sd_netlink_message_open_container_union(req, IFLA_INFO_DATA, "bond");
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not append IFLA_INFO_DATA attribute: %m");
+
+        if (link->network->active_slave) {
+                r = sd_netlink_message_append_u32(req, IFLA_BOND_ACTIVE_SLAVE, link->ifindex);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not append IFLA_BOND_ACTIVE_SLAVE attribute: %m");
+        }
+
+        if (link->network->primary_slave) {
+                r = sd_netlink_message_append_u32(req, IFLA_BOND_PRIMARY, link->ifindex);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not append IFLA_BOND_PRIMARY attribute: %m");
+        }
+
+        r = sd_netlink_message_close_container(req);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not append IFLA_LINKINFO attribute: %m");
+
+        r = sd_netlink_message_close_container(req);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not append IFLA_INFO_DATA attribute: %m");
+
+        r = sd_netlink_call_async(link->manager->rtnl, req, set_flags_handler, link, 0, NULL);
+        if (r < 0)
+                return log_link_error_errno(link, r,  "Could not send rtnetlink message: %m");
+
+        link_ref(link);
+
+        return r;
+}
+
 static int link_lldp_save(Link *link) {
         _cleanup_free_ char *temp_path = NULL;
         _cleanup_fclose_ FILE *f = NULL;
@@ -1493,6 +1574,17 @@ static int link_acquire_ipv6_conf(Link *link) {
                         return log_link_warning_errno(link, r, "Could not start IPv6 Router Discovery: %m");
         }
 
+        if (link_radv_enabled(link)) {
+                assert(link->radv);
+                assert(in_addr_is_link_local(AF_INET6, (const union in_addr_union*)&link->ipv6ll_address) > 0);
+
+                log_link_debug(link, "Starting IPv6 Router Advertisements");
+
+                r = sd_radv_start(link->radv);
+                if (r < 0 && r != -EBUSY)
+                        return log_link_warning_errno(link, r, "Could not start IPv6 Router Advertisement: %m");
+        }
+
         return 0;
 }
 
@@ -1583,7 +1675,7 @@ static int link_up_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userda
         return 1;
 }
 
-static int link_up(Link *link) {
+int link_up(Link *link) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
         uint8_t ipv6ll_mode;
         int r;
@@ -1704,7 +1796,7 @@ static int link_down_handler(sd_netlink *rtnl, sd_netlink_message *m, void *user
         return 1;
 }
 
-static int link_down(Link *link) {
+int link_down(Link *link) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
         int r;
 
@@ -1732,6 +1824,31 @@ static int link_down(Link *link) {
         return 0;
 }
 
+static int link_up_can(Link *link) {
+        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
+        int r;
+
+        assert(link);
+
+        log_link_debug(link, "Bringing CAN link up");
+
+        r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
+
+        r = sd_rtnl_message_link_set_flags(req, IFF_UP, IFF_UP);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not set link flags: %m");
+
+        r = sd_netlink_call_async(link->manager->rtnl, req, link_up_handler, link, 0, NULL);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
+
+        link_ref(link);
+
+        return 0;
+}
+
 static int link_handle_bound_to_list(Link *link) {
         Link *l;
         Iterator i;
@@ -2005,12 +2122,25 @@ static int link_joined(Link *link) {
                         log_link_error_errno(link, r, "Could not set bridge message: %m");
         }
 
-        if (link->network->bridge || streq_ptr("bridge", link->kind)) {
+        if (link->network->bond) {
+                r = link_bond_set(link);
+                if (r < 0)
+                        log_link_error_errno(link, r, "Could not set bond message: %m");
+        }
+
+        if (link->network->use_br_vlan &&
+            (link->network->bridge || streq_ptr("bridge", link->kind))) {
                 r = link_set_bridge_vlan(link);
                 if (r < 0)
                         log_link_error_errno(link, r, "Could not set bridge vlan: %m");
         }
 
+        /* Skip setting up addresses until it gets carrier,
+           or it would try to set addresses twice,
+           which is bad for non-idempotent steps. */
+        if (!link_has_carrier(link))
+                return 0;
+
         return link_enter_set_addresses(link);
 }
 
@@ -2318,6 +2448,46 @@ static int link_drop_foreign_config(Link *link) {
         return 0;
 }
 
+static int link_drop_config(Link *link) {
+        Address *address, *pool_address;
+        Route *route;
+        Iterator i;
+        int r;
+
+        SET_FOREACH(address, link->addresses, i) {
+                /* we consider IPv6LL addresses to be managed by the kernel */
+                if (address->family == AF_INET6 && in_addr_is_link_local(AF_INET6, &address->in_addr) == 1)
+                        continue;
+
+                r = address_remove(address, link, link_address_remove_handler);
+                if (r < 0)
+                        return r;
+
+                /* If this address came from an address pool, clean up the pool */
+                LIST_FOREACH(addresses, pool_address, link->pool_addresses) {
+                        if (address_equal(address, pool_address)) {
+                                LIST_REMOVE(addresses, link->pool_addresses, pool_address);
+                                address_free(pool_address);
+                                break;
+                        }
+                }
+        }
+
+        SET_FOREACH(route, link->routes, i) {
+                /* do not touch routes managed by the kernel */
+                if (route->protocol == RTPROT_KERNEL)
+                        continue;
+
+                r = route_remove(route, link, link_route_remove_handler);
+                if (r < 0)
+                        return r;
+        }
+
+        ndisc_flush(link);
+
+        return 0;
+}
+
 static int link_update_lldp(Link *link) {
         int r;
 
@@ -2346,6 +2516,19 @@ static int link_configure(Link *link) {
         assert(link->network);
         assert(link->state == LINK_STATE_PENDING);
 
+        if (streq_ptr(link->kind, "vcan")) {
+
+                if (!(link->flags & IFF_UP)) {
+                        r = link_up_can(link);
+                        if (r < 0) {
+                                link_enter_failed(link);
+                                return r;
+                        }
+                }
+
+                return 0;
+        }
+
         /* Drop foreign config, but ignore loopback or critical devices.
          * We do not want to remove loopback address or addresses used for root NFS. */
         if (!(link->flags & IFF_LOOPBACK) && !(link->network->dhcp_critical)) {
@@ -2354,14 +2537,14 @@ static int link_configure(Link *link) {
                         return r;
         }
 
-        r = link_set_bridge_fdb(link);
-        if (r < 0)
-                return r;
-
         r = link_set_proxy_arp(link);
         if (r < 0)
                return r;
 
+        r = ipv6_proxy_ndp_addresses_configure(link);
+        if (r < 0)
+                return r;
+
         r = link_set_ipv4_forward(link);
         if (r < 0)
                 return r;
@@ -2386,6 +2569,10 @@ static int link_configure(Link *link) {
         if (r < 0)
                 return r;
 
+        r = link_set_flags(link);
+        if (r < 0)
+                return r;
+
         if (link_ipv4ll_enabled(link)) {
                 r = ipv4ll_configure(link);
                 if (r < 0)
@@ -2421,6 +2608,12 @@ static int link_configure(Link *link) {
                         return r;
         }
 
+        if (link_radv_enabled(link)) {
+                r = radv_configure(link);
+                if (r < 0)
+                        return r;
+        }
+
         if (link_lldp_rx_enabled(link)) {
                 r = sd_lldp_new(&link->lldp);
                 if (r < 0)
@@ -2492,6 +2685,9 @@ static int link_initialized_and_synced(sd_netlink *rtnl, sd_netlink_message *m,
                 if (r == -ENOENT) {
                         link_enter_unmanaged(link);
                         return 1;
+                } else if (r == 0 && network->unmanaged) {
+                        link_enter_unmanaged(link);
+                        return 0;
                 } else if (r < 0)
                         return r;
 
@@ -2506,7 +2702,7 @@ static int link_initialized_and_synced(sd_netlink *rtnl, sd_netlink_message *m,
                                 log_link_debug(link, "Ignoring DHCP server for loopback link");
                 }
 
-                r = network_apply(link->manager, network, link);
+                r = network_apply(network, link);
                 if (r < 0)
                         return r;
         }
@@ -2602,7 +2798,7 @@ static int link_load(Link *link) {
                         goto network_file_fail;
                 }
 
-                r = network_apply(link->manager, network, link);
+                r = network_apply(network, link);
                 if (r < 0)
                         return log_link_error_errno(link, r, "Failed to apply network %s: %m", basename(network_file));
         }
@@ -2716,17 +2912,17 @@ network_file_fail:
         if (dhcp4_address) {
                 r = in_addr_from_string(AF_INET, dhcp4_address, &address);
                 if (r < 0) {
-                        log_link_debug_errno(link, r, "Falied to parse DHCPv4 address %s: %m", dhcp4_address);
+                        log_link_debug_errno(link, r, "Failed to parse DHCPv4 address %s: %m", dhcp4_address);
                         goto dhcp4_address_fail;
                 }
 
                 r = sd_dhcp_client_new(&link->dhcp_client);
                 if (r < 0)
-                        return log_link_error_errno(link, r, "Falied to create DHCPv4 client: %m");
+                        return log_link_error_errno(link, r, "Failed to create DHCPv4 client: %m");
 
                 r = sd_dhcp_client_set_request_address(link->dhcp_client, &address.in);
                 if (r < 0)
-                        return log_link_error_errno(link, r, "Falied to set initial DHCPv4 address %s: %m", dhcp4_address);
+                        return log_link_error_errno(link, r, "Failed to set initial DHCPv4 address %s: %m", dhcp4_address);
         }
 
 dhcp4_address_fail:
@@ -2734,17 +2930,17 @@ dhcp4_address_fail:
         if (ipv4ll_address) {
                 r = in_addr_from_string(AF_INET, ipv4ll_address, &address);
                 if (r < 0) {
-                        log_link_debug_errno(link, r, "Falied to parse IPv4LL address %s: %m", ipv4ll_address);
+                        log_link_debug_errno(link, r, "Failed to parse IPv4LL address %s: %m", ipv4ll_address);
                         goto ipv4ll_address_fail;
                 }
 
                 r = sd_ipv4ll_new(&link->ipv4ll);
                 if (r < 0)
-                        return log_link_error_errno(link, r, "Falied to create IPv4LL client: %m");
+                        return log_link_error_errno(link, r, "Failed to create IPv4LL client: %m");
 
                 r = sd_ipv4ll_set_address(link->ipv4ll, &address.in);
                 if (r < 0)
-                        return log_link_error_errno(link, r, "Falied to set initial IPv4LL address %s: %m", ipv4ll_address);
+                        return log_link_error_errno(link, r, "Failed to set initial IPv4LL address %s: %m", ipv4ll_address);
         }
 
 ipv4ll_address_fail:
@@ -2864,6 +3060,19 @@ static int link_carrier_lost(Link *link) {
                 return r;
         }
 
+        (void) sd_dhcp_server_stop(link->dhcp_server);
+
+        r = link_drop_config(link);
+        if (r < 0)
+                return r;
+
+        if (!IN_SET(link->state, LINK_STATE_UNMANAGED, LINK_STATE_PENDING)) {
+                log_link_debug(link, "State is %s, dropping config", link_state_to_string(link->state));
+                r = link_drop_foreign_config(link);
+                if (r < 0)
+                        return r;
+        }
+
         r = link_handle_bound_by_list(link);
         if (r < 0)
                 return r;
@@ -2943,6 +3152,12 @@ int link_update(Link *link, sd_netlink_message *m) {
                                 return r;
                         }
                 }
+
+                if (link->radv) {
+                        r = sd_radv_set_mtu(link->radv, link->mtu);
+                        if (r < 0)
+                                return log_link_warning_errno(link, r, "Could not set MTU for Router Advertisement: %m");
+                }
         }
 
         /* The kernel may broadcast NEWLINK messages without the MAC address
@@ -3011,6 +3226,12 @@ int link_update(Link *link, sd_netlink_message *m) {
                                 if (r < 0)
                                         return log_link_warning_errno(link, r, "Could not update DHCPv6 DUID: %m");
                         }
+
+                        if (link->radv) {
+                                r = sd_radv_set_mac(link->radv, &link->mac);
+                                if (r < 0)
+                                        return log_link_warning_errno(link, r, "Could not update MAC for Router Advertisement: %m");
+                        }
                 }
         }
 
@@ -3098,7 +3319,7 @@ int link_save(Link *link) {
         if (r < 0)
                 goto fail;
 
-        fchmod(fileno(f), 0644);
+        (void) fchmod(fileno(f), 0644);
 
         fprintf(f,
                 "# This is private data. Do not parse.\n"
@@ -3111,6 +3332,8 @@ int link_save(Link *link) {
                 sd_dhcp6_lease *dhcp6_lease = NULL;
                 const char *dhcp_domainname = NULL;
                 char **dhcp6_domains = NULL;
+                char **dhcp_domains = NULL;
+                unsigned j;
 
                 if (link->dhcp6_client) {
                         r = sd_dhcp6_client_get_lease(link->dhcp6_client, &dhcp6_lease);
@@ -3122,7 +3345,22 @@ int link_save(Link *link) {
 
                 fputs("DNS=", f);
                 space = false;
-                fputstrv(f, link->network->dns, NULL, &space);
+
+                for (j = 0; j < link->network->n_dns; j++) {
+                        _cleanup_free_ char *b = NULL;
+
+                        r = in_addr_to_string(link->network->dns[j].family,
+                                              &link->network->dns[j].address,  &b);
+                        if (r < 0) {
+                                log_debug_errno(r, "Failed to format address, ignoring: %m");
+                                continue;
+                        }
+
+                        if (space)
+                                fputc(' ', f);
+                        fputs(b, f);
+                        space = true;
+                }
 
                 if (link->network->dhcp_use_dns &&
                     link->dhcp_lease) {
@@ -3204,13 +3442,16 @@ int link_save(Link *link) {
                 fputc('\n', f);
 
                 if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO) {
-                        if (link->dhcp_lease)
+                        if (link->dhcp_lease) {
                                 (void) sd_dhcp_lease_get_domainname(link->dhcp_lease, &dhcp_domainname);
+                                (void) sd_dhcp_lease_get_search_domains(link->dhcp_lease, &dhcp_domains);
+                        }
                         if (dhcp6_lease)
                                 (void) sd_dhcp6_lease_get_domains(dhcp6_lease, &dhcp6_domains);
                 }
 
                 fputs("DOMAINS=", f);
+                space = false;
                 fputstrv(f, link->network->search_domains, NULL, &space);
 
                 if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES) {
@@ -3218,6 +3459,8 @@ int link_save(Link *link) {
 
                         if (dhcp_domainname)
                                 fputs_with_space(f, dhcp_domainname, NULL, &space);
+                        if (dhcp_domains)
+                                fputstrv(f, dhcp_domains, NULL, &space);
                         if (dhcp6_domains)
                                 fputstrv(f, dhcp6_domains, NULL, &space);
 
@@ -3228,13 +3471,16 @@ int link_save(Link *link) {
                 fputc('\n', f);
 
                 fputs("ROUTE_DOMAINS=", f);
-                fputstrv(f, link->network->route_domains, NULL, NULL);
+                space = false;
+                fputstrv(f, link->network->route_domains, NULL, &space);
 
                 if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_ROUTE) {
                         NDiscDNSSL *dd;
 
                         if (dhcp_domainname)
                                 fputs_with_space(f, dhcp_domainname, NULL, &space);
+                        if (dhcp_domains)
+                                fputstrv(f, dhcp_domains, NULL, &space);
                         if (dhcp6_domains)
                                 fputstrv(f, dhcp6_domains, NULL, &space);
 
index 2809b1f..6479f4a 100644 (file)
@@ -28,6 +28,7 @@
 #include "sd-ipv4ll.h"
 #include "sd-lldp.h"
 #include "sd-ndisc.h"
+#include "sd-radv.h"
 #include "sd-netlink.h"
 
 #include "list.h"
@@ -117,6 +118,8 @@ typedef struct Link {
         Set *ndisc_rdnss;
         Set *ndisc_dnssl;
 
+        sd_radv *radv;
+
         sd_dhcp6_client *dhcp6_client;
         bool rtnl_extended_attrs;
 
@@ -138,6 +141,9 @@ int link_get(Manager *m, int ifindex, Link **ret);
 int link_add(Manager *manager, sd_netlink_message *message, Link **ret);
 void link_drop(Link *link);
 
+int link_up(Link *link);
+int link_down(Link *link);
+
 int link_address_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
 int link_route_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
 
@@ -159,8 +165,6 @@ bool link_has_carrier(Link *link);
 int link_ipv6ll_gained(Link *link, const struct in6_addr *address);
 
 int link_set_mtu(Link *link, uint32_t mtu);
-int link_set_hostname(Link *link, const char *hostname);
-int link_set_timezone(Link *link, const char *timezone);
 
 int ipv4ll_configure(Link *link);
 int dhcp4_configure(Link *link);
@@ -186,8 +190,8 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_unref);
 
 #define log_link_full(link, level, error, ...)                          \
         ({                                                              \
-                Link *_l = (link);                                      \
-                _l ? log_object_internal(level, error, __FILE__, __LINE__, __func__, "INTERFACE=", _l->ifname, ##__VA_ARGS__) : \
+                const Link *_l = (link);                                \
+                _l ? log_object_internal(level, error, __FILE__, __LINE__, __func__, "INTERFACE=", _l->ifname, NULL, NULL, ##__VA_ARGS__) : \
                         log_internal(level, error, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
         })                                                              \
 
index 3aa7683..2de63ce 100644 (file)
@@ -26,7 +26,7 @@
 #include "fileio.h"
 #include "hostname-util.h"
 #include "networkd-lldp-tx.h"
-#include "networkd.h"
+#include "networkd-manager.h"
 #include "parse-util.h"
 #include "random-util.h"
 #include "socket-util.h"
index 0c429b9..cbb1b93 100644 (file)
@@ -19,7 +19,7 @@
 
 #include "alloc-util.h"
 #include "bus-util.h"
-#include "networkd.h"
+#include "networkd-manager.h"
 
 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_operational_state, link_operstate, LinkOperationalState);
 
index 9174dcc..5f10b4f 100644 (file)
@@ -33,7 +33,7 @@
 #include "libudev-private.h"
 #include "local-addresses.h"
 #include "netlink-util.h"
-#include "networkd.h"
+#include "networkd-manager.h"
 #include "ordered-set.h"
 #include "path-util.h"
 #include "set.h"
@@ -192,6 +192,18 @@ int manager_connect_bus(Manager *m) {
         if (r < 0)
                 return log_error_errno(r, "Failed to attach bus to event loop: %m");
 
+       /* Did we get a timezone or transient hostname from DHCP while D-Bus wasn't up yet? */
+        if (m->dynamic_hostname) {
+                r = manager_set_hostname(m, m->dynamic_hostname);
+                if (r < 0)
+                        return r;
+        }
+        if (m->dynamic_timezone) {
+                r = manager_set_timezone(m, m->dynamic_timezone);
+                if (r < 0)
+                        return r;
+        }
+
         return 0;
 }
 
@@ -774,11 +786,48 @@ static int manager_connect_rtnl(Manager *m) {
         return 0;
 }
 
-static int ordered_set_put_in_addr(OrderedSet *s, const struct in_addr *address) {
+static int ordered_set_put_in_addr_data(OrderedSet *s, const struct in_addr_data *address) {
+        char *p;
+        int r;
+
+        assert(s);
+        assert(address);
+
+        r = in_addr_to_string(address->family, &address->address, &p);
+        if (r < 0)
+                return r;
+
+        r = ordered_set_consume(s, p);
+        if (r == -EEXIST)
+                return 0;
+
+        return r;
+}
+
+static int ordered_set_put_in_addr_datav(OrderedSet *s, const struct in_addr_data *addresses, unsigned n) {
+        int r, c = 0;
+        unsigned i;
+
+        assert(s);
+        assert(addresses || n == 0);
+
+        for (i = 0; i < n; i++) {
+                r = ordered_set_put_in_addr_data(s, addresses+i);
+                if (r < 0)
+                        return r;
+
+                c += r;
+        }
+
+        return c;
+}
+
+static int ordered_set_put_in4_addr(OrderedSet *s, const struct in_addr *address) {
         char *p;
         int r;
 
         assert(s);
+        assert(address);
 
         r = in_addr_to_string(AF_INET, (const union in_addr_union*) address, &p);
         if (r < 0)
@@ -791,14 +840,15 @@ static int ordered_set_put_in_addr(OrderedSet *s, const struct in_addr *address)
         return r;
 }
 
-static int ordered_set_put_in_addrv(OrderedSet *s, const struct in_addr *addresses, int n) {
-        int r, i, c = 0;
+static int ordered_set_put_in4_addrv(OrderedSet *s, const struct in_addr *addresses, unsigned n) {
+        int r, c = 0;
+        unsigned i;
 
         assert(s);
-        assert(n <= 0 || addresses);
+        assert(n == 0 || addresses);
 
         for (i = 0; i < n; i++) {
-                r = ordered_set_put_in_addr(s, addresses+i);
+                r = ordered_set_put_in4_addr(s, addresses+i);
                 if (r < 0)
                         return r;
 
@@ -865,7 +915,7 @@ static int manager_save(Manager *m) {
                         continue;
 
                 /* First add the static configured entries */
-                r = ordered_set_put_strdupv(dns, link->network->dns);
+                r = ordered_set_put_in_addr_datav(dns, link->network->dns, link->network->n_dns);
                 if (r < 0)
                         return r;
 
@@ -890,7 +940,7 @@ static int manager_save(Manager *m) {
 
                         r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
                         if (r > 0) {
-                                r = ordered_set_put_in_addrv(dns, addresses, r);
+                                r = ordered_set_put_in4_addrv(dns, addresses, r);
                                 if (r < 0)
                                         return r;
                         } else if (r < 0 && r != -ENODATA)
@@ -902,7 +952,7 @@ static int manager_save(Manager *m) {
 
                         r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
                         if (r > 0) {
-                                r = ordered_set_put_in_addrv(ntp, addresses, r);
+                                r = ordered_set_put_in4_addrv(ntp, addresses, r);
                                 if (r < 0)
                                         return r;
                         } else if (r < 0 && r != -ENODATA)
@@ -911,15 +961,20 @@ static int manager_save(Manager *m) {
 
                 if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO) {
                         const char *domainname;
+                        char **domains = NULL;
 
+                        OrderedSet *target_domains = (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES) ? search_domains : route_domains;
                         r = sd_dhcp_lease_get_domainname(link->dhcp_lease, &domainname);
                         if (r >= 0) {
+                                r = ordered_set_put_strdup(target_domains, domainname);
+                                if (r < 0)
+                                        return r;
+                        } else if (r != -ENODATA)
+                                return r;
 
-                                if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES)
-                                        r = ordered_set_put_strdup(search_domains, domainname);
-                                else
-                                        r = ordered_set_put_strdup(route_domains, domainname);
-
+                        r = sd_dhcp_lease_get_search_domains(link->dhcp_lease, &domains);
+                        if (r >= 0) {
+                                r = ordered_set_put_strdupv(target_domains, domains);
                                 if (r < 0)
                                         return r;
                         } else if (r != -ENODATA)
@@ -934,7 +989,7 @@ static int manager_save(Manager *m) {
         if (r < 0)
                 return r;
 
-        fchmod(fileno(f), 0644);
+        (void) fchmod(fileno(f), 0644);
 
         fprintf(f,
                 "# This is private data. Do not parse.\n"
@@ -992,7 +1047,7 @@ static int manager_dirty_handler(sd_event_source *s, void *userdata) {
         return 1;
 }
 
-int manager_new(Manager **ret) {
+int manager_new(Manager **ret, sd_event *event) {
         _cleanup_manager_free_ Manager *m = NULL;
         int r;
 
@@ -1004,14 +1059,7 @@ int manager_new(Manager **ret) {
         if (!m->state_file)
                 return -ENOMEM;
 
-        r = sd_event_default(&m->event);
-        if (r < 0)
-                return r;
-
-        sd_event_set_watchdog(m->event, true);
-
-        sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
-        sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
+        m->event = sd_event_ref(event);
 
         r = sd_event_add_post(m->event, NULL, manager_dirty_handler, m);
         if (r < 0)
@@ -1081,36 +1129,13 @@ void manager_free(Manager *m) {
         sd_bus_slot_unref(m->prepare_for_sleep_slot);
         sd_event_source_unref(m->bus_retry_event_source);
 
-        free(m);
-}
-
-static bool manager_check_idle(void *userdata) {
-        Manager *m = userdata;
-        Link *link;
-        Iterator i;
+        free(m->dynamic_timezone);
+        free(m->dynamic_hostname);
 
-        assert(m);
-
-        /* Check whether we are idle now. The only case when we decide to be idle is when there's only a loopback
-         * device around, for which we have no configuration, and which already left the PENDING state. In all other
-         * cases we are not idle. */
-
-        HASHMAP_FOREACH(link, m->links, i) {
-                /* We are not woken on udev activity, so let's just wait for the pending udev event */
-                if (link->state == LINK_STATE_PENDING)
-                        return false;
-
-                if ((link->flags & IFF_LOOPBACK) == 0)
-                        return false;
-
-                if (link->network)
-                        return false;
-        }
-
-        return true;
+        free(m);
 }
 
-int manager_run(Manager *m) {
+int manager_start(Manager *m) {
         Link *link;
         Iterator i;
 
@@ -1124,18 +1149,7 @@ int manager_run(Manager *m) {
         HASHMAP_FOREACH(link, m->links, i)
                 link_save(link);
 
-        if (m->bus)
-                return bus_event_loop_with_idle(
-                                m->event,
-                                m->bus,
-                                "org.freedesktop.network1",
-                                DEFAULT_EXIT_USEC,
-                                manager_check_idle,
-                                m);
-        else
-                /* failed to connect to the bus, so we lose exit-on-idle logic,
-                   this should not happen except if dbus is not around at all */
-                return sd_event_loop(m->event);
+        return 0;
 }
 
 int manager_load_config(Manager *m) {
@@ -1327,3 +1341,96 @@ void manager_dirty(Manager *manager) {
         /* the serialized state in /run is no longer up-to-date */
         manager->dirty = true;
 }
+
+static int set_hostname_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
+        Manager *manager = userdata;
+        const sd_bus_error *e;
+
+        assert(m);
+        assert(manager);
+
+        e = sd_bus_message_get_error(m);
+        if (e)
+                log_warning_errno(sd_bus_error_get_errno(e), "Could not set hostname: %s", e->message);
+
+        return 1;
+}
+
+int manager_set_hostname(Manager *m, const char *hostname) {
+        int r;
+
+        log_debug("Setting transient hostname: '%s'", strna(hostname));
+        if (free_and_strdup(&m->dynamic_hostname, hostname) < 0)
+                return log_oom();
+
+        if (!m->bus) {
+                /* TODO: replace by assert when we can rely on kdbus */
+                log_info("Not connected to system bus, ignoring transient hostname.");
+                return 0;
+        }
+
+        r = sd_bus_call_method_async(
+                        m->bus,
+                        NULL,
+                        "org.freedesktop.hostname1",
+                        "/org/freedesktop/hostname1",
+                        "org.freedesktop.hostname1",
+                        "SetHostname",
+                        set_hostname_handler,
+                        m,
+                        "sb",
+                        hostname,
+                        false);
+
+        if (r < 0)
+                return log_error_errno(r, "Could not set transient hostname: %m");
+
+        return 0;
+}
+
+static int set_timezone_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
+        Manager *manager = userdata;
+        const sd_bus_error *e;
+
+        assert(m);
+        assert(manager);
+
+        e = sd_bus_message_get_error(m);
+        if (e)
+                log_warning_errno(sd_bus_error_get_errno(e), "Could not set timezone: %s", e->message);
+
+        return 1;
+}
+
+int manager_set_timezone(Manager *m, const char *tz) {
+        int r;
+
+        assert(m);
+        assert(tz);
+
+        log_debug("Setting system timezone: '%s'", tz);
+        if (free_and_strdup(&m->dynamic_timezone, tz) < 0)
+                return log_oom();
+
+        if (!m->bus) {
+                log_info("Not connected to system bus, ignoring timezone.");
+                return 0;
+        }
+
+        r = sd_bus_call_method_async(
+                        m->bus,
+                        NULL,
+                        "org.freedesktop.timedate1",
+                        "/org/freedesktop/timedate1",
+                        "org.freedesktop.timedate1",
+                        "SetTimezone",
+                        set_timezone_handler,
+                        m,
+                        "sb",
+                        tz,
+                        false);
+        if (r < 0)
+                return log_error_errno(r, "Could not set timezone: %m");
+
+        return 0;
+}
similarity index 85%
rename from src/network/networkd.h
rename to src/network/networkd-manager.h
index c4bd712..e2447c2 100644 (file)
 
 #include "networkd-address-pool.h"
 #include "networkd-link.h"
-#include "networkd-netdev-bond.h"
-#include "networkd-netdev-bridge.h"
-#include "networkd-netdev-dummy.h"
-#include "networkd-netdev-ipvlan.h"
-#include "networkd-netdev-macvlan.h"
-#include "networkd-netdev-tunnel.h"
-#include "networkd-netdev-tuntap.h"
-#include "networkd-netdev-veth.h"
-#include "networkd-netdev-vlan.h"
-#include "networkd-netdev-vrf.h"
-#include "networkd-netdev-vxlan.h"
 #include "networkd-network.h"
-#include "networkd-util.h"
 
 extern const char* const network_dirs[];
 
@@ -75,6 +63,8 @@ struct Manager {
         usec_t network_dirs_ts_usec;
 
         DUID duid;
+        char* dynamic_hostname;
+        char* dynamic_timezone;
 };
 
 static inline const DUID* link_duid(const Link *link) {
@@ -86,11 +76,11 @@ static inline const DUID* link_duid(const Link *link) {
 
 extern const sd_bus_vtable manager_vtable[];
 
-int manager_new(Manager **ret);
+int manager_new(Manager **ret, sd_event *event);
 void manager_free(Manager *m);
 
 int manager_connect_bus(Manager *m);
-int manager_run(Manager *m);
+int manager_start(Manager *m);
 
 int manager_load_config(Manager *m);
 bool manager_should_reload(Manager *m);
@@ -109,5 +99,8 @@ int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, uni
 
 Link* manager_find_uplink(Manager *m, Link *exclude);
 
+int manager_set_hostname(Manager *m, const char *hostname);
+int manager_set_timezone(Manager *m, const char *timezone);
+
 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
 #define _cleanup_manager_free_ _cleanup_(manager_freep)
index d9c18b3..d52b511 100644 (file)
 ***/
 
 #include <netinet/icmp6.h>
+#include <arpa/inet.h>
 
 #include "sd-ndisc.h"
 
-#include "networkd.h"
 #include "networkd-ndisc.h"
+#include "networkd-route.h"
 
 #define NDISC_DNSSL_MAX 64U
 #define NDISC_RDNSS_MAX 64U
+#define NDISC_PREFIX_LFT_MIN 7200U
 
 static int ndisc_netlink_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) {
         _cleanup_link_unref_ Link *link = userdata;
@@ -55,8 +57,11 @@ static void ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
         struct in6_addr gateway;
         uint16_t lifetime;
         unsigned preference;
+        uint32_t mtu;
         usec_t time_now;
         int r;
+        Address *address;
+        Iterator i;
 
         assert(link);
         assert(rt);
@@ -75,6 +80,32 @@ static void ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
                 return;
         }
 
+        SET_FOREACH(address, link->addresses, i) {
+                if (!memcmp(&gateway, &address->in_addr.in6,
+                            sizeof(address->in_addr.in6))) {
+                        char buffer[INET6_ADDRSTRLEN];
+
+                        log_link_debug(link, "No NDisc route added, gateway %s matches local address",
+                                       inet_ntop(AF_INET6,
+                                                 &address->in_addr.in6,
+                                                 buffer, sizeof(buffer)));
+                        return;
+                }
+        }
+
+        SET_FOREACH(address, link->addresses_foreign, i) {
+                if (!memcmp(&gateway, &address->in_addr.in6,
+                            sizeof(address->in_addr.in6))) {
+                        char buffer[INET6_ADDRSTRLEN];
+
+                        log_link_debug(link, "No NDisc route added, gateway %s matches local address",
+                                       inet_ntop(AF_INET6,
+                                                 &address->in_addr.in6,
+                                                 buffer, sizeof(buffer)));
+                        return;
+                }
+        }
+
         r = sd_ndisc_router_get_preference(rt, &preference);
         if (r < 0) {
                 log_link_warning_errno(link, r, "Failed to get default router preference from RA: %m");
@@ -87,6 +118,14 @@ static void ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
                 return;
         }
 
+        r = sd_ndisc_router_get_mtu(rt, &mtu);
+        if (r == -ENODATA)
+                mtu = 0;
+        else if (r < 0) {
+                log_link_warning_errno(link, r, "Failed to get default router MTU from RA: %m");
+                return;
+        }
+
         r = route_new(&route);
         if (r < 0) {
                 log_link_error_errno(link, r, "Could not allocate route: %m");
@@ -94,11 +133,13 @@ static void ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
         }
 
         route->family = AF_INET6;
-        route->table = RT_TABLE_MAIN;
+        route->table = link->network->ipv6_accept_ra_route_table;
+        route->priority = link->network->dhcp_route_metric;
         route->protocol = RTPROT_RA;
         route->pref = preference;
         route->gw.in6 = gateway;
         route->lifetime = time_now + lifetime * USEC_PER_SEC;
+        route->mtu = mtu;
 
         r = route_configure(route, link, ndisc_netlink_handler);
         if (r < 0) {
@@ -112,13 +153,21 @@ static void ndisc_router_process_default(Link *link, sd_ndisc_router *rt) {
 
 static void ndisc_router_process_autonomous_prefix(Link *link, sd_ndisc_router *rt) {
         _cleanup_address_free_ Address *address = NULL;
-        uint32_t lifetime_valid, lifetime_preferred;
+        Address *existing_address;
+        uint32_t lifetime_valid, lifetime_preferred, lifetime_remaining;
+        usec_t time_now;
         unsigned prefixlen;
         int r;
 
         assert(link);
         assert(rt);
 
+        r = sd_ndisc_router_get_timestamp(rt, clock_boottime_or_monotonic(), &time_now);
+        if (r < 0) {
+                log_link_warning_errno(link, r, "Failed to get RA timestamp: %m");
+                return;
+        }
+
         r = sd_ndisc_router_prefix_get_prefixlen(rt, &prefixlen);
         if (r < 0) {
                 log_link_error_errno(link, r, "Failed to get prefix length: %m");
@@ -167,7 +216,24 @@ static void ndisc_router_process_autonomous_prefix(Link *link, sd_ndisc_router *
         address->prefixlen = prefixlen;
         address->flags = IFA_F_NOPREFIXROUTE|IFA_F_MANAGETEMPADDR;
         address->cinfo.ifa_prefered = lifetime_preferred;
-        address->cinfo.ifa_valid = lifetime_valid;
+
+        /* see RFC4862 section 5.5.3.e */
+        r = address_get(link, address->family, &address->in_addr, address->prefixlen, &existing_address);
+        if (r > 0) {
+                lifetime_remaining = existing_address->cinfo.tstamp / 100 + existing_address->cinfo.ifa_valid - time_now / USEC_PER_SEC;
+                if (lifetime_valid > NDISC_PREFIX_LFT_MIN || lifetime_valid > lifetime_remaining)
+                        address->cinfo.ifa_valid = lifetime_valid;
+                else if (lifetime_remaining <= NDISC_PREFIX_LFT_MIN)
+                        address->cinfo.ifa_valid = lifetime_remaining;
+                else
+                        address->cinfo.ifa_valid = NDISC_PREFIX_LFT_MIN;
+        } else if (lifetime_valid > 0)
+                address->cinfo.ifa_valid = lifetime_valid;
+        else
+                return; /* see RFC4862 section 5.5.3.d */
+
+        if (address->cinfo.ifa_valid == 0)
+                return;
 
         r = address_configure(address, link, ndisc_netlink_handler, true);
         if (r < 0) {
@@ -214,7 +280,8 @@ static void ndisc_router_process_onlink_prefix(Link *link, sd_ndisc_router *rt)
         }
 
         route->family = AF_INET6;
-        route->table = RT_TABLE_MAIN;
+        route->table = link->network->ipv6_accept_ra_route_table;
+        route->priority = link->network->dhcp_route_metric;
         route->protocol = RTPROT_RA;
         route->flags = RTM_F_PREFIX;
         route->dst_prefixlen = prefixlen;
@@ -285,7 +352,7 @@ static void ndisc_router_process_route(Link *link, sd_ndisc_router *rt) {
         }
 
         route->family = AF_INET6;
-        route->table = RT_TABLE_MAIN;
+        route->table = link->network->ipv6_accept_ra_route_table;
         route->protocol = RTPROT_RA;
         route->pref = preference;
         route->gw.in6 = gateway;
@@ -546,11 +613,13 @@ static void ndisc_router_process_options(Link *link, sd_ndisc_router *rt) {
                         break;
 
                 case SD_NDISC_OPTION_RDNSS:
-                        ndisc_router_process_rdnss(link, rt);
+                        if (link->network->ipv6_accept_ra_use_dns)
+                                ndisc_router_process_rdnss(link, rt);
                         break;
 
                 case SD_NDISC_OPTION_DNSSL:
-                        ndisc_router_process_dnssl(link, rt);
+                        if (link->network->ipv6_accept_ra_use_dns)
+                                ndisc_router_process_dnssl(link, rt);
                         break;
                 }
 
@@ -652,13 +721,22 @@ void ndisc_vacuum(Link *link) {
 
         SET_FOREACH(r, link->ndisc_rdnss, i)
                 if (r->valid_until < time_now) {
-                        (void) set_remove(link->ndisc_rdnss, r);
+                        free(set_remove(link->ndisc_rdnss, r));
                         link_dirty(link);
                 }
 
         SET_FOREACH(d, link->ndisc_dnssl, i)
                 if (d->valid_until < time_now) {
-                        (void) set_remove(link->ndisc_dnssl, d);
+                        free(set_remove(link->ndisc_dnssl, d));
                         link_dirty(link);
                 }
 }
+
+void ndisc_flush(Link *link) {
+        assert(link);
+
+        /* Removes all RDNSS and DNSSL entries, without exception */
+
+        link->ndisc_rdnss = set_free_free(link->ndisc_rdnss);
+        link->ndisc_dnssl = set_free_free(link->ndisc_dnssl);
+}
index 2002f55..1271261 100644 (file)
@@ -37,3 +37,4 @@ static inline char* NDISC_DNSSL_DOMAIN(const NDiscDNSSL *n) {
 
 int ndisc_configure(Link *link);
 void ndisc_vacuum(Link *link);
+void ndisc_flush(Link *link);
diff --git a/src/network/networkd-netdev-gperf.gperf b/src/network/networkd-netdev-gperf.gperf
deleted file mode 100644 (file)
index 9d69f61..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-%{
-#include <stddef.h>
-#include "conf-parser.h"
-#include "network-internal.h"
-#include "networkd-netdev-bond.h"
-#include "networkd-netdev-bridge.h"
-#include "networkd-netdev-ipvlan.h"
-#include "networkd-netdev-macvlan.h"
-#include "networkd-netdev-tunnel.h"
-#include "networkd-netdev-tuntap.h"
-#include "networkd-netdev-veth.h"
-#include "networkd-netdev-vlan.h"
-#include "networkd-netdev-vxlan.h"
-#include "networkd-netdev-vrf.h"
-#include "networkd-netdev.h"
-#include "vlan-util.h"
-%}
-struct ConfigPerfItem;
-%null_strings
-%language=ANSI-C
-%define slot-name section_and_lvalue
-%define hash-function-name network_netdev_gperf_hash
-%define lookup-function-name network_netdev_gperf_lookup
-%readonly-tables
-%omit-struct-type
-%struct-type
-%includes
-%%
-Match.Host,                  config_parse_net_condition,         CONDITION_HOST,                offsetof(NetDev, match_host)
-Match.Virtualization,        config_parse_net_condition,         CONDITION_VIRTUALIZATION,      offsetof(NetDev, match_virt)
-Match.KernelCommandLine,     config_parse_net_condition,         CONDITION_KERNEL_COMMAND_LINE, offsetof(NetDev, match_kernel)
-Match.Architecture,          config_parse_net_condition,         CONDITION_ARCHITECTURE,        offsetof(NetDev, match_arch)
-NetDev.Description,          config_parse_string,                0,                             offsetof(NetDev, description)
-NetDev.Name,                 config_parse_ifname,                0,                             offsetof(NetDev, ifname)
-NetDev.Kind,                 config_parse_netdev_kind,           0,                             offsetof(NetDev, kind)
-NetDev.MTUBytes,             config_parse_iec_size,              0,                             offsetof(NetDev, mtu)
-NetDev.MACAddress,           config_parse_hwaddr,                0,                             offsetof(NetDev, mac)
-VLAN.Id,                     config_parse_vlanid,                0,                             offsetof(VLan, id)
-MACVLAN.Mode,                config_parse_macvlan_mode,          0,                             offsetof(MacVlan, mode)
-MACVTAP.Mode,                config_parse_macvlan_mode,          0,                             offsetof(MacVlan, mode)
-IPVLAN.Mode,                 config_parse_ipvlan_mode,           0,                             offsetof(IPVlan, mode)
-Tunnel.Local,                config_parse_tunnel_address,        0,                             offsetof(Tunnel, local)
-Tunnel.Remote,               config_parse_tunnel_address,        0,                             offsetof(Tunnel, remote)
-Tunnel.TOS,                  config_parse_unsigned,              0,                             offsetof(Tunnel, tos)
-Tunnel.TTL,                  config_parse_unsigned,              0,                             offsetof(Tunnel, ttl)
-Tunnel.Key,                  config_parse_tunnel_key,            0,                             offsetof(Tunnel, key)
-Tunnel.InputKey,             config_parse_tunnel_key,            0,                             offsetof(Tunnel, ikey)
-Tunnel.OutputKey,            config_parse_tunnel_key,            0,                             offsetof(Tunnel, okey)
-Tunnel.DiscoverPathMTU,      config_parse_bool,                  0,                             offsetof(Tunnel, pmtudisc)
-Tunnel.Mode,                 config_parse_ip6tnl_mode,           0,                             offsetof(Tunnel, ip6tnl_mode)
-Tunnel.IPv6FlowLabel,        config_parse_ipv6_flowlabel,        0,                             offsetof(Tunnel, ipv6_flowlabel)
-Tunnel.CopyDSCP,             config_parse_bool,                  0,                             offsetof(Tunnel, copy_dscp)
-Tunnel.EncapsulationLimit,   config_parse_encap_limit,           0,                             offsetof(Tunnel, encap_limit)
-Peer.Name,                   config_parse_ifname,                0,                             offsetof(Veth, ifname_peer)
-Peer.MACAddress,             config_parse_hwaddr,                0,                             offsetof(Veth, mac_peer)
-VXLAN.Id,                    config_parse_uint64,                0,                             offsetof(VxLan, id)
-VXLAN.Group,                 config_parse_vxlan_group_address,   0,                             offsetof(VxLan, group)
-VXLAN.TOS,                   config_parse_unsigned,              0,                             offsetof(VxLan, tos)
-VXLAN.TTL,                   config_parse_unsigned,              0,                             offsetof(VxLan, ttl)
-VXLAN.MacLearning,           config_parse_bool,                  0,                             offsetof(VxLan, learning)
-VXLAN.ARPProxy,              config_parse_bool,                  0,                             offsetof(VxLan, arp_proxy)
-VXLAN.L2MissNotification,    config_parse_bool,                  0,                             offsetof(VxLan, l2miss)
-VXLAN.L3MissNotification,    config_parse_bool,                  0,                             offsetof(VxLan, l3miss)
-VXLAN.RouteShortCircuit,     config_parse_bool,                  0,                             offsetof(VxLan, route_short_circuit)
-VXLAN.UDPCheckSum,           config_parse_bool,                  0,                             offsetof(VxLan, udpcsum)
-VXLAN.UDP6ZeroCheckSumRx,    config_parse_bool,                  0,                             offsetof(VxLan, udp6zerocsumrx)
-VXLAN.UDP6ZeroCheckSumTx,    config_parse_bool,                  0,                             offsetof(VxLan, udp6zerocsumtx)
-VXLAN.FDBAgeingSec,          config_parse_sec,                   0,                             offsetof(VxLan, fdb_ageing)
-VXLAN.GroupPolicyExtension,  config_parse_bool,                  0,                             offsetof(VxLan, group_policy)
-VXLAN.MaximumFDBEntries,     config_parse_unsigned,              0,                             offsetof(VxLan, max_fdb)
-VXLAN.PortRange,             config_parse_port_range,            0,                             0
-VXLAN.DestinationPort,       config_parse_destination_port,      0,                             offsetof(VxLan, dest_port)
-Tun.OneQueue,                config_parse_bool,                  0,                             offsetof(TunTap, one_queue)
-Tun.MultiQueue,              config_parse_bool,                  0,                             offsetof(TunTap, multi_queue)
-Tun.PacketInfo,              config_parse_bool,                  0,                             offsetof(TunTap, packet_info)
-Tun.User,                    config_parse_string,                0,                             offsetof(TunTap, user_name)
-Tun.Group,                   config_parse_string,                0,                             offsetof(TunTap, group_name)
-Tap.OneQueue,                config_parse_bool,                  0,                             offsetof(TunTap, one_queue)
-Tap.MultiQueue,              config_parse_bool,                  0,                             offsetof(TunTap, multi_queue)
-Tap.PacketInfo,              config_parse_bool,                  0,                             offsetof(TunTap, packet_info)
-Tap.VNetHeader,              config_parse_bool,                  0,                             offsetof(TunTap, vnet_hdr)
-Tap.User,                    config_parse_string,                0,                             offsetof(TunTap, user_name)
-Tap.Group,                   config_parse_string,                0,                             offsetof(TunTap, group_name)
-Bond.Mode,                   config_parse_bond_mode,             0,                             offsetof(Bond, mode)
-Bond.TransmitHashPolicy,     config_parse_bond_xmit_hash_policy, 0,                             offsetof(Bond, xmit_hash_policy)
-Bond.LACPTransmitRate,       config_parse_bond_lacp_rate,        0,                             offsetof(Bond, lacp_rate)
-Bond.AdSelect,               config_parse_bond_ad_select,        0,                             offsetof(Bond, ad_select)
-Bond.FailOverMACPolicy,      config_parse_bond_fail_over_mac,    0,                             offsetof(Bond, fail_over_mac)
-Bond.ARPIPTargets,           config_parse_arp_ip_target_address, 0,                             0
-Bond.ARPValidate,            config_parse_bond_arp_validate,     0,                             offsetof(Bond, arp_validate)
-Bond.ARPAllTargets,          config_parse_bond_arp_all_targets,  0,                             offsetof(Bond, arp_all_targets)
-Bond.PrimaryReselectPolicy,  config_parse_bond_primary_reselect, 0,                             offsetof(Bond, primary_reselect)
-Bond.ResendIGMP,             config_parse_unsigned,              0,                             offsetof(Bond, resend_igmp)
-Bond.PacketsPerSlave,        config_parse_unsigned,              0,                             offsetof(Bond, packets_per_slave)
-Bond.GratuitousARP,          config_parse_unsigned,              0,                             offsetof(Bond, num_grat_arp)
-Bond.AllSlavesActive,        config_parse_unsigned,              0,                             offsetof(Bond, all_slaves_active)
-Bond.MinLinks,               config_parse_unsigned,              0,                             offsetof(Bond, min_links)
-Bond.MIIMonitorSec,          config_parse_sec,                   0,                             offsetof(Bond, miimon)
-Bond.UpDelaySec,             config_parse_sec,                   0,                             offsetof(Bond, updelay)
-Bond.DownDelaySec,           config_parse_sec,                   0,                             offsetof(Bond, downdelay)
-Bond.ARPIntervalSec,         config_parse_sec,                   0,                             offsetof(Bond, arp_interval)
-Bond.LearnPacketIntervalSec, config_parse_sec,                   0,                             offsetof(Bond, lp_interval)
-Bridge.HelloTimeSec,         config_parse_sec,                   0,                             offsetof(Bridge, hello_time)
-Bridge.MaxAgeSec,            config_parse_sec,                   0,                             offsetof(Bridge, max_age)
-Bridge.ForwardDelaySec,      config_parse_sec,                   0,                             offsetof(Bridge, forward_delay)
-Bridge.MulticastQuerier,     config_parse_tristate,              0,                             offsetof(Bridge, mcast_querier)
-Bridge.MulticastSnooping,    config_parse_tristate,              0,                             offsetof(Bridge, mcast_snooping)
-Bridge.VLANFiltering,        config_parse_tristate,              0,                             offsetof(Bridge, vlan_filtering)
-VRF.TableId,                 config_parse_uint32,                0,                             offsetof(Vrf, table_id)
index 6e21676..3b835b5 100644 (file)
@@ -18,7 +18,7 @@
 ***/
 
 #include "alloc-util.h"
-#include "networkd.h"
+#include "networkd-manager.h"
 #include "string-util.h"
 #include "strv.h"
 
index 5172a7b..a2d3850 100644 (file)
@@ -1,8 +1,8 @@
 %{
 #include <stddef.h>
 #include "conf-parser.h"
-#include "networkd.h"
 #include "networkd-conf.h"
+#include "networkd-network.h"
 #include "network-internal.h"
 #include "vlan-util.h"
 %}
@@ -28,6 +28,8 @@ Match.KernelCommandLine,                config_parse_net_condition,
 Match.Architecture,                     config_parse_net_condition,                     CONDITION_ARCHITECTURE,        offsetof(Network, match_arch)
 Link.MACAddress,                        config_parse_hwaddr,                            0,                             offsetof(Network, mac)
 Link.MTUBytes,                          config_parse_iec_size,                          0,                             offsetof(Network, mtu)
+Link.ARP,                               config_parse_tristate,                          0,                             offsetof(Network, arp)
+Link.Unmanaged,                         config_parse_bool,                              0,                             offsetof(Network, unmanaged)
 Network.Description,                    config_parse_string,                            0,                             offsetof(Network, description)
 Network.Bridge,                         config_parse_netdev,                            0,                             offsetof(Network, bridge)
 Network.Bond,                           config_parse_netdev,                            0,                             offsetof(Network, bond)
@@ -48,27 +50,38 @@ Network.EmitLLDP,                       config_parse_lldp_emit,
 Network.Address,                        config_parse_address,                           0,                             0
 Network.Gateway,                        config_parse_gateway,                           0,                             0
 Network.Domains,                        config_parse_domains,                           0,                             0
-Network.DNS,                            config_parse_strv,                              0,                             offsetof(Network, dns)
+Network.DNS,                            config_parse_dns,                               0,                             0
 Network.LLMNR,                          config_parse_resolve_support,                   0,                             offsetof(Network, llmnr)
 Network.MulticastDNS,                   config_parse_resolve_support,                   0,                             offsetof(Network, mdns)
 Network.DNSSEC,                         config_parse_dnssec_mode,                       0,                             offsetof(Network, dnssec_mode)
 Network.DNSSECNegativeTrustAnchors,     config_parse_dnssec_negative_trust_anchors,     0,                             0
-Network.NTP,                            config_parse_strv,                              0,                             offsetof(Network, ntp)
+Network.NTP,                            config_parse_ntp,                               0,                             offsetof(Network, ntp)
 Network.IPForward,                      config_parse_address_family_boolean_with_kernel,0,                             offsetof(Network, ip_forward)
 Network.IPMasquerade,                   config_parse_bool,                              0,                             offsetof(Network, ip_masquerade)
 Network.IPv6PrivacyExtensions,          config_parse_ipv6_privacy_extensions,           0,                             offsetof(Network, ipv6_privacy_extensions)
 Network.IPv6AcceptRA,                   config_parse_tristate,                          0,                             offsetof(Network, ipv6_accept_ra)
-/* legacy alias for the above */
 Network.IPv6AcceptRouterAdvertisements, config_parse_tristate,                          0,                             offsetof(Network, ipv6_accept_ra)
 Network.IPv6DuplicateAddressDetection,  config_parse_int,                               0,                             offsetof(Network, ipv6_dad_transmits)
 Network.IPv6HopLimit,                   config_parse_int,                               0,                             offsetof(Network, ipv6_hop_limit)
+Network.IPv6ProxyNDP,                   config_parse_tristate,                          0,                             offsetof(Network, ipv6_proxy_ndp)
+Network.ActiveSlave,                    config_parse_bool,                              0,                             offsetof(Network, active_slave)
+Network.PrimarySlave,                   config_parse_bool,                              0,                             offsetof(Network, primary_slave)
+Network.IPv4ProxyARP,                   config_parse_tristate,                          0,                             offsetof(Network, proxy_arp)
 Network.ProxyARP,                       config_parse_tristate,                          0,                             offsetof(Network, proxy_arp)
+Network.IPv6ProxyNDPAddress,            config_parse_ipv6_proxy_ndp_address,            0,                             0
 Network.BindCarrier,                    config_parse_strv,                              0,                             offsetof(Network, bind_carrier)
 Address.Address,                        config_parse_address,                           0,                             0
 Address.Peer,                           config_parse_address,                           0,                             0
 Address.Broadcast,                      config_parse_broadcast,                         0,                             0
 Address.Label,                          config_parse_label,                             0,                             0
 Address.PreferredLifetime,              config_parse_lifetime,                          0,                             0
+Address.HomeAddress,                    config_parse_address_flags,                     0,                             0
+Address.DuplicateAddressDetection,      config_parse_address_flags,                     0,                             0
+Address.ManageTemporaryAddress,         config_parse_address_flags,                     0,                             0
+Address.PrefixRoute,                    config_parse_address_flags,                     0,                             0
+Address.AutoJoin,                       config_parse_address_flags,                     0,                             0
+IPv6AddressLabel.Prefix,                config_parse_address_label_prefix,              0,                             0
+IPv6AddressLabel.Label,                 config_parse_address_label,                     0,                             0
 Route.Gateway,                          config_parse_gateway,                           0,                             0
 Route.Destination,                      config_parse_destination,                       0,                             0
 Route.Source,                           config_parse_destination,                       0,                             0
@@ -76,6 +89,9 @@ Route.Metric,                           config_parse_route_priority,
 Route.Scope,                            config_parse_route_scope,                       0,                             0
 Route.PreferredSource,                  config_parse_preferred_src,                     0,                             0
 Route.Table,                            config_parse_route_table,                       0,                             0
+Route.GatewayOnlink,                    config_parse_gateway_onlink,                    0,                             0
+Route.IPv6Preference,                   config_parse_ipv6_route_preference,             0,                             0
+Route.Protocol,                         config_parse_route_protocol,                    0,                             0
 DHCP.ClientIdentifier,                  config_parse_dhcp_client_identifier,            0,                             offsetof(Network, dhcp_client_identifier)
 DHCP.UseDNS,                            config_parse_bool,                              0,                             offsetof(Network, dhcp_use_dns)
 DHCP.UseNTP,                            config_parse_bool,                              0,                             offsetof(Network, dhcp_use_ntp)
@@ -91,10 +107,13 @@ DHCP.VendorClassIdentifier,             config_parse_string,
 DHCP.DUIDType,                          config_parse_duid_type,                         0,                             offsetof(Network, duid.type)
 DHCP.DUIDRawData,                       config_parse_duid_rawdata,                      0,                             offsetof(Network, duid)
 DHCP.RouteMetric,                       config_parse_unsigned,                          0,                             offsetof(Network, dhcp_route_metric)
+DHCP.RouteTable,                        config_parse_dhcp_route_table,                  0,                             offsetof(Network, dhcp_route_table)
 DHCP.UseTimezone,                       config_parse_bool,                              0,                             offsetof(Network, dhcp_use_timezone)
 DHCP.IAID,                              config_parse_iaid,                              0,                             offsetof(Network, iaid)
+DHCP.ListenPort,                        config_parse_uint16,                            0,                             offsetof(Network, dhcp_client_port)
 IPv6AcceptRA.UseDNS,                    config_parse_bool,                              0,                             offsetof(Network, ipv6_accept_ra_use_dns)
 IPv6AcceptRA.UseDomains,                config_parse_dhcp_use_domains,                  0,                             offsetof(Network, ipv6_accept_ra_use_domains)
+IPv6AcceptRA.RouteTable,                config_parse_dhcp_route_table,                  0,                             offsetof(Network, ipv6_accept_ra_route_table)
 DHCPServer.MaxLeaseTimeSec,             config_parse_sec,                               0,                             offsetof(Network, dhcp_server_max_lease_time_usec)
 DHCPServer.DefaultLeaseTimeSec,         config_parse_sec,                               0,                             offsetof(Network, dhcp_server_default_lease_time_usec)
 DHCPServer.EmitDNS,                     config_parse_bool,                              0,                             offsetof(Network, dhcp_server_emit_dns)
@@ -106,17 +125,28 @@ DHCPServer.EmitTimezone,                config_parse_bool,
 DHCPServer.Timezone,                    config_parse_timezone,                          0,                             offsetof(Network, dhcp_server_timezone)
 DHCPServer.PoolOffset,                  config_parse_uint32,                            0,                             offsetof(Network, dhcp_server_pool_offset)
 DHCPServer.PoolSize,                    config_parse_uint32,                            0,                             offsetof(Network, dhcp_server_pool_size)
-Bridge.Cost,                            config_parse_unsigned,                          0,                             offsetof(Network, cost)
+Bridge.Cost,                            config_parse_uint32,                            0,                             offsetof(Network, cost)
 Bridge.UseBPDU,                         config_parse_bool,                              0,                             offsetof(Network, use_bpdu)
 Bridge.HairPin,                         config_parse_bool,                              0,                             offsetof(Network, hairpin)
 Bridge.FastLeave,                       config_parse_bool,                              0,                             offsetof(Network, fast_leave)
 Bridge.AllowPortToBeRoot,               config_parse_bool,                              0,                             offsetof(Network, allow_port_to_be_root)
 Bridge.UnicastFlood,                    config_parse_bool,                              0,                             offsetof(Network, unicast_flood)
+Bridge.Priority,                        config_parse_bridge_port_priority,              0,                             offsetof(Network, priority)
 BridgeFDB.MACAddress,                   config_parse_fdb_hwaddr,                        0,                             0
 BridgeFDB.VLANId,                       config_parse_fdb_vlan_id,                       0,                             0
-BridgeVLAN.PVID,                        config_parse_vlanid,                            0,                             offsetof(Network, pvid)
+BridgeVLAN.PVID,                        config_parse_brvlan_pvid,                       0,                             0
 BridgeVLAN.VLAN,                        config_parse_brvlan_vlan,                       0,                             0
 BridgeVLAN.EgressUntagged,              config_parse_brvlan_untagged,                   0,                             0
+Network.IPv6PrefixDelegation,           config_parse_bool,                              0,                             offsetof(Network, router_prefix_delegation)
+IPv6PrefixDelegation.RouterLifetimeSec, config_parse_sec,                               0,                             offsetof(Network, router_lifetime_usec)
+IPv6PrefixDelegation.Managed,           config_parse_bool,                              0,                             offsetof(Network, router_managed)
+IPv6PrefixDelegation.OtherInformation,  config_parse_bool,                              0,                             offsetof(Network, router_other_information)
+IPv6PrefixDelegation.RouterPreference,  config_parse_router_preference,                 0,                             0
+IPv6Prefix.Prefix,                      config_parse_prefix,                            0,                             0
+IPv6Prefix.OnLink,                      config_parse_prefix_flags,                      0,                             0
+IPv6Prefix.AddressAutoconfiguration,    config_parse_prefix_flags,                      0,                             0
+IPv6Prefix.ValidLifetimeSec,            config_parse_prefix_lifetime,                   0,                             0
+IPv6Prefix.PreferredLifetimeSec,        config_parse_prefix_lifetime,                   0,                             0
 /* backwards compatibility: do not add new entries to this section */
 Network.IPv4LL,                         config_parse_ipv4ll,                            0,                             offsetof(Network, link_local)
 DHCPv4.UseDNS,                          config_parse_bool,                              0,                             offsetof(Network, dhcp_use_dns)
index 2b764d4..6f2ae66 100644 (file)
@@ -27,8 +27,8 @@
 #include "fd-util.h"
 #include "hostname-util.h"
 #include "network-internal.h"
+#include "networkd-manager.h"
 #include "networkd-network.h"
-#include "networkd.h"
 #include "parse-util.h"
 #include "set.h"
 #include "stat-util.h"
 #include "string-util.h"
 #include "util.h"
 
+static void network_config_hash_func(const void *p, struct siphash *state) {
+        const NetworkConfigSection *c = p;
+
+        siphash24_compress(c->filename, strlen(c->filename), state);
+        siphash24_compress(&c->line, sizeof(c->line), state);
+}
+
+static int network_config_compare_func(const void *a, const void *b) {
+        const NetworkConfigSection *x = a, *y = b;
+        int r;
+
+        r = strcmp(x->filename, y->filename);
+        if (r != 0)
+                return r;
+
+        return y->line - x->line;
+}
+
+const struct hash_ops network_config_hash_ops = {
+        .hash = network_config_hash_func,
+        .compare = network_config_compare_func,
+};
+
+int network_config_section_new(const char *filename, unsigned line, NetworkConfigSection **s) {
+        NetworkConfigSection *cs;
+
+        cs = malloc0(offsetof(NetworkConfigSection, filename) + strlen(filename) + 1);
+        if (!cs)
+                return -ENOMEM;
+
+        strcpy(cs->filename, filename);
+        cs->line = line;
+
+        *s = cs;
+        cs = NULL;
+
+        return 0;
+}
+
+void network_config_section_free(NetworkConfigSection *cs) {
+          free(cs);
+}
+
 static int network_load_one(Manager *manager, const char *filename) {
         _cleanup_network_free_ Network *network = NULL;
         _cleanup_fclose_ FILE *file = NULL;
         char *d;
+        const char *dropin_dirname;
         Route *route;
         Address *address;
         int r;
@@ -69,16 +113,19 @@ static int network_load_one(Manager *manager, const char *filename) {
         LIST_HEAD_INIT(network->static_addresses);
         LIST_HEAD_INIT(network->static_routes);
         LIST_HEAD_INIT(network->static_fdb_entries);
+        LIST_HEAD_INIT(network->ipv6_proxy_ndp_addresses);
+        LIST_HEAD_INIT(network->address_labels);
+        LIST_HEAD_INIT(network->static_prefixes);
 
         network->stacked_netdevs = hashmap_new(&string_hash_ops);
         if (!network->stacked_netdevs)
                 return log_oom();
 
-        network->addresses_by_section = hashmap_new(NULL);
+        network->addresses_by_section = hashmap_new(&network_config_hash_ops);
         if (!network->addresses_by_section)
                 return log_oom();
 
-        network->routes_by_section = hashmap_new(NULL);
+        network->routes_by_section = hashmap_new(&network_config_hash_ops);
         if (!network->routes_by_section)
                 return log_oom();
 
@@ -86,6 +133,14 @@ static int network_load_one(Manager *manager, const char *filename) {
         if (!network->fdb_entries_by_section)
                 return log_oom();
 
+        network->address_labels_by_section = hashmap_new(&network_config_hash_ops);
+        if (!network->address_labels_by_section)
+                log_oom();
+
+        network->prefixes_by_section = hashmap_new(&network_config_hash_ops);
+        if (!network->prefixes_by_section)
+                return log_oom();
+
         network->filename = strdup(filename);
         if (!network->filename)
                 return log_oom();
@@ -110,6 +165,7 @@ static int network_load_one(Manager *manager, const char *filename) {
         network->dhcp_send_hostname = true;
         network->dhcp_route_metric = DHCP_ROUTE_METRIC;
         network->dhcp_client_identifier = DHCP_CLIENT_ID_DUID;
+        network->dhcp_route_table = RT_TABLE_MAIN;
 
         network->dhcp_server_emit_dns = true;
         network->dhcp_server_emit_ntp = true;
@@ -119,6 +175,7 @@ static int network_load_one(Manager *manager, const char *filename) {
         network->use_bpdu = true;
         network->allow_port_to_be_root = true;
         network->unicast_flood = true;
+        network->priority = LINK_BRIDGE_PORT_PRIORITY_INVALID;
 
         network->lldp_mode = LLDP_MODE_ROUTERS_ONLY;
 
@@ -132,25 +189,34 @@ static int network_load_one(Manager *manager, const char *filename) {
         network->ipv6_accept_ra = -1;
         network->ipv6_dad_transmits = -1;
         network->ipv6_hop_limit = -1;
+        network->ipv6_proxy_ndp = -1;
         network->duid.type = _DUID_TYPE_INVALID;
         network->proxy_arp = -1;
+        network->arp = -1;
         network->ipv6_accept_ra_use_dns = true;
-
-        r = config_parse(NULL, filename, file,
-                         "Match\0"
-                         "Link\0"
-                         "Network\0"
-                         "Address\0"
-                         "Route\0"
-                         "DHCP\0"
-                         "DHCPv4\0" /* compat */
-                         "DHCPServer\0"
-                         "IPv6AcceptRA\0"
-                         "Bridge\0"
-                         "BridgeFDB\0"
-                         "BridgeVLAN\0",
-                         config_item_perf_lookup, network_network_gperf_lookup,
-                         false, false, true, network);
+        network->ipv6_accept_ra_route_table = RT_TABLE_MAIN;
+
+        dropin_dirname = strjoina(network->name, ".network.d");
+
+        r = config_parse_many(filename, network_dirs, dropin_dirname,
+                              "Match\0"
+                              "Link\0"
+                              "Network\0"
+                              "Address\0"
+                              "IPv6AddressLabel\0"
+                              "Route\0"
+                              "DHCP\0"
+                              "DHCPv4\0" /* compat */
+                              "DHCPServer\0"
+                              "IPv6AcceptRA\0"
+                              "IPv6NDPProxyAddress\0"
+                              "Bridge\0"
+                              "BridgeFDB\0"
+                              "BridgeVLAN\0"
+                              "IPv6PrefixDelegation\0"
+                              "IPv6Prefix\0",
+                              config_item_perf_lookup, network_network_gperf_lookup,
+                              false, network);
         if (r < 0)
                 return r;
 
@@ -218,6 +284,9 @@ void network_free(Network *network) {
         Route *route;
         Address *address;
         FdbEntry *fdb_entry;
+        IPv6ProxyNDPAddress *ipv6_proxy_ndp_address;
+        AddressLabel *label;
+        Prefix *prefix;
         Iterator i;
 
         if (!network)
@@ -238,7 +307,7 @@ void network_free(Network *network) {
         free(network->mac);
 
         strv_free(network->ntp);
-        strv_free(network->dns);
+        free(network->dns);
         strv_free(network->search_domains);
         strv_free(network->route_domains);
         strv_free(network->bind_carrier);
@@ -262,9 +331,20 @@ void network_free(Network *network) {
         while ((fdb_entry = network->static_fdb_entries))
                 fdb_entry_free(fdb_entry);
 
+        while ((ipv6_proxy_ndp_address = network->ipv6_proxy_ndp_addresses))
+                ipv6_proxy_ndp_address_free(ipv6_proxy_ndp_address);
+
+        while ((label = network->address_labels))
+                address_label_free(label);
+
+        while ((prefix = network->static_prefixes))
+                prefix_free(prefix);
+
         hashmap_free(network->addresses_by_section);
         hashmap_free(network->routes_by_section);
         hashmap_free(network->fdb_entries_by_section);
+        hashmap_free(network->address_labels_by_section);
+        hashmap_free(network->prefixes_by_section);
 
         if (network->manager) {
                 if (network->manager->networks)
@@ -362,10 +442,9 @@ int network_get(Manager *manager, struct udev_device *device,
         return -ENOENT;
 }
 
-int network_apply(Manager *manager, Network *network, Link *link) {
+int network_apply(Network *network, Link *link) {
         int r;
 
-        assert(manager);
         assert(network);
         assert(link);
 
@@ -374,7 +453,7 @@ int network_apply(Manager *manager, Network *network, Link *link) {
         if (network->ipv4ll_route) {
                 Route *route;
 
-                r = route_new_static(network, 0, &route);
+                r = route_new_static(network, NULL, 0, &route);
                 if (r < 0)
                         return r;
 
@@ -391,13 +470,11 @@ int network_apply(Manager *manager, Network *network, Link *link) {
                 route->protocol = RTPROT_STATIC;
         }
 
-        if (!strv_isempty(network->dns) ||
+        if (network->n_dns > 0 ||
             !strv_isempty(network->ntp) ||
             !strv_isempty(network->search_domains) ||
-            !strv_isempty(network->route_domains)) {
-                manager_dirty(manager);
+            !strv_isempty(network->route_domains))
                 link_dirty(link);
-        }
 
         return 0;
 }
@@ -480,9 +557,10 @@ int config_parse_netdev(const char *unit,
         case NETDEV_KIND_MACVTAP:
         case NETDEV_KIND_IPVLAN:
         case NETDEV_KIND_VXLAN:
+        case NETDEV_KIND_VCAN:
                 r = hashmap_put(network->stacked_netdevs, netdev->ifname, netdev);
                 if (r < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, r, "Can not add VLAN '%s' to network: %m", rvalue);
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Can not add NetDev '%s' to network: %m", rvalue);
                         return 0;
                 }
 
@@ -905,13 +983,14 @@ int config_parse_dhcp_server_dns(
                 struct in_addr a, *m;
 
                 r = extract_first_word(&p, &w, NULL, 0);
+                if (r == -ENOMEM)
+                        return log_oom();
                 if (r < 0) {
                         log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract word, ignoring: %s", rvalue);
                         return 0;
                 }
-
                 if (r == 0)
-                        return 0;
+                        break;
 
                 if (inet_pton(AF_INET, w, &a) <= 0) {
                         log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse DNS server address, ignoring: %s", w);
@@ -925,6 +1004,8 @@ int config_parse_dhcp_server_dns(
                 m[n->n_dhcp_server_dns++] = a;
                 n->dhcp_server_dns = m;
         }
+
+        return 0;
 }
 
 int config_parse_dhcp_server_ntp(
@@ -952,11 +1033,12 @@ int config_parse_dhcp_server_ntp(
                 struct in_addr a, *m;
 
                 r = extract_first_word(&p, &w, NULL, 0);
+                if (r == -ENOMEM)
+                        return log_oom();
                 if (r < 0) {
                         log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract word, ignoring: %s", rvalue);
                         return 0;
                 }
-
                 if (r == 0)
                         return 0;
 
@@ -974,6 +1056,62 @@ int config_parse_dhcp_server_ntp(
         }
 }
 
+int config_parse_dns(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        Network *n = userdata;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+
+        for (;;) {
+                _cleanup_free_ char *w = NULL;
+                union in_addr_union a;
+                struct in_addr_data *m;
+                int family;
+
+                r = extract_first_word(&rvalue, &w, NULL, 0);
+                if (r == -ENOMEM)
+                        return log_oom();
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Invalid syntax, ignoring: %s", rvalue);
+                        break;
+                }
+                if (r == 0)
+                        break;
+
+                r = in_addr_from_string_auto(w, &family, &a);
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse dns server address, ignoring: %s", w);
+                        continue;
+                }
+
+                m = realloc(n->dns, (n->n_dns + 1) * sizeof(struct in_addr_data));
+                if (!m)
+                        return log_oom();
+
+                m[n->n_dns++] = (struct in_addr_data) {
+                        .family = family,
+                        .address = a,
+                };
+
+                n->dns = m;
+        }
+
+        return 0;
+}
+
 int config_parse_dnssec_negative_trust_anchors(
                 const char *unit,
                 const char *filename,
@@ -1030,6 +1168,89 @@ int config_parse_dnssec_negative_trust_anchors(
         return 0;
 }
 
+int config_parse_ntp(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        char ***l = data;
+        int r;
+
+        assert(l);
+        assert(lvalue);
+        assert(rvalue);
+
+        if (isempty(rvalue)) {
+                *l = strv_free(*l);
+                return 0;
+        }
+
+        for (;;) {
+                _cleanup_free_ char *w = NULL;
+
+                r = extract_first_word(&rvalue, &w, NULL, 0);
+                if (r == -ENOMEM)
+                        return log_oom();
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract NTP server name, ignoring: %s", rvalue);
+                        break;
+                }
+                if (r == 0)
+                        break;
+
+                r = dns_name_is_valid_or_address(w);
+                if (r <= 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "%s is not a valid domain name or IP address, ignoring.", w);
+                        continue;
+                }
+
+                r = strv_push(l, w);
+                if (r < 0)
+                        return log_oom();
+
+                w = NULL;
+        }
+
+        return 0;
+}
+
+int config_parse_dhcp_route_table(const char *unit,
+                                  const char *filename,
+                                  unsigned line,
+                                  const char *section,
+                                  unsigned section_line,
+                                  const char *lvalue,
+                                  int ltype,
+                                  const char *rvalue,
+                                  void *data,
+                                  void *userdata) {
+        uint32_t rt;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = safe_atou32(rvalue, &rt);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Unable to read RouteTable, ignoring assignment: %s", rvalue);
+                return 0;
+        }
+
+        *((uint32_t *)data) = rt;
+
+        return 0;
+}
+
 DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_use_domains, dhcp_use_domains, DHCPUseDomains, "Failed to parse DHCP use domains setting");
 
 static const char* const dhcp_use_domains_table[_DHCP_USE_DOMAINS_MAX] = {
index 08ee939..b319219 100644 (file)
 #include "resolve-util.h"
 
 #include "networkd-address.h"
+#include "networkd-address-label.h"
 #include "networkd-brvlan.h"
 #include "networkd-fdb.h"
 #include "networkd-lldp-tx.h"
-#include "networkd-netdev.h"
+#include "networkd-ipv6-proxy-ndp.h"
 #include "networkd-route.h"
 #include "networkd-util.h"
+#include "netdev/netdev.h"
 
 #define DHCP_ROUTE_METRIC 1024
 #define IPV4LL_ROUTE_METRIC 2048
@@ -81,6 +83,17 @@ typedef struct DUID {
         uint8_t raw_data[MAX_DUID_LEN];
 } DUID;
 
+typedef struct NetworkConfigSection {
+        unsigned line;
+        char filename[];
+} NetworkConfigSection;
+
+int network_config_section_new(const char *filename, unsigned line, NetworkConfigSection **s);
+void network_config_section_free(NetworkConfigSection *network);
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(NetworkConfigSection*, network_config_section_free);
+#define _cleanup_network_config_section_free_ _cleanup_(network_config_section_freep)
+
 typedef struct Manager Manager;
 
 struct Network {
@@ -112,17 +125,19 @@ struct Network {
         DCHPClientIdentifier dhcp_client_identifier;
         char *dhcp_vendor_class_identifier;
         char *dhcp_hostname;
-        bool dhcp_use_dns;
-        bool dhcp_use_ntp;
-        bool dhcp_use_mtu;
-        bool dhcp_use_hostname;
-        DHCPUseDomains dhcp_use_domains;
+        unsigned dhcp_route_metric;
+        uint32_t dhcp_route_table;
+        uint16_t dhcp_client_port;
         bool dhcp_send_hostname;
         bool dhcp_broadcast;
         bool dhcp_critical;
+        bool dhcp_use_dns;
+        bool dhcp_use_ntp;
+        bool dhcp_use_mtu;
         bool dhcp_use_routes;
         bool dhcp_use_timezone;
-        unsigned dhcp_route_metric;
+        bool dhcp_use_hostname;
+        DHCPUseDomains dhcp_use_domains;
 
         /* DHCP Server Support */
         bool dhcp_server;
@@ -143,14 +158,23 @@ struct Network {
         AddressFamilyBoolean link_local;
         bool ipv4ll_route;
 
+        /* IPv6 prefix delegation support */
+        bool router_prefix_delegation;
+        usec_t router_lifetime_usec;
+        uint8_t router_preference;
+        bool router_managed;
+        bool router_other_information;
+
         /* Bridge Support */
         bool use_bpdu;
         bool hairpin;
         bool fast_leave;
         bool allow_port_to_be_root;
         bool unicast_flood;
-        unsigned cost;
+        uint32_t cost;
+        uint16_t priority;
 
+        bool use_br_vlan;
         uint16_t pvid;
         uint32_t br_vid_bitmap[BRIDGE_VLAN_BITMAP_LEN];
         uint32_t br_untagged_bitmap[BRIDGE_VLAN_BITMAP_LEN];
@@ -161,16 +185,22 @@ struct Network {
         int ipv6_accept_ra;
         int ipv6_dad_transmits;
         int ipv6_hop_limit;
+        int ipv6_proxy_ndp;
         int proxy_arp;
 
         bool ipv6_accept_ra_use_dns;
+        bool active_slave;
+        bool primary_slave;
         DHCPUseDomains ipv6_accept_ra_use_domains;
+        uint32_t ipv6_accept_ra_route_table;
 
         union in_addr_union ipv6_token;
         IPv6PrivacyExtensions ipv6_privacy_extensions;
 
         struct ether_addr *mac;
-        unsigned mtu;
+        size_t mtu;
+        int arp;
+        bool unmanaged;
         uint32_t iaid;
         DUID duid;
 
@@ -180,16 +210,27 @@ struct Network {
         LIST_HEAD(Address, static_addresses);
         LIST_HEAD(Route, static_routes);
         LIST_HEAD(FdbEntry, static_fdb_entries);
+        LIST_HEAD(IPv6ProxyNDPAddress, ipv6_proxy_ndp_addresses);
+        LIST_HEAD(AddressLabel, address_labels);
+        LIST_HEAD(Prefix, static_prefixes);
 
         unsigned n_static_addresses;
         unsigned n_static_routes;
         unsigned n_static_fdb_entries;
+        unsigned n_ipv6_proxy_ndp_addresses;
+        unsigned n_address_labels;
+        unsigned n_static_prefixes;
 
         Hashmap *addresses_by_section;
         Hashmap *routes_by_section;
         Hashmap *fdb_entries_by_section;
+        Hashmap *address_labels_by_section;
+        Hashmap *prefixes_by_section;
+
+        struct in_addr_data *dns;
+        unsigned n_dns;
 
-        char **search_domains, **route_domains, **dns, **ntp, **bind_carrier;
+        char **search_domains, **route_domains, **ntp, **bind_carrier;
 
         ResolveSupport llmnr;
         ResolveSupport mdns;
@@ -208,7 +249,7 @@ int network_load(Manager *manager);
 
 int network_get_by_name(Manager *manager, const char *name, Network **ret);
 int network_get(Manager *manager, struct udev_device *device, const char *ifname, const struct ether_addr *mac, Network **ret);
-int network_apply(Manager *manager, Network *network, Link *link);
+int network_apply(Network *network, Link *link);
 
 bool network_has_static_ipv6_addresses(Network *network);
 
@@ -216,6 +257,7 @@ int config_parse_netdev(const char *unit, const char *filename, unsigned line, c
 int config_parse_domains(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_tunnel(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_dhcp(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_dns(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_dhcp_client_identifier(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_ipv6token(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_ipv6_privacy_extensions(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
@@ -226,11 +268,13 @@ int config_parse_dhcp_server_ntp(const char *unit, const char *filename, unsigne
 int config_parse_dnssec_negative_trust_anchors(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_dhcp_use_domains(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_lldp_mode(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_dhcp_route_table(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_ntp(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 
 /* Legacy IPv4LL support */
 int config_parse_ipv4ll(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 
-const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, unsigned length);
+const struct ConfigPerfItem* network_network_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
 
 extern const sd_bus_vtable network_vtable[];
 
diff --git a/src/network/networkd-radv.c b/src/network/networkd-radv.c
new file mode 100644 (file)
index 0000000..af9e116
--- /dev/null
@@ -0,0 +1,79 @@
+/***
+  This file is part of systemd.
+
+  Copyright (C) 2017 Intel Corporation. All rights reserved.
+
+  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 <netinet/icmp6.h>
+#include <arpa/inet.h>
+
+#include "networkd-address.h"
+#include "networkd-radv.h"
+#include "sd-radv.h"
+
+int radv_configure(Link *link) {
+        int r;
+        Prefix *p;
+
+        assert(link);
+        assert(link->network);
+
+        r = sd_radv_new(&link->radv);
+        if (r < 0)
+                return r;
+
+        r = sd_radv_attach_event(link->radv, NULL, 0);
+        if (r < 0)
+                return r;
+
+        r = sd_radv_set_mac(link->radv, &link->mac);
+        if (r < 0)
+                return r;
+
+        r = sd_radv_set_ifindex(link->radv, link->ifindex);
+        if (r < 0)
+                return r;
+
+        r = sd_radv_set_managed_information(link->radv, link->network->router_managed);
+        if (r < 0)
+                return r;
+
+        r = sd_radv_set_other_information(link->radv, link->network->router_other_information);
+        if (r < 0)
+                return r;
+
+        /* a value of 0xffffffff represents infinity, 0x0 means this host is
+           not a router */
+        r = sd_radv_set_router_lifetime(link->radv,
+                                        DIV_ROUND_UP(link->network->router_lifetime_usec, USEC_PER_SEC));
+        if (r < 0)
+                return r;
+
+        if (link->network->router_lifetime_usec > 0) {
+                r = sd_radv_set_preference(link->radv,
+                                           link->network->router_preference);
+                if (r < 0)
+                        return r;
+        }
+
+        LIST_FOREACH(prefixes, p, link->network->static_prefixes) {
+                r = sd_radv_add_prefix(link->radv, p->radv_prefix);
+                if (r != -EEXIST && r < 0)
+                        return r;
+        }
+
+        return 0;
+}
diff --git a/src/network/networkd-radv.h b/src/network/networkd-radv.h
new file mode 100644 (file)
index 0000000..a186b11
--- /dev/null
@@ -0,0 +1,24 @@
+#pragma once
+
+/***
+  This file is part of systemd.
+
+  Copyright 2017 Intel Corporation. All rights reserved.
+
+  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 "networkd-link.h"
+
+int radv_configure(Link *link);
index cedaf47..e5d61ce 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+#include <linux/icmpv6.h>
+
 #include "alloc-util.h"
 #include "conf-parser.h"
 #include "in-addr-util.h"
 #include "netlink-util.h"
+#include "networkd-manager.h"
 #include "networkd-route.h"
-#include "networkd.h"
 #include "parse-util.h"
 #include "set.h"
 #include "string-util.h"
+#include "sysctl-util.h"
 #include "util.h"
 
-#define ROUTES_PER_LINK_MAX 2048U
-#define STATIC_ROUTES_PER_NETWORK_MAX 1024U
+#define ROUTES_DEFAULT_MAX_PER_FAMILY 4096U
+
+static unsigned routes_max(void) {
+        static thread_local unsigned cached = 0;
+
+        _cleanup_free_ char *s4 = NULL, *s6 = NULL;
+        unsigned val4 = ROUTES_DEFAULT_MAX_PER_FAMILY, val6 = ROUTES_DEFAULT_MAX_PER_FAMILY;
+
+        if (cached > 0)
+                return cached;
+
+        if (sysctl_read("net/ipv4/route/max_size", &s4) >= 0) {
+                truncate_nl(s4);
+                if (safe_atou(s4, &val4) >= 0 &&
+                    val4 == 2147483647U)
+                        /* This is the default "no limit" value in the kernel */
+                        val4 = ROUTES_DEFAULT_MAX_PER_FAMILY;
+        }
+
+        if (sysctl_read("net/ipv6/route/max_size", &s6) >= 0) {
+                truncate_nl(s6);
+                (void) safe_atou(s6, &val6);
+        }
+
+        cached = MAX(ROUTES_DEFAULT_MAX_PER_FAMILY, val4) +
+                 MAX(ROUTES_DEFAULT_MAX_PER_FAMILY, val6);
+        return cached;
+}
 
 int route_new(Route **ret) {
         _cleanup_route_free_ Route *route = NULL;
@@ -41,7 +70,7 @@ int route_new(Route **ret) {
         route->family = AF_UNSPEC;
         route->scope = RT_SCOPE_UNIVERSE;
         route->protocol = RTPROT_UNSPEC;
-        route->table = RT_TABLE_DEFAULT;
+        route->table = RT_TABLE_MAIN;
         route->lifetime = USEC_INFINITY;
 
         *ret = route;
@@ -50,15 +79,21 @@ int route_new(Route **ret) {
         return 0;
 }
 
-int route_new_static(Network *network, unsigned section, Route **ret) {
+int route_new_static(Network *network, const char *filename, unsigned section_line, Route **ret) {
+        _cleanup_network_config_section_free_ NetworkConfigSection *n = NULL;
         _cleanup_route_free_ Route *route = NULL;
         int r;
 
         assert(network);
         assert(ret);
+        assert(!!filename == (section_line > 0));
+
+        if (filename) {
+                r = network_config_section_new(filename, section_line, &n);
+                if (r < 0)
+                        return r;
 
-        if (section) {
-                route = hashmap_get(network->routes_by_section, UINT_TO_PTR(section));
+                route = hashmap_get(network->routes_by_section, n);
                 if (route) {
                         *ret = route;
                         route = NULL;
@@ -67,7 +102,7 @@ int route_new_static(Network *network, unsigned section, Route **ret) {
                 }
         }
 
-        if (network->n_static_routes >= STATIC_ROUTES_PER_NETWORK_MAX)
+        if (network->n_static_routes >= routes_max())
                 return -E2BIG;
 
         r = route_new(&route);
@@ -76,10 +111,11 @@ int route_new_static(Network *network, unsigned section, Route **ret) {
 
         route->protocol = RTPROT_STATIC;
 
-        if (section) {
-                route->section = section;
+        if (filename) {
+                route->section = n;
+                n = NULL;
 
-                r = hashmap_put(network->routes_by_section, UINT_TO_PTR(route->section), route);
+                r = hashmap_put(network->routes_by_section, route->section, route);
                 if (r < 0)
                         return r;
         }
@@ -105,9 +141,11 @@ void route_free(Route *route) {
                 route->network->n_static_routes--;
 
                 if (route->section)
-                        hashmap_remove(route->network->routes_by_section, UINT_TO_PTR(route->section));
+                        hashmap_remove(route->network->routes_by_section, route->section);
         }
 
+        network_config_section_free(route->section);
+
         if (route->link) {
                 set_remove(route->link->routes, route);
                 set_remove(route->link->routes_foreign, route);
@@ -192,7 +230,7 @@ int route_get(Link *link,
               unsigned char dst_prefixlen,
               unsigned char tos,
               uint32_t priority,
-              unsigned char table,
+              uint32_t table,
               Route **ret) {
 
         Route route, *existing;
@@ -234,7 +272,7 @@ static int route_add_internal(
                 unsigned char dst_prefixlen,
                 unsigned char tos,
                 uint32_t priority,
-                unsigned char table,
+                uint32_t table,
                 Route **ret) {
 
         _cleanup_route_free_ Route *route = NULL;
@@ -280,7 +318,7 @@ int route_add_foreign(
                 unsigned char dst_prefixlen,
                 unsigned char tos,
                 uint32_t priority,
-                unsigned char table,
+                uint32_t table,
                 Route **ret) {
 
         return route_add_internal(link, &link->routes_foreign, family, dst, dst_prefixlen, tos, priority, table, ret);
@@ -293,7 +331,7 @@ int route_add(
               unsigned char dst_prefixlen,
               unsigned char tos,
               uint32_t priority,
-              unsigned char table,
+              uint32_t table,
               Route **ret) {
 
         Route *route;
@@ -322,7 +360,8 @@ int route_add(
         } else
                 return r;
 
-        *ret = route;
+        if (ret)
+                *ret = route;
 
         return 0;
 }
@@ -440,20 +479,14 @@ static int route_expire_callback(sd_netlink *rtnl, sd_netlink_message *m, void *
         assert(m);
         assert(link);
         assert(link->ifname);
-        assert(link->link_messages > 0);
 
         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
                 return 1;
 
-        link->link_messages--;
-
         r = sd_netlink_message_get_errno(m);
         if (r < 0 && r != -EEXIST)
                 log_link_warning_errno(link, r, "could not remove route: %m");
 
-        if (link->link_messages == 0)
-                log_link_debug(link, "route removed");
-
         return 1;
 }
 
@@ -466,11 +499,8 @@ int route_expire_handler(sd_event_source *s, uint64_t usec, void *userdata) {
         r = route_remove(route, route->link, route_expire_callback);
         if (r < 0)
                 log_warning_errno(r, "Could not remove route: %m");
-        else {
-                /* route may not be exist in kernel. If we fail still remove it */
-                route->link->link_messages++;
+        else
                 route_free(route);
-        }
 
         return 1;
 }
@@ -492,7 +522,7 @@ int route_configure(
         assert(route->family == AF_INET || route->family == AF_INET6);
 
         if (route_get(link, route->family, &route->dst, route->dst_prefixlen, route->tos, route->priority, route->table, NULL) <= 0 &&
-            set_size(link->routes) >= ROUTES_PER_LINK_MAX)
+            set_size(link->routes) >= routes_max())
                 return -E2BIG;
 
         r = sd_rtnl_message_new_route(link->manager->rtnl, &req,
@@ -557,14 +587,12 @@ int route_configure(
         if (r < 0)
                 return log_error_errno(r, "Could not set flags: %m");
 
-        if (route->table != RT_TABLE_DEFAULT) {
-
+        if (route->table != RT_TABLE_MAIN) {
                 if (route->table < 256) {
                         r = sd_rtnl_message_route_set_table(req, route->table);
                         if (r < 0)
                                 return log_error_errno(r, "Could not set route table: %m");
                 } else {
-
                         r = sd_rtnl_message_route_set_table(req, RT_TABLE_UNSPEC);
                         if (r < 0)
                                 return log_error_errno(r, "Could not set route table: %m");
@@ -588,6 +616,20 @@ int route_configure(
         if (r < 0)
                 return log_error_errno(r, "Could not append RTA_OIF attribute: %m");
 
+        r = sd_netlink_message_open_container(req, RTA_METRICS);
+        if (r < 0)
+                return log_error_errno(r, "Could not append RTA_METRICS attribute: %m");
+
+        if (route->mtu > 0) {
+                r = sd_netlink_message_append_u32(req, RTAX_MTU, route->mtu);
+                if (r < 0)
+                        return log_error_errno(r, "Could not append RTAX_MTU attribute: %m");
+        }
+
+        r = sd_netlink_message_close_container(req);
+        if (r < 0)
+                return log_error_errno(r, "Could not append RTA_METRICS attribute: %m");
+
         r = sd_netlink_call_async(link->manager->rtnl, req, callback, link, 0, NULL);
         if (r < 0)
                 return log_error_errno(r, "Could not send rtnetlink message: %m");
@@ -642,10 +684,10 @@ int config_parse_gateway(const char *unit,
         if (streq(section, "Network")) {
                 /* we are not in an Route section, so treat
                  * this as the special '0' section */
-                section_line = 0;
-        }
+                r = route_new_static(network, NULL, 0, &n);
+        } else
+                r = route_new_static(network, filename, section_line, &n);
 
-        r = route_new_static(network, section_line, &n);
         if (r < 0)
                 return r;
 
@@ -684,7 +726,7 @@ int config_parse_preferred_src(const char *unit,
         assert(rvalue);
         assert(data);
 
-        r = route_new_static(network, section_line, &n);
+        r = route_new_static(network, filename, section_line, &n);
         if (r < 0)
                 return r;
 
@@ -715,10 +757,9 @@ int config_parse_destination(const char *unit,
 
         Network *network = userdata;
         _cleanup_route_free_ Route *n = NULL;
-        const char *address, *e;
         union in_addr_union buffer;
         unsigned char prefixlen;
-        int r, f;
+        int r;
 
         assert(filename);
         assert(section);
@@ -726,49 +767,24 @@ int config_parse_destination(const char *unit,
         assert(rvalue);
         assert(data);
 
-        r = route_new_static(network, section_line, &n);
+        r = route_new_static(network, filename, section_line, &n);
         if (r < 0)
                 return r;
 
-        /* Destination|Source=address/prefixlen */
-
-        /* address */
-        e = strchr(rvalue, '/');
-        if (e)
-                address = strndupa(rvalue, e - rvalue);
-        else
-                address = rvalue;
-
-        r = in_addr_from_string_auto(address, &f, &buffer);
+        r = in_addr_prefix_from_string(rvalue, AF_INET, &buffer, &prefixlen);
         if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, r, "Destination is invalid, ignoring assignment: %s", address);
-                return 0;
-        }
-
-        if (f != AF_INET && f != AF_INET6) {
-                log_syntax(unit, LOG_ERR, filename, line, 0, "Unknown address family, ignoring assignment: %s", address);
-                return 0;
-        }
-
-        /* prefixlen */
-        if (e) {
-                r = safe_atou8(e + 1, &prefixlen);
+                r = in_addr_prefix_from_string(rvalue, AF_INET6, &buffer, &prefixlen);
                 if (r < 0) {
-                        log_syntax(unit, LOG_ERR, filename, line, r, "Route destination prefix length is invalid, ignoring assignment: %s", e + 1);
+                        log_syntax(unit, LOG_ERR, filename, line, r,
+                                   "Route %s= prefix is invalid, ignoring assignment: %s",
+                                   lvalue, rvalue);
                         return 0;
                 }
-        } else {
-                switch (f) {
-                        case AF_INET:
-                                prefixlen = 32;
-                                break;
-                        case AF_INET6:
-                                prefixlen = 128;
-                                break;
-                }
-        }
 
-        n->family = f;
+                n->family = AF_INET6;
+        } else
+                n->family = AF_INET;
+
         if (streq(lvalue, "Destination")) {
                 n->dst = buffer;
                 n->dst_prefixlen = prefixlen;
@@ -804,7 +820,7 @@ int config_parse_route_priority(const char *unit,
         assert(rvalue);
         assert(data);
 
-        r = route_new_static(network, section_line, &n);
+        r = route_new_static(network, filename, section_line, &n);
         if (r < 0)
                 return r;
 
@@ -841,7 +857,7 @@ int config_parse_route_scope(const char *unit,
         assert(rvalue);
         assert(data);
 
-        r = route_new_static(network, section_line, &n);
+        r = route_new_static(network, filename, section_line, &n);
         if (r < 0)
                 return r;
 
@@ -882,7 +898,7 @@ int config_parse_route_table(const char *unit,
         assert(rvalue);
         assert(data);
 
-        r = route_new_static(network, section_line, &n);
+        r = route_new_static(network, filename, section_line, &n);
         if (r < 0)
                 return r;
 
@@ -899,3 +915,111 @@ int config_parse_route_table(const char *unit,
 
         return 0;
 }
+
+int config_parse_gateway_onlink(const char *unit,
+                                const char *filename,
+                                unsigned line,
+                                const char *section,
+                                unsigned section_line,
+                                const char *lvalue,
+                                int ltype,
+                                const char *rvalue,
+                                void *data,
+                                void *userdata) {
+        Network *network = userdata;
+        _cleanup_route_free_ Route *n = NULL;
+        int r;
+
+        assert(filename);
+        assert(section);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = route_new_static(network, filename, section_line, &n);
+        if (r < 0)
+                return r;
+
+        r = parse_boolean(rvalue);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Could not parse gateway onlink \"%s\", ignoring assignment: %m", rvalue);
+                return 0;
+        }
+
+        SET_FLAG(n->flags, RTNH_F_ONLINK, r);
+        n = NULL;
+
+        return 0;
+}
+
+int config_parse_ipv6_route_preference(const char *unit,
+                                       const char *filename,
+                                       unsigned line,
+                                       const char *section,
+                                       unsigned section_line,
+                                       const char *lvalue,
+                                       int ltype,
+                                       const char *rvalue,
+                                       void *data,
+                                       void *userdata) {
+        Network *network = userdata;
+        _cleanup_route_free_ Route *n = NULL;
+        int r;
+
+        r = route_new_static(network, filename, section_line, &n);
+        if (r < 0)
+                return r;
+
+        if (streq(rvalue, "low"))
+                n->pref = ICMPV6_ROUTER_PREF_LOW;
+        else if (streq(rvalue, "medium"))
+                n->pref = ICMPV6_ROUTER_PREF_MEDIUM;
+        else if (streq(rvalue, "high"))
+                n->pref = ICMPV6_ROUTER_PREF_HIGH;
+        else {
+                log_syntax(unit, LOG_ERR, filename, line, 0, "Unknown route preference: %s", rvalue);
+                return 0;
+        }
+
+        n = NULL;
+
+        return 0;
+}
+
+int config_parse_route_protocol(const char *unit,
+                                const char *filename,
+                                unsigned line,
+                                const char *section,
+                                unsigned section_line,
+                                const char *lvalue,
+                                int ltype,
+                                const char *rvalue,
+                                void *data,
+                                void *userdata) {
+        Network *network = userdata;
+        _cleanup_route_free_ Route *n = NULL;
+        int r;
+
+        r = route_new_static(network, filename, section_line, &n);
+        if (r < 0)
+                return r;
+
+        if (streq(rvalue, "kernel"))
+                n->protocol = RTPROT_KERNEL;
+        else if (streq(rvalue, "boot"))
+                n->protocol = RTPROT_BOOT;
+        else if (streq(rvalue, "static"))
+                n->protocol = RTPROT_STATIC;
+        else {
+                r = safe_atou8(rvalue , &n->protocol);
+                if (r < 0) {
+                        log_syntax(unit, LOG_ERR, filename, line, r, "Could not parse route protocol \"%s\", ignoring assignment: %m", rvalue);
+                        return 0;
+                }
+        }
+
+        n = NULL;
+
+        return 0;
+}
index d4e4dba..3f38948 100644 (file)
 ***/
 
 typedef struct Route Route;
+typedef struct NetworkConfigSection NetworkConfigSection;
 
 #include "networkd-network.h"
 
 struct Route {
         Network *network;
-        unsigned section;
+        NetworkConfigSection *section;
 
         Link *link;
 
@@ -37,6 +38,7 @@ struct Route {
         unsigned char tos;
         uint32_t priority; /* note that ip(8) calls this 'metric' */
         uint32_t table;
+        uint32_t mtu;
         unsigned char pref;
         unsigned flags;
 
@@ -51,15 +53,15 @@ struct Route {
         LIST_FIELDS(Route, routes);
 };
 
-int route_new_static(Network *network, unsigned section, Route **ret);
+int route_new_static(Network *network, const char *filename, unsigned section_line, Route **ret);
 int route_new(Route **ret);
 void route_free(Route *route);
 int route_configure(Route *route, Link *link, sd_netlink_message_handler_t callback);
 int route_remove(Route *route, Link *link, sd_netlink_message_handler_t callback);
 
-int route_get(Link *link, int family, const union in_addr_union *dst, unsigned char dst_prefixlen, unsigned char tos, uint32_t priority, unsigned char table, Route **ret);
-int route_add(Link *link, int family, const union in_addr_union *dst, unsigned char dst_prefixlen, unsigned char tos, uint32_t priority, unsigned char table, Route **ret);
-int route_add_foreign(Link *link, int family, const union in_addr_union *dst, unsigned char dst_prefixlen, unsigned char tos, uint32_t priority, unsigned char table, Route **ret);
+int route_get(Link *link, int family, const union in_addr_union *dst, unsigned char dst_prefixlen, unsigned char tos, uint32_t priority, uint32_t table, Route **ret);
+int route_add(Link *link, int family, const union in_addr_union *dst, unsigned char dst_prefixlen, unsigned char tos, uint32_t priority, uint32_t table, Route **ret);
+int route_add_foreign(Link *link, int family, const union in_addr_union *dst, unsigned char dst_prefixlen, unsigned char tos, uint32_t priority, uint32_t table, Route **ret);
 int route_update(Route *route, const union in_addr_union *src, unsigned char src_prefixlen, const union in_addr_union *gw, const union in_addr_union *prefsrc, unsigned char scope, unsigned char protocol);
 
 int route_expire_handler(sd_event_source *s, uint64_t usec, void *userdata);
@@ -73,3 +75,6 @@ int config_parse_destination(const char *unit, const char *filename, unsigned li
 int config_parse_route_priority(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_route_scope(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_route_table(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_gateway_onlink(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_ipv6_route_preference(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_route_protocol(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
index c8f81a2..fe60f1e 100644 (file)
 ***/
 
 #include "sd-daemon.h"
+#include "sd-event.h"
 
 #include "capability-util.h"
-#include "networkd.h"
 #include "networkd-conf.h"
+#include "networkd-manager.h"
 #include "signal-util.h"
 #include "user-util.h"
 
 int main(int argc, char *argv[]) {
+        sd_event *event = NULL;
         _cleanup_manager_free_ Manager *m = NULL;
         const char *user = "systemd-network";
         uid_t uid;
@@ -78,7 +80,15 @@ int main(int argc, char *argv[]) {
 
         assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, -1) >= 0);
 
-        r = manager_new(&m);
+        r = sd_event_default(&event);
+        if (r < 0)
+                goto out;
+
+        sd_event_set_watchdog(event, true);
+        sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL);
+        sd_event_add_signal(event, NULL, SIGINT, NULL, NULL);
+
+        r = manager_new(&m, event);
         if (r < 0) {
                 log_error_errno(r, "Could not create manager: %m");
                 goto out;
@@ -118,22 +128,29 @@ int main(int argc, char *argv[]) {
                 goto out;
         }
 
+        r = manager_start(m);
+        if (r < 0) {
+                log_error_errno(r, "Could not start manager: %m");
+                goto out;
+        }
+
         log_info("Enumeration completed");
 
         sd_notify(false,
                   "READY=1\n"
                   "STATUS=Processing requests...");
 
-        r = manager_run(m);
+        r = sd_event_loop(event);
         if (r < 0) {
                 log_error_errno(r, "Event loop failed: %m");
                 goto out;
         }
-
 out:
         sd_notify(false,
                   "STOPPING=1\n"
                   "STATUS=Shutting down...");
 
+        sd_event_unref(event);
+
         return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }
diff --git a/src/network/systemd-networkd.pkla b/src/network/systemd-networkd.pkla
new file mode 100644 (file)
index 0000000..fb257d9
--- /dev/null
@@ -0,0 +1,4 @@
+[Allow systemd-networkd to set timezone and transient hostname]
+Identity=unix-user:systemd-network
+Action=org.freedesktop.hostname1.set-hostname;org.freedesktop.timedate1.set-timezone;
+ResultAny=yes
diff --git a/src/network/systemd-networkd.rules b/src/network/systemd-networkd.rules
new file mode 100644 (file)
index 0000000..2e4bc42
--- /dev/null
@@ -0,0 +1,8 @@
+// Allow systemd-networkd to set timezone and transient hostname
+polkit.addRule(function(action, subject) {
+    if ((action.id == "org.freedesktop.hostname1.set-hostname" ||
+         action.id == "org.freedesktop.timedate1.set-timezone") &&
+        subject.user == "systemd-network") {
+        return polkit.Result.YES;
+    }
+});
index adbe09a..eee91d1 100644 (file)
@@ -2,9 +2,11 @@
 #include "dhcp6-protocol.h"
 #include "ethtool-util.h"
 #include "netlink-internal.h"
-#include "networkd-netdev-bond.h"
-#include "networkd-netdev-macvlan.h"
-#include "networkd.h"
+#include "netdev/bond.h"
+#include "netdev/ipvlan.h"
+#include "netdev/macvlan.h"
+#include "networkd-link.h"
+#include "networkd-util.h"
 #include "test-tables.h"
 
 int main(int argc, char **argv) {
index 8556461..64d2f23 100644 (file)
@@ -20,7 +20,7 @@
 #include "alloc-util.h"
 #include "dhcp-lease-internal.h"
 #include "network-internal.h"
-#include "networkd.h"
+#include "networkd-manager.h"
 
 static void test_deserialize_in_addr(void) {
         _cleanup_free_ struct in_addr *addresses = NULL;
@@ -186,6 +186,7 @@ static void test_address_equality(void) {
 
 int main(void) {
         _cleanup_manager_free_ Manager *manager = NULL;
+        sd_event *event;
         struct udev *udev;
         struct udev_device *loopback;
         int r;
@@ -194,11 +195,16 @@ int main(void) {
         test_deserialize_dhcp_routes();
         test_address_equality();
 
-        assert_se(manager_new(&manager) >= 0);
+        r = sd_event_default(&event);
+        assert_se(r >= 0);
+
+        assert_se(manager_new(&manager, event) >= 0);
 
         r = test_load_config(manager);
-        if (r == -EPERM)
+        if (r == -EPERM) {
+                sd_event_unref(event);
                 return EXIT_TEST_SKIP;
+        }
 
         udev = udev_new();
         assert_se(udev);
@@ -213,4 +219,5 @@ int main(void) {
 
         udev_device_unref(loopback);
         udev_unref(udev);
+        sd_event_unref(event);
 }
diff --git a/src/network/wait-online/Makefile b/src/network/wait-online/Makefile
new file mode 120000 (symlink)
index 0000000..94aaae2
--- /dev/null
@@ -0,0 +1 @@
+../../Makefile
\ No newline at end of file
similarity index 97%
rename from src/network/networkd-wait-online-link.c
rename to src/network/wait-online/link.c
index 5727422..bd8578c 100644 (file)
@@ -21,7 +21,9 @@
 #include "sd-network.h"
 
 #include "alloc-util.h"
-#include "networkd-wait-online-link.h"
+#include "hashmap.h"
+#include "link.h"
+#include "manager.h"
 #include "string-util.h"
 
 int link_new(Manager *m, Link **ret, int ifindex, const char *ifname) {
@@ -77,8 +79,7 @@ Link *link_free(Link *l) {
         }
 
         free(l->ifname);
-        free(l);
-        return NULL;
+        return mfree(l);
  }
 
 int link_update_rtnl(Link *l, sd_netlink_message *m) {
similarity index 95%
rename from src/network/networkd-wait-online-link.h
rename to src/network/wait-online/link.h
index dc35085..c846e60 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-typedef struct Link Link;
+#include "sd-netlink.h"
 
-#include "networkd-wait-online.h"
+typedef struct Link Link;
+typedef struct Manager Manager;
 
 struct Link {
         Manager *manager;
similarity index 99%
rename from src/network/networkd-wait-online-manager.c
rename to src/network/wait-online/manager.c
index 725b331..d51b0a5 100644 (file)
 #include <fnmatch.h>
 
 #include "alloc-util.h"
+#include "link.h"
+#include "manager.h"
 #include "netlink-util.h"
 #include "network-internal.h"
-#include "networkd-wait-online-link.h"
-#include "networkd-wait-online.h"
 #include "time-util.h"
 #include "util.h"
 
similarity index 97%
rename from src/network/networkd-wait-online.h
rename to src/network/wait-online/manager.h
index f91995c..052f6b9 100644 (file)
@@ -26,8 +26,7 @@
 #include "hashmap.h"
 
 typedef struct Manager Manager;
-
-#include "networkd-wait-online-link.h"
+typedef struct Link Link;
 
 struct Manager {
         Hashmap *links;
similarity index 99%
rename from src/network/networkd-wait-online.c
rename to src/network/wait-online/wait-online.c
index 3220c4b..268cbdb 100644 (file)
@@ -22,7 +22,7 @@
 
 #include "sd-daemon.h"
 
-#include "networkd-wait-online.h"
+#include "manager.h"
 #include "signal-util.h"
 #include "strv.h"
 
index 874e383..81a5f0a 100644 (file)
@@ -27,7 +27,7 @@
 
 #include "alloc-util.h"
 #include "env-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "log.h"
 #include "parse-util.h"
 #include "string-util.h"
diff --git a/src/nspawn/meson.build b/src/nspawn/meson.build
new file mode 100644 (file)
index 0000000..b6ac600
--- /dev/null
@@ -0,0 +1,40 @@
+systemd_nspawn_sources = files('''
+        nspawn.c
+        nspawn-settings.c
+        nspawn-settings.h
+        nspawn-mount.c
+        nspawn-mount.h
+        nspawn-network.c
+        nspawn-network.h
+        nspawn-expose-ports.c
+        nspawn-expose-ports.h
+        nspawn-cgroup.c
+        nspawn-cgroup.h
+        nspawn-seccomp.c
+        nspawn-seccomp.h
+        nspawn-register.c
+        nspawn-register.h
+        nspawn-setuid.c
+        nspawn-setuid.h
+        nspawn-stub-pid1.c
+        nspawn-stub-pid1.h
+        nspawn-patch-uid.c
+        nspawn-patch-uid.h
+'''.split())
+
+nspawn_gperf_c = custom_target(
+        'nspawn-gperf.c',
+        input : 'nspawn-gperf.gperf',
+        output : 'nspawn-gperf.c',
+        command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@'])
+
+systemd_nspawn_sources += [nspawn_gperf_c]
+
+tests += [
+        [['src/nspawn/test-patch-uid.c',
+          'src/nspawn/nspawn-patch-uid.c',
+          'src/nspawn/nspawn-patch-uid.h'],
+         [libshared],
+         [libacl],
+         '', 'manual'],
+]
index b158023..fd565c0 100644 (file)
 #include <sys/mount.h>
 
 #include "alloc-util.h"
-#include "cgroup-util.h"
 #include "fd-util.h"
 #include "fileio.h"
 #include "mkdir.h"
+#include "mount-util.h"
 #include "nspawn-cgroup.h"
+#include "rm-rf.h"
 #include "string-util.h"
 #include "strv.h"
 #include "util.h"
 
-int chown_cgroup(pid_t pid, uid_t uid_shift) {
-        _cleanup_free_ char *path = NULL, *fs = NULL;
+static int chown_cgroup_path(const char *path, uid_t uid_shift) {
         _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);
+        fd = open(path, O_RDONLY|O_CLOEXEC|O_DIRECTORY);
         if (fd < 0)
-                return log_error_errno(errno, "Failed to open %s: %m", fs);
+                return -errno;
 
         FOREACH_STRING(fn,
                        ".",
@@ -58,23 +49,41 @@ int chown_cgroup(pid_t pid, uid_t uid_shift) {
                        "cgroup.subtree_control")
                 if (fchownat(fd, fn, uid_shift, uid_shift, 0) < 0)
                         log_full_errno(errno == ENOENT ? LOG_DEBUG :  LOG_WARNING, errno,
-                                       "Failed to chown() cgroup file %s, ignoring: %m", fn);
+                                       "Failed to chown \"%s/%s\", ignoring: %m", path, fn);
+
+        return 0;
+}
+
+int chown_cgroup(pid_t pid, uid_t uid_shift) {
+        _cleanup_free_ char *path = NULL, *fs = NULL;
+        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");
+
+        r = chown_cgroup_path(fs, uid_shift);
+        if (r < 0)
+                return log_error_errno(r, "Failed to chown() cgroup %s: %m", fs);
 
         return 0;
 }
 
-int sync_cgroup(pid_t pid, bool unified_requested) {
+int sync_cgroup(pid_t pid, CGroupUnified unified_requested, uid_t arg_uid_shift) {
         _cleanup_free_ char *cgroup = NULL;
         char tree[] = "/tmp/unifiedXXXXXX", pid_string[DECIMAL_STR_MAX(pid) + 1];
         bool undo_mount = false;
         const char *fn;
-        int unified, r;
+        int r, unified_controller;
 
-        unified = cg_unified();
-        if (unified < 0)
-                return log_error_errno(unified, "Failed to determine whether the unified hierarchy is used: %m");
-
-        if ((unified > 0) == unified_requested)
+        unified_controller = cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER);
+        if (unified_controller < 0)
+                return log_error_errno(unified_controller, "Failed to determine whether the systemd hierarchy is unified: %m");
+        if ((unified_controller > 0) == (unified_requested >= CGROUP_UNIFIED_SYSTEMD))
                 return 0;
 
         /* When the host uses the legacy cgroup setup, but the
@@ -90,37 +99,49 @@ int sync_cgroup(pid_t pid, bool unified_requested) {
         if (!mkdtemp(tree))
                 return log_error_errno(errno, "Failed to generate temporary mount point for unified hierarchy: %m");
 
-        if (unified)
-                r = mount("cgroup", tree, "cgroup", MS_NOSUID|MS_NOEXEC|MS_NODEV, "none,name=systemd,xattr");
+        if (unified_controller > 0)
+                r = mount_verbose(LOG_ERR, "cgroup", tree, "cgroup",
+                                  MS_NOSUID|MS_NOEXEC|MS_NODEV, "none,name=systemd,xattr");
         else
-                r = mount("cgroup", tree, "cgroup2", MS_NOSUID|MS_NOEXEC|MS_NODEV, NULL);
-        if (r < 0) {
-                r = log_error_errno(errno, "Failed to mount unified hierarchy: %m");
+                r = mount_verbose(LOG_ERR, "cgroup", tree, "cgroup2",
+                                  MS_NOSUID|MS_NOEXEC|MS_NODEV, NULL);
+        if (r < 0)
                 goto finish;
-        }
 
         undo_mount = true;
 
+        /* If nspawn dies abruptly the cgroup hierarchy created below
+         * its unit isn't cleaned up. So, let's remove it
+         * https://github.com/systemd/systemd/pull/4223#issuecomment-252519810 */
+        fn = strjoina(tree, cgroup);
+        (void) rm_rf(fn, REMOVE_ROOT|REMOVE_ONLY_DIRECTORIES);
+
         fn = strjoina(tree, cgroup, "/cgroup.procs");
         (void) mkdir_parents(fn, 0755);
 
         sprintf(pid_string, PID_FMT, pid);
         r = write_string_file(fn, pid_string, 0);
-        if (r < 0)
+        if (r < 0) {
                 log_error_errno(r, "Failed to move process: %m");
+                goto finish;
+        }
 
+        fn = strjoina(tree, cgroup);
+        r = chown_cgroup_path(fn, arg_uid_shift);
+        if (r < 0)
+                log_error_errno(r, "Failed to chown() cgroup %s: %m", fn);
 finish:
         if (undo_mount)
-                (void) umount(tree);
+                (void) umount_verbose(tree);
 
         (void) rmdir(tree);
         return r;
 }
 
-int create_subcgroup(pid_t pid, bool unified_requested) {
+int create_subcgroup(pid_t pid, CGroupUnified unified_requested) {
         _cleanup_free_ char *cgroup = NULL;
         const char *child;
-        int unified, r;
+        int r;
         CGroupMask supported;
 
         /* In the unified hierarchy inner nodes may only contain
@@ -129,13 +150,13 @@ int create_subcgroup(pid_t pid, bool unified_requested) {
          * did not create a scope unit for the container move us and
          * the container into two separate subcgroups. */
 
-        if (!unified_requested)
+        if (unified_requested == CGROUP_UNIFIED_NONE)
                 return 0;
 
-        unified = cg_unified();
-        if (unified < 0)
-                return log_error_errno(unified, "Failed to determine whether the unified hierarchy is used: %m");
-        if (unified == 0)
+        r = cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER);
+        if (r < 0)
+                return log_error_errno(r, "Failed to determine whether the systemd controller is unified: %m");
+        if (r == 0)
                 return 0;
 
         r = cg_mask_supported(&supported);
index 1ff35a2..fa4321a 100644 (file)
@@ -22,6 +22,8 @@
 #include <stdbool.h>
 #include <sys/types.h>
 
+#include "cgroup-util.h"
+
 int chown_cgroup(pid_t pid, uid_t uid_shift);
-int sync_cgroup(pid_t pid, bool unified_requested);
-int create_subcgroup(pid_t pid, bool unified_requested);
+int sync_cgroup(pid_t pid, CGroupUnified unified_requested, uid_t uid_shift);
+int create_subcgroup(pid_t pid, CGroupUnified unified_requested);
index 86124b8..bcaf0aa 100644 (file)
@@ -58,17 +58,17 @@ int expose_port_parse(ExposePort **l, const char *s) {
                 memcpy(v, e, split - e);
                 v[split - e] = 0;
 
-                r = safe_atou16(v, &host_port);
-                if (r < 0 || host_port <= 0)
+                r = parse_ip_port(v, &host_port);
+                if (r < 0)
                         return -EINVAL;
 
-                r = safe_atou16(split + 1, &container_port);
+                r = parse_ip_port(split + 1, &container_port);
         } else {
-                r = safe_atou16(e, &container_port);
+                r = parse_ip_port(e, &container_port);
                 host_port = container_port;
         }
 
-        if (r < 0 || container_port <= 0)
+        if (r < 0)
                 return -EINVAL;
 
         LIST_FOREACH(ports, p, *l)
index 3231a48..e5fdf63 100644 (file)
@@ -26,6 +26,7 @@ Exec.KillSignal,              config_parse_signal,        0, offsetof(Settings,
 Exec.Personality,             config_parse_personality,   0, offsetof(Settings, personality)
 Exec.MachineID,               config_parse_id128,         0, offsetof(Settings, machine_id)
 Exec.WorkingDirectory,        config_parse_path,          0, offsetof(Settings, working_directory)
+Exec.PivotRoot,               config_parse_pivot_root,    0, 0
 Exec.PrivateUsers,            config_parse_private_users, 0, 0
 Exec.NotifyReady,             config_parse_bool,          0, offsetof(Settings, notify_ready)
 Files.ReadOnly,               config_parse_tristate,      0, offsetof(Settings, read_only)
@@ -33,6 +34,8 @@ Files.Volatile,               config_parse_volatile_mode, 0, offsetof(Settings,
 Files.Bind,                   config_parse_bind,          0, 0
 Files.BindReadOnly,           config_parse_bind,          1, 0
 Files.TemporaryFileSystem,    config_parse_tmpfs,         0, 0
+Files.Overlay,                config_parse_overlay,       0, 0
+Files.OverlayReadOnly,        config_parse_overlay,       1, 0
 Files.PrivateUsersChown,      config_parse_tristate,      0, offsetof(Settings, userns_chown)
 Network.Private,              config_parse_tristate,      0, offsetof(Settings, private_network)
 Network.Interface,            config_parse_strv,          0, offsetof(Settings, network_interfaces)
index 85e2c94..ac72907 100644 (file)
@@ -21,8 +21,9 @@
 #include <linux/magic.h>
 
 #include "alloc-util.h"
-#include "cgroup-util.h"
 #include "escape.h"
+#include "fd-util.h"
+#include "fileio.h"
 #include "fs-util.h"
 #include "label.h"
 #include "mkdir.h"
@@ -46,7 +47,7 @@ CustomMount* custom_mount_add(CustomMount **l, unsigned *n, CustomMountType t) {
         assert(t >= 0);
         assert(t < _CUSTOM_MOUNT_TYPE_MAX);
 
-        c = realloc(*l, (*n + 1) * sizeof(CustomMount));
+        c = realloc_multiply(*l, (*n + 1), sizeof(CustomMount));
         if (!c)
                 return NULL;
 
@@ -74,13 +75,18 @@ void custom_mount_free_all(CustomMount *l, unsigned n) {
                         free(m->work_dir);
                 }
 
+                if (m->rm_rf_tmpdir) {
+                        (void) rm_rf(m->rm_rf_tmpdir, REMOVE_ROOT|REMOVE_PHYSICAL);
+                        free(m->rm_rf_tmpdir);
+                }
+
                 strv_free(m->lower);
         }
 
         free(l);
 }
 
-int custom_mount_compare(const void *a, const void *b) {
+static int custom_mount_compare(const void *a, const void *b) {
         const CustomMount *x = a, *y = b;
         int r;
 
@@ -96,6 +102,109 @@ int custom_mount_compare(const void *a, const void *b) {
         return 0;
 }
 
+static bool source_path_is_valid(const char *p) {
+        assert(p);
+
+        if (*p == '+')
+                p++;
+
+        return path_is_absolute(p);
+}
+
+static char *resolve_source_path(const char *dest, const char *source) {
+
+        if (!source)
+                return NULL;
+
+        if (source[0] == '+')
+                return prefix_root(dest, source + 1);
+
+        return strdup(source);
+}
+
+int custom_mount_prepare_all(const char *dest, CustomMount *l, unsigned n) {
+        unsigned i;
+        int r;
+
+        /* Prepare all custom mounts. This will make source we know all temporary directories. This is called in the
+         * parent process, so that we know the temporary directories to remove on exit before we fork off the
+         * children. */
+
+        assert(l || n == 0);
+
+        /* Order the custom mounts, and make sure we have a working directory */
+        qsort_safe(l, n, sizeof(CustomMount), custom_mount_compare);
+
+        for (i = 0; i < n; i++) {
+                CustomMount *m = l + i;
+
+                if (m->source) {
+                        char *s;
+
+                        s = resolve_source_path(dest, m->source);
+                        if (!s)
+                                return log_oom();
+
+                        free(m->source);
+                        m->source = s;
+                } else {
+                        /* No source specified? In that case, use a throw-away temporary directory in /var/tmp */
+
+                        m->rm_rf_tmpdir = strdup("/var/tmp/nspawn-temp-XXXXXX");
+                        if (!m->rm_rf_tmpdir)
+                                return log_oom();
+
+                        if (!mkdtemp(m->rm_rf_tmpdir)) {
+                                m->rm_rf_tmpdir = mfree(m->rm_rf_tmpdir);
+                                return log_error_errno(errno, "Failed to acquire temporary directory: %m");
+                        }
+
+                        m->source = strjoin(m->rm_rf_tmpdir, "/src");
+                        if (!m->source)
+                                return log_oom();
+
+                        if (mkdir(m->source, 0755) < 0)
+                                return log_error_errno(errno, "Failed to create %s: %m", m->source);
+                }
+
+                if (m->type == CUSTOM_MOUNT_OVERLAY) {
+                        char **j;
+
+                        STRV_FOREACH(j, m->lower) {
+                                char *s;
+
+                                s = resolve_source_path(dest, *j);
+                                if (!s)
+                                        return log_oom();
+
+                                free(*j);
+                                *j = s;
+                        }
+
+                        if (m->work_dir) {
+                                char *s;
+
+                                s = resolve_source_path(dest, m->work_dir);
+                                if (!s)
+                                        return log_oom();
+
+                                free(m->work_dir);
+                                m->work_dir = s;
+                        } else {
+                                assert(m->source);
+
+                                r = tempfn_random(m->source, NULL, &m->work_dir);
+                                if (r < 0)
+                                        return log_error_errno(r, "Failed to acquire working directory: %m");
+                        }
+
+                        (void) mkdir_label(m->work_dir, 0700);
+                }
+        }
+
+        return 0;
+}
+
 int bind_mount_parse(CustomMount **l, unsigned *n, const char *s, bool read_only) {
         _cleanup_free_ char *source = NULL, *destination = NULL, *opts = NULL;
         const char *p = s;
@@ -110,20 +219,20 @@ int bind_mount_parse(CustomMount **l, unsigned *n, const char *s, bool read_only
                 return r;
         if (r == 0)
                 return -EINVAL;
-
         if (r == 1) {
-                destination = strdup(source);
+                destination = strdup(source[0] == '+' ? source+1 : source);
                 if (!destination)
                         return -ENOMEM;
         }
-
         if (r == 2 && !isempty(p)) {
                 opts = strdup(p);
                 if (!opts)
                         return -ENOMEM;
         }
 
-        if (!path_is_absolute(source))
+        if (isempty(source))
+                source = NULL;
+        else if (!source_path_is_valid(source))
                 return -EINVAL;
 
         if (!path_is_absolute(destination))
@@ -131,7 +240,7 @@ int bind_mount_parse(CustomMount **l, unsigned *n, const char *s, bool read_only
 
         m = custom_mount_add(l, n, CUSTOM_MOUNT_BIND);
         if (!m)
-                return log_oom();
+                return -ENOMEM;
 
         m->source = source;
         m->destination = destination;
@@ -179,22 +288,87 @@ int tmpfs_mount_parse(CustomMount **l, unsigned *n, const char *s) {
         return 0;
 }
 
+int overlay_mount_parse(CustomMount **l, unsigned *n, const char *s, bool read_only) {
+        _cleanup_free_ char *upper = NULL, *destination = NULL;
+        _cleanup_strv_free_ char **lower = NULL;
+        CustomMount *m;
+        int k;
+
+        k = strv_split_extract(&lower, s, ":", EXTRACT_DONT_COALESCE_SEPARATORS);
+        if (k < 0)
+                return k;
+        if (k < 2)
+                return -EADDRNOTAVAIL;
+        if (k == 2) {
+                /* If two parameters are specified, the first one is the lower, the second one the upper directory. And
+                 * we'll also define the destination mount point the same as the upper. */
+
+                if (!source_path_is_valid(lower[0]) ||
+                    !source_path_is_valid(lower[1]))
+                        return -EINVAL;
+
+                upper = lower[1];
+                lower[1] = NULL;
+
+                destination = strdup(upper[0] == '+' ? upper+1 : upper); /* take the destination without "+" prefix */
+                if (!destination)
+                        return -ENOMEM;
+        } else {
+                char **i;
+
+                /* If more than two parameters are specified, the last one is the destination, the second to last one
+                 * the "upper", and all before that the "lower" directories. */
+
+                destination = lower[k - 1];
+                upper = lower[k - 2];
+                lower[k - 2] = NULL;
+
+                STRV_FOREACH(i, lower)
+                        if (!source_path_is_valid(*i))
+                                return -EINVAL;
+
+                /* If the upper directory is unspecified, then let's create it automatically as a throw-away directory
+                 * in /var/tmp */
+                if (isempty(upper))
+                        upper = NULL;
+                else if (!source_path_is_valid(upper))
+                        return -EINVAL;
+
+                if (!path_is_absolute(destination))
+                        return -EINVAL;
+        }
+
+        m = custom_mount_add(l, n, CUSTOM_MOUNT_OVERLAY);
+        if (!m)
+                return -ENOMEM;
+
+        m->destination = destination;
+        m->source = upper;
+        m->lower = lower;
+        m->read_only = read_only;
+
+        upper = destination = NULL;
+        lower = NULL;
+
+        return 0;
+}
+
 static int tmpfs_patch_options(
                 const char *options,
-                bool userns, uid_t uid_shift, uid_t uid_range,
+                bool userns,
+                uid_t uid_shift, uid_t uid_range,
+                bool patch_ids,
                 const char *selinux_apifs_context,
                 char **ret) {
 
         char *buf = NULL;
 
-        if (userns && uid_shift != 0) {
+        if ((userns && uid_shift != 0) || patch_ids) {
                 assert(uid_shift != UID_INVALID);
 
-                if (options)
-                        (void) asprintf(&buf, "%s,uid=" UID_FMT ",gid=" UID_FMT, options, uid_shift, uid_shift);
-                else
-                        (void) asprintf(&buf, "uid=" UID_FMT ",gid=" UID_FMT, uid_shift, uid_shift);
-                if (!buf)
+                if (asprintf(&buf, "%s%suid=" UID_FMT ",gid=" UID_FMT,
+                             options ?: "", options ? "," : "",
+                             uid_shift, uid_shift) < 0)
                         return -ENOMEM;
 
                 options = buf;
@@ -204,27 +378,30 @@ static int tmpfs_patch_options(
         if (selinux_apifs_context) {
                 char *t;
 
-                if (options)
-                        t = strjoin(options, ",context=\"", selinux_apifs_context, "\"", NULL);
-                else
-                        t = strjoin("context=\"", selinux_apifs_context, "\"", NULL);
-                if (!t) {
-                        free(buf);
+                t = strjoin(options ?: "", options ? "," : "",
+                            "context=\"", selinux_apifs_context, "\"");
+                free(buf);
+                if (!t)
                         return -ENOMEM;
-                }
 
-                free(buf);
                 buf = t;
         }
 #endif
 
+        if (!buf && options) {
+                buf = strdup(options);
+                if (!buf)
+                        return -ENOMEM;
+        }
         *ret = buf;
+
         return !!buf;
 }
 
-int mount_sysfs(const char *dest) {
+int mount_sysfs(const char *dest, MountSettingsMask mount_settings) {
         const char *full, *top, *x;
         int r;
+        unsigned long extra_flags = 0;
 
         top = prefix_roota(dest, "/sys");
         r = path_check_fstype(top, SYSFS_MAGIC);
@@ -241,8 +418,13 @@ int mount_sysfs(const char *dest) {
 
         (void) mkdir(full, 0755);
 
-        if (mount("sysfs", full, "sysfs", MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV, NULL) < 0)
-                return log_error_errno(errno, "Failed to mount sysfs to %s: %m", full);
+        if (mount_settings & MOUNT_APPLY_APIVFS_RO)
+                extra_flags |= MS_RDONLY;
+
+        r = mount_verbose(LOG_ERR, "sysfs", full, "sysfs",
+                          MS_NOSUID|MS_NOEXEC|MS_NODEV|extra_flags, NULL);
+        if (r < 0)
+                return r;
 
         FOREACH_STRING(x, "block", "bus", "class", "dev", "devices", "kernel") {
                 _cleanup_free_ char *from = NULL, *to = NULL;
@@ -257,31 +439,97 @@ int mount_sysfs(const char *dest) {
 
                 (void) mkdir(to, 0755);
 
-                if (mount(from, to, NULL, MS_BIND, NULL) < 0)
-                        return log_error_errno(errno, "Failed to mount /sys/%s into place: %m", x);
+                r = mount_verbose(LOG_ERR, from, to, NULL, MS_BIND, NULL);
+                if (r < 0)
+                        return r;
 
-                if (mount(NULL, to, NULL, MS_BIND|MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_REMOUNT, NULL) < 0)
-                        return log_error_errno(errno, "Failed to mount /sys/%s read-only: %m", x);
+                r = mount_verbose(LOG_ERR, NULL, to, NULL,
+                                  MS_BIND|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_REMOUNT|extra_flags, NULL);
+                if (r < 0)
+                        return r;
         }
 
-        if (umount(full) < 0)
-                return log_error_errno(errno, "Failed to unmount %s: %m", full);
+        r = umount_verbose(full);
+        if (r < 0)
+                return r;
 
         if (rmdir(full) < 0)
                 return log_error_errno(errno, "Failed to remove %s: %m", full);
 
         x = prefix_roota(top, "/fs/kdbus");
-        (void) mkdir(x, 0755);
+        (void) mkdir_p(x, 0755);
 
-        if (mount(NULL, top, NULL, MS_BIND|MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_REMOUNT, NULL) < 0)
-                return log_error_errno(errno, "Failed to make %s read-only: %m", top);
+        /* Create mountpoint for cgroups. Otherwise we are not allowed since we
+         * remount /sys read-only.
+         */
+        if (cg_ns_supported()) {
+                x = prefix_roota(top, "/fs/cgroup");
+                (void) mkdir_p(x, 0755);
+        }
+
+        return mount_verbose(LOG_ERR, NULL, top, NULL,
+                             MS_BIND|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_REMOUNT|extra_flags, NULL);
+}
+
+static int mkdir_userns(const char *path, mode_t mode, MountSettingsMask mask, uid_t uid_shift) {
+        int r;
+
+        assert(path);
+
+        r = mkdir(path, mode);
+        if (r < 0 && errno != EEXIST)
+                return -errno;
+
+        if ((mask & MOUNT_USE_USERNS) == 0)
+                return 0;
+
+        if (mask & MOUNT_IN_USERNS)
+                return 0;
+
+        r = lchown(path, uid_shift, uid_shift);
+        if (r < 0)
+                return -errno;
 
         return 0;
 }
 
+static int mkdir_userns_p(const char *prefix, const char *path, mode_t mode, MountSettingsMask mask, uid_t uid_shift) {
+        const char *p, *e;
+        int r;
+
+        assert(path);
+
+        if (prefix && !path_startswith(path, prefix))
+                return -ENOTDIR;
+
+        /* create every parent directory in the path, except the last component */
+        p = path + strspn(path, "/");
+        for (;;) {
+                char t[strlen(path) + 1];
+
+                e = p + strcspn(p, "/");
+                p = e + strspn(e, "/");
+
+                /* Is this the last component? If so, then we're done */
+                if (*p == 0)
+                        break;
+
+                memcpy(t, path, e - path);
+                t[e-path] = 0;
+
+                if (prefix && path_startswith(prefix, t))
+                        continue;
+
+                r = mkdir_userns(t, mode, mask, uid_shift);
+                if (r < 0)
+                        return r;
+        }
+
+        return mkdir_userns(path, mode, mask, uid_shift);
+}
+
 int mount_all(const char *dest,
-              bool use_userns, bool in_userns,
-              bool use_netns,
+              MountSettingsMask mount_settings,
               uid_t uid_shift, uid_t uid_range,
               const char *selinux_apifs_context) {
 
@@ -291,46 +539,59 @@ int mount_all(const char *dest,
                 const char *type;
                 const char *options;
                 unsigned long flags;
-                bool fatal;
-                bool in_userns;
-                bool use_netns;
+                MountSettingsMask mount_settings;
         } MountPoint;
 
         static const MountPoint mount_table[] = {
-                { "proc",            "/proc",           "proc",  NULL,        MS_NOSUID|MS_NOEXEC|MS_NODEV,                              true,  true,  false },
-                { "/proc/sys",       "/proc/sys",       NULL,    NULL,        MS_BIND,                                                   true,  true,  false },   /* Bind mount first ...*/
-                { "/proc/sys/net",   "/proc/sys/net",   NULL,    NULL,        MS_BIND,                                                   true,  true,  true  },   /* (except for this) */
-                { NULL,              "/proc/sys",       NULL,    NULL,        MS_BIND|MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_REMOUNT, true,  true,  false },   /* ... then, make it r/o */
-                { "tmpfs",           "/sys",            "tmpfs", "mode=755",  MS_NOSUID|MS_NOEXEC|MS_NODEV,                              true,  false, true  },
-                { "sysfs",           "/sys",            "sysfs", NULL,        MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV,                    true,  false, false },
-                { "tmpfs",           "/dev",            "tmpfs", "mode=755",  MS_NOSUID|MS_STRICTATIME,                                  true,  false, false },
-                { "tmpfs",           "/dev/shm",        "tmpfs", "mode=1777", MS_NOSUID|MS_NODEV|MS_STRICTATIME,                         true,  false, false },
-                { "tmpfs",           "/run",            "tmpfs", "mode=755",  MS_NOSUID|MS_NODEV|MS_STRICTATIME,                         true,  false, false },
-                { "tmpfs",           "/tmp",            "tmpfs", "mode=1777", MS_STRICTATIME,                                            true,  false, false },
+                /* inner child mounts */
+                { "proc",                "/proc",               "proc",  NULL,        MS_NOSUID|MS_NOEXEC|MS_NODEV,                              MOUNT_FATAL|MOUNT_IN_USERNS },
+                { "/proc/sys",           "/proc/sys",           NULL,    NULL,        MS_BIND,                                                   MOUNT_FATAL|MOUNT_IN_USERNS|MOUNT_APPLY_APIVFS_RO },                          /* Bind mount first ... */
+                { "/proc/sys/net",       "/proc/sys/net",       NULL,    NULL,        MS_BIND,                                                   MOUNT_FATAL|MOUNT_IN_USERNS|MOUNT_APPLY_APIVFS_RO|MOUNT_APPLY_APIVFS_NETNS }, /* (except for this) */
+                { NULL,                  "/proc/sys",           NULL,    NULL,        MS_BIND|MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_REMOUNT, MOUNT_FATAL|MOUNT_IN_USERNS|MOUNT_APPLY_APIVFS_RO },                          /* ... then, make it r/o */
+                { "/proc/sysrq-trigger", "/proc/sysrq-trigger", NULL,    NULL,        MS_BIND,                                                               MOUNT_IN_USERNS|MOUNT_APPLY_APIVFS_RO },                          /* Bind mount first ... */
+                { NULL,                  "/proc/sysrq-trigger", NULL,    NULL,        MS_BIND|MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_REMOUNT,             MOUNT_IN_USERNS|MOUNT_APPLY_APIVFS_RO },                          /* ... then, make it r/o */
+
+                /* outer child mounts */
+                { "tmpfs",               "/tmp",                "tmpfs", "mode=1777", MS_NOSUID|MS_NODEV|MS_STRICTATIME,                                            MOUNT_FATAL },
+                { "tmpfs",               "/sys",                "tmpfs", "mode=755",  MS_NOSUID|MS_NOEXEC|MS_NODEV,                              MOUNT_FATAL|MOUNT_APPLY_APIVFS_NETNS },
+                { "sysfs",               "/sys",                "sysfs", NULL,        MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV,                    MOUNT_FATAL|MOUNT_APPLY_APIVFS_RO },    /* skipped if above was mounted */
+                { "sysfs",               "/sys",                "sysfs", NULL,                  MS_NOSUID|MS_NOEXEC|MS_NODEV,                    MOUNT_FATAL },                          /* skipped if above was mounted */
+
+                { "tmpfs",               "/dev",                "tmpfs", "mode=755",  MS_NOSUID|MS_STRICTATIME,                                  MOUNT_FATAL },
+                { "tmpfs",               "/dev/shm",            "tmpfs", "mode=1777", MS_NOSUID|MS_NODEV|MS_STRICTATIME,                         MOUNT_FATAL },
+                { "tmpfs",               "/run",                "tmpfs", "mode=755",  MS_NOSUID|MS_NODEV|MS_STRICTATIME,                         MOUNT_FATAL },
 #ifdef HAVE_SELINUX
-                { "/sys/fs/selinux", "/sys/fs/selinux", NULL,     NULL,       MS_BIND,                                                   false, false, false },  /* Bind mount first */
-                { NULL,              "/sys/fs/selinux", NULL,     NULL,       MS_BIND|MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_REMOUNT, false, false, false },  /* Then, make it r/o */
+                { "/sys/fs/selinux",     "/sys/fs/selinux",     NULL,     NULL,       MS_BIND,                                                   0 },  /* Bind mount first */
+                { NULL,                  "/sys/fs/selinux",     NULL,     NULL,       MS_BIND|MS_RDONLY|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_REMOUNT, 0 },  /* Then, make it r/o */
 #endif
         };
 
         unsigned k;
         int r;
+        bool use_userns = (mount_settings & MOUNT_USE_USERNS);
+        bool netns = (mount_settings & MOUNT_APPLY_APIVFS_NETNS);
+        bool ro = (mount_settings & MOUNT_APPLY_APIVFS_RO);
+        bool in_userns = (mount_settings & MOUNT_IN_USERNS);
 
         for (k = 0; k < ELEMENTSOF(mount_table); k++) {
                 _cleanup_free_ char *where = NULL, *options = NULL;
                 const char *o;
+                bool fatal = (mount_table[k].mount_settings & MOUNT_FATAL);
 
-                if (in_userns != mount_table[k].in_userns)
+                if (in_userns != (bool)(mount_table[k].mount_settings & MOUNT_IN_USERNS))
                         continue;
 
-                if (!use_netns && mount_table[k].use_netns)
+                if (!netns && (bool)(mount_table[k].mount_settings & MOUNT_APPLY_APIVFS_NETNS))
                         continue;
 
-                where = prefix_root(dest, mount_table[k].where);
-                if (!where)
-                        return log_oom();
+                if (!ro && (bool)(mount_table[k].mount_settings & MOUNT_APPLY_APIVFS_RO))
+                        continue;
 
-                r = path_is_mount_point(where, AT_SYMLINK_FOLLOW);
+                r = chase_symlinks(mount_table[k].where, dest, CHASE_NONEXISTENT|CHASE_PREFIX_ROOT, &where);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to resolve %s/%s: %m", dest, mount_table[k].where);
+
+                r = path_is_mount_point(where, NULL, 0);
                 if (r < 0 && r != -ENOENT)
                         return log_error_errno(r, "Failed to detect whether %s is a mount point: %m", where);
 
@@ -338,9 +599,9 @@ int mount_all(const char *dest,
                 if (mount_table[k].what && r > 0)
                         continue;
 
-                r = mkdir_p(where, 0755);
-                if (r < 0) {
-                        if (mount_table[k].fatal)
+                r = mkdir_userns_p(dest, where, 0755, mount_settings, uid_shift);
+                if (r < 0 && r != -EEXIST) {
+                        if (fatal)
                                 return log_error_errno(r, "Failed to create directory %s: %m", where);
 
                         log_debug_errno(r, "Failed to create directory %s: %m", where);
@@ -349,24 +610,24 @@ int mount_all(const char *dest,
 
                 o = mount_table[k].options;
                 if (streq_ptr(mount_table[k].type, "tmpfs")) {
-                        r = tmpfs_patch_options(o, use_userns, uid_shift, uid_range, selinux_apifs_context, &options);
+                        if (in_userns)
+                                r = tmpfs_patch_options(o, use_userns, 0, uid_range, true, selinux_apifs_context, &options);
+                        else
+                                r = tmpfs_patch_options(o, use_userns, uid_shift, uid_range, false, selinux_apifs_context, &options);
                         if (r < 0)
                                 return log_oom();
                         if (r > 0)
                                 o = options;
                 }
 
-                if (mount(mount_table[k].what,
-                          where,
-                          mount_table[k].type,
-                          mount_table[k].flags,
-                          o) < 0) {
-
-                        if (mount_table[k].fatal)
-                                return log_error_errno(errno, "mount(%s) failed: %m", where);
-
-                        log_warning_errno(errno, "mount(%s) failed, ignoring: %m", where);
-                }
+                r = mount_verbose(fatal ? LOG_ERR : LOG_DEBUG,
+                                  mount_table[k].what,
+                                  where,
+                                  mount_table[k].type,
+                                  mount_table[k].flags,
+                                  o);
+                if (r < 0 && fatal)
+                        return r;
         }
 
         return 0;
@@ -376,12 +637,14 @@ static int parse_mount_bind_options(const char *options, unsigned long *mount_fl
         const char *p = options;
         unsigned long flags = *mount_flags;
         char *opts = NULL;
+        int r;
 
         assert(options);
 
         for (;;) {
                 _cleanup_free_ char *word = NULL;
-                int r = extract_first_word(&p, &word, ",", 0);
+
+                r = extract_first_word(&p, &word, ",", 0);
                 if (r < 0)
                         return log_error_errno(r, "Failed to extract mount option: %m");
                 if (r == 0)
@@ -405,12 +668,13 @@ static int parse_mount_bind_options(const char *options, unsigned long *mount_fl
 }
 
 static int mount_bind(const char *dest, CustomMount *m) {
-        struct stat source_st, dest_st;
-        const char *where;
+
+        _cleanup_free_ char *mount_opts = NULL, *where = NULL;
         unsigned long mount_flags = MS_BIND | MS_REC;
-        _cleanup_free_ char *mount_opts = NULL;
+        struct stat source_st, dest_st;
         int r;
 
+        assert(dest);
         assert(m);
 
         if (m->options) {
@@ -422,9 +686,14 @@ static int mount_bind(const char *dest, CustomMount *m) {
         if (stat(m->source, &source_st) < 0)
                 return log_error_errno(errno, "Failed to stat %s: %m", m->source);
 
-        where = prefix_roota(dest, m->destination);
+        r = chase_symlinks(m->destination, dest, CHASE_PREFIX_ROOT|CHASE_NONEXISTENT, &where);
+        if (r < 0)
+                return log_error_errno(r, "Failed to resolve %s/%s: %m", dest, m->destination);
+        if (r > 0) { /* Path exists already? */
+
+                if (stat(where, &dest_st) < 0)
+                        return log_error_errno(errno, "Failed to stat %s: %m", where);
 
-        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;
@@ -435,7 +704,7 @@ static int mount_bind(const char *dest, CustomMount *m) {
                         return -EINVAL;
                 }
 
-        } else if (errno == ENOENT) {
+        } else { /* Path doesn't exist yet? */
                 r = mkdir_parents_label(where, 0755);
                 if (r < 0)
                         return log_error_errno(r, "Failed to make parents of %s: %m", where);
@@ -451,15 +720,14 @@ static int mount_bind(const char *dest, CustomMount *m) {
                 if (r < 0)
                         return log_error_errno(r, "Failed to create mount point %s: %m", where);
 
-        } else {
-                return log_error_errno(errno, "Failed to stat %s: %m", where);
         }
 
-        if (mount(m->source, where, NULL, mount_flags, mount_opts) < 0)
-                return log_error_errno(errno, "mount(%s) failed: %m", where);
+        r = mount_verbose(LOG_ERR, m->source, where, NULL, mount_flags, mount_opts);
+        if (r < 0)
+                return r;
 
         if (m->read_only) {
-                r = bind_remount_recursive(where, true);
+                r = bind_remount_recursive(where, true, NULL);
                 if (r < 0)
                         return log_error_errno(r, "Read-only bind mount failed: %m");
         }
@@ -473,31 +741,31 @@ static int mount_tmpfs(
                 bool userns, uid_t uid_shift, uid_t uid_range,
                 const char *selinux_apifs_context) {
 
-        const char *where, *options;
-        _cleanup_free_ char *buf = NULL;
+        const char *options;
+        _cleanup_free_ char *buf = NULL, *where = NULL;
         int r;
 
         assert(dest);
         assert(m);
 
-        where = prefix_roota(dest, m->destination);
-
-        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);
+        r = chase_symlinks(m->destination, dest, CHASE_PREFIX_ROOT|CHASE_NONEXISTENT, &where);
+        if (r < 0)
+                return log_error_errno(r, "Failed to resolve %s/%s: %m", dest, m->destination);
+        if (r == 0) { /* Doesn't exist yet? */
+                r = mkdir_p_label(where, 0755);
+                if (r < 0)
+                        return log_error_errno(r, "Creating mount point for tmpfs %s failed: %m", where);
+        }
 
-        r = tmpfs_patch_options(m->options, userns, uid_shift, uid_range, selinux_apifs_context, &buf);
+        r = tmpfs_patch_options(m->options, userns, uid_shift, uid_range, false, selinux_apifs_context, &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;
+        return mount_verbose(LOG_ERR, "tmpfs", where, "tmpfs", MS_NODEV|MS_STRICTATIME, options);
 }
 
-static char *joined_and_escaped_lower_dirs(char * const *lower) {
+static char *joined_and_escaped_lower_dirs(char **lower) {
         _cleanup_strv_free_ char **sv = NULL;
 
         sv = strv_copy(lower);
@@ -513,18 +781,22 @@ static char *joined_and_escaped_lower_dirs(char * const *lower) {
 }
 
 static int mount_overlay(const char *dest, CustomMount *m) {
-        _cleanup_free_ char *lower = NULL;
-        const char *where, *options;
+
+        _cleanup_free_ char *lower = NULL, *where = NULL, *escaped_source = NULL;
+        const char *options;
         int r;
 
         assert(dest);
         assert(m);
 
-        where = prefix_roota(dest, m->destination);
-
-        r = mkdir_label(where, 0755);
-        if (r < 0 && r != -EEXIST)
-                return log_error_errno(r, "Creating mount point for overlay %s failed: %m", where);
+        r = chase_symlinks(m->destination, dest, CHASE_PREFIX_ROOT|CHASE_NONEXISTENT, &where);
+        if (r < 0)
+                return log_error_errno(r, "Failed to resolve %s/%s: %m", dest, m->destination);
+        if (r == 0) { /* Doesn't exist yet? */
+                r = mkdir_label(where, 0755);
+                if (r < 0)
+                        return log_error_errno(r, "Creating mount point for overlay %s failed: %m", where);
+        }
 
         (void) mkdir_p_label(m->source, 0755);
 
@@ -532,23 +804,15 @@ static int mount_overlay(const char *dest, CustomMount *m) {
         if (!lower)
                 return log_oom();
 
-        if (m->read_only) {
-                _cleanup_free_ char *escaped_source = NULL;
-
-                escaped_source = shell_escape(m->source, ",:");
-                if (!escaped_source)
-                        return log_oom();
+        escaped_source = shell_escape(m->source, ",:");
+        if (!escaped_source)
+                return log_oom();
 
+        if (m->read_only)
                 options = strjoina("lowerdir=", escaped_source, ":", lower);
-        } else {
-                _cleanup_free_ char *escaped_source = NULL, *escaped_work_dir = NULL;
-
-                assert(m->work_dir);
-                (void) mkdir_label(m->work_dir, 0700);
+        else {
+                _cleanup_free_ char *escaped_work_dir = NULL;
 
-                escaped_source = shell_escape(m->source, ",:");
-                if (!escaped_source)
-                        return log_oom();
                 escaped_work_dir = shell_escape(m->work_dir, ",:");
                 if (!escaped_work_dir)
                         return log_oom();
@@ -556,10 +820,7 @@ static int mount_overlay(const char *dest, CustomMount *m) {
                 options = strjoina("lowerdir=", lower, ",upperdir=", escaped_source, ",workdir=", escaped_work_dir);
         }
 
-        if (mount("overlay", where, "overlay", m->read_only ? MS_RDONLY : 0, options) < 0)
-                return log_error_errno(errno, "overlay mount to %s failed: %m", where);
-
-        return 0;
+        return mount_verbose(LOG_ERR, "overlay", where, "overlay", m->read_only ? MS_RDONLY : 0, options);
 }
 
 int mount_custom(
@@ -601,13 +862,61 @@ int mount_custom(
         return 0;
 }
 
-static int mount_legacy_cgroup_hierarchy(const char *dest, const char *controller, const char *hierarchy, bool read_only) {
-        char *to;
+/* Retrieve existing subsystems. This function is called in a new cgroup
+ * namespace.
+ */
+static int get_controllers(Set *subsystems) {
+        _cleanup_fclose_ FILE *f = NULL;
+        char line[LINE_MAX];
+
+        assert(subsystems);
+
+        f = fopen("/proc/self/cgroup", "re");
+        if (!f)
+                return errno == ENOENT ? -ESRCH : -errno;
+
+        FOREACH_LINE(line, f, return -errno) {
+                int r;
+                char *e, *l, *p;
+
+                l = strchr(line, ':');
+                if (!l)
+                        continue;
+
+                l++;
+                e = strchr(l, ':');
+                if (!e)
+                        continue;
+
+                *e = 0;
+
+                if (STR_IN_SET(l, "", "name=systemd", "name=unified"))
+                        continue;
+
+                p = strdup(l);
+                if (!p)
+                        return -ENOMEM;
+
+                r = set_consume(subsystems, p);
+                if (r < 0)
+                        return r;
+        }
+
+        return 0;
+}
+
+static int mount_legacy_cgroup_hierarchy(
+                const char *dest,
+                const char *controller,
+                const char *hierarchy,
+                bool read_only) {
+
+        const char *to, *fstype, *opts;
         int r;
 
         to = strjoina(strempty(dest), "/sys/fs/cgroup/", hierarchy);
 
-        r = path_is_mount_point(to, 0);
+        r = path_is_mount_point(to, dest, 0);
         if (r < 0 && r != -ENOENT)
                 return log_error_errno(r, "Failed to determine if %s is mounted already: %m", to);
         if (r > 0)
@@ -617,21 +926,150 @@ static int mount_legacy_cgroup_hierarchy(const char *dest, const char *controlle
 
         /* The superblock mount options of the mount point need to be
          * identical to the hosts', and hence writable... */
-        if (mount("cgroup", to, "cgroup", MS_NOSUID|MS_NOEXEC|MS_NODEV, controller) < 0)
-                return log_error_errno(errno, "Failed to mount to %s: %m", to);
+        if (streq(controller, SYSTEMD_CGROUP_CONTROLLER_HYBRID)) {
+                fstype = "cgroup2";
+                opts = NULL;
+        } else if (streq(controller, SYSTEMD_CGROUP_CONTROLLER_LEGACY)) {
+                fstype = "cgroup";
+                opts = "none,name=systemd,xattr";
+        } else {
+                fstype = "cgroup";
+                opts = controller;
+        }
 
-        /* ... hence let's only make the bind mount read-only, not the
-         * superblock. */
+        r = mount_verbose(LOG_ERR, "cgroup", to, fstype, MS_NOSUID|MS_NOEXEC|MS_NODEV, opts);
+        if (r < 0)
+                return r;
+
+        /* ... hence let's only make the bind mount read-only, not the superblock. */
         if (read_only) {
-                if (mount(NULL, to, NULL, MS_BIND|MS_REMOUNT|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_RDONLY, NULL) < 0)
-                        return log_error_errno(errno, "Failed to remount %s read-only: %m", to);
+                r = mount_verbose(LOG_ERR, NULL, to, NULL,
+                                  MS_BIND|MS_REMOUNT|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_RDONLY, NULL);
+                if (r < 0)
+                        return r;
         }
+
         return 1;
 }
 
-static int mount_legacy_cgroups(
+/* Mount a legacy cgroup hierarchy when cgroup namespaces are supported. */
+static int mount_legacy_cgns_supported(
                 const char *dest,
-                bool userns, uid_t uid_shift, uid_t uid_range,
+                CGroupUnified unified_requested,
+                bool userns,
+                uid_t uid_shift,
+                uid_t uid_range,
+                const char *selinux_apifs_context) {
+
+        _cleanup_set_free_free_ Set *controllers = NULL;
+        const char *cgroup_root = "/sys/fs/cgroup", *c;
+        int r;
+
+        (void) mkdir_p(cgroup_root, 0755);
+
+        /* Mount a tmpfs to /sys/fs/cgroup if it's not mounted there yet. */
+        r = path_is_mount_point(cgroup_root, dest, AT_SYMLINK_FOLLOW);
+        if (r < 0)
+                return log_error_errno(r, "Failed to determine if /sys/fs/cgroup is already mounted: %m");
+        if (r == 0) {
+                _cleanup_free_ char *options = NULL;
+
+                /* When cgroup namespaces are enabled and user namespaces are
+                 * used then the mount of the cgroupfs is done *inside* the new
+                 * user namespace. We're root in the new user namespace and the
+                 * kernel will happily translate our uid/gid to the correct
+                 * uid/gid as seen from e.g. /proc/1/mountinfo. So we simply
+                 * pass uid 0 and not uid_shift to tmpfs_patch_options().
+                 */
+                r = tmpfs_patch_options("mode=755", userns, 0, uid_range, true, selinux_apifs_context, &options);
+                if (r < 0)
+                        return log_oom();
+
+                r = mount_verbose(LOG_ERR, "tmpfs", cgroup_root, "tmpfs",
+                                  MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME, options);
+                if (r < 0)
+                        return r;
+        }
+
+        r = cg_all_unified();
+        if (r < 0)
+                return r;
+        if (r > 0)
+                goto skip_controllers;
+
+        controllers = set_new(&string_hash_ops);
+        if (!controllers)
+                return log_oom();
+
+        r = get_controllers(controllers);
+        if (r < 0)
+                return log_error_errno(r, "Failed to determine cgroup controllers: %m");
+
+        for (;;) {
+                _cleanup_free_ const char *controller = NULL;
+
+                controller = set_steal_first(controllers);
+                if (!controller)
+                        break;
+
+                r = mount_legacy_cgroup_hierarchy("", controller, controller, !userns);
+                if (r < 0)
+                        return r;
+
+                /* When multiple hierarchies are co-mounted, make their
+                 * constituting individual hierarchies a symlink to the
+                 * co-mount.
+                 */
+                c = controller;
+                for (;;) {
+                        _cleanup_free_ char *target = NULL, *tok = NULL;
+
+                        r = extract_first_word(&c, &tok, ",", 0);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to extract co-mounted cgroup controller: %m");
+                        if (r == 0)
+                                break;
+
+                        target = prefix_root("/sys/fs/cgroup", tok);
+                        if (!target)
+                                return log_oom();
+
+                        if (streq(controller, tok))
+                                break;
+
+                        r = symlink_idempotent(controller, target);
+                        if (r == -EINVAL)
+                                return log_error_errno(r, "Invalid existing symlink for combined hierarchy: %m");
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to create symlink for combined hierarchy: %m");
+                }
+        }
+
+skip_controllers:
+        if (unified_requested >= CGROUP_UNIFIED_SYSTEMD) {
+                r = mount_legacy_cgroup_hierarchy("", SYSTEMD_CGROUP_CONTROLLER_HYBRID, "unified", false);
+                if (r < 0)
+                        return r;
+        }
+
+        r = mount_legacy_cgroup_hierarchy("", SYSTEMD_CGROUP_CONTROLLER_LEGACY, "systemd", false);
+        if (r < 0)
+                return r;
+
+        if (!userns)
+                return mount_verbose(LOG_ERR, NULL, cgroup_root, NULL,
+                                     MS_REMOUNT|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME|MS_RDONLY, "mode=755");
+
+        return 0;
+}
+
+/* Mount legacy cgroup hierarchy when cgroup namespaces are unsupported. */
+static int mount_legacy_cgns_unsupported(
+                const char *dest,
+                CGroupUnified unified_requested,
+                bool userns,
+                uid_t uid_shift,
+                uid_t uid_range,
                 const char *selinux_apifs_context) {
 
         _cleanup_set_free_free_ Set *controllers = NULL;
@@ -643,21 +1081,26 @@ static int mount_legacy_cgroups(
         (void) mkdir_p(cgroup_root, 0755);
 
         /* Mount a tmpfs to /sys/fs/cgroup if it's not mounted there yet. */
-        r = path_is_mount_point(cgroup_root, AT_SYMLINK_FOLLOW);
+        r = path_is_mount_point(cgroup_root, dest, AT_SYMLINK_FOLLOW);
         if (r < 0)
                 return log_error_errno(r, "Failed to determine if /sys/fs/cgroup is already mounted: %m");
         if (r == 0) {
                 _cleanup_free_ char *options = NULL;
 
-                r = tmpfs_patch_options("mode=755", userns, uid_shift, uid_range, selinux_apifs_context, &options);
+                r = tmpfs_patch_options("mode=755", userns, uid_shift, uid_range, false, selinux_apifs_context, &options);
                 if (r < 0)
                         return log_oom();
 
-                if (mount("tmpfs", cgroup_root, "tmpfs", MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME, options) < 0)
-                        return log_error_errno(errno, "Failed to mount /sys/fs/cgroup: %m");
+                r = mount_verbose(LOG_ERR, "tmpfs", cgroup_root, "tmpfs",
+                                  MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME, options);
+                if (r < 0)
+                        return r;
         }
 
-        if (cg_unified() > 0)
+        r = cg_all_unified();
+        if (r < 0)
+                return r;
+        if (r > 0)
                 goto skip_controllers;
 
         controllers = set_new(&string_hash_ops);
@@ -708,24 +1151,26 @@ static int mount_legacy_cgroups(
                                 return r;
 
                         r = symlink_idempotent(combined, target);
-                        if (r == -EINVAL) {
-                                log_error("Invalid existing symlink for combined hierarchy");
-                                return r;
-                        }
+                        if (r == -EINVAL)
+                                return log_error_errno(r, "Invalid existing symlink for combined hierarchy: %m");
                         if (r < 0)
                                 return log_error_errno(r, "Failed to create symlink for combined hierarchy: %m");
                 }
         }
 
 skip_controllers:
-        r = mount_legacy_cgroup_hierarchy(dest, "none,name=systemd,xattr", "systemd", false);
+        if (unified_requested >= CGROUP_UNIFIED_SYSTEMD) {
+                r = mount_legacy_cgroup_hierarchy(dest, SYSTEMD_CGROUP_CONTROLLER_HYBRID, "unified", false);
+                if (r < 0)
+                        return r;
+        }
+
+        r = mount_legacy_cgroup_hierarchy(dest, SYSTEMD_CGROUP_CONTROLLER_LEGACY, "systemd", false);
         if (r < 0)
                 return r;
 
-        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;
+        return mount_verbose(LOG_ERR, NULL, cgroup_root, NULL,
+                             MS_REMOUNT|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_STRICTATIME|MS_RDONLY, "mode=755");
 }
 
 static int mount_unified_cgroups(const char *dest) {
@@ -738,7 +1183,7 @@ static int mount_unified_cgroups(const char *dest) {
 
         (void) mkdir_p(p, 0755);
 
-        r = path_is_mount_point(p, AT_SYMLINK_FOLLOW);
+        r = path_is_mount_point(p, dest, AT_SYMLINK_FOLLOW);
         if (r < 0)
                 return log_error_errno(r, "Failed to determine if %s is mounted already: %m", p);
         if (r > 0) {
@@ -752,30 +1197,45 @@ static int mount_unified_cgroups(const char *dest) {
                 return -EINVAL;
         }
 
-        if (mount("cgroup", p, "cgroup2", MS_NOSUID|MS_NOEXEC|MS_NODEV, NULL) < 0)
-                return log_error_errno(errno, "Failed to mount unified cgroup hierarchy to %s: %m", p);
-
-        return 0;
+        return mount_verbose(LOG_ERR, "cgroup", p, "cgroup2", MS_NOSUID|MS_NOEXEC|MS_NODEV, NULL);
 }
 
 int mount_cgroups(
                 const char *dest,
-                bool unified_requested,
-                bool userns, uid_t uid_shift, uid_t uid_range,
-                const char *selinux_apifs_context) {
+                CGroupUnified unified_requested,
+                bool userns,
+                uid_t uid_shift,
+                uid_t uid_range,
+                const char *selinux_apifs_context,
+                bool use_cgns) {
 
-        if (unified_requested)
+        if (unified_requested >= CGROUP_UNIFIED_ALL)
                 return mount_unified_cgroups(dest);
-        else
-                return mount_legacy_cgroups(dest, userns, uid_shift, uid_range, selinux_apifs_context);
+        else if (use_cgns)
+                return mount_legacy_cgns_supported(dest, unified_requested, userns, uid_shift, uid_range, selinux_apifs_context);
+
+        return mount_legacy_cgns_unsupported(dest, unified_requested, userns, uid_shift, uid_range, selinux_apifs_context);
+}
+
+static int mount_systemd_cgroup_writable_one(const char *systemd_own, const char *systemd_root)
+{
+        int r;
+
+        /* Make our own cgroup a (writable) bind mount */
+        r = mount_verbose(LOG_ERR, systemd_own, systemd_own,  NULL, MS_BIND, NULL);
+        if (r < 0)
+                return r;
+
+        /* And then remount the systemd cgroup root read-only */
+        return mount_verbose(LOG_ERR, NULL, systemd_root, NULL,
+                             MS_BIND|MS_REMOUNT|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_RDONLY, NULL);
 }
 
 int mount_systemd_cgroup_writable(
                 const char *dest,
-                bool unified_requested) {
+                CGroupUnified unified_requested) {
 
         _cleanup_free_ char *own_cgroup_path = NULL;
-        const char *systemd_root, *systemd_own;
         int r;
 
         assert(dest);
@@ -788,23 +1248,19 @@ int mount_systemd_cgroup_writable(
         if (path_equal(own_cgroup_path, "/"))
                 return 0;
 
-        if (unified_requested) {
-                systemd_own = strjoina(dest, "/sys/fs/cgroup", own_cgroup_path);
-                systemd_root = prefix_roota(dest, "/sys/fs/cgroup");
-        } else {
-                systemd_own = strjoina(dest, "/sys/fs/cgroup/systemd", own_cgroup_path);
-                systemd_root = prefix_roota(dest, "/sys/fs/cgroup/systemd");
-        }
-
-        /* Make our own cgroup a (writable) bind mount */
-        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);
+        if (unified_requested >= CGROUP_UNIFIED_ALL)
+                return mount_systemd_cgroup_writable_one(strjoina(dest, "/sys/fs/cgroup", own_cgroup_path),
+                                                         prefix_roota(dest, "/sys/fs/cgroup"));
 
-        /* And then remount the systemd cgroup root read-only */
-        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");
+        if (unified_requested >= CGROUP_UNIFIED_SYSTEMD) {
+                r = mount_systemd_cgroup_writable_one(strjoina(dest, "/sys/fs/cgroup/unified", own_cgroup_path),
+                                                      prefix_roota(dest, "/sys/fs/cgroup/unified"));
+                if (r < 0)
+                        return r;
+        }
 
-        return 0;
+        return mount_systemd_cgroup_writable_one(strjoina(dest, "/sys/fs/cgroup/systemd", own_cgroup_path),
+                                                 prefix_roota(dest, "/sys/fs/cgroup/systemd"));
 }
 
 int setup_volatile_state(
@@ -825,7 +1281,7 @@ int setup_volatile_state(
         /* --volatile=state means we simply overmount /var
            with a tmpfs, and the rest read-only. */
 
-        r = bind_remount_recursive(directory, true);
+        r = bind_remount_recursive(directory, true, NULL);
         if (r < 0)
                 return log_error_errno(r, "Failed to remount %s read-only: %m", directory);
 
@@ -835,16 +1291,13 @@ int setup_volatile_state(
                 return log_error_errno(errno, "Failed to create %s: %m", directory);
 
         options = "mode=755";
-        r = tmpfs_patch_options(options, userns, uid_shift, uid_range, selinux_apifs_context, &buf);
+        r = tmpfs_patch_options(options, userns, uid_shift, uid_range, false, selinux_apifs_context, &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;
+        return mount_verbose(LOG_ERR, "tmpfs", p, "tmpfs", MS_STRICTATIME, options);
 }
 
 int setup_volatile(
@@ -871,16 +1324,15 @@ int setup_volatile(
                 return log_error_errno(errno, "Failed to create temporary directory: %m");
 
         options = "mode=755";
-        r = tmpfs_patch_options(options, userns, uid_shift, uid_range, selinux_apifs_context, &buf);
+        r = tmpfs_patch_options(options, userns, uid_shift, uid_range, false, selinux_apifs_context, &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");
+        r = mount_verbose(LOG_ERR, "tmpfs", template, "tmpfs", MS_STRICTATIME, options);
+        if (r < 0)
                 goto fail;
-        }
 
         tmpfs_mounted = true;
 
@@ -893,23 +1345,21 @@ int setup_volatile(
                 goto fail;
         }
 
-        if (mount(f, t, NULL, MS_BIND|MS_REC, NULL) < 0) {
-                r = log_error_errno(errno, "Failed to create /usr bind mount: %m");
+        r = mount_verbose(LOG_ERR, f, t, NULL, MS_BIND|MS_REC, NULL);
+        if (r < 0)
                 goto fail;
-        }
 
         bind_mounted = true;
 
-        r = bind_remount_recursive(t, true);
+        r = bind_remount_recursive(t, true, NULL);
         if (r < 0) {
                 log_error_errno(r, "Failed to remount %s read-only: %m", t);
                 goto fail;
         }
 
-        if (mount(template, directory, NULL, MS_MOVE, NULL) < 0) {
-                r = log_error_errno(errno, "Failed to move root mount: %m");
+        r = mount_verbose(LOG_ERR, template, directory, NULL, MS_MOVE, NULL);
+        if (r < 0)
                 goto fail;
-        }
 
         (void) rmdir(template);
 
@@ -917,28 +1367,123 @@ int setup_volatile(
 
 fail:
         if (bind_mounted)
-                (void) umount(t);
+                (void) umount_verbose(t);
 
         if (tmpfs_mounted)
-                (void) umount(template);
+                (void) umount_verbose(template);
         (void) rmdir(template);
         return r;
 }
 
-VolatileMode volatile_mode_from_string(const char *s) {
-        int b;
+/* Expects *pivot_root_new and *pivot_root_old to be initialised to allocated memory or NULL. */
+int pivot_root_parse(char **pivot_root_new, char **pivot_root_old, const char *s) {
+        _cleanup_free_ char *root_new = NULL, *root_old = NULL;
+        const char *p = s;
+        int r;
+
+        assert(pivot_root_new);
+        assert(pivot_root_old);
+
+        r = extract_first_word(&p, &root_new, ":", EXTRACT_DONT_COALESCE_SEPARATORS);
+        if (r < 0)
+                return r;
+        if (r == 0)
+                return -EINVAL;
+
+        if (isempty(p))
+                root_old = NULL;
+        else {
+                root_old = strdup(p);
+                if (!root_old)
+                        return -ENOMEM;
+        }
+
+        if (!path_is_absolute(root_new))
+                return -EINVAL;
+        if (root_old && !path_is_absolute(root_old))
+                return -EINVAL;
+
+        free_and_replace(*pivot_root_new, root_new);
+        free_and_replace(*pivot_root_old, root_old);
+
+        return 0;
+}
+
+int setup_pivot_root(const char *directory, const char *pivot_root_new, const char *pivot_root_old) {
+        _cleanup_free_ char *directory_pivot_root_new = NULL;
+        _cleanup_free_ char *pivot_tmp_pivot_root_old = NULL;
+        char pivot_tmp[] = "/tmp/nspawn-pivot-XXXXXX";
+        bool remove_pivot_tmp = false;
+        int r;
+
+        assert(directory);
+
+        if (!pivot_root_new)
+                return 0;
+
+        /* Pivot pivot_root_new to / and the existing / to pivot_root_old.
+         * If pivot_root_old is NULL, the existing / disappears.
+         * This requires a temporary directory, pivot_tmp, which is
+         * not a child of either.
+         *
+         * This is typically used for OSTree-style containers, where
+         * the root partition contains several sysroots which could be
+         * run. Normally, one would be chosen by the bootloader and
+         * pivoted to / by initramfs.
+         *
+         * For example, for an OSTree deployment, pivot_root_new
+         * would be: /ostree/deploy/$os/deploy/$checksum. Note that this
+         * code doesn’t do the /var mount which OSTree expects: use
+         * --bind +/sysroot/ostree/deploy/$os/var:/var for that.
+         *
+         * So in the OSTree case, we’ll end up with something like:
+         *  - directory = /tmp/nspawn-root-123456
+         *  - pivot_root_new = /ostree/deploy/os/deploy/123abc
+         *  - pivot_root_old = /sysroot
+         *  - directory_pivot_root_new =
+         *       /tmp/nspawn-root-123456/ostree/deploy/os/deploy/123abc
+         *  - pivot_tmp = /tmp/nspawn-pivot-123456
+         *  - pivot_tmp_pivot_root_old = /tmp/nspawn-pivot-123456/sysroot
+         *
+         * Requires all file systems at directory and below to be mounted
+         * MS_PRIVATE or MS_SLAVE so they can be moved.
+         */
+        directory_pivot_root_new = prefix_root(directory, pivot_root_new);
+
+        /* Remount directory_pivot_root_new to make it movable. */
+        r = mount_verbose(LOG_ERR, directory_pivot_root_new, directory_pivot_root_new, NULL, MS_BIND, NULL);
+        if (r < 0)
+                goto done;
+
+        if (pivot_root_old) {
+                if (!mkdtemp(pivot_tmp)) {
+                        r = log_error_errno(errno, "Failed to create temporary directory: %m");
+                        goto done;
+                }
 
-        if (isempty(s))
-                return _VOLATILE_MODE_INVALID;
+                remove_pivot_tmp = true;
+                pivot_tmp_pivot_root_old = prefix_root(pivot_tmp, pivot_root_old);
 
-        b = parse_boolean(s);
-        if (b > 0)
-                return VOLATILE_YES;
-        if (b == 0)
-                return VOLATILE_NO;
+                r = mount_verbose(LOG_ERR, directory_pivot_root_new, pivot_tmp, NULL, MS_MOVE, NULL);
+                if (r < 0)
+                        goto done;
 
-        if (streq(s, "state"))
-                return VOLATILE_STATE;
+                r = mount_verbose(LOG_ERR, directory, pivot_tmp_pivot_root_old, NULL, MS_MOVE, NULL);
+                if (r < 0)
+                        goto done;
 
-        return _VOLATILE_MODE_INVALID;
+                r = mount_verbose(LOG_ERR, pivot_tmp, directory, NULL, MS_MOVE, NULL);
+                if (r < 0)
+                        goto done;
+        } else {
+                r = mount_verbose(LOG_ERR, directory_pivot_root_new, directory, NULL, MS_MOVE, NULL);
+                if (r < 0)
+                        goto done;
+        }
+
+done:
+        if (remove_pivot_tmp)
+                (void) rmdir(pivot_tmp);
+
+        return r;
 }
index 0daf145..2777d21 100644 (file)
 
 #include <stdbool.h>
 
-typedef enum VolatileMode {
-        VOLATILE_NO,
-        VOLATILE_YES,
-        VOLATILE_STATE,
-        _VOLATILE_MODE_MAX,
-        _VOLATILE_MODE_INVALID = -1
-} VolatileMode;
+#include "cgroup-util.h"
+#include "volatile-util.h"
+
+typedef enum MountSettingsMask {
+        MOUNT_FATAL              = 1 << 0, /* if set, a mount error is considered fatal */
+        MOUNT_USE_USERNS         = 1 << 1, /* if set, mounts are patched considering uid/gid shifts in a user namespace */
+        MOUNT_IN_USERNS          = 1 << 2, /* if set, the mount is executed in the inner child, otherwise in the outer child */
+        MOUNT_APPLY_APIVFS_RO    = 1 << 3, /* if set, /proc/sys, and /sysfs will be mounted read-only, otherwise read-write. */
+        MOUNT_APPLY_APIVFS_NETNS = 1 << 4, /* if set, /proc/sys/net will be mounted read-write.
+                                              Works only if MOUNT_APPLY_APIVFS_RO is also set. */
+} MountSettingsMask;
 
 typedef enum CustomMountType {
         CUSTOM_MOUNT_BIND,
@@ -45,25 +49,27 @@ typedef struct CustomMount {
         char *options;
         char *work_dir;
         char **lower;
+        char *rm_rf_tmpdir;
 } CustomMount;
 
 CustomMount* custom_mount_add(CustomMount **l, unsigned *n, CustomMountType t);
-
 void custom_mount_free_all(CustomMount *l, unsigned n);
+int custom_mount_prepare_all(const char *dest, CustomMount *l, unsigned n);
+
 int bind_mount_parse(CustomMount **l, unsigned *n, const char *s, bool read_only);
 int tmpfs_mount_parse(CustomMount **l, unsigned *n, const char *s);
+int overlay_mount_parse(CustomMount **l, unsigned *n, const char *s, bool read_only);
 
-int custom_mount_compare(const void *a, const void *b);
-
-int mount_all(const char *dest, bool use_userns, bool in_userns, bool use_netns, uid_t uid_shift, uid_t uid_range, const char *selinux_apifs_context);
-int mount_sysfs(const char *dest);
+int mount_all(const char *dest, MountSettingsMask mount_settings, uid_t uid_shift, uid_t uid_range, const char *selinux_apifs_context);
+int mount_sysfs(const char *dest, MountSettingsMask mount_settings);
 
-int mount_cgroups(const char *dest, bool unified_requested, bool userns, uid_t uid_shift, uid_t uid_range, const char *selinux_apifs_context);
-int mount_systemd_cgroup_writable(const char *dest, bool unified_requested);
+int mount_cgroups(const char *dest, CGroupUnified unified_requested, bool userns, uid_t uid_shift, uid_t uid_range, const char *selinux_apifs_context, bool use_cgns);
+int mount_systemd_cgroup_writable(const char *dest, CGroupUnified unified_requested);
 
 int mount_custom(const char *dest, CustomMount *mounts, unsigned n, bool userns, uid_t uid_shift, uid_t uid_range, const char *selinux_apifs_context);
 
 int setup_volatile(const char *directory, VolatileMode mode, bool userns, uid_t uid_shift, uid_t uid_range, const char *selinux_apifs_context);
 int setup_volatile_state(const char *directory, VolatileMode mode, bool userns, uid_t uid_shift, uid_t uid_range, const char *selinux_apifs_context);
 
-VolatileMode volatile_mode_from_string(const char *s);
+int pivot_root_parse(char **pivot_root_new, char **pivot_root_old, const char *s);
+int setup_pivot_root(const char *directory, const char *pivot_root_new, const char *pivot_root_old);
index 428cc04..aa61aaa 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <linux/veth.h>
 #include <net/if.h>
+#include <sys/file.h>
 
 #include "libudev.h"
 #include "sd-id128.h"
index ded5866..1a3f129 100644 (file)
@@ -375,7 +375,7 @@ static int recurse_fd(int fd, bool donate_fd, const struct stat *st, uid_t shift
                 FOREACH_DIRENT_ALL(de, d, r = -errno; goto finish) {
                         struct stat fst;
 
-                        if (STR_IN_SET(de->d_name, ".", ".."))
+                        if (dot_or_dot_dot(de->d_name))
                                 continue;
 
                         if (fstatat(dirfd(d), de->d_name, &fst, AT_SYMLINK_NOFOLLOW) < 0) {
index e5b76a0..5b0faf8 100644 (file)
 #include "strv.h"
 #include "util.h"
 
+static int append_machine_properties(
+                sd_bus_message *m,
+                CustomMount *mounts,
+                unsigned n_mounts,
+                int kill_signal,
+                char **properties) {
+
+        unsigned j;
+        int r;
+
+        assert(m);
+
+        r = sd_bus_message_append(m, "(sv)", "DevicePolicy", "s", "closed");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        /* If you make changes here, also make sure to update systemd-nspawn@.service, to keep the device policies in
+         * sync regardless if we are run with or without the --keep-unit switch. */
+        r = sd_bus_message_append(m, "(sv)", "DeviceAllow", "a(ss)", 2,
+                                  /* Allow the container to
+                                   * access and create the API
+                                   * device nodes, so that
+                                   * PrivateDevices= in the
+                                   * container can work
+                                   * fine */
+                                  "/dev/net/tun", "rwm",
+                                  /* Allow the container
+                                   * access to ptys. However,
+                                   * do not permit the
+                                   * container to ever create
+                                   * these device nodes. */
+                                  "char-pts", "rw");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        for (j = 0; j < n_mounts; j++) {
+                CustomMount *cm = mounts + j;
+
+                if (cm->type != CUSTOM_MOUNT_BIND)
+                        continue;
+
+                r = is_device_node(cm->source);
+                if (r == -ENOENT) {
+                        /* The bind source might only appear as the image is put together, hence don't complain */
+                        log_debug_errno(r, "Bind mount source %s not found, ignoring: %m", cm->source);
+                        continue;
+                }
+                if (r < 0)
+                        return log_error_errno(r, "Failed to stat %s: %m", cm->source);
+
+                if (r) {
+                        r = sd_bus_message_append(m, "(sv)", "DeviceAllow", "a(ss)", 1,
+                                                  cm->source, cm->read_only ? "r" : "rw");
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to append message arguments: %m");
+                }
+        }
+
+        if (kill_signal != 0) {
+                r = sd_bus_message_append(m, "(sv)", "KillSignal", "i", kill_signal);
+                if (r < 0)
+                        return bus_log_create_error(r);
+
+                r = sd_bus_message_append(m, "(sv)", "KillMode", "s", "mixed");
+                if (r < 0)
+                        return bus_log_create_error(r);
+        }
+
+        return 0;
+}
+
 int register_machine(
                 const char *machine_name,
                 pid_t pid,
@@ -68,8 +139,6 @@ int register_machine(
                                 local_ifindex > 0 ? 1 : 0, local_ifindex);
         } else {
                 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
-                char **i;
-                unsigned j;
 
                 r = sd_bus_message_new_method_call(
                                 bus,
@@ -104,64 +173,18 @@ int register_machine(
                                 return bus_log_create_error(r);
                 }
 
-                r = sd_bus_message_append(m, "(sv)", "DevicePolicy", "s", "closed");
+                r = append_machine_properties(
+                                m,
+                                mounts,
+                                n_mounts,
+                                kill_signal,
+                                properties);
                 if (r < 0)
-                        return bus_log_create_error(r);
+                        return r;
 
-                /* If you make changes here, also make sure to update
-                 * systemd-nspawn@.service, to keep the device
-                 * policies in sync regardless if we are run with or
-                 * without the --keep-unit switch. */
-                r = sd_bus_message_append(m, "(sv)", "DeviceAllow", "a(ss)", 2,
-                                          /* Allow the container to
-                                           * access and create the API
-                                           * device nodes, so that
-                                           * PrivateDevices= in the
-                                           * container can work
-                                           * fine */
-                                          "/dev/net/tun", "rwm",
-                                          /* Allow the container
-                                           * access to ptys. However,
-                                           * do not permit the
-                                           * container to ever create
-                                           * these device nodes. */
-                                          "char-pts", "rw");
+                r = bus_append_unit_property_assignment_many(m, properties);
                 if (r < 0)
-                        return bus_log_create_error(r);
-
-                for (j = 0; j < n_mounts; j++) {
-                        CustomMount *cm = mounts + j;
-
-                        if (cm->type != CUSTOM_MOUNT_BIND)
-                                continue;
-
-                        r = is_device_node(cm->source);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to stat %s: %m", cm->source);
-
-                        if (r) {
-                                r = sd_bus_message_append(m, "(sv)", "DeviceAllow", "a(ss)", 1,
-                                        cm->source, cm->read_only ? "r" : "rw");
-                                if (r < 0)
-                                        return log_error_errno(r, "Failed to append message arguments: %m");
-                        }
-                }
-
-                if (kill_signal != 0) {
-                        r = sd_bus_message_append(m, "(sv)", "KillSignal", "i", kill_signal);
-                        if (r < 0)
-                                return bus_log_create_error(r);
-
-                        r = sd_bus_message_append(m, "(sv)", "KillMode", "s", "mixed");
-                        if (r < 0)
-                                return bus_log_create_error(r);
-                }
-
-                STRV_FOREACH(i, properties) {
-                        r = bus_append_unit_property_assignment(m, *i);
-                        if (r < 0)
-                                return r;
-                }
+                        return r;
 
                 r = sd_bus_message_close_container(m);
                 if (r < 0)
@@ -227,3 +250,104 @@ int terminate_machine(pid_t pid) {
 
         return 0;
 }
+
+int allocate_scope(
+                const char *machine_name,
+                pid_t pid,
+                const char *slice,
+                CustomMount *mounts,
+                unsigned n_mounts,
+                int kill_signal,
+                char **properties) {
+
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+        _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+        _cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
+        _cleanup_free_ char *scope = NULL;
+        const char *description, *object;
+        int r;
+
+        r = sd_bus_default_system(&bus);
+        if (r < 0)
+                return log_error_errno(r, "Failed to open system bus: %m");
+
+        r = bus_wait_for_jobs_new(bus, &w);
+        if (r < 0)
+                return log_error_errno(r, "Could not watch job: %m");
+
+        r = unit_name_mangle_with_suffix(machine_name, UNIT_NAME_NOGLOB, ".scope", &scope);
+        if (r < 0)
+                return log_error_errno(r, "Failed to mangle scope name: %m");
+
+        r = sd_bus_message_new_method_call(
+                        bus,
+                        &m,
+                        "org.freedesktop.systemd1",
+                        "/org/freedesktop/systemd1",
+                        "org.freedesktop.systemd1.Manager",
+                        "StartTransientUnit");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_append(m, "ss", scope, "fail");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        /* Properties */
+        r = sd_bus_message_open_container(m, 'a', "(sv)");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        description = strjoina("Container ", machine_name);
+
+        r = sd_bus_message_append(m, "(sv)(sv)(sv)(sv)",
+                                  "PIDs", "au", 1, pid,
+                                  "Description", "s", description,
+                                  "Delegate", "b", 1,
+                                  "Slice", "s", isempty(slice) ? "machine.slice" : slice);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = append_machine_properties(
+                        m,
+                        mounts,
+                        n_mounts,
+                        kill_signal,
+                        properties);
+        if (r < 0)
+                return r;
+
+        r = bus_append_unit_property_assignment_many(m, properties);
+        if (r < 0)
+                return r;
+
+        r = sd_bus_message_close_container(m);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        /* No auxiliary units */
+        r = sd_bus_message_append(
+                        m,
+                        "a(sa(sv))",
+                        0);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_call(bus, m, 0, &error, &reply);
+        if (r < 0) {
+                log_error("Failed to allocate scope: %s", bus_error_message(&error, r));
+                return r;
+        }
+
+        r = sd_bus_message_read(reply, "o", &object);
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        r = bus_wait_for_jobs_one(w, object, false);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
index 304c5a4..6694b3f 100644 (file)
@@ -27,3 +27,5 @@
 
 int register_machine(const char *machine_name, pid_t pid, const char *directory, sd_id128_t uuid, int local_ifindex, const char *slice, CustomMount *mounts, unsigned n_mounts, int kill_signal, char **properties, bool keep_unit, const char *service);
 int terminate_machine(pid_t pid);
+
+int allocate_scope(const char *machine_name, pid_t pid, const char *slice, CustomMount *mounts, unsigned n_mounts, int kill_signal, char **properties);
index 3ab7160..72ecc51 100644 (file)
 #include <seccomp.h>
 #endif
 
+#include "alloc-util.h"
 #include "log.h"
-
+#include "nspawn-seccomp.h"
 #ifdef HAVE_SECCOMP
 #include "seccomp-util.h"
 #endif
-
-#include "nspawn-seccomp.h"
+#include "string-util.h"
 
 #ifdef HAVE_SECCOMP
 
-static int seccomp_add_default_syscall_filter(scmp_filter_ctx ctx,
-                                              uint64_t cap_list_retain) {
-        unsigned i;
-        int r;
+static int seccomp_add_default_syscall_filter(
+                scmp_filter_ctx ctx,
+                uint32_t arch,
+                uint64_t cap_list_retain) {
+
         static const struct {
                 uint64_t capability;
                 int syscall_num;
@@ -111,81 +112,81 @@ static int seccomp_add_default_syscall_filter(scmp_filter_ctx ctx,
                 { CAP_SYS_TIME,   SCMP_SYS(settimeofday)        },
                 { CAP_SYS_TIME,   SCMP_SYS(stime)               },
         };
+        unsigned i;
+        int r, c = 0;
 
         for (i = 0; i < ELEMENTSOF(blacklist); i++) {
                 if (blacklist[i].capability != 0 && (cap_list_retain & (1ULL << blacklist[i].capability)))
                         continue;
 
-                r = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), blacklist[i].syscall_num, 0);
-                if (r == -EFAULT)
-                        continue; /* unknown syscall */
-                if (r < 0)
-                        return log_error_errno(r, "Failed to block syscall: %m");
+                r = seccomp_rule_add_exact(ctx, SCMP_ACT_ERRNO(EPERM), blacklist[i].syscall_num, 0);
+                if (r < 0) {
+                        /* If the system call is not known on this architecture, then that's fine, let's ignore it */
+                        _cleanup_free_ char *n = NULL;
+
+                        n = seccomp_syscall_resolve_num_arch(arch, blacklist[i].syscall_num);
+                        log_debug_errno(r, "Failed to add rule for system call %s, ignoring: %m", strna(n));
+                } else
+                        c++;
         }
 
-        return 0;
+        return c;
 }
 
 int setup_seccomp(uint64_t cap_list_retain) {
-        scmp_filter_ctx seccomp;
+        uint32_t arch;
         int r;
 
-        seccomp = seccomp_init(SCMP_ACT_ALLOW);
-        if (!seccomp)
-                return log_oom();
-
-        r = seccomp_add_secondary_archs(seccomp);
-        if (r < 0) {
-                log_error_errno(r, "Failed to add secondary archs to seccomp filter: %m");
-                goto finish;
+        if (!is_seccomp_available()) {
+                log_debug("SECCOMP features not detected in the kernel, disabling SECCOMP audit filter");
+                return 0;
         }
 
-        r = seccomp_add_default_syscall_filter(seccomp, cap_list_retain);
-        if (r < 0)
-                goto finish;
-
-        /*
-           Audit is broken in containers, much of the userspace audit
-           hookup will fail if running inside a container. We don't
-           care and just turn off creation of audit sockets.
-
-           This will make socket(AF_NETLINK, *, NETLINK_AUDIT) fail
-           with EAFNOSUPPORT which audit userspace uses as indication
-           that audit is disabled in the kernel.
-         */
-
-        r = seccomp_rule_add(
-                        seccomp,
-                        SCMP_ACT_ERRNO(EAFNOSUPPORT),
-                        SCMP_SYS(socket),
-                        2,
-                        SCMP_A0(SCMP_CMP_EQ, AF_NETLINK),
-                        SCMP_A2(SCMP_CMP_EQ, NETLINK_AUDIT));
-        if (r < 0) {
-                log_error_errno(r, "Failed to add audit seccomp rule: %m");
-                goto finish;
-        }
+        SECCOMP_FOREACH_LOCAL_ARCH(arch) {
+                _cleanup_(seccomp_releasep) scmp_filter_ctx seccomp = NULL;
+                int n;
 
-        r = seccomp_attr_set(seccomp, SCMP_FLTATR_CTL_NNP, 0);
-        if (r < 0) {
-                log_error_errno(r, "Failed to unset NO_NEW_PRIVS: %m");
-                goto finish;
-        }
+                log_debug("Operating on architecture: %s", seccomp_arch_to_string(arch));
 
-        r = seccomp_load(seccomp);
-        if (r == -EINVAL) {
-                log_debug_errno(r, "Kernel is probably not configured with CONFIG_SECCOMP. Disabling seccomp audit filter: %m");
-                r = 0;
-                goto finish;
-        }
-        if (r < 0) {
-                log_error_errno(r, "Failed to install seccomp audit filter: %m");
-                goto finish;
+                r = seccomp_init_for_arch(&seccomp, arch, SCMP_ACT_ALLOW);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to allocate seccomp object: %m");
+
+                n = seccomp_add_default_syscall_filter(seccomp, arch, cap_list_retain);
+                if (n < 0)
+                        return n;
+
+                /*
+                  Audit is broken in containers, much of the userspace audit hookup will fail if running inside a
+                  container. We don't care and just turn off creation of audit sockets.
+
+                  This will make socket(AF_NETLINK, *, NETLINK_AUDIT) fail with EAFNOSUPPORT which audit userspace uses
+                  as indication that audit is disabled in the kernel.
+                */
+
+                r = seccomp_rule_add_exact(
+                                seccomp,
+                                SCMP_ACT_ERRNO(EAFNOSUPPORT),
+                                SCMP_SYS(socket),
+                                2,
+                                SCMP_A0(SCMP_CMP_EQ, AF_NETLINK),
+                                SCMP_A2(SCMP_CMP_EQ, NETLINK_AUDIT));
+                if (r < 0)
+                        log_debug_errno(r, "Failed to add audit seccomp rule, ignoring: %m");
+                else
+                        n++;
+
+                if (n <= 0) /* no rule added? then skip this architecture */
+                        continue;
+
+                r = seccomp_load(seccomp);
+                if (IN_SET(r, -EPERM, -EACCES))
+                        return log_error_errno(r, "Failed to install seccomp audit filter: %m");
+                if (r < 0)
+                        log_debug_errno(r, "Failed to install filter set for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
         }
 
-finish:
-        seccomp_release(seccomp);
-        return r;
+        return 0;
 }
 
 #else
index 5f1522c..5217d10 100644 (file)
@@ -90,6 +90,8 @@ Settings* settings_free(Settings *s) {
         strv_free(s->parameters);
         strv_free(s->environment);
         free(s->user);
+        free(s->pivot_root_new);
+        free(s->pivot_root_old);
         free(s->working_directory);
 
         strv_free(s->network_interfaces);
@@ -101,9 +103,7 @@ Settings* settings_free(Settings *s) {
         expose_port_free_all(s->expose_ports);
 
         custom_mount_free_all(s->custom_mounts, s->n_custom_mounts);
-        free(s);
-
-        return NULL;
+        return mfree(s);
 }
 
 bool settings_private_network(Settings *s) {
@@ -239,6 +239,34 @@ int config_parse_id128(
         return 0;
 }
 
+int config_parse_pivot_root(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        Settings *settings = data;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+
+        r = pivot_root_parse(&settings->pivot_root_new, &settings->pivot_root_old, rvalue);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "Invalid pivot root mount specification %s: %m", rvalue);
+                return 0;
+        }
+
+        return 0;
+}
+
 int config_parse_bind(
                 const char *unit,
                 const char *filename,
@@ -295,6 +323,32 @@ int config_parse_tmpfs(
         return 0;
 }
 
+int config_parse_overlay(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        Settings *settings = data;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+
+        r = overlay_mount_parse(&settings->custom_mounts, &settings->n_custom_mounts, rvalue, ltype);
+        if (r < 0)
+                log_syntax(unit, LOG_ERR, filename, line, r, "Invalid overlay file system specification %s, ignoring: %m", rvalue);
+
+        return 0;
+}
+
 int config_parse_veth_extra(
                 const char *unit,
                 const char *filename,
index 231e6d7..0214032 100644 (file)
@@ -57,7 +57,8 @@ typedef enum SettingsMask {
         SETTING_WORKING_DIRECTORY = 1 << 12,
         SETTING_USERNS            = 1 << 13,
         SETTING_NOTIFY_READY      = 1 << 14,
-        _SETTINGS_MASK_ALL        = (1 << 15) -1
+        SETTING_PIVOT_ROOT        = 1 << 15,
+        _SETTINGS_MASK_ALL        = (1 << 16) -1
 } SettingsMask;
 
 typedef struct Settings {
@@ -72,6 +73,8 @@ typedef struct Settings {
         unsigned long personality;
         sd_id128_t machine_id;
         char *working_directory;
+        char *pivot_root_new;
+        char *pivot_root_old;
         UserNamespaceMode userns_mode;
         uid_t uid_shift, uid_range;
         bool notify_ready;
@@ -103,14 +106,16 @@ bool settings_private_network(Settings *s);
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(Settings*, settings_free);
 
-const struct ConfigPerfItem* nspawn_gperf_lookup(const char *key, unsigned length);
+const struct ConfigPerfItem* nspawn_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
 
 int config_parse_capability(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_id128(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_expose_port(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_volatile_mode(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_pivot_root(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_bind(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_tmpfs(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_overlay(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_veth_extra(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_network_zone(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_boot(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
index 2de87e3..0c48434 100644 (file)
@@ -18,8 +18,9 @@
 ***/
 
 #include <sys/reboot.h>
-#include <sys/unistd.h>
 #include <sys/wait.h>
+#include <sys/prctl.h>
+#include <unistd.h>
 
 #include "fd-util.h"
 #include "log.h"
 #include "time-util.h"
 #include "def.h"
 
-int stub_pid1(void) {
+static int reset_environ(const char *new_environment, size_t length) {
+        unsigned long start, end;
+
+        start = (unsigned long) new_environment;
+        end = start + length;
+
+        if (prctl(PR_SET_MM, PR_SET_MM_ENV_START, start, 0, 0) < 0)
+                return -errno;
+
+        if (prctl(PR_SET_MM, PR_SET_MM_ENV_END, end, 0, 0) < 0)
+                return -errno;
+
+        return 0;
+}
+
+int stub_pid1(sd_id128_t uuid) {
         enum {
                 STATE_RUNNING,
                 STATE_REBOOT,
@@ -41,6 +57,11 @@ int stub_pid1(void) {
         pid_t pid;
         int r;
 
+        /* The new environment we set up, on the stack. */
+        char new_environment[] =
+                "container=systemd-nspawn\0"
+                "container_uuid=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
+
         /* Implements a stub PID 1, that reaps all processes and processes a couple of standard signals. This is useful
          * for allowing arbitrary processes run in a container, and still have all zombies reaped. */
 
@@ -64,6 +85,12 @@ int stub_pid1(void) {
         close_all_fds(NULL, 0);
         log_open();
 
+        /* Flush out /proc/self/environ, so that we don't leak the environment from the host into the container. Also,
+         * set $container= and $container_uuid= so that clients in the container that query it from /proc/1/environ
+         * find them set. */
+        sd_id128_to_string(uuid, new_environment + sizeof(new_environment) - SD_ID128_STRING_MAX);
+        reset_environ(new_environment, sizeof(new_environment));
+
         rename_process("STUBINIT");
 
         assert_se(sigemptyset(&waitmask) >= 0);
@@ -161,7 +188,16 @@ int stub_pid1(void) {
                 else
                         assert_not_reached("Got unexpected signal");
 
-                /* (void) kill_and_sigcont(pid, SIGTERM); */
+                r = kill_and_sigcont(pid, SIGTERM);
+
+                /* Let's send a SIGHUP after the SIGTERM, as shells tend to ignore SIGTERM but do react to SIGHUP. We
+                 * do it strictly in this order, so that the SIGTERM is dispatched first, and SIGHUP second for those
+                 * processes which handle both. That's because services tend to bind configuration reload or something
+                 * else to SIGHUP. */
+
+                if (r != -ESRCH)
+                        (void) kill(pid, SIGHUP);
+
                 quit_usec = now(CLOCK_MONOTONIC) + DEFAULT_TIMEOUT_USEC;
         }
 
index 36c1aaf..7ca8307 100644 (file)
@@ -19,4 +19,6 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-int stub_pid1(void);
+#include "sd-id128.h"
+
+int stub_pid1(sd_id128_t uuid);
index b1c012a..8a5fedd 100644 (file)
@@ -18,7 +18,7 @@
 ***/
 
 #ifdef HAVE_BLKID
-#include <blkid/blkid.h>
+#include <blkid.h>
 #endif
 #include <errno.h>
 #include <getopt.h>
 #include <sys/personality.h>
 #include <sys/prctl.h>
 #include <sys/types.h>
+#include <sys/wait.h>
 #include <unistd.h>
 
+#include "sd-bus.h"
 #include "sd-daemon.h"
 #include "sd-id128.h"
 
 #include "base-filesystem.h"
 #include "blkid-util.h"
 #include "btrfs-util.h"
+#include "bus-util.h"
 #include "cap-list.h"
 #include "capability-util.h"
 #include "cgroup-util.h"
 #include "copy.h"
 #include "dev-setup.h"
+#include "dissect-image.h"
 #include "env-util.h"
 #include "fd-util.h"
 #include "fdset.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "gpt.h"
+#include "hexdecoct.h"
 #include "hostname-util.h"
 #include "id128-util.h"
 #include "log.h"
+#include "loop-util.h"
 #include "loopback-setup.h"
 #include "machine-image.h"
 #include "macro.h"
  * the init process in the container pid can send messages to nspawn following the sd_notify(3) protocol */
 #define NSPAWN_NOTIFY_SOCKET_PATH "/run/systemd/nspawn/notify"
 
+#define EXIT_FORCE_RESTART 133
+
 typedef enum ContainerStatus {
         CONTAINER_TERMINATED,
         CONTAINER_REBOOTED
@@ -126,6 +134,8 @@ typedef enum LinkJournal {
 static char *arg_directory = NULL;
 static char *arg_template = NULL;
 static char *arg_chdir = NULL;
+static char *arg_pivot_root_new = NULL;
+static char *arg_pivot_root_old = NULL;
 static char *arg_user = NULL;
 static sd_id128_t arg_uuid = {};
 static char *arg_machine = NULL;
@@ -169,7 +179,6 @@ static CustomMount *arg_custom_mounts = NULL;
 static unsigned arg_n_custom_mounts = 0;
 static char **arg_setenv = NULL;
 static bool arg_quiet = false;
-static bool arg_share_system = false;
 static bool arg_register = true;
 static bool arg_keep_unit = false;
 static char **arg_network_interfaces = NULL;
@@ -188,12 +197,17 @@ static UserNamespaceMode arg_userns_mode = USER_NAMESPACE_NO;
 static uid_t arg_uid_shift = UID_INVALID, arg_uid_range = 0x10000U;
 static bool arg_userns_chown = false;
 static int arg_kill_signal = 0;
-static bool arg_unified_cgroup_hierarchy = false;
+static CGroupUnified arg_unified_cgroup_hierarchy = CGROUP_UNIFIED_UNKNOWN;
 static SettingsMask arg_settings_mask = 0;
 static int arg_settings_trusted = -1;
 static char **arg_parameters = NULL;
 static const char *arg_container_service_name = "systemd-nspawn";
 static bool arg_notify_ready = false;
+static bool arg_use_cgns = true;
+static unsigned long arg_clone_ns_flags = CLONE_NEWIPC|CLONE_NEWPID|CLONE_NEWUTS;
+static MountSettingsMask arg_mount_settings = MOUNT_APPLY_APIVFS_RO;
+static void *arg_root_hash = NULL;
+static size_t arg_root_hash_size = 0;
 
 static void help(void) {
         printf("%s [OPTIONS...] [PATH] [ARGUMENTS...]\n\n"
@@ -207,18 +221,21 @@ static void help(void) {
                "  -x --ephemeral            Run container with snapshot of root directory, and\n"
                "                            remove it after exit\n"
                "  -i --image=PATH           File system device or disk image for the container\n"
+               "     --root-hash=HASH       Specify verity root hash\n"
                "  -a --as-pid2              Maintain a stub init as PID1, invoke binary as PID2\n"
                "  -b --boot                 Boot up full system (i.e. invoke init)\n"
                "     --chdir=PATH           Set working directory in the container\n"
+               "     --pivot-root=PATH[:PATH]\n"
+               "                            Pivot root to given directory in the container\n"
                "  -u --user=USER            Run the command under specified user or uid\n"
                "  -M --machine=NAME         Set the machine name for the container\n"
                "     --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"
-               "  -U --private-users=pick   Run within user namespace, pick UID/GID range automatically\n"
+               "  -U --private-users=pick   Run within user namespace, autoselect UID/GID range\n"
                "     --private-users[=UIDBASE[:NUIDS]]\n"
-               "                            Run within user namespace, user configured UID/GID range\n"
-               "     --private-user-chown   Adjust OS tree file ownership for private UID/GID range\n"
+               "                            Similar, but with user configured UID/GID range\n"
+               "     --private-users-chown  Adjust OS tree ownership to private UID/GID range\n"
                "     --private-network      Disable network in container\n"
                "     --network-interface=INTERFACE\n"
                "                            Assign an existing network interface to the\n"
@@ -235,11 +252,10 @@ static void help(void) {
                "                            Add an additional virtual Ethernet link between\n"
                "                            host and container\n"
                "     --network-bridge=INTERFACE\n"
-               "                            Add a virtual Ethernet connection between host\n"
-               "                            and container and add it to an existing bridge on\n"
-               "                            the host\n"
-               "     --network-zone=NAME    Add a virtual Ethernet connection to the container,\n"
-               "                            and add it to an automatically managed bridge interface\n"
+               "                            Add a virtual Ethernet connection to the container\n"
+               "                            and attach it to an existing bridge on the host\n"
+               "     --network-zone=NAME    Similar, but attach the new interface to an\n"
+               "                            an automatically managed bridge interface\n"
                "  -p --port=[PROTOCOL:]HOSTPORT[:CONTAINERPORT]\n"
                "                            Expose a container IP port on the host\n"
                "  -Z --selinux-context=SECLABEL\n"
@@ -268,25 +284,18 @@ static void help(void) {
                "     --overlay-ro=PATH[:PATH...]:PATH\n"
                "                            Similar, but creates a read-only overlay mount\n"
                "  -E --setenv=NAME=VALUE    Pass an environment variable to PID 1\n"
-               "     --share-system         Share system namespaces with host\n"
                "     --register=BOOLEAN     Register container as machine\n"
                "     --keep-unit            Do not register a scope for the machine, reuse\n"
                "                            the service unit nspawn is running in\n"
                "     --volatile[=MODE]      Run the system in volatile mode\n"
                "     --settings=BOOLEAN     Load additional settings from .nspawn file\n"
-               "     --notify-ready=BOOLEAN Receive notifications from the container's init process,\n"
-               "                            accepted values: yes and no\n"
+               "     --notify-ready=BOOLEAN Receive notifications from the child init process\n"
                , program_invocation_short_name);
 }
 
-static int custom_mounts_prepare(void) {
+static int custom_mount_check_all(void) {
         unsigned i;
-        int r;
 
-        /* Ensure the mounts are applied prefix first. */
-        qsort_safe(arg_custom_mounts, arg_n_custom_mounts, sizeof(CustomMount), custom_mount_compare);
-
-        /* Allocate working directories for the overlay file systems that need it */
         for (i = 0; i < arg_n_custom_mounts; i++) {
                 CustomMount *m = &arg_custom_mounts[i];
 
@@ -300,25 +309,12 @@ static int custom_mounts_prepare(void) {
                                 return -EINVAL;
                         }
                 }
-
-                if (m->type != CUSTOM_MOUNT_OVERLAY)
-                        continue;
-
-                if (m->work_dir)
-                        continue;
-
-                if (m->read_only)
-                        continue;
-
-                r = tempfn_random(m->source, NULL, &m->work_dir);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to generate work directory from %s: %m", m->source);
         }
 
         return 0;
 }
 
-static int detect_unified_cgroup_hierarchy(void) {
+static int detect_unified_cgroup_hierarchy(const char *directory) {
         const char *e;
         int r;
 
@@ -328,20 +324,77 @@ static int detect_unified_cgroup_hierarchy(void) {
                 r = parse_boolean(e);
                 if (r < 0)
                         return log_error_errno(r, "Failed to parse $UNIFIED_CGROUP_HIERARCHY.");
+                if (r > 0)
+                        arg_unified_cgroup_hierarchy = CGROUP_UNIFIED_ALL;
+                else
+                        arg_unified_cgroup_hierarchy = CGROUP_UNIFIED_NONE;
 
-                arg_unified_cgroup_hierarchy = r;
                 return 0;
         }
 
         /* Otherwise inherit the default from the host system */
-        r = cg_unified();
+        r = cg_all_unified();
         if (r < 0)
-                return log_error_errno(r, "Failed to determine whether the unified cgroups hierarchy is used: %m");
+                return log_error_errno(r, "Failed to determine whether we are in all unified mode.");
+        if (r > 0) {
+                /* Unified cgroup hierarchy support was added in 230. Unfortunately the detection
+                 * routine only detects 231, so we'll have a false negative here for 230. */
+                r = systemd_installation_has_version(directory, 230);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to determine systemd version in container: %m");
+                if (r > 0)
+                        arg_unified_cgroup_hierarchy = CGROUP_UNIFIED_ALL;
+                else
+                        arg_unified_cgroup_hierarchy = CGROUP_UNIFIED_NONE;
+        } else if (cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER) > 0) {
+                /* Mixed cgroup hierarchy support was added in 233 */
+                r = systemd_installation_has_version(directory, 233);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to determine systemd version in container: %m");
+                if (r > 0)
+                        arg_unified_cgroup_hierarchy = CGROUP_UNIFIED_SYSTEMD;
+                else
+                        arg_unified_cgroup_hierarchy = CGROUP_UNIFIED_NONE;
+        } else
+                arg_unified_cgroup_hierarchy = CGROUP_UNIFIED_NONE;
 
-        arg_unified_cgroup_hierarchy = r;
         return 0;
 }
 
+static void parse_share_ns_env(const char *name, unsigned long ns_flag) {
+        int r;
+
+        r = getenv_bool(name);
+        if (r == -ENXIO)
+                return;
+        if (r < 0)
+                log_warning_errno(r, "Failed to parse %s from environment, defaulting to false.", name);
+        arg_clone_ns_flags = (arg_clone_ns_flags & ~ns_flag) | (r > 0 ? 0 : ns_flag);
+}
+
+static void parse_mount_settings_env(void) {
+        int r;
+        const char *e;
+
+        e = getenv("SYSTEMD_NSPAWN_API_VFS_WRITABLE");
+        if (!e)
+                return;
+
+        if (streq(e, "network")) {
+                arg_mount_settings |= MOUNT_APPLY_APIVFS_RO|MOUNT_APPLY_APIVFS_NETNS;
+                return;
+        }
+
+        r = parse_boolean(e);
+        if (r < 0) {
+                log_warning_errno(r, "Failed to parse SYSTEMD_NSPAWN_API_VFS_WRITABLE from environment, ignoring.");
+                return;
+        }
+
+        SET_FLAG(arg_mount_settings, MOUNT_APPLY_APIVFS_RO, r == 0);
+        SET_FLAG(arg_mount_settings, MOUNT_APPLY_APIVFS_NETNS, false);
+}
+
 static int parse_argv(int argc, char *argv[]) {
 
         enum {
@@ -374,57 +427,61 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_KILL_SIGNAL,
                 ARG_SETTINGS,
                 ARG_CHDIR,
+                ARG_PIVOT_ROOT,
                 ARG_PRIVATE_USERS_CHOWN,
                 ARG_NOTIFY_READY,
+                ARG_ROOT_HASH,
         };
 
         static const struct option options[] = {
-                { "help",                  no_argument,       NULL, 'h'                   },
-                { "version",               no_argument,       NULL, ARG_VERSION           },
-                { "directory",             required_argument, NULL, 'D'                   },
-                { "template",              required_argument, NULL, ARG_TEMPLATE          },
-                { "ephemeral",             no_argument,       NULL, 'x'                   },
-                { "user",                  required_argument, NULL, 'u'                   },
-                { "private-network",       no_argument,       NULL, ARG_PRIVATE_NETWORK   },
-                { "as-pid2",               no_argument,       NULL, 'a'                   },
-                { "boot",                  no_argument,       NULL, 'b'                   },
-                { "uuid",                  required_argument, NULL, ARG_UUID              },
-                { "read-only",             no_argument,       NULL, ARG_READ_ONLY         },
-                { "capability",            required_argument, NULL, ARG_CAPABILITY        },
-                { "drop-capability",       required_argument, NULL, ARG_DROP_CAPABILITY   },
-                { "link-journal",          required_argument, NULL, ARG_LINK_JOURNAL      },
-                { "bind",                  required_argument, NULL, ARG_BIND              },
-                { "bind-ro",               required_argument, NULL, ARG_BIND_RO           },
-                { "tmpfs",                 required_argument, NULL, ARG_TMPFS             },
-                { "overlay",               required_argument, NULL, ARG_OVERLAY           },
-                { "overlay-ro",            required_argument, NULL, ARG_OVERLAY_RO        },
-                { "machine",               required_argument, NULL, 'M'                   },
-                { "slice",                 required_argument, NULL, 'S'                   },
-                { "setenv",                required_argument, NULL, 'E'                   },
-                { "selinux-context",       required_argument, NULL, 'Z'                   },
-                { "selinux-apifs-context", required_argument, NULL, 'L'                   },
-                { "quiet",                 no_argument,       NULL, 'q'                   },
-                { "share-system",          no_argument,       NULL, ARG_SHARE_SYSTEM      },
-                { "register",              required_argument, NULL, ARG_REGISTER          },
-                { "keep-unit",             no_argument,       NULL, ARG_KEEP_UNIT         },
-                { "network-interface",     required_argument, NULL, ARG_NETWORK_INTERFACE },
-                { "network-macvlan",       required_argument, NULL, ARG_NETWORK_MACVLAN   },
-                { "network-ipvlan",        required_argument, NULL, ARG_NETWORK_IPVLAN    },
-                { "network-veth",          no_argument,       NULL, 'n'                   },
-                { "network-veth-extra",    required_argument, NULL, ARG_NETWORK_VETH_EXTRA},
-                { "network-bridge",        required_argument, NULL, ARG_NETWORK_BRIDGE    },
-                { "network-zone",          required_argument, NULL, ARG_NETWORK_ZONE      },
-                { "personality",           required_argument, NULL, ARG_PERSONALITY       },
-                { "image",                 required_argument, NULL, 'i'                   },
-                { "volatile",              optional_argument, NULL, ARG_VOLATILE          },
-                { "port",                  required_argument, NULL, 'p'                   },
-                { "property",              required_argument, NULL, ARG_PROPERTY          },
-                { "private-users",         optional_argument, NULL, ARG_PRIVATE_USERS     },
-                { "private-users-chown",   optional_argument, NULL, ARG_PRIVATE_USERS_CHOWN},
-                { "kill-signal",           required_argument, NULL, ARG_KILL_SIGNAL       },
-                { "settings",              required_argument, NULL, ARG_SETTINGS          },
-                { "chdir",                 required_argument, NULL, ARG_CHDIR             },
-                { "notify-ready",          required_argument, NULL, ARG_NOTIFY_READY      },
+                { "help",                  no_argument,       NULL, 'h'                     },
+                { "version",               no_argument,       NULL, ARG_VERSION             },
+                { "directory",             required_argument, NULL, 'D'                     },
+                { "template",              required_argument, NULL, ARG_TEMPLATE            },
+                { "ephemeral",             no_argument,       NULL, 'x'                     },
+                { "user",                  required_argument, NULL, 'u'                     },
+                { "private-network",       no_argument,       NULL, ARG_PRIVATE_NETWORK     },
+                { "as-pid2",               no_argument,       NULL, 'a'                     },
+                { "boot",                  no_argument,       NULL, 'b'                     },
+                { "uuid",                  required_argument, NULL, ARG_UUID                },
+                { "read-only",             no_argument,       NULL, ARG_READ_ONLY           },
+                { "capability",            required_argument, NULL, ARG_CAPABILITY          },
+                { "drop-capability",       required_argument, NULL, ARG_DROP_CAPABILITY     },
+                { "link-journal",          required_argument, NULL, ARG_LINK_JOURNAL        },
+                { "bind",                  required_argument, NULL, ARG_BIND                },
+                { "bind-ro",               required_argument, NULL, ARG_BIND_RO             },
+                { "tmpfs",                 required_argument, NULL, ARG_TMPFS               },
+                { "overlay",               required_argument, NULL, ARG_OVERLAY             },
+                { "overlay-ro",            required_argument, NULL, ARG_OVERLAY_RO          },
+                { "machine",               required_argument, NULL, 'M'                     },
+                { "slice",                 required_argument, NULL, 'S'                     },
+                { "setenv",                required_argument, NULL, 'E'                     },
+                { "selinux-context",       required_argument, NULL, 'Z'                     },
+                { "selinux-apifs-context", required_argument, NULL, 'L'                     },
+                { "quiet",                 no_argument,       NULL, 'q'                     },
+                { "share-system",          no_argument,       NULL, ARG_SHARE_SYSTEM        }, /* not documented */
+                { "register",              required_argument, NULL, ARG_REGISTER            },
+                { "keep-unit",             no_argument,       NULL, ARG_KEEP_UNIT           },
+                { "network-interface",     required_argument, NULL, ARG_NETWORK_INTERFACE   },
+                { "network-macvlan",       required_argument, NULL, ARG_NETWORK_MACVLAN     },
+                { "network-ipvlan",        required_argument, NULL, ARG_NETWORK_IPVLAN      },
+                { "network-veth",          no_argument,       NULL, 'n'                     },
+                { "network-veth-extra",    required_argument, NULL, ARG_NETWORK_VETH_EXTRA  },
+                { "network-bridge",        required_argument, NULL, ARG_NETWORK_BRIDGE      },
+                { "network-zone",          required_argument, NULL, ARG_NETWORK_ZONE        },
+                { "personality",           required_argument, NULL, ARG_PERSONALITY         },
+                { "image",                 required_argument, NULL, 'i'                     },
+                { "volatile",              optional_argument, NULL, ARG_VOLATILE            },
+                { "port",                  required_argument, NULL, 'p'                     },
+                { "property",              required_argument, NULL, ARG_PROPERTY            },
+                { "private-users",         optional_argument, NULL, ARG_PRIVATE_USERS       },
+                { "private-users-chown",   optional_argument, NULL, ARG_PRIVATE_USERS_CHOWN },
+                { "kill-signal",           required_argument, NULL, ARG_KILL_SIGNAL         },
+                { "settings",              required_argument, NULL, ARG_SETTINGS            },
+                { "chdir",                 required_argument, NULL, ARG_CHDIR               },
+                { "pivot-root",            required_argument, NULL, ARG_PIVOT_ROOT          },
+                { "notify-ready",          required_argument, NULL, ARG_NOTIFY_READY        },
+                { "root-hash",             required_argument, NULL, ARG_ROOT_HASH           },
                 {}
         };
 
@@ -436,7 +493,7 @@ static int parse_argv(int argc, char *argv[]) {
         assert(argc >= 0);
         assert(argv);
 
-        while ((c = getopt_long(argc, argv, "+hD:u:abL:M:jS:Z:qi:xp:nU", options, NULL)) >= 0)
+        while ((c = getopt_long(argc, argv, "+hD:u:abL:M:jS:Z:qi:xp:nUE:", options, NULL)) >= 0)
 
                 switch (c) {
 
@@ -621,9 +678,8 @@ static int parse_argv(int argc, char *argv[]) {
                                 r = free_and_strdup(&arg_machine, optarg);
                                 if (r < 0)
                                         return log_oom();
-
-                                break;
                         }
+                        break;
 
                 case 'Z':
                         arg_selinux_context = optarg;
@@ -725,69 +781,15 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case ARG_OVERLAY:
-                case ARG_OVERLAY_RO: {
-                        _cleanup_free_ char *upper = NULL, *destination = NULL;
-                        _cleanup_strv_free_ char **lower = NULL;
-                        CustomMount *m;
-                        unsigned n = 0;
-                        char **i;
-
-                        r = strv_split_extract(&lower, optarg, ":", EXTRACT_DONT_COALESCE_SEPARATORS);
-                        if (r == -ENOMEM)
-                                return log_oom();
-                        else if (r < 0) {
-                                log_error("Invalid overlay specification: %s", optarg);
-                                return r;
-                        }
-
-                        STRV_FOREACH(i, lower) {
-                                if (!path_is_absolute(*i)) {
-                                        log_error("Overlay path %s is not absolute.", *i);
-                                        return -EINVAL;
-                                }
-
-                                n++;
-                        }
-
-                        if (n < 2) {
-                                log_error("--overlay= needs at least two colon-separated directories specified.");
-                                return -EINVAL;
-                        }
-
-                        if (n == 2) {
-                                /* If two parameters are specified,
-                                 * the first one is the lower, the
-                                 * second one the upper directory. And
-                                 * we'll also define the destination
-                                 * mount point the same as the upper. */
-                                upper = lower[1];
-                                lower[1] = NULL;
-
-                                destination = strdup(upper);
-                                if (!destination)
-                                        return log_oom();
-
-                        } else {
-                                upper = lower[n - 2];
-                                destination = lower[n - 1];
-                                lower[n - 2] = NULL;
-                        }
-
-                        m = custom_mount_add(&arg_custom_mounts, &arg_n_custom_mounts, CUSTOM_MOUNT_OVERLAY);
-                        if (!m)
-                                return log_oom();
-
-                        m->destination = destination;
-                        m->source = upper;
-                        m->lower = lower;
-                        m->read_only = c == ARG_OVERLAY_RO;
-
-                        upper = destination = NULL;
-                        lower = NULL;
+                case ARG_OVERLAY_RO:
+                        r = overlay_mount_parse(&arg_custom_mounts, &arg_n_custom_mounts, optarg, c == ARG_OVERLAY_RO);
+                        if (r == -EADDRNOTAVAIL)
+                                return log_error_errno(r, "--overlay(-ro)= needs at least two colon-separated directories specified.");
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse --overlay(-ro)= argument %s: %m", optarg);
 
                         arg_settings_mask |= SETTING_CUSTOM_MOUNTS;
                         break;
-                }
 
                 case 'E': {
                         char **n;
@@ -813,7 +815,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case ARG_SHARE_SYSTEM:
-                        arg_share_system = true;
+                        /* We don't officially support this anymore, except for compat reasons. People should use the
+                         * $SYSTEMD_NSPAWN_SHARE_* environment variables instead. */
+                        arg_clone_ns_flags = 0;
                         break;
 
                 case ARG_REGISTER:
@@ -875,15 +879,21 @@ static int parse_argv(int argc, char *argv[]) {
 
                         break;
 
-                case ARG_PRIVATE_USERS:
+                case ARG_PRIVATE_USERS: {
+                        int boolean = -1;
 
-                        r = optarg ? parse_boolean(optarg) : 1;
-                        if (r == 0) {
+                        if (!optarg)
+                                boolean = true;
+                        else if (!in_charset(optarg, DIGITS))
+                                /* do *not* parse numbers as booleans */
+                                boolean = parse_boolean(optarg);
+
+                        if (boolean == false) {
                                 /* no: User namespacing off */
                                 arg_userns_mode = USER_NAMESPACE_NO;
                                 arg_uid_shift = UID_INVALID;
                                 arg_uid_range = UINT32_C(0x10000);
-                        } else if (r > 0) {
+                        } else if (boolean == true) {
                                 /* yes: User namespacing on, UID range is read from root dir */
                                 arg_userns_mode = USER_NAMESPACE_FIXED;
                                 arg_uid_shift = UID_INVALID;
@@ -907,23 +917,27 @@ static int parse_argv(int argc, char *argv[]) {
                                         shift = buffer;
 
                                         range++;
-                                        if (safe_atou32(range, &arg_uid_range) < 0 || arg_uid_range <= 0) {
-                                                log_error("Failed to parse UID range: %s", range);
-                                                return -EINVAL;
-                                        }
+                                        r = safe_atou32(range, &arg_uid_range);
+                                        if (r < 0)
+                                                return log_error_errno(r, "Failed to parse UID range \"%s\": %m", range);
                                 } else
                                         shift = optarg;
 
-                                if (parse_uid(shift, &arg_uid_shift) < 0) {
-                                        log_error("Failed to parse UID: %s", optarg);
-                                        return -EINVAL;
-                                }
+                                r = parse_uid(shift, &arg_uid_shift);
+                                if (r < 0)
+                                        return log_error_errno(r, "Failed to parse UID \"%s\": %m", optarg);
 
                                 arg_userns_mode = USER_NAMESPACE_FIXED;
                         }
 
+                        if (arg_uid_range <= 0) {
+                                log_error("UID range cannot be 0.");
+                                return -EINVAL;
+                        }
+
                         arg_settings_mask |= SETTING_USERNS;
                         break;
+                }
 
                 case 'U':
                         if (userns_supported()) {
@@ -1000,6 +1014,14 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_settings_mask |= SETTING_WORKING_DIRECTORY;
                         break;
 
+                case ARG_PIVOT_ROOT:
+                        r = pivot_root_parse(&arg_pivot_root_new, &arg_pivot_root_old, optarg);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse --pivot-root= argument %s: %m", optarg);
+
+                        arg_settings_mask |= SETTING_PIVOT_ROOT;
+                        break;
+
                 case ARG_NOTIFY_READY:
                         r = parse_boolean(optarg);
                         if (r < 0) {
@@ -1010,6 +1032,25 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_settings_mask |= SETTING_NOTIFY_READY;
                         break;
 
+                case ARG_ROOT_HASH: {
+                        void *k;
+                        size_t l;
+
+                        r = unhexmem(optarg, strlen(optarg), &k, &l);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse root hash: %s", optarg);
+                        if (l < sizeof(sd_id128_t)) {
+                                log_error("Root hash must be at least 128bit long: %s", optarg);
+                                free(k);
+                                return -EINVAL;
+                        }
+
+                        free(arg_root_hash);
+                        arg_root_hash = k;
+                        arg_root_hash_size = l;
+                        break;
+                }
+
                 case '?':
                         return -EINVAL;
 
@@ -1017,19 +1058,33 @@ static int parse_argv(int argc, char *argv[]) {
                         assert_not_reached("Unhandled option");
                 }
 
-        if (arg_share_system)
+        parse_share_ns_env("SYSTEMD_NSPAWN_SHARE_NS_IPC", CLONE_NEWIPC);
+        parse_share_ns_env("SYSTEMD_NSPAWN_SHARE_NS_PID", CLONE_NEWPID);
+        parse_share_ns_env("SYSTEMD_NSPAWN_SHARE_NS_UTS", CLONE_NEWUTS);
+        parse_share_ns_env("SYSTEMD_NSPAWN_SHARE_SYSTEM", CLONE_NEWIPC|CLONE_NEWPID|CLONE_NEWUTS);
+
+        if (arg_userns_mode != USER_NAMESPACE_NO)
+                arg_mount_settings |= MOUNT_USE_USERNS;
+
+        if (arg_private_network)
+                arg_mount_settings |= MOUNT_APPLY_APIVFS_NETNS;
+
+        parse_mount_settings_env();
+
+        if (!(arg_clone_ns_flags & CLONE_NEWPID) ||
+            !(arg_clone_ns_flags & CLONE_NEWUTS)) {
                 arg_register = false;
+                if (arg_start_mode != START_PID1) {
+                        log_error("--boot cannot be used without namespacing.");
+                        return -EINVAL;
+                }
+        }
 
         if (arg_userns_mode == USER_NAMESPACE_PICK)
                 arg_userns_chown = true;
 
-        if (arg_start_mode != START_PID1 && arg_share_system) {
-                log_error("--boot and --share-system may not be combined.");
-                return -EINVAL;
-        }
-
-        if (arg_keep_unit && cg_pid_get_owner_uid(0, NULL) >= 0) {
-                log_error("--keep-unit may not be used when invoked from a user session.");
+        if (arg_keep_unit && arg_register && cg_pid_get_owner_uid(0, NULL) >= 0) {
+                log_error("--keep-unit --register=yes may not be used when invoked from a user session.");
                 return -EINVAL;
         }
 
@@ -1043,6 +1098,16 @@ static int parse_argv(int argc, char *argv[]) {
                 return -EINVAL;
         }
 
+        if (arg_ephemeral && arg_template && !arg_directory) {
+                /* User asked for ephemeral execution but specified --template= instead of --directory=. Semantically
+                 * such an invocation makes some sense, see https://github.com/systemd/systemd/issues/3667. Let's
+                 * accept this here, and silently make "--ephemeral --template=" equivalent to "--ephemeral
+                 * --directory=". */
+
+                arg_directory = arg_template;
+                arg_template = NULL;
+        }
+
         if (arg_template && !(arg_directory || arg_machine)) {
                 log_error("--template= needs --directory= or --machine=.");
                 return -EINVAL;
@@ -1053,11 +1118,6 @@ static int parse_argv(int argc, char *argv[]) {
                 return -EINVAL;
         }
 
-        if (arg_ephemeral && arg_image) {
-                log_error("--ephemeral and --image= may not be combined.");
-                return -EINVAL;
-        }
-
         if (arg_ephemeral && !IN_SET(arg_link_journal, LINK_NO, LINK_AUTO)) {
                 log_error("--ephemeral and --link-journal= may not be combined.");
                 return -EINVAL;
@@ -1096,18 +1156,37 @@ static int parse_argv(int argc, char *argv[]) {
 
         arg_caps_retain = (arg_caps_retain | plus | (arg_private_network ? 1ULL << CAP_NET_ADMIN : 0)) & ~minus;
 
-        r = detect_unified_cgroup_hierarchy();
+        r = cg_unified_flush();
         if (r < 0)
-                return r;
+                return log_error_errno(r, "Failed to determine whether the unified cgroups hierarchy is used: %m");
 
         e = getenv("SYSTEMD_NSPAWN_CONTAINER_SERVICE");
         if (e)
                 arg_container_service_name = e;
 
+        r = getenv_bool("SYSTEMD_NSPAWN_USE_CGNS");
+        if (r < 0)
+                arg_use_cgns = cg_ns_supported();
+        else
+                arg_use_cgns = r;
+
+        r = custom_mount_check_all();
+        if (r < 0)
+                return r;
+
         return 1;
 }
 
 static int verify_arguments(void) {
+        if (arg_userns_mode != USER_NAMESPACE_NO && (arg_mount_settings & MOUNT_APPLY_APIVFS_NETNS) && !arg_private_network) {
+                log_error("Invalid namespacing settings. Mounting sysfs with --private-users requires --private-network.");
+                return -EINVAL;
+        }
+
+        if (arg_userns_mode != USER_NAMESPACE_NO && !(arg_mount_settings & MOUNT_APPLY_APIVFS_RO)) {
+                log_error("Cannot combine --private-users with read-write mounts.");
+                return -EINVAL;
+        }
 
         if (arg_volatile_mode != VOLATILE_NO && arg_read_only) {
                 log_error("Cannot combine --read-only with --volatile. Note that --volatile already implies a read-only base hierarchy.");
@@ -1185,7 +1264,13 @@ static int setup_timezone(const char *dest) {
         /* Fix the timezone, if possible */
         r = readlink_malloc("/etc/localtime", &p);
         if (r < 0) {
-                log_warning("/etc/localtime is not a symlink, not updating container timezone.");
+                log_warning("host's /etc/localtime is not a symlink, not updating container timezone.");
+                /* to handle warning, delete /etc/localtime and replace it
+                 * with a symbolic link to a time zone data file.
+                 *
+                 * Example:
+                 * ln -s /usr/share/zoneinfo/UTC /etc/localtime
+                 */
                 return 0;
         }
 
@@ -1216,15 +1301,18 @@ static int setup_timezone(const char *dest) {
                 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);
+        if (unlink(where) < 0 && errno != ENOENT) {
+                log_full_errno(IN_SET(errno, EROFS, EACCES, EPERM) ? LOG_DEBUG : LOG_WARNING, /* Don't complain on read-only images */
+                               errno,
+                               "Failed to remove existing timezone info %s in container, ignoring: %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");
+                log_full_errno(IN_SET(errno, EROFS, EACCES, EPERM) ? LOG_DEBUG : LOG_WARNING,
+                               errno,
+                               "Failed to correct timezone of container, ignoring: %m");
                 return 0;
         }
 
@@ -1235,36 +1323,90 @@ static int setup_timezone(const char *dest) {
         return 0;
 }
 
-static int setup_resolv_conf(const char *dest) {
-        const char *where = NULL;
+static int resolved_listening(void) {
+        _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+        _cleanup_free_ char *dns_stub_listener_mode = NULL;
         int r;
 
+        /* Check if resolved is listening */
+
+        r = sd_bus_open_system(&bus);
+        if (r < 0)
+                return r;
+
+        r = bus_name_has_owner(bus, "org.freedesktop.resolve1", NULL);
+        if (r <= 0)
+                return r;
+
+        r = sd_bus_get_property_string(bus,
+                                       "org.freedesktop.resolve1",
+                                       "/org/freedesktop/resolve1",
+                                       "org.freedesktop.resolve1.Manager",
+                                       "DNSStubListener",
+                                       NULL,
+                                       &dns_stub_listener_mode);
+        if (r < 0)
+                return r;
+
+        return STR_IN_SET(dns_stub_listener_mode, "udp", "yes");
+}
+
+static int setup_resolv_conf(const char *dest) {
+        _cleanup_free_ char *resolved = NULL, *etc = NULL;
+        const char *where;
+        int r, found;
+
         assert(dest);
 
         if (arg_private_network)
                 return 0;
 
-        /* Fix resolv.conf, if possible */
-        where = prefix_roota(dest, "/etc/resolv.conf");
+        r = chase_symlinks("/etc", dest, CHASE_PREFIX_ROOT, &etc);
+        if (r < 0) {
+                log_warning_errno(r, "Failed to resolve /etc path in container, ignoring: %m");
+                return 0;
+        }
+
+        where = strjoina(etc, "/resolv.conf");
+        found = chase_symlinks(where, dest, CHASE_NONEXISTENT, &resolved);
+        if (found < 0) {
+                log_warning_errno(found, "Failed to resolve /etc/resolv.conf path in container, ignoring: %m");
+                return 0;
+        }
+
+        if (access("/usr/lib/systemd/resolv.conf", F_OK) >= 0 &&
+            resolved_listening() > 0) {
+
+                /* resolved is enabled on the host. In this, case bind mount its static resolv.conf file into the
+                 * container, so that the container can use the host's resolver. Given that network namespacing is
+                 * disabled it's only natural of the container also uses the host's resolver. It also has the big
+                 * advantage that the container will be able to follow the host's DNS server configuration changes
+                 * transparently. */
+
+                if (found == 0) /* missing? */
+                        (void) touch(resolved);
 
-        r = copy_file("/etc/resolv.conf", where, O_TRUNC|O_NOFOLLOW, 0644, 0);
+                r = mount_verbose(LOG_DEBUG, "/usr/lib/systemd/resolv.conf", resolved, NULL, MS_BIND, NULL);
+                if (r >= 0)
+                        return mount_verbose(LOG_ERR, NULL, resolved, NULL, MS_BIND|MS_REMOUNT|MS_RDONLY|MS_NOSUID|MS_NODEV, NULL);
+        }
+
+        /* If that didn't work, let's copy the file */
+        r = copy_file("/etc/resolv.conf", where, O_TRUNC|O_NOFOLLOW, 0644, 0, COPY_REFLINK);
         if (r < 0) {
-                /* If the file already exists as symlink, let's
-                 * suppress the warning, under the assumption that
-                 * resolved or something similar runs inside and the
-                 * symlink points there.
+                /* If the file already exists as symlink, let's suppress the warning, under the assumption that
+                 * resolved or something similar runs inside and the symlink points there.
                  *
-                 * If the disk image is read-only, there's also no
-                 * point in complaining.
+                 * If the disk image is read-only, there's also no point in complaining.
                  */
-                log_full_errno(IN_SET(r, -ELOOP, -EROFS) ? LOG_DEBUG : LOG_WARNING, r,
-                               "Failed to copy /etc/resolv.conf to %s: %m", where);
+                log_full_errno(IN_SET(r, -ELOOP, -EROFS, -EACCES, -EPERM) ? LOG_DEBUG : LOG_WARNING, r,
+                               "Failed to copy /etc/resolv.conf to %s, ignoring: %m", where);
                 return 0;
         }
 
         r = userns_lchown(where, 0, 0);
         if (r < 0)
-                log_warning_errno(r, "Failed to chown /etc/resolv.conf: %m");
+                log_warning_errno(r, "Failed to chown /etc/resolv.conf, ignoring: %m");
 
         return 0;
 }
@@ -1274,9 +1416,6 @@ static int setup_boot_id(const char *dest) {
         const char *from, *to;
         int r;
 
-        if (arg_share_system)
-                return 0;
-
         /* Generate a new randomized boot ID, so that each boot-up of
          * the container gets a new one */
 
@@ -1291,10 +1430,10 @@ 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)
-                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, ignoring: %m");
+        r = mount_verbose(LOG_ERR, from, to, NULL, MS_BIND, NULL);
+        if (r >= 0)
+                r = mount_verbose(LOG_ERR, NULL, to, NULL,
+                                  MS_BIND|MS_REMOUNT|MS_RDONLY|MS_NOSUID|MS_NODEV, NULL);
 
         (void) unlink(from);
         return r;
@@ -1342,6 +1481,9 @@ static int copy_devnodes(const char *dest) {
 
                 } else {
                         if (mknod(to, st.st_mode, st.st_rdev) < 0) {
+                                /* Explicitly warn the user when /dev is already populated. */
+                                if (errno == EEXIST)
+                                        log_notice("%s/dev is pre-mounted and pre-populated. If a pre-mounted /dev is provided it needs to be an unpopulated file system.", dest);
                                 if (errno != EPERM)
                                         return log_error_errno(errno, "mknod(%s) failed: %m", to);
 
@@ -1350,8 +1492,9 @@ static int copy_devnodes(const char *dest) {
                                 r = touch(to);
                                 if (r < 0)
                                         return log_error_errno(r, "touch (%s) failed: %m", to);
-                                if (mount(from, to, NULL, MS_BIND, NULL) < 0)
-                                        return log_error_errno(errno, "Both mknod and bind mount (%s) failed: %m", to);
+                                r = mount_verbose(LOG_DEBUG, from, to, NULL, MS_BIND, NULL);
+                                if (r < 0)
+                                        return log_error_errno(r, "Both mknod and bind mount (%s) failed: %m", to);
                         }
 
                         r = userns_lchown(to, 0, 0);
@@ -1387,8 +1530,9 @@ static int setup_pts(const char *dest) {
         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");
+        r = mount_verbose(LOG_ERR, "devpts", p, "devpts", MS_NOSUID|MS_NOEXEC, options);
+        if (r < 0)
+                return r;
         r = userns_lchown(p, 0, 0);
         if (r < 0)
                 return log_error_errno(r, "Failed to chown /dev/pts: %m");
@@ -1433,10 +1577,7 @@ static int setup_dev_console(const char *dest, const char *console) {
         if (r < 0)
                 return log_error_errno(r, "touch() for /dev/console failed: %m");
 
-        if (mount(console, to, NULL, MS_BIND, NULL) < 0)
-                return log_error_errno(errno, "Bind mount for /dev/console failed: %m");
-
-        return 0;
+        return mount_verbose(LOG_ERR, console, to, NULL, MS_BIND, NULL);
 }
 
 static int setup_kmsg(const char *dest, int kmsg_socket) {
@@ -1460,8 +1601,9 @@ static int setup_kmsg(const char *dest, int kmsg_socket) {
 
         if (mkfifo(from, 0600) < 0)
                 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");
+        r = mount_verbose(LOG_ERR, from, to, NULL, MS_BIND, NULL);
+        if (r < 0)
+                return r;
 
         fd = open(from, O_RDWR|O_NDELAY|O_CLOEXEC);
         if (fd < 0)
@@ -1494,7 +1636,7 @@ static int on_address_change(sd_netlink *rtnl, sd_netlink_message *m, void *user
 
 static int setup_hostname(void) {
 
-        if (arg_share_system)
+        if ((arg_clone_ns_flags & CLONE_NEWUTS) == 0)
                 return 0;
 
         if (sethostname_idempotent(arg_machine) < 0)
@@ -1549,7 +1691,7 @@ static int setup_journal(const char *directory) {
         p = strjoina("/var/log/journal/", id);
         q = prefix_roota(directory, p);
 
-        if (path_is_mount_point(p, 0) > 0) {
+        if (path_is_mount_point(p, NULL, 0) > 0) {
                 if (try)
                         return 0;
 
@@ -1557,7 +1699,7 @@ static int setup_journal(const char *directory) {
                 return -EEXIST;
         }
 
-        if (path_is_mount_point(q, 0) > 0) {
+        if (path_is_mount_point(q, NULL, 0) > 0) {
                 if (try)
                         return 0;
 
@@ -1631,7 +1773,8 @@ static int setup_journal(const char *directory) {
         if (r < 0)
                 return log_error_errno(r, "Failed to create %s: %m", q);
 
-        if (mount(p, q, NULL, MS_BIND, NULL) < 0)
+        r = mount_verbose(LOG_DEBUG, p, q, NULL, MS_BIND, NULL);
+        if (r < 0)
                 return log_error_errno(errno, "Failed to bind mount journal from host into guest: %m");
 
         return 0;
@@ -1645,7 +1788,7 @@ static int reset_audit_loginuid(void) {
         _cleanup_free_ char *p = NULL;
         int r;
 
-        if (arg_share_system)
+        if ((arg_clone_ns_flags & CLONE_NEWPID) == 0)
                 return 0;
 
         r = read_one_line_file("/proc/self/loginuid", &p);
@@ -1696,698 +1839,131 @@ static int setup_propagate(const char *root) {
                 return log_error_errno(r, "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.");
+        r = mount_verbose(LOG_ERR, p, q, NULL, MS_BIND, NULL);
+        if (r < 0)
+                return r;
 
-        if (mount(NULL, q, NULL, MS_BIND|MS_REMOUNT|MS_RDONLY, NULL) < 0)
-                return log_error_errno(errno, "Failed to make propagation mount read-only");
+        r = mount_verbose(LOG_ERR, NULL, q, NULL, MS_BIND|MS_REMOUNT|MS_RDONLY, NULL);
+        if (r < 0)
+                return r;
 
-        return 0;
+        /* machined will MS_MOVE into that directory, and that's only
+         * supported for non-shared mounts. */
+        return mount_verbose(LOG_ERR, NULL, q, NULL, MS_SLAVE, NULL);
 }
 
-static int setup_image(char **device_path, int *loop_nr) {
-        struct loop_info64 info = {
-                .lo_flags = LO_FLAGS_AUTOCLEAR|LO_FLAGS_PARTSCAN
-        };
-        _cleanup_close_ int fd = -1, control = -1, loop = -1;
-        _cleanup_free_ char* loopdev = NULL;
-        struct stat st;
-        int r, nr;
+static int setup_machine_id(const char *directory) {
+        const char *etc_machine_id;
+        sd_id128_t id;
+        int r;
 
-        assert(device_path);
-        assert(loop_nr);
-        assert(arg_image);
+        /* If the UUID in the container is already set, then that's what counts, and we use. If it isn't set, and the
+         * caller passed --uuid=, then we'll pass it in the $container_uuid env var to PID 1 of the container. The
+         * assumption is that PID 1 will then write it to /etc/machine-id to make it persistent. If --uuid= is not
+         * passed we generate a random UUID, and pass it via $container_uuid. In effect this means that /etc/machine-id
+         * in the container and our idea of the container UUID will always be in sync (at least if PID 1 in the
+         * container behaves nicely). */
 
-        fd = open(arg_image, O_CLOEXEC|(arg_read_only ? O_RDONLY : O_RDWR)|O_NONBLOCK|O_NOCTTY);
-        if (fd < 0)
-                return log_error_errno(errno, "Failed to open %s: %m", arg_image);
+        etc_machine_id = prefix_roota(directory, "/etc/machine-id");
 
-        if (fstat(fd, &st) < 0)
-                return log_error_errno(errno, "Failed to stat %s: %m", arg_image);
+        r = id128_read(etc_machine_id, ID128_PLAIN, &id);
+        if (r < 0) {
+                if (!IN_SET(r, -ENOENT, -ENOMEDIUM)) /* If the file is missing or empty, we don't mind */
+                        return log_error_errno(r, "Failed to read machine ID from container image: %m");
 
-        if (S_ISBLK(st.st_mode)) {
-                char *p;
+                if (sd_id128_is_null(arg_uuid)) {
+                        r = sd_id128_randomize(&arg_uuid);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to acquire randomized machine UUID: %m");
+                }
+        } else {
+                if (sd_id128_is_null(id)) {
+                        log_error("Machine ID in container image is zero, refusing.");
+                        return -EINVAL;
+                }
 
-                p = strdup(arg_image);
-                if (!p)
-                        return log_oom();
+                arg_uuid = id;
+        }
 
-                *device_path = p;
+        return 0;
+}
 
-                *loop_nr = -1;
+static int recursive_chown(const char *directory, uid_t shift, uid_t range) {
+        int r;
 
-                r = fd;
-                fd = -1;
+        assert(directory);
 
-                return r;
-        }
+        if (arg_userns_mode == USER_NAMESPACE_NO || !arg_userns_chown)
+                return 0;
 
-        if (!S_ISREG(st.st_mode)) {
-                log_error("%s is not a regular file or block device.", arg_image);
-                return -EINVAL;
-        }
+        r = path_patch_uid(directory, arg_uid_shift, arg_uid_range);
+        if (r == -EOPNOTSUPP)
+                return log_error_errno(r, "Automatic UID/GID adjusting is only supported for UID/GID ranges starting at multiples of 2^16 with a range of 2^16.");
+        if (r == -EBADE)
+                return log_error_errno(r, "Upper 16 bits of root directory UID and GID do not match.");
+        if (r < 0)
+                return log_error_errno(r, "Failed to adjust UID/GID shift of OS tree: %m");
+        if (r == 0)
+                log_debug("Root directory of image is already owned by the right UID/GID range, skipping recursive chown operation.");
+        else
+                log_debug("Patched directory tree to match UID/GID range.");
 
-        control = open("/dev/loop-control", O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK);
-        if (control < 0)
-                return log_error_errno(errno, "Failed to open /dev/loop-control: %m");
+        return r;
+}
 
-        nr = ioctl(control, LOOP_CTL_GET_FREE);
-        if (nr < 0)
-                return log_error_errno(errno, "Failed to allocate loop device: %m");
+/*
+ * Return values:
+ * < 0 : wait_for_terminate() failed to get the state of the
+ *       container, the container was terminated by a signal, or
+ *       failed for an unknown reason.  No change is made to the
+ *       container argument.
+ * > 0 : The program executed in the container terminated with an
+ *       error.  The exit code of the program executed in the
+ *       container is returned.  The container argument has been set
+ *       to CONTAINER_TERMINATED.
+ *   0 : The container is being rebooted, has been shut down or exited
+ *       successfully.  The container argument has been set to either
+ *       CONTAINER_TERMINATED or CONTAINER_REBOOTED.
+ *
+ * That is, success is indicated by a return value of zero, and an
+ * error is indicated by a non-zero value.
+ */
+static int wait_for_container(pid_t pid, ContainerStatus *container) {
+        siginfo_t status;
+        int r;
 
-        if (asprintf(&loopdev, "/dev/loop%i", nr) < 0)
-                return log_oom();
+        r = wait_for_terminate(pid, &status);
+        if (r < 0)
+                return log_warning_errno(r, "Failed to wait for container: %m");
 
-        loop = open(loopdev, O_CLOEXEC|(arg_read_only ? O_RDONLY : O_RDWR)|O_NONBLOCK|O_NOCTTY);
-        if (loop < 0)
-                return log_error_errno(errno, "Failed to open loop device %s: %m", loopdev);
+        switch (status.si_code) {
 
-        if (ioctl(loop, LOOP_SET_FD, fd) < 0)
-                return log_error_errno(errno, "Failed to set loopback file descriptor on %s: %m", loopdev);
+        case CLD_EXITED:
+                if (status.si_status == 0)
+                        log_full(arg_quiet ? LOG_DEBUG : LOG_INFO, "Container %s exited successfully.", arg_machine);
+                else
+                        log_full(arg_quiet ? LOG_DEBUG : LOG_INFO, "Container %s failed with error code %i.", arg_machine, status.si_status);
 
-        if (arg_read_only)
-                info.lo_flags |= LO_FLAGS_READ_ONLY;
+                *container = CONTAINER_TERMINATED;
+                return status.si_status;
 
-        if (ioctl(loop, LOOP_SET_STATUS64, &info) < 0)
-                return log_error_errno(errno, "Failed to set loopback settings on %s: %m", loopdev);
+        case CLD_KILLED:
+                if (status.si_status == SIGINT) {
+                        log_full(arg_quiet ? LOG_DEBUG : LOG_INFO, "Container %s has been shut down.", arg_machine);
+                        *container = CONTAINER_TERMINATED;
+                        return 0;
 
-        *device_path = loopdev;
-        loopdev = NULL;
+                } else if (status.si_status == SIGHUP) {
+                        log_full(arg_quiet ? LOG_DEBUG : LOG_INFO, "Container %s is being rebooted.", arg_machine);
+                        *container = CONTAINER_REBOOTED;
+                        return 0;
+                }
 
-        *loop_nr = nr;
+                /* fall through */
 
-        r = loop;
-        loop = -1;
-
-        return r;
-}
-
-#define PARTITION_TABLE_BLURB \
-        "Note that the disk image needs to either contain only a single MBR partition of\n" \
-        "type 0x83 that is marked bootable, or a single GPT partition of type " \
-        "0FC63DAF-8483-4772-8E79-3D69D8477DE4 or follow\n" \
-        "    http://www.freedesktop.org/wiki/Specifications/DiscoverablePartitionsSpec/\n" \
-        "to be bootable with systemd-nspawn."
-
-static int dissect_image(
-                int fd,
-                char **root_device, bool *root_device_rw,
-                char **home_device, bool *home_device_rw,
-                char **srv_device, bool *srv_device_rw,
-                bool *secondary) {
-
-#ifdef HAVE_BLKID
-        int home_nr = -1, srv_nr = -1;
-#ifdef GPT_ROOT_NATIVE
-        int root_nr = -1;
-#endif
-#ifdef GPT_ROOT_SECONDARY
-        int secondary_root_nr = -1;
-#endif
-        _cleanup_free_ char *home = NULL, *root = NULL, *secondary_root = NULL, *srv = NULL, *generic = NULL;
-        _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
-        _cleanup_udev_device_unref_ struct udev_device *d = NULL;
-        _cleanup_blkid_free_probe_ blkid_probe b = NULL;
-        _cleanup_udev_unref_ struct udev *udev = NULL;
-        struct udev_list_entry *first, *item;
-        bool home_rw = true, root_rw = true, secondary_root_rw = true, srv_rw = true, generic_rw = true;
-        bool is_gpt, is_mbr, multiple_generic = false;
-        const char *pttype = NULL;
-        blkid_partlist pl;
-        struct stat st;
-        unsigned i;
-        int r;
-
-        assert(fd >= 0);
-        assert(root_device);
-        assert(home_device);
-        assert(srv_device);
-        assert(secondary);
-        assert(arg_image);
-
-        b = blkid_new_probe();
-        if (!b)
-                return log_oom();
-
-        errno = 0;
-        r = blkid_probe_set_device(b, fd, 0, 0);
-        if (r != 0) {
-                if (errno == 0)
-                        return log_oom();
-
-                return log_error_errno(errno, "Failed to set device on blkid probe: %m");
-        }
-
-        blkid_probe_enable_partitions(b, 1);
-        blkid_probe_set_partitions_flags(b, BLKID_PARTS_ENTRY_DETAILS);
-
-        errno = 0;
-        r = blkid_do_safeprobe(b);
-        if (r == -2 || r == 1) {
-                log_error("Failed to identify any partition table on\n"
-                          "    %s\n"
-                          PARTITION_TABLE_BLURB, arg_image);
-                return -EINVAL;
-        } else if (r != 0) {
-                if (errno == 0)
-                        errno = EIO;
-                return log_error_errno(errno, "Failed to probe: %m");
-        }
-
-        (void) blkid_probe_lookup_value(b, "PTTYPE", &pttype, NULL);
-
-        is_gpt = streq_ptr(pttype, "gpt");
-        is_mbr = streq_ptr(pttype, "dos");
-
-        if (!is_gpt && !is_mbr) {
-                log_error("No GPT or MBR partition table discovered on\n"
-                          "    %s\n"
-                          PARTITION_TABLE_BLURB, arg_image);
-                return -EINVAL;
-        }
-
-        errno = 0;
-        pl = blkid_probe_get_partitions(b);
-        if (!pl) {
-                if (errno == 0)
-                        return log_oom();
-
-                log_error("Failed to list partitions of %s", arg_image);
-                return -errno;
-        }
-
-        udev = udev_new();
-        if (!udev)
-                return log_oom();
-
-        if (fstat(fd, &st) < 0)
-                return log_error_errno(errno, "Failed to stat block device: %m");
-
-        d = udev_device_new_from_devnum(udev, 'b', st.st_rdev);
-        if (!d)
-                return log_oom();
-
-        for (i = 0;; i++) {
-                int n, m;
-
-                if (i >= 10) {
-                        log_error("Kernel partitions never appeared.");
-                        return -ENXIO;
-                }
-
-                e = udev_enumerate_new(udev);
-                if (!e)
-                        return log_oom();
-
-                r = udev_enumerate_add_match_parent(e, d);
-                if (r < 0)
-                        return log_oom();
-
-                r = udev_enumerate_scan_devices(e);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to scan for partition devices of %s: %m", arg_image);
-
-                /* Count the partitions enumerated by the kernel */
-                n = 0;
-                first = udev_enumerate_get_list_entry(e);
-                udev_list_entry_foreach(item, first)
-                        n++;
-
-                /* Count the partitions enumerated by blkid */
-                m = blkid_partlist_numof_partitions(pl);
-                if (n == m + 1)
-                        break;
-                if (n > m + 1) {
-                        log_error("blkid and kernel partition list do not match.");
-                        return -EIO;
-                }
-                if (n < m + 1) {
-                        unsigned j;
-
-                        /* The kernel has probed fewer partitions than
-                         * blkid? Maybe the kernel prober is still
-                         * running or it got EBUSY because udev
-                         * already opened the device. Let's reprobe
-                         * the device, which is a synchronous call
-                         * that waits until probing is complete. */
-
-                        for (j = 0; j < 20; j++) {
-
-                                r = ioctl(fd, BLKRRPART, 0);
-                                if (r < 0)
-                                        r = -errno;
-                                if (r >= 0 || r != -EBUSY)
-                                        break;
-
-                                /* If something else has the device
-                                 * open, such as an udev rule, the
-                                 * ioctl will return EBUSY. Since
-                                 * there's no way to wait until it
-                                 * isn't busy anymore, let's just wait
-                                 * a bit, and try again.
-                                 *
-                                 * This is really something they
-                                 * should fix in the kernel! */
-
-                                usleep(50 * USEC_PER_MSEC);
-                        }
-
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to reread partition table: %m");
-                }
-
-                e = udev_enumerate_unref(e);
-        }
-
-        first = udev_enumerate_get_list_entry(e);
-        udev_list_entry_foreach(item, first) {
-                _cleanup_udev_device_unref_ struct udev_device *q;
-                const char *node;
-                unsigned long long flags;
-                blkid_partition pp;
-                dev_t qn;
-                int nr;
-
-                errno = 0;
-                q = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item));
-                if (!q) {
-                        if (!errno)
-                                errno = ENOMEM;
-
-                        return log_error_errno(errno, "Failed to get partition device of %s: %m", arg_image);
-                }
-
-                qn = udev_device_get_devnum(q);
-                if (major(qn) == 0)
-                        continue;
-
-                if (st.st_rdev == qn)
-                        continue;
-
-                node = udev_device_get_devnode(q);
-                if (!node)
-                        continue;
-
-                pp = blkid_partlist_devno_to_partition(pl, qn);
-                if (!pp)
-                        continue;
-
-                flags = blkid_partition_get_flags(pp);
-
-                nr = blkid_partition_get_partno(pp);
-                if (nr < 0)
-                        continue;
-
-                if (is_gpt) {
-                        sd_id128_t type_id;
-                        const char *stype;
-
-                        if (flags & GPT_FLAG_NO_AUTO)
-                                continue;
-
-                        stype = blkid_partition_get_type_string(pp);
-                        if (!stype)
-                                continue;
-
-                        if (sd_id128_from_string(stype, &type_id) < 0)
-                                continue;
-
-                        if (sd_id128_equal(type_id, GPT_HOME)) {
-
-                                if (home && nr >= home_nr)
-                                        continue;
-
-                                home_nr = nr;
-                                home_rw = !(flags & GPT_FLAG_READ_ONLY);
-
-                                r = free_and_strdup(&home, node);
-                                if (r < 0)
-                                        return log_oom();
-
-                        } else if (sd_id128_equal(type_id, GPT_SRV)) {
-
-                                if (srv && nr >= srv_nr)
-                                        continue;
-
-                                srv_nr = nr;
-                                srv_rw = !(flags & GPT_FLAG_READ_ONLY);
-
-                                r = free_and_strdup(&srv, node);
-                                if (r < 0)
-                                        return log_oom();
-                        }
-#ifdef GPT_ROOT_NATIVE
-                        else if (sd_id128_equal(type_id, GPT_ROOT_NATIVE)) {
-
-                                if (root && nr >= root_nr)
-                                        continue;
-
-                                root_nr = nr;
-                                root_rw = !(flags & GPT_FLAG_READ_ONLY);
-
-                                r = free_and_strdup(&root, node);
-                                if (r < 0)
-                                        return log_oom();
-                        }
-#endif
-#ifdef GPT_ROOT_SECONDARY
-                        else if (sd_id128_equal(type_id, GPT_ROOT_SECONDARY)) {
-
-                                if (secondary_root && nr >= secondary_root_nr)
-                                        continue;
-
-                                secondary_root_nr = nr;
-                                secondary_root_rw = !(flags & GPT_FLAG_READ_ONLY);
-
-                                r = free_and_strdup(&secondary_root, node);
-                                if (r < 0)
-                                        return log_oom();
-                        }
-#endif
-                        else if (sd_id128_equal(type_id, GPT_LINUX_GENERIC)) {
-
-                                if (generic)
-                                        multiple_generic = true;
-                                else {
-                                        generic_rw = !(flags & GPT_FLAG_READ_ONLY);
-
-                                        r = free_and_strdup(&generic, node);
-                                        if (r < 0)
-                                                return log_oom();
-                                }
-                        }
-
-                } else if (is_mbr) {
-                        int type;
-
-                        if (flags != 0x80) /* Bootable flag */
-                                continue;
-
-                        type = blkid_partition_get_type(pp);
-                        if (type != 0x83) /* Linux partition */
-                                continue;
-
-                        if (generic)
-                                multiple_generic = true;
-                        else {
-                                generic_rw = true;
-
-                                r = free_and_strdup(&root, node);
-                                if (r < 0)
-                                        return log_oom();
-                        }
-                }
-        }
-
-        if (root) {
-                *root_device = root;
-                root = NULL;
-
-                *root_device_rw = root_rw;
-                *secondary = false;
-        } else if (secondary_root) {
-                *root_device = secondary_root;
-                secondary_root = NULL;
-
-                *root_device_rw = secondary_root_rw;
-                *secondary = true;
-        } else if (generic) {
-
-                /* There were no partitions with precise meanings
-                 * around, but we found generic partitions. In this
-                 * case, if there's only one, we can go ahead and boot
-                 * it, otherwise we bail out, because we really cannot
-                 * make any sense of it. */
-
-                if (multiple_generic) {
-                        log_error("Identified multiple bootable Linux partitions on\n"
-                                  "    %s\n"
-                                  PARTITION_TABLE_BLURB, arg_image);
-                        return -EINVAL;
-                }
-
-                *root_device = generic;
-                generic = NULL;
-
-                *root_device_rw = generic_rw;
-                *secondary = false;
-        } else {
-                log_error("Failed to identify root partition in disk image\n"
-                          "    %s\n"
-                          PARTITION_TABLE_BLURB, arg_image);
-                return -EINVAL;
-        }
-
-        if (home) {
-                *home_device = home;
-                home = NULL;
-
-                *home_device_rw = home_rw;
-        }
-
-        if (srv) {
-                *srv_device = srv;
-                srv = NULL;
-
-                *srv_device_rw = srv_rw;
-        }
-
-        return 0;
-#else
-        log_error("--image= is not supported, compiled without blkid support.");
-        return -EOPNOTSUPP;
-#endif
-}
-
-static int mount_device(const char *what, const char *where, const char *directory, bool rw) {
-#ifdef HAVE_BLKID
-        _cleanup_blkid_free_probe_ blkid_probe b = NULL;
-        const char *fstype, *p;
-        int r;
-
-        assert(what);
-        assert(where);
-
-        if (arg_read_only)
-                rw = false;
-
-        if (directory)
-                p = strjoina(where, directory);
-        else
-                p = where;
-
-        errno = 0;
-        b = blkid_new_probe_from_filename(what);
-        if (!b) {
-                if (errno == 0)
-                        return log_oom();
-                return log_error_errno(errno, "Failed to allocate prober for %s: %m", what);
-        }
-
-        blkid_probe_enable_superblocks(b, 1);
-        blkid_probe_set_superblocks_flags(b, BLKID_SUBLKS_TYPE);
-
-        errno = 0;
-        r = blkid_do_safeprobe(b);
-        if (r == -1 || r == 1) {
-                log_error("Cannot determine file system type of %s", what);
-                return -EINVAL;
-        } else if (r != 0) {
-                if (errno == 0)
-                        errno = EIO;
-                return log_error_errno(errno, "Failed to probe %s: %m", what);
-        }
-
-        errno = 0;
-        if (blkid_probe_lookup_value(b, "TYPE", &fstype, NULL) < 0) {
-                if (errno == 0)
-                        errno = EINVAL;
-                log_error("Failed to determine file system type of %s", what);
-                return -errno;
-        }
-
-        if (streq(fstype, "crypto_LUKS")) {
-                log_error("nspawn currently does not support LUKS disk images.");
-                return -EOPNOTSUPP;
-        }
-
-        if (mount(what, p, fstype, MS_NODEV|(rw ? 0 : MS_RDONLY), NULL) < 0)
-                return log_error_errno(errno, "Failed to mount %s: %m", what);
-
-        return 0;
-#else
-        log_error("--image= is not supported, compiled without blkid support.");
-        return -EOPNOTSUPP;
-#endif
-}
-
-static int setup_machine_id(const char *directory) {
-        const char *etc_machine_id;
-        sd_id128_t id;
-        int r;
-
-        /* If the UUID in the container is already set, then that's what counts, and we use. If it isn't set, and the
-         * caller passed --uuid=, then we'll pass it in the $container_uuid env var to PID 1 of the container. The
-         * assumption is that PID 1 will then write it to /etc/machine-id to make it persistent. If --uuid= is not
-         * passed we generate a random UUID, and pass it via $container_uuid. In effect this means that /etc/machine-id
-         * in the container and our idea of the container UUID will always be in sync (at least if PID 1 in the
-         * container behaves nicely). */
-
-        etc_machine_id = prefix_roota(directory, "/etc/machine-id");
-
-        r = id128_read(etc_machine_id, ID128_PLAIN, &id);
-        if (r < 0) {
-                if (!IN_SET(r, -ENOENT, -ENOMEDIUM)) /* If the file is missing or empty, we don't mind */
-                        return log_error_errno(r, "Failed to read machine ID from container image: %m");
-
-                if (sd_id128_is_null(arg_uuid)) {
-                        r = sd_id128_randomize(&arg_uuid);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to acquire randomized machine UUID: %m");
-                }
-        } else {
-                if (sd_id128_is_null(id)) {
-                        log_error("Machine ID in container image is zero, refusing.");
-                        return -EINVAL;
-                }
-
-                arg_uuid = id;
-        }
-
-        return 0;
-}
-
-static int recursive_chown(const char *directory, uid_t shift, uid_t range) {
-        int r;
-
-        assert(directory);
-
-        if (arg_userns_mode == USER_NAMESPACE_NO || !arg_userns_chown)
-                return 0;
-
-        r = path_patch_uid(directory, arg_uid_shift, arg_uid_range);
-        if (r == -EOPNOTSUPP)
-                return log_error_errno(r, "Automatic UID/GID adjusting is only supported for UID/GID ranges starting at multiples of 2^16 with a range of 2^16.");
-        if (r == -EBADE)
-                return log_error_errno(r, "Upper 16 bits of root directory UID and GID do not match.");
-        if (r < 0)
-                return log_error_errno(r, "Failed to adjust UID/GID shift of OS tree: %m");
-        if (r == 0)
-                log_debug("Root directory of image is already owned by the right UID/GID range, skipping recursive chown operation.");
-        else
-                log_debug("Patched directory tree to match UID/GID range.");
-
-        return r;
-}
-
-static int mount_devices(
-                const char *where,
-                const char *root_device, bool root_device_rw,
-                const char *home_device, bool home_device_rw,
-                const char *srv_device, bool srv_device_rw) {
-        int r;
-
-        assert(where);
-
-        if (root_device) {
-                r = mount_device(root_device, arg_directory, NULL, root_device_rw);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to mount root directory: %m");
-        }
-
-        if (home_device) {
-                r = mount_device(home_device, arg_directory, "/home", home_device_rw);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to mount home directory: %m");
-        }
-
-        if (srv_device) {
-                r = mount_device(srv_device, arg_directory, "/srv", srv_device_rw);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to mount server data directory: %m");
-        }
-
-        return 0;
-}
-
-static void loop_remove(int nr, int *image_fd) {
-        _cleanup_close_ int control = -1;
-        int r;
-
-        if (nr < 0)
-                return;
-
-        if (image_fd && *image_fd >= 0) {
-                r = ioctl(*image_fd, LOOP_CLR_FD);
-                if (r < 0)
-                        log_debug_errno(errno, "Failed to close loop image: %m");
-                *image_fd = safe_close(*image_fd);
-        }
-
-        control = open("/dev/loop-control", O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK);
-        if (control < 0) {
-                log_warning_errno(errno, "Failed to open /dev/loop-control: %m");
-                return;
-        }
-
-        r = ioctl(control, LOOP_CTL_REMOVE, nr);
-        if (r < 0)
-                log_debug_errno(errno, "Failed to remove loop %d: %m", nr);
-}
-
-/*
- * Return values:
- * < 0 : wait_for_terminate() failed to get the state of the
- *       container, the container was terminated by a signal, or
- *       failed for an unknown reason.  No change is made to the
- *       container argument.
- * > 0 : The program executed in the container terminated with an
- *       error.  The exit code of the program executed in the
- *       container is returned.  The container argument has been set
- *       to CONTAINER_TERMINATED.
- *   0 : The container is being rebooted, has been shut down or exited
- *       successfully.  The container argument has been set to either
- *       CONTAINER_TERMINATED or CONTAINER_REBOOTED.
- *
- * That is, success is indicated by a return value of zero, and an
- * error is indicated by a non-zero value.
- */
-static int wait_for_container(pid_t pid, ContainerStatus *container) {
-        siginfo_t status;
-        int r;
-
-        r = wait_for_terminate(pid, &status);
-        if (r < 0)
-                return log_warning_errno(r, "Failed to wait for container: %m");
-
-        switch (status.si_code) {
-
-        case CLD_EXITED:
-                if (status.si_status == 0)
-                        log_full(arg_quiet ? LOG_DEBUG : LOG_INFO, "Container %s exited successfully.", arg_machine);
-                else
-                        log_full(arg_quiet ? LOG_DEBUG : LOG_INFO, "Container %s failed with error code %i.", arg_machine, status.si_status);
-
-                *container = CONTAINER_TERMINATED;
-                return status.si_status;
-
-        case CLD_KILLED:
-                if (status.si_status == SIGINT) {
-                        log_full(arg_quiet ? LOG_DEBUG : LOG_INFO, "Container %s has been shut down.", arg_machine);
-                        *container = CONTAINER_TERMINATED;
-                        return 0;
-
-                } else if (status.si_status == SIGHUP) {
-                        log_full(arg_quiet ? LOG_DEBUG : LOG_INFO, "Container %s is being rebooted.", arg_machine);
-                        *container = CONTAINER_REBOOTED;
-                        return 0;
-                }
-
-                /* CLD_KILLED fallthrough */
-
-        case CLD_DUMPED:
-                log_error("Container %s terminated by signal %s.", arg_machine, signal_to_string(status.si_status));
-                return -EIO;
+        case CLD_DUMPED:
+                log_error("Container %s terminated by signal %s.", arg_machine, signal_to_string(status.si_status));
+                return -EIO;
 
         default:
                 log_error("Container %s failed due to unknown reason.", arg_machine);
@@ -2411,6 +1987,26 @@ static int on_orderly_shutdown(sd_event_source *s, const struct signalfd_siginfo
         return 0;
 }
 
+static int on_sigchld(sd_event_source *s, const struct signalfd_siginfo *ssi, void *userdata) {
+        for (;;) {
+                siginfo_t si = {};
+                if (waitid(P_ALL, 0, &si, WNOHANG|WNOWAIT|WEXITED) < 0)
+                        return log_error_errno(errno, "Failed to waitid(): %m");
+                if (si.si_pid == 0) /* No pending children. */
+                        break;
+                if (si.si_pid == PTR_TO_PID(userdata)) {
+                        /* The main process we care for has exited. Return from
+                         * signal handler but leave the zombie. */
+                        sd_event_exit(sd_event_source_get_event(s), 0);
+                        break;
+                }
+                /* Reap all other children. */
+                (void) waitid(P_PID, si.si_pid, &si, WNOHANG|WEXITED);
+        }
+
+        return 0;
+}
+
 static int determine_names(void) {
         int r;
 
@@ -2420,7 +2016,7 @@ static int determine_names(void) {
                  * search for a machine, but instead create a new one
                  * in /var/lib/machine. */
 
-                arg_directory = strjoin("/var/lib/machines/", arg_machine, NULL);
+                arg_directory = strjoin("/var/lib/machines/", arg_machine);
                 if (!arg_directory)
                         return log_oom();
         }
@@ -2432,8 +2028,8 @@ static int determine_names(void) {
                         r = image_find(arg_machine, &i);
                         if (r < 0)
                                 return log_error_errno(r, "Failed to find image for machine '%s': %m", arg_machine);
-                        else if (r == 0) {
-                                log_error("No image for machine '%s': %m", arg_machine);
+                        if (r == 0) {
+                                log_error("No image for machine '%s'.", arg_machine);
                                 return -ENOENT;
                         }
 
@@ -2442,25 +2038,36 @@ static int determine_names(void) {
                         else
                                 r = free_and_strdup(&arg_directory, i->path);
                         if (r < 0)
-                                return log_error_errno(r, "Invalid image directory: %m");
+                                return log_oom();
 
                         if (!arg_ephemeral)
                                 arg_read_only = arg_read_only || i->read_only;
                 } else
                         arg_directory = get_current_dir_name();
 
-                if (!arg_directory && !arg_machine) {
+                if (!arg_directory && !arg_image) {
                         log_error("Failed to determine path, please use -D or -i.");
                         return -EINVAL;
                 }
         }
 
         if (!arg_machine) {
+
                 if (arg_directory && path_equal(arg_directory, "/"))
                         arg_machine = gethostname_malloc();
-                else
-                        arg_machine = strdup(basename(arg_image ?: arg_directory));
+                else {
+                        if (arg_image) {
+                                char *e;
 
+                                arg_machine = strdup(basename(arg_image));
+
+                                /* Truncate suffix if there is one */
+                                e = endswith(arg_machine, ".raw");
+                                if (e)
+                                        *e = 0;
+                        } else
+                                arg_machine = strdup(basename(arg_directory));
+                }
                 if (!arg_machine)
                         return log_oom();
 
@@ -2489,6 +2096,25 @@ static int determine_names(void) {
         return 0;
 }
 
+static int chase_symlinks_and_update(char **p, unsigned flags) {
+        char *chased;
+        int r;
+
+        assert(p);
+
+        if (!*p)
+                return 0;
+
+        r = chase_symlinks(*p, NULL, flags, &chased);
+        if (r < 0)
+                return log_error_errno(r, "Failed to resolve path %s: %m", *p);
+
+        free(*p);
+        *p = chased;
+
+        return 0;
+}
+
 static int determine_uid_shift(const char *directory) {
         int r;
 
@@ -2546,6 +2172,7 @@ static int inner_child(
                 NULL, /* NOTIFY_SOCKET */
                 NULL
         };
+        const char *exec_target;
 
         _cleanup_strv_free_ char **env_use = NULL;
         int r;
@@ -2554,8 +2181,6 @@ static int inner_child(
         assert(directory);
         assert(kmsg_socket >= 0);
 
-        cg_unified_flush();
-
         if (arg_userns_mode != USER_NAMESPACE_NO) {
                 /* Tell the parent, that it now can write the UID map. */
                 (void) barrier_place(barrier); /* #1 */
@@ -2567,10 +2192,12 @@ static int inner_child(
                 }
         }
 
+        r = reset_uid_gid();
+        if (r < 0)
+                return log_error_errno(r, "Couldn't become new root: %m");
+
         r = mount_all(NULL,
-                      arg_userns_mode != USER_NAMESPACE_NO,
-                      true,
-                      arg_private_network,
+                      arg_mount_settings | MOUNT_IN_USERNS,
                       arg_uid_shift,
                       arg_uid_range,
                       arg_selinux_apifs_context);
@@ -2578,7 +2205,7 @@ static int inner_child(
         if (r < 0)
                 return r;
 
-        r = mount_sysfs(NULL);
+        r = mount_sysfs(NULL, arg_mount_settings);
         if (r < 0)
                 return r;
 
@@ -2589,13 +2216,25 @@ static int inner_child(
                 return -ESRCH;
         }
 
-        r = mount_systemd_cgroup_writable("", arg_unified_cgroup_hierarchy);
-        if (r < 0)
-                return r;
-
-        r = reset_uid_gid();
-        if (r < 0)
-                return log_error_errno(r, "Couldn't become new root: %m");
+        if (arg_use_cgns && cg_ns_supported()) {
+                r = unshare(CLONE_NEWCGROUP);
+                if (r < 0)
+                        return log_error_errno(errno, "Failed to unshare cgroup namespace");
+                r = mount_cgroups(
+                                "",
+                                arg_unified_cgroup_hierarchy,
+                                arg_userns_mode != USER_NAMESPACE_NO,
+                                arg_uid_shift,
+                                arg_uid_range,
+                                arg_selinux_apifs_context,
+                                true);
+                if (r < 0)
+                        return r;
+        } else {
+                r = mount_systemd_cgroup_writable("", arg_unified_cgroup_hierarchy);
+                if (r < 0)
+                        return r;
+        }
 
         r = setup_boot_id(NULL);
         if (r < 0)
@@ -2691,7 +2330,7 @@ static int inner_child(
                         return log_error_errno(errno, "Failed to change to specified working directory %s: %m", arg_chdir);
 
         if (arg_start_mode == START_PID2) {
-                r = stub_pid1();
+                r = stub_pid1(arg_uuid);
                 if (r < 0)
                         return r;
         }
@@ -2726,20 +2365,25 @@ static int inner_child(
 
                 a[0] = (char*) "/sbin/init";
                 execve(a[0], a, env_use);
-        } else if (!strv_isempty(arg_parameters))
+
+                exec_target = "/usr/lib/systemd/systemd, /lib/systemd/systemd, /sbin/init";
+        } else if (!strv_isempty(arg_parameters)) {
+                exec_target = arg_parameters[0];
                 execvpe(arg_parameters[0], arg_parameters, env_use);
-        else {
+        else {
                 if (!arg_chdir)
                         /* If we cannot change the directory, we'll end up in /, that is expected. */
                         (void) chdir(home ?: "/root");
 
                 execle("/bin/bash", "-bash", NULL, env_use);
                 execle("/bin/sh", "-sh", NULL, env_use);
+
+                exec_target = "/bin/bash, /bin/sh";
         }
 
         r = -errno;
         (void) log_open();
-        return log_error_errno(r, "execv() failed: %m");
+        return log_error_errno(r, "execv(%s) failed: %m", exec_target);
 }
 
 static int setup_sd_notify_child(void) {
@@ -2764,6 +2408,12 @@ static int setup_sd_notify_child(void) {
                 return log_error_errno(errno, "bind(%s) failed: %m", sa.un.sun_path);
         }
 
+        r = userns_lchown(NSPAWN_NOTIFY_SOCKET_PATH, 0, 0);
+        if (r < 0) {
+                safe_close(fd);
+                return log_error_errno(r, "Failed to chown " NSPAWN_NOTIFY_SOCKET_PATH ": %m");
+        }
+
         r = setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
         if (r < 0) {
                 safe_close(fd);
@@ -2777,9 +2427,7 @@ 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,
+                DissectedImage *dissected_image,
                 bool interactive,
                 bool secondary,
                 int pid_socket,
@@ -2803,8 +2451,6 @@ static int outer_child(
         assert(notify_socket >= 0);
         assert(kmsg_socket >= 0);
 
-        cg_unified_flush();
-
         if (prctl(PR_SET_PDEATHSIG, SIGKILL) < 0)
                 return log_error_errno(errno, "PR_SET_PDEATHSIG failed: %m");
 
@@ -2835,16 +2481,16 @@ static int outer_child(
         /* 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);
+        r = mount_verbose(LOG_ERR, NULL, "/", NULL, MS_SLAVE|MS_REC, NULL);
         if (r < 0)
                 return r;
 
+        if (dissected_image) {
+                r = dissected_image_mount(dissected_image, directory, DISSECT_IMAGE_DISCARD_ON_LOOP|(arg_read_only ? DISSECT_IMAGE_READ_ONLY : 0));
+                if (r < 0)
+                        return r;
+        }
+
         r = determine_uid_shift(directory);
         if (r < 0)
                 return r;
@@ -2877,10 +2523,14 @@ static int outer_child(
         }
 
         /* 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 = mount_verbose(LOG_ERR, directory, directory, NULL, MS_BIND|MS_REC, NULL);
+        if (r < 0)
+                return r;
 
-        r = recursive_chown(directory, arg_uid_shift, arg_uid_range);
+        r = setup_pivot_root(
+                        directory,
+                        arg_pivot_root_new,
+                        arg_pivot_root_old);
         if (r < 0)
                 return r;
 
@@ -2904,20 +2554,32 @@ static int outer_child(
         if (r < 0)
                 return r;
 
+        /* Mark everything as shared so our mounts get propagated down. This is
+         * required to make new bind mounts available in systemd services
+         * inside the containter that create a new mount namespace.
+         * See https://github.com/systemd/systemd/issues/3860
+         * Further submounts (such as /dev) done after this will inherit the
+         * shared propagation mode. */
+        r = mount_verbose(LOG_ERR, NULL, directory, NULL, MS_SHARED|MS_REC, NULL);
+        if (r < 0)
+                return r;
+
+        r = recursive_chown(directory, arg_uid_shift, arg_uid_range);
+        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);
+                r = bind_remount_recursive(directory, true, NULL);
                 if (r < 0)
                         return log_error_errno(r, "Failed to make tree read-only: %m");
         }
 
         r = mount_all(directory,
-                      arg_userns_mode != USER_NAMESPACE_NO,
-                      false,
-                      arg_private_network,
+                      arg_mount_settings,
                       arg_uid_shift,
                       arg_uid_range,
                       arg_selinux_apifs_context);
@@ -2973,15 +2635,18 @@ static int outer_child(
         if (r < 0)
                 return r;
 
-        r = mount_cgroups(
-                        directory,
-                        arg_unified_cgroup_hierarchy,
-                        arg_userns_mode != USER_NAMESPACE_NO,
-                        arg_uid_shift,
-                        arg_uid_range,
-                        arg_selinux_apifs_context);
-        if (r < 0)
-                return r;
+        if (!arg_use_cgns || !cg_ns_supported()) {
+                r = mount_cgroups(
+                                directory,
+                                arg_unified_cgroup_hierarchy,
+                                arg_userns_mode != USER_NAMESPACE_NO,
+                                arg_uid_shift,
+                                arg_uid_range,
+                                arg_selinux_apifs_context,
+                                false);
+                if (r < 0)
+                        return r;
+        }
 
         r = mount_move_root(directory);
         if (r < 0)
@@ -2992,7 +2657,7 @@ static int outer_child(
                 return fd;
 
         pid = raw_clone(SIGCHLD|CLONE_NEWNS|
-                        (arg_share_system ? 0 : CLONE_NEWIPC|CLONE_NEWPID|CLONE_NEWUTS) |
+                        arg_clone_ns_flags |
                         (arg_private_network ? CLONE_NEWNET : 0) |
                         (arg_userns_mode != USER_NAMESPACE_NO ? CLONE_NEWUSER : 0));
         if (pid < 0)
@@ -3195,15 +2860,14 @@ static int nspawn_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t r
         return 0;
 }
 
-static int setup_sd_notify_parent(sd_event *event, int fd, pid_t *inner_child_pid) {
+static int setup_sd_notify_parent(sd_event *event, int fd, pid_t *inner_child_pid, sd_event_source **notify_event_source) {
         int r;
-        sd_event_source *notify_event_source;
 
-        r = sd_event_add_io(event, &notify_event_source, fd, EPOLLIN, nspawn_dispatch_notify_fd, inner_child_pid);
+        r = sd_event_add_io(event, notify_event_source, fd, EPOLLIN, nspawn_dispatch_notify_fd, inner_child_pid);
         if (r < 0)
                 return log_error_errno(r, "Failed to allocate notify event source: %m");
 
-        (void) sd_event_source_set_description(notify_event_source, "nspawn-notify");
+        (void) sd_event_source_set_description(*notify_event_source, "nspawn-notify");
 
         return 0;
 }
@@ -3226,7 +2890,7 @@ static int load_settings(void) {
         FOREACH_STRING(i, "/etc/systemd/nspawn", "/run/systemd/nspawn") {
                 _cleanup_free_ char *j = NULL;
 
-                j = strjoin(i, "/", fn, NULL);
+                j = strjoin(i, "/", fn);
                 if (!j)
                         return log_oom();
 
@@ -3292,6 +2956,12 @@ static int load_settings(void) {
                 settings->parameters = NULL;
         }
 
+        if ((arg_settings_mask & SETTING_PIVOT_ROOT) == 0 &&
+            settings->pivot_root_new) {
+                free_and_replace(arg_pivot_root_new, settings->pivot_root_new);
+                free_and_replace(arg_pivot_root_old, settings->pivot_root_old);
+        }
+
         if ((arg_settings_mask & SETTING_WORKING_DIRECTORY) == 0 &&
             settings->working_directory) {
                 free(arg_chdir);
@@ -3439,24 +3109,452 @@ static int load_settings(void) {
         if ((arg_settings_mask & SETTING_NOTIFY_READY) == 0)
                 arg_notify_ready = settings->notify_ready;
 
-        return 0;
+        return 0;
+}
+
+static int run(int master,
+               const char* console,
+               DissectedImage *dissected_image,
+               bool interactive,
+               bool secondary,
+               FDSet *fds,
+               char veth_name[IFNAMSIZ], bool *veth_created,
+               union in_addr_union *exposed,
+               pid_t *pid, int *ret) {
+
+        static const struct sigaction sa = {
+                .sa_handler = nop_signal_handler,
+                .sa_flags = SA_NOCLDSTOP|SA_RESTART,
+        };
+
+        _cleanup_release_lock_file_ LockFile uid_shift_lock = LOCK_FILE_INIT;
+        _cleanup_close_ int etc_passwd_lock = -1;
+        _cleanup_close_pair_ int
+                kmsg_socket_pair[2] = { -1, -1 },
+                rtnl_socket_pair[2] = { -1, -1 },
+                pid_socket_pair[2] = { -1, -1 },
+                uuid_socket_pair[2] = { -1, -1 },
+                notify_socket_pair[2] = { -1, -1 },
+                uid_shift_socket_pair[2] = { -1, -1 };
+        _cleanup_close_ int notify_socket= -1;
+        _cleanup_(barrier_destroy) Barrier barrier = BARRIER_NULL;
+        _cleanup_(sd_event_source_unrefp) sd_event_source *notify_event_source = NULL;
+        _cleanup_(sd_event_unrefp) sd_event *event = NULL;
+        _cleanup_(pty_forward_freep) PTYForward *forward = NULL;
+        _cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
+        ContainerStatus container_status = 0;
+        char last_char = 0;
+        int ifi = 0, r;
+        ssize_t l;
+        sigset_t mask_chld;
+
+        assert_se(sigemptyset(&mask_chld) == 0);
+        assert_se(sigaddset(&mask_chld, SIGCHLD) == 0);
+
+        if (arg_userns_mode == USER_NAMESPACE_PICK) {
+                /* When we shall pick the UID/GID range, let's first lock /etc/passwd, so that we can safely
+                 * check with getpwuid() if the specific user already exists. Note that /etc might be
+                 * read-only, in which case this will fail with EROFS. But that's really OK, as in that case we
+                 * can be reasonably sure that no users are going to be added. Note that getpwuid() checks are
+                 * really just an extra safety net. We kinda assume that the UID range we allocate from is
+                 * really ours. */
+
+                etc_passwd_lock = take_etc_passwd_lock(NULL);
+                if (etc_passwd_lock < 0 && etc_passwd_lock != -EROFS)
+                        return log_error_errno(etc_passwd_lock, "Failed to take /etc/passwd lock: %m");
+        }
+
+        r = barrier_create(&barrier);
+        if (r < 0)
+                return log_error_errno(r, "Cannot initialize IPC barrier: %m");
+
+        if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, kmsg_socket_pair) < 0)
+                return log_error_errno(errno, "Failed to create kmsg socket pair: %m");
+
+        if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, rtnl_socket_pair) < 0)
+                return log_error_errno(errno, "Failed to create rtnl socket pair: %m");
+
+        if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, pid_socket_pair) < 0)
+                return log_error_errno(errno, "Failed to create pid socket pair: %m");
+
+        if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, uuid_socket_pair) < 0)
+                return log_error_errno(errno, "Failed to create id socket pair: %m");
+
+        if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, notify_socket_pair) < 0)
+                return log_error_errno(errno, "Failed to create notify socket pair: %m");
+
+        if (arg_userns_mode != USER_NAMESPACE_NO)
+                if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, uid_shift_socket_pair) < 0)
+                        return log_error_errno(errno, "Failed to create uid shift socket pair: %m");
+
+        /* 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. */
+        r = sigprocmask(SIG_UNBLOCK, &mask_chld, NULL);
+        if (r < 0)
+                return log_error_errno(errno, "Failed to change the signal mask: %m");
+
+        r = sigaction(SIGCHLD, &sa, NULL);
+        if (r < 0)
+                return log_error_errno(errno, "Failed to install SIGCHLD handler: %m");
+
+        *pid = raw_clone(SIGCHLD|CLONE_NEWNS);
+        if (*pid < 0)
+                return log_error_errno(errno, "clone() failed%s: %m",
+                                       errno == EINVAL ?
+                                       ", do you have namespace support enabled in your kernel? (You need UTS, IPC, PID and NET namespacing built in)" : "");
+
+        if (*pid == 0) {
+                /* The outer child only has a file system namespace. */
+                barrier_set_role(&barrier, BARRIER_CHILD);
+
+                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]);
+                uuid_socket_pair[0] = safe_close(uuid_socket_pair[0]);
+                notify_socket_pair[0] = safe_close(notify_socket_pair[0]);
+                uid_shift_socket_pair[0] = safe_close(uid_shift_socket_pair[0]);
+
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
+
+                r = outer_child(&barrier,
+                                arg_directory,
+                                console,
+                                dissected_image,
+                                interactive,
+                                secondary,
+                                pid_socket_pair[1],
+                                uuid_socket_pair[1],
+                                notify_socket_pair[1],
+                                kmsg_socket_pair[1],
+                                rtnl_socket_pair[1],
+                                uid_shift_socket_pair[1],
+                                fds);
+                if (r < 0)
+                        _exit(EXIT_FAILURE);
+
+                _exit(EXIT_SUCCESS);
+        }
+
+        barrier_set_role(&barrier, BARRIER_PARENT);
+
+        fds = fdset_free(fds);
+
+        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]);
+        uuid_socket_pair[1] = safe_close(uuid_socket_pair[1]);
+        notify_socket_pair[1] = safe_close(notify_socket_pair[1]);
+        uid_shift_socket_pair[1] = safe_close(uid_shift_socket_pair[1]);
+
+        if (arg_userns_mode != USER_NAMESPACE_NO) {
+                /* The child just let us know the UID shift it might have read from the image. */
+                l = recv(uid_shift_socket_pair[0], &arg_uid_shift, sizeof arg_uid_shift, 0);
+                if (l < 0)
+                        return log_error_errno(errno, "Failed to read UID shift: %m");
+                if (l != sizeof arg_uid_shift) {
+                        log_error("Short read while reading UID shift.");
+                        return -EIO;
+                }
+
+                if (arg_userns_mode == USER_NAMESPACE_PICK) {
+                        /* If we are supposed to pick the UID shift, let's try to use the shift read from the
+                         * image, but if that's already in use, pick a new one, and report back to the child,
+                         * which one we now picked. */
+
+                        r = uid_shift_pick(&arg_uid_shift, &uid_shift_lock);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to pick suitable UID/GID range: %m");
+
+                        l = send(uid_shift_socket_pair[0], &arg_uid_shift, sizeof arg_uid_shift, MSG_NOSIGNAL);
+                        if (l < 0)
+                                return log_error_errno(errno, "Failed to send UID shift: %m");
+                        if (l != sizeof arg_uid_shift) {
+                                log_error("Short write while writing UID shift.");
+                                return -EIO;
+                        }
+                }
+        }
+
+        /* Wait for the outer child. */
+        r = wait_for_terminate_and_warn("namespace helper", *pid, NULL);
+        if (r != 0)
+                return r < 0 ? r : -EIO;
+
+        /* And now retrieve the PID of the inner child. */
+        l = recv(pid_socket_pair[0], pid, sizeof *pid, 0);
+        if (l < 0)
+                return log_error_errno(errno, "Failed to read inner child PID: %m");
+        if (l != sizeof *pid) {
+                log_error("Short read while reading inner child PID.");
+                return -EIO;
+        }
+
+        /* We also retrieve container UUID in case it was generated by outer child */
+        l = recv(uuid_socket_pair[0], &arg_uuid, sizeof arg_uuid, 0);
+        if (l < 0)
+                return log_error_errno(errno, "Failed to read container machine ID: %m");
+        if (l != sizeof(arg_uuid)) {
+                log_error("Short read while reading container machined ID.");
+                return -EIO;
+        }
+
+        /* We also retrieve the socket used for notifications generated by outer child */
+        notify_socket = receive_one_fd(notify_socket_pair[0], 0);
+        if (notify_socket < 0)
+                return log_error_errno(notify_socket,
+                                       "Failed to receive notification socket from the outer child: %m");
+
+        log_debug("Init process invoked as PID "PID_FMT, *pid);
+
+        if (arg_userns_mode != USER_NAMESPACE_NO) {
+                if (!barrier_place_and_sync(&barrier)) { /* #1 */
+                        log_error("Child died too early.");
+                        return -ESRCH;
+                }
+
+                r = setup_uid_map(*pid);
+                if (r < 0)
+                        return r;
+
+                (void) barrier_place(&barrier); /* #2 */
+        }
+
+        if (arg_private_network) {
+
+                r = move_network_interfaces(*pid, arg_network_interfaces);
+                if (r < 0)
+                        return r;
+
+                if (arg_network_veth) {
+                        r = setup_veth(arg_machine, *pid, veth_name,
+                                       arg_network_bridge || arg_network_zone);
+                        if (r < 0)
+                                return r;
+                        else if (r > 0)
+                                ifi = r;
+
+                        if (arg_network_bridge) {
+                                /* Add the interface to a bridge */
+                                r = setup_bridge(veth_name, arg_network_bridge, false);
+                                if (r < 0)
+                                        return r;
+                                if (r > 0)
+                                        ifi = r;
+                        } else if (arg_network_zone) {
+                                /* Add the interface to a bridge, possibly creating it */
+                                r = setup_bridge(veth_name, arg_network_zone, true);
+                                if (r < 0)
+                                        return r;
+                                if (r > 0)
+                                        ifi = r;
+                        }
+                }
+
+                r = setup_veth_extra(arg_machine, *pid, arg_network_veth_extra);
+                if (r < 0)
+                        return r;
+
+                /* We created the primary and extra veth links now; let's remember this, so that we know to
+                   remove them later on. Note that we don't bother with removing veth links that were created
+                   here when their setup failed half-way, because in that case the kernel should be able to
+                   remove them on its own, since they cannot be referenced by anything yet. */
+                *veth_created = true;
+
+                r = setup_macvlan(arg_machine, *pid, arg_network_macvlan);
+                if (r < 0)
+                        return r;
+
+                r = setup_ipvlan(arg_machine, *pid, arg_network_ipvlan);
+                if (r < 0)
+                        return r;
+        }
+
+        if (arg_register) {
+                r = register_machine(
+                                arg_machine,
+                                *pid,
+                                arg_directory,
+                                arg_uuid,
+                                ifi,
+                                arg_slice,
+                                arg_custom_mounts, arg_n_custom_mounts,
+                                arg_kill_signal,
+                                arg_property,
+                                arg_keep_unit,
+                                arg_container_service_name);
+                if (r < 0)
+                        return r;
+        } else if (!arg_keep_unit) {
+                r = allocate_scope(
+                                arg_machine,
+                                *pid,
+                                arg_slice,
+                                arg_custom_mounts, arg_n_custom_mounts,
+                                arg_kill_signal,
+                                arg_property);
+                if (r < 0)
+                        return r;
+
+        } else if (arg_slice || arg_property)
+                log_notice("Machine and scope registration turned off, --slice= and --property= settings will have no effect.");
+
+        r = sync_cgroup(*pid, arg_unified_cgroup_hierarchy, arg_uid_shift);
+        if (r < 0)
+                return r;
+
+        if (arg_keep_unit) {
+                r = create_subcgroup(*pid, arg_unified_cgroup_hierarchy);
+                if (r < 0)
+                        return r;
+        }
+
+        r = chown_cgroup(*pid, arg_uid_shift);
+        if (r < 0)
+                return r;
+
+        /* 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. */
+        assert_se(sigprocmask(SIG_BLOCK, &mask_chld, NULL) >= 0);
+
+        /* Reset signal to default */
+        r = default_signals(SIGCHLD, -1);
+        if (r < 0)
+                return log_error_errno(r, "Failed to reset SIGCHLD: %m");
+
+        r = sd_event_new(&event);
+        if (r < 0)
+                return log_error_errno(r, "Failed to get default event source: %m");
+
+        r = setup_sd_notify_parent(event, notify_socket, PID_TO_PTR(*pid), &notify_event_source);
+        if (r < 0)
+                return r;
+
+        /* Let the child know that we are ready and wait that the child is completely ready now. */
+        if (!barrier_place_and_sync(&barrier)) { /* #4 */
+                log_error("Child died too early.");
+                return -ESRCH;
+        }
+
+        /* At this point we have made use of the UID we picked, and thus nss-mymachines
+         * will make them appear in getpwuid(), thus we can release the /etc/passwd lock. */
+        etc_passwd_lock = safe_close(etc_passwd_lock);
+
+        sd_notifyf(false,
+                   "STATUS=Container running.\n"
+                   "X_NSPAWN_LEADER_PID=" PID_FMT, *pid);
+        if (!arg_notify_ready)
+                sd_notify(false, "READY=1\n");
+
+        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, PID_TO_PTR(*pid));
+                sd_event_add_signal(event, NULL, SIGTERM, on_orderly_shutdown, PID_TO_PTR(*pid));
+        } else {
+                /* Immediately exit */
+                sd_event_add_signal(event, NULL, SIGINT, NULL, NULL);
+                sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL);
+        }
+
+        /* Exit when the child exits */
+        sd_event_add_signal(event, NULL, SIGCHLD, on_sigchld, PID_TO_PTR(*pid));
+
+        if (arg_expose_ports) {
+                r = expose_port_watch_rtnl(event, rtnl_socket_pair[0], on_address_change, exposed, &rtnl);
+                if (r < 0)
+                        return r;
+
+                (void) expose_port_execute(rtnl, arg_expose_ports, exposed);
+        }
+
+        rtnl_socket_pair[0] = safe_close(rtnl_socket_pair[0]);
+
+        r = pty_forward_new(event, master,
+                            PTY_FORWARD_IGNORE_VHANGUP | (interactive ? 0 : PTY_FORWARD_READ_ONLY),
+                            &forward);
+        if (r < 0)
+                return log_error_errno(r, "Failed to create PTY forwarder: %m");
+
+        r = sd_event_loop(event);
+        if (r < 0)
+                return log_error_errno(r, "Failed to run event loop: %m");
+
+        pty_forward_get_last_char(forward, &last_char);
+
+        forward = pty_forward_free(forward);
+
+        if (!arg_quiet && last_char != '\n')
+                putc('\n', stdout);
+
+        /* Kill if it is not dead yet anyway */
+        if (arg_register && !arg_keep_unit)
+                terminate_machine(*pid);
+
+        /* Normally redundant, but better safe than sorry */
+        (void) kill(*pid, SIGKILL);
+
+        r = wait_for_container(*pid, &container_status);
+        *pid = 0;
+
+        if (r < 0)
+                /* We failed to wait for the container, or the container exited abnormally. */
+                return r;
+        if (r > 0 || container_status == CONTAINER_TERMINATED) {
+                /* r > 0 → The container exited with a non-zero status.
+                 *         As a special case, we need to replace 133 with a different value,
+                 *         because 133 is special-cased in the service file to reboot the container.
+                 * otherwise → The container exited with zero status and a reboot was not requested.
+                 */
+                if (r == EXIT_FORCE_RESTART)
+                        r = EXIT_FAILURE; /* replace 133 with the general failure code */
+                *ret = r;
+                return 0; /* finito */
+        }
+
+        /* CONTAINER_REBOOTED, loop again */
+
+        if (arg_keep_unit) {
+                /* Special handling if we are running as a service: instead of simply
+                 * restarting the machine we want to restart the entire service, so let's
+                 * inform systemd about this with the special exit code 133. The service
+                 * file uses RestartForceExitStatus=133 so that this results in a full
+                 * nspawn restart. This is necessary since we might have cgroup parameters
+                 * set we want to have flushed out. */
+                *ret = EXIT_FORCE_RESTART;
+                return 0; /* finito */
+        }
+
+        expose_port_flush(arg_expose_ports, exposed);
+
+        (void) remove_veth_links(veth_name, arg_network_veth_extra);
+        *veth_created = false;
+        return 1; /* loop again */
 }
 
 int main(int argc, char *argv[]) {
 
-        _cleanup_free_ char *device_path = NULL, *root_device = NULL, *home_device = NULL, *srv_device = NULL, *console = NULL;
-        bool root_device_rw = true, home_device_rw = true, srv_device_rw = true;
-        _cleanup_close_ int master = -1, image_fd = -1;
+        _cleanup_free_ char *console = NULL;
+        _cleanup_close_ int master = -1;
         _cleanup_fdset_free_ FDSet *fds = NULL;
-        int r, n_fd_passed, loop_nr = -1;
+        int r, n_fd_passed, ret = EXIT_SUCCESS;
         char veth_name[IFNAMSIZ] = "";
-        bool secondary = false, remove_subvol = false;
-        sigset_t mask_chld;
+        bool secondary = false, remove_directory = false, remove_image = false;
         pid_t pid = 0;
-        int ret = EXIT_SUCCESS;
         union in_addr_union exposed = {};
         _cleanup_release_lock_file_ LockFile tree_global_lock = LOCK_FILE_INIT, tree_local_lock = LOCK_FILE_INIT;
-        bool interactive, veth_created = false;
+        bool interactive, veth_created = false, remove_tmprootdir = false;
+        char tmprootdir[] = "/tmp/nspawn-root-XXXXXX";
+        _cleanup_(loop_device_unrefp) LoopDevice *loop = NULL;
+        _cleanup_(decrypted_image_unrefp) DecryptedImage *decrypted_image = NULL;
+        _cleanup_(dissected_image_unrefp) DissectedImage *dissected_image = NULL;
 
         log_parse_environment();
         log_open();
@@ -3507,13 +3605,17 @@ int main(int argc, char *argv[]) {
                 if (arg_ephemeral) {
                         _cleanup_free_ char *np = NULL;
 
+                        r = chase_symlinks_and_update(&arg_directory, 0);
+                        if (r < 0)
+                                goto finish;
+
                         /* If the specified path is a mount point we
                          * generate the new snapshot immediately
                          * inside it under a random name. However if
                          * 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, 0);
+                        r = path_is_mount_point(arg_directory, NULL, 0);
                         if (r < 0) {
                                 log_error_errno(r, "Failed to determine whether directory %s is mount point: %m", arg_directory);
                                 goto finish;
@@ -3523,7 +3625,7 @@ int main(int argc, char *argv[]) {
                         else
                                 r = tempfn_random(arg_directory, "machine.", &np);
                         if (r < 0) {
-                                log_error_errno(r, "Failed to generate name for snapshot: %m");
+                                log_error_errno(r, "Failed to generate name for directory snapshot: %m");
                                 goto finish;
                         }
 
@@ -3533,7 +3635,12 @@ int main(int argc, char *argv[]) {
                                 goto finish;
                         }
 
-                        r = btrfs_subvol_snapshot(arg_directory, np, (arg_read_only ? BTRFS_SNAPSHOT_READ_ONLY : 0) | BTRFS_SNAPSHOT_FALLBACK_COPY | BTRFS_SNAPSHOT_RECURSIVE | BTRFS_SNAPSHOT_QUOTA);
+                        r = btrfs_subvol_snapshot(arg_directory, np,
+                                                  (arg_read_only ? BTRFS_SNAPSHOT_READ_ONLY : 0) |
+                                                  BTRFS_SNAPSHOT_FALLBACK_COPY |
+                                                  BTRFS_SNAPSHOT_FALLBACK_DIRECTORY |
+                                                  BTRFS_SNAPSHOT_RECURSIVE |
+                                                  BTRFS_SNAPSHOT_QUOTA);
                         if (r < 0) {
                                 log_error_errno(r, "Failed to create snapshot %s from %s: %m", np, arg_directory);
                                 goto finish;
@@ -3543,9 +3650,13 @@ int main(int argc, char *argv[]) {
                         arg_directory = np;
                         np = NULL;
 
-                        remove_subvol = true;
+                        remove_directory = true;
 
                 } else {
+                        r = chase_symlinks_and_update(&arg_directory, arg_template ? CHASE_NONEXISTENT : 0);
+                        if (r < 0)
+                                goto finish;
+
                         r = image_path_lock(arg_directory, (arg_read_only ? LOCK_SH : LOCK_EX) | LOCK_NB, &tree_global_lock, &tree_local_lock);
                         if (r == -EBUSY) {
                                 log_error_errno(r, "Directory tree %s is currently busy.", arg_directory);
@@ -3557,7 +3668,17 @@ int main(int argc, char *argv[]) {
                         }
 
                         if (arg_template) {
-                                r = btrfs_subvol_snapshot(arg_template, arg_directory, (arg_read_only ? BTRFS_SNAPSHOT_READ_ONLY : 0) | BTRFS_SNAPSHOT_FALLBACK_COPY | BTRFS_SNAPSHOT_RECURSIVE | BTRFS_SNAPSHOT_QUOTA);
+                                r = chase_symlinks_and_update(&arg_template, 0);
+                                if (r < 0)
+                                        goto finish;
+
+                                r = btrfs_subvol_snapshot(arg_template, arg_directory,
+                                                          (arg_read_only ? BTRFS_SNAPSHOT_READ_ONLY : 0) |
+                                                          BTRFS_SNAPSHOT_FALLBACK_COPY |
+                                                          BTRFS_SNAPSHOT_FALLBACK_DIRECTORY |
+                                                          BTRFS_SNAPSHOT_FALLBACK_IMMUTABLE |
+                                                          BTRFS_SNAPSHOT_RECURSIVE |
+                                                          BTRFS_SNAPSHOT_QUOTA);
                                 if (r == -EEXIST) {
                                         if (!arg_quiet)
                                                 log_info("Directory %s already exists, not populating from template %s.", arg_directory, arg_template);
@@ -3589,49 +3710,124 @@ int main(int argc, char *argv[]) {
                 }
 
         } else {
-                char template[] = "/tmp/nspawn-root-XXXXXX";
-
                 assert(arg_image);
                 assert(!arg_template);
 
-                r = image_path_lock(arg_image, (arg_read_only ? LOCK_SH : LOCK_EX) | LOCK_NB, &tree_global_lock, &tree_local_lock);
-                if (r == -EBUSY) {
-                        r = log_error_errno(r, "Disk image %s is currently busy.", arg_image);
-                        goto finish;
-                }
-                if (r < 0) {
-                        r = log_error_errno(r, "Failed to create image lock: %m");
+                r = chase_symlinks_and_update(&arg_image, 0);
+                if (r < 0)
                         goto finish;
+
+                if (arg_ephemeral)  {
+                        _cleanup_free_ char *np = NULL;
+
+                        r = tempfn_random(arg_image, "machine.", &np);
+                        if (r < 0) {
+                                log_error_errno(r, "Failed to generate name for image snapshot: %m");
+                                goto finish;
+                        }
+
+                        r = image_path_lock(np, (arg_read_only ? LOCK_SH : LOCK_EX) | LOCK_NB, &tree_global_lock, &tree_local_lock);
+                        if (r < 0) {
+                                r = log_error_errno(r, "Failed to create image lock: %m");
+                                goto finish;
+                        }
+
+                        r = copy_file(arg_image, np, O_EXCL, arg_read_only ? 0400 : 0600, FS_NOCOW_FL, COPY_REFLINK);
+                        if (r < 0) {
+                                r = log_error_errno(r, "Failed to copy image file: %m");
+                                goto finish;
+                        }
+
+                        free(arg_image);
+                        arg_image = np;
+                        np = NULL;
+
+                        remove_image = true;
+                } else {
+                        r = image_path_lock(arg_image, (arg_read_only ? LOCK_SH : LOCK_EX) | LOCK_NB, &tree_global_lock, &tree_local_lock);
+                        if (r == -EBUSY) {
+                                r = log_error_errno(r, "Disk image %s is currently busy.", arg_image);
+                                goto finish;
+                        }
+                        if (r < 0) {
+                                r = log_error_errno(r, "Failed to create image lock: %m");
+                                goto finish;
+                        }
+
+                        if (!arg_root_hash) {
+                                r = root_hash_load(arg_image, &arg_root_hash, &arg_root_hash_size);
+                                if (r < 0) {
+                                        log_error_errno(r, "Failed to load root hash file for %s: %m", arg_image);
+                                        goto finish;
+                                }
+                        }
                 }
 
-                if (!mkdtemp(template)) {
-                        log_error_errno(errno, "Failed to create temporary directory: %m");
-                        r = -errno;
+                if (!mkdtemp(tmprootdir)) {
+                        r = log_error_errno(errno, "Failed to create temporary directory: %m");
                         goto finish;
                 }
 
-                arg_directory = strdup(template);
+                remove_tmprootdir = true;
+
+                arg_directory = strdup(tmprootdir);
                 if (!arg_directory) {
                         r = log_oom();
                         goto finish;
                 }
 
-                image_fd = setup_image(&device_path, &loop_nr);
-                if (image_fd < 0) {
-                        r = image_fd;
+                r = loop_device_make_by_path(arg_image, arg_read_only ? O_RDONLY : O_RDWR, &loop);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to set up loopback block device: %m");
+                        goto finish;
+                }
+
+                r = dissect_image(
+                                loop->fd,
+                                arg_root_hash, arg_root_hash_size,
+                                DISSECT_IMAGE_REQUIRE_ROOT,
+                                &dissected_image);
+                if (r == -ENOPKG) {
+                        log_error_errno(r, "Could not find a suitable file system or partition table in image: %s", arg_image);
+
+                        log_notice("Note that the disk image needs to\n"
+                                   "    a) either contain only a single MBR partition of type 0x83 that is marked bootable\n"
+                                   "    b) or contain a single GPT partition of type 0FC63DAF-8483-4772-8E79-3D69D8477DE4\n"
+                                   "    c) or follow http://www.freedesktop.org/wiki/Specifications/DiscoverablePartitionsSpec/\n"
+                                   "    d) or contain a file system without a partition table\n"
+                                   "in order to be bootable with systemd-nspawn.");
+                        goto finish;
+                }
+                if (r == -EADDRNOTAVAIL) {
+                        log_error_errno(r, "No root partition for specified root hash found.");
+                        goto finish;
+                }
+                if (r == -EOPNOTSUPP) {
+                        log_error_errno(r, "--image= is not supported, compiled without blkid support.");
+                        goto finish;
+                }
+                if (r < 0) {
+                        log_error_errno(r, "Failed to dissect image: %m");
                         goto finish;
                 }
 
-                r = dissect_image(image_fd,
-                                  &root_device, &root_device_rw,
-                                  &home_device, &home_device_rw,
-                                  &srv_device, &srv_device_rw,
-                                  &secondary);
+                if (!arg_root_hash && dissected_image->can_verity)
+                        log_notice("Note: image %s contains verity information, but no root hash specified! Proceeding without integrity checking.", arg_image);
+
+                r = dissected_image_decrypt_interactively(dissected_image, NULL, arg_root_hash, arg_root_hash_size, 0, &decrypted_image);
                 if (r < 0)
                         goto finish;
+
+                /* Now that we mounted the image, let's try to remove it again, if it is ephemeral */
+                if (remove_image && unlink(arg_image) >= 0)
+                        remove_image = false;
         }
 
-        r = custom_mounts_prepare();
+        r = custom_mount_prepare_all(arg_directory, arg_custom_mounts, arg_n_custom_mounts);
+        if (r < 0)
+                goto finish;
+
+        r = detect_unified_cgroup_hierarchy(arg_directory);
         if (r < 0)
                 goto finish;
 
@@ -3668,491 +3864,57 @@ int main(int argc, char *argv[]) {
 
         assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGWINCH, SIGTERM, SIGINT, -1) >= 0);
 
-        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 (;;) {
-                static const struct sigaction sa = {
-                        .sa_handler = nop_signal_handler,
-                        .sa_flags = SA_NOCLDSTOP,
-                };
-
-                _cleanup_release_lock_file_ LockFile uid_shift_lock = LOCK_FILE_INIT;
-                _cleanup_close_ int etc_passwd_lock = -1;
-                _cleanup_close_pair_ int
-                        kmsg_socket_pair[2] = { -1, -1 },
-                        rtnl_socket_pair[2] = { -1, -1 },
-                        pid_socket_pair[2] = { -1, -1 },
-                        uuid_socket_pair[2] = { -1, -1 },
-                        notify_socket_pair[2] = { -1, -1 },
-                        uid_shift_socket_pair[2] = { -1, -1 };
-                _cleanup_close_ int notify_socket= -1;
-                _cleanup_(barrier_destroy) Barrier barrier = BARRIER_NULL;
-                _cleanup_(sd_event_unrefp) sd_event *event = NULL;
-                _cleanup_(pty_forward_freep) PTYForward *forward = NULL;
-                _cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
-                ContainerStatus container_status;
-                char last_char = 0;
-                int ifi = 0;
-                ssize_t l;
-
-                if (arg_userns_mode == USER_NAMESPACE_PICK) {
-                        /* When we shall pick the UID/GID range, let's first lock /etc/passwd, so that we can safely
-                         * check with getpwuid() if the specific user already exists. Note that /etc might be
-                         * read-only, in which case this will fail with EROFS. But that's really OK, as in that case we
-                         * can be reasonably sure that no users are going to be added. Note that getpwuid() checks are
-                         * really just an extra safety net. We kinda assume that the UID range we allocate from is
-                         * really ours. */
-
-                        etc_passwd_lock = take_etc_passwd_lock(NULL);
-                        if (etc_passwd_lock < 0 && etc_passwd_lock != -EROFS) {
-                                log_error_errno(r, "Failed to take /etc/passwd lock: %m");
-                                goto finish;
-                        }
-                }
-
-                r = barrier_create(&barrier);
-                if (r < 0) {
-                        log_error_errno(r, "Cannot initialize IPC barrier: %m");
-                        goto finish;
-                }
-
-                if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, kmsg_socket_pair) < 0) {
-                        r = log_error_errno(errno, "Failed to create kmsg socket pair: %m");
-                        goto finish;
-                }
-
-                if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, rtnl_socket_pair) < 0) {
-                        r = log_error_errno(errno, "Failed to create rtnl socket pair: %m");
-                        goto finish;
-                }
-
-                if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, pid_socket_pair) < 0) {
-                        r = log_error_errno(errno, "Failed to create pid socket pair: %m");
-                        goto finish;
-                }
-
-                if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, uuid_socket_pair) < 0) {
-                        r = log_error_errno(errno, "Failed to create id socket pair: %m");
-                        goto finish;
-                }
-
-                if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, notify_socket_pair) < 0) {
-                        r = log_error_errno(errno, "Failed to create notify socket pair: %m");
-                        goto finish;
-                }
-
-                if (arg_userns_mode != USER_NAMESPACE_NO)
-                        if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, uid_shift_socket_pair) < 0) {
-                                r = log_error_errno(errno, "Failed to create uid shift 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. */
-                r = sigprocmask(SIG_UNBLOCK, &mask_chld, NULL);
-                if (r < 0) {
-                        r = log_error_errno(errno, "Failed to change the signal mask: %m");
-                        goto finish;
-                }
-
-                r = sigaction(SIGCHLD, &sa, NULL);
-                if (r < 0) {
-                        r = log_error_errno(errno, "Failed to install SIGCHLD handler: %m");
-                        goto finish;
-                }
-
-                pid = raw_clone(SIGCHLD|CLONE_NEWNS);
-                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");
-                        else
-                                r = log_error_errno(errno, "clone() failed: %m");
-
-                        goto finish;
-                }
-
-                if (pid == 0) {
-                        /* The outer child only has a file system namespace. */
-                        barrier_set_role(&barrier, BARRIER_CHILD);
-
-                        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]);
-                        uuid_socket_pair[0] = safe_close(uuid_socket_pair[0]);
-                        notify_socket_pair[0] = safe_close(notify_socket_pair[0]);
-                        uid_shift_socket_pair[0] = safe_close(uid_shift_socket_pair[0]);
-
-                        (void) reset_all_signal_handlers();
-                        (void) reset_signal_mask();
-
-                        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],
-                                        uuid_socket_pair[1],
-                                        notify_socket_pair[1],
-                                        kmsg_socket_pair[1],
-                                        rtnl_socket_pair[1],
-                                        uid_shift_socket_pair[1],
-                                        fds);
-                        if (r < 0)
-                                _exit(EXIT_FAILURE);
-
-                        _exit(EXIT_SUCCESS);
-                }
-
-                barrier_set_role(&barrier, BARRIER_PARENT);
-
-                fds = fdset_free(fds);
-
-                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]);
-                uuid_socket_pair[1] = safe_close(uuid_socket_pair[1]);
-                notify_socket_pair[1] = safe_close(notify_socket_pair[1]);
-                uid_shift_socket_pair[1] = safe_close(uid_shift_socket_pair[1]);
-
-                if (arg_userns_mode != USER_NAMESPACE_NO) {
-                        /* The child just let us know the UID shift it might have read from the image. */
-                        l = recv(uid_shift_socket_pair[0], &arg_uid_shift, sizeof(arg_uid_shift), 0);
-                        if (l < 0) {
-                                r = log_error_errno(errno, "Failed to read UID shift: %m");
-                                goto finish;
-                        }
-                        if (l != sizeof(arg_uid_shift)) {
-                                log_error("Short read while reading UID shift.");
-                                r = EIO;
-                                goto finish;
-                        }
-
-                        if (arg_userns_mode == USER_NAMESPACE_PICK) {
-                                /* If we are supposed to pick the UID shift, let's try to use the shift read from the
-                                 * image, but if that's already in use, pick a new one, and report back to the child,
-                                 * which one we now picked. */
-
-                                r = uid_shift_pick(&arg_uid_shift, &uid_shift_lock);
-                                if (r < 0) {
-                                        log_error_errno(r, "Failed to pick suitable UID/GID range: %m");
-                                        goto finish;
-                                }
-
-                                l = send(uid_shift_socket_pair[0], &arg_uid_shift, sizeof(arg_uid_shift), MSG_NOSIGNAL);
-                                if (l < 0) {
-                                        r = log_error_errno(errno, "Failed to send UID shift: %m");
-                                        goto finish;
-                                }
-                                if (l != sizeof(arg_uid_shift)) {
-                                        log_error("Short write while writing UID shift.");
-                                        r = -EIO;
-                                        goto finish;
-                                }
-                        }
-                }
-
-                /* 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;
-
-                /* 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.");
-                        r = EIO;
-                        goto finish;
-                }
-
-                /* We also retrieve container UUID in case it was generated by outer child */
-                l = recv(uuid_socket_pair[0], &arg_uuid, sizeof(arg_uuid), 0);
-                if (l < 0) {
-                        r = log_error_errno(errno, "Failed to read container machine ID: %m");
-                        goto finish;
-                }
-                if (l != sizeof(arg_uuid)) {
-                        log_error("Short read while reading container machined ID.");
-                        r = EIO;
-                        goto finish;
-                }
-
-                /* We also retrieve the socket used for notifications generated by outer child */
-                notify_socket = receive_one_fd(notify_socket_pair[0], 0);
-                if (notify_socket < 0) {
-                        r = log_error_errno(errno, "Failed to receive notification socket from the outer child: %m");
-                        goto finish;
-                }
-
-                log_debug("Init process invoked as PID " PID_FMT, pid);
-
-                if (arg_userns_mode != USER_NAMESPACE_NO) {
-                        if (!barrier_place_and_sync(&barrier)) { /* #1 */
-                                log_error("Child died too early.");
-                                r = -ESRCH;
-                                goto finish;
-                        }
-
-                        r = setup_uid_map(pid);
-                        if (r < 0)
-                                goto finish;
-
-                        (void) barrier_place(&barrier); /* #2 */
-                }
-
-                if (arg_private_network) {
-
-                        r = move_network_interfaces(pid, arg_network_interfaces);
-                        if (r < 0)
-                                goto finish;
-
-                        if (arg_network_veth) {
-                                r = setup_veth(arg_machine, pid, veth_name,
-                                               arg_network_bridge || arg_network_zone);
-                                if (r < 0)
-                                        goto finish;
-                                else if (r > 0)
-                                        ifi = r;
-
-                                if (arg_network_bridge) {
-                                        /* Add the interface to a bridge */
-                                        r = setup_bridge(veth_name, arg_network_bridge, false);
-                                        if (r < 0)
-                                                goto finish;
-                                        if (r > 0)
-                                                ifi = r;
-                                } else if (arg_network_zone) {
-                                        /* Add the interface to a bridge, possibly creating it */
-                                        r = setup_bridge(veth_name, arg_network_zone, true);
-                                        if (r < 0)
-                                                goto finish;
-                                        if (r > 0)
-                                                ifi = r;
-                                }
-                        }
-
-                        r = setup_veth_extra(arg_machine, pid, arg_network_veth_extra);
-                        if (r < 0)
-                                goto finish;
-
-                        /* We created the primary and extra veth links now; let's remember this, so that we know to
-                           remove them later on. Note that we don't bother with removing veth links that were created
-                           here when their setup failed half-way, because in that case the kernel should be able to
-                           remove them on its own, since they cannot be referenced by anything yet. */
-                        veth_created = true;
-
-                        r = setup_macvlan(arg_machine, pid, arg_network_macvlan);
-                        if (r < 0)
-                                goto finish;
-
-                        r = setup_ipvlan(arg_machine, pid, arg_network_ipvlan);
-                        if (r < 0)
-                                goto finish;
-                }
-
-                if (arg_register) {
-                        r = register_machine(
-                                        arg_machine,
-                                        pid,
-                                        arg_directory,
-                                        arg_uuid,
-                                        ifi,
-                                        arg_slice,
-                                        arg_custom_mounts, arg_n_custom_mounts,
-                                        arg_kill_signal,
-                                        arg_property,
-                                        arg_keep_unit,
-                                        arg_container_service_name);
-                        if (r < 0)
-                                goto finish;
-                }
-
-                r = sync_cgroup(pid, arg_unified_cgroup_hierarchy);
-                if (r < 0)
-                        goto finish;
-
-                if (arg_keep_unit) {
-                        r = create_subcgroup(pid, arg_unified_cgroup_hierarchy);
-                        if (r < 0)
-                                goto finish;
-                }
-
-                r = chown_cgroup(pid, arg_uid_shift);
-                if (r < 0)
-                        goto finish;
-
-                /* 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. */
-                assert_se(sigprocmask(SIG_BLOCK, &mask_chld, NULL) >= 0);
-
-                /* Reset signal to default */
-                r = default_signals(SIGCHLD, -1);
-                if (r < 0) {
-                        log_error_errno(r, "Failed to reset SIGCHLD: %m");
-                        goto finish;
-                }
-
-                r = sd_event_new(&event);
-                if (r < 0) {
-                        log_error_errno(r, "Failed to get default event source: %m");
-                        goto finish;
-                }
-
-                r = setup_sd_notify_parent(event, notify_socket, PID_TO_PTR(pid));
-                if (r < 0)
-                        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)) { /* #4 */
-                        log_error("Child died too early.");
-                        r = -ESRCH;
-                        goto finish;
-                }
-
-                /* At this point we have made use of the UID we picked, and thus nss-mymachines will make them appear
-                 * in getpwuid(), thus we can release the /etc/passwd lock. */
-                etc_passwd_lock = safe_close(etc_passwd_lock);
-
-                sd_notifyf(false,
-                           "STATUS=Container running.\n"
-                           "X_NSPAWN_LEADER_PID=" PID_FMT, pid);
-                if (!arg_notify_ready)
-                        sd_notify(false, "READY=1\n");
-
-                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, PID_TO_PTR(pid));
-                        sd_event_add_signal(event, NULL, SIGTERM, on_orderly_shutdown, PID_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);
-
-                if (arg_expose_ports) {
-                        r = expose_port_watch_rtnl(event, rtnl_socket_pair[0], on_address_change, &exposed, &rtnl);
-                        if (r < 0)
-                                goto finish;
-
-                        (void) expose_port_execute(rtnl, arg_expose_ports, &exposed);
-                }
-
-                rtnl_socket_pair[0] = safe_close(rtnl_socket_pair[0]);
-
-                r = pty_forward_new(event, master, PTY_FORWARD_IGNORE_VHANGUP | (interactive ? 0 : PTY_FORWARD_READ_ONLY), &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;
-                }
-
-                pty_forward_get_last_char(forward, &last_char);
-
-                forward = pty_forward_free(forward);
-
-                if (!arg_quiet && last_char != '\n')
-                        putc('\n', stdout);
-
-                /* Kill if it is not dead yet anyway */
-                if (arg_register && !arg_keep_unit)
-                        terminate_machine(pid);
-
-                /* Normally redundant, but better safe than sorry */
-                kill(pid, SIGKILL);
-
-                r = wait_for_container(pid, &container_status);
-                pid = 0;
-
-                if (r < 0)
-                        /* We failed to wait for the container, or the
-                         * container exited abnormally */
-                        goto finish;
-                else if (r > 0 || container_status == CONTAINER_TERMINATED) {
-                        /* The container exited with a non-zero
-                         * status, or with zero status and no reboot
-                         * was requested. */
-                        ret = r;
-                        break;
-                }
-
-                /* CONTAINER_REBOOTED, loop again */
-
-                if (arg_keep_unit) {
-                        /* Special handling if we are running as a
-                         * service: instead of simply restarting the
-                         * machine we want to restart the entire
-                         * service, so let's inform systemd about this
-                         * with the special exit code 133. The service
-                         * file uses RestartForceExitStatus=133 so
-                         * that this results in a full nspawn
-                         * restart. This is necessary since we might
-                         * have cgroup parameters set we want to have
-                         * flushed out. */
-                        ret = 133;
-                        r = 0;
+                r = run(master,
+                        console,
+                        dissected_image,
+                        interactive, secondary,
+                        fds,
+                        veth_name, &veth_created,
+                        &exposed,
+                        &pid, &ret);
+                if (r <= 0)
                         break;
-                }
-
-                expose_port_flush(arg_expose_ports, &exposed);
-
-                (void) remove_veth_links(veth_name, arg_network_veth_extra);
-                veth_created = false;
         }
 
 finish:
         sd_notify(false,
-                  "STOPPING=1\n"
-                  "STATUS=Terminating...");
+                  r == 0 && ret == EXIT_FORCE_RESTART ? "STOPPING=1\nSTATUS=Restarting..." :
+                                                        "STOPPING=1\nSTATUS=Terminating...");
 
         if (pid > 0)
-                kill(pid, SIGKILL);
+                (void) kill(pid, SIGKILL);
 
         /* Try to flush whatever is still queued in the pty */
-        if (master >= 0)
-                (void) copy_bytes(master, STDOUT_FILENO, (uint64_t) -1, false);
+        if (master >= 0) {
+                (void) copy_bytes(master, STDOUT_FILENO, (uint64_t) -1, 0);
+                master = safe_close(master);
+        }
 
-        loop_remove(loop_nr, &image_fd);
+        if (pid > 0)
+                (void) wait_for_terminate(pid, NULL);
 
-        if (remove_subvol && arg_directory) {
+        if (remove_directory && arg_directory) {
                 int k;
 
-                k = btrfs_subvol_remove(arg_directory, BTRFS_REMOVE_RECURSIVE|BTRFS_REMOVE_QUOTA);
+                k = rm_rf(arg_directory, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_SUBVOLUME);
                 if (k < 0)
-                        log_warning_errno(k, "Cannot remove subvolume '%s', ignoring: %m", arg_directory);
+                        log_warning_errno(k, "Cannot remove '%s', ignoring: %m", arg_directory);
+        }
+
+        if (remove_image && arg_image) {
+                if (unlink(arg_image) < 0)
+                        log_warning_errno(errno, "Can't remove image file '%s', ignoring: %m", arg_image);
+        }
+
+        if (remove_tmprootdir) {
+                if (rmdir(tmprootdir) < 0)
+                        log_debug_errno(errno, "Can't remove temporary root directory '%s', ignoring: %m", tmprootdir);
         }
 
         if (arg_machine) {
@@ -4173,6 +3935,8 @@ finish:
         free(arg_image);
         free(arg_machine);
         free(arg_user);
+        free(arg_pivot_root_new);
+        free(arg_pivot_root_old);
         free(arg_chdir);
         strv_free(arg_setenv);
         free(arg_network_bridge);
@@ -4183,6 +3947,7 @@ finish:
         strv_free(arg_parameters);
         custom_mount_free_all(arg_custom_mounts, arg_n_custom_mounts);
         expose_port_free_all(arg_expose_ports);
+        free(arg_root_hash);
 
         return r < 0 ? EXIT_FAILURE : ret;
 }
index 11c2757..0570fde 100644 (file)
@@ -55,7 +55,7 @@ enum nss_status _nss_myhostname_gethostbyname4_r(
         _cleanup_free_ struct local_address *addresses = NULL;
         _cleanup_free_ char *hn = NULL;
         const char *canonical = NULL;
-        int n_addresses = 0, lo_ifi;
+        int n_addresses = 0;
         uint32_t local_address_ipv4;
         struct local_address *a;
         size_t l, idx, ms;
@@ -111,14 +111,11 @@ enum nss_status _nss_myhostname_gethostbyname4_r(
                 local_address_ipv4 = LOCALADDRESS_IPV4;
         }
 
-        /* If this call fails we fill in 0 as scope. Which is fine */
-        lo_ifi = n_addresses <= 0 ? LOOPBACK_IFINDEX : 0;
-
         l = strlen(canonical);
         ms = ALIGN(l+1) + ALIGN(sizeof(struct gaih_addrtuple)) * (n_addresses > 0 ? n_addresses : 2);
         if (buflen < ms) {
-                *errnop = ENOMEM;
-                *h_errnop = NO_RECOVERY;
+                *errnop = ERANGE;
+                *h_errnop = NETDB_INTERNAL;
                 return NSS_STATUS_TRYAGAIN;
         }
 
@@ -135,7 +132,7 @@ enum nss_status _nss_myhostname_gethostbyname4_r(
                 r_tuple->name = r_name;
                 r_tuple->family = AF_INET6;
                 memcpy(r_tuple->addr, LOCALADDRESS_IPV6, 16);
-                r_tuple->scopeid = (uint32_t) lo_ifi;
+                r_tuple->scopeid = 0;
 
                 idx += ALIGN(sizeof(struct gaih_addrtuple));
                 r_tuple_prev = r_tuple;
@@ -146,7 +143,7 @@ enum nss_status _nss_myhostname_gethostbyname4_r(
                 r_tuple->name = r_name;
                 r_tuple->family = AF_INET;
                 *(uint32_t*) r_tuple->addr = local_address_ipv4;
-                r_tuple->scopeid = (uint32_t) lo_ifi;
+                r_tuple->scopeid = 0;
 
                 idx += ALIGN(sizeof(struct gaih_addrtuple));
                 r_tuple_prev = r_tuple;
@@ -158,7 +155,7 @@ enum nss_status _nss_myhostname_gethostbyname4_r(
                 r_tuple->next = r_tuple_prev;
                 r_tuple->name = r_name;
                 r_tuple->family = a->family;
-                r_tuple->scopeid = a->ifindex;
+                r_tuple->scopeid = a->family == AF_INET6 && IN6_IS_ADDR_LINKLOCAL(&a->address.in6) ? a->ifindex : 0;
                 memcpy(r_tuple->addr, &a->address, 16);
 
                 idx += ALIGN(sizeof(struct gaih_addrtuple));
@@ -223,8 +220,8 @@ static enum nss_status fill_in_hostent(
                 (c > 0 ? c+1 : 2) * sizeof(char*);
 
         if (buflen < ms) {
-                *errnop = ENOMEM;
-                *h_errnop = NO_RECOVERY;
+                *errnop = ERANGE;
+                *h_errnop = NETDB_INTERNAL;
                 return NSS_STATUS_TRYAGAIN;
         }
 
index 8d57b26..ea90953 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "alloc-util.h"
 #include "bus-common-errors.h"
+#include "env-util.h"
 #include "hostname-util.h"
 #include "in-addr-util.h"
 #include "macro.h"
@@ -150,8 +151,8 @@ enum nss_status _nss_mymachines_gethostbyname4_r(
         l = strlen(name);
         ms = ALIGN(l+1) + ALIGN(sizeof(struct gaih_addrtuple)) * c;
         if (buflen < ms) {
-                *errnop = ENOMEM;
-                *h_errnop = TRY_AGAIN;
+                *errnop = ERANGE;
+                *h_errnop = NETDB_INTERNAL;
                 return NSS_STATUS_TRYAGAIN;
         }
 
@@ -305,8 +306,8 @@ enum nss_status _nss_mymachines_gethostbyname3_r(
         ms = ALIGN(l+1) + c * ALIGN(alen) + (c+2) * sizeof(char*);
 
         if (buflen < ms) {
-                *errnop = ENOMEM;
-                *h_errnop = NO_RECOVERY;
+                *errnop = ERANGE;
+                *h_errnop = NETDB_INTERNAL;
                 return NSS_STATUS_TRYAGAIN;
         }
 
@@ -434,6 +435,12 @@ enum nss_status _nss_mymachines_getpwnam_r(
         if (!machine_name_is_valid(machine))
                 goto not_found;
 
+        if (getenv_bool("SYSTEMD_NSS_BYPASS_BUS") > 0)
+                /* Make sure we can't deadlock if we are invoked by dbus-daemon. This way, it won't be able to resolve
+                 * these UIDs, but that should be unproblematic as containers should never be able to connect to a bus
+                 * running on the host. */
+                goto not_found;
+
         r = sd_bus_open_system(&bus);
         if (r < 0)
                 goto fail;
@@ -464,7 +471,7 @@ enum nss_status _nss_mymachines_getpwnam_r(
 
         l = strlen(name);
         if (buflen < l+1) {
-                *errnop = ENOMEM;
+                *errnop = ERANGE;
                 return NSS_STATUS_TRYAGAIN;
         }
 
@@ -505,15 +512,16 @@ enum nss_status _nss_mymachines_getpwuid_r(
 
         BLOCK_SIGNALS(NSS_SIGNALS_BLOCK);
 
-        if (!uid_is_valid(uid)) {
-                r = -EINVAL;
-                goto fail;
-        }
+        if (!uid_is_valid(uid))
+                goto not_found;
 
         /* We consider all uids < 65536 host uids */
         if (uid < HOST_UID_LIMIT)
                 goto not_found;
 
+        if (getenv_bool("SYSTEMD_NSS_BYPASS_BUS") > 0)
+                goto not_found;
+
         r = sd_bus_open_system(&bus);
         if (r < 0)
                 goto fail;
@@ -542,7 +550,7 @@ enum nss_status _nss_mymachines_getpwuid_r(
                 goto not_found;
 
         if (snprintf(buffer, buflen, "vu-%s-" UID_FMT, machine, (uid_t) mapped) >= (int) buflen) {
-                *errnop = ENOMEM;
+                *errnop = ERANGE;
                 return NSS_STATUS_TRYAGAIN;
         }
 
@@ -605,6 +613,9 @@ enum nss_status _nss_mymachines_getgrnam_r(
         if (!machine_name_is_valid(machine))
                 goto not_found;
 
+        if (getenv_bool("SYSTEMD_NSS_BYPASS_BUS") > 0)
+                goto not_found;
+
         r = sd_bus_open_system(&bus);
         if (r < 0)
                 goto fail;
@@ -634,7 +645,7 @@ enum nss_status _nss_mymachines_getgrnam_r(
 
         l = sizeof(char*) + strlen(name) + 1;
         if (buflen < l) {
-                *errnop = ENOMEM;
+                *errnop = ERANGE;
                 return NSS_STATUS_TRYAGAIN;
         }
 
@@ -673,15 +684,16 @@ enum nss_status _nss_mymachines_getgrgid_r(
 
         BLOCK_SIGNALS(NSS_SIGNALS_BLOCK);
 
-        if (!gid_is_valid(gid)) {
-                r = -EINVAL;
-                goto fail;
-        }
+        if (!gid_is_valid(gid))
+                goto not_found;
 
         /* We consider all gids < 65536 host gids */
         if (gid < HOST_GID_LIMIT)
                 goto not_found;
 
+        if (getenv_bool("SYSTEMD_NSS_BYPASS_BUS") > 0)
+                goto not_found;
+
         r = sd_bus_open_system(&bus);
         if (r < 0)
                 goto fail;
@@ -710,13 +722,13 @@ enum nss_status _nss_mymachines_getgrgid_r(
                 goto not_found;
 
         if (buflen < sizeof(char*) + 1) {
-                *errnop = ENOMEM;
+                *errnop = ERANGE;
                 return NSS_STATUS_TRYAGAIN;
         }
 
         memzero(buffer, sizeof(char*));
         if (snprintf(buffer + sizeof(char*), buflen - sizeof(char*), "vg-%s-" GID_FMT, machine, (gid_t) mapped) >= (int) buflen) {
-                *errnop = ENOMEM;
+                *errnop = ERANGE;
                 return NSS_STATUS_TRYAGAIN;
         }
 
index 5ce10f1..ec059d9 100644 (file)
@@ -17,7 +17,6 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <dlfcn.h>
 #include <errno.h>
 #include <netdb.h>
 #include <nss.h>
@@ -39,20 +38,6 @@ NSS_GETHOSTBYADDR_PROTOTYPES(resolve);
 
 #define DNS_CALL_TIMEOUT_USEC (45*USEC_PER_SEC)
 
-typedef void (*voidfunc_t)(void);
-
-static voidfunc_t find_fallback(const char *module, const char *symbol) {
-        void *dl;
-
-        /* Try to find a fallback NSS module symbol */
-
-        dl = dlopen(module, RTLD_LAZY|RTLD_NODELETE);
-        if (!dl)
-                return NULL;
-
-        return dlsym(dl, symbol);
-}
-
 static bool bus_error_shall_fallback(sd_bus_error *e) {
         return sd_bus_error_has_name(e, SD_BUS_ERROR_SERVICE_UNKNOWN) ||
                sd_bus_error_has_name(e, SD_BUS_ERROR_NAME_HAS_NO_OWNER) ||
@@ -110,6 +95,20 @@ static int count_addresses(sd_bus_message *m, int af, const char **canonical) {
         return c;
 }
 
+static uint32_t ifindex_to_scopeid(int family, const void *a, int ifindex) {
+        struct in6_addr in6;
+
+        if (family != AF_INET6)
+                return 0;
+
+        /* Some apps can't deal with the scope ID attached to non-link-local addresses. Hence, let's suppress that. */
+
+        assert(sizeof(in6) == FAMILY_ADDRESS_SIZE(AF_INET6));
+        memcpy(&in6, a, sizeof(struct in6_addr));
+
+        return IN6_IS_ADDR_LINKLOCAL(&in6) ? ifindex : 0;
+}
+
 enum nss_status _nss_resolve_gethostbyname4_r(
                 const char *name,
                 struct gaih_addrtuple **pat,
@@ -121,6 +120,7 @@ enum nss_status _nss_resolve_gethostbyname4_r(
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         struct gaih_addrtuple *r_tuple, *r_tuple_first = NULL;
         _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+        enum nss_status ret = NSS_STATUS_UNAVAIL;
         const char *canonical = NULL;
         size_t l, ms, idx;
         char *r_name;
@@ -136,7 +136,7 @@ enum nss_status _nss_resolve_gethostbyname4_r(
 
         r = sd_bus_open_system(&bus);
         if (r < 0)
-                goto fallback;
+                goto fail;
 
         r = sd_bus_message_new_method_call(
                         bus,
@@ -164,8 +164,13 @@ enum nss_status _nss_resolve_gethostbyname4_r(
                         return NSS_STATUS_NOTFOUND;
                 }
 
-                if (bus_error_shall_fallback(&error))
-                        goto fallback;
+                /* Return NSS_STATUS_UNAVAIL when communication with systemd-resolved fails,
+                   allowing falling back to other nss modules. Treat all other error conditions as
+                   NOTFOUND. This includes DNSSEC errors and suchlike. (We don't use UNAVAIL in this
+                   case so that the nsswitch.conf configuration can distuingish such executed but
+                   negative replies from complete failure to talk to resolved). */
+                if (!bus_error_shall_fallback(&error))
+                        ret = NSS_STATUS_NOTFOUND;
 
                 goto fail;
         }
@@ -187,8 +192,8 @@ enum nss_status _nss_resolve_gethostbyname4_r(
         l = strlen(canonical);
         ms = ALIGN(l+1) + ALIGN(sizeof(struct gaih_addrtuple)) * c;
         if (buflen < ms) {
-                *errnop = ENOMEM;
-                *h_errnop = TRY_AGAIN;
+                *errnop = ERANGE;
+                *h_errnop = NETDB_INTERNAL;
                 return NSS_STATUS_TRYAGAIN;
         }
 
@@ -240,7 +245,7 @@ enum nss_status _nss_resolve_gethostbyname4_r(
                 r_tuple->next = i == c-1 ? NULL : (struct gaih_addrtuple*) ((char*) r_tuple + ALIGN(sizeof(struct gaih_addrtuple)));
                 r_tuple->name = r_name;
                 r_tuple->family = family;
-                r_tuple->scopeid = ifindex;
+                r_tuple->scopeid = ifindex_to_scopeid(family, a, ifindex);
                 memcpy(r_tuple->addr, a, sz);
 
                 idx += ALIGN(sizeof(struct gaih_addrtuple));
@@ -267,21 +272,10 @@ enum nss_status _nss_resolve_gethostbyname4_r(
 
         return NSS_STATUS_SUCCESS;
 
-fallback:
-        {
-                _nss_gethostbyname4_r_t fallback;
-
-                fallback = (_nss_gethostbyname4_r_t)
-                        find_fallback("libnss_dns.so.2", "_nss_dns_gethostbyname4_r");
-
-                if (fallback)
-                        return fallback(name, pat, buffer, buflen, errnop, h_errnop, ttlp);
-        }
-
 fail:
         *errnop = -r;
         *h_errnop = NO_RECOVERY;
-        return NSS_STATUS_UNAVAIL;
+        return ret;
 }
 
 enum nss_status _nss_resolve_gethostbyname3_r(
@@ -297,6 +291,7 @@ enum nss_status _nss_resolve_gethostbyname3_r(
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         char *r_name, *r_aliases, *r_addr, *r_addr_list;
         _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+        enum nss_status ret = NSS_STATUS_UNAVAIL;
         size_t l, idx, ms, alen;
         const char *canonical;
         int c, r, i = 0;
@@ -319,7 +314,7 @@ enum nss_status _nss_resolve_gethostbyname3_r(
 
         r = sd_bus_open_system(&bus);
         if (r < 0)
-                goto fallback;
+                goto fail;
 
         r = sd_bus_message_new_method_call(
                         bus,
@@ -347,8 +342,8 @@ enum nss_status _nss_resolve_gethostbyname3_r(
                         return NSS_STATUS_NOTFOUND;
                 }
 
-                if (bus_error_shall_fallback(&error))
-                        goto fallback;
+                if (!bus_error_shall_fallback(&error))
+                        ret = NSS_STATUS_NOTFOUND;
 
                 goto fail;
         }
@@ -373,8 +368,8 @@ enum nss_status _nss_resolve_gethostbyname3_r(
         ms = ALIGN(l+1) + c * ALIGN(alen) + (c+2) * sizeof(char*);
 
         if (buflen < ms) {
-                *errnop = ENOMEM;
-                *h_errnop = TRY_AGAIN;
+                *errnop = ERANGE;
+                *h_errnop = NETDB_INTERNAL;
                 return NSS_STATUS_TRYAGAIN;
         }
 
@@ -463,20 +458,10 @@ enum nss_status _nss_resolve_gethostbyname3_r(
 
         return NSS_STATUS_SUCCESS;
 
-fallback:
-        {
-                _nss_gethostbyname3_r_t fallback;
-
-                fallback = (_nss_gethostbyname3_r_t)
-                        find_fallback("libnss_dns.so.2", "_nss_dns_gethostbyname3_r");
-                if (fallback)
-                        return fallback(name, af, result, buffer, buflen, errnop, h_errnop, ttlp, canonp);
-        }
-
 fail:
         *errnop = -r;
         *h_errnop = NO_RECOVERY;
-        return NSS_STATUS_UNAVAIL;
+        return ret;
 }
 
 enum nss_status _nss_resolve_gethostbyaddr2_r(
@@ -491,6 +476,7 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         char *r_name, *r_aliases, *r_addr, *r_addr_list;
         _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+        enum nss_status ret = NSS_STATUS_UNAVAIL;
         unsigned c = 0, i = 0;
         size_t ms = 0, idx;
         const char *n;
@@ -518,7 +504,7 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
 
         r = sd_bus_open_system(&bus);
         if (r < 0)
-                goto fallback;
+                goto fail;
 
         r = sd_bus_message_new_method_call(
                         bus,
@@ -554,13 +540,10 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
                         return NSS_STATUS_NOTFOUND;
                 }
 
-                if (bus_error_shall_fallback(&error))
-                        goto fallback;
-
+                if (!bus_error_shall_fallback(&error))
+                        ret = NSS_STATUS_NOTFOUND;
 
-                *errnop = -r;
-                *h_errnop = NO_RECOVERY;
-                return NSS_STATUS_UNAVAIL;
+                goto fail;
         }
 
         r = sd_bus_message_enter_container(reply, 'a', "(is)");
@@ -595,8 +578,8 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
               c * sizeof(char*);        /* pointers to aliases, plus trailing NULL */
 
         if (buflen < ms) {
-                *errnop = ENOMEM;
-                *h_errnop = TRY_AGAIN;
+                *errnop = ERANGE;
+                *h_errnop = NETDB_INTERNAL;
                 return NSS_STATUS_TRYAGAIN;
         }
 
@@ -654,21 +637,10 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
 
         return NSS_STATUS_SUCCESS;
 
-fallback:
-        {
-                _nss_gethostbyaddr2_r_t fallback;
-
-                fallback = (_nss_gethostbyaddr2_r_t)
-                        find_fallback("libnss_dns.so.2", "_nss_dns_gethostbyaddr2_r");
-
-                if (fallback)
-                        return fallback(addr, len, af, result, buffer, buflen, errnop, h_errnop, ttlp);
-        }
-
 fail:
         *errnop = -r;
         *h_errnop = NO_RECOVERY;
-        return NSS_STATUS_UNAVAIL;
+        return ret;
 }
 
 NSS_GETHOSTBYNAME_FALLBACKS(resolve);
diff --git a/src/nss-systemd/Makefile b/src/nss-systemd/Makefile
new file mode 120000 (symlink)
index 0000000..d0b0e8e
--- /dev/null
@@ -0,0 +1 @@
+../Makefile
\ No newline at end of file
diff --git a/src/nss-systemd/nss-systemd.c b/src/nss-systemd/nss-systemd.c
new file mode 100644 (file)
index 0000000..f404755
--- /dev/null
@@ -0,0 +1,509 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <nss.h>
+
+#include "sd-bus.h"
+
+#include "alloc-util.h"
+#include "bus-common-errors.h"
+#include "env-util.h"
+#include "fs-util.h"
+#include "macro.h"
+#include "nss-util.h"
+#include "signal-util.h"
+#include "stdio-util.h"
+#include "string-util.h"
+#include "user-util.h"
+#include "util.h"
+
+static const struct passwd root_passwd = {
+        .pw_name = (char*) "root",
+        .pw_passwd = (char*) "x", /* see shadow file */
+        .pw_uid = 0,
+        .pw_gid = 0,
+        .pw_gecos = (char*) "Super User",
+        .pw_dir = (char*) "/root",
+        .pw_shell = (char*) "/bin/sh",
+};
+
+static const struct passwd nobody_passwd = {
+        .pw_name = (char*) NOBODY_USER_NAME,
+        .pw_passwd = (char*) "*", /* locked */
+        .pw_uid = 65534,
+        .pw_gid = 65534,
+        .pw_gecos = (char*) "User Nobody",
+        .pw_dir = (char*) "/",
+        .pw_shell = (char*) "/sbin/nologin",
+};
+
+static const struct group root_group = {
+        .gr_name = (char*) "root",
+        .gr_gid = 0,
+        .gr_passwd = (char*) "x", /* see shadow file */
+        .gr_mem = (char*[]) { NULL },
+};
+
+static const struct group nobody_group = {
+        .gr_name = (char*) NOBODY_GROUP_NAME,
+        .gr_gid = 65534,
+        .gr_passwd = (char*) "*", /* locked */
+        .gr_mem = (char*[]) { NULL },
+};
+
+NSS_GETPW_PROTOTYPES(systemd);
+NSS_GETGR_PROTOTYPES(systemd);
+
+static int direct_lookup_name(const char *name, uid_t *ret) {
+        _cleanup_free_ char *s = NULL;
+        const char *path;
+        int r;
+
+        assert(name);
+
+        /* Normally, we go via the bus to resolve names. That has the benefit that it is available from any mount
+         * namespace and subject to proper authentication. However, there's one problem: if our module is called from
+         * dbus-daemon itself we really can't use D-Bus to communicate. In this case, resort to a client-side hack,
+         * and look for the dynamic names directly. This is pretty ugly, but breaks the cyclic dependency. */
+
+        path = strjoina("/run/systemd/dynamic-uid/direct:", name);
+        r = readlink_malloc(path, &s);
+        if (r < 0)
+                return r;
+
+        return parse_uid(s, ret);
+}
+
+static int direct_lookup_uid(uid_t uid, char **ret) {
+        char path[strlen("/run/systemd/dynamic-uid/direct:") + DECIMAL_STR_MAX(uid_t) + 1], *s;
+        int r;
+
+        xsprintf(path, "/run/systemd/dynamic-uid/direct:" UID_FMT, uid);
+
+        r = readlink_malloc(path, &s);
+        if (r < 0)
+                return r;
+        if (!valid_user_group_name(s)) { /* extra safety check */
+                free(s);
+                return -EINVAL;
+        }
+
+        *ret = s;
+        return 0;
+}
+
+enum nss_status _nss_systemd_getpwnam_r(
+                const char *name,
+                struct passwd *pwd,
+                char *buffer, size_t buflen,
+                int *errnop) {
+
+        uint32_t translated;
+        size_t l;
+        int r;
+
+        BLOCK_SIGNALS(NSS_SIGNALS_BLOCK);
+
+        assert(name);
+        assert(pwd);
+
+        /* If the username is not valid, then we don't know it. Ideally libc would filter these for us anyway. We don't
+         * generate EINVAL here, because it isn't really out business to complain about invalid user names. */
+        if (!valid_user_group_name(name))
+                goto not_found;
+
+        /* Synthesize entries for the root and nobody users, in case they are missing in /etc/passwd */
+        if (streq(name, root_passwd.pw_name)) {
+                *pwd = root_passwd;
+                *errnop = 0;
+                return NSS_STATUS_SUCCESS;
+        }
+        if (streq(name, nobody_passwd.pw_name)) {
+                *pwd = nobody_passwd;
+                *errnop = 0;
+                return NSS_STATUS_SUCCESS;
+        }
+
+        /* Make sure that we don't go in circles when allocating a dynamic UID by checking our own database */
+        if (getenv_bool("SYSTEMD_NSS_DYNAMIC_BYPASS") > 0)
+                goto not_found;
+
+        if (getenv_bool("SYSTEMD_NSS_BYPASS_BUS") > 0) {
+
+                /* Access the dynamic UID allocation directly if we are called from dbus-daemon, see above. */
+                r = direct_lookup_name(name, (uid_t*) &translated);
+                if (r == -ENOENT)
+                        goto not_found;
+                if (r < 0)
+                        goto fail;
+
+        } else {
+                _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+                _cleanup_(sd_bus_message_unrefp) sd_bus_message* reply = NULL;
+                _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+
+                r = sd_bus_open_system(&bus);
+                if (r < 0)
+                        goto fail;
+
+                r = sd_bus_call_method(bus,
+                                       "org.freedesktop.systemd1",
+                                       "/org/freedesktop/systemd1",
+                                       "org.freedesktop.systemd1.Manager",
+                                       "LookupDynamicUserByName",
+                                       &error,
+                                       &reply,
+                                       "s",
+                                       name);
+                if (r < 0) {
+                        if (sd_bus_error_has_name(&error, BUS_ERROR_NO_SUCH_DYNAMIC_USER))
+                                goto not_found;
+
+                        goto fail;
+                }
+
+                r = sd_bus_message_read(reply, "u", &translated);
+                if (r < 0)
+                        goto fail;
+        }
+
+        l = strlen(name);
+        if (buflen < l+1) {
+                *errnop = ERANGE;
+                return NSS_STATUS_TRYAGAIN;
+        }
+
+        memcpy(buffer, name, l+1);
+
+        pwd->pw_name = buffer;
+        pwd->pw_uid = (uid_t) translated;
+        pwd->pw_gid = (uid_t) translated;
+        pwd->pw_gecos = (char*) "Dynamic User";
+        pwd->pw_passwd = (char*) "*"; /* locked */
+        pwd->pw_dir = (char*) "/";
+        pwd->pw_shell = (char*) "/sbin/nologin";
+
+        *errnop = 0;
+        return NSS_STATUS_SUCCESS;
+
+not_found:
+        *errnop = 0;
+        return NSS_STATUS_NOTFOUND;
+
+fail:
+        *errnop = -r;
+        return NSS_STATUS_UNAVAIL;
+}
+
+enum nss_status _nss_systemd_getpwuid_r(
+                uid_t uid,
+                struct passwd *pwd,
+                char *buffer, size_t buflen,
+                int *errnop) {
+
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message* reply = NULL;
+        _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+        _cleanup_free_ char *direct = NULL;
+        const char *translated;
+        size_t l;
+        int r;
+
+        BLOCK_SIGNALS(NSS_SIGNALS_BLOCK);
+
+        if (!uid_is_valid(uid))
+                goto not_found;
+
+        /* Synthesize data for the root user and for nobody in case they are missing from /etc/passwd */
+        if (uid == root_passwd.pw_uid) {
+                *pwd = root_passwd;
+                *errnop = 0;
+                return NSS_STATUS_SUCCESS;
+        }
+        if (uid == nobody_passwd.pw_uid) {
+                *pwd = nobody_passwd;
+                *errnop = 0;
+                return NSS_STATUS_SUCCESS;
+        }
+
+        if (uid <= SYSTEM_UID_MAX)
+                goto not_found;
+
+        if (getenv_bool("SYSTEMD_NSS_DYNAMIC_BYPASS") > 0)
+                goto not_found;
+
+        if (getenv_bool("SYSTEMD_NSS_BYPASS_BUS") > 0) {
+
+                r = direct_lookup_uid(uid, &direct);
+                if (r == -ENOENT)
+                        goto not_found;
+                if (r < 0)
+                        goto fail;
+
+                translated = direct;
+
+        } else {
+                r = sd_bus_open_system(&bus);
+                if (r < 0)
+                        goto fail;
+
+                r = sd_bus_call_method(bus,
+                                       "org.freedesktop.systemd1",
+                                       "/org/freedesktop/systemd1",
+                                       "org.freedesktop.systemd1.Manager",
+                                       "LookupDynamicUserByUID",
+                                       &error,
+                                       &reply,
+                                       "u",
+                                       (uint32_t) uid);
+                if (r < 0) {
+                        if (sd_bus_error_has_name(&error, BUS_ERROR_NO_SUCH_DYNAMIC_USER))
+                                goto not_found;
+
+                        goto fail;
+                }
+
+                r = sd_bus_message_read(reply, "s", &translated);
+                if (r < 0)
+                        goto fail;
+        }
+
+        l = strlen(translated) + 1;
+        if (buflen < l) {
+                *errnop = ERANGE;
+                return NSS_STATUS_TRYAGAIN;
+        }
+
+        memcpy(buffer, translated, l);
+
+        pwd->pw_name = buffer;
+        pwd->pw_uid = uid;
+        pwd->pw_gid = uid;
+        pwd->pw_gecos = (char*) "Dynamic User";
+        pwd->pw_passwd = (char*) "*"; /* locked */
+        pwd->pw_dir = (char*) "/";
+        pwd->pw_shell = (char*) "/sbin/nologin";
+
+        *errnop = 0;
+        return NSS_STATUS_SUCCESS;
+
+not_found:
+        *errnop = 0;
+        return NSS_STATUS_NOTFOUND;
+
+fail:
+        *errnop = -r;
+        return NSS_STATUS_UNAVAIL;
+}
+
+enum nss_status _nss_systemd_getgrnam_r(
+                const char *name,
+                struct group *gr,
+                char *buffer, size_t buflen,
+                int *errnop) {
+
+        uint32_t translated;
+        size_t l;
+        int r;
+
+        BLOCK_SIGNALS(NSS_SIGNALS_BLOCK);
+
+        assert(name);
+        assert(gr);
+
+        if (!valid_user_group_name(name))
+                goto not_found;
+
+        /* Synthesize records for root and nobody, in case they are missing form /etc/group */
+        if (streq(name, root_group.gr_name)) {
+                *gr = root_group;
+                *errnop = 0;
+                return NSS_STATUS_SUCCESS;
+        }
+        if (streq(name, nobody_group.gr_name)) {
+                *gr = nobody_group;
+                *errnop = 0;
+                return NSS_STATUS_SUCCESS;
+        }
+
+        if (getenv_bool("SYSTEMD_NSS_DYNAMIC_BYPASS") > 0)
+                goto not_found;
+
+        if (getenv_bool("SYSTEMD_NSS_BYPASS_BUS") > 0) {
+
+                /* Access the dynamic GID allocation directly if we are called from dbus-daemon, see above. */
+                r = direct_lookup_name(name, (uid_t*) &translated);
+                if (r == -ENOENT)
+                        goto not_found;
+                if (r < 0)
+                        goto fail;
+        } else {
+
+                _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+                _cleanup_(sd_bus_message_unrefp) sd_bus_message* reply = NULL;
+                _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+
+                r = sd_bus_open_system(&bus);
+                if (r < 0)
+                        goto fail;
+
+                r = sd_bus_call_method(bus,
+                                       "org.freedesktop.systemd1",
+                                       "/org/freedesktop/systemd1",
+                                       "org.freedesktop.systemd1.Manager",
+                                       "LookupDynamicUserByName",
+                                       &error,
+                                       &reply,
+                                       "s",
+                                       name);
+                if (r < 0) {
+                        if (sd_bus_error_has_name(&error, BUS_ERROR_NO_SUCH_DYNAMIC_USER))
+                                goto not_found;
+
+                        goto fail;
+                }
+
+                r = sd_bus_message_read(reply, "u", &translated);
+                if (r < 0)
+                        goto fail;
+        }
+
+        l = sizeof(char*) + strlen(name) + 1;
+        if (buflen < l) {
+                *errnop = ERANGE;
+                return NSS_STATUS_TRYAGAIN;
+        }
+
+        memzero(buffer, sizeof(char*));
+        strcpy(buffer + sizeof(char*), name);
+
+        gr->gr_name = buffer + sizeof(char*);
+        gr->gr_gid = (gid_t) translated;
+        gr->gr_passwd = (char*) "*"; /* locked */
+        gr->gr_mem = (char**) buffer;
+
+        *errnop = 0;
+        return NSS_STATUS_SUCCESS;
+
+not_found:
+        *errnop = 0;
+        return NSS_STATUS_NOTFOUND;
+
+fail:
+        *errnop = -r;
+        return NSS_STATUS_UNAVAIL;
+}
+
+enum nss_status _nss_systemd_getgrgid_r(
+                gid_t gid,
+                struct group *gr,
+                char *buffer, size_t buflen,
+                int *errnop) {
+
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message* reply = NULL;
+        _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+        _cleanup_free_ char *direct = NULL;
+        const char *translated;
+        size_t l;
+        int r;
+
+        BLOCK_SIGNALS(NSS_SIGNALS_BLOCK);
+
+        if (!gid_is_valid(gid))
+                goto not_found;
+
+        /* Synthesize records for root and nobody, in case they are missing from /etc/group */
+        if (gid == root_group.gr_gid) {
+                *gr = root_group;
+                *errnop = 0;
+                return NSS_STATUS_SUCCESS;
+        }
+        if (gid == nobody_group.gr_gid) {
+                *gr = nobody_group;
+                *errnop = 0;
+                return NSS_STATUS_SUCCESS;
+        }
+
+        if (gid <= SYSTEM_GID_MAX)
+                goto not_found;
+
+        if (getenv_bool("SYSTEMD_NSS_DYNAMIC_BYPASS") > 0)
+                goto not_found;
+
+        if (getenv_bool("SYSTEMD_NSS_BYPASS_BUS") > 0) {
+
+                r = direct_lookup_uid(gid, &direct);
+                if (r == -ENOENT)
+                        goto not_found;
+                if (r < 0)
+                        goto fail;
+
+                translated = direct;
+        } else {
+                r = sd_bus_open_system(&bus);
+                if (r < 0)
+                        goto fail;
+
+                r = sd_bus_call_method(bus,
+                                       "org.freedesktop.systemd1",
+                                       "/org/freedesktop/systemd1",
+                                       "org.freedesktop.systemd1.Manager",
+                                       "LookupDynamicUserByUID",
+                                       &error,
+                                       &reply,
+                                       "u",
+                                       (uint32_t) gid);
+                if (r < 0) {
+                        if (sd_bus_error_has_name(&error, BUS_ERROR_NO_SUCH_DYNAMIC_USER))
+                                goto not_found;
+
+                        goto fail;
+                }
+
+                r = sd_bus_message_read(reply, "s", &translated);
+                if (r < 0)
+                        goto fail;
+        }
+
+        l = sizeof(char*) + strlen(translated) + 1;
+        if (buflen < l) {
+                *errnop = ERANGE;
+                return NSS_STATUS_TRYAGAIN;
+        }
+
+        memzero(buffer, sizeof(char*));
+        strcpy(buffer + sizeof(char*), translated);
+
+        gr->gr_name = buffer + sizeof(char*);
+        gr->gr_gid = gid;
+        gr->gr_passwd = (char*) "*"; /* locked */
+        gr->gr_mem = (char**) buffer;
+
+        *errnop = 0;
+        return NSS_STATUS_SUCCESS;
+
+not_found:
+        *errnop = 0;
+        return NSS_STATUS_NOTFOUND;
+
+fail:
+        *errnop = -r;
+        return NSS_STATUS_UNAVAIL;
+}
diff --git a/src/nss-systemd/nss-systemd.sym b/src/nss-systemd/nss-systemd.sym
new file mode 100644 (file)
index 0000000..9550787
--- /dev/null
@@ -0,0 +1,17 @@
+/***
+  This file is part of systemd.
+
+  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.
+***/
+
+{
+global:
+        _nss_systemd_getpwnam_r;
+        _nss_systemd_getpwuid_r;
+        _nss_systemd_getgrnam_r;
+        _nss_systemd_getgrgid_r;
+local: *;
+};
index 6d8c05f..a42fce3 100644 (file)
 static bool arg_skip = false;
 static bool arg_force = false;
 
-static int parse_proc_cmdline_item(const char *key, const char *value) {
+static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
 
-        if (streq(key, "quotacheck.mode") && value) {
+        if (streq(key, "quotacheck.mode")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
                 if (streq(value, "auto"))
                         arg_force = arg_skip = false;
@@ -88,7 +91,7 @@ int main(int argc, char *argv[]) {
 
         umask(0022);
 
-        r = parse_proc_cmdline(parse_proc_cmdline_item);
+        r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0);
         if (r < 0)
                 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
 
@@ -104,9 +107,10 @@ int main(int argc, char *argv[]) {
 
         pid = fork();
         if (pid < 0) {
-                log_error_errno(errno, "fork(): %m");
-                return EXIT_FAILURE;
-        } else if (pid == 0) {
+                r = log_error_errno(errno, "fork(): %m");
+                goto finish;
+        }
+        if (pid == 0) {
 
                 /* Child */
 
@@ -120,5 +124,6 @@ int main(int argc, char *argv[]) {
 
         r = wait_for_terminate_and_warn("quotacheck", pid, true);
 
+finish:
         return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }
index 618bbe4..db3bf5b 100644 (file)
 #include "string-util.h"
 #include "util.h"
 
-#ifndef RC_LOCAL_SCRIPT_PATH_START
-#define RC_LOCAL_SCRIPT_PATH_START "/etc/rc.d/rc.local"
-#endif
-
-#ifndef RC_LOCAL_SCRIPT_PATH_STOP
-#define RC_LOCAL_SCRIPT_PATH_STOP "/sbin/halt.local"
-#endif
-
 static const char *arg_dest = "/tmp";
 
 static int add_symlink(const char *service, const char *where) {
@@ -45,11 +37,11 @@ static int add_symlink(const char *service, const char *where) {
         assert(service);
         assert(where);
 
-        from = strjoin(SYSTEM_DATA_UNIT_PATH, "/", service, NULL);
+        from = strjoin(SYSTEM_DATA_UNIT_PATH, "/", service);
         if (!from)
                 return log_oom();
 
-        to = strjoin(arg_dest, "/", where, ".wants/", service, NULL);
+        to = strjoin(arg_dest, "/", where, ".wants/", service);
         if (!to)
                 return log_oom();
 
index 6468d1e..0cb9bd9 100644 (file)
@@ -56,7 +56,7 @@ int main(int argc, char *argv[]) {
 
         umask(0022);
 
-        f = setmntent("/etc/fstab", "r");
+        f = setmntent("/etc/fstab", "re");
         if (!f) {
                 if (errno == ENOENT) {
                         r = 0;
@@ -137,7 +137,7 @@ int main(int argc, char *argv[]) {
 
                 s = hashmap_remove(pids, PID_TO_PTR(si.si_pid));
                 if (s) {
-                        if (!is_clean_exit(si.si_code, si.si_status, NULL)) {
+                        if (!is_clean_exit(si.si_code, si.si_status, EXIT_CLEAN_COMMAND, NULL)) {
                                 if (si.si_code == CLD_EXITED)
                                         log_error(MOUNT_PATH " for %s exited with exit status %i.", s, si.si_status);
                                 else
index 17eab97..a17c8a6 100644 (file)
@@ -90,7 +90,7 @@ int main(int argc, char *argv[]) {
         r = send_on_socket(fd, argv[2], packet, length);
 
 finish:
-        memory_erase(packet, sizeof(packet));
+        explicit_bzero(packet, sizeof(packet));
 
         return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }
index aaf5ed6..d89ae28 100644 (file)
@@ -29,7 +29,7 @@ typedef const struct {
 } dns_type;
 
 static const struct dns_type_name *
-lookup_dns_type (register const char *str, register unsigned int len);
+lookup_dns_type (register const char *str, register GPERF_LEN_TYPE len);
 
 #include "dns_type-from-name.h"
 #include "dns_type-to-name.h"
diff --git a/src/resolve/dns_type-to-name.awk b/src/resolve/dns_type-to-name.awk
new file mode 100644 (file)
index 0000000..badb182
--- /dev/null
@@ -0,0 +1,11 @@
+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"
+}
diff --git a/src/resolve/generate-dns_type-gperf.py b/src/resolve/generate-dns_type-gperf.py
new file mode 100755 (executable)
index 0000000..8a0b43c
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env python3
+
+"""Generate %-from-name.gperf from %-list.txt
+"""
+
+import sys
+
+name, prefix, input = sys.argv[1:]
+
+print("""\
+struct {}_name {{ const char* name; int id; }};
+%null-strings
+%%""".format(name))
+
+for line in open(input):
+    line = line.rstrip()
+    s = line.replace('_', '-')
+    print("{}, {}{}".format(s, prefix, line))
diff --git a/src/resolve/generate-dns_type-list.sed b/src/resolve/generate-dns_type-list.sed
new file mode 100644 (file)
index 0000000..b7bc30f
--- /dev/null
@@ -0,0 +1 @@
+s/.* DNS_TYPE_(\w+).*/\1/p
diff --git a/src/resolve/meson.build b/src/resolve/meson.build
new file mode 100644 (file)
index 0000000..fe22878
--- /dev/null
@@ -0,0 +1,187 @@
+basic_dns_sources = files('''
+        resolved-dns-dnssec.c
+        resolved-dns-dnssec.h
+        resolved-dns-packet.c
+        resolved-dns-packet.h
+        resolved-dns-rr.c
+        resolved-dns-rr.h
+        resolved-dns-answer.c
+        resolved-dns-answer.h
+        resolved-dns-question.c
+        resolved-dns-question.h
+        dns-type.c
+'''.split())
+
+dns_type_h = files('dns-type.h')[0]
+
+systemd_resolved_only_sources = files('''
+        resolved.c
+        resolved-manager.c
+        resolved-manager.h
+        resolved-conf.c
+        resolved-conf.h
+        resolved-resolv-conf.c
+        resolved-resolv-conf.h
+        resolved-bus.c
+        resolved-bus.h
+        resolved-link.h
+        resolved-link.c
+        resolved-link-bus.c
+        resolved-link-bus.h
+        resolved-llmnr.h
+        resolved-llmnr.c
+        resolved-mdns.h
+        resolved-mdns.c
+        resolved-def.h
+        resolved-dns-query.h
+        resolved-dns-query.c
+        resolved-dns-synthesize.h
+        resolved-dns-synthesize.c
+        resolved-dns-transaction.h
+        resolved-dns-transaction.c
+        resolved-dns-scope.h
+        resolved-dns-scope.c
+        resolved-dns-server.h
+        resolved-dns-server.c
+        resolved-dns-search-domain.h
+        resolved-dns-search-domain.c
+        resolved-dns-cache.h
+        resolved-dns-cache.c
+        resolved-dns-zone.h
+        resolved-dns-zone.c
+        resolved-dns-stream.h
+        resolved-dns-stream.c
+        resolved-dns-trust-anchor.h
+        resolved-dns-trust-anchor.c
+        resolved-dns-stub.h
+        resolved-dns-stub.c
+        resolved-etc-hosts.h
+        resolved-etc-hosts.c
+'''.split())
+
+systemd_resolve_only_sources = files('resolve-tool.c')
+
+############################################################
+
+dns_type_list_txt = custom_target(
+        'dns_type-list.txt',
+        input : ['generate-dns_type-list.sed', dns_type_h],
+        output : 'dns_type-list.txt',
+        command : [sed, '-n', '-r', '-f', '@INPUT0@', '@INPUT1@'],
+        capture : true)
+
+generate_dns_type_gperf = find_program('generate-dns_type-gperf.py')
+
+dns_type_headers = [dns_type_h]
+foreach item : [['dns_type', dns_type_list_txt, 'dns_type', 'DNS_TYPE_']]
+
+        fname = '@0@-from-name.gperf'.format(item[0])
+        gperf_file = custom_target(
+                fname,
+                input : item[1],
+                output : fname,
+                command : [generate_dns_type_gperf, item[2], item[3], '@INPUT@'],
+                capture : true)
+
+        fname = '@0@-from-name.h'.format(item[0])
+        target1 = custom_target(
+                fname,
+                input : gperf_file,
+                output : fname,
+                command : [gperf,
+                           '-L', 'ANSI-C', '-t', '--ignore-case',
+                           '-N', 'lookup_@0@'.format(item[2]),
+                           '-H', 'hash_@0@_name'.format(item[2]),
+                           '-p', '-C',
+                           '@INPUT@'],
+                capture : true)
+
+        fname = '@0@-to-name.h'.format(item[0])
+        awkscript = '@0@-to-name.awk'.format(item[0])
+        target2 = custom_target(
+                fname,
+                input : [awkscript, item[1]],
+                output : fname,
+                command : [awk, '-f', '@INPUT0@', '@INPUT1@'],
+                capture : true)
+
+        dns_type_headers += [target1, target2]
+endforeach
+
+resolved_gperf_c = custom_target(
+        'resolved_gperf.c',
+        input : 'resolved-gperf.gperf',
+        output : 'resolved-gperf.c',
+        command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@'])
+
+systemd_resolved_sources = (basic_dns_sources +
+                            [resolved_gperf_c] +
+                            systemd_resolved_only_sources +
+                            dns_type_headers)
+
+systemd_resolve_sources = (basic_dns_sources +
+                           systemd_resolve_only_sources +
+                           dns_type_headers)
+
+if conf.get('ENABLE_RESOLVED', false)
+        install_data('org.freedesktop.resolve1.conf',
+                     install_dir : dbuspolicydir)
+        install_data('org.freedesktop.resolve1.service',
+                     install_dir : dbussystemservicedir)
+
+        resolved_conf = configure_file(
+                input : 'resolved.conf.in',
+                output : 'resolved.conf',
+                configuration : substs)
+        install_data(resolved_conf,
+                     install_dir : pkgsysconfdir)
+
+        install_data('resolv.conf',
+                     install_dir : rootlibexecdir)
+endif
+
+tests += [
+        [['src/resolve/test-resolve-tables.c',
+          basic_dns_sources,
+          dns_type_headers,
+          'src/shared/test-tables.h'],
+         [],
+         [libgcrypt,
+          libgpg_error,
+          libm],
+         'ENABLE_RESOLVED'],
+
+        [['src/resolve/test-dns-packet.c',
+          basic_dns_sources,
+          dns_type_headers],
+         [],
+         [libgcrypt,
+          libgpg_error,
+          libm],
+         'ENABLE_RESOLVED'],
+
+        [['src/resolve/test-resolved-packet.c',
+          basic_dns_sources,
+          dns_type_headers],
+         [],
+         [libgcrypt,
+          libgpg_error,
+          libm],
+         'ENABLE_RESOLVED'],
+
+        [['src/resolve/test-dnssec.c',
+          basic_dns_sources,
+          dns_type_headers],
+         [],
+         [libgcrypt,
+          libgpg_error,
+          libm],
+         'ENABLE_RESOLVED'],
+
+        [['src/resolve/test-dnssec-complex.c',
+          'src/resolve/dns-type.c',
+          dns_type_headers],
+         [],
+         [],
+         'ENABLE_RESOLVED', 'manual'],
+]
index 6ae3750..c620589 100644 (file)
@@ -38,7 +38,7 @@
 #include "strv.h"
 #include "terminal-util.h"
 
-#define DNS_CALL_TIMEOUT_USEC (45*USEC_PER_SEC)
+#define DNS_CALL_TIMEOUT_USEC (90*USEC_PER_SEC)
 
 static int arg_family = AF_UNSPEC;
 static int arg_ifindex = 0;
@@ -114,8 +114,8 @@ static void print_source(uint64_t flags, usec_t rtt) {
                        flags & SD_RESOLVED_DNS ? " DNS" :"",
                        flags & SD_RESOLVED_LLMNR_IPV4 ? " LLMNR/IPv4" : "",
                        flags & SD_RESOLVED_LLMNR_IPV6 ? " LLMNR/IPv6" : "",
-                       flags & SD_RESOLVED_MDNS_IPV4 ? "mDNS/IPv4" : "",
-                       flags & SD_RESOLVED_MDNS_IPV6 ? "mDNS/IPv6" : "");
+                       flags & SD_RESOLVED_MDNS_IPV4 ? " mDNS/IPv4" : "",
+                       flags & SD_RESOLVED_MDNS_IPV6 ? " mDNS/IPv6" : "");
 
         assert_se(format_timespan(rtt_str, sizeof(rtt_str), rtt, 100));
 
@@ -395,7 +395,7 @@ static int output_rr_packet(const void *d, size_t l, int ifindex) {
         return 0;
 }
 
-static int resolve_record(sd_bus *bus, const char *name, uint16_t class, uint16_t type) {
+static int resolve_record(sd_bus *bus, const char *name, uint16_t class, uint16_t type, bool warn_missing) {
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *req = NULL, *reply = NULL;
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         char ifname[IF_NAMESIZE] = "";
@@ -430,7 +430,8 @@ static int resolve_record(sd_bus *bus, const char *name, uint16_t class, uint16_
 
         r = sd_bus_call(bus, req, DNS_CALL_TIMEOUT_USEC, &error, &reply);
         if (r < 0) {
-                log_error("%s: resolve call failed: %s", name, bus_error_message(&error, r));
+                if (warn_missing || r != -ENXIO)
+                        log_error("%s: resolve call failed: %s", name, bus_error_message(&error, r));
                 return r;
         }
 
@@ -488,7 +489,8 @@ static int resolve_record(sd_bus *bus, const char *name, uint16_t class, uint16_
                 return bus_log_parse_error(r);
 
         if (n == 0) {
-                log_error("%s: no records found", name);
+                if (warn_missing)
+                        log_error("%s: no records found", name);
                 return -ESRCH;
         }
 
@@ -618,7 +620,7 @@ static int resolve_rfc4501(sd_bus *bus, const char *name) {
         if (type == 0)
                 type = arg_type ?: DNS_TYPE_A;
 
-        return resolve_record(bus, n, class, type);
+        return resolve_record(bus, n, class, type, true);
 
 invalid:
         log_error("Invalid DNS URI: %s", name);
@@ -778,7 +780,6 @@ static int resolve_service(sd_bus *bus, const char *name, const char *type, cons
         if (r < 0)
                 return bus_log_parse_error(r);
 
-        c = 0;
         while ((r = sd_bus_message_read_array(reply, 'y', (const void**) &p, &sz)) > 0) {
                 _cleanup_free_ char *escaped = NULL;
 
@@ -787,7 +788,6 @@ static int resolve_service(sd_bus *bus, const char *name, const char *type, cons
                         return log_oom();
 
                 printf("%*s%s\n", (int) indent, "", escaped);
-                c++;
         }
         if (r < 0)
                 return bus_log_parse_error(r);
@@ -840,16 +840,34 @@ static int resolve_openpgp(sd_bus *bus, const char *address) {
         }
         domain++;
 
-        r = string_hashsum_sha224(address, domain - 1 - address, &hashed);
+        r = string_hashsum_sha256(address, domain - 1 - address, &hashed);
         if (r < 0)
                 return log_error_errno(r, "Hashing failed: %m");
 
+        strshorten(hashed, 56);
+
         full = strjoina(hashed, "._openpgpkey.", domain);
         log_debug("Looking up \"%s\".", full);
 
-        return resolve_record(bus, full,
-                              arg_class ?: DNS_CLASS_IN,
-                              arg_type ?: DNS_TYPE_OPENPGPKEY);
+        r = resolve_record(bus, full,
+                           arg_class ?: DNS_CLASS_IN,
+                           arg_type ?: DNS_TYPE_OPENPGPKEY, false);
+
+        if (IN_SET(r, -ENXIO, -ESRCH)) { /* NXDOMAIN or NODATA? */
+              hashed = NULL;
+              r = string_hashsum_sha224(address, domain - 1 - address, &hashed);
+              if (r < 0)
+                    return log_error_errno(r, "Hashing failed: %m");
+
+              full = strjoina(hashed, "._openpgpkey.", domain);
+              log_debug("Looking up \"%s\".", full);
+
+              return resolve_record(bus, full,
+                                    arg_class ?: DNS_CLASS_IN,
+                                    arg_type ?: DNS_TYPE_OPENPGPKEY, true);
+        }
+
+        return r;
 }
 
 static int resolve_tlsa(sd_bus *bus, const char *address) {
@@ -863,8 +881,8 @@ static int resolve_tlsa(sd_bus *bus, const char *address) {
 
         port = strrchr(address, ':');
         if (port) {
-                r = safe_atou16(port + 1, &port_num);
-                if (r < 0 || port_num == 0)
+                r = parse_ip_port(port + 1, &port_num);
+                if (r < 0)
                         return log_error_errno(r, "Invalid port \"%s\".", port + 1);
 
                 address = strndupa(address, port - address);
@@ -881,7 +899,7 @@ static int resolve_tlsa(sd_bus *bus, const char *address) {
 
         return resolve_record(bus, full,
                               arg_class ?: DNS_CLASS_IN,
-                              arg_type ?: DNS_TYPE_TLSA);
+                              arg_type ?: DNS_TYPE_TLSA, true);
 }
 
 static int show_statistics(sd_bus *bus) {
@@ -1168,6 +1186,7 @@ static int status_ifindex(sd_bus *bus, int ifindex, const char *name, bool *empt
                 {}
         };
 
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_free_ char *ifi = NULL, *p = NULL;
         char ifname[IF_NAMESIZE] = "";
         char **i;
@@ -1195,9 +1214,10 @@ static int status_ifindex(sd_bus *bus, int ifindex, const char *name, bool *empt
                                    "org.freedesktop.resolve1",
                                    p,
                                    property_map,
+                                   &error,
                                    &link_info);
         if (r < 0) {
-                log_error_errno(r, "Failed to get link data for %i: %m", ifindex);
+                log_error_errno(r, "Failed to get link data for %i: %s", ifindex, bus_error_message(&error, r));
                 goto finish;
         }
 
@@ -1387,6 +1407,7 @@ static int status_global(sd_bus *bus, bool *empty_line) {
                 {}
         };
 
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         char **i;
         int r;
 
@@ -1397,9 +1418,10 @@ static int status_global(sd_bus *bus, bool *empty_line) {
                                    "org.freedesktop.resolve1",
                                    "/org/freedesktop/resolve1",
                                    property_map,
+                                   &error,
                                    &global_info);
         if (r < 0) {
-                log_error_errno(r, "Failed to get global data: %m");
+                log_error_errno(r, "Failed to get global data: %s", bus_error_message(&error, r));
                 goto finish;
         }
 
@@ -1506,7 +1528,7 @@ static int status_all(sd_bus *bus) {
 static void help_protocol_types(void) {
         if (arg_legend)
                 puts("Known protocol types:");
-        puts("dns\nllmnr\nllmnr-ipv4\nllmnr-ipv6");
+        puts("dns\nllmnr\nllmnr-ipv4\nllmnr-ipv6\nmdns\nmnds-ipv4\nmdns-ipv6");
 }
 
 static void help_dns_types(void) {
@@ -1542,7 +1564,7 @@ static void help(void) {
                "%1$s [OPTIONS...] --statistics\n"
                "%1$s [OPTIONS...] --reset-statistics\n"
                "\n"
-               "Resolve domain names, IPv4 and IPv6 addresses, DNS resource records, and services.\n\n"
+               "Resolve domain names, IPv4 and IPv6 addresses, DNS records, and services.\n\n"
                "  -h --help                 Show this help\n"
                "     --version              Show package version\n"
                "     --no-pager             Do not pipe output into a pager\n"
@@ -1704,6 +1726,12 @@ static int parse_argv(int argc, char *argv[]) {
                                 arg_flags |= SD_RESOLVED_LLMNR_IPV4;
                         else if (streq(optarg, "llmnr-ipv6"))
                                 arg_flags |= SD_RESOLVED_LLMNR_IPV6;
+                        else if (streq(optarg, "mdns"))
+                                arg_flags |= SD_RESOLVED_MDNS;
+                        else if (streq(optarg, "mdns-ipv4"))
+                                arg_flags |= SD_RESOLVED_MDNS_IPV4;
+                        else if (streq(optarg, "mdns-ipv6"))
+                                arg_flags |= SD_RESOLVED_MDNS_IPV6;
                         else {
                                 log_error("Unknown protocol specifier: %s", optarg);
                                 return -EINVAL;
@@ -1877,7 +1905,7 @@ int main(int argc, char **argv) {
                 while (argv[optind]) {
                         int k;
 
-                        k = resolve_record(bus, argv[optind], arg_class, arg_type);
+                        k = resolve_record(bus, argv[optind], arg_class, arg_type, true);
                         if (r == 0)
                                 r = k;
 
index 2ca65e6..5aa2348 100644 (file)
@@ -211,7 +211,7 @@ static void bus_method_resolve_hostname_complete(DnsQuery *q) {
         r = sd_bus_message_append(
                         reply, "st",
                         normalized,
-                        SD_RESOLVED_FLAGS_MAKE(q->answer_protocol, q->answer_family, q->answer_authenticated));
+                        SD_RESOLVED_FLAGS_MAKE(q->answer_protocol, q->answer_family, dns_query_fully_authenticated(q)));
         if (r < 0)
                 goto finish;
 
@@ -345,10 +345,10 @@ static int bus_method_resolve_hostname(sd_bus_message *message, void *userdata,
                 return r;
 
         r = dns_question_new_address(&question_idna, family, hostname, true);
-        if (r < 0)
+        if (r < 0 && r != -EALREADY)
                 return r;
 
-        r = dns_query_new(m, &q, question_utf8, question_idna, ifindex, flags);
+        r = dns_query_new(m, &q, question_utf8, question_idna ?: question_utf8, ifindex, flags);
         if (r < 0)
                 return r;
 
@@ -439,7 +439,7 @@ static void bus_method_resolve_address_complete(DnsQuery *q) {
         if (r < 0)
                 goto finish;
 
-        r = sd_bus_message_append(reply, "t", SD_RESOLVED_FLAGS_MAKE(q->answer_protocol, q->answer_family, q->answer_authenticated));
+        r = sd_bus_message_append(reply, "t", SD_RESOLVED_FLAGS_MAKE(q->answer_protocol, q->answer_family, dns_query_fully_authenticated(q)));
         if (r < 0)
                 goto finish;
 
@@ -605,7 +605,7 @@ static void bus_method_resolve_record_complete(DnsQuery *q) {
         if (r < 0)
                 goto finish;
 
-        r = sd_bus_message_append(reply, "t", SD_RESOLVED_FLAGS_MAKE(q->answer_protocol, q->answer_family, q->answer_authenticated));
+        r = sd_bus_message_append(reply, "t", SD_RESOLVED_FLAGS_MAKE(q->answer_protocol, q->answer_family, dns_query_fully_authenticated(q)));
         if (r < 0)
                 goto finish;
 
@@ -979,7 +979,7 @@ static void resolve_service_all_complete(DnsQuery *q) {
                         reply,
                         "ssst",
                         name, type, domain,
-                        SD_RESOLVED_FLAGS_MAKE(q->answer_protocol, q->answer_family, q->answer_authenticated));
+                        SD_RESOLVED_FLAGS_MAKE(q->answer_protocol, q->answer_family, dns_query_fully_authenticated(q)));
         if (r < 0)
                 goto finish;
 
@@ -1450,6 +1450,8 @@ static int bus_property_get_ntas(
         return sd_bus_message_close_container(reply);
 }
 
+static BUS_DEFINE_PROPERTY_GET_ENUM(bus_property_get_dns_stub_listener_mode, dns_stub_listener_mode, DnsStubListenerMode);
+
 static int bus_method_reset_statistics(sd_bus_message *message, void *userdata, sd_bus_error *error) {
         Manager *m = userdata;
         DnsScope *s;
@@ -1577,6 +1579,7 @@ static const sd_bus_vtable resolve_vtable[] = {
         SD_BUS_PROPERTY("DNSSECStatistics", "(tttt)", bus_property_get_dnssec_statistics, 0, 0),
         SD_BUS_PROPERTY("DNSSECSupported", "b", bus_property_get_dnssec_supported, 0, 0),
         SD_BUS_PROPERTY("DNSSECNegativeTrustAnchors", "as", bus_property_get_ntas, 0, 0),
+        SD_BUS_PROPERTY("DNSStubListener", "s", bus_property_get_dns_stub_listener_mode, offsetof(Manager, dns_stub_listener_mode), 0),
 
         SD_BUS_METHOD("ResolveHostname", "isit", "a(iiay)st", bus_method_resolve_hostname, SD_BUS_VTABLE_UNPRIVILEGED),
         SD_BUS_METHOD("ResolveAddress", "iiayt", "a(is)t", bus_method_resolve_address, SD_BUS_VTABLE_UNPRIVILEGED),
index dd233e7..75636e0 100644 (file)
 #include "extract-word.h"
 #include "parse-util.h"
 #include "resolved-conf.h"
+#include "string-table.h"
 #include "string-util.h"
 
+DEFINE_CONFIG_PARSE_ENUM(config_parse_dns_stub_listener_mode, dns_stub_listener_mode, DnsStubListenerMode, "Failed to parse DNS stub listener mode setting");
+
+static const char* const dns_stub_listener_mode_table[_DNS_STUB_LISTENER_MODE_MAX] = {
+        [DNS_STUB_LISTENER_NO] = "no",
+        [DNS_STUB_LISTENER_UDP] = "udp",
+        [DNS_STUB_LISTENER_TCP] = "tcp",
+        [DNS_STUB_LISTENER_YES] = "yes",
+};
+DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(dns_stub_listener_mode, DnsStubListenerMode, DNS_STUB_LISTENER_YES);
+
 int manager_add_dns_server_by_string(Manager *m, DnsServerType type, const char *word) {
         union in_addr_union address;
         int family, r, ifindex = 0;
@@ -221,11 +232,11 @@ int manager_parse_config_file(Manager *m) {
 
         assert(m);
 
-        r = config_parse_many(PKGSYSCONFDIR "/resolved.conf",
-                              CONF_PATHS_NULSTR("systemd/resolved.conf.d"),
-                              "Resolve\0",
-                              config_item_perf_lookup, resolved_gperf_lookup,
-                              false, m);
+        r = config_parse_many_nulstr(PKGSYSCONFDIR "/resolved.conf",
+                                     CONF_PATHS_NULSTR("systemd/resolved.conf.d"),
+                                     "Resolve\0",
+                                     config_item_perf_lookup, resolved_gperf_lookup,
+                                     false, m);
         if (r < 0)
                 return r;
 
@@ -235,6 +246,12 @@ int manager_parse_config_file(Manager *m) {
                         return r;
         }
 
+#ifndef HAVE_GCRYPT
+        if (m->dnssec_mode != DNSSEC_NO) {
+                log_warning("DNSSEC option cannot be enabled or set to allow-downgrade when systemd-resolved is built without gcrypt support. Turning off DNSSEC support.");
+                m->dnssec_mode = DNSSEC_NO;
+        }
+#endif
         return 0;
 
 }
index e1fd2cc..8184d6c 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+typedef enum DnsStubListenerMode DnsStubListenerMode;
+
+enum DnsStubListenerMode {
+        DNS_STUB_LISTENER_NO,
+        DNS_STUB_LISTENER_UDP,
+        DNS_STUB_LISTENER_TCP,
+        DNS_STUB_LISTENER_YES,
+        _DNS_STUB_LISTENER_MODE_MAX,
+        _DNS_STUB_LISTENER_MODE_INVALID = -1
+};
+
 #include "resolved-manager.h"
+#include "resolved-dns-server.h"
 
 int manager_parse_config_file(Manager *m);
 
@@ -29,8 +41,11 @@ int manager_parse_search_domains_and_warn(Manager *m, const char *string);
 int manager_add_dns_server_by_string(Manager *m, DnsServerType type, const char *word);
 int manager_parse_dns_server_string_and_warn(Manager *m, DnsServerType type, const char *string);
 
-const struct ConfigPerfItem* resolved_gperf_lookup(const char *key, unsigned length);
+const struct ConfigPerfItem* resolved_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
 
 int config_parse_dns_servers(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_search_domains(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
-int config_parse_dnssec(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_dns_stub_listener_mode(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+
+const char* dns_stub_listener_mode_to_string(DnsStubListenerMode p) _const_;
+DnsStubListenerMode dns_stub_listener_mode_from_string(const char *s) _pure_;
index ab85754..db86b4d 100644 (file)
@@ -148,7 +148,7 @@ int dns_answer_add(DnsAnswer *a, DnsResourceRecord *rr, int ifindex, DnsAnswerFl
                          * match. We don't really care if they match
                          * precisely, but we do care whether one is 0
                          * and the other is not. See RFC 2181, Section
-                         * 5.2.*/
+                         * 5.2. */
 
                         if ((rr->ttl == 0) != (a->items[i].rr->ttl == 0))
                                 return -EINVAL;
index 4a92bd1..11d2e25 100644 (file)
@@ -33,9 +33,11 @@ typedef struct DnsAnswerItem DnsAnswerItem;
  * Note that we usually encode the empty DnsAnswer object as a simple NULL. */
 
 typedef enum DnsAnswerFlags {
-        DNS_ANSWER_AUTHENTICATED = 1, /* Item has been authenticated */
-        DNS_ANSWER_CACHEABLE     = 2, /* Item is subject to caching */
-        DNS_ANSWER_SHARED_OWNER  = 4, /* For mDNS: RRset may be owner by multiple peers */
+        DNS_ANSWER_AUTHENTICATED = 1,  /* Item has been authenticated */
+        DNS_ANSWER_CACHEABLE     = 2,  /* Item is subject to caching */
+        DNS_ANSWER_SHARED_OWNER  = 4,  /* For mDNS: RRset may be owner by multiple peers */
+        DNS_ANSWER_CACHE_FLUSH   = 8,  /* For mDNS: sets cache-flush bit in the rrclass of response records */
+        DNS_ANSWER_GOODBYE       = 16, /* For mDNS: item is subject to disappear */
 } DnsAnswerFlags;
 
 struct DnsAnswerItem {
index 9233fb0..f8dab01 100644 (file)
 /* We never keep any item longer than 2h in our cache */
 #define CACHE_TTL_MAX_USEC (2 * USEC_PER_HOUR)
 
+/* How long to cache strange rcodes, i.e. rcodes != SUCCESS and != NXDOMAIN (specifically: that's only SERVFAIL for
+ * now) */
+#define CACHE_TTL_STRANGE_RCODE_USEC (30 * USEC_PER_SEC)
+
 typedef enum DnsCacheItemType DnsCacheItemType;
 typedef struct DnsCacheItem DnsCacheItem;
 
@@ -41,12 +45,14 @@ enum DnsCacheItemType {
         DNS_CACHE_POSITIVE,
         DNS_CACHE_NODATA,
         DNS_CACHE_NXDOMAIN,
+        DNS_CACHE_RCODE,      /* "strange" RCODE (effective only SERVFAIL for now) */
 };
 
 struct DnsCacheItem {
         DnsCacheItemType type;
         DnsResourceKey *key;
         DnsResourceRecord *rr;
+        int rcode;
 
         usec_t until;
         bool authenticated:1;
@@ -60,6 +66,27 @@ struct DnsCacheItem {
         LIST_FIELDS(DnsCacheItem, by_key);
 };
 
+static const char *dns_cache_item_type_to_string(DnsCacheItem *item) {
+        assert(item);
+
+        switch (item->type) {
+
+        case DNS_CACHE_POSITIVE:
+                return "POSITIVE";
+
+        case DNS_CACHE_NODATA:
+                return "NODATA";
+
+        case DNS_CACHE_NXDOMAIN:
+                return "NXDOMAIN";
+
+        case DNS_CACHE_RCODE:
+                return dns_rcode_to_string(item->rcode);
+        }
+
+        return NULL;
+}
+
 static void dns_cache_item_free(DnsCacheItem *i) {
         if (!i)
                 return;
@@ -406,7 +433,7 @@ static int dns_cache_put_positive(
                 return 0;
         }
 
-        /* Entry exists already? Update TTL, timestamp and owner*/
+        /* Entry exists already? Update TTL, timestamp and owner */
         existing = dns_cache_get(c, rr);
         if (existing) {
                 dns_cache_item_update_positive(
@@ -484,7 +511,6 @@ static int dns_cache_put_negative(
 
         assert(c);
         assert(key);
-        assert(soa);
         assert(owner_address);
 
         /* Never cache pseudo RR keys. DNS_TYPE_ANY is particularly
@@ -495,13 +521,17 @@ static int dns_cache_put_negative(
         if (dns_type_is_pseudo(key->type))
                 return 0;
 
-        if (nsec_ttl <= 0 || soa->soa.minimum <= 0 || soa->ttl <= 0) {
-                log_debug("Not caching negative entry with zero SOA/NSEC/NSEC3 TTL: %s",
-                          dns_resource_key_to_string(key, key_str, sizeof key_str));
-                return 0;
-        }
+        if (IN_SET(rcode, DNS_RCODE_SUCCESS, DNS_RCODE_NXDOMAIN)) {
+                if (!soa)
+                        return 0;
 
-        if (!IN_SET(rcode, DNS_RCODE_SUCCESS, DNS_RCODE_NXDOMAIN))
+                /* For negative replies, check if we have a TTL of a SOA */
+                if (nsec_ttl <= 0 || soa->soa.minimum <= 0 || soa->ttl <= 0) {
+                        log_debug("Not caching negative entry with zero SOA/NSEC/NSEC3 TTL: %s",
+                                  dns_resource_key_to_string(key, key_str, sizeof key_str));
+                        return 0;
+                }
+        } else if (rcode != DNS_RCODE_SERVFAIL)
                 return 0;
 
         r = dns_cache_init(c);
@@ -514,12 +544,17 @@ static int dns_cache_put_negative(
         if (!i)
                 return -ENOMEM;
 
-        i->type = rcode == DNS_RCODE_SUCCESS ? DNS_CACHE_NODATA : DNS_CACHE_NXDOMAIN;
-        i->until = calculate_until(soa, nsec_ttl, timestamp, true);
+        i->type =
+                rcode == DNS_RCODE_SUCCESS ? DNS_CACHE_NODATA :
+                rcode == DNS_RCODE_NXDOMAIN ? DNS_CACHE_NXDOMAIN : DNS_CACHE_RCODE;
+        i->until =
+                i->type == DNS_CACHE_RCODE ? timestamp + CACHE_TTL_STRANGE_RCODE_USEC :
+                calculate_until(soa, nsec_ttl, timestamp, true);
         i->authenticated = authenticated;
         i->owner_family = owner_family;
         i->owner_address = *owner_address;
         i->prioq_idx = PRIOQ_IDX_NULL;
+        i->rcode = rcode;
 
         if (i->type == DNS_CACHE_NXDOMAIN) {
                 /* NXDOMAIN entries should apply equally to all types, so we use ANY as
@@ -543,7 +578,7 @@ static int dns_cache_put_negative(
                 return r;
 
         log_debug("Added %s cache entry for %s "USEC_FMT"s",
-                  i->type == DNS_CACHE_NODATA ? "NODATA" : "NXDOMAIN",
+                  dns_cache_item_type_to_string(i),
                   dns_resource_key_to_string(i->key, key_str, sizeof key_str),
                   (i->until - timestamp) / USEC_PER_SEC);
 
@@ -615,6 +650,7 @@ int dns_cache_put(
                 const union in_addr_union *owner_address) {
 
         DnsResourceRecord *soa = NULL, *rr;
+        bool weird_rcode = false;
         DnsAnswerFlags flags;
         unsigned cache_keys;
         int r, ifindex;
@@ -624,18 +660,28 @@ int dns_cache_put(
 
         dns_cache_remove_previous(c, key, answer);
 
-        /* We only care for positive replies and NXDOMAINs, on all
-         * other replies we will simply flush the respective entries,
-         * and that's it */
-        if (!IN_SET(rcode, DNS_RCODE_SUCCESS, DNS_RCODE_NXDOMAIN))
-                return 0;
+        /* We only care for positive replies and NXDOMAINs, on all other replies we will simply flush the respective
+         * entries, and that's it. (Well, with one further exception: since some DNS zones (akamai!) return SERVFAIL
+         * consistently for some lookups, and forwarders tend to propagate that we'll cache that too, but only for a
+         * short time.) */
 
-        if (dns_answer_size(answer) <= 0) {
-                char key_str[DNS_RESOURCE_KEY_STRING_MAX];
+        if (IN_SET(rcode, DNS_RCODE_SUCCESS, DNS_RCODE_NXDOMAIN)) {
 
-                log_debug("Not caching negative entry without a SOA record: %s",
-                          dns_resource_key_to_string(key, key_str, sizeof key_str));
-                return 0;
+                if (dns_answer_size(answer) <= 0) {
+                        char key_str[DNS_RESOURCE_KEY_STRING_MAX];
+
+                        log_debug("Not caching negative entry without a SOA record: %s",
+                                  dns_resource_key_to_string(key, key_str, sizeof key_str));
+                        return 0;
+                }
+
+        } else {
+                /* Only cache SERVFAIL as "weird" rcode for now. We can add more later, should that turn out to be
+                 * beneficial. */
+                if (rcode != DNS_RCODE_SERVFAIL)
+                        return 0;
+
+                weird_rcode = true;
         }
 
         cache_keys = dns_answer_size(answer);
@@ -690,19 +736,20 @@ int dns_cache_put(
         if (r > 0)
                 return 0;
 
-        /* See https://tools.ietf.org/html/rfc2308, which say that a
-         * matching SOA record in the packet is used to enable
-         * negative caching. */
+        /* See https://tools.ietf.org/html/rfc2308, which say that a matching SOA record in the packet is used to
+         * enable negative caching. We apply one exception though: if we are about to cache a weird rcode we do so
+         * regardless of a SOA. */
         r = dns_answer_find_soa(answer, key, &soa, &flags);
         if (r < 0)
                 goto fail;
-        if (r == 0)
-                return 0;
-
-        /* Refuse using the SOA data if it is unsigned, but the key is
-         * signed */
-        if (authenticated && (flags & DNS_ANSWER_AUTHENTICATED) == 0)
+        if (r == 0 && !weird_rcode)
                 return 0;
+        if (r > 0) {
+                /* Refuse using the SOA data if it is unsigned, but the key is
+                 * signed */
+                if (authenticated && (flags & DNS_ANSWER_AUTHENTICATED) == 0)
+                        return 0;
+        }
 
         r = dns_cache_put_negative(
                         c,
@@ -799,6 +846,7 @@ int dns_cache_lookup(DnsCache *c, DnsResourceKey *key, bool clamp_ttl, int *rcod
         DnsCacheItem *j, *first, *nsec = NULL;
         bool have_authenticated = false, have_non_authenticated = false;
         usec_t current;
+        int found_rcode = -1;
 
         assert(c);
         assert(key);
@@ -817,6 +865,8 @@ int dns_cache_lookup(DnsCache *c, DnsResourceKey *key, bool clamp_ttl, int *rcod
 
                 *ret = NULL;
                 *rcode = DNS_RCODE_SUCCESS;
+                *authenticated = false;
+
                 return 0;
         }
 
@@ -831,6 +881,8 @@ int dns_cache_lookup(DnsCache *c, DnsResourceKey *key, bool clamp_ttl, int *rcod
 
                 *ret = NULL;
                 *rcode = DNS_RCODE_SUCCESS;
+                *authenticated = false;
+
                 return 0;
         }
 
@@ -842,6 +894,8 @@ int dns_cache_lookup(DnsCache *c, DnsResourceKey *key, bool clamp_ttl, int *rcod
                         n++;
                 } else if (j->type == DNS_CACHE_NXDOMAIN)
                         nxdomain = true;
+                else if (j->type == DNS_CACHE_RCODE)
+                        found_rcode = j->rcode;
 
                 if (j->authenticated)
                         have_authenticated = true;
@@ -849,6 +903,19 @@ int dns_cache_lookup(DnsCache *c, DnsResourceKey *key, bool clamp_ttl, int *rcod
                         have_non_authenticated = true;
         }
 
+        if (found_rcode >= 0) {
+                log_debug("RCODE %s cache hit for %s",
+                          dns_rcode_to_string(found_rcode),
+                          dns_resource_key_to_string(key, key_str, sizeof(key_str)));
+
+                *ret = NULL;
+                *rcode = found_rcode;
+                *authenticated = false;
+
+                c->n_hit++;
+                return 1;
+        }
+
         if (nsec && !IN_SET(key->type, DNS_TYPE_NSEC, DNS_TYPE_DS)) {
                 /* Note that we won't derive information for DS RRs from an NSEC, because we only cache NSEC RRs from
                  * the lower-zone of a zone cut, but the DS RRs are on the upper zone. */
@@ -980,7 +1047,7 @@ int dns_cache_export_shared_to_packet(DnsCache *cache, DnsPacket *p) {
                         if (!j->shared_owner)
                                 continue;
 
-                        r = dns_packet_append_rr(p, j->rr, NULL, NULL);
+                        r = dns_packet_append_rr(p, j->rr, 0, NULL, NULL);
                         if (r == -EMSGSIZE && p->protocol == DNS_PROTOCOL_MDNS) {
                                 /* For mDNS, if we're unable to stuff all known answers into the given packet,
                                  * allocate a new one, push the RR into that one and link it to the current one.
@@ -995,7 +1062,7 @@ int dns_cache_export_shared_to_packet(DnsCache *cache, DnsPacket *p) {
 
                                 /* continue with new packet */
                                 p = p->more;
-                                r = dns_packet_append_rr(p, j->rr, NULL, NULL);
+                                r = dns_packet_append_rr(p, j->rr, 0, NULL, NULL);
                         }
 
                         if (r < 0)
@@ -1042,7 +1109,7 @@ void dns_cache_dump(DnsCache *cache, FILE *f) {
 
                                 fputs(dns_resource_key_to_string(j->key, key_str, sizeof key_str), f);
                                 fputs(" -- ", f);
-                                fputs(j->type == DNS_CACHE_NODATA ? "NODATA" : "NXDOMAIN", f);
+                                fputs(dns_cache_item_type_to_string(j), f);
                                 fputc('\n', f);
                         }
                 }
index d4a267c..eddab58 100644 (file)
@@ -1303,7 +1303,7 @@ static int nsec3_hashed_domain_format(const uint8_t *hashed, size_t hashed_size,
         if (!l)
                 return -ENOMEM;
 
-        j = strjoin(l, ".", zone, NULL);
+        j = strjoin(l, ".", zone);
         if (!j)
                 return -ENOMEM;
 
@@ -1710,7 +1710,8 @@ static int dnssec_nsec_covers(DnsResourceRecord *rr, const char *name) {
 }
 
 static int dnssec_nsec_covers_wildcard(DnsResourceRecord *rr, const char *name) {
-        const char *common_suffix, *wc;
+        _cleanup_free_ char *wc = NULL;
+        const char *common_suffix;
         int r;
 
         assert(rr);
@@ -1734,7 +1735,10 @@ static int dnssec_nsec_covers_wildcard(DnsResourceRecord *rr, const char *name)
         if (r <= 0)
                 return r;
 
-        wc = strjoina("*.", common_suffix);
+        r = dns_name_concat("*", common_suffix, &wc);
+        if (r < 0)
+                return r;
+
         return dns_name_between(dns_resource_key_name(rr->key), wc, rr->nsec.next_domain_name);
 }
 
index 8b620cb..49a0461 100644 (file)
@@ -28,6 +28,9 @@
 
 #define EDNS0_OPT_DO (1<<15)
 
+#define DNS_PACKET_SIZE_START 512u
+assert_cc(DNS_PACKET_SIZE_START > DNS_PACKET_HEADER_SIZE)
+
 typedef struct DnsPacketRewinder {
         DnsPacket *packet;
         size_t saved_rindex;
@@ -41,19 +44,28 @@ static void rewind_dns_packet(DnsPacketRewinder *rewinder) {
 #define INIT_REWINDER(rewinder, p) do { rewinder.packet = p; rewinder.saved_rindex = p->rindex; } while (0)
 #define CANCEL_REWINDER(rewinder) do { rewinder.packet = NULL; } while (0)
 
-int dns_packet_new(DnsPacket **ret, DnsProtocol protocol, size_t mtu) {
+int dns_packet_new(DnsPacket **ret, DnsProtocol protocol, size_t min_alloc_dsize) {
         DnsPacket *p;
         size_t a;
 
         assert(ret);
 
-        if (mtu <= UDP_PACKET_HEADER_SIZE)
+        /* The caller may not check what is going to be truly allocated, so do not allow to
+         * allocate a DNS packet bigger than DNS_PACKET_SIZE_MAX.
+         */
+        if (min_alloc_dsize > DNS_PACKET_SIZE_MAX) {
+                log_error("Requested packet data size too big: %zu", min_alloc_dsize);
+                return -EFBIG;
+        }
+
+        /* When dns_packet_new() is called with min_alloc_dsize == 0, allocate more than the
+         * absolute minimum (which is the dns packet header size), to avoid
+         * resizing immediately again after appending the first data to the packet.
+         */
+        if (min_alloc_dsize < DNS_PACKET_HEADER_SIZE)
                 a = DNS_PACKET_SIZE_START;
         else
-                a = mtu - UDP_PACKET_HEADER_SIZE;
-
-        if (a < DNS_PACKET_HEADER_SIZE)
-                a = DNS_PACKET_HEADER_SIZE;
+                a = min_alloc_dsize;
 
         /* round up to next page size */
         a = PAGE_ALIGN(ALIGN(sizeof(DnsPacket)) + a) - ALIGN(sizeof(DnsPacket));
@@ -127,13 +139,13 @@ void dns_packet_set_flags(DnsPacket *p, bool dnssec_checking_disabled, bool trun
         }
 }
 
-int dns_packet_new_query(DnsPacket **ret, DnsProtocol protocol, size_t mtu, bool dnssec_checking_disabled) {
+int dns_packet_new_query(DnsPacket **ret, DnsProtocol protocol, size_t min_alloc_dsize, bool dnssec_checking_disabled) {
         DnsPacket *p;
         int r;
 
         assert(ret);
 
-        r = dns_packet_new(&p, protocol, mtu);
+        r = dns_packet_new(&p, protocol, min_alloc_dsize);
         if (r < 0)
                 return r;
 
@@ -569,8 +581,9 @@ fail:
         return r;
 }
 
-int dns_packet_append_key(DnsPacket *p, const DnsResourceKey *k, size_t *start) {
+int dns_packet_append_key(DnsPacket *p, const DnsResourceKey *k, const DnsAnswerFlags flags, size_t *start) {
         size_t saved_size;
+        uint16_t class;
         int r;
 
         assert(p);
@@ -586,7 +599,8 @@ int dns_packet_append_key(DnsPacket *p, const DnsResourceKey *k, size_t *start)
         if (r < 0)
                 goto fail;
 
-        r = dns_packet_append_uint16(p, k->class, NULL);
+        class = flags & DNS_ANSWER_CACHE_FLUSH ? k->class | MDNS_RR_CACHE_FLUSH : k->class;
+        r = dns_packet_append_uint16(p, class, NULL);
         if (r < 0)
                 goto fail;
 
@@ -791,9 +805,10 @@ int dns_packet_truncate_opt(DnsPacket *p) {
         return 1;
 }
 
-int dns_packet_append_rr(DnsPacket *p, const DnsResourceRecord *rr, size_t *start, size_t *rdata_start) {
+int dns_packet_append_rr(DnsPacket *p, const DnsResourceRecord *rr, const DnsAnswerFlags flags, size_t *start, size_t *rdata_start) {
 
         size_t saved_size, rdlength_offset, end, rdlength, rds;
+        uint32_t ttl;
         int r;
 
         assert(p);
@@ -801,11 +816,12 @@ int dns_packet_append_rr(DnsPacket *p, const DnsResourceRecord *rr, size_t *star
 
         saved_size = p->size;
 
-        r = dns_packet_append_key(p, rr->key, NULL);
+        r = dns_packet_append_key(p, rr->key, flags, NULL);
         if (r < 0)
                 goto fail;
 
-        r = dns_packet_append_uint32(p, rr->ttl, NULL);
+        ttl = flags & DNS_ANSWER_GOODBYE ? 0 : rr->ttl;
+        r = dns_packet_append_uint32(p, ttl, NULL);
         if (r < 0)
                 goto fail;
 
@@ -1143,7 +1159,7 @@ int dns_packet_append_question(DnsPacket *p, DnsQuestion *q) {
         assert(p);
 
         DNS_QUESTION_FOREACH(key, q) {
-                r = dns_packet_append_key(p, key, NULL);
+                r = dns_packet_append_key(p, key, 0, NULL);
                 if (r < 0)
                         return r;
         }
@@ -1153,12 +1169,13 @@ int dns_packet_append_question(DnsPacket *p, DnsQuestion *q) {
 
 int dns_packet_append_answer(DnsPacket *p, DnsAnswer *a) {
         DnsResourceRecord *rr;
+        DnsAnswerFlags flags;
         int r;
 
         assert(p);
 
-        DNS_ANSWER_FOREACH(rr, a) {
-                r = dns_packet_append_rr(p, rr, NULL, NULL);
+        DNS_ANSWER_FOREACH_FLAGS(rr, flags, a) {
+                r = dns_packet_append_rr(p, rr, flags, NULL, NULL);
                 if (r < 0)
                         return r;
         }
@@ -2143,7 +2160,7 @@ int dns_packet_extract(DnsPacket *p) {
 
                 for (i = 0; i < n; i++) {
                         _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
-                        bool cache_flush;
+                        bool cache_flush = false;
 
                         r = dns_packet_read_rr(p, &rr, &cache_flush, NULL);
                         if (r < 0)
@@ -2292,6 +2309,7 @@ static const char* const dns_rcode_table[_DNS_RCODE_MAX_DEFINED] = {
         [DNS_RCODE_BADNAME] = "BADNAME",
         [DNS_RCODE_BADALG] = "BADALG",
         [DNS_RCODE_BADTRUNC] = "BADTRUNC",
+        [DNS_RCODE_BADCOOKIE] = "BADCOOKIE",
 };
 DEFINE_STRING_TABLE_LOOKUP(dns_rcode, int);
 
index 7b7d4e1..a65d6d3 100644 (file)
@@ -58,15 +58,13 @@ struct DnsPacketHeader {
 /* The various DNS protocols deviate in how large a packet can grow,
    but the TCP transport has a 16bit size field, hence that appears to
    be the absolute maximum. */
-#define DNS_PACKET_SIZE_MAX 0xFFFF
+#define DNS_PACKET_SIZE_MAX 0xFFFFu
 
 /* RFC 1035 say 512 is the maximum, for classic unicast DNS */
-#define DNS_PACKET_UNICAST_SIZE_MAX 512
+#define DNS_PACKET_UNICAST_SIZE_MAX 512u
 
 /* With EDNS0 we can use larger packets, default to 4096, which is what is commonly used */
-#define DNS_PACKET_UNICAST_SIZE_LARGE_MAX 4096
-
-#define DNS_PACKET_SIZE_START 512
+#define DNS_PACKET_UNICAST_SIZE_LARGE_MAX 4096u
 
 struct DnsPacket {
         int n_ref;
@@ -185,8 +183,8 @@ static inline unsigned DNS_PACKET_RRCOUNT(DnsPacket *p) {
                 (unsigned) DNS_PACKET_ARCOUNT(p);
 }
 
-int dns_packet_new(DnsPacket **p, DnsProtocol protocol, size_t mtu);
-int dns_packet_new_query(DnsPacket **p, DnsProtocol protocol, size_t mtu, bool dnssec_checking_disabled);
+int dns_packet_new(DnsPacket **p, DnsProtocol protocol, size_t min_alloc_dsize);
+int dns_packet_new_query(DnsPacket **p, DnsProtocol protocol, size_t min_alloc_dsize, bool dnssec_checking_disabled);
 
 void dns_packet_set_flags(DnsPacket *p, bool dnssec_checking_disabled, bool truncated);
 
@@ -209,8 +207,8 @@ int dns_packet_append_string(DnsPacket *p, const char *s, size_t *start);
 int dns_packet_append_raw_string(DnsPacket *p, const void *s, size_t size, size_t *start);
 int dns_packet_append_label(DnsPacket *p, const char *s, size_t l, bool canonical_candidate, size_t *start);
 int dns_packet_append_name(DnsPacket *p, const char *name, bool allow_compression, bool canonical_candidate, size_t *start);
-int dns_packet_append_key(DnsPacket *p, const DnsResourceKey *key, size_t *start);
-int dns_packet_append_rr(DnsPacket *p, const DnsResourceRecord *rr, size_t *start, size_t *rdata_start);
+int dns_packet_append_key(DnsPacket *p, const DnsResourceKey *key, const DnsAnswerFlags flags, size_t *start);
+int dns_packet_append_rr(DnsPacket *p, const DnsResourceRecord *rr, const DnsAnswerFlags flags, size_t *start, size_t *rdata_start);
 int dns_packet_append_opt(DnsPacket *p, uint16_t max_udp_size, bool edns0_do, int rcode, size_t *start);
 int dns_packet_append_question(DnsPacket *p, DnsQuestion *q);
 int dns_packet_append_answer(DnsPacket *p, DnsAnswer *a);
@@ -263,6 +261,7 @@ enum {
         DNS_RCODE_BADNAME = 20,
         DNS_RCODE_BADALG = 21,
         DNS_RCODE_BADTRUNC = 22,
+        DNS_RCODE_BADCOOKIE = 23,
         _DNS_RCODE_MAX_DEFINED,
         _DNS_RCODE_MAX = 4095 /* 4 bit rcode in the header plus 8 bit rcode in OPT, makes 12 bit */
 };
index 53be18e..2b091e6 100644 (file)
@@ -28,7 +28,7 @@
 #include "string-util.h"
 
 /* How long to wait for the query in total */
-#define QUERY_TIMEOUT_USEC (30 * USEC_PER_SEC)
+#define QUERY_TIMEOUT_USEC (60 * USEC_PER_SEC)
 
 #define CNAME_MAX 8
 #define QUERIES_MAX 2048
@@ -83,9 +83,7 @@ DnsQueryCandidate* dns_query_candidate_free(DnsQueryCandidate *c) {
         if (c->scope)
                 LIST_REMOVE(candidates_by_scope, c->scope->query_candidates, c);
 
-        free(c);
-
-        return NULL;
+        return mfree(c);
 }
 
 static int dns_query_candidate_next_search_domain(DnsQueryCandidate *c) {
@@ -405,6 +403,7 @@ DnsQuery *dns_query_free(DnsQuery *q) {
         sd_bus_track_unref(q->bus_track);
 
         dns_packet_unref(q->request_dns_packet);
+        dns_packet_unref(q->reply_dns_packet);
 
         if (q->request_dns_stream) {
                 /* Detach the stream from our query, in case something else keeps a reference to it. */
@@ -421,9 +420,7 @@ DnsQuery *dns_query_free(DnsQuery *q) {
                 q->manager->n_dns_queries--;
         }
 
-        free(q);
-
-        return NULL;
+        return mfree(q);
 }
 
 int dns_query_new(
@@ -814,6 +811,7 @@ static void dns_query_accept(DnsQuery *q, DnsQueryCandidate *c) {
                 q->answer = dns_answer_unref(q->answer);
                 q->answer_rcode = 0;
                 q->answer_dnssec_result = _DNSSEC_RESULT_INVALID;
+                q->answer_authenticated = false;
                 q->answer_errno = c->error_code;
         }
 
@@ -850,15 +848,18 @@ static void dns_query_accept(DnsQuery *q, DnsQueryCandidate *c) {
                         continue;
 
                 default:
-                        /* Any kind of failure? Store the data away,
-                         * if there's nothing stored yet. */
-
+                        /* Any kind of failure? Store the data away, if there's nothing stored yet. */
                         if (state == DNS_TRANSACTION_SUCCESS)
                                 continue;
 
+                        /* If there's already an authenticated negative reply stored, then prefer that over any unauthenticated one */
+                        if (q->answer_authenticated && !t->answer_authenticated)
+                                continue;
+
                         q->answer = dns_answer_unref(q->answer);
                         q->answer_rcode = t->answer_rcode;
                         q->answer_dnssec_result = t->answer_dnssec_result;
+                        q->answer_authenticated = t->answer_authenticated;
                         q->answer_errno = t->answer_errno;
 
                         state = t->state;
@@ -1032,6 +1033,9 @@ int dns_query_process_cname(DnsQuery *q) {
         if (q->flags & SD_RESOLVED_NO_CNAME)
                 return -ELOOP;
 
+        if (!q->answer_authenticated)
+                q->previous_redirect_unauthenticated = true;
+
         /* OK, let's actually follow the CNAME */
         r = dns_query_cname_redirect(q, cname);
         if (r < 0)
@@ -1119,3 +1123,9 @@ const char *dns_query_string(DnsQuery *q) {
 
         return dns_question_first_name(q->question_idna);
 }
+
+bool dns_query_fully_authenticated(DnsQuery *q) {
+        assert(q);
+
+        return q->answer_authenticated && !q->previous_redirect_unauthenticated;
+}
index 49a35b8..b8ea48f 100644 (file)
@@ -71,7 +71,6 @@ struct DnsQuery {
          * family */
         bool suppress_unroutable_family;
 
-
         /* If true, the RR TTLs of the answer will be clamped by their current left validity in the cache */
         bool clamp_ttl;
 
@@ -90,6 +89,7 @@ struct DnsQuery {
         int answer_family;
         DnsSearchDomain *answer_search_domain;
         int answer_errno; /* if state is DNS_TRANSACTION_ERRNO */
+        bool previous_redirect_unauthenticated;
 
         /* Bus client information */
         sd_bus_message *request;
@@ -102,6 +102,7 @@ struct DnsQuery {
         /* DNS stub information */
         DnsPacket *request_dns_packet;
         DnsStream *request_dns_stream;
+        DnsPacket *reply_dns_packet;
 
         /* Completion callback */
         void (*complete)(DnsQuery* q);
@@ -139,3 +140,5 @@ DnsQuestion* dns_query_question_for_protocol(DnsQuery *q, DnsProtocol protocol);
 const char *dns_query_string(DnsQuery *q);
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(DnsQuery*, dns_query_free);
+
+bool dns_query_fully_authenticated(DnsQuery *q);
index c8b502d..24f3e8e 100644 (file)
@@ -309,8 +309,14 @@ int dns_question_new_address(DnsQuestion **ret, int family, const char *name, bo
                 r = dns_name_apply_idna(name, &buf);
                 if (r < 0)
                         return r;
-
-                name = buf;
+                if (r > 0 && !streq(name, buf))
+                        name = buf;
+                else
+                        /* We did not manage to create convert the idna name, or it's
+                         * the same as the original name. We assume the caller already
+                         * created an uncoverted question, so let's not repeat work
+                         * unnecessarily. */
+                        return -EALREADY;
         }
 
         q = dns_question_new(family == AF_UNSPEC ? 2 : 1);
@@ -422,8 +428,8 @@ int dns_question_new_service(
                         r = dns_name_apply_idna(domain, &buf);
                         if (r < 0)
                                 return r;
-
-                        domain = buf;
+                        if (r > 0)
+                                domain = buf;
                 }
 
                 r = dns_service_join(service, type, domain, &joined);
index 5687588..e8c05ed 100644 (file)
@@ -73,10 +73,8 @@ DnsResourceKey* dns_resource_key_new_redirect(const DnsResourceKey *key, const D
                         return dns_resource_key_ref((DnsResourceKey*) key);
 
                 k = dns_resource_key_new_consume(key->class, key->type, destination);
-                if (!k) {
-                        free(destination);
-                        return NULL;
-                }
+                if (!k)
+                        return mfree(destination);
 
                 return k;
         }
@@ -513,9 +511,7 @@ DnsResourceRecord* dns_resource_record_unref(DnsResourceRecord *rr) {
         }
 
         free(rr->to_string);
-        free(rr);
-
-        return NULL;
+        return mfree(rr);
 }
 
 int dns_resource_record_new_reverse(DnsResourceRecord **ret, int family, const union in_addr_union *address, const char *hostname) {
@@ -796,7 +792,7 @@ static char *format_types(Bitmap *types) {
         if (!str)
                 return NULL;
 
-        return strjoin("( ", str, " )", NULL);
+        return strjoin("( ", str, " )");
 }
 
 static char *format_txt(DnsTxtItem *first) {
@@ -865,14 +861,14 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
         case DNS_TYPE_NS:
         case DNS_TYPE_CNAME:
         case DNS_TYPE_DNAME:
-                s = strjoin(k, " ", rr->ptr.name, NULL);
+                s = strjoin(k, " ", rr->ptr.name);
                 if (!s)
                         return NULL;
 
                 break;
 
         case DNS_TYPE_HINFO:
-                s = strjoin(k, " ", rr->hinfo.cpu, " ", rr->hinfo.os, NULL);
+                s = strjoin(k, " ", rr->hinfo.cpu, " ", rr->hinfo.os);
                 if (!s)
                         return NULL;
                 break;
@@ -883,7 +879,7 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
                 if (!t)
                         return NULL;
 
-                s = strjoin(k, " ", t, NULL);
+                s = strjoin(k, " ", t);
                 if (!s)
                         return NULL;
                 break;
@@ -895,7 +891,7 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
                 if (r < 0)
                         return NULL;
 
-                s = strjoin(k, " ", x, NULL);
+                s = strjoin(k, " ", x);
                 if (!s)
                         return NULL;
                 break;
@@ -906,7 +902,7 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
                 if (r < 0)
                         return NULL;
 
-                s = strjoin(k, " ", t, NULL);
+                s = strjoin(k, " ", t);
                 if (!s)
                         return NULL;
                 break;
@@ -946,7 +942,7 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
                 if (!t)
                         return NULL;
 
-                s = strjoin(k, " ", t, NULL);
+                s = strjoin(k, " ", t);
                 if (!s)
                         return NULL;
                 break;
@@ -1266,7 +1262,7 @@ int dns_resource_record_to_wire_format(DnsResourceRecord *rr, bool canonical) {
         if (rr->wire_format && rr->wire_format_canonical == canonical)
                 return 0;
 
-        r = dns_packet_append_rr(&packet, rr, &start, &rds);
+        r = dns_packet_append_rr(&packet, rr, 0, &start, &rds);
         if (r < 0)
                 return r;
 
index ed0c6aa..ffaefbe 100644 (file)
@@ -124,13 +124,13 @@ DnsScope* dns_scope_free(DnsScope *s) {
         ordered_hashmap_free(s->conflict_queue);
         sd_event_source_unref(s->conflict_event_source);
 
+        sd_event_source_unref(s->announce_event_source);
+
         dns_cache_flush(&s->cache);
         dns_zone_flush(&s->zone);
 
         LIST_REMOVE(scopes, s->manager->dns_scopes, s);
-        free(s);
-
-        return NULL;
+        return mfree(s);
 }
 
 DnsServer *dns_scope_get_dns_server(DnsScope *s) {
@@ -407,6 +407,7 @@ int dns_scope_socket_tcp(DnsScope *s, int family, const union in_addr_union *add
 
 DnsScopeMatch dns_scope_good_domain(DnsScope *s, int ifindex, uint64_t flags, const char *domain) {
         DnsSearchDomain *d;
+        DnsServer *dns_server;
 
         assert(s);
         assert(domain);
@@ -447,6 +448,13 @@ DnsScopeMatch dns_scope_good_domain(DnsScope *s, int ifindex, uint64_t flags, co
                 if (dns_name_endswith(domain, d->name) > 0)
                         return DNS_SCOPE_YES;
 
+        /* If the DNS server has route-only domains, don't send other requests
+         * to it. This would be a privacy violation, will most probably fail
+         * anyway, and adds unnecessary load. */
+        dns_server = dns_scope_get_dns_server(s);
+        if (dns_server && dns_server_limited_domains(dns_server))
+                return DNS_SCOPE_NO;
+
         switch (s->protocol) {
 
         case DNS_PROTOCOL_DNS:
@@ -543,7 +551,11 @@ static int dns_scope_multicast_membership(DnsScope *s, bool b, struct in_addr in
                         .imr_ifindex = s->link->ifindex,
                 };
 
-                fd = manager_llmnr_ipv4_udp_fd(s->manager);
+                if (s->protocol == DNS_PROTOCOL_LLMNR)
+                        fd = manager_llmnr_ipv4_udp_fd(s->manager);
+                else
+                        fd = manager_mdns_ipv4_fd(s->manager);
+
                 if (fd < 0)
                         return fd;
 
@@ -562,7 +574,11 @@ static int dns_scope_multicast_membership(DnsScope *s, bool b, struct in_addr in
                         .ipv6mr_interface = s->link->ifindex,
                 };
 
-                fd = manager_llmnr_ipv6_udp_fd(s->manager);
+                if (s->protocol == DNS_PROTOCOL_LLMNR)
+                        fd = manager_llmnr_ipv6_udp_fd(s->manager);
+                else
+                        fd = manager_mdns_ipv6_fd(s->manager);
+
                 if (fd < 0)
                         return fd;
 
@@ -595,7 +611,7 @@ int dns_scope_mdns_membership(DnsScope *s, bool b) {
         return dns_scope_multicast_membership(s, b, MDNS_MULTICAST_IPV4_ADDRESS, MDNS_MULTICAST_IPV6_ADDRESS);
 }
 
-static int dns_scope_make_reply_packet(
+int dns_scope_make_reply_packet(
                 DnsScope *s,
                 uint16_t id,
                 int rcode,
@@ -824,11 +840,11 @@ static int dns_scope_make_conflict_packet(
         DNS_PACKET_HEADER(p)->qdcount = htobe16(1);
         DNS_PACKET_HEADER(p)->arcount = htobe16(1);
 
-        r = dns_packet_append_key(p, rr->key, NULL);
+        r = dns_packet_append_key(p, rr->key, 0, NULL);
         if (r < 0)
                 return r;
 
-        r = dns_packet_append_rr(p, rr, NULL, NULL);
+        r = dns_packet_append_rr(p, rr, 0, NULL, NULL);
         if (r < 0)
                 return r;
 
@@ -922,17 +938,19 @@ void dns_scope_check_conflicts(DnsScope *scope, DnsPacket *p) {
         assert(scope);
         assert(p);
 
-        if (p->protocol != DNS_PROTOCOL_LLMNR)
+        if (!IN_SET(p->protocol, DNS_PROTOCOL_LLMNR, DNS_PROTOCOL_MDNS))
                 return;
 
         if (DNS_PACKET_RRCOUNT(p) <= 0)
                 return;
 
-        if (DNS_PACKET_LLMNR_C(p) != 0)
-                return;
+        if (p->protocol == DNS_PROTOCOL_LLMNR) {
+                if (DNS_PACKET_LLMNR_C(p) != 0)
+                        return;
 
-        if (DNS_PACKET_LLMNR_T(p) != 0)
-                return;
+                if (DNS_PACKET_LLMNR_T(p) != 0)
+                        return;
+        }
 
         if (manager_our_packet(scope->manager, p))
                 return;
@@ -1035,3 +1053,77 @@ int dns_scope_ifindex(DnsScope *s) {
 
         return 0;
 }
+
+static int on_announcement_timeout(sd_event_source *s, usec_t usec, void *userdata) {
+        DnsScope *scope = userdata;
+
+        assert(s);
+
+        scope->announce_event_source = sd_event_source_unref(scope->announce_event_source);
+
+        (void) dns_scope_announce(scope, false);
+        return 0;
+}
+
+int dns_scope_announce(DnsScope *scope, bool goodbye) {
+        _cleanup_(dns_answer_unrefp) DnsAnswer *answer = NULL;
+        _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
+        LinkAddress *a;
+        int r;
+
+        if (!scope)
+                return 0;
+
+        if (scope->protocol != DNS_PROTOCOL_MDNS)
+                return 0;
+
+        answer = dns_answer_new(scope->link->n_addresses * 2);
+        if (!answer)
+                return log_oom();
+
+        LIST_FOREACH(addresses, a, scope->link->addresses) {
+                r = dns_answer_add(answer, a->mdns_address_rr, 0, goodbye ? DNS_ANSWER_GOODBYE : DNS_ANSWER_CACHE_FLUSH);
+                if (r < 0)
+                        return log_debug_errno(r, "Failed to add address RR to answer: %m");
+
+                r = dns_answer_add(answer, a->mdns_ptr_rr, 0, goodbye ? DNS_ANSWER_GOODBYE : DNS_ANSWER_CACHE_FLUSH);
+                if (r < 0)
+                        return log_debug_errno(r, "Failed to add PTR RR to answer: %m");
+        }
+
+        if (dns_answer_isempty(answer))
+                return 0;
+
+        r = dns_scope_make_reply_packet(scope, 0, DNS_RCODE_SUCCESS, NULL, answer, NULL, false, &p);
+        if (r < 0)
+                return log_debug_errno(r, "Failed to build reply packet: %m");
+
+        r = dns_scope_emit_udp(scope, -1, p);
+        if (r < 0)
+                return log_debug_errno(r, "Failed to send reply packet: %m");
+
+        /* In section 8.3 of RFC6762: "The Multicast DNS responder MUST send at least two unsolicited
+         * responses, one second apart." */
+        if (!scope->announced) {
+                usec_t ts;
+
+                scope->announced = true;
+
+                assert_se(sd_event_now(scope->manager->event, clock_boottime_or_monotonic(), &ts) >= 0);
+                ts += MDNS_ANNOUNCE_DELAY;
+
+                r = sd_event_add_time(
+                                scope->manager->event,
+                                &scope->announce_event_source,
+                                clock_boottime_or_monotonic(),
+                                ts,
+                                MDNS_JITTER_RANGE_USEC,
+                                on_announcement_timeout, scope);
+                if (r < 0)
+                        return log_debug_errno(r, "Failed to schedule second announcement: %m");
+
+                (void) sd_event_source_set_description(scope->announce_event_source, "mdns-announce");
+        }
+
+        return 0;
+}
index 538bc61..6f94b1f 100644 (file)
@@ -26,7 +26,10 @@ typedef struct DnsScope DnsScope;
 #include "resolved-dns-cache.h"
 #include "resolved-dns-dnssec.h"
 #include "resolved-dns-packet.h"
+#include "resolved-dns-query.h"
+#include "resolved-dns-search-domain.h"
 #include "resolved-dns-server.h"
+#include "resolved-dns-stream.h"
 #include "resolved-dns-zone.h"
 #include "resolved-link.h"
 
@@ -53,6 +56,9 @@ struct DnsScope {
         OrderedHashmap *conflict_queue;
         sd_event_source *conflict_event_source;
 
+        bool announced:1;
+        sd_event_source *announce_event_source;
+
         RateLimit ratelimit;
 
         usec_t resend_timeout;
@@ -93,6 +99,7 @@ void dns_scope_next_dns_server(DnsScope *s);
 int dns_scope_llmnr_membership(DnsScope *s, bool b);
 int dns_scope_mdns_membership(DnsScope *s, bool b);
 
+int dns_scope_make_reply_packet(DnsScope *s, uint16_t id, int rcode, DnsQuestion *q, DnsAnswer *answer, DnsAnswer *soa, bool tentative, DnsPacket **ret);
 void dns_scope_process_query(DnsScope *s, DnsStream *stream, DnsPacket *p);
 
 DnsTransaction *dns_scope_find_transaction(DnsScope *scope, DnsResourceKey *key, bool cache_ok);
@@ -109,3 +116,5 @@ bool dns_scope_name_needs_search_domain(DnsScope *s, const char *name);
 bool dns_scope_network_good(DnsScope *s);
 
 int dns_scope_ifindex(DnsScope *s);
+
+int dns_scope_announce(DnsScope *scope, bool goodbye);
index 7324710..1386e6a 100644 (file)
@@ -104,9 +104,7 @@ DnsSearchDomain* dns_search_domain_unref(DnsSearchDomain *d) {
                 return NULL;
 
         free(d->name);
-        free(d);
-
-        return NULL;
+        return mfree(d);
 }
 
 void dns_search_domain_unlink(DnsSearchDomain *d) {
index 9b7b471..b3d3752 100644 (file)
@@ -17,7 +17,7 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <sd-messages.h>
+#include "sd-messages.h"
 
 #include "alloc-util.h"
 #include "resolved-dns-server.h"
@@ -28,7 +28,7 @@
 #include "string-util.h"
 
 /* After how much time to repeat classic DNS requests */
-#define DNS_TIMEOUT_MIN_USEC (500 * USEC_PER_MSEC)
+#define DNS_TIMEOUT_MIN_USEC (750 * USEC_PER_MSEC)
 #define DNS_TIMEOUT_MAX_USEC (5 * USEC_PER_SEC)
 
 /* The amount of time to wait before retrying with a full feature set */
@@ -139,8 +139,7 @@ DnsServer* dns_server_unref(DnsServer *s)  {
                 return NULL;
 
         free(s->server_string);
-        free(s);
-        return NULL;
+        return mfree(s);
 }
 
 void dns_server_unlink(DnsServer *s) {
@@ -305,7 +304,10 @@ void dns_server_packet_received(DnsServer *s, int protocol, DnsServerFeatureLeve
         if (s->max_rtt < rtt) {
                 s->max_rtt = rtt;
                 s->resend_timeout = CLAMP(s->max_rtt * 2, DNS_TIMEOUT_MIN_USEC, DNS_TIMEOUT_MAX_USEC);
-        }
+        } else if (s->resend_timeout > rtt)
+                /* If we received the packet faster than the resend_timeout, bias
+                 * the resend_timeout back to the rtt. */
+                s->resend_timeout = CLAMP((2 * s->resend_timeout + rtt) / 3, DNS_TIMEOUT_MIN_USEC, DNS_TIMEOUT_MAX_USEC);
 }
 
 void dns_server_packet_lost(DnsServer *s, int protocol, DnsServerFeatureLevel level, usec_t usec) {
@@ -400,12 +402,24 @@ static bool dns_server_grace_period_expired(DnsServer *s) {
 }
 
 DnsServerFeatureLevel dns_server_possible_feature_level(DnsServer *s) {
+        DnsServerFeatureLevel best;
+
         assert(s);
 
-        if (s->possible_feature_level != DNS_SERVER_FEATURE_LEVEL_BEST &&
-            dns_server_grace_period_expired(s)) {
+        /* Determine the best feature level we care about. If DNSSEC mode is off there's no point in using anything
+         * better than EDNS0, hence don't even try. */
+        best = dns_server_get_dnssec_mode(s) == DNSSEC_NO ?
+                DNS_SERVER_FEATURE_LEVEL_EDNS0 :
+                DNS_SERVER_FEATURE_LEVEL_BEST;
+
+        /* Clamp the feature level the highest level we care about. The DNSSEC mode might have changed since the last
+         * time, hence let's downgrade if we are still at a higher level. */
+        if (s->possible_feature_level > best)
+                s->possible_feature_level = best;
 
-                s->possible_feature_level = DNS_SERVER_FEATURE_LEVEL_BEST;
+        if (s->possible_feature_level < best && dns_server_grace_period_expired(s)) {
+
+                s->possible_feature_level = best;
 
                 dns_server_reset_counters(s);
 
@@ -416,6 +430,8 @@ DnsServerFeatureLevel dns_server_possible_feature_level(DnsServer *s) {
                          dns_server_feature_level_to_string(s->possible_feature_level),
                          dns_server_string(s));
 
+                dns_server_flush_cache(s);
+
         } else if (s->possible_feature_level <= s->verified_feature_level)
                 s->possible_feature_level = s->verified_feature_level;
         else {
@@ -452,18 +468,22 @@ DnsServerFeatureLevel dns_server_possible_feature_level(DnsServer *s) {
                         s->possible_feature_level = DNS_SERVER_FEATURE_LEVEL_EDNS0;
 
                 } else if (s->n_failed_udp >= DNS_SERVER_FEATURE_RETRY_ATTEMPTS &&
-                            s->possible_feature_level >= DNS_SERVER_FEATURE_LEVEL_UDP) {
+                           s->possible_feature_level >= (dns_server_get_dnssec_mode(s) == DNSSEC_YES ? DNS_SERVER_FEATURE_LEVEL_LARGE : DNS_SERVER_FEATURE_LEVEL_UDP)) {
 
                         /* We lost too many UDP packets in a row, and are on a feature level of UDP or higher. If the
                          * packets are lost, maybe the server cannot parse them, hence downgrading sounds like a good
-                         * idea. We might downgrade all the way down to TCP this way. */
+                         * idea. We might downgrade all the way down to TCP this way.
+                         *
+                         * If strict DNSSEC mode is used we won't downgrade below DO level however, as packet loss
+                         * might have many reasons, a broken DNSSEC implementation being only one reason. And if the
+                         * user is strict on DNSSEC, then let's assume that DNSSEC is not the fault here. */
 
                         log_debug("Lost too many UDP packets, downgrading feature level...");
                         s->possible_feature_level--;
 
                 } else if (s->n_failed_tcp >= DNS_SERVER_FEATURE_RETRY_ATTEMPTS &&
                            s->packet_truncated &&
-                           s->possible_feature_level > DNS_SERVER_FEATURE_LEVEL_UDP) {
+                           s->possible_feature_level > (dns_server_get_dnssec_mode(s) == DNSSEC_YES ? DNS_SERVER_FEATURE_LEVEL_LARGE : DNS_SERVER_FEATURE_LEVEL_UDP)) {
 
                          /* We got too many TCP connection failures in a row, we had at least one truncated packet, and
                           * are on a feature level above UDP. By downgrading things and getting rid of DNSSEC or EDNS0
@@ -567,7 +587,7 @@ void dns_server_warn_downgrade(DnsServer *server) {
                 return;
 
         log_struct(LOG_NOTICE,
-                   LOG_MESSAGE_ID(SD_MESSAGE_DNSSEC_DOWNGRADE),
+                   "MESSAGE_ID=" SD_MESSAGE_DNSSEC_DOWNGRADE_STR,
                    LOG_MESSAGE("Server %s does not support DNSSEC, downgrading to non-DNSSEC mode.", dns_server_string(server)),
                    "DNS_SERVER=%s", dns_server_string(server),
                    "DNS_SERVER_FEATURE_LEVEL=%s", dns_server_feature_level_to_string(server->possible_feature_level),
@@ -576,6 +596,26 @@ void dns_server_warn_downgrade(DnsServer *server) {
         server->warned_downgrade = true;
 }
 
+bool dns_server_limited_domains(DnsServer *server) {
+        DnsSearchDomain *domain;
+        bool domain_restricted = false;
+
+        /* Check if the server has route-only domains without ~., i. e. whether
+         * it should only be used for particular domains */
+        if (!server->link)
+                return false;
+
+        LIST_FOREACH(domains, domain, server->link->search_domains)
+                if (domain->route_only) {
+                        domain_restricted = true;
+                        /* ~. means "any domain", thus it is a global server */
+                        if (dns_name_is_root(DNS_SEARCH_DOMAIN_NAME(domain)))
+                                return false;
+                }
+
+        return domain_restricted;
+}
+
 static void dns_server_hash_func(const void *p, struct siphash *state) {
         const DnsServer *s = p;
 
@@ -679,9 +719,9 @@ DnsServer *manager_set_dns_server(Manager *m, DnsServer *s) {
                 return s;
 
         if (s)
-                log_info("Switching to %s DNS server %s.",
-                         dns_server_type_to_string(s->type),
-                         dns_server_string(s));
+                log_debug("Switching to %s DNS server %s.",
+                          dns_server_type_to_string(s->type),
+                          dns_server_string(s));
 
         dns_server_unref(m->current_dns_server);
         m->current_dns_server = dns_server_ref(s);
@@ -760,6 +800,34 @@ bool dns_server_address_valid(int family, const union in_addr_union *sa) {
         return true;
 }
 
+DnssecMode dns_server_get_dnssec_mode(DnsServer *s) {
+        assert(s);
+
+        if (s->link)
+                return link_get_dnssec_mode(s->link);
+
+        return manager_get_dnssec_mode(s->manager);
+}
+
+void dns_server_flush_cache(DnsServer *s) {
+        DnsServer *current;
+        DnsScope *scope;
+
+        assert(s);
+
+        /* Flush the cache of the scope this server belongs to */
+
+        current = s->link ? s->link->current_dns_server : s->manager->current_dns_server;
+        if (current != s)
+                return;
+
+        scope = s->link ? s->link->unicast_scope : s->manager->unicast_scope;
+        if (!scope)
+                return;
+
+        dns_cache_flush(&scope->cache);
+}
+
 static const char* const dns_server_type_table[_DNS_SERVER_TYPE_MAX] = {
         [DNS_SERVER_SYSTEM] = "system",
         [DNS_SERVER_FALLBACK] = "fallback",
index c1732fa..bc95d53 100644 (file)
@@ -128,6 +128,8 @@ bool dns_server_dnssec_supported(DnsServer *server);
 
 void dns_server_warn_downgrade(DnsServer *server);
 
+bool dns_server_limited_domains(DnsServer *server);
+
 DnsServer *dns_server_find(DnsServer *first, int family, const union in_addr_union *in_addr, int ifindex);
 
 void dns_server_unlink_all(DnsServer *first);
@@ -142,6 +144,10 @@ void manager_next_dns_server(Manager *m);
 
 bool dns_server_address_valid(int family, const union in_addr_union *sa);
 
+DnssecMode dns_server_get_dnssec_mode(DnsServer *s);
+
 DEFINE_TRIVIAL_CLEANUP_FUNC(DnsServer*, dns_server_unref);
 
 extern const struct hash_ops dns_server_hash_ops;
+
+void dns_server_flush_cache(DnsServer *s);
index dd0e0b9..878bae4 100644 (file)
@@ -343,9 +343,7 @@ DnsStream *dns_stream_unref(DnsStream *s) {
         dns_packet_unref(s->write_packet);
         dns_packet_unref(s->read_packet);
 
-        free(s);
-
-        return NULL;
+        return mfree(s);
 }
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(DnsStream*, dns_stream_unref);
index e656967..4cdb4f6 100644 (file)
@@ -25,6 +25,7 @@ typedef struct DnsStream DnsStream;
 
 #include "resolved-dns-packet.h"
 #include "resolved-dns-transaction.h"
+#include "resolved-manager.h"
 
 /* Streams are used by three subsystems:
  *
index d263ced..7afbfed 100644 (file)
  * IP and UDP header sizes */
 #define ADVERTISE_DATAGRAM_SIZE_MAX (65536U-14U-20U-8U)
 
+static int manager_dns_stub_udp_fd(Manager *m);
+static int manager_dns_stub_tcp_fd(Manager *m);
+
 static int dns_stub_make_reply_packet(
-                uint16_t id,
-                int rcode,
+                DnsPacket **p,
                 DnsQuestion *q,
-                DnsAnswer *answer,
-                bool add_opt,   /* add an OPT RR to this packet */
-                bool edns0_do,  /* set the EDNS0 DNSSEC OK bit */
-                bool ad,        /* set the DNSSEC authenticated data bit */
-                DnsPacket **ret) {
+                DnsAnswer *answer) {
 
-        _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
         DnsResourceRecord *rr;
         unsigned c = 0;
         int r;
 
+        assert(p);
+
         /* Note that we don't bother with any additional RRs, as this is stub is for local lookups only, and hence
          * roundtrips aren't expensive. */
 
-        r = dns_packet_new(&p, DNS_PROTOCOL_DNS, 0);
-        if (r < 0)
-                return r;
-
-        /* If the client didn't do EDNS, clamp the rcode to 4 bit */
-        if (!add_opt && rcode > 0xF)
-                rcode = DNS_RCODE_SERVFAIL;
+        if (!*p) {
+                r = dns_packet_new(p, DNS_PROTOCOL_DNS, 0);
+                if (r < 0)
+                        return r;
 
-        DNS_PACKET_HEADER(p)->id = id;
-        DNS_PACKET_HEADER(p)->flags = htobe16(DNS_PACKET_MAKE_FLAGS(
-                                                              1 /* qr */,
-                                                              0 /* opcode */,
-                                                              0 /* aa */,
-                                                              0 /* tc */,
-                                                              1 /* rd */,
-                                                              1 /* ra */,
-                                                              ad /* ad */,
-                                                              0 /* cd */,
-                                                              rcode));
+                r = dns_packet_append_question(*p, q);
+                if (r < 0)
+                        return r;
 
-        r = dns_packet_append_question(p, q);
-        if (r < 0)
-                return r;
-        DNS_PACKET_HEADER(p)->qdcount = htobe16(dns_question_size(q));
+                DNS_PACKET_HEADER(*p)->qdcount = htobe16(dns_question_size(q));
+        }
 
         DNS_ANSWER_FOREACH(rr, answer) {
+
                 r = dns_question_matches_rr(q, rr, NULL);
                 if (r < 0)
                         return r;
@@ -83,13 +70,55 @@ static int dns_stub_make_reply_packet(
 
                 continue;
         add:
-                r = dns_packet_append_rr(p, rr, NULL, NULL);
+                r = dns_packet_append_rr(*p, rr, 0, NULL, NULL);
                 if (r < 0)
                         return r;
 
                 c++;
         }
-        DNS_PACKET_HEADER(p)->ancount = htobe16(c);
+
+        DNS_PACKET_HEADER(*p)->ancount = htobe16(be16toh(DNS_PACKET_HEADER(*p)->ancount) + c);
+
+        return 0;
+}
+
+static int dns_stub_finish_reply_packet(
+                DnsPacket *p,
+                uint16_t id,
+                int rcode,
+                bool add_opt,   /* add an OPT RR to this packet? */
+                bool edns0_do,  /* set the EDNS0 DNSSEC OK bit? */
+                bool ad) {      /* set the DNSSEC authenticated data bit? */
+
+        int r;
+
+        assert(p);
+
+        if (!add_opt) {
+                /* If the client can't to EDNS0, don't do DO either */
+                edns0_do = false;
+
+                /* If the client didn't do EDNS, clamp the rcode to 4 bit */
+                if (rcode > 0xF)
+                        rcode = DNS_RCODE_SERVFAIL;
+        }
+
+        /* Don't set the AD bit unless DO is on, too */
+        if (!edns0_do)
+                ad = false;
+
+        DNS_PACKET_HEADER(p)->id = id;
+
+        DNS_PACKET_HEADER(p)->flags = htobe16(DNS_PACKET_MAKE_FLAGS(
+                                                              1 /* qr */,
+                                                              0 /* opcode */,
+                                                              0 /* aa */,
+                                                              0 /* tc */,
+                                                              1 /* rd */,
+                                                              1 /* ra */,
+                                                              ad /* ad */,
+                                                              0 /* cd */,
+                                                              rcode));
 
         if (add_opt) {
                 r = dns_packet_append_opt(p, ADVERTISE_DATAGRAM_SIZE_MAX, edns0_do, rcode, NULL);
@@ -97,9 +126,6 @@ static int dns_stub_make_reply_packet(
                         return r;
         }
 
-        *ret = p;
-        p = NULL;
-
         return 0;
 }
 
@@ -145,14 +171,18 @@ static int dns_stub_send(Manager *m, DnsStream *s, DnsPacket *p, DnsPacket *repl
         return 0;
 }
 
-static int dns_stub_send_failure(Manager *m, DnsStream *s, DnsPacket *p, int rcode) {
+static int dns_stub_send_failure(Manager *m, DnsStream *s, DnsPacket *p, int rcode, bool authenticated) {
         _cleanup_(dns_packet_unrefp) DnsPacket *reply = NULL;
         int r;
 
         assert(m);
         assert(p);
 
-        r = dns_stub_make_reply_packet(DNS_PACKET_ID(p), rcode, p->question, NULL, !!p->opt, DNS_PACKET_DO(p), false, &reply);
+        r = dns_stub_make_reply_packet(&reply, p->question, NULL);
+        if (r < 0)
+                return log_debug_errno(r, "Failed to make failure packet: %m");
+
+        r = dns_stub_finish_reply_packet(reply, DNS_PACKET_ID(p), rcode, !!p->opt, DNS_PACKET_DO(p), authenticated);
         if (r < 0)
                 return log_debug_errno(r, "Failed to build failure packet: %m");
 
@@ -167,33 +197,47 @@ static void dns_stub_query_complete(DnsQuery *q) {
 
         switch (q->state) {
 
-        case DNS_TRANSACTION_SUCCESS: {
-                _cleanup_(dns_packet_unrefp) DnsPacket *reply = NULL;
+        case DNS_TRANSACTION_SUCCESS:
 
-                r = dns_stub_make_reply_packet(
+                r = dns_stub_make_reply_packet(&q->reply_dns_packet, q->question_idna, q->answer);
+                if (r < 0) {
+                        log_debug_errno(r, "Failed to build reply packet: %m");
+                        break;
+                }
+
+                r = dns_query_process_cname(q);
+                if (r == -ELOOP) {
+                        (void) dns_stub_send_failure(q->manager, q->request_dns_stream, q->request_dns_packet, DNS_RCODE_SERVFAIL, false);
+                        break;
+                }
+                if (r < 0) {
+                        log_debug_errno(r, "Failed to process CNAME: %m");
+                        break;
+                }
+                if (r == DNS_QUERY_RESTARTED)
+                        return;
+
+                r = dns_stub_finish_reply_packet(
+                                q->reply_dns_packet,
                                 DNS_PACKET_ID(q->request_dns_packet),
                                 q->answer_rcode,
-                                q->question_idna,
-                                q->answer,
                                 !!q->request_dns_packet->opt,
                                 DNS_PACKET_DO(q->request_dns_packet),
-                                DNS_PACKET_DO(q->request_dns_packet) && q->answer_authenticated,
-                                &reply);
+                                dns_query_fully_authenticated(q));
                 if (r < 0) {
-                        log_debug_errno(r, "Failed to build reply packet: %m");
+                        log_debug_errno(r, "Failed to finish reply packet: %m");
                         break;
                 }
 
-                (void) dns_stub_send(q->manager, q->request_dns_stream, q->request_dns_packet, reply);
+                (void) dns_stub_send(q->manager, q->request_dns_stream, q->request_dns_packet, q->reply_dns_packet);
                 break;
-        }
 
         case DNS_TRANSACTION_RCODE_FAILURE:
-                (void) dns_stub_send_failure(q->manager, q->request_dns_stream, q->request_dns_packet, q->answer_rcode);
+                (void) dns_stub_send_failure(q->manager, q->request_dns_stream, q->request_dns_packet, q->answer_rcode, dns_query_fully_authenticated(q));
                 break;
 
         case DNS_TRANSACTION_NOT_FOUND:
-                (void) dns_stub_send_failure(q->manager, q->request_dns_stream, q->request_dns_packet, DNS_RCODE_NXDOMAIN);
+                (void) dns_stub_send_failure(q->manager, q->request_dns_stream, q->request_dns_packet, DNS_RCODE_NXDOMAIN, dns_query_fully_authenticated(q));
                 break;
 
         case DNS_TRANSACTION_TIMEOUT:
@@ -209,7 +253,7 @@ static void dns_stub_query_complete(DnsQuery *q) {
         case DNS_TRANSACTION_NO_TRUST_ANCHOR:
         case DNS_TRANSACTION_RR_TYPE_UNSUPPORTED:
         case DNS_TRANSACTION_NETWORK_DOWN:
-                (void) dns_stub_send_failure(q->manager, q->request_dns_stream, q->request_dns_packet, DNS_RCODE_SERVFAIL);
+                (void) dns_stub_send_failure(q->manager, q->request_dns_stream, q->request_dns_packet, DNS_RCODE_SERVFAIL, false);
                 break;
 
         case DNS_TRANSACTION_NULL:
@@ -256,52 +300,52 @@ static void dns_stub_process_query(Manager *m, DnsStream *s, DnsPacket *p) {
         if (in_addr_is_localhost(p->family, &p->sender) <= 0 ||
             in_addr_is_localhost(p->family, &p->destination) <= 0) {
                 log_error("Got packet on unexpected IP range, refusing.");
-                dns_stub_send_failure(m, s, p, DNS_RCODE_SERVFAIL);
+                dns_stub_send_failure(m, s, p, DNS_RCODE_SERVFAIL, false);
                 goto fail;
         }
 
         r = dns_packet_extract(p);
         if (r < 0) {
                 log_debug_errno(r, "Failed to extract resources from incoming packet, ignoring packet: %m");
-                dns_stub_send_failure(m, s, p, DNS_RCODE_FORMERR);
+                dns_stub_send_failure(m, s, p, DNS_RCODE_FORMERR, false);
                 goto fail;
         }
 
         if (!DNS_PACKET_VERSION_SUPPORTED(p)) {
                 log_debug("Got EDNS OPT field with unsupported version number.");
-                dns_stub_send_failure(m, s, p, DNS_RCODE_BADVERS);
+                dns_stub_send_failure(m, s, p, DNS_RCODE_BADVERS, false);
                 goto fail;
         }
 
         if (dns_type_is_obsolete(p->question->keys[0]->type)) {
                 log_debug("Got message with obsolete key type, refusing.");
-                dns_stub_send_failure(m, s, p, DNS_RCODE_NOTIMP);
+                dns_stub_send_failure(m, s, p, DNS_RCODE_NOTIMP, false);
                 goto fail;
         }
 
         if (dns_type_is_zone_transer(p->question->keys[0]->type)) {
                 log_debug("Got request for zone transfer, refusing.");
-                dns_stub_send_failure(m, s, p, DNS_RCODE_NOTIMP);
+                dns_stub_send_failure(m, s, p, DNS_RCODE_NOTIMP, false);
                 goto fail;
         }
 
         if (!DNS_PACKET_RD(p))  {
                 /* If the "rd" bit is off (i.e. recursion was not requested), then refuse operation */
                 log_debug("Got request with recursion disabled, refusing.");
-                dns_stub_send_failure(m, s, p, DNS_RCODE_REFUSED);
+                dns_stub_send_failure(m, s, p, DNS_RCODE_REFUSED, false);
                 goto fail;
         }
 
         if (DNS_PACKET_DO(p) && DNS_PACKET_CD(p)) {
                 log_debug("Got request with DNSSEC CD bit set, refusing.");
-                dns_stub_send_failure(m, s, p, DNS_RCODE_NOTIMP);
+                dns_stub_send_failure(m, s, p, DNS_RCODE_NOTIMP, false);
                 goto fail;
         }
 
-        r = dns_query_new(m, &q, p->question, p->question, 0, SD_RESOLVED_PROTOCOLS_ALL|SD_RESOLVED_NO_SEARCH|SD_RESOLVED_NO_CNAME);
+        r = dns_query_new(m, &q, p->question, p->question, 0, SD_RESOLVED_PROTOCOLS_ALL|SD_RESOLVED_NO_SEARCH);
         if (r < 0) {
                 log_error_errno(r, "Failed to generate query object: %m");
-                dns_stub_send_failure(m, s, p, DNS_RCODE_SERVFAIL);
+                dns_stub_send_failure(m, s, p, DNS_RCODE_SERVFAIL, false);
                 goto fail;
         }
 
@@ -321,11 +365,11 @@ static void dns_stub_process_query(Manager *m, DnsStream *s, DnsPacket *p) {
         r = dns_query_go(q);
         if (r < 0) {
                 log_error_errno(r, "Failed to start query: %m");
-                dns_stub_send_failure(m, s, p, DNS_RCODE_SERVFAIL);
+                dns_stub_send_failure(m, s, p, DNS_RCODE_SERVFAIL, false);
                 goto fail;
         }
 
-        log_info("Processing query...");
+        log_debug("Processing query...");
         return;
 
 fail:
@@ -354,66 +398,48 @@ static int on_dns_stub_packet(sd_event_source *s, int fd, uint32_t revents, void
         return 0;
 }
 
-int manager_dns_stub_udp_fd(Manager *m) {
+static int manager_dns_stub_udp_fd(Manager *m) {
         static const int one = 1;
-
         union sockaddr_union sa = {
                 .in.sin_family = AF_INET,
                 .in.sin_port = htobe16(53),
                 .in.sin_addr.s_addr = htobe32(INADDR_DNS_STUB),
         };
-
+        _cleanup_close_ int fd = -1;
         int r;
 
         if (m->dns_stub_udp_fd >= 0)
                 return m->dns_stub_udp_fd;
 
-        m->dns_stub_udp_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
-        if (m->dns_stub_udp_fd < 0)
+        fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
+        if (fd < 0)
                 return -errno;
 
-        r = setsockopt(m->dns_stub_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
-        if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
+        if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one) < 0)
+                return -errno;
 
-        r = setsockopt(m->dns_stub_udp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
-        if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
+        if (setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof one) < 0)
+                return -errno;
 
-        r = setsockopt(m->dns_stub_udp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
-        if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
+        if (setsockopt(fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof one) < 0)
+                return -errno;
 
         /* Make sure no traffic from outside the local host can leak to onto this socket */
-        r = setsockopt(m->dns_stub_udp_fd, SOL_SOCKET, SO_BINDTODEVICE, "lo", 3);
-        if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
+        if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, "lo", 3) < 0)
+                return -errno;
 
-        r = bind(m->dns_stub_udp_fd, &sa.sa, sizeof(sa.in));
-        if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
+        if (bind(fd, &sa.sa, sizeof(sa.in)) < 0)
+                return -errno;
 
-        r = sd_event_add_io(m->event, &m->dns_stub_udp_event_source, m->dns_stub_udp_fd, EPOLLIN, on_dns_stub_packet, m);
+        r = sd_event_add_io(m->event, &m->dns_stub_udp_event_source, fd, EPOLLIN, on_dns_stub_packet, m);
         if (r < 0)
-                goto fail;
+                return r;
 
         (void) sd_event_source_set_description(m->dns_stub_udp_event_source, "dns-stub-udp");
+        m->dns_stub_udp_fd = fd;
+        fd = -1;
 
         return m->dns_stub_udp_fd;
-
-fail:
-        m->dns_stub_udp_fd = safe_close(m->dns_stub_udp_fd);
-        return r;
 }
 
 static int on_dns_stub_stream_packet(DnsStream *s) {
@@ -461,102 +487,83 @@ static int on_dns_stub_stream(sd_event_source *s, int fd, uint32_t revents, void
         return 0;
 }
 
-int manager_dns_stub_tcp_fd(Manager *m) {
+static int manager_dns_stub_tcp_fd(Manager *m) {
         static const int one = 1;
-
         union sockaddr_union sa = {
                 .in.sin_family = AF_INET,
                 .in.sin_addr.s_addr = htobe32(INADDR_DNS_STUB),
                 .in.sin_port = htobe16(53),
         };
-
+        _cleanup_close_ int fd = -1;
         int r;
 
         if (m->dns_stub_tcp_fd >= 0)
                 return m->dns_stub_tcp_fd;
 
-        m->dns_stub_tcp_fd = socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
-        if (m->dns_stub_tcp_fd < 0)
+        fd = socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
+        if (fd < 0)
                 return -errno;
 
-        r = setsockopt(m->dns_stub_tcp_fd, IPPROTO_IP, IP_TTL, &one, sizeof(one));
-        if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
+        if (setsockopt(fd, IPPROTO_IP, IP_TTL, &one, sizeof one) < 0)
+                return -errno;
 
-        r = setsockopt(m->dns_stub_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
-        if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
+        if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one) < 0)
+                return -errno;
 
-        r = setsockopt(m->dns_stub_tcp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
-        if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
+        if (setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof one) < 0)
+                return -errno;
 
-        r = setsockopt(m->dns_stub_tcp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
-        if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
+        if (setsockopt(fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof one) < 0)
+                return -errno;
 
         /* Make sure no traffic from outside the local host can leak to onto this socket */
-        r = setsockopt(m->dns_stub_tcp_fd, SOL_SOCKET, SO_BINDTODEVICE, "lo", 3);
-        if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
+        if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, "lo", 3) < 0)
+                return -errno;
 
-        r = bind(m->dns_stub_tcp_fd, &sa.sa, sizeof(sa.in));
-        if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
+        if (bind(fd, &sa.sa, sizeof(sa.in)) < 0)
+                return -errno;
 
-        r = listen(m->dns_stub_tcp_fd, SOMAXCONN);
-        if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
+        if (listen(fd, SOMAXCONN) < 0)
+                return -errno;
 
-        r = sd_event_add_io(m->event, &m->dns_stub_tcp_event_source, m->dns_stub_tcp_fd, EPOLLIN, on_dns_stub_stream, m);
+        r = sd_event_add_io(m->event, &m->dns_stub_tcp_event_source, fd, EPOLLIN, on_dns_stub_stream, m);
         if (r < 0)
-                goto fail;
+                return r;
 
         (void) sd_event_source_set_description(m->dns_stub_tcp_event_source, "dns-stub-tcp");
+        m->dns_stub_tcp_fd = fd;
+        fd = -1;
 
         return m->dns_stub_tcp_fd;
-
-fail:
-        m->dns_stub_tcp_fd = safe_close(m->dns_stub_tcp_fd);
-        return r;
 }
 
 int manager_dns_stub_start(Manager *m) {
-        int r;
+        const char *t = "UDP";
+        int r = 0;
 
         assert(m);
 
-        r = manager_dns_stub_udp_fd(m);
-        if (r == -EADDRINUSE)
-                goto eaddrinuse;
-        if (r < 0)
-                return r;
-
-        r = manager_dns_stub_tcp_fd(m);
-        if (r == -EADDRINUSE)
-                goto eaddrinuse;
-        if (r < 0)
-                return r;
+        if (IN_SET(m->dns_stub_listener_mode, DNS_STUB_LISTENER_YES, DNS_STUB_LISTENER_UDP))
+                r = manager_dns_stub_udp_fd(m);
 
-        return 0;
+        if (r >= 0 &&
+            IN_SET(m->dns_stub_listener_mode, DNS_STUB_LISTENER_YES, DNS_STUB_LISTENER_TCP)) {
+                t = "TCP";
+                r = manager_dns_stub_tcp_fd(m);
+        }
 
-eaddrinuse:
-        log_warning("Another process is already listening on 127.0.0.53:53. Turning off local DNS stub support.");
-        manager_dns_stub_stop(m);
+        if (IN_SET(r, -EADDRINUSE, -EPERM)) {
+                if (r == -EADDRINUSE)
+                        log_warning_errno(r,
+                                          "Another process is already listening on %s socket 127.0.0.53:53.\n"
+                                          "Turning off local DNS stub support.", t);
+                else
+                        log_warning_errno(r,
+                                          "Failed to listen on %s socket 127.0.0.53:53: %m.\n"
+                                          "Turning off local DNS stub support.", t);
+                manager_dns_stub_stop(m);
+        } else if (r < 0)
+                return log_error_errno(r, "Failed to listen on %s socket 127.0.0.53:53: %m", t);
 
         return 0;
 }
index fce4d25..12b86f6 100644 (file)
@@ -24,8 +24,5 @@
 /* 127.0.0.53 in native endian */
 #define INADDR_DNS_STUB ((in_addr_t) 0x7f000035U)
 
-int manager_dns_stub_udp_fd(Manager *m);
-int manager_dns_stub_tcp_fd(Manager *m);
-
 void manager_dns_stub_stop(Manager *m);
 int manager_dns_stub_start(Manager *m);
index d455b6b..3075f62 100644 (file)
@@ -17,7 +17,7 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <sd-messages.h>
+#include "sd-messages.h"
 
 #include "af-list.h"
 #include "alloc-util.h"
@@ -31,6 +31,7 @@
 #include "string-table.h"
 
 #define TRANSACTIONS_MAX 4096
+#define TRANSACTION_TCP_TIMEOUT_USEC (10U*USEC_PER_SEC)
 
 static void dns_transaction_reset_answer(DnsTransaction *t) {
         assert(t);
@@ -134,8 +135,7 @@ DnsTransaction* dns_transaction_free(DnsTransaction *t) {
         dns_answer_unref(t->validated_keys);
         dns_resource_key_unref(t->key);
 
-        free(t);
-        return NULL;
+        return mfree(t);
 }
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(DnsTransaction*, dns_transaction_free);
@@ -319,7 +319,7 @@ void dns_transaction_complete(DnsTransaction *t, DnsTransactionState state) {
                 dns_resource_key_to_string(t->key, key_str, sizeof key_str);
 
                 log_struct(LOG_NOTICE,
-                           LOG_MESSAGE_ID(SD_MESSAGE_DNSSEC_FAILURE),
+                           "MESSAGE_ID=" SD_MESSAGE_DNSSEC_FAILURE_STR,
                            LOG_MESSAGE("DNSSEC validation failed for question %s: %s", key_str, dnssec_result_to_string(t->answer_dnssec_result)),
                            "DNS_TRANSACTION=%" PRIu16, t->id,
                            "DNS_QUESTION=%s", key_str,
@@ -364,6 +364,8 @@ void dns_transaction_complete(DnsTransaction *t, DnsTransactionState state) {
         SET_FOREACH_MOVE(z, t->notify_zone_items_done, t->notify_zone_items)
                 dns_zone_item_notify(z);
         SWAP_TWO(t->notify_zone_items, t->notify_zone_items_done);
+        if (t->probing)
+                (void) dns_scope_announce(t->scope, false);
 
         SET_FOREACH_MOVE(d, t->notify_transactions_done, t->notify_transactions)
                 dns_transaction_notify(d, t);
@@ -831,7 +833,7 @@ void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p) {
          * should hence not attempt to access the query or transaction
          * after calling this function. */
 
-        log_debug("Processing incoming packet on transaction %" PRIu16".", t->id);
+        log_debug("Processing incoming packet on transaction %" PRIu16". (rcode=%s)", t->id, dns_rcode_to_string(DNS_PACKET_RCODE(p)));
 
         switch (t->scope->protocol) {
 
@@ -909,9 +911,13 @@ void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p) {
 
                         /* Request failed, immediately try again with reduced features */
 
-                        if (t->current_feature_level <= DNS_SERVER_FEATURE_LEVEL_WORST) {
-                                /* This was already at the lowest possible feature level? If so, we can't downgrade
-                                 * this transaction anymore, hence let's process the response, and accept the rcode. */
+                        if (t->current_feature_level <= DNS_SERVER_FEATURE_LEVEL_UDP) {
+                                /* This was already at UDP feature level? If so, it doesn't make sense to downgrade
+                                 * this transaction anymore, hence let's process the response, and accept the
+                                 * rcode. Note that we don't retry on TCP, since that's a suitable way to mitigate
+                                 * packet loss, but is not going to give us better rcodes should we actually have
+                                 * managed to get them already at UDP level. */
+
                                 log_debug("Server returned error: %s", dns_rcode_to_string(DNS_PACKET_RCODE(p)));
                                 break;
                         }
@@ -925,7 +931,16 @@ void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p) {
 
                         dns_transaction_retry(t, false /* use the same server */);
                         return;
-                } else if (DNS_PACKET_TC(p))
+                }
+
+                if (DNS_PACKET_RCODE(p) == DNS_RCODE_REFUSED) {
+                        /* This server refused our request? If so, try again, use a different server */
+                        log_debug("Server returned REFUSED, switching servers, and retrying.");
+                        dns_transaction_retry(t, true /* pick a new server */);
+                        return;
+                }
+
+                if (DNS_PACKET_TC(p))
                         dns_server_packet_truncated(t->server, t->current_feature_level);
 
                 break;
@@ -1004,15 +1019,20 @@ void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p) {
         if (r > 0) /* Transaction got restarted... */
                 return;
 
-        if (IN_SET(t->scope->protocol, DNS_PROTOCOL_DNS, DNS_PROTOCOL_LLMNR)) {
+        if (IN_SET(t->scope->protocol, DNS_PROTOCOL_DNS, DNS_PROTOCOL_LLMNR, DNS_PROTOCOL_MDNS)) {
 
-                /* Only consider responses with equivalent query section to the request */
-                r = dns_packet_is_reply_for(p, t->key);
-                if (r < 0)
-                        goto fail;
-                if (r == 0) {
-                        dns_transaction_complete(t, DNS_TRANSACTION_INVALID_REPLY);
-                        return;
+                /* When dealing with protocols other than mDNS only consider responses with
+                 * equivalent query section to the request. For mDNS this check doesn't make
+                 * sense, because the section 6 of RFC6762 states that "Multicast DNS responses MUST NOT
+                 * contain any questions in the Question Section". */
+                if (t->scope->protocol != DNS_PROTOCOL_MDNS) {
+                        r = dns_packet_is_reply_for(p, t->key);
+                        if (r < 0)
+                                goto fail;
+                        if (r == 0) {
+                                dns_transaction_complete(t, DNS_TRANSACTION_INVALID_REPLY);
+                                return;
+                        }
                 }
 
                 /* Install the answer as answer to the transaction */
@@ -1120,7 +1140,7 @@ static int dns_transaction_emit_udp(DnsTransaction *t) {
                         return r;
 
                 if (t->current_feature_level < DNS_SERVER_FEATURE_LEVEL_UDP)
-                        return -EAGAIN;
+                        return -EAGAIN; /* Sorry, can't do UDP, try TCP! */
 
                 if (!dns_server_dnssec_supported(t->server) && dns_type_is_dnssec(t->key->type))
                         return -EOPNOTSUPP;
@@ -1197,15 +1217,26 @@ static usec_t transaction_get_resend_timeout(DnsTransaction *t) {
         assert(t);
         assert(t->scope);
 
+
         switch (t->scope->protocol) {
 
         case DNS_PROTOCOL_DNS:
+
+                /* When we do TCP, grant a much longer timeout, as in this case there's no need for us to quickly
+                 * resend, as the kernel does that anyway for us, and we really don't want to interrupt it in that
+                 * needlessly. */
+                if (t->stream)
+                        return TRANSACTION_TCP_TIMEOUT_USEC;
+
                 assert(t->server);
                 return t->server->resend_timeout;
 
         case DNS_PROTOCOL_MDNS:
                 assert(t->n_attempts > 0);
-                return (1 << (t->n_attempts - 1)) * USEC_PER_SEC;
+                if (t->probing)
+                        return MDNS_PROBING_INTERVAL_USEC;
+                else
+                        return (1 << (t->n_attempts - 1)) * USEC_PER_SEC;
 
         case DNS_PROTOCOL_LLMNR:
                 return t->scope->resend_timeout;
@@ -1359,7 +1390,7 @@ static int dns_transaction_make_packet_mdns(DnsTransaction *t) {
         if (r < 0)
                 return r;
 
-        r = dns_packet_append_key(p, t->key, NULL);
+        r = dns_packet_append_key(p, t->key, 0, NULL);
         if (r < 0)
                 return r;
 
@@ -1391,7 +1422,7 @@ static int dns_transaction_make_packet_mdns(DnsTransaction *t) {
                 if (qdcount >= UINT16_MAX)
                         break;
 
-                r = dns_packet_append_key(p, other->key, NULL);
+                r = dns_packet_append_key(p, other->key, 0, NULL);
 
                 /*
                  * If we can't stuff more questions into the packet, just give up.
@@ -1418,7 +1449,7 @@ static int dns_transaction_make_packet_mdns(DnsTransaction *t) {
                 if (r < 0)
                         return r;
 
-                (void) sd_event_source_set_description(t->timeout_event_source, "dns-transaction-timeout");
+                (void) sd_event_source_set_description(other->timeout_event_source, "dns-transaction-timeout");
 
                 other->state = DNS_TRANSACTION_PENDING;
                 other->next_attempt_after = ts;
@@ -1460,7 +1491,7 @@ static int dns_transaction_make_packet(DnsTransaction *t) {
         if (r < 0)
                 return r;
 
-        r = dns_packet_append_key(p, t->key, NULL);
+        r = dns_packet_append_key(p, t->key, 0, NULL);
         if (r < 0)
                 return r;
 
@@ -1561,7 +1592,7 @@ int dns_transaction_go(DnsTransaction *t) {
                 r = dns_transaction_emit_udp(t);
                 if (r == -EMSGSIZE)
                         log_debug("Sending query via TCP since it is too large.");
-                if (r == -EAGAIN)
+                else if (r == -EAGAIN)
                         log_debug("Sending query via TCP since server doesn't support UDP.");
                 if (r == -EMSGSIZE || r == -EAGAIN)
                         r = dns_transaction_open_tcp(t);
@@ -1978,8 +2009,18 @@ int dns_transaction_request_dnssec_keys(DnsTransaction *t) {
                         r = dns_resource_key_match_rr(t->key, rr, NULL);
                         if (r < 0)
                                 return r;
-                        if (r == 0)
-                                continue;
+                        if (r == 0) {
+                                /* Hmm, so this SOA RR doesn't match our original question. In this case, maybe this is
+                                 * a negative reply, and we need the a SOA RR's TTL in order to cache a negative entry?
+                                 * If so, we need to validate it, too. */
+
+                                r = dns_answer_match_key(t->answer, t->key, NULL);
+                                if (r < 0)
+                                        return r;
+                                if (r > 0) /* positive reply, we won't need the SOA and hence don't need to validate
+                                            * it. */
+                                        continue;
+                        }
 
                         r = dnssec_has_rrsig(t->answer, rr->key);
                         if (r < 0)
@@ -2417,7 +2458,7 @@ static int dns_transaction_requires_nsec(DnsTransaction *t) {
         if (r > 0) {
                 /* The lookup is from a TLD that is proven not to
                  * exist, and we are in downgrade mode, hence ignore
-                 * that fact that we didn't get any NSEC RRs.*/
+                 * that fact that we didn't get any NSEC RRs. */
 
                 log_info("Detected a negative query %s in a private DNS zone, permitting unsigned response.",
                          dns_resource_key_to_string(t->key, key_str, sizeof key_str));
@@ -2722,7 +2763,7 @@ static int dnssec_validate_records(
                         const char *source;
 
                         /* This RRset validated, but as a wildcard. This means we need
-                         * to prove via NSEC/NSEC3 that no matching non-wildcard RR exists.*/
+                         * to prove via NSEC/NSEC3 that no matching non-wildcard RR exists. */
 
                         /* First step, determine the source of synthesis */
                         r = dns_resource_record_source(rrsig, &source);
@@ -2757,7 +2798,7 @@ static int dnssec_validate_records(
                                 return r;
                         if (r == 0) {
                                 /* Data does not require signing. In that case, just copy it over,
-                                 * but remember that this is by no means authenticated.*/
+                                 * but remember that this is by no means authenticated. */
                                 r = dns_answer_move_by_key(validated, &t->answer, rr->key, 0);
                                 if (r < 0)
                                         return r;
index 96b0668..a8d9773 100644 (file)
@@ -59,6 +59,8 @@ enum DnsTransactionSource {
 #include "resolved-dns-packet.h"
 #include "resolved-dns-question.h"
 #include "resolved-dns-scope.h"
+#include "resolved-dns-server.h"
+#include "resolved-dns-stream.h"
 
 struct DnsTransaction {
         DnsScope *scope;
@@ -76,6 +78,8 @@ struct DnsTransaction {
 
         bool clamp_ttl:1;
 
+        bool probing:1;
+
         DnsPacket *sent, *received;
 
         DnsAnswer *answer;
@@ -170,10 +174,20 @@ DnsTransactionSource dns_transaction_source_from_string(const char *s) _pure_;
 #define MDNS_JITTER_MIN_USEC   (20 * USEC_PER_MSEC)
 #define MDNS_JITTER_RANGE_USEC (100 * USEC_PER_MSEC)
 
+/* mDNS probing interval, see RFC 6762 Section 8.1 */
+#define MDNS_PROBING_INTERVAL_USEC (250 * USEC_PER_MSEC)
+
 /* Maximum attempts to send DNS requests, across all DNS servers */
-#define DNS_TRANSACTION_ATTEMPTS_MAX 16
+#define DNS_TRANSACTION_ATTEMPTS_MAX 24
 
 /* Maximum attempts to send LLMNR requests, see RFC 4795 Section 2.7 */
 #define LLMNR_TRANSACTION_ATTEMPTS_MAX 3
 
-#define TRANSACTION_ATTEMPTS_MAX(p) ((p) == DNS_PROTOCOL_LLMNR ? LLMNR_TRANSACTION_ATTEMPTS_MAX : DNS_TRANSACTION_ATTEMPTS_MAX)
+/* Maximum attempts to send MDNS requests, see RFC 6762 Section 8.1 */
+#define MDNS_TRANSACTION_ATTEMPTS_MAX 3
+
+#define TRANSACTION_ATTEMPTS_MAX(p) (((p) == DNS_PROTOCOL_LLMNR) ? \
+                                         LLMNR_TRANSACTION_ATTEMPTS_MAX : \
+                                         (((p) == DNS_PROTOCOL_MDNS) ? \
+                                             MDNS_TRANSACTION_ATTEMPTS_MAX : \
+                                             DNS_TRANSACTION_ATTEMPTS_MAX))
index 77370e7..dda9875 100644 (file)
@@ -17,7 +17,7 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <sd-messages.h>
+#include "sd-messages.h"
 
 #include "alloc-util.h"
 #include "conf-files.h"
 
 static const char trust_anchor_dirs[] = CONF_PATHS_NULSTR("dnssec-trust-anchors.d");
 
-/* The DS RR from https://data.iana.org/root-anchors/root-anchors.xml, retrieved December 2015 */
-static const uint8_t root_digest[] =
+/* The first DS RR from https://data.iana.org/root-anchors/root-anchors.xml, retrieved December 2015 */
+static const uint8_t root_digest1[] =
         { 0x49, 0xAA, 0xC1, 0x1D, 0x7B, 0x6F, 0x64, 0x46, 0x70, 0x2E, 0x54, 0xA1, 0x60, 0x73, 0x71, 0x60,
           0x7A, 0x1A, 0x41, 0x85, 0x52, 0x00, 0xFD, 0x2C, 0xE1, 0xCD, 0xDE, 0x32, 0xF2, 0x4E, 0x8F, 0xB5 };
 
+/* The second DS RR from https://data.iana.org/root-anchors/root-anchors.xml, retrieved February 2017 */
+static const uint8_t root_digest2[] =
+        { 0xE0, 0x6D, 0x44, 0xB8, 0x0B, 0x8F, 0x1D, 0x39, 0xA9, 0x5C, 0x0B, 0x0D, 0x7C, 0x65, 0xD0, 0x84,
+          0x58, 0xE8, 0x80, 0x40, 0x9B, 0xBC, 0x68, 0x34, 0x57, 0x10, 0x42, 0x37, 0xC7, 0xF8, 0xEC, 0x8D };
+
 static bool dns_trust_anchor_knows_domain_positive(DnsTrustAnchor *d, const char *name) {
         assert(d);
 
@@ -51,9 +56,40 @@ static bool dns_trust_anchor_knows_domain_positive(DnsTrustAnchor *d, const char
                 hashmap_contains(d->positive_by_key, &DNS_RESOURCE_KEY_CONST(DNS_CLASS_IN, DNS_TYPE_DS, name));
 }
 
-static int dns_trust_anchor_add_builtin_positive(DnsTrustAnchor *d) {
+static int add_root_ksk(
+                DnsAnswer *answer,
+                DnsResourceKey *key,
+                uint16_t key_tag,
+                uint8_t algorithm,
+                uint8_t digest_type,
+                const void *digest,
+                size_t digest_size) {
+
         _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
+        int r;
+
+        rr = dns_resource_record_new(key);
+        if (!rr)
+                return -ENOMEM;
+
+        rr->ds.key_tag = key_tag;
+        rr->ds.algorithm = algorithm;
+        rr->ds.digest_type = digest_type;
+        rr->ds.digest_size = digest_size;
+        rr->ds.digest = memdup(digest, rr->ds.digest_size);
+        if (!rr->ds.digest)
+                return  -ENOMEM;
+
+        r = dns_answer_add(answer, rr, 0, DNS_ANSWER_AUTHENTICATED);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
+static int dns_trust_anchor_add_builtin_positive(DnsTrustAnchor *d) {
         _cleanup_(dns_answer_unrefp) DnsAnswer *answer = NULL;
+        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
         int r;
 
         assert(d);
@@ -62,35 +98,29 @@ static int dns_trust_anchor_add_builtin_positive(DnsTrustAnchor *d) {
         if (r < 0)
                 return r;
 
-        /* Only add the built-in trust anchor if there's neither a DS
-         * nor a DNSKEY defined for the root domain. That way users
-         * have an easy way to override the root domain DS/DNSKEY
-         * data. */
+        /* Only add the built-in trust anchor if there's neither a DS nor a DNSKEY defined for the root domain. That
+         * way users have an easy way to override the root domain DS/DNSKEY data. */
         if (dns_trust_anchor_knows_domain_positive(d, "."))
                 return 0;
 
-        /* Add the RR from https://data.iana.org/root-anchors/root-anchors.xml */
-        rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_DS, "");
-        if (!rr)
+        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_DS, "");
+        if (!key)
                 return -ENOMEM;
 
-        rr->ds.key_tag = 19036;
-        rr->ds.algorithm = DNSSEC_ALGORITHM_RSASHA256;
-        rr->ds.digest_type = DNSSEC_DIGEST_SHA256;
-        rr->ds.digest_size = sizeof(root_digest);
-        rr->ds.digest = memdup(root_digest, rr->ds.digest_size);
-        if (!rr->ds.digest)
-                return  -ENOMEM;
-
-        answer = dns_answer_new(1);
+        answer = dns_answer_new(2);
         if (!answer)
                 return -ENOMEM;
 
-        r = dns_answer_add(answer, rr, 0, DNS_ANSWER_AUTHENTICATED);
+        /* Add the two RRs from https://data.iana.org/root-anchors/root-anchors.xml */
+        r = add_root_ksk(answer, key, 19036, DNSSEC_ALGORITHM_RSASHA256, DNSSEC_DIGEST_SHA256, root_digest1, sizeof(root_digest1));
+        if (r < 0)
+                return r;
+
+        r = add_root_ksk(answer, key, 20326, DNSSEC_ALGORITHM_RSASHA256, DNSSEC_DIGEST_SHA256, root_digest2, sizeof(root_digest2));
         if (r < 0)
                 return r;
 
-        r = hashmap_put(d->positive_by_key, rr->key, answer);
+        r = hashmap_put(d->positive_by_key, key, answer);
         if (r < 0)
                 return r;
 
@@ -127,6 +157,9 @@ static int dns_trust_anchor_add_builtin_negative(DnsTrustAnchor *d) {
                 "31.172.in-addr.arpa\0"
                 "168.192.in-addr.arpa\0"
 
+                /* The same, but for IPv6. */
+                "d.f.ip6.arpa\0"
+
                 /* RFC 6762 reserves the .local domain for Multicast
                  * DNS, it hence cannot appear in the root zone. (Note
                  * that we by default do not route .local traffic to
@@ -544,10 +577,33 @@ int dns_trust_anchor_lookup_positive(DnsTrustAnchor *d, const DnsResourceKey *ke
 }
 
 int dns_trust_anchor_lookup_negative(DnsTrustAnchor *d, const char *name) {
+        int r;
+
         assert(d);
         assert(name);
 
-        return set_contains(d->negative_by_name, name);
+        for (;;) {
+                /* If the domain is listed as-is in the NTA database, then that counts */
+                if (set_contains(d->negative_by_name, name))
+                        return true;
+
+                /* If the domain isn't listed as NTA, but is listed as positive trust anchor, then that counts. See RFC
+                 * 7646, section 1.1 */
+                if (hashmap_contains(d->positive_by_key, &DNS_RESOURCE_KEY_CONST(DNS_CLASS_IN, DNS_TYPE_DS, name)))
+                        return false;
+
+                if (hashmap_contains(d->positive_by_key, &DNS_RESOURCE_KEY_CONST(DNS_CLASS_IN, DNS_TYPE_KEY, name)))
+                        return false;
+
+                /* And now, let's look at the parent, and check that too */
+                r = dns_name_parent(&name);
+                if (r < 0)
+                        return r;
+                if (r == 0)
+                        break;
+        }
+
+        return false;
 }
 
 static int dns_trust_anchor_revoked_put(DnsTrustAnchor *d, DnsResourceRecord *rr) {
@@ -591,7 +647,7 @@ static int dns_trust_anchor_remove_revoked(DnsTrustAnchor *d, DnsResourceRecord
 
         /* We found the key! Warn the user */
         log_struct(LOG_WARNING,
-                   LOG_MESSAGE_ID(SD_MESSAGE_DNSSEC_TRUST_ANCHOR_REVOKED),
+                   "MESSAGE_ID=" SD_MESSAGE_DNSSEC_TRUST_ANCHOR_REVOKED_STR,
                    LOG_MESSAGE("DNSSEC Trust anchor %s has been revoked. Please update the trust anchor, or upgrade your operating system."), strna(dns_resource_record_to_string(rr)),
                    "TRUST_ANCHOR=%s", dns_resource_record_to_string(rr),
                    NULL);
index 746a979..ad024b5 100644 (file)
@@ -196,6 +196,7 @@ static int dns_zone_item_probe_start(DnsZoneItem *i)  {
                 goto gc;
 
         i->probe_transaction = t;
+        t->probing = true;
 
         if (t->state == DNS_TRANSACTION_NULL) {
 
index a41df37..545ec95 100644 (file)
@@ -37,6 +37,9 @@ typedef enum DnsZoneItemState DnsZoneItemState;
 /* RFC 4795 Section 2.8. suggests a TTL of 30s by default */
 #define LLMNR_DEFAULT_TTL (30)
 
+/* RFC 6762 Section 10. suggests a TTL of 120s by default */
+#define MDNS_DEFAULT_TTL (120)
+
 enum DnsZoneItemState {
         DNS_ZONE_ITEM_PROBING,
         DNS_ZONE_ITEM_ESTABLISHED,
index 40d6509..0a28482 100644 (file)
@@ -431,8 +431,8 @@ int manager_etc_hosts_lookup(Manager *m, DnsQuestion* q, DnsAnswer **answer) {
         for (i = 0; i < bn->n_items; i++) {
                 _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
 
-                if ((found_a && bn->items[i]->family != AF_INET) &&
-                    (found_aaaa && bn->items[i]->family != AF_INET6))
+                if ((!found_a && bn->items[i]->family == AF_INET) ||
+                    (!found_aaaa && bn->items[i]->family == AF_INET6))
                         continue;
 
                 r = dns_resource_record_new_address(&rr, bn->items[i]->family, &bn->items[i]->address, bn->name);
@@ -444,5 +444,5 @@ int manager_etc_hosts_lookup(Manager *m, DnsQuestion* q, DnsAnswer **answer) {
                         return r;
         }
 
-        return 1;
+        return found_a || found_aaaa;
 }
index 2fd56bc..5153563 100644 (file)
@@ -14,9 +14,11 @@ struct ConfigPerfItem;
 %struct-type
 %includes
 %%
-Resolve.DNS,          config_parse_dns_servers,     DNS_SERVER_SYSTEM,   0
-Resolve.FallbackDNS,  config_parse_dns_servers,     DNS_SERVER_FALLBACK, 0
-Resolve.Domains,      config_parse_search_domains,  0,                   0
-Resolve.LLMNR,        config_parse_resolve_support, 0,                   offsetof(Manager, llmnr_support)
-Resolve.DNSSEC,       config_parse_dnssec_mode,     0,                   offsetof(Manager, dnssec_mode)
-Resolve.Cache,        config_parse_bool,            0,                   offsetof(Manager, enable_cache)
+Resolve.DNS,             config_parse_dns_servers,            DNS_SERVER_SYSTEM,   0
+Resolve.FallbackDNS,     config_parse_dns_servers,            DNS_SERVER_FALLBACK, 0
+Resolve.Domains,         config_parse_search_domains,         0,                   0
+Resolve.LLMNR,           config_parse_resolve_support,        0,                   offsetof(Manager, llmnr_support)
+Resolve.MulticastDNS,    config_parse_resolve_support,        0,                   offsetof(Manager, mdns_support)
+Resolve.DNSSEC,          config_parse_dnssec_mode,            0,                   offsetof(Manager, dnssec_mode)
+Resolve.Cache,           config_parse_bool,                   0,                   offsetof(Manager, enable_cache)
+Resolve.DNSStubListener, config_parse_dns_stub_listener_mode, 0,                   offsetof(Manager, dns_stub_listener_mode)
index 3648122..59cd6cf 100644 (file)
@@ -462,7 +462,7 @@ int bus_link_method_set_dnssec(sd_bus_message *message, void *userdata, sd_bus_e
 
 int bus_link_method_set_dnssec_negative_trust_anchors(sd_bus_message *message, void *userdata, sd_bus_error *error) {
         _cleanup_set_free_free_ Set *ns = NULL;
-        _cleanup_free_ char **ntas = NULL;
+        _cleanup_strv_free_ char **ntas = NULL;
         Link *l = userdata;
         int r;
         char **i;
index ea4a007..61a3f20 100644 (file)
@@ -28,6 +28,8 @@
 #include "mkdir.h"
 #include "parse-util.h"
 #include "resolved-link.h"
+#include "resolved-llmnr.h"
+#include "resolved-mdns.h"
 #include "string-util.h"
 #include "strv.h"
 
@@ -85,6 +87,10 @@ Link *link_free(Link *l) {
         if (!l)
                 return NULL;
 
+        /* Send goodbye messages. */
+        dns_scope_announce(l->mdns_ipv4_scope, true);
+        dns_scope_announce(l->mdns_ipv6_scope, true);
+
         link_flush_settings(l);
 
         while (l->addresses)
@@ -101,8 +107,7 @@ Link *link_free(Link *l) {
 
         free(l->state_file);
 
-        free(l);
-        return NULL;
+        return mfree(l);
 }
 
 void link_allocate_scopes(Link *l) {
@@ -308,6 +313,12 @@ void link_set_dnssec_mode(Link *l, DnssecMode mode) {
 
         assert(l);
 
+#ifndef HAVE_GCRYPT
+        if (mode == DNSSEC_YES || mode == DNSSEC_ALLOW_DOWNGRADE)
+                log_warning("DNSSEC option for the link cannot be enabled or set to allow-downgrade when systemd-resolved is built without gcrypt support. Turning off DNSSEC support.");
+        return;
+#endif
+
         if (l->dnssec_mode == mode)
                 return;
 
@@ -520,10 +531,25 @@ static void link_read_settings(Link *l) {
 }
 
 int link_update(Link *l) {
+        int r;
+
         assert(l);
 
         link_read_settings(l);
         link_load_user(l);
+
+        if (l->llmnr_support != RESOLVE_SUPPORT_NO) {
+                r = manager_llmnr_start(l->manager);
+                if (r < 0)
+                        return r;
+        }
+
+        if (l->mdns_support != RESOLVE_SUPPORT_NO) {
+                r = manager_mdns_start(l->manager);
+                if (r < 0)
+                        return r;
+        }
+
         link_allocate_scopes(l);
         link_add_rrs(l, false);
 
@@ -536,11 +562,11 @@ bool link_relevant(Link *l, int family, bool local_multicast) {
 
         assert(l);
 
-        /* A link is relevant for local multicast traffic if it isn't a loopback or pointopoint device, has a link
+        /* A link is relevant for local multicast traffic if it isn't a loopback device, has a link
          * beat, can do multicast and has at least one link-local (or better) IP address.
          *
          * A link is relevant for non-multicast traffic if it isn't a loopback device, has a link beat, and has at
-         * least one routable address.*/
+         * least one routable address. */
 
         if (l->flags & (IFF_LOOPBACK|IFF_DORMANT))
                 return false;
@@ -549,9 +575,6 @@ bool link_relevant(Link *l, int family, bool local_multicast) {
                 return false;
 
         if (local_multicast) {
-                if (l->flags & IFF_POINTOPOINT)
-                        return false;
-
                 if ((l->flags & IFF_MULTICAST) != IFF_MULTICAST)
                         return false;
         }
@@ -591,7 +614,7 @@ DnsServer* link_set_dns_server(Link *l, DnsServer *s) {
                 return s;
 
         if (s)
-                log_info("Switching to DNS server %s for interface %s.", dns_server_string(s), l->name);
+                log_debug("Switching to DNS server %s for interface %s.", dns_server_string(s), l->name);
 
         dns_server_unref(l->current_dns_server);
         l->current_dns_server = dns_server_ref(s);
@@ -666,6 +689,7 @@ int link_address_new(Link *l, LinkAddress **ret, int family, const union in_addr
 
         a->link = l;
         LIST_PREPEND(addresses, l->addresses, a);
+        l->n_addresses++;
 
         if (ret)
                 *ret = a;
@@ -680,6 +704,9 @@ LinkAddress *link_address_free(LinkAddress *a) {
         if (a->link) {
                 LIST_REMOVE(addresses, a->link->addresses, a);
 
+                assert(a->link->n_addresses > 0);
+                a->link->n_addresses--;
+
                 if (a->llmnr_address_rr) {
                         if (a->family == AF_INET && a->link->llmnr_ipv4_scope)
                                 dns_zone_remove_rr(&a->link->llmnr_ipv4_scope->zone, a->llmnr_address_rr);
@@ -693,13 +720,28 @@ LinkAddress *link_address_free(LinkAddress *a) {
                         else if (a->family == AF_INET6 && a->link->llmnr_ipv6_scope)
                                 dns_zone_remove_rr(&a->link->llmnr_ipv6_scope->zone, a->llmnr_ptr_rr);
                 }
+
+                if (a->mdns_address_rr) {
+                        if (a->family == AF_INET && a->link->mdns_ipv4_scope)
+                                dns_zone_remove_rr(&a->link->mdns_ipv4_scope->zone, a->mdns_address_rr);
+                        else if (a->family == AF_INET6 && a->link->mdns_ipv6_scope)
+                                dns_zone_remove_rr(&a->link->mdns_ipv6_scope->zone, a->mdns_address_rr);
+                }
+
+                if (a->mdns_ptr_rr) {
+                        if (a->family == AF_INET && a->link->mdns_ipv4_scope)
+                                dns_zone_remove_rr(&a->link->mdns_ipv4_scope->zone, a->mdns_ptr_rr);
+                        else if (a->family == AF_INET6 && a->link->mdns_ipv6_scope)
+                                dns_zone_remove_rr(&a->link->mdns_ipv6_scope->zone, a->mdns_ptr_rr);
+                }
         }
 
         dns_resource_record_unref(a->llmnr_address_rr);
         dns_resource_record_unref(a->llmnr_ptr_rr);
+        dns_resource_record_unref(a->mdns_address_rr);
+        dns_resource_record_unref(a->mdns_ptr_rr);
 
-        free(a);
-        return NULL;
+        return mfree(a);
 }
 
 void link_address_add_rrs(LinkAddress *a, bool force_remove) {
@@ -748,7 +790,7 @@ void link_address_add_rrs(LinkAddress *a, bool force_remove) {
 
                         r = dns_zone_put(&a->link->llmnr_ipv4_scope->zone, a->link->llmnr_ipv4_scope, a->llmnr_ptr_rr, false);
                         if (r < 0)
-                                log_warning_errno(r, "Failed to add IPv6 PTR record to LLMNR zone: %m");
+                                log_warning_errno(r, "Failed to add IPv4 PTR record to LLMNR zone: %m");
                 } else {
                         if (a->llmnr_address_rr) {
                                 if (a->link->llmnr_ipv4_scope)
@@ -762,6 +804,59 @@ void link_address_add_rrs(LinkAddress *a, bool force_remove) {
                                 a->llmnr_ptr_rr = dns_resource_record_unref(a->llmnr_ptr_rr);
                         }
                 }
+
+                if (!force_remove &&
+                    link_address_relevant(a, true) &&
+                    a->link->mdns_ipv4_scope &&
+                    a->link->mdns_support == RESOLVE_SUPPORT_YES &&
+                    a->link->manager->mdns_support == RESOLVE_SUPPORT_YES) {
+                        if (!a->link->manager->mdns_host_ipv4_key) {
+                                a->link->manager->mdns_host_ipv4_key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, a->link->manager->mdns_hostname);
+                                if (!a->link->manager->mdns_host_ipv4_key) {
+                                        r = -ENOMEM;
+                                        goto fail;
+                                }
+                        }
+
+                        if (!a->mdns_address_rr) {
+                                a->mdns_address_rr = dns_resource_record_new(a->link->manager->mdns_host_ipv4_key);
+                                if (!a->mdns_address_rr) {
+                                        r = -ENOMEM;
+                                        goto fail;
+                                }
+
+                                a->mdns_address_rr->a.in_addr = a->in_addr.in;
+                                a->mdns_address_rr->ttl = MDNS_DEFAULT_TTL;
+                        }
+
+                        if (!a->mdns_ptr_rr) {
+                                r = dns_resource_record_new_reverse(&a->mdns_ptr_rr, a->family, &a->in_addr, a->link->manager->mdns_hostname);
+                                if (r < 0)
+                                        goto fail;
+
+                                a->mdns_ptr_rr->ttl = MDNS_DEFAULT_TTL;
+                        }
+
+                        r = dns_zone_put(&a->link->mdns_ipv4_scope->zone, a->link->mdns_ipv4_scope, a->mdns_address_rr, true);
+                        if (r < 0)
+                                log_warning_errno(r, "Failed to add A record to MDNS zone: %m");
+
+                        r = dns_zone_put(&a->link->mdns_ipv4_scope->zone, a->link->mdns_ipv4_scope, a->mdns_ptr_rr, false);
+                        if (r < 0)
+                                log_warning_errno(r, "Failed to add IPv4 PTR record to MDNS zone: %m");
+                } else {
+                        if (a->mdns_address_rr) {
+                                if (a->link->mdns_ipv4_scope)
+                                        dns_zone_remove_rr(&a->link->mdns_ipv4_scope->zone, a->mdns_address_rr);
+                                a->mdns_address_rr = dns_resource_record_unref(a->mdns_address_rr);
+                        }
+
+                        if (a->mdns_ptr_rr) {
+                                if (a->link->mdns_ipv4_scope)
+                                        dns_zone_remove_rr(&a->link->mdns_ipv4_scope->zone, a->mdns_ptr_rr);
+                                a->mdns_ptr_rr = dns_resource_record_unref(a->mdns_ptr_rr);
+                        }
+                }
         }
 
         if (a->family == AF_INET6) {
@@ -819,6 +914,60 @@ void link_address_add_rrs(LinkAddress *a, bool force_remove) {
                                 a->llmnr_ptr_rr = dns_resource_record_unref(a->llmnr_ptr_rr);
                         }
                 }
+
+                if (!force_remove &&
+                    link_address_relevant(a, true) &&
+                    a->link->mdns_ipv6_scope &&
+                    a->link->mdns_support == RESOLVE_SUPPORT_YES &&
+                    a->link->manager->mdns_support == RESOLVE_SUPPORT_YES) {
+
+                        if (!a->link->manager->mdns_host_ipv6_key) {
+                                a->link->manager->mdns_host_ipv6_key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, a->link->manager->mdns_hostname);
+                                if (!a->link->manager->mdns_host_ipv6_key) {
+                                        r = -ENOMEM;
+                                        goto fail;
+                                }
+                        }
+
+                        if (!a->mdns_address_rr) {
+                                a->mdns_address_rr = dns_resource_record_new(a->link->manager->mdns_host_ipv6_key);
+                                if (!a->mdns_address_rr) {
+                                        r = -ENOMEM;
+                                        goto fail;
+                                }
+
+                                a->mdns_address_rr->aaaa.in6_addr = a->in_addr.in6;
+                                a->mdns_address_rr->ttl = MDNS_DEFAULT_TTL;
+                        }
+
+                        if (!a->mdns_ptr_rr) {
+                                r = dns_resource_record_new_reverse(&a->mdns_ptr_rr, a->family, &a->in_addr, a->link->manager->mdns_hostname);
+                                if (r < 0)
+                                        goto fail;
+
+                                a->mdns_ptr_rr->ttl = MDNS_DEFAULT_TTL;
+                        }
+
+                        r = dns_zone_put(&a->link->mdns_ipv6_scope->zone, a->link->mdns_ipv6_scope, a->mdns_address_rr, true);
+                        if (r < 0)
+                                log_warning_errno(r, "Failed to add AAAA record to MDNS zone: %m");
+
+                        r = dns_zone_put(&a->link->mdns_ipv6_scope->zone, a->link->mdns_ipv6_scope, a->mdns_ptr_rr, false);
+                        if (r < 0)
+                                log_warning_errno(r, "Failed to add IPv6 PTR record to MDNS zone: %m");
+                } else {
+                        if (a->mdns_address_rr) {
+                                if (a->link->mdns_ipv6_scope)
+                                        dns_zone_remove_rr(&a->link->mdns_ipv6_scope->zone, a->mdns_address_rr);
+                                a->mdns_address_rr = dns_resource_record_unref(a->mdns_address_rr);
+                        }
+
+                        if (a->mdns_ptr_rr) {
+                                if (a->link->mdns_ipv6_scope)
+                                        dns_zone_remove_rr(&a->link->mdns_ipv6_scope->zone, a->mdns_ptr_rr);
+                                a->mdns_ptr_rr = dns_resource_record_unref(a->mdns_ptr_rr);
+                        }
+                }
         }
 
         return;
@@ -999,6 +1148,7 @@ int link_load_user(Link *l) {
                 *ntas = NULL;
 
         ResolveSupport s;
+        const char *p;
         int r;
 
         assert(l);
@@ -1039,48 +1189,40 @@ int link_load_user(Link *l) {
         /* If we can't recognize the DNSSEC setting, then set it to invalid, so that the daemon default is used. */
         l->dnssec_mode = dnssec_mode_from_string(dnssec);
 
-        if (servers) {
-                const char *p = servers;
-
-                for (;;) {
-                        _cleanup_free_ char *word = NULL;
+        for (p = servers;;) {
+                _cleanup_free_ char *word = NULL;
 
-                        r = extract_first_word(&p, &word, NULL, 0);
-                        if (r < 0)
-                                goto fail;
-                        if (r == 0)
-                                break;
+                r = extract_first_word(&p, &word, NULL, 0);
+                if (r < 0)
+                        goto fail;
+                if (r == 0)
+                        break;
 
-                        r = link_update_dns_server_one(l, word);
-                        if (r < 0) {
-                                log_debug_errno(r, "Failed to load DNS server '%s', ignoring: %m", word);
-                                continue;
-                        }
+                r = link_update_dns_server_one(l, word);
+                if (r < 0) {
+                        log_debug_errno(r, "Failed to load DNS server '%s', ignoring: %m", word);
+                        continue;
                 }
         }
 
-        if (domains) {
-                const char *p = domains;
-
-                for (;;) {
-                        _cleanup_free_ char *word = NULL;
-                        const char *n;
-                        bool is_route;
+        for (p = domains;;) {
+                _cleanup_free_ char *word = NULL;
+                const char *n;
+                bool is_route;
 
-                        r = extract_first_word(&p, &word, NULL, 0);
-                        if (r < 0)
-                                goto fail;
-                        if (r == 0)
-                                break;
+                r = extract_first_word(&p, &word, NULL, 0);
+                if (r < 0)
+                        goto fail;
+                if (r == 0)
+                        break;
 
-                        is_route = word[0] == '~';
-                        n = is_route ? word + 1 : word;
+                is_route = word[0] == '~';
+                n = is_route ? word + 1 : word;
 
-                        r = link_update_search_domain_one(l, n, is_route);
-                        if (r < 0) {
-                                log_debug_errno(r, "Failed to load search domain '%s', ignoring: %m", word);
-                                continue;
-                        }
+                r = link_update_search_domain_one(l, n, is_route);
+                if (r < 0) {
+                        log_debug_errno(r, "Failed to load search domain '%s', ignoring: %m", word);
+                        continue;
                 }
         }
 
index 6a2343f..55a56b7 100644 (file)
@@ -29,6 +29,7 @@ typedef struct Link Link;
 typedef struct LinkAddress LinkAddress;
 
 #include "resolved-dns-rr.h"
+#include "resolved-dns-scope.h"
 #include "resolved-dns-search-domain.h"
 #include "resolved-dns-server.h"
 #include "resolved-manager.h"
@@ -46,6 +47,8 @@ struct LinkAddress {
 
         DnsResourceRecord *llmnr_address_rr;
         DnsResourceRecord *llmnr_ptr_rr;
+        DnsResourceRecord *mdns_address_rr;
+        DnsResourceRecord *mdns_ptr_rr;
 
         LIST_FIELDS(LinkAddress, addresses);
 };
@@ -57,6 +60,7 @@ struct Link {
         unsigned flags;
 
         LIST_HEAD(LinkAddress, addresses);
+        unsigned n_addresses;
 
         LIST_HEAD(DnsServer, dns_servers);
         DnsServer *current_dns_server;
index 3516af5..29396e9 100644 (file)
@@ -77,7 +77,7 @@ int manager_llmnr_start(Manager *m) {
         return 0;
 
 eaddrinuse:
-        log_warning("There appears to be another LLMNR responder running. Turning off LLMNR support.");
+        log_warning("Another LLMNR responder prohibits binding the socket to the same port. Turning off LLMNR support.");
         m->llmnr_support = RESOLVE_SUPPORT_NO;
         manager_llmnr_stop(m);
 
@@ -136,56 +136,75 @@ int manager_llmnr_ipv4_udp_fd(Manager *m) {
 
         m->llmnr_ipv4_udp_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
         if (m->llmnr_ipv4_udp_fd < 0)
-                return -errno;
+                return log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to create socket: %m");
 
         /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
         r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set IP_TTL: %m");
                 goto fail;
         }
 
         r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set IP_MULTICAST_TTL: %m");
                 goto fail;
         }
 
         r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
-
-        r = setsockopt(m->llmnr_ipv4_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
-        if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set IP_MULTICAST_LOOP: %m");
                 goto fail;
         }
 
         r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set IP_PKTINFO: %m");
                 goto fail;
         }
 
         r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set IP_RECVTTL: %m");
                 goto fail;
         }
 
         /* Disable Don't-Fragment bit in the IP header */
         r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set IP_MTU_DISCOVER: %m");
                 goto fail;
         }
 
+        /* first try to bind without SO_REUSEADDR to detect another LLMNR responder */
         r = bind(m->llmnr_ipv4_udp_fd, &sa.sa, sizeof(sa.in));
         if (r < 0) {
-                r = -errno;
-                goto fail;
+                if (errno != EADDRINUSE) {
+                        r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to bind socket: %m");
+                        goto fail;
+                }
+
+                log_warning("LLMNR-IPv4(UDP): There appears to be another LLMNR responder running, or previously systemd-resolved crashed with some outstanding transfers.");
+
+                /* try again with SO_REUSEADDR */
+                r = setsockopt(m->llmnr_ipv4_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+                if (r < 0) {
+                        r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set SO_REUSEADDR: %m");
+                        goto fail;
+                }
+
+                r = bind(m->llmnr_ipv4_udp_fd, &sa.sa, sizeof(sa.in));
+                if (r < 0) {
+                        r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to bind socket: %m");
+                        goto fail;
+                }
+        } else {
+                /* enable SO_REUSEADDR for the case that the user really wants multiple LLMNR responders */
+                r = setsockopt(m->llmnr_ipv4_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+                if (r < 0) {
+                        r = log_error_errno(errno, "LLMNR-IPv4(UDP): Failed to set SO_REUSEADDR: %m");
+                        goto fail;
+                }
         }
 
         r = sd_event_add_io(m->event, &m->llmnr_ipv4_udp_event_source, m->llmnr_ipv4_udp_fd, EPOLLIN, on_llmnr_packet, m);
@@ -216,55 +235,74 @@ int manager_llmnr_ipv6_udp_fd(Manager *m) {
 
         m->llmnr_ipv6_udp_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
         if (m->llmnr_ipv6_udp_fd < 0)
-                return -errno;
+                return log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to create socket: %m");
 
         r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl, sizeof(ttl));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set IPV6_UNICAST_HOPS: %m");
                 goto fail;
         }
 
         /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
         r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl, sizeof(ttl));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set IPV6_MULTICAST_HOPS: %m");
                 goto fail;
         }
 
         r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set IPV6_MULTICAST_LOOP: %m");
                 goto fail;
         }
 
         r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
-
-        r = setsockopt(m->llmnr_ipv6_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
-        if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set IPV6_V6ONLY: %m");
                 goto fail;
         }
 
         r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set IPV6_RECVPKTINFO: %m");
                 goto fail;
         }
 
         r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set IPV6_RECVHOPLIMIT: %m");
                 goto fail;
         }
 
+        /* first try to bind without SO_REUSEADDR to detect another LLMNR responder */
         r = bind(m->llmnr_ipv6_udp_fd, &sa.sa, sizeof(sa.in6));
         if (r < 0) {
-                r = -errno;
-                goto fail;
+                if (errno != EADDRINUSE) {
+                        r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to bind socket: %m");
+                        goto fail;
+                }
+
+                log_warning("LLMNR-IPv6(UDP): There appears to be another LLMNR responder running, or previously systemd-resolved crashed with some outstanding transfers.");
+
+                /* try again with SO_REUSEADDR */
+                r = setsockopt(m->llmnr_ipv6_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+                if (r < 0) {
+                        r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set SO_REUSEADDR: %m");
+                        goto fail;
+                }
+
+                r = bind(m->llmnr_ipv6_udp_fd, &sa.sa, sizeof(sa.in6));
+                if (r < 0) {
+                        r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to bind socket: %m");
+                        goto fail;
+                }
+        } else {
+                /* enable SO_REUSEADDR for the case that the user really wants multiple LLMNR responders */
+                r = setsockopt(m->llmnr_ipv6_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+                if (r < 0) {
+                        r = log_error_errno(errno, "LLMNR-IPv6(UDP): Failed to set SO_REUSEADDR: %m");
+                        goto fail;
+                }
         }
 
         r = sd_event_add_io(m->event, &m->llmnr_ipv6_udp_event_source, m->llmnr_ipv6_udp_fd, EPOLLIN, on_llmnr_packet, m);
@@ -338,49 +376,68 @@ int manager_llmnr_ipv4_tcp_fd(Manager *m) {
 
         m->llmnr_ipv4_tcp_fd = socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
         if (m->llmnr_ipv4_tcp_fd < 0)
-                return -errno;
+                return log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to create socket: %m");
 
         /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
         r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_TTL, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
-
-        r = setsockopt(m->llmnr_ipv4_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
-        if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to set IP_TTL: %m");
                 goto fail;
         }
 
         r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to set IP_PKTINFO: %m");
                 goto fail;
         }
 
         r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to set IP_RECVTTL: %m");
                 goto fail;
         }
 
         /* Disable Don't-Fragment bit in the IP header */
         r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to set IP_MTU_DISCOVER: %m");
                 goto fail;
         }
 
+        /* first try to bind without SO_REUSEADDR to detect another LLMNR responder */
         r = bind(m->llmnr_ipv4_tcp_fd, &sa.sa, sizeof(sa.in));
         if (r < 0) {
-                r = -errno;
-                goto fail;
+                if (errno != EADDRINUSE) {
+                        r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to bind socket: %m");
+                        goto fail;
+                }
+
+                log_warning("LLMNR-IPv4(TCP): There appears to be another LLMNR responder running, or previously systemd-resolved crashed with some outstanding transfers.");
+
+                /* try again with SO_REUSEADDR */
+                r = setsockopt(m->llmnr_ipv4_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+                if (r < 0) {
+                        r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to set SO_REUSEADDR: %m");
+                        goto fail;
+                }
+
+                r = bind(m->llmnr_ipv4_tcp_fd, &sa.sa, sizeof(sa.in));
+                if (r < 0) {
+                        r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to bind socket: %m");
+                        goto fail;
+                }
+        } else {
+                /* enable SO_REUSEADDR for the case that the user really wants multiple LLMNR responders */
+                r = setsockopt(m->llmnr_ipv4_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+                if (r < 0) {
+                        r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to set SO_REUSEADDR: %m");
+                        goto fail;
+                }
         }
 
         r = listen(m->llmnr_ipv4_tcp_fd, SOMAXCONN);
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv4(TCP): Failed to listen the stream: %m");
                 goto fail;
         }
 
@@ -412,48 +469,67 @@ int manager_llmnr_ipv6_tcp_fd(Manager *m) {
 
         m->llmnr_ipv6_tcp_fd = socket(AF_INET6, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
         if (m->llmnr_ipv6_tcp_fd < 0)
-                return -errno;
+                return log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to create socket: %m");
 
         /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
         r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to set IPV6_UNICAST_HOPS: %m");
                 goto fail;
         }
 
         r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
-
-        r = setsockopt(m->llmnr_ipv6_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
-        if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to set IPV6_V6ONLY: %m");
                 goto fail;
         }
 
         r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to set IPV6_RECVPKTINFO: %m");
                 goto fail;
         }
 
         r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to set IPV6_RECVHOPLIMIT: %m");
                 goto fail;
         }
 
+        /* first try to bind without SO_REUSEADDR to detect another LLMNR responder */
         r = bind(m->llmnr_ipv6_tcp_fd, &sa.sa, sizeof(sa.in6));
         if (r < 0) {
-                r = -errno;
-                goto fail;
+                if (errno != EADDRINUSE) {
+                        r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to bind socket: %m");
+                        goto fail;
+                }
+
+                log_warning("LLMNR-IPv6(TCP): There appears to be another LLMNR responder running, or previously systemd-resolved crashed with some outstanding transfers.");
+
+                /* try again with SO_REUSEADDR */
+                r = setsockopt(m->llmnr_ipv6_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+                if (r < 0) {
+                        r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to set SO_REUSEADDR: %m");
+                        goto fail;
+                }
+
+                r = bind(m->llmnr_ipv6_tcp_fd, &sa.sa, sizeof(sa.in6));
+                if (r < 0) {
+                        r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to bind socket: %m");
+                        goto fail;
+                }
+        } else {
+                /* enable SO_REUSEADDR for the case that the user really wants multiple LLMNR responders */
+                r = setsockopt(m->llmnr_ipv6_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+                if (r < 0) {
+                        r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to set SO_REUSEADDR: %m");
+                        goto fail;
+                }
         }
 
         r = listen(m->llmnr_ipv6_tcp_fd, SOMAXCONN);
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "LLMNR-IPv6(TCP): Failed to listen the stream: %m");
                 goto fail;
         }
 
index 92ade82..b662087 100644 (file)
 #include <poll.h>
 #include <sys/ioctl.h>
 
+#ifdef HAVE_LIBIDN2
+#include <idn2.h>
+#endif
+
 #include "af-list.h"
 #include "alloc-util.h"
 #include "dirent-util.h"
@@ -322,32 +326,46 @@ static int manager_network_monitor_listen(Manager *m) {
         return 0;
 }
 
-static int determine_hostname(char **llmnr_hostname, char **mdns_hostname) {
+static int determine_hostname(char **full_hostname, char **llmnr_hostname, char **mdns_hostname) {
         _cleanup_free_ char *h = NULL, *n = NULL;
+#if defined(HAVE_LIBIDN2)
+        _cleanup_free_ char *utf8 = NULL;
+#elif defined(HAVE_LIBIDN)
+        int k;
+#endif
         char label[DNS_LABEL_MAX];
-        const char *p;
-        int r, k;
+        const char *p, *decoded;
+        int r;
 
+        assert(full_hostname);
         assert(llmnr_hostname);
         assert(mdns_hostname);
 
-        /* Extract and normalize the first label of the locally
-         * configured hostname, and check it's not "localhost". */
+        /* Extract and normalize the first label of the locally configured hostname, and check it's not "localhost". */
 
-        h = gethostname_malloc();
-        if (!h)
-                return log_oom();
+        r = gethostname_strict(&h);
+        if (r < 0)
+                return log_debug_errno(r, "Can't determine system hostname: %m");
 
         p = h;
-        r = dns_label_unescape(&p, label, sizeof(label));
+        r = dns_label_unescape(&p, label, sizeof label);
         if (r < 0)
                 return log_error_errno(r, "Failed to unescape host name: %m");
         if (r == 0) {
-                log_error("Couldn't find a single label in hosntame.");
+                log_error("Couldn't find a single label in hostname.");
                 return -EINVAL;
         }
 
-        k = dns_label_undo_idna(label, r, label, sizeof(label));
+#if defined(HAVE_LIBIDN2)
+        r = idn2_to_unicode_8z8z(label, &utf8, 0);
+        if (r != IDN2_OK)
+                return log_error("Failed to undo IDNA: %s", idn2_strerror(r));
+        assert(utf8_is_valid(utf8));
+
+        r = strlen(utf8);
+        decoded = utf8;
+#elif defined(HAVE_LIBIDN)
+        k = dns_label_undo_idna(label, r, label, sizeof label);
         if (k < 0)
                 return log_error_errno(k, "Failed to undo IDNA: %m");
         if (k > 0)
@@ -357,8 +375,12 @@ static int determine_hostname(char **llmnr_hostname, char **mdns_hostname) {
                 log_error("System hostname is not UTF-8 clean.");
                 return -EINVAL;
         }
+        decoded = label;
+#else
+        decoded = label; /* no decoding */
+#endif
 
-        r = dns_label_escape_new(label, r, &n);
+        r = dns_label_escape_new(decoded, r, &n);
         if (r < 0)
                 return log_error_errno(r, "Failed to escape host name: %m");
 
@@ -374,32 +396,84 @@ static int determine_hostname(char **llmnr_hostname, char **mdns_hostname) {
         *llmnr_hostname = n;
         n = NULL;
 
+        *full_hostname = h;
+        h = NULL;
+
+        return 0;
+}
+
+static const char *fallback_hostname(void) {
+
+        /* Determine the fall back hostname. For exposing this system to the outside world, we cannot have it to be
+         * "localhost" even if that's the compiled in hostname. In this case, let's revert to "linux" instead. */
+
+        if (is_localhost(FALLBACK_HOSTNAME))
+                return "linux";
+
+        return FALLBACK_HOSTNAME;
+}
+
+static int make_fallback_hostnames(char **full_hostname, char **llmnr_hostname, char **mdns_hostname) {
+        _cleanup_free_ char *n = NULL, *m = NULL;
+        char label[DNS_LABEL_MAX], *h;
+        const char *p;
+        int r;
+
+        assert(full_hostname);
+        assert(llmnr_hostname);
+        assert(mdns_hostname);
+
+        p = fallback_hostname();
+        r = dns_label_unescape(&p, label, sizeof(label));
+        if (r < 0)
+                return log_error_errno(r, "Failed to unescape fallback host name: %m");
+
+        assert(r > 0); /* The fallback hostname must have at least one label */
+
+        r = dns_label_escape_new(label, r, &n);
+        if (r < 0)
+                return log_error_errno(r, "Failed to escape fallback hostname: %m");
+
+        r = dns_name_concat(n, "local", &m);
+        if (r < 0)
+                return log_error_errno(r, "Failed to concatenate mDNS hostname: %m");
+
+        h = strdup(fallback_hostname());
+        if (!h)
+                return log_oom();
+
+        *llmnr_hostname = n;
+        n = NULL;
+
+        *mdns_hostname = m;
+        m = NULL;
+
+        *full_hostname = h;
+
         return 0;
 }
 
 static int on_hostname_change(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
-        _cleanup_free_ char *llmnr_hostname = NULL, *mdns_hostname = NULL;
+        _cleanup_free_ char *full_hostname = NULL, *llmnr_hostname = NULL, *mdns_hostname = NULL;
         Manager *m = userdata;
         int r;
 
         assert(m);
 
-        r = determine_hostname(&llmnr_hostname, &mdns_hostname);
+        r = determine_hostname(&full_hostname, &llmnr_hostname, &mdns_hostname);
         if (r < 0)
                 return 0; /* ignore invalid hostnames */
 
-        if (streq(llmnr_hostname, m->llmnr_hostname) && streq(mdns_hostname, m->mdns_hostname))
+        if (streq(full_hostname, m->full_hostname) &&
+            streq(llmnr_hostname, m->llmnr_hostname) &&
+            streq(mdns_hostname, m->mdns_hostname))
                 return 0;
 
-        log_info("System hostname changed to '%s'.", llmnr_hostname);
-
-        free(m->llmnr_hostname);
-        free(m->mdns_hostname);
-
-        m->llmnr_hostname = llmnr_hostname;
-        m->mdns_hostname = mdns_hostname;
+        log_info("System hostname changed to '%s'.", full_hostname);
 
-        llmnr_hostname = mdns_hostname = NULL;
+        free_and_replace(m->full_hostname, full_hostname);
+        free_and_replace(m->llmnr_hostname, llmnr_hostname);
+        free_and_replace(m->mdns_hostname, mdns_hostname);
 
         manager_refresh_rrs(m);
 
@@ -428,18 +502,15 @@ static int manager_watch_hostname(Manager *m) {
 
         (void) sd_event_source_set_description(m->hostname_event_source, "hostname");
 
-        r = determine_hostname(&m->llmnr_hostname, &m->mdns_hostname);
+        r = determine_hostname(&m->full_hostname, &m->llmnr_hostname, &m->mdns_hostname);
         if (r < 0) {
-                log_info("Defaulting to hostname 'linux'.");
-                m->llmnr_hostname = strdup("linux");
-                if (!m->llmnr_hostname)
-                        return log_oom();
-
-                m->mdns_hostname = strdup("linux.local");
-                if (!m->mdns_hostname)
-                        return log_oom();
+                log_info("Defaulting to hostname '%s'.", fallback_hostname());
+
+                r = make_fallback_hostnames(&m->full_hostname, &m->llmnr_hostname, &m->mdns_hostname);
+                if (r < 0)
+                        return r;
         } else
-                log_info("Using system hostname '%s'.", m->llmnr_hostname);
+                log_info("Using system hostname '%s'.", m->full_hostname);
 
         return 0;
 }
@@ -498,9 +569,10 @@ int manager_new(Manager **ret) {
         m->hostname_fd = -1;
 
         m->llmnr_support = RESOLVE_SUPPORT_YES;
-        m->mdns_support = RESOLVE_SUPPORT_NO;
+        m->mdns_support = RESOLVE_SUPPORT_YES;
         m->dnssec_mode = DEFAULT_DNSSEC_MODE;
         m->enable_cache = true;
+        m->dns_stub_listener_mode = DNS_STUB_LISTENER_UDP;
         m->read_resolv_conf = true;
         m->need_builtin_fallbacks = true;
         m->etc_hosts_last = m->etc_hosts_mtime = USEC_INFINITY;
@@ -511,7 +583,7 @@ int manager_new(Manager **ret) {
 
         r = manager_parse_config_file(m);
         if (r < 0)
-                return r;
+                log_warning_errno(r, "Failed to parse configuration file: %m");
 
         r = sd_event_default(&m->event);
         if (r < 0)
@@ -562,14 +634,6 @@ int manager_start(Manager *m) {
         if (r < 0)
                 return r;
 
-        r = manager_llmnr_start(m);
-        if (r < 0)
-                return r;
-
-        r = manager_mdns_start(m);
-        if (r < 0)
-                return r;
-
         return 0;
 }
 
@@ -620,18 +684,20 @@ Manager *manager_free(Manager *m) {
 
         dns_resource_key_unref(m->llmnr_host_ipv4_key);
         dns_resource_key_unref(m->llmnr_host_ipv6_key);
+        dns_resource_key_unref(m->mdns_host_ipv4_key);
+        dns_resource_key_unref(m->mdns_host_ipv6_key);
 
         sd_event_source_unref(m->hostname_event_source);
         safe_close(m->hostname_fd);
+
+        free(m->full_hostname);
         free(m->llmnr_hostname);
         free(m->mdns_hostname);
 
         dns_trust_anchor_flush(&m->trust_anchor);
         manager_etc_hosts_flush(m);
 
-        free(m);
-
-        return NULL;
+        return mfree(m);
 }
 
 int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) {
@@ -1008,6 +1074,8 @@ void manager_refresh_rrs(Manager *m) {
 
         m->llmnr_host_ipv4_key = dns_resource_key_unref(m->llmnr_host_ipv4_key);
         m->llmnr_host_ipv6_key = dns_resource_key_unref(m->llmnr_host_ipv6_key);
+        m->mdns_host_ipv4_key = dns_resource_key_unref(m->mdns_host_ipv4_key);
+        m->mdns_host_ipv6_key = dns_resource_key_unref(m->mdns_host_ipv6_key);
 
         HASHMAP_FOREACH(l, m->links, i) {
                 link_add_rrs(l, true);
@@ -1147,8 +1215,14 @@ int manager_is_own_hostname(Manager *m, const char *name) {
                         return r;
         }
 
-        if (m->mdns_hostname)
-                return dns_name_equal(name, m->mdns_hostname);
+        if (m->mdns_hostname) {
+                r = dns_name_equal(name, m->mdns_hostname);
+                if (r != 0)
+                        return r;
+        }
+
+        if (m->full_hostname)
+                return dns_name_equal(name, m->full_hostname);
 
         return 0;
 }
@@ -1350,7 +1424,7 @@ void manager_cleanup_saved_user(Manager *m) {
                 if (!IN_SET(de->d_type, DT_UNKNOWN, DT_REG))
                         continue;
 
-                if (STR_IN_SET(de->d_name, ".", ".."))
+                if (dot_or_dot_dot(de->d_name))
                         continue;
 
                 r = parse_ifindex(de->d_name, &ifindex);
index deebd8e..97c52b7 100644 (file)
@@ -30,6 +30,7 @@
 
 typedef struct Manager Manager;
 
+#include "resolved-conf.h"
 #include "resolved-dns-query.h"
 #include "resolved-dns-search-domain.h"
 #include "resolved-dns-server.h"
@@ -47,6 +48,7 @@ struct Manager {
         ResolveSupport mdns_support;
         DnssecMode dnssec_mode;
         bool enable_cache;
+        DnsStubListenerMode dns_stub_listener_mode;
 
         /* Network */
         Hashmap *links;
@@ -107,10 +109,13 @@ struct Manager {
         sd_event_source *bus_retry_event_source;
 
         /* The hostname we publish on LLMNR and mDNS */
+        char *full_hostname;
         char *llmnr_hostname;
         char *mdns_hostname;
         DnsResourceKey *llmnr_host_ipv4_key;
         DnsResourceKey *llmnr_host_ipv6_key;
+        DnsResourceKey *mdns_host_ipv4_key;
+        DnsResourceKey *mdns_host_ipv6_key;
 
         /* Watch the system hostname */
         int hostname_fd;
index b13b1d0..415dc1a 100644 (file)
@@ -60,13 +60,57 @@ int manager_mdns_start(Manager *m) {
         return 0;
 
 eaddrinuse:
-        log_warning("There appears to be another mDNS responder running. Turning off mDNS support.");
+        log_warning("Another mDNS responder prohibits binding the socket to the same port. Turning off mDNS support.");
         m->mdns_support = RESOLVE_SUPPORT_NO;
         manager_mdns_stop(m);
 
         return 0;
 }
 
+static int mdns_scope_process_query(DnsScope *s, DnsPacket *p) {
+        _cleanup_(dns_answer_unrefp) DnsAnswer *answer = NULL, *soa = NULL;
+        _cleanup_(dns_packet_unrefp) DnsPacket *reply = NULL;
+        DnsResourceKey *key = NULL;
+        bool tentative = false;
+        int r;
+
+        assert(s);
+        assert(p);
+
+        r = dns_packet_extract(p);
+        if (r < 0)
+                return log_debug_errno(r, "Failed to extract resource records from incoming packet: %m");
+
+        /* TODO: there might be more than one question in mDNS queries. */
+        assert_return((dns_question_size(p->question) > 0), -EINVAL);
+        key = p->question->keys[0];
+
+        r = dns_zone_lookup(&s->zone, key, 0, &answer, &soa, &tentative);
+        if (r < 0) {
+                log_debug_errno(r, "Failed to lookup key: %m");
+                return r;
+        }
+        if (r == 0)
+                return 0;
+
+        r = dns_scope_make_reply_packet(s, DNS_PACKET_ID(p), DNS_RCODE_SUCCESS, NULL, answer, NULL, false, &reply);
+        if (r < 0) {
+                log_debug_errno(r, "Failed to build reply packet: %m");
+                return r;
+        }
+
+        if (!ratelimit_test(&s->ratelimit))
+                return 0;
+
+        r = dns_scope_emit_udp(s, -1, reply);
+        if (r < 0) {
+                log_debug_errno(r, "Failed to send reply packet: %m");
+                return r;
+        }
+
+        return 0;
+}
+
 static int on_mdns_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
         _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
         Manager *m = userdata;
@@ -77,6 +121,9 @@ static int on_mdns_packet(sd_event_source *s, int fd, uint32_t revents, void *us
         if (r <= 0)
                 return r;
 
+        if (manager_our_packet(m, p))
+                return 0;
+
         scope = manager_find_scope(m, p);
         if (!scope) {
                 log_warning("Got mDNS UDP packet on unknown scope. Ignoring.");
@@ -115,9 +162,28 @@ static int on_mdns_packet(sd_event_source *s, int fd, uint32_t revents, void *us
                               dns_name_endswith(name, "local") > 0))
                                 return 0;
 
+                        if (rr->ttl == 0) {
+                                log_debug("Got a goodbye packet");
+                                /* See the section 10.1 of RFC6762 */
+                                rr->ttl = 1;
+                        }
+
                         t = dns_scope_find_transaction(scope, rr->key, false);
                         if (t)
                                 dns_transaction_process_reply(t, p);
+
+                        /* Also look for the various types of ANY transactions */
+                        t = dns_scope_find_transaction(scope, &DNS_RESOURCE_KEY_CONST(rr->key->class, DNS_TYPE_ANY, dns_resource_key_name(rr->key)), false);
+                        if (t)
+                                dns_transaction_process_reply(t, p);
+
+                        t = dns_scope_find_transaction(scope, &DNS_RESOURCE_KEY_CONST(DNS_CLASS_ANY, rr->key->type, dns_resource_key_name(rr->key)), false);
+                        if (t)
+                                dns_transaction_process_reply(t, p);
+
+                        t = dns_scope_find_transaction(scope, &DNS_RESOURCE_KEY_CONST(DNS_CLASS_ANY, DNS_TYPE_ANY, dns_resource_key_name(rr->key)), false);
+                        if (t)
+                                dns_transaction_process_reply(t, p);
                 }
 
                 dns_cache_put(&scope->cache, NULL, DNS_PACKET_RCODE(p), p->answer, false, (uint32_t) -1, 0, p->family, &p->sender);
@@ -125,7 +191,11 @@ static int on_mdns_packet(sd_event_source *s, int fd, uint32_t revents, void *us
         } else if (dns_packet_validate_query(p) > 0)  {
                 log_debug("Got mDNS query packet for id %u", DNS_PACKET_ID(p));
 
-                dns_scope_process_query(scope, NULL, p);
+                r = mdns_scope_process_query(scope, p);
+                if (r < 0) {
+                        log_debug_errno(r, "mDNS query processing failed: %m");
+                        return 0;
+                }
         } else
                 log_debug("Invalid mDNS UDP packet.");
 
@@ -147,55 +217,75 @@ int manager_mdns_ipv4_fd(Manager *m) {
 
         m->mdns_ipv4_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
         if (m->mdns_ipv4_fd < 0)
-                return -errno;
+                return log_error_errno(errno, "mDNS-IPv4: Failed to create socket: %m");
 
         r = setsockopt(m->mdns_ipv4_fd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "mDNS-IPv4: Failed to set IP_TTL: %m");
                 goto fail;
         }
 
         r = setsockopt(m->mdns_ipv4_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "mDNS-IPv4: Failed to set IP_MULTICAST_TTL: %m");
                 goto fail;
         }
 
         r = setsockopt(m->mdns_ipv4_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
-
-        r = setsockopt(m->mdns_ipv4_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
-        if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "mDNS-IPv4: Failed to set IP_MULTICAST_LOOP: %m");
                 goto fail;
         }
 
         r = setsockopt(m->mdns_ipv4_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "mDNS-IPv4: Failed to set IP_PKTINFO: %m");
                 goto fail;
         }
 
         r = setsockopt(m->mdns_ipv4_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "mDNS-IPv4: Failed to set IP_RECVTTL: %m");
                 goto fail;
         }
 
         /* Disable Don't-Fragment bit in the IP header */
         r = setsockopt(m->mdns_ipv4_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "mDNS-IPv4: Failed to set IP_MTU_DISCOVER: %m");
                 goto fail;
         }
 
+        /* See the section 15.1 of RFC6762 */
+        /* first try to bind without SO_REUSEADDR to detect another mDNS responder */
         r = bind(m->mdns_ipv4_fd, &sa.sa, sizeof(sa.in));
         if (r < 0) {
-                r = -errno;
-                goto fail;
+                if (errno != EADDRINUSE) {
+                        r = log_error_errno(errno, "mDNS-IPv4: Failed to bind socket: %m");
+                        goto fail;
+                }
+
+                log_warning("mDNS-IPv4: There appears to be another mDNS responder running, or previously systemd-resolved crashed with some outstanding transfers.");
+
+                /* try again with SO_REUSEADDR */
+                r = setsockopt(m->mdns_ipv4_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+                if (r < 0) {
+                        r = log_error_errno(errno, "mDNS-IPv4: Failed to set SO_REUSEADDR: %m");
+                        goto fail;
+                }
+
+                r = bind(m->mdns_ipv4_fd, &sa.sa, sizeof(sa.in));
+                if (r < 0) {
+                        r = log_error_errno(errno, "mDNS-IPv4: Failed to bind socket: %m");
+                        goto fail;
+                }
+        } else {
+                /* enable SO_REUSEADDR for the case that the user really wants multiple mDNS responders */
+                r = setsockopt(m->mdns_ipv4_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+                if (r < 0) {
+                        r = log_error_errno(errno, "mDNS-IPv4: Failed to set SO_REUSEADDR: %m");
+                        goto fail;
+                }
         }
 
         r = sd_event_add_io(m->event, &m->mdns_ipv4_event_source, m->mdns_ipv4_fd, EPOLLIN, on_mdns_packet, m);
@@ -224,55 +314,75 @@ int manager_mdns_ipv6_fd(Manager *m) {
 
         m->mdns_ipv6_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
         if (m->mdns_ipv6_fd < 0)
-                return -errno;
+                return log_error_errno(errno, "mDNS-IPv6: Failed to create socket: %m");
 
         r = setsockopt(m->mdns_ipv6_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl, sizeof(ttl));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "mDNS-IPv6: Failed to set IPV6_UNICAST_HOPS: %m");
                 goto fail;
         }
 
         /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
         r = setsockopt(m->mdns_ipv6_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl, sizeof(ttl));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "mDNS-IPv6: Failed to set IPV6_MULTICAST_HOPS: %m");
                 goto fail;
         }
 
         r = setsockopt(m->mdns_ipv6_fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "mDNS-IPv6: Failed to set IPV6_MULTICAST_LOOP: %m");
                 goto fail;
         }
 
         r = setsockopt(m->mdns_ipv6_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
-                goto fail;
-        }
-
-        r = setsockopt(m->mdns_ipv6_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
-        if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "mDNS-IPv6: Failed to set IPV6_V6ONLY: %m");
                 goto fail;
         }
 
         r = setsockopt(m->mdns_ipv6_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "mDNS-IPv6: Failed to set IPV6_RECVPKTINFO: %m");
                 goto fail;
         }
 
         r = setsockopt(m->mdns_ipv6_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
         if (r < 0) {
-                r = -errno;
+                r = log_error_errno(errno, "mDNS-IPv6: Failed to set IPV6_RECVHOPLIMIT: %m");
                 goto fail;
         }
 
+        /* See the section 15.1 of RFC6762 */
+        /* first try to bind without SO_REUSEADDR to detect another mDNS responder */
         r = bind(m->mdns_ipv6_fd, &sa.sa, sizeof(sa.in6));
         if (r < 0) {
-                r = -errno;
-                goto fail;
+                if (errno != EADDRINUSE) {
+                        r = log_error_errno(errno, "mDNS-IPv6: Failed to bind socket: %m");
+                        goto fail;
+                }
+
+                log_warning("mDNS-IPv6: There appears to be another mDNS responder running, or previously systemd-resolved crashed with some outstanding transfers.");
+
+                /* try again with SO_REUSEADDR */
+                r = setsockopt(m->mdns_ipv6_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+                if (r < 0) {
+                        r = log_error_errno(errno, "mDNS-IPv6: Failed to set SO_REUSEADDR: %m");
+                        goto fail;
+                }
+
+                r = bind(m->mdns_ipv6_fd, &sa.sa, sizeof(sa.in6));
+                if (r < 0) {
+                        r = log_error_errno(errno, "mDNS-IPv6: Failed to bind socket: %m");
+                        goto fail;
+                }
+        } else {
+                /* enable SO_REUSEADDR for the case that the user really wants multiple mDNS responders */
+                r = setsockopt(m->mdns_ipv6_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+                if (r < 0) {
+                        r = log_error_errno(errno, "mDNS-IPv6: Failed to set SO_REUSEADDR: %m");
+                        goto fail;
+                }
         }
 
         r = sd_event_add_io(m->event, &m->mdns_ipv6_event_source, m->mdns_ipv6_fd, EPOLLIN, on_mdns_packet, m);
index 5d27464..06bd329 100644 (file)
@@ -22,6 +22,7 @@
 #include "resolved-manager.h"
 
 #define MDNS_PORT 5353
+#define MDNS_ANNOUNCE_DELAY (1 * USEC_PER_SEC)
 
 int manager_mdns_ipv4_fd(Manager *m);
 int manager_mdns_ipv6_fd(Manager *m);
index 31b25ca..3c62550 100644 (file)
@@ -60,7 +60,7 @@ int manager_read_resolv_conf(Manager *m) {
                 return 0;
 
         /* Is it symlinked to our own file? */
-        if (stat("/run/systemd/resolve/resolv.conf", &own) >= 0 &&
+        if (stat(PRIVATE_RESOLV_CONF, &own) >= 0 &&
             st.st_dev == own.st_dev &&
             st.st_ino == own.st_ino)
                 return 0;
@@ -154,6 +154,16 @@ static void write_resolv_conf_server(DnsServer *s, FILE *f, unsigned *count) {
                 return;
         }
 
+        /* Check if the DNS server is limited to particular domains;
+         * resolv.conf does not have a syntax to express that, so it must not
+         * appear as a global name server to avoid routing unrelated domains to
+         * it (which is a privacy violation, will most probably fail anyway,
+         * and adds unnecessary load) */
+        if (dns_server_limited_domains(s)) {
+                log_debug("DNS server %s has route-only domains, not using as global name server", dns_server_string(s));
+                return;
+        }
+
         if (*count == MAXNS)
                 fputs("# Too many DNS servers configured, the following entries may be ignored.\n", f);
         (*count)++;
@@ -193,13 +203,13 @@ static void write_resolv_conf_search(
 static int write_resolv_conf_contents(FILE *f, OrderedSet *dns, OrderedSet *domains) {
         Iterator i;
 
-        fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
+        fputs("# This file is managed by man:systemd-resolved(8). Do not edit.\n#\n"
               "# This is a dynamic resolv.conf file for connecting local clients directly to\n"
               "# all known DNS servers.\n#\n"
               "# Third party programs must not access this file directly, but only through the\n"
-              "# symlink at /etc/resolv.conf. To manage resolv.conf(5) in a different way,\n"
+              "# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,\n"
               "# replace this symlink by a static file or a different symlink.\n#\n"
-              "# See systemd-resolved.service(8) for details about the supported modes of\n"
+              "# See man:systemd-resolved.service(8) for details about the supported modes of\n"
               "# operation for /etc/resolv.conf.\n\n", f);
 
         if (ordered_set_isempty(dns))
index deb75f9..74603f9 100644 (file)
@@ -112,6 +112,10 @@ int main(int argc, char *argv[]) {
         sd_event_get_exit_code(m->event, &r);
 
 finish:
+        /* systemd-nspawn checks for private resolv.conf to decide whether
+           or not to mount it into the container. So just delete it. */
+        (void) unlink(PRIVATE_RESOLV_CONF);
+
         sd_notify(false,
                   "STOPPING=1\n"
                   "STATUS=Shutting down...");
index 3bd8389..e6b2062 100644 (file)
@@ -16,5 +16,7 @@
 #FallbackDNS=@DNS_SERVERS@
 #Domains=
 #LLMNR=yes
+#MulticastDNS=yes
 #DNSSEC=@DEFAULT_DNSSEC_MODE@
 #Cache=yes
+#DNSStubListener=udp
index 956b155..8cbe492 100644 (file)
@@ -29,6 +29,7 @@
 #include "resolved-dns-rr.h"
 #include "string-util.h"
 #include "strv.h"
+#include "tests.h"
 #include "unaligned.h"
 
 #define HASH_KEY SD_ID128_MAKE(d3,1e,48,90,4b,fa,4c,fe,af,9d,d5,a1,d7,2e,8a,b1)
@@ -115,7 +116,7 @@ int main(int argc, char **argv) {
                 N = argc - 1;
                 fnames = argv + 1;
         } else {
-                assert_se(glob(RESOLVE_TEST_DIR "/*.pkts", GLOB_NOSORT, NULL, &g) == 0);
+                assert_se(glob(get_testdata_dir("/test-resolve/*.pkts"), GLOB_NOSORT, NULL, &g) == 0);
                 N = g.gl_pathc;
                 fnames = g.gl_pathv;
         }
index 58c089e..090b2fa 100644 (file)
@@ -42,7 +42,7 @@ static void prefix_random(const char *name, char **ret) {
                 char *x;
 
                 assert_se(asprintf(&b, "x%" PRIu64 "x", random_u64()));
-                x = strjoin(b, ".", name, NULL);
+                x = strjoin(b, ".", name);
                 assert_se(x);
 
                 free(m);
@@ -218,7 +218,7 @@ int main(int argc, char* argv[]) {
         test_hostname_lookup(bus, "poettering.de", AF_INET, NULL);
         test_hostname_lookup(bus, "poettering.de", AF_INET6, NULL);
 
-#ifdef HAVE_LIBIDN
+#if defined(HAVE_LIBIDN2) || defined(HAVE_LIBIDN)
         /* Unsigned A with IDNA conversion necessary */
         test_hostname_lookup(bus, "pöttering.de", AF_UNSPEC, NULL);
         test_hostname_lookup(bus, "pöttering.de", AF_INET, NULL);
diff --git a/src/resolve/test-resolved-packet.c b/src/resolve/test-resolved-packet.c
new file mode 100644 (file)
index 0000000..1b00412
--- /dev/null
@@ -0,0 +1,48 @@
+/***
+  This file is part of systemd
+
+  Copyright 2017 Zbigniew Jędrzejewski-Szmek
+
+  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 "log.h"
+#include "resolved-dns-packet.h"
+
+static void test_dns_packet_new(void) {
+        size_t i;
+         _cleanup_(dns_packet_unrefp) DnsPacket *p2 = NULL;
+
+        for (i = 0; i <= DNS_PACKET_SIZE_MAX; i++) {
+                _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
+
+                assert_se(dns_packet_new(&p, DNS_PROTOCOL_DNS, i) == 0);
+
+                log_debug("dns_packet_new: %zu → %zu", i, p->allocated);
+                assert_se(p->allocated >= MIN(DNS_PACKET_SIZE_MAX, i));
+        }
+
+        assert_se(dns_packet_new(&p2, DNS_PROTOCOL_DNS, DNS_PACKET_SIZE_MAX + 1) == -EFBIG);
+}
+
+int main(int argc, char **argv) {
+
+        log_set_max_level(LOG_DEBUG);
+        log_parse_environment();
+        log_open();
+
+        test_dns_packet_new();
+
+        return 0;
+}
index 0acdf22..c0f138b 100644 (file)
@@ -184,9 +184,9 @@ static int determine_state_file(
                 if (!escaped_path_id)
                         return log_oom();
 
-                state_file = strjoin("/var/lib/systemd/rfkill/", escaped_path_id, ":", type, NULL);
+                state_file = strjoin("/var/lib/systemd/rfkill/", escaped_path_id, ":", type);
         } else
-                state_file = strjoin("/var/lib/systemd/rfkill/", type, NULL);
+                state_file = strjoin("/var/lib/systemd/rfkill/", type);
 
         if (!state_file)
                 return log_oom();
index 58fa49a..2e6765a 100644 (file)
 #include "calendarspec.h"
 #include "env-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "parse-util.h"
 #include "path-util.h"
+#include "process-util.h"
 #include "ptyfwd.h"
 #include "signal-util.h"
 #include "spawn-polkit-agent.h"
@@ -45,6 +46,7 @@ static bool arg_ask_password = true;
 static bool arg_scope = false;
 static bool arg_remain_after_exit = false;
 static bool arg_no_block = false;
+static bool arg_wait = false;
 static const char *arg_unit = NULL;
 static const char *arg_description = NULL;
 static const char *arg_slice = NULL;
@@ -83,9 +85,7 @@ static void polkit_agent_open_if_enabled(void) {
 
 static void help(void) {
         printf("%s [OPTIONS...] {COMMAND} [ARGS...]\n\n"
-               "Run the specified command in a transient scope or service or timer\n"
-               "unit. If a timer option is specified and the unit specified with\n"
-               "the --unit option exists, the command can be omitted.\n\n"
+               "Run the specified command in a transient scope or service.\n\n"
                "  -h --help                       Show this help\n"
                "     --version                    Show package version\n"
                "     --no-ask-password            Do not prompt for password\n"
@@ -94,11 +94,12 @@ static void help(void) {
                "  -M --machine=CONTAINER          Operate on local container\n"
                "     --scope                      Run this as scope rather than service\n"
                "     --unit=UNIT                  Run under the specified unit name\n"
-               "  -p --property=NAME=VALUE        Set unit property\n"
+               "  -p --property=NAME=VALUE        Set service or scope unit property\n"
                "     --description=TEXT           Description for unit\n"
                "     --slice=SLICE                Run in the specified slice\n"
                "     --no-block                   Do not wait until operation finished\n"
                "  -r --remain-after-exit          Leave service around until explicitly stopped\n"
+               "     --wait                       Wait until service stopped again\n"
                "     --send-sighup                Send SIGHUP when terminating\n"
                "     --service-type=TYPE          Service type\n"
                "     --uid=USER                   Run as system user\n"
@@ -107,15 +108,15 @@ static void help(void) {
                "  -E --setenv=NAME=VALUE          Set environment\n"
                "  -t --pty                        Run service on pseudo tty\n"
                "  -q --quiet                      Suppress information messages during runtime\n\n"
-               "Timer options:\n\n"
+               "Timer options:\n"
                "     --on-active=SECONDS          Run after SECONDS delay\n"
                "     --on-boot=SECONDS            Run SECONDS after machine was booted up\n"
                "     --on-startup=SECONDS         Run SECONDS after systemd activation\n"
                "     --on-unit-active=SECONDS     Run SECONDS after the last activation\n"
                "     --on-unit-inactive=SECONDS   Run SECONDS after the last deactivation\n"
                "     --on-calendar=SPEC           Realtime timer\n"
-               "     --timer-property=NAME=VALUE  Set timer unit property\n",
-               program_invocation_short_name);
+               "     --timer-property=NAME=VALUE  Set timer unit property\n"
+               program_invocation_short_name);
 }
 
 static bool with_timer(void) {
@@ -146,6 +147,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_TIMER_PROPERTY,
                 ARG_NO_BLOCK,
                 ARG_NO_ASK_PASSWORD,
+                ARG_WAIT,
         };
 
         static const struct option options[] = {
@@ -162,6 +164,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "host",              required_argument, NULL, 'H'                  },
                 { "machine",           required_argument, NULL, 'M'                  },
                 { "service-type",      required_argument, NULL, ARG_SERVICE_TYPE     },
+                { "wait",              no_argument,       NULL, ARG_WAIT             },
                 { "uid",               required_argument, NULL, ARG_EXEC_USER        },
                 { "gid",               required_argument, NULL, ARG_EXEC_GROUP       },
                 { "nice",              required_argument, NULL, ARG_NICE             },
@@ -178,7 +181,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "on-calendar",       required_argument, NULL, ARG_ON_CALENDAR      },
                 { "timer-property",    required_argument, NULL, ARG_TIMER_PROPERTY   },
                 { "no-block",          no_argument,       NULL, ARG_NO_BLOCK         },
-                { "no-ask-password",   no_argument,       NULL, ARG_NO_ASK_PASSWORD },
+                { "no-ask-password",   no_argument,       NULL, ARG_NO_ASK_PASSWORD  },
                 {},
         };
 
@@ -195,13 +198,13 @@ static int parse_argv(int argc, char *argv[]) {
                         help();
                         return 0;
 
+                case ARG_VERSION:
+                        return version();
+
                 case ARG_NO_ASK_PASSWORD:
                         arg_ask_password = false;
                         break;
 
-                case ARG_VERSION:
-                        return version();
-
                 case ARG_USER:
                         arg_user = true;
                         break;
@@ -257,11 +260,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case ARG_NICE:
-                        r = safe_atoi(optarg, &arg_nice);
-                        if (r < 0 || arg_nice < PRIO_MIN || arg_nice >= PRIO_MAX) {
-                                log_error("Failed to parse nice value");
-                                return -EINVAL;
-                        }
+                        r = parse_nice(optarg, &arg_nice);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse nice value: %s", optarg);
 
                         arg_nice_set = true;
                         break;
@@ -361,6 +362,10 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_no_block = true;
                         break;
 
+                case ARG_WAIT:
+                        arg_wait = true;
+                        break;
+
                 case '?':
                         return -EINVAL;
 
@@ -398,6 +403,11 @@ static int parse_argv(int argc, char *argv[]) {
                 return -EINVAL;
         }
 
+        if (arg_pty && arg_no_block) {
+                log_error("--pty is not compatible with --no-block.");
+                return -EINVAL;
+        }
+
         if (arg_scope && with_timer()) {
                 log_error("Timer options are not supported in --scope mode.");
                 return -EINVAL;
@@ -408,22 +418,36 @@ static int parse_argv(int argc, char *argv[]) {
                 return -EINVAL;
         }
 
+        if (arg_wait) {
+                if (arg_no_block) {
+                        log_error("--wait may not be combined with --no-block.");
+                        return -EINVAL;
+                }
+
+                if (with_timer()) {
+                        log_error("--wait may not be combined with timer operations.");
+                        return -EINVAL;
+                }
+
+                if (arg_scope) {
+                        log_error("--wait may not be combined with --scope.");
+                        return -EINVAL;
+                }
+        }
+
         return 1;
 }
 
 static int transient_unit_set_properties(sd_bus_message *m, char **properties) {
-        char **i;
         int r;
 
         r = sd_bus_message_append(m, "(sv)", "Description", "s", arg_description);
         if (r < 0)
                 return r;
 
-        STRV_FOREACH(i, properties) {
-                r = bus_append_unit_property_assignment(m, *i);
-                if (r < 0)
-                        return r;
-        }
+        r = bus_append_unit_property_assignment_many(m, properties);
+        if (r < 0)
+                return r;
 
         return 0;
 }
@@ -473,6 +497,12 @@ static int transient_service_set_properties(sd_bus_message *m, char **argv, cons
         if (r < 0)
                 return r;
 
+        if (arg_wait || arg_pty) {
+                r = sd_bus_message_append(m, "(sv)", "AddRef", "b", 1);
+                if (r < 0)
+                        return r;
+        }
+
         if (arg_remain_after_exit) {
                 r = sd_bus_message_append(m, "(sv)", "RemainAfterExit", "b", arg_remain_after_exit);
                 if (r < 0)
@@ -722,7 +752,7 @@ static int make_unit_name(sd_bus *bus, UnitType t, char **ret) {
                 return -EINVAL;
         }
 
-        p = strjoin("run-u", id, ".", unit_type_to_string(t), NULL);
+        p = strjoin("run-u", id, ".", unit_type_to_string(t));
         if (!p)
                 return log_oom();
 
@@ -730,9 +760,109 @@ static int make_unit_name(sd_bus *bus, UnitType t, char **ret) {
         return 0;
 }
 
+typedef struct RunContext {
+        sd_bus *bus;
+        sd_event *event;
+        PTYForward *forward;
+        sd_bus_slot *match;
+
+        /* The exit data of the unit */
+        char *active_state;
+        uint64_t inactive_exit_usec;
+        uint64_t inactive_enter_usec;
+        char *result;
+        uint64_t cpu_usage_nsec;
+        uint32_t exit_code;
+        uint32_t exit_status;
+} RunContext;
+
+static void run_context_free(RunContext *c) {
+        assert(c);
+
+        c->forward = pty_forward_free(c->forward);
+        c->match = sd_bus_slot_unref(c->match);
+        c->bus = sd_bus_unref(c->bus);
+        c->event = sd_event_unref(c->event);
+
+        free(c->active_state);
+        free(c->result);
+}
+
+static void run_context_check_done(RunContext *c) {
+        bool done;
+
+        assert(c);
+
+        if (c->match)
+                done = STRPTR_IN_SET(c->active_state, "inactive", "failed");
+        else
+                done = true;
+
+        if (c->forward && done) /* If the service is gone, it's time to drain the output */
+                done = pty_forward_drain(c->forward);
+
+        if (done)
+                sd_event_exit(c->event, EXIT_SUCCESS);
+}
+
+static int run_context_update(RunContext *c, const char *path) {
+
+        static const struct bus_properties_map map[] = {
+                { "ActiveState",                      "s", NULL, offsetof(RunContext, active_state)        },
+                { "InactiveExitTimestampMonotonic",   "t", NULL, offsetof(RunContext, inactive_exit_usec)  },
+                { "InactiveEnterTimestampMonotonic",  "t", NULL, offsetof(RunContext, inactive_enter_usec) },
+                { "Result",                           "s", NULL, offsetof(RunContext, result)              },
+                { "ExecMainCode",                     "i", NULL, offsetof(RunContext, exit_code)           },
+                { "ExecMainStatus",                   "i", NULL, offsetof(RunContext, exit_status)         },
+                { "CPUUsageNSec",                     "t", NULL, offsetof(RunContext, cpu_usage_nsec)      },
+                {}
+        };
+
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        int r;
+
+        r = bus_map_all_properties(c->bus,
+                                   "org.freedesktop.systemd1",
+                                   path,
+                                   map,
+                                   &error,
+                                   c);
+        if (r < 0) {
+                sd_event_exit(c->event, EXIT_FAILURE);
+                return log_error_errno(r, "Failed to query unit state: %s", bus_error_message(&error, r));
+        }
+
+        run_context_check_done(c);
+        return 0;
+}
+
+static int on_properties_changed(sd_bus_message *m, void *userdata, sd_bus_error *error) {
+        RunContext *c = userdata;
+
+        assert(m);
+        assert(c);
+
+        return run_context_update(c, sd_bus_message_get_path(m));
+}
+
+static int pty_forward_handler(PTYForward *f, int rcode, void *userdata) {
+        RunContext *c = userdata;
+
+        assert(f);
+
+        if (rcode < 0) {
+                sd_event_exit(c->event, EXIT_FAILURE);
+                return log_error_errno(rcode, "Error on PTY forwarding logic: %m");
+        }
+
+        run_context_check_done(c);
+        return 0;
+}
+
 static int start_transient_service(
                 sd_bus *bus,
-                char **argv) {
+                char **argv,
+                int *retval) {
 
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
@@ -743,6 +873,7 @@ static int start_transient_service(
 
         assert(bus);
         assert(argv);
+        assert(retval);
 
         if (arg_pty) {
 
@@ -866,40 +997,102 @@ static int start_transient_service(
                         return r;
         }
 
-        if (master >= 0) {
-                _cleanup_(pty_forward_freep) PTYForward *forward = NULL;
-                _cleanup_(sd_event_unrefp) sd_event *event = NULL;
-                char last_char = 0;
+        if (!arg_quiet)
+                log_info("Running as unit: %s", service);
+
+        if (arg_wait || master >= 0) {
+                _cleanup_(run_context_free) RunContext c = {};
+                _cleanup_free_ char *path = NULL;
+                const char *mt;
+
+                c.bus = sd_bus_ref(bus);
 
-                r = sd_event_default(&event);
+                r = sd_event_default(&c.event);
                 if (r < 0)
                         return log_error_errno(r, "Failed to get event loop: %m");
 
-                assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGWINCH, SIGTERM, SIGINT, -1) >= 0);
+                if (master >= 0) {
+                        assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGWINCH, SIGTERM, SIGINT, -1) >= 0);
+                        (void) sd_event_add_signal(c.event, NULL, SIGINT, NULL, NULL);
+                        (void) sd_event_add_signal(c.event, NULL, SIGTERM, NULL, NULL);
 
-                (void) sd_event_add_signal(event, NULL, SIGINT, NULL, NULL);
-                (void) sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL);
+                        if (!arg_quiet)
+                                log_info("Press ^] three times within 1s to disconnect TTY.");
 
-                if (!arg_quiet)
-                        log_info("Running as unit: %s\nPress ^] three times within 1s to disconnect TTY.", service);
+                        r = pty_forward_new(c.event, master, PTY_FORWARD_IGNORE_INITIAL_VHANGUP, &c.forward);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to create PTY forwarder: %m");
+
+                        pty_forward_set_handler(c.forward, pty_forward_handler, &c);
+                }
 
-                r = pty_forward_new(event, master, PTY_FORWARD_IGNORE_INITIAL_VHANGUP, &forward);
+                path = unit_dbus_path_from_name(service);
+                if (!path)
+                        return log_oom();
+
+                mt = strjoina("type='signal',"
+                              "sender='org.freedesktop.systemd1',"
+                              "path='", path, "',"
+                              "interface='org.freedesktop.DBus.Properties',"
+                              "member='PropertiesChanged'");
+                r = sd_bus_add_match(bus, &c.match, mt, on_properties_changed, &c);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to add properties changed signal.");
+
+                r = sd_bus_attach_event(bus, c.event, 0);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to create PTY forwarder: %m");
+                        return log_error_errno(r, "Failed to attach bus to event loop.");
 
-                r = sd_event_loop(event);
+                r = run_context_update(&c, path);
+                if (r < 0)
+                        return r;
+
+                r = sd_event_loop(c.event);
                 if (r < 0)
                         return log_error_errno(r, "Failed to run event loop: %m");
 
-                pty_forward_get_last_char(forward, &last_char);
+                if (c.forward) {
+                        char last_char = 0;
+
+                        r = pty_forward_get_last_char(c.forward, &last_char);
+                        if (r >= 0 && !arg_quiet && last_char != '\n')
+                                fputc('\n', stdout);
+                }
 
-                forward = pty_forward_free(forward);
+                if (arg_wait && !arg_quiet) {
 
-                if (!arg_quiet && last_char != '\n')
-                        fputc('\n', stdout);
+                        /* Explicitly destroy the PTY forwarder, so that the PTY device is usable again, in its
+                         * original settings (i.e. proper line breaks), so that we can show the summary in a pretty
+                         * way. */
+                        c.forward = pty_forward_free(c.forward);
 
-        } else if (!arg_quiet)
-                log_info("Running as unit: %s", service);
+                        if (!isempty(c.result))
+                                log_info("Finished with result: %s", strna(c.result));
+
+                        if (c.exit_code == CLD_EXITED)
+                                log_info("Main processes terminated with: code=%s/status=%i", sigchld_code_to_string(c.exit_code), c.exit_status);
+                        else if (c.exit_code > 0)
+                                log_info("Main processes terminated with: code=%s/status=%s", sigchld_code_to_string(c.exit_code), signal_to_string(c.exit_status));
+
+                        if (c.inactive_enter_usec > 0 && c.inactive_enter_usec != USEC_INFINITY &&
+                            c.inactive_exit_usec > 0 && c.inactive_exit_usec != USEC_INFINITY &&
+                            c.inactive_enter_usec > c.inactive_exit_usec) {
+                                char ts[FORMAT_TIMESPAN_MAX];
+                                log_info("Service runtime: %s", format_timespan(ts, sizeof(ts), c.inactive_enter_usec - c.inactive_exit_usec, USEC_PER_MSEC));
+                        }
+
+                        if (c.cpu_usage_nsec > 0 && c.cpu_usage_nsec != NSEC_INFINITY) {
+                                char ts[FORMAT_TIMESPAN_MAX];
+                                log_info("CPU time consumed: %s", format_timespan(ts, sizeof(ts), (c.cpu_usage_nsec + NSEC_PER_USEC - 1) / NSEC_PER_USEC, USEC_PER_MSEC));
+                        }
+                }
+
+                /* Try to propagate the service's return value */
+                if (c.result && STR_IN_SET(c.result, "success", "exit-code") && c.exit_code == CLD_EXITED)
+                        *retval = c.exit_status;
+                else
+                        *retval = EXIT_FAILURE;
+        }
 
         return 0;
 }
@@ -999,17 +1192,21 @@ static int start_transient_scope(
                 uid_t uid;
                 gid_t gid;
 
-                r = get_user_creds(&arg_exec_user, &uid, &gid, &home, &shell);
+                r = get_user_creds_clean(&arg_exec_user, &uid, &gid, &home, &shell);
                 if (r < 0)
                         return log_error_errno(r, "Failed to resolve user %s: %m", arg_exec_user);
 
-                r = strv_extendf(&user_env, "HOME=%s", home);
-                if (r < 0)
-                        return log_oom();
+                if (home) {
+                        r = strv_extendf(&user_env, "HOME=%s", home);
+                        if (r < 0)
+                                return log_oom();
+                }
 
-                r = strv_extendf(&user_env, "SHELL=%s", shell);
-                if (r < 0)
-                        return log_oom();
+                if (shell) {
+                        r = strv_extendf(&user_env, "SHELL=%s", shell);
+                        if (r < 0)
+                                return log_oom();
+                }
 
                 r = strv_extendf(&user_env, "USER=%s", arg_exec_user);
                 if (r < 0)
@@ -1146,7 +1343,7 @@ static int start_transient_timer(
         if (r < 0)
                 return bus_log_create_error(r);
 
-        if (argv[0]) {
+        if (!strv_isempty(argv)) {
                 r = sd_bus_message_open_container(m, 'r', "sa(sv)");
                 if (r < 0)
                         return bus_log_create_error(r);
@@ -1192,9 +1389,11 @@ static int start_transient_timer(
         if (r < 0)
                 return r;
 
-        log_info("Running timer as unit: %s", timer);
-        if (argv[0])
-                log_info("Will run service as unit: %s", service);
+        if (!arg_quiet) {
+                log_info("Running timer as unit: %s", timer);
+                if (argv[0])
+                        log_info("Will run service as unit: %s", service);
+        }
 
         return 0;
 }
@@ -1202,7 +1401,7 @@ static int start_transient_timer(
 int main(int argc, char* argv[]) {
         _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
         _cleanup_free_ char *description = NULL, *command = NULL;
-        int r;
+        int r, retval = EXIT_SUCCESS;
 
         log_parse_environment();
         log_open();
@@ -1239,7 +1438,12 @@ int main(int argc, char* argv[]) {
                 arg_description = description;
         }
 
-        r = bus_connect_transport_systemd(arg_transport, arg_host, arg_user, &bus);
+        /* If --wait is used connect via the bus, unconditionally, as ref/unref is not supported via the limited direct
+         * connection */
+        if (arg_wait || arg_pty)
+                r = bus_connect_transport(arg_transport, arg_host, arg_user, &bus);
+        else
+                r = bus_connect_transport_systemd(arg_transport, arg_host, arg_user, &bus);
         if (r < 0) {
                 log_error_errno(r, "Failed to create bus connection: %m");
                 goto finish;
@@ -1250,12 +1454,12 @@ int main(int argc, char* argv[]) {
         else if (with_timer())
                 r = start_transient_timer(bus, argv + optind);
         else
-                r = start_transient_service(bus, argv + optind);
+                r = start_transient_service(bus, argv + optind, &retval);
 
 finish:
         strv_free(arg_environment);
         strv_free(arg_property);
         strv_free(arg_timer_property);
 
-        return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+        return r < 0 ? EXIT_FAILURE : retval;
 }
index 2aa951f..79a3b95 100644 (file)
@@ -162,7 +162,7 @@ int add_base_acls_if_needed(acl_t *acl_p, const char *path) {
 
 int acl_search_groups(const char *path, char ***ret_groups) {
         _cleanup_strv_free_ char **g = NULL;
-        _cleanup_(acl_free) acl_t acl = NULL;
+        _cleanup_(acl_freep) acl_t acl = NULL;
         bool ret = false;
         acl_entry_t entry;
         int r;
index 65151b1..e3b29e3 100644 (file)
@@ -43,7 +43,7 @@
 #include "ask-password-api.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "io-util.h"
 #include "log.h"
 #include "macro.h"
@@ -95,7 +95,7 @@ static int retrieve_key(key_serial_t serial, char ***ret) {
                 if (n < m)
                         break;
 
-                memory_erase(p, n);
+                explicit_bzero(p, n);
                 free(p);
                 m *= 2;
         }
@@ -104,7 +104,7 @@ static int retrieve_key(key_serial_t serial, char ***ret) {
         if (!l)
                 return -ENOMEM;
 
-        memory_erase(p, n);
+        explicit_bzero(p, n);
 
         *ret = l;
         return 0;
@@ -140,7 +140,7 @@ static int add_to_keyring(const char *keyname, AskPasswordFlags flags, char **pa
                 return r;
 
         serial = add_key("user", keyname, p, n, KEY_SPEC_USER_KEYRING);
-        memory_erase(p, n);
+        explicit_bzero(p, n);
         if (serial == -1)
                 return -errno;
 
@@ -390,7 +390,7 @@ int ask_password_tty(
         }
 
         x = strndup(passphrase, p);
-        memory_erase(passphrase, p);
+        explicit_bzero(passphrase, p);
         if (!x) {
                 r = -ENOMEM;
                 goto finish;
@@ -484,7 +484,7 @@ int ask_password_agent(
 
         (void) mkdir_p_label("/run/systemd/ask-password", 0755);
 
-        fd = mkostemp_safe(temp, O_WRONLY|O_CLOEXEC);
+        fd = mkostemp_safe(temp);
         if (fd < 0) {
                 r = fd;
                 goto finish;
@@ -647,7 +647,7 @@ int ask_password_agent(
                                 l = strv_new("", NULL);
                         else
                                 l = strv_parse_nulstr(passphrase+1, n-1);
-                        memory_erase(passphrase, n);
+                        explicit_bzero(passphrase, n);
                         if (!l) {
                                 r = -ENOMEM;
                                 goto finish;
index 59a34a9..903a187 100644 (file)
@@ -51,6 +51,9 @@ static const BaseFilesystem table[] = {
         { "usr",   0755, NULL,                         NULL },
         { "var",   0755, NULL,                         NULL },
         { "etc",   0755, NULL,                         NULL },
+        { "proc",  0755, NULL,                         NULL, true },
+        { "sys",   0755, NULL,                         NULL, true },
+        { "dev",   0755, NULL,                         NULL, true },
 #if defined(__i386__) || defined(__x86_64__)
         { "lib64",    0, "usr/lib/x86_64-linux-gnu\0"
                          "usr/lib64\0",                "ld-linux-x86-64.so.2" },
@@ -82,7 +85,7 @@ int base_filesystem_create(const char *root, uid_t uid, gid_t gid) {
                                 if (table[i].exists) {
                                         _cleanup_free_ char *p = NULL;
 
-                                        p = strjoin(s, "/", table[i].exists, NULL);
+                                        p = strjoin(s, "/", table[i].exists);
                                         if (!p)
                                                 return log_oom();
 
@@ -101,7 +104,7 @@ int base_filesystem_create(const char *root, uid_t uid, gid_t gid) {
                         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 (uid_is_valid(uid) || gid_is_valid(gid)) {
                                 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);
                         }
@@ -117,6 +120,8 @@ int base_filesystem_create(const char *root, uid_t uid, gid_t gid) {
 
                         if (!table[i].ignore_failure)
                                 return -errno;
+
+                        continue;
                 }
 
                 if (uid != UID_INVALID || gid != UID_INVALID) {
index ea020b5..5cbe663 100644 (file)
@@ -27,6 +27,8 @@
 #include "hashmap.h"
 #include "list.h"
 #include "locale-util.h"
+#include "mount-util.h"
+#include "nsflags.h"
 #include "parse-util.h"
 #include "path-util.h"
 #include "process-util.h"
@@ -61,6 +63,7 @@ int bus_parse_unit_info(sd_bus_message *message, UnitInfo *u) {
 
 int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignment) {
         const char *eq, *field;
+        UnitDependency dep;
         int r, rl;
 
         assert(m);
@@ -84,7 +87,7 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen
                 if (isempty(eq))
                         r = sd_bus_message_append(m, "sv", "CPUQuotaPerSecUSec", "t", USEC_INFINITY);
                 else {
-                        r = parse_percent(eq);
+                        r = parse_percent_unbounded(eq);
                         if (r <= 0) {
                                 log_error_errno(r, "CPU quota '%s' invalid.", eq);
                                 return -EINVAL;
@@ -199,11 +202,13 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen
                 r = sd_bus_message_append(m, "sv", sn, "t", l.rlim_cur);
 
         } else if (STR_IN_SET(field,
-                       "CPUAccounting", "MemoryAccounting", "IOAccounting", "BlockIOAccounting", "TasksAccounting",
-                       "SendSIGHUP", "SendSIGKILL", "WakeSystem", "DefaultDependencies",
-                       "IgnoreSIGPIPE", "TTYVHangup", "TTYReset", "RemainAfterExit",
-                       "PrivateTmp", "PrivateDevices", "PrivateNetwork", "NoNewPrivileges",
-                       "SyslogLevelPrefix", "Delegate", "RemainAfterElapse", "MemoryDenyWriteExecute")) {
+                              "CPUAccounting", "MemoryAccounting", "IOAccounting", "BlockIOAccounting", "TasksAccounting",
+                              "SendSIGHUP", "SendSIGKILL", "WakeSystem", "DefaultDependencies",
+                              "IgnoreSIGPIPE", "TTYVHangup", "TTYReset", "RemainAfterExit",
+                              "PrivateTmp", "PrivateDevices", "PrivateNetwork", "PrivateUsers", "NoNewPrivileges",
+                              "SyslogLevelPrefix", "Delegate", "RemainAfterElapse", "MemoryDenyWriteExecute",
+                              "RestrictRealtime", "DynamicUser", "RemoveIPC", "ProtectKernelTunables",
+                              "ProtectKernelModules", "ProtectControlGroups", "MountAPIVFS")) {
 
                 r = parse_boolean(eq);
                 if (r < 0)
@@ -211,6 +216,17 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen
 
                 r = sd_bus_message_append(m, "v", "b", r);
 
+        } else if (STR_IN_SET(field, "CPUWeight", "StartupCPUWeight")) {
+                uint64_t u;
+
+                r = cg_weight_parse(eq, &u);
+                if (r < 0) {
+                        log_error("Failed to parse %s value %s.", field, eq);
+                        return -EINVAL;
+                }
+
+                r = sd_bus_message_append(m, "v", "t", u);
+
         } else if (STR_IN_SET(field, "CPUShares", "StartupCPUShares")) {
                 uint64_t u;
 
@@ -250,7 +266,8 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen
                               "StandardInput", "StandardOutput", "StandardError",
                               "Description", "Slice", "Type", "WorkingDirectory",
                               "RootDirectory", "SyslogIdentifier", "ProtectSystem",
-                              "ProtectHome", "SELinuxContext"))
+                              "ProtectHome", "SELinuxContext", "Restart", "RootImage",
+                              "NotifyAccess"))
                 r = sd_bus_message_append(m, "v", "s", eq);
 
         else if (streq(field, "SyslogLevel")) {
@@ -291,7 +308,7 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen
                                 rwm = "";
                         }
 
-                        if (!path_startswith(path, "/dev")) {
+                        if (!is_deviceallow_pattern(path)) {
                                 log_error("%s is not a device file in /dev.", path);
                                 return -EINVAL;
                         }
@@ -365,15 +382,40 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen
                 }
 
         } else if (streq(field, "Nice")) {
-                int32_t i;
+                int n;
 
-                r = safe_atoi32(eq, &i);
-                if (r < 0) {
-                        log_error("Failed to parse %s value %s.", field, eq);
-                        return -EINVAL;
-                }
+                r = parse_nice(eq, &n);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to parse nice value: %s", eq);
+
+                r = sd_bus_message_append(m, "v", "i", (int32_t) n);
+
+        } else if (streq(field, "FileDescriptorStoreMax")) {
+                unsigned u;
+
+                r = safe_atou(eq, &u);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to parse file descriptor store limit: %s", eq);
+
+                r = sd_bus_message_append(m, "v", "u", (uint32_t) u);
+
+        } else if (streq(field, "IOSchedulingClass")) {
+                int c;
+
+                c = ioprio_class_from_string(eq);
+                if (c < 0)
+                        return log_error_errno(r, "Failed to parse IO scheduling class: %s", eq);
 
-                r = sd_bus_message_append(m, "v", "i", i);
+                r = sd_bus_message_append(m, "v", "i", (int32_t) c);
+
+        } else if (streq(field, "IOSchedulingPriority")) {
+                int q;
+
+                r = ioprio_parse_priority(eq, &q);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to parse IO scheduling priority: %s", eq);
+
+                r = sd_bus_message_append(m, "v", "i", (int32_t) q);
 
         } else if (STR_IN_SET(field, "Environment", "PassEnvironment")) {
                 const char *p;
@@ -386,9 +428,7 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen
                 if (r < 0)
                         return bus_log_create_error(r);
 
-                p = eq;
-
-                for (;;) {
+                for (p = eq;;) {
                         _cleanup_free_ char *word = NULL;
 
                         r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE);
@@ -470,11 +510,9 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen
                 if (r < 0)
                         return bus_log_create_error(r);
 
-                p = eq;
-
-                for (;;) {
+                for (p = eq;;) {
                         _cleanup_free_ char *word = NULL;
-                        int offset;
+                        size_t offset;
 
                         r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES);
                         if (r < 0) {
@@ -490,6 +528,8 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen
                         }
 
                         offset = word[0] == '-';
+                        offset += word[offset] == '+';
+
                         if (!path_is_absolute(word + offset)) {
                                 log_error("Failed to parse %s value %s", field, eq);
                                 return -EINVAL;
@@ -519,9 +559,7 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen
                 if (r < 0)
                         return bus_log_create_error(r);
 
-                p = eq;
-
-                for (;;) {
+                for (p = eq;;) {
                         _cleanup_free_ char *word = NULL;
 
                         r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES);
@@ -542,6 +580,110 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen
 
                 r = sd_bus_message_close_container(m);
 
+        } else if (streq(field, "RestrictNamespaces")) {
+                bool invert = false;
+                unsigned long flags = 0;
+
+                if (eq[0] == '~') {
+                        invert = true;
+                        eq++;
+                }
+
+                r = parse_boolean(eq);
+                if (r > 0)
+                        flags = 0;
+                else if (r == 0)
+                        flags = NAMESPACE_FLAGS_ALL;
+                else {
+                        r = namespace_flag_from_string_many(eq, &flags);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse %s value %s.", field, eq);
+                }
+
+                if (invert)
+                        flags = (~flags) & NAMESPACE_FLAGS_ALL;
+
+                r = sd_bus_message_append(m, "v", "t", (uint64_t) flags);
+        } else if ((dep = unit_dependency_from_string(field)) >= 0)
+                r = sd_bus_message_append(m, "v", "as", 1, eq);
+        else if (streq(field, "MountFlags")) {
+                unsigned long f;
+
+                r = mount_propagation_flags_from_string(eq, &f);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to parse mount propagation flags: %s", eq);
+
+                r = sd_bus_message_append(m, "v", "t", (uint64_t) f);
+        } else if (STR_IN_SET(field, "BindPaths", "BindReadOnlyPaths")) {
+                const char *p = eq;
+
+                r = sd_bus_message_open_container(m, 'v', "a(ssbt)");
+                if (r < 0)
+                        return r;
+
+                r = sd_bus_message_open_container(m, 'a', "(ssbt)");
+                if (r < 0)
+                        return r;
+
+                for (;;) {
+                        _cleanup_free_ char *source = NULL, *destination = NULL;
+                        char *s = NULL, *d = NULL;
+                        bool ignore_enoent = false;
+                        uint64_t flags = MS_REC;
+
+                        r = extract_first_word(&p, &source, ":" WHITESPACE, EXTRACT_QUOTES|EXTRACT_DONT_COALESCE_SEPARATORS);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse argument: %m");
+                        if (r == 0)
+                                break;
+
+                        s = source;
+                        if (s[0] == '-') {
+                                ignore_enoent = true;
+                                s++;
+                        }
+
+                        if (p && p[-1] == ':') {
+                                r = extract_first_word(&p, &destination, ":" WHITESPACE, EXTRACT_QUOTES|EXTRACT_DONT_COALESCE_SEPARATORS);
+                                if (r < 0)
+                                        return log_error_errno(r, "Failed to parse argument: %m");
+                                if (r == 0) {
+                                        log_error("Missing argument after ':': %s", eq);
+                                        return -EINVAL;
+                                }
+
+                                d = destination;
+
+                                if (p && p[-1] == ':') {
+                                        _cleanup_free_ char *options = NULL;
+
+                                        r = extract_first_word(&p, &options, NULL, EXTRACT_QUOTES);
+                                        if (r < 0)
+                                                return log_error_errno(r, "Failed to parse argument: %m");
+
+                                        if (isempty(options) || streq(options, "rbind"))
+                                                flags = MS_REC;
+                                        else if (streq(options, "norbind"))
+                                                flags = 0;
+                                        else {
+                                                log_error("Unknown options: %s", eq);
+                                                return -EINVAL;
+                                        }
+                                }
+                        } else
+                                d = s;
+
+
+                        r = sd_bus_message_append(m, "(ssbt)", s, d, ignore_enoent, flags);
+                        if (r < 0)
+                                return r;
+                }
+
+                r = sd_bus_message_close_container(m);
+                if (r < 0)
+                        return r;
+
+                r = sd_bus_message_close_container(m);
         } else {
                 log_error("Unknown assignment %s.", assignment);
                 return -EINVAL;
@@ -558,6 +700,21 @@ finish:
         return 0;
 }
 
+int bus_append_unit_property_assignment_many(sd_bus_message *m, char **l) {
+        char **i;
+        int r;
+
+        assert(m);
+
+        STRV_FOREACH(i, l) {
+                r = bus_append_unit_property_assignment(m, *i);
+                if (r < 0)
+                        return r;
+        }
+
+        return 0;
+}
+
 typedef struct BusWaitForJobs {
         sd_bus *bus;
         Set *jobs;
@@ -716,6 +873,7 @@ static const struct {
         const char *result, *explanation;
 } explanations [] = {
         { "resources",   "of unavailable resources or another system error" },
+        { "protocol",    "the service did not take the steps required by its unit configuration" },
         { "timeout",     "a timeout was exceeded" },
         { "exit-code",   "the control process exited with error code" },
         { "signal",      "a fatal signal was delivered to the control process" },
@@ -730,9 +888,9 @@ static void log_job_error_with_service_result(const char* service, const char *r
 
         assert(service);
 
-        service_shell_quoted = shell_maybe_quote(service);
+        service_shell_quoted = shell_maybe_quote(service, ESCAPE_BACKSLASH);
 
-        if (extra_args && extra_args[1]) {
+        if (extra_args) {
                 _cleanup_free_ char *t;
 
                 t = strv_join((char**) extra_args, " ");
@@ -793,6 +951,8 @@ static int check_wait_response(BusWaitForJobs *d, bool quiet, const char* const*
                         log_error("Assertion failed on job for %s.", strna(d->name));
                 else if (streq(d->result, "unsupported"))
                         log_error("Operation on or unit type of %s not supported on this system.", strna(d->name));
+                else if (streq(d->result, "collected"))
+                        log_error("Queued job for %s was garbage collected.", strna(d->name));
                 else if (!streq(d->result, "done") && !streq(d->result, "skipped")) {
                         if (d->name) {
                                 int q;
@@ -808,7 +968,7 @@ static int check_wait_response(BusWaitForJobs *d, bool quiet, const char* const*
                 }
         }
 
-        if (streq(d->result, "canceled"))
+        if (STR_IN_SET(d->result, "canceled", "collected"))
                 r = -ECANCELED;
         else if (streq(d->result, "timeout"))
                 r = -ETIME;
index c0c172f..d102ea1 100644 (file)
@@ -41,6 +41,7 @@ typedef struct UnitInfo {
 int bus_parse_unit_info(sd_bus_message *message, UnitInfo *u);
 
 int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignment);
+int bus_append_unit_property_assignment_many(sd_bus_message *m, char **l);
 
 typedef struct BusWaitForJobs BusWaitForJobs;
 
index 5241099..207b5e6 100644 (file)
@@ -43,6 +43,7 @@
 #include "escape.h"
 #include "fd-util.h"
 #include "missing.h"
+#include "nsflags.h"
 #include "parse-util.h"
 #include "proc-cmdline.h"
 #include "rlimit-util.h"
@@ -676,7 +677,7 @@ int bus_connect_user_systemd(sd_bus **_bus) {
         if (r < 0)
                 return r;
 
-        bus->address = strjoin("unix:path=", ee, "/systemd/private", NULL);
+        bus->address = strjoin("unix:path=", ee, "/systemd/private");
         if (!bus->address)
                 return -ENOMEM;
 
@@ -724,13 +725,12 @@ int bus_print_property(const char *name, sd_bus_message *property, bool value, b
                         return r;
 
                 if (all || !isempty(s)) {
-                        _cleanup_free_ char *escaped = NULL;
+                        bool good;
 
-                        escaped = xescape(s, "\n");
-                        if (!escaped)
-                                return -ENOMEM;
-
-                        print_property(name, "%s", escaped);
+                        /* This property has a single value, so we need to take
+                         * care not to print a new line, everything else is OK. */
+                        good = !strchr(s, '\n');
+                        print_property(name, "%s", good ? s : "[unprintable]");
                 }
 
                 return 1;
@@ -769,6 +769,23 @@ int bus_print_property(const char *name, sd_bus_message *property, bool value, b
                         char timespan[FORMAT_TIMESPAN_MAX];
 
                         print_property(name, "%s", format_timespan(timespan, sizeof(timespan), u, 0));
+                } else if (streq(name, "RestrictNamespaces")) {
+                        _cleanup_free_ char *s = NULL;
+                        const char *result = NULL;
+
+                        if ((u & NAMESPACE_FLAGS_ALL) == 0)
+                                result = "yes";
+                        else if ((u & NAMESPACE_FLAGS_ALL) == NAMESPACE_FLAGS_ALL)
+                                result = "no";
+                        else {
+                                r = namespace_flag_to_string_many(u, &s);
+                                if (r < 0)
+                                        return r;
+
+                                result = s;
+                        }
+
+                        print_property(name, "%s", result);
                 } else
                         print_property(name, "%"PRIu64, u);
 
@@ -834,16 +851,16 @@ int bus_print_property(const char *name, sd_bus_message *property, bool value, b
                                 return r;
 
                         while ((r = sd_bus_message_read_basic(property, SD_BUS_TYPE_STRING, &str)) > 0) {
-                                _cleanup_free_ char *escaped = NULL;
+                                bool good;
 
                                 if (first && !value)
                                         printf("%s=", name);
 
-                                escaped = xescape(str, "\n ");
-                                if (!escaped)
-                                        return -ENOMEM;
+                                /* This property has multiple space-seperated values, so
+                                 * neither spaces not newlines can be allowed in a value. */
+                                good = str[strcspn(str, " \n")] == '\0';
 
-                                printf("%s%s", first ? "" : " ", escaped);
+                                printf("%s%s", first ? "" : " ", good ? str : "[unprintable]");
 
                                 first = false;
                         }
@@ -1016,19 +1033,19 @@ static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_
                 return r;
 
         switch (type) {
+
         case SD_BUS_TYPE_STRING: {
-                const char *s;
                 char **p = userdata;
+                const char *s;
 
                 r = sd_bus_message_read_basic(m, type, &s);
                 if (r < 0)
-                        break;
+                        return r;
 
                 if (isempty(s))
-                        break;
+                        s = NULL;
 
-                r = free_and_strdup(p, s);
-                break;
+                return free_and_strdup(p, s);
         }
 
         case SD_BUS_TYPE_ARRAY: {
@@ -1037,13 +1054,12 @@ static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_
 
                 r = bus_message_read_strv_extend(m, &l);
                 if (r < 0)
-                        break;
+                        return r;
 
                 strv_free(*p);
                 *p = l;
                 l = NULL;
-
-                break;
+                return 0;
         }
 
         case SD_BUS_TYPE_BOOLEAN: {
@@ -1052,65 +1068,56 @@ static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_
 
                 r = sd_bus_message_read_basic(m, type, &b);
                 if (r < 0)
-                        break;
+                        return r;
 
                 *p = b;
-
-                break;
+                return 0;
         }
 
+        case SD_BUS_TYPE_INT32:
         case SD_BUS_TYPE_UINT32: {
-                uint32_t u;
-                uint32_t *p = userdata;
+                uint32_t u, *p = userdata;
 
                 r = sd_bus_message_read_basic(m, type, &u);
                 if (r < 0)
-                        break;
+                        return r;
 
                 *p = u;
-
-                break;
+                return 0;
         }
 
+        case SD_BUS_TYPE_INT64:
         case SD_BUS_TYPE_UINT64: {
-                uint64_t t;
-                uint64_t *p = userdata;
+                uint64_t t, *p = userdata;
 
                 r = sd_bus_message_read_basic(m, type, &t);
                 if (r < 0)
-                        break;
+                        return r;
 
                 *p = t;
-
-                break;
+                return 0;
         }
 
         case SD_BUS_TYPE_DOUBLE: {
-                double d;
-                double *p = userdata;
+                double d, *p = userdata;
 
                 r = sd_bus_message_read_basic(m, type, &d);
                 if (r < 0)
-                        break;
+                        return r;
 
                 *p = d;
+                return 0;
+        }}
 
-                break;
-        }
-
-        default:
-                break;
-        }
-
-        return r;
+        return -EOPNOTSUPP;
 }
 
 int bus_message_map_all_properties(
                 sd_bus_message *m,
                 const struct bus_properties_map *map,
+                sd_bus_error *error,
                 void *userdata) {
 
-        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         int r;
 
         assert(m);
@@ -1148,9 +1155,9 @@ int bus_message_map_all_properties(
 
                         v = (uint8_t *)userdata + prop->offset;
                         if (map[i].set)
-                                r = prop->set(sd_bus_message_get_bus(m), member, m, &error, v);
+                                r = prop->set(sd_bus_message_get_bus(m), member, m, error, v);
                         else
-                                r = map_basic(sd_bus_message_get_bus(m), member, m, &error, v);
+                                r = map_basic(sd_bus_message_get_bus(m), member, m, error, v);
                         if (r < 0)
                                 return r;
 
@@ -1176,6 +1183,7 @@ int bus_message_map_all_properties(
 int bus_message_map_properties_changed(
                 sd_bus_message *m,
                 const struct bus_properties_map *map,
+                sd_bus_error *error,
                 void *userdata) {
 
         const char *member;
@@ -1184,7 +1192,7 @@ int bus_message_map_properties_changed(
         assert(m);
         assert(map);
 
-        r = bus_message_map_all_properties(m, map, userdata);
+        r = bus_message_map_all_properties(m, map, error, userdata);
         if (r < 0)
                 return r;
 
@@ -1214,10 +1222,10 @@ int bus_map_all_properties(
                 const char *destination,
                 const char *path,
                 const struct bus_properties_map *map,
+                sd_bus_error *error,
                 void *userdata) {
 
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
-        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         int r;
 
         assert(bus);
@@ -1231,21 +1239,22 @@ int bus_map_all_properties(
                         path,
                         "org.freedesktop.DBus.Properties",
                         "GetAll",
-                        &error,
+                        error,
                         &m,
                         "s", "");
         if (r < 0)
                 return r;
 
-        return bus_message_map_all_properties(m, map, userdata);
+        return bus_message_map_all_properties(m, map, error, userdata);
 }
 
-int bus_connect_transport(BusTransport transport, const char *host, bool user, sd_bus **bus) {
+int bus_connect_transport(BusTransport transport, const char *host, bool user, sd_bus **ret) {
+        _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
         int r;
 
         assert(transport >= 0);
         assert(transport < _BUS_TRANSPORT_MAX);
-        assert(bus);
+        assert(ret);
 
         assert_return((transport == BUS_TRANSPORT_LOCAL) == !host, -EINVAL);
         assert_return(transport == BUS_TRANSPORT_LOCAL || !user, -EOPNOTSUPP);
@@ -1254,25 +1263,34 @@ int bus_connect_transport(BusTransport transport, const char *host, bool user, s
 
         case BUS_TRANSPORT_LOCAL:
                 if (user)
-                        r = sd_bus_default_user(bus);
+                        r = sd_bus_default_user(&bus);
                 else
-                        r = sd_bus_default_system(bus);
+                        r = sd_bus_default_system(&bus);
 
                 break;
 
         case BUS_TRANSPORT_REMOTE:
-                r = sd_bus_open_system_remote(bus, host);
+                r = sd_bus_open_system_remote(&bus, host);
                 break;
 
         case BUS_TRANSPORT_MACHINE:
-                r = sd_bus_open_system_machine(bus, host);
+                r = sd_bus_open_system_machine(&bus, host);
                 break;
 
         default:
                 assert_not_reached("Hmm, unknown transport type.");
         }
+        if (r < 0)
+                return r;
 
-        return r;
+        r = sd_bus_set_exit_on_disconnect(bus, true);
+        if (r < 0)
+                return r;
+
+        *ret = bus;
+        bus = NULL;
+
+        return 0;
 }
 
 int bus_connect_transport_systemd(BusTransport transport, const char *host, bool user, sd_bus **bus) {
@@ -1324,6 +1342,23 @@ int bus_property_get_bool(
         return sd_bus_message_append_basic(reply, 'b', &b);
 }
 
+int bus_property_get_id128(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        sd_id128_t *id = userdata;
+
+        if (sd_id128_is_null(*id)) /* Add an empty array if the ID is zero */
+                return sd_bus_message_append(reply, "ay", 0);
+        else
+                return sd_bus_message_append_array(reply, 'y', id->bytes, 16);
+}
+
 #if __SIZEOF_SIZE_T__ != 8
 int bus_property_get_size(
                 sd_bus *bus,
@@ -1443,7 +1478,7 @@ int bus_path_encode_unique(sd_bus *b, const char *prefix, const char *sender_id,
         if (!external_label)
                 return -ENOMEM;
 
-        p = strjoin(prefix, "/", sender_label, "/", external_label, NULL);
+        p = strjoin(prefix, "/", sender_label, "/", external_label);
         if (!p)
                 return -ENOMEM;
 
@@ -1548,3 +1583,22 @@ int bus_property_get_rlimit(
 
         return sd_bus_message_append(reply, "t", u);
 }
+
+int bus_track_add_name_many(sd_bus_track *t, char **l) {
+        int r = 0;
+        char **i;
+
+        assert(t);
+
+        /* Continues adding after failure, and returns the first failure. */
+
+        STRV_FOREACH(i, l) {
+                int k;
+
+                k = sd_bus_track_add_name(t, *i);
+                if (k < 0 && r >= 0)
+                        r = k;
+        }
+
+        return r;
+}
index db6b1ac..d9ce426 100644 (file)
@@ -50,9 +50,9 @@ struct bus_properties_map {
 
 int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
 
-int bus_message_map_all_properties(sd_bus_message *m, const struct bus_properties_map *map,  void *userdata);
-int bus_message_map_properties_changed(sd_bus_message *m, const struct bus_properties_map *map, void *userdata);
-int bus_map_all_properties(sd_bus *bus, const char *destination, const char *path, const struct bus_properties_map *map, void *userdata);
+int bus_message_map_all_properties(sd_bus_message *m, const struct bus_properties_map *map, sd_bus_error *error, void *userdata);
+int bus_message_map_properties_changed(sd_bus_message *m, const struct bus_properties_map *map, sd_bus_error *error, void *userdata);
+int bus_map_all_properties(sd_bus *bus, const char *destination, const char *path, const struct bus_properties_map *map, sd_bus_error *error, void *userdata);
 
 int bus_async_unregister_and_exit(sd_event *e, sd_bus *bus, const char *name);
 
@@ -79,6 +79,7 @@ int bus_print_property(const char *name, sd_bus_message *property, bool value, b
 int bus_print_all_properties(sd_bus *bus, const char *dest, const char *path, char **filter, bool value, bool all);
 
 int bus_property_get_bool(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
+int bus_property_get_id128(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
 
 #define bus_property_get_usec ((sd_bus_property_get_t) NULL)
 #define bus_property_set_usec ((sd_bus_property_set_t) NULL)
@@ -158,3 +159,5 @@ int bus_path_encode_unique(sd_bus *b, const char *prefix, const char *sender_id,
 int bus_path_decode_unique(const char *path, const char *prefix, char **ret_sender, char **ret_external);
 
 int bus_property_get_rlimit(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
+
+int bus_track_add_name_many(sd_bus_track *t, char **l);
index 3e451db..436130e 100644 (file)
 #include <string.h>
 
 #include "alloc-util.h"
+#include "bus-error.h"
+#include "bus-util.h"
 #include "cgroup-show.h"
 #include "cgroup-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "fileio.h"
+#include "format-util.h"
 #include "locale-util.h"
 #include "macro.h"
 #include "output-mode.h"
@@ -36,6 +39,7 @@
 #include "process-util.h"
 #include "string-util.h"
 #include "terminal-util.h"
+#include "unit-name.h"
 
 static void show_pid_array(
                 pid_t pids[],
@@ -73,7 +77,7 @@ static void show_pid_array(
         for (i = 0; i < n_pids; i++) {
                 _cleanup_free_ char *t = NULL;
 
-                get_process_cmdline(pids[i], n_columns, true, &t);
+                (void) get_process_cmdline(pids[i], n_columns, true, &t);
 
                 if (extra)
                         printf("%s%s ", prefix, special_glyph(TRIANGULAR_BULLET));
@@ -158,7 +162,7 @@ int show_cgroup_by_path(
         while ((r = cg_read_subgroup(d, &gn)) > 0) {
                 _cleanup_free_ char *k = NULL;
 
-                k = strjoin(fn, "/", gn, NULL);
+                k = strjoin(fn, "/", gn);
                 free(gn);
                 if (!k)
                         return -ENOMEM;
@@ -310,3 +314,81 @@ int show_cgroup_and_extra_by_spec(
 
         return show_cgroup_and_extra(controller, path, prefix, n_columns, extra_pids, n_extra_pids, flags);
 }
+
+int show_cgroup_get_unit_path_and_warn(
+                sd_bus *bus,
+                const char *unit,
+                char **ret) {
+
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        _cleanup_free_ char *path = NULL;
+        int r;
+
+        path = unit_dbus_path_from_name(unit);
+        if (!path)
+                return log_oom();
+
+        r = sd_bus_get_property_string(
+                        bus,
+                        "org.freedesktop.systemd1",
+                        path,
+                        unit_dbus_interface_from_name(unit),
+                        "ControlGroup",
+                        &error,
+                        ret);
+        if (r < 0)
+                return log_error_errno(r, "Failed to query unit control group path: %s",
+                                       bus_error_message(&error, r));
+
+        return 0;
+}
+
+int show_cgroup_get_path_and_warn(
+                const char *machine,
+                const char *prefix,
+                char **ret) {
+
+        int r;
+        _cleanup_free_ char *root = NULL;
+
+        if (machine) {
+                _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+                _cleanup_free_ char *unit = NULL;
+                const char *m;
+
+                m = strjoina("/run/systemd/machines/", machine);
+                r = parse_env_file(m, NEWLINE, "SCOPE", &unit, NULL);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to load machine data: %m");
+
+                r = bus_connect_transport_systemd(BUS_TRANSPORT_LOCAL, NULL, false, &bus);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to create bus connection: %m");
+
+                r = show_cgroup_get_unit_path_and_warn(bus, unit, &root);
+                if (r < 0)
+                        return r;
+        } else {
+                r = cg_get_root_path(&root);
+                if (r == -ENOMEDIUM)
+                        return log_error_errno(r, "Failed to get root control group path.\n"
+                                                  "No cgroup filesystem mounted on /sys/fs/cgroup");
+                else if (r < 0)
+                        return log_error_errno(r, "Failed to get root control group path: %m");
+        }
+
+        if (prefix) {
+                char *t;
+
+                t = strjoin(root, prefix);
+                if (!t)
+                        return log_oom();
+
+                *ret = t;
+        } else {
+                *ret = root;
+                root = NULL;
+        }
+
+        return 0;
+}
index 5c1d6e6..1764f76 100644 (file)
@@ -22,6 +22,8 @@
 #include <stdbool.h>
 #include <sys/types.h>
 
+#include "sd-bus.h"
+
 #include "logs-show.h"
 #include "output-mode.h"
 
@@ -30,3 +32,12 @@ int show_cgroup(const char *controller, const char *path, const char *prefix, un
 
 int show_cgroup_and_extra_by_spec(const char *spec, const char *prefix, unsigned n_columns, const pid_t extra_pids[], unsigned n_extra_pids, OutputFlags flags);
 int show_cgroup_and_extra(const char *controller, const char *path, const char *prefix, unsigned n_columns, const pid_t extra_pids[], unsigned n_extra_pids, OutputFlags flags);
+
+int show_cgroup_get_unit_path_and_warn(
+                sd_bus *bus,
+                const char *unit,
+                char **ret);
+int show_cgroup_get_path_and_warn(
+                const char *machine,
+                const char *prefix,
+                char **ret);
index a3ac7ae..f59f6f2 100644 (file)
 #include "dirent-util.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "log.h"
 #include "macro.h"
 #include "string-util.h"
 #include "strv.h"
+#include "user-util.h"
 
-static int clean_sysvipc_shm(uid_t delete_uid) {
+static bool match_uid_gid(uid_t subject_uid, gid_t subject_gid, uid_t delete_uid, gid_t delete_gid) {
+
+        if (uid_is_valid(delete_uid) && subject_uid == delete_uid)
+                return true;
+
+        if (gid_is_valid(delete_gid) && subject_gid == delete_gid)
+                return true;
+
+        return false;
+}
+
+static int clean_sysvipc_shm(uid_t delete_uid, gid_t delete_gid) {
         _cleanup_fclose_ FILE *f = NULL;
         char line[LINE_MAX];
         bool first = true;
@@ -77,7 +89,7 @@ static int clean_sysvipc_shm(uid_t delete_uid) {
                 if (n_attached > 0)
                         continue;
 
-                if (uid != delete_uid)
+                if (!match_uid_gid(uid, gid, delete_uid, delete_gid))
                         continue;
 
                 if (shmctl(shmid, IPC_RMID, NULL) < 0) {
@@ -89,7 +101,8 @@ static int clean_sysvipc_shm(uid_t delete_uid) {
                         ret = log_warning_errno(errno,
                                                 "Failed to remove SysV shared memory segment %i: %m",
                                                 shmid);
-                }
+                } else
+                        log_debug("Removed SysV shared memory segment %i.", shmid);
         }
 
         return ret;
@@ -98,7 +111,7 @@ fail:
         return log_warning_errno(errno, "Failed to read /proc/sysvipc/shm: %m");
 }
 
-static int clean_sysvipc_sem(uid_t delete_uid) {
+static int clean_sysvipc_sem(uid_t delete_uid, gid_t delete_gid) {
         _cleanup_fclose_ FILE *f = NULL;
         char line[LINE_MAX];
         bool first = true;
@@ -128,7 +141,7 @@ static int clean_sysvipc_sem(uid_t delete_uid) {
                            &semid, &uid, &gid, &cuid, &cgid) != 5)
                         continue;
 
-                if (uid != delete_uid)
+                if (!match_uid_gid(uid, gid, delete_uid, delete_gid))
                         continue;
 
                 if (semctl(semid, 0, IPC_RMID) < 0) {
@@ -140,7 +153,8 @@ static int clean_sysvipc_sem(uid_t delete_uid) {
                         ret = log_warning_errno(errno,
                                                 "Failed to remove SysV semaphores object %i: %m",
                                                 semid);
-                }
+                } else
+                        log_debug("Removed SysV semaphore %i.", semid);
         }
 
         return ret;
@@ -149,7 +163,7 @@ fail:
         return log_warning_errno(errno, "Failed to read /proc/sysvipc/sem: %m");
 }
 
-static int clean_sysvipc_msg(uid_t delete_uid) {
+static int clean_sysvipc_msg(uid_t delete_uid, gid_t delete_gid) {
         _cleanup_fclose_ FILE *f = NULL;
         char line[LINE_MAX];
         bool first = true;
@@ -180,7 +194,7 @@ static int clean_sysvipc_msg(uid_t delete_uid) {
                            &msgid, &cpid, &lpid, &uid, &gid, &cuid, &cgid) != 7)
                         continue;
 
-                if (uid != delete_uid)
+                if (!match_uid_gid(uid, gid, delete_uid, delete_gid))
                         continue;
 
                 if (msgctl(msgid, IPC_RMID, NULL) < 0) {
@@ -192,7 +206,8 @@ static int clean_sysvipc_msg(uid_t delete_uid) {
                         ret = log_warning_errno(errno,
                                                 "Failed to remove SysV message queue %i: %m",
                                                 msgid);
-                }
+                } else
+                        log_debug("Removed SysV message queue %i.", msgid);
         }
 
         return ret;
@@ -201,28 +216,27 @@ fail:
         return log_warning_errno(errno, "Failed to read /proc/sysvipc/msg: %m");
 }
 
-static int clean_posix_shm_internal(DIR *dir, uid_t uid) {
+static int clean_posix_shm_internal(DIR *dir, uid_t uid, gid_t gid) {
         struct dirent *de;
         int ret = 0, r;
 
         assert(dir);
 
-        FOREACH_DIRENT(de, dir, goto fail) {
+        FOREACH_DIRENT_ALL(de, dir, goto fail) {
                 struct stat st;
 
-                if (STR_IN_SET(de->d_name, "..", "."))
+                if (dot_or_dot_dot(de->d_name))
                         continue;
 
                 if (fstatat(dirfd(dir), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
                         if (errno == ENOENT)
                                 continue;
 
-                        log_warning_errno(errno, "Failed to stat() POSIX shared memory segment %s: %m", de->d_name);
-                        ret = -errno;
+                        ret = log_warning_errno(errno, "Failed to stat() POSIX shared memory segment %s: %m", de->d_name);
                         continue;
                 }
 
-                if (st.st_uid != uid)
+                if (!match_uid_gid(st.st_uid, st.st_gid, uid, gid))
                         continue;
 
                 if (S_ISDIR(st.st_mode)) {
@@ -230,12 +244,10 @@ static int clean_posix_shm_internal(DIR *dir, uid_t uid) {
 
                         kid = xopendirat(dirfd(dir), de->d_name, O_NOFOLLOW|O_NOATIME);
                         if (!kid) {
-                                if (errno != ENOENT) {
-                                        log_warning_errno(errno, "Failed to enter shared memory directory %s: %m", de->d_name);
-                                        ret = -errno;
-                                }
+                                if (errno != ENOENT)
+                                        ret = log_warning_errno(errno, "Failed to enter shared memory directory %s: %m", de->d_name);
                         } else {
-                                r = clean_posix_shm_internal(kid, uid);
+                                r = clean_posix_shm_internal(kid, uid, gid);
                                 if (r < 0)
                                         ret = r;
                         }
@@ -245,9 +257,9 @@ static int clean_posix_shm_internal(DIR *dir, uid_t uid) {
                                 if (errno == ENOENT)
                                         continue;
 
-                                log_warning_errno(errno, "Failed to remove POSIX shared memory directory %s: %m", de->d_name);
-                                ret = -errno;
-                        }
+                                ret = log_warning_errno(errno, "Failed to remove POSIX shared memory directory %s: %m", de->d_name);
+                        } else
+                                log_debug("Removed POSIX shared memory directory %s", de->d_name);
                 } else {
 
                         if (unlinkat(dirfd(dir), de->d_name, 0) < 0) {
@@ -255,20 +267,19 @@ static int clean_posix_shm_internal(DIR *dir, uid_t uid) {
                                 if (errno == ENOENT)
                                         continue;
 
-                                log_warning_errno(errno, "Failed to remove POSIX shared memory segment %s: %m", de->d_name);
-                                ret = -errno;
-                        }
+                                ret = log_warning_errno(errno, "Failed to remove POSIX shared memory segment %s: %m", de->d_name);
+                        } else
+                                log_debug("Removed POSIX shared memory segment %s", de->d_name);
                 }
         }
 
         return ret;
 
 fail:
-        log_warning_errno(errno, "Failed to read /dev/shm: %m");
-        return -errno;
+        return log_warning_errno(errno, "Failed to read /dev/shm: %m");
 }
 
-static int clean_posix_shm(uid_t uid) {
+static int clean_posix_shm(uid_t uid, gid_t gid) {
         _cleanup_closedir_ DIR *dir = NULL;
 
         dir = opendir("/dev/shm");
@@ -279,10 +290,10 @@ static int clean_posix_shm(uid_t uid) {
                 return log_warning_errno(errno, "Failed to open /dev/shm: %m");
         }
 
-        return clean_posix_shm_internal(dir, uid);
+        return clean_posix_shm_internal(dir, uid, gid);
 }
 
-static int clean_posix_mq(uid_t uid) {
+static int clean_posix_mq(uid_t uid, gid_t gid) {
         _cleanup_closedir_ DIR *dir = NULL;
         struct dirent *de;
         int ret = 0;
@@ -295,11 +306,11 @@ static int clean_posix_mq(uid_t uid) {
                 return log_warning_errno(errno, "Failed to open /dev/mqueue: %m");
         }
 
-        FOREACH_DIRENT(de, dir, goto fail) {
+        FOREACH_DIRENT_ALL(de, dir, goto fail) {
                 struct stat st;
                 char fn[1+strlen(de->d_name)+1];
 
-                if (STR_IN_SET(de->d_name, "..", "."))
+                if (dot_or_dot_dot(de->d_name))
                         continue;
 
                 if (fstatat(dirfd(dir), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
@@ -312,7 +323,7 @@ static int clean_posix_mq(uid_t uid) {
                         continue;
                 }
 
-                if (st.st_uid != uid)
+                if (!match_uid_gid(st.st_uid, st.st_gid, uid, gid))
                         continue;
 
                 fn[0] = '/';
@@ -325,7 +336,8 @@ static int clean_posix_mq(uid_t uid) {
                         ret = log_warning_errno(errno,
                                                 "Failed to unlink POSIX message queue %s: %m",
                                                 fn);
-                }
+                } else
+                        log_debug("Removed POSIX message queue %s", fn);
         }
 
         return ret;
@@ -334,32 +346,44 @@ fail:
         return log_warning_errno(errno, "Failed to read /dev/mqueue: %m");
 }
 
-int clean_ipc(uid_t uid) {
+int clean_ipc(uid_t uid, gid_t gid) {
         int ret = 0, r;
 
-        /* Refuse to clean IPC of the root and system users */
-        if (uid <= SYSTEM_UID_MAX)
+        /* Anything to do? */
+        if (!uid_is_valid(uid) && !gid_is_valid(gid))
+                return 0;
+
+        /* Refuse to clean IPC of the root user */
+        if (uid == 0 && gid == 0)
                 return 0;
 
-        r = clean_sysvipc_shm(uid);
+        r = clean_sysvipc_shm(uid, gid);
         if (r < 0)
                 ret = r;
 
-        r = clean_sysvipc_sem(uid);
+        r = clean_sysvipc_sem(uid, gid);
         if (r < 0)
                 ret = r;
 
-        r = clean_sysvipc_msg(uid);
+        r = clean_sysvipc_msg(uid, gid);
         if (r < 0)
                 ret = r;
 
-        r = clean_posix_shm(uid);
+        r = clean_posix_shm(uid, gid);
         if (r < 0)
                 ret = r;
 
-        r = clean_posix_mq(uid);
+        r = clean_posix_mq(uid, gid);
         if (r < 0)
                 ret = r;
 
         return ret;
 }
+
+int clean_ipc_by_uid(uid_t uid) {
+        return clean_ipc(uid, GID_INVALID);
+}
+
+int clean_ipc_by_gid(gid_t gid) {
+        return clean_ipc(UID_INVALID, gid);
+}
index 44a83af..6ca57f4 100644 (file)
@@ -21,4 +21,6 @@
 
 #include <sys/types.h>
 
-int clean_ipc(uid_t uid);
+int clean_ipc(uid_t uid, gid_t gid);
+int clean_ipc_by_uid(uid_t uid);
+int clean_ipc_by_gid(gid_t gid);
index 6bb42c0..1af74c6 100644 (file)
@@ -24,6 +24,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sys/stat.h>
+#include <sys/types.h>
 #include <time.h>
 #include <unistd.h>
 
@@ -37,6 +38,7 @@
 #include "condition.h"
 #include "extract-word.h"
 #include "fd-util.h"
+#include "fileio.h"
 #include "glob-util.h"
 #include "hostname-util.h"
 #include "ima-util.h"
@@ -51,6 +53,7 @@
 #include "stat-util.h"
 #include "string-table.h"
 #include "string-util.h"
+#include "user-util.h"
 #include "util.h"
 #include "virt.h"
 
@@ -110,9 +113,8 @@ static int condition_test_kernel_command_line(Condition *c) {
                 return r;
 
         equal = !!strchr(c->parameter, '=');
-        p = line;
 
-        for (;;) {
+        for (p = line;;) {
                 _cleanup_free_ char *word = NULL;
                 bool found;
 
@@ -138,6 +140,60 @@ static int condition_test_kernel_command_line(Condition *c) {
         return false;
 }
 
+static int condition_test_user(Condition *c) {
+        uid_t id;
+        int r;
+        _cleanup_free_ char *username = NULL;
+        const char *u;
+
+        assert(c);
+        assert(c->parameter);
+        assert(c->type == CONDITION_USER);
+
+        r = parse_uid(c->parameter, &id);
+        if (r >= 0)
+                return id == getuid() || id == geteuid();
+
+        if (streq("@system", c->parameter))
+                return getuid() <= SYSTEM_UID_MAX || geteuid() <= SYSTEM_UID_MAX;
+
+        username = getusername_malloc();
+        if (!username)
+                return -ENOMEM;
+
+        if (streq(username, c->parameter))
+                return 1;
+
+        if (getpid() == 1)
+                return streq(c->parameter, "root");
+
+        u = c->parameter;
+        r = get_user_creds(&u, &id, NULL, NULL, NULL);
+        if (r < 0)
+                return 0;
+
+        return id == getuid() || id == geteuid();
+}
+
+static int condition_test_group(Condition *c) {
+        gid_t id;
+        int r;
+
+        assert(c);
+        assert(c->parameter);
+        assert(c->type == CONDITION_GROUP);
+
+        r = parse_gid(c->parameter, &id);
+        if (r >= 0)
+                return in_gid(id);
+
+        /* Avoid any NSS lookups if we are PID1 */
+        if (getpid() == 1)
+                return streq(c->parameter, "root");
+
+        return in_group(c->parameter) > 0;
+}
+
 static int condition_test_virtualization(Condition *c) {
         int b, v;
 
@@ -145,25 +201,24 @@ static int condition_test_virtualization(Condition *c) {
         assert(c->parameter);
         assert(c->type == CONDITION_VIRTUALIZATION);
 
+        if (streq(c->parameter, "private-users"))
+                return running_in_userns();
+
         v = detect_virtualization();
         if (v < 0)
                 return v;
 
         /* First, compare with yes/no */
         b = parse_boolean(c->parameter);
-
-        if (v > 0 && b > 0)
-                return true;
-
-        if (v == 0 && b == 0)
-                return true;
+        if (b >= 0)
+                return b == !!v;
 
         /* Then, compare categorization */
-        if (VIRTUALIZATION_IS_VM(v) && streq(c->parameter, "vm"))
-                return true;
+        if (streq(c->parameter, "vm"))
+                return VIRTUALIZATION_IS_VM(v);
 
-        if (VIRTUALIZATION_IS_CONTAINER(v) && streq(c->parameter, "container"))
-                return true;
+        if (streq(c->parameter, "container"))
+                return VIRTUALIZATION_IS_CONTAINER(v);
 
         /* Finally compare id */
         return v != VIRTUALIZATION_NONE && streq(c->parameter, virtualization_to_string(v));
@@ -236,7 +291,7 @@ static int condition_test_security(Condition *c) {
         assert(c->type == CONDITION_SECURITY);
 
         if (streq(c->parameter, "selinux"))
-                return mac_selinux_have();
+                return mac_selinux_use();
         if (streq(c->parameter, "smack"))
                 return mac_smack_use();
         if (streq(c->parameter, "apparmor"))
@@ -309,8 +364,44 @@ static int condition_test_needs_update(Condition *c) {
         if (lstat("/usr/", &usr) < 0)
                 return true;
 
-        return usr.st_mtim.tv_sec > other.st_mtim.tv_sec ||
-                (usr.st_mtim.tv_sec == other.st_mtim.tv_sec && usr.st_mtim.tv_nsec > other.st_mtim.tv_nsec);
+        /*
+         * First, compare seconds as they are always accurate...
+         */
+        if (usr.st_mtim.tv_sec != other.st_mtim.tv_sec)
+                return usr.st_mtim.tv_sec > other.st_mtim.tv_sec;
+
+        /*
+         * ...then compare nanoseconds.
+         *
+         * A false positive is only possible when /usr's nanoseconds > 0
+         * (otherwise /usr cannot be strictly newer than the target file)
+         * AND the target file's nanoseconds == 0
+         * (otherwise the filesystem supports nsec timestamps, see stat(2)).
+         */
+        if (usr.st_mtim.tv_nsec > 0 && other.st_mtim.tv_nsec == 0) {
+                _cleanup_free_ char *timestamp_str = NULL;
+                uint64_t timestamp;
+                int r;
+
+                r = parse_env_file(p, NULL, "TIMESTAMP_NSEC", &timestamp_str, NULL);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to parse timestamp file '%s', using mtime: %m", p);
+                        return true;
+                } else if (r == 0) {
+                        log_debug("No data in timestamp file '%s', using mtime", p);
+                        return true;
+                }
+
+                r = safe_atou64(timestamp_str, &timestamp);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to parse timestamp value '%s' in file '%s', using mtime: %m", timestamp_str, p);
+                        return true;
+                }
+
+                timespec_store(&other.st_mtim, timestamp);
+        }
+
+        return usr.st_mtim.tv_nsec > other.st_mtim.tv_nsec;
 }
 
 static int condition_test_first_boot(Condition *c) {
@@ -364,7 +455,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, AT_SYMLINK_FOLLOW) > 0;
+        return path_is_mount_point(c->parameter, NULL, AT_SYMLINK_FOLLOW) > 0;
 }
 
 static int condition_test_path_is_read_write(Condition *c) {
@@ -440,6 +531,8 @@ int condition_test(Condition *c) {
                 [CONDITION_ARCHITECTURE] = condition_test_architecture,
                 [CONDITION_NEEDS_UPDATE] = condition_test_needs_update,
                 [CONDITION_FIRST_BOOT] = condition_test_first_boot,
+                [CONDITION_USER] = condition_test_user,
+                [CONDITION_GROUP] = condition_test_group,
                 [CONDITION_NULL] = condition_test_null,
         };
 
@@ -503,6 +596,8 @@ static const char* const condition_type_table[_CONDITION_TYPE_MAX] = {
         [CONDITION_DIRECTORY_NOT_EMPTY] = "ConditionDirectoryNotEmpty",
         [CONDITION_FILE_NOT_EMPTY] = "ConditionFileNotEmpty",
         [CONDITION_FILE_IS_EXECUTABLE] = "ConditionFileIsExecutable",
+        [CONDITION_USER] = "ConditionUser",
+        [CONDITION_GROUP] = "ConditionGroup",
         [CONDITION_NULL] = "ConditionNull"
 };
 
@@ -527,6 +622,8 @@ static const char* const assert_type_table[_CONDITION_TYPE_MAX] = {
         [CONDITION_DIRECTORY_NOT_EMPTY] = "AssertDirectoryNotEmpty",
         [CONDITION_FILE_NOT_EMPTY] = "AssertFileNotEmpty",
         [CONDITION_FILE_IS_EXECUTABLE] = "AssertFileIsExecutable",
+        [CONDITION_USER] = "AssertUser",
+        [CONDITION_GROUP] = "AssertGroup",
         [CONDITION_NULL] = "AssertNull"
 };
 
index bdda04b..d0b592b 100644 (file)
@@ -49,6 +49,9 @@ typedef enum ConditionType {
 
         CONDITION_NULL,
 
+        CONDITION_USER,
+        CONDITION_GROUP,
+
         _CONDITION_TYPE_MAX,
         _CONDITION_TYPE_INVALID = -1
 } ConditionType;
index 7cf222e..e08402e 100644 (file)
@@ -101,7 +101,7 @@ int config_item_perf_lookup(
         else {
                 char *key;
 
-                key = strjoin(section, ".", lvalue, NULL);
+                key = strjoin(section, ".", lvalue);
                 if (!key)
                         return -ENOMEM;
 
@@ -396,22 +396,18 @@ int config_parse(const char *unit,
         return 0;
 }
 
-/* Parse each config file in the specified directories. */
-int config_parse_many(const char *conf_file,
-                      const char *conf_file_dirs,
-                      const char *sections,
-                      ConfigItemLookup lookup,
-                      const void *table,
-                      bool relaxed,
-                      void *userdata) {
-        _cleanup_strv_free_ char **files = NULL;
+static int config_parse_many_files(
+                const char *conf_file,
+                char **files,
+                const char *sections,
+                ConfigItemLookup lookup,
+                const void *table,
+                bool relaxed,
+                void *userdata) {
+
         char **fn;
         int r;
 
-        r = conf_files_list_nulstr(&files, ".conf", NULL, conf_file_dirs);
-        if (r < 0)
-                return r;
-
         if (conf_file) {
                 r = config_parse(NULL, conf_file, NULL, sections, lookup, table, relaxed, false, true, userdata);
                 if (r < 0)
@@ -427,6 +423,56 @@ int config_parse_many(const char *conf_file,
         return 0;
 }
 
+/* Parse each config file in the directories specified as nulstr. */
+int config_parse_many_nulstr(
+                const char *conf_file,
+                const char *conf_file_dirs,
+                const char *sections,
+                ConfigItemLookup lookup,
+                const void *table,
+                bool relaxed,
+                void *userdata) {
+
+        _cleanup_strv_free_ char **files = NULL;
+        int r;
+
+        r = conf_files_list_nulstr(&files, ".conf", NULL, conf_file_dirs);
+        if (r < 0)
+                return r;
+
+        return config_parse_many_files(conf_file, files,
+                                       sections, lookup, table, relaxed, userdata);
+}
+
+/* Parse each config file in the directories specified as strv. */
+int config_parse_many(
+                const char *conf_file,
+                const char* const* conf_file_dirs,
+                const char *dropin_dirname,
+                const char *sections,
+                ConfigItemLookup lookup,
+                const void *table,
+                bool relaxed,
+                void *userdata) {
+
+        _cleanup_strv_free_ char **dropin_dirs = NULL;
+        _cleanup_strv_free_ char **files = NULL;
+        const char *suffix;
+        int r;
+
+        suffix = strjoina("/", dropin_dirname);
+        r = strv_extend_strv_concat(&dropin_dirs, (char**) conf_file_dirs, suffix);
+        if (r < 0)
+                return r;
+
+        r = conf_files_list_strv(&files, ".conf", NULL, (const char* const*) dropin_dirs);
+        if (r < 0)
+                return r;
+
+        return config_parse_many_files(conf_file, files,
+                                       sections, lookup, table, relaxed, userdata);
+}
+
 #define DEFINE_PARSER(type, vartype, conv_func)                         \
         int config_parse_##type(                                        \
                         const char *unit,                               \
@@ -460,6 +506,8 @@ int config_parse_many(const char *conf_file,
 
 DEFINE_PARSER(int, int, safe_atoi);
 DEFINE_PARSER(long, long, safe_atoli);
+DEFINE_PARSER(uint8, uint8_t, safe_atou8);
+DEFINE_PARSER(uint16, uint16_t, safe_atou16);
 DEFINE_PARSER(uint32, uint32_t, safe_atou32);
 DEFINE_PARSER(uint64, uint64_t, safe_atou64);
 DEFINE_PARSER(unsigned, unsigned, safe_atou);
@@ -567,6 +615,7 @@ int config_parse_bool(const char* unit,
 
         int k;
         bool *b = data;
+        bool fatal = ltype;
 
         assert(filename);
         assert(lvalue);
@@ -575,8 +624,10 @@ int config_parse_bool(const char* unit,
 
         k = parse_boolean(rvalue);
         if (k < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, k, "Failed to parse boolean value, ignoring: %s", rvalue);
-                return 0;
+                log_syntax(unit, LOG_ERR, filename, line, k,
+                           "Failed to parse boolean value%s: %s",
+                           fatal ? "" : ", ignoring", rvalue);
+                return fatal ? -ENOEXEC : 0;
         }
 
         *b = !!k;
@@ -667,6 +718,7 @@ int config_parse_path(
                 void *userdata) {
 
         char **s = data, *n;
+        bool fatal = ltype;
 
         assert(filename);
         assert(lvalue);
@@ -675,12 +727,14 @@ int config_parse_path(
 
         if (!utf8_is_valid(rvalue)) {
                 log_syntax_invalid_utf8(unit, LOG_ERR, filename, line, rvalue);
-                return 0;
+                return fatal ? -ENOEXEC : 0;
         }
 
         if (!path_is_absolute(rvalue)) {
-                log_syntax(unit, LOG_ERR, filename, line, 0, "Not an absolute path, ignoring: %s", rvalue);
-                return 0;
+                log_syntax(unit, LOG_ERR, filename, line, 0,
+                           "Not an absolute path%s: %s",
+                           fatal ? "" : ", ignoring", rvalue);
+                return fatal ? -ENOEXEC : 0;
         }
 
         n = strdup(rvalue);
@@ -734,7 +788,7 @@ int config_parse_strv(const char *unit,
         for (;;) {
                 char *word = NULL;
 
-                r = extract_first_word(&rvalue, &word, WHITESPACE, EXTRACT_QUOTES|EXTRACT_RETAIN_ESCAPE);
+                r = extract_first_word(&rvalue, &word, NULL, EXTRACT_QUOTES|EXTRACT_RETAIN_ESCAPE);
                 if (r == 0)
                         break;
                 if (r == -ENOMEM)
@@ -745,7 +799,7 @@ int config_parse_strv(const char *unit,
                 }
 
                 if (!utf8_is_valid(word)) {
-                        log_syntax_invalid_utf8(unit, LOG_ERR, filename, line, rvalue);
+                        log_syntax_invalid_utf8(unit, LOG_ERR, filename, line, word);
                         free(word);
                         continue;
                 }
@@ -912,3 +966,40 @@ int config_parse_ifname(
 
         return 0;
 }
+
+int config_parse_ip_port(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        uint16_t *s = data;
+        uint16_t port;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        if (isempty(rvalue)) {
+                *s = 0;
+                return 0;
+        }
+
+        r = parse_ip_port(rvalue, &port);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse port '%s'.", rvalue);
+                return 0;
+        }
+
+        *s = port;
+
+        return 0;
+}
index f6964e3..ce11134 100644 (file)
@@ -84,29 +84,43 @@ int config_item_table_lookup(const void *table, const char *section, const char
  * ConfigPerfItem tables */
 int config_item_perf_lookup(const void *table, const char *section, const char *lvalue, ConfigParserCallback *func, int *ltype, void **data, void *userdata);
 
-int config_parse(const char *unit,
-                 const char *filename,
-                 FILE *f,
-                 const char *sections,  /* nulstr */
-                 ConfigItemLookup lookup,
-                 const void *table,
-                 bool relaxed,
-                 bool allow_include,
-                 bool warn,
-                 void *userdata);
-
-int config_parse_many(const char *conf_file,      /* possibly NULL */
-                      const char *conf_file_dirs, /* nulstr */
-                      const char *sections,       /* nulstr */
-                      ConfigItemLookup lookup,
-                      const void *table,
-                      bool relaxed,
-                      void *userdata);
+int config_parse(
+                const char *unit,
+                const char *filename,
+                FILE *f,
+                const char *sections,  /* nulstr */
+                ConfigItemLookup lookup,
+                const void *table,
+                bool relaxed,
+                bool allow_include,
+                bool warn,
+                void *userdata);
+
+int config_parse_many_nulstr(
+                const char *conf_file,      /* possibly NULL */
+                const char *conf_file_dirs, /* nulstr */
+                const char *sections,       /* nulstr */
+                ConfigItemLookup lookup,
+                const void *table,
+                bool relaxed,
+                void *userdata);
+
+int config_parse_many(
+                const char *conf_file,      /* possibly NULL */
+                const char* const* conf_file_dirs,
+                const char *dropin_dirname,
+                const char *sections,       /* nulstr */
+                ConfigItemLookup lookup,
+                const void *table,
+                bool relaxed,
+                void *userdata);
 
 /* Generic parsers */
 int config_parse_int(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_unsigned(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_long(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_uint8(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_uint16(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_uint32(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_uint64(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_double(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line,  const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
@@ -126,6 +140,7 @@ int config_parse_log_level(const char *unit, const char *filename, unsigned line
 int config_parse_signal(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_personality(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_ifname(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_ip_port(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 
 #define DEFINE_CONFIG_PARSE_ENUM(function,name,type,msg)                \
         int function(const char *unit,                                  \
diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c
new file mode 100644 (file)
index 0000000..505a83f
--- /dev/null
@@ -0,0 +1,1183 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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/>.
+***/
+
+#ifdef HAVE_LIBCRYPTSETUP
+#include <libcryptsetup.h>
+#endif
+#include <sys/mount.h>
+
+#include "architecture.h"
+#include "ask-password-api.h"
+#include "blkid-util.h"
+#include "dissect-image.h"
+#include "fd-util.h"
+#include "fileio.h"
+#include "fs-util.h"
+#include "gpt.h"
+#include "hexdecoct.h"
+#include "linux-3.13/dm-ioctl.h"
+#include "mount-util.h"
+#include "path-util.h"
+#include "stat-util.h"
+#include "stdio-util.h"
+#include "string-table.h"
+#include "string-util.h"
+#include "strv.h"
+#include "udev-util.h"
+#include "xattr-util.h"
+
+_unused_ static int probe_filesystem(const char *node, char **ret_fstype) {
+#ifdef HAVE_BLKID
+        _cleanup_blkid_free_probe_ blkid_probe b = NULL;
+        const char *fstype;
+        int r;
+
+        b = blkid_new_probe_from_filename(node);
+        if (!b)
+                return -ENOMEM;
+
+        blkid_probe_enable_superblocks(b, 1);
+        blkid_probe_set_superblocks_flags(b, BLKID_SUBLKS_TYPE);
+
+        errno = 0;
+        r = blkid_do_safeprobe(b);
+        if (r == -2 || r == 1) {
+                log_debug("Failed to identify any partition type on partition %s", node);
+                goto not_found;
+        }
+        if (r != 0)
+                return -errno ?: -EIO;
+
+        (void) blkid_probe_lookup_value(b, "TYPE", &fstype, NULL);
+
+        if (fstype) {
+                char *t;
+
+                t = strdup(fstype);
+                if (!t)
+                        return -ENOMEM;
+
+                *ret_fstype = t;
+                return 1;
+        }
+
+not_found:
+        *ret_fstype = NULL;
+        return 0;
+#else
+        return -EOPNOTSUPP;
+#endif
+}
+
+int dissect_image(int fd, const void *root_hash, size_t root_hash_size, DissectImageFlags flags, DissectedImage **ret) {
+
+#ifdef HAVE_BLKID
+        sd_id128_t root_uuid = SD_ID128_NULL, verity_uuid = SD_ID128_NULL;
+        _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL;
+        bool is_gpt, is_mbr, generic_rw, multiple_generic = false;
+        _cleanup_udev_device_unref_ struct udev_device *d = NULL;
+        _cleanup_(dissected_image_unrefp) DissectedImage *m = NULL;
+        _cleanup_blkid_free_probe_ blkid_probe b = NULL;
+        _cleanup_udev_unref_ struct udev *udev = NULL;
+        _cleanup_free_ char *generic_node = NULL;
+        sd_id128_t generic_uuid = SD_ID128_NULL;
+        const char *pttype = NULL;
+        struct udev_list_entry *first, *item;
+        blkid_partlist pl;
+        int r, generic_nr;
+        struct stat st;
+        unsigned i;
+
+        assert(fd >= 0);
+        assert(ret);
+        assert(root_hash || root_hash_size == 0);
+
+        /* Probes a disk image, and returns information about what it found in *ret.
+         *
+         * Returns -ENOPKG if no suitable partition table or file system could be found.
+         * Returns -EADDRNOTAVAIL if a root hash was specified but no matching root/verity partitions found. */
+
+        if (root_hash) {
+                /* If a root hash is supplied, then we use the root partition that has a UUID that match the first
+                 * 128bit of the root hash. And we use the verity partition that has a UUID that match the final
+                 * 128bit. */
+
+                if (root_hash_size < sizeof(sd_id128_t))
+                        return -EINVAL;
+
+                memcpy(&root_uuid, root_hash, sizeof(sd_id128_t));
+                memcpy(&verity_uuid, (const uint8_t*) root_hash + root_hash_size - sizeof(sd_id128_t), sizeof(sd_id128_t));
+
+                if (sd_id128_is_null(root_uuid))
+                        return -EINVAL;
+                if (sd_id128_is_null(verity_uuid))
+                        return -EINVAL;
+        }
+
+        if (fstat(fd, &st) < 0)
+                return -errno;
+
+        if (!S_ISBLK(st.st_mode))
+                return -ENOTBLK;
+
+        b = blkid_new_probe();
+        if (!b)
+                return -ENOMEM;
+
+        errno = 0;
+        r = blkid_probe_set_device(b, fd, 0, 0);
+        if (r != 0)
+                return -errno ?: -ENOMEM;
+
+        if ((flags & DISSECT_IMAGE_GPT_ONLY) == 0) {
+                /* Look for file system superblocks, unless we only shall look for GPT partition tables */
+                blkid_probe_enable_superblocks(b, 1);
+                blkid_probe_set_superblocks_flags(b, BLKID_SUBLKS_TYPE|BLKID_SUBLKS_USAGE);
+        }
+
+        blkid_probe_enable_partitions(b, 1);
+        blkid_probe_set_partitions_flags(b, BLKID_PARTS_ENTRY_DETAILS);
+
+        errno = 0;
+        r = blkid_do_safeprobe(b);
+        if (r == -2 || r == 1) {
+                log_debug("Failed to identify any partition table.");
+                return -ENOPKG;
+        }
+        if (r != 0)
+                return -errno ?: -EIO;
+
+        m = new0(DissectedImage, 1);
+        if (!m)
+                return -ENOMEM;
+
+        if (!(flags & DISSECT_IMAGE_GPT_ONLY) &&
+            (flags & DISSECT_IMAGE_REQUIRE_ROOT)) {
+                const char *usage = NULL;
+
+                (void) blkid_probe_lookup_value(b, "USAGE", &usage, NULL);
+                if (STRPTR_IN_SET(usage, "filesystem", "crypto")) {
+                        _cleanup_free_ char *t = NULL, *n = NULL;
+                        const char *fstype = NULL;
+
+                        /* OK, we have found a file system, that's our root partition then. */
+                        (void) blkid_probe_lookup_value(b, "TYPE", &fstype, NULL);
+
+                        if (fstype) {
+                                t = strdup(fstype);
+                                if (!t)
+                                        return -ENOMEM;
+                        }
+
+                        if (asprintf(&n, "/dev/block/%u:%u", major(st.st_rdev), minor(st.st_rdev)) < 0)
+                                return -ENOMEM;
+
+                        m->partitions[PARTITION_ROOT] = (DissectedPartition) {
+                                .found = true,
+                                .rw = true,
+                                .partno = -1,
+                                .architecture = _ARCHITECTURE_INVALID,
+                                .fstype = t,
+                                .node = n,
+                        };
+
+                        t = n = NULL;
+
+                        m->encrypted = streq(fstype, "crypto_LUKS");
+
+                        *ret = m;
+                        m = NULL;
+
+                        return 0;
+                }
+        }
+
+        (void) blkid_probe_lookup_value(b, "PTTYPE", &pttype, NULL);
+        if (!pttype)
+                return -ENOPKG;
+
+        is_gpt = streq_ptr(pttype, "gpt");
+        is_mbr = streq_ptr(pttype, "dos");
+
+        if (!is_gpt && ((flags & DISSECT_IMAGE_GPT_ONLY) || !is_mbr))
+                return -ENOPKG;
+
+        errno = 0;
+        pl = blkid_probe_get_partitions(b);
+        if (!pl)
+                return -errno ?: -ENOMEM;
+
+        udev = udev_new();
+        if (!udev)
+                return -errno;
+
+        d = udev_device_new_from_devnum(udev, 'b', st.st_rdev);
+        if (!d)
+                return -ENOMEM;
+
+        for (i = 0;; i++) {
+                int n, z;
+
+                if (i >= 10) {
+                        log_debug("Kernel partitions never appeared.");
+                        return -ENXIO;
+                }
+
+                e = udev_enumerate_new(udev);
+                if (!e)
+                        return -errno;
+
+                r = udev_enumerate_add_match_parent(e, d);
+                if (r < 0)
+                        return r;
+
+                r = udev_enumerate_scan_devices(e);
+                if (r < 0)
+                        return r;
+
+                /* Count the partitions enumerated by the kernel */
+                n = 0;
+                first = udev_enumerate_get_list_entry(e);
+                udev_list_entry_foreach(item, first)
+                        n++;
+
+                /* Count the partitions enumerated by blkid */
+                z = blkid_partlist_numof_partitions(pl);
+                if (n == z + 1)
+                        break;
+                if (n > z + 1) {
+                        log_debug("blkid and kernel partition list do not match.");
+                        return -EIO;
+                }
+                if (n < z + 1) {
+                        unsigned j;
+
+                        /* The kernel has probed fewer partitions than blkid? Maybe the kernel prober is still running
+                         * or it got EBUSY because udev already opened the device. Let's reprobe the device, which is a
+                         * synchronous call that waits until probing is complete. */
+
+                        for (j = 0; j < 20; j++) {
+
+                                r = ioctl(fd, BLKRRPART, 0);
+                                if (r < 0)
+                                        r = -errno;
+                                if (r >= 0 || r != -EBUSY)
+                                        break;
+
+                                /* If something else has the device open, such as an udev rule, the ioctl will return
+                                 * EBUSY. Since there's no way to wait until it isn't busy anymore, let's just wait a
+                                 * bit, and try again.
+                                 *
+                                 * This is really something they should fix in the kernel! */
+
+                                usleep(50 * USEC_PER_MSEC);
+                        }
+
+                        if (r < 0)
+                                return r;
+                }
+
+                e = udev_enumerate_unref(e);
+        }
+
+        first = udev_enumerate_get_list_entry(e);
+        udev_list_entry_foreach(item, first) {
+                _cleanup_udev_device_unref_ struct udev_device *q;
+                unsigned long long pflags;
+                blkid_partition pp;
+                const char *node, *sysname;
+                dev_t qn;
+                int nr;
+
+                q = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item));
+                if (!q)
+                        return -errno;
+
+                qn = udev_device_get_devnum(q);
+                if (major(qn) == 0)
+                        continue;
+
+                if (st.st_rdev == qn)
+                        continue;
+
+                /* Filter out weird MMC RPMB partitions, which cannot reasonably be read, see
+                 * https://github.com/systemd/systemd/issues/5806 */
+                sysname = udev_device_get_sysname(q);
+                if (sysname && startswith(sysname, "mmcblk") && endswith(sysname, "rpmb"))
+                        continue;
+
+                node = udev_device_get_devnode(q);
+                if (!node)
+                        continue;
+
+                pp = blkid_partlist_devno_to_partition(pl, qn);
+                if (!pp)
+                        continue;
+
+                pflags = blkid_partition_get_flags(pp);
+
+                nr = blkid_partition_get_partno(pp);
+                if (nr < 0)
+                        continue;
+
+                if (is_gpt) {
+                        int designator = _PARTITION_DESIGNATOR_INVALID, architecture = _ARCHITECTURE_INVALID;
+                        const char *stype, *sid, *fstype = NULL;
+                        sd_id128_t type_id, id;
+                        bool rw = true;
+
+                        sid = blkid_partition_get_uuid(pp);
+                        if (!sid)
+                                continue;
+                        if (sd_id128_from_string(sid, &id) < 0)
+                                continue;
+
+                        stype = blkid_partition_get_type_string(pp);
+                        if (!stype)
+                                continue;
+                        if (sd_id128_from_string(stype, &type_id) < 0)
+                                continue;
+
+                        if (sd_id128_equal(type_id, GPT_HOME)) {
+
+                                if (pflags & GPT_FLAG_NO_AUTO)
+                                        continue;
+
+                                designator = PARTITION_HOME;
+                                rw = !(pflags & GPT_FLAG_READ_ONLY);
+                        } else if (sd_id128_equal(type_id, GPT_SRV)) {
+
+                                if (pflags & GPT_FLAG_NO_AUTO)
+                                        continue;
+
+                                designator = PARTITION_SRV;
+                                rw = !(pflags & GPT_FLAG_READ_ONLY);
+                        } else if (sd_id128_equal(type_id, GPT_ESP)) {
+
+                                /* Note that we don't check the GPT_FLAG_NO_AUTO flag for the ESP, as it is not defined
+                                 * there. We instead check the GPT_FLAG_NO_BLOCK_IO_PROTOCOL, as recommended by the
+                                 * UEFI spec (See "12.3.3 Number and Location of System Partitions"). */
+
+                                if (pflags & GPT_FLAG_NO_BLOCK_IO_PROTOCOL)
+                                        continue;
+
+                                designator = PARTITION_ESP;
+                                fstype = "vfat";
+                        }
+#ifdef GPT_ROOT_NATIVE
+                        else if (sd_id128_equal(type_id, GPT_ROOT_NATIVE)) {
+
+                                if (pflags & GPT_FLAG_NO_AUTO)
+                                        continue;
+
+                                /* If a root ID is specified, ignore everything but the root id */
+                                if (!sd_id128_is_null(root_uuid) && !sd_id128_equal(root_uuid, id))
+                                        continue;
+
+                                designator = PARTITION_ROOT;
+                                architecture = native_architecture();
+                                rw = !(pflags & GPT_FLAG_READ_ONLY);
+                        } else if (sd_id128_equal(type_id, GPT_ROOT_NATIVE_VERITY)) {
+
+                                if (pflags & GPT_FLAG_NO_AUTO)
+                                        continue;
+
+                                m->can_verity = true;
+
+                                /* Ignore verity unless a root hash is specified */
+                                if (sd_id128_is_null(verity_uuid) || !sd_id128_equal(verity_uuid, id))
+                                        continue;
+
+                                designator = PARTITION_ROOT_VERITY;
+                                fstype = "DM_verity_hash";
+                                architecture = native_architecture();
+                                rw = false;
+                        }
+#endif
+#ifdef GPT_ROOT_SECONDARY
+                        else if (sd_id128_equal(type_id, GPT_ROOT_SECONDARY)) {
+
+                                if (pflags & GPT_FLAG_NO_AUTO)
+                                        continue;
+
+                                /* If a root ID is specified, ignore everything but the root id */
+                                if (!sd_id128_is_null(root_uuid) && !sd_id128_equal(root_uuid, id))
+                                        continue;
+
+                                designator = PARTITION_ROOT_SECONDARY;
+                                architecture = SECONDARY_ARCHITECTURE;
+                                rw = !(pflags & GPT_FLAG_READ_ONLY);
+                        } else if (sd_id128_equal(type_id, GPT_ROOT_SECONDARY_VERITY)) {
+
+                                if (pflags & GPT_FLAG_NO_AUTO)
+                                        continue;
+
+                                m->can_verity = true;
+
+                                /* Ignore verity unless root has is specified */
+                                if (sd_id128_is_null(verity_uuid) || !sd_id128_equal(verity_uuid, id))
+                                        continue;
+
+                                designator = PARTITION_ROOT_SECONDARY_VERITY;
+                                fstype = "DM_verity_hash";
+                                architecture = SECONDARY_ARCHITECTURE;
+                                rw = false;
+                        }
+#endif
+                        else if (sd_id128_equal(type_id, GPT_SWAP)) {
+
+                                if (pflags & GPT_FLAG_NO_AUTO)
+                                        continue;
+
+                                designator = PARTITION_SWAP;
+                                fstype = "swap";
+                        } else if (sd_id128_equal(type_id, GPT_LINUX_GENERIC)) {
+
+                                if (pflags & GPT_FLAG_NO_AUTO)
+                                        continue;
+
+                                if (generic_node)
+                                        multiple_generic = true;
+                                else {
+                                        generic_nr = nr;
+                                        generic_rw = !(pflags & GPT_FLAG_READ_ONLY);
+                                        generic_uuid = id;
+                                        generic_node = strdup(node);
+                                        if (!generic_node)
+                                                return -ENOMEM;
+                                }
+                        }
+
+                        if (designator != _PARTITION_DESIGNATOR_INVALID) {
+                                _cleanup_free_ char *t = NULL, *n = NULL;
+
+                                /* First one wins */
+                                if (m->partitions[designator].found)
+                                        continue;
+
+                                if (fstype) {
+                                        t = strdup(fstype);
+                                        if (!t)
+                                                return -ENOMEM;
+                                }
+
+                                n = strdup(node);
+                                if (!n)
+                                        return -ENOMEM;
+
+                                m->partitions[designator] = (DissectedPartition) {
+                                        .found = true,
+                                        .partno = nr,
+                                        .rw = rw,
+                                        .architecture = architecture,
+                                        .node = n,
+                                        .fstype = t,
+                                        .uuid = id,
+                                };
+
+                                n = t = NULL;
+                        }
+
+                } else if (is_mbr) {
+
+                        if (pflags != 0x80) /* Bootable flag */
+                                continue;
+
+                        if (blkid_partition_get_type(pp) != 0x83) /* Linux partition */
+                                continue;
+
+                        if (generic_node)
+                                multiple_generic = true;
+                        else {
+                                generic_nr = nr;
+                                generic_rw = true;
+                                generic_node = strdup(node);
+                                if (!generic_node)
+                                        return -ENOMEM;
+                        }
+                }
+        }
+
+        if (!m->partitions[PARTITION_ROOT].found) {
+                /* No root partition found? Then let's see if ther's one for the secondary architecture. And if not
+                 * either, then check if there's a single generic one, and use that. */
+
+                if (m->partitions[PARTITION_ROOT_VERITY].found)
+                        return -EADDRNOTAVAIL;
+
+                if (m->partitions[PARTITION_ROOT_SECONDARY].found) {
+                        m->partitions[PARTITION_ROOT] = m->partitions[PARTITION_ROOT_SECONDARY];
+                        zero(m->partitions[PARTITION_ROOT_SECONDARY]);
+
+                        m->partitions[PARTITION_ROOT_VERITY] = m->partitions[PARTITION_ROOT_SECONDARY_VERITY];
+                        zero(m->partitions[PARTITION_ROOT_SECONDARY_VERITY]);
+
+                } else if (flags & DISSECT_IMAGE_REQUIRE_ROOT) {
+
+                        /* If the root has was set, then we won't fallback to a generic node, because the root hash
+                         * decides */
+                        if (root_hash)
+                                return -EADDRNOTAVAIL;
+
+                        /* If we didn't find a generic node, then we can't fix this up either */
+                        if (!generic_node)
+                                return -ENXIO;
+
+                        /* If we didn't find a properly marked root partition, but we did find a single suitable
+                         * generic Linux partition, then use this as root partition, if the caller asked for it. */
+                        if (multiple_generic)
+                                return -ENOTUNIQ;
+
+                        m->partitions[PARTITION_ROOT] = (DissectedPartition) {
+                                .found = true,
+                                .rw = generic_rw,
+                                .partno = generic_nr,
+                                .architecture = _ARCHITECTURE_INVALID,
+                                .node = generic_node,
+                                .uuid = generic_uuid,
+                        };
+
+                        generic_node = NULL;
+                }
+        }
+
+        if (root_hash) {
+                if (!m->partitions[PARTITION_ROOT_VERITY].found || !m->partitions[PARTITION_ROOT].found)
+                        return -EADDRNOTAVAIL;
+
+                /* If we found the primary root with the hash, then we definitely want to suppress any secondary root
+                 * (which would be weird, after all the root hash should only be assigned to one pair of
+                 * partitions... */
+                m->partitions[PARTITION_ROOT_SECONDARY].found = false;
+                m->partitions[PARTITION_ROOT_SECONDARY_VERITY].found = false;
+
+                /* If we found a verity setup, then the root partition is necessarily read-only. */
+                m->partitions[PARTITION_ROOT].rw = false;
+
+                m->verity = true;
+        }
+
+        blkid_free_probe(b);
+        b = NULL;
+
+        /* Fill in file system types if we don't know them yet. */
+        for (i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
+                DissectedPartition *p = m->partitions + i;
+
+                if (!p->found)
+                        continue;
+
+                if (!p->fstype && p->node) {
+                        r = probe_filesystem(p->node, &p->fstype);
+                        if (r < 0)
+                                return r;
+                }
+
+                if (streq_ptr(p->fstype, "crypto_LUKS"))
+                        m->encrypted = true;
+        }
+
+        *ret = m;
+        m = NULL;
+
+        return 0;
+#else
+        return -EOPNOTSUPP;
+#endif
+}
+
+DissectedImage* dissected_image_unref(DissectedImage *m) {
+        unsigned i;
+
+        if (!m)
+                return NULL;
+
+        for (i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
+                free(m->partitions[i].fstype);
+                free(m->partitions[i].node);
+                free(m->partitions[i].decrypted_fstype);
+                free(m->partitions[i].decrypted_node);
+        }
+
+        free(m);
+        return NULL;
+}
+
+static int is_loop_device(const char *path) {
+        char s[strlen("/sys/dev/block/") + DECIMAL_STR_MAX(dev_t) + 1 + DECIMAL_STR_MAX(dev_t) + strlen("/../loop/")];
+        struct stat st;
+
+        assert(path);
+
+        if (stat(path, &st) < 0)
+                return -errno;
+
+        if (!S_ISBLK(st.st_mode))
+                return -ENOTBLK;
+
+        xsprintf(s, "/sys/dev/block/%u:%u/loop/", major(st.st_rdev), minor(st.st_rdev));
+        if (access(s, F_OK) < 0) {
+                if (errno != ENOENT)
+                        return -errno;
+
+                /* The device itself isn't a loop device, but maybe it's a partition and its parent is? */
+                xsprintf(s, "/sys/dev/block/%u:%u/../loop/", major(st.st_rdev), minor(st.st_rdev));
+                if (access(s, F_OK) < 0)
+                        return errno == ENOENT ? false : -errno;
+        }
+
+        return true;
+}
+
+static int mount_partition(
+                DissectedPartition *m,
+                const char *where,
+                const char *directory,
+                DissectImageFlags flags) {
+
+        const char *p, *options = NULL, *node, *fstype;
+        _cleanup_free_ char *chased = NULL;
+        bool rw;
+        int r;
+
+        assert(m);
+        assert(where);
+
+        node = m->decrypted_node ?: m->node;
+        fstype = m->decrypted_fstype ?: m->fstype;
+
+        if (!m->found || !node || !fstype)
+                return 0;
+
+        /* Stacked encryption? Yuck */
+        if (streq_ptr(fstype, "crypto_LUKS"))
+                return -ELOOP;
+
+        rw = m->rw && !(flags & DISSECT_IMAGE_READ_ONLY);
+
+        if (directory) {
+                r = chase_symlinks(directory, where, CHASE_PREFIX_ROOT, &chased);
+                if (r < 0)
+                        return r;
+
+                p = chased;
+        } else
+                p = where;
+
+        /* If requested, turn on discard support. */
+        if (STR_IN_SET(fstype, "btrfs", "ext4", "vfat", "xfs") &&
+            ((flags & DISSECT_IMAGE_DISCARD) ||
+             ((flags & DISSECT_IMAGE_DISCARD_ON_LOOP) && is_loop_device(m->node))))
+                options = "discard";
+
+        return mount_verbose(LOG_DEBUG, node, p, fstype, MS_NODEV|(rw ? 0 : MS_RDONLY), options);
+}
+
+int dissected_image_mount(DissectedImage *m, const char *where, DissectImageFlags flags) {
+        int r;
+
+        assert(m);
+        assert(where);
+
+        if (!m->partitions[PARTITION_ROOT].found)
+                return -ENXIO;
+
+        r = mount_partition(m->partitions + PARTITION_ROOT, where, NULL, flags);
+        if (r < 0)
+                return r;
+
+        r = mount_partition(m->partitions + PARTITION_HOME, where, "/home", flags);
+        if (r < 0)
+                return r;
+
+        r = mount_partition(m->partitions + PARTITION_SRV, where, "/srv", flags);
+        if (r < 0)
+                return r;
+
+        if (m->partitions[PARTITION_ESP].found) {
+                const char *mp;
+
+                /* Mount the ESP to /efi if it exists and is empty. If it doesn't exist, use /boot instead. */
+
+                FOREACH_STRING(mp, "/efi", "/boot") {
+                        _cleanup_free_ char *p = NULL;
+
+                        r = chase_symlinks(mp, where, CHASE_PREFIX_ROOT, &p);
+                        if (r < 0)
+                                continue;
+
+                        r = dir_is_empty(p);
+                        if (r > 0) {
+                                r = mount_partition(m->partitions + PARTITION_ESP, where, mp, flags);
+                                if (r < 0)
+                                        return r;
+                        }
+                }
+        }
+
+        return 0;
+}
+
+#ifdef HAVE_LIBCRYPTSETUP
+typedef struct DecryptedPartition {
+        struct crypt_device *device;
+        char *name;
+        bool relinquished;
+} DecryptedPartition;
+
+struct DecryptedImage {
+        DecryptedPartition *decrypted;
+        size_t n_decrypted;
+        size_t n_allocated;
+};
+#endif
+
+DecryptedImage* decrypted_image_unref(DecryptedImage* d) {
+#ifdef HAVE_LIBCRYPTSETUP
+        size_t i;
+        int r;
+
+        if (!d)
+                return NULL;
+
+        for (i = 0; i < d->n_decrypted; i++) {
+                DecryptedPartition *p = d->decrypted + i;
+
+                if (p->device && p->name && !p->relinquished) {
+                        r = crypt_deactivate(p->device, p->name);
+                        if (r < 0)
+                                log_debug_errno(r, "Failed to deactivate encrypted partition %s", p->name);
+                }
+
+                if (p->device)
+                        crypt_free(p->device);
+                free(p->name);
+        }
+
+        free(d);
+#endif
+        return NULL;
+}
+
+#ifdef HAVE_LIBCRYPTSETUP
+
+static int make_dm_name_and_node(const void *original_node, const char *suffix, char **ret_name, char **ret_node) {
+        _cleanup_free_ char *name = NULL, *node = NULL;
+        const char *base;
+
+        assert(original_node);
+        assert(suffix);
+        assert(ret_name);
+        assert(ret_node);
+
+        base = strrchr(original_node, '/');
+        if (!base)
+                return -EINVAL;
+        base++;
+        if (isempty(base))
+                return -EINVAL;
+
+        name = strjoin(base, suffix);
+        if (!name)
+                return -ENOMEM;
+        if (!filename_is_valid(name))
+                return -EINVAL;
+
+        node = strjoin(crypt_get_dir(), "/", name);
+        if (!node)
+                return -ENOMEM;
+
+        *ret_name = name;
+        *ret_node = node;
+
+        name = node = NULL;
+        return 0;
+}
+
+static int decrypt_partition(
+                DissectedPartition *m,
+                const char *passphrase,
+                DissectImageFlags flags,
+                DecryptedImage *d) {
+
+        _cleanup_free_ char *node = NULL, *name = NULL;
+        struct crypt_device *cd;
+        int r;
+
+        assert(m);
+        assert(d);
+
+        if (!m->found || !m->node || !m->fstype)
+                return 0;
+
+        if (!streq(m->fstype, "crypto_LUKS"))
+                return 0;
+
+        r = make_dm_name_and_node(m->node, "-decrypted", &name, &node);
+        if (r < 0)
+                return r;
+
+        if (!GREEDY_REALLOC0(d->decrypted, d->n_allocated, d->n_decrypted + 1))
+                return -ENOMEM;
+
+        r = crypt_init(&cd, m->node);
+        if (r < 0)
+                return r;
+
+        r = crypt_load(cd, CRYPT_LUKS1, NULL);
+        if (r < 0)
+                goto fail;
+
+        r = crypt_activate_by_passphrase(cd, name, CRYPT_ANY_SLOT, passphrase, strlen(passphrase),
+                                         ((flags & DISSECT_IMAGE_READ_ONLY) ? CRYPT_ACTIVATE_READONLY : 0) |
+                                         ((flags & DISSECT_IMAGE_DISCARD_ON_CRYPTO) ? CRYPT_ACTIVATE_ALLOW_DISCARDS : 0));
+        if (r == -EPERM) {
+                r = -EKEYREJECTED;
+                goto fail;
+        }
+        if (r < 0)
+                goto fail;
+
+        d->decrypted[d->n_decrypted].name = name;
+        name = NULL;
+
+        d->decrypted[d->n_decrypted].device = cd;
+        d->n_decrypted++;
+
+        m->decrypted_node = node;
+        node = NULL;
+
+        return 0;
+
+fail:
+        crypt_free(cd);
+        return r;
+}
+
+static int verity_partition(
+                DissectedPartition *m,
+                DissectedPartition *v,
+                const void *root_hash,
+                size_t root_hash_size,
+                DissectImageFlags flags,
+                DecryptedImage *d) {
+
+        _cleanup_free_ char *node = NULL, *name = NULL;
+        struct crypt_device *cd;
+        int r;
+
+        assert(m);
+        assert(v);
+
+        if (!root_hash)
+                return 0;
+
+        if (!m->found || !m->node || !m->fstype)
+                return 0;
+        if (!v->found || !v->node || !v->fstype)
+                return 0;
+
+        if (!streq(v->fstype, "DM_verity_hash"))
+                return 0;
+
+        r = make_dm_name_and_node(m->node, "-verity", &name, &node);
+        if (r < 0)
+                return r;
+
+        if (!GREEDY_REALLOC0(d->decrypted, d->n_allocated, d->n_decrypted + 1))
+                return -ENOMEM;
+
+        r = crypt_init(&cd, v->node);
+        if (r < 0)
+                return r;
+
+        r = crypt_load(cd, CRYPT_VERITY, NULL);
+        if (r < 0)
+                goto fail;
+
+        r = crypt_set_data_device(cd, m->node);
+        if (r < 0)
+                goto fail;
+
+        r = crypt_activate_by_volume_key(cd, name, root_hash, root_hash_size, CRYPT_ACTIVATE_READONLY);
+        if (r < 0)
+                goto fail;
+
+        d->decrypted[d->n_decrypted].name = name;
+        name = NULL;
+
+        d->decrypted[d->n_decrypted].device = cd;
+        d->n_decrypted++;
+
+        m->decrypted_node = node;
+        node = NULL;
+
+        return 0;
+
+fail:
+        crypt_free(cd);
+        return r;
+}
+#endif
+
+int dissected_image_decrypt(
+                DissectedImage *m,
+                const char *passphrase,
+                const void *root_hash,
+                size_t root_hash_size,
+                DissectImageFlags flags,
+                DecryptedImage **ret) {
+
+        _cleanup_(decrypted_image_unrefp) DecryptedImage *d = NULL;
+#ifdef HAVE_LIBCRYPTSETUP
+        unsigned i;
+        int r;
+#endif
+
+        assert(m);
+        assert(root_hash || root_hash_size == 0);
+
+        /* Returns:
+         *
+         *      = 0           → There was nothing to decrypt
+         *      > 0           → Decrypted successfully
+         *      -ENOKEY       → There's something to decrypt but no key was supplied
+         *      -EKEYREJECTED → Passed key was not correct
+         */
+
+        if (root_hash && root_hash_size < sizeof(sd_id128_t))
+                return -EINVAL;
+
+        if (!m->encrypted && !m->verity) {
+                *ret = NULL;
+                return 0;
+        }
+
+#ifdef HAVE_LIBCRYPTSETUP
+        if (m->encrypted && !passphrase)
+                return -ENOKEY;
+
+        d = new0(DecryptedImage, 1);
+        if (!d)
+                return -ENOMEM;
+
+        for (i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
+                DissectedPartition *p = m->partitions + i;
+                int k;
+
+                if (!p->found)
+                        continue;
+
+                r = decrypt_partition(p, passphrase, flags, d);
+                if (r < 0)
+                        return r;
+
+                k = PARTITION_VERITY_OF(i);
+                if (k >= 0) {
+                        r = verity_partition(p, m->partitions + k, root_hash, root_hash_size, flags, d);
+                        if (r < 0)
+                                return r;
+                }
+
+                if (!p->decrypted_fstype && p->decrypted_node) {
+                        r = probe_filesystem(p->decrypted_node, &p->decrypted_fstype);
+                        if (r < 0)
+                                return r;
+                }
+        }
+
+        *ret = d;
+        d = NULL;
+
+        return 1;
+#else
+        return -EOPNOTSUPP;
+#endif
+}
+
+int dissected_image_decrypt_interactively(
+                DissectedImage *m,
+                const char *passphrase,
+                const void *root_hash,
+                size_t root_hash_size,
+                DissectImageFlags flags,
+                DecryptedImage **ret) {
+
+        _cleanup_strv_free_erase_ char **z = NULL;
+        int n = 3, r;
+
+        if (passphrase)
+                n--;
+
+        for (;;) {
+                r = dissected_image_decrypt(m, passphrase, root_hash, root_hash_size, flags, ret);
+                if (r >= 0)
+                        return r;
+                if (r == -EKEYREJECTED)
+                        log_error_errno(r, "Incorrect passphrase, try again!");
+                else if (r != -ENOKEY) {
+                        log_error_errno(r, "Failed to decrypt image: %m");
+                        return r;
+                }
+
+                if (--n < 0) {
+                        log_error("Too many retries.");
+                        return -EKEYREJECTED;
+                }
+
+                z = strv_free(z);
+
+                r = ask_password_auto("Please enter image passphrase!", NULL, "dissect", "dissect", USEC_INFINITY, 0, &z);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to query for passphrase: %m");
+
+                passphrase = z[0];
+        }
+}
+
+#ifdef HAVE_LIBCRYPTSETUP
+static int deferred_remove(DecryptedPartition *p) {
+
+        struct dm_ioctl dm = {
+                .version = {
+                        DM_VERSION_MAJOR,
+                        DM_VERSION_MINOR,
+                        DM_VERSION_PATCHLEVEL
+                },
+                .data_size = sizeof(dm),
+                .flags = DM_DEFERRED_REMOVE,
+        };
+
+        _cleanup_close_ int fd = -1;
+
+        assert(p);
+
+        /* Unfortunately, libcryptsetup doesn't provide a proper API for this, hence call the ioctl() directly. */
+
+        fd = open("/dev/mapper/control", O_RDWR|O_CLOEXEC);
+        if (fd < 0)
+                return -errno;
+
+        strncpy(dm.name, p->name, sizeof(dm.name));
+
+        if (ioctl(fd, DM_DEV_REMOVE, &dm))
+                return -errno;
+
+        return 0;
+}
+#endif
+
+int decrypted_image_relinquish(DecryptedImage *d) {
+
+#ifdef HAVE_LIBCRYPTSETUP
+        size_t i;
+        int r;
+#endif
+
+        assert(d);
+
+        /* Turns on automatic removal after the last use ended for all DM devices of this image, and sets a boolean so
+         * that we don't clean it up ourselves either anymore */
+
+#ifdef HAVE_LIBCRYPTSETUP
+        for (i = 0; i < d->n_decrypted; i++) {
+                DecryptedPartition *p = d->decrypted + i;
+
+                if (p->relinquished)
+                        continue;
+
+                r = deferred_remove(p);
+                if (r < 0)
+                        return log_debug_errno(r, "Failed to mark %s for auto-removal: %m", p->name);
+
+                p->relinquished = true;
+        }
+#endif
+
+        return 0;
+}
+
+int root_hash_load(const char *image, void **ret, size_t *ret_size) {
+        _cleanup_free_ char *text = NULL;
+        _cleanup_free_ void *k = NULL;
+        size_t l;
+        int r;
+
+        assert(image);
+        assert(ret);
+        assert(ret_size);
+
+        if (is_device_path(image)) {
+                /* If we are asked to load the root hash for a device node, exit early */
+                *ret = NULL;
+                *ret_size = 0;
+                return 0;
+        }
+
+        r = getxattr_malloc(image, "user.verity.roothash", &text, true);
+        if (r < 0) {
+                char *fn, *e, *n;
+
+                if (!IN_SET(r, -ENODATA, -EOPNOTSUPP, -ENOENT))
+                        return r;
+
+                fn = newa(char, strlen(image) + strlen(".roothash") + 1);
+                n = stpcpy(fn, image);
+                e = endswith(fn, ".raw");
+                if (e)
+                        n = e;
+
+                strcpy(n, ".roothash");
+
+                r = read_one_line_file(fn, &text);
+                if (r == -ENOENT) {
+                        *ret = NULL;
+                        *ret_size = 0;
+                        return 0;
+                }
+                if (r < 0)
+                        return r;
+        }
+
+        r = unhexmem(text, strlen(text), &k, &l);
+        if (r < 0)
+                return r;
+        if (l < sizeof(sd_id128_t))
+                return -EINVAL;
+
+        *ret = k;
+        *ret_size = l;
+
+        k = NULL;
+
+        return 1;
+}
+
+static const char *const partition_designator_table[] = {
+        [PARTITION_ROOT] = "root",
+        [PARTITION_ROOT_SECONDARY] = "root-secondary",
+        [PARTITION_HOME] = "home",
+        [PARTITION_SRV] = "srv",
+        [PARTITION_ESP] = "esp",
+        [PARTITION_SWAP] = "swap",
+        [PARTITION_ROOT_VERITY] = "root-verity",
+        [PARTITION_ROOT_SECONDARY_VERITY] = "root-secondary-verity",
+};
+
+DEFINE_STRING_TABLE_LOOKUP(partition_designator, int);
diff --git a/src/shared/dissect-image.h b/src/shared/dissect-image.h
new file mode 100644 (file)
index 0000000..cdb083b
--- /dev/null
@@ -0,0 +1,98 @@
+#pragma once
+
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <stdbool.h>
+
+#include "macro.h"
+
+typedef struct DissectedImage DissectedImage;
+typedef struct DissectedPartition DissectedPartition;
+typedef struct DecryptedImage DecryptedImage;
+
+struct DissectedPartition {
+        bool found:1;
+        bool rw:1;
+        int partno;        /* -1 if there was no partition and the images contains a file system directly */
+        int architecture;  /* Intended architecture: either native, secondary or unset (-1). */
+        sd_id128_t uuid;   /* Partition entry UUID as reported by the GPT */
+        char *fstype;
+        char *node;
+        char *decrypted_node;
+        char *decrypted_fstype;
+};
+
+enum  {
+        PARTITION_ROOT,
+        PARTITION_ROOT_SECONDARY,  /* Secondary architecture */
+        PARTITION_HOME,
+        PARTITION_SRV,
+        PARTITION_ESP,
+        PARTITION_SWAP,
+        PARTITION_ROOT_VERITY, /* verity data for the PARTITION_ROOT partition */
+        PARTITION_ROOT_SECONDARY_VERITY, /* verity data for the PARTITION_ROOT_SECONDARY partition */
+        _PARTITION_DESIGNATOR_MAX,
+        _PARTITION_DESIGNATOR_INVALID = -1
+};
+
+static inline int PARTITION_VERITY_OF(int p) {
+        if (p == PARTITION_ROOT)
+                return PARTITION_ROOT_VERITY;
+        if (p == PARTITION_ROOT_SECONDARY)
+                return PARTITION_ROOT_SECONDARY_VERITY;
+        return _PARTITION_DESIGNATOR_INVALID;
+}
+
+typedef enum DissectImageFlags {
+        DISSECT_IMAGE_READ_ONLY = 1,
+        DISSECT_IMAGE_DISCARD_ON_LOOP = 2,   /* Turn on "discard" if on a loop device and file system supports it */
+        DISSECT_IMAGE_DISCARD = 4,           /* Turn on "discard" if file system supports it, on all block devices */
+        DISSECT_IMAGE_DISCARD_ON_CRYPTO = 8, /* Turn on "discard" also on crypto devices */
+        DISSECT_IMAGE_DISCARD_ANY = DISSECT_IMAGE_DISCARD_ON_LOOP |
+                                    DISSECT_IMAGE_DISCARD |
+                                    DISSECT_IMAGE_DISCARD_ON_CRYPTO,
+        DISSECT_IMAGE_GPT_ONLY = 16,         /* Only recognize images with GPT partition tables */
+        DISSECT_IMAGE_REQUIRE_ROOT = 32,     /* Don't accept disks without root partition */
+} DissectImageFlags;
+
+struct DissectedImage {
+        bool encrypted:1;
+        bool verity:1;     /* verity available and usable */
+        bool can_verity:1; /* verity available, but not necessarily used */
+        DissectedPartition partitions[_PARTITION_DESIGNATOR_MAX];
+};
+
+int dissect_image(int fd, const void *root_hash, size_t root_hash_size, DissectImageFlags flags, DissectedImage **ret);
+
+DissectedImage* dissected_image_unref(DissectedImage *m);
+DEFINE_TRIVIAL_CLEANUP_FUNC(DissectedImage*, dissected_image_unref);
+
+int dissected_image_decrypt(DissectedImage *m, const char *passphrase, const void *root_hash, size_t root_hash_size, DissectImageFlags flags, DecryptedImage **ret);
+int dissected_image_decrypt_interactively(DissectedImage *m, const char *passphrase, const void *root_hash, size_t root_hash_size, DissectImageFlags flags, DecryptedImage **ret);
+int dissected_image_mount(DissectedImage *m, const char *dest, DissectImageFlags flags);
+
+DecryptedImage* decrypted_image_unref(DecryptedImage *p);
+DEFINE_TRIVIAL_CLEANUP_FUNC(DecryptedImage*, decrypted_image_unref);
+int decrypted_image_relinquish(DecryptedImage *d);
+
+const char* partition_designator_to_string(int i) _const_;
+int partition_designator_from_string(const char *name) _pure_;
+
+int root_hash_load(const char *image, void **ret, size_t *ret_size);
index 835557c..12c4d65 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
  ***/
 
-#ifdef HAVE_LIBIDN
-#include <idna.h>
-#include <stringprep.h>
+#if defined(HAVE_LIBIDN2)
+#  include <idn2.h>
+#elif defined(HAVE_LIBIDN)
+#  include <idna.h>
+#  include <stringprep.h>
 #endif
 
 #include <endian.h>
@@ -131,6 +133,10 @@ int dns_label_unescape(const char **name, char *dest, size_t sz) {
         if (r == 0 && *n)
                 return -EINVAL;
 
+        /* More than one trailing dot? */
+        if (*n == '.')
+                return -EINVAL;
+
         if (sz >= 1 && d)
                 *d = 0;
 
@@ -295,8 +301,8 @@ int dns_label_escape_new(const char *p, size_t l, char **ret) {
         return r;
 }
 
-int dns_label_apply_idna(const char *encoded, size_t encoded_size, char *decoded, size_t decoded_max) {
 #ifdef HAVE_LIBIDN
+int dns_label_apply_idna(const char *encoded, size_t encoded_size, char *decoded, size_t decoded_max) {
         _cleanup_free_ uint32_t *input = NULL;
         size_t input_size, l;
         const char *p;
@@ -344,13 +350,9 @@ int dns_label_apply_idna(const char *encoded, size_t encoded_size, char *decoded
                 decoded[l] = 0;
 
         return (int) l;
-#else
-        return 0;
-#endif
 }
 
 int dns_label_undo_idna(const char *encoded, size_t encoded_size, char *decoded, size_t decoded_max) {
-#ifdef HAVE_LIBIDN
         size_t input_size, output_size;
         _cleanup_free_ uint32_t *input = NULL;
         _cleanup_free_ char *result = NULL;
@@ -395,10 +397,8 @@ int dns_label_undo_idna(const char *encoded, size_t encoded_size, char *decoded,
                 decoded[w] = 0;
 
         return w;
-#else
-        return 0;
-#endif
 }
+#endif
 
 int dns_name_concat(const char *a, const char *b, char **_ret) {
         _cleanup_free_ char *ret = NULL;
@@ -1072,7 +1072,7 @@ int dns_service_split(const char *joined, char **_name, char **_type, char **_do
                                 if (!name)
                                         return -ENOMEM;
 
-                                type = strjoin(b, ".", c, NULL);
+                                type = strjoin(b, ".", c);
                                 if (!type)
                                         return -ENOMEM;
 
@@ -1086,7 +1086,7 @@ int dns_service_split(const char *joined, char **_name, char **_type, char **_do
 
                         name = NULL;
 
-                        type = strjoin(a, ".", b, NULL);
+                        type = strjoin(a, ".", b);
                         if (!type)
                                 return -ENOMEM;
 
@@ -1270,6 +1270,26 @@ int dns_name_common_suffix(const char *a, const char *b, const char **ret) {
 }
 
 int dns_name_apply_idna(const char *name, char **ret) {
+        /* Return negative on error, 0 if not implemented, positive on success. */
+
+#if defined(HAVE_LIBIDN2)
+        int r;
+
+        assert(name);
+        assert(ret);
+
+        r = idn2_lookup_u8((uint8_t*) name, (uint8_t**) ret,
+                           IDN2_NFC_INPUT | IDN2_NONTRANSITIONAL);
+        if (r == IDN2_OK)
+                return 1; /* *ret has been written */
+        log_debug("idn2_lookup_u8(\"%s\") failed: %s", name, idn2_strerror(r));
+        if (r == IDN2_2HYPHEN)
+                /* The name has two hypens — forbidden by IDNA2008 in some cases */
+                return 0;
+        if (IN_SET(r, IDN2_TOO_BIG_DOMAIN, IDN2_TOO_BIG_LABEL))
+                return -ENOSPC;
+        return -EINVAL;
+#elif defined(HAVE_LIBIDN)
         _cleanup_free_ char *buf = NULL;
         size_t n = 0, allocated = 0;
         bool first = true;
@@ -1305,7 +1325,7 @@ int dns_name_apply_idna(const char *name, char **ret) {
                 else
                         buf[n++] = '.';
 
-                n +=r;
+                n += r;
         }
 
         if (n > DNS_HOSTNAME_MAX)
@@ -1318,5 +1338,20 @@ int dns_name_apply_idna(const char *name, char **ret) {
         *ret = buf;
         buf = NULL;
 
-        return (int) n;
+        return 1;
+#else
+        return 0;
+#endif
+}
+
+int dns_name_is_valid_or_address(const char *name) {
+        /* Returns > 0 if the specified name is either a valid IP address formatted as string or a valid DNS name */
+
+        if (isempty(name))
+                return 0;
+
+        if (in_addr_from_string_auto(name, NULL, NULL) >= 0)
+                return 1;
+
+        return dns_name_is_valid(name);
 }
index af780f0..fca025d 100644 (file)
@@ -51,8 +51,10 @@ static inline int dns_name_parent(const char **name) {
         return dns_label_unescape(name, NULL, DNS_LABEL_MAX);
 }
 
+#if defined(HAVE_LIBIDN)
 int dns_label_apply_idna(const char *encoded, size_t encoded_size, char *decoded, size_t decoded_max);
 int dns_label_undo_idna(const char *encoded, size_t encoded_size, char *decoded, size_t decoded_max);
+#endif
 
 int dns_name_concat(const char *a, const char *b, char **ret);
 
@@ -107,3 +109,5 @@ int dns_name_equal_skip(const char *a, unsigned n_labels, const char *b);
 int dns_name_common_suffix(const char *a, const char *b, const char **ret);
 
 int dns_name_apply_idna(const char *name, char **ret);
+
+int dns_name_is_valid_or_address(const char *name);
index b9cd952..15ccd1b 100644 (file)
@@ -17,7 +17,6 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <dirent.h>
 #include <errno.h>
 #include <stdarg.h>
 #include <stdio.h>
 
 #include "alloc-util.h"
 #include "conf-files.h"
+#include "dirent-util.h"
 #include "dropin.h"
 #include "escape.h"
 #include "fd-util.h"
 #include "fileio-label.h"
+#include "fs-util.h"
 #include "hashmap.h"
 #include "log.h"
 #include "macro.h"
 int drop_in_file(const char *dir, const char *unit, unsigned level,
                  const char *name, char **_p, char **_q) {
 
+        char prefix[DECIMAL_STR_MAX(unsigned)];
         _cleanup_free_ char *b = NULL;
         char *p, *q;
 
-        char prefix[DECIMAL_STR_MAX(unsigned)];
-
         assert(unit);
         assert(name);
         assert(_p);
@@ -61,11 +61,11 @@ int drop_in_file(const char *dir, const char *unit, unsigned level,
         if (!filename_is_valid(b))
                 return -EINVAL;
 
-        p = strjoin(dir, "/", unit, ".d", NULL);
+        p = strjoin(dir, "/", unit, ".d");
         if (!p)
                 return -ENOMEM;
 
-        q = strjoin(p, "/", prefix, "-", b, ".conf", NULL);
+        q = strjoin(p, "/", prefix, "-", b, ".conf");
         if (!q) {
                 free(p);
                 return -ENOMEM;
@@ -116,136 +116,99 @@ int write_drop_in_format(const char *dir, const char *unit, unsigned level,
         return write_drop_in(dir, unit, level, name, p);
 }
 
-static int iterate_dir(
+static int unit_file_find_dir(
+                const char *original_root,
                 const char *path,
-                UnitDependency dependency,
-                dependency_consumer_t consumer,
-                void *arg,
-                char ***strv) {
+                char ***dirs) {
 
-        _cleanup_closedir_ DIR *d = NULL;
+        _cleanup_free_ char *chased = NULL;
         int r;
 
         assert(path);
 
-        /* The config directories are special, since the order of the
-         * drop-ins matters */
-        if (dependency < 0)  {
-                r = strv_extend(strv, path);
-                if (r < 0)
-                        return log_oom();
-
+        r = chase_symlinks(path, original_root, 0, &chased);
+        if (r == -ENOENT) /* Ignore -ENOENT, after all most units won't have a drop-in dir */
                 return 0;
-        }
-
-        assert(consumer);
-
-        d = opendir(path);
-        if (!d) {
-                if (errno == ENOENT)
-                        return 0;
-
-                return log_error_errno(errno, "Failed to open directory %s: %m", path);
-        }
-
-        for (;;) {
-                struct dirent *de;
-                _cleanup_free_ char *f = NULL;
-
-                errno = 0;
-                de = readdir(d);
-                if (!de && errno > 0)
-                        return log_error_errno(errno, "Failed to read directory %s: %m", path);
-
-                if (!de)
-                        break;
-
-                if (hidden_or_backup_file(de->d_name))
-                        continue;
-
-                f = strjoin(path, "/", de->d_name, NULL);
-                if (!f)
-                        return log_oom();
+        if (r < 0)
+                return log_full_errno(LOG_WARNING, r, "Failed to canonicalize path %s: %m", path);
 
-                r = consumer(dependency, de->d_name, f, arg);
-                if (r < 0)
-                        return r;
-        }
+        r = strv_push(dirs, chased);
+        if (r < 0)
+                return log_oom();
 
+        chased = NULL;
         return 0;
 }
 
-int unit_file_process_dir(
+static int unit_file_find_dirs(
+                const char *original_root,
                 Set *unit_path_cache,
                 const char *unit_path,
                 const char *name,
                 const char *suffix,
-                UnitDependency dependency,
-                dependency_consumer_t consumer,
-                void *arg,
-                char ***strv) {
+                char ***dirs) {
 
-        _cleanup_free_ char *path = NULL;
+        char *path;
         int r;
 
         assert(unit_path);
         assert(name);
         assert(suffix);
 
-        path = strjoin(unit_path, "/", name, suffix, NULL);
-        if (!path)
-                return log_oom();
+        path = strjoina(unit_path, "/", name, suffix);
 
-        if (!unit_path_cache || set_get(unit_path_cache, path))
-                (void) iterate_dir(path, dependency, consumer, arg, strv);
+        if (!unit_path_cache || set_get(unit_path_cache, path)) {
+                r = unit_file_find_dir(original_root, path, dirs);
+                if (r < 0)
+                        return r;
+        }
 
         if (unit_name_is_valid(name, UNIT_NAME_INSTANCE)) {
-                _cleanup_free_ char *template = NULL, *p = NULL;
                 /* Also try the template dir */
 
+                _cleanup_free_ char *template = NULL;
+
                 r = unit_name_template(name, &template);
                 if (r < 0)
                         return log_error_errno(r, "Failed to generate template from unit name: %m");
 
-                p = strjoin(unit_path, "/", template, suffix, NULL);
-                if (!p)
-                        return log_oom();
-
-                if (!unit_path_cache || set_get(unit_path_cache, p))
-                        (void) iterate_dir(p, dependency, consumer, arg, strv);
+                return unit_file_find_dirs(original_root, unit_path_cache, unit_path, template, suffix, dirs);
         }
 
         return 0;
 }
 
 int unit_file_find_dropin_paths(
+                const char *original_root,
                 char **lookup_path,
                 Set *unit_path_cache,
+                const char *dir_suffix,
+                const char *file_suffix,
                 Set *names,
-                char ***paths) {
+                char ***ret) {
 
-        _cleanup_strv_free_ char **strv = NULL, **ans = NULL;
+        _cleanup_strv_free_ char **dirs = NULL, **ans = NULL;
         Iterator i;
-        char *t;
+        char *t, **p;
         int r;
 
-        assert(paths);
-
-        SET_FOREACH(t, names, i) {
-                char **p;
+        assert(ret);
 
+        SET_FOREACH(t, names, i)
                 STRV_FOREACH(p, lookup_path)
-                        unit_file_process_dir(unit_path_cache, *p, t, ".d", _UNIT_DEPENDENCY_INVALID, NULL, NULL, &strv);
-        }
+                        unit_file_find_dirs(original_root, unit_path_cache, *p, t, dir_suffix, &dirs);
 
-        if (strv_isempty(strv))
+        if (strv_isempty(dirs)) {
+                *ret = NULL;
                 return 0;
+        }
 
-        r = conf_files_list_strv(&ans, ".conf", NULL, (const char**) strv);
+        r = conf_files_list_strv(&ans, file_suffix, NULL, (const char**) dirs);
         if (r < 0)
-                return log_warning_errno(r, "Failed to get list of configuration files: %m");
+                return log_warning_errno(r, "Failed to sort the list of configuration files: %m");
 
-        *paths = ans;
+        *ret = ans;
         ans = NULL;
+
         return 1;
 }
index c1936f3..a2b8cdc 100644 (file)
@@ -33,29 +33,24 @@ int write_drop_in(const char *dir, const char *unit, unsigned level,
 int write_drop_in_format(const char *dir, const char *unit, unsigned level,
                          const char *name, const char *format, ...) _printf_(5, 6);
 
-/**
- * This callback will be called for each directory entry @entry,
- * with @filepath being the full path to the entry.
- *
- * If return value is negative, loop will be aborted.
- */
-typedef int (*dependency_consumer_t)(UnitDependency dependency,
-                                     const char *entry,
-                                     const char* filepath,
-                                     void *arg);
-
-int unit_file_process_dir(
-                Set * unit_path_cache,
-                const char *unit_path,
-                const char *name,
-                const char *suffix,
-                UnitDependency dependency,
-                dependency_consumer_t consumer,
-                void *arg,
-                char ***strv);
-
 int unit_file_find_dropin_paths(
+                const char *original_root,
                 char **lookup_path,
                 Set *unit_path_cache,
+                const char *dir_suffix,
+                const char *file_suffix,
                 Set *names,
                 char ***paths);
+
+static inline int unit_file_find_dropin_conf_paths(
+                const char *original_root,
+                char **lookup_path,
+                Set *unit_path_cache,
+                Set *names,
+                char ***paths) {
+        return unit_file_find_dropin_paths(original_root,
+                                           lookup_path,
+                                           unit_path_cache,
+                                           ".d", ".conf",
+                                           names, paths);
+}
index 8631a5a..8229e6b 100644 (file)
@@ -269,6 +269,7 @@ int efi_set_variable(
         _cleanup_close_ int fd = -1;
 
         assert(name);
+        assert(value);
 
         if (asprintf(&p,
                      "/sys/firmware/efi/efivars/%s-%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
index 527f27b..090f3fd 100644 (file)
 ***/
 
 #include <alloca.h>
-#include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <stddef.h>
 
 #include "sd-daemon.h"
 
+#include "dirent-util.h"
 #include "fd-util.h"
 #include "fdset.h"
 #include "log.h"
@@ -148,12 +148,9 @@ int fdset_new_fill(FDSet **_s) {
                 goto finish;
         }
 
-        while ((de = readdir(d))) {
+        FOREACH_DIRENT(de, d, return -errno) {
                 int fd = -1;
 
-                if (hidden_or_backup_file(de->d_name))
-                        continue;
-
                 r = safe_atoi(de->d_name, &fd);
                 if (r < 0)
                         goto finish;
index f73108e..952fc48 100644 (file)
@@ -17,8 +17,9 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#warning "Temporary work-around for broken glibc vs. linux kernel header definitions"
-#warning "This really should be removed sooner rather than later, when this is fixed upstream"
+/* Temporary work-around for broken glibc vs. linux kernel header definitions
+ * This is already fixed upstream, remove this when distributions have updated.
+ */
 #define _NET_IF_H 1
 
 #include <alloca.h>
@@ -75,8 +76,11 @@ static int entry_fill_basics(
         }
 
         if (out_interface) {
+                size_t l = strlen(out_interface);
+                assert(l < sizeof entry->ip.outiface && l < sizeof entry->ip.outiface_mask);
+
                 strcpy(entry->ip.outiface, out_interface);
-                memset(entry->ip.outiface_mask, 0xFF, strlen(out_interface)+1);
+                memset(entry->ip.outiface_mask, 0xFF, l + 1);
         }
         if (destination) {
                 entry->ip.dst = destination->in;
index a4e0cd3..ec2e868 100644 (file)
 #include "strv.h"
 #include "util.h"
 
-bool fstab_is_mount_point(const char *mount) {
+int fstab_has_fstype(const char *fstype) {
         _cleanup_endmntent_ FILE *f = NULL;
         struct mntent *m;
 
-        f = setmntent("/etc/fstab", "r");
+        f = setmntent("/etc/fstab", "re");
         if (!f)
-                return false;
+                return errno == ENOENT ? false : -errno;
 
-        while ((m = getmntent(f)))
-                if (path_equal(m->mnt_dir, mount))
+        for (;;) {
+                errno = 0;
+                m = getmntent(f);
+                if (!m)
+                        return errno != 0 ? -errno : false;
+
+                if (streq(m->mnt_type, fstype))
                         return true;
+        }
+        return false;
+}
+
+int fstab_is_mount_point(const char *mount) {
+        _cleanup_endmntent_ FILE *f = NULL;
+        struct mntent *m;
+
+        f = setmntent("/etc/fstab", "re");
+        if (!f)
+                return errno == ENOENT ? false : -errno;
+
+        for (;;) {
+                errno = 0;
+                m = getmntent(f);
+                if (!m)
+                        return errno != 0 ? -errno : false;
 
+                if (path_equal(m->mnt_dir, mount))
+                        return true;
+        }
         return false;
 }
 
@@ -213,7 +238,7 @@ static char *unquote(const char *s, const char* quotes) {
          * trailing quotes if there is one. Doesn't care about
          * escaping or anything.
          *
-         * DON'T USE THIS FOR NEW CODE ANYMORE!*/
+         * DON'T USE THIS FOR NEW CODE ANYMORE! */
 
         l = strlen(s);
         if (l < 2)
@@ -241,7 +266,7 @@ static char *tag_to_udev_node(const char *tagvalue, const char *by) {
         if (encode_devnode_name(u, t, enc_len) < 0)
                 return NULL;
 
-        return strjoin("/dev/disk/by-", by, "/", t, NULL);
+        return strjoin("/dev/disk/by-", by, "/", t);
 }
 
 char *fstab_node_to_udev_node(const char *p) {
index 679f690..bbf0441 100644 (file)
@@ -24,7 +24,8 @@
 
 #include "macro.h"
 
-bool fstab_is_mount_point(const char *mount);
+int fstab_is_mount_point(const char *mount);
+int fstab_has_fstype(const char *fstype);
 
 int fstab_filter_options(const char *opts, const char *names, const char **namefound, char **value, char **filtered);
 
index cf33b3c..1da12a3 100644 (file)
@@ -37,3 +37,11 @@ static inline int string_hashsum_sha224(const char *s, size_t len, char **out) {
         return -EOPNOTSUPP;
 #endif
 }
+
+static inline int string_hashsum_sha256(const char *s, size_t len, char **out) {
+#ifdef HAVE_GCRYPT
+        return string_hashsum(s, len, GCRY_MD_SHA256, out);
+#else
+        return -EOPNOTSUPP;
+#endif
+}
index 70afc6a..6a78ebb 100644 (file)
@@ -65,7 +65,7 @@ static int write_fsck_sysroot_service(const char *dir, const char *what) {
                 "Description=File System Check on %2$s\n"
                 "DefaultDependencies=no\n"
                 "BindsTo=%3$s\n"
-                "After=initrd-root-device.target local-fs-pre.target\n"
+                "After=initrd-root-device.target local-fs-pre.target %3$s\n"
                 "Before=shutdown.target\n"
                 "\n"
                 "[Service]\n"
@@ -167,12 +167,13 @@ int generator_write_timeouts(
         usec_t u;
         int r;
 
-        r = fstab_filter_options(opts, "comment=systemd.device-timeout\0" "x-systemd.device-timeout\0",
+        r = fstab_filter_options(opts, "comment=systemd.device-timeout\0"
+                                       "x-systemd.device-timeout\0",
                                  NULL, &timeout, filtered);
         if (r <= 0)
                 return r;
 
-        r = parse_sec(timeout, &u);
+        r = parse_sec_fix_0(timeout, &u);
         if (r < 0) {
                 log_warning("Failed to parse timeout for %s, ignoring: %s", where, timeout);
                 return 0;
@@ -188,10 +189,49 @@ int generator_write_timeouts(
 
         return write_drop_in_format(dir, unit, 50, "device-timeout",
                                     "# Automatically generated by %s\n\n"
-                                    "[Unit]\nJobTimeoutSec=%s",
+                                    "[Unit]\nJobRunningTimeoutSec=%s",
                                     program_invocation_short_name, timeout);
 }
 
+int generator_write_device_deps(
+                const char *dir,
+                const char *what,
+                const char *where,
+                const char *opts) {
+
+        /* fstab records that specify _netdev option should apply the network
+         * ordering on the actual device depending on network connection. If we
+         * are not mounting real device (NFS, CIFS), we rely on _netdev effect
+         * on the mount unit itself. */
+
+        _cleanup_free_ char *node = NULL, *unit = NULL;
+        int r;
+
+        if (!fstab_test_option(opts, "_netdev\0"))
+                return 0;
+
+        node = fstab_node_to_udev_node(what);
+        if (!node)
+                return log_oom();
+
+        /* Nothing to apply dependencies to. */
+        if (!is_device_path(node))
+                return 0;
+
+        r = unit_name_from_path(node, ".device", &unit);
+        if (r < 0)
+                return log_error_errno(r, "Failed to make unit name from path: %m");
+
+        /* See mount_add_default_dependencies for explanation why we create such
+         * dependencies. */
+        return write_drop_in_format(dir, unit, 50, "netdev-dependencies",
+                                    "# Automatically generated by %s\n\n"
+                                    "[Unit]\n"
+                                    "After=" SPECIAL_NETWORK_ONLINE_TARGET " " SPECIAL_NETWORK_TARGET "\n"
+                                    "Wants=" SPECIAL_NETWORK_ONLINE_TARGET "\n",
+                                    program_invocation_short_name);
+}
+
 int generator_write_initrd_root_device_deps(const char *dir, const char *what) {
         _cleanup_free_ char *unit = NULL;
         int r;
index a6017c1..825d934 100644 (file)
@@ -35,6 +35,12 @@ int generator_write_timeouts(
         const char *opts,
         char **filtered);
 
+int generator_write_device_deps(
+                const char *dir,
+                const char *what,
+                const char *where,
+                const char *opts);
+
 int generator_write_initrd_root_device_deps(
         const char *dir,
         const char *what);
index 55b41bb..cc75200 100644 (file)
 #define GPT_ROOT_ARM    SD_ID128_MAKE(69,da,d7,10,2c,e4,4e,3c,b1,6c,21,a1,d4,9a,be,d3)
 #define GPT_ROOT_ARM_64 SD_ID128_MAKE(b9,21,b0,45,1d,f0,41,c3,af,44,4c,6f,28,0d,3f,ae)
 #define GPT_ROOT_IA64   SD_ID128_MAKE(99,3d,8d,3d,f8,0e,42,25,85,5a,9d,af,8e,d7,ea,97)
-
 #define GPT_ESP         SD_ID128_MAKE(c1,2a,73,28,f8,1f,11,d2,ba,4b,00,a0,c9,3e,c9,3b)
 #define GPT_SWAP        SD_ID128_MAKE(06,57,fd,6d,a4,ab,43,c4,84,e5,09,33,c8,4b,4f,4f)
 #define GPT_HOME        SD_ID128_MAKE(93,3a,c7,e1,2e,b4,4f,13,b8,44,0e,14,e2,ae,f9,15)
 #define GPT_SRV         SD_ID128_MAKE(3b,8f,84,25,20,e0,4f,3b,90,7f,1a,25,a7,6f,98,e8)
 
+/* Verity partitions for the root partitions above (we only define them for the root partitions, because only they are
+ * are commonly read-only and hence suitable for verity). */
+#define GPT_ROOT_X86_VERITY    SD_ID128_MAKE(d1,3c,5d,3b,b5,d1,42,2a,b2,9f,94,54,fd,c8,9d,76)
+#define GPT_ROOT_X86_64_VERITY SD_ID128_MAKE(2c,73,57,ed,eb,d2,46,d9,ae,c1,23,d4,37,ec,2b,f5)
+#define GPT_ROOT_ARM_VERITY    SD_ID128_MAKE(73,86,cd,f2,20,3c,47,a9,a4,98,f2,ec,ce,45,a2,d6)
+#define GPT_ROOT_ARM_64_VERITY SD_ID128_MAKE(df,33,00,ce,d6,9f,4c,92,97,8c,9b,fb,0f,38,d8,20)
+#define GPT_ROOT_IA64_VERITY   SD_ID128_MAKE(86,ed,10,d5,b6,07,45,bb,89,57,d3,50,f2,3d,05,71)
+
+
 #if defined(__x86_64__)
 #  define GPT_ROOT_NATIVE GPT_ROOT_X86_64
 #  define GPT_ROOT_SECONDARY GPT_ROOT_X86
+#  define GPT_ROOT_NATIVE_VERITY GPT_ROOT_X86_64_VERITY
+#  define GPT_ROOT_SECONDARY_VERITY GPT_ROOT_X86_VERITY
 #elif defined(__i386__)
 #  define GPT_ROOT_NATIVE GPT_ROOT_X86
+#  define GPT_ROOT_NATIVE_VERITY GPT_ROOT_X86_VERITY
 #endif
 
 #if defined(__ia64__)
 #  define GPT_ROOT_NATIVE GPT_ROOT_IA64
+#  define GPT_ROOT_NATIVE_VERITY GPT_ROOT_IA64_VERITY
 #endif
 
 #if defined(__aarch64__) && (__BYTE_ORDER != __BIG_ENDIAN)
 #  define GPT_ROOT_NATIVE GPT_ROOT_ARM_64
 #  define GPT_ROOT_SECONDARY GPT_ROOT_ARM
+#  define GPT_ROOT_NATIVE_VERITY GPT_ROOT_ARM_64_VERITY
+#  define GPT_ROOT_SECONDARY_VERITY GPT_ROOT_ARM_VERITY
 #elif defined(__arm__) && (__BYTE_ORDER != __BIG_ENDIAN)
 #  define GPT_ROOT_NATIVE GPT_ROOT_ARM
+#  define GPT_ROOT_NATIVE_VERITY GPT_ROOT_ARM_VERITY
 #endif
 
+#define GPT_FLAG_NO_BLOCK_IO_PROTOCOL (1ULL << 1)
+
 /* Flags we recognize on the root, swap, home and srv partitions when
  * doing auto-discovery. These happen to be identical to what
  * Microsoft defines for its own Basic Data Partitions, but that's
index 8814336..c10ed3d 100644 (file)
 #include <string.h>
 #include <unistd.h>
 
-#include "formats-util.h"
+#include "format-util.h"
 #include "install-printf.h"
 #include "install.h"
 #include "macro.h"
 #include "specifier.h"
+#include "string-util.h"
 #include "unit-name.h"
 #include "user-util.h"
 
 static int specifier_prefix_and_instance(char specifier, void *data, void *userdata, char **ret) {
-        UnitFileInstallInfo *i = userdata;
+        const UnitFileInstallInfo *i = userdata;
+        _cleanup_free_ char *prefix = NULL;
+        int r;
+
+        assert(i);
+
+        r = unit_name_to_prefix_and_instance(i->name, &prefix);
+        if (r < 0)
+                return r;
+
+        if (endswith(prefix, "@") && i->default_instance) {
+                char *ans;
+
+                ans = strjoin(prefix, i->default_instance);
+                if (!ans)
+                        return -ENOMEM;
+                *ret = ans;
+        } else {
+                *ret = prefix;
+                prefix = NULL;
+        }
+
+        return 0;
+}
+
+static int specifier_name(char specifier, void *data, void *userdata, char **ret) {
+        const UnitFileInstallInfo *i = userdata;
+        char *ans;
 
         assert(i);
 
-        return unit_name_to_prefix_and_instance(i->name, ret);
+        if (unit_name_is_valid(i->name, UNIT_NAME_TEMPLATE) && i->default_instance)
+                return unit_name_replace_instance(i->name, i->default_instance, ret);
+
+        ans = strdup(i->name);
+        if (!ans)
+                return -ENOMEM;
+        *ret = ans;
+        return 0;
 }
 
 static int specifier_prefix(char specifier, void *data, void *userdata, char **ret) {
-        UnitFileInstallInfo *i = userdata;
+        const UnitFileInstallInfo *i = userdata;
 
         assert(i);
 
@@ -47,7 +82,7 @@ static int specifier_prefix(char specifier, void *data, void *userdata, char **r
 }
 
 static int specifier_instance(char specifier, void *data, void *userdata, char **ret) {
-        UnitFileInstallInfo *i = userdata;
+        const UnitFileInstallInfo *i = userdata;
         char *instance;
         int r;
 
@@ -57,10 +92,10 @@ static int specifier_instance(char specifier, void *data, void *userdata, char *
         if (r < 0)
                 return r;
 
-        if (!instance) {
-                instance = strdup("");
-                if (!instance)
-                        return -ENOMEM;
+        if (isempty(instance)) {
+                r = free_and_strdup(&instance, i->default_instance ?: "");
+                if (r < 0)
+                        return r;
         }
 
         *ret = instance;
@@ -73,9 +108,13 @@ static int specifier_user_name(char specifier, void *data, void *userdata, char
         /* If we are UID 0 (root), this will not result in NSS,
          * otherwise it might. This is good, as we want to be able to
          * run this in PID 1, where our user ID is 0, but where NSS
-         * lookups are not allowed. */
+         * lookups are not allowed.
+
+         * We don't user getusername_malloc() here, because we don't want to look
+         * at $USER, to remain consistent with specifer_user_id() below.
+         */
 
-        t = getusername_malloc();
+        t = uid_to_name(getuid());
         if (!t)
                 return -ENOMEM;
 
@@ -110,7 +149,7 @@ int install_full_printf(UnitFileInstallInfo *i, const char *format, char **ret)
          */
 
         const Specifier table[] = {
-                { 'n', specifier_string,              i->name },
+                { 'n', specifier_name,                NULL },
                 { 'N', specifier_prefix_and_instance, NULL },
                 { 'p', specifier_prefix,              NULL },
                 { 'i', specifier_instance,            NULL },
index cde17f8..d0a291b 100644 (file)
@@ -208,47 +208,55 @@ static int path_is_control(const LookupPaths *p, const char *path) {
                path_equal_ptr(parent, p->runtime_control);
 }
 
-static int path_is_config(const LookupPaths *p, const char *path) {
+static int path_is_config(const LookupPaths *p, const char *path, bool check_parent) {
         _cleanup_free_ char *parent = NULL;
 
         assert(p);
         assert(path);
 
-        /* Note that we do *not* have generic checks for /etc or /run in place, since with them we couldn't discern
-         * configuration from transient or generated units */
+        /* Note that we do *not* have generic checks for /etc or /run in place, since with
+         * them we couldn't discern configuration from transient or generated units */
 
-        parent = dirname_malloc(path);
-        if (!parent)
-                return -ENOMEM;
+        if (check_parent) {
+                parent = dirname_malloc(path);
+                if (!parent)
+                        return -ENOMEM;
+
+                path = parent;
+        }
 
-        return path_equal_ptr(parent, p->persistent_config) ||
-               path_equal_ptr(parent, p->runtime_config);
+        return path_equal_ptr(path, p->persistent_config) ||
+               path_equal_ptr(path, p->runtime_config);
 }
 
-static int path_is_runtime(const LookupPaths *p, const char *path) {
+static int path_is_runtime(const LookupPaths *p, const char *path, bool check_parent) {
         _cleanup_free_ char *parent = NULL;
         const char *rpath;
 
         assert(p);
         assert(path);
 
-        /* Everything in /run is considered runtime. On top of that we also add explicit checks for the various runtime
-         * directories, as safety net. */
+        /* Everything in /run is considered runtime. On top of that we also add
+         * explicit checks for the various runtime directories, as safety net. */
 
         rpath = skip_root(p, path);
         if (rpath && path_startswith(rpath, "/run"))
                 return true;
 
-        parent = dirname_malloc(path);
-        if (!parent)
-                return -ENOMEM;
+        if (check_parent) {
+                parent = dirname_malloc(path);
+                if (!parent)
+                        return -ENOMEM;
 
-        return path_equal_ptr(parent, p->runtime_config) ||
-               path_equal_ptr(parent, p->generator) ||
-               path_equal_ptr(parent, p->generator_early) ||
-               path_equal_ptr(parent, p->generator_late) ||
-               path_equal_ptr(parent, p->transient) ||
-               path_equal_ptr(parent, p->runtime_control);
+                path = parent;
+        }
+
+        return path_equal_ptr(path, p->runtime_config) ||
+               path_equal_ptr(path, p->generator) ||
+               path_equal_ptr(path, p->generator_early) ||
+               path_equal_ptr(path, p->generator_late) ||
+               path_equal_ptr(path, p->transient) ||
+               path_equal_ptr(path, p->runtime_control);
 }
 
 static int path_is_vendor(const LookupPaths *p, const char *path) {
@@ -381,6 +389,12 @@ void unit_file_dump_changes(int r, const char *verb, const UnitFileChange *chang
                                         verb, changes[i].path);
                         logged = true;
                         break;
+
+                case -ENOENT:
+                        log_error_errno(changes[i].type, "Failed to %s unit, unit %s does not exist.", verb, changes[i].path);
+                        logged = true;
+                        break;
+
                 default:
                         assert(changes[i].type < 0);
                         log_error_errno(changes[i].type, "Failed to %s unit, file %s: %m.",
@@ -393,19 +407,43 @@ void unit_file_dump_changes(int r, const char *verb, const UnitFileChange *chang
                 log_error_errno(r, "Failed to %s: %m.", verb);
 }
 
+/**
+ * Checks if two paths or symlinks from wd are the same, when root is the root of the filesystem.
+ * wc should be the full path in the host file system.
+ */
+static bool chroot_symlinks_same(const char *root, const char *wd, const char *a, const char *b) {
+        assert(path_is_absolute(wd));
+
+        /* This will give incorrect results if the paths are relative and go outside
+         * of the chroot. False negatives are possible. */
+
+        if (!root)
+                root = "/";
+
+        a = strjoina(path_is_absolute(a) ? root : wd, "/", a);
+        b = strjoina(path_is_absolute(b) ? root : wd, "/", b);
+        return path_equal_or_files_same(a, b, 0);
+}
+
 static int create_symlink(
+                const LookupPaths *paths,
                 const char *old_path,
                 const char *new_path,
                 bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
-        _cleanup_free_ char *dest = NULL;
+        _cleanup_free_ char *dest = NULL, *dirname = NULL;
+        const char *rp;
         int r;
 
         assert(old_path);
         assert(new_path);
 
+        rp = skip_root(paths, old_path);
+        if (rp)
+                old_path = rp;
+
         /* Actually create a symlink, and remember that we did. Is
          * smart enough to check if there's already a valid symlink in
          * place.
@@ -436,7 +474,11 @@ static int create_symlink(
                 return r;
         }
 
-        if (path_equal(dest, old_path))
+        dirname = dirname_malloc(new_path);
+        if (!dirname)
+                return -ENOMEM;
+
+        if (chroot_symlinks_same(paths->root_dir, dirname, dest, old_path))
                 return 1;
 
         if (!force) {
@@ -490,6 +532,7 @@ static int remove_marked_symlinks_fd(
                 const char *path,
                 const char *config_path,
                 const LookupPaths *lp,
+                bool dry_run,
                 bool *restart,
                 UnitFileChange **changes,
                 unsigned *n_changes) {
@@ -538,7 +581,7 @@ static int remove_marked_symlinks_fd(
                         }
 
                         /* This will close nfd, regardless whether it succeeds or not */
-                        q = remove_marked_symlinks_fd(remove_symlinks_to, nfd, p, config_path, lp, restart, changes, n_changes);
+                        q = remove_marked_symlinks_fd(remove_symlinks_to, nfd, p, config_path, lp, dry_run, restart, changes, n_changes);
                         if (q < 0 && r == 0)
                                 r = q;
 
@@ -575,14 +618,16 @@ static int remove_marked_symlinks_fd(
                         if (!found)
                                 continue;
 
-                        if (unlinkat(fd, de->d_name, 0) < 0 && errno != ENOENT) {
-                                if (r == 0)
-                                        r = -errno;
-                                unit_file_changes_add(changes, n_changes, -errno, p, NULL);
-                                continue;
-                        }
+                        if (!dry_run) {
+                                if (unlinkat(fd, de->d_name, 0) < 0 && errno != ENOENT) {
+                                        if (r == 0)
+                                                r = -errno;
+                                        unit_file_changes_add(changes, n_changes, -errno, p, NULL);
+                                        continue;
+                                }
 
-                        (void) rmdir_parents(p, config_path);
+                                (void) rmdir_parents(p, config_path);
+                        }
 
                         unit_file_changes_add(changes, n_changes, UNIT_FILE_UNLINK, p, NULL);
 
@@ -593,7 +638,7 @@ static int remove_marked_symlinks_fd(
                         q = mark_symlink_for_removal(&remove_symlinks_to, rp ?: p);
                         if (q < 0)
                                 return q;
-                        if (q > 0)
+                        if (q > 0 && !dry_run)
                                 *restart = true;
                 }
         }
@@ -605,6 +650,7 @@ static int remove_marked_symlinks(
                 Set *remove_symlinks_to,
                 const char *config_path,
                 const LookupPaths *lp,
+                bool dry_run,
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
@@ -620,7 +666,7 @@ static int remove_marked_symlinks(
 
         fd = open(config_path, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC);
         if (fd < 0)
-                return -errno;
+                return errno == ENOENT ? 0 : -errno;
 
         do {
                 int q, cfd;
@@ -631,7 +677,7 @@ static int remove_marked_symlinks(
                         return -errno;
 
                 /* This takes possession of cfd and closes it */
-                q = remove_marked_symlinks_fd(remove_symlinks_to, cfd, config_path, config_path, lp, &restart, changes, n_changes);
+                q = remove_marked_symlinks_fd(remove_symlinks_to, cfd, config_path, config_path, lp, dry_run, &restart, changes, n_changes);
                 if (r == 0)
                         r = q;
         } while (restart);
@@ -645,7 +691,6 @@ static int find_symlinks_fd(
                 int fd,
                 const char *path,
                 const char *config_path,
-                const LookupPaths *lp,
                 bool *same_name_link) {
 
         _cleanup_closedir_ DIR *d = NULL;
@@ -656,7 +701,6 @@ static int find_symlinks_fd(
         assert(fd >= 0);
         assert(path);
         assert(config_path);
-        assert(lp);
         assert(same_name_link);
 
         d = fdopendir(fd);
@@ -690,7 +734,7 @@ static int find_symlinks_fd(
                         }
 
                         /* This will close nfd, regardless whether it succeeds or not */
-                        q = find_symlinks_fd(root_dir, name, nfd, p, config_path, lp, same_name_link);
+                        q = find_symlinks_fd(root_dir, name, nfd, p, config_path, same_name_link);
                         if (q > 0)
                                 return 1;
                         if (r == 0)
@@ -768,7 +812,6 @@ static int find_symlinks(
                 const char *root_dir,
                 const char *name,
                 const char *config_path,
-                const LookupPaths *lp,
                 bool *same_name_link) {
 
         int fd;
@@ -777,7 +820,7 @@ static int find_symlinks(
         assert(config_path);
         assert(same_name_link);
 
-        fd = open(config_path, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW);
+        fd = open(config_path, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC);
         if (fd < 0) {
                 if (IN_SET(errno, ENOENT, ENOTDIR, EACCES))
                         return 0;
@@ -785,44 +828,82 @@ static int find_symlinks(
         }
 
         /* This takes possession of fd and closes it */
-        return find_symlinks_fd(root_dir, name, fd, config_path, config_path, lp, same_name_link);
+        return find_symlinks_fd(root_dir, name, fd, config_path, config_path, same_name_link);
 }
 
 static int find_symlinks_in_scope(
-                UnitFileScope scope,
                 const LookupPaths *paths,
                 const char *name,
                 UnitFileState *state) {
 
-        bool same_name_link_runtime = false, same_name_link = false;
+        bool same_name_link_runtime = false, same_name_link_config = false;
+        bool enabled_in_runtime = false, enabled_at_all = false;
+        char **p;
         int r;
 
-        assert(scope >= 0);
-        assert(scope < _UNIT_FILE_SCOPE_MAX);
         assert(paths);
         assert(name);
 
-        /* First look in the persistent config path */
-        r = find_symlinks(paths->root_dir, name, paths->persistent_config, paths, &same_name_link);
-        if (r < 0)
-                return r;
-        if (r > 0) {
-                *state = UNIT_FILE_ENABLED;
-                return r;
+        STRV_FOREACH(p, paths->search_path)  {
+                bool same_name_link = false;
+
+                r = find_symlinks(paths->root_dir, name, *p, &same_name_link);
+                if (r < 0)
+                        return r;
+                if (r > 0) {
+                        /* We found symlinks in this dir? Yay! Let's see where precisely it is enabled. */
+
+                        r = path_is_config(paths, *p, false);
+                        if (r < 0)
+                                return r;
+                        if (r > 0) {
+                                /* This is the best outcome, let's return it immediately. */
+                                *state = UNIT_FILE_ENABLED;
+                                return 1;
+                        }
+
+                        r = path_is_runtime(paths, *p, false);
+                        if (r < 0)
+                                return r;
+                        if (r > 0)
+                                enabled_in_runtime = true;
+                        else
+                                enabled_at_all = true;
+
+                } else if (same_name_link) {
+
+                        r = path_is_config(paths, *p, false);
+                        if (r < 0)
+                                return r;
+                        if (r > 0)
+                                same_name_link_config = true;
+                        else {
+                                r = path_is_runtime(paths, *p, false);
+                                if (r < 0)
+                                        return r;
+                                if (r > 0)
+                                        same_name_link_runtime = true;
+                        }
+                }
         }
 
-        /* Then look in runtime config path */
-        r = find_symlinks(paths->root_dir, name, paths->runtime_config, paths, &same_name_link_runtime);
-        if (r < 0)
-                return r;
-        if (r > 0) {
+        if (enabled_in_runtime) {
                 *state = UNIT_FILE_ENABLED_RUNTIME;
-                return r;
+                return 1;
+        }
+
+        /* Here's a special rule: if the unit we are looking for is an instance, and it symlinked in the search path
+         * outside of runtime and configuration directory, then we consider it statically enabled. Note we do that only
+         * for instance, not for regular names, as those are merely aliases, while instances explicitly instantiate
+         * something, and hence are a much stronger concept. */
+        if (enabled_at_all && unit_name_is_valid(name, UNIT_NAME_INSTANCE)) {
+                *state = UNIT_FILE_STATIC;
+                return 1;
         }
 
         /* Hmm, we didn't find it, but maybe we found the same name
          * link? */
-        if (same_name_link) {
+        if (same_name_link_config) {
                 *state = UNIT_FILE_LINKED;
                 return 1;
         }
@@ -887,8 +968,8 @@ static int install_info_may_process(
         assert(i);
         assert(paths);
 
-        /* Checks whether the loaded unit file is one we should process, or is masked, transient or generated and thus
-         * not subject to enable/disable operations. */
+        /* Checks whether the loaded unit file is one we should process, or is masked,
+         * transient or generated and thus not subject to enable/disable operations. */
 
         if (i->type == UNIT_FILE_TYPE_MASKED) {
                 unit_file_changes_add(changes, n_changes, -ERFKILL, i->path, NULL);
@@ -903,10 +984,17 @@ static int install_info_may_process(
         return 0;
 }
 
+/**
+ * Adds a new UnitFileInstallInfo entry under name in the InstallContext.will_process
+ * hashmap, or retrieves the existing one if already present.
+ *
+ * Returns negative on error, 0 if the unit was already known, 1 otherwise.
+ */
 static int install_info_add(
                 InstallContext *c,
                 const char *name,
                 const char *path,
+                bool auxiliary,
                 UnitFileInstallInfo **ret) {
 
         UnitFileInstallInfo *i = NULL;
@@ -923,6 +1011,8 @@ static int install_info_add(
 
         i = install_info_find(c, name);
         if (i) {
+                i->auxiliary = i->auxiliary && auxiliary;
+
                 if (ret)
                         *ret = i;
                 return 0;
@@ -936,6 +1026,7 @@ static int install_info_add(
         if (!i)
                 return -ENOMEM;
         i->type = _UNIT_FILE_TYPE_INVALID;
+        i->auxiliary = auxiliary;
 
         i->name = strdup(name);
         if (!i->name) {
@@ -958,7 +1049,7 @@ static int install_info_add(
         if (ret)
                 *ret = i;
 
-        return 0;
+        return 1;
 
 fail:
         install_info_free(i);
@@ -988,7 +1079,7 @@ static int config_parse_alias(
         type = unit_name_to_type(name);
         if (!unit_type_may_alias(type))
                 return log_syntax(unit, LOG_WARNING, filename, line, 0,
-                                  "Aliases are not allowed for %s units, ignoring.",
+                                  "Alias= is not allowed for %s units, ignoring.",
                                   unit_type_to_string(type));
 
         return config_parse_strv(unit, filename, line, section, section_line,
@@ -1007,7 +1098,7 @@ static int config_parse_also(
                 void *data,
                 void *userdata) {
 
-        UnitFileInstallInfo *i = userdata;
+        UnitFileInstallInfo *info = userdata, *alsoinfo = NULL;
         InstallContext *c = data;
         int r;
 
@@ -1016,7 +1107,7 @@ static int config_parse_also(
         assert(rvalue);
 
         for (;;) {
-                _cleanup_free_ char *word = NULL;
+                _cleanup_free_ char *word = NULL, *printed = NULL;
 
                 r = extract_first_word(&rvalue, &word, NULL, 0);
                 if (r < 0)
@@ -1024,15 +1115,22 @@ static int config_parse_also(
                 if (r == 0)
                         break;
 
-                r = install_info_add(c, word, NULL, NULL);
+                r = install_full_printf(info, word, &printed);
                 if (r < 0)
                         return r;
 
-                r = strv_push(&i->also, word);
+                if (!unit_name_is_valid(printed, UNIT_NAME_ANY))
+                        return -EINVAL;
+
+                r = install_info_add(c, printed, NULL, true, &alsoinfo);
                 if (r < 0)
                         return r;
 
-                word = NULL;
+                r = strv_push(&info->also, printed);
+                if (r < 0)
+                        return r;
+
+                printed = NULL;
         }
 
         return 0;
@@ -1052,7 +1150,7 @@ static int config_parse_default_instance(
 
         UnitFileInstallInfo *i = data;
         const char *name;
-        char *printed;
+        _cleanup_free_ char *printed = NULL;
         int r;
 
         assert(filename);
@@ -1066,21 +1164,16 @@ static int config_parse_default_instance(
                 return 0;
         if (!unit_name_is_valid(name, UNIT_NAME_TEMPLATE))
                 return log_syntax(unit, LOG_WARNING, filename, line, 0,
-                                  "DefaultInstance only makes sense for template units, ignoring.");
+                                  "DefaultInstance= only makes sense for template units, ignoring.");
 
         r = install_full_printf(i, rvalue, &printed);
         if (r < 0)
                 return r;
 
-        if (!unit_instance_is_valid(printed)) {
-                free(printed);
+        if (!unit_instance_is_valid(printed))
                 return -EINVAL;
-        }
 
-        free(i->default_instance);
-        i->default_instance = printed;
-
-        return 0;
+        return free_and_replace(i->default_instance, printed);
 }
 
 static int unit_file_load(
@@ -1105,7 +1198,6 @@ static int unit_file_load(
         struct stat st;
         int r;
 
-        assert(c);
         assert(info);
         assert(path);
 
@@ -1134,6 +1226,9 @@ static int unit_file_load(
                 return 0;
         }
 
+        /* c is only needed if we actually load the file */
+        assert(c);
+
         fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW);
         if (fd < 0)
                 return -errno;
@@ -1158,7 +1253,7 @@ static int unit_file_load(
                          config_item_table_lookup, items,
                          true, true, false, info);
         if (r < 0)
-                return r;
+                return log_debug_errno(r, "Failed to parse %s: %m", info->name);
 
         info->type = UNIT_FILE_TYPE_REGULAR;
 
@@ -1246,7 +1341,6 @@ static int unit_file_search(
         char **p;
         int r;
 
-        assert(c);
         assert(info);
         assert(paths);
 
@@ -1262,7 +1356,7 @@ static int unit_file_search(
         STRV_FOREACH(p, paths->search_path) {
                 _cleanup_free_ char *path = NULL;
 
-                path = strjoin(*p, "/", info->name, NULL);
+                path = strjoin(*p, "/", info->name);
                 if (!path)
                         return -ENOMEM;
 
@@ -1287,7 +1381,7 @@ static int unit_file_search(
                 STRV_FOREACH(p, paths->search_path) {
                         _cleanup_free_ char *path = NULL;
 
-                        path = strjoin(*p, "/", template, NULL);
+                        path = strjoin(*p, "/", template);
                         if (!path)
                                 return -ENOMEM;
 
@@ -1309,7 +1403,8 @@ static int install_info_follow(
                 InstallContext *c,
                 UnitFileInstallInfo *i,
                 const char *root_dir,
-                SearchFlags flags) {
+                SearchFlags flags,
+                bool ignore_different_name) {
 
         assert(c);
         assert(i);
@@ -1322,21 +1417,18 @@ static int install_info_follow(
         /* If the basename doesn't match, the caller should add a
          * complete new entry for this. */
 
-        if (!streq(basename(i->symlink_target), i->name))
+        if (!ignore_different_name && !streq(basename(i->symlink_target), i->name))
                 return -EXDEV;
 
-        free(i->path);
-        i->path = i->symlink_target;
-        i->symlink_target = NULL;
+        free_and_replace(i->path, i->symlink_target);
         i->type = _UNIT_FILE_TYPE_INVALID;
 
         return unit_file_load_or_readlink(c, i, i->path, root_dir, flags);
 }
 
 /**
- * Search for the unit file. If the unit name is a symlink,
- * follow the symlink to the target, maybe more than once.
- * Propagate the instance name if present.
+ * Search for the unit file. If the unit name is a symlink, follow the symlink to the
+ * target, maybe more than once. Propagate the instance name if present.
  */
 static int install_info_traverse(
                 UnitFileScope scope,
@@ -1366,14 +1458,14 @@ static int install_info_traverse(
                         return -ELOOP;
 
                 if (!(flags & SEARCH_FOLLOW_CONFIG_SYMLINKS)) {
-                        r = path_is_config(paths, i->path);
+                        r = path_is_config(paths, i->path, true);
                         if (r < 0)
                                 return r;
                         if (r > 0)
                                 return -ELOOP;
                 }
 
-                r = install_info_follow(c, i, paths->root_dir, flags);
+                r = install_info_follow(c, i, paths->root_dir, flags, false);
                 if (r == -EXDEV) {
                         _cleanup_free_ char *buffer = NULL;
                         const char *bn;
@@ -1397,10 +1489,22 @@ static int install_info_traverse(
                                 if (r < 0)
                                         return r;
 
+                                if (streq(buffer, i->name)) {
+
+                                        /* We filled in the instance, and the target stayed the same? If so, then let's
+                                         * honour the link as it is. */
+
+                                        r = install_info_follow(c, i, paths->root_dir, flags, true);
+                                        if (r < 0)
+                                                return r;
+
+                                        continue;
+                                }
+
                                 bn = buffer;
                         }
 
-                        r = install_info_add(c, bn, NULL, &i);
+                        r = install_info_add(c, bn, NULL, false, &i);
                         if (r < 0)
                                 return r;
 
@@ -1421,6 +1525,10 @@ static int install_info_traverse(
         return 0;
 }
 
+/**
+ * Call install_info_add() with name_or_path as the path (if name_or_path starts with "/")
+ * or the name (otherwise). root_dir is prepended to the path.
+ */
 static int install_info_add_auto(
                 InstallContext *c,
                 const LookupPaths *paths,
@@ -1435,9 +1543,9 @@ static int install_info_add_auto(
 
                 pp = prefix_roota(paths->root_dir, name_or_path);
 
-                return install_info_add(c, NULL, pp, ret);
+                return install_info_add(c, NULL, pp, false, ret);
         } else
-                return install_info_add(c, name_or_path, NULL, ret);
+                return install_info_add(c, name_or_path, NULL, false, ret);
 }
 
 static int install_info_discover(
@@ -1446,7 +1554,9 @@ static int install_info_discover(
                 const LookupPaths *paths,
                 const char *name,
                 SearchFlags flags,
-                UnitFileInstallInfo **ret) {
+                UnitFileInstallInfo **ret,
+                UnitFileChange **changes,
+                unsigned *n_changes) {
 
         UnitFileInstallInfo *i;
         int r;
@@ -1456,10 +1566,12 @@ static int install_info_discover(
         assert(name);
 
         r = install_info_add_auto(c, paths, name, &i);
-        if (r < 0)
-                return r;
+        if (r >= 0)
+                r = install_info_traverse(scope, c, paths, i, flags, ret);
 
-        return install_info_traverse(scope, c, paths, i, flags, ret);
+        if (r < 0)
+                unit_file_changes_add(changes, n_changes, r, name, NULL);
+        return r;
 }
 
 static int install_info_symlink_alias(
@@ -1479,7 +1591,6 @@ static int install_info_symlink_alias(
 
         STRV_FOREACH(s, i->aliases) {
                 _cleanup_free_ char *alias_path = NULL, *dst = NULL;
-                const char *rp;
 
                 q = install_full_printf(i, *s, &dst);
                 if (q < 0)
@@ -1489,9 +1600,7 @@ static int install_info_symlink_alias(
                 if (!alias_path)
                         return -ENOMEM;
 
-                rp = skip_root(paths, i->path);
-
-                q = create_symlink(rp ?: i->path, alias_path, force, changes, n_changes);
+                q = create_symlink(paths, i->path, alias_path, force, changes, n_changes);
                 if (r == 0)
                         r = q;
         }
@@ -1517,25 +1626,38 @@ static int install_info_symlink_wants(
         assert(paths);
         assert(config_path);
 
-        if (unit_name_is_valid(i->name, UNIT_NAME_TEMPLATE)) {
-
-                /* Don't install any symlink if there's no default
-                 * instance configured */
+        if (strv_isempty(list))
+                return 0;
 
-                if (!i->default_instance)
-                        return 0;
+        if (unit_name_is_valid(i->name, UNIT_NAME_TEMPLATE) && i->default_instance) {
+                UnitFileInstallInfo instance = {
+                        .type = _UNIT_FILE_TYPE_INVALID,
+                };
+                _cleanup_free_ char *path = NULL;
 
                 r = unit_name_replace_instance(i->name, i->default_instance, &buf);
                 if (r < 0)
                         return r;
 
+                instance.name = buf;
+                r = unit_file_search(NULL, &instance, paths, SEARCH_FOLLOW_CONFIG_SYMLINKS);
+                if (r < 0)
+                        return r;
+
+                path = instance.path;
+                instance.path = NULL;
+
+                if (instance.type == UNIT_FILE_TYPE_MASKED) {
+                        unit_file_changes_add(changes, n_changes, -ERFKILL, path, NULL);
+                        return -ERFKILL;
+                }
+
                 n = buf;
         } else
                 n = i->name;
 
         STRV_FOREACH(s, list) {
                 _cleanup_free_ char *path = NULL, *dst = NULL;
-                const char *rp;
 
                 q = install_full_printf(i, *s, &dst);
                 if (q < 0)
@@ -1546,13 +1668,11 @@ static int install_info_symlink_wants(
                         continue;
                 }
 
-                path = strjoin(config_path, "/", dst, suffix, n, NULL);
+                path = strjoin(config_path, "/", dst, suffix, n);
                 if (!path)
                         return -ENOMEM;
 
-                rp = skip_root(paths, i->path);
-
-                q = create_symlink(rp ?: i->path, path, true, changes, n_changes);
+                q = create_symlink(paths, i->path, path, true, changes, n_changes);
                 if (r == 0)
                         r = q;
         }
@@ -1569,7 +1689,6 @@ static int install_info_symlink_link(
                 unsigned *n_changes) {
 
         _cleanup_free_ char *path = NULL;
-        const char *rp;
         int r;
 
         assert(i);
@@ -1583,13 +1702,11 @@ static int install_info_symlink_link(
         if (r > 0)
                 return 0;
 
-        path = strjoin(config_path, "/", i->name, NULL);
+        path = strjoin(config_path, "/", i->name);
         if (!path)
                 return -ENOMEM;
 
-        rp = skip_root(paths, i->path);
-
-        return create_symlink(rp ?: i->path, path, force, changes, n_changes);
+        return create_symlink(paths, i->path, path, force, changes, n_changes);
 }
 
 static int install_info_apply(
@@ -1660,8 +1777,21 @@ static int install_context_apply(
                         return q;
 
                 r = install_info_traverse(scope, c, paths, i, flags, NULL);
-                if (r < 0)
+                if (r < 0) {
+                        unit_file_changes_add(changes, n_changes, r, i->name, NULL);
                         return r;
+                }
+
+                /* We can attempt to process a masked unit when a different unit
+                 * that we were processing specifies it in Also=. */
+                if (i->type == UNIT_FILE_TYPE_MASKED) {
+                        unit_file_changes_add(changes, n_changes, UNIT_FILE_IS_MASKED, i->path, NULL);
+                        if (r >= 0)
+                                /* Assume that something *could* have been enabled here,
+                                 * avoid "empty [Install] section" warning. */
+                                r += 1;
+                        continue;
+                }
 
                 if (i->type != UNIT_FILE_TYPE_REGULAR)
                         continue;
@@ -1683,7 +1813,9 @@ static int install_context_mark_for_removal(
                 InstallContext *c,
                 const LookupPaths *paths,
                 Set **remove_symlinks_to,
-                const char *config_path) {
+                const char *config_path,
+                UnitFileChange **changes,
+                unsigned *n_changes) {
 
         UnitFileInstallInfo *i;
         int r;
@@ -1708,15 +1840,27 @@ static int install_context_mark_for_removal(
                         return r;
 
                 r = install_info_traverse(scope, c, paths, i, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS, NULL);
-                if (r == -ENOLINK)
-                        return 0;
-                else if (r < 0)
-                        return r;
+                if (r == -ENOLINK) {
+                        log_debug_errno(r, "Name %s leads to a dangling symlink, removing name.", i->name);
+                        unit_file_changes_add(changes, n_changes, UNIT_FILE_IS_DANGLING, i->path ?: i->name, NULL);
+                } else if (r == -ENOENT) {
+
+                        if (i->auxiliary)  /* some unit specified in Also= or similar is missing */
+                                log_debug_errno(r, "Auxiliary unit of %s not found, removing name.", i->name);
+                        else {
+                                log_debug_errno(r, "Unit %s not found, removing name.", i->name);
+                                unit_file_changes_add(changes, n_changes, r, i->path ?: i->name, NULL);
+                        }
 
-                if (i->type != UNIT_FILE_TYPE_REGULAR) {
-                        log_debug("Unit %s has type %s, ignoring.",
-                                  i->name,
-                                  unit_file_type_to_string(i->type) ?: "invalid");
+                } else if (r < 0) {
+                        log_debug_errno(r, "Failed to find unit %s, removing name: %m", i->name);
+                        unit_file_changes_add(changes, n_changes, r, i->path ?: i->name, NULL);
+                } else if (i->type == UNIT_FILE_TYPE_MASKED) {
+                        log_debug("Unit file %s is masked, ignoring.", i->name);
+                        unit_file_changes_add(changes, n_changes, UNIT_FILE_IS_MASKED, i->path ?: i->name, NULL);
+                        continue;
+                } else if (i->type != UNIT_FILE_TYPE_REGULAR) {
+                        log_debug("Unit %s has type %s, ignoring.", i->name, unit_file_type_to_string(i->type) ?: "invalid");
                         continue;
                 }
 
@@ -1730,10 +1874,9 @@ static int install_context_mark_for_removal(
 
 int unit_file_mask(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
@@ -1749,7 +1892,9 @@ int unit_file_mask(
         if (r < 0)
                 return r;
 
-        config_path = runtime ? paths.runtime_config : paths.persistent_config;
+        config_path = (flags & UNIT_FILE_RUNTIME) ? paths.runtime_config : paths.persistent_config;
+        if (!config_path)
+                return -ENXIO;
 
         STRV_FOREACH(i, files) {
                 _cleanup_free_ char *path = NULL;
@@ -1765,7 +1910,7 @@ int unit_file_mask(
                 if (!path)
                         return -ENOMEM;
 
-                q = create_symlink("/dev/null", path, force, changes, n_changes);
+                q = create_symlink(&paths, "/dev/null", path, !!(flags & UNIT_FILE_FORCE), changes, n_changes);
                 if (q < 0 && r >= 0)
                         r = q;
         }
@@ -1775,7 +1920,7 @@ int unit_file_mask(
 
 int unit_file_unmask(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
                 UnitFileChange **changes,
@@ -1783,10 +1928,11 @@ int unit_file_unmask(
 
         _cleanup_lookup_paths_free_ LookupPaths paths = {};
         _cleanup_set_free_free_ Set *remove_symlinks_to = NULL;
-        _cleanup_free_ char **todo = NULL;
+        _cleanup_strv_free_ char **todo = NULL;
         size_t n_todo = 0, n_allocated = 0;
         const char *config_path;
         char **i;
+        bool dry_run;
         int r, q;
 
         assert(scope >= 0);
@@ -1796,7 +1942,11 @@ int unit_file_unmask(
         if (r < 0)
                 return r;
 
-        config_path = runtime ? paths.runtime_config : paths.persistent_config;
+        config_path = (flags & UNIT_FILE_RUNTIME) ? paths.runtime_config : paths.persistent_config;
+        if (!config_path)
+                return -ENXIO;
+
+        dry_run = !!(flags & UNIT_FILE_DRY_RUN);
 
         STRV_FOREACH(i, files) {
                 _cleanup_free_ char *path = NULL;
@@ -1819,7 +1969,11 @@ int unit_file_unmask(
                 if (!GREEDY_REALLOC0(todo, n_allocated, n_todo + 2))
                         return -ENOMEM;
 
-                todo[n_todo++] = *i;
+                todo[n_todo] = strdup(*i);
+                if (!todo[n_todo])
+                        return -ENOMEM;
+
+                n_todo++;
         }
 
         strv_uniq(todo);
@@ -1833,7 +1987,7 @@ int unit_file_unmask(
                 if (!path)
                         return -ENOMEM;
 
-                if (unlink(path) < 0) {
+                if (!dry_run && unlink(path) < 0) {
                         if (errno != ENOENT) {
                                 if (r >= 0)
                                         r = -errno;
@@ -1851,7 +2005,7 @@ int unit_file_unmask(
                         return q;
         }
 
-        q = remove_marked_symlinks(remove_symlinks_to, config_path, &paths, changes, n_changes);
+        q = remove_marked_symlinks(remove_symlinks_to, config_path, &paths, dry_run, changes, n_changes);
         if (r >= 0)
                 r = q;
 
@@ -1860,15 +2014,14 @@ int unit_file_unmask(
 
 int unit_file_link(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
         _cleanup_lookup_paths_free_ LookupPaths paths = {};
-        _cleanup_free_ char **todo = NULL;
+        _cleanup_strv_free_ char **todo = NULL;
         size_t n_todo = 0, n_allocated = 0;
         const char *config_path;
         char **i;
@@ -1881,7 +2034,9 @@ int unit_file_link(
         if (r < 0)
                 return r;
 
-        config_path = runtime ? paths.runtime_config : paths.persistent_config;
+        config_path = (flags & UNIT_FILE_RUNTIME) ? paths.runtime_config : paths.persistent_config;
+        if (!config_path)
+                return -ENXIO;
 
         STRV_FOREACH(i, files) {
                 _cleanup_free_ char *full = NULL;
@@ -1917,7 +2072,11 @@ int unit_file_link(
                 if (!GREEDY_REALLOC0(todo, n_allocated, n_todo + 2))
                         return -ENOMEM;
 
-                todo[n_todo++] = *i;
+                todo[n_todo] = strdup(*i);
+                if (!todo[n_todo])
+                        return -ENOMEM;
+
+                n_todo++;
         }
 
         strv_uniq(todo);
@@ -1925,14 +2084,12 @@ int unit_file_link(
         r = 0;
         STRV_FOREACH(i, todo) {
                 _cleanup_free_ char *new_path = NULL;
-                const char *old_path;
 
-                old_path = skip_root(&paths, *i);
                 new_path = path_make_absolute(basename(*i), config_path);
                 if (!new_path)
                         return -ENOMEM;
 
-                q = create_symlink(old_path ?: *i, new_path, force, changes, n_changes);
+                q = create_symlink(&paths, *i, new_path, !!(flags & UNIT_FILE_FORCE), changes, n_changes);
                 if (q < 0 && r >= 0)
                         r = q;
         }
@@ -1948,7 +2105,7 @@ static int path_shall_revert(const LookupPaths *paths, const char *path) {
 
         /* Checks whether the path is one where the drop-in directories shall be removed. */
 
-        r = path_is_config(paths, path);
+        r = path_is_config(paths, path, true);
         if (r != 0)
                 return r;
 
@@ -1967,7 +2124,6 @@ int unit_file_revert(
                 unsigned *n_changes) {
 
         _cleanup_set_free_free_ Set *remove_symlinks_to = NULL;
-        /* _cleanup_(install_context_done) InstallContext c = {}; */
         _cleanup_lookup_paths_free_ LookupPaths paths = {};
         _cleanup_strv_free_ char **todo = NULL;
         size_t n_todo = 0, n_allocated = 0;
@@ -2057,7 +2213,7 @@ int unit_file_revert(
                                 if (errno != ENOENT)
                                         return -errno;
                         } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
-                                r = path_is_config(&paths, path);
+                                r = path_is_config(&paths, path, true);
                                 if (r < 0)
                                         return r;
                                 if (r > 0) {
@@ -2090,7 +2246,7 @@ int unit_file_revert(
                 STRV_FOREACH(j, fs) {
                         _cleanup_free_ char *t = NULL;
 
-                        t = strjoin(*i, "/", *j, NULL);
+                        t = strjoin(*i, "/", *j);
                         if (!t)
                                 return -ENOMEM;
 
@@ -2105,11 +2261,11 @@ int unit_file_revert(
                         return q;
         }
 
-        q = remove_marked_symlinks(remove_symlinks_to, paths.runtime_config, &paths, changes, n_changes);
+        q = remove_marked_symlinks(remove_symlinks_to, paths.runtime_config, &paths, false, changes, n_changes);
         if (r >= 0)
                 r = q;
 
-        q = remove_marked_symlinks(remove_symlinks_to, paths.persistent_config, &paths, changes, n_changes);
+        q = remove_marked_symlinks(remove_symlinks_to, paths.persistent_config, &paths, false, changes, n_changes);
         if (r >= 0)
                 r = q;
 
@@ -2118,12 +2274,11 @@ int unit_file_revert(
 
 int unit_file_add_dependency(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
                 const char *target,
                 UnitDependency dep,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
@@ -2148,9 +2303,12 @@ int unit_file_add_dependency(
         if (r < 0)
                 return r;
 
-        config_path = runtime ? paths.runtime_config : paths.persistent_config;
+        config_path = (flags & UNIT_FILE_RUNTIME) ? paths.runtime_config : paths.persistent_config;
+        if (!config_path)
+                return -ENXIO;
 
-        r = install_info_discover(scope, &c, &paths, target, SEARCH_FOLLOW_CONFIG_SYMLINKS, &target_info);
+        r = install_info_discover(scope, &c, &paths, target, SEARCH_FOLLOW_CONFIG_SYMLINKS,
+                                  &target_info, changes, n_changes);
         if (r < 0)
                 return r;
         r = install_info_may_process(target_info, &paths, changes, n_changes);
@@ -2162,7 +2320,8 @@ int unit_file_add_dependency(
         STRV_FOREACH(f, files) {
                 char ***l;
 
-                r = install_info_discover(scope, &c, &paths, *f, SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
+                r = install_info_discover(scope, &c, &paths, *f, SEARCH_FOLLOW_CONFIG_SYMLINKS,
+                                          &i, changes, n_changes);
                 if (r < 0)
                         return r;
                 r = install_info_may_process(i, &paths, changes, n_changes);
@@ -2186,15 +2345,14 @@ int unit_file_add_dependency(
                         return -ENOMEM;
         }
 
-        return install_context_apply(scope, &c, &paths, config_path, force, SEARCH_FOLLOW_CONFIG_SYMLINKS, changes, n_changes);
+        return install_context_apply(scope, &c, &paths, config_path, !!(flags & UNIT_FILE_FORCE), SEARCH_FOLLOW_CONFIG_SYMLINKS, changes, n_changes);
 }
 
 int unit_file_enable(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
@@ -2212,10 +2370,13 @@ int unit_file_enable(
         if (r < 0)
                 return r;
 
-        config_path = runtime ? paths.runtime_config : paths.persistent_config;
+        config_path = (flags & UNIT_FILE_RUNTIME) ? paths.runtime_config : paths.persistent_config;
+        if (!config_path)
+                return -ENXIO;
 
         STRV_FOREACH(f, files) {
-                r = install_info_discover(scope, &c, &paths, *f, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
+                r = install_info_discover(scope, &c, &paths, *f, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS,
+                                          &i, changes, n_changes);
                 if (r < 0)
                         return r;
                 r = install_info_may_process(i, &paths, changes, n_changes);
@@ -2230,12 +2391,12 @@ int unit_file_enable(
            is useful to determine whether the passed files had any
            installation data at all. */
 
-        return install_context_apply(scope, &c, &paths, config_path, force, SEARCH_LOAD, changes, n_changes);
+        return install_context_apply(scope, &c, &paths, config_path, !!(flags & UNIT_FILE_FORCE), SEARCH_LOAD, changes, n_changes);
 }
 
 int unit_file_disable(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
                 UnitFileChange **changes,
@@ -2255,30 +2416,31 @@ int unit_file_disable(
         if (r < 0)
                 return r;
 
-        config_path = runtime ? paths.runtime_config : paths.persistent_config;
+        config_path = (flags & UNIT_FILE_RUNTIME) ? paths.runtime_config : paths.persistent_config;
+        if (!config_path)
+                return -ENXIO;
 
         STRV_FOREACH(i, files) {
                 if (!unit_name_is_valid(*i, UNIT_NAME_ANY))
                         return -EINVAL;
 
-                r = install_info_add(&c, *i, NULL, NULL);
+                r = install_info_add(&c, *i, NULL, false, NULL);
                 if (r < 0)
                         return r;
         }
 
-        r = install_context_mark_for_removal(scope, &c, &paths, &remove_symlinks_to, config_path);
+        r = install_context_mark_for_removal(scope, &c, &paths, &remove_symlinks_to, config_path, changes, n_changes);
         if (r < 0)
                 return r;
 
-        return remove_marked_symlinks(remove_symlinks_to, config_path, &paths, changes, n_changes);
+        return remove_marked_symlinks(remove_symlinks_to, config_path, &paths, !!(flags & UNIT_FILE_DRY_RUN), changes, n_changes);
 }
 
 int unit_file_reenable(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
@@ -2293,26 +2455,26 @@ int unit_file_reenable(
                 n[i] = basename(files[i]);
         n[i] = NULL;
 
-        r = unit_file_disable(scope, runtime, root_dir, n, changes, n_changes);
+        r = unit_file_disable(scope, flags, root_dir, n, changes, n_changes);
         if (r < 0)
                 return r;
 
         /* But the enable command with the full name */
-        return unit_file_enable(scope, runtime, root_dir, files, force, changes, n_changes);
+        return unit_file_enable(scope, flags, root_dir, files, changes, n_changes);
 }
 
 int unit_file_set_default(
                 UnitFileScope scope,
+                UnitFileFlags flags,
                 const char *root_dir,
                 const char *name,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
         _cleanup_lookup_paths_free_ LookupPaths paths = {};
         _cleanup_(install_context_done) InstallContext c = {};
         UnitFileInstallInfo *i;
-        const char *new_path, *old_path;
+        const char *new_path;
         int r;
 
         assert(scope >= 0);
@@ -2328,17 +2490,15 @@ int unit_file_set_default(
         if (r < 0)
                 return r;
 
-        r = install_info_discover(scope, &c, &paths, name, 0, &i);
+        r = install_info_discover(scope, &c, &paths, name, 0, &i, changes, n_changes);
         if (r < 0)
                 return r;
         r = install_info_may_process(i, &paths, changes, n_changes);
         if (r < 0)
                 return r;
 
-        old_path = skip_root(&paths, i->path);
         new_path = strjoina(paths.persistent_config, "/" SPECIAL_DEFAULT_TARGET);
-
-        return create_symlink(old_path ?: i->path, new_path, force, changes, n_changes);
+        return create_symlink(&paths, i->path, new_path, !!(flags & UNIT_FILE_FORCE), changes, n_changes);
 }
 
 int unit_file_get_default(
@@ -2360,7 +2520,8 @@ int unit_file_get_default(
         if (r < 0)
                 return r;
 
-        r = install_info_discover(scope, &c, &paths, SPECIAL_DEFAULT_TARGET, SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
+        r = install_info_discover(scope, &c, &paths, SPECIAL_DEFAULT_TARGET, SEARCH_FOLLOW_CONFIG_SYMLINKS,
+                                  &i, NULL, NULL);
         if (r < 0)
                 return r;
         r = install_info_may_process(i, &paths, NULL, 0);
@@ -2392,7 +2553,8 @@ static int unit_file_lookup_state(
         if (!unit_name_is_valid(name, UNIT_NAME_ANY))
                 return -EINVAL;
 
-        r = install_info_discover(scope, &c, paths, name, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
+        r = install_info_discover(scope, &c, paths, name, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS,
+                                  &i, NULL, NULL);
         if (r < 0)
                 return r;
 
@@ -2403,7 +2565,7 @@ static int unit_file_lookup_state(
         switch (i->type) {
 
         case UNIT_FILE_TYPE_MASKED:
-                r = path_is_runtime(paths, i->path);
+                r = path_is_runtime(paths, i->path, true);
                 if (r < 0)
                         return r;
 
@@ -2427,7 +2589,7 @@ static int unit_file_lookup_state(
                         break;
                 }
 
-                r = find_symlinks_in_scope(scope, paths, i->name, &state);
+                r = find_symlinks_in_scope(paths, i->name, &state);
                 if (r < 0)
                         return r;
                 if (r == 0) {
@@ -2479,7 +2641,7 @@ int unit_file_exists(UnitFileScope scope, const LookupPaths *paths, const char *
         if (!unit_name_is_valid(name, UNIT_NAME_ANY))
                 return -EINVAL;
 
-        r = install_info_discover(scope, &c, paths, name, 0, NULL);
+        r = install_info_discover(scope, &c, paths, name, 0, NULL, NULL, NULL);
         if (r == -ENOENT)
                 return 0;
         if (r < 0)
@@ -2656,11 +2818,11 @@ static int execute_preset(
         if (mode != UNIT_FILE_PRESET_ENABLE_ONLY) {
                 _cleanup_set_free_free_ Set *remove_symlinks_to = NULL;
 
-                r = install_context_mark_for_removal(scope, minus, paths, &remove_symlinks_to, config_path);
+                r = install_context_mark_for_removal(scope, minus, paths, &remove_symlinks_to, config_path, changes, n_changes);
                 if (r < 0)
                         return r;
 
-                r = remove_marked_symlinks(remove_symlinks_to, config_path, paths, changes, n_changes);
+                r = remove_marked_symlinks(remove_symlinks_to, config_path, paths, false, changes, n_changes);
         } else
                 r = 0;
 
@@ -2685,25 +2847,34 @@ static int preset_prepare_one(
                 InstallContext *plus,
                 InstallContext *minus,
                 LookupPaths *paths,
-                UnitFilePresetMode mode,
                 const char *name,
                 Presets presets,
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
+        _cleanup_(install_context_done) InstallContext tmp = {};
         UnitFileInstallInfo *i;
         int r;
 
-        if (install_info_find(plus, name) ||
-            install_info_find(minus, name))
+        if (install_info_find(plus, name) || install_info_find(minus, name))
+                return 0;
+
+        r = install_info_discover(scope, &tmp, paths, name, SEARCH_FOLLOW_CONFIG_SYMLINKS,
+                                  &i, changes, n_changes);
+        if (r < 0)
+                return r;
+        if (!streq(name, i->name)) {
+                log_debug("Skipping %s because is an alias for %s", name, i->name);
                 return 0;
+        }
 
         r = query_presets(name, presets);
         if (r < 0)
                 return r;
 
         if (r > 0) {
-                r = install_info_discover(scope, plus, paths, name, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
+                r = install_info_discover(scope, plus, paths, name, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS,
+                                          &i, changes, n_changes);
                 if (r < 0)
                         return r;
 
@@ -2711,18 +2882,18 @@ static int preset_prepare_one(
                 if (r < 0)
                         return r;
         } else
-                r = install_info_discover(scope, minus, paths, name, SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
+                r = install_info_discover(scope, minus, paths, name, SEARCH_FOLLOW_CONFIG_SYMLINKS,
+                                          &i, changes, n_changes);
 
         return r;
 }
 
 int unit_file_preset(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
                 UnitFilePresetMode mode,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
@@ -2741,27 +2912,28 @@ int unit_file_preset(
         if (r < 0)
                 return r;
 
-        config_path = runtime ? paths.runtime_config : paths.persistent_config;
+        config_path = (flags & UNIT_FILE_RUNTIME) ? paths.runtime_config : paths.persistent_config;
+        if (!config_path)
+                return -ENXIO;
 
         r = read_presets(scope, root_dir, &presets);
         if (r < 0)
                 return r;
 
         STRV_FOREACH(i, files) {
-                r = preset_prepare_one(scope, &plus, &minus, &paths, mode, *i, presets, changes, n_changes);
+                r = preset_prepare_one(scope, &plus, &minus, &paths, *i, presets, changes, n_changes);
                 if (r < 0)
                         return r;
         }
 
-        return execute_preset(scope, &plus, &minus, &paths, config_path, files, mode, force, changes, n_changes);
+        return execute_preset(scope, &plus, &minus, &paths, config_path, files, mode, !!(flags & UNIT_FILE_FORCE), changes, n_changes);
 }
 
 int unit_file_preset_all(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 UnitFilePresetMode mode,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
@@ -2780,7 +2952,9 @@ int unit_file_preset_all(
         if (r < 0)
                 return r;
 
-        config_path = runtime ? paths.runtime_config : paths.persistent_config;
+        config_path = (flags & UNIT_FILE_RUNTIME) ? paths.runtime_config : paths.persistent_config;
+        if (!config_path)
+                return -ENXIO;
 
         r = read_presets(scope, root_dir, &presets);
         if (r < 0)
@@ -2809,7 +2983,7 @@ int unit_file_preset_all(
                                 continue;
 
                         /* we don't pass changes[] in, because we want to handle errors on our own */
-                        r = preset_prepare_one(scope, &plus, &minus, &paths, mode, de->d_name, presets, NULL, 0);
+                        r = preset_prepare_one(scope, &plus, &minus, &paths, de->d_name, presets, NULL, 0);
                         if (r == -ERFKILL)
                                 r = unit_file_changes_add(changes, n_changes,
                                                           UNIT_FILE_IS_MASKED, de->d_name, NULL);
@@ -2821,7 +2995,7 @@ int unit_file_preset_all(
                 }
         }
 
-        return execute_preset(scope, &plus, &minus, &paths, config_path, NULL, mode, force, changes, n_changes);
+        return execute_preset(scope, &plus, &minus, &paths, config_path, NULL, mode, !!(flags & UNIT_FILE_FORCE), changes, n_changes);
 }
 
 static void unit_file_list_free_one(UnitFileList *f) {
@@ -2871,7 +3045,7 @@ int unit_file_get_list(
                         if (errno == ENOENT)
                                 continue;
                         if (IN_SET(errno, ENOTDIR, EACCES)) {
-                                log_debug("Failed to open \"%s\": %m", *i);
+                                log_debug_errno(errno, "Failed to open \"%s\": %m", *i);
                                 continue;
                         }
 
index c6aa4f6..7a5859e 100644 (file)
@@ -23,6 +23,7 @@ typedef enum UnitFileScope UnitFileScope;
 typedef enum UnitFileState UnitFileState;
 typedef enum UnitFilePresetMode UnitFilePresetMode;
 typedef enum UnitFileChangeType UnitFileChangeType;
+typedef enum UnitFileFlags UnitFileFlags;
 typedef enum UnitFileType UnitFileType;
 typedef struct UnitFileChange UnitFileChange;
 typedef struct UnitFileList UnitFileList;
@@ -78,6 +79,12 @@ enum UnitFileChangeType {
         _UNIT_FILE_CHANGE_INVALID = INT_MIN
 };
 
+enum UnitFileFlags {
+        UNIT_FILE_RUNTIME = 1,
+        UNIT_FILE_FORCE = 1 << 1,
+        UNIT_FILE_DRY_RUN = 1 << 2,
+};
+
 /* type can either one of the UnitFileChangeTypes listed above, or a negative error.
  * If source is specified, it should be the contents of the path symlink.
  * In case of an error, source should be the existing symlink contents or NULL
@@ -119,10 +126,10 @@ struct UnitFileInstallInfo {
         char **also;
 
         char *default_instance;
+        char *symlink_target;
 
         UnitFileType type;
-
-        char *symlink_target;
+        bool auxiliary;
 };
 
 static inline bool UNIT_FILE_INSTALL_INFO_HAS_RULES(UnitFileInstallInfo *i) {
@@ -144,65 +151,59 @@ bool unit_type_may_template(UnitType type) _const_;
 
 int unit_file_enable(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes);
 int unit_file_disable(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
                 UnitFileChange **changes,
                 unsigned *n_changes);
 int unit_file_reenable(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes);
 int unit_file_preset(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
                 UnitFilePresetMode mode,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes);
 int unit_file_preset_all(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 UnitFilePresetMode mode,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes);
 int unit_file_mask(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes);
 int unit_file_unmask(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
                 UnitFileChange **changes,
                 unsigned *n_changes);
 int unit_file_link(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes);
 int unit_file_revert(
@@ -213,9 +214,9 @@ int unit_file_revert(
                 unsigned *n_changes);
 int unit_file_set_default(
                 UnitFileScope scope,
+                UnitFileFlags flags,
                 const char *root_dir,
                 const char *file,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes);
 int unit_file_get_default(
@@ -224,12 +225,11 @@ int unit_file_get_default(
                 char **name);
 int unit_file_add_dependency(
                 UnitFileScope scope,
-                bool runtime,
+                UnitFileFlags flags,
                 const char *root_dir,
                 char **files,
                 const char *target,
                 UnitDependency dep,
-                bool force,
                 UnitFileChange **changes,
                 unsigned *n_changes);
 
diff --git a/src/shared/journal-util.c b/src/shared/journal-util.c
new file mode 100644 (file)
index 0000000..8479221
--- /dev/null
@@ -0,0 +1,151 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2013 Zbigniew Jędrzejewski-Szmek
+  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 "acl-util.h"
+#include "fs-util.h"
+#include "hashmap.h"
+#include "journal-internal.h"
+#include "journal-util.h"
+#include "log.h"
+#include "strv.h"
+#include "user-util.h"
+
+static int access_check_var_log_journal(sd_journal *j) {
+#ifdef HAVE_ACL
+        _cleanup_strv_free_ char **g = NULL;
+        const char* dir;
+#endif
+        int r;
+
+        assert(j);
+
+        /* If we are root, we should have access, don't warn. */
+        if (getuid() == 0)
+                return 0;
+
+        /* If we are in the 'systemd-journal' group, we should have
+         * access too. */
+        r = in_group("systemd-journal");
+        if (r < 0)
+                return log_error_errno(r, "Failed to check if we are in the 'systemd-journal' group: %m");
+        if (r > 0)
+                return 0;
+
+#ifdef HAVE_ACL
+        if (laccess("/run/log/journal", F_OK) >= 0)
+                dir = "/run/log/journal";
+        else
+                dir = "/var/log/journal";
+
+        /* If we are in any of the groups listed in the journal ACLs,
+         * then all is good, too. Let's enumerate all groups from the
+         * default ACL of the directory, which generally should allow
+         * access to most journal files too. */
+        r = acl_search_groups(dir, &g);
+        if (r < 0)
+                return log_error_errno(r, "Failed to search journal ACL: %m");
+        if (r > 0)
+                return 0;
+
+        /* Print a pretty list, if there were ACLs set. */
+        if (!strv_isempty(g)) {
+                _cleanup_free_ char *s = NULL;
+
+                /* Thre are groups in the ACL, let's list them */
+                r = strv_extend(&g, "systemd-journal");
+                if (r < 0)
+                        return log_oom();
+
+                strv_sort(g);
+                strv_uniq(g);
+
+                s = strv_join(g, "', '");
+                if (!s)
+                        return log_oom();
+
+                log_notice("Hint: You are currently not seeing messages from other users and the system.\n"
+                           "      Users in groups '%s' can see all messages.\n"
+                           "      Pass -q to turn off this notice.", s);
+                return 1;
+        }
+#endif
+
+        /* If no ACLs were found, print a short version of the message. */
+        log_notice("Hint: You are currently not seeing messages from other users and the system.\n"
+                   "      Users in the 'systemd-journal' group can see all messages. Pass -q to\n"
+                   "      turn off this notice.");
+
+        return 1;
+}
+
+int journal_access_check_and_warn(sd_journal *j, bool quiet) {
+        Iterator it;
+        void *code;
+        char *path;
+        int r = 0;
+
+        assert(j);
+
+        if (hashmap_isempty(j->errors)) {
+                if (ordered_hashmap_isempty(j->files) && !quiet)
+                        log_notice("No journal files were found.");
+
+                return 0;
+        }
+
+        if (hashmap_contains(j->errors, INT_TO_PTR(-EACCES))) {
+                if (!quiet)
+                        (void) access_check_var_log_journal(j);
+
+                if (ordered_hashmap_isempty(j->files))
+                        r = log_error_errno(EACCES, "No journal files were opened due to insufficient permissions.");
+        }
+
+        HASHMAP_FOREACH_KEY(path, code, j->errors, it) {
+                int err;
+
+                err = abs(PTR_TO_INT(code));
+
+                switch (err) {
+                case EACCES:
+                        continue;
+
+                case ENODATA:
+                        log_warning_errno(err, "Journal file %s is truncated, ignoring file.", path);
+                        break;
+
+                case EPROTONOSUPPORT:
+                        log_warning_errno(err, "Journal file %1$s uses an unsupported feature, ignoring file.\n"
+                                               "Use SYSTEMD_LOG_LEVEL=debug journalctl --file=%1$s to see the details.",
+                                               path);
+                        break;
+
+                case EBADMSG:
+                        log_warning_errno(err, "Journal file %s corrupted, ignoring file.", path);
+                        break;
+
+                default:
+                        log_warning_errno(err, "An error was encountered while opening journal file or directory %s, ignoring file: %m", path);
+                        break;
+                }
+        }
+
+        return r;
+}
diff --git a/src/shared/journal-util.h b/src/shared/journal-util.h
new file mode 100644 (file)
index 0000000..499e6c6
--- /dev/null
@@ -0,0 +1,25 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2013 Zbigniew Jędrzejewski-Szmek
+  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 <stdbool.h>
+
+#include "sd-journal.h"
+
+int journal_access_check_and_warn(sd_journal *j, bool quiet);
diff --git a/src/shared/linux-3.13/dm-ioctl.h b/src/shared/linux-3.13/dm-ioctl.h
new file mode 100644 (file)
index 0000000..c8a4302
--- /dev/null
@@ -0,0 +1,355 @@
+/*
+ * Copyright (C) 2001 - 2003 Sistina Software (UK) Limited.
+ * Copyright (C) 2004 - 2009 Red Hat, Inc. All rights reserved.
+ *
+ * This file is released under the LGPL.
+ */
+
+#ifndef _LINUX_DM_IOCTL_V4_H
+#define _LINUX_DM_IOCTL_V4_H
+
+#include <linux/types.h>
+
+#define DM_DIR "mapper"                /* Slashes not supported */
+#define DM_CONTROL_NODE "control"
+#define DM_MAX_TYPE_NAME 16
+#define DM_NAME_LEN 128
+#define DM_UUID_LEN 129
+
+/*
+ * A traditional ioctl interface for the device mapper.
+ *
+ * Each device can have two tables associated with it, an
+ * 'active' table which is the one currently used by io passing
+ * through the device, and an 'inactive' one which is a table
+ * that is being prepared as a replacement for the 'active' one.
+ *
+ * DM_VERSION:
+ * Just get the version information for the ioctl interface.
+ *
+ * DM_REMOVE_ALL:
+ * Remove all dm devices, destroy all tables.  Only really used
+ * for debug.
+ *
+ * DM_LIST_DEVICES:
+ * Get a list of all the dm device names.
+ *
+ * DM_DEV_CREATE:
+ * Create a new device, neither the 'active' or 'inactive' table
+ * slots will be filled.  The device will be in suspended state
+ * after creation, however any io to the device will get errored
+ * since it will be out-of-bounds.
+ *
+ * DM_DEV_REMOVE:
+ * Remove a device, destroy any tables.
+ *
+ * DM_DEV_RENAME:
+ * Rename a device or set its uuid if none was previously supplied.
+ *
+ * DM_SUSPEND:
+ * This performs both suspend and resume, depending which flag is
+ * passed in.
+ * Suspend: This command will not return until all pending io to
+ * the device has completed.  Further io will be deferred until
+ * the device is resumed.
+ * Resume: It is no longer an error to issue this command on an
+ * unsuspended device.  If a table is present in the 'inactive'
+ * slot, it will be moved to the active slot, then the old table
+ * from the active slot will be _destroyed_.  Finally the device
+ * is resumed.
+ *
+ * DM_DEV_STATUS:
+ * Retrieves the status for the table in the 'active' slot.
+ *
+ * DM_DEV_WAIT:
+ * Wait for a significant event to occur to the device.  This
+ * could either be caused by an event triggered by one of the
+ * targets of the table in the 'active' slot, or a table change.
+ *
+ * DM_TABLE_LOAD:
+ * Load a table into the 'inactive' slot for the device.  The
+ * device does _not_ need to be suspended prior to this command.
+ *
+ * DM_TABLE_CLEAR:
+ * Destroy any table in the 'inactive' slot (ie. abort).
+ *
+ * DM_TABLE_DEPS:
+ * Return a set of device dependencies for the 'active' table.
+ *
+ * DM_TABLE_STATUS:
+ * Return the targets status for the 'active' table.
+ *
+ * DM_TARGET_MSG:
+ * Pass a message string to the target at a specific offset of a device.
+ *
+ * DM_DEV_SET_GEOMETRY:
+ * Set the geometry of a device by passing in a string in this format:
+ *
+ * "cylinders heads sectors_per_track start_sector"
+ *
+ * Beware that CHS geometry is nearly obsolete and only provided
+ * for compatibility with dm devices that can be booted by a PC
+ * BIOS.  See struct hd_geometry for range limits.  Also note that
+ * the geometry is erased if the device size changes.
+ */
+
+/*
+ * All ioctl arguments consist of a single chunk of memory, with
+ * this structure at the start.  If a uuid is specified any
+ * lookup (eg. for a DM_INFO) will be done on that, *not* the
+ * name.
+ */
+struct dm_ioctl {
+       /*
+        * The version number is made up of three parts:
+        * major - no backward or forward compatibility,
+        * minor - only backwards compatible,
+        * patch - both backwards and forwards compatible.
+        *
+        * All clients of the ioctl interface should fill in the
+        * version number of the interface that they were
+        * compiled with.
+        *
+        * All recognised ioctl commands (ie. those that don't
+        * return -ENOTTY) fill out this field, even if the
+        * command failed.
+        */
+       __u32 version[3];       /* in/out */
+       __u32 data_size;        /* total size of data passed in
+                                * including this struct */
+
+       __u32 data_start;       /* offset to start of data
+                                * relative to start of this struct */
+
+       __u32 target_count;     /* in/out */
+       __s32 open_count;       /* out */
+       __u32 flags;            /* in/out */
+
+       /*
+        * event_nr holds either the event number (input and output) or the
+        * udev cookie value (input only).
+        * The DM_DEV_WAIT ioctl takes an event number as input.
+        * The DM_SUSPEND, DM_DEV_REMOVE and DM_DEV_RENAME ioctls
+        * use the field as a cookie to return in the DM_COOKIE
+        * variable with the uevents they issue.
+        * For output, the ioctls return the event number, not the cookie.
+        */
+       __u32 event_nr;         /* in/out */
+       __u32 padding;
+
+       __u64 dev;              /* in/out */
+
+       char name[DM_NAME_LEN]; /* device name */
+       char uuid[DM_UUID_LEN]; /* unique identifier for
+                                * the block device */
+       char data[7];           /* padding or data */
+};
+
+/*
+ * Used to specify tables.  These structures appear after the
+ * dm_ioctl.
+ */
+struct dm_target_spec {
+       __u64 sector_start;
+       __u64 length;
+       __s32 status;           /* used when reading from kernel only */
+
+       /*
+        * Location of the next dm_target_spec.
+        * - When specifying targets on a DM_TABLE_LOAD command, this value is
+        *   the number of bytes from the start of the "current" dm_target_spec
+        *   to the start of the "next" dm_target_spec.
+        * - When retrieving targets on a DM_TABLE_STATUS command, this value
+        *   is the number of bytes from the start of the first dm_target_spec
+        *   (that follows the dm_ioctl struct) to the start of the "next"
+        *   dm_target_spec.
+        */
+       __u32 next;
+
+       char target_type[DM_MAX_TYPE_NAME];
+
+       /*
+        * Parameter string starts immediately after this object.
+        * Be careful to add padding after string to ensure correct
+        * alignment of subsequent dm_target_spec.
+        */
+};
+
+/*
+ * Used to retrieve the target dependencies.
+ */
+struct dm_target_deps {
+       __u32 count;    /* Array size */
+       __u32 padding;  /* unused */
+       __u64 dev[0];   /* out */
+};
+
+/*
+ * Used to get a list of all dm devices.
+ */
+struct dm_name_list {
+       __u64 dev;
+       __u32 next;             /* offset to the next record from
+                                  the _start_ of this */
+       char name[0];
+};
+
+/*
+ * Used to retrieve the target versions
+ */
+struct dm_target_versions {
+        __u32 next;
+        __u32 version[3];
+
+        char name[0];
+};
+
+/*
+ * Used to pass message to a target
+ */
+struct dm_target_msg {
+       __u64 sector;   /* Device sector */
+
+       char message[0];
+};
+
+/*
+ * If you change this make sure you make the corresponding change
+ * to dm-ioctl.c:lookup_ioctl()
+ */
+enum {
+       /* Top level cmds */
+       DM_VERSION_CMD = 0,
+       DM_REMOVE_ALL_CMD,
+       DM_LIST_DEVICES_CMD,
+
+       /* device level cmds */
+       DM_DEV_CREATE_CMD,
+       DM_DEV_REMOVE_CMD,
+       DM_DEV_RENAME_CMD,
+       DM_DEV_SUSPEND_CMD,
+       DM_DEV_STATUS_CMD,
+       DM_DEV_WAIT_CMD,
+
+       /* Table level cmds */
+       DM_TABLE_LOAD_CMD,
+       DM_TABLE_CLEAR_CMD,
+       DM_TABLE_DEPS_CMD,
+       DM_TABLE_STATUS_CMD,
+
+       /* Added later */
+       DM_LIST_VERSIONS_CMD,
+       DM_TARGET_MSG_CMD,
+       DM_DEV_SET_GEOMETRY_CMD
+};
+
+#define DM_IOCTL 0xfd
+
+#define DM_VERSION       _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl)
+#define DM_REMOVE_ALL    _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl)
+#define DM_LIST_DEVICES  _IOWR(DM_IOCTL, DM_LIST_DEVICES_CMD, struct dm_ioctl)
+
+#define DM_DEV_CREATE    _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl)
+#define DM_DEV_REMOVE    _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl)
+#define DM_DEV_RENAME    _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl)
+#define DM_DEV_SUSPEND   _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl)
+#define DM_DEV_STATUS    _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl)
+#define DM_DEV_WAIT      _IOWR(DM_IOCTL, DM_DEV_WAIT_CMD, struct dm_ioctl)
+
+#define DM_TABLE_LOAD    _IOWR(DM_IOCTL, DM_TABLE_LOAD_CMD, struct dm_ioctl)
+#define DM_TABLE_CLEAR   _IOWR(DM_IOCTL, DM_TABLE_CLEAR_CMD, struct dm_ioctl)
+#define DM_TABLE_DEPS    _IOWR(DM_IOCTL, DM_TABLE_DEPS_CMD, struct dm_ioctl)
+#define DM_TABLE_STATUS  _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, struct dm_ioctl)
+
+#define DM_LIST_VERSIONS _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, struct dm_ioctl)
+
+#define DM_TARGET_MSG   _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, struct dm_ioctl)
+#define DM_DEV_SET_GEOMETRY    _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl)
+
+#define DM_VERSION_MAJOR       4
+#define DM_VERSION_MINOR       27
+#define DM_VERSION_PATCHLEVEL  0
+#define DM_VERSION_EXTRA       "-ioctl (2013-10-30)"
+
+/* Status bits */
+#define DM_READONLY_FLAG       (1 << 0) /* In/Out */
+#define DM_SUSPEND_FLAG                (1 << 1) /* In/Out */
+#define DM_PERSISTENT_DEV_FLAG (1 << 3) /* In */
+
+/*
+ * Flag passed into ioctl STATUS command to get table information
+ * rather than current status.
+ */
+#define DM_STATUS_TABLE_FLAG   (1 << 4) /* In */
+
+/*
+ * Flags that indicate whether a table is present in either of
+ * the two table slots that a device has.
+ */
+#define DM_ACTIVE_PRESENT_FLAG   (1 << 5) /* Out */
+#define DM_INACTIVE_PRESENT_FLAG (1 << 6) /* Out */
+
+/*
+ * Indicates that the buffer passed in wasn't big enough for the
+ * results.
+ */
+#define DM_BUFFER_FULL_FLAG    (1 << 8) /* Out */
+
+/*
+ * This flag is now ignored.
+ */
+#define DM_SKIP_BDGET_FLAG     (1 << 9) /* In */
+
+/*
+ * Set this to avoid attempting to freeze any filesystem when suspending.
+ */
+#define DM_SKIP_LOCKFS_FLAG    (1 << 10) /* In */
+
+/*
+ * Set this to suspend without flushing queued ios.
+ * Also disables flushing uncommitted changes in the thin target before
+ * generating statistics for DM_TABLE_STATUS and DM_DEV_WAIT.
+ */
+#define DM_NOFLUSH_FLAG                (1 << 11) /* In */
+
+/*
+ * If set, any table information returned will relate to the inactive
+ * table instead of the live one.  Always check DM_INACTIVE_PRESENT_FLAG
+ * is set before using the data returned.
+ */
+#define DM_QUERY_INACTIVE_TABLE_FLAG   (1 << 12) /* In */
+
+/*
+ * If set, a uevent was generated for which the caller may need to wait.
+ */
+#define DM_UEVENT_GENERATED_FLAG       (1 << 13) /* Out */
+
+/*
+ * If set, rename changes the uuid not the name.  Only permitted
+ * if no uuid was previously supplied: an existing uuid cannot be changed.
+ */
+#define DM_UUID_FLAG                   (1 << 14) /* In */
+
+/*
+ * If set, all buffers are wiped after use. Use when sending
+ * or requesting sensitive data such as an encryption key.
+ */
+#define DM_SECURE_DATA_FLAG            (1 << 15) /* In */
+
+/*
+ * If set, a message generated output data.
+ */
+#define DM_DATA_OUT_FLAG               (1 << 16) /* Out */
+
+/*
+ * If set with DM_DEV_REMOVE or DM_REMOVE_ALL this indicates that if
+ * the device cannot be removed immediately because it is still in use
+ * it should instead be scheduled for removal when it gets closed.
+ *
+ * On return from DM_DEV_REMOVE, DM_DEV_STATUS or other ioctls, this
+ * flag indicates that the device is scheduled to be removed when it
+ * gets closed.
+ */
+#define DM_DEFERRED_REMOVE             (1 << 17) /* In/Out */
+
+#endif                         /* _LINUX_DM_IOCTL_H */
index d04728f..02ae426 100644 (file)
@@ -33,7 +33,7 @@
 
 #include "alloc-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "hashmap.h"
 #include "hostname-util.h"
 #include "io-util.h"
@@ -45,6 +45,7 @@
 #include "parse-util.h"
 #include "process-util.h"
 #include "sparse-endian.h"
+#include "stdio-util.h"
 #include "string-table.h"
 #include "string-util.h"
 #include "terminal-util.h"
@@ -206,6 +207,122 @@ static bool print_multiline(FILE *f, unsigned prefix, unsigned n_columns, Output
         return ellipsized;
 }
 
+static int output_timestamp_monotonic(FILE *f, sd_journal *j, const char *monotonic) {
+        sd_id128_t boot_id;
+        uint64_t t;
+        int r;
+
+        assert(f);
+        assert(j);
+
+        r = -ENXIO;
+        if (monotonic)
+                r = safe_atou64(monotonic, &t);
+        if (r < 0)
+                r = sd_journal_get_monotonic_usec(j, &t, &boot_id);
+        if (r < 0)
+                return log_error_errno(r, "Failed to get monotonic timestamp: %m");
+
+        fprintf(f, "[%5"PRI_USEC".%06"PRI_USEC"]", t / USEC_PER_SEC, t % USEC_PER_SEC);
+        return 1 + 5 + 1 + 6 + 1;
+}
+
+static int output_timestamp_realtime(FILE *f, sd_journal *j, OutputMode mode, OutputFlags flags, const char *realtime) {
+        char buf[MAX(FORMAT_TIMESTAMP_MAX, 64)];
+        struct tm *(*gettime_r)(const time_t *, struct tm *);
+        struct tm tm;
+        uint64_t x;
+        time_t t;
+        int r;
+
+        assert(f);
+        assert(j);
+
+        r = -ENXIO;
+        if (realtime)
+                r = safe_atou64(realtime, &x);
+        if (r < 0)
+                r = sd_journal_get_realtime_usec(j, &x);
+        if (r < 0)
+                return log_error_errno(r, "Failed to get realtime timestamp: %m");
+
+        if (x > USEC_TIMESTAMP_FORMATTABLE_MAX) {
+                log_error("Timestamp cannot be printed");
+                return -EINVAL;
+        }
+
+        if (mode == OUTPUT_SHORT_FULL) {
+                const char *k;
+
+                if (flags & OUTPUT_UTC)
+                        k = format_timestamp_utc(buf, sizeof(buf), x);
+                else
+                        k = format_timestamp(buf, sizeof(buf), x);
+                if (!k) {
+                        log_error("Failed to format timestamp.");
+                        return -EINVAL;
+                }
+
+        } else {
+                char usec[7];
+
+                gettime_r = (flags & OUTPUT_UTC) ? gmtime_r : localtime_r;
+                t = (time_t) (x / USEC_PER_SEC);
+
+                switch (mode) {
+
+                case OUTPUT_SHORT_UNIX:
+                        xsprintf(buf, "%10"PRI_TIME".%06"PRIu64, t, x % USEC_PER_SEC);
+                        break;
+
+                case OUTPUT_SHORT_ISO:
+                        if (strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S%z", gettime_r(&t, &tm)) <= 0) {
+                                log_error("Failed to format ISO time");
+                                return -EINVAL;
+                        }
+                        break;
+
+                case OUTPUT_SHORT_ISO_PRECISE:
+                        /* No usec in strftime, so we leave space and copy over */
+                        if (strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S.xxxxxx%z", gettime_r(&t, &tm)) <= 0) {
+                                log_error("Failed to format ISO-precise time");
+                                return -EINVAL;
+                        }
+                        xsprintf(usec, "%06"PRI_USEC, x % USEC_PER_SEC);
+                        memcpy(buf + 20, usec, 6);
+                        break;
+
+                case OUTPUT_SHORT:
+                case OUTPUT_SHORT_PRECISE:
+
+                        if (strftime(buf, sizeof(buf), "%b %d %H:%M:%S", gettime_r(&t, &tm)) <= 0) {
+                                log_error("Failed to format syslog time");
+                                return -EINVAL;
+                        }
+
+                        if (mode == OUTPUT_SHORT_PRECISE) {
+                                size_t k;
+
+                                assert(sizeof(buf) > strlen(buf));
+                                k = sizeof(buf) - strlen(buf);
+
+                                r = snprintf(buf + strlen(buf), k, ".%06"PRIu64, x % USEC_PER_SEC);
+                                if (r <= 0 || (size_t) r >= k) { /* too long? */
+                                        log_error("Failed to format precise time");
+                                        return -EINVAL;
+                                }
+                        }
+                        break;
+
+                default:
+                        assert_not_reached("Unknown time format");
+                }
+        }
+
+        fputs(buf, f);
+        return (int) strlen(buf);
+}
+
 static int output_short(
                 FILE *f,
                 sd_journal *j,
@@ -305,80 +422,17 @@ static int output_short(
         if (priority_len == 1 && *priority >= '0' && *priority <= '7')
                 p = *priority - '0';
 
-        if (mode == OUTPUT_SHORT_MONOTONIC) {
-                uint64_t t;
-                sd_id128_t boot_id;
-
-                r = -ENOENT;
-
-                if (monotonic)
-                        r = safe_atou64(monotonic, &t);
-
-                if (r < 0)
-                        r = sd_journal_get_monotonic_usec(j, &t, &boot_id);
-
-                if (r < 0)
-                        return log_error_errno(r, "Failed to get monotonic timestamp: %m");
-
-                fprintf(f, "[%5llu.%06llu]",
-                        (unsigned long long) (t / USEC_PER_SEC),
-                        (unsigned long long) (t % USEC_PER_SEC));
-
-                n += 1 + 5 + 1 + 6 + 1;
-
-        } else {
-                char buf[64];
-                uint64_t x;
-                time_t t;
-                struct tm tm;
-                struct tm *(*gettime_r)(const time_t *, struct tm *);
-
-                r = -ENOENT;
-                gettime_r = (flags & OUTPUT_UTC) ? gmtime_r : localtime_r;
-
-                if (realtime)
-                        r = safe_atou64(realtime, &x);
-
-                if (r < 0)
-                        r = sd_journal_get_realtime_usec(j, &x);
-
-                if (r < 0)
-                        return log_error_errno(r, "Failed to get realtime timestamp: %m");
-
-                t = (time_t) (x / USEC_PER_SEC);
-
-                switch (mode) {
-
-                case OUTPUT_SHORT_UNIX:
-                        r = snprintf(buf, sizeof(buf), "%10llu.%06llu", (unsigned long long) t, (unsigned long long) (x % USEC_PER_SEC));
-                        break;
-
-                case OUTPUT_SHORT_ISO:
-                        r = strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S%z", gettime_r(&t, &tm));
-                        break;
-
-                case OUTPUT_SHORT_PRECISE:
-                        r = strftime(buf, sizeof(buf), "%b %d %H:%M:%S", gettime_r(&t, &tm));
-                        if (r > 0)
-                                snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), ".%06llu", (unsigned long long) (x % USEC_PER_SEC));
-                        break;
-
-                default:
-                        r = strftime(buf, sizeof(buf), "%b %d %H:%M:%S", gettime_r(&t, &tm));
-                }
-
-                if (r <= 0) {
-                        log_error("Failed to format time.");
-                        return -EINVAL;
-                }
-
-                fputs(buf, f);
-                n += strlen(buf);
-        }
+        if (mode == OUTPUT_SHORT_MONOTONIC)
+                r = output_timestamp_monotonic(f, j, monotonic);
+        else
+                r = output_timestamp_realtime(f, j, mode, flags, realtime);
+        if (r < 0)
+                return r;
+        n += r;
 
-        if (hostname && (flags & OUTPUT_NO_HOSTNAME)) {
+        if (flags & OUTPUT_NO_HOSTNAME) {
                 /* Suppress display of the hostname if this is requested. */
-                hostname = NULL;
+                hostname = mfree(hostname);
                 hostname_len = 0;
         }
 
@@ -431,6 +485,7 @@ static int output_verbose(
         _cleanup_free_ char *cursor = NULL;
         uint64_t realtime = 0;
         char ts[FORMAT_TIMESTAMP_MAX + 7];
+        const char *timestamp;
         int r;
 
         assert(f);
@@ -466,10 +521,10 @@ static int output_verbose(
         if (r < 0)
                 return log_error_errno(r, "Failed to get cursor: %m");
 
+        timestamp = flags & OUTPUT_UTC ? format_timestamp_us_utc(ts, sizeof ts, realtime)
+                                       : format_timestamp_us(ts, sizeof ts, realtime);
         fprintf(f, "%s [%s]\n",
-                flags & OUTPUT_UTC ?
-                format_timestamp_us_utc(ts, sizeof(ts), realtime) :
-                format_timestamp_us(ts, sizeof(ts), realtime),
+                timestamp ?: "(no timestamp)",
                 cursor);
 
         JOURNAL_FOREACH_DATA_RETVAL(j, data, length, r) {
@@ -907,9 +962,11 @@ static int (*output_funcs[_OUTPUT_MODE_MAX])(
 
         [OUTPUT_SHORT] = output_short,
         [OUTPUT_SHORT_ISO] = output_short,
+        [OUTPUT_SHORT_ISO_PRECISE] = output_short,
         [OUTPUT_SHORT_PRECISE] = output_short,
         [OUTPUT_SHORT_MONOTONIC] = output_short,
         [OUTPUT_SHORT_UNIX] = output_short,
+        [OUTPUT_SHORT_FULL] = output_short,
         [OUTPUT_VERBOSE] = output_verbose,
         [OUTPUT_EXPORT] = output_export,
         [OUTPUT_JSON] = output_json,
@@ -934,7 +991,6 @@ int output_journal(
                 n_columns = columns();
 
         ret = output_funcs[mode](f, j, mode, n_columns, flags);
-        fflush(stdout);
 
         if (ellipsized && ret > 0)
                 *ellipsized = true;
diff --git a/src/shared/loop-util.c b/src/shared/loop-util.c
new file mode 100644 (file)
index 0000000..047e213
--- /dev/null
@@ -0,0 +1,166 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <fcntl.h>
+#include <linux/loop.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+
+#include "alloc-util.h"
+#include "fd-util.h"
+#include "loop-util.h"
+
+int loop_device_make(int fd, int open_flags, LoopDevice **ret) {
+        const struct loop_info64 info = {
+                .lo_flags = LO_FLAGS_AUTOCLEAR|LO_FLAGS_PARTSCAN|(open_flags == O_RDONLY ? LO_FLAGS_READ_ONLY : 0),
+        };
+
+        _cleanup_close_ int control = -1, loop = -1;
+        _cleanup_free_ char *loopdev = NULL;
+        struct stat st;
+        LoopDevice *d;
+        int nr;
+
+        assert(fd >= 0);
+        assert(ret);
+        assert(IN_SET(open_flags, O_RDWR, O_RDONLY));
+
+        if (fstat(fd, &st) < 0)
+                return -errno;
+
+        if (S_ISBLK(st.st_mode)) {
+                int copy;
+
+                /* If this is already a block device, store a copy of the fd as it is */
+
+                copy = fcntl(fd, F_DUPFD_CLOEXEC, 3);
+                if (copy < 0)
+                        return -errno;
+
+                d = new0(LoopDevice, 1);
+                if (!d)
+                        return -ENOMEM;
+
+                *d = (LoopDevice) {
+                        .fd = copy,
+                        .nr = -1,
+                };
+
+                *ret = d;
+
+                return 0;
+        }
+
+        if (!S_ISREG(st.st_mode))
+                return -EINVAL;
+
+        control = open("/dev/loop-control", O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK);
+        if (control < 0)
+                return -errno;
+
+        nr = ioctl(control, LOOP_CTL_GET_FREE);
+        if (nr < 0)
+                return -errno;
+
+        if (asprintf(&loopdev, "/dev/loop%i", nr) < 0)
+                return -ENOMEM;
+
+        loop = open(loopdev, O_CLOEXEC|O_NONBLOCK|O_NOCTTY|open_flags);
+        if (loop < 0)
+                return -errno;
+
+        if (ioctl(loop, LOOP_SET_FD, fd) < 0)
+                return -errno;
+
+        if (ioctl(loop, LOOP_SET_STATUS64, &info) < 0)
+                return -errno;
+
+        d = new(LoopDevice, 1);
+        if (!d)
+                return -ENOMEM;
+
+        *d = (LoopDevice) {
+                .fd = loop,
+                .node = loopdev,
+                .nr = nr,
+        };
+
+        loop = -1;
+        loopdev = NULL;
+
+        *ret = d;
+
+        return (*ret)->fd;
+}
+
+int loop_device_make_by_path(const char *path, int open_flags, LoopDevice **ret) {
+        _cleanup_close_ int fd = -1;
+
+        assert(path);
+        assert(ret);
+        assert(IN_SET(open_flags, O_RDWR, O_RDONLY));
+
+        fd = open(path, O_CLOEXEC|O_NONBLOCK|O_NOCTTY|open_flags);
+        if (fd < 0)
+                return -errno;
+
+        return loop_device_make(fd, open_flags, ret);
+}
+
+LoopDevice* loop_device_unref(LoopDevice *d) {
+        if (!d)
+                return NULL;
+
+        if (d->fd >= 0) {
+
+                if (d->nr >= 0 && !d->relinquished) {
+                        if (ioctl(d->fd, LOOP_CLR_FD) < 0)
+                                log_debug_errno(errno, "Failed to clear loop device: %m");
+
+                }
+
+                safe_close(d->fd);
+        }
+
+        if (d->nr >= 0 && !d->relinquished) {
+                _cleanup_close_ int control = -1;
+
+                control = open("/dev/loop-control", O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK);
+                if (control < 0)
+                        log_debug_errno(errno, "Failed to open loop control device: %m");
+                else {
+                        if (ioctl(control, LOOP_CTL_REMOVE, d->nr) < 0)
+                                log_debug_errno(errno, "Failed to remove loop device: %m");
+                }
+        }
+
+        free(d->node);
+        free(d);
+
+        return NULL;
+}
+
+void loop_device_relinquish(LoopDevice *d) {
+        assert(d);
+
+        /* Don't attempt to clean up the loop device anymore from this point on. Leave the clean-ing up to the kernel
+         * itself, using the loop device "auto-clear" logic we already turned on when creating the device. */
+
+        d->relinquished = true;
+}
diff --git a/src/shared/loop-util.h b/src/shared/loop-util.h
new file mode 100644 (file)
index 0000000..45fead5
--- /dev/null
@@ -0,0 +1,41 @@
+#pragma once
+
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 "macro.h"
+
+typedef struct LoopDevice LoopDevice;
+
+/* Some helpers for setting up loopback block devices */
+
+struct LoopDevice {
+        int fd;
+        int nr;
+        char *node;
+        bool relinquished;
+};
+
+int loop_device_make(int fd, int open_flags, LoopDevice **ret);
+int loop_device_make_by_path(const char *path, int open_flags, LoopDevice **ret);
+
+LoopDevice* loop_device_unref(LoopDevice *d);
+DEFINE_TRIVIAL_CLEANUP_FUNC(LoopDevice*, loop_device_unref);
+
+void loop_device_relinquish(LoopDevice *d);
index 529d89e..32a4c67 100644 (file)
 #include <sys/stat.h>
 #include <unistd.h>
 #include <linux/fs.h>
+
 #include "alloc-util.h"
 #include "btrfs-util.h"
 #include "chattr-util.h"
 #include "copy.h"
 #include "dirent-util.h"
+#include "env-util.h"
 #include "fd-util.h"
 #include "fs-util.h"
 #include "hashmap.h"
 #include "lockfile-util.h"
 #include "log.h"
-#include "macro.h"
 #include "machine-image.h"
+#include "macro.h"
 #include "mkdir.h"
 #include "path-util.h"
 #include "rm-rf.h"
@@ -62,8 +64,7 @@ Image *image_unref(Image *i) {
 
         free(i->name);
         free(i->path);
-        free(i);
-        return NULL;
+        return mfree(i);
 }
 
 static char **image_settings_path(Image *image) {
@@ -98,6 +99,16 @@ static char **image_settings_path(Image *image) {
         return ret;
 }
 
+static char *image_roothash_path(Image *image) {
+        const char *fn;
+
+        assert(image);
+
+        fn = strjoina(image->name, ".roothash");
+
+        return file_in_same_dir(image->path, fn);
+}
+
 static int image_new(
                 ImageType t,
                 const char *pretty,
@@ -132,7 +143,7 @@ static int image_new(
                 return -ENOMEM;
 
         if (path)
-                i->path = strjoin(path, "/", filename, NULL);
+                i->path = strjoin(path, "/", filename);
         else
                 i->path = strdup(filename);
 
@@ -396,6 +407,7 @@ void image_hashmap_free(Hashmap *map) {
 int image_remove(Image *i) {
         _cleanup_release_lock_file_ LockFile global_lock = LOCK_FILE_INIT, local_lock = LOCK_FILE_INIT;
         _cleanup_strv_free_ char **settings = NULL;
+        _cleanup_free_ char *roothash = NULL;
         char **j;
         int r;
 
@@ -408,6 +420,10 @@ int image_remove(Image *i) {
         if (!settings)
                 return -ENOMEM;
 
+        roothash = image_roothash_path(i);
+        if (!roothash)
+                return -ENOMEM;
+
         /* Make sure we don't interfere with a running nspawn */
         r = image_path_lock(i->path, LOCK_EX|LOCK_NB, &global_lock, &local_lock);
         if (r < 0)
@@ -444,14 +460,17 @@ int image_remove(Image *i) {
                         log_debug_errno(errno, "Failed to unlink %s, ignoring: %m", *j);
         }
 
+        if (unlink(roothash) < 0 && errno != ENOENT)
+                log_debug_errno(errno, "Failed to unlink %s, ignoring: %m", roothash);
+
         return 0;
 }
 
-static int rename_settings_file(const char *path, const char *new_name) {
+static int rename_auxiliary_file(const char *path, const char *new_name, const char *suffix) {
         _cleanup_free_ char *rs = NULL;
         const char *fn;
 
-        fn = strjoina(new_name, ".nspawn");
+        fn = strjoina(new_name, suffix);
 
         rs = file_in_same_dir(path, fn);
         if (!rs)
@@ -462,7 +481,7 @@ static int rename_settings_file(const char *path, const char *new_name) {
 
 int image_rename(Image *i, const char *new_name) {
         _cleanup_release_lock_file_ LockFile global_lock = LOCK_FILE_INIT, local_lock = LOCK_FILE_INIT, name_lock = LOCK_FILE_INIT;
-        _cleanup_free_ char *new_path = NULL, *nn = NULL;
+        _cleanup_free_ char *new_path = NULL, *nn = NULL, *roothash = NULL;
         _cleanup_strv_free_ char **settings = NULL;
         unsigned file_attr = 0;
         char **j;
@@ -480,6 +499,10 @@ int image_rename(Image *i, const char *new_name) {
         if (!settings)
                 return -ENOMEM;
 
+        roothash = image_roothash_path(i);
+        if (!roothash)
+                return -ENOMEM;
+
         /* Make sure we don't interfere with a running nspawn */
         r = image_path_lock(i->path, LOCK_EX|LOCK_NB, &global_lock, &local_lock);
         if (r < 0)
@@ -549,30 +572,35 @@ int image_rename(Image *i, const char *new_name) {
         nn = NULL;
 
         STRV_FOREACH(j, settings) {
-                r = rename_settings_file(*j, new_name);
+                r = rename_auxiliary_file(*j, new_name, ".nspawn");
                 if (r < 0 && r != -ENOENT)
                         log_debug_errno(r, "Failed to rename settings file %s, ignoring: %m", *j);
         }
 
+        r = rename_auxiliary_file(roothash, new_name, ".roothash");
+        if (r < 0 && r != -ENOENT)
+                log_debug_errno(r, "Failed to rename roothash file %s, ignoring: %m", roothash);
+
         return 0;
 }
 
-static int clone_settings_file(const char *path, const char *new_name) {
+static int clone_auxiliary_file(const char *path, const char *new_name, const char *suffix) {
         _cleanup_free_ char *rs = NULL;
         const char *fn;
 
-        fn = strjoina(new_name, ".nspawn");
+        fn = strjoina(new_name, suffix);
 
         rs = file_in_same_dir(path, fn);
         if (!rs)
                 return -ENOMEM;
 
-        return copy_file_atomic(path, rs, 0664, false, 0);
+        return copy_file_atomic(path, rs, 0664, 0, COPY_REFLINK);
 }
 
 int image_clone(Image *i, const char *new_name, bool read_only) {
         _cleanup_release_lock_file_ LockFile name_lock = LOCK_FILE_INIT;
         _cleanup_strv_free_ char **settings = NULL;
+        _cleanup_free_ char *roothash = NULL;
         const char *new_path;
         char **j;
         int r;
@@ -586,6 +614,10 @@ int image_clone(Image *i, const char *new_name, bool read_only) {
         if (!settings)
                 return -ENOMEM;
 
+        roothash = image_roothash_path(i);
+        if (!roothash)
+                return -ENOMEM;
+
         /* Make sure nobody takes the new name, between the time we
          * checked it is currently unused in all search paths, and the
          * time we take possession of it */
@@ -604,18 +636,18 @@ int image_clone(Image *i, const char *new_name, bool read_only) {
         case IMAGE_SUBVOLUME:
         case IMAGE_DIRECTORY:
                 /* If we can we'll always try to create a new btrfs subvolume here, even if the source is a plain
-                 * directory.*/
+                 * directory. */
 
                 new_path = strjoina("/var/lib/machines/", new_name);
 
-                r = btrfs_subvol_snapshot(i->path, new_path, (read_only ? BTRFS_SNAPSHOT_READ_ONLY : 0) | BTRFS_SNAPSHOT_FALLBACK_COPY | BTRFS_SNAPSHOT_RECURSIVE | BTRFS_SNAPSHOT_QUOTA);
-                if (r == -EOPNOTSUPP) {
-                        /* No btrfs snapshots supported, create a normal directory then. */
-
-                        r = copy_directory(i->path, new_path, false);
-                        if (r >= 0)
-                                (void) chattr_path(new_path, read_only ? FS_IMMUTABLE_FL : 0, FS_IMMUTABLE_FL);
-                } else if (r >= 0)
+                r = btrfs_subvol_snapshot(i->path, new_path,
+                                          (read_only ? BTRFS_SNAPSHOT_READ_ONLY : 0) |
+                                          BTRFS_SNAPSHOT_FALLBACK_COPY |
+                                          BTRFS_SNAPSHOT_FALLBACK_DIRECTORY |
+                                          BTRFS_SNAPSHOT_FALLBACK_IMMUTABLE |
+                                          BTRFS_SNAPSHOT_RECURSIVE |
+                                          BTRFS_SNAPSHOT_QUOTA);
+                if (r >= 0)
                         /* Enable "subtree" quotas for the copy, if we didn't copy any quota from the source. */
                         (void) btrfs_subvol_auto_qgroup(new_path, 0, true);
 
@@ -624,7 +656,7 @@ int image_clone(Image *i, const char *new_name, bool read_only) {
         case IMAGE_RAW:
                 new_path = strjoina("/var/lib/machines/", new_name, ".raw");
 
-                r = copy_file_atomic(i->path, new_path, read_only ? 0444 : 0644, false, FS_NOCOW_FL);
+                r = copy_file_atomic(i->path, new_path, read_only ? 0444 : 0644, FS_NOCOW_FL, COPY_REFLINK);
                 break;
 
         default:
@@ -635,11 +667,15 @@ int image_clone(Image *i, const char *new_name, bool read_only) {
                 return r;
 
         STRV_FOREACH(j, settings) {
-                r = clone_settings_file(*j, new_name);
+                r = clone_auxiliary_file(*j, new_name, ".nspawn");
                 if (r < 0 && r != -ENOENT)
                         log_debug_errno(r, "Failed to clone settings %s, ignoring: %m", *j);
         }
 
+        r = clone_auxiliary_file(roothash, new_name, ".roothash");
+        if (r < 0 && r != -ENOENT)
+                log_debug_errno(r, "Failed to clone root hash file %s, ignoring: %m", roothash);
+
         return 0;
 }
 
@@ -676,7 +712,7 @@ int image_read_only(Image *i, bool b) {
                    use the "immutable" flag, to at least make the
                    top-level directory read-only. It's not as good as
                    a read-only subvolume, but at least something, and
-                   we can read the value back.*/
+                   we can read the value back. */
 
                 r = chattr_path(i->path, b ? FS_IMMUTABLE_FL : 0, FS_IMMUTABLE_FL);
                 if (r < 0)
@@ -724,12 +760,17 @@ int image_path_lock(const char *path, int operation, LockFile *global, LockFile
          * uses the device/inode number. This has the benefit that we
          * can even lock a tree that is a mount point, correctly. */
 
-        if (path_equal(path, "/"))
-                return -EBUSY;
-
         if (!path_is_absolute(path))
                 return -EINVAL;
 
+        if (getenv_bool("SYSTEMD_NSPAWN_LOCK") == 0) {
+                *local = *global = (LockFile) LOCK_FILE_INIT;
+                return 0;
+        }
+
+        if (path_equal(path, "/"))
+                return -EBUSY;
+
         if (stat(path, &st) >= 0) {
                 if (asprintf(&p, "/run/systemd/nspawn/locks/inode-%lu:%lu", (unsigned long) st.st_dev, (unsigned long) st.st_ino) < 0)
                         return -ENOMEM;
@@ -747,7 +788,8 @@ int image_path_lock(const char *path, int operation, LockFile *global, LockFile
                         release_lock_file(&t);
                         return r;
                 }
-        }
+        } else
+                *global = (LockFile) LOCK_FILE_INIT;
 
         *local = t;
         return 0;
@@ -783,6 +825,11 @@ int image_name_lock(const char *name, int operation, LockFile *ret) {
         if (!image_name_is_valid(name))
                 return -EINVAL;
 
+        if (getenv_bool("SYSTEMD_NSPAWN_LOCK") == 0) {
+                *ret = (LockFile) LOCK_FILE_INIT;
+                return 0;
+        }
+
         if (streq(name, ".host"))
                 return -EBUSY;
 
index 23890c6..c581bde 100644 (file)
@@ -225,7 +225,7 @@ int setup_machine_directory(uint64_t size, sd_bus_error *error) {
                 return 1;
         }
 
-        if (path_is_mount_point("/var/lib/machines", AT_SYMLINK_FOLLOW) > 0) {
+        if (path_is_mount_point("/var/lib/machines", NULL, AT_SYMLINK_FOLLOW) > 0) {
                 log_debug("/var/lib/machines is already a mount point, not creating loopback file for it.");
                 return 0;
         }
diff --git a/src/shared/meson.build b/src/shared/meson.build
new file mode 100644 (file)
index 0000000..2eaef11
--- /dev/null
@@ -0,0 +1,158 @@
+shared_sources = '''
+        acl-util.h
+        acpi-fpdt.c
+        acpi-fpdt.h
+        apparmor-util.c
+        apparmor-util.h
+        ask-password-api.c
+        ask-password-api.h
+        base-filesystem.c
+        base-filesystem.h
+        boot-timestamps.c
+        boot-timestamps.h
+        bus-unit-util.c
+        bus-unit-util.h
+        bus-util.c
+        bus-util.h
+        cgroup-show.c
+        cgroup-show.h
+        clean-ipc.c
+        clean-ipc.h
+        condition.c
+        condition.h
+        conf-parser.c
+        conf-parser.h
+        dev-setup.c
+        dev-setup.h
+        dissect-image.c
+        dissect-image.h
+        dns-domain.c
+        dns-domain.h
+        dropin.c
+        dropin.h
+        efivars.c
+        efivars.h
+        fdset.c
+        fdset.h
+        firewall-util.h
+        fstab-util.c
+        fstab-util.h
+        gcrypt-util.c
+        gcrypt-util.h
+        generator.c
+        generator.h
+        gpt.h
+        ima-util.c
+        ima-util.h
+        import-util.c
+        import-util.h
+        initreq.h
+        install.c
+        install.h
+        install-printf.c
+        install-printf.h
+        journal-util.c
+        journal-util.h
+        logs-show.c
+        logs-show.h
+        loop-util.c
+        loop-util.h
+        machine-image.c
+        machine-image.h
+        machine-pool.c
+        machine-pool.h
+        nsflags.c
+        nsflags.h
+        output-mode.c
+        output-mode.h
+        pager.c
+        pager.h
+        path-lookup.c
+        path-lookup.h
+        ptyfwd.c
+        ptyfwd.h
+        resolve-util.c
+        resolve-util.h
+        seccomp-util.h
+        sleep-config.c
+        sleep-config.h
+        spawn-ask-password-agent.c
+        spawn-ask-password-agent.h
+        spawn-polkit-agent.c
+        spawn-polkit-agent.h
+        specifier.c
+        specifier.h
+        switch-root.c
+        switch-root.h
+        sysctl-util.c
+        sysctl-util.h
+        tests.c
+        tests.h
+        udev-util.h
+        udev-util.c
+        uid-range.c
+        uid-range.h
+        utmp-wtmp.h
+        vlan-util.c
+        vlan-util.h
+        volatile-util.c
+        volatile-util.h
+        watchdog.c
+        watchdog.h
+'''.split()
+
+test_tables_h = files('test-tables.h')
+shared_sources += [test_tables_h]
+
+if conf.get('HAVE_ACL', false)
+        shared_sources += ['acl-util.c']
+endif
+
+if conf.get('HAVE_UTMP', false)
+        shared_sources += ['utmp-wtmp.c']
+endif
+
+if conf.get('HAVE_SECCOMP', false)
+        shared_sources += ['seccomp-util.c']
+endif
+
+if conf.get('HAVE_LIBIPTC', false)
+        shared_sources += ['firewall-util.c']
+endif
+
+libshared_name = 'systemd-shared-@0@'.format(meson.project_version())
+
+libshared_deps = [threads,
+                  librt,
+                  libcap,
+                  libacl,
+                  libcryptsetup,
+                  libgcrypt,
+                  libiptc,
+                  libseccomp,
+                  libselinux,
+                  libidn,
+                  libxz,
+                  liblz4,
+                  libblkid]
+
+libshared = shared_library(
+        libshared_name,
+        shared_sources,
+        basic_sources,
+        journal_internal_sources,
+        libsystemd_internal_sources,
+        libudev_sources,
+        include_directories : includes,
+        link_args : ['-shared'],
+        c_args : ['-fvisibility=default'],
+        dependencies : libshared_deps,
+        install : true,
+        install_dir : rootlibexecdir)
+
+libshared_static = static_library(
+        libshared_name,
+        shared_sources,
+        basic_sources,
+        include_directories : includes,
+        dependencies : libshared_deps)
diff --git a/src/shared/nsflags.c b/src/shared/nsflags.c
new file mode 100644 (file)
index 0000000..aeb79b1
--- /dev/null
@@ -0,0 +1,120 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <sched.h>
+
+#include "alloc-util.h"
+#include "extract-word.h"
+#include "nsflags.h"
+#include "string-util.h"
+
+const struct namespace_flag_map namespace_flag_map[] = {
+        { CLONE_NEWCGROUP, "cgroup" },
+        { CLONE_NEWIPC,    "ipc"    },
+        { CLONE_NEWNET,    "net"    },
+        /* So, the mount namespace flag is called CLONE_NEWNS for historical reasons. Let's expose it here under a more
+         * explanatory name: "mnt". This is in-line with how the kernel exposes namespaces in /proc/$PID/ns. */
+        { CLONE_NEWNS,     "mnt"    },
+        { CLONE_NEWPID,    "pid"    },
+        { CLONE_NEWUSER,   "user"   },
+        { CLONE_NEWUTS,    "uts"    },
+        {}
+};
+
+const char* namespace_flag_to_string(unsigned long flag) {
+        unsigned i;
+
+        flag &= NAMESPACE_FLAGS_ALL;
+
+        for (i = 0; namespace_flag_map[i].name; i++)
+                if (flag == namespace_flag_map[i].flag)
+                        return namespace_flag_map[i].name;
+
+        return NULL; /* either unknown namespace flag, or a combination of many. This call supports neither. */
+}
+
+unsigned long namespace_flag_from_string(const char *name) {
+        unsigned i;
+
+        if (isempty(name))
+                return 0;
+
+        for (i = 0; namespace_flag_map[i].name; i++)
+                if (streq(name, namespace_flag_map[i].name))
+                        return namespace_flag_map[i].flag;
+
+        return 0;
+}
+
+int namespace_flag_from_string_many(const char *name, unsigned long *ret) {
+        unsigned long flags = 0;
+        int r;
+
+        assert_se(ret);
+
+        for (;;) {
+                _cleanup_free_ char *word = NULL;
+                unsigned long f;
+
+                r = extract_first_word(&name, &word, NULL, 0);
+                if (r < 0)
+                        return r;
+                if (r == 0)
+                        break;
+
+                f = namespace_flag_from_string(word);
+                if (f == 0)
+                        return -EINVAL;
+
+                flags |= f;
+        }
+
+        *ret = flags;
+        return 0;
+}
+
+int namespace_flag_to_string_many(unsigned long flags, char **ret) {
+        _cleanup_free_ char *s = NULL;
+        unsigned i;
+
+        for (i = 0; namespace_flag_map[i].name; i++) {
+                if ((flags & namespace_flag_map[i].flag) != namespace_flag_map[i].flag)
+                        continue;
+
+                if (!s) {
+                        s = strdup(namespace_flag_map[i].name);
+                        if (!s)
+                                return -ENOMEM;
+                } else {
+                        if (!strextend(&s, " ", namespace_flag_map[i].name, NULL))
+                                return -ENOMEM;
+                }
+        }
+
+        if (!s) {
+                s = strdup("");
+                if (!s)
+                        return -ENOMEM;
+        }
+
+        *ret = s;
+        s = NULL;
+
+        return 0;
+}
diff --git a/src/shared/nsflags.h b/src/shared/nsflags.h
new file mode 100644 (file)
index 0000000..152ab8b
--- /dev/null
@@ -0,0 +1,49 @@
+#pragma once
+
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <sched.h>
+
+#include "missing.h"
+
+/* The combination of all namespace flags defined by the kernel. The right type for this isn't clear. setns() and
+ * unshare() expect these flags to be passed as (signed) "int", while clone() wants them as "unsigned long". The latter
+ * is definitely more appropriate for a flags parameter, and also the larger type of the two, hence let's stick to that
+ * here. */
+#define NAMESPACE_FLAGS_ALL                                             \
+        ((unsigned long) (CLONE_NEWCGROUP|                              \
+                          CLONE_NEWIPC|                                 \
+                          CLONE_NEWNET|                                 \
+                          CLONE_NEWNS|                                  \
+                          CLONE_NEWPID|                                 \
+                          CLONE_NEWUSER|                                \
+                          CLONE_NEWUTS))
+
+const char* namespace_flag_to_string(unsigned long flag);
+unsigned long namespace_flag_from_string(const char *name);
+int namespace_flag_from_string_many(const char *name, unsigned long *ret);
+int namespace_flag_to_string_many(unsigned long flags, char **ret);
+
+struct namespace_flag_map {
+        unsigned long flag;
+        const char *name;
+};
+
+extern const struct namespace_flag_map namespace_flag_map[];
index bec53ee..29dcba9 100644 (file)
@@ -22,7 +22,9 @@
 
 static const char *const output_mode_table[_OUTPUT_MODE_MAX] = {
         [OUTPUT_SHORT] = "short",
+        [OUTPUT_SHORT_FULL] = "short-full",
         [OUTPUT_SHORT_ISO] = "short-iso",
+        [OUTPUT_SHORT_ISO_PRECISE] = "short-iso-precise",
         [OUTPUT_SHORT_PRECISE] = "short-precise",
         [OUTPUT_SHORT_MONOTONIC] = "short-monotonic",
         [OUTPUT_SHORT_UNIX] = "short-unix",
index f37189e..2a1bfd9 100644 (file)
@@ -23,7 +23,9 @@
 
 typedef enum OutputMode {
         OUTPUT_SHORT,
+        OUTPUT_SHORT_FULL,
         OUTPUT_SHORT_ISO,
+        OUTPUT_SHORT_ISO_PRECISE,
         OUTPUT_SHORT_PRECISE,
         OUTPUT_SHORT_MONOTONIC,
         OUTPUT_SHORT_UNIX,
index a2524d4..4d7b02c 100644 (file)
@@ -36,6 +36,7 @@
 #include "process-util.h"
 #include "signal-util.h"
 #include "string-util.h"
+#include "strv.h"
 #include "terminal-util.h"
 
 static pid_t pager_pid = 0;
@@ -43,7 +44,7 @@ static pid_t pager_pid = 0;
 noreturn static void pager_fallback(void) {
         int r;
 
-        r = copy_bytes(STDIN_FILENO, STDOUT_FILENO, (uint64_t) -1, false);
+        r = copy_bytes(STDIN_FILENO, STDOUT_FILENO, (uint64_t) -1, 0);
         if (r < 0) {
                 log_error_errno(r, "Internal pager failed: %m");
                 _exit(EXIT_FAILURE);
@@ -52,6 +53,11 @@ noreturn static void pager_fallback(void) {
         _exit(EXIT_SUCCESS);
 }
 
+static int stored_stdout = -1;
+static int stored_stderr = -1;
+static bool stdout_redirected = false;
+static bool stderr_redirected = false;
+
 int pager_open(bool no_pager, bool jump_to_end) {
         _cleanup_close_pair_ int fd[2] = { -1, -1 };
         const char *pager;
@@ -71,7 +77,7 @@ int pager_open(bool no_pager, bool jump_to_end) {
                 pager = getenv("PAGER");
 
         /* If the pager is explicitly turned off, honour it */
-        if (pager && (pager[0] == 0 || streq(pager, "cat")))
+        if (pager && STR_IN_SET(pager, "", "cat"))
                 return 0;
 
         /* Determine and cache number of columns before we spawn the
@@ -103,7 +109,8 @@ int pager_open(bool no_pager, bool jump_to_end) {
                         less_opts = "FRSXMK";
                 if (jump_to_end)
                         less_opts = strjoina(less_opts, " +G");
-                setenv("LESS", less_opts, 1);
+                if (setenv("LESS", less_opts, 1) < 0)
+                        _exit(EXIT_FAILURE);
 
                 /* Initialize a good charset for less. This is
                  * particularly important if we output UTF-8
@@ -111,8 +118,9 @@ int pager_open(bool no_pager, bool jump_to_end) {
                 less_charset = getenv("SYSTEMD_LESSCHARSET");
                 if (!less_charset && is_locale_utf8())
                         less_charset = "utf-8";
-                if (less_charset)
-                        setenv("LESSCHARSET", less_charset, 1);
+                if (less_charset &&
+                    setenv("LESSCHARSET", less_charset, 1) < 0)
+                        _exit(EXIT_FAILURE);
 
                 /* Make sure the pager goes away when the parent dies */
                 if (prctl(PR_SET_PDEATHSIG, SIGTERM) < 0)
@@ -144,10 +152,19 @@ int pager_open(bool no_pager, bool jump_to_end) {
         }
 
         /* Return in the parent */
-        if (dup2(fd[1], STDOUT_FILENO) < 0)
+        stored_stdout = fcntl(STDOUT_FILENO, F_DUPFD_CLOEXEC, 3);
+        if (dup2(fd[1], STDOUT_FILENO) < 0) {
+                stored_stdout = safe_close(stored_stdout);
                 return log_error_errno(errno, "Failed to duplicate pager pipe: %m");
-        if (dup2(fd[1], STDERR_FILENO) < 0)
+        }
+        stdout_redirected = true;
+
+        stored_stderr = fcntl(STDERR_FILENO, F_DUPFD_CLOEXEC, 3);
+        if (dup2(fd[1], STDERR_FILENO) < 0) {
+                stored_stderr = safe_close(stored_stderr);
                 return log_error_errno(errno, "Failed to duplicate pager pipe: %m");
+        }
+        stderr_redirected = true;
 
         return 1;
 }
@@ -158,8 +175,17 @@ void pager_close(void) {
                 return;
 
         /* Inform pager that we are done */
-        stdout = safe_fclose(stdout);
-        stderr = safe_fclose(stderr);
+        (void) fflush(stdout);
+        if (stdout_redirected)
+                if (stored_stdout < 0 || dup2(stored_stdout, STDOUT_FILENO) < 0)
+                        (void) close(STDOUT_FILENO);
+        stored_stdout = safe_close(stored_stdout);
+        (void) fflush(stderr);
+        if (stderr_redirected)
+                if (stored_stderr < 0 || dup2(stored_stderr, STDERR_FILENO) < 0)
+                        (void) close(STDERR_FILENO);
+        stored_stderr = safe_close(stored_stderr);
+        stdout_redirected = stderr_redirected = false;
 
         (void) kill(pager_pid, SIGCONT);
         (void) wait_for_terminate(pager_pid, NULL);
index 862096a..e2b3f8b 100644 (file)
@@ -33,6 +33,7 @@
 #include "stat-util.h"
 #include "string-util.h"
 #include "strv.h"
+#include "user-util.h"
 #include "util.h"
 
 static int user_runtime_dir(char **ret, const char *suffix) {
@@ -57,6 +58,7 @@ static int user_runtime_dir(char **ret, const char *suffix) {
 static int user_config_dir(char **ret, const char *suffix) {
         const char *e;
         char *j;
+        int r;
 
         assert(ret);
 
@@ -64,13 +66,13 @@ static int user_config_dir(char **ret, const char *suffix) {
         if (e)
                 j = strappend(e, suffix);
         else {
-                const char *home;
+                _cleanup_free_ char *home = NULL;
 
-                home = getenv("HOME");
-                if (!home)
-                        return -ENXIO;
+                r = get_home_dir(&home);
+                if (r < 0)
+                        return r;
 
-                j = strjoin(home, "/.config", suffix, NULL);
+                j = strjoin(home, "/.config", suffix);
         }
 
         if (!j)
@@ -83,6 +85,7 @@ static int user_config_dir(char **ret, const char *suffix) {
 static int user_data_dir(char **ret, const char *suffix) {
         const char *e;
         char *j;
+        int r;
 
         assert(ret);
         assert(suffix);
@@ -95,14 +98,13 @@ static int user_data_dir(char **ret, const char *suffix) {
         if (e)
                 j = strappend(e, suffix);
         else {
-                const char *home;
-
-                home = getenv("HOME");
-                if (!home)
-                        return -ENXIO;
+                _cleanup_free_ char *home = NULL;
 
+                r = get_home_dir(&home);
+                if (r < 0)
+                        return r;
 
-                j = strjoin(home, "/.local/share", suffix, NULL);
+                j = strjoin(home, "/.local/share", suffix);
         }
         if (!j)
                 return -ENOMEM;
@@ -136,10 +138,10 @@ static char** user_dirs(
                 NULL
         };
 
-        const char *e;
         _cleanup_strv_free_ char **config_dirs = NULL, **data_dirs = NULL;
         _cleanup_free_ char *data_home = NULL;
-        _cleanup_free_ char **res = NULL;
+        _cleanup_strv_free_ char **res = NULL;
+        const char *e;
         char **tmp;
         int r;
 
@@ -186,9 +188,8 @@ static char** user_dirs(
         if (strv_extend(&res, generator_early) < 0)
                 return NULL;
 
-        if (!strv_isempty(config_dirs))
-                if (strv_extend_strv_concat(&res, config_dirs, "/systemd/user") < 0)
-                        return NULL;
+        if (strv_extend_strv_concat(&res, config_dirs, "/systemd/user") < 0)
+                return NULL;
 
         if (strv_extend(&res, persistent_config) < 0)
                 return NULL;
@@ -205,9 +206,8 @@ static char** user_dirs(
         if (strv_extend(&res, data_home) < 0)
                 return NULL;
 
-        if (!strv_isempty(data_dirs))
-                if (strv_extend_strv_concat(&res, data_dirs, "/systemd/user") < 0)
-                        return NULL;
+        if (strv_extend_strv_concat(&res, data_dirs, "/systemd/user") < 0)
+                return NULL;
 
         if (strv_extend_strv(&res, (char**) data_unit_paths, false) < 0)
                 return NULL;
@@ -220,6 +220,7 @@ static char** user_dirs(
 
         tmp = res;
         res = NULL;
+
         return tmp;
 }
 
@@ -328,12 +329,18 @@ static int acquire_config_dirs(UnitFileScope scope, char **persistent, char **ru
 
         case UNIT_FILE_USER:
                 r = user_config_dir(&a, "/systemd/user");
-                if (r < 0)
+                if (r < 0 && r != -ENXIO)
                         return r;
 
                 r = user_runtime_dir(runtime, "/systemd/user");
-                if (r < 0)
-                        return r;
+                if (r < 0) {
+                        if (r != -ENXIO)
+                                return r;
+
+                        /* If XDG_RUNTIME_DIR is not set, don't consider that fatal, simply initialize the runtime
+                         * directory to NULL */
+                        *runtime = NULL;
+                }
 
                 *persistent = a;
                 a = NULL;
@@ -382,12 +389,18 @@ static int acquire_control_dirs(UnitFileScope scope, char **persistent, char **r
 
         case UNIT_FILE_USER:
                 r = user_config_dir(&a, "/systemd/system.control");
-                if (r < 0)
+                if (r < 0 && r != -ENXIO)
                         return r;
 
                 r = user_runtime_dir(runtime, "/systemd/system.control");
-                if (r < 0)
-                        return r;
+                if (r < 0) {
+                        if (r != -ENXIO)
+                                return r;
+
+                        /* If XDG_RUNTIME_DIR is not set, don't consider this fatal, simply initialize the directory to
+                         * NULL */
+                        *runtime = NULL;
+                }
 
                 break;
 
@@ -474,22 +487,26 @@ int lookup_paths_init(
                         return -ENOMEM;
         }
 
+        /* Note: when XDG_RUNTIME_DIR is not set this will not return -ENXIO, but simply set runtime_config to NULL */
         r = acquire_config_dirs(scope, &persistent_config, &runtime_config);
-        if (r < 0 && r != -ENXIO)
+        if (r < 0)
                 return r;
 
         if ((flags & LOOKUP_PATHS_EXCLUDE_GENERATED) == 0) {
+                /* Note: if XDG_RUNTIME_DIR is not set, this will fail completely with ENXIO */
                 r = acquire_generator_dirs(scope, &generator, &generator_early, &generator_late);
                 if (r < 0 && r != -EOPNOTSUPP && r != -ENXIO)
                         return r;
         }
 
+        /* Note: if XDG_RUNTIME_DIR is not set, this will fail completely with ENXIO */
         r = acquire_transient_dir(scope, &transient);
         if (r < 0 && r != -EOPNOTSUPP && r != -ENXIO)
                 return r;
 
+        /* Note: when XDG_RUNTIME_DIR is not set this will not return -ENXIO, but simply set runtime_control to NULL */
         r = acquire_control_dirs(scope, &persistent_control, &runtime_control);
-        if (r < 0 && r != -EOPNOTSUPP && r != -ENXIO)
+        if (r < 0 && r != -EOPNOTSUPP)
                 return r;
 
         /* First priority is whatever has been passed to us via env vars */
@@ -503,8 +520,7 @@ int lookup_paths_init(
                         append = true;
                 }
 
-                /* FIXME: empty components in other places should be
-                 * rejected. */
+                /* FIXME: empty components in other places should be rejected. */
 
                 r = path_split_and_make_absolute(e, &paths);
                 if (r < 0)
index 02c03b9..59b541d 100644 (file)
@@ -68,6 +68,9 @@ struct PTYForward {
 
         bool read_from_master:1;
 
+        bool done:1;
+        bool drain:1;
+
         bool last_char_set:1;
         char last_char;
 
@@ -76,10 +79,54 @@ struct PTYForward {
 
         usec_t escape_timestamp;
         unsigned escape_counter;
+
+        PTYForwardHandler handler;
+        void *userdata;
 };
 
 #define ESCAPE_USEC (1*USEC_PER_SEC)
 
+static void pty_forward_disconnect(PTYForward *f) {
+
+        if (f) {
+                f->stdin_event_source = sd_event_source_unref(f->stdin_event_source);
+                f->stdout_event_source = sd_event_source_unref(f->stdout_event_source);
+
+                f->master_event_source = sd_event_source_unref(f->master_event_source);
+                f->sigwinch_event_source = sd_event_source_unref(f->sigwinch_event_source);
+                f->event = sd_event_unref(f->event);
+
+                if (f->saved_stdout)
+                        tcsetattr(STDOUT_FILENO, TCSANOW, &f->saved_stdout_attr);
+                if (f->saved_stdin)
+                        tcsetattr(STDIN_FILENO, TCSANOW, &f->saved_stdin_attr);
+
+                f->saved_stdout = f->saved_stdin = false;
+        }
+
+        /* STDIN/STDOUT should not be nonblocking normally, so let's unconditionally reset it */
+        fd_nonblock(STDIN_FILENO, false);
+        fd_nonblock(STDOUT_FILENO, false);
+}
+
+static int pty_forward_done(PTYForward *f, int rcode) {
+        _cleanup_(sd_event_unrefp) sd_event *e = NULL;
+        assert(f);
+
+        if (f->done)
+                return 0;
+
+        e = sd_event_ref(f->event);
+
+        f->done = true;
+        pty_forward_disconnect(f);
+
+        if (f->handler)
+                return f->handler(f, rcode, f->userdata);
+        else
+                return sd_event_exit(e, rcode < 0 ? EXIT_FAILURE : rcode);
+}
+
 static bool look_for_escape(PTYForward *f, const char *buffer, size_t n) {
         const char *p;
 
@@ -147,7 +194,7 @@ static int shovel(PTYForward *f) {
                                         f->stdin_event_source = sd_event_source_unref(f->stdin_event_source);
                                 } else {
                                         log_error_errno(errno, "read(): %m");
-                                        return sd_event_exit(f->event, EXIT_FAILURE);
+                                        return pty_forward_done(f, -errno);
                                 }
                         } else if (k == 0) {
                                 /* EOF on stdin */
@@ -156,12 +203,10 @@ static int shovel(PTYForward *f) {
 
                                 f->stdin_event_source = sd_event_source_unref(f->stdin_event_source);
                         } else  {
-                                /* Check if ^] has been
-                                 * pressed three times within
-                                 * one second. If we get this
-                                 * we quite immediately. */
+                                /* Check if ^] has been pressed three times within one second. If we get this we quite
+                                 * immediately. */
                                 if (look_for_escape(f, f->in_buffer + f->in_buffer_full, k))
-                                        return sd_event_exit(f->event, EXIT_FAILURE);
+                                        return pty_forward_done(f, -ECANCELED);
 
                                 f->in_buffer_full += (size_t) k;
                         }
@@ -181,7 +226,7 @@ static int shovel(PTYForward *f) {
                                         f->master_event_source = sd_event_source_unref(f->master_event_source);
                                 } else {
                                         log_error_errno(errno, "write(): %m");
-                                        return sd_event_exit(f->event, EXIT_FAILURE);
+                                        return pty_forward_done(f, -errno);
                                 }
                         } else {
                                 assert(f->in_buffer_full >= (size_t) k);
@@ -211,7 +256,7 @@ static int shovel(PTYForward *f) {
                                         f->master_event_source = sd_event_source_unref(f->master_event_source);
                                 } else {
                                         log_error_errno(errno, "read(): %m");
-                                        return sd_event_exit(f->event, EXIT_FAILURE);
+                                        return pty_forward_done(f, -errno);
                                 }
                         }  else {
                                 f->read_from_master = true;
@@ -232,7 +277,7 @@ static int shovel(PTYForward *f) {
                                         f->stdout_event_source = sd_event_source_unref(f->stdout_event_source);
                                 } else {
                                         log_error_errno(errno, "write(): %m");
-                                        return sd_event_exit(f->event, EXIT_FAILURE);
+                                        return pty_forward_done(f, -errno);
                                 }
 
                         } else {
@@ -255,9 +300,14 @@ static int shovel(PTYForward *f) {
 
                 if ((f->out_buffer_full <= 0 || f->stdout_hangup) &&
                     (f->in_buffer_full <= 0 || f->master_hangup))
-                        return sd_event_exit(f->event, EXIT_SUCCESS);
+                        return pty_forward_done(f, 0);
         }
 
+        /* If we were asked to drain, and there's nothing more to handle from the master, then call the callback
+         * too. */
+        if (f->drain && f->out_buffer_full == 0 && !f->master_readable)
+                return pty_forward_done(f, 0);
+
         return 0;
 }
 
@@ -394,6 +444,9 @@ int pty_forward_new(
                 r = sd_event_add_io(f->event, &f->stdin_event_source, STDIN_FILENO, EPOLLIN|EPOLLET, on_stdin_event, f);
                 if (r < 0 && r != -EPERM)
                         return r;
+
+                if (r >= 0)
+                        (void) sd_event_source_set_description(f->stdin_event_source, "ptyfwd-stdin");
         }
 
         r = sd_event_add_io(f->event, &f->stdout_event_source, STDOUT_FILENO, EPOLLOUT|EPOLLET, on_stdout_event, f);
@@ -402,15 +455,21 @@ int pty_forward_new(
                 f->stdout_writable = true;
         else if (r < 0)
                 return r;
+        else
+                (void) sd_event_source_set_description(f->stdout_event_source, "ptyfwd-stdout");
 
         r = sd_event_add_io(f->event, &f->master_event_source, master, EPOLLIN|EPOLLOUT|EPOLLET, on_master_event, f);
         if (r < 0)
                 return r;
 
+        (void) sd_event_source_set_description(f->master_event_source, "ptyfwd-master");
+
         r = sd_event_add_signal(f->event, &f->sigwinch_event_source, SIGWINCH, on_sigwinch_event, f);
         if (r < 0)
                 return r;
 
+        (void) sd_event_source_set_description(f->sigwinch_event_source, "ptyfwd-sigwinch");
+
         *ret = f;
         f = NULL;
 
@@ -418,28 +477,8 @@ int pty_forward_new(
 }
 
 PTYForward *pty_forward_free(PTYForward *f) {
-
-        if (f) {
-                sd_event_source_unref(f->stdin_event_source);
-                sd_event_source_unref(f->stdout_event_source);
-                sd_event_source_unref(f->master_event_source);
-                sd_event_source_unref(f->sigwinch_event_source);
-                sd_event_unref(f->event);
-
-                if (f->saved_stdout)
-                        tcsetattr(STDOUT_FILENO, TCSANOW, &f->saved_stdout_attr);
-                if (f->saved_stdin)
-                        tcsetattr(STDIN_FILENO, TCSANOW, &f->saved_stdin_attr);
-
-                free(f);
-        }
-
-        /* STDIN/STDOUT should not be nonblocking normally, so let's
-         * unconditionally reset it */
-        fd_nonblock(STDIN_FILENO, false);
-        fd_nonblock(STDOUT_FILENO, false);
-
-        return NULL;
+        pty_forward_disconnect(f);
+        return mfree(f);
 }
 
 int pty_forward_get_last_char(PTYForward *f, char *ch) {
@@ -477,8 +516,36 @@ int pty_forward_set_ignore_vhangup(PTYForward *f, bool b) {
         return 0;
 }
 
-int pty_forward_get_ignore_vhangup(PTYForward *f) {
+bool pty_forward_get_ignore_vhangup(PTYForward *f) {
         assert(f);
 
         return !!(f->flags & PTY_FORWARD_IGNORE_VHANGUP);
 }
+
+bool pty_forward_is_done(PTYForward *f) {
+        assert(f);
+
+        return f->done;
+}
+
+void pty_forward_set_handler(PTYForward *f, PTYForwardHandler cb, void *userdata) {
+        assert(f);
+
+        f->handler = cb;
+        f->userdata = userdata;
+}
+
+bool pty_forward_drain(PTYForward *f) {
+        assert(f);
+
+        /* Starts draining the forwarder. Specifically:
+         *
+         * - Returns true if there are no unprocessed bytes from the pty, false otherwise
+         *
+         * - Makes sure the handler function is called the next time the number of unprocessed bytes hits zero
+         */
+
+        f->drain = true;
+
+        return f->out_buffer_full == 0 && !f->master_readable;
+}
index a046eb4..3fad1d3 100644 (file)
@@ -37,12 +37,20 @@ typedef enum PTYForwardFlags {
         PTY_FORWARD_IGNORE_INITIAL_VHANGUP = 4,
 } PTYForwardFlags;
 
+typedef int (*PTYForwardHandler)(PTYForward *f, int rcode, void*userdata);
+
 int pty_forward_new(sd_event *event, int master, PTYForwardFlags flags, PTYForward **f);
 PTYForward *pty_forward_free(PTYForward *f);
 
 int pty_forward_get_last_char(PTYForward *f, char *ch);
 
 int pty_forward_set_ignore_vhangup(PTYForward *f, bool ignore_vhangup);
-int pty_forward_get_ignore_vhangup(PTYForward *f);
+bool pty_forward_get_ignore_vhangup(PTYForward *f);
+
+bool pty_forward_is_done(PTYForward *f);
+
+void pty_forward_set_handler(PTYForward *f, PTYForwardHandler handler, void *userdata);
+
+bool pty_forward_drain(PTYForward *f);
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(PTYForward*, pty_forward_free);
index 8656d11..36843d4 100644 (file)
 ***/
 
 #include <errno.h>
+#include <linux/seccomp.h>
 #include <seccomp.h>
 #include <stddef.h>
+#include <sys/mman.h>
+#include <sys/prctl.h>
+#include <sys/shm.h>
 
+#include "af-list.h"
+#include "alloc-util.h"
 #include "macro.h"
+#include "nsflags.h"
 #include "seccomp-util.h"
 #include "string-util.h"
+#include "util.h"
+#include "errno-list.h"
+
+const uint32_t seccomp_local_archs[] = {
+
+        /* Note: always list the native arch we are compiled as last, so that users can blacklist seccomp(), but our own calls to it still succeed */
+
+#if defined(__x86_64__) && defined(__ILP32__)
+                SCMP_ARCH_X86,
+                SCMP_ARCH_X86_64,
+                SCMP_ARCH_X32,         /* native */
+#elif defined(__x86_64__) && !defined(__ILP32__)
+                SCMP_ARCH_X86,
+                SCMP_ARCH_X32,
+                SCMP_ARCH_X86_64,      /* native */
+#elif defined(__i386__)
+                SCMP_ARCH_X86,
+#elif defined(__aarch64__)
+                SCMP_ARCH_ARM,
+                SCMP_ARCH_AARCH64,     /* native */
+#elif defined(__arm__)
+                SCMP_ARCH_ARM,
+#elif defined(__mips__) && __BYTE_ORDER == __BIG_ENDIAN && _MIPS_SIM == _MIPS_SIM_ABI32
+                SCMP_ARCH_MIPSEL,
+                SCMP_ARCH_MIPS,        /* native */
+#elif defined(__mips__) && __BYTE_ORDER == __LITTLE_ENDIAN && _MIPS_SIM == _MIPS_SIM_ABI32
+                SCMP_ARCH_MIPS,
+                SCMP_ARCH_MIPSEL,      /* native */
+#elif defined(__mips__) && __BYTE_ORDER == __BIG_ENDIAN && _MIPS_SIM == _MIPS_SIM_ABI64
+                SCMP_ARCH_MIPSEL,
+                SCMP_ARCH_MIPS,
+                SCMP_ARCH_MIPSEL64N32,
+                SCMP_ARCH_MIPS64N32,
+                SCMP_ARCH_MIPSEL64,
+                SCMP_ARCH_MIPS64,      /* native */
+#elif defined(__mips__) && __BYTE_ORDER == __LITTLE_ENDIAN && _MIPS_SIM == _MIPS_SIM_ABI64
+                SCMP_ARCH_MIPS,
+                SCMP_ARCH_MIPSEL,
+                SCMP_ARCH_MIPS64N32,
+                SCMP_ARCH_MIPSEL64N32,
+                SCMP_ARCH_MIPS64,
+                SCMP_ARCH_MIPSEL64,    /* native */
+#elif defined(__mips__) && __BYTE_ORDER == __BIG_ENDIAN && _MIPS_SIM == _MIPS_SIM_NABI32
+                SCMP_ARCH_MIPSEL,
+                SCMP_ARCH_MIPS,
+                SCMP_ARCH_MIPSEL64,
+                SCMP_ARCH_MIPS64,
+                SCMP_ARCH_MIPSEL64N32,
+                SCMP_ARCH_MIPS64N32,   /* native */
+#elif defined(__mips__) && __BYTE_ORDER == __LITTLE_ENDIAN && _MIPS_SIM == _MIPS_SIM_NABI32
+                SCMP_ARCH_MIPS,
+                SCMP_ARCH_MIPSEL,
+                SCMP_ARCH_MIPS64,
+                SCMP_ARCH_MIPSEL64,
+                SCMP_ARCH_MIPS64N32,
+                SCMP_ARCH_MIPSEL64N32, /* native */
+#elif defined(__powerpc64__) && __BYTE_ORDER == __BIG_ENDIAN
+                SCMP_ARCH_PPC,
+                SCMP_ARCH_PPC64LE,
+                SCMP_ARCH_PPC64,       /* native */
+#elif defined(__powerpc64__) && __BYTE_ORDER == __LITTLE_ENDIAN
+                SCMP_ARCH_PPC,
+                SCMP_ARCH_PPC64,
+                SCMP_ARCH_PPC64LE,     /* native */
+#elif defined(__powerpc__)
+                SCMP_ARCH_PPC,
+#elif defined(__s390x__)
+                SCMP_ARCH_S390,
+                SCMP_ARCH_S390X,      /* native */
+#elif defined(__s390__)
+                SCMP_ARCH_S390,
+#endif
+                (uint32_t) -1
+        };
 
 const char* seccomp_arch_to_string(uint32_t c) {
+        /* Maintain order used in <seccomp.h>.
+         *
+         * Names used here should be the same as those used for ConditionArchitecture=,
+         * except for "subarchitectures" like x32. */
 
-        if (c == SCMP_ARCH_NATIVE)
+        switch(c) {
+        case SCMP_ARCH_NATIVE:
                 return "native";
-        if (c == SCMP_ARCH_X86)
+        case SCMP_ARCH_X86:
                 return "x86";
-        if (c == SCMP_ARCH_X86_64)
+        case SCMP_ARCH_X86_64:
                 return "x86-64";
-        if (c == SCMP_ARCH_X32)
+        case SCMP_ARCH_X32:
                 return "x32";
-        if (c == SCMP_ARCH_ARM)
+        case SCMP_ARCH_ARM:
                 return "arm";
-
-        return NULL;
+        case SCMP_ARCH_AARCH64:
+                return "arm64";
+        case SCMP_ARCH_MIPS:
+                return "mips";
+        case SCMP_ARCH_MIPS64:
+                return "mips64";
+        case SCMP_ARCH_MIPS64N32:
+                return "mips64-n32";
+        case SCMP_ARCH_MIPSEL:
+                return "mips-le";
+        case SCMP_ARCH_MIPSEL64:
+                return "mips64-le";
+        case SCMP_ARCH_MIPSEL64N32:
+                return "mips64-le-n32";
+        case SCMP_ARCH_PPC:
+                return "ppc";
+        case SCMP_ARCH_PPC64:
+                return "ppc64";
+        case SCMP_ARCH_PPC64LE:
+                return "ppc64-le";
+        case SCMP_ARCH_S390:
+                return "s390";
+        case SCMP_ARCH_S390X:
+                return "s390x";
+        default:
+                return NULL;
+        }
 }
 
 int seccomp_arch_from_string(const char *n, uint32_t *ret) {
@@ -57,60 +168,162 @@ int seccomp_arch_from_string(const char *n, uint32_t *ret) {
                 *ret = SCMP_ARCH_X32;
         else if (streq(n, "arm"))
                 *ret = SCMP_ARCH_ARM;
+        else if (streq(n, "arm64"))
+                *ret = SCMP_ARCH_AARCH64;
+        else if (streq(n, "mips"))
+                *ret = SCMP_ARCH_MIPS;
+        else if (streq(n, "mips64"))
+                *ret = SCMP_ARCH_MIPS64;
+        else if (streq(n, "mips64-n32"))
+                *ret = SCMP_ARCH_MIPS64N32;
+        else if (streq(n, "mips-le"))
+                *ret = SCMP_ARCH_MIPSEL;
+        else if (streq(n, "mips64-le"))
+                *ret = SCMP_ARCH_MIPSEL64;
+        else if (streq(n, "mips64-le-n32"))
+                *ret = SCMP_ARCH_MIPSEL64N32;
+        else if (streq(n, "ppc"))
+                *ret = SCMP_ARCH_PPC;
+        else if (streq(n, "ppc64"))
+                *ret = SCMP_ARCH_PPC64;
+        else if (streq(n, "ppc64-le"))
+                *ret = SCMP_ARCH_PPC64LE;
+        else if (streq(n, "s390"))
+                *ret = SCMP_ARCH_S390;
+        else if (streq(n, "s390x"))
+                *ret = SCMP_ARCH_S390X;
         else
                 return -EINVAL;
 
         return 0;
 }
 
-int seccomp_add_secondary_archs(scmp_filter_ctx *c) {
-
-#if defined(__i386__) || defined(__x86_64__)
+int seccomp_init_for_arch(scmp_filter_ctx *ret, uint32_t arch, uint32_t default_action) {
+        scmp_filter_ctx seccomp;
         int r;
 
-        /* Add in all possible secondary archs we are aware of that
-         * this kernel might support. */
+        /* Much like seccomp_init(), but initializes the filter for one specific architecture only, without affecting
+         * any others. Also, turns off the NNP fiddling. */
 
-        r = seccomp_arch_add(c, SCMP_ARCH_X86);
-        if (r < 0 && r != -EEXIST)
-                return r;
+        seccomp = seccomp_init(default_action);
+        if (!seccomp)
+                return -ENOMEM;
 
-        r = seccomp_arch_add(c, SCMP_ARCH_X86_64);
-        if (r < 0 && r != -EEXIST)
-                return r;
+        if (arch != SCMP_ARCH_NATIVE &&
+            arch != seccomp_arch_native()) {
 
-        r = seccomp_arch_add(c, SCMP_ARCH_X32);
-        if (r < 0 && r != -EEXIST)
-                return r;
+                r = seccomp_arch_remove(seccomp, seccomp_arch_native());
+                if (r < 0)
+                        goto finish;
 
-#endif
+                r = seccomp_arch_add(seccomp, arch);
+                if (r < 0)
+                        goto finish;
+
+                assert(seccomp_arch_exist(seccomp, arch) >= 0);
+                assert(seccomp_arch_exist(seccomp, SCMP_ARCH_NATIVE) == -EEXIST);
+                assert(seccomp_arch_exist(seccomp, seccomp_arch_native()) == -EEXIST);
+        } else {
+                assert(seccomp_arch_exist(seccomp, SCMP_ARCH_NATIVE) >= 0);
+                assert(seccomp_arch_exist(seccomp, seccomp_arch_native()) >= 0);
+        }
+
+        r = seccomp_attr_set(seccomp, SCMP_FLTATR_ACT_BADARCH, SCMP_ACT_ALLOW);
+        if (r < 0)
+                goto finish;
 
+        r = seccomp_attr_set(seccomp, SCMP_FLTATR_CTL_NNP, 0);
+        if (r < 0)
+                goto finish;
+
+        *ret = seccomp;
         return 0;
 
+finish:
+        seccomp_release(seccomp);
+        return r;
+}
+
+static bool is_basic_seccomp_available(void) {
+        return prctl(PR_GET_SECCOMP, 0, 0, 0, 0) >= 0;
+}
+
+static bool is_seccomp_filter_available(void) {
+        return prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL, 0, 0) < 0 &&
+                errno == EFAULT;
+}
+
+bool is_seccomp_available(void) {
+        static int cached_enabled = -1;
+
+        if (cached_enabled < 0)
+                cached_enabled =
+                        is_basic_seccomp_available() &&
+                        is_seccomp_filter_available();
+
+        return cached_enabled;
 }
 
-const SystemCallFilterSet syscall_filter_sets[] = {
-        {
-                /* Clock */
-                .set_name = "@clock",
+const SyscallFilterSet syscall_filter_sets[_SYSCALL_FILTER_SET_MAX] = {
+        [SYSCALL_FILTER_SET_DEFAULT] = {
+                .name = "@default",
+                .help = "System calls that are always permitted",
+                .value =
+                "clock_getres\0"
+                "clock_gettime\0"
+                "clock_nanosleep\0"
+                "execve\0"
+                "exit\0"
+                "exit_group\0"
+                "getrlimit\0"      /* make sure processes can query stack size and such */
+                "gettimeofday\0"
+                "nanosleep\0"
+                "pause\0"
+                "rt_sigreturn\0"
+                "sigreturn\0"
+                "time\0"
+        },
+        [SYSCALL_FILTER_SET_BASIC_IO] = {
+                .name = "@basic-io",
+                .help = "Basic IO",
+                .value =
+                "close\0"
+                "dup2\0"
+                "dup3\0"
+                "dup\0"
+                "lseek\0"
+                "pread64\0"
+                "preadv\0"
+                "pwrite64\0"
+                "pwritev\0"
+                "read\0"
+                "readv\0"
+                "write\0"
+                "writev\0"
+        },
+        [SYSCALL_FILTER_SET_CLOCK] = {
+                .name = "@clock",
+                .help = "Change the system time",
                 .value =
                 "adjtimex\0"
                 "clock_adjtime\0"
                 "clock_settime\0"
                 "settimeofday\0"
                 "stime\0"
-        }, {
-                /* CPU emulation calls */
-                .set_name = "@cpu-emulation",
+        },
+        [SYSCALL_FILTER_SET_CPU_EMULATION] = {
+                .name = "@cpu-emulation",
+                .help = "System calls for CPU emulation functionality",
                 .value =
                 "modify_ldt\0"
                 "subpage_prot\0"
                 "switch_endian\0"
                 "vm86\0"
                 "vm86old\0"
-        }, {
-                /* Debugging/Performance Monitoring/Tracing */
-                .set_name = "@debug",
+        },
+        [SYSCALL_FILTER_SET_DEBUG] = {
+                .name = "@debug",
+                .help = "Debugging, performance monitoring and tracing functionality",
                 .value =
                 "lookup_dcookie\0"
                 "perf_event_open\0"
@@ -118,20 +331,87 @@ const SystemCallFilterSet syscall_filter_sets[] = {
                 "process_vm_writev\0"
                 "ptrace\0"
                 "rtas\0"
+#ifdef __NR_s390_runtime_instr
                 "s390_runtime_instr\0"
+#endif
                 "sys_debug_setcontext\0"
-        }, {
-                /* Default list */
-                .set_name = "@default",
+        },
+        [SYSCALL_FILTER_SET_FILE_SYSTEM] = {
+                .name = "@file-system",
+                .help = "File system operations",
                 .value =
-                "execve\0"
-                "exit\0"
-                "exit_group\0"
-                "rt_sigreturn\0"
-                "sigreturn\0"
-        }, {
-                /* Event loop use */
-                .set_name = "@io-event",
+                "access\0"
+                "chdir\0"
+                "chmod\0"
+                "close\0"
+                "creat\0"
+                "faccessat\0"
+                "fallocate\0"
+                "fchdir\0"
+                "fchmod\0"
+                "fchmodat\0"
+                "fcntl64\0"
+                "fcntl\0"
+                "fgetxattr\0"
+                "flistxattr\0"
+                "fsetxattr\0"
+                "fstat64\0"
+                "fstat\0"
+                "fstatat64\0"
+                "fstatfs64\0"
+                "fstatfs\0"
+                "ftruncate64\0"
+                "ftruncate\0"
+                "futimesat\0"
+                "getcwd\0"
+                "getdents64\0"
+                "getdents\0"
+                "getxattr\0"
+                "inotify_add_watch\0"
+                "inotify_init1\0"
+                "inotify_rm_watch\0"
+                "lgetxattr\0"
+                "link\0"
+                "linkat\0"
+                "listxattr\0"
+                "llistxattr\0"
+                "lremovexattr\0"
+                "lsetxattr\0"
+                "lstat64\0"
+                "lstat\0"
+                "mkdir\0"
+                "mkdirat\0"
+                "mknod\0"
+                "mknodat\0"
+                "mmap2\0"
+                "mmap\0"
+                "munmap\0"
+                "newfstatat\0"
+                "open\0"
+                "openat\0"
+                "readlink\0"
+                "readlinkat\0"
+                "removexattr\0"
+                "rename\0"
+                "renameat2\0"
+                "renameat\0"
+                "rmdir\0"
+                "setxattr\0"
+                "stat64\0"
+                "stat\0"
+                "statfs\0"
+                "symlink\0"
+                "symlinkat\0"
+                "truncate64\0"
+                "truncate\0"
+                "unlink\0"
+                "unlinkat\0"
+                "utimensat\0"
+                "utimes\0"
+        },
+        [SYSCALL_FILTER_SET_IO_EVENT] = {
+                .name = "@io-event",
+                .help = "Event loop system calls",
                 .value =
                 "_newselect\0"
                 "epoll_create1\0"
@@ -147,10 +427,13 @@ const SystemCallFilterSet syscall_filter_sets[] = {
                 "ppoll\0"
                 "pselect6\0"
                 "select\0"
-        }, {
-                /* Message queues, SYSV IPC or other IPC: unusual */
-                .set_name = "@ipc",
-                .value = "ipc\0"
+        },
+        [SYSCALL_FILTER_SET_IPC] = {
+                .name = "@ipc",
+                .help = "SysV IPC, POSIX Message Queues or other IPC",
+                .value =
+                "ipc\0"
+                "memfd_create\0"
                 "mq_getsetattr\0"
                 "mq_notify\0"
                 "mq_open\0"
@@ -161,6 +444,8 @@ const SystemCallFilterSet syscall_filter_sets[] = {
                 "msgget\0"
                 "msgrcv\0"
                 "msgsnd\0"
+                "pipe2\0"
+                "pipe\0"
                 "process_vm_readv\0"
                 "process_vm_writev\0"
                 "semctl\0"
@@ -171,33 +456,36 @@ const SystemCallFilterSet syscall_filter_sets[] = {
                 "shmctl\0"
                 "shmdt\0"
                 "shmget\0"
-        }, {
-                /* Keyring */
-                .set_name = "@keyring",
+        },
+        [SYSCALL_FILTER_SET_KEYRING] = {
+                .name = "@keyring",
+                .help = "Kernel keyring access",
                 .value =
                 "add_key\0"
                 "keyctl\0"
                 "request_key\0"
-        }, {
-                /* Kernel module control */
-                .set_name = "@module",
+        },
+        [SYSCALL_FILTER_SET_MODULE] = {
+                .name = "@module",
+                .help = "Loading and unloading of kernel modules",
                 .value =
                 "delete_module\0"
                 "finit_module\0"
                 "init_module\0"
-        }, {
-                /* Mounting */
-                .set_name = "@mount",
+        },
+        [SYSCALL_FILTER_SET_MOUNT] = {
+                .name = "@mount",
+                .help = "Mounting and unmounting of file systems",
                 .value =
                 "chroot\0"
                 "mount\0"
-                "oldumount\0"
                 "pivot_root\0"
                 "umount2\0"
                 "umount\0"
-        }, {
-                /* Network or Unix socket IO, should not be needed if not network facing */
-                .set_name = "@network-io",
+        },
+        [SYSCALL_FILTER_SET_NETWORK_IO] = {
+                .name = "@network-io",
+                .help = "Network or Unix socket IO, should not be needed if not network facing",
                 .value =
                 "accept4\0"
                 "accept\0"
@@ -220,12 +508,15 @@ const SystemCallFilterSet syscall_filter_sets[] = {
                 "socket\0"
                 "socketcall\0"
                 "socketpair\0"
-        }, {
-                /* Unusual, obsolete or unimplemented, some unknown even to libseccomp */
-                .set_name = "@obsolete",
+        },
+        [SYSCALL_FILTER_SET_OBSOLETE] = {
+                /* some unknown even to libseccomp */
+                .name = "@obsolete",
+                .help = "Unusual, obsolete or unimplemented system calls",
                 .value =
                 "_sysctl\0"
                 "afs_syscall\0"
+                "bdflush\0"
                 "break\0"
                 "create_module\0"
                 "ftime\0"
@@ -248,15 +539,15 @@ const SystemCallFilterSet syscall_filter_sets[] = {
                 "uselib\0"
                 "ustat\0"
                 "vserver\0"
-        }, {
-                /* Nice grab-bag of all system calls which need superuser capabilities */
-                .set_name = "@privileged",
+        },
+        [SYSCALL_FILTER_SET_PRIVILEGED] = {
+                .name = "@privileged",
+                .help = "All system calls which need super-user capabilities",
                 .value =
                 "@clock\0"
                 "@module\0"
                 "@raw-io\0"
                 "acct\0"
-                "bdflush\0"
                 "bpf\0"
                 "capset\0"
                 "chown32\0"
@@ -287,15 +578,15 @@ const SystemCallFilterSet syscall_filter_sets[] = {
                 "setuid\0"
                 "swapoff\0"
                 "swapon\0"
-                "sysctl\0"
+                "_sysctl\0"
                 "vhangup\0"
-        }, {
-                /* Process control, execution, namespaces */
-                .set_name = "@process",
+        },
+        [SYSCALL_FILTER_SET_PROCESS] = {
+                .name = "@process",
+                .help = "Process control, execution, namespaceing operations",
                 .value =
                 "arch_prctl\0"
                 "clone\0"
-                "execve\0"
                 "execveat\0"
                 "fork\0"
                 "kill\0"
@@ -305,19 +596,719 @@ const SystemCallFilterSet syscall_filter_sets[] = {
                 "tkill\0"
                 "unshare\0"
                 "vfork\0"
-        }, {
-                /* Raw I/O ports */
-                .set_name = "@raw-io",
+        },
+        [SYSCALL_FILTER_SET_RAW_IO] = {
+                .name = "@raw-io",
+                .help = "Raw I/O port access",
                 .value =
                 "ioperm\0"
                 "iopl\0"
                 "pciconfig_iobase\0"
                 "pciconfig_read\0"
                 "pciconfig_write\0"
+#ifdef __NR_s390_pci_mmio_read
                 "s390_pci_mmio_read\0"
+#endif
+#ifdef __NR_s390_pci_mmio_write
                 "s390_pci_mmio_write\0"
-        }, {
-                .set_name = NULL,
-                .value = NULL
-        }
+#endif
+        },
+        [SYSCALL_FILTER_SET_REBOOT] = {
+                .name = "@reboot",
+                .help = "Reboot and reboot preparation/kexec",
+                .value =
+                "kexec\0"
+                "kexec_file_load\0"
+                "reboot\0"
+        },
+        [SYSCALL_FILTER_SET_RESOURCES] = {
+                .name = "@resources",
+                .help = "Alter resource settings",
+                .value =
+                "sched_setparam\0"
+                "sched_setscheduler\0"
+                "sched_setaffinity\0"
+                "setpriority\0"
+                "setrlimit\0"
+                "set_mempolicy\0"
+                "migrate_pages\0"
+                "move_pages\0"
+                "mbind\0"
+                "sched_setattr\0"
+                "prlimit64\0"
+        },
+        [SYSCALL_FILTER_SET_SWAP] = {
+                .name = "@swap",
+                .help = "Enable/disable swap devices",
+                .value =
+                "swapoff\0"
+                "swapon\0"
+        },
 };
+
+const SyscallFilterSet *syscall_filter_set_find(const char *name) {
+        unsigned i;
+
+        if (isempty(name) || name[0] != '@')
+                return NULL;
+
+        for (i = 0; i < _SYSCALL_FILTER_SET_MAX; i++)
+                if (streq(syscall_filter_sets[i].name, name))
+                        return syscall_filter_sets + i;
+
+        return NULL;
+}
+
+static int seccomp_add_syscall_filter_set(
+                scmp_filter_ctx seccomp,
+                uint32_t default_action,
+                const SyscallFilterSet *set,
+                uint32_t action) {
+
+        const char *sys;
+        int r;
+
+        assert(seccomp);
+        assert(set);
+
+        NULSTR_FOREACH(sys, set->value) {
+                int id;
+
+                if (sys[0] == '@') {
+                        const SyscallFilterSet *other;
+
+                        other = syscall_filter_set_find(sys);
+                        if (!other)
+                                return -EINVAL;
+
+                        r = seccomp_add_syscall_filter_set(seccomp, default_action, other, action);
+                        if (r < 0)
+                                return r;
+                } else {
+                        id = seccomp_syscall_resolve_name(sys);
+                        if (id == __NR_SCMP_ERROR)
+                                return -EINVAL; /* Not known at all? Then that's a real error */
+
+                        r = seccomp_rule_add_exact(seccomp, action, id, 0);
+                        if (r < 0)
+                                /* If the system call is not known on this architecture, then that's fine, let's ignore it */
+                                log_debug_errno(r, "Failed to add rule for system call %s, ignoring: %m", sys);
+                }
+        }
+
+        return 0;
+}
+
+int seccomp_load_syscall_filter_set(uint32_t default_action, const SyscallFilterSet *set, uint32_t action) {
+        uint32_t arch;
+        int r;
+
+        assert(set);
+
+        /* The one-stop solution: allocate a seccomp object, add the specified filter to it, and apply it. Once for
+         * earch local arch. */
+
+        SECCOMP_FOREACH_LOCAL_ARCH(arch) {
+                _cleanup_(seccomp_releasep) scmp_filter_ctx seccomp = NULL;
+
+                log_debug("Operating on architecture: %s", seccomp_arch_to_string(arch));
+
+                r = seccomp_init_for_arch(&seccomp, arch, default_action);
+                if (r < 0)
+                        return r;
+
+                r = seccomp_add_syscall_filter_set(seccomp, default_action, set, action);
+                if (r < 0) {
+                        log_debug_errno(r, "Failed to add filter set, ignoring: %m");
+                        continue;
+                }
+
+                r = seccomp_load(seccomp);
+                if (IN_SET(r, -EPERM, -EACCES))
+                        return r;
+                if (r < 0)
+                        log_debug_errno(r, "Failed to install filter set for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+        }
+
+        return 0;
+}
+
+int seccomp_load_syscall_filter_set_raw(uint32_t default_action, Set* set, uint32_t action) {
+        uint32_t arch;
+        int r;
+
+        /* Similar to seccomp_load_syscall_filter_set(), but takes a raw Set* of syscalls, instead of a
+         * SyscallFilterSet* table. */
+
+        if (set_isempty(set) && default_action == SCMP_ACT_ALLOW)
+                return 0;
+
+        SECCOMP_FOREACH_LOCAL_ARCH(arch) {
+                _cleanup_(seccomp_releasep) scmp_filter_ctx seccomp = NULL;
+                Iterator i;
+                void *id;
+
+                log_debug("Operating on architecture: %s", seccomp_arch_to_string(arch));
+
+                r = seccomp_init_for_arch(&seccomp, arch, default_action);
+                if (r < 0)
+                        return r;
+
+                SET_FOREACH(id, set, i) {
+                        r = seccomp_rule_add_exact(seccomp, action, PTR_TO_INT(id) - 1, 0);
+                        if (r < 0) {
+                                /* If the system call is not known on this architecture, then that's fine, let's ignore it */
+                                _cleanup_free_ char *n = NULL;
+
+                                n = seccomp_syscall_resolve_num_arch(arch, PTR_TO_INT(id) - 1);
+                                log_debug_errno(r, "Failed to add rule for system call %s, ignoring: %m", strna(n));
+                        }
+                }
+
+                r = seccomp_load(seccomp);
+                if (IN_SET(r, -EPERM, -EACCES))
+                        return r;
+                if (r < 0)
+                        log_debug_errno(r, "Failed to install filter set for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+        }
+
+        return 0;
+}
+
+int seccomp_restrict_namespaces(unsigned long retain) {
+        uint32_t arch;
+        int r;
+
+        if (log_get_max_level() >= LOG_DEBUG) {
+                _cleanup_free_ char *s = NULL;
+
+                (void) namespace_flag_to_string_many(retain, &s);
+                log_debug("Restricting namespace to: %s.", strna(s));
+        }
+
+        /* NOOP? */
+        if ((retain & NAMESPACE_FLAGS_ALL) == NAMESPACE_FLAGS_ALL)
+                return 0;
+
+        SECCOMP_FOREACH_LOCAL_ARCH(arch) {
+                _cleanup_(seccomp_releasep) scmp_filter_ctx seccomp = NULL;
+                unsigned i;
+
+                log_debug("Operating on architecture: %s", seccomp_arch_to_string(arch));
+
+                r = seccomp_init_for_arch(&seccomp, arch, SCMP_ACT_ALLOW);
+                if (r < 0)
+                        return r;
+
+                if ((retain & NAMESPACE_FLAGS_ALL) == 0)
+                        /* If every single kind of namespace shall be prohibited, then let's block the whole setns() syscall
+                         * altogether. */
+                        r = seccomp_rule_add_exact(
+                                        seccomp,
+                                        SCMP_ACT_ERRNO(EPERM),
+                                        SCMP_SYS(setns),
+                                        0);
+                else
+                        /* Otherwise, block only the invocations with the appropriate flags in the loop below, but also the
+                         * special invocation with a zero flags argument, right here. */
+                        r = seccomp_rule_add_exact(
+                                        seccomp,
+                                        SCMP_ACT_ERRNO(EPERM),
+                                        SCMP_SYS(setns),
+                                        1,
+                                        SCMP_A1(SCMP_CMP_EQ, 0));
+                if (r < 0) {
+                        log_debug_errno(r, "Failed to add setns() rule for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+                        continue;
+                }
+
+                for (i = 0; namespace_flag_map[i].name; i++) {
+                        unsigned long f;
+
+                        f = namespace_flag_map[i].flag;
+                        if ((retain & f) == f) {
+                                log_debug("Permitting %s.", namespace_flag_map[i].name);
+                                continue;
+                        }
+
+                        log_debug("Blocking %s.", namespace_flag_map[i].name);
+
+                        r = seccomp_rule_add_exact(
+                                        seccomp,
+                                        SCMP_ACT_ERRNO(EPERM),
+                                        SCMP_SYS(unshare),
+                                        1,
+                                        SCMP_A0(SCMP_CMP_MASKED_EQ, f, f));
+                        if (r < 0) {
+                                log_debug_errno(r, "Failed to add unshare() rule for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+                                break;
+                        }
+
+                        /* On s390/s390x the first two parameters to clone are switched */
+                        if (!IN_SET(arch, SCMP_ARCH_S390, SCMP_ARCH_S390X))
+                                r = seccomp_rule_add_exact(
+                                                seccomp,
+                                                SCMP_ACT_ERRNO(EPERM),
+                                                SCMP_SYS(clone),
+                                                1,
+                                                SCMP_A0(SCMP_CMP_MASKED_EQ, f, f));
+                        else
+                                r = seccomp_rule_add_exact(
+                                                seccomp,
+                                                SCMP_ACT_ERRNO(EPERM),
+                                                SCMP_SYS(clone),
+                                                1,
+                                                SCMP_A1(SCMP_CMP_MASKED_EQ, f, f));
+                        if (r < 0) {
+                                log_debug_errno(r, "Failed to add clone() rule for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+                                break;
+                        }
+
+                        if ((retain & NAMESPACE_FLAGS_ALL) != 0) {
+                                r = seccomp_rule_add_exact(
+                                                seccomp,
+                                                SCMP_ACT_ERRNO(EPERM),
+                                                SCMP_SYS(setns),
+                                                1,
+                                                SCMP_A1(SCMP_CMP_MASKED_EQ, f, f));
+                                if (r < 0) {
+                                        log_debug_errno(r, "Failed to add setns() rule for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+                                        break;
+                                }
+                        }
+                }
+                if (r < 0)
+                        continue;
+
+                r = seccomp_load(seccomp);
+                if (IN_SET(r, -EPERM, -EACCES))
+                        return r;
+                if (r < 0)
+                        log_debug_errno(r, "Failed to install namespace restriction rules for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+        }
+
+        return 0;
+}
+
+int seccomp_protect_sysctl(void) {
+        uint32_t arch;
+        int r;
+
+        SECCOMP_FOREACH_LOCAL_ARCH(arch) {
+                _cleanup_(seccomp_releasep) scmp_filter_ctx seccomp = NULL;
+
+                log_debug("Operating on architecture: %s", seccomp_arch_to_string(arch));
+
+                r = seccomp_init_for_arch(&seccomp, arch, SCMP_ACT_ALLOW);
+                if (r < 0)
+                        return r;
+
+                r = seccomp_rule_add_exact(
+                                seccomp,
+                                SCMP_ACT_ERRNO(EPERM),
+                                SCMP_SYS(_sysctl),
+                                0);
+                if (r < 0) {
+                        log_debug_errno(r, "Failed to add _sysctl() rule for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+                        continue;
+                }
+
+                r = seccomp_load(seccomp);
+                if (IN_SET(r, -EPERM, -EACCES))
+                        return r;
+                if (r < 0)
+                        log_debug_errno(r, "Failed to install sysctl protection rules for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+        }
+
+        return 0;
+}
+
+int seccomp_restrict_address_families(Set *address_families, bool whitelist) {
+        uint32_t arch;
+        int r;
+
+        SECCOMP_FOREACH_LOCAL_ARCH(arch) {
+                _cleanup_(seccomp_releasep) scmp_filter_ctx seccomp = NULL;
+                bool supported;
+                Iterator i;
+
+                log_debug("Operating on architecture: %s", seccomp_arch_to_string(arch));
+
+                switch (arch) {
+
+                case SCMP_ARCH_X86_64:
+                case SCMP_ARCH_X32:
+                case SCMP_ARCH_ARM:
+                case SCMP_ARCH_AARCH64:
+                case SCMP_ARCH_PPC64:
+                case SCMP_ARCH_PPC64LE:
+                        /* These we know we support (i.e. are the ones that do not use socketcall()) */
+                        supported = true;
+                        break;
+
+                case SCMP_ARCH_S390:
+                case SCMP_ARCH_S390X:
+                case SCMP_ARCH_PPC:
+                case SCMP_ARCH_X86:
+                default:
+                        /* These we either know we don't support (i.e. are the ones that do use socketcall()), or we
+                         * don't know */
+                        supported = false;
+                        break;
+                }
+
+                if (!supported)
+                        continue;
+
+                r = seccomp_init_for_arch(&seccomp, arch, SCMP_ACT_ALLOW);
+                if (r < 0)
+                        return r;
+
+                if (whitelist) {
+                        int af, first = 0, last = 0;
+                        void *afp;
+
+                        /* If this is a whitelist, we first block the address families that are out of range and then
+                         * everything that is not in the set. First, we find the lowest and highest address family in
+                         * the set. */
+
+                        SET_FOREACH(afp, address_families, i) {
+                                af = PTR_TO_INT(afp);
+
+                                if (af <= 0 || af >= af_max())
+                                        continue;
+
+                                if (first == 0 || af < first)
+                                        first = af;
+
+                                if (last == 0 || af > last)
+                                        last = af;
+                        }
+
+                        assert((first == 0) == (last == 0));
+
+                        if (first == 0) {
+
+                                /* No entries in the valid range, block everything */
+                                r = seccomp_rule_add_exact(
+                                                seccomp,
+                                                SCMP_ACT_ERRNO(EAFNOSUPPORT),
+                                                SCMP_SYS(socket),
+                                                0);
+                                if (r < 0) {
+                                        log_debug_errno(r, "Failed to add socket() rule for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+                                        continue;
+                                }
+
+                        } else {
+
+                                /* Block everything below the first entry */
+                                r = seccomp_rule_add_exact(
+                                                seccomp,
+                                                SCMP_ACT_ERRNO(EAFNOSUPPORT),
+                                                SCMP_SYS(socket),
+                                                1,
+                                                SCMP_A0(SCMP_CMP_LT, first));
+                                if (r < 0) {
+                                        log_debug_errno(r, "Failed to add socket() rule for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+                                        continue;
+                                }
+
+                                /* Block everything above the last entry */
+                                r = seccomp_rule_add_exact(
+                                                seccomp,
+                                                SCMP_ACT_ERRNO(EAFNOSUPPORT),
+                                                SCMP_SYS(socket),
+                                                1,
+                                                SCMP_A0(SCMP_CMP_GT, last));
+                                if (r < 0) {
+                                        log_debug_errno(r, "Failed to add socket() rule for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+                                        continue;
+                                }
+
+                                /* Block everything between the first and last entry */
+                                for (af = 1; af < af_max(); af++) {
+
+                                        if (set_contains(address_families, INT_TO_PTR(af)))
+                                                continue;
+
+                                        r = seccomp_rule_add_exact(
+                                                        seccomp,
+                                                        SCMP_ACT_ERRNO(EAFNOSUPPORT),
+                                                        SCMP_SYS(socket),
+                                                        1,
+                                                        SCMP_A0(SCMP_CMP_EQ, af));
+                                        if (r < 0)
+                                                break;
+                                }
+
+                                if (r < 0) {
+                                        log_debug_errno(r, "Failed to add socket() rule for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+                                        continue;
+                                }
+                        }
+
+                } else {
+                        void *af;
+
+                        /* If this is a blacklist, then generate one rule for
+                         * each address family that are then combined in OR
+                         * checks. */
+
+                        SET_FOREACH(af, address_families, i) {
+
+                                r = seccomp_rule_add_exact(
+                                                seccomp,
+                                                SCMP_ACT_ERRNO(EAFNOSUPPORT),
+                                                SCMP_SYS(socket),
+                                                1,
+                                                SCMP_A0(SCMP_CMP_EQ, PTR_TO_INT(af)));
+                                if (r < 0)
+                                        break;
+                        }
+
+                        if (r < 0) {
+                                log_debug_errno(r, "Failed to add socket() rule for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+                                continue;
+                        }
+                }
+
+                r = seccomp_load(seccomp);
+                if (IN_SET(r, -EPERM, -EACCES))
+                        return r;
+                if (r < 0)
+                        log_debug_errno(r, "Failed to install socket family rules for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+        }
+
+        return 0;
+}
+
+int seccomp_restrict_realtime(void) {
+        static const int permitted_policies[] = {
+                SCHED_OTHER,
+                SCHED_BATCH,
+                SCHED_IDLE,
+        };
+
+        int r, max_policy = 0;
+        uint32_t arch;
+        unsigned i;
+
+        /* Determine the highest policy constant we want to allow */
+        for (i = 0; i < ELEMENTSOF(permitted_policies); i++)
+                if (permitted_policies[i] > max_policy)
+                        max_policy = permitted_policies[i];
+
+        SECCOMP_FOREACH_LOCAL_ARCH(arch) {
+                _cleanup_(seccomp_releasep) scmp_filter_ctx seccomp = NULL;
+                int p;
+
+                log_debug("Operating on architecture: %s", seccomp_arch_to_string(arch));
+
+                r = seccomp_init_for_arch(&seccomp, arch, SCMP_ACT_ALLOW);
+                if (r < 0)
+                        return r;
+
+                /* Go through all policies with lower values than that, and block them -- unless they appear in the
+                 * whitelist. */
+                for (p = 0; p < max_policy; p++) {
+                        bool good = false;
+
+                        /* Check if this is in the whitelist. */
+                        for (i = 0; i < ELEMENTSOF(permitted_policies); i++)
+                                if (permitted_policies[i] == p) {
+                                        good = true;
+                                        break;
+                                }
+
+                        if (good)
+                                continue;
+
+                        /* Deny this policy */
+                        r = seccomp_rule_add_exact(
+                                        seccomp,
+                                        SCMP_ACT_ERRNO(EPERM),
+                                        SCMP_SYS(sched_setscheduler),
+                                        1,
+                                        SCMP_A1(SCMP_CMP_EQ, p));
+                        if (r < 0) {
+                                log_debug_errno(r, "Failed to add scheduler rule for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+                                continue;
+                        }
+                }
+
+                /* Blacklist all other policies, i.e. the ones with higher values. Note that all comparisons are
+                 * unsigned here, hence no need no check for < 0 values. */
+                r = seccomp_rule_add_exact(
+                                seccomp,
+                                SCMP_ACT_ERRNO(EPERM),
+                                SCMP_SYS(sched_setscheduler),
+                                1,
+                                SCMP_A1(SCMP_CMP_GT, max_policy));
+                if (r < 0) {
+                        log_debug_errno(r, "Failed to add scheduler rule for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+                        continue;
+                }
+
+                r = seccomp_load(seccomp);
+                if (IN_SET(r, -EPERM, -EACCES))
+                        return r;
+                if (r < 0)
+                        log_debug_errno(r, "Failed to install realtime protection rules for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+        }
+
+        return 0;
+}
+
+static int add_seccomp_syscall_filter(scmp_filter_ctx seccomp,
+                                      uint32_t arch,
+                                      int nr,
+                                      unsigned int arg_cnt,
+                                      const struct scmp_arg_cmp arg) {
+        int r;
+
+        r = seccomp_rule_add_exact(seccomp, SCMP_ACT_ERRNO(EPERM), nr, arg_cnt, arg);
+        if (r < 0) {
+                _cleanup_free_ char *n = NULL;
+
+                n = seccomp_syscall_resolve_num_arch(arch, nr);
+                log_debug_errno(r, "Failed to add %s() rule for architecture %s, skipping: %m",
+                                strna(n),
+                                seccomp_arch_to_string(arch));
+        }
+
+        return r;
+}
+
+/* For known architectures, check that syscalls are indeed defined or not. */
+#if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__)
+assert_cc(SCMP_SYS(shmget) > 0);
+assert_cc(SCMP_SYS(shmat) > 0);
+assert_cc(SCMP_SYS(shmdt) > 0);
+#elif defined(__i386__) || defined(__powerpc64__)
+assert_cc(SCMP_SYS(shmget) < 0);
+assert_cc(SCMP_SYS(shmat) < 0);
+assert_cc(SCMP_SYS(shmdt) < 0);
+#endif
+
+int seccomp_memory_deny_write_execute(void) {
+
+        uint32_t arch;
+        int r;
+
+        SECCOMP_FOREACH_LOCAL_ARCH(arch) {
+                _cleanup_(seccomp_releasep) scmp_filter_ctx seccomp = NULL;
+                int filter_syscall = 0, block_syscall = 0, shmat_syscall = 0;
+
+                log_debug("Operating on architecture: %s", seccomp_arch_to_string(arch));
+
+                switch (arch) {
+
+                case SCMP_ARCH_X86:
+                        filter_syscall = SCMP_SYS(mmap2);
+                        block_syscall = SCMP_SYS(mmap);
+                        break;
+
+                case SCMP_ARCH_PPC64:
+                case SCMP_ARCH_PPC64LE:
+                        filter_syscall = SCMP_SYS(mmap);
+
+                        /* Note that shmat() isn't available, and the call is multiplexed through ipc().
+                         * We ignore that here, which means there's still a way to get writable/executable
+                         * memory, if an IPC key is mapped like this. That's a pity, but no total loss. */
+
+                        break;
+
+                case SCMP_ARCH_AARCH64:
+                        block_syscall = SCMP_SYS(mmap);
+                        /* fall through */
+
+                case SCMP_ARCH_ARM:
+                        filter_syscall = SCMP_SYS(mmap2); /* arm has only mmap2 */
+                        shmat_syscall = SCMP_SYS(shmat);
+                        break;
+
+                case SCMP_ARCH_X86_64:
+                case SCMP_ARCH_X32:
+                        filter_syscall = SCMP_SYS(mmap); /* amd64 and x32 have only mmap */
+                        shmat_syscall = SCMP_SYS(shmat);
+                        break;
+
+                /* Please add more definitions here, if you port systemd to other architectures! */
+
+#if !defined(__i386__) && !defined(__x86_64__) && !defined(__powerpc64__) && !defined(__arm__) && !defined(__aarch64__)
+#warning "Consider adding the right mmap() syscall definitions here!"
+#endif
+                }
+
+                /* Can't filter mmap() on this arch, then skip it */
+                if (filter_syscall == 0)
+                        continue;
+
+                r = seccomp_init_for_arch(&seccomp, arch, SCMP_ACT_ALLOW);
+                if (r < 0)
+                        return r;
+
+                r = add_seccomp_syscall_filter(seccomp, arch, filter_syscall,
+                                               1,
+                                               SCMP_A2(SCMP_CMP_MASKED_EQ, PROT_EXEC|PROT_WRITE, PROT_EXEC|PROT_WRITE));
+                if (r < 0)
+                        continue;
+
+                if (block_syscall != 0) {
+                        r = add_seccomp_syscall_filter(seccomp, arch, block_syscall, 0, (const struct scmp_arg_cmp){} );
+                        if (r < 0)
+                                continue;
+                }
+
+                r = add_seccomp_syscall_filter(seccomp, arch, SCMP_SYS(mprotect),
+                                               1,
+                                               SCMP_A2(SCMP_CMP_MASKED_EQ, PROT_EXEC, PROT_EXEC));
+                if (r < 0)
+                        continue;
+
+                if (shmat_syscall != 0) {
+                        r = add_seccomp_syscall_filter(seccomp, arch, SCMP_SYS(shmat),
+                                                       1,
+                                                       SCMP_A2(SCMP_CMP_MASKED_EQ, SHM_EXEC, SHM_EXEC));
+                        if (r < 0)
+                                continue;
+                }
+
+                r = seccomp_load(seccomp);
+                if (IN_SET(r, -EPERM, -EACCES))
+                        return r;
+                if (r < 0)
+                        log_debug_errno(r, "Failed to install MemoryDenyWriteExecute= rule for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+        }
+
+        return 0;
+}
+
+int seccomp_restrict_archs(Set *archs) {
+        _cleanup_(seccomp_releasep) scmp_filter_ctx seccomp = NULL;
+        Iterator i;
+        void *id;
+        int r;
+
+        /* This installs a filter with no rules, but that restricts the system call architectures to the specified
+         * list. */
+
+        seccomp = seccomp_init(SCMP_ACT_ALLOW);
+        if (!seccomp)
+                return -ENOMEM;
+
+        SET_FOREACH(id, archs, i) {
+                r = seccomp_arch_add(seccomp, PTR_TO_UINT32(id) - 1);
+                if (r == -EEXIST)
+                        continue;
+                if (r < 0)
+                        return r;
+        }
+
+        r = seccomp_attr_set(seccomp, SCMP_FLTATR_CTL_NNP, 0);
+        if (r < 0)
+                return r;
+
+        return seccomp_load(seccomp);
+}
index be33eec..4438e87 100644 (file)
 ***/
 
 #include <seccomp.h>
+#include <stdbool.h>
 #include <stdint.h>
 
+#include "set.h"
+
 const char* seccomp_arch_to_string(uint32_t c);
 int seccomp_arch_from_string(const char *n, uint32_t *ret);
 
-int seccomp_add_secondary_archs(scmp_filter_ctx *c);
+int seccomp_init_for_arch(scmp_filter_ctx *ret, uint32_t arch, uint32_t default_action);
+
+bool is_seccomp_available(void);
 
-typedef struct SystemCallFilterSet {
-        const char *set_name;
+typedef struct SyscallFilterSet {
+        const char *name;
+        const char *help;
         const char *value;
-} SystemCallFilterSet;
+} SyscallFilterSet;
+
+enum {
+        /* Please leave DEFAULT first, but sort the rest alphabetically */
+        SYSCALL_FILTER_SET_DEFAULT,
+        SYSCALL_FILTER_SET_BASIC_IO,
+        SYSCALL_FILTER_SET_CLOCK,
+        SYSCALL_FILTER_SET_CPU_EMULATION,
+        SYSCALL_FILTER_SET_DEBUG,
+        SYSCALL_FILTER_SET_FILE_SYSTEM,
+        SYSCALL_FILTER_SET_IO_EVENT,
+        SYSCALL_FILTER_SET_IPC,
+        SYSCALL_FILTER_SET_KEYRING,
+        SYSCALL_FILTER_SET_MODULE,
+        SYSCALL_FILTER_SET_MOUNT,
+        SYSCALL_FILTER_SET_NETWORK_IO,
+        SYSCALL_FILTER_SET_OBSOLETE,
+        SYSCALL_FILTER_SET_PRIVILEGED,
+        SYSCALL_FILTER_SET_PROCESS,
+        SYSCALL_FILTER_SET_RAW_IO,
+        SYSCALL_FILTER_SET_REBOOT,
+        SYSCALL_FILTER_SET_RESOURCES,
+        SYSCALL_FILTER_SET_SWAP,
+        _SYSCALL_FILTER_SET_MAX
+};
+
+extern const SyscallFilterSet syscall_filter_sets[];
+
+const SyscallFilterSet *syscall_filter_set_find(const char *name);
+
+int seccomp_load_syscall_filter_set(uint32_t default_action, const SyscallFilterSet *set, uint32_t action);
+int seccomp_load_syscall_filter_set_raw(uint32_t default_action, Set* set, uint32_t action);
+
+int seccomp_restrict_archs(Set *archs);
+int seccomp_restrict_namespaces(unsigned long retain);
+int seccomp_protect_sysctl(void);
+int seccomp_restrict_address_families(Set *address_families, bool whitelist);
+int seccomp_restrict_realtime(void);
+int seccomp_memory_deny_write_execute(void);
+
+extern const uint32_t seccomp_local_archs[];
+
+#define SECCOMP_FOREACH_LOCAL_ARCH(arch) \
+        for (unsigned _i = ({ (arch) = seccomp_local_archs[0]; 0; });   \
+             seccomp_local_archs[_i] != (uint32_t) -1;                  \
+             (arch) = seccomp_local_archs[++_i])
 
-extern const SystemCallFilterSet syscall_filter_sets[];
+DEFINE_TRIVIAL_CLEANUP_FUNC(scmp_filter_ctx, seccomp_release);
index f00624d..8c1624f 100644 (file)
@@ -58,10 +58,10 @@ int parse_sleep_config(const char *verb, char ***_modes, char ***_states) {
                 {}
         };
 
-        config_parse_many(PKGSYSCONFDIR "/sleep.conf",
-                          CONF_PATHS_NULSTR("systemd/sleep.conf.d"),
-                          "Sleep\0", config_item_table_lookup, items,
-                          false, NULL);
+        config_parse_many_nulstr(PKGSYSCONFDIR "/sleep.conf",
+                                 CONF_PATHS_NULSTR("systemd/sleep.conf.d"),
+                                 "Sleep\0", config_item_table_lookup, items,
+                                 false, NULL);
 
         if (streq(verb, "suspend")) {
                 /* empty by default */
index 47d3a5a..afdf1ab 100644 (file)
 
 #include "base-filesystem.h"
 #include "fd-util.h"
+#include "fs-util.h"
 #include "log.h"
 #include "missing.h"
 #include "mkdir.h"
+#include "mount-util.h"
 #include "path-util.h"
 #include "rm-rf.h"
 #include "stdio-util.h"
 #include "string-util.h"
+#include "strv.h"
 #include "switch-root.h"
 #include "user-util.h"
 #include "util.h"
 
-int switch_root(const char *new_root, const char *oldroot, bool detach_oldroot,  unsigned long mountflags) {
-
-        /*  Don't try to unmount/move the old "/", there's no way to do it. */
-        static const char move_mounts[] =
-                "/dev\0"
-                "/proc\0"
-                "/sys\0"
-                "/run\0";
+int switch_root(const char *new_root,
+                const char *old_root_after, /* path below the new root, where to place the old root after the transition */
+                bool unmount_old_root,
+                unsigned long mount_flags) {  /* MS_MOVE or MS_BIND */
 
+        _cleanup_free_ char *resolved_old_root_after = NULL;
         _cleanup_close_ int old_root_fd = -1;
-        struct stat new_root_stat;
         bool old_root_remove;
-        const char *i, *temporary_old_root;
+        const char *i;
+        int r;
+
+        assert(new_root);
+        assert(old_root_after);
 
         if (path_equal(new_root, "/"))
                 return 0;
 
-        temporary_old_root = strjoina(new_root, oldroot);
-        mkdir_p_label(temporary_old_root, 0755);
-
+        /* Check if we shall remove the contents of the old root */
         old_root_remove = in_initrd();
+        if (old_root_remove) {
+                old_root_fd = open("/", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_NOCTTY|O_DIRECTORY);
+                if (old_root_fd < 0)
+                        return log_error_errno(errno, "Failed to open root directory: %m");
+        }
 
-        if (stat(new_root, &new_root_stat) < 0)
-                return log_error_errno(errno, "Failed to stat directory %s: %m", new_root);
+        /* Determine where we shall place the old root after the transition */
+        r = chase_symlinks(old_root_after, new_root, CHASE_PREFIX_ROOT|CHASE_NONEXISTENT, &resolved_old_root_after);
+        if (r < 0)
+                return log_error_errno(r, "Failed to resolve %s/%s: %m", new_root, old_root_after);
+        if (r == 0) /* Doesn't exist yet. Let's create it */
+                (void) mkdir_p_label(resolved_old_root_after, 0755);
 
-        /* Work-around for kernel design: the kernel refuses switching
-         * root if any file systems are mounted MS_SHARED. Hence
+        /* Work-around for kernel design: the kernel refuses MS_MOVE if any file systems are mounted MS_SHARED. Hence
          * remount them MS_PRIVATE here as a work-around.
          *
          * https://bugzilla.redhat.com/show_bug.cgi?id=847418 */
         if (mount(NULL, "/", NULL, MS_REC|MS_PRIVATE, NULL) < 0)
-                log_warning_errno(errno, "Failed to make \"/\" private mount: %m");
-
-        NULSTR_FOREACH(i, move_mounts) {
-                char new_mount[PATH_MAX];
-                struct stat sb;
-
-                xsprintf(new_mount, "%s%s", new_root, i);
-
-                mkdir_p_label(new_mount, 0755);
-
-                if ((stat(new_mount, &sb) < 0) ||
-                    sb.st_dev != new_root_stat.st_dev) {
-
-                        /* Mount point seems to be mounted already or
-                         * stat failed. Unmount the old mount
-                         * point. */
-                        if (umount2(i, MNT_DETACH) < 0)
-                                log_warning_errno(errno, "Failed to unmount %s: %m", i);
-                        continue;
-                }
-
-                if (mount(i, new_mount, NULL, mountflags, NULL) < 0) {
-                        if (mountflags & MS_MOVE) {
-                                log_error_errno(errno, "Failed to move mount %s to %s, forcing unmount: %m", i, new_mount);
-
-                                if (umount2(i, MNT_FORCE) < 0)
-                                        log_warning_errno(errno, "Failed to unmount %s: %m", i);
-                        }
-                        if (mountflags & MS_BIND)
-                                log_error_errno(errno, "Failed to bind mount %s to %s: %m", i, new_mount);
-
-                }
+                return log_error_errno(errno, "Failed to set \"/\" mount propagation to private: %m");
+
+        FOREACH_STRING(i, "/sys", "/dev", "/run", "/proc") {
+                _cleanup_free_ char *chased = NULL;
+
+                r = chase_symlinks(i, new_root, CHASE_PREFIX_ROOT|CHASE_NONEXISTENT, &chased);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to resolve %s/%s: %m", new_root, i);
+                if (r > 0) {
+                        /* Already exists. Let's see if it is a mount point already. */
+                        r = path_is_mount_point(chased, NULL, 0);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to determine whether %s is a mount point: %m", chased);
+                        if (r > 0) /* If it is already mounted, then do nothing */
+                                continue;
+                } else
+                         /* Doesn't exist yet? */
+                        (void) mkdir_p_label(chased, 0755);
+
+                if (mount(i, chased, NULL, mount_flags, NULL) < 0)
+                        return log_error_errno(r, "Failed to mount %s to %s: %m", i, chased);
         }
 
-        /* Do not fail, if base_filesystem_create() fails. Not all
-         * switch roots are like base_filesystem_create() wants them
-         * 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. */
+        /* Do not fail if base_filesystem_create() fails. Not all switch roots are like base_filesystem_create() wants
+         * them 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, UID_INVALID, GID_INVALID);
 
         if (chdir(new_root) < 0)
                 return log_error_errno(errno, "Failed to change directory to %s: %m", new_root);
 
-        if (old_root_remove) {
-                old_root_fd = open("/", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_NOCTTY|O_DIRECTORY);
-                if (old_root_fd < 0)
-                        log_warning_errno(errno, "Failed to open root directory: %m");
-        }
-
-        /* We first try a pivot_root() so that we can umount the old
-         * root dir. In many cases (i.e. where rootfs is /), that's
-         * not possible however, and hence we simply overmount root */
-        if (pivot_root(new_root, temporary_old_root) >= 0) {
+        /* We first try a pivot_root() so that we can umount the old root dir. In many cases (i.e. where rootfs is /),
+         * that's not possible however, and hence we simply overmount root */
+        if (pivot_root(new_root, resolved_old_root_after) >= 0) {
 
                 /* Immediately get rid of the old root, if detach_oldroot is set.
                  * Since we are running off it we need to do this lazily. */
-                if (detach_oldroot && umount2(oldroot, MNT_DETACH) < 0)
-                        log_error_errno(errno, "Failed to lazily umount old root dir %s, %s: %m",
-                                  oldroot,
-                                  errno == ENOENT ? "ignoring" : "leaving it around");
+                if (unmount_old_root) {
+                        r = umount_recursive(old_root_after, MNT_DETACH);
+                        if (r < 0)
+                                log_warning_errno(r, "Failed to unmount old root directory tree, ignoring: %m");
+                }
 
         } else if (mount(new_root, "/", NULL, MS_MOVE, NULL) < 0)
-                return log_error_errno(errno, "Failed to mount moving %s to /: %m", new_root);
+                return log_error_errno(errno, "Failed to move %s to /: %m", new_root);
 
         if (chroot(".") < 0)
                 return log_error_errno(errno, "Failed to change root: %m");
index 4091162..f300bbc 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+#include <alloc-util.h>
+#include <fs-util.h>
+#include <libgen.h>
 #include <stdlib.h>
 #include <util.h>
 
 #include "tests.h"
+#include "path-util.h"
 
 char* setup_fake_runtime_dir(void) {
         char t[] = "/tmp/fake-xdg-runtime-XXXXXX", *p;
@@ -31,3 +35,39 @@ char* setup_fake_runtime_dir(void) {
 
         return p;
 }
+
+const char* get_testdata_dir(const char *suffix) {
+        const char *env;
+        /* convenience: caller does not need to free result */
+        static char testdir[PATH_MAX];
+
+        /* if the env var is set, use that */
+        env = getenv("SYSTEMD_TEST_DATA");
+        testdir[sizeof(testdir) - 1] = '\0';
+        if (env) {
+                if (access(env, F_OK) < 0) {
+                        fputs("ERROR: $SYSTEMD_TEST_DATA directory does not exist\n", stderr);
+                        exit(1);
+                }
+                strncpy(testdir, env, sizeof(testdir) - 1);
+        } else {
+                _cleanup_free_ char *exedir = NULL;
+                assert_se(readlink_and_make_absolute("/proc/self/exe", &exedir) >= 0);
+
+                /* Check if we're running from the builddir. If so, use the compiled in path. */
+                if (path_startswith(exedir, ABS_BUILD_DIR))
+                        assert_se(snprintf(testdir, sizeof(testdir), "%s/test", ABS_SRC_DIR) > 0);
+                else
+                        /* Try relative path, according to the install-test layout */
+                        assert_se(snprintf(testdir, sizeof(testdir), "%s/testdata", dirname(exedir)) > 0);
+
+                /* test this without the suffix, as it may contain a glob */
+                if (access(testdir, F_OK) < 0) {
+                        fputs("ERROR: Cannot find testdata directory, set $SYSTEMD_TEST_DATA\n", stderr);
+                        exit(1);
+                }
+        }
+
+        strncpy(testdir + strlen(testdir), suffix, sizeof(testdir) - strlen(testdir) - 1);
+        return testdir;
+}
index 93f0901..7055124 100644 (file)
@@ -20,3 +20,4 @@
 ***/
 
 char* setup_fake_runtime_dir(void);
+const char* get_testdata_dir(const char *suffix);
diff --git a/src/shared/udev-util.c b/src/shared/udev-util.c
new file mode 100644 (file)
index 0000000..f708dcf
--- /dev/null
@@ -0,0 +1,56 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2017 Zbigniew Jędrzejewski-Szmek
+
+  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 <string.h>
+
+#include "fileio.h"
+#include "log.h"
+#include "string-util.h"
+#include "udev-util.h"
+
+int udev_parse_config(void) {
+        _cleanup_free_ char *val = NULL;
+        const char *log;
+        size_t n;
+        int r;
+
+        r = parse_env_file("/etc/udev/udev.conf", NEWLINE, "udev_log", &val, NULL);
+        if (r == -ENOENT || !val)
+                return 0;
+        if (r < 0)
+                return r;
+
+        /* unquote */
+        n = strlen(val);
+        if (n >= 2 &&
+            ((val[0] == '"' && val[n-1] == '"') ||
+             (val[0] == '\'' && val[n-1] == '\''))) {
+                val[n - 1] = '\0';
+                log = val + 1;
+        } else
+                log = val;
+
+        /* we set the udev log level here explicitly, this is supposed
+         * to regulate the code in libudev/ and udev/. */
+        r = log_set_max_level_from_string_realm(LOG_REALM_UDEV, log);
+        if (r < 0)
+                log_debug_errno(r, "/etc/udev/udev.conf: failed to set udev log level '%s', ignoring: %m", log);
+
+        return 0;
+}
index ca0889f..a415be2 100644 (file)
@@ -42,3 +42,5 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(struct udev_monitor*, udev_monitor_unref);
 #define _cleanup_udev_ctrl_msg_unref_ _cleanup_(udev_ctrl_msg_unrefp)
 #define _cleanup_udev_monitor_unref_ _cleanup_(udev_monitor_unrefp)
 #define _cleanup_udev_list_cleanup_ _cleanup_(udev_list_cleanup)
+
+int udev_parse_config(void);
index 78d66dd..1edd96f 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include "vlan-util.h"
-#include "parse-util.h"
 #include "conf-parser.h"
+#include "parse-util.h"
+#include "string-util.h"
+#include "vlan-util.h"
 
 int parse_vlanid(const char *p, uint16_t *ret) {
         uint16_t id;
@@ -35,6 +36,32 @@ int parse_vlanid(const char *p, uint16_t *ret) {
         return 0;
 }
 
+int config_parse_default_port_vlanid(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+        uint16_t *id = data;
+
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        if (streq(rvalue, "none")) {
+                *id = 0;
+                return 0;
+        }
+
+        return config_parse_vlanid(unit, filename, line, section, section_line,
+                                   lvalue, ltype, rvalue, data, userdata);
+}
+
 int config_parse_vlanid(
                 const char *unit,
                 const char *filename,
index ce6763b..365ed14 100644 (file)
@@ -32,4 +32,5 @@ static inline bool vlanid_is_valid(uint16_t id) {
 
 int parse_vlanid(const char *p, uint16_t *ret);
 
+int config_parse_default_port_vlanid(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_vlanid(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
diff --git a/src/shared/volatile-util.c b/src/shared/volatile-util.c
new file mode 100644 (file)
index 0000000..e7e9721
--- /dev/null
@@ -0,0 +1,68 @@
+/***
+  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 "alloc-util.h"
+#include "macro.h"
+#include "parse-util.h"
+#include "proc-cmdline.h"
+#include "string-util.h"
+#include "volatile-util.h"
+
+VolatileMode volatile_mode_from_string(const char *s) {
+        int b;
+
+        if (isempty(s))
+                return _VOLATILE_MODE_INVALID;
+
+        b = parse_boolean(s);
+        if (b > 0)
+                return VOLATILE_YES;
+        if (b == 0)
+                return VOLATILE_NO;
+
+        if (streq(s, "state"))
+                return VOLATILE_STATE;
+
+        return _VOLATILE_MODE_INVALID;
+}
+
+int query_volatile_mode(VolatileMode *ret) {
+        _cleanup_free_ char *mode = NULL;
+        VolatileMode m = VOLATILE_NO;
+        int r;
+
+        r = proc_cmdline_get_key("systemd.volatile", PROC_CMDLINE_VALUE_OPTIONAL, &mode);
+        if (r < 0)
+                return r;
+        if (r == 0)
+                goto finish;
+
+        if (mode) {
+                m = volatile_mode_from_string(mode);
+                if (m < 0)
+                        return -EINVAL;
+        } else
+                m = VOLATILE_YES;
+
+        r = 1;
+
+finish:
+        *ret = m;
+        return r;
+}
diff --git a/src/shared/volatile-util.h b/src/shared/volatile-util.h
new file mode 100644 (file)
index 0000000..17930ba
--- /dev/null
@@ -0,0 +1,32 @@
+#pragma once
+
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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/>.
+***/
+
+typedef enum VolatileMode {
+        VOLATILE_NO,
+        VOLATILE_YES,
+        VOLATILE_STATE,
+        _VOLATILE_MODE_MAX,
+        _VOLATILE_MODE_INVALID = -1
+} VolatileMode;
+
+VolatileMode volatile_mode_from_string(const char *s);
+
+int query_volatile_mode(VolatileMode *ret);
index c8f0742..3bac78b 100644 (file)
@@ -25,6 +25,7 @@
 #include "sd-messages.h"
 
 #include "def.h"
+#include "exec-util.h"
 #include "fd-util.h"
 #include "fileio.h"
 #include "log.h"
@@ -106,10 +107,10 @@ static int execute(char **modes, char **states) {
         if (r < 0)
                 return r;
 
-        execute_directories(dirs, DEFAULT_TIMEOUT_USEC, arguments);
+        execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL, NULL, arguments);
 
         log_struct(LOG_INFO,
-                   LOG_MESSAGE_ID(SD_MESSAGE_SLEEP_START),
+                   "MESSAGE_ID=" SD_MESSAGE_SLEEP_START_STR,
                    LOG_MESSAGE("Suspending system..."),
                    "SLEEP=%s", arg_verb,
                    NULL);
@@ -119,13 +120,13 @@ static int execute(char **modes, char **states) {
                 return r;
 
         log_struct(LOG_INFO,
-                   LOG_MESSAGE_ID(SD_MESSAGE_SLEEP_STOP),
+                   "MESSAGE_ID=" SD_MESSAGE_SLEEP_STOP_STR,
                    LOG_MESSAGE("System resumed."),
                    "SLEEP=%s", arg_verb,
                    NULL);
 
         arguments[1] = (char*) "post";
-        execute_directories(dirs, DEFAULT_TIMEOUT_USEC, arguments);
+        execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL, NULL, arguments);
 
         return r;
 }
index 52b4db8..1b99b7b 100644 (file)
 #include "set.h"
 #include "socket-util.h"
 #include "string-util.h"
+#include "parse-util.h"
 #include "util.h"
 
 #define BUFFER_SIZE (256 * 1024)
-#define CONNECTIONS_MAX 256
+static unsigned arg_connections_max = 256;
 
 static const char *arg_remote_host = NULL;
 
@@ -445,7 +446,7 @@ static int add_connection_socket(Context *context, int fd) {
         assert(context);
         assert(fd >= 0);
 
-        if (set_size(context->connections) > CONNECTIONS_MAX) {
+        if (set_size(context->connections) > arg_connections_max) {
                 log_warning("Hit connection limit, refusing connection.");
                 safe_close(fd);
                 return 0;
@@ -563,6 +564,7 @@ static void help(void) {
         printf("%1$s [HOST:PORT]\n"
                "%1$s [SOCKET]\n\n"
                "Bidirectionally proxy local sockets to another (possibly remote) socket.\n\n"
+               "  -c --connections-max=  Set the maximum number of connections to be accepted\n"
                "  -h --help              Show this help\n"
                "     --version           Show package version\n",
                program_invocation_short_name);
@@ -576,17 +578,18 @@ static int parse_argv(int argc, char *argv[]) {
         };
 
         static const struct option options[] = {
-                { "help",       no_argument, NULL, 'h'           },
-                { "version",    no_argument, NULL, ARG_VERSION   },
+                { "connections-max", required_argument, NULL, 'c'           },
+                { "help",            no_argument,       NULL, 'h'           },
+                { "version",         no_argument,       NULL, ARG_VERSION   },
                 {}
         };
 
-        int c;
+        int c, r;
 
         assert(argc >= 0);
         assert(argv);
 
-        while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0)
+        while ((c = getopt_long(argc, argv, "c:h", options, NULL)) >= 0)
 
                 switch (c) {
 
@@ -594,6 +597,20 @@ static int parse_argv(int argc, char *argv[]) {
                         help();
                         return 0;
 
+                case 'c':
+                        r = safe_atou(optarg, &arg_connections_max);
+                        if (r < 0) {
+                                log_error("Failed to parse --connections-max= argument: %s", optarg);
+                                return r;
+                        }
+
+                        if (arg_connections_max < 1) {
+                                log_error("Connection limit is too low.");
+                                return -EINVAL;
+                        }
+
+                        break;
+
                 case ARG_VERSION:
                         return version();
 
index ce8efce..097f8c1 100644 (file)
@@ -115,7 +115,7 @@ int main(int argc, char *argv[]) {
                 in_fd = SD_LISTEN_FDS_START;
                 out_fd = SD_LISTEN_FDS_START;
         } else {
-                log_error("Illegal number of file descriptors passed\n");
+                log_error("Illegal number of file descriptors passed.");
                 goto finish;
         }
 
@@ -190,7 +190,7 @@ int main(int argc, char *argv[]) {
         }
 
         for (;;) {
-                _cleanup_(sd_bus_message_unrefp)sd_bus_message *m = NULL;
+                _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
                 int events_a, events_b, fd;
                 uint64_t timeout_a, timeout_b, t;
                 struct timespec _ts, *ts;
@@ -292,7 +292,7 @@ int main(int argc, char *argv[]) {
                         r = ppoll(p, ELEMENTSOF(p), ts, NULL);
                 }
                 if (r < 0) {
-                        log_error("ppoll() failed: %m");
+                        log_error_errno(errno, "ppoll() failed: %m");
                         goto finish;
                 }
         }
diff --git a/src/sulogin-shell/.gitignore b/src/sulogin-shell/.gitignore
new file mode 100644 (file)
index 0000000..01a3155
--- /dev/null
@@ -0,0 +1 @@
+systemd-sulogin-shell
diff --git a/src/sulogin-shell/meson.build b/src/sulogin-shell/meson.build
new file mode 100644 (file)
index 0000000..4ec0d3d
--- /dev/null
@@ -0,0 +1,7 @@
+gen = configure_file(
+        input : 'systemd-sulogin-shell.in',
+        output : 'systemd-sulogin-shell',
+        configuration : substs)
+
+install_data(gen,
+             install_dir : rootlibexecdir)
diff --git a/src/sulogin-shell/systemd-sulogin-shell.in b/src/sulogin-shell/systemd-sulogin-shell.in
new file mode 100755 (executable)
index 0000000..103f841
--- /dev/null
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+if [ -x /bin/plymouth ]; then
+    /bin/plymouth --wait quit
+fi
+
+echo "You are in $1 mode. After logging in, type \"journalctl -xb\" to view"
+echo "system logs, \"systemctl reboot\" to reboot, \"systemctl default\" or ^D to boot"
+echo "into default mode."
+
+@SULOGIN@
+@SYSTEMCTL@ --job-mode=fail --no-block default
index ce7c26e..b3587e2 100644 (file)
@@ -41,29 +41,56 @@ static char **arg_prefixes = NULL;
 
 static const char conf_file_dirs[] = CONF_PATHS_NULSTR("sysctl.d");
 
-static int apply_all(Hashmap *sysctl_options) {
+static int apply_all(OrderedHashmap *sysctl_options) {
         char *property, *value;
         Iterator i;
         int r = 0;
 
-        HASHMAP_FOREACH_KEY(value, property, sysctl_options, i) {
+        ORDERED_HASHMAP_FOREACH_KEY(value, property, sysctl_options, i) {
                 int k;
 
                 k = sysctl_write(property, value);
                 if (k < 0) {
-                        log_full_errno(k == -ENOENT ? LOG_INFO : LOG_WARNING, k,
-                                       "Couldn't write '%s' to '%s', ignoring: %m", value, property);
-
-                        if (r == 0 && k != -ENOENT)
-                                r = k;
+                        /* If the sysctl is not available in the kernel or we are running with reduced privileges and
+                         * cannot write it, then log about the issue at LOG_NOTICE level, and proceed without
+                         * failing. (EROFS is treated as a permission problem here, since that's how container managers
+                         * usually protected their sysctls.) In all other cases log an error and make the tool fail. */
+
+                        if (IN_SET(k, -EPERM, -EACCES, -EROFS, -ENOENT))
+                                log_notice_errno(k, "Couldn't write '%s' to '%s', ignoring: %m", value, property);
+                        else {
+                                log_error_errno(k, "Couldn't write '%s' to '%s': %m", value, property);
+                                if (r == 0)
+                                        r = k;
+                        }
                 }
         }
 
         return r;
 }
 
-static int parse_file(Hashmap *sysctl_options, const char *path, bool ignore_enoent) {
+static bool test_prefix(const char *p) {
+        char **i;
+
+        if (strv_isempty(arg_prefixes))
+                return true;
+
+        STRV_FOREACH(i, arg_prefixes) {
+                const char *t;
+
+                t = path_startswith(*i, "/proc/sys/");
+                if (!t)
+                        t = *i;
+                if (path_startswith(p, t))
+                        return true;
+        }
+
+        return false;
+}
+
+static int parse_file(OrderedHashmap *sysctl_options, const char *path, bool ignore_enoent) {
         _cleanup_fclose_ FILE *f = NULL;
+        unsigned c = 0;
         int r;
 
         assert(path);
@@ -77,7 +104,7 @@ static int parse_file(Hashmap *sysctl_options, const char *path, bool ignore_eno
         }
 
         log_debug("Parsing %s", path);
-        while (!feof(f)) {
+        for (;;) {
                 char l[LINE_MAX], *p, *value, *new_value, *property, *existing;
                 void *v;
                 int k;
@@ -89,6 +116,8 @@ static int parse_file(Hashmap *sysctl_options, const char *path, bool ignore_eno
                         return log_error_errno(errno, "Failed to read file '%s', ignoring: %m", path);
                 }
 
+                c++;
+
                 p = strstrip(l);
                 if (!*p)
                         continue;
@@ -98,7 +127,7 @@ static int parse_file(Hashmap *sysctl_options, const char *path, bool ignore_eno
 
                 value = strchr(p, '=');
                 if (!value) {
-                        log_error("Line is not an assignment in file '%s': %s", path, value);
+                        log_error("Line is not an assignment at '%s:%u': %s", path, c, value);
 
                         if (r == 0)
                                 r = -EINVAL;
@@ -111,27 +140,16 @@ static int parse_file(Hashmap *sysctl_options, const char *path, bool ignore_eno
                 p = sysctl_normalize(strstrip(p));
                 value = strstrip(value);
 
-                if (!strv_isempty(arg_prefixes)) {
-                        char **i, *t;
-                        STRV_FOREACH(i, arg_prefixes) {
-                                t = path_startswith(*i, "/proc/sys/");
-                                if (t == NULL)
-                                        t = *i;
-                                if (path_startswith(p, t))
-                                        goto found;
-                        }
-                        /* not found */
+                if (!test_prefix(p))
                         continue;
-                }
 
-found:
-                existing = hashmap_get2(sysctl_options, p, &v);
+                existing = ordered_hashmap_get2(sysctl_options, p, &v);
                 if (existing) {
                         if (streq(value, existing))
                                 continue;
 
-                        log_debug("Overwriting earlier assignment of %s in file '%s'.", p, path);
-                        free(hashmap_remove(sysctl_options, p));
+                        log_debug("Overwriting earlier assignment of %s at '%s:%u'.", p, path, c);
+                        free(ordered_hashmap_remove(sysctl_options, p));
                         free(v);
                 }
 
@@ -145,7 +163,7 @@ found:
                         return log_oom();
                 }
 
-                k = hashmap_put(sysctl_options, property, new_value);
+                k = ordered_hashmap_put(sysctl_options, property, new_value);
                 if (k < 0) {
                         log_error_errno(k, "Failed to add sysctl variable %s to hashmap: %m", property);
                         free(property);
@@ -229,12 +247,12 @@ static int parse_argv(int argc, char *argv[]) {
 }
 
 int main(int argc, char *argv[]) {
+        OrderedHashmap *sysctl_options = NULL;
         int r = 0, k;
-        Hashmap *sysctl_options;
 
         r = parse_argv(argc, argv);
         if (r <= 0)
-                return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+                goto finish;
 
         log_set_target(LOG_TARGET_AUTO);
         log_parse_environment();
@@ -242,7 +260,7 @@ int main(int argc, char *argv[]) {
 
         umask(0022);
 
-        sysctl_options = hashmap_new(&string_hash_ops);
+        sysctl_options = ordered_hashmap_new(&string_hash_ops);
         if (!sysctl_options) {
                 r = log_oom();
                 goto finish;
@@ -280,7 +298,7 @@ int main(int argc, char *argv[]) {
                 r = k;
 
 finish:
-        hashmap_free_free_free(sysctl_options);
+        ordered_hashmap_free_free_free(sysctl_options);
         strv_free(arg_prefixes);
 
         return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
index a3d677f..f1514c9 100644 (file)
 
 #include "fs-util.h"
 #include "log.h"
+#include "proc-cmdline.h"
+#include "special.h"
 #include "string-util.h"
 #include "util.h"
 
 /*
- * Implements the logic described in
- * http://freedesktop.org/wiki/Software/systemd/SystemUpdates
+ * Implements the logic described in systemd.offline-updates(7).
  */
 
 static const char *arg_dest = "/tmp";
@@ -43,15 +44,31 @@ static int generate_symlink(void) {
                 return -EINVAL;
         }
 
-        p = strjoina(arg_dest, "/default.target");
+        p = strjoina(arg_dest, "/" SPECIAL_DEFAULT_TARGET);
         if (symlink(SYSTEM_DATA_UNIT_PATH "/system-update.target", p) < 0)
                 return log_error_errno(errno, "Failed to create symlink %s: %m", p);
 
+        return 1;
+}
+
+static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
+        assert(key);
+
+        /* Check if a run level is specified on the kernel command line. The
+         * command line has higher priority than any on-disk configuration, so
+         * it'll make any symlink we create moot.
+         */
+
+        if (streq(key, "systemd.unit") && !proc_cmdline_value_missing(key, value))
+                log_warning("Offline system update overriden by kernel command line systemd.unit= setting");
+        else if (!value && runlevel_to_target(key))
+                log_warning("Offline system update overriden by runlevel \"%s\" on the kernel command line", key);
+
         return 0;
 }
 
 int main(int argc, char *argv[]) {
-        int r;
+        int r, k;
 
         if (argc > 1 && argc != 4) {
                 log_error("This program takes three or no arguments.");
@@ -69,5 +86,11 @@ int main(int argc, char *argv[]) {
 
         r = generate_symlink();
 
+        if (r > 0) {
+                k = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0);
+                if (k < 0)
+                        log_warning_errno(k, "Failed to parse kernel command line, ignoring: %m");
+        }
+
         return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }
index fd91e79..4a6fb5d 100644 (file)
 #include "dropin.h"
 #include "efivars.h"
 #include "env-util.h"
+#include "escape.h"
 #include "exit-status.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "glob-util.h"
 #include "hostname-util.h"
@@ -118,6 +119,7 @@ static enum dependency {
 } arg_dependency = DEPENDENCY_FORWARD;
 static const char *arg_job_mode = "replace";
 static UnitFileScope arg_scope = UNIT_FILE_SYSTEM;
+static bool arg_wait = false;
 static bool arg_no_block = false;
 static bool arg_no_legend = false;
 static bool arg_no_pager = false;
@@ -141,6 +143,7 @@ static const char *arg_kill_who = NULL;
 static int arg_signal = SIGTERM;
 static char *arg_root = NULL;
 static usec_t arg_when = 0;
+static char *argv_cmdline = NULL;
 static enum action {
         _ACTION_INVALID,
         ACTION_SYSTEMCTL,
@@ -172,6 +175,8 @@ static OutputMode arg_output = OUTPUT_SHORT;
 static bool arg_plain = false;
 static bool arg_firmware_setup = false;
 static bool arg_now = false;
+static bool arg_jobs_before = false;
+static bool arg_jobs_after = false;
 
 static int daemon_reload(int argc, char *argv[], void* userdata);
 static int trivial_method(int argc, char *argv[], void *userdata);
@@ -188,6 +193,11 @@ typedef enum BusFocus {
 
 static sd_bus *busses[_BUS_FOCUS_MAX] = {};
 
+static UnitFileFlags args_to_flags(void) {
+        return (arg_runtime ? UNIT_FILE_RUNTIME : 0) |
+               (arg_force   ? UNIT_FILE_FORCE   : 0);
+}
+
 static int acquire_bus(BusFocus focus, sd_bus **ret) {
         int r;
 
@@ -198,6 +208,9 @@ static int acquire_bus(BusFocus focus, sd_bus **ret) {
         if (arg_transport != BUS_TRANSPORT_LOCAL)
                 focus = BUS_FULL;
 
+        if (getenv_bool("SYSTEMCTL_FORCE_BUS") > 0)
+                focus = BUS_FULL;
+
         if (!busses[focus]) {
                 bool user;
 
@@ -361,22 +374,24 @@ static int compare_unit_info(const void *a, const void *b) {
         return strcasecmp(u->id, v->id);
 }
 
+static const char* unit_type_suffix(const char *name) {
+        const char *dot;
+
+        dot = strrchr(name, '.');
+        if (!dot)
+                return "";
+
+        return dot + 1;
+}
+
 static bool output_show_unit(const UnitInfo *u, char **patterns) {
         assert(u);
 
         if (!strv_fnmatch_or_empty(patterns, u->id, FNM_NOESCAPE))
                 return false;
 
-        if (arg_types) {
-                const char *dot;
-
-                dot = strrchr(u->id, '.');
-                if (!dot)
-                        return false;
-
-                if (!strv_find(arg_types, dot+1))
-                        return false;
-        }
+        if (arg_types && !strv_find(arg_types, unit_type_suffix(u->id)))
+                return false;
 
         if (arg_all)
                 return true;
@@ -402,7 +417,7 @@ static bool output_show_unit(const UnitInfo *u, char **patterns) {
 }
 
 static int output_units_list(const UnitInfo *unit_infos, unsigned c) {
-        unsigned circle_len = 0, id_len, max_id_len, load_len, active_len, sub_len, job_len, desc_len;
+        unsigned circle_len = 0, id_len, max_id_len, load_len, active_len, sub_len, job_len, desc_len, max_desc_len;
         const UnitInfo *u;
         unsigned n_shown = 0;
         int job_count = 0;
@@ -412,13 +427,14 @@ static int output_units_list(const UnitInfo *unit_infos, unsigned c) {
         active_len = strlen("ACTIVE");
         sub_len = strlen("SUB");
         job_len = strlen("JOB");
-        desc_len = 0;
+        max_desc_len = strlen("DESCRIPTION");
 
         for (u = unit_infos; u < unit_infos + c; u++) {
                 max_id_len = MAX(max_id_len, strlen(u->id) + (u->machine ? strlen(u->machine)+1 : 0));
                 load_len = MAX(load_len, strlen(u->load_state));
                 active_len = MAX(active_len, strlen(u->active_state));
                 sub_len = MAX(sub_len, strlen(u->sub_state));
+                max_desc_len = MAX(max_desc_len, strlen(u->description));
 
                 if (u->job_id != 0) {
                         job_len = MAX(job_len, strlen(u->job_type));
@@ -434,8 +450,8 @@ static int output_units_list(const UnitInfo *unit_infos, unsigned c) {
         if (!arg_full && original_stdout_is_tty) {
                 unsigned basic_len;
 
-                id_len = MIN(max_id_len, 25u);
-                basic_len = circle_len + 5 + id_len + 5 + active_len + sub_len;
+                id_len = MIN(max_id_len, 25u); /* as much as it needs, but at most 25 for now */
+                basic_len = circle_len + 1 + id_len + 1 + load_len + 1 + active_len + 1 + sub_len + 1;
 
                 if (job_count)
                         basic_len += job_len + 1;
@@ -447,34 +463,39 @@ static int output_units_list(const UnitInfo *unit_infos, unsigned c) {
                         /* Either UNIT already got 25, or is fully satisfied.
                          * Grant up to 25 to DESC now. */
                         incr = MIN(extra_len, 25u);
-                        desc_len += incr;
+                        desc_len = incr;
                         extra_len -= incr;
 
-                        /* split the remaining space between UNIT and DESC,
-                         * but do not give UNIT more than it needs. */
+                        /* Of the remainder give as much as the ID needs to the ID, and give the rest to the
+                         * description but not more than it needs. */
                         if (extra_len > 0) {
-                                incr = MIN(extra_len / 2, max_id_len - id_len);
+                                incr = MIN(max_id_len - id_len, extra_len);
                                 id_len += incr;
-                                desc_len += extra_len - incr;
+                                desc_len += MIN(extra_len - incr, max_desc_len - desc_len);
                         }
-                }
-        } else
+                } else
+                        desc_len = 0;
+        } else {
                 id_len = max_id_len;
+                desc_len = max_desc_len;
+        }
 
         for (u = unit_infos; u < unit_infos + c; u++) {
                 _cleanup_free_ char *e = NULL, *j = NULL;
+                const char *on_underline = "", *off_underline = "";
                 const char *on_loaded = "", *off_loaded = "";
                 const char *on_active = "", *off_active = "";
                 const char *on_circle = "", *off_circle = "";
                 const char *id;
-                bool circle = false;
+                bool circle = false, underline = false;
 
                 if (!n_shown && !arg_no_legend) {
 
                         if (circle_len > 0)
                                 fputs("  ", stdout);
 
-                        printf("%-*s %-*s %-*s %-*s ",
+                        printf("%s%-*s %-*s %-*s %-*s ",
+                               ansi_underline(),
                                id_len, "UNIT",
                                load_len, "LOAD",
                                active_len, "ACTIVE",
@@ -483,27 +504,38 @@ static int output_units_list(const UnitInfo *unit_infos, unsigned c) {
                         if (job_count)
                                 printf("%-*s ", job_len, "JOB");
 
-                        if (!arg_full && arg_no_pager)
-                                printf("%.*s\n", desc_len, "DESCRIPTION");
-                        else
-                                printf("%s\n", "DESCRIPTION");
+                        printf("%-*.*s%s\n",
+                               desc_len,
+                               !arg_full && arg_no_pager ? (int) desc_len : -1,
+                               "DESCRIPTION",
+                               ansi_normal());
                 }
 
                 n_shown++;
 
+                if (u + 1 < unit_infos + c &&
+                    !streq(unit_type_suffix(u->id), unit_type_suffix((u + 1)->id))) {
+                        on_underline = ansi_underline();
+                        off_underline = ansi_normal();
+                        underline = true;
+                }
+
                 if (STR_IN_SET(u->load_state, "error", "not-found", "masked") && !arg_plain) {
-                        on_loaded = ansi_highlight_red();
                         on_circle = ansi_highlight_yellow();
-                        off_loaded = off_circle = ansi_normal();
+                        off_circle = ansi_normal();
                         circle = true;
+                        on_loaded = underline ? ansi_highlight_red_underline() : ansi_highlight_red();
+                        off_loaded = underline ? on_underline : ansi_normal();
                 } else if (streq(u->active_state, "failed") && !arg_plain) {
-                        on_circle = on_active = ansi_highlight_red();
-                        off_circle = off_active = ansi_normal();
+                        on_circle = ansi_highlight_red();
+                        off_circle = ansi_normal();
                         circle = true;
+                        on_active = underline ? ansi_highlight_red_underline() : ansi_highlight_red();
+                        off_active = underline ? on_underline : ansi_normal();
                 }
 
                 if (u->machine) {
-                        j = strjoin(u->machine, ":", u->id, NULL);
+                        j = strjoin(u->machine, ":", u->id);
                         if (!j)
                                 return log_oom();
 
@@ -522,17 +554,19 @@ static int output_units_list(const UnitInfo *unit_infos, unsigned c) {
                 if (circle_len > 0)
                         printf("%s%s%s ", on_circle, circle ? special_glyph(BLACK_CIRCLE) : " ", off_circle);
 
-                printf("%s%-*s%s %s%-*s%s %s%-*s %-*s%s %-*s",
+                printf("%s%s%-*s%s %s%-*s%s %s%-*s %-*s%s %-*s",
+                       on_underline,
                        on_active, id_len, id, off_active,
                        on_loaded, load_len, u->load_state, off_loaded,
                        on_active, active_len, u->active_state,
                        sub_len, u->sub_state, off_active,
                        job_count ? job_len + 1 : 0, u->job_id ? u->job_type : "");
 
-                if (desc_len > 0)
-                        printf("%.*s\n", desc_len, u->description);
-                else
-                        printf("%s\n", u->description);
+                printf("%-*.*s%s\n",
+                       desc_len,
+                       !arg_full && arg_no_pager ? (int) desc_len : -1,
+                       u->description,
+                       off_underline);
         }
 
         if (!arg_no_legend) {
@@ -913,7 +947,7 @@ static int output_sockets_list(struct socket_info *socket_infos, unsigned cs) {
                         char **a;
 
                         if (s->machine) {
-                                j = strjoin(s->machine, ":", s->path, NULL);
+                                j = strjoin(s->machine, ":", s->path);
                                 if (!j)
                                         return log_oom();
                                 path = j;
@@ -1197,7 +1231,7 @@ static int output_timers_list(struct timer_info *timer_infos, unsigned n) {
                         format_timestamp_relative(trel2, sizeof(trel2), t->last_trigger);
 
                         if (t->machine) {
-                                j = strjoin(t->machine, ":", t->id, NULL);
+                                j = strjoin(t->machine, ":", t->id);
                                 if (!j)
                                         return log_oom();
                                 unit = j;
@@ -1394,35 +1428,46 @@ static void output_unit_file_list(const UnitFileList *units, unsigned c) {
                 id_cols = max_id_len;
 
         if (!arg_no_legend && c > 0)
-                printf("%-*s %-*s\n",
+                printf("%s%-*s %-*s%s\n",
+                       ansi_underline(),
                        id_cols, "UNIT FILE",
-                       state_cols, "STATE");
+                       state_cols, "STATE",
+                       ansi_normal());
 
         for (u = units; u < units + c; u++) {
                 _cleanup_free_ char *e = NULL;
-                const char *on, *off;
+                const char *on, *off, *on_underline = "", *off_underline = "";
                 const char *id;
+                bool underline = false;
+
+                if (u + 1 < units + c &&
+                    !streq(unit_type_suffix(u->path), unit_type_suffix((u + 1)->path))) {
+                        on_underline = ansi_underline();
+                        off_underline = ansi_normal();
+                        underline = true;
+                }
 
                 if (IN_SET(u->state,
                            UNIT_FILE_MASKED,
                            UNIT_FILE_MASKED_RUNTIME,
                            UNIT_FILE_DISABLED,
-                           UNIT_FILE_BAD)) {
-                        on  = ansi_highlight_red();
-                        off = ansi_normal();
-                } else if (u->state == UNIT_FILE_ENABLED) {
-                        on  = ansi_highlight_green();
-                        off = ansi_normal();
-                } else
-                        on = off = "";
+                           UNIT_FILE_BAD))
+                        on  = underline ? ansi_highlight_red_underline() : ansi_highlight_red();
+                else if (u->state == UNIT_FILE_ENABLED)
+                        on  = underline ? ansi_highlight_green_underline() : ansi_highlight_green();
+                else
+                        on = on_underline;
+                off = off_underline;
 
                 id = basename(u->path);
 
                 e = arg_full ? NULL : ellipsize(id, id_cols, 33);
 
-                printf("%-*s %s%-*s%s\n",
+                printf("%s%-*s %s%-*s%s%s\n",
+                       on_underline,
                        id_cols, e ? e : id,
-                       on, state_cols, unit_file_state_to_string(u->state), off);
+                       on, state_cols, unit_file_state_to_string(u->state), off,
+                       off_underline);
         }
 
         if (!arg_no_legend)
@@ -1691,7 +1736,7 @@ static int list_dependencies_get_dependencies(sd_bus *bus, const char *name, cha
         if (r < 0)
                 return bus_log_parse_error(r);
 
-        *deps = ret;
+        *deps = strv_uniq(ret);
         ret = NULL;
 
         return 0;
@@ -1736,6 +1781,7 @@ static int list_dependencies_one(
         STRV_FOREACH(c, deps) {
                 if (strv_contains(*units, *c)) {
                         if (!arg_plain) {
+                                printf("  ");
                                 r = list_dependencies_print("...", level + 1, (branches << 1) | (c[1] == NULL ? 0 : 1), 1);
                                 if (r < 0)
                                         return r;
@@ -1878,7 +1924,7 @@ static int get_machine_properties(sd_bus *bus, struct machine_info *mi) {
                 bus = container;
         }
 
-        r = bus_map_all_properties(bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", machine_info_property_map, mi);
+        r = bus_map_all_properties(bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", machine_info_property_map, NULL, mi);
         if (r < 0)
                 return r;
 
@@ -1913,7 +1959,7 @@ static int get_machine_list(
                 machine_infos[c].name = hn;
                 hn = NULL;
 
-                get_machine_properties(bus, &machine_infos[c]);
+                (void) get_machine_properties(bus, &machine_infos[c]);
                 c++;
         }
 
@@ -1943,7 +1989,7 @@ static int get_machine_list(
                         return log_oom();
                 }
 
-                get_machine_properties(NULL, &machine_infos[c]);
+                (void) get_machine_properties(NULL, &machine_infos[c]);
                 c++;
         }
 
@@ -2110,7 +2156,7 @@ static int set_default(int argc, char *argv[], void *userdata) {
                 return log_error_errno(r, "Failed to mangle unit name: %m");
 
         if (install_client_side()) {
-                r = unit_file_set_default(arg_scope, arg_root, unit, true, &changes, &n_changes);
+                r = unit_file_set_default(arg_scope, UNIT_FILE_FORCE, arg_root, unit, &changes, &n_changes);
                 unit_file_dump_changes(r, "set default", changes, n_changes, arg_quiet);
 
                 if (r > 0)
@@ -2155,12 +2201,49 @@ finish:
         return r;
 }
 
+static int output_waiting_jobs(sd_bus *bus, uint32_t id, const char *method, const char *prefix) {
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+        const char *name, *type, *state, *job_path, *unit_path;
+        uint32_t other_id;
+        int r;
+
+        assert(bus);
+
+        r = sd_bus_call_method(
+                        bus,
+                        "org.freedesktop.systemd1",
+                        "/org/freedesktop/systemd1",
+                        "org.freedesktop.systemd1.Manager",
+                        method,
+                        &error,
+                        &reply,
+                        "u", id);
+        if (r < 0)
+                return log_debug_errno(r, "Failed to get waiting jobs for job %" PRIu32, id);
+
+        r = sd_bus_message_enter_container(reply, 'a', "(usssoo)");
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        while ((r = sd_bus_message_read(reply, "(usssoo)", &other_id, &name, &type, &state, &job_path, &unit_path)) > 0)
+                printf("%s %u (%s/%s)\n", prefix, other_id, name, type);
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        r = sd_bus_message_exit_container(reply);
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        return 0;
+}
+
 struct job_info {
         uint32_t id;
         const char *name, *type, *state;
 };
 
-static void output_jobs_list(const struct job_info* jobs, unsigned n, bool skipped) {
+static void output_jobs_list(sd_bus *bus, const struct job_info* jobs, unsigned n, bool skipped) {
         unsigned id_len, unit_len, type_len, state_len;
         const struct job_info *j;
         const char *on, *off;
@@ -2222,6 +2305,11 @@ static void output_jobs_list(const struct job_info* jobs, unsigned n, bool skipp
                        on, unit_len, e ? e : j->name, off,
                        type_len, j->type,
                        on, state_len, j->state, off);
+
+                if (arg_jobs_after)
+                        output_waiting_jobs(bus, j->id, "GetJobAfter", "\twaiting for job");
+                if (arg_jobs_before)
+                        output_waiting_jobs(bus, j->id, "GetJobBefore", "\tblocking job");
         }
 
         if (!arg_no_legend) {
@@ -2290,7 +2378,7 @@ static int list_jobs(int argc, char *argv[], void *userdata) {
 
         pager_open(arg_no_pager, false);
 
-        output_jobs_list(jobs, c, skipped);
+        output_jobs_list(bus, jobs, c, skipped);
         return 0;
 }
 
@@ -2395,17 +2483,24 @@ static int unit_file_find_path(LookupPaths *lp, const char *unit_name, char **un
         assert(unit_path);
 
         STRV_FOREACH(p, lp->search_path) {
-                _cleanup_free_ char *path;
+                _cleanup_free_ char *path = NULL, *lpath = NULL;
+                int r;
 
-                path = path_join(arg_root, *p, unit_name);
+                path = path_join(NULL, *p, unit_name);
                 if (!path)
                         return log_oom();
 
-                if (access(path, F_OK) == 0) {
-                        *unit_path = path;
-                        path = NULL;
-                        return 1;
-                }
+                r = chase_symlinks(path, arg_root, 0, &lpath);
+                if (r == -ENOENT)
+                        continue;
+                if (r == -ENOMEM)
+                        return log_oom();
+                if (r < 0)
+                        return log_error_errno(r, "Failed to access path '%s': %m", path);
+
+                *unit_path = lpath;
+                lpath = NULL;
+                return 1;
         }
 
         return 0;
@@ -2467,22 +2562,17 @@ static int unit_find_paths(
                 }
         } else {
                 _cleanup_set_free_ Set *names;
+                _cleanup_free_ char *template = NULL;
 
                 names = set_new(NULL);
                 if (!names)
                         return log_oom();
 
-                r = set_put(names, unit_name);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to add unit name: %m");
-
                 r = unit_file_find_path(lp, unit_name, &path);
                 if (r < 0)
                         return r;
 
                 if (r == 0) {
-                        _cleanup_free_ char *template = NULL;
-
                         r = unit_name_template(unit_name, &template);
                         if (r < 0 && r != -EINVAL)
                                 return log_error_errno(r, "Failed to determine template name: %m");
@@ -2493,8 +2583,28 @@ static int unit_find_paths(
                         }
                 }
 
+                if (path)
+                        /* We found the unit file. If we followed symlinks, this name might be
+                         * different then the unit_name with started with. Look for dropins matching
+                         * that "final" name. */
+                        r = set_put(names, basename(path));
+                else if (!template)
+                        /* No unit file, let's look for dropins matching the original name.
+                         * systemd has fairly complicated rules (based on unit type and provenience),
+                         * which units are allowed not to have the main unit file. We err on the
+                         * side of including too many files, and always try to load dropins. */
+                        r = set_put(names, unit_name);
+                else
+                        /* The cases where we allow a unit to exist without the main file are
+                         * never valid for templates. Don't try to load dropins in this case. */
+                        goto not_found;
+
+                if (r < 0)
+                        return log_error_errno(r, "Failed to add unit name: %m");
+
                 if (dropin_paths) {
-                        r = unit_file_find_dropin_paths(lp->search_path, NULL, names, &dropins);
+                        r = unit_file_find_dropin_conf_paths(arg_root, lp->search_path,
+                                                             NULL, names, &dropins);
                         if (r < 0)
                                 return r;
                 }
@@ -2513,7 +2623,7 @@ static int unit_find_paths(
                 dropins = NULL;
                 r = 1;
         }
-
+ not_found:
         if (r == 0 && !arg_force)
                 log_error("No files found for %s.", unit_name);
 
@@ -2679,13 +2789,92 @@ static const char *method_to_verb(const char *method) {
        return "n/a";
 }
 
+typedef struct {
+        sd_bus_slot *match;
+        sd_event *event;
+        Set *unit_paths;
+        bool any_failed;
+} WaitContext;
+
+static void wait_context_free(WaitContext *c) {
+        c->match = sd_bus_slot_unref(c->match);
+        c->event = sd_event_unref(c->event);
+        c->unit_paths = set_free_free(c->unit_paths);
+}
+
+static int on_properties_changed(sd_bus_message *m, void *userdata, sd_bus_error *error) {
+        WaitContext *c = userdata;
+        const char *path;
+        int r;
+
+        path = sd_bus_message_get_path(m);
+        if (!set_contains(c->unit_paths, path))
+                return 0;
+
+        /* Check if ActiveState changed to inactive/failed */
+        /* (s interface, a{sv} changed_properties, as invalidated_properties) */
+        r = sd_bus_message_skip(m, "s");
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        r = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, "{sv}");
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        while ((r = sd_bus_message_enter_container(m, SD_BUS_TYPE_DICT_ENTRY, "sv")) > 0) {
+                const char *s;
+
+                r = sd_bus_message_read(m, "s", &s);
+                if (r < 0)
+                        return bus_log_parse_error(r);
+
+                if (streq(s, "ActiveState")) {
+                        bool is_failed;
+
+                        r = sd_bus_message_enter_container(m, SD_BUS_TYPE_VARIANT, "s");
+                        if (r < 0)
+                                return bus_log_parse_error(r);
+
+                        r = sd_bus_message_read(m, "s", &s);
+                        if (r < 0)
+                                return bus_log_parse_error(r);
+
+                        is_failed = streq(s, "failed");
+                        if (streq(s, "inactive") || is_failed) {
+                                log_debug("%s became %s, dropping from --wait tracking", path, s);
+                                free(set_remove(c->unit_paths, path));
+                                c->any_failed = c->any_failed || is_failed;
+                        } else
+                                log_debug("ActiveState on %s changed to %s", path, s);
+
+                        break; /* no need to dissect the rest of the message */
+                } else {
+                        /* other property */
+                        r = sd_bus_message_skip(m, "v");
+                        if (r < 0)
+                                return bus_log_parse_error(r);
+                }
+                r = sd_bus_message_exit_container(m);
+                if (r < 0)
+                        return bus_log_parse_error(r);
+        }
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        if (set_isempty(c->unit_paths))
+                sd_event_exit(c->event, EXIT_SUCCESS);
+
+        return 0;
+}
+
 static int start_unit_one(
                 sd_bus *bus,
                 const char *method,
                 const char *name,
                 const char *mode,
                 sd_bus_error *error,
-                BusWaitForJobs *w) {
+                BusWaitForJobs *w,
+                WaitContext *wait_context) {
 
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
         const char *path;
@@ -2696,6 +2885,40 @@ static int start_unit_one(
         assert(mode);
         assert(error);
 
+        if (wait_context) {
+                _cleanup_free_ char *unit_path = NULL;
+                const char* mt;
+
+                log_debug("Watching for property changes of %s", name);
+                r = sd_bus_call_method(
+                                bus,
+                                "org.freedesktop.systemd1",
+                                "/org/freedesktop/systemd1",
+                                "org.freedesktop.systemd1.Manager",
+                                "RefUnit",
+                                error,
+                                NULL,
+                                "s", name);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to RefUnit %s: %s", name, bus_error_message(error, r));
+
+                unit_path = unit_dbus_path_from_name(name);
+                if (!unit_path)
+                        return log_oom();
+
+                r = set_put_strdup(wait_context->unit_paths, unit_path);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to add unit path %s to set: %m", unit_path);
+
+                mt = strjoina("type='signal',"
+                              "interface='org.freedesktop.DBus.Properties',"
+                              "path='", unit_path, "',"
+                              "member='PropertiesChanged'");
+                r = sd_bus_add_match(bus, &wait_context->match, mt, on_properties_changed, wait_context);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to add match for PropertiesChanged signal: %m");
+        }
+
         log_debug("Calling manager for %s on %s, %s", method, name, mode);
 
         r = sd_bus_call_method(
@@ -2720,9 +2943,10 @@ static int start_unit_one(
 
                 if (!sd_bus_error_has_name(error, BUS_ERROR_NO_SUCH_UNIT) &&
                     !sd_bus_error_has_name(error, BUS_ERROR_UNIT_MASKED))
-                        log_error("See %s logs and 'systemctl%s status %s' for details.",
+                        log_error("See %s logs and 'systemctl%s status%s %s' for details.",
                                    arg_scope == UNIT_FILE_SYSTEM ? "system" : "user",
                                    arg_scope == UNIT_FILE_SYSTEM ? "" : " --user",
+                                   name[0] == '-' ? " --" : "",
                                    name);
 
                 return r;
@@ -2840,10 +3064,18 @@ static int start_unit(int argc, char *argv[], void *userdata) {
         const char *method, *mode, *one_name, *suffix = NULL;
         _cleanup_strv_free_ char **names = NULL;
         sd_bus *bus;
+        _cleanup_(wait_context_free) WaitContext wait_context = {};
         char **name;
         int r = 0;
 
-        r = acquire_bus(BUS_MANAGER, &bus);
+        if (arg_wait && !strstr(argv[0], "start")) {
+                log_error("--wait may only be used with a command that starts units.");
+                return -EINVAL;
+        }
+
+        /* we cannot do sender tracking on the private bus, so we need the full
+         * one for RefUnit to implement --wait */
+        r = acquire_bus(arg_wait ? BUS_FULL : BUS_MANAGER, &bus);
         if (r < 0)
                 return r;
 
@@ -2887,11 +3119,36 @@ static int start_unit(int argc, char *argv[], void *userdata) {
                         return log_error_errno(r, "Could not watch jobs: %m");
         }
 
+        if (arg_wait) {
+                _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+
+                wait_context.unit_paths = set_new(&string_hash_ops);
+                if (!wait_context.unit_paths)
+                        return log_oom();
+
+                r = sd_bus_call_method(
+                                bus,
+                                "org.freedesktop.systemd1",
+                                "/org/freedesktop/systemd1",
+                                "org.freedesktop.systemd1.Manager",
+                                "Subscribe",
+                                &error,
+                                NULL, NULL);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to enable subscription: %s", bus_error_message(&error, r));
+                r = sd_event_default(&wait_context.event);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to allocate event loop: %m");
+                r = sd_bus_attach_event(bus, wait_context.event, 0);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to attach bus to event loop: %m");
+        }
+
         STRV_FOREACH(name, names) {
                 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
                 int q;
 
-                q = start_unit_one(bus, method, *name, mode, &error, w);
+                q = start_unit_one(bus, method, *name, mode, &error, w, arg_wait ? &wait_context : NULL);
                 if (r >= 0 && q < 0)
                         r = translate_bus_error_to_exit_status(q, &error);
         }
@@ -2923,11 +3180,20 @@ static int start_unit(int argc, char *argv[], void *userdata) {
                                 check_triggering_units(bus, *name);
         }
 
+        if (r >= 0 && arg_wait) {
+                int q;
+                q = sd_event_loop(wait_context.event);
+                if (q < 0)
+                        return log_error_errno(q, "Failed to run event loop: %m");
+                if (wait_context.any_failed)
+                        r = EXIT_FAILURE;
+        }
+
         return r;
 }
 
+#ifdef ENABLE_LOGIND
 static int logind_set_wall_message(void) {
-#ifdef HAVE_LOGIND
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         sd_bus *bus;
         _cleanup_free_ char *m = NULL;
@@ -2955,15 +3221,14 @@ static int logind_set_wall_message(void) {
 
         if (r < 0)
                 return log_warning_errno(r, "Failed to set wall message, ignoring: %s", bus_error_message(&error, r));
-
-#endif
         return 0;
 }
+#endif
 
 /* Ask systemd-logind, which might grant access to unprivileged users
  * through PolicyKit */
 static int logind_reboot(enum action a) {
-#ifdef HAVE_LOGIND
+#ifdef ENABLE_LOGIND
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         const char *method, *description;
         sd_bus *bus;
@@ -3026,7 +3291,7 @@ static int logind_reboot(enum action a) {
 }
 
 static int logind_check_inhibitors(enum action a) {
-#ifdef HAVE_LOGIND
+#ifdef ENABLE_LOGIND
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
         _cleanup_strv_free_ char **sessions = NULL;
         const char *what, *who, *why, *mode;
@@ -3120,7 +3385,7 @@ static int logind_check_inhibitors(enum action a) {
                 if (sd_session_get_class(*s, &class) < 0 || !streq(class, "user"))
                         continue;
 
-                if (sd_session_get_type(*s, &type) < 0 || (!streq(type, "x11") && !streq(type, "tty")))
+                if (sd_session_get_type(*s, &type) < 0 || !STR_IN_SET(type, "x11", "tty"))
                         continue;
 
                 sd_session_get_tty(*s, &tty);
@@ -3145,7 +3410,7 @@ static int logind_check_inhibitors(enum action a) {
 }
 
 static int logind_prepare_firmware_setup(void) {
-#ifdef HAVE_LOGIND
+#ifdef ENABLE_LOGIND
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         sd_bus *bus;
         int r;
@@ -3218,6 +3483,8 @@ static int set_exit_code(uint8_t code) {
 static int start_special(int argc, char *argv[], void *userdata) {
         enum action a;
         int r;
+        bool termination_action; /* an action that terminates the manager,
+                                  * can be performed also by signal. */
 
         assert(argv);
 
@@ -3257,40 +3524,43 @@ static int start_special(int argc, char *argv[], void *userdata) {
                         return r;
         }
 
-        if (arg_force >= 2 &&
-            IN_SET(a,
-                   ACTION_HALT,
-                   ACTION_POWEROFF,
-                   ACTION_REBOOT))
+        termination_action = IN_SET(a,
+                                    ACTION_HALT,
+                                    ACTION_POWEROFF,
+                                    ACTION_REBOOT);
+        if (termination_action && arg_force >= 2)
                 return halt_now(a);
 
         if (arg_force >= 1 &&
-            IN_SET(a,
-                   ACTION_HALT,
-                   ACTION_POWEROFF,
-                   ACTION_REBOOT,
-                   ACTION_KEXEC,
-                   ACTION_EXIT))
-                return trivial_method(argc, argv, userdata);
+            (termination_action || IN_SET(a, ACTION_KEXEC, ACTION_EXIT)))
+                r = trivial_method(argc, argv, userdata);
+        else {
+                /* First try logind, to allow authentication with polkit */
+                if (IN_SET(a,
+                           ACTION_POWEROFF,
+                           ACTION_REBOOT,
+                           ACTION_SUSPEND,
+                           ACTION_HIBERNATE,
+                           ACTION_HYBRID_SLEEP)) {
+
+                        r = logind_reboot(a);
+                        if (r >= 0)
+                                return r;
+                        if (IN_SET(r, -EOPNOTSUPP, -EINPROGRESS))
+                                /* requested operation is not supported or already in progress */
+                                return r;
 
-        /* First try logind, to allow authentication with polkit */
-        if (IN_SET(a,
-                   ACTION_POWEROFF,
-                   ACTION_REBOOT,
-                   ACTION_SUSPEND,
-                   ACTION_HIBERNATE,
-                   ACTION_HYBRID_SLEEP)) {
-                r = logind_reboot(a);
-                if (r >= 0)
-                        return r;
-                if (IN_SET(r, -EOPNOTSUPP, -EINPROGRESS))
-                        /* requested operation is not supported or already in progress */
-                        return r;
+                        /* On all other errors, try low-level operation */
+                }
 
-                /* On all other errors, try low-level operation */
+                r = start_unit(argc, argv, userdata);
         }
 
-        return start_unit(argc, argv, userdata);
+        if (termination_action && arg_force < 2 &&
+            IN_SET(r, -ENOENT, -ETIMEDOUT))
+                log_notice("It is possible to perform action directly, see discussion of --force --force in man:systemctl(1).");
+
+        return r;
 }
 
 static int start_system_special(int argc, char *argv[], void *userdata) {
@@ -3384,9 +3654,9 @@ static int kill_unit(int argc, char *argv[], void *userdata) {
                                 "KillUnit",
                                 &error,
                                 NULL,
-                                "ssi", *names, kill_who ? kill_who : arg_kill_who, arg_signal);
+                                "ssi", *name, kill_who ? kill_who : arg_kill_who, arg_signal);
                 if (q < 0) {
-                        log_error_errno(q, "Failed to kill unit %s: %s", *names, bus_error_message(&error, q));
+                        log_error_errno(q, "Failed to kill unit %s: %s", *name, bus_error_message(&error, q));
                         if (r == 0)
                                 r = q;
                 }
@@ -3548,6 +3818,8 @@ typedef struct UnitStatusInfo {
         bool failed_assert_negate;
         const char *failed_assert;
         const char *failed_assert_parameter;
+        usec_t next_elapse_real;
+        usec_t next_elapse_monotonic;
 
         /* Socket */
         unsigned n_accepted;
@@ -3571,6 +3843,7 @@ typedef struct UnitStatusInfo {
         uint64_t memory_low;
         uint64_t memory_high;
         uint64_t memory_max;
+        uint64_t memory_swap_max;
         uint64_t memory_limit;
         uint64_t cpu_usage_nsec;
         uint64_t tasks_current;
@@ -3620,7 +3893,7 @@ static void print_status_info(
         if (streq_ptr(i->active_state, "failed")) {
                 active_on = ansi_highlight_red();
                 active_off = ansi_normal();
-        } else if (streq_ptr(i->active_state, "active") || streq_ptr(i->active_state, "reloading")) {
+        } else if (STRPTR_IN_SET(i->active_state, "active", "reloading")) {
                 active_on = ansi_highlight_green();
                 active_off = ansi_normal();
         } else
@@ -3701,12 +3974,10 @@ static void print_status_info(
         if (!isempty(i->result) && !streq(i->result, "success"))
                 printf(" (Result: %s)", i->result);
 
-        timestamp = (streq_ptr(i->active_state, "active")      ||
-                     streq_ptr(i->active_state, "reloading"))   ? i->active_enter_timestamp :
-                    (streq_ptr(i->active_state, "inactive")    ||
-                     streq_ptr(i->active_state, "failed"))      ? i->inactive_enter_timestamp :
-                    streq_ptr(i->active_state, "activating")    ? i->inactive_exit_timestamp :
-                                                                  i->active_exit_timestamp;
+        timestamp = STRPTR_IN_SET(i->active_state, "active", "reloading") ? i->active_enter_timestamp :
+                    STRPTR_IN_SET(i->active_state, "inactive", "failed")  ? i->inactive_enter_timestamp :
+                    STRPTR_IN_SET(i->active_state, "activating")          ? i->inactive_exit_timestamp :
+                                                                            i->active_exit_timestamp;
 
         s1 = format_timestamp_relative(since1, sizeof(since1), timestamp);
         s2 = format_timestamp(since2, sizeof(since2), timestamp);
@@ -3718,6 +3989,31 @@ static void print_status_info(
         else
                 printf("\n");
 
+        if (endswith(i->id, ".timer")) {
+                char tstamp1[FORMAT_TIMESTAMP_RELATIVE_MAX],
+                     tstamp2[FORMAT_TIMESTAMP_MAX];
+                char *next_rel_time, *next_time;
+                dual_timestamp nw, next = {i->next_elapse_real,
+                                           i->next_elapse_monotonic};
+                usec_t next_elapse;
+
+                printf("  Trigger: ");
+
+                dual_timestamp_get(&nw);
+                next_elapse = calc_next_elapse(&nw, &next);
+                next_rel_time = format_timestamp_relative(tstamp1,
+                                                          sizeof(tstamp1),
+                                                          next_elapse);
+                next_time = format_timestamp(tstamp2,
+                                             sizeof(tstamp2),
+                                             next_elapse);
+
+                if (next_time && next_rel_time)
+                        printf("%s; %s\n", next_time, next_rel_time);
+                else
+                        printf("n/a\n");
+        }
+
         if (!i->condition_result && i->condition_timestamp > 0) {
                 UnitCondition *c;
                 int n = 0;
@@ -3786,7 +4082,7 @@ static void print_status_info(
                 argv = strv_join(p->argv, " ");
                 printf("  Process: "PID_FMT" %s=%s ", p->pid, p->name, strna(argv));
 
-                good = is_clean_exit_lsb(p->code, p->status, NULL);
+                good = is_clean_exit(p->code, p->status, EXIT_CLEAN_DAEMON, NULL);
                 if (!good) {
                         on = ansi_highlight_red();
                         off = ansi_normal();
@@ -3883,7 +4179,8 @@ static void print_status_info(
 
                 printf("   Memory: %s", format_bytes(buf, sizeof(buf), i->memory_current));
 
-                if (i->memory_low > 0 || i->memory_high != CGROUP_LIMIT_MAX || i->memory_max != CGROUP_LIMIT_MAX ||
+                if (i->memory_low > 0 || i->memory_high != CGROUP_LIMIT_MAX ||
+                    i->memory_max != CGROUP_LIMIT_MAX || i->memory_swap_max != CGROUP_LIMIT_MAX ||
                     i->memory_limit != CGROUP_LIMIT_MAX) {
                         const char *prefix = "";
 
@@ -3900,6 +4197,10 @@ static void print_status_info(
                                 printf("%smax: %s", prefix, format_bytes(buf, sizeof(buf), i->memory_max));
                                 prefix = " ";
                         }
+                        if (i->memory_swap_max != CGROUP_LIMIT_MAX) {
+                                printf("%sswap max: %s", prefix, format_bytes(buf, sizeof(buf), i->memory_swap_max));
+                                prefix = " ";
+                        }
                         if (i->memory_limit != CGROUP_LIMIT_MAX) {
                                 printf("%slimit: %s", prefix, format_bytes(buf, sizeof(buf), i->memory_limit));
                                 prefix = " ";
@@ -4140,6 +4441,8 @@ static int status_property(const char *name, sd_bus_message *m, UnitStatusInfo *
                         i->memory_high = u;
                 else if (streq(name, "MemoryMax"))
                         i->memory_max = u;
+                else if (streq(name, "MemorySwapMax"))
+                        i->memory_swap_max = u;
                 else if (streq(name, "MemoryLimit"))
                         i->memory_limit = u;
                 else if (streq(name, "TasksCurrent"))
@@ -4148,6 +4451,10 @@ static int status_property(const char *name, sd_bus_message *m, UnitStatusInfo *
                         i->tasks_max = u;
                 else if (streq(name, "CPUUsageNSec"))
                         i->cpu_usage_nsec = u;
+                else if (streq(name, "NextElapseUSecMonotonic"))
+                        i->next_elapse_monotonic = u;
+                else if (streq(name, "NextElapseUSecRealtime"))
+                        i->next_elapse_real = u;
 
                 break;
         }
@@ -4574,7 +4881,8 @@ static int print_property(const char *name, sd_bus_message *m, const char *conte
 
                         return 0;
 
-                } else if (contents[1] == SD_BUS_TYPE_STRUCT_BEGIN && (streq(name, "IODeviceWeight") || streq(name, "BlockIODeviceWeight"))) {
+                } else if (contents[1] == SD_BUS_TYPE_STRUCT_BEGIN &&
+                           STR_IN_SET(name, "IODeviceWeight", "BlockIODeviceWeight")) {
                         const char *path;
                         uint64_t weight;
 
@@ -4593,8 +4901,9 @@ static int print_property(const char *name, sd_bus_message *m, const char *conte
 
                         return 0;
 
-                } else if (contents[1] == SD_BUS_TYPE_STRUCT_BEGIN && (cgroup_io_limit_type_from_string(name) >= 0 ||
-                                                                       streq(name, "BlockIOReadBandwidth") || streq(name, "BlockIOWriteBandwidth"))) {
+                } else if (contents[1] == SD_BUS_TYPE_STRUCT_BEGIN &&
+                           (cgroup_io_limit_type_from_string(name) >= 0 ||
+                            STR_IN_SET(name, "BlockIOReadBandwidth", "BlockIOWriteBandwidth"))) {
                         const char *path;
                         uint64_t bandwidth;
 
@@ -4655,6 +4964,7 @@ static int show_one(
                 .memory_current = (uint64_t) -1,
                 .memory_high = CGROUP_LIMIT_MAX,
                 .memory_max = CGROUP_LIMIT_MAX,
+                .memory_swap_max = CGROUP_LIMIT_MAX,
                 .memory_limit = (uint64_t) -1,
                 .cpu_usage_nsec = (uint64_t) -1,
                 .tasks_current = (uint64_t) -1,
@@ -4680,17 +4990,19 @@ static int show_one(
                 return log_error_errno(r, "Failed to get properties: %s", bus_error_message(&error, r));
 
         if (unit) {
-                r = bus_message_map_all_properties(reply, property_map, &info);
+                r = bus_message_map_all_properties(reply, property_map, &error, &info);
                 if (r < 0)
                         return log_error_errno(r, "Failed to map properties: %s", bus_error_message(&error, r));
 
                 if (streq_ptr(info.load_state, "not-found") && streq_ptr(info.active_state, "inactive")) {
-                        log_error("Unit %s could not be found.", unit);
+                        log_full(streq(verb, "status") ? LOG_ERR : LOG_DEBUG,
+                                 "Unit %s could not be found.", unit);
 
                         if (streq(verb, "status"))
                                 return EXIT_PROGRAM_OR_SERVICES_STATUS_UNKNOWN;
 
-                        return -ENOENT;
+                        if (!streq(verb, "show"))
+                                return -ENOENT;
                 }
 
                 r = sd_bus_message_rewind(reply, true);
@@ -4757,17 +5069,15 @@ static int show_one(
                 char **pp;
 
                 STRV_FOREACH(pp, arg_properties)
-                        if (!set_contains(found_properties, *pp)) {
-                                log_warning("Property %s does not exist.", *pp);
-                                r = -ENXIO;
-                        }
+                        if (!set_contains(found_properties, *pp))
+                                log_debug("Property %s does not exist.", *pp);
 
         } else if (streq(verb, "help"))
                 show_unit_help(&info);
         else if (streq(verb, "status")) {
                 print_status_info(bus, &info, ellipsized);
 
-                if (info.active_state && STR_IN_SET(info.active_state, "inactive", "failed"))
+                if (info.active_state && !STR_IN_SET(info.active_state, "active", "reloading"))
                         r = EXIT_PROGRAM_NOT_RUNNING;
                 else
                         r = EXIT_PROGRAM_RUNNING_OR_SERVICE_OK;
@@ -4852,8 +5162,9 @@ static int show_all(
 
 static int show_system_status(sd_bus *bus) {
         char since1[FORMAT_TIMESTAMP_RELATIVE_MAX], since2[FORMAT_TIMESTAMP_MAX];
-        _cleanup_free_ char *hn = NULL;
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_(machine_info_clear) struct machine_info mi = {};
+        _cleanup_free_ char *hn = NULL;
         const char *on, *off;
         int r;
 
@@ -4861,9 +5172,9 @@ static int show_system_status(sd_bus *bus) {
         if (!hn)
                 return log_oom();
 
-        r = bus_map_all_properties(bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", machine_info_property_map, &mi);
+        r = bus_map_all_properties(bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", machine_info_property_map, &error, &mi);
         if (r < 0)
-                return log_error_errno(r, "Failed to read server status: %m");
+                return log_error_errno(r, "Failed to read server status: %s", bus_error_message(&error, r));
 
         if (streq_ptr(mi.state, "degraded")) {
                 on = ansi_highlight_red();
@@ -5026,7 +5337,7 @@ static int cat_file(const char *filename, bool newline) {
                ansi_normal());
         fflush(stdout);
 
-        return copy_bytes(fd, STDOUT_FILENO, (uint64_t) -1, false);
+        return copy_bytes(fd, STDOUT_FILENO, (uint64_t) -1, 0);
 }
 
 static int cat(int argc, char *argv[], void *userdata) {
@@ -5072,6 +5383,20 @@ static int cat(int argc, char *argv[], void *userdata) {
                 else
                         puts("");
 
+                if (need_daemon_reload(bus, *name) > 0) /* ignore errors (<0), this is informational output */
+                        fprintf(stderr,
+                                "%s# Warning: %s changed on disk, the version systemd has loaded is outdated.\n"
+                                "%s# This output shows the current version of the unit's original fragment and drop-in files.\n"
+                                "%s# If fragments or drop-ins were added or removed, they are not properly reflected in this output.\n"
+                                "%s# Run 'systemctl%s daemon-reload' to reload units.%s\n",
+                                ansi_highlight_red(),
+                                *name,
+                                ansi_highlight_red(),
+                                ansi_highlight_red(),
+                                ansi_highlight_red(),
+                                arg_scope == UNIT_FILE_SYSTEM ? "" : " --user",
+                                ansi_normal());
+
                 if (fragment_path) {
                         r = cat_file(fragment_path, false);
                         if (r < 0)
@@ -5093,7 +5418,6 @@ static int set_property(int argc, char *argv[], void *userdata) {
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_free_ char *n = NULL;
         sd_bus *bus;
-        char **i;
         int r;
 
         r = acquire_bus(BUS_MANAGER, &bus);
@@ -5124,11 +5448,9 @@ static int set_property(int argc, char *argv[], void *userdata) {
         if (r < 0)
                 return bus_log_create_error(r);
 
-        STRV_FOREACH(i, strv_skip(argv, 2)) {
-                r = bus_append_unit_property_assignment(m, *i);
-                if (r < 0)
-                        return r;
-        }
+        r = bus_append_unit_property_assignment_many(m, strv_skip(argv, 2));
+        if (r < 0)
+                return r;
 
         r = sd_bus_message_close_container(m);
         if (r < 0)
@@ -5283,6 +5605,24 @@ static int reset_failed(int argc, char *argv[], void *userdata) {
         return r;
 }
 
+static int print_variable(const char *s) {
+        const char *sep;
+        _cleanup_free_ char *esc = NULL;
+
+        sep = strchr(s, '=');
+        if (!sep) {
+                log_error("Invalid environment block");
+                return -EUCLEAN;
+        }
+
+        esc = shell_maybe_quote(sep + 1, ESCAPE_POSIX);
+        if (!esc)
+                return log_oom();
+
+        printf("%.*s=%s\n", (int)(sep-s), s, esc);
+        return 0;
+}
+
 static int show_environment(int argc, char *argv[], void *userdata) {
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
@@ -5312,8 +5652,11 @@ static int show_environment(int argc, char *argv[], void *userdata) {
         if (r < 0)
                 return bus_log_parse_error(r);
 
-        while ((r = sd_bus_message_read_basic(reply, SD_BUS_TYPE_STRING, &text)) > 0)
-                puts(text);
+        while ((r = sd_bus_message_read_basic(reply, SD_BUS_TYPE_STRING, &text)) > 0) {
+                r = print_variable(text);
+                if (r < 0)
+                        return r;
+        }
         if (r < 0)
                 return bus_log_parse_error(r);
 
@@ -5364,14 +5707,27 @@ static int switch_root(int argc, char *argv[], void *userdata) {
 
                 /* If the passed init is actually the same as the
                  * systemd binary, then let's suppress it. */
-                if (files_same(root_init_path, root_systemd_path) > 0)
+                if (files_same(root_init_path, root_systemd_path, 0) > 0)
                         init = NULL;
         }
 
+        /* Instruct PID1 to exclude us from its killing spree applied during
+         * the transition. Otherwise we would exit with a failure status even
+         * though the switch to the new root has succeed. */
+        argv_cmdline[0] = '@';
+
         r = acquire_bus(BUS_MANAGER, &bus);
         if (r < 0)
                 return r;
 
+        /* If we are slow to exit after the root switch, the new systemd instance
+         * will send us a signal to terminate. Just ignore it and exit normally.
+         * This way the unit does not end up as failed.
+         */
+        r = ignore_signals(SIGTERM, -1);
+        if (r < 0)
+                log_warning_errno(r, "Failed to change disposition of SIGTERM to ignore: %m");
+
         log_debug("Switching root - root: %s; init: %s", root, strna(init));
 
         r = sd_bus_call_method(
@@ -5383,8 +5739,11 @@ static int switch_root(int argc, char *argv[], void *userdata) {
                         &error,
                         NULL,
                         "ss", root, init);
-        if (r < 0)
+        if (r < 0) {
+                (void) default_signals(SIGTERM, -1);
+
                 return log_error_errno(r, "Failed to switch root: %s", bus_error_message(&error, r));
+        }
 
         return 0;
 }
@@ -5566,10 +5925,12 @@ static int enable_sysv_units(const char *verb, char **args) {
                 if (!found_sysv)
                         continue;
 
-                if (found_native)
-                        log_info("Synchronizing state of %s with SysV service script with %s.", name, argv[0]);
-                else
-                        log_info("%s is not a native service, redirecting to systemd-sysv-install.", name);
+                if (!arg_quiet) {
+                        if (found_native)
+                                log_info("Synchronizing state of %s with SysV service script 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);
@@ -5582,7 +5943,8 @@ static int enable_sysv_units(const char *verb, char **args) {
                 if (!l)
                         return log_oom();
 
-                log_info("Executing: %s", l);
+                if (!arg_quiet)
+                        log_info("Executing: %s", l);
 
                 pid = fork();
                 if (pid < 0)
@@ -5656,6 +6018,7 @@ static int mangle_names(char **original_names, char ***mangled_names) {
                 } else {
                         r = unit_name_mangle(*name, UNIT_NAME_NOGLOB, i);
                         if (r < 0) {
+                                *i = NULL;
                                 strv_free(l);
                                 return log_error_errno(r, "Failed to mangle unit name: %m");
                         }
@@ -5670,6 +6033,57 @@ static int mangle_names(char **original_names, char ***mangled_names) {
         return 0;
 }
 
+static int normalize_filenames(char **names) {
+        char **u;
+        int r;
+
+        STRV_FOREACH(u, names)
+                if (!path_is_absolute(*u)) {
+                        char* normalized_path;
+
+                        if (!isempty(arg_root)) {
+                                log_error("Non-absolute paths are not allowed when --root is used: %s", *u);
+                                return -EINVAL;
+                        }
+
+                        if (!strchr(*u,'/')) {
+                                log_error("Link argument does contain at least one directory separator: %s", *u);
+                                return -EINVAL;
+                        }
+
+                        r = path_make_absolute_cwd(*u, &normalized_path);
+                        if (r < 0)
+                                return r;
+
+                        free_and_replace(*u, normalized_path);
+                }
+
+        return 0;
+}
+
+static int normalize_names(char **names, bool warn_if_path) {
+        char **u;
+        bool was_path = false;
+
+        STRV_FOREACH(u, names) {
+                int r;
+
+                if (!is_path(*u))
+                        continue;
+
+                r = free_and_strdup(u, basename(*u));
+                if (r < 0)
+                        return log_error_errno(r, "Failed to normalize unit file path: %m");
+
+                was_path = true;
+        }
+
+        if (warn_if_path && was_path)
+                log_warning("Warning: Can't execute disable on the unit file path. Proceeding with the unit name.");
+
+        return 0;
+}
+
 static int unit_exists(const char *unit) {
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
@@ -5703,7 +6117,7 @@ static int unit_exists(const char *unit) {
         if (r < 0)
                 return log_error_errno(r, "Failed to get properties: %s", bus_error_message(&error, r));
 
-        r = bus_message_map_all_properties(reply, property_map, &info);
+        r = bus_message_map_all_properties(reply, property_map, &error, &info);
         if (r < 0)
                 return log_error_errno(r, "Failed to map properties: %s", bus_error_message(&error, r));
 
@@ -5758,23 +6172,38 @@ static int enable_unit(int argc, char *argv[], void *userdata) {
                 return daemon_reload(argc, argv, userdata);
         }
 
+        if (streq(verb, "disable")) {
+                r = normalize_names(names, true);
+                if (r < 0)
+                        return r;
+        }
+
+        if (streq(verb, "link")) {
+                r = normalize_filenames(names);
+                if (r < 0)
+                        return r;
+        }
+
         if (install_client_side()) {
+                UnitFileFlags flags;
+
+                flags = args_to_flags();
                 if (streq(verb, "enable")) {
-                        r = unit_file_enable(arg_scope, arg_runtime, arg_root, names, arg_force, &changes, &n_changes);
+                        r = unit_file_enable(arg_scope, flags, arg_root, names, &changes, &n_changes);
                         carries_install_info = r;
                 } else if (streq(verb, "disable"))
-                        r = unit_file_disable(arg_scope, arg_runtime, arg_root, names, &changes, &n_changes);
+                        r = unit_file_disable(arg_scope, flags, arg_root, names, &changes, &n_changes);
                 else if (streq(verb, "reenable")) {
-                        r = unit_file_reenable(arg_scope, arg_runtime, arg_root, names, arg_force, &changes, &n_changes);
+                        r = unit_file_reenable(arg_scope, flags, arg_root, names, &changes, &n_changes);
                         carries_install_info = r;
                 } else if (streq(verb, "link"))
-                        r = unit_file_link(arg_scope, arg_runtime, arg_root, names, arg_force, &changes, &n_changes);
+                        r = unit_file_link(arg_scope, flags, arg_root, names, &changes, &n_changes);
                 else if (streq(verb, "preset")) {
-                        r = unit_file_preset(arg_scope, arg_runtime, arg_root, names, arg_preset_mode, arg_force, &changes, &n_changes);
+                        r = unit_file_preset(arg_scope, flags, arg_root, names, arg_preset_mode, &changes, &n_changes);
                 } else if (streq(verb, "mask"))
-                        r = unit_file_mask(arg_scope, arg_runtime, arg_root, names, arg_force, &changes, &n_changes);
+                        r = unit_file_mask(arg_scope, flags, arg_root, names, &changes, &n_changes);
                 else if (streq(verb, "unmask"))
-                        r = unit_file_unmask(arg_scope, arg_runtime, arg_root, names, &changes, &n_changes);
+                        r = unit_file_unmask(arg_scope, flags, arg_root, names, &changes, &n_changes);
                 else if (streq(verb, "revert"))
                         r = unit_file_revert(arg_scope, arg_root, names, &changes, &n_changes);
                 else
@@ -5905,21 +6334,25 @@ static int enable_unit(int argc, char *argv[], void *userdata) {
                             "4) In case of template units, the unit is meant to be enabled with some\n"
                             "   instance name specified.");
 
-        if (arg_now && n_changes > 0 && STR_IN_SET(argv[0], "enable", "disable", "mask")) {
-                char *new_args[n_changes + 2];
+        if (arg_now && STR_IN_SET(argv[0], "enable", "disable", "mask")) {
                 sd_bus *bus;
-                unsigned i;
+                unsigned len, i;
 
                 r = acquire_bus(BUS_MANAGER, &bus);
                 if (r < 0)
                         goto finish;
 
-                new_args[0] = (char*) (streq(argv[0], "enable") ? "start" : "stop");
-                for (i = 0; i < n_changes; i++)
-                        new_args[i + 1] = basename(changes[i].path);
-                new_args[i + 1] = NULL;
+                len = strv_length(names);
+                {
+                        char *new_args[len + 2];
+
+                        new_args[0] = (char*) (streq(argv[0], "enable") ? "start" : "stop");
+                        for (i = 0; i < len; i++)
+                                new_args[i + 1] = basename(names[i]);
+                        new_args[i + 1] = NULL;
 
-                r = start_unit(strv_length(new_args), new_args, userdata);
+                        r = start_unit(len + 1, new_args, userdata);
+                }
         }
 
 finish:
@@ -5956,7 +6389,7 @@ static int add_dependency(int argc, char *argv[], void *userdata) {
                 assert_not_reached("Unknown verb");
 
         if (install_client_side()) {
-                r = unit_file_add_dependency(arg_scope, arg_runtime, arg_root, names, target, dep, arg_force, &changes, &n_changes);
+                r = unit_file_add_dependency(arg_scope, args_to_flags(), arg_root, names, target, dep, &changes, &n_changes);
                 unit_file_dump_changes(r, "add dependency on", changes, n_changes, arg_quiet);
 
                 if (r > 0)
@@ -6018,7 +6451,7 @@ static int preset_all(int argc, char *argv[], void *userdata) {
         int r;
 
         if (install_client_side()) {
-                r = unit_file_preset_all(arg_scope, arg_runtime, arg_root, arg_preset_mode, arg_force, &changes, &n_changes);
+                r = unit_file_preset_all(arg_scope, args_to_flags(), arg_root, arg_preset_mode, &changes, &n_changes);
                 unit_file_dump_changes(r, "preset", changes, n_changes, arg_quiet);
 
                 if (r > 0)
@@ -6067,6 +6500,63 @@ finish:
         return r;
 }
 
+static int show_installation_targets_client_side(const char *name) {
+        UnitFileChange *changes = NULL;
+        unsigned n_changes = 0, i;
+        UnitFileFlags flags;
+        char **p;
+        int r;
+
+        p = STRV_MAKE(name);
+        flags = UNIT_FILE_DRY_RUN |
+                (arg_runtime ? UNIT_FILE_RUNTIME : 0);
+
+        r = unit_file_disable(UNIT_FILE_SYSTEM, flags, NULL, p, &changes, &n_changes);
+        if (r < 0)
+                return log_error_errno(r, "Failed to get file links for %s: %m", name);
+
+        for (i = 0; i < n_changes; i++)
+                if (changes[i].type == UNIT_FILE_UNLINK)
+                        printf("  %s\n", changes[i].path);
+
+        return 0;
+}
+
+static int show_installation_targets(sd_bus *bus, const char *name) {
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        const char *link;
+        int r;
+
+        r = sd_bus_call_method(
+                        bus,
+                        "org.freedesktop.systemd1",
+                        "/org/freedesktop/systemd1",
+                        "org.freedesktop.systemd1.Manager",
+                        "GetUnitFileLinks",
+                        &error,
+                        &reply,
+                        "sb", name, arg_runtime);
+        if (r < 0)
+                return log_error_errno(r, "Failed to get unit file links for %s: %s", name, bus_error_message(&error, r));
+
+        r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "s");
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        while ((r = sd_bus_message_read(reply, "s", &link)) > 0)
+                printf("  %s\n", link);
+
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        r = sd_bus_message_exit_container(reply);
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        return 0;
+}
+
 static int unit_is_enabled(int argc, char *argv[], void *userdata) {
 
         _cleanup_strv_free_ char **names = NULL;
@@ -6085,13 +6575,12 @@ static int unit_is_enabled(int argc, char *argv[], void *userdata) {
         enabled = r > 0;
 
         if (install_client_side()) {
-
                 STRV_FOREACH(name, names) {
                         UnitFileState state;
 
                         r = unit_file_get_state(arg_scope, arg_root, *name, &state);
                         if (r < 0)
-                                return log_error_errno(state, "Failed to get unit file state for %s: %m", *name);
+                                return log_error_errno(r, "Failed to get unit file state for %s: %m", *name);
 
                         if (IN_SET(state,
                                    UNIT_FILE_ENABLED,
@@ -6101,8 +6590,14 @@ static int unit_is_enabled(int argc, char *argv[], void *userdata) {
                                    UNIT_FILE_GENERATED))
                                 enabled = true;
 
-                        if (!arg_quiet)
+                        if (!arg_quiet) {
                                 puts(unit_file_state_to_string(state));
+                                if (arg_full) {
+                                        r = show_installation_targets_client_side(*name);
+                                        if (r < 0)
+                                                return r;
+                                }
+                        }
                 }
 
                 r = 0;
@@ -6137,8 +6632,14 @@ static int unit_is_enabled(int argc, char *argv[], void *userdata) {
                         if (STR_IN_SET(s, "enabled", "enabled-runtime", "static", "indirect", "generated"))
                                 enabled = true;
 
-                        if (!arg_quiet)
+                        if (!arg_quiet) {
                                 puts(s);
+                                if (arg_full) {
+                                        r = show_installation_targets(bus, *name);
+                                        if (r < 0)
+                                                return r;
+                                }
+                        }
                 }
         }
 
@@ -6196,7 +6697,7 @@ static int create_edit_temp_file(const char *new_path, const char *original_path
         if (r < 0)
                 return log_error_errno(r, "Failed to create directories for \"%s\": %m", new_path);
 
-        r = copy_file(original_path, t, 0, 0644, 0);
+        r = copy_file(original_path, t, 0, 0644, 0, COPY_REFLINK);
         if (r == -ENOENT) {
 
                 r = touch(t);
@@ -6222,12 +6723,12 @@ static int get_file_to_edit(
         assert(name);
         assert(ret_path);
 
-        path = strjoin(paths->persistent_config, "/", name, NULL);
+        path = strjoin(paths->persistent_config, "/", name);
         if (!path)
                 return log_oom();
 
         if (arg_runtime) {
-                run = strjoin(paths->runtime_config, "/", name, NULL);
+                run = strjoin(paths->runtime_config, "/", name);
                 if (!run)
                         return log_oom();
         }
@@ -6420,29 +6921,54 @@ static int find_paths_to_edit(sd_bus *bus, char **names, char ***paths) {
                 return r;
 
         STRV_FOREACH(name, names) {
-                _cleanup_free_ char *path = NULL, *new_path = NULL, *tmp_path = NULL;
+                _cleanup_free_ char *path = NULL, *new_path = NULL, *tmp_path = NULL, *tmp_name = NULL;
+                const char *unit_name;
 
                 r = unit_find_paths(bus, *name, &lp, &path, NULL);
                 if (r < 0)
                         return r;
-                else if (!arg_force) {
-                        if (r == 0) {
-                                log_error("Run 'systemctl edit --force %s' to create a new unit.", *name);
-                                return -ENOENT;
-                        } else if (!path) {
-                                // FIXME: support units with path==NULL (no FragmentPath)
-                                log_error("No fragment exists for %s.", *name);
+
+                if (r == 0) {
+                        assert(!path);
+
+                        if (!arg_force) {
+                                log_error("Run 'systemctl edit%s --force %s' to create a new unit.",
+                                          arg_scope == UNIT_FILE_GLOBAL ? " --global" :
+                                          arg_scope == UNIT_FILE_USER ? " --user" : "",
+                                          *name);
                                 return -ENOENT;
                         }
-                }
 
-                if (path) {
+                        /* Create a new unit from scratch */
+                        unit_name = *name;
+                        r = unit_file_create_new(&lp, unit_name,
+                                                 arg_full ? NULL : ".d/override.conf",
+                                                 &new_path, &tmp_path);
+                } else {
+                        assert(path);
+
+                        unit_name = basename(path);
+                        /* We follow unit aliases, but we need to propagate the instance */
+                        if (unit_name_is_valid(*name, UNIT_NAME_INSTANCE) &&
+                            unit_name_is_valid(unit_name, UNIT_NAME_TEMPLATE)) {
+                                _cleanup_free_ char *instance = NULL;
+
+                                r = unit_name_to_instance(*name, &instance);
+                                if (r < 0)
+                                        return r;
+
+                                r = unit_name_replace_instance(unit_name, instance, &tmp_name);
+                                if (r < 0)
+                                        return r;
+
+                                unit_name = tmp_name;
+                        }
+
                         if (arg_full)
-                                r = unit_file_create_copy(&lp, *name, path, &new_path, &tmp_path);
+                                r = unit_file_create_copy(&lp, unit_name, path, &new_path, &tmp_path);
                         else
-                                r = unit_file_create_new(&lp, *name, ".d/override.conf", &new_path, &tmp_path);
-                } else
-                        r = unit_file_create_new(&lp, *name, NULL, &new_path, &tmp_path);
+                                r = unit_file_create_new(&lp, unit_name, ".d/override.conf", &new_path, &tmp_path);
+                }
                 if (r < 0)
                         return r;
 
@@ -6551,9 +7077,10 @@ static void systemctl_help(void) {
                "  -t --type=TYPE      List units of a particular type\n"
                "     --state=STATE    List units with particular LOAD or SUB or ACTIVE state\n"
                "  -p --property=NAME  Show only properties by this name\n"
-               "  -a --all            Show all loaded units/properties, including dead/empty\n"
-               "                      ones. To list all units installed on the system, use\n"
-               "                      the 'list-unit-files' command instead.\n"
+               "  -a --all            Show all properties/all units currently in memory,\n"
+               "                      including dead/empty ones. To list all units installed on\n"
+               "                      the system, use the 'list-unit-files' command instead.\n"
+               "     --failed         Same as --state=failed\n"
                "  -l --full           Don't ellipsize unit names on output\n"
                "  -r --recursive      Show unit list of host and local containers\n"
                "     --reverse        Show reverse dependencies with 'list-dependencies'\n"
@@ -6567,6 +7094,7 @@ static void systemctl_help(void) {
                "  -s --signal=SIGNAL  Which signal to send\n"
                "     --now            Start or stop unit in addition to enabling or disabling it\n"
                "  -q --quiet          Suppress output\n"
+               "     --wait           For (re)start, wait until service stopped again\n"
                "     --no-block       Do not wait until operation finished\n"
                "     --no-wall        Don't send wall message before halt/power-off/reboot\n"
                "     --no-reload      Don't reload daemon after en-/dis-abling unit files\n"
@@ -6581,15 +7109,18 @@ static void systemctl_help(void) {
                "     --preset-mode=   Apply only enable, only disable, or all presets\n"
                "     --root=PATH      Enable unit files in the specified root directory\n"
                "  -n --lines=INTEGER  Number of journal entries to show\n"
-               "  -o --output=STRING  Change journal output mode (short, short-iso,\n"
-               "                              short-precise, short-monotonic, verbose,\n"
-               "                              export, json, json-pretty, json-sse, cat)\n"
+               "  -o --output=STRING  Change journal output mode (short, short-precise,\n"
+               "                             short-iso, short-iso-precise, short-full,\n"
+               "                             short-monotonic, short-unix,\n"
+               "                             verbose, export, json, json-pretty, json-sse, cat)\n"
                "     --firmware-setup Tell the firmware to show the setup menu on next boot\n"
                "     --plain          Print unit dependencies as a list instead of a tree\n\n"
                "Unit Commands:\n"
-               "  list-units [PATTERN...]         List loaded units\n"
-               "  list-sockets [PATTERN...]       List loaded sockets ordered by address\n"
-               "  list-timers [PATTERN...]        List loaded timers ordered by next elapse\n"
+               "  list-units [PATTERN...]         List units currently in memory\n"
+               "  list-sockets [PATTERN...]       List socket units currently in memory, ordered\n"
+               "                                  by address\n"
+               "  list-timers [PATTERN...]        List timer units currently in memory, ordered\n"
+               "                                  by next elapse\n"
                "  start NAME...                   Start (activate) one or more units\n"
                "  stop NAME...                    Stop (deactivate) one or more units\n"
                "  reload NAME...                  Reload one or more units\n"
@@ -6837,6 +7368,7 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
                 ARG_FIRMWARE_SETUP,
                 ARG_NOW,
                 ARG_MESSAGE,
+                ARG_WAIT,
         };
 
         static const struct option options[] = {
@@ -6860,6 +7392,7 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
                 { "user",                no_argument,       NULL, ARG_USER                },
                 { "system",              no_argument,       NULL, ARG_SYSTEM              },
                 { "global",              no_argument,       NULL, ARG_GLOBAL              },
+                { "wait",                no_argument,       NULL, ARG_WAIT                },
                 { "no-block",            no_argument,       NULL, ARG_NO_BLOCK            },
                 { "no-legend",           no_argument,       NULL, ARG_NO_LEGEND           },
                 { "no-pager",            no_argument,       NULL, ARG_NO_PAGER            },
@@ -6908,18 +7441,16 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
 
                 case 't': {
                         if (isempty(optarg)) {
-                                log_error("--type requires arguments.");
+                                log_error("--type= requires arguments.");
                                 return -EINVAL;
                         }
 
-                        p = optarg;
-                        for (;;) {
+                        for (p = optarg;;) {
                                 _cleanup_free_ char *type = NULL;
 
                                 r = extract_first_word(&p, &type, ",", 0);
                                 if (r < 0)
                                         return log_error_errno(r, "Failed to parse type: %s", optarg);
-
                                 if (r == 0)
                                         break;
 
@@ -6961,15 +7492,13 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
                                 arg_properties = new0(char*, 1);
                                 if (!arg_properties)
                                         return log_oom();
-                        } else {
-                                p = optarg;
-                                for (;;) {
+                        } else
+                                for (p = optarg;;) {
                                         _cleanup_free_ char *prop = NULL;
 
                                         r = extract_first_word(&p, &prop, ",", 0);
                                         if (r < 0)
                                                 return log_error_errno(r, "Failed to parse property: %s", optarg);
-
                                         if (r == 0)
                                                 break;
 
@@ -6978,7 +7507,6 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
 
                                         prop = NULL;
                                 }
-                        }
 
                         /* If the user asked for a particular
                          * property, show it to him, even if it is
@@ -6998,10 +7526,12 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
 
                 case ARG_AFTER:
                         arg_dependency = DEPENDENCY_AFTER;
+                        arg_jobs_after = true;
                         break;
 
                 case ARG_BEFORE:
                         arg_dependency = DEPENDENCY_BEFORE;
+                        arg_jobs_before = true;
                         break;
 
                 case ARG_SHOW_TYPES:
@@ -7040,6 +7570,10 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
                         arg_scope = UNIT_FILE_GLOBAL;
                         break;
 
+                case ARG_WAIT:
+                        arg_wait = true;
+                        break;
+
                 case ARG_NO_BLOCK:
                         arg_no_block = true;
                         break;
@@ -7147,18 +7681,16 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
 
                 case ARG_STATE: {
                         if (isempty(optarg)) {
-                                log_error("--signal requires arguments.");
+                                log_error("--state= requires arguments.");
                                 return -EINVAL;
                         }
 
-                        p = optarg;
-                        for (;;) {
+                        for (p = optarg;;) {
                                 _cleanup_free_ char *s = NULL;
 
                                 r = extract_first_word(&p, &s, ",", 0);
                                 if (r < 0)
-                                        return log_error_errno(r, "Failed to parse signal: %s", optarg);
-
+                                        return log_error_errno(r, "Failed to parse state: %s", optarg);
                                 if (r == 0)
                                         break;
 
@@ -7215,6 +7747,11 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
                 return -EINVAL;
         }
 
+        if (arg_wait && arg_no_block) {
+                log_error("--wait may not be combined with --no-block.");
+                return -EINVAL;
+        }
+
         return 1;
 }
 
@@ -7827,12 +8364,14 @@ static int halt_now(enum action a) {
         switch (a) {
 
         case ACTION_HALT:
-                log_info("Halting.");
+                if (!arg_quiet)
+                        log_info("Halting.");
                 (void) reboot(RB_HALT_SYSTEM);
                 return -errno;
 
         case ACTION_POWEROFF:
-                log_info("Powering off.");
+                if (!arg_quiet)
+                        log_info("Powering off.");
                 (void) reboot(RB_POWER_OFF);
                 return -errno;
 
@@ -7841,16 +8380,18 @@ static int halt_now(enum action a) {
                 _cleanup_free_ char *param = NULL;
 
                 r = read_one_line_file("/run/systemd/reboot-param", &param);
-                if (r < 0)
+                if (r < 0 && r != -ENOENT)
                         log_debug_errno(r, "Failed to read reboot parameter file: %m");
 
                 if (!isempty(param)) {
-                        log_info("Rebooting with argument '%s'.", param);
+                        if (!arg_quiet)
+                                log_info("Rebooting with argument '%s'.", param);
                         (void) syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, param);
                         log_warning_errno(errno, "Failed to reboot with parameter, retrying without: %m");
                 }
 
-                log_info("Rebooting.");
+                if (!arg_quiet)
+                        log_info("Rebooting.");
                 (void) reboot(RB_AUTOBOOT);
                 return -errno;
         }
@@ -7862,7 +8403,7 @@ static int halt_now(enum action a) {
 
 static int logind_schedule_shutdown(void) {
 
-#ifdef HAVE_LOGIND
+#ifdef ENABLE_LOGIND
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         char date[FORMAT_TIMESTAMP_MAX];
         const char *action;
@@ -7911,7 +8452,8 @@ static int logind_schedule_shutdown(void) {
         if (r < 0)
                 return log_warning_errno(r, "Failed to call ScheduleShutdown in logind, proceeding with immediate shutdown: %s", bus_error_message(&error, r));
 
-        log_info("Shutdown scheduled for %s, use 'shutdown -c' to cancel.", format_timestamp(date, sizeof(date), arg_when));
+        if (!arg_quiet)
+                log_info("Shutdown scheduled for %s, use 'shutdown -c' to cancel.", format_timestamp(date, sizeof(date), arg_when));
         return 0;
 #else
         log_error("Cannot schedule shutdown without logind support, proceeding with immediate shutdown.");
@@ -7990,7 +8532,7 @@ static int runlevel_main(void) {
 }
 
 static int logind_cancel_shutdown(void) {
-#ifdef HAVE_LOGIND
+#ifdef ENABLE_LOGIND
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         sd_bus *bus;
         int r;
@@ -8022,6 +8564,8 @@ static int logind_cancel_shutdown(void) {
 int main(int argc, char*argv[]) {
         int r;
 
+        argv_cmdline = argv[0];
+
         setlocale(LC_ALL, "");
         log_parse_environment();
         log_open();
@@ -8037,7 +8581,9 @@ int main(int argc, char*argv[]) {
                 goto finish;
 
         if (arg_action != ACTION_SYSTEMCTL && running_in_chroot() > 0) {
-                log_info("Running in chroot, ignoring request.");
+
+                if (!arg_quiet)
+                        log_info("Running in chroot, ignoring request.");
                 r = 0;
                 goto finish;
         }
index 3bb886b..97c3943 100644 (file)
@@ -22,8 +22,8 @@
 
 /* This is a private header; never even think of including this directly! */
 
-#if __INCLUDE_LEVEL__ <= 1
-#error "Do not include _sd-common.h directly; it is a private header."
+#if defined(__INCLUDE_LEVEL__) && __INCLUDE_LEVEL__ <= 1
+#  error "Do not include _sd-common.h directly; it is a private header."
 #endif
 
 #ifndef _sd_printf_
diff --git a/src/systemd/meson.build b/src/systemd/meson.build
new file mode 100644 (file)
index 0000000..debbd46
--- /dev/null
@@ -0,0 +1,59 @@
+_systemd_headers = '''
+        sd-bus.h
+        sd-bus-protocol.h
+        sd-bus-vtable.h
+        sd-daemon.h
+        sd-event.h
+        sd-id128.h
+        sd-journal.h
+        sd-login.h
+        sd-messages.h
+'''.split()
+
+# https://github.com/mesonbuild/meson/issues/1633
+systemd_headers = files(_systemd_headers)
+
+#  sd-device.h
+#  sd-hwdb.h
+#  sd-dhcp6-client.h
+#  sd-dhcp6-lease.h
+#  sd-dhcp-client.h
+#  sd-dhcp-lease.h
+#  sd-dhcp-server.h
+#  sd-ipv4acd.h
+#  sd-ipv4ll.h
+#  sd-lldp.h
+#  sd-ndisc.h
+#  sd-netlink.h
+#  sd-network.h
+#  sd-path.h
+#  sd-resolve.h
+#  sd-utf8.h
+
+install_headers(
+        systemd_headers,
+        '_sd-common.h',
+        subdir : 'systemd')
+
+
+############################################################
+
+opts = [['c'],
+        ['c', '-ansi'],
+        ['c', '-std=iso9899:1990']]
+
+cxx = find_program('c++', required : false)
+if cxx.found()
+        opts += [['c++']]
+endif
+
+foreach header : _systemd_headers
+        foreach opt : opts
+                name = ''.join([header, ':'] + opt)
+                test('cc-' + name,
+                     check_compilation_sh,
+                     args : cc.cmd_array() + ['-c', '-x'] + opt +
+                            ['-Werror', '-include',
+                             join_paths(meson.current_source_dir(), header)])
+        endforeach
+endforeach
index e8f84eb..1e82cae 100644 (file)
@@ -86,18 +86,26 @@ struct sd_bus_vtable {
         {                                                               \
                 .type = _SD_BUS_VTABLE_START,                           \
                 .flags = _flags,                                        \
-                .x.start.element_size = sizeof(sd_bus_vtable),          \
+                .x = {                                                  \
+                    .start = {                                          \
+                        .element_size = sizeof(sd_bus_vtable)           \
+                    },                                                  \
+                },                                                      \
         }
 
 #define SD_BUS_METHOD_WITH_OFFSET(_member, _signature, _result, _handler, _offset, _flags)   \
         {                                                               \
                 .type = _SD_BUS_VTABLE_METHOD,                          \
                 .flags = _flags,                                        \
-                .x.method.member = _member,                             \
-                .x.method.signature = _signature,                       \
-                .x.method.result = _result,                             \
-                .x.method.handler = _handler,                           \
-                .x.method.offset = _offset,                             \
+                .x = {                                                  \
+                    .method = {                                         \
+                        .member = _member,                              \
+                        .signature = _signature,                        \
+                        .result = _result,                              \
+                        .handler = _handler,                            \
+                        .offset = _offset,                              \
+                    },                                                  \
+                },                                                      \
         }
 #define SD_BUS_METHOD(_member, _signature, _result, _handler, _flags)   \
         SD_BUS_METHOD_WITH_OFFSET(_member, _signature, _result, _handler, 0, _flags)
@@ -106,34 +114,50 @@ struct sd_bus_vtable {
         {                                                               \
                 .type = _SD_BUS_VTABLE_SIGNAL,                          \
                 .flags = _flags,                                        \
-                .x.signal.member = _member,                             \
-                .x.signal.signature = _signature,                       \
+                .x = {                                                  \
+                    .signal = {                                         \
+                        .member = _member,                              \
+                        .signature = _signature,                        \
+                    },                                                  \
+                },                                                      \
         }
 
 #define SD_BUS_PROPERTY(_member, _signature, _get, _offset, _flags)     \
         {                                                               \
                 .type = _SD_BUS_VTABLE_PROPERTY,                        \
                 .flags = _flags,                                        \
-                .x.property.member = _member,                           \
-                .x.property.signature = _signature,                     \
-                .x.property.get = _get,                                 \
-                .x.property.offset = _offset,                           \
+                .x = {                                                  \
+                    .property = {                                       \
+                        .member = _member,                              \
+                        .signature = _signature,                        \
+                        .get = _get,                                    \
+                        .set = NULL,                                    \
+                        .offset = _offset,                              \
+                    },                                                  \
+                },                                                      \
         }
 
 #define SD_BUS_WRITABLE_PROPERTY(_member, _signature, _get, _set, _offset, _flags) \
         {                                                               \
                 .type = _SD_BUS_VTABLE_WRITABLE_PROPERTY,               \
                 .flags = _flags,                                        \
-                .x.property.member = _member,                           \
-                .x.property.signature = _signature,                     \
-                .x.property.get = _get,                                 \
-                .x.property.set = _set,                                 \
-                .x.property.offset = _offset,                           \
+                .x = {                                                  \
+                    .property = {                                       \
+                        .member = _member,                              \
+                        .signature = _signature,                        \
+                        .get = _get,                                    \
+                        .set = _set,                                    \
+                        .offset = _offset,                              \
+                    },                                                  \
+                },                                                      \
         }
 
 #define SD_BUS_VTABLE_END                                               \
         {                                                               \
                 .type = _SD_BUS_VTABLE_END,                             \
+                .flags = 0,                                             \
+                .x = {                                                  \
+                },                                                      \
         }
 
 _SD_END_DECLARATIONS;
index e6a2ce5..2b6aeb7 100644 (file)
@@ -147,6 +147,8 @@ int sd_bus_can_send(sd_bus *bus, char type);
 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);
+int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b);
+int sd_bus_get_exit_on_disconnect(sd_bus *bus);
 
 int sd_bus_start(sd_bus *ret);
 
@@ -439,8 +441,14 @@ int sd_bus_track_remove_sender(sd_bus_track *track, sd_bus_message *m);
 int sd_bus_track_add_name(sd_bus_track *track, const char *name);
 int sd_bus_track_remove_name(sd_bus_track *track, const char *name);
 
+int sd_bus_track_set_recursive(sd_bus_track *track, int b);
+int sd_bus_track_get_recursive(sd_bus_track *track);
+
 unsigned sd_bus_track_count(sd_bus_track *track);
-const char* sd_bus_track_contains(sd_bus_track *track, const char *names);
+int sd_bus_track_count_sender(sd_bus_track *track, sd_bus_message *m);
+int sd_bus_track_count_name(sd_bus_track *track, const char *name);
+
+const char* sd_bus_track_contains(sd_bus_track *track, const char *name);
 const char* sd_bus_track_first(sd_bus_track *track);
 const char* sd_bus_track_next(sd_bus_track *track);
 
index 740b176..8c096f6 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <inttypes.h>
 #include <sys/types.h>
+#include <sys/socket.h>
 
 #include "_sd-common.h"
 
@@ -131,6 +132,18 @@ int sd_is_socket(int fd, int family, int type, int listening);
 int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port);
 
 /*
+  Helper call for identifying a passed file descriptor. Returns 1 if the
+  file descriptor is an Internet socket of the specified type
+  (SOCK_DGRAM, SOCK_STREAM, ...), and if the address of the socket is
+  the same as the address specified by addr. The listening flag is used
+  the same way as in sd_is_socket(). Returns a negative errno style
+  error code on failure.
+
+  See sd_is_socket_sockaddr(3) for more information.
+*/
+int sd_is_socket_sockaddr(int fd, int type, const struct sockaddr* addr, unsigned addr_len, int listening);
+
+/*
   Helper call for identifying a passed file descriptor. Returns 1 if
   the file descriptor is an AF_UNIX socket of the specified type
   (SOCK_DGRAM, SOCK_STREAM, ...) and path, 0 otherwise. If type is 0
index 9a90c2e..f731fdc 100644 (file)
@@ -76,6 +76,7 @@ enum {
         SD_DHCP_OPTION_FQDN                        = 81,
         SD_DHCP_OPTION_NEW_POSIX_TIMEZONE          = 100,
         SD_DHCP_OPTION_NEW_TZDB_TIMEZONE           = 101,
+        SD_DHCP_OPTION_DOMAIN_SEARCH_LIST          = 119,
         SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE      = 121,
         SD_DHCP_OPTION_PRIVATE_BASE                = 224,
         SD_DHCP_OPTION_PRIVATE_LAST                = 254,
@@ -126,6 +127,9 @@ int sd_dhcp_client_get_client_id(
 int sd_dhcp_client_set_mtu(
                 sd_dhcp_client *client,
                 uint32_t mtu);
+int sd_dhcp_client_set_client_port(
+                sd_dhcp_client *client,
+                uint16_t port);
 int sd_dhcp_client_set_hostname(
                 sd_dhcp_client *client,
                 const char *hostname);
index 2f565ca..7ab99cc 100644 (file)
@@ -49,6 +49,7 @@ int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, const struct in_addr **addr);
 int sd_dhcp_lease_get_ntp(sd_dhcp_lease *lease, const struct in_addr **addr);
 int sd_dhcp_lease_get_mtu(sd_dhcp_lease *lease, uint16_t *mtu);
 int sd_dhcp_lease_get_domainname(sd_dhcp_lease *lease, const char **domainname);
+int sd_dhcp_lease_get_search_domains(sd_dhcp_lease *lease, char ***domains);
 int sd_dhcp_lease_get_hostname(sd_dhcp_lease *lease, const char **hostname);
 int sd_dhcp_lease_get_root_path(sd_dhcp_lease *lease, const char **root_path);
 int sd_dhcp_lease_get_routes(sd_dhcp_lease *lease, sd_dhcp_route ***routes);
index cc26b7d..f8cb895 100644 (file)
@@ -69,7 +69,7 @@ typedef int (*sd_event_handler_t)(sd_event_source *s, void *userdata);
 typedef int (*sd_event_io_handler_t)(sd_event_source *s, int fd, uint32_t revents, void *userdata);
 typedef int (*sd_event_time_handler_t)(sd_event_source *s, uint64_t usec, void *userdata);
 typedef int (*sd_event_signal_handler_t)(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata);
-#if defined __USE_POSIX199309 || defined __USE_XOPEN_EXTENDED
+#if defined _GNU_SOURCE || _POSIX_C_SOURCE >= 199309L
 typedef int (*sd_event_child_handler_t)(sd_event_source *s, const siginfo_t *si, void *userdata);
 #else
 typedef void* sd_event_child_handler_t;
index 4dff0b9..9b38969 100644 (file)
@@ -39,14 +39,14 @@ union sd_id128 {
 #define SD_ID128_STRING_MAX 33
 
 char *sd_id128_to_string(sd_id128_t id, char s[SD_ID128_STRING_MAX]);
-
 int sd_id128_from_string(const char *s, sd_id128_t *ret);
 
 int sd_id128_randomize(sd_id128_t *ret);
 
 int sd_id128_get_machine(sd_id128_t *ret);
-
+int sd_id128_get_machine_app_specific(sd_id128_t app_id, sd_id128_t *ret);
 int sd_id128_get_boot(sd_id128_t *ret);
+int sd_id128_get_invocation(sd_id128_t *ret);
 
 #define SD_ID128_MAKE(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) \
         ((const sd_id128_t) { .bytes = { 0x##v0, 0x##v1, 0x##v2, 0x##v3, 0x##v4, 0x##v5, 0x##v6, 0x##v7, \
@@ -100,6 +100,9 @@ int sd_id128_get_boot(sd_id128_t *ret);
                 ((x).bytes[15] & 15) >= 10 ? 'a' + ((x).bytes[15] & 15) - 10 : '0' + ((x).bytes[15] & 15), \
                 0 })
 
+#define SD_ID128_MAKE_STR(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) \
+        #a #b #c #d #e #f #g #h #i #j #k #l #m #n #o #p
+
 _sd_pure_ static __inline__ int sd_id128_equal(sd_id128_t a, sd_id128_t b) {
         return memcmp(&a, &b, 16) == 0;
 }
index 1109ec5..5ba9208 100644 (file)
@@ -47,6 +47,7 @@ int sd_ipv4ll_set_ifindex(sd_ipv4ll *ll, int interface_index);
 int sd_ipv4ll_set_address(sd_ipv4ll *ll, const struct in_addr *address);
 int sd_ipv4ll_set_address_seed(sd_ipv4ll *ll, uint64_t seed);
 int sd_ipv4ll_is_running(sd_ipv4ll *ll);
+int sd_ipv4ll_restart(sd_ipv4ll *ll);
 int sd_ipv4ll_start(sd_ipv4ll *ll);
 int sd_ipv4ll_stop(sd_ipv4ll *ll);
 sd_ipv4ll *sd_ipv4ll_ref(sd_ipv4ll *ll);
index 3c44d63..f466d9b 100644 (file)
@@ -33,58 +33,109 @@ _SD_BEGIN_DECLARATIONS;
  * with journalctl --new-id128. Do not use any other IDs, and do not
  * count them up manually. */
 
-#define SD_MESSAGE_JOURNAL_START    SD_ID128_MAKE(f7,73,79,a8,49,0b,40,8b,be,5f,69,40,50,5a,77,7b)
-#define SD_MESSAGE_JOURNAL_STOP     SD_ID128_MAKE(d9,3f,b3,c9,c2,4d,45,1a,97,ce,a6,15,ce,59,c0,0b)
-#define SD_MESSAGE_JOURNAL_DROPPED  SD_ID128_MAKE(a5,96,d6,fe,7b,fa,49,94,82,8e,72,30,9e,95,d6,1e)
-#define SD_MESSAGE_JOURNAL_MISSED   SD_ID128_MAKE(e9,bf,28,e6,e8,34,48,1b,b6,f4,8f,54,8a,d1,36,06)
-#define SD_MESSAGE_JOURNAL_USAGE    SD_ID128_MAKE(ec,38,7f,57,7b,84,4b,8f,a9,48,f3,3c,ad,9a,75,e6)
-
-#define SD_MESSAGE_COREDUMP         SD_ID128_MAKE(fc,2e,22,bc,6e,e6,47,b6,b9,07,29,ab,34,a2,50,b1)
-
-#define SD_MESSAGE_SESSION_START    SD_ID128_MAKE(8d,45,62,0c,1a,43,48,db,b1,74,10,da,57,c6,0c,66)
-#define SD_MESSAGE_SESSION_STOP     SD_ID128_MAKE(33,54,93,94,24,b4,45,6d,98,02,ca,83,33,ed,42,4a)
-#define SD_MESSAGE_SEAT_START       SD_ID128_MAKE(fc,be,fc,5d,a2,3d,42,80,93,f9,7c,82,a9,29,0f,7b)
-#define SD_MESSAGE_SEAT_STOP        SD_ID128_MAKE(e7,85,2b,fe,46,78,4e,d0,ac,cd,e0,4b,c8,64,c2,d5)
-#define SD_MESSAGE_MACHINE_START    SD_ID128_MAKE(24,d8,d4,45,25,73,40,24,96,06,83,81,a6,31,2d,f2)
-#define SD_MESSAGE_MACHINE_STOP     SD_ID128_MAKE(58,43,2b,d3,ba,ce,47,7c,b5,14,b5,63,81,b8,a7,58)
-
-#define SD_MESSAGE_TIME_CHANGE      SD_ID128_MAKE(c7,a7,87,07,9b,35,4e,aa,a9,e7,7b,37,18,93,cd,27)
-#define SD_MESSAGE_TIMEZONE_CHANGE  SD_ID128_MAKE(45,f8,2f,4a,ef,7a,4b,bf,94,2c,e8,61,d1,f2,09,90)
-
-#define SD_MESSAGE_STARTUP_FINISHED SD_ID128_MAKE(b0,7a,24,9c,d0,24,41,4a,82,dd,00,cd,18,13,78,ff)
-
-#define SD_MESSAGE_SLEEP_START      SD_ID128_MAKE(6b,bd,95,ee,97,79,41,e4,97,c4,8b,e2,7c,25,41,28)
-#define SD_MESSAGE_SLEEP_STOP       SD_ID128_MAKE(88,11,e6,df,2a,8e,40,f5,8a,94,ce,a2,6f,8e,bf,14)
-
-#define SD_MESSAGE_SHUTDOWN         SD_ID128_MAKE(98,26,88,66,d1,d5,4a,49,9c,4e,98,92,1d,93,bc,40)
-
-#define SD_MESSAGE_UNIT_STARTING    SD_ID128_MAKE(7d,49,58,e8,42,da,4a,75,8f,6c,1c,dc,7b,36,dc,c5)
-#define SD_MESSAGE_UNIT_STARTED     SD_ID128_MAKE(39,f5,34,79,d3,a0,45,ac,8e,11,78,62,48,23,1f,bf)
-#define SD_MESSAGE_UNIT_STOPPING    SD_ID128_MAKE(de,5b,42,6a,63,be,47,a7,b6,ac,3e,aa,c8,2e,2f,6f)
-#define SD_MESSAGE_UNIT_STOPPED     SD_ID128_MAKE(9d,1a,aa,27,d6,01,40,bd,96,36,54,38,aa,d2,02,86)
-#define SD_MESSAGE_UNIT_FAILED      SD_ID128_MAKE(be,02,cf,68,55,d2,42,8b,a4,0d,f7,e9,d0,22,f0,3d)
-#define SD_MESSAGE_UNIT_RELOADING   SD_ID128_MAKE(d3,4d,03,7f,ff,18,47,e6,ae,66,9a,37,0e,69,47,25)
-#define SD_MESSAGE_UNIT_RELOADED    SD_ID128_MAKE(7b,05,eb,c6,68,38,42,22,ba,a8,88,11,79,cf,da,54)
-
-#define SD_MESSAGE_SPAWN_FAILED     SD_ID128_MAKE(64,12,57,65,1c,1b,4e,c9,a8,62,4d,7a,40,a9,e1,e7)
-
-#define SD_MESSAGE_FORWARD_SYSLOG_MISSED SD_ID128_MAKE(00,27,22,9c,a0,64,41,81,a7,6c,4e,92,45,8a,fa,2e)
-
-#define SD_MESSAGE_OVERMOUNTING     SD_ID128_MAKE(1d,ee,03,69,c7,fc,47,36,b7,09,9b,38,ec,b4,6e,e7)
-
-#define SD_MESSAGE_LID_OPENED       SD_ID128_MAKE(b7,2e,a4,a2,88,15,45,a0,b5,0e,20,0e,55,b9,b0,6f)
-#define SD_MESSAGE_LID_CLOSED       SD_ID128_MAKE(b7,2e,a4,a2,88,15,45,a0,b5,0e,20,0e,55,b9,b0,70)
-#define SD_MESSAGE_SYSTEM_DOCKED    SD_ID128_MAKE(f5,f4,16,b8,62,07,4b,28,92,7a,48,c3,ba,7d,51,ff)
-#define SD_MESSAGE_SYSTEM_UNDOCKED  SD_ID128_MAKE(51,e1,71,bd,58,52,48,56,81,10,14,4c,51,7c,ca,53)
-#define SD_MESSAGE_POWER_KEY        SD_ID128_MAKE(b7,2e,a4,a2,88,15,45,a0,b5,0e,20,0e,55,b9,b0,71)
-#define SD_MESSAGE_SUSPEND_KEY      SD_ID128_MAKE(b7,2e,a4,a2,88,15,45,a0,b5,0e,20,0e,55,b9,b0,72)
-#define SD_MESSAGE_HIBERNATE_KEY    SD_ID128_MAKE(b7,2e,a4,a2,88,15,45,a0,b5,0e,20,0e,55,b9,b0,73)
-
-#define SD_MESSAGE_INVALID_CONFIGURATION SD_ID128_MAKE(c7,72,d2,4e,9a,88,4c,be,b9,ea,12,62,5c,30,6c,01)
-
-#define SD_MESSAGE_DNSSEC_FAILURE   SD_ID128_MAKE(16,75,d7,f1,72,17,40,98,b1,10,8b,f8,c7,dc,8f,5d)
-#define SD_MESSAGE_DNSSEC_TRUST_ANCHOR_REVOKED SD_ID128_MAKE(4d,44,08,cf,d0,d1,44,85,91,84,d1,e6,5d,7c,8a,65)
-#define SD_MESSAGE_DNSSEC_DOWNGRADE SD_ID128_MAKE(36,db,2d,fa,5a,90,45,e1,bd,4a,f5,f9,3e,1c,f0,57)
+#define SD_MESSAGE_JOURNAL_START          SD_ID128_MAKE(f7,73,79,a8,49,0b,40,8b,be,5f,69,40,50,5a,77,7b)
+#define SD_MESSAGE_JOURNAL_START_STR      SD_ID128_MAKE_STR(f7,73,79,a8,49,0b,40,8b,be,5f,69,40,50,5a,77,7b)
+#define SD_MESSAGE_JOURNAL_STOP           SD_ID128_MAKE(d9,3f,b3,c9,c2,4d,45,1a,97,ce,a6,15,ce,59,c0,0b)
+#define SD_MESSAGE_JOURNAL_STOP_STR       SD_ID128_MAKE_STR(d9,3f,b3,c9,c2,4d,45,1a,97,ce,a6,15,ce,59,c0,0b)
+#define SD_MESSAGE_JOURNAL_DROPPED        SD_ID128_MAKE(a5,96,d6,fe,7b,fa,49,94,82,8e,72,30,9e,95,d6,1e)
+#define SD_MESSAGE_JOURNAL_DROPPED_STR    SD_ID128_MAKE_STR(a5,96,d6,fe,7b,fa,49,94,82,8e,72,30,9e,95,d6,1e)
+#define SD_MESSAGE_JOURNAL_MISSED         SD_ID128_MAKE(e9,bf,28,e6,e8,34,48,1b,b6,f4,8f,54,8a,d1,36,06)
+#define SD_MESSAGE_JOURNAL_MISSED_STR     SD_ID128_MAKE_STR(e9,bf,28,e6,e8,34,48,1b,b6,f4,8f,54,8a,d1,36,06)
+#define SD_MESSAGE_JOURNAL_USAGE          SD_ID128_MAKE(ec,38,7f,57,7b,84,4b,8f,a9,48,f3,3c,ad,9a,75,e6)
+#define SD_MESSAGE_JOURNAL_USAGE_STR      SD_ID128_MAKE_STR(ec,38,7f,57,7b,84,4b,8f,a9,48,f3,3c,ad,9a,75,e6)
+
+#define SD_MESSAGE_COREDUMP               SD_ID128_MAKE(fc,2e,22,bc,6e,e6,47,b6,b9,07,29,ab,34,a2,50,b1)
+#define SD_MESSAGE_COREDUMP_STR           SD_ID128_MAKE_STR(fc,2e,22,bc,6e,e6,47,b6,b9,07,29,ab,34,a2,50,b1)
+#define SD_MESSAGE_TRUNCATED_CORE         SD_ID128_MAKE(5a,ad,d8,e9,54,dc,4b,1a,8c,95,4d,63,fd,9e,11,37)
+#define SD_MESSAGE_TRUNCATED_CORE_STR     SD_ID128_MAKE_STR(5a,ad,d8,e9,54,dc,4b,1a,8c,95,4d,63,fd,9e,11,37)
+#define SD_MESSAGE_BACKTRACE              SD_ID128_MAKE(1f,4e,0a,44,a8,86,49,93,9a,ae,a3,4f,c6,da,8c,95)
+#define SD_MESSAGE_BACKTRACE_STR          SD_ID128_MAKE_STR(1f,4e,0a,44,a8,86,49,93,9a,ae,a3,4f,c6,da,8c,95)
+
+#define SD_MESSAGE_SESSION_START          SD_ID128_MAKE(8d,45,62,0c,1a,43,48,db,b1,74,10,da,57,c6,0c,66)
+#define SD_MESSAGE_SESSION_START_STR      SD_ID128_MAKE_STR(8d,45,62,0c,1a,43,48,db,b1,74,10,da,57,c6,0c,66)
+#define SD_MESSAGE_SESSION_STOP           SD_ID128_MAKE(33,54,93,94,24,b4,45,6d,98,02,ca,83,33,ed,42,4a)
+#define SD_MESSAGE_SESSION_STOP_STR       SD_ID128_MAKE_STR(33,54,93,94,24,b4,45,6d,98,02,ca,83,33,ed,42,4a)
+#define SD_MESSAGE_SEAT_START             SD_ID128_MAKE(fc,be,fc,5d,a2,3d,42,80,93,f9,7c,82,a9,29,0f,7b)
+#define SD_MESSAGE_SEAT_START_STR         SD_ID128_MAKE_STR(fc,be,fc,5d,a2,3d,42,80,93,f9,7c,82,a9,29,0f,7b)
+#define SD_MESSAGE_SEAT_STOP              SD_ID128_MAKE(e7,85,2b,fe,46,78,4e,d0,ac,cd,e0,4b,c8,64,c2,d5)
+#define SD_MESSAGE_SEAT_STOP_STR          SD_ID128_MAKE_STR(e7,85,2b,fe,46,78,4e,d0,ac,cd,e0,4b,c8,64,c2,d5)
+#define SD_MESSAGE_MACHINE_START          SD_ID128_MAKE(24,d8,d4,45,25,73,40,24,96,06,83,81,a6,31,2d,f2)
+#define SD_MESSAGE_MACHINE_START_STR      SD_ID128_MAKE_STR(24,d8,d4,45,25,73,40,24,96,06,83,81,a6,31,2d,f2)
+#define SD_MESSAGE_MACHINE_STOP           SD_ID128_MAKE(58,43,2b,d3,ba,ce,47,7c,b5,14,b5,63,81,b8,a7,58)
+#define SD_MESSAGE_MACHINE_STOP_STR       SD_ID128_MAKE_STR(58,43,2b,d3,ba,ce,47,7c,b5,14,b5,63,81,b8,a7,58)
+
+#define SD_MESSAGE_TIME_CHANGE            SD_ID128_MAKE(c7,a7,87,07,9b,35,4e,aa,a9,e7,7b,37,18,93,cd,27)
+#define SD_MESSAGE_TIME_CHANGE_STR        SD_ID128_MAKE_STR(c7,a7,87,07,9b,35,4e,aa,a9,e7,7b,37,18,93,cd,27)
+#define SD_MESSAGE_TIMEZONE_CHANGE        SD_ID128_MAKE(45,f8,2f,4a,ef,7a,4b,bf,94,2c,e8,61,d1,f2,09,90)
+#define SD_MESSAGE_TIMEZONE_CHANGE_STR    SD_ID128_MAKE_STR(45,f8,2f,4a,ef,7a,4b,bf,94,2c,e8,61,d1,f2,09,90)
+
+#define SD_MESSAGE_STARTUP_FINISHED       SD_ID128_MAKE(b0,7a,24,9c,d0,24,41,4a,82,dd,00,cd,18,13,78,ff)
+#define SD_MESSAGE_STARTUP_FINISHED_STR   SD_ID128_MAKE_STR(b0,7a,24,9c,d0,24,41,4a,82,dd,00,cd,18,13,78,ff)
+#define SD_MESSAGE_USER_STARTUP_FINISHED \
+                                          SD_ID128_MAKE(ee,d0,0a,68,ff,d8,4e,31,88,21,05,fd,97,3a,bd,d1)
+#define SD_MESSAGE_USER_STARTUP_FINISHED_STR \
+                                          SD_ID128_MAKE_STR(ee,d0,0a,68,ff,d8,4e,31,88,21,05,fd,97,3a,bd,d1)
+
+#define SD_MESSAGE_SLEEP_START            SD_ID128_MAKE(6b,bd,95,ee,97,79,41,e4,97,c4,8b,e2,7c,25,41,28)
+#define SD_MESSAGE_SLEEP_START_STR        SD_ID128_MAKE_STR(6b,bd,95,ee,97,79,41,e4,97,c4,8b,e2,7c,25,41,28)
+#define SD_MESSAGE_SLEEP_STOP             SD_ID128_MAKE(88,11,e6,df,2a,8e,40,f5,8a,94,ce,a2,6f,8e,bf,14)
+#define SD_MESSAGE_SLEEP_STOP_STR         SD_ID128_MAKE_STR(88,11,e6,df,2a,8e,40,f5,8a,94,ce,a2,6f,8e,bf,14)
+
+#define SD_MESSAGE_SHUTDOWN               SD_ID128_MAKE(98,26,88,66,d1,d5,4a,49,9c,4e,98,92,1d,93,bc,40)
+#define SD_MESSAGE_SHUTDOWN_STR           SD_ID128_MAKE_STR(98,26,88,66,d1,d5,4a,49,9c,4e,98,92,1d,93,bc,40)
+
+#define SD_MESSAGE_UNIT_STARTING          SD_ID128_MAKE(7d,49,58,e8,42,da,4a,75,8f,6c,1c,dc,7b,36,dc,c5)
+#define SD_MESSAGE_UNIT_STARTING_STR      SD_ID128_MAKE_STR(7d,49,58,e8,42,da,4a,75,8f,6c,1c,dc,7b,36,dc,c5)
+#define SD_MESSAGE_UNIT_STARTED           SD_ID128_MAKE(39,f5,34,79,d3,a0,45,ac,8e,11,78,62,48,23,1f,bf)
+#define SD_MESSAGE_UNIT_STARTED_STR       SD_ID128_MAKE_STR(39,f5,34,79,d3,a0,45,ac,8e,11,78,62,48,23,1f,bf)
+#define SD_MESSAGE_UNIT_STOPPING          SD_ID128_MAKE(de,5b,42,6a,63,be,47,a7,b6,ac,3e,aa,c8,2e,2f,6f)
+#define SD_MESSAGE_UNIT_STOPPING_STR      SD_ID128_MAKE_STR(de,5b,42,6a,63,be,47,a7,b6,ac,3e,aa,c8,2e,2f,6f)
+#define SD_MESSAGE_UNIT_STOPPED           SD_ID128_MAKE(9d,1a,aa,27,d6,01,40,bd,96,36,54,38,aa,d2,02,86)
+#define SD_MESSAGE_UNIT_STOPPED_STR       SD_ID128_MAKE_STR(9d,1a,aa,27,d6,01,40,bd,96,36,54,38,aa,d2,02,86)
+#define SD_MESSAGE_UNIT_FAILED            SD_ID128_MAKE(be,02,cf,68,55,d2,42,8b,a4,0d,f7,e9,d0,22,f0,3d)
+#define SD_MESSAGE_UNIT_FAILED_STR        SD_ID128_MAKE_STR(be,02,cf,68,55,d2,42,8b,a4,0d,f7,e9,d0,22,f0,3d)
+#define SD_MESSAGE_UNIT_RELOADING         SD_ID128_MAKE(d3,4d,03,7f,ff,18,47,e6,ae,66,9a,37,0e,69,47,25)
+#define SD_MESSAGE_UNIT_RELOADING_STR     SD_ID128_MAKE_STR(d3,4d,03,7f,ff,18,47,e6,ae,66,9a,37,0e,69,47,25)
+#define SD_MESSAGE_UNIT_RELOADED          SD_ID128_MAKE(7b,05,eb,c6,68,38,42,22,ba,a8,88,11,79,cf,da,54)
+#define SD_MESSAGE_UNIT_RELOADED_STR      SD_ID128_MAKE_STR(7b,05,eb,c6,68,38,42,22,ba,a8,88,11,79,cf,da,54)
+
+#define SD_MESSAGE_SPAWN_FAILED           SD_ID128_MAKE(64,12,57,65,1c,1b,4e,c9,a8,62,4d,7a,40,a9,e1,e7)
+#define SD_MESSAGE_SPAWN_FAILED_STR       SD_ID128_MAKE_STR(64,12,57,65,1c,1b,4e,c9,a8,62,4d,7a,40,a9,e1,e7)
+
+#define SD_MESSAGE_FORWARD_SYSLOG_MISSED  SD_ID128_MAKE(00,27,22,9c,a0,64,41,81,a7,6c,4e,92,45,8a,fa,2e)
+#define SD_MESSAGE_FORWARD_SYSLOG_MISSED_STR \
+                                          SD_ID128_MAKE_STR(00,27,22,9c,a0,64,41,81,a7,6c,4e,92,45,8a,fa,2e)
+
+#define SD_MESSAGE_OVERMOUNTING           SD_ID128_MAKE(1d,ee,03,69,c7,fc,47,36,b7,09,9b,38,ec,b4,6e,e7)
+#define SD_MESSAGE_OVERMOUNTING_STR       SD_ID128_MAKE_STR(1d,ee,03,69,c7,fc,47,36,b7,09,9b,38,ec,b4,6e,e7)
+
+#define SD_MESSAGE_LID_OPENED             SD_ID128_MAKE(b7,2e,a4,a2,88,15,45,a0,b5,0e,20,0e,55,b9,b0,6f)
+#define SD_MESSAGE_LID_OPENED_STR         SD_ID128_MAKE_STR(b7,2e,a4,a2,88,15,45,a0,b5,0e,20,0e,55,b9,b0,6f)
+#define SD_MESSAGE_LID_CLOSED             SD_ID128_MAKE(b7,2e,a4,a2,88,15,45,a0,b5,0e,20,0e,55,b9,b0,70)
+#define SD_MESSAGE_LID_CLOSED_STR         SD_ID128_MAKE_STR(b7,2e,a4,a2,88,15,45,a0,b5,0e,20,0e,55,b9,b0,70)
+#define SD_MESSAGE_SYSTEM_DOCKED          SD_ID128_MAKE(f5,f4,16,b8,62,07,4b,28,92,7a,48,c3,ba,7d,51,ff)
+#define SD_MESSAGE_SYSTEM_DOCKED_STR      SD_ID128_MAKE_STR(f5,f4,16,b8,62,07,4b,28,92,7a,48,c3,ba,7d,51,ff)
+#define SD_MESSAGE_SYSTEM_UNDOCKED        SD_ID128_MAKE(51,e1,71,bd,58,52,48,56,81,10,14,4c,51,7c,ca,53)
+#define SD_MESSAGE_SYSTEM_UNDOCKED_STR    SD_ID128_MAKE_STR(51,e1,71,bd,58,52,48,56,81,10,14,4c,51,7c,ca,53)
+#define SD_MESSAGE_POWER_KEY              SD_ID128_MAKE(b7,2e,a4,a2,88,15,45,a0,b5,0e,20,0e,55,b9,b0,71)
+#define SD_MESSAGE_POWER_KEY_STR          SD_ID128_MAKE_STR(b7,2e,a4,a2,88,15,45,a0,b5,0e,20,0e,55,b9,b0,71)
+#define SD_MESSAGE_SUSPEND_KEY            SD_ID128_MAKE(b7,2e,a4,a2,88,15,45,a0,b5,0e,20,0e,55,b9,b0,72)
+#define SD_MESSAGE_SUSPEND_KEY_STR        SD_ID128_MAKE_STR(b7,2e,a4,a2,88,15,45,a0,b5,0e,20,0e,55,b9,b0,72)
+#define SD_MESSAGE_HIBERNATE_KEY          SD_ID128_MAKE(b7,2e,a4,a2,88,15,45,a0,b5,0e,20,0e,55,b9,b0,73)
+#define SD_MESSAGE_HIBERNATE_KEY_STR      SD_ID128_MAKE_STR(b7,2e,a4,a2,88,15,45,a0,b5,0e,20,0e,55,b9,b0,73)
+
+#define SD_MESSAGE_INVALID_CONFIGURATION  SD_ID128_MAKE(c7,72,d2,4e,9a,88,4c,be,b9,ea,12,62,5c,30,6c,01)
+#define SD_MESSAGE_INVALID_CONFIGURATION_STR \
+                                          SD_ID128_MAKE_STR(c7,72,d2,4e,9a,88,4c,be,b9,ea,12,62,5c,30,6c,01)
+
+#define SD_MESSAGE_DNSSEC_FAILURE         SD_ID128_MAKE(16,75,d7,f1,72,17,40,98,b1,10,8b,f8,c7,dc,8f,5d)
+#define SD_MESSAGE_DNSSEC_FAILURE_STR     SD_ID128_MAKE_STR(16,75,d7,f1,72,17,40,98,b1,10,8b,f8,c7,dc,8f,5d)
+#define SD_MESSAGE_DNSSEC_TRUST_ANCHOR_REVOKED \
+                                          SD_ID128_MAKE(4d,44,08,cf,d0,d1,44,85,91,84,d1,e6,5d,7c,8a,65)
+#define SD_MESSAGE_DNSSEC_TRUST_ANCHOR_REVOKED_STR \
+                                          SD_ID128_MAKE_STR(4d,44,08,cf,d0,d1,44,85,91,84,d1,e6,5d,7c,8a,65)
+#define SD_MESSAGE_DNSSEC_DOWNGRADE       SD_ID128_MAKE(36,db,2d,fa,5a,90,45,e1,bd,4a,f5,f9,3e,1c,f0,57)
+#define SD_MESSAGE_DNSSEC_DOWNGRADE_STR   SD_ID128_MAKE_STR(36,db,2d,fa,5a,90,45,e1,bd,4a,f5,f9,3e,1c,f0,57)
 
 _SD_END_DECLARATIONS;
 
index 7efa8eb..3f5a667 100644 (file)
@@ -155,6 +155,10 @@ int sd_rtnl_message_neigh_get_ifindex(sd_netlink_message *m, int *family);
 int sd_rtnl_message_neigh_get_state(sd_netlink_message *m, uint16_t *state);
 int sd_rtnl_message_neigh_get_flags(sd_netlink_message *m, uint8_t *flags);
 
+int sd_rtnl_message_new_addrlabel(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int ifindex, int ifal_family);
+int sd_rtnl_message_addrlabel_set_prefixlen(sd_netlink_message *m, unsigned char prefixlen);
+int sd_rtnl_message_addrlabel_get_prefixlen(sd_netlink_message *m, unsigned char *prefixlen);
+
 _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_netlink, sd_netlink_unref);
 _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_netlink_message, sd_netlink_message_unref);
 
diff --git a/src/systemd/sd-radv.h b/src/systemd/sd-radv.h
new file mode 100644 (file)
index 0000000..4cbd80d
--- /dev/null
@@ -0,0 +1,81 @@
+#ifndef foosdradvfoo
+#define foosdradvfoo
+
+/***
+  This file is part of systemd.
+
+  Copyright (C) 2017 Intel Corporation. All rights reserved.
+
+  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 <inttypes.h>
+#include <net/ethernet.h>
+#include <netinet/in.h>
+#include <sys/types.h>
+
+#include "sd-ndisc.h"
+
+#include "sd-event.h"
+
+#include "_sd-common.h"
+
+_SD_BEGIN_DECLARATIONS;
+
+typedef struct sd_radv sd_radv;
+typedef struct sd_radv_prefix sd_radv_prefix;
+
+/* Router Advertisment */
+int sd_radv_new(sd_radv **ret);
+sd_radv *sd_radv_ref(sd_radv *ra);
+sd_radv *sd_radv_unref(sd_radv *ra);
+
+int sd_radv_attach_event(sd_radv *ra, sd_event *event, int64_t priority);
+int sd_radv_detach_event(sd_radv *nd);
+sd_event *sd_radv_get_event(sd_radv *ra);
+
+int sd_radv_start(sd_radv *ra);
+int sd_radv_stop(sd_radv *ra);
+
+int sd_radv_set_ifindex(sd_radv *ra, int interface_index);
+int sd_radv_set_mac(sd_radv *ra, const struct ether_addr *mac_addr);
+int sd_radv_set_mtu(sd_radv *ra, uint32_t mtu);
+int sd_radv_set_hop_limit(sd_radv *ra, uint8_t hop_limit);
+int sd_radv_set_router_lifetime(sd_radv *ra, uint32_t router_lifetime);
+int sd_radv_set_managed_information(sd_radv *ra, int managed);
+int sd_radv_set_other_information(sd_radv *ra, int other);
+int sd_radv_set_preference(sd_radv *ra, unsigned preference);
+int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p);
+
+/* Advertised prefixes */
+int sd_radv_prefix_new(sd_radv_prefix **ret);
+sd_radv_prefix *sd_radv_prefix_ref(sd_radv_prefix *ra);
+sd_radv_prefix *sd_radv_prefix_unref(sd_radv_prefix *ra);
+
+int sd_radv_prefix_set_prefix(sd_radv_prefix *p, struct in6_addr *in6_addr,
+                              unsigned char prefixlen);
+int sd_radv_prefix_set_onlink(sd_radv_prefix *p, int onlink);
+int sd_radv_prefix_set_address_autoconfiguration(sd_radv_prefix *p,
+                                                 int address_autoconfiguration);
+int sd_radv_prefix_set_valid_lifetime(sd_radv_prefix *p,
+                                      uint32_t valid_lifetime);
+int sd_radv_prefix_set_preferred_lifetime(sd_radv_prefix *p,
+                                          uint32_t preferred_lifetime);
+
+_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_radv, sd_radv_unref);
+_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_radv_prefix, sd_radv_prefix_unref);
+
+_SD_END_DECLARATIONS;
+
+#endif
index 787d68a..fbe51a6 100644 (file)
@@ -29,8 +29,9 @@
 #include "copy.h"
 #include "def.h"
 #include "fd-util.h"
+#include "fs-util.h"
 #include "fileio-label.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "hashmap.h"
 #include "path-util.h"
 #include "selinux-util.h"
@@ -190,7 +191,8 @@ static int load_group_database(void) {
 static int make_backup(const char *target, const char *x) {
         _cleanup_close_ int src = -1;
         _cleanup_fclose_ FILE *dst = NULL;
-        char *backup, *temp;
+        _cleanup_free_ char *temp = NULL;
+        char *backup;
         struct timespec ts[2];
         struct stat st;
         int r;
@@ -210,7 +212,7 @@ static int make_backup(const char *target, const char *x) {
         if (r < 0)
                 return r;
 
-        r = copy_bytes(src, fileno(dst), (uint64_t) -1, true);
+        r = copy_bytes(src, fileno(dst), (uint64_t) -1, COPY_REFLINK);
         if (r < 0)
                 goto fail;
 
@@ -291,6 +293,7 @@ static int putgrent_with_members(const struct group *gr, FILE *group) {
         return 0;
 }
 
+#ifdef ENABLE_GSHADOW
 static int putsgent_with_members(const struct sgrp *sg, FILE *gshadow) {
         char **a;
 
@@ -340,6 +343,7 @@ static int putsgent_with_members(const struct sgrp *sg, FILE *gshadow) {
 
         return 0;
 }
+#endif
 
 static int sync_rights(FILE *from, FILE *to) {
         struct stat st;
@@ -369,400 +373,424 @@ static int rename_and_apply_smack(const char *temp_path, const char *dest_path)
         return r;
 }
 
-static int write_files(void) {
-
-        _cleanup_fclose_ FILE *passwd = NULL, *group = NULL, *shadow = NULL, *gshadow = NULL;
-        _cleanup_free_ char *passwd_tmp = NULL, *group_tmp = NULL, *shadow_tmp = NULL, *gshadow_tmp = NULL;
-        const char *passwd_path = NULL, *group_path = NULL, *shadow_path = NULL, *gshadow_path = NULL;
-        bool group_changed = false;
+static int write_temporary_passwd(const char *passwd_path, FILE **tmpfile, char **tmpfile_path) {
+        _cleanup_fclose_ FILE *original = NULL, *passwd = NULL;
+        _cleanup_(unlink_and_freep) char *passwd_tmp = NULL;
         Iterator iterator;
         Item *i;
         int r;
 
-        if (hashmap_size(todo_gids) > 0 || hashmap_size(members) > 0) {
-                _cleanup_fclose_ FILE *original = NULL;
+        if (hashmap_size(todo_uids) == 0)
+                return 0;
 
-                /* First we update the actual group list file */
-                group_path = prefix_roota(arg_root, "/etc/group");
-                r = fopen_temporary_label("/etc/group", group_path, &group, &group_tmp);
+        r = fopen_temporary_label("/etc/passwd", passwd_path, &passwd, &passwd_tmp);
+        if (r < 0)
+                return r;
+
+        original = fopen(passwd_path, "re");
+        if (original) {
+                struct passwd *pw;
+
+                r = sync_rights(original, passwd);
                 if (r < 0)
-                        goto finish;
+                        return r;
 
-                original = fopen(group_path, "re");
-                if (original) {
-                        struct group *gr;
+                errno = 0;
+                while ((pw = fgetpwent(original))) {
 
-                        r = sync_rights(original, group);
-                        if (r < 0)
-                                goto finish;
+                        i = hashmap_get(users, pw->pw_name);
+                        if (i && i->todo_user) {
+                                log_error("%s: User \"%s\" already exists.", passwd_path, pw->pw_name);
+                                return -EEXIST;
+                        }
+
+                        if (hashmap_contains(todo_uids, UID_TO_PTR(pw->pw_uid))) {
+                                log_error("%s: Detected collision for UID " UID_FMT ".", passwd_path, pw->pw_uid);
+                                return -EEXIST;
+                        }
 
                         errno = 0;
-                        while ((gr = fgetgrent(original))) {
-                                /* Safety checks against name and GID
-                                 * collisions. Normally, this should
-                                 * be unnecessary, but given that we
-                                 * look at the entries anyway here,
-                                 * let's make an extra verification
-                                 * step that we don't generate
-                                 * duplicate entries. */
-
-                                i = hashmap_get(groups, gr->gr_name);
-                                if (i && i->todo_group) {
-                                        log_error("%s: Group \"%s\" already exists.", group_path, gr->gr_name);
-                                        r = -EEXIST;
-                                        goto finish;
-                                }
+                        if (putpwent(pw, passwd) < 0)
+                                return errno ? -errno : -EIO;
 
-                                if (hashmap_contains(todo_gids, GID_TO_PTR(gr->gr_gid))) {
-                                        log_error("%s: Detected collision for GID " GID_FMT ".", group_path, gr->gr_gid);
-                                        r = -EEXIST;
-                                        goto finish;
-                                }
+                        errno = 0;
+                }
+                if (!IN_SET(errno, 0, ENOENT))
+                        return -errno;
 
-                                r = putgrent_with_members(gr, group);
-                                if (r < 0)
-                                        goto finish;
-                                if (r > 0)
-                                        group_changed = true;
+        } else {
+                if (errno != ENOENT)
+                        return -errno;
+                if (fchmod(fileno(passwd), 0644) < 0)
+                        return -errno;
+        }
 
-                                errno = 0;
-                        }
-                        if (!IN_SET(errno, 0, ENOENT)) {
-                                r = -errno;
-                                goto finish;
-                        }
+        HASHMAP_FOREACH(i, todo_uids, iterator) {
+                struct passwd n = {
+                        .pw_name = i->name,
+                        .pw_uid = i->uid,
+                        .pw_gid = i->gid,
+                        .pw_gecos = i->description,
 
-                } else if (errno != ENOENT) {
-                        r = -errno;
-                        goto finish;
-                } else if (fchmod(fileno(group), 0644) < 0) {
-                        r = -errno;
-                        goto finish;
-                }
+                        /* "x" means the password is stored in the shadow file */
+                        .pw_passwd = (char*) "x",
 
-                HASHMAP_FOREACH(i, todo_gids, iterator) {
-                        struct group n = {
-                                .gr_name = i->name,
-                                .gr_gid = i->gid,
-                                .gr_passwd = (char*) "x",
-                        };
+                        /* We default to the root directory as home */
+                        .pw_dir = i->home ? i->home : (char*) "/",
 
-                        r = putgrent_with_members(&n, group);
-                        if (r < 0)
-                                goto finish;
+                        /* Initialize the shell to nologin, with one exception:
+                         * for root we patch in something special */
+                        .pw_shell = i->uid == 0 ? (char*) "/bin/sh" : (char*) "/sbin/nologin",
+                };
 
-                        group_changed = true;
-                }
+                errno = 0;
+                if (putpwent(&n, passwd) != 0)
+                        return errno ? -errno : -EIO;
+        }
 
-                r = fflush_and_check(group);
-                if (r < 0)
-                        goto finish;
+        r = fflush_and_check(passwd);
+        if (r < 0)
+                return r;
 
-                if (original) {
-                        fclose(original);
-                        original = NULL;
-                }
+        *tmpfile = passwd;
+        *tmpfile_path = passwd_tmp;
+        passwd = NULL;
+        passwd_tmp = NULL;
+        return 0;
+}
 
-                /* OK, now also update the shadow file for the group list */
-                gshadow_path = prefix_roota(arg_root, "/etc/gshadow");
-                r = fopen_temporary_label("/etc/gshadow", gshadow_path, &gshadow, &gshadow_tmp);
-                if (r < 0)
-                        goto finish;
+static int write_temporary_shadow(const char *shadow_path, FILE **tmpfile, char **tmpfile_path) {
+        _cleanup_fclose_ FILE *original = NULL, *shadow = NULL;
+        _cleanup_(unlink_and_freep) char *shadow_tmp = NULL;
+        Iterator iterator;
+        long lstchg;
+        Item *i;
+        int r;
 
-                original = fopen(gshadow_path, "re");
-                if (original) {
-                        struct sgrp *sg;
+        if (hashmap_size(todo_uids) == 0)
+                return 0;
 
-                        r = sync_rights(original, gshadow);
-                        if (r < 0)
-                                goto finish;
+        r = fopen_temporary_label("/etc/shadow", shadow_path, &shadow, &shadow_tmp);
+        if (r < 0)
+                return r;
 
-                        errno = 0;
-                        while ((sg = fgetsgent(original))) {
+        lstchg = (long) (now(CLOCK_REALTIME) / USEC_PER_DAY);
 
-                                i = hashmap_get(groups, sg->sg_namp);
-                                if (i && i->todo_group) {
-                                        log_error("%s: Group \"%s\" already exists.", gshadow_path, sg->sg_namp);
-                                        r = -EEXIST;
-                                        goto finish;
-                                }
+        original = fopen(shadow_path, "re");
+        if (original) {
+                struct spwd *sp;
 
-                                r = putsgent_with_members(sg, gshadow);
-                                if (r < 0)
-                                        goto finish;
-                                if (r > 0)
-                                        group_changed = true;
+                r = sync_rights(original, shadow);
+                if (r < 0)
+                        return r;
 
-                                errno = 0;
-                        }
-                        if (!IN_SET(errno, 0, ENOENT)) {
-                                r = -errno;
-                                goto finish;
-                        }
+                errno = 0;
+                while ((sp = fgetspent(original))) {
 
-                } else if (errno != ENOENT) {
-                        r = -errno;
-                        goto finish;
-                } else if (fchmod(fileno(gshadow), 0000) < 0) {
-                        r = -errno;
-                        goto finish;
-                }
+                        i = hashmap_get(users, sp->sp_namp);
+                        if (i && i->todo_user) {
+                                /* we will update the existing entry */
+                                sp->sp_lstchg = lstchg;
 
-                HASHMAP_FOREACH(i, todo_gids, iterator) {
-                        struct sgrp n = {
-                                .sg_namp = i->name,
-                                .sg_passwd = (char*) "!!",
-                        };
+                                /* only the /etc/shadow stage is left, so we can
+                                 * safely remove the item from the todo set */
+                                i->todo_user = false;
+                                hashmap_remove(todo_uids, UID_TO_PTR(i->uid));
+                        }
 
-                        r = putsgent_with_members(&n, gshadow);
-                        if (r < 0)
-                                goto finish;
+                        errno = 0;
+                        if (putspent(sp, shadow) < 0)
+                                return errno ? -errno : -EIO;
 
-                        group_changed = true;
+                        errno = 0;
                 }
+                if (!IN_SET(errno, 0, ENOENT))
+                        return -errno;
 
-                r = fflush_and_check(gshadow);
-                if (r < 0)
-                        goto finish;
+        } else {
+                if (errno != ENOENT)
+                        return -errno;
+                if (fchmod(fileno(shadow), 0000) < 0)
+                        return -errno;
         }
 
-        if (hashmap_size(todo_uids) > 0) {
-                _cleanup_fclose_ FILE *original = NULL;
-                long lstchg;
+        HASHMAP_FOREACH(i, todo_uids, iterator) {
+                struct spwd n = {
+                        .sp_namp = i->name,
+                        .sp_pwdp = (char*) "!!",
+                        .sp_lstchg = lstchg,
+                        .sp_min = -1,
+                        .sp_max = -1,
+                        .sp_warn = -1,
+                        .sp_inact = -1,
+                        .sp_expire = -1,
+                        .sp_flag = (unsigned long) -1, /* this appears to be what everybody does ... */
+                };
 
-                /* First we update the user database itself */
-                passwd_path = prefix_roota(arg_root, "/etc/passwd");
-                r = fopen_temporary_label("/etc/passwd", passwd_path, &passwd, &passwd_tmp);
-                if (r < 0)
-                        goto finish;
-
-                original = fopen(passwd_path, "re");
-                if (original) {
-                        struct passwd *pw;
+                errno = 0;
+                if (putspent(&n, shadow) != 0)
+                        return errno ? -errno : -EIO;
+        }
 
-                        r = sync_rights(original, passwd);
-                        if (r < 0)
-                                goto finish;
+        r = fflush_and_check(shadow);
+        if (r < 0)
+                return r;
 
-                        errno = 0;
-                        while ((pw = fgetpwent(original))) {
+        *tmpfile = shadow;
+        *tmpfile_path = shadow_tmp;
+        shadow = NULL;
+        shadow_tmp = NULL;
+        return 0;
+}
 
-                                i = hashmap_get(users, pw->pw_name);
-                                if (i && i->todo_user) {
-                                        log_error("%s: User \"%s\" already exists.", passwd_path, pw->pw_name);
-                                        r = -EEXIST;
-                                        goto finish;
-                                }
+static int write_temporary_group(const char *group_path, FILE **tmpfile, char **tmpfile_path) {
+        _cleanup_fclose_ FILE *original = NULL, *group = NULL;
+        _cleanup_(unlink_and_freep) char *group_tmp = NULL;
+        bool group_changed = false;
+        Iterator iterator;
+        Item *i;
+        int r;
 
-                                if (hashmap_contains(todo_uids, UID_TO_PTR(pw->pw_uid))) {
-                                        log_error("%s: Detected collision for UID " UID_FMT ".", passwd_path, pw->pw_uid);
-                                        r = -EEXIST;
-                                        goto finish;
-                                }
+        if (hashmap_size(todo_gids) == 0 && hashmap_size(members) == 0)
+                return 0;
 
-                                errno = 0;
-                                if (putpwent(pw, passwd) < 0) {
-                                        r = errno ? -errno : -EIO;
-                                        goto finish;
-                                }
+        r = fopen_temporary_label("/etc/group", group_path, &group, &group_tmp);
+        if (r < 0)
+                return r;
 
-                                errno = 0;
-                        }
-                        if (!IN_SET(errno, 0, ENOENT)) {
-                                r = -errno;
-                                goto finish;
-                        }
+        original = fopen(group_path, "re");
+        if (original) {
+                struct group *gr;
 
-                } else if (errno != ENOENT) {
-                        r = -errno;
-                        goto finish;
-                } else if (fchmod(fileno(passwd), 0644) < 0) {
-                        r = -errno;
-                        goto finish;
-                }
-
-                HASHMAP_FOREACH(i, todo_uids, iterator) {
-                        struct passwd n = {
-                                .pw_name = i->name,
-                                .pw_uid = i->uid,
-                                .pw_gid = i->gid,
-                                .pw_gecos = i->description,
+                r = sync_rights(original, group);
+                if (r < 0)
+                        return r;
 
-                                /* "x" means the password is stored in
-                                 * the shadow file */
-                                .pw_passwd = (char*) "x",
+                errno = 0;
+                while ((gr = fgetgrent(original))) {
+                        /* Safety checks against name and GID collisions. Normally,
+                         * this should be unnecessary, but given that we look at the
+                         * entries anyway here, let's make an extra verification
+                         * step that we don't generate duplicate entries. */
+
+                        i = hashmap_get(groups, gr->gr_name);
+                        if (i && i->todo_group) {
+                                log_error("%s: Group \"%s\" already exists.", group_path, gr->gr_name);
+                                return -EEXIST;
+                        }
 
-                                /* We default to the root directory as home */
-                                .pw_dir = i->home ? i->home : (char*) "/",
+                        if (hashmap_contains(todo_gids, GID_TO_PTR(gr->gr_gid))) {
+                                log_error("%s: Detected collision for GID " GID_FMT ".", group_path, gr->gr_gid);
+                                return  -EEXIST;
+                        }
 
-                                /* Initialize the shell to nologin,
-                                 * with one exception: for root we
-                                 * patch in something special */
-                                .pw_shell = i->uid == 0 ? (char*) "/bin/sh" : (char*) "/sbin/nologin",
-                        };
+                        r = putgrent_with_members(gr, group);
+                        if (r < 0)
+                                return r;
+                        if (r > 0)
+                                group_changed = true;
 
                         errno = 0;
-                        if (putpwent(&n, passwd) != 0) {
-                                r = errno ? -errno : -EIO;
-                                goto finish;
-                        }
                 }
+                if (!IN_SET(errno, 0, ENOENT))
+                        return -errno;
 
-                r = fflush_and_check(passwd);
-                if (r < 0)
-                        goto finish;
+        } else {
+                if (errno != ENOENT)
+                        return -errno;
+                if (fchmod(fileno(group), 0644) < 0)
+                        return -errno;
+        }
 
-                if (original) {
-                        fclose(original);
-                        original = NULL;
-                }
+        HASHMAP_FOREACH(i, todo_gids, iterator) {
+                struct group n = {
+                        .gr_name = i->name,
+                        .gr_gid = i->gid,
+                        .gr_passwd = (char*) "x",
+                };
 
-                /* The we update the shadow database */
-                shadow_path = prefix_roota(arg_root, "/etc/shadow");
-                r = fopen_temporary_label("/etc/shadow", shadow_path, &shadow, &shadow_tmp);
+                r = putgrent_with_members(&n, group);
                 if (r < 0)
-                        goto finish;
+                        return r;
 
-                lstchg = (long) (now(CLOCK_REALTIME) / USEC_PER_DAY);
+                group_changed = true;
+        }
 
-                original = fopen(shadow_path, "re");
-                if (original) {
-                        struct spwd *sp;
+        r = fflush_and_check(group);
+        if (r < 0)
+                return r;
 
-                        r = sync_rights(original, shadow);
-                        if (r < 0)
-                                goto finish;
+        if (group_changed) {
+                *tmpfile = group;
+                *tmpfile_path = group_tmp;
+                group = NULL;
+                group_tmp = NULL;
+        }
+        return 0;
+}
 
-                        errno = 0;
-                        while ((sp = fgetspent(original))) {
+static int write_temporary_gshadow(const char * gshadow_path, FILE **tmpfile, char **tmpfile_path) {
+#ifdef ENABLE_GSHADOW
+        _cleanup_fclose_ FILE *original = NULL, *gshadow = NULL;
+        _cleanup_(unlink_and_freep) char *gshadow_tmp = NULL;
+        bool group_changed = false;
+        Iterator iterator;
+        Item *i;
+        int r;
 
-                                i = hashmap_get(users, sp->sp_namp);
-                                if (i && i->todo_user) {
-                                        /* we will update the existing entry */
-                                        sp->sp_lstchg = lstchg;
+        if (hashmap_size(todo_gids) == 0 && hashmap_size(members) == 0)
+                return 0;
 
-                                        /* only the /etc/shadow stage is left, so we can
-                                         * safely remove the item from the todo set */
-                                        i->todo_user = false;
-                                        hashmap_remove(todo_uids, UID_TO_PTR(i->uid));
-                                }
+        r = fopen_temporary_label("/etc/gshadow", gshadow_path, &gshadow, &gshadow_tmp);
+        if (r < 0)
+                return r;
 
-                                errno = 0;
-                                if (putspent(sp, shadow) < 0) {
-                                        r = errno ? -errno : -EIO;
-                                        goto finish;
-                                }
+        original = fopen(gshadow_path, "re");
+        if (original) {
+                struct sgrp *sg;
 
-                                errno = 0;
-                        }
-                        if (!IN_SET(errno, 0, ENOENT)) {
-                                r = -errno;
-                                goto finish;
+                r = sync_rights(original, gshadow);
+                if (r < 0)
+                        return r;
+
+                errno = 0;
+                while ((sg = fgetsgent(original))) {
+
+                        i = hashmap_get(groups, sg->sg_namp);
+                        if (i && i->todo_group) {
+                                log_error("%s: Group \"%s\" already exists.", gshadow_path, sg->sg_namp);
+                                return -EEXIST;
                         }
-                } else if (errno != ENOENT) {
-                        r = -errno;
-                        goto finish;
-                } else if (fchmod(fileno(shadow), 0000) < 0) {
-                        r = -errno;
-                        goto finish;
-                }
 
-                HASHMAP_FOREACH(i, todo_uids, iterator) {
-                        struct spwd n = {
-                                .sp_namp = i->name,
-                                .sp_pwdp = (char*) "!!",
-                                .sp_lstchg = lstchg,
-                                .sp_min = -1,
-                                .sp_max = -1,
-                                .sp_warn = -1,
-                                .sp_inact = -1,
-                                .sp_expire = -1,
-                                .sp_flag = (unsigned long) -1, /* this appears to be what everybody does ... */
-                        };
+                        r = putsgent_with_members(sg, gshadow);
+                        if (r < 0)
+                                return r;
+                        if (r > 0)
+                                group_changed = true;
 
                         errno = 0;
-                        if (putspent(&n, shadow) != 0) {
-                                r = errno ? -errno : -EIO;
-                                goto finish;
-                        }
                 }
+                if (!IN_SET(errno, 0, ENOENT))
+                        return -errno;
 
-                r = fflush_and_check(shadow);
+        } else {
+                if (errno != ENOENT)
+                        return -errno;
+                if (fchmod(fileno(gshadow), 0000) < 0)
+                        return -errno;
+        }
+
+        HASHMAP_FOREACH(i, todo_gids, iterator) {
+                struct sgrp n = {
+                        .sg_namp = i->name,
+                        .sg_passwd = (char*) "!!",
+                };
+
+                r = putsgent_with_members(&n, gshadow);
                 if (r < 0)
-                        goto finish;
+                        return r;
+
+                group_changed = true;
         }
 
-        /* Make a backup of the old files */
+        r = fflush_and_check(gshadow);
+        if (r < 0)
+                return r;
+
         if (group_changed) {
-                if (group) {
-                        r = make_backup("/etc/group", group_path);
-                        if (r < 0)
-                                goto finish;
-                }
-                if (gshadow) {
-                        r = make_backup("/etc/gshadow", gshadow_path);
-                        if (r < 0)
-                                goto finish;
-                }
+                *tmpfile = gshadow;
+                *tmpfile_path = gshadow_tmp;
+                gshadow = NULL;
+                gshadow_tmp = NULL;
+        }
+        return 0;
+#else
+        return 0;
+#endif
+}
+
+static int write_files(void) {
+        _cleanup_fclose_ FILE *passwd = NULL, *group = NULL, *shadow = NULL, *gshadow = NULL;
+        _cleanup_(unlink_and_freep) char *passwd_tmp = NULL, *group_tmp = NULL, *shadow_tmp = NULL, *gshadow_tmp = NULL;
+        const char *passwd_path = NULL, *group_path = NULL, *shadow_path = NULL, *gshadow_path = NULL;
+        int r;
+
+        passwd_path = prefix_roota(arg_root, "/etc/passwd");
+        shadow_path = prefix_roota(arg_root, "/etc/shadow");
+        group_path = prefix_roota(arg_root, "/etc/group");
+        gshadow_path = prefix_roota(arg_root, "/etc/gshadow");
+
+        r = write_temporary_group(group_path, &group, &group_tmp);
+        if (r < 0)
+                return r;
+
+        r = write_temporary_gshadow(gshadow_path, &gshadow, &gshadow_tmp);
+        if (r < 0)
+                return r;
+
+        r = write_temporary_passwd(passwd_path, &passwd, &passwd_tmp);
+        if (r < 0)
+                return r;
+
+        r = write_temporary_shadow(shadow_path, &shadow, &shadow_tmp);
+        if (r < 0)
+                return r;
+
+        /* Make a backup of the old files */
+        if (group) {
+                r = make_backup("/etc/group", group_path);
+                if (r < 0)
+                        return r;
+        }
+        if (gshadow) {
+                r = make_backup("/etc/gshadow", gshadow_path);
+                if (r < 0)
+                        return r;
         }
 
         if (passwd) {
                 r = make_backup("/etc/passwd", passwd_path);
                 if (r < 0)
-                        goto finish;
+                        return r;
         }
         if (shadow) {
                 r = make_backup("/etc/shadow", shadow_path);
                 if (r < 0)
-                        goto finish;
+                        return r;
         }
 
         /* And make the new files count */
-        if (group_changed) {
-                if (group) {
-                        r = rename_and_apply_smack(group_tmp, group_path);
-                        if (r < 0)
-                                goto finish;
+        if (group) {
+                r = rename_and_apply_smack(group_tmp, group_path);
+                if (r < 0)
+                        return r;
 
-                        group_tmp = mfree(group_tmp);
-                }
-                if (gshadow) {
-                        r = rename_and_apply_smack(gshadow_tmp, gshadow_path);
-                        if (r < 0)
-                                goto finish;
+                group_tmp = mfree(group_tmp);
+        }
+        if (gshadow) {
+                r = rename_and_apply_smack(gshadow_tmp, gshadow_path);
+                if (r < 0)
+                        return r;
 
-                        gshadow_tmp = mfree(gshadow_tmp);
-                }
+                gshadow_tmp = mfree(gshadow_tmp);
         }
 
         if (passwd) {
                 r = rename_and_apply_smack(passwd_tmp, passwd_path);
                 if (r < 0)
-                        goto finish;
+                        return r;
 
                 passwd_tmp = mfree(passwd_tmp);
         }
         if (shadow) {
                 r = rename_and_apply_smack(shadow_tmp, shadow_path);
                 if (r < 0)
-                        goto finish;
+                        return r;
 
                 shadow_tmp = mfree(shadow_tmp);
         }
 
-        r = 0;
-
-finish:
-        if (passwd_tmp)
-                unlink(passwd_tmp);
-        if (shadow_tmp)
-                unlink(shadow_tmp);
-        if (group_tmp)
-                unlink(group_tmp);
-        if (gshadow_tmp)
-                unlink(gshadow_tmp);
-
-        return r;
+        return 0;
 }
 
 static int uid_is_ok(uid_t uid, const char *name) {
@@ -1189,6 +1217,7 @@ static void item_free(Item *i) {
         free(i->uid_path);
         free(i->gid_path);
         free(i->description);
+        free(i->home);
         free(i);
 }
 
@@ -1299,81 +1328,6 @@ static bool item_equal(Item *a, Item *b) {
         return true;
 }
 
-static bool valid_user_group_name(const char *u) {
-        const char *i;
-        long sz;
-
-        if (isempty(u))
-                return false;
-
-        if (!(u[0] >= 'a' && u[0] <= 'z') &&
-            !(u[0] >= 'A' && u[0] <= 'Z') &&
-            u[0] != '_')
-                return false;
-
-        for (i = u+1; *i; i++) {
-                if (!(*i >= 'a' && *i <= 'z') &&
-                    !(*i >= 'A' && *i <= 'Z') &&
-                    !(*i >= '0' && *i <= '9') &&
-                    *i != '_' &&
-                    *i != '-')
-                        return false;
-        }
-
-        sz = sysconf(_SC_LOGIN_NAME_MAX);
-        assert_se(sz > 0);
-
-        if ((size_t) (i-u) > (size_t) sz)
-                return false;
-
-        if ((size_t) (i-u) > UT_NAMESIZE - 1)
-                return false;
-
-        return true;
-}
-
-static bool valid_gecos(const char *d) {
-
-        if (!d)
-                return false;
-
-        if (!utf8_is_valid(d))
-                return false;
-
-        if (string_has_cc(d, NULL))
-                return false;
-
-        /* Colons are used as field separators, and hence not OK */
-        if (strchr(d, ':'))
-                return false;
-
-        return true;
-}
-
-static bool valid_home(const char *p) {
-
-        if (isempty(p))
-                return false;
-
-        if (!utf8_is_valid(p))
-                return false;
-
-        if (string_has_cc(p, NULL))
-                return false;
-
-        if (!path_is_absolute(p))
-                return false;
-
-        if (!path_is_safe(p))
-                return false;
-
-        /* Colons are used as field separators, and hence not OK */
-        if (strchr(p, ':'))
-                return false;
-
-        return true;
-}
-
 static int parse_line(const char *fname, unsigned line, const char *buffer) {
 
         static const Specifier specifier_table[] = {
index 3ed8f23..9828078 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "alloc-util.h"
 #include "dirent-util.h"
+#include "exit-status.h"
 #include "fd-util.h"
 #include "fileio.h"
 #include "hashmap.h"
@@ -199,6 +200,13 @@ static int generate_unit_file(SysvStub *s) {
         if (s->pid_file)
                 fprintf(f, "PIDFile=%s\n", s->pid_file);
 
+        /* Consider two special LSB exit codes a clean exit */
+        if (s->has_lsb)
+                fprintf(f,
+                        "SuccessExitStatus=%i %i\n",
+                        EXIT_NOTINSTALLED,
+                        EXIT_NOTCONFIGURED);
+
         fprintf(f,
                 "ExecStart=%s start\n"
                 "ExecStop=%s stop\n",
@@ -247,7 +255,7 @@ static char *sysv_translate_name(const char *name) {
         return res;
 }
 
-static int sysv_translate_facility(const char *name, const char *filename, char **ret) {
+static int sysv_translate_facility(SysvStub *s, unsigned line, const char *name, char **ret) {
 
         /* We silently ignore the $ prefix here. According to the LSB
          * spec it simply indicates whether something is a
@@ -266,23 +274,28 @@ static int sysv_translate_facility(const char *name, const char *filename, char
                 "time",                 SPECIAL_TIME_SYNC_TARGET,
         };
 
+        const char *filename;
         char *filename_no_sh, *e, *m;
         const char *n;
         unsigned i;
         int r;
 
         assert(name);
-        assert(filename);
+        assert(s);
         assert(ret);
 
+        filename = basename(s->path);
+
         n = *name == '$' ? name + 1 : name;
 
         for (i = 0; i < ELEMENTSOF(table); i += 2) {
                 if (!streq(table[i], n))
                         continue;
 
-                if (!table[i+1])
+                if (!table[i+1]) {
+                        *ret = NULL;
                         return 0;
+                }
 
                 m = strdup(table[i+1]);
                 if (!m)
@@ -299,9 +312,9 @@ static int sysv_translate_facility(const char *name, const char *filename, char
         if (*name == '$')  {
                 r = unit_name_build(n, NULL, ".target", ret);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to build name: %m");
+                        return log_error_errno(r, "[%s:%u] Could not build name for facility %s: %m", s->path, line, name);
 
-                return r;
+                return 1;
         }
 
         /* Strip ".sh" suffix from file name for comparison */
@@ -313,8 +326,10 @@ static int sysv_translate_facility(const char *name, const char *filename, char
         }
 
         /* Names equaling the file name of the services are redundant */
-        if (streq_ptr(n, filename))
+        if (streq_ptr(n, filename)) {
+                *ret = NULL;
                 return 0;
+        }
 
         /* Everything else we assume to be normal service names */
         m = sysv_translate_name(n);
@@ -337,11 +352,11 @@ static int handle_provides(SysvStub *s, unsigned line, const char *full_text, co
 
                 r = extract_first_word(&text, &word, NULL, EXTRACT_QUOTES|EXTRACT_RELAX);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to parse word from provides string: %m");
+                        return log_error_errno(r, "[%s:%u] Failed to parse word from provides string: %m", s->path, line);
                 if (r == 0)
                         break;
 
-                r = sysv_translate_facility(word, basename(s->path), &m);
+                r = sysv_translate_facility(s, line, word, &m);
                 if (r <= 0) /* continue on error */
                         continue;
 
@@ -374,6 +389,9 @@ static int handle_provides(SysvStub *s, unsigned line, const char *full_text, co
                                 r = strv_extend(&s->before, SPECIAL_NETWORK_TARGET);
                                 if (r < 0)
                                         return log_oom();
+                                r = strv_extend(&s->wants, SPECIAL_NETWORK_TARGET);
+                                if (r < 0)
+                                        return log_oom();
                         }
 
                         break;
@@ -403,11 +421,11 @@ static int handle_dependencies(SysvStub *s, unsigned line, const char *full_text
 
                 r = extract_first_word(&text, &word, NULL, EXTRACT_QUOTES|EXTRACT_RELAX);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to parse word from provides string: %m");
+                        return log_error_errno(r, "[%s:%u] Failed to parse word from provides string: %m", s->path, line);
                 if (r == 0)
                         break;
 
-                r = sysv_translate_facility(word, basename(s->path), &m);
+                r = sysv_translate_facility(s, line, word, &m);
                 if (r <= 0) /* continue on error */
                         continue;
 
@@ -551,7 +569,7 @@ static int load_sysv(SysvStub *s) {
                                 char *d = NULL;
 
                                 if (chkconfig_description)
-                                        d = strjoin(chkconfig_description, " ", j, NULL);
+                                        d = strjoin(chkconfig_description, " ", j);
                                 else
                                         d = strdup(j);
                                 if (!d)
@@ -613,7 +631,7 @@ static int load_sysv(SysvStub *s) {
                                                 char *d = NULL;
 
                                                 if (long_description)
-                                                        d = strjoin(long_description, " ", t, NULL);
+                                                        d = strjoin(long_description, " ", t);
                                                 else
                                                         d = strdup(j);
                                                 if (!d)
@@ -792,7 +810,7 @@ static int enumerate_sysv(const LookupPaths *lp, Hashmap *all_services) {
                                 continue;
                         }
 
-                        fpath = strjoin(*path, "/", de->d_name, NULL);
+                        fpath = strjoin(*path, "/", de->d_name);
                         if (!fpath)
                                 return log_oom();
 
@@ -838,7 +856,7 @@ static int set_dependencies_from_rcnd(const LookupPaths *lp, Hashmap *all_servic
                         _cleanup_free_ char *path = NULL;
                         struct dirent *de;
 
-                        path = strjoin(*p, "/", rcnd_table[i].path, NULL);
+                        path = strjoin(*p, "/", rcnd_table[i].path);
                         if (!path) {
                                 r = log_oom();
                                 goto finish;
@@ -868,7 +886,7 @@ static int set_dependencies_from_rcnd(const LookupPaths *lp, Hashmap *all_servic
                                 if (a < 0 || b < 0)
                                         continue;
 
-                                fpath = strjoin(*p, "/", de->d_name, NULL);
+                                fpath = strjoin(*p, "/", de->d_name);
                                 if (!fpath) {
                                         r = log_oom();
                                         goto finish;
diff --git a/src/test/generate-sym-test.py b/src/test/generate-sym-test.py
new file mode 100755 (executable)
index 0000000..357cce8
--- /dev/null
@@ -0,0 +1,23 @@
+#!/usr/bin/env python3
+import sys, re
+
+print('#include <stdio.h>')
+for header in sys.argv[2:]:
+    print('#include "{}"'.format(header.split('/')[-1]))
+
+print('''
+void* functions[] = {''')
+
+for line in open(sys.argv[1]):
+    match = re.search('^ +([a-zA-Z0-9_]+);', line)
+    if match:
+        print('    {},'.format(match.group(1)))
+
+print('''};
+
+int main(void) {
+    unsigned i;
+    for (i = 0; i < sizeof(functions)/sizeof(void*); i++)
+         printf("%p\\n", functions[i]);
+    return 0;
+}''')
diff --git a/src/test/meson.build b/src/test/meson.build
new file mode 100644 (file)
index 0000000..7b493a4
--- /dev/null
@@ -0,0 +1,906 @@
+awkscript = 'test-hashmap-ordered.awk'
+test_hashmap_ordered_c = custom_target(
+        'test-hashmap-ordered.c',
+        input : [awkscript, 'test-hashmap-plain.c'],
+        output : 'test-hashmap-ordered.c',
+        command : [awk, '-f', '@INPUT0@', '@INPUT1@'],
+        capture : true)
+
+test_include_dir = include_directories('.')
+
+path = run_command('sh', ['-c', 'echo "$PATH"']).stdout()
+test_env = environment()
+test_env.set('SYSTEMD_KBD_MODEL_MAP', kbd_model_map)
+test_env.set('SYSTEMD_LANGUAGE_FALLBACK_MAP', language_fallback_map)
+test_env.set('PATH', path)
+test_env.prepend('PATH', meson.build_root())
+
+############################################################
+
+generate_sym_test_py = find_program('generate-sym-test.py')
+
+test_libsystemd_sym_c = custom_target(
+        'test-libsystemd-sym.c',
+        input : [libsystemd_sym_path] + systemd_headers,
+        output : 'test-libsystemd-sym.c',
+        command : [generate_sym_test_py, libsystemd_sym_path] + systemd_headers,
+        capture : true)
+
+test_libudev_sym_c = custom_target(
+        'test-libudev-sym.c',
+        input : [libudev_sym_path, libudev_h_path],
+        output : 'test-libudev-sym.c',
+        command : [generate_sym_test_py, '@INPUT0@', '@INPUT1@'],
+        capture : true)
+
+test_dlopen_c = files('test-dlopen.c')
+
+############################################################
+
+tests += [
+        [['src/test/test-device-nodes.c'],
+         [],
+         []],
+
+        [['src/test/test-engine.c'],
+         [libcore,
+          libudev,
+          libsystemd_internal],
+         [threads,
+          librt,
+          libseccomp,
+          libselinux,
+          libmount,
+          libblkid]],
+
+        [['src/test/test-job-type.c'],
+         [libcore,
+          libshared],
+         [threads,
+          librt,
+          libseccomp,
+          libselinux,
+          libmount,
+          libblkid]],
+
+        [['src/test/test-ns.c'],
+         [libcore,
+          libshared],
+         [threads,
+          librt,
+          libseccomp,
+          libselinux,
+          libmount,
+          libblkid],
+         '', 'manual'],
+
+        [['src/test/test-loopback.c'],
+         [libcore,
+          libshared],
+         [threads,
+          librt,
+          libseccomp,
+          libselinux,
+          libmount,
+          libblkid]],
+
+        [['src/test/test-hostname.c'],
+         [libcore,
+          libshared],
+         [threads,
+          librt,
+          libseccomp,
+          libselinux,
+          libmount,
+          libblkid],
+         '', 'unsafe'],
+
+        [['src/test/test-dns-domain.c'],
+         [libcore,
+          libsystemd_network],
+         []],
+
+        [['src/test/test-boot-timestamps.c'],
+         [],
+         [],
+         'ENABLE_EFI'],
+
+        [['src/test/test-unit-name.c'],
+         [libcore,
+          libshared],
+         [threads,
+          librt,
+          libseccomp,
+          libselinux,
+          libmount,
+          libblkid]],
+
+        [['src/test/test-unit-file.c'],
+         [libcore,
+          libshared],
+         [threads,
+          librt,
+          libseccomp,
+          libselinux,
+          libmount,
+          libblkid]],
+
+        [['src/test/test-utf8.c'],
+         [],
+         []],
+
+        [['src/test/test-capability.c'],
+         [],
+         [libcap]],
+
+        [['src/test/test-async.c'],
+         [],
+         []],
+
+        [['src/test/test-locale-util.c'],
+         [],
+         []],
+
+        [['src/test/test-copy.c'],
+         [libshared_static],
+         []],
+
+        [['src/test/test-sigbus.c'],
+         [],
+         []],
+
+        [['src/test/test-condition.c'],
+         [],
+         []],
+
+        [['src/test/test-fdset.c'],
+         [],
+         []],
+
+        [['src/test/test-fstab-util.c'],
+         [],
+         []],
+
+        [['src/test/test-random-util.c'],
+         [],
+         []],
+
+        [['src/test/test-ratelimit.c'],
+         [],
+         []],
+
+        [['src/test/test-util.c'],
+         [],
+         []],
+
+        [['src/test/test-mount-util.c'],
+         [],
+         []],
+
+        [['src/test/test-exec-util.c'],
+         [],
+         []],
+
+        [['src/test/test-hexdecoct.c'],
+         [],
+         []],
+
+        [['src/test/test-alloc-util.c'],
+         [],
+         []],
+
+        [['src/test/test-xattr-util.c'],
+         [],
+         []],
+
+        [['src/test/test-io-util.c'],
+         [],
+         []],
+
+        [['src/test/test-glob-util.c'],
+         [],
+         []],
+
+        [['src/test/test-fs-util.c'],
+         [],
+         []],
+
+        [['src/test/test-proc-cmdline.c'],
+         [],
+         []],
+
+        [['src/test/test-fd-util.c'],
+         [],
+         []],
+
+        [['src/test/test-web-util.c'],
+         [],
+         []],
+
+        [['src/test/test-cpu-set-util.c'],
+         [],
+         []],
+
+        [['src/test/test-stat-util.c'],
+         [],
+         []],
+
+        [['src/test/test-escape.c'],
+         [],
+         []],
+
+        [['src/test/test-string-util.c'],
+         [],
+         []],
+
+        [['src/test/test-extract-word.c'],
+         [],
+         []],
+
+        [['src/test/test-parse-util.c'],
+         [],
+         []],
+
+        [['src/test/test-user-util.c'],
+         [],
+         []],
+
+        [['src/test/test-hostname-util.c'],
+         [],
+         []],
+
+        [['src/test/test-process-util.c'],
+         [],
+         []],
+
+        [['src/test/test-terminal-util.c'],
+         [],
+         []],
+
+        [['src/test/test-path-lookup.c'],
+         [],
+         []],
+
+        [['src/test/test-uid-range.c'],
+         [],
+         []],
+
+        [['src/test/test-cap-list.c',
+          generated_gperf_headers],
+         [],
+         [libcap]],
+
+        [['src/test/test-socket-util.c'],
+         [],
+         []],
+
+        [['src/test/test-barrier.c'],
+         [],
+         []],
+
+        [['src/test/test-tmpfiles.c'],
+         [],
+         []],
+
+        [['src/test/test-namespace.c'],
+         [libcore,
+          libshared],
+         [threads,
+          libblkid]],
+
+        [['src/test/test-verbs.c'],
+         [],
+         []],
+
+        [['src/test/test-install-root.c'],
+         [],
+         []],
+
+        [['src/test/test-acl-util.c'],
+         [],
+         [],
+         'HAVE_ACL'],
+
+        [['src/test/test-seccomp.c'],
+         [],
+         [libseccomp],
+         'HAVE_SECCOMP'],
+
+        [['src/test/test-rlimit-util.c'],
+         [],
+         []],
+
+        [['src/test/test-ask-password-api.c'],
+         [],
+         [],
+         '', 'manual'],
+
+        [['src/test/test-dissect-image.c'],
+         [],
+         [libblkid],
+         '', 'manual'],
+
+        [['src/test/test-signal-util.c'],
+         [],
+         []],
+
+        [['src/test/test-selinux.c'],
+         [],
+         []],
+
+        [['src/test/test-sizeof.c'],
+         [libbasic],
+         []],
+
+        [['src/test/test-hashmap.c',
+          'src/test/test-hashmap-plain.c',
+          test_hashmap_ordered_c],
+         [],
+         [],
+         '', 'timeout=90'],
+
+        [['src/test/test-set.c'],
+         [],
+         []],
+
+        [['src/test/test-bitmap.c'],
+         [],
+         []],
+
+        [['src/test/test-xml.c'],
+         [],
+         []],
+
+        [['src/test/test-list.c'],
+         [],
+         []],
+
+        [['src/test/test-unaligned.c'],
+         [],
+         []],
+
+        [['src/test/test-tables.c',
+          'src/shared/test-tables.h',
+          'src/journal/journald-server.c',
+          'src/journal/journald-server.h'],
+         [libcore,
+          libjournal_core,
+          libudev_core,
+          libudev_internal,
+          libsystemd_network,
+          libshared],
+         [threads,
+          libseccomp,
+          libmount,
+          libxz,
+          liblz4,
+          libblkid],
+         '', '', [], libudev_core_includes],
+
+        [['src/test/test-prioq.c'],
+         [],
+         []],
+
+        [['src/test/test-fileio.c'],
+         [],
+         []],
+
+        [['src/test/test-time.c'],
+         [],
+         []],
+
+        [['src/test/test-clock.c'],
+         [],
+         []],
+
+        [['src/test/test-architecture.c'],
+         [],
+         []],
+
+        [['src/test/test-log.c'],
+         [],
+         []],
+
+        [['src/test/test-ipcrm.c'],
+         [],
+         [],
+         '', 'unsafe'],
+
+        [['src/test/test-btrfs.c'],
+         [],
+         [],
+         '', 'manual'],
+
+
+        [['src/test/test-firewall-util.c'],
+         [libshared],
+         [],
+         'HAVE_LIBIPTC'],
+
+        [['src/test/test-netlink-manual.c'],
+         [],
+         [libkmod],
+         'HAVE_KMOD', 'manual'],
+
+        [['src/test/test-ellipsize.c'],
+         [],
+         []],
+
+        [['src/test/test-date.c'],
+         [],
+         []],
+
+        [['src/test/test-sleep.c'],
+         [],
+         []],
+
+        [['src/test/test-replace-var.c'],
+         [],
+         []],
+
+        [['src/test/test-calendarspec.c'],
+         [],
+         []],
+
+        [['src/test/test-strip-tab-ansi.c'],
+         [],
+         []],
+
+        [['src/test/test-daemon.c'],
+         [],
+         []],
+
+        [['src/test/test-cgroup.c'],
+         [],
+         [],
+         '', 'manual'],
+
+
+        [['src/test/test-cgroup-mask.c'],
+         [libcore,
+          libshared],
+         [threads,
+          librt,
+          libseccomp,
+          libselinux,
+          libmount,
+          libblkid]],
+
+        [['src/test/test-cgroup-util.c'],
+         [],
+         []],
+
+        [['src/test/test-env-util.c'],
+         [],
+         []],
+
+        [['src/test/test-strbuf.c'],
+         [],
+         []],
+
+        [['src/test/test-strv.c'],
+         [],
+         []],
+
+        [['src/test/test-path-util.c'],
+         [],
+         []],
+
+        [['src/test/test-path.c'],
+         [libcore,
+          libshared],
+         [threads,
+          librt,
+          libseccomp,
+          libselinux,
+          libmount,
+          libblkid]],
+
+        [['src/test/test-execute.c'],
+         [libcore,
+          libshared],
+         [threads,
+          librt,
+          libseccomp,
+          libselinux,
+          libmount,
+          libblkid]],
+
+        [['src/test/test-siphash24.c'],
+         [],
+         []],
+
+        [['src/test/test-strxcpyx.c'],
+         [],
+         []],
+
+        [['src/test/test-install.c'],
+         [libcore,
+          libshared],
+         [],
+         '', 'manual'],
+
+        [['src/test/test-watchdog.c'],
+         [],
+         []],
+
+        [['src/test/test-sched-prio.c'],
+         [libcore,
+          libshared],
+         [threads,
+          librt,
+          libseccomp,
+          libselinux,
+          libmount,
+          libblkid]],
+
+        [['src/test/test-conf-files.c'],
+         [],
+         []],
+
+        [['src/test/test-conf-parser.c'],
+         [],
+         []],
+
+        [['src/test/test-af-list.c',
+          generated_gperf_headers],
+         [],
+         []],
+
+        [['src/test/test-arphrd-list.c',
+          generated_gperf_headers],
+         [],
+         []],
+
+        [['src/test/test-journal-importer.c'],
+         [],
+         []],
+
+        [['src/test/test-libudev.c'],
+         [libshared],
+         []],
+
+        [['src/test/test-udev.c'],
+         [libudev_core,
+          libudev_internal,
+          libsystemd_network,
+          libshared],
+         [threads,
+          librt,
+          libblkid,
+          libkmod,
+          libacl],
+         '', 'manual'],
+
+        [['src/test/test-id128.c'],
+         [],
+         []],
+
+        [['src/test/test-hash.c'],
+         [],
+         []],
+
+        [['src/test/test-nss.c'],
+         [],
+         [libdl],
+         '', 'manual'],
+]
+
+############################################################
+
+# define some tests here, because the link_with deps were not defined earlier
+
+tests += [
+        [['src/journal/test-journal.c'],
+         [libjournal_core,
+          libshared],
+         [threads,
+          libxz,
+          liblz4]],
+
+        [['src/journal/test-journal-send.c'],
+         [libjournal_core,
+          libshared],
+         [threads,
+          libxz,
+          liblz4]],
+
+        [['src/journal/test-journal-syslog.c'],
+         [libjournal_core,
+          libshared],
+         [threads,
+          libxz,
+          liblz4,
+          libselinux]],
+
+        [['src/journal/test-journal-match.c'],
+         [libjournal_core,
+          libshared],
+         [threads,
+          libxz,
+          liblz4]],
+
+        [['src/journal/test-journal-enum.c'],
+         [libjournal_core,
+          libshared],
+         [threads,
+          libxz,
+          liblz4]],
+
+        [['src/journal/test-journal-stream.c'],
+         [libjournal_core,
+          libshared],
+         [threads,
+          libxz,
+          liblz4]],
+
+        [['src/journal/test-journal-flush.c'],
+         [libjournal_core,
+          libshared],
+         [threads,
+          libxz,
+          liblz4]],
+
+        [['src/journal/test-journal-init.c'],
+         [libjournal_core,
+          libshared],
+         [threads,
+          libxz,
+          liblz4]],
+
+        [['src/journal/test-journal-verify.c'],
+         [libjournal_core,
+          libshared],
+         [threads,
+          libxz,
+          liblz4]],
+
+        [['src/journal/test-journal-interleaving.c'],
+         [libjournal_core,
+          libshared],
+         [threads,
+          libxz,
+          liblz4]],
+
+        [['src/journal/test-mmap-cache.c'],
+         [libjournal_core,
+          libshared],
+         [threads,
+          libxz,
+          liblz4]],
+
+        [['src/journal/test-catalog.c'],
+         [libjournal_core,
+          libshared],
+         [threads,
+          libxz,
+          liblz4],
+         '', '', '-DCATALOG_DIR="@0@"'.format(build_catalog_dir)],
+
+        [['src/journal/test-compress.c'],
+         [libjournal_core,
+          libshared],
+         [liblz4,
+          libxz]],
+
+        [['src/journal/test-compress-benchmark.c'],
+         [libjournal_core,
+          libshared],
+         [liblz4,
+          libxz],
+         '', 'timeout=90'],
+
+        [['src/journal/test-audit-type.c'],
+         [libjournal_core,
+          libshared],
+         [liblz4,
+          libxz]],
+]
+
+############################################################
+
+tests += [
+        [['src/libsystemd/sd-bus/test-bus-marshal.c'],
+         [],
+         [threads,
+          libglib,
+          libgobject,
+          libgio,
+          libdbus]],
+
+        [['src/libsystemd/sd-bus/test-bus-signature.c'],
+         [],
+         [threads]],
+
+        [['src/libsystemd/sd-bus/test-bus-chat.c'],
+         [],
+         [threads]],
+
+        [['src/libsystemd/sd-bus/test-bus-cleanup.c'],
+         [],
+         [threads,
+          libseccomp]],
+
+        [['src/libsystemd/sd-bus/test-bus-error.c'],
+         [libshared_static,
+          libsystemd_internal],
+         []],
+
+        [['src/libsystemd/sd-bus/test-bus-track.c'],
+         [],
+         [libseccomp]],
+
+        [['src/libsystemd/sd-bus/test-bus-server.c'],
+         [],
+         [threads]],
+
+        [['src/libsystemd/sd-bus/test-bus-objects.c'],
+         [],
+         [threads]],
+
+        [['src/libsystemd/sd-bus/test-bus-vtable.c'],
+         [],
+         []],
+
+        [['src/libsystemd/sd-bus/test-bus-gvariant.c'],
+         [],
+         [libglib,
+          libgobject,
+          libgio]],
+
+        [['src/libsystemd/sd-bus/test-bus-creds.c'],
+         [],
+         []],
+
+        [['src/libsystemd/sd-bus/test-bus-match.c'],
+         [],
+         []],
+
+        [['src/libsystemd/sd-bus/test-bus-kernel.c'],
+         [],
+         []],
+
+        [['src/libsystemd/sd-bus/test-bus-kernel-bloom.c'],
+         [],
+         []],
+
+        [['src/libsystemd/sd-bus/test-bus-benchmark.c'],
+         [],
+         [threads]],
+
+        [['src/libsystemd/sd-bus/test-bus-zero-copy.c'],
+         [],
+         []],
+
+        [['src/libsystemd/sd-bus/test-bus-introspect.c'],
+         [],
+         []],
+
+        [['src/libsystemd/sd-event/test-event.c'],
+         [],
+         []],
+
+        [['src/libsystemd/sd-netlink/test-netlink.c'],
+         [],
+         []],
+
+        [['src/libsystemd/sd-netlink/test-local-addresses.c'],
+         [],
+         []],
+
+        [['src/libsystemd/sd-resolve/test-resolve.c'],
+         [],
+         [threads]],
+
+        [['src/libsystemd/sd-login/test-login.c'],
+         [],
+         []],
+]
+
+if cxx.found()
+        tests += [
+                [['src/libsystemd/sd-bus/test-bus-vtable-cc.cc'],
+                 [],
+                 []]
+        ]
+endif
+
+############################################################
+
+tests += [
+        [['src/libsystemd-network/test-dhcp-option.c',
+          'src/libsystemd-network/dhcp-protocol.h',
+          'src/libsystemd-network/dhcp-internal.h'],
+         [libshared,
+          libsystemd_network],
+         []],
+
+        [['src/libsystemd-network/test-sd-dhcp-lease.c',
+          'src/libsystemd-network/dhcp-lease-internal.h'],
+         [libshared,
+          libsystemd_network],
+         []],
+
+        [['src/libsystemd-network/test-dhcp-client.c',
+          'src/libsystemd-network/dhcp-protocol.h',
+          'src/libsystemd-network/dhcp-internal.h',
+          'src/systemd/sd-dhcp-client.h'],
+         [libshared,
+          libsystemd_network],
+         []],
+
+        [['src/libsystemd-network/test-dhcp-server.c'],
+         [libshared,
+          libsystemd_network],
+         []],
+
+        [['src/libsystemd-network/test-ipv4ll.c',
+          'src/libsystemd-network/arp-util.h',
+          'src/systemd/sd-ipv4ll.h'],
+         [libshared,
+          libsystemd_network],
+         []],
+
+        [['src/libsystemd-network/test-ipv4ll-manual.c',
+          'src/systemd/sd-ipv4ll.h'],
+         [libshared,
+          libsystemd_network],
+         [],
+         '', 'manual'],
+
+        [['src/libsystemd-network/test-acd.c',
+          'src/systemd/sd-ipv4acd.h'],
+         [libshared,
+          libsystemd_network],
+         [],
+         '', 'manual'],
+
+        [['src/libsystemd-network/test-ndisc-rs.c',
+          'src/libsystemd-network/dhcp-identifier.h',
+          'src/libsystemd-network/dhcp-identifier.c',
+          'src/libsystemd-network/icmp6-util.h',
+          'src/systemd/sd-dhcp6-client.h',
+          'src/systemd/sd-ndisc.h'],
+         [libshared,
+          libsystemd_network],
+         []],
+
+        [['src/libsystemd-network/test-ndisc-ra.c',
+          'src/libsystemd-network/icmp6-util.h',
+          'src/systemd/sd-ndisc.h'],
+         [libshared,
+          libsystemd_network],
+         []],
+
+        [['src/libsystemd-network/test-dhcp6-client.c',
+          'src/libsystemd-network/dhcp-identifier.h',
+          'src/libsystemd-network/dhcp-identifier.c',
+          'src/libsystemd-network/dhcp6-internal.h',
+          'src/systemd/sd-dhcp6-client.h'],
+         [libshared,
+          libsystemd_network],
+         []],
+
+        [['src/libsystemd-network/test-lldp.c'],
+         [libshared,
+          libsystemd_network],
+         []],
+]
+
+############################################################
+
+tests += [
+        [['src/login/test-login-shared.c'],
+         [],
+         []],
+
+        [['src/login/test-inhibit.c'],
+         [],
+         [],
+         '', 'manual'],
+
+        [['src/login/test-login-tables.c'],
+         [liblogind_core,
+          libshared],
+         [threads]],
+]
index 430dda8..5b572bb 100644 (file)
@@ -35,7 +35,7 @@ static void test_add_acls_for_user(void) {
         uid_t uid;
         int r;
 
-        fd = mkostemp_safe(fn, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(fn);
         assert_se(fd >= 0);
 
         /* Use the mode that user journal files use */
index aeaa092..bbaf18b 100644 (file)
@@ -24,7 +24,8 @@
 #include "string-util.h"
 #include "util.h"
 
-static const struct af_name* lookup_af(register const char *str, register unsigned int len);
+_unused_
+static const struct af_name* lookup_af(register const char *str, register GPERF_LEN_TYPE len);
 
 #include "af-from-name.h"
 #include "af-list.h"
index f3989ad..bb51518 100644 (file)
@@ -24,7 +24,8 @@
 #include "string-util.h"
 #include "util.h"
 
-static const struct arphrd_name* lookup_arphrd(register const char *str, register unsigned int len);
+_unused_ \
+static const struct arphrd_name* lookup_arphrd(register const char *str, register GPERF_LEN_TYPE len);
 
 #include "arphrd-from-name.h"
 #include "arphrd-list.h"
index ada6d67..4ebc27f 100644 (file)
@@ -36,7 +36,7 @@ int main(int argc, char *argv[]) {
         int fd;
         char name[] = "/tmp/test-asynchronous_close.XXXXXX";
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
         asynchronous_close(fd);
 
index 4a2b93d..a026ce4 100644 (file)
@@ -73,7 +73,7 @@ static void test_next(const char *input, const char *new_tz, usec_t after, usec_
 
         u = after;
         r = calendar_spec_next_usec(c, after, &u);
-        printf("At: %s\n", r < 0 ? strerror(-r) : format_timestamp_us(buf, sizeof(buf), u));
+        printf("At: %s\n", r < 0 ? strerror(-r) : format_timestamp_us(buf, sizeof buf, u));
         if (expect != (usec_t)-1)
                 assert_se(r >= 0 && u == expect);
         else
@@ -88,6 +88,51 @@ static void test_next(const char *input, const char *new_tz, usec_t after, usec_
         tzset();
 }
 
+static void test_timestamp(void) {
+        char buf[FORMAT_TIMESTAMP_MAX];
+        _cleanup_free_ char *t = NULL;
+        CalendarSpec *c;
+        usec_t x, y;
+
+        /* Ensure that a timestamp is also a valid calendar specification. Convert forth and back */
+
+        x = now(CLOCK_REALTIME);
+
+        assert_se(format_timestamp_us(buf, sizeof(buf), x));
+        printf("%s\n", buf);
+        assert_se(calendar_spec_from_string(buf, &c) >= 0);
+        assert_se(calendar_spec_to_string(c, &t) >= 0);
+        calendar_spec_free(c);
+        printf("%s\n", t);
+
+        assert_se(parse_timestamp(t, &y) >= 0);
+        assert_se(y == x);
+}
+
+static void test_hourly_bug_4031(void) {
+        CalendarSpec *c;
+        usec_t n, u, w;
+        char buf[FORMAT_TIMESTAMP_MAX], zaf[FORMAT_TIMESTAMP_MAX];
+        int r;
+
+        assert_se(calendar_spec_from_string("hourly", &c) >= 0);
+        n = now(CLOCK_REALTIME);
+        assert_se((r = calendar_spec_next_usec(c, n, &u)) >= 0);
+
+        printf("Now: %s (%"PRIu64")\n", format_timestamp_us(buf, sizeof buf, n), n);
+        printf("Next hourly: %s (%"PRIu64")\n", r < 0 ? strerror(-r) : format_timestamp_us(buf, sizeof buf, u), u);
+
+        assert_se((r = calendar_spec_next_usec(c, u, &w)) >= 0);
+        printf("Next hourly: %s (%"PRIu64")\n", r < 0 ? strerror(-r) : format_timestamp_us(zaf, sizeof zaf, w), w);
+
+        assert_se(n < u);
+        assert_se(u <= n + USEC_PER_HOUR);
+        assert_se(u < w);
+        assert_se(w <= u + USEC_PER_HOUR);
+
+        calendar_spec_free(c);
+}
+
 int main(int argc, char* argv[]) {
         CalendarSpec *c;
 
@@ -98,6 +143,7 @@ int main(int argc, char* argv[]) {
         test_one("Wed-Wed,Wed *-1", "Wed *-*-01 00:00:00");
         test_one("Wed..Wed,Wed *-1", "Wed *-*-01 00:00:00");
         test_one("Wed, 17:48", "Wed *-*-* 17:48:00");
+        test_one("Wednesday,", "Wed *-*-* 00:00:00");
         test_one("Wed-Sat,Tue 12-10-15 1:2:3", "Tue..Sat 2012-10-15 01:02:03");
         test_one("Wed..Sat,Tue 12-10-15 1:2:3", "Tue..Sat 2012-10-15 01:02:03");
         test_one("*-*-7 0:0:0", "*-*-07 00:00:00");
@@ -126,11 +172,32 @@ int main(int argc, char* argv[]) {
         test_one("2015-10-25 01:00:00 uTc", "2015-10-25 01:00:00 UTC");
         test_one("2016-03-27 03:17:00.4200005", "2016-03-27 03:17:00.420001");
         test_one("2016-03-27 03:17:00/0.42", "2016-03-27 03:17:00/0.420000");
-        test_one("2016-03-27 03:17:00/0.42", "2016-03-27 03:17:00/0.420000");
-        test_one("9..11,13:00,30", "*-*-* 09,10,11,13:00,30:00");
-        test_one("1..3-1..3 1..3:1..3", "*-01,02,03-01,02,03 01,02,03:01,02,03:00");
-        test_one("00:00:1.125..2.125", "*-*-* 00:00:01.125000,02.125000");
-        test_one("00:00:1.0..3.8", "*-*-* 00:00:01,02,03");
+        test_one("9..11,13:00,30", "*-*-* 09..11,13:00,30:00");
+        test_one("1..3-1..3 1..3:1..3", "*-01..03-01..03 01..03:01..03:00");
+        test_one("00:00:1.125..2.125", "*-*-* 00:00:01.125000..02.125000");
+        test_one("00:00:1.0..3.8", "*-*-* 00:00:01..03");
+        test_one("00:00:01..03", "*-*-* 00:00:01..03");
+        test_one("00:00:01/2,02..03", "*-*-* 00:00:01/2,02..03");
+        test_one("*-*~1 Utc", "*-*~01 00:00:00 UTC");
+        test_one("*-*~05,3 ", "*-*~03,05 00:00:00");
+        test_one("*-*~* 00:00:00", "*-*-* 00:00:00");
+        test_one("Monday", "Mon *-*-* 00:00:00");
+        test_one("Monday *-*-*", "Mon *-*-* 00:00:00");
+        test_one("*-*-*", "*-*-* 00:00:00");
+        test_one("*:*:*", "*-*-* *:*:*");
+        test_one("*:*", "*-*-* *:*:00");
+        test_one("12:*", "*-*-* 12:*:00");
+        test_one("*:30", "*-*-* *:30:00");
+        test_one("93..00-*-*", "1993..2000-*-* 00:00:00");
+        test_one("00..07-*-*", "2000..2007-*-* 00:00:00");
+        test_one("*:20..39/5", "*-*-* *:20..35/5:00");
+        test_one("00:00:20..40/1", "*-*-* 00:00:20..40");
+        test_one("*~03/1,03..05", "*-*~03/1,03..05 00:00:00");
+        /* UNIX timestamps are always UTC */
+        test_one("@1493187147", "2017-04-26 06:12:27 UTC");
+        test_one("@1493187147 UTC", "2017-04-26 06:12:27 UTC");
+        test_one("@0", "1970-01-01 00:00:00 UTC");
+        test_one("@0 UTC", "1970-01-01 00:00:00 UTC");
 
         test_next("2016-03-27 03:17:00", "", 12345, 1459048620000000);
         test_next("2016-03-27 03:17:00", "CET", 12345, 1459041420000000);
@@ -145,8 +212,17 @@ int main(int argc, char* argv[]) {
         test_next("2015-11-13 09:11:23.42/1.77", "EET", 1447398683420000, 1447398685190000);
         test_next("2015-11-13 09:11:23.42/1.77", "EET", 1447398683419999, 1447398683420000);
         test_next("Sun 16:00:00", "CET", 1456041600123456, 1456066800000000);
+        test_next("*-04-31", "", 12345, -1);
+        test_next("2016-02~01 UTC", "", 12345, 1456704000000000);
+        test_next("Mon 2017-05~01..07 UTC", "", 12345, 1496016000000000);
+        test_next("Mon 2017-05~07/1 UTC", "", 12345, 1496016000000000);
+        test_next("2017-08-06 9,11,13,15,17:00 UTC", "", 1502029800000000, 1502031600000000);
+        test_next("2017-08-06 9..17/2:00 UTC", "", 1502029800000000, 1502031600000000);
+        test_next("2016-12-* 3..21/6:00 UTC", "", 1482613200000001, 1482634800000000);
 
         assert_se(calendar_spec_from_string("test", &c) < 0);
+        assert_se(calendar_spec_from_string(" utc", &c) < 0);
+        assert_se(calendar_spec_from_string("    ", &c) < 0);
         assert_se(calendar_spec_from_string("", &c) < 0);
         assert_se(calendar_spec_from_string("7", &c) < 0);
         assert_se(calendar_spec_from_string("121212:1:2", &c) < 0);
@@ -154,6 +230,25 @@ int main(int argc, char* argv[]) {
         assert_se(calendar_spec_from_string("2000-03-05 00:00.1:00", &c) < 0);
         assert_se(calendar_spec_from_string("00:00:00/0.00000001", &c) < 0);
         assert_se(calendar_spec_from_string("00:00:00.0..00.9", &c) < 0);
+        assert_se(calendar_spec_from_string("2016~11-22", &c) < 0);
+        assert_se(calendar_spec_from_string("*-*~5/5", &c) < 0);
+        assert_se(calendar_spec_from_string("Monday.. 12:00", &c) < 0);
+        assert_se(calendar_spec_from_string("Monday..", &c) < 0);
+        assert_se(calendar_spec_from_string("-00:+00/-5", &c) < 0);
+        assert_se(calendar_spec_from_string("00:+00/-5", &c) < 0);
+        assert_se(calendar_spec_from_string("2016- 11- 24 12: 30: 00", &c) < 0);
+        assert_se(calendar_spec_from_string("*~29", &c) < 0);
+        assert_se(calendar_spec_from_string("*~16..31", &c) < 0);
+        assert_se(calendar_spec_from_string("12..1/2-*", &c) < 0);
+        assert_se(calendar_spec_from_string("*:05..05", &c) < 0);
+        assert_se(calendar_spec_from_string("*:05..10/6", &c) < 0);
+        assert_se(calendar_spec_from_string("20/4:00", &c) < 0);
+        assert_se(calendar_spec_from_string("00:00/60", &c) < 0);
+        assert_se(calendar_spec_from_string("00:00:2300", &c) < 0);
+        assert_se(calendar_spec_from_string("00:00:18446744073709551615", &c) < 0);
+
+        test_timestamp();
+        test_hourly_bug_4031();
 
         return 0;
 }
index a027eb0..b42088c 100644 (file)
@@ -27,6 +27,7 @@
 #include "unit.h"
 
 static int test_cgroup_mask(void) {
+        _cleanup_(rm_rf_physical_and_freep) char *runtime_dir = NULL;
         Manager *m = NULL;
         Unit *son, *daughter, *parent, *root, *grandchild, *parent_deep;
         FILE *serial = NULL;
@@ -34,7 +35,8 @@ static int test_cgroup_mask(void) {
         int r;
 
         /* Prepare the manager. */
-        assert_se(set_unit_path(TEST_DIR) >= 0);
+        assert_se(set_unit_path(get_testdata_dir("")) >= 0);
+        assert_se(runtime_dir = setup_fake_runtime_dir());
         r = manager_new(UNIT_FILE_USER, true, &m);
         if (r == -EPERM || r == -EACCES) {
                 puts("manager_new: Permission denied. Skipping test.");
@@ -110,10 +112,8 @@ static int test_cgroup_mask(void) {
 }
 
 int main(int argc, char* argv[]) {
-        _cleanup_(rm_rf_physical_and_freep) char *runtime_dir = NULL;
         int rc = 0;
 
-        assert_se(runtime_dir = setup_fake_runtime_dir());
         TEST_REQ_RUNNING_SYSTEMD(rc = test_cgroup_mask());
 
         return rc;
index 43f8906..30cd463 100644 (file)
 ***/
 
 #include "alloc-util.h"
+#include "build.h"
 #include "cgroup-util.h"
 #include "dirent-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "parse-util.h"
+#include "proc-cmdline.h"
 #include "process-util.h"
+#include "stat-util.h"
 #include "string-util.h"
 #include "test-helper.h"
 #include "user-util.h"
@@ -309,7 +312,71 @@ static void test_mask_supported(void) {
                 printf("'%s' is supported: %s\n", cgroup_controller_to_string(c), yes_no(m & CGROUP_CONTROLLER_TO_MASK(c)));
 }
 
+static void test_is_cgroup_fs(void) {
+        struct statfs sfs;
+        assert_se(statfs("/sys/fs/cgroup", &sfs) == 0);
+        if (is_temporary_fs(&sfs))
+                assert_se(statfs("/sys/fs/cgroup/systemd", &sfs) == 0);
+        assert_se(is_cgroup_fs(&sfs));
+}
+
+static void test_fd_is_cgroup_fs(void) {
+        int fd;
+
+        fd = open("/sys/fs/cgroup", O_RDONLY|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW);
+        assert_se(fd >= 0);
+        if (fd_is_temporary_fs(fd)) {
+                fd = safe_close(fd);
+                fd = open("/sys/fs/cgroup/systemd", O_RDONLY|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW);
+                assert_se(fd >= 0);
+        }
+        assert_se(fd_is_cgroup_fs(fd));
+        fd = safe_close(fd);
+}
+
+static void test_is_wanted_print(bool header) {
+        _cleanup_free_ char *cmdline = NULL;
+
+        log_info("-- %s --", __func__);
+        assert_se(proc_cmdline(&cmdline) >= 0);
+        log_info("cmdline: %s", cmdline);
+        if (header) {
+
+                log_info(_CGROUP_HIEARCHY_);
+                (void) system("findmnt -n /sys/fs/cgroup");
+        }
+
+        log_info("is_unified_wanted() → %s", yes_no(cg_is_unified_wanted()));
+        log_info("is_hybrid_wanted() → %s", yes_no(cg_is_hybrid_wanted()));
+        log_info("is_legacy_wanted() → %s", yes_no(cg_is_legacy_wanted()));
+        log_info(" ");
+}
+
+static void test_is_wanted(void) {
+        assert_se(setenv("SYSTEMD_PROC_CMDLINE",
+                         "systemd.unified_cgroup_hierarchy", 1) >= 0);
+        test_is_wanted_print(false);
+
+        assert_se(setenv("SYSTEMD_PROC_CMDLINE",
+                         "systemd.unified_cgroup_hierarchy=0", 1) >= 0);
+        test_is_wanted_print(false);
+
+        assert_se(setenv("SYSTEMD_PROC_CMDLINE",
+                         "systemd.unified_cgroup_hierarchy=0 "
+                         "systemd.legacy_systemd_cgroup_controller", 1) >= 0);
+        test_is_wanted_print(false);
+
+        assert_se(setenv("SYSTEMD_PROC_CMDLINE",
+                         "systemd.unified_cgroup_hierarchy=0 "
+                         "systemd.legacy_systemd_cgroup_controller=0", 1) >= 0);
+        test_is_wanted_print(false);
+}
+
 int main(void) {
+        log_set_max_level(LOG_DEBUG);
+        log_parse_environment();
+        log_open();
+
         test_path_decode_unit();
         test_path_get_unit();
         test_path_get_user_unit();
@@ -324,6 +391,11 @@ int main(void) {
         test_slice_to_path();
         test_shift_path();
         TEST_REQ_RUNNING_SYSTEMD(test_mask_supported());
+        TEST_REQ_RUNNING_SYSTEMD(test_is_cgroup_fs());
+        TEST_REQ_RUNNING_SYSTEMD(test_fd_is_cgroup_fs());
+        test_is_wanted_print(true);
+        test_is_wanted_print(false); /* run twice to test caching */
+        test_is_wanted();
 
         return 0;
 }
index 84f775e..7d97328 100644 (file)
@@ -55,7 +55,7 @@ static void test_clock_is_localtime(void) {
         /* without an adjtime file we default to UTC */
         assert_se(clock_is_localtime("/nonexisting/adjtime") == 0);
 
-        fd = mkostemp_safe(adjtime, O_WRONLY|O_CLOEXEC);
+        fd = mkostemp_safe(adjtime);
         assert_se(fd >= 0);
         log_info("adjtime test file: %s", adjtime);
         f = fdopen(fd, "w");
index 987862f..121345c 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+
 #include "sd-id128.h"
 
 #include "alloc-util.h"
 #include "audit-util.h"
 #include "condition.h"
 #include "hostname-util.h"
+#include "id128-util.h"
 #include "ima-util.h"
 #include "log.h"
 #include "macro.h"
 #include "selinux-util.h"
 #include "smack-util.h"
+#include "strv.h"
+#include "virt.h"
 #include "util.h"
+#include "user-util.h"
 
 static void test_condition_test_path(void) {
         Condition *condition;
 
         condition = condition_new(CONDITION_PATH_EXISTS, "/bin/sh", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_PATH_EXISTS, "/bin/s?", false, false);
+        assert_se(condition);
         assert_se(!condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_PATH_EXISTS_GLOB, "/bin/s?", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_PATH_EXISTS_GLOB, "/bin/s?", false, true);
+        assert_se(condition);
         assert_se(!condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_PATH_EXISTS, "/thiscertainlywontexist", false, false);
+        assert_se(condition);
         assert_se(!condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_PATH_EXISTS, "/thiscertainlywontexist", false, true);
+        assert_se(condition);
         assert_se(condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_PATH_IS_DIRECTORY, "/bin", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_DIRECTORY_NOT_EMPTY, "/bin", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_FILE_NOT_EMPTY, "/bin/sh", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_FILE_IS_EXECUTABLE, "/bin/sh", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_FILE_IS_EXECUTABLE, "/etc/passwd", false, false);
+        assert_se(condition);
         assert_se(!condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_PATH_IS_MOUNT_POINT, "/proc", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_PATH_IS_MOUNT_POINT, "/", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_PATH_IS_MOUNT_POINT, "/bin", false, false);
+        assert_se(condition);
         assert_se(!condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_PATH_IS_READ_WRITE, "/tmp", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_PATH_IS_SYMBOLIC_LINK, "/dev/stdout", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition));
         condition_free(condition);
 }
@@ -104,47 +128,59 @@ static void test_condition_test_ac_power(void) {
         Condition *condition;
 
         condition = condition_new(CONDITION_AC_POWER, "true", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition) == on_ac_power());
         condition_free(condition);
 
         condition = condition_new(CONDITION_AC_POWER, "false", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition) != on_ac_power());
         condition_free(condition);
 
         condition = condition_new(CONDITION_AC_POWER, "false", false, true);
+        assert_se(condition);
         assert_se(condition_test(condition) == on_ac_power());
         condition_free(condition);
 }
 
 static void test_condition_test_host(void) {
+        _cleanup_free_ char *hostname = NULL;
+        char sid[SD_ID128_STRING_MAX];
         Condition *condition;
         sd_id128_t id;
         int r;
-        char sid[SD_ID128_STRING_MAX];
-        _cleanup_free_ char *hostname = NULL;
 
         r = sd_id128_get_machine(&id);
         assert_se(r >= 0);
         assert_se(sd_id128_to_string(id, sid));
 
         condition = condition_new(CONDITION_HOST, sid, false, false);
+        assert_se(condition);
         assert_se(condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_HOST, "garbage value jjjjjjjjjjjjjj", false, false);
+        assert_se(condition);
         assert_se(!condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_HOST, sid, false, true);
+        assert_se(condition);
         assert_se(!condition_test(condition));
         condition_free(condition);
 
         hostname = gethostname_malloc();
         assert_se(hostname);
 
-        condition = condition_new(CONDITION_HOST, hostname, false, false);
-        assert_se(condition_test(condition));
-        condition_free(condition);
+        /* if hostname looks like an id128 then skip testing it */
+        if (id128_is_valid(hostname))
+                log_notice("hostname is an id128, skipping test");
+        else {
+                condition = condition_new(CONDITION_HOST, hostname, false, false);
+                assert_se(condition);
+                assert_se(condition_test(condition));
+                condition_free(condition);
+        }
 }
 
 static void test_condition_test_architecture(void) {
@@ -159,14 +195,17 @@ static void test_condition_test_architecture(void) {
         assert_se(sa);
 
         condition = condition_new(CONDITION_ARCHITECTURE, sa, false, false);
+        assert_se(condition);
         assert_se(condition_test(condition) > 0);
         condition_free(condition);
 
         condition = condition_new(CONDITION_ARCHITECTURE, "garbage value", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition) == 0);
         condition_free(condition);
 
         condition = condition_new(CONDITION_ARCHITECTURE, sa, false, true);
+        assert_se(condition);
         assert_se(condition_test(condition) == 0);
         condition_free(condition);
 }
@@ -175,10 +214,12 @@ static void test_condition_test_kernel_command_line(void) {
         Condition *condition;
 
         condition = condition_new(CONDITION_KERNEL_COMMAND_LINE, "thisreallyshouldntbeonthekernelcommandline", false, false);
+        assert_se(condition);
         assert_se(!condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_KERNEL_COMMAND_LINE, "andthis=neither", false, false);
+        assert_se(condition);
         assert_se(!condition_test(condition));
         condition_free(condition);
 }
@@ -187,10 +228,12 @@ static void test_condition_test_null(void) {
         Condition *condition;
 
         condition = condition_new(CONDITION_NULL, NULL, false, false);
+        assert_se(condition);
         assert_se(condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_NULL, NULL, false, true);
+        assert_se(condition);
         assert_se(!condition_test(condition));
         condition_free(condition);
 }
@@ -199,32 +242,238 @@ static void test_condition_test_security(void) {
         Condition *condition;
 
         condition = condition_new(CONDITION_SECURITY, "garbage oifdsjfoidsjoj", false, false);
+        assert_se(condition);
         assert_se(!condition_test(condition));
         condition_free(condition);
 
         condition = condition_new(CONDITION_SECURITY, "selinux", false, true);
-        assert_se(condition_test(condition) != mac_selinux_have());
+        assert_se(condition);
+        assert_se(condition_test(condition) != mac_selinux_use());
         condition_free(condition);
 
         condition = condition_new(CONDITION_SECURITY, "ima", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition) == use_ima());
         condition_free(condition);
 
         condition = condition_new(CONDITION_SECURITY, "apparmor", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition) == mac_apparmor_use());
         condition_free(condition);
 
         condition = condition_new(CONDITION_SECURITY, "smack", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition) == mac_smack_use());
         condition_free(condition);
 
         condition = condition_new(CONDITION_SECURITY, "audit", false, false);
+        assert_se(condition);
         assert_se(condition_test(condition) == use_audit());
         condition_free(condition);
 }
 
+static void test_condition_test_virtualization(void) {
+        Condition *condition;
+        const char *virt;
+        int r;
+
+        condition = condition_new(CONDITION_VIRTUALIZATION, "garbage oifdsjfoidsjoj", false, false);
+        assert_se(condition);
+        r = condition_test(condition);
+        log_info("ConditionVirtualization=garbage → %i", r);
+        assert_se(r == 0);
+        condition_free(condition);
+
+        condition = condition_new(CONDITION_VIRTUALIZATION, "container", false, false);
+        assert_se(condition);
+        r = condition_test(condition);
+        log_info("ConditionVirtualization=container → %i", r);
+        assert_se(r == !!detect_container());
+        condition_free(condition);
+
+        condition = condition_new(CONDITION_VIRTUALIZATION, "vm", false, false);
+        assert_se(condition);
+        r = condition_test(condition);
+        log_info("ConditionVirtualization=vm → %i", r);
+        assert_se(r == (detect_vm() && !detect_container()));
+        condition_free(condition);
+
+        condition = condition_new(CONDITION_VIRTUALIZATION, "private-users", false, false);
+        assert_se(condition);
+        r = condition_test(condition);
+        log_info("ConditionVirtualization=private-users → %i", r);
+        assert_se(r == !!running_in_userns());
+        condition_free(condition);
+
+        NULSTR_FOREACH(virt,
+                       "kvm\0"
+                       "qemu\0"
+                       "bochs\0"
+                       "xen\0"
+                       "uml\0"
+                       "vmware\0"
+                       "oracle\0"
+                       "microsoft\0"
+                       "zvm\0"
+                       "parallels\0"
+                       "bhyve\0"
+                       "vm_other\0") {
+
+                condition = condition_new(CONDITION_VIRTUALIZATION, virt, false, false);
+                assert_se(condition);
+                r = condition_test(condition);
+                log_info("ConditionVirtualization=%s → %i", virt, r);
+                assert_se(r >= 0);
+                condition_free(condition);
+        }
+}
+
+static void test_condition_test_user(void) {
+        Condition *condition;
+        char* uid;
+        char* username;
+        int r;
+
+        condition = condition_new(CONDITION_USER, "garbage oifdsjfoidsjoj", false, false);
+        assert_se(condition);
+        r = condition_test(condition);
+        log_info("ConditionUser=garbage → %i", r);
+        assert_se(r == 0);
+        condition_free(condition);
+
+        assert_se(asprintf(&uid, "%"PRIu32, UINT32_C(0xFFFF)) > 0);
+        condition = condition_new(CONDITION_USER, uid, false, false);
+        assert_se(condition);
+        r = condition_test(condition);
+        log_info("ConditionUser=%s → %i", uid, r);
+        assert_se(r == 0);
+        condition_free(condition);
+        free(uid);
+
+        assert_se(asprintf(&uid, "%u", (unsigned)getuid()) > 0);
+        condition = condition_new(CONDITION_USER, uid, false, false);
+        assert_se(condition);
+        r = condition_test(condition);
+        log_info("ConditionUser=%s → %i", uid, r);
+        assert_se(r > 0);
+        condition_free(condition);
+        free(uid);
+
+        assert_se(asprintf(&uid, "%u", (unsigned)getuid()+1) > 0);
+        condition = condition_new(CONDITION_USER, uid, false, false);
+        assert_se(condition);
+        r = condition_test(condition);
+        log_info("ConditionUser=%s → %i", uid, r);
+        assert_se(r == 0);
+        condition_free(condition);
+        free(uid);
+
+        username = getusername_malloc();
+        assert_se(username);
+        condition = condition_new(CONDITION_USER, username, false, false);
+        assert_se(condition);
+        r = condition_test(condition);
+        log_info("ConditionUser=%s → %i", username, r);
+        assert_se(r > 0);
+        condition_free(condition);
+        free(username);
+
+        username = (char*)(geteuid() == 0 ? NOBODY_USER_NAME : "root");
+        condition = condition_new(CONDITION_USER, username, false, false);
+        assert_se(condition);
+        r = condition_test(condition);
+        log_info("ConditionUser=%s → %i", username, r);
+        assert_se(r == 0);
+        condition_free(condition);
+
+        condition = condition_new(CONDITION_USER, "@system", false, false);
+        assert_se(condition);
+        r = condition_test(condition);
+        log_info("ConditionUser=@system → %i", r);
+        if (geteuid() == 0)
+                assert_se(r > 0);
+        else
+                assert_se(r == 0);
+        condition_free(condition);
+}
+
+static void test_condition_test_group(void) {
+        Condition *condition;
+        char* gid;
+        char* groupname;
+        gid_t *gids, max_gid;
+        int ngroups_max, r, i;
+
+        assert_se(0 < asprintf(&gid, "%u", UINT32_C(0xFFFF)));
+        condition = condition_new(CONDITION_GROUP, gid, false, false);
+        assert_se(condition);
+        r = condition_test(condition);
+        log_info("ConditionGroup=%s → %i", gid, r);
+        assert_se(r == 0);
+        condition_free(condition);
+        free(gid);
+
+        assert_se(0 < asprintf(&gid, "%u", getgid()));
+        condition = condition_new(CONDITION_GROUP, gid, false, false);
+        assert_se(condition);
+        r = condition_test(condition);
+        log_info("ConditionGroup=%s → %i", gid, r);
+        assert_se(r > 0);
+        condition_free(condition);
+        free(gid);
+
+        ngroups_max = sysconf(_SC_NGROUPS_MAX);
+        assert(ngroups_max > 0);
+
+        gids = alloca(sizeof(gid_t) * ngroups_max);
+
+        r = getgroups(ngroups_max, gids);
+        assert(r >= 0);
+
+        max_gid = getgid();
+        for (i = 0; i < r; i++) {
+                assert_se(0 < asprintf(&gid, "%u", gids[i]));
+                condition = condition_new(CONDITION_GROUP, gid, false, false);
+                assert_se(condition);
+                r = condition_test(condition);
+                log_info("ConditionGroup=%s → %i", gid, r);
+                assert_se(r > 0);
+                condition_free(condition);
+                free(gid);
+                max_gid = gids[i] > max_gid ? gids[i] : max_gid;
+
+                groupname = gid_to_name(gids[i]);
+                assert_se(groupname);
+                condition = condition_new(CONDITION_GROUP, groupname, false, false);
+                assert_se(condition);
+                r = condition_test(condition);
+                log_info("ConditionGroup=%s → %i", groupname, r);
+                assert_se(r > 0);
+                condition_free(condition);
+                free(groupname);
+                max_gid = gids[i] > max_gid ? gids[i] : max_gid;
+        }
+
+        assert_se(0 < asprintf(&gid, "%u", max_gid+1));
+        condition = condition_new(CONDITION_GROUP, gid, false, false);
+        assert_se(condition);
+        r = condition_test(condition);
+        log_info("ConditionGroup=%s → %i", gid, r);
+        assert_se(r == 0);
+        condition_free(condition);
+        free(gid);
+
+        groupname = (char*)(geteuid() == 0 ? NOBODY_GROUP_NAME : "root");
+        condition = condition_new(CONDITION_GROUP, groupname, false, false);
+        assert_se(condition);
+        r = condition_test(condition);
+        log_info("ConditionGroup=%s → %i", groupname, r);
+        assert_se(r == 0);
+        condition_free(condition);
+}
 
 int main(int argc, char *argv[]) {
+        log_set_max_level(LOG_DEBUG);
         log_parse_environment();
         log_open();
 
@@ -235,6 +484,9 @@ int main(int argc, char *argv[]) {
         test_condition_test_kernel_command_line();
         test_condition_test_null();
         test_condition_test_security();
+        test_condition_test_virtualization();
+        test_condition_test_user();
+        test_condition_test_group();
 
         return 0;
 }
index 03b3a9f..22b7c61 100644 (file)
@@ -47,13 +47,16 @@ static void setup_test_dir(char *tmp_dir, const char *files, ...) {
 
 static void test_conf_files_list(bool use_root) {
         char tmp_dir[] = "/tmp/test-conf-files-XXXXXX";
-        _cleanup_strv_free_ char **found_files = NULL;
-        const char *root_dir, *search_1, *search_2, *expect_a, *expect_b;
+        _cleanup_strv_free_ char **found_files = NULL, **found_files2 = NULL;
+        const char *root_dir, *search_1, *search_2, *expect_a, *expect_b, *expect_c;
+
+        log_debug("/* %s */", __func__);
 
         setup_test_dir(tmp_dir,
                        "/dir1/a.conf",
                        "/dir2/a.conf",
                        "/dir2/b.conf",
+                       "/dir2/c.foo",
                        NULL);
 
         if (use_root) {
@@ -68,6 +71,9 @@ static void test_conf_files_list(bool use_root) {
 
         expect_a = strjoina(tmp_dir, "/dir1/a.conf");
         expect_b = strjoina(tmp_dir, "/dir2/b.conf");
+        expect_c = strjoina(tmp_dir, "/dir2/c.foo");
+
+        log_debug("/* Check when filtered by suffix */");
 
         assert_se(conf_files_list(&found_files, ".conf", root_dir, search_1, search_2, NULL) == 0);
         strv_print(found_files);
@@ -77,10 +83,24 @@ static void test_conf_files_list(bool use_root) {
         assert_se(streq_ptr(found_files[1], expect_b));
         assert_se(found_files[2] == NULL);
 
+        log_debug("/* Check when unfiltered */");
+        assert_se(conf_files_list(&found_files2, NULL, root_dir, search_1, search_2, NULL) == 0);
+        strv_print(found_files2);
+
+        assert_se(found_files2);
+        assert_se(streq_ptr(found_files2[0], expect_a));
+        assert_se(streq_ptr(found_files2[1], expect_b));
+        assert_se(streq_ptr(found_files2[2], expect_c));
+        assert_se(found_files2[3] == NULL);
+
         assert_se(rm_rf(tmp_dir, REMOVE_ROOT|REMOVE_PHYSICAL) == 0);
 }
 
 int main(int argc, char **argv) {
+        log_set_max_level(LOG_DEBUG);
+        log_parse_environment();
+        log_open();
+
         test_conf_files_list(false);
         test_conf_files_list(true);
         return 0;
index be5d261..77fcbc0 100644 (file)
@@ -109,8 +109,10 @@ 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("/path/\xc3\x80", "/path/\xc3\x80");
 
         test_config_parse_path_one("not_absolute/path", NULL);
+        test_config_parse_path_one("/path/\xc3\x7f", NULL);
 }
 
 static void test_config_parse_log_level(void) {
@@ -180,6 +182,8 @@ static void test_config_parse_strv(void) {
         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"));
+        test_config_parse_strv_one("\xc3\x80", STRV_MAKE("\xc3\x80"));
+        test_config_parse_strv_one("\xc3\x7f", STRV_MAKE_EMPTY);
 }
 
 static void test_config_parse_mode(void) {
index 68154fc..ed67256 100644 (file)
@@ -31,6 +31,7 @@
 #include "rm-rf.h"
 #include "string-util.h"
 #include "strv.h"
+#include "user-util.h"
 #include "util.h"
 
 static void test_copy_file(void) {
@@ -42,17 +43,17 @@ static void test_copy_file(void) {
 
         log_info("%s", __func__);
 
-        fd = mkostemp_safe(fn, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(fn);
         assert_se(fd >= 0);
         close(fd);
 
-        fd = mkostemp_safe(fn_copy, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(fn_copy);
         assert_se(fd >= 0);
         close(fd);
 
         assert_se(write_string_file(fn, "foo bar bar bar foo", WRITE_STRING_FILE_CREATE) == 0);
 
-        assert_se(copy_file(fn, fn_copy, 0, 0644, 0) == 0);
+        assert_se(copy_file(fn, fn_copy, 0, 0644, 0, COPY_REFLINK) == 0);
 
         assert_se(read_full_file(fn_copy, &buf, &sz) == 0);
         assert_se(streq(buf, "foo bar bar bar foo\n"));
@@ -71,14 +72,14 @@ static void test_copy_file_fd(void) {
 
         log_info("%s", __func__);
 
-        in_fd = mkostemp_safe(in_fn, O_RDWR);
+        in_fd = mkostemp_safe(in_fn);
         assert_se(in_fd >= 0);
-        out_fd = mkostemp_safe(out_fn, O_RDWR);
+        out_fd = mkostemp_safe(out_fn);
         assert_se(out_fd >= 0);
 
         assert_se(write_string_file(in_fn, text, WRITE_STRING_FILE_CREATE) == 0);
-        assert_se(copy_file_fd("/a/file/which/does/not/exist/i/guess", out_fd, true) < 0);
-        assert_se(copy_file_fd(in_fn, out_fd, true) >= 0);
+        assert_se(copy_file_fd("/a/file/which/does/not/exist/i/guess", out_fd, COPY_REFLINK) < 0);
+        assert_se(copy_file_fd(in_fn, out_fd, COPY_REFLINK) >= 0);
         assert_se(lseek(out_fd, SEEK_SET, 0) == 0);
 
         assert_se(read(out_fd, buf, sizeof(buf)) == sizeof(text) - 1);
@@ -106,7 +107,7 @@ static void test_copy_tree(void) {
         STRV_FOREACH(p, files) {
                 _cleanup_free_ char *f;
 
-                assert_se(f = strappend(original_dir, *p));
+                assert_se((f = strappend(original_dir, *p)));
 
                 assert_se(mkdir_parents(f, 0755) >= 0);
                 assert_se(write_string_file(f, "file", WRITE_STRING_FILE_CREATE) == 0);
@@ -115,8 +116,8 @@ static void test_copy_tree(void) {
         STRV_FOREACH_PAIR(link, p, links) {
                 _cleanup_free_ char *f, *l;
 
-                assert_se(f = strappend(original_dir, *p));
-                assert_se(l = strappend(original_dir, *link));
+                assert_se((f = strappend(original_dir, *p)));
+                assert_se((l = strappend(original_dir, *link)));
 
                 assert_se(mkdir_parents(l, 0755) >= 0);
                 assert_se(symlink(f, l) == 0);
@@ -125,13 +126,13 @@ static void test_copy_tree(void) {
         unixsockp = strjoina(original_dir, "unixsock");
         assert_se(mknod(unixsockp, S_IFSOCK|0644, 0) >= 0);
 
-        assert_se(copy_tree(original_dir, copy_dir, true) == 0);
+        assert_se(copy_tree(original_dir, copy_dir, UID_INVALID, GID_INVALID, COPY_REFLINK|COPY_MERGE) == 0);
 
         STRV_FOREACH(p, files) {
                 _cleanup_free_ char *buf = NULL, *f;
                 size_t sz = 0;
 
-                assert_se(f = strappend(copy_dir, *p));
+                assert_se((f = strappend(copy_dir, *p)));
 
                 assert_se(access(f, F_OK) == 0);
                 assert_se(read_full_file(f, &buf, &sz) == 0);
@@ -141,10 +142,10 @@ static void test_copy_tree(void) {
         STRV_FOREACH_PAIR(link, p, links) {
                 _cleanup_free_ char *target = NULL, *f, *l;
 
-                assert_se(f = strjoin(original_dir, *p, NULL));
-                assert_se(l = strjoin(copy_dir, *link, NULL));
+                assert_se((f = strjoin(original_dir, *p)));
+                assert_se((l = strjoin(copy_dir, *link)));
 
-                assert_se(readlink_and_canonicalize(l, &target) == 0);
+                assert_se(readlink_and_canonicalize(l, NULL, &target) == 0);
                 assert_se(path_equal(f, target));
         }
 
@@ -152,8 +153,8 @@ static void test_copy_tree(void) {
         assert_se(stat(unixsockp, &st) >= 0);
         assert_se(S_ISSOCK(st.st_mode));
 
-        assert_se(copy_tree(original_dir, copy_dir, false) < 0);
-        assert_se(copy_tree("/tmp/inexistent/foo/bar/fsdoi", copy_dir, false) < 0);
+        assert_se(copy_tree(original_dir, copy_dir, UID_INVALID, GID_INVALID, COPY_REFLINK) < 0);
+        assert_se(copy_tree("/tmp/inexistent/foo/bar/fsdoi", copy_dir, UID_INVALID, GID_INVALID, COPY_REFLINK) < 0);
 
         (void) rm_rf(copy_dir, REMOVE_ROOT|REMOVE_PHYSICAL);
         (void) rm_rf(original_dir, REMOVE_ROOT|REMOVE_PHYSICAL);
@@ -172,7 +173,7 @@ static void test_copy_bytes(void) {
 
         assert_se(pipe2(pipefd, O_CLOEXEC) == 0);
 
-        r = copy_bytes(infd, pipefd[1], (uint64_t) -1, false);
+        r = copy_bytes(infd, pipefd[1], (uint64_t) -1, 0);
         assert_se(r == 0);
 
         r = read(pipefd[0], buf, sizeof(buf));
@@ -185,13 +186,13 @@ static void test_copy_bytes(void) {
         assert_se(strneq(buf, buf2, r));
 
         /* test copy_bytes with invalid descriptors */
-        r = copy_bytes(pipefd[0], pipefd[0], 1, false);
+        r = copy_bytes(pipefd[0], pipefd[0], 1, 0);
         assert_se(r == -EBADF);
 
-        r = copy_bytes(pipefd[1], pipefd[1], 1, false);
+        r = copy_bytes(pipefd[1], pipefd[1], 1, 0);
         assert_se(r == -EBADF);
 
-        r = copy_bytes(pipefd[1], infd, 1, false);
+        r = copy_bytes(pipefd[1], infd, 1, 0);
         assert_se(r == -EBADF);
 }
 
@@ -207,13 +208,13 @@ static void test_copy_bytes_regular_file(const char *src, bool try_reflink, uint
         fd = open(src, O_RDONLY | O_CLOEXEC | O_NOCTTY);
         assert_se(fd >= 0);
 
-        fd2 = mkostemp_safe(fn2, O_RDWR);
+        fd2 = mkostemp_safe(fn2);
         assert_se(fd2 >= 0);
 
-        fd3 = mkostemp_safe(fn3, O_WRONLY);
+        fd3 = mkostemp_safe(fn3);
         assert_se(fd3 >= 0);
 
-        r = copy_bytes(fd, fd2, max_bytes, try_reflink);
+        r = copy_bytes(fd, fd2, max_bytes, try_reflink ? COPY_REFLINK : 0);
         if (max_bytes == (uint64_t) -1)
                 assert_se(r == 0);
         else
@@ -221,7 +222,7 @@ static void test_copy_bytes_regular_file(const char *src, bool try_reflink, uint
 
         assert_se(lseek(fd2, 0, SEEK_SET) == 0);
 
-        r = copy_bytes(fd2, fd3, max_bytes, try_reflink);
+        r = copy_bytes(fd2, fd3, max_bytes, try_reflink ? COPY_REFLINK : 0);
         if (max_bytes == (uint64_t) -1)
                 assert_se(r == 0);
         else
index 7f497bb..0e7d44f 100644 (file)
 
 static void test_should_pass(const char *p) {
         usec_t t, q;
-        char buf[FORMAT_TIMESTAMP_MAX], buf_relative[FORMAT_TIMESTAMP_RELATIVE_MAX], *sp;
+        char buf[FORMAT_TIMESTAMP_MAX], buf_relative[FORMAT_TIMESTAMP_RELATIVE_MAX];
 
+        log_info("Test: %s", p);
         assert_se(parse_timestamp(p, &t) >= 0);
-        format_timestamp_us(buf, sizeof(buf), t);
-        log_info("%s", buf);
-
-        /* Chop off timezone */
-        sp = strrchr(buf, ' ');
-        assert_se(sp);
-        *sp = 0;
+        assert_se(format_timestamp_us(buf, sizeof(buf), t));
+        log_info("\"%s\" → \"%s\"", p, buf);
 
         assert_se(parse_timestamp(buf, &q) >= 0);
         assert_se(q == t);
 
-        format_timestamp_relative(buf_relative, sizeof(buf_relative), t);
+        assert_se(format_timestamp_relative(buf_relative, sizeof(buf_relative), t));
         log_info("%s", strna(buf_relative));
-        assert_se(parse_timestamp(buf, &q) >= 0);
 }
 
 static void test_should_parse(const char *p) {
         usec_t t;
 
+        log_info("Test: %s", p);
         assert_se(parse_timestamp(p, &t) >= 0);
+        log_info("\"%s\" → \"@%" PRI_USEC "\"", p, t);
 }
 
 static void test_should_fail(const char *p) {
         usec_t t;
+        int r;
 
-        assert_se(parse_timestamp(p, &t) < 0);
+        log_info("Test: %s", p);
+        r = parse_timestamp(p, &t);
+        if (r >= 0)
+                log_info("\"%s\" → \"@%" PRI_USEC "\" (unexpected)", p, t);
+        else
+                log_info("parse_timestamp() returns %d (expected)", r);
+        assert_se(r < 0);
 }
 
 static void test_one(const char *p) {
         _cleanup_free_ char *with_utc;
 
-        log_info("Test: %s", p);
-        with_utc = strjoin(p, " UTC", NULL);
+        with_utc = strjoin(p, " UTC");
         test_should_pass(p);
         test_should_pass(with_utc);
 }
@@ -68,8 +71,7 @@ static void test_one(const char *p) {
 static void test_one_noutc(const char *p) {
         _cleanup_free_ char *with_utc;
 
-        log_info("Test: %s", p);
-        with_utc = strjoin(p, " UTC", NULL);
+        with_utc = strjoin(p, " UTC");
         test_should_pass(p);
         test_should_fail(with_utc);
 }
@@ -85,16 +87,27 @@ int main(int argc, char *argv[]) {
         test_one("2012-12-30 18:42");
         test_one("2012-10-02");
         test_one("Tue 2012-10-02");
-        test_one_noutc("now");
         test_one("yesterday");
         test_one("today");
         test_one("tomorrow");
+        test_one_noutc("now");
         test_one_noutc("+2d");
         test_one_noutc("+2y 4d");
         test_one_noutc("5months ago");
         test_one_noutc("@1395716396");
-        test_should_parse("today UTC");
+        test_should_parse("1970-1-1 UTC");
+        test_should_pass("1970-1-1 00:00:01 UTC");
+        test_should_fail("1969-12-31 UTC");
+        test_should_fail("-100y");
         test_should_fail("today UTC UTC");
+#if SIZEOF_TIME_T == 8
+        test_should_pass("9999-12-30 23:59:59 UTC");
+        test_should_fail("9999-12-31 00:00:00 UTC");
+        test_should_fail("10000-01-01 00:00:00 UTC");
+#elif SIZEOF_TIME_T == 4
+        test_should_pass("2038-01-19 03:14:07 UTC");
+        test_should_fail("2038-01-19 03:14:08 UTC");
+#endif
 
         return 0;
 }
diff --git a/src/test/test-dissect-image.c b/src/test/test-dissect-image.c
new file mode 100644 (file)
index 0000000..2bb68be
--- /dev/null
@@ -0,0 +1,66 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <fcntl.h>
+#include <stdio.h>
+
+#include "dissect-image.h"
+#include "log.h"
+#include "loop-util.h"
+#include "string-util.h"
+
+int main(int argc, char *argv[]) {
+        _cleanup_(loop_device_unrefp) LoopDevice *d = NULL;
+        _cleanup_(dissected_image_unrefp) DissectedImage *m = NULL;
+        int r, i;
+
+        log_set_max_level(LOG_DEBUG);
+
+        if (argc < 2) {
+                log_error("Requires one command line argument.");
+                return EXIT_FAILURE;
+        }
+
+        r = loop_device_make_by_path(argv[1], O_RDONLY, &d);
+        if (r < 0) {
+                log_error_errno(r, "Failed to set up loopback device: %m");
+                return EXIT_FAILURE;
+        }
+
+        r = dissect_image(d->fd, NULL, 0, DISSECT_IMAGE_REQUIRE_ROOT, &m);
+        if (r < 0) {
+                log_error_errno(r, "Failed to dissect image: %m");
+                return EXIT_FAILURE;
+        }
+
+        for (i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) {
+
+                if (!m->partitions[i].found)
+                        continue;
+
+                printf("Found %s partition, %s of type %s at #%i (%s)\n",
+                       partition_designator_to_string(i),
+                       m->partitions[i].rw ? "writable" : "read-only",
+                       strna(m->partitions[i].fstype),
+                       m->partitions[i].partno,
+                       strna(m->partitions[i].node));
+        }
+
+        return EXIT_SUCCESS;
+}
diff --git a/src/test/test-dlopen.c b/src/test/test-dlopen.c
new file mode 100644 (file)
index 0000000..9f5343a
--- /dev/null
@@ -0,0 +1,32 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 Zbigniew Jędrzejewski-Szmek
+
+  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 <dlfcn.h>
+#include <stdlib.h>
+
+#include "macro.h"
+
+int main(int argc, char **argv) {
+        void *handle;
+
+        assert_se((handle = dlopen(argv[1], RTLD_NOW)));
+        assert_se(dlclose(handle) == 0);
+
+        return EXIT_SUCCESS;
+}
index a9d09f5..11cf0b1 100644 (file)
@@ -48,6 +48,7 @@ static void test_dns_label_unescape(void) {
         test_dns_label_unescape_one("..", "", 20, -EINVAL);
         test_dns_label_unescape_one(".foobar", "", 20, -EINVAL);
         test_dns_label_unescape_one("foobar.", "foobar", 20, 6);
+        test_dns_label_unescape_one("foobar..", "foobar", 20, -EINVAL);
 }
 
 static void test_dns_name_to_wire_format_one(const char *what, const char *expect, size_t buffer_sz, int ret) {
@@ -359,6 +360,7 @@ static void test_dns_name_is_valid_one(const char *s, int ret) {
 static void test_dns_name_is_valid(void) {
         test_dns_name_is_valid_one("foo", 1);
         test_dns_name_is_valid_one("foo.", 1);
+        test_dns_name_is_valid_one("foo..", 0);
         test_dns_name_is_valid_one("Foo", 1);
         test_dns_name_is_valid_one("foo.bar", 1);
         test_dns_name_is_valid_one("foo.bar.baz", 1);
@@ -366,20 +368,21 @@ static void test_dns_name_is_valid(void) {
         test_dns_name_is_valid_one("foo..bar", 0);
         test_dns_name_is_valid_one(".foo.bar", 0);
         test_dns_name_is_valid_one("foo.bar.", 1);
+        test_dns_name_is_valid_one("foo.bar..", 0);
         test_dns_name_is_valid_one("\\zbar", 0);
         test_dns_name_is_valid_one("ä", 1);
         test_dns_name_is_valid_one("\n", 0);
 
-        /* 256 characters*/
+        /* 256 characters */
         test_dns_name_is_valid_one("a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345", 0);
 
-        /* 255 characters*/
+        /* 255 characters */
         test_dns_name_is_valid_one("a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a1234", 0);
 
-        /* 254 characters*/
+        /* 254 characters */
         test_dns_name_is_valid_one("a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a123", 0);
 
-        /* 253 characters*/
+        /* 253 characters */
         test_dns_name_is_valid_one("a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12345678.a12", 1);
 
         /* label of 64 chars length */
@@ -604,27 +607,71 @@ static void test_dns_name_common_suffix(void) {
         test_dns_name_common_suffix_one("FOO.BAR", "tEST.bAR", "BAR");
 }
 
-static void test_dns_name_apply_idna_one(const char *s, const char *result) {
-#ifdef HAVE_LIBIDN
+static void test_dns_name_apply_idna_one(const char *s, int expected, const char *result) {
         _cleanup_free_ char *buf = NULL;
-        assert_se(dns_name_apply_idna(s, &buf) >= 0);
-        assert_se(dns_name_equal(buf, result) > 0);
-#endif
+        int r;
+
+        r = dns_name_apply_idna(s, &buf);
+        log_debug("dns_name_apply_idna: \"%s\" → %d/\"%s\" (expected %d/\"%s\")",
+                  s, r, strnull(buf), expected, strnull(result));
+
+        assert_se(r == expected);
+        if (expected == 1)
+                assert_se(dns_name_equal(buf, result) == 1);
 }
 
 static void test_dns_name_apply_idna(void) {
-        test_dns_name_apply_idna_one("", "");
-        test_dns_name_apply_idna_one("foo", "foo");
-        test_dns_name_apply_idna_one("foo.", "foo");
-        test_dns_name_apply_idna_one("foo.bar", "foo.bar");
-        test_dns_name_apply_idna_one("foo.bar.", "foo.bar");
-        test_dns_name_apply_idna_one("föö", "xn--f-1gaa");
-        test_dns_name_apply_idna_one("föö.", "xn--f-1gaa");
-        test_dns_name_apply_idna_one("föö.bär", "xn--f-1gaa.xn--br-via");
-        test_dns_name_apply_idna_one("föö.bär.", "xn--f-1gaa.xn--br-via");
+#if defined HAVE_LIBIDN2 || defined HAVE_LIBIDN
+        const int ret = 1;
+#else
+        const int ret = 0;
+#endif
+
+        /* IDNA2008 forbids names with hyphens in third and fourth positions
+         * (https://tools.ietf.org/html/rfc5891#section-4.2.3.1).
+         * IDNA2003 does not have this restriction
+         * (https://tools.ietf.org/html/rfc3490#section-5).
+         * This means that when using libidn we will transform and test more
+         * labels. If registrars follow IDNA2008 we'll just be performing a
+         * useless lookup.
+         */
+#if defined HAVE_LIBIDN
+        const int ret2 = 1;
+#else
+        const int ret2 = 0;
+#endif
+
+        test_dns_name_apply_idna_one("", ret, "");
+        test_dns_name_apply_idna_one("foo", ret, "foo");
+        test_dns_name_apply_idna_one("foo.", ret, "foo");
+        test_dns_name_apply_idna_one("foo.bar", ret, "foo.bar");
+        test_dns_name_apply_idna_one("foo.bar.", ret, "foo.bar");
+        test_dns_name_apply_idna_one("föö", ret, "xn--f-1gaa");
+        test_dns_name_apply_idna_one("föö.", ret, "xn--f-1gaa");
+        test_dns_name_apply_idna_one("föö.bär", ret, "xn--f-1gaa.xn--br-via");
+        test_dns_name_apply_idna_one("föö.bär.", ret, "xn--f-1gaa.xn--br-via");
+        test_dns_name_apply_idna_one("xn--f-1gaa.xn--br-via", ret, "xn--f-1gaa.xn--br-via");
+
+        test_dns_name_apply_idna_one("r3---sn-ab5l6ne7.googlevideo.com", ret2,
+                                     ret2 ? "r3---sn-ab5l6ne7.googlevideo.com" : "");
+}
+
+static void test_dns_name_is_valid_or_address(void) {
+        assert_se(dns_name_is_valid_or_address(NULL) == 0);
+        assert_se(dns_name_is_valid_or_address("") == 0);
+        assert_se(dns_name_is_valid_or_address("foobar") > 0);
+        assert_se(dns_name_is_valid_or_address("foobar.com") > 0);
+        assert_se(dns_name_is_valid_or_address("foobar..com") == 0);
+        assert_se(dns_name_is_valid_or_address("foobar.com.") > 0);
+        assert_se(dns_name_is_valid_or_address("127.0.0.1") > 0);
+        assert_se(dns_name_is_valid_or_address("::") > 0);
+        assert_se(dns_name_is_valid_or_address("::1") > 0);
 }
 
 int main(int argc, char *argv[]) {
+        log_set_max_level(LOG_DEBUG);
+        log_parse_environment();
+        log_open();
 
         test_dns_label_unescape();
         test_dns_label_unescape_suffix();
@@ -651,6 +698,7 @@ int main(int argc, char *argv[]) {
         test_dns_name_compare_func();
         test_dns_name_common_suffix();
         test_dns_name_apply_idna();
+        test_dns_name_is_valid_or_address();
 
         return 0;
 }
index 23da10f..8133343 100644 (file)
@@ -37,13 +37,12 @@ int main(int argc, char *argv[]) {
         Job *j;
         int r;
 
-        assert_se(runtime_dir = setup_fake_runtime_dir());
-
         /* prepare the test */
-        assert_se(set_unit_path(TEST_DIR) >= 0);
+        assert_se(set_unit_path(get_testdata_dir("")) >= 0);
+        assert_se(runtime_dir = setup_fake_runtime_dir());
         r = manager_new(UNIT_FILE_USER, true, &m);
         if (MANAGER_SKIP_TEST(r)) {
-                printf("Skipping test: manager_new: %s\n", strerror(-r));
+                log_notice_errno(r, "Skipping test: manager_new: %m");
                 return EXIT_TEST_SKIP;
         }
         assert_se(r >= 0);
index 35bb629..3a2492d 100644 (file)
@@ -21,6 +21,8 @@
 #include <string.h>
 
 #include "env-util.h"
+#include "fd-util.h"
+#include "fileio.h"
 #include "string-util.h"
 #include "strv.h"
 #include "util.h"
@@ -45,6 +47,16 @@ static void test_strv_env_delete(void) {
         assert_se(strv_length(d) == 2);
 }
 
+static void test_strv_env_get(void) {
+        char **l;
+
+        l = STRV_MAKE("ONE_OR_TWO=1", "THREE=3", "ONE_OR_TWO=2", "FOUR=4");
+
+        assert_se(streq(strv_env_get(l, "ONE_OR_TWO"), "2"));
+        assert_se(streq(strv_env_get(l, "THREE"), "3"));
+        assert_se(streq(strv_env_get(l, "FOUR"), "4"));
+}
+
 static void test_strv_env_unset(void) {
         _cleanup_strv_free_ char **l = NULL;
 
@@ -102,7 +114,90 @@ static void test_strv_env_merge(void) {
         assert_se(strv_length(r) == 5);
 }
 
-static void test_replace_env_arg(void) {
+static void test_env_strv_get_n(void) {
+        const char *_env[] = {
+                "FOO=NO NO NO",
+                "FOO=BAR BAR",
+                "BAR=waldo",
+                "PATH=unset",
+                NULL
+        };
+        char **env = (char**) _env;
+
+        assert_se(streq(strv_env_get_n(env, "FOO__", 3, 0), "BAR BAR"));
+        assert_se(streq(strv_env_get_n(env, "FOO__", 3, REPLACE_ENV_USE_ENVIRONMENT), "BAR BAR"));
+        assert_se(streq(strv_env_get_n(env, "FOO", 3, 0), "BAR BAR"));
+        assert_se(streq(strv_env_get_n(env, "FOO", 3, REPLACE_ENV_USE_ENVIRONMENT), "BAR BAR"));
+
+        assert_se(streq(strv_env_get_n(env, "PATH__", 4, 0), "unset"));
+        assert_se(streq(strv_env_get_n(env, "PATH", 4, 0), "unset"));
+        assert_se(streq(strv_env_get_n(env, "PATH__", 4, REPLACE_ENV_USE_ENVIRONMENT), "unset"));
+        assert_se(streq(strv_env_get_n(env, "PATH", 4, REPLACE_ENV_USE_ENVIRONMENT), "unset"));
+
+        env[3] = NULL; /* kill our $PATH */
+
+        assert_se(!strv_env_get_n(env, "PATH__", 4, 0));
+        assert_se(!strv_env_get_n(env, "PATH", 4, 0));
+        assert_se(streq(strv_env_get_n(env, "PATH__", 4, REPLACE_ENV_USE_ENVIRONMENT),
+                        getenv("PATH")));
+        assert_se(streq(strv_env_get_n(env, "PATH", 4, REPLACE_ENV_USE_ENVIRONMENT),
+                        getenv("PATH")));
+}
+
+static void test_replace_env(bool braceless) {
+        const char *env[] = {
+                "FOO=BAR BAR",
+                "BAR=waldo",
+                NULL
+        };
+        _cleanup_free_ char *t = NULL, *s = NULL, *q = NULL, *r = NULL, *p = NULL;
+        unsigned flags = REPLACE_ENV_ALLOW_BRACELESS*braceless;
+
+        t = replace_env("FOO=$FOO=${FOO}", (char**) env, flags);
+        assert_se(streq(t, braceless ? "FOO=BAR BAR=BAR BAR" : "FOO=$FOO=BAR BAR"));
+
+        s = replace_env("BAR=$BAR=${BAR}", (char**) env, flags);
+        assert_se(streq(s, braceless ? "BAR=waldo=waldo" : "BAR=$BAR=waldo"));
+
+        q = replace_env("BARBAR=$BARBAR=${BARBAR}", (char**) env, flags);
+        assert_se(streq(q, braceless ? "BARBAR==" : "BARBAR=$BARBAR="));
+
+        r = replace_env("BAR=$BAR$BAR${BAR}${BAR}", (char**) env, flags);
+        assert_se(streq(r, braceless ? "BAR=waldowaldowaldowaldo" : "BAR=$BAR$BARwaldowaldo"));
+
+        p = replace_env("${BAR}$BAR$BAR", (char**) env, flags);
+        assert_se(streq(p, braceless ? "waldowaldowaldo" : "waldo$BAR$BAR"));
+}
+
+static void test_replace_env2(bool extended) {
+        const char *env[] = {
+                "FOO=foo",
+                "BAR=bar",
+                NULL
+        };
+        _cleanup_free_ char *t = NULL, *s = NULL, *q = NULL, *r = NULL, *p = NULL, *x = NULL;
+        unsigned flags = REPLACE_ENV_ALLOW_EXTENDED*extended;
+
+        t = replace_env("FOO=${FOO:-${BAR}}", (char**) env, flags);
+        assert_se(streq(t, extended ? "FOO=foo" : "FOO=${FOO:-bar}"));
+
+        s = replace_env("BAR=${XXX:-${BAR}}", (char**) env, flags);
+        assert_se(streq(s, extended ? "BAR=bar" : "BAR=${XXX:-bar}"));
+
+        q = replace_env("XXX=${XXX:+${BAR}}", (char**) env, flags);
+        assert_se(streq(q, extended ? "XXX=" : "XXX=${XXX:+bar}"));
+
+        r = replace_env("FOO=${FOO:+${BAR}}", (char**) env, flags);
+        assert_se(streq(r, extended ? "FOO=bar" : "FOO=${FOO:+bar}"));
+
+        p = replace_env("FOO=${FOO:-${BAR}post}", (char**) env, flags);
+        assert_se(streq(p, extended ? "FOO=foo" : "FOO=${FOO:-barpost}"));
+
+        x = replace_env("XXX=${XXX:+${BAR}post}", (char**) env, flags);
+        assert_se(streq(x, extended ? "XXX=" : "XXX=${XXX:+barpost}"));
+}
+
+static void test_replace_env_argv(void) {
         const char *env[] = {
                 "FOO=BAR BAR",
                 "BAR=waldo",
@@ -120,6 +215,12 @@ static void test_replace_env_arg(void) {
                 "${FOO",
                 "FOO$$${FOO}",
                 "$$FOO${FOO}",
+                "${FOO:-${BAR}}",
+                "${QUUX:-${FOO}}",
+                "${FOO:+${BAR}}",
+                "${QUUX:+${BAR}}",
+                "${FOO:+|${BAR}|}}",
+                "${FOO:+|${BAR}{|}",
                 NULL
         };
         _cleanup_strv_free_ char **r = NULL;
@@ -137,7 +238,13 @@ static void test_replace_env_arg(void) {
         assert_se(streq(r[8], "${FOO"));
         assert_se(streq(r[9], "FOO$BAR BAR"));
         assert_se(streq(r[10], "$FOOBAR BAR"));
-        assert_se(strv_length(r) == 11);
+        assert_se(streq(r[11], "${FOO:-waldo}"));
+        assert_se(streq(r[12], "${QUUX:-BAR BAR}"));
+        assert_se(streq(r[13], "${FOO:+waldo}"));
+        assert_se(streq(r[14], "${QUUX:+waldo}"));
+        assert_se(streq(r[15], "${FOO:+|waldo|}}"));
+        assert_se(streq(r[16], "${FOO:+|waldo{|}"));
+        assert_se(strv_length(r) == 17);
 }
 
 static void test_env_clean(void) {
@@ -209,16 +316,75 @@ static void test_env_assignment_is_valid(void) {
         assert_se(!env_assignment_is_valid("głąb=printf \"\x1b]0;<mock-chroot>\x07<mock-chroot>\""));
 }
 
+static void test_deserialize_environment(void) {
+        _cleanup_strv_free_ char **env = strv_new("A=1", NULL);
+
+        assert_se(deserialize_environment(&env, "env=test") < 0);
+        assert_se(deserialize_environment(&env, "env=B=2") >= 0);
+
+        assert_se(strv_equal(env, STRV_MAKE("A=1", "B=2")));
+}
+
+static void test_serialize_environment(void) {
+        char fn[] = "/tmp/test-env-util.XXXXXXX";
+        int fd, r;
+        _cleanup_fclose_ FILE *f = NULL;
+
+        _cleanup_strv_free_ char **env = strv_new("A=1",
+                                                  "B=2",
+                                                  "C=ąęółń",
+                                                  "D=D=a\\x0Ab",
+                                                  NULL);
+        _cleanup_strv_free_ char **env2 = NULL;
+
+        fd = mkostemp_safe(fn);
+        assert_se(fd >= 0);
+
+        assert_se(f = fdopen(fd, "r+"));
+
+        assert_se(serialize_environment(f, env) == 0);
+        assert_se(fflush_and_check(f) == 0);
+
+        rewind(f);
+
+        for (;;) {
+                char line[LINE_MAX];
+                const char *l;
+
+                if (!fgets(line, sizeof line, f))
+                        break;
+
+                char_array_0(line);
+                l = strstrip(line);
+
+                r = deserialize_environment(&env2, l);
+                assert_se(r == 1);
+        }
+        assert_se(feof(f));
+
+        assert_se(strv_equal(env, env2));
+
+        unlink(fn);
+}
+
 int main(int argc, char *argv[]) {
         test_strv_env_delete();
+        test_strv_env_get();
         test_strv_env_unset();
         test_strv_env_set();
         test_strv_env_merge();
-        test_replace_env_arg();
+        test_env_strv_get_n();
+        test_replace_env(false);
+        test_replace_env(true);
+        test_replace_env2(false);
+        test_replace_env2(true);
+        test_replace_env_argv();
         test_env_clean();
         test_env_name_is_valid();
         test_env_value_is_valid();
         test_env_assignment_is_valid();
+        test_deserialize_environment();
+        test_serialize_environment();
 
         return 0;
 }
index 6cbb844..d060afa 100644 (file)
@@ -69,6 +69,14 @@ static void test_cunescape(void) {
 
         assert_se(cunescape("\\073", 0, &unescaped) >= 0);
         assert_se(streq_ptr(unescaped, ";"));
+        unescaped = mfree(unescaped);
+
+        assert_se(cunescape("A=A\\\\x0aB", 0, &unescaped) >= 0);
+        assert_se(streq_ptr(unescaped, "A=A\\x0aB"));
+        unescaped = mfree(unescaped);
+
+        assert_se(cunescape("A=A\\\\x0aB", UNESCAPE_RELAX, &unescaped) >= 0);
+        assert_se(streq_ptr(unescaped, "A=A\\x0aB"));
 }
 
 static void test_shell_escape_one(const char *s, const char *bad, const char *expected) {
@@ -86,25 +94,52 @@ static void test_shell_escape(void) {
         test_shell_escape_one("foo:bar,baz", ",:", "foo\\:bar\\,baz");
 }
 
-static void test_shell_maybe_quote_one(const char *s, const char *expected) {
-        _cleanup_free_ char *r;
+static void test_shell_maybe_quote_one(const char *s,
+                                       EscapeStyle style,
+                                       const char *expected) {
+        _cleanup_free_ char *ret = NULL;
 
-        assert_se(r = shell_maybe_quote(s));
-        assert_se(streq(r, expected));
+        assert_se(ret = shell_maybe_quote(s, style));
+        log_debug("[%s] → [%s] (%s)", s, ret, expected);
+        assert_se(streq(ret, expected));
 }
 
 static void test_shell_maybe_quote(void) {
 
-        test_shell_maybe_quote_one("", "");
-        test_shell_maybe_quote_one("\\", "\"\\\\\"");
-        test_shell_maybe_quote_one("\"", "\"\\\"\"");
-        test_shell_maybe_quote_one("foobar", "foobar");
-        test_shell_maybe_quote_one("foo bar", "\"foo bar\"");
-        test_shell_maybe_quote_one("foo \"bar\" waldo", "\"foo \\\"bar\\\" waldo\"");
-        test_shell_maybe_quote_one("foo$bar", "\"foo\\$bar\"");
+        test_shell_maybe_quote_one("", ESCAPE_BACKSLASH, "");
+        test_shell_maybe_quote_one("", ESCAPE_POSIX, "");
+        test_shell_maybe_quote_one("\\", ESCAPE_BACKSLASH, "\"\\\\\"");
+        test_shell_maybe_quote_one("\\", ESCAPE_POSIX, "$'\\\\'");
+        test_shell_maybe_quote_one("\"", ESCAPE_BACKSLASH, "\"\\\"\"");
+        test_shell_maybe_quote_one("\"", ESCAPE_POSIX, "$'\"'");
+        test_shell_maybe_quote_one("foobar", ESCAPE_BACKSLASH, "foobar");
+        test_shell_maybe_quote_one("foobar", ESCAPE_POSIX, "foobar");
+        test_shell_maybe_quote_one("foo bar", ESCAPE_BACKSLASH, "\"foo bar\"");
+        test_shell_maybe_quote_one("foo bar", ESCAPE_POSIX, "$'foo bar'");
+        test_shell_maybe_quote_one("foo\tbar", ESCAPE_BACKSLASH, "\"foo\tbar\"");
+        test_shell_maybe_quote_one("foo\tbar", ESCAPE_POSIX, "$'foo\\tbar'");
+        test_shell_maybe_quote_one("foo\nbar", ESCAPE_BACKSLASH, "\"foo\nbar\"");
+        test_shell_maybe_quote_one("foo\nbar", ESCAPE_POSIX, "$'foo\\nbar'");
+        test_shell_maybe_quote_one("foo \"bar\" waldo", ESCAPE_BACKSLASH, "\"foo \\\"bar\\\" waldo\"");
+        test_shell_maybe_quote_one("foo \"bar\" waldo", ESCAPE_POSIX, "$'foo \"bar\" waldo'");
+        test_shell_maybe_quote_one("foo$bar", ESCAPE_BACKSLASH, "\"foo\\$bar\"");
+        test_shell_maybe_quote_one("foo$bar", ESCAPE_POSIX, "$'foo$bar'");
+
+        /* Note that current users disallow control characters, so this "test"
+         * is here merely to establish current behaviour. If control characters
+         * were allowed, they should be quoted, i.e. \001 should become \\001. */
+        test_shell_maybe_quote_one("a\nb\001", ESCAPE_BACKSLASH, "\"a\nb\001\"");
+        test_shell_maybe_quote_one("a\nb\001", ESCAPE_POSIX, "$'a\\nb\001'");
+
+        test_shell_maybe_quote_one("foo!bar", ESCAPE_BACKSLASH, "\"foo!bar\"");
+        test_shell_maybe_quote_one("foo!bar", ESCAPE_POSIX, "$'foo!bar'");
 }
 
 int main(int argc, char *argv[]) {
+        log_set_max_level(LOG_DEBUG);
+        log_parse_environment();
+        log_open();
+
         test_cescape();
         test_cunescape();
         test_shell_escape();
diff --git a/src/test/test-exec-util.c b/src/test/test-exec-util.c
new file mode 100644 (file)
index 0000000..30c9201
--- /dev/null
@@ -0,0 +1,348 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2010 Lennart Poettering
+  Copyright 2013 Thomas H.P. Andersen
+
+  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 <errno.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include "alloc-util.h"
+#include "copy.h"
+#include "def.h"
+#include "env-util.h"
+#include "exec-util.h"
+#include "fd-util.h"
+#include "fileio.h"
+#include "fs-util.h"
+#include "log.h"
+#include "macro.h"
+#include "rm-rf.h"
+#include "string-util.h"
+#include "strv.h"
+
+static int here = 0, here2 = 0, here3 = 0;
+void *ignore_stdout_args[] = {&here, &here2, &here3};
+
+/* noop handlers, just check that arguments are passed correctly */
+static int ignore_stdout_func(int fd, void *arg) {
+        assert(fd >= 0);
+        assert(arg == &here);
+        safe_close(fd);
+
+        return 0;
+}
+static int ignore_stdout_func2(int fd, void *arg) {
+        assert(fd >= 0);
+        assert(arg == &here2);
+        safe_close(fd);
+
+        return 0;
+}
+static int ignore_stdout_func3(int fd, void *arg) {
+        assert(fd >= 0);
+        assert(arg == &here3);
+        safe_close(fd);
+
+        return 0;
+}
+
+static const gather_stdout_callback_t ignore_stdout[] = {
+        ignore_stdout_func,
+        ignore_stdout_func2,
+        ignore_stdout_func3,
+};
+
+static void test_execute_directory(bool gather_stdout) {
+        char template_lo[] = "/tmp/test-exec-util.XXXXXXX";
+        char template_hi[] = "/tmp/test-exec-util.XXXXXXX";
+        const char * dirs[] = {template_hi, template_lo, NULL};
+        const char *name, *name2, *name3, *overridden, *override, *masked, *mask;
+
+        log_info("/* %s (%s) */", __func__, gather_stdout ? "gathering stdout" : "asynchronous");
+
+        assert_se(mkdtemp(template_lo));
+        assert_se(mkdtemp(template_hi));
+
+        name = strjoina(template_lo, "/script");
+        name2 = strjoina(template_hi, "/script2");
+        name3 = strjoina(template_lo, "/useless");
+        overridden = strjoina(template_lo, "/overridden");
+        override = strjoina(template_hi, "/overridden");
+        masked = strjoina(template_lo, "/masked");
+        mask = strjoina(template_hi, "/masked");
+
+        assert_se(write_string_file(name,
+                                    "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works",
+                                    WRITE_STRING_FILE_CREATE) == 0);
+        assert_se(write_string_file(name2,
+                                    "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works2",
+                                    WRITE_STRING_FILE_CREATE) == 0);
+        assert_se(write_string_file(overridden,
+                                    "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed",
+                                    WRITE_STRING_FILE_CREATE) == 0);
+        assert_se(write_string_file(override,
+                                    "#!/bin/sh\necho 'Executing '$0",
+                                    WRITE_STRING_FILE_CREATE) == 0);
+        assert_se(write_string_file(masked,
+                                    "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed",
+                                    WRITE_STRING_FILE_CREATE) == 0);
+        assert_se(symlink("/dev/null", mask) == 0);
+        assert_se(touch(name3) >= 0);
+
+        assert_se(chmod(name, 0755) == 0);
+        assert_se(chmod(name2, 0755) == 0);
+        assert_se(chmod(overridden, 0755) == 0);
+        assert_se(chmod(override, 0755) == 0);
+        assert_se(chmod(masked, 0755) == 0);
+
+        if (gather_stdout)
+                execute_directories(dirs, DEFAULT_TIMEOUT_USEC, ignore_stdout, ignore_stdout_args, NULL);
+        else
+                execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL, NULL, NULL);
+
+        assert_se(chdir(template_lo) == 0);
+        assert_se(access("it_works", F_OK) >= 0);
+        assert_se(access("failed", F_OK) < 0);
+
+        assert_se(chdir(template_hi) == 0);
+        assert_se(access("it_works2", F_OK) >= 0);
+        assert_se(access("failed", F_OK) < 0);
+
+        (void) rm_rf(template_lo, REMOVE_ROOT|REMOVE_PHYSICAL);
+        (void) rm_rf(template_hi, REMOVE_ROOT|REMOVE_PHYSICAL);
+}
+
+static void test_execution_order(void) {
+        char template_lo[] = "/tmp/test-exec-util-lo.XXXXXXX";
+        char template_hi[] = "/tmp/test-exec-util-hi.XXXXXXX";
+        const char *dirs[] = {template_hi, template_lo, NULL};
+        const char *name, *name2, *name3, *overridden, *override, *masked, *mask;
+        const char *output, *t;
+        _cleanup_free_ char *contents = NULL;
+
+        assert_se(mkdtemp(template_lo));
+        assert_se(mkdtemp(template_hi));
+
+        output = strjoina(template_hi, "/output");
+
+        log_info("/* %s >>%s */", __func__, output);
+
+        /* write files in "random" order */
+        name2 = strjoina(template_lo, "/90-bar");
+        name = strjoina(template_hi, "/80-foo");
+        name3 = strjoina(template_lo, "/last");
+        overridden = strjoina(template_lo, "/30-override");
+        override = strjoina(template_hi, "/30-override");
+        masked = strjoina(template_lo, "/10-masked");
+        mask = strjoina(template_hi, "/10-masked");
+
+        t = strjoina("#!/bin/sh\necho $(basename $0) >>", output);
+        assert_se(write_string_file(name, t, WRITE_STRING_FILE_CREATE) == 0);
+
+        t = strjoina("#!/bin/sh\necho $(basename $0) >>", output);
+        assert_se(write_string_file(name2, t, WRITE_STRING_FILE_CREATE) == 0);
+
+        t = strjoina("#!/bin/sh\necho $(basename $0) >>", output);
+        assert_se(write_string_file(name3, t, WRITE_STRING_FILE_CREATE) == 0);
+
+        t = strjoina("#!/bin/sh\necho OVERRIDDEN >>", output);
+        assert_se(write_string_file(overridden, t, WRITE_STRING_FILE_CREATE) == 0);
+
+        t = strjoina("#!/bin/sh\necho $(basename $0) >>", output);
+        assert_se(write_string_file(override, t, WRITE_STRING_FILE_CREATE) == 0);
+
+        t = strjoina("#!/bin/sh\necho MASKED >>", output);
+        assert_se(write_string_file(masked, t, WRITE_STRING_FILE_CREATE) == 0);
+
+        assert_se(symlink("/dev/null", mask) == 0);
+
+        assert_se(chmod(name, 0755) == 0);
+        assert_se(chmod(name2, 0755) == 0);
+        assert_se(chmod(name3, 0755) == 0);
+        assert_se(chmod(overridden, 0755) == 0);
+        assert_se(chmod(override, 0755) == 0);
+        assert_se(chmod(masked, 0755) == 0);
+
+        execute_directories(dirs, DEFAULT_TIMEOUT_USEC, ignore_stdout, ignore_stdout_args, NULL);
+
+        assert_se(read_full_file(output, &contents, NULL) >= 0);
+        assert_se(streq(contents, "30-override\n80-foo\n90-bar\nlast\n"));
+
+        (void) rm_rf(template_lo, REMOVE_ROOT|REMOVE_PHYSICAL);
+        (void) rm_rf(template_hi, REMOVE_ROOT|REMOVE_PHYSICAL);
+}
+
+static int gather_stdout_one(int fd, void *arg) {
+        char ***s = arg, *t;
+        char buf[128] = {};
+
+        assert_se(s);
+        assert_se(read(fd, buf, sizeof buf) >= 0);
+        safe_close(fd);
+
+        assert_se(t = strndup(buf, sizeof buf));
+        assert_se(strv_push(s, t) >= 0);
+
+        return 0;
+}
+static int gather_stdout_two(int fd, void *arg) {
+        char ***s = arg, **t;
+
+        STRV_FOREACH(t, *s)
+                assert_se(write(fd, *t, strlen(*t)) == (ssize_t) strlen(*t));
+        safe_close(fd);
+
+        return 0;
+}
+static int gather_stdout_three(int fd, void *arg) {
+        char **s = arg;
+        char buf[128] = {};
+
+        assert_se(read(fd, buf, sizeof buf - 1) > 0);
+        safe_close(fd);
+        assert_se(*s = strndup(buf, sizeof buf));
+
+        return 0;
+}
+
+const gather_stdout_callback_t gather_stdout[] = {
+        gather_stdout_one,
+        gather_stdout_two,
+        gather_stdout_three,
+};
+
+
+static void test_stdout_gathering(void) {
+        char template[] = "/tmp/test-exec-util.XXXXXXX";
+        const char *dirs[] = {template, NULL};
+        const char *name, *name2, *name3;
+        int r;
+
+        char **tmp = NULL; /* this is only used in the forked process, no cleanup here */
+        _cleanup_free_ char *output = NULL;
+
+        void* args[] = {&tmp, &tmp, &output};
+
+        assert_se(mkdtemp(template));
+
+        log_info("/* %s */", __func__);
+
+        /* write files */
+        name = strjoina(template, "/10-foo");
+        name2 = strjoina(template, "/20-bar");
+        name3 = strjoina(template, "/30-last");
+
+        assert_se(write_string_file(name,
+                                    "#!/bin/sh\necho a\necho b\necho c\n",
+                                    WRITE_STRING_FILE_CREATE) == 0);
+        assert_se(write_string_file(name2,
+                                    "#!/bin/sh\necho d\n",
+                                    WRITE_STRING_FILE_CREATE) == 0);
+        assert_se(write_string_file(name3,
+                                    "#!/bin/sh\nsleep 1",
+                                    WRITE_STRING_FILE_CREATE) == 0);
+
+        assert_se(chmod(name, 0755) == 0);
+        assert_se(chmod(name2, 0755) == 0);
+        assert_se(chmod(name3, 0755) == 0);
+
+        r = execute_directories(dirs, DEFAULT_TIMEOUT_USEC, gather_stdout, args, NULL);
+        assert_se(r >= 0);
+
+        log_info("got: %s", output);
+
+        assert_se(streq(output, "a\nb\nc\nd\n"));
+}
+
+static void test_environment_gathering(void) {
+        char template[] = "/tmp/test-exec-util.XXXXXXX", **p;
+        const char *dirs[] = {template, NULL};
+        const char *name, *name2, *name3;
+        int r;
+
+        char **tmp = NULL; /* this is only used in the forked process, no cleanup here */
+        _cleanup_strv_free_ char **env = NULL;
+
+        void* const args[] = { &tmp, &tmp, &env };
+
+        assert_se(mkdtemp(template));
+
+        log_info("/* %s */", __func__);
+
+        /* write files */
+        name = strjoina(template, "/10-foo");
+        name2 = strjoina(template, "/20-bar");
+        name3 = strjoina(template, "/30-last");
+
+        assert_se(write_string_file(name,
+                                    "#!/bin/sh\n"
+                                    "echo A=23\n",
+                                    WRITE_STRING_FILE_CREATE) == 0);
+        assert_se(write_string_file(name2,
+                                    "#!/bin/sh\n"
+                                    "echo A=22:$A\n\n\n",            /* substitution from previous generator */
+                                    WRITE_STRING_FILE_CREATE) == 0);
+        assert_se(write_string_file(name3,
+                                    "#!/bin/sh\n"
+                                    "echo A=$A:24\n"
+                                    "echo B=12\n"
+                                    "echo C=000\n"
+                                    "echo C=001\n"                    /* variable overwriting */
+                                     /* various invalid entries */
+                                    "echo unset A\n"
+                                    "echo unset A=\n"
+                                    "echo unset A=B\n"
+                                    "echo unset \n"
+                                    "echo A B=C\n"
+                                    "echo A\n"
+                                    /* test variable assignment without newline */
+                                    "echo PATH=$PATH:/no/such/file",   /* no newline */
+                                    WRITE_STRING_FILE_CREATE) == 0);
+
+        assert_se(chmod(name, 0755) == 0);
+        assert_se(chmod(name2, 0755) == 0);
+        assert_se(chmod(name3, 0755) == 0);
+
+        r = execute_directories(dirs, DEFAULT_TIMEOUT_USEC, gather_environment, args, NULL);
+        assert_se(r >= 0);
+
+        STRV_FOREACH(p, env)
+                log_info("got env: \"%s\"", *p);
+
+        assert_se(streq(strv_env_get(env, "A"), "22:23:24"));
+        assert_se(streq(strv_env_get(env, "B"), "12"));
+        assert_se(streq(strv_env_get(env, "C"), "001"));
+        assert_se(endswith(strv_env_get(env, "PATH"), ":/no/such/file"));
+}
+
+int main(int argc, char *argv[]) {
+        log_set_max_level(LOG_DEBUG);
+        log_parse_environment();
+        log_open();
+
+        test_execute_directory(true);
+        test_execute_directory(false);
+        test_execution_order();
+        test_stdout_gathering();
+        test_environment_gathering();
+
+        return 0;
+}
index 77ef4e8..29c8fd6 100644 (file)
 #include "mkdir.h"
 #include "path-util.h"
 #include "rm-rf.h"
+#ifdef HAVE_SECCOMP
+#include "seccomp-util.h"
+#endif
+#include "stat-util.h"
 #include "test-helper.h"
+#include "tests.h"
 #include "unit.h"
 #include "util.h"
+#include "virt.h"
 
 typedef void (*test_function_t)(Manager *m);
 
@@ -66,6 +72,24 @@ static void check(Manager *m, Unit *unit, int status_expected, int code_expected
         assert_se(service->main_exec_status.code == code_expected);
 }
 
+static bool is_inaccessible_available(void) {
+        char *p;
+
+        FOREACH_STRING(p,
+                "/run/systemd/inaccessible/reg",
+                "/run/systemd/inaccessible/dir",
+                "/run/systemd/inaccessible/chr",
+                "/run/systemd/inaccessible/blk",
+                "/run/systemd/inaccessible/fifo",
+                "/run/systemd/inaccessible/sock"
+        ) {
+                if (access(p, F_OK) < 0)
+                        return false;
+        }
+
+        return true;
+}
+
 static void test(Manager *m, const char *unit_name, int status_expected, int code_expected) {
         Unit *unit;
 
@@ -91,6 +115,16 @@ static void test_exec_personality(Manager *m) {
 #elif defined(__s390__)
         test(m, "exec-personality-s390.service", 0, CLD_EXITED);
 
+#elif defined(__powerpc64__)
+#  if __BYTE_ORDER == __BIG_ENDIAN
+        test(m, "exec-personality-ppc64.service", 0, CLD_EXITED);
+#  else
+        test(m, "exec-personality-ppc64le.service", 0, CLD_EXITED);
+#  endif
+
+#elif defined(__aarch64__)
+        test(m, "exec-personality-aarch64.service", 0, CLD_EXITED);
+
 #elif defined(__i386__)
         test(m, "exec-personality-x86.service", 0, CLD_EXITED);
 #endif
@@ -111,33 +145,144 @@ static void test_exec_privatetmp(Manager *m) {
 }
 
 static void test_exec_privatedevices(Manager *m) {
+        if (detect_container() > 0) {
+                log_notice("testing in container, skipping %s", __func__);
+                return;
+        }
+        if (!is_inaccessible_available()) {
+                log_notice("testing without inaccessible, skipping %s", __func__);
+                return;
+        }
+
         test(m, "exec-privatedevices-yes.service", 0, CLD_EXITED);
         test(m, "exec-privatedevices-no.service", 0, CLD_EXITED);
 }
 
+static void test_exec_privatedevices_capabilities(Manager *m) {
+        int r;
+
+        if (detect_container() > 0) {
+                log_notice("testing in container, skipping %s", __func__);
+                return;
+        }
+        if (!is_inaccessible_available()) {
+                log_notice("testing without inaccessible, skipping %s", __func__);
+                return;
+        }
+
+        /* We use capsh to test if the capabilities are
+         * properly set, so be sure that it exists */
+        r = find_binary("capsh", NULL);
+        if (r < 0) {
+                log_error_errno(r, "Skipping %s, could not find capsh binary: %m", __func__);
+                return;
+        }
+
+        test(m, "exec-privatedevices-yes-capability-mknod.service", 0, CLD_EXITED);
+        test(m, "exec-privatedevices-no-capability-mknod.service", 0, CLD_EXITED);
+        test(m, "exec-privatedevices-yes-capability-sys-rawio.service", 0, CLD_EXITED);
+        test(m, "exec-privatedevices-no-capability-sys-rawio.service", 0, CLD_EXITED);
+}
+
+static void test_exec_protectkernelmodules(Manager *m) {
+        int r;
+
+        if (detect_container() > 0) {
+                log_notice("testing in container, skipping %s", __func__);
+                return;
+        }
+        if (!is_inaccessible_available()) {
+                log_notice("testing without inaccessible, skipping %s", __func__);
+                return;
+        }
+
+        r = find_binary("capsh", NULL);
+        if (r < 0) {
+                log_error_errno(r, "Skipping %s, could not find capsh binary: %m", __func__);
+                return;
+        }
+
+
+        test(m, "exec-protectkernelmodules-no-capabilities.service", 0, CLD_EXITED);
+        test(m, "exec-protectkernelmodules-yes-capabilities.service", 0, CLD_EXITED);
+        test(m, "exec-protectkernelmodules-yes-mount-propagation.service", 0, CLD_EXITED);
+}
+
+static void test_exec_readonlypaths(Manager *m) {
+
+        if (path_is_read_only_fs("/var") > 0)
+                return;
+
+        test(m, "exec-readonlypaths.service", 0, CLD_EXITED);
+        test(m, "exec-readonlypaths-mount-propagation.service", 0, CLD_EXITED);
+}
+
+static void test_exec_readwritepaths(Manager *m) {
+
+        if (path_is_read_only_fs("/") > 0)
+                return;
+
+        test(m, "exec-readwritepaths-mount-propagation.service", 0, CLD_EXITED);
+}
+
+static void test_exec_inaccessiblepaths(Manager *m) {
+
+        if (path_is_read_only_fs("/") > 0)
+                return;
+
+        test(m, "exec-inaccessiblepaths-mount-propagation.service", 0, CLD_EXITED);
+}
+
+static void test_exec_inaccessiblepaths_proc(Manager *m) {
+        if (!is_inaccessible_available()) {
+                log_notice("testing without inaccessible, skipping %s", __func__);
+                return;
+        }
+
+        test(m, "exec-inaccessiblepaths-proc.service", 0, CLD_EXITED);
+}
+
 static void test_exec_systemcallfilter(Manager *m) {
 #ifdef HAVE_SECCOMP
+        if (!is_seccomp_available())
+                return;
         test(m, "exec-systemcallfilter-not-failing.service", 0, CLD_EXITED);
         test(m, "exec-systemcallfilter-not-failing2.service", 0, CLD_EXITED);
         test(m, "exec-systemcallfilter-failing.service", SIGSYS, CLD_KILLED);
         test(m, "exec-systemcallfilter-failing2.service", SIGSYS, CLD_KILLED);
+
 #endif
 }
 
 static void test_exec_systemcallerrornumber(Manager *m) {
 #ifdef HAVE_SECCOMP
-        test(m, "exec-systemcallerrornumber.service", 1, CLD_EXITED);
+        if (is_seccomp_available())
+                test(m, "exec-systemcallerrornumber.service", 1, CLD_EXITED);
+#endif
+}
+
+static void test_exec_restrict_namespaces(Manager *m) {
+#ifdef HAVE_SECCOMP
+        if (!is_seccomp_available())
+                return;
+
+        test(m, "exec-restrict-namespaces-no.service", 0, CLD_EXITED);
+        test(m, "exec-restrict-namespaces-yes.service", 1, CLD_EXITED);
+        test(m, "exec-restrict-namespaces-mnt.service", 0, CLD_EXITED);
+        test(m, "exec-restrict-namespaces-mnt-blacklist.service", 1, CLD_EXITED);
 #endif
 }
 
 static void test_exec_systemcall_system_mode_with_user(Manager *m) {
 #ifdef HAVE_SECCOMP
+        if (!is_seccomp_available())
+                return;
         if (getpwnam("nobody"))
                 test(m, "exec-systemcallfilter-system-user.service", 0, CLD_EXITED);
         else if (getpwnam("nfsnobody"))
                 test(m, "exec-systemcallfilter-system-user-nfsnobody.service", 0, CLD_EXITED);
         else
-                log_error_errno(errno, "Skipping test_exec_systemcall_system_mode_with_user, could not find nobody/nfsnobody user: %m");
+                log_error_errno(errno, "Skipping %s, could not find nobody/nfsnobody user: %m", __func__);
 #endif
 }
 
@@ -147,7 +292,7 @@ static void test_exec_user(Manager *m) {
         else if (getpwnam("nfsnobody"))
                 test(m, "exec-user-nfsnobody.service", 0, CLD_EXITED);
         else
-                log_error_errno(errno, "Skipping test_exec_user, could not find nobody/nfsnobody user: %m");
+                log_error_errno(errno, "Skipping %s, could not find nobody/nfsnobody user: %m", __func__);
 }
 
 static void test_exec_group(Manager *m) {
@@ -156,7 +301,22 @@ static void test_exec_group(Manager *m) {
         else if (getgrnam("nfsnobody"))
                 test(m, "exec-group-nfsnobody.service", 0, CLD_EXITED);
         else
-                log_error_errno(errno, "Skipping test_exec_group, could not find nobody/nfsnobody group: %m");
+                log_error_errno(errno, "Skipping %s, could not find nobody/nfsnobody group: %m", __func__);
+}
+
+static void test_exec_supplementary_groups(Manager *m) {
+        test(m, "exec-supplementarygroups.service", 0, CLD_EXITED);
+        test(m, "exec-supplementarygroups-single-group.service", 0, CLD_EXITED);
+        test(m, "exec-supplementarygroups-single-group-user.service", 0, CLD_EXITED);
+        test(m, "exec-supplementarygroups-multiple-groups-default-group-user.service", 0, CLD_EXITED);
+        test(m, "exec-supplementarygroups-multiple-groups-withgid.service", 0, CLD_EXITED);
+        test(m, "exec-supplementarygroups-multiple-groups-withuid.service", 0, CLD_EXITED);
+}
+
+static void test_exec_dynamic_user(Manager *m) {
+        test(m, "exec-dynamicuser-fixeduser.service", 0, CLD_EXITED);
+        test(m, "exec-dynamicuser-fixeduser-one-supplementarygroup.service", 0, CLD_EXITED);
+        test(m, "exec-dynamicuser-supplementarygroups.service", 0, CLD_EXITED);
 }
 
 static void test_exec_environment(Manager *m) {
@@ -222,17 +382,15 @@ static void test_exec_runtimedirectory(Manager *m) {
         else if (getgrnam("nfsnobody"))
                 test(m, "exec-runtimedirectory-owner-nfsnobody.service", 0, CLD_EXITED);
         else
-                log_error_errno(errno, "Skipping test_exec_runtimedirectory-owner, could not find nobody/nfsnobody group: %m");
+                log_error_errno(errno, "Skipping %s, could not find nobody/nfsnobody group: %m", __func__);
 }
 
 static void test_exec_capabilityboundingset(Manager *m) {
         int r;
 
-        /* We use capsh to test if the capabilities are
-         * properly set, so be sure that it exists */
         r = find_binary("capsh", NULL);
         if (r < 0) {
-                log_error_errno(r, "Skipping test_exec_capabilityboundingset, could not find capsh binary: %m");
+                log_error_errno(r, "Skipping %s, could not find capsh binary: %m", __func__);
                 return;
         }
 
@@ -258,9 +416,9 @@ static void test_exec_capabilityambientset(Manager *m) {
                         test(m, "exec-capabilityambientset-nfsnobody.service", 0, CLD_EXITED);
                         test(m, "exec-capabilityambientset-merge-nfsnobody.service", 0, CLD_EXITED);
                 } else
-                        log_error_errno(errno, "Skipping test_exec_capabilityambientset, could not find nobody/nfsnobody user: %m");
+                        log_error_errno(errno, "Skipping %s, could not find nobody/nfsnobody user: %m", __func__);
         } else
-                log_error_errno(errno, "Skipping test_exec_capabilityambientset, the kernel does not support ambient capabilities: %m");
+                log_error_errno(errno, "Skipping %s, the kernel does not support ambient capabilities: %m", __func__);
 }
 
 static void test_exec_privatenetwork(Manager *m) {
@@ -268,7 +426,7 @@ static void test_exec_privatenetwork(Manager *m) {
 
         r = find_binary("ip", NULL);
         if (r < 0) {
-                log_error_errno(r, "Skipping test_exec_privatenetwork, could not find ip binary: %m");
+                log_error_errno(r, "Skipping %s, could not find ip binary: %m", __func__);
                 return;
         }
 
@@ -291,8 +449,12 @@ static void test_exec_spec_interpolation(Manager *m) {
         test(m, "exec-spec-interpolation.service", 0, CLD_EXITED);
 }
 
-static int run_tests(UnitFileScope scope, test_function_t *tests) {
-        test_function_t *test = NULL;
+static void test_exec_read_only_path_suceed(Manager *m) {
+        test(m, "exec-read-only-path-succeed.service", 0, CLD_EXITED);
+}
+
+static int run_tests(UnitFileScope scope, const test_function_t *tests) {
+        const test_function_t *test = NULL;
         Manager *m = NULL;
         int r;
 
@@ -300,7 +462,7 @@ static int run_tests(UnitFileScope scope, test_function_t *tests) {
 
         r = manager_new(scope, true, &m);
         if (MANAGER_SKIP_TEST(r)) {
-                printf("Skipping test: manager_new: %s\n", strerror(-r));
+                log_notice_errno(r, "Skipping test: manager_new: %m");
                 return EXIT_TEST_SKIP;
         }
         assert_se(r >= 0);
@@ -315,17 +477,26 @@ static int run_tests(UnitFileScope scope, test_function_t *tests) {
 }
 
 int main(int argc, char *argv[]) {
-        test_function_t user_tests[] = {
+        static const test_function_t user_tests[] = {
                 test_exec_workingdirectory,
                 test_exec_personality,
                 test_exec_ignoresigpipe,
                 test_exec_privatetmp,
                 test_exec_privatedevices,
+                test_exec_privatedevices_capabilities,
+                test_exec_protectkernelmodules,
+                test_exec_readonlypaths,
+                test_exec_readwritepaths,
+                test_exec_inaccessiblepaths,
+                test_exec_inaccessiblepaths_proc,
                 test_exec_privatenetwork,
                 test_exec_systemcallfilter,
                 test_exec_systemcallerrornumber,
+                test_exec_restrict_namespaces,
                 test_exec_user,
                 test_exec_group,
+                test_exec_supplementary_groups,
+                test_exec_dynamic_user,
                 test_exec_environment,
                 test_exec_environmentfile,
                 test_exec_passenvironment,
@@ -336,14 +507,16 @@ int main(int argc, char *argv[]) {
                 test_exec_oomscoreadjust,
                 test_exec_ioschedulingclass,
                 test_exec_spec_interpolation,
+                test_exec_read_only_path_suceed,
                 NULL,
         };
-        test_function_t system_tests[] = {
+        static const test_function_t system_tests[] = {
                 test_exec_systemcall_system_mode_with_user,
                 NULL,
         };
         int r;
 
+        log_set_max_level(LOG_DEBUG);
         log_parse_environment();
         log_open();
 
@@ -354,7 +527,7 @@ int main(int argc, char *argv[]) {
         }
 
         assert_se(setenv("XDG_RUNTIME_DIR", "/tmp/", 1) == 0);
-        assert_se(set_unit_path(TEST_DIR "/test-execute/") >= 0);
+        assert_se(set_unit_path(get_testdata_dir("/test-execute")) >= 0);
 
         /* Unset VAR1, VAR2 and VAR3 which are used in the PassEnvironment test
          * cases, otherwise (and if they are present in the environment),
index 421d3bd..4425b5f 100644 (file)
@@ -31,9 +31,9 @@ static void test_close_many(void) {
         char name1[] = "/tmp/test-close-many.XXXXXX";
         char name2[] = "/tmp/test-close-many.XXXXXX";
 
-        fds[0] = mkostemp_safe(name0, O_RDWR|O_CLOEXEC);
-        fds[1] = mkostemp_safe(name1, O_RDWR|O_CLOEXEC);
-        fds[2] = mkostemp_safe(name2, O_RDWR|O_CLOEXEC);
+        fds[0] = mkostemp_safe(name0);
+        fds[1] = mkostemp_safe(name1);
+        fds[2] = mkostemp_safe(name2);
 
         close_many(fds, 2);
 
@@ -52,7 +52,7 @@ static void test_close_nointr(void) {
         char name[] = "/tmp/test-test-close_nointr.XXXXXX";
         int fd;
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
         assert_se(close_nointr(fd) >= 0);
         assert_se(close_nointr(fd) < 0);
@@ -94,10 +94,20 @@ static void test_same_fd(void) {
         assert_se(same_fd(b, a) == 0);
 }
 
+static void test_open_serialization_fd(void) {
+        _cleanup_close_ int fd = -1;
+
+        fd = open_serialization_fd("test");
+        assert_se(fd >= 0);
+
+        write(fd, "test\n", 5);
+}
+
 int main(int argc, char *argv[]) {
         test_close_many();
         test_close_nointr();
         test_same_fd();
+        test_open_serialization_fd();
 
         return 0;
 }
index 282aab1..adbf99a 100644 (file)
@@ -31,7 +31,7 @@ static void test_fdset_new_fill(void) {
         _cleanup_fdset_free_ FDSet *fdset = NULL;
         char name[] = "/tmp/test-fdset_new_fill.XXXXXX";
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
         assert_se(fdset_new_fill(&fdset) >= 0);
         assert_se(fdset_contains(fdset, fd));
@@ -45,7 +45,7 @@ static void test_fdset_put_dup(void) {
         _cleanup_fdset_free_ FDSet *fdset = NULL;
         char name[] = "/tmp/test-fdset_put_dup.XXXXXX";
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
 
         fdset = fdset_new();
@@ -64,7 +64,7 @@ static void test_fdset_cloexec(void) {
         int flags = -1;
         char name[] = "/tmp/test-fdset_cloexec.XXXXXX";
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
 
         fdset = fdset_new();
@@ -91,7 +91,7 @@ static void test_fdset_close_others(void) {
         int flags = -1;
         char name[] = "/tmp/test-fdset_close_others.XXXXXX";
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
 
         fdset = fdset_new();
@@ -113,7 +113,7 @@ static void test_fdset_remove(void) {
         FDSet *fdset = NULL;
         char name[] = "/tmp/test-fdset_remove.XXXXXX";
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
 
         fdset = fdset_new();
@@ -136,7 +136,7 @@ static void test_fdset_iterate(void) {
         int c = 0;
         int a;
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
 
         fdset = fdset_new();
@@ -161,7 +161,7 @@ static void test_fdset_isempty(void) {
         _cleanup_fdset_free_ FDSet *fdset = NULL;
         char name[] = "/tmp/test-fdset_isempty.XXXXXX";
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
 
         fdset = fdset_new();
@@ -179,7 +179,7 @@ static void test_fdset_steal_first(void) {
         _cleanup_fdset_free_ FDSet *fdset = NULL;
         char name[] = "/tmp/test-fdset_steal_first.XXXXXX";
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
 
         fdset = fdset_new();
index 7960976..b1d688c 100644 (file)
@@ -45,11 +45,11 @@ static void test_parse_env_file(void) {
         char **i;
         unsigned k;
 
-        fd = mkostemp_safe(p, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(p);
         assert_se(fd >= 0);
         close(fd);
 
-        fd = mkostemp_safe(t, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(t);
         assert_se(fd >= 0);
 
         f = fdopen(fd, "w");
@@ -71,6 +71,8 @@ static void test_parse_env_file(void) {
               "seven=\"sevenval\" #nocomment\n"
               "eight=eightval #nocomment\n"
               "export nine=nineval\n"
+              "ten=ignored\n"
+              "ten=ignored\n"
               "ten=", f);
 
         fflush(f);
@@ -158,11 +160,11 @@ static void test_parse_multiline_env_file(void) {
         _cleanup_strv_free_ char **a = NULL, **b = NULL;
         char **i;
 
-        fd = mkostemp_safe(p, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(p);
         assert_se(fd >= 0);
         close(fd);
 
-        fd = mkostemp_safe(t, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(t);
         assert_se(fd >= 0);
 
         f = fdopen(fd, "w");
@@ -204,6 +206,113 @@ static void test_parse_multiline_env_file(void) {
         unlink(p);
 }
 
+static void test_merge_env_file(void) {
+        char t[] = "/tmp/test-fileio-XXXXXX";
+        int fd, r;
+        FILE *f;
+        _cleanup_strv_free_ char **a = NULL;
+        char **i;
+
+        fd = mkostemp_safe(t);
+        assert_se(fd >= 0);
+
+        log_info("/* %s (%s) */", __func__, t);
+
+        f = fdopen(fd, "w");
+        assert_se(f);
+
+        r = write_string_stream(f,
+                                "one=1   \n"
+                                "twelve=${one}2\n"
+                                "twentyone=2${one}\n"
+                                "one=2\n"
+                                "twentytwo=2${one}\n"
+                                "xxx_minus_three=$xxx - 3\n"
+                                "xxx=0x$one$one$one\n"
+                                "yyy=${one:-fallback}\n"
+                                "zzz=${one:+replacement}\n"
+                                "zzzz=${foobar:-${nothing}}\n"
+                                "zzzzz=${nothing:+${nothing}}\n"
+                                , false);
+        assert(r >= 0);
+
+        r = merge_env_file(&a, NULL, t);
+        assert_se(r >= 0);
+        strv_sort(a);
+
+        STRV_FOREACH(i, a)
+                log_info("Got: <%s>", *i);
+
+        assert_se(streq(a[0], "one=2"));
+        assert_se(streq(a[1], "twelve=12"));
+        assert_se(streq(a[2], "twentyone=21"));
+        assert_se(streq(a[3], "twentytwo=22"));
+        assert_se(streq(a[4], "xxx=0x222"));
+        assert_se(streq(a[5], "xxx_minus_three= - 3"));
+        assert_se(streq(a[6], "yyy=2"));
+        assert_se(streq(a[7], "zzz=replacement"));
+        assert_se(streq(a[8], "zzzz="));
+        assert_se(streq(a[9], "zzzzz="));
+        assert_se(a[10] == NULL);
+
+        r = merge_env_file(&a, NULL, t);
+        assert_se(r >= 0);
+        strv_sort(a);
+
+        STRV_FOREACH(i, a)
+                log_info("Got2: <%s>", *i);
+
+        assert_se(streq(a[0], "one=2"));
+        assert_se(streq(a[1], "twelve=12"));
+        assert_se(streq(a[2], "twentyone=21"));
+        assert_se(streq(a[3], "twentytwo=22"));
+        assert_se(streq(a[4], "xxx=0x222"));
+        assert_se(streq(a[5], "xxx_minus_three=0x222 - 3"));
+        assert_se(streq(a[6], "yyy=2"));
+        assert_se(streq(a[7], "zzz=replacement"));
+        assert_se(streq(a[8], "zzzz="));
+        assert_se(streq(a[9], "zzzzz="));
+        assert_se(a[10] == NULL);
+}
+
+static void test_merge_env_file_invalid(void) {
+        char t[] = "/tmp/test-fileio-XXXXXX";
+        int fd, r;
+        FILE *f;
+        _cleanup_strv_free_ char **a = NULL;
+        char **i;
+
+        fd = mkostemp_safe(t);
+        assert_se(fd >= 0);
+
+        log_info("/* %s (%s) */", __func__, t);
+
+        f = fdopen(fd, "w");
+        assert_se(f);
+
+        r = write_string_stream(f,
+                                "unset one   \n"
+                                "unset one=   \n"
+                                "unset one=1   \n"
+                                "one   \n"
+                                "one =  \n"
+                                "one two =\n"
+                                "\x20two=\n"
+                                "#comment=comment\n"
+                                ";comment2=comment2\n"
+                                "#\n"
+                                "\n\n"                  /* empty line */
+                                , false);
+        assert(r >= 0);
+
+        r = merge_env_file(&a, NULL, t);
+        assert_se(r >= 0);
+
+        STRV_FOREACH(i, a)
+                log_info("Got: <%s>", *i);
+
+        assert_se(strv_isempty(a));
+}
 
 static void test_executable_is_script(void) {
         char t[] = "/tmp/test-executable-XXXXXX";
@@ -211,7 +320,7 @@ static void test_executable_is_script(void) {
         FILE *f;
         char *command;
 
-        fd = mkostemp_safe(t, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(t);
         assert_se(fd >= 0);
 
         f = fdopen(fd, "w");
@@ -300,7 +409,7 @@ static void test_write_string_stream(void) {
         int fd;
         char buf[64];
 
-        fd = mkostemp_safe(fn, O_RDWR);
+        fd = mkostemp_safe(fn);
         assert_se(fd >= 0);
 
         f = fdopen(fd, "r");
@@ -334,7 +443,7 @@ static void test_write_string_file(void) {
         char buf[64] = {};
         _cleanup_close_ int fd;
 
-        fd = mkostemp_safe(fn, O_RDWR);
+        fd = mkostemp_safe(fn);
         assert_se(fd >= 0);
 
         assert_se(write_string_file(fn, "boohoo", WRITE_STRING_FILE_CREATE) == 0);
@@ -350,7 +459,7 @@ static void test_write_string_file_no_create(void) {
         _cleanup_close_ int fd;
         char buf[64] = {0};
 
-        fd = mkostemp_safe(fn, O_RDWR);
+        fd = mkostemp_safe(fn);
         assert_se(fd >= 0);
 
         assert_se(write_string_file("/a/file/which/does/not/exists/i/guess", "boohoo", 0) < 0);
@@ -367,7 +476,7 @@ static void test_write_string_file_verify(void) {
         int r;
 
         assert_se(read_one_line_file("/proc/cmdline", &buf) >= 0);
-        assert_se((buf2 = strjoin(buf, "\n", NULL)));
+        assert_se((buf2 = strjoin(buf, "\n")));
 
         r = write_string_file("/proc/cmdline", buf, 0);
         assert_se(r == -EACCES || r == -EIO);
@@ -390,7 +499,7 @@ static void test_load_env_file_pairs(void) {
         _cleanup_strv_free_ char **l = NULL;
         char **k, **v;
 
-        fd = mkostemp_safe(fn, O_RDWR);
+        fd = mkostemp_safe(fn);
         assert_se(fd >= 0);
 
         r = write_string_file(fn,
@@ -433,7 +542,7 @@ static void test_search_and_fopen(void) {
         int r;
         FILE *f;
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
         close(fd);
 
@@ -469,7 +578,7 @@ static void test_search_and_fopen_nulstr(void) {
         int r;
         FILE *f;
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
         close(fd);
 
@@ -504,7 +613,7 @@ static void test_writing_tmpfile(void) {
         IOVEC_SET_STRING(iov[1], ALPHANUMERICAL "\n");
         IOVEC_SET_STRING(iov[2], "");
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         printf("tmpfile: %s", name);
 
         r = writev(fd, iov, 3);
@@ -555,11 +664,14 @@ static void test_tempfn(void) {
 }
 
 int main(int argc, char *argv[]) {
+        log_set_max_level(LOG_DEBUG);
         log_parse_environment();
         log_open();
 
         test_parse_env_file();
         test_parse_multiline_env_file();
+        test_merge_env_file();
+        test_merge_env_file_invalid();
         test_executable_is_script();
         test_status_field();
         test_capeff();
index 3ccb4ed..2ffadf5 100644 (file)
@@ -20,8 +20,8 @@
 #include <unistd.h>
 
 #include "alloc-util.h"
-#include "fileio.h"
 #include "fd-util.h"
+#include "fileio.h"
 #include "fs-util.h"
 #include "io-util.h"
 #include "hexdecoct.h"
 #include "strv.h"
 #include "util.h"
 
-static void test_unlink_noerrno(void) {
-        char name[] = "/tmp/test-close_nointr.XXXXXX";
-        int fd;
-
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
-        assert_se(fd >= 0);
-        assert_se(close_nointr(fd) >= 0);
-
-        {
-                PROTECT_ERRNO;
-                errno = -42;
-                assert_se(unlink_noerrno(name) >= 0);
-                assert_se(errno == -42);
-                assert_se(unlink_noerrno(name) < 0);
-                assert_se(errno == -42);
-        }
-}
-
-static void test_readlink_and_make_absolute(void) {
-        char tempdir[] = "/tmp/test-readlink_and_make_absolute";
-        char name[] = "/tmp/test-readlink_and_make_absolute/original";
-        char name2[] = "test-readlink_and_make_absolute/original";
-        char name_alias[] = "/tmp/test-readlink_and_make_absolute-alias";
-        char *r = NULL;
-
-        assert_se(mkdir_safe(tempdir, 0755, getuid(), getgid()) >= 0);
-        assert_se(touch(name) >= 0);
-
-        assert_se(symlink(name, name_alias) >= 0);
-        assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
-        assert_se(streq(r, name));
-        free(r);
-        assert_se(unlink(name_alias) >= 0);
-
-        assert_se(chdir(tempdir) >= 0);
-        assert_se(symlink(name2, name_alias) >= 0);
-        assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
-        assert_se(streq(r, name));
-        free(r);
-        assert_se(unlink(name_alias) >= 0);
-
-        assert_se(rm_rf(tempdir, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
-}
-
-static void test_get_files_in_directory(void) {
-        _cleanup_strv_free_ char **l = NULL, **t = NULL;
-
-        assert_se(get_files_in_directory("/tmp", &l) >= 0);
-        assert_se(get_files_in_directory(".", &t) >= 0);
-        assert_se(get_files_in_directory(".", NULL) >= 0);
-}
-
-static void test_var_tmp(void) {
-        char *tmp_dir = NULL;
-        char *tmpdir_backup = NULL;
-        const char *default_var_tmp = NULL;
-        const char *var_name;
-        bool do_overwrite = true;
-
-        default_var_tmp = "/var/tmp";
-        var_name = "TMPDIR";
-
-        if (getenv(var_name) != NULL) {
-                tmpdir_backup = strdup(getenv(var_name));
-                assert_se(tmpdir_backup != NULL);
-        }
-
-        unsetenv(var_name);
-
-        var_tmp(&tmp_dir);
-        assert_se(!strcmp(tmp_dir, default_var_tmp));
-
-        free(tmp_dir);
-
-        setenv(var_name, "/tmp", do_overwrite);
-        assert_se(!strcmp(getenv(var_name), "/tmp"));
-
-        var_tmp(&tmp_dir);
-        assert_se(!strcmp(tmp_dir, "/tmp"));
-
-        free(tmp_dir);
-
-        setenv(var_name, "/88_does_not_exist_88", do_overwrite);
-        assert_se(!strcmp(getenv(var_name), "/88_does_not_exist_88"));
-
-        var_tmp(&tmp_dir);
-        assert_se(!strcmp(tmp_dir, default_var_tmp));
-
-        free(tmp_dir);
-
-        if (tmpdir_backup != NULL)  {
-                setenv(var_name, tmpdir_backup, do_overwrite);
-                assert_se(!strcmp(getenv(var_name), tmpdir_backup));
-                free(tmpdir_backup);
-        }
-}
-
 static int id128_read_fd(int fd, sd_id128_t *ret) {
         char buf[33];
         ssize_t k;
@@ -420,12 +323,132 @@ static void test_chase_symlinks(void) {
         assert_se(rm_rf(temp, REMOVE_ROOT) >= 0);
 }
 
+static void test_unlink_noerrno(void) {
+        char name[] = "/tmp/test-close_nointr.XXXXXX";
+        int fd;
+
+        fd = mkostemp_safe(name);
+        assert_se(fd >= 0);
+        assert_se(close_nointr(fd) >= 0);
+
+        {
+                PROTECT_ERRNO;
+                errno = -42;
+                assert_se(unlink_noerrno(name) >= 0);
+                assert_se(errno == -42);
+                assert_se(unlink_noerrno(name) < 0);
+                assert_se(errno == -42);
+        }
+}
+
+static void test_readlink_and_make_absolute(void) {
+        char tempdir[] = "/tmp/test-readlink_and_make_absolute";
+        char name[] = "/tmp/test-readlink_and_make_absolute/original";
+        char name2[] = "test-readlink_and_make_absolute/original";
+        char name_alias[] = "/tmp/test-readlink_and_make_absolute-alias";
+        char *r = NULL;
+
+        assert_se(mkdir_safe(tempdir, 0755, getuid(), getgid()) >= 0);
+        assert_se(touch(name) >= 0);
+
+        assert_se(symlink(name, name_alias) >= 0);
+        assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
+        assert_se(streq(r, name));
+        free(r);
+        assert_se(unlink(name_alias) >= 0);
+
+        assert_se(chdir(tempdir) >= 0);
+        assert_se(symlink(name2, name_alias) >= 0);
+        assert_se(readlink_and_make_absolute(name_alias, &r) >= 0);
+        assert_se(streq(r, name));
+        free(r);
+        assert_se(unlink(name_alias) >= 0);
+
+        assert_se(rm_rf(tempdir, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
+}
+
+static void test_get_files_in_directory(void) {
+        _cleanup_strv_free_ char **l = NULL, **t = NULL;
+
+        assert_se(get_files_in_directory("/tmp", &l) >= 0);
+        assert_se(get_files_in_directory(".", &t) >= 0);
+        assert_se(get_files_in_directory(".", NULL) >= 0);
+}
+
+static void test_var_tmp(void) {
+        _cleanup_free_ char *tmpdir_backup = NULL, *temp_backup = NULL, *tmp_backup = NULL;
+        const char *tmp_dir = NULL, *t;
+
+        t = getenv("TMPDIR");
+        if (t) {
+                tmpdir_backup = strdup(t);
+                assert_se(tmpdir_backup);
+        }
+
+        t = getenv("TEMP");
+        if (t) {
+                temp_backup = strdup(t);
+                assert_se(temp_backup);
+        }
+
+        t = getenv("TMP");
+        if (t) {
+                tmp_backup = strdup(t);
+                assert_se(tmp_backup);
+        }
+
+        assert(unsetenv("TMPDIR") >= 0);
+        assert(unsetenv("TEMP") >= 0);
+        assert(unsetenv("TMP") >= 0);
+
+        assert_se(var_tmp_dir(&tmp_dir) >= 0);
+        assert_se(streq(tmp_dir, "/var/tmp"));
+
+        assert_se(setenv("TMPDIR", "/tmp", true) >= 0);
+        assert_se(streq(getenv("TMPDIR"), "/tmp"));
+
+        assert_se(var_tmp_dir(&tmp_dir) >= 0);
+        assert_se(streq(tmp_dir, "/tmp"));
+
+        assert_se(setenv("TMPDIR", "/88_does_not_exist_88", true) >= 0);
+        assert_se(streq(getenv("TMPDIR"), "/88_does_not_exist_88"));
+
+        assert_se(var_tmp_dir(&tmp_dir) >= 0);
+        assert_se(streq(tmp_dir, "/var/tmp"));
+
+        if (tmpdir_backup)  {
+                assert_se(setenv("TMPDIR", tmpdir_backup, true) >= 0);
+                assert_se(streq(getenv("TMPDIR"), tmpdir_backup));
+        }
+
+        if (temp_backup)  {
+                assert_se(setenv("TEMP", temp_backup, true) >= 0);
+                assert_se(streq(getenv("TEMP"), temp_backup));
+        }
+
+        if (tmp_backup)  {
+                assert_se(setenv("TMP", tmp_backup, true) >= 0);
+                assert_se(streq(getenv("TMP"), tmp_backup));
+        }
+}
+
+static void test_dot_or_dot_dot(void) {
+        assert_se(!dot_or_dot_dot(NULL));
+        assert_se(!dot_or_dot_dot(""));
+        assert_se(!dot_or_dot_dot("xxx"));
+        assert_se(dot_or_dot_dot("."));
+        assert_se(dot_or_dot_dot(".."));
+        assert_se(!dot_or_dot_dot(".foo"));
+        assert_se(!dot_or_dot_dot("..foo"));
+}
+
 int main(int argc, char *argv[]) {
         test_unlink_noerrno();
-        test_readlink_and_make_absolute();
         test_get_files_in_directory();
+        test_readlink_and_make_absolute();
         test_var_tmp();
         test_chase_symlinks();
+        test_dot_or_dot_dot();
 
         return 0;
 }
index 227d429..af866e0 100644 (file)
 ***/
 
 #include <fcntl.h>
+#include <glob.h>
+#include <sys/stat.h>
 #include <unistd.h>
 
 #include "alloc-util.h"
+#include "dirent-util.h"
 #include "fileio.h"
+#include "fs-util.h"
 #include "glob-util.h"
 #include "macro.h"
+#include "rm-rf.h"
 
 static void test_glob_exists(void) {
         char name[] = "/tmp/test-glob_exists.XXXXXX";
         int fd = -1;
         int r;
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
         close(fd);
 
@@ -43,8 +48,69 @@ static void test_glob_exists(void) {
         assert_se(r == 0);
 }
 
+static void test_glob_no_dot(void) {
+        char template[] = "/tmp/test-glob-util.XXXXXXX";
+        const char *fn;
+
+        _cleanup_globfree_ glob_t g = {
+                .gl_closedir = (void (*)(void *)) closedir,
+                .gl_readdir = (struct dirent *(*)(void *)) readdir_no_dot,
+                .gl_opendir = (void *(*)(const char *)) opendir,
+                .gl_lstat = lstat,
+                .gl_stat = stat,
+        };
+
+        int r;
+
+        assert_se(mkdtemp(template));
+
+        fn = strjoina(template, "/*");
+        r = glob(fn, GLOB_NOSORT|GLOB_BRACE|GLOB_ALTDIRFUNC, NULL, &g);
+        assert_se(r == GLOB_NOMATCH);
+
+        fn = strjoina(template, "/.*");
+        r = glob(fn, GLOB_NOSORT|GLOB_BRACE|GLOB_ALTDIRFUNC, NULL, &g);
+        assert_se(r == GLOB_NOMATCH);
+
+        (void) rm_rf(template, REMOVE_ROOT|REMOVE_PHYSICAL);
+}
+
+static void test_safe_glob(void) {
+        char template[] = "/tmp/test-glob-util.XXXXXXX";
+        const char *fn, *fn2, *fname;
+
+        _cleanup_globfree_ glob_t g = {};
+        int r;
+
+        assert_se(mkdtemp(template));
+
+        fn = strjoina(template, "/*");
+        r = safe_glob(fn, 0, &g);
+        assert_se(r == -ENOENT);
+
+        fn2 = strjoina(template, "/.*");
+        r = safe_glob(fn2, GLOB_NOSORT|GLOB_BRACE, &g);
+        assert_se(r == -ENOENT);
+
+        fname = strjoina(template, "/.foobar");
+        assert_se(touch(fname) == 0);
+
+        r = safe_glob(fn, 0, &g);
+        assert_se(r == -ENOENT);
+
+        r = safe_glob(fn2, GLOB_NOSORT|GLOB_BRACE, &g);
+        assert_se(r == 0);
+        assert_se(g.gl_pathc == 1);
+        assert_se(streq(g.gl_pathv[0], fname));
+        assert_se(g.gl_pathv[1] == NULL);
+
+        (void) rm_rf(template, REMOVE_ROOT|REMOVE_PHYSICAL);
+}
+
 int main(void) {
         test_glob_exists();
+        test_glob_no_dot();
+        test_safe_glob();
 
         return 0;
 }
diff --git a/src/test/test-hash.c b/src/test/test-hash.c
new file mode 100644 (file)
index 0000000..02d1cfa
--- /dev/null
@@ -0,0 +1,90 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <stdio.h>
+
+#include "alloc-util.h"
+#include "log.h"
+#include "string-util.h"
+#include "khash.h"
+
+int main(int argc, char *argv[]) {
+        _cleanup_(khash_unrefp) khash *h = NULL, *copy = NULL;
+        _cleanup_free_ char *s = NULL;
+        int r;
+
+        log_set_max_level(LOG_DEBUG);
+
+        assert_se(khash_new(&h, NULL) == -EINVAL);
+        assert_se(khash_new(&h, "") == -EINVAL);
+        r = khash_new(&h, "foobar");
+        if (r == -EAFNOSUPPORT) {
+                puts("khash not supported on this kernel, skipping");
+                return EXIT_TEST_SKIP;
+        }
+        assert_se(r == -EOPNOTSUPP);
+
+        assert_se(khash_new(&h, "sha256") >= 0);
+        assert_se(khash_get_size(h) == 32);
+        assert_se(streq(khash_get_algorithm(h), "sha256"));
+
+        assert_se(khash_digest_string(h, &s) >= 0);
+        assert_se(streq(s, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"));
+        s = mfree(s);
+
+        assert_se(khash_put(h, "foobar", 6) >= 0);
+        assert_se(khash_digest_string(h, &s) >= 0);
+        assert_se(streq(s, "c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2"));
+        s = mfree(s);
+
+        assert_se(khash_put(h, "piep", 4) >= 0);
+        assert_se(khash_digest_string(h, &s) >= 0);
+        assert_se(streq(s, "f114d872b5ea075d3be9040d0b7a429514b3f9324a8e8e3dc3fb24c34ee56bea"));
+        s = mfree(s);
+
+        assert_se(khash_put(h, "foo", 3) >= 0);
+        assert_se(khash_dup(h, &copy) >= 0);
+
+        assert_se(khash_put(h, "bar", 3) >= 0);
+        assert_se(khash_put(copy, "bar", 3) >= 0);
+
+        assert_se(khash_digest_string(h, &s) >= 0);
+        assert_se(streq(s, "c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2"));
+        s = mfree(s);
+
+        assert_se(khash_digest_string(copy, &s) >= 0);
+        assert_se(streq(s, "c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2"));
+        s = mfree(s);
+
+        h = khash_unref(h);
+
+        assert_se(khash_new_with_key(&h, "hmac(sha256)", "quux", 4) >= 0);
+        assert_se(khash_get_size(h) == 32);
+        assert_se(streq(khash_get_algorithm(h), "hmac(sha256)"));
+
+        assert_se(khash_digest_string(h, &s) >= 0);
+        assert_se(streq(s, "abed9f8218ab473f77218a6a7d39abf1d21fa46d0700c4898e330ba88309d5ae"));
+        s = mfree(s);
+
+        assert_se(khash_put(h, "foobar", 6) >= 0);
+        assert_se(khash_digest_string(h, &s) >= 0);
+        assert_se(streq(s, "33f6c70a60db66007d5325d5d1dea37c371354e5b83347a59ad339ce9f4ba3dc"));
+
+        return 0;
+}
diff --git a/src/test/test-hashmap-ordered.awk b/src/test/test-hashmap-ordered.awk
new file mode 100644 (file)
index 0000000..10f4386
--- /dev/null
@@ -0,0 +1,11 @@
+BEGIN {
+        print "/* GENERATED FILE */";
+        print "#define ORDERED"
+}
+{
+        if (!match($0, "^#include"))
+                gsub(/hashmap/, "ordered_hashmap");
+        gsub(/HASHMAP/, "ORDERED_HASHMAP");
+        gsub(/Hashmap/, "OrderedHashmap");
+        print
+}
index 276f25d..fcae427 100644 (file)
@@ -87,27 +87,19 @@ static void test_undecchar(void) {
 }
 
 static void test_unhexmem(void) {
-        const char *hex = "efa214921";
+        const char *hex = "efa2149213";
         const char *hex_invalid = "efa214921o";
         _cleanup_free_ char *hex2 = NULL;
         _cleanup_free_ void *mem = NULL;
         size_t len;
 
-        assert_se(unhexmem(hex, strlen(hex), &mem, &len) == 0);
-        assert_se(unhexmem(hex, strlen(hex) + 1, &mem, &len) == -EINVAL);
         assert_se(unhexmem(hex_invalid, strlen(hex_invalid), &mem, &len) == -EINVAL);
+        assert_se(unhexmem(hex, strlen(hex) + 1, &mem, &len) == -EINVAL);
+        assert_se(unhexmem(hex, strlen(hex) - 1, &mem, &len) == -EINVAL);
+        assert_se(unhexmem(hex, strlen(hex), &mem, &len) == 0);
 
         assert_se((hex2 = hexmem(mem, len)));
-
-        free(mem);
-
-        assert_se(memcmp(hex, hex2, strlen(hex)) == 0);
-
-        free(hex2);
-
-        assert_se(unhexmem(hex, strlen(hex) - 1, &mem, &len) == 0);
-        assert_se((hex2 = hexmem(mem, len)));
-        assert_se(memcmp(hex, hex2, strlen(hex) - 1) == 0);
+        assert_se(streq(hex, hex2));
 }
 
 /* https://tools.ietf.org/html/rfc4648#section-10 */
index 17fde9f..d2c3ea5 100644 (file)
@@ -42,6 +42,7 @@ static void test_hostname_is_valid(void) {
         assert_se(!hostname_is_valid("foo..bar", false));
         assert_se(!hostname_is_valid("foo.bar..", false));
         assert_se(!hostname_is_valid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", false));
+        assert_se(!hostname_is_valid("au-xph5-rvgrdsb5hcxc-47et3a5vvkrc-server-wyoz4elpdpe3.openstack.local", false));
 
         assert_se(hostname_is_valid("foobar", true));
         assert_se(hostname_is_valid("foobar.com", true));
@@ -103,7 +104,7 @@ static void test_read_hostname_config(void) {
         char *hostname;
         int fd;
 
-        fd = mkostemp_safe(path, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(path);
         assert(fd > 0);
         close(fd);
 
index f01fbdd..e5f4520 100644 (file)
@@ -39,6 +39,7 @@ int main(int argc, char *argv[]) {
         char t[33], q[37];
         _cleanup_free_ char *b = NULL;
         _cleanup_close_ int fd = -1;
+        int r;
 
         assert_se(sd_id128_randomize(&id) == 0);
         printf("random: %s\n", sd_id128_to_string(id, t));
@@ -144,7 +145,7 @@ int main(int argc, char *argv[]) {
         assert_se(ftruncate(fd, 0) >= 0);
 
         assert_se(sd_id128_randomize(&id) >= 0);
-        assert_se(write(fd, id128_to_uuid_string(id, t), 36) == 36);
+        assert_se(write(fd, id128_to_uuid_string(id, q), 36) == 36);
 
         assert_se(lseek(fd, 0, SEEK_SET) == 0);
         assert_se(id128_read_fd(fd, ID128_PLAIN, &id2) == -EINVAL);
@@ -153,5 +154,23 @@ int main(int argc, char *argv[]) {
         assert_se(id128_read_fd(fd, ID128_UUID, &id2) >= 0);
         assert_se(sd_id128_equal(id, id2));
 
+        r = sd_id128_get_machine_app_specific(SD_ID128_MAKE(f0,3d,aa,eb,1c,33,4b,43,a7,32,17,29,44,bf,77,2e), &id);
+        if (r == -EAFNOSUPPORT) {
+                log_info("khash not supported on this kernel, skipping sd_id128_get_machine_app_specific() checks");
+        } else {
+                assert_se(r >= 0);
+                assert_se(sd_id128_get_machine_app_specific(SD_ID128_MAKE(f0,3d,aa,eb,1c,33,4b,43,a7,32,17,29,44,bf,77,2e), &id2) >= 0);
+                assert_se(sd_id128_equal(id, id2));
+                assert_se(sd_id128_get_machine_app_specific(SD_ID128_MAKE(51,df,0b,4b,c3,b0,4c,97,80,e2,99,b9,8c,a3,73,b8), &id2) >= 0);
+                assert_se(!sd_id128_equal(id, id2));
+        }
+
+        /* Query the invocation ID */
+        r = sd_id128_get_invocation(&id);
+        if (r < 0)
+                log_warning_errno(r, "Failed to get invocation ID, ignoring: %m");
+        else
+                log_info("Invocation ID: " SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(id));
+
         return 0;
 }
index db1c928..575401c 100644 (file)
@@ -22,6 +22,7 @@
 #include "install.h"
 #include "mkdir.h"
 #include "rm-rf.h"
+#include "special.h"
 #include "string-util.h"
 
 static void test_basic_mask_and_enable(const char *root) {
@@ -64,7 +65,7 @@ static void test_basic_mask_and_enable(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "d.service", NULL) >= 0);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "d.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
 
-        assert_se(unit_file_mask(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("a.service"), false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_mask(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("a.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/dev/null"));
@@ -80,11 +81,11 @@ static void test_basic_mask_and_enable(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "d.service", &state) >= 0 && state == UNIT_FILE_MASKED);
 
         /* Enabling a masked unit should fail! */
-        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("a.service"), false, &changes, &n_changes) == -ERFKILL);
+        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("a.service"), &changes, &n_changes) == -ERFKILL);
         unit_file_changes_free(changes, n_changes);
         changes = NULL; n_changes = 0;
 
-        assert_se(unit_file_unmask(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("a.service"), &changes, &n_changes) >= 0);
+        assert_se(unit_file_unmask(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("a.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_UNLINK);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_PATH"/a.service");
@@ -92,7 +93,7 @@ static void test_basic_mask_and_enable(const char *root) {
         unit_file_changes_free(changes, n_changes);
         changes = NULL; n_changes = 0;
 
-        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("a.service"), false, &changes, &n_changes) == 1);
+        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("a.service"), &changes, &n_changes) == 1);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/a.service"));
@@ -107,12 +108,12 @@ static void test_basic_mask_and_enable(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "d.service", &state) >= 0 && state == UNIT_FILE_ENABLED);
 
         /* Enabling it again should succeed but be a NOP */
-        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("a.service"), false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("a.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 0);
         unit_file_changes_free(changes, n_changes);
         changes = NULL; n_changes = 0;
 
-        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("a.service"), &changes, &n_changes) >= 0);
+        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("a.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_UNLINK);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_PATH"/multi-user.target.wants/a.service");
@@ -126,13 +127,13 @@ static void test_basic_mask_and_enable(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "d.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
 
         /* Disabling a disabled unit must suceed but be a NOP */
-        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("a.service"), &changes, &n_changes) >= 0);
+        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("a.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 0);
         unit_file_changes_free(changes, n_changes);
         changes = NULL; n_changes = 0;
 
         /* Let's enable this indirectly via a symlink */
-        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("d.service"), false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("d.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/a.service"));
@@ -148,7 +149,7 @@ static void test_basic_mask_and_enable(const char *root) {
 
         /* Let's try to reenable */
 
-        assert_se(unit_file_reenable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("b.service"), false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_reenable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("b.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 2);
         assert_se(changes[0].type == UNIT_FILE_UNLINK);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_PATH"/multi-user.target.wants/a.service");
@@ -217,7 +218,7 @@ static void test_linked_units(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "linked3.service", &state) >= 0 && state == UNIT_FILE_LINKED);
 
         /* First, let's link the unit into the search path */
-        assert_se(unit_file_link(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("/opt/linked.service"), false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_link(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("/opt/linked.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/opt/linked.service"));
@@ -229,7 +230,7 @@ static void test_linked_units(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "linked.service", &state) >= 0 && state == UNIT_FILE_LINKED);
 
         /* Let's unlink it from the search path again */
-        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("linked.service"), &changes, &n_changes) >= 0);
+        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("linked.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_UNLINK);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_PATH"/linked.service");
@@ -240,7 +241,7 @@ static void test_linked_units(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "linked.service", NULL) == -ENOENT);
 
         /* Now, let's not just link it, but also enable it */
-        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("/opt/linked.service"), false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("/opt/linked.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 2);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_PATH"/multi-user.target.wants/linked.service");
         q = strjoina(root, SYSTEM_CONFIG_UNIT_PATH"/linked.service");
@@ -262,7 +263,7 @@ static void test_linked_units(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "linked.service", &state) >= 0 && state == UNIT_FILE_ENABLED);
 
         /* And let's unlink it again */
-        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("linked.service"), &changes, &n_changes) >= 0);
+        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("linked.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 2);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_PATH"/multi-user.target.wants/linked.service");
         q = strjoina(root, SYSTEM_CONFIG_UNIT_PATH"/linked.service");
@@ -282,7 +283,7 @@ static void test_linked_units(const char *root) {
 
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "linked.service", NULL) == -ENOENT);
 
-        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("linked2.service"), false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("linked2.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 2);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_PATH"/multi-user.target.wants/linked2.service");
         q = strjoina(root, SYSTEM_CONFIG_UNIT_PATH"/linked2.service");
@@ -301,7 +302,7 @@ static void test_linked_units(const char *root) {
         unit_file_changes_free(changes, n_changes);
         changes = NULL; n_changes = 0;
 
-        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("linked3.service"), false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("linked3.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_SYMLINK);
         assert_se(startswith(changes[0].path, root));
@@ -325,18 +326,20 @@ static void test_default(const char *root) {
 
         assert_se(unit_file_get_default(UNIT_FILE_SYSTEM, root, &def) == -ENOENT);
 
-        assert_se(unit_file_set_default(UNIT_FILE_SYSTEM, root, "idontexist.target", false, &changes, &n_changes) == -ENOENT);
-        assert_se(n_changes == 0);
+        assert_se(unit_file_set_default(UNIT_FILE_SYSTEM, 0, root, "idontexist.target", &changes, &n_changes) == -ENOENT);
+        assert_se(n_changes == 1);
+        assert_se(changes[0].type == -ENOENT);
+        assert_se(streq_ptr(changes[0].path, "idontexist.target"));
         unit_file_changes_free(changes, n_changes);
         changes = NULL; n_changes = 0;
 
         assert_se(unit_file_get_default(UNIT_FILE_SYSTEM, root, &def) == -ENOENT);
 
-        assert_se(unit_file_set_default(UNIT_FILE_SYSTEM, root, "test-default.target", false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_set_default(UNIT_FILE_SYSTEM, 0, root, "test-default.target", &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/test-default-real.target"));
-        p = strjoina(root, SYSTEM_CONFIG_UNIT_PATH"/default.target");
+        p = strjoina(root, SYSTEM_CONFIG_UNIT_PATH "/" SPECIAL_DEFAULT_TARGET);
         assert_se(streq(changes[0].path, p));
         unit_file_changes_free(changes, n_changes);
         changes = NULL; n_changes = 0;
@@ -362,7 +365,7 @@ static void test_add_dependency(const char *root) {
         p = strjoina(root, "/usr/lib/systemd/system/add-dependency-test-service.service");
         assert_se(symlink("real-add-dependency-test-service.service", p) >= 0);
 
-        assert_se(unit_file_add_dependency(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("add-dependency-test-service.service"), "add-dependency-test-target.target", UNIT_WANTS, false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_add_dependency(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("add-dependency-test-service.service"), "add-dependency-test-target.target", UNIT_WANTS, &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/real-add-dependency-test-service.service"));
@@ -399,7 +402,7 @@ static void test_template_enable(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "template-symlink@def.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "template-symlink@foo.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
 
-        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("template@.service"), false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("template@.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/template@.service"));
@@ -415,7 +418,7 @@ static void test_template_enable(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "template-symlink@def.service", &state) >= 0 && state == UNIT_FILE_ENABLED);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "template-symlink@foo.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
 
-        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("template@.service"), &changes, &n_changes) >= 0);
+        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("template@.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_UNLINK);
         assert_se(streq(changes[0].path, p));
@@ -429,7 +432,7 @@ static void test_template_enable(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "template-symlink@def.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "template-symlink@foo.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
 
-        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("template@foo.service"), false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("template@foo.service"), &changes, &n_changes) >= 0);
         assert_se(changes[0].type == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/template@.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_PATH"/multi-user.target.wants/template@foo.service");
@@ -444,7 +447,7 @@ static void test_template_enable(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "template-symlink@def.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "template-symlink@foo.service", &state) >= 0 && state == UNIT_FILE_ENABLED);
 
-        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("template@foo.service"), &changes, &n_changes) >= 0);
+        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("template@foo.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_UNLINK);
         assert_se(streq(changes[0].path, p));
@@ -460,7 +463,7 @@ static void test_template_enable(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "template-symlink@foo.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "template-symlink@quux.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
 
-        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("template-symlink@quux.service"), false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("template-symlink@quux.service"), &changes, &n_changes) >= 0);
         assert_se(changes[0].type == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/template@.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_PATH"/multi-user.target.wants/template@quux.service");
@@ -505,7 +508,7 @@ static void test_indirect(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "indirectb.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "indirectc.service", &state) >= 0 && state == UNIT_FILE_INDIRECT);
 
-        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("indirectc.service"), false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("indirectc.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/indirectb.service"));
@@ -518,7 +521,7 @@ static void test_indirect(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "indirectb.service", &state) >= 0 && state == UNIT_FILE_ENABLED);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "indirectc.service", &state) >= 0 && state == UNIT_FILE_INDIRECT);
 
-        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("indirectc.service"), &changes, &n_changes) >= 0);
+        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("indirectc.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_UNLINK);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_PATH"/multi-user.target.wants/indirectb.service");
@@ -558,7 +561,7 @@ static void test_preset_and_list(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "preset-yes.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "preset-no.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
 
-        assert_se(unit_file_preset(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("preset-yes.service"), UNIT_FILE_PRESET_FULL, false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_preset(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("preset-yes.service"), UNIT_FILE_PRESET_FULL, &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/preset-yes.service"));
@@ -570,7 +573,7 @@ static void test_preset_and_list(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "preset-yes.service", &state) >= 0 && state == UNIT_FILE_ENABLED);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "preset-no.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
 
-        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("preset-yes.service"), &changes, &n_changes) >= 0);
+        assert_se(unit_file_disable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("preset-yes.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_UNLINK);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_PATH"/multi-user.target.wants/preset-yes.service");
@@ -581,7 +584,7 @@ static void test_preset_and_list(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "preset-yes.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "preset-no.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
 
-        assert_se(unit_file_preset(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("preset-no.service"), UNIT_FILE_PRESET_FULL, false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_preset(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("preset-no.service"), UNIT_FILE_PRESET_FULL, &changes, &n_changes) >= 0);
         assert_se(n_changes == 0);
         unit_file_changes_free(changes, n_changes);
         changes = NULL; n_changes = 0;
@@ -589,7 +592,7 @@ static void test_preset_and_list(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "preset-yes.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "preset-no.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
 
-        assert_se(unit_file_preset_all(UNIT_FILE_SYSTEM, false, root, UNIT_FILE_PRESET_FULL, false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_preset_all(UNIT_FILE_SYSTEM, 0, root, UNIT_FILE_PRESET_FULL, &changes, &n_changes) >= 0);
 
         assert_se(n_changes > 0);
 
@@ -714,7 +717,7 @@ static void test_preset_order(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "prefix-1.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "prefix-2.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
 
-        assert_se(unit_file_preset(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("prefix-1.service"), UNIT_FILE_PRESET_FULL, false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_preset(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("prefix-1.service"), UNIT_FILE_PRESET_FULL, &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
         assert_se(changes[0].type == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/prefix-1.service"));
@@ -726,13 +729,35 @@ static void test_preset_order(const char *root) {
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "prefix-1.service", &state) >= 0 && state == UNIT_FILE_ENABLED);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "prefix-2.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
 
-        assert_se(unit_file_preset(UNIT_FILE_SYSTEM, false, root, STRV_MAKE("prefix-2.service"), UNIT_FILE_PRESET_FULL, false, &changes, &n_changes) >= 0);
+        assert_se(unit_file_preset(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("prefix-2.service"), UNIT_FILE_PRESET_FULL, &changes, &n_changes) >= 0);
         assert_se(n_changes == 0);
 
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "prefix-1.service", &state) >= 0 && state == UNIT_FILE_ENABLED);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "prefix-2.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
 }
 
+static void test_static_instance(const char *root) {
+        UnitFileState state;
+        const char *p;
+
+        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "static-instance@.service", &state) == -ENOENT);
+        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "static-instance@foo.service", &state) == -ENOENT);
+
+        p = strjoina(root, "/usr/lib/systemd/system/static-instance@.service");
+        assert_se(write_string_file(p,
+                                    "[Install]\n"
+                                    "WantedBy=multi-user.target\n", WRITE_STRING_FILE_CREATE) >= 0);
+
+        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "static-instance@.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
+        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "static-instance@foo.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
+
+        p = strjoina(root, "/usr/lib/systemd/system/static-instance@foo.service");
+        assert_se(symlink("static-instance@.service", p) >= 0);
+
+        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "static-instance@.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
+        assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "static-instance@foo.service", &state) >= 0 && state == UNIT_FILE_STATIC);
+}
+
 int main(int argc, char *argv[]) {
         char root[] = "/tmp/rootXXXXXX";
         const char *p;
@@ -763,6 +788,7 @@ int main(int argc, char *argv[]) {
         test_preset_and_list(root);
         test_preset_order(root);
         test_revert(root);
+        test_static_instance(root);
 
         assert_se(rm_rf(root, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
 
index 0ac85f0..fb36aa8 100644 (file)
@@ -70,12 +70,12 @@ int main(int argc, char* argv[]) {
 
         log_info("/*** enable **/");
 
-        r = unit_file_enable(UNIT_FILE_SYSTEM, false, NULL, (char**) files, false, &changes, &n_changes);
+        r = unit_file_enable(UNIT_FILE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
         assert_se(r >= 0);
 
         log_info("/*** enable2 **/");
 
-        r = unit_file_enable(UNIT_FILE_SYSTEM, false, NULL, (char**) files, false, &changes, &n_changes);
+        r = unit_file_enable(UNIT_FILE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
         assert_se(r >= 0);
 
         dump_changes(changes, n_changes);
@@ -89,7 +89,7 @@ int main(int argc, char* argv[]) {
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_disable(UNIT_FILE_SYSTEM, false, NULL, (char**) files, &changes, &n_changes);
+        r = unit_file_disable(UNIT_FILE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
         assert_se(r >= 0);
 
         dump_changes(changes, n_changes);
@@ -103,10 +103,10 @@ int main(int argc, char* argv[]) {
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_mask(UNIT_FILE_SYSTEM, false, NULL, (char**) files, false, &changes, &n_changes);
+        r = unit_file_mask(UNIT_FILE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
         assert_se(r >= 0);
         log_info("/*** mask2 ***/");
-        r = unit_file_mask(UNIT_FILE_SYSTEM, false, NULL, (char**) files, false, &changes, &n_changes);
+        r = unit_file_mask(UNIT_FILE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
         assert_se(r >= 0);
 
         dump_changes(changes, n_changes);
@@ -120,10 +120,10 @@ int main(int argc, char* argv[]) {
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_unmask(UNIT_FILE_SYSTEM, false, NULL, (char**) files, &changes, &n_changes);
+        r = unit_file_unmask(UNIT_FILE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
         assert_se(r >= 0);
         log_info("/*** unmask2 ***/");
-        r = unit_file_unmask(UNIT_FILE_SYSTEM, false, NULL, (char**) files, &changes, &n_changes);
+        r = unit_file_unmask(UNIT_FILE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
         assert_se(r >= 0);
 
         dump_changes(changes, n_changes);
@@ -137,7 +137,7 @@ int main(int argc, char* argv[]) {
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_mask(UNIT_FILE_SYSTEM, false, NULL, (char**) files, false, &changes, &n_changes);
+        r = unit_file_mask(UNIT_FILE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
         assert_se(r >= 0);
 
         dump_changes(changes, n_changes);
@@ -151,10 +151,10 @@ int main(int argc, char* argv[]) {
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_disable(UNIT_FILE_SYSTEM, false, NULL, (char**) files, &changes, &n_changes);
+        r = unit_file_disable(UNIT_FILE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
         assert_se(r >= 0);
         log_info("/*** disable2 ***/");
-        r = unit_file_disable(UNIT_FILE_SYSTEM, false, NULL, (char**) files, &changes, &n_changes);
+        r = unit_file_disable(UNIT_FILE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
         assert_se(r >= 0);
 
         dump_changes(changes, n_changes);
@@ -168,7 +168,7 @@ int main(int argc, char* argv[]) {
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_unmask(UNIT_FILE_SYSTEM, false, NULL, (char**) files, &changes, &n_changes);
+        r = unit_file_unmask(UNIT_FILE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
         assert_se(r >= 0);
 
         dump_changes(changes, n_changes);
@@ -182,7 +182,7 @@ int main(int argc, char* argv[]) {
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_enable(UNIT_FILE_SYSTEM, false, NULL, (char**) files2, false, &changes, &n_changes);
+        r = unit_file_enable(UNIT_FILE_SYSTEM, 0, NULL, (char**) files2, &changes, &n_changes);
         assert_se(r >= 0);
 
         dump_changes(changes, n_changes);
@@ -196,7 +196,7 @@ int main(int argc, char* argv[]) {
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_disable(UNIT_FILE_SYSTEM, false, NULL, STRV_MAKE(basename(files2[0])), &changes, &n_changes);
+        r = unit_file_disable(UNIT_FILE_SYSTEM, 0, NULL, STRV_MAKE(basename(files2[0])), &changes, &n_changes);
         assert_se(r >= 0);
 
         dump_changes(changes, n_changes);
@@ -209,7 +209,7 @@ int main(int argc, char* argv[]) {
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_link(UNIT_FILE_SYSTEM, false, NULL, (char**) files2, false, &changes, &n_changes);
+        r = unit_file_link(UNIT_FILE_SYSTEM, 0, NULL, (char**) files2, &changes, &n_changes);
         assert_se(r >= 0);
 
         dump_changes(changes, n_changes);
@@ -223,7 +223,7 @@ int main(int argc, char* argv[]) {
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_disable(UNIT_FILE_SYSTEM, false, NULL, STRV_MAKE(basename(files2[0])), &changes, &n_changes);
+        r = unit_file_disable(UNIT_FILE_SYSTEM, 0, NULL, STRV_MAKE(basename(files2[0])), &changes, &n_changes);
         assert_se(r >= 0);
 
         dump_changes(changes, n_changes);
@@ -236,7 +236,7 @@ int main(int argc, char* argv[]) {
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_link(UNIT_FILE_SYSTEM, false, NULL, (char**) files2, false, &changes, &n_changes);
+        r = unit_file_link(UNIT_FILE_SYSTEM, 0, NULL, (char**) files2, &changes, &n_changes);
         assert_se(r >= 0);
 
         dump_changes(changes, n_changes);
@@ -250,7 +250,7 @@ int main(int argc, char* argv[]) {
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_reenable(UNIT_FILE_SYSTEM, false, NULL, (char**) files2, false, &changes, &n_changes);
+        r = unit_file_reenable(UNIT_FILE_SYSTEM, 0, NULL, (char**) files2, &changes, &n_changes);
         assert_se(r >= 0);
 
         dump_changes(changes, n_changes);
@@ -264,7 +264,7 @@ int main(int argc, char* argv[]) {
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_disable(UNIT_FILE_SYSTEM, false, NULL, STRV_MAKE(basename(files2[0])), &changes, &n_changes);
+        r = unit_file_disable(UNIT_FILE_SYSTEM, 0, NULL, STRV_MAKE(basename(files2[0])), &changes, &n_changes);
         assert_se(r >= 0);
 
         dump_changes(changes, n_changes);
@@ -276,7 +276,7 @@ int main(int argc, char* argv[]) {
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_preset(UNIT_FILE_SYSTEM, false, NULL, (char**) files, UNIT_FILE_PRESET_FULL, false, &changes, &n_changes);
+        r = unit_file_preset(UNIT_FILE_SYSTEM, 0, NULL, (char**) files, UNIT_FILE_PRESET_FULL, &changes, &n_changes);
         assert_se(r >= 0);
 
         dump_changes(changes, n_changes);
index c5bcaf4..ce6c7aa 100644 (file)
 int main(int argc, char *argv[]) {
         uid_t uid;
         int r;
-        const char* name = argv[1] ?: "nfsnobody";
+        const char* name = argv[1] ?: NOBODY_USER_NAME;
 
         r = get_user_creds(&name, &uid, NULL, NULL, NULL);
         if (r < 0) {
-                log_error_errno(r, "Failed to resolve \"%s\": %m", name);
-                return EXIT_FAILURE;
+                log_full_errno(r == -ESRCH ? LOG_NOTICE : LOG_ERR,
+                               r, "Failed to resolve \"%s\": %m", name);
+                return r == -ESRCH ? EXIT_TEST_SKIP : EXIT_FAILURE;
         }
 
-        return clean_ipc(uid) < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+        r = clean_ipc_by_uid(uid);
+        return  r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }
diff --git a/src/test/test-journal-importer.c b/src/test/test-journal-importer.c
new file mode 100644 (file)
index 0000000..a61212c
--- /dev/null
@@ -0,0 +1,90 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 Zbigniew Jędrzejewski-Szmek
+
+  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 <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "log.h"
+#include "journal-importer.h"
+#include "string-util.h"
+#include "tests.h"
+
+static void assert_iovec_entry(const struct iovec *iovec, const char* content) {
+        assert_se(strlen(content) == iovec->iov_len);
+        assert_se(memcmp(content, iovec->iov_base, iovec->iov_len) == 0);
+}
+
+#define COREDUMP_PROC_GROUP                                             \
+        "COREDUMP_PROC_CGROUP=1:name=systemd:/\n"                       \
+        "0::/user.slice/user-1002.slice/user@1002.service/gnome-terminal-server.service\n"
+
+static void test_basic_parsing(void) {
+        _cleanup_(journal_importer_cleanup) JournalImporter imp = {};
+        int r;
+
+        imp.fd = open(get_testdata_dir("/journal-data/journal-1.txt"), O_RDONLY|O_CLOEXEC);
+        assert_se(imp.fd >= 0);
+
+        do
+                r = journal_importer_process_data(&imp);
+        while (r == 0 && !journal_importer_eof(&imp));
+        assert_se(r == 1);
+
+        /* We read one entry, so we should get EOF on next read, but not yet */
+        assert_se(!journal_importer_eof(&imp));
+
+        assert_se(imp.iovw.count == 6);
+        assert_iovec_entry(&imp.iovw.iovec[0], "_BOOT_ID=1531fd22ec84429e85ae888b12fadb91");
+        assert_iovec_entry(&imp.iovw.iovec[1], "_TRANSPORT=journal");
+        assert_iovec_entry(&imp.iovw.iovec[2], COREDUMP_PROC_GROUP);
+        assert_iovec_entry(&imp.iovw.iovec[3], "COREDUMP_RLIMIT=-1");
+        assert_iovec_entry(&imp.iovw.iovec[4], COREDUMP_PROC_GROUP);
+        assert_iovec_entry(&imp.iovw.iovec[5], "_SOURCE_REALTIME_TIMESTAMP=1478389147837945");
+
+        /* Let's check if we get EOF now */
+        r = journal_importer_process_data(&imp);
+        assert_se(r == 0);
+        assert_se(journal_importer_eof(&imp));
+}
+
+static void test_bad_input(void) {
+        _cleanup_(journal_importer_cleanup) JournalImporter imp = {};
+        int r;
+
+        imp.fd = open(get_testdata_dir("/journal-data/journal-2.txt"), O_RDONLY|O_CLOEXEC);
+        assert_se(imp.fd >= 0);
+
+        do
+                r = journal_importer_process_data(&imp);
+        while (!journal_importer_eof(&imp));
+        assert_se(r == 0); /* If we don't have enough input, 0 is returned */
+
+        assert_se(journal_importer_eof(&imp));
+}
+
+int main(int argc, char **argv) {
+        log_set_max_level(LOG_DEBUG);
+        log_parse_environment();
+
+        test_basic_parsing();
+        test_bad_input();
+
+        return 0;
+}
index e28de9b..0f71c18 100644 (file)
@@ -392,7 +392,7 @@ int main(int argc, char *argv[]) {
                         return EXIT_SUCCESS;
 
                 case 'V':
-                        printf("%s\n", VERSION);
+                        printf("%s\n", PACKAGE_VERSION);
                         return EXIT_SUCCESS;
 
                 case 'm':
index 160064d..0ccd745 100644 (file)
@@ -132,6 +132,29 @@ int main(int argc, const char *argv[]) {
         assert_se(items[1].item_prev == &items[3]);
         assert_se(items[3].item_prev == NULL);
 
+        LIST_INSERT_BEFORE(item, head, &items[3], &items[0]);
+        assert_se(items[2].item_next == NULL);
+        assert_se(items[1].item_next == &items[2]);
+        assert_se(items[3].item_next == &items[1]);
+        assert_se(items[0].item_next == &items[3]);
+
+        assert_se(items[2].item_prev == &items[1]);
+        assert_se(items[1].item_prev == &items[3]);
+        assert_se(items[3].item_prev == &items[0]);
+        assert_se(items[0].item_prev == NULL);
+        assert_se(head == &items[0]);
+
+        LIST_REMOVE(item, head, &items[0]);
+        assert_se(LIST_JUST_US(item, &items[0]));
+
+        assert_se(items[2].item_next == NULL);
+        assert_se(items[1].item_next == &items[2]);
+        assert_se(items[3].item_next == &items[1]);
+
+        assert_se(items[2].item_prev == &items[1]);
+        assert_se(items[1].item_prev == &items[3]);
+        assert_se(items[3].item_prev == NULL);
+
         LIST_INSERT_BEFORE(item, head, NULL, &items[0]);
         assert_se(items[0].item_next == NULL);
         assert_se(items[2].item_next == &items[0]);
index 55a2f9d..626d2c6 100644 (file)
 #include <stddef.h>
 #include <unistd.h>
 
-#include "formats-util.h"
+#include "format-util.h"
 #include "log.h"
 #include "util.h"
 
+assert_cc(LOG_REALM_REMOVE_LEVEL(LOG_REALM_PLUS_LEVEL(LOG_REALM_SYSTEMD, LOG_FTP | LOG_DEBUG))
+          == LOG_REALM_SYSTEMD);
+assert_cc(LOG_REALM_REMOVE_LEVEL(LOG_REALM_PLUS_LEVEL(LOG_REALM_UDEV, LOG_LOCAL7 | LOG_DEBUG))
+          == LOG_REALM_UDEV);
+assert_cc((LOG_REALM_PLUS_LEVEL(LOG_REALM_SYSTEMD, LOG_LOCAL3 | LOG_DEBUG) & LOG_FACMASK)
+          == LOG_LOCAL3);
+assert_cc((LOG_REALM_PLUS_LEVEL(LOG_REALM_UDEV, LOG_USER | LOG_INFO) & LOG_PRIMASK)
+          == LOG_INFO);
+
 int main(int argc, char* argv[]) {
 
         log_set_target(LOG_TARGET_CONSOLE);
index 7b67337..c70633a 100644 (file)
@@ -27,11 +27,12 @@ int main(int argc, char* argv[]) {
         int r;
 
         log_open();
+        log_set_max_level(LOG_DEBUG);
         log_parse_environment();
 
         r = loopback_setup();
         if (r < 0)
-                log_error("loopback: %m");
+                log_error_errno(r, "loopback: %m");
 
         return r >= 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
diff --git a/src/test/test-mount-util.c b/src/test/test-mount-util.c
new file mode 100644 (file)
index 0000000..7c5929d
--- /dev/null
@@ -0,0 +1,57 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <sys/mount.h>
+
+#include "log.h"
+#include "mount-util.h"
+#include "string-util.h"
+
+static void test_mount_propagation_flags(const char *name, int ret, unsigned long expected) {
+        long unsigned flags;
+
+        assert(mount_propagation_flags_from_string(name, &flags) == ret);
+
+        if (ret >= 0) {
+                const char *c;
+
+                assert_se(flags == expected);
+
+                c = mount_propagation_flags_to_string(flags);
+                if (isempty(name))
+                        assert_se(isempty(c));
+                else
+                        assert_se(streq(c, name));
+        }
+}
+
+int main(int argc, char *argv[]) {
+
+        log_set_max_level(LOG_DEBUG);
+
+        test_mount_propagation_flags("shared", 0, MS_SHARED);
+        test_mount_propagation_flags("slave", 0, MS_SLAVE);
+        test_mount_propagation_flags("private", 0, MS_PRIVATE);
+        test_mount_propagation_flags(NULL, 0, 0);
+        test_mount_propagation_flags("", 0, 0);
+        test_mount_propagation_flags("xxxx", -EINVAL, 0);
+        test_mount_propagation_flags(" ", -EINVAL, 0);
+
+        return 0;
+}
index ff9f35c..de7be1f 100644 (file)
@@ -132,14 +132,14 @@ int main(int argc, char *argv[]) {
         assert_se(sd_id128_get_boot(&bid) >= 0);
         sd_id128_to_string(bid, boot_id);
 
-        x = strjoin("/tmp/systemd-private-", boot_id, "-abcd.service-", NULL);
-        y = strjoin("/var/tmp/systemd-private-", boot_id, "-abcd.service-", NULL);
+        x = strjoin("/tmp/systemd-private-", boot_id, "-abcd.service-");
+        y = strjoin("/var/tmp/systemd-private-", boot_id, "-abcd.service-");
         assert_se(x && y);
 
         test_tmpdir("abcd.service", x, y);
 
-        z = strjoin("/tmp/systemd-private-", boot_id, "-sys-devices-pci0000:00-0000:00:1a.0-usb3-3\\x2d1-3\\x2d1:1.0-bluetooth-hci0.device-", NULL);
-        zz = strjoin("/var/tmp/systemd-private-", boot_id, "-sys-devices-pci0000:00-0000:00:1a.0-usb3-3\\x2d1-3\\x2d1:1.0-bluetooth-hci0.device-", NULL);
+        z = strjoin("/tmp/systemd-private-", boot_id, "-sys-devices-pci0000:00-0000:00:1a.0-usb3-3\\x2d1-3\\x2d1:1.0-bluetooth-hci0.device-");
+        zz = strjoin("/var/tmp/systemd-private-", boot_id, "-sys-devices-pci0000:00-0000:00:1a.0-usb3-3\\x2d1-3\\x2d1:1.0-bluetooth-hci0.device-");
 
         assert_se(z && zz);
 
index 9248f29..0125d90 100644 (file)
 int main(int argc, char *argv[]) {
         const char * const writable[] = {
                 "/home",
+                "-/home/lennart/projects/foobar", /* this should be masked automatically */
                 NULL
         };
 
         const char * const readonly[] = {
-                "/",
-                "/usr",
+                /* "/", */
+                /* "/usr", */
                 "/boot",
+                "/lib",
+                "/usr/lib",
+                "-/lib64",
+                "-/usr/lib64",
                 NULL
         };
 
@@ -40,13 +45,22 @@ int main(int argc, char *argv[]) {
                 "/home/lennart/projects",
                 NULL
         };
+
+        static const NameSpaceInfo ns_info = {
+                .private_dev = true,
+                .protect_control_groups = true,
+                .protect_kernel_tunables = true,
+                .protect_kernel_modules = true,
+        };
+
         char *root_directory;
         char *projects_directory;
-
         int r;
         char tmp_dir[] = "/tmp/systemd-private-XXXXXX",
              var_tmp_dir[] = "/var/tmp/systemd-private-XXXXXX";
 
+        log_set_max_level(LOG_DEBUG);
+
         assert_se(mkdtemp(tmp_dir));
         assert_se(mkdtemp(var_tmp_dir));
 
@@ -63,14 +77,17 @@ int main(int argc, char *argv[]) {
                 log_info("Not chrooted");
 
         r = setup_namespace(root_directory,
+                            NULL,
+                            &ns_info,
                             (char **) writable,
                             (char **) readonly,
                             (char **) inaccessible,
+                            &(BindMount) { .source = (char*) "/usr/bin", .destination = (char*) "/etc/systemd", .read_only = true }, 1,
                             tmp_dir,
                             var_tmp_dir,
-                            true,
                             PROTECT_HOME_NO,
                             PROTECT_SYSTEM_NO,
+                            0,
                             0);
         if (r < 0) {
                 log_error_errno(r, "Failed to setup namespace: %m");
index c43bda5..57eeb8e 100644 (file)
@@ -71,13 +71,16 @@ static void* open_handle(const char* dir, const char* module, int flags) {
         const char *path;
         void *handle;
 
-        if (dir)
-                path = strjoina(dir, "/.libs/libnss_", module, ".so.2");
-        else
+        if (dir) {
+                path = strjoina(dir, "/libnss_", module, ".so.2");
+                if (access(path, F_OK) < 0)
+                        path = strjoina(dir, "/.libs/libnss_", module, ".so.2");
+        } else
                 path = strjoina("libnss_", module, ".so.2");
 
         handle = dlopen(path, flags);
-        assert_se(handle);
+        if (!handle)
+                log_error("Failed to load module %s: %s", module, dlerror());
         return handle;
 }
 
@@ -102,7 +105,7 @@ static int print_gaih_addrtuples(const struct gaih_addrtuple *tuples) {
                         goto numerical_index;
 
                 if (if_indextoname(it->scopeid, ifname) == NULL) {
-                        log_warning("if_indextoname(%d) failed: %m", it->scopeid);
+                        log_warning_errno(errno, "if_indextoname(%d) failed: %m", it->scopeid);
                 numerical_index:
                         xsprintf(ifname, "%i", it->scopeid);
                 };
@@ -379,75 +382,158 @@ static void test_byaddr(void *handle,
         puts("");
 }
 
+static int make_addresses(struct local_address **addresses) {
+        int n;
+        size_t n_alloc;
+        _cleanup_free_ struct local_address *addrs = NULL;
+
+        n = local_addresses(NULL, 0, AF_UNSPEC, &addrs);
+        if (n < 0)
+                log_info_errno(n, "Failed to query local addresses: %m");
+
+        n_alloc = n; /* we _can_ do that */
+        if (!GREEDY_REALLOC(addrs, n_alloc, n + 3))
+                return log_oom();
+
+        addrs[n++] = (struct local_address) { .family = AF_INET,
+                                              .address.in = { htobe32(0x7F000001) } };
+        addrs[n++] = (struct local_address) { .family = AF_INET,
+                                              .address.in = { htobe32(0x7F000002) } };
+        addrs[n++] = (struct local_address) { .family = AF_INET6,
+                                              .address.in6 = in6addr_loopback };
+        return 0;
+}
+
+static int test_one_module(const char* dir,
+                           const char *module,
+                           char **names,
+                           struct local_address *addresses,
+                           int n_addresses) {
+        void *handle;
+        char **name;
+        int i;
+
+
+        log_info("======== %s ========", module);
+
+        handle = open_handle(streq(module, "dns") ? NULL : dir,
+                             module,
+                             RTLD_LAZY|RTLD_NODELETE);
+        if (!handle)
+                return -EINVAL;
+
+        STRV_FOREACH(name, names)
+                test_byname(handle, module, *name);
+
+        for (i = 0; i < n_addresses; i++)
+                test_byaddr(handle, module,
+                            &addresses[i].address,
+                            FAMILY_ADDRESS_SIZE(addresses[i].family),
+                            addresses[i].family);
+
+        log_info(" ");
+        dlclose(handle);
+        return 0;
+}
+
+static int parse_argv(int argc, char **argv,
+                      char ***the_modules,
+                      char ***the_names,
+                      struct local_address **the_addresses, int *n_addresses) {
+
+        int r, n = 0;
+        _cleanup_strv_free_ char **modules = NULL, **names = NULL;
+        _cleanup_free_ struct local_address *addrs = NULL;
+        size_t n_allocated = 0;
+
+        if (argc > 1)
+                modules = strv_new(argv[1], NULL);
+        else
+                modules = strv_new(
 #ifdef HAVE_MYHOSTNAME
-#  define MODULE1 "myhostname\0"
-#else
-#  define MODULE1
+                                "myhostname",
 #endif
 #ifdef HAVE_RESOLVED
-#  define MODULE2 "resolve\0"
-#else
-#  define MODULE2
+                                "resolve",
 #endif
 #ifdef HAVE_MACHINED
-#  define MODULE3 "mymachines\0"
-#else
-#  define MODULE3
+                                "mymachines",
 #endif
-#define MODULE4 "dns\0"
-
-int main(int argc, char **argv) {
-        _cleanup_free_ char *dir = NULL, *hostname = NULL;
-        const char *module;
-
-        const uint32_t local_address_ipv4 = htobe32(0x7F000001);
-        const uint32_t local_address_ipv4_2 = htobe32(0x7F000002);
-        _cleanup_free_ struct local_address *addresses = NULL;
-        int n_addresses;
-
-        log_set_max_level(LOG_INFO);
-        log_parse_environment();
+                                "dns",
+                                NULL);
+        if (!modules)
+                return -ENOMEM;
+
+        if (argc > 2) {
+                char **name;
+                int family;
+                union in_addr_union address;
+
+                STRV_FOREACH(name, argv + 2) {
+                        r = in_addr_from_string_auto(*name, &family, &address);
+                        if (r < 0) {
+                                /* assume this is a name */
+                                r = strv_extend(&names, *name);
+                                if (r < 0)
+                                        return r;
+                        } else {
+                                if (!GREEDY_REALLOC0(addrs, n_allocated, n + 1))
+                                        return -ENOMEM;
+
+                                addrs[n++] = (struct local_address) { .family = family,
+                                                                      .address = address };
+                        }
+                }
+        } else {
+                _cleanup_free_ char *hostname;
 
-        dir = dirname_malloc(argv[0]);
-        assert_se(dir);
+                hostname = gethostname_malloc();
+                if (!hostname)
+                        return -ENOMEM;
 
-        hostname = gethostname_malloc();
-        assert_se(hostname);
+                names = strv_new("localhost", "gateway", "foo_no_such_host", hostname, NULL);
+                if (!names)
+                        return -ENOMEM;
 
-        n_addresses = local_addresses(NULL, 0, AF_UNSPEC, &addresses);
-        if (n_addresses < 0) {
-                log_info_errno(n_addresses, "Failed to query local addresses: %m");
-                n_addresses = 0;
+                n = make_addresses(&addrs);
+                if (n < 0)
+                        return n;
         }
 
-        NULSTR_FOREACH(module, MODULE1 MODULE2 MODULE3 MODULE4) {
-                void *handle;
-                const char *name;
-                int i;
-
-                log_info("======== %s ========", module);
-
-                handle = open_handle(streq(module, "dns") ? NULL : dir,
-                                     module,
-                                     RTLD_LAZY|RTLD_NODELETE);
-                NULSTR_FOREACH(name, "localhost\0" "gateway\0" "foo_no_such_host\0")
-                        test_byname(handle, module, name);
+        *the_modules = modules;
+        *the_names = names;
+        modules = names = NULL;
+        *the_addresses = addrs;
+        *n_addresses = n;
+        addrs = NULL;
+        return 0;
+}
 
-                test_byname(handle, module, hostname);
+int main(int argc, char **argv) {
+        _cleanup_free_ char *dir = NULL;
+        _cleanup_strv_free_ char **modules = NULL, **names = NULL;
+        _cleanup_free_ struct local_address *addresses = NULL;
+        int n_addresses = 0;
+        char **module;
+        int r;
 
-                test_byaddr(handle, module, &local_address_ipv4, sizeof local_address_ipv4, AF_INET);
-                test_byaddr(handle, module, &local_address_ipv4_2, sizeof local_address_ipv4_2, AF_INET);
-                test_byaddr(handle, module, &in6addr_loopback, sizeof in6addr_loopback, AF_INET6);
+        log_set_max_level(LOG_INFO);
+        log_parse_environment();
 
-                for (i = 0; i < n_addresses; i++)
-                        test_byaddr(handle, module,
-                                    &addresses[i].address,
-                                    FAMILY_ADDRESS_SIZE(addresses[i].family),
-                                    addresses[i].family);
+        r = parse_argv(argc, argv, &modules, &names, &addresses, &n_addresses);
+        if (r < 0) {
+                log_error_errno(r, "Failed to parse arguments: %m");
+                return EXIT_FAILURE;
+        }
 
-                dlclose(handle);
+        dir = dirname_malloc(argv[0]);
+        if (!dir)
+                return EXIT_FAILURE;
 
-                log_info(" ");
+        STRV_FOREACH(module, modules) {
+                r = test_one_module(dir, *module, names, addresses, n_addresses);
+                if (r < 0)
+                        return EXIT_FAILURE;
         }
 
         return EXIT_SUCCESS;
index 0a76308..1b29b2e 100644 (file)
@@ -395,6 +395,9 @@ static void test_safe_atou16(void) {
 
         r = safe_atou16("junk", &l);
         assert_se(r == -EINVAL);
+
+        r = safe_atou16("123x", &l);
+        assert_se(r == -EINVAL);
 }
 
 static void test_safe_atoi16(void) {
@@ -425,6 +428,70 @@ static void test_safe_atoi16(void) {
 
         r = safe_atoi16("junk", &l);
         assert_se(r == -EINVAL);
+
+        r = safe_atoi16("123x", &l);
+        assert_se(r == -EINVAL);
+}
+
+static void test_safe_atou64(void) {
+        int r;
+        uint64_t l;
+
+        r = safe_atou64("12345", &l);
+        assert_se(r == 0);
+        assert_se(l == 12345);
+
+        r = safe_atou64("  12345", &l);
+        assert_se(r == 0);
+        assert_se(l == 12345);
+
+        r = safe_atou64("18446744073709551617", &l);
+        assert_se(r == -ERANGE);
+
+        r = safe_atou64("-1", &l);
+        assert_se(r == -ERANGE);
+
+        r = safe_atou64("  -1", &l);
+        assert_se(r == -ERANGE);
+
+        r = safe_atou64("junk", &l);
+        assert_se(r == -EINVAL);
+
+        r = safe_atou64("123x", &l);
+        assert_se(r == -EINVAL);
+}
+
+static void test_safe_atoi64(void) {
+        int r;
+        int64_t l;
+
+        r = safe_atoi64("-12345", &l);
+        assert_se(r == 0);
+        assert_se(l == -12345);
+
+        r = safe_atoi64("  -12345", &l);
+        assert_se(r == 0);
+        assert_se(l == -12345);
+
+        r = safe_atoi64("32767", &l);
+        assert_se(r == 0);
+        assert_se(l == 32767);
+
+        r = safe_atoi64("  32767", &l);
+        assert_se(r == 0);
+        assert_se(l == 32767);
+
+        r = safe_atoi64("9223372036854775813", &l);
+        assert_se(r == -ERANGE);
+
+        r = safe_atoi64("-9223372036854775813", &l);
+        assert_se(r == -ERANGE);
+
+        r = safe_atoi64("junk", &l);
+        assert_se(r == -EINVAL);
+
+        r = safe_atoi64("123x", &l);
+        assert_se(r == -EINVAL);
 }
 
 static void test_safe_atod(void) {
@@ -493,6 +560,52 @@ static void test_parse_percent(void) {
         assert_se(parse_percent("1%%") == -EINVAL);
 }
 
+static void test_parse_percent_unbounded(void) {
+        assert_se(parse_percent_unbounded("101%") == 101);
+        assert_se(parse_percent_unbounded("400%") == 400);
+}
+
+static void test_parse_nice(void) {
+        int n;
+
+        assert_se(parse_nice("0", &n) >= 0 && n == 0);
+        assert_se(parse_nice("+0", &n) >= 0 && n == 0);
+        assert_se(parse_nice("-1", &n) >= 0 && n == -1);
+        assert_se(parse_nice("-2", &n) >= 0 && n == -2);
+        assert_se(parse_nice("1", &n) >= 0 && n == 1);
+        assert_se(parse_nice("2", &n) >= 0 && n == 2);
+        assert_se(parse_nice("+1", &n) >= 0 && n == 1);
+        assert_se(parse_nice("+2", &n) >= 0 && n == 2);
+        assert_se(parse_nice("-20", &n) >= 0 && n == -20);
+        assert_se(parse_nice("19", &n) >= 0 && n == 19);
+        assert_se(parse_nice("+19", &n) >= 0 && n == 19);
+
+
+        assert_se(parse_nice("", &n) == -EINVAL);
+        assert_se(parse_nice("-", &n) == -EINVAL);
+        assert_se(parse_nice("+", &n) == -EINVAL);
+        assert_se(parse_nice("xx", &n) == -EINVAL);
+        assert_se(parse_nice("-50", &n) == -ERANGE);
+        assert_se(parse_nice("50", &n) == -ERANGE);
+        assert_se(parse_nice("+50", &n) == -ERANGE);
+        assert_se(parse_nice("-21", &n) == -ERANGE);
+        assert_se(parse_nice("20", &n) == -ERANGE);
+        assert_se(parse_nice("+20", &n) == -ERANGE);
+}
+
+static void test_parse_dev(void) {
+        dev_t dev;
+
+        assert_se(parse_dev("0", &dev) == -EINVAL);
+        assert_se(parse_dev("5", &dev) == -EINVAL);
+        assert_se(parse_dev("5:", &dev) == -EINVAL);
+        assert_se(parse_dev(":5", &dev) == -EINVAL);
+#if SIZEOF_DEV_T < 8
+        assert_se(parse_dev("4294967295:4294967295", &dev) == -EINVAL);
+#endif
+        assert_se(parse_dev("8:11", &dev) >= 0 && major(dev) == 8 && minor(dev) == 11);
+}
+
 int main(int argc, char *argv[]) {
         log_parse_environment();
         log_open();
@@ -505,8 +618,13 @@ int main(int argc, char *argv[]) {
         test_safe_atolli();
         test_safe_atou16();
         test_safe_atoi16();
+        test_safe_atou64();
+        test_safe_atoi64();
         test_safe_atod();
         test_parse_percent();
+        test_parse_percent_unbounded();
+        test_parse_nice();
+        test_parse_dev();
 
         return 0;
 }
index 6094d4c..e564424 100644 (file)
@@ -27,6 +27,7 @@
 #include "mount-util.h"
 #include "path-util.h"
 #include "rm-rf.h"
+#include "stat-util.h"
 #include "string-util.h"
 #include "strv.h"
 #include "util.h"
@@ -104,6 +105,48 @@ static void test_path(void) {
         assert_se(!path_equal_ptr(NULL, "/a"));
 }
 
+static void test_path_equal_root(void) {
+        /* Nail down the details of how path_equal("/", ...) works. */
+
+        assert_se(path_equal("/", "/"));
+        assert_se(path_equal("/", "//"));
+
+        assert_se(!path_equal("/", "/./"));
+        assert_se(!path_equal("/", "/../"));
+
+        assert_se(!path_equal("/", "/.../"));
+
+        /* Make sure that files_same works as expected. */
+
+        assert_se(files_same("/", "/", 0) > 0);
+        assert_se(files_same("/", "/", AT_SYMLINK_NOFOLLOW) > 0);
+        assert_se(files_same("/", "//", 0) > 0);
+        assert_se(files_same("/", "//", AT_SYMLINK_NOFOLLOW) > 0);
+
+        assert_se(files_same("/", "/./", 0) > 0);
+        assert_se(files_same("/", "/./", AT_SYMLINK_NOFOLLOW) > 0);
+        assert_se(files_same("/", "/../", 0) > 0);
+        assert_se(files_same("/", "/../", AT_SYMLINK_NOFOLLOW) > 0);
+
+        assert_se(files_same("/", "/.../", 0) == -ENOENT);
+        assert_se(files_same("/", "/.../", AT_SYMLINK_NOFOLLOW) == -ENOENT);
+
+        /* The same for path_equal_or_files_same. */
+
+        assert_se(path_equal_or_files_same("/", "/", 0));
+        assert_se(path_equal_or_files_same("/", "/", AT_SYMLINK_NOFOLLOW));
+        assert_se(path_equal_or_files_same("/", "//", 0));
+        assert_se(path_equal_or_files_same("/", "//", AT_SYMLINK_NOFOLLOW));
+
+        assert_se(path_equal_or_files_same("/", "/./", 0));
+        assert_se(path_equal_or_files_same("/", "/./", AT_SYMLINK_NOFOLLOW));
+        assert_se(path_equal_or_files_same("/", "/../", 0));
+        assert_se(path_equal_or_files_same("/", "/../", AT_SYMLINK_NOFOLLOW));
+
+        assert_se(!path_equal_or_files_same("/", "/.../", 0));
+        assert_se(!path_equal_or_files_same("/", "/.../", AT_SYMLINK_NOFOLLOW));
+}
+
 static void test_find_binary(const char *self) {
         char *p;
 
@@ -114,7 +157,8 @@ static void test_find_binary(const char *self) {
 
         assert_se(find_binary(self, &p) == 0);
         puts(p);
-        assert_se(endswith(p, "/lt-test-path-util"));
+        /* libtool might prefix the binary name with "lt-" */
+        assert_se(endswith(p, "/lt-test-path-util") || endswith(p, "/test-path-util"));
         assert_se(path_is_absolute(p));
         free(p);
 
@@ -262,16 +306,37 @@ static void test_strv_resolve(void) {
 }
 
 static void test_path_startswith(void) {
-        assert_se(path_startswith("/foo/bar/barfoo/", "/foo"));
-        assert_se(path_startswith("/foo/bar/barfoo/", "/foo/"));
-        assert_se(path_startswith("/foo/bar/barfoo/", "/"));
-        assert_se(path_startswith("/foo/bar/barfoo/", "////"));
-        assert_se(path_startswith("/foo/bar/barfoo/", "/foo//bar/////barfoo///"));
-        assert_se(path_startswith("/foo/bar/barfoo/", "/foo/bar/barfoo////"));
-        assert_se(path_startswith("/foo/bar/barfoo/", "/foo/bar///barfoo/"));
-        assert_se(path_startswith("/foo/bar/barfoo/", "/foo////bar/barfoo/"));
-        assert_se(path_startswith("/foo/bar/barfoo/", "////foo/bar/barfoo/"));
-        assert_se(path_startswith("/foo/bar/barfoo/", "/foo/bar/barfoo"));
+        const char *p;
+
+        p = path_startswith("/foo/bar/barfoo/", "/foo");
+        assert_se(streq_ptr(p, "bar/barfoo/"));
+
+        p = path_startswith("/foo/bar/barfoo/", "/foo/");
+        assert_se(streq_ptr(p, "bar/barfoo/"));
+
+        p = path_startswith("/foo/bar/barfoo/", "/");
+        assert_se(streq_ptr(p, "foo/bar/barfoo/"));
+
+        p = path_startswith("/foo/bar/barfoo/", "////");
+        assert_se(streq_ptr(p, "foo/bar/barfoo/"));
+
+        p = path_startswith("/foo/bar/barfoo/", "/foo//bar/////barfoo///");
+        assert_se(streq_ptr(p, ""));
+
+        p = path_startswith("/foo/bar/barfoo/", "/foo/bar/barfoo////");
+        assert_se(streq_ptr(p, ""));
+
+        p = path_startswith("/foo/bar/barfoo/", "/foo/bar///barfoo/");
+        assert_se(streq_ptr(p, ""));
+
+        p = path_startswith("/foo/bar/barfoo/", "/foo////bar/barfoo/");
+        assert_se(streq_ptr(p, ""));
+
+        p = path_startswith("/foo/bar/barfoo/", "////foo/bar/barfoo/");
+        assert_se(streq_ptr(p, ""));
+
+        p = path_startswith("/foo/bar/barfoo/", "/foo/bar/barfoo");
+        assert_se(streq_ptr(p, ""));
 
         assert_se(!path_startswith("/foo/bar/barfoo/", "/foo/bar/barfooa/"));
         assert_se(!path_startswith("/foo/bar/barfoo/", "/foo/bar/barfooa"));
@@ -315,17 +380,17 @@ static void test_path_is_mount_point(void) {
         _cleanup_free_ char *dir1 = NULL, *dir1file = NULL, *dirlink1 = NULL, *dirlink1file = NULL;
         _cleanup_free_ char *dir2 = NULL, *dir2file = 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("/", NULL, AT_SYMLINK_FOLLOW) > 0);
+        assert_se(path_is_mount_point("/", NULL, 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", NULL, AT_SYMLINK_FOLLOW) > 0);
+        assert_se(path_is_mount_point("/proc", NULL, 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("/proc/1", NULL, AT_SYMLINK_FOLLOW) == 0);
+        assert_se(path_is_mount_point("/proc/1", NULL, 0) == 0);
 
-        assert_se(path_is_mount_point("/sys", AT_SYMLINK_FOLLOW) > 0);
-        assert_se(path_is_mount_point("/sys", 0) > 0);
+        assert_se(path_is_mount_point("/sys", NULL, AT_SYMLINK_FOLLOW) > 0);
+        assert_se(path_is_mount_point("/sys", NULL, 0) > 0);
 
         /* we'll create a hierarchy of different kinds of dir/file/link
          * layouts:
@@ -359,10 +424,10 @@ static void test_path_is_mount_point(void) {
         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);
+        assert_se(path_is_mount_point(file1, NULL, AT_SYMLINK_FOLLOW) == 0);
+        assert_se(path_is_mount_point(file1, NULL, 0) == 0);
+        assert_se(path_is_mount_point(link1, NULL, AT_SYMLINK_FOLLOW) == 0);
+        assert_se(path_is_mount_point(link1, NULL, 0) == 0);
 
         /* directory mountpoints */
         dir1 = path_join(NULL, tmp_dir, "dir1");
@@ -378,10 +443,10 @@ static void test_path_is_mount_point(void) {
         assert_se(dir2);
         assert_se(mkdir(dir2, 0755) == 0);
 
-        assert_se(path_is_mount_point(dir1, AT_SYMLINK_FOLLOW) == 0);
-        assert_se(path_is_mount_point(dir1, 0) == 0);
-        assert_se(path_is_mount_point(dirlink1, AT_SYMLINK_FOLLOW) == 0);
-        assert_se(path_is_mount_point(dirlink1, 0) == 0);
+        assert_se(path_is_mount_point(dir1, NULL, AT_SYMLINK_FOLLOW) == 0);
+        assert_se(path_is_mount_point(dir1, NULL, 0) == 0);
+        assert_se(path_is_mount_point(dirlink1, NULL, AT_SYMLINK_FOLLOW) == 0);
+        assert_se(path_is_mount_point(dirlink1, NULL, 0) == 0);
 
         /* file in subdirectory mountpoints */
         dir1file = path_join(NULL, dir1, "file");
@@ -390,10 +455,10 @@ static void test_path_is_mount_point(void) {
         assert_se(fd > 0);
         close(fd);
 
-        assert_se(path_is_mount_point(dir1file, AT_SYMLINK_FOLLOW) == 0);
-        assert_se(path_is_mount_point(dir1file, 0) == 0);
-        assert_se(path_is_mount_point(dirlink1file, AT_SYMLINK_FOLLOW) == 0);
-        assert_se(path_is_mount_point(dirlink1file, 0) == 0);
+        assert_se(path_is_mount_point(dir1file, NULL, AT_SYMLINK_FOLLOW) == 0);
+        assert_se(path_is_mount_point(dir1file, NULL, 0) == 0);
+        assert_se(path_is_mount_point(dirlink1file, NULL, AT_SYMLINK_FOLLOW) == 0);
+        assert_se(path_is_mount_point(dirlink1file, NULL, 0) == 0);
 
         /* these tests will only work as root */
         if (mount(file1, file2, NULL, MS_BIND, NULL) >= 0) {
@@ -401,10 +466,10 @@ static void test_path_is_mount_point(void) {
 
                 /* files */
                 /* capture results in vars, to avoid dangling mounts on failure */
-                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);
+                rf = path_is_mount_point(file2, NULL, 0);
+                rt = path_is_mount_point(file2, NULL, AT_SYMLINK_FOLLOW);
+                rlf = path_is_mount_point(link2, NULL, 0);
+                rlt = path_is_mount_point(link2, NULL, AT_SYMLINK_FOLLOW);
 
                 assert_se(umount(file2) == 0);
 
@@ -422,13 +487,13 @@ static void test_path_is_mount_point(void) {
 
                 assert_se(mount(dir2, dir1, NULL, MS_BIND, NULL) >= 0);
 
-                rf = path_is_mount_point(dir1, 0);
-                rt = path_is_mount_point(dir1, AT_SYMLINK_FOLLOW);
-                rlf = path_is_mount_point(dirlink1, 0);
-                rlt = path_is_mount_point(dirlink1, AT_SYMLINK_FOLLOW);
+                rf = path_is_mount_point(dir1, NULL, 0);
+                rt = path_is_mount_point(dir1, NULL, AT_SYMLINK_FOLLOW);
+                rlf = path_is_mount_point(dirlink1, NULL, 0);
+                rlt = path_is_mount_point(dirlink1, NULL, AT_SYMLINK_FOLLOW);
                 /* its parent is a mount point, but not /file itself */
-                rl1f = path_is_mount_point(dirlink1file, 0);
-                rl1t = path_is_mount_point(dirlink1file, AT_SYMLINK_FOLLOW);
+                rl1f = path_is_mount_point(dirlink1file, NULL, 0);
+                rl1t = path_is_mount_point(dirlink1file, NULL, AT_SYMLINK_FOLLOW);
 
                 assert_se(umount(dir1) == 0);
 
@@ -510,8 +575,26 @@ static void test_hidden_or_backup_file(void) {
         assert_se(!hidden_or_backup_file("test.dpkg-old.foo"));
 }
 
+static void test_systemd_installation_has_version(const char *path) {
+        int r;
+        const unsigned versions[] = {0, 231, atoi(PACKAGE_VERSION), 999};
+        unsigned i;
+
+        for (i = 0; i < ELEMENTSOF(versions); i++) {
+                r = systemd_installation_has_version(path, versions[i]);
+                assert_se(r >= 0);
+                log_info("%s has systemd >= %u: %s",
+                         path ?: "Current installation", versions[i], yes_no(r));
+        }
+}
+
 int main(int argc, char **argv) {
+        log_set_max_level(LOG_DEBUG);
+        log_parse_environment();
+        log_open();
+
         test_path();
+        test_path_equal_root();
         test_find_binary(argv[0]);
         test_prefixes();
         test_path_join();
@@ -525,5 +608,7 @@ int main(int argc, char **argv) {
         test_filename_is_valid();
         test_hidden_or_backup_file();
 
+        test_systemd_installation_has_version(argv[1]); /* NULL is OK */
+
         return 0;
 }
index 62181e2..70ac6b3 100644 (file)
@@ -47,7 +47,7 @@ static int setup_test(Manager **m) {
 
         r = manager_new(UNIT_FILE_USER, true, &tmp);
         if (MANAGER_SKIP_TEST(r)) {
-                printf("Skipping test: manager_new: %s\n", strerror(-r));
+                log_notice_errno(r, "Skipping test: manager_new: %m");
                 return -EXIT_TEST_SKIP;
         }
         assert_se(r >= 0);
@@ -56,7 +56,7 @@ static int setup_test(Manager **m) {
         STRV_FOREACH(test_path, tests_path) {
                 _cleanup_free_ char *p = NULL;
 
-                p = strjoin("/tmp/test-path_", *test_path, NULL);
+                p = strjoin("/tmp/test-path_", *test_path);
                 assert_se(p);
 
                 (void) rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL);
@@ -262,8 +262,8 @@ int main(int argc, char *argv[]) {
         log_parse_environment();
         log_open();
 
+        assert_se(set_unit_path(get_testdata_dir("/test-path")) >= 0);
         assert_se(runtime_dir = setup_fake_runtime_dir());
-        assert_se(set_unit_path(TEST_DIR "/test-path/") >= 0);
 
         for (test = tests; test && *test; test++) {
                 int r;
index 80ad5ed..12dac85 100644 (file)
 #include "string-util.h"
 #include "util.h"
 
-static int parse_item(const char *key, const char *value) {
+static int obj;
+
+static int parse_item(const char *key, const char *value, void *data) {
         assert_se(key);
+        assert_se(data == &obj);
 
         log_info("kernel cmdline option <%s> = <%s>", key, strna(value));
         return 0;
 }
 
-static void test_parse_proc_cmdline(void) {
-        assert_se(parse_proc_cmdline(parse_item) >= 0);
+static void test_proc_cmdline_parse(void) {
+        assert_se(proc_cmdline_parse(parse_item, &obj, true) >= 0);
 }
 
 static void test_runlevel_to_target(void) {
@@ -52,11 +55,101 @@ static void test_runlevel_to_target(void) {
         assert_se(streq_ptr(runlevel_to_target("rd.rescue"), SPECIAL_RESCUE_TARGET));
 }
 
+static void test_proc_cmdline_get_key(void) {
+        _cleanup_free_ char *value = NULL;
+
+        putenv((char*) "SYSTEMD_PROC_CMDLINE=foo_bar=quux wuff-piep=tuet zumm");
+
+        assert_se(proc_cmdline_get_key("", 0, &value) == -EINVAL);
+        assert_se(proc_cmdline_get_key("abc", 0, NULL) == 0);
+        assert_se(proc_cmdline_get_key("abc", 0, &value) == 0 && value == NULL);
+        assert_se(proc_cmdline_get_key("abc", PROC_CMDLINE_VALUE_OPTIONAL, &value) == 0 && value == NULL);
+
+        assert_se(proc_cmdline_get_key("foo_bar", 0, &value) > 0 && streq_ptr(value, "quux"));
+        value = mfree(value);
+        assert_se(proc_cmdline_get_key("foo_bar", PROC_CMDLINE_VALUE_OPTIONAL, &value) > 0 && streq_ptr(value, "quux"));
+        value = mfree(value);
+        assert_se(proc_cmdline_get_key("foo-bar", 0, &value) > 0 && streq_ptr(value, "quux"));
+        value = mfree(value);
+        assert_se(proc_cmdline_get_key("foo-bar", PROC_CMDLINE_VALUE_OPTIONAL, &value) > 0 && streq_ptr(value, "quux"));
+        value = mfree(value);
+        assert_se(proc_cmdline_get_key("foo-bar", 0, NULL) == 0);
+        assert_se(proc_cmdline_get_key("foo-bar", PROC_CMDLINE_VALUE_OPTIONAL, NULL) == -EINVAL);
+
+        assert_se(proc_cmdline_get_key("wuff-piep", 0, &value) > 0 && streq_ptr(value, "tuet"));
+        value = mfree(value);
+        assert_se(proc_cmdline_get_key("wuff-piep", PROC_CMDLINE_VALUE_OPTIONAL, &value) > 0 && streq_ptr(value, "tuet"));
+        value = mfree(value);
+        assert_se(proc_cmdline_get_key("wuff_piep", 0, &value) > 0 && streq_ptr(value, "tuet"));
+        value = mfree(value);
+        assert_se(proc_cmdline_get_key("wuff_piep", PROC_CMDLINE_VALUE_OPTIONAL, &value) > 0 && streq_ptr(value, "tuet"));
+        value = mfree(value);
+        assert_se(proc_cmdline_get_key("wuff_piep", 0, NULL) == 0);
+        assert_se(proc_cmdline_get_key("wuff_piep", PROC_CMDLINE_VALUE_OPTIONAL, NULL) == -EINVAL);
+
+        assert_se(proc_cmdline_get_key("zumm", 0, &value) == 0 && value == NULL);
+        assert_se(proc_cmdline_get_key("zumm", PROC_CMDLINE_VALUE_OPTIONAL, &value) > 0 && value == NULL);
+        assert_se(proc_cmdline_get_key("zumm", 0, NULL) > 0);
+}
+
+static void test_proc_cmdline_get_bool(void) {
+        bool value = false;
+
+        putenv((char*) "SYSTEMD_PROC_CMDLINE=foo_bar bar-waldo=1 x_y-z=0 quux=miep");
+
+        assert_se(proc_cmdline_get_bool("", &value) == -EINVAL);
+        assert_se(proc_cmdline_get_bool("abc", &value) == 0 && value == false);
+        assert_se(proc_cmdline_get_bool("foo_bar", &value) > 0 && value == true);
+        assert_se(proc_cmdline_get_bool("foo-bar", &value) > 0 && value == true);
+        assert_se(proc_cmdline_get_bool("bar-waldo", &value) > 0 && value == true);
+        assert_se(proc_cmdline_get_bool("bar_waldo", &value) > 0 && value == true);
+        assert_se(proc_cmdline_get_bool("x_y-z", &value) > 0 && value == false);
+        assert_se(proc_cmdline_get_bool("x-y-z", &value) > 0 && value == false);
+        assert_se(proc_cmdline_get_bool("x-y_z", &value) > 0 && value == false);
+        assert_se(proc_cmdline_get_bool("x_y_z", &value) > 0 && value == false);
+        assert_se(proc_cmdline_get_bool("quux", &value) == -EINVAL && value == false);
+}
+
+static void test_proc_cmdline_key_streq(void) {
+
+        assert_se(proc_cmdline_key_streq("", ""));
+        assert_se(proc_cmdline_key_streq("a", "a"));
+        assert_se(!proc_cmdline_key_streq("", "a"));
+        assert_se(!proc_cmdline_key_streq("a", ""));
+        assert_se(proc_cmdline_key_streq("a", "a"));
+        assert_se(!proc_cmdline_key_streq("a", "b"));
+        assert_se(proc_cmdline_key_streq("x-y-z", "x-y-z"));
+        assert_se(proc_cmdline_key_streq("x-y-z", "x_y_z"));
+        assert_se(proc_cmdline_key_streq("x-y-z", "x-y_z"));
+        assert_se(proc_cmdline_key_streq("x-y-z", "x_y-z"));
+        assert_se(proc_cmdline_key_streq("x_y-z", "x-y_z"));
+        assert_se(!proc_cmdline_key_streq("x_y-z", "x-z_z"));
+}
+
+static void test_proc_cmdline_key_startswith(void) {
+
+        assert_se(proc_cmdline_key_startswith("", ""));
+        assert_se(proc_cmdline_key_startswith("x", ""));
+        assert_se(!proc_cmdline_key_startswith("", "x"));
+        assert_se(proc_cmdline_key_startswith("x", "x"));
+        assert_se(!proc_cmdline_key_startswith("x", "y"));
+        assert_se(!proc_cmdline_key_startswith("foo-bar", "quux"));
+        assert_se(proc_cmdline_key_startswith("foo-bar", "foo"));
+        assert_se(proc_cmdline_key_startswith("foo-bar", "foo-bar"));
+        assert_se(proc_cmdline_key_startswith("foo-bar", "foo_bar"));
+        assert_se(proc_cmdline_key_startswith("foo-bar", "foo_"));
+        assert_se(!proc_cmdline_key_startswith("foo-bar", "foo_xx"));
+}
+
 int main(void) {
         log_parse_environment();
         log_open();
 
-        test_parse_proc_cmdline();
+        test_proc_cmdline_parse();
+        test_proc_cmdline_key_streq();
+        test_proc_cmdline_key_startswith();
+        test_proc_cmdline_get_key();
+        test_proc_cmdline_get_bool();
         test_runlevel_to_target();
 
         return 0;
index 562ad4a..c5edbcc 100644 (file)
@@ -40,6 +40,7 @@
 #include "stdio-util.h"
 #include "string-util.h"
 #include "terminal-util.h"
+#include "test-helper.h"
 #include "util.h"
 #include "virt.h"
 
@@ -192,7 +193,14 @@ static void test_get_process_cmdline_harder(void) {
 
         fd = mkostemp(path, O_CLOEXEC);
         assert_se(fd >= 0);
-        assert_se(mount(path, "/proc/self/cmdline", "bind", MS_BIND, NULL) >= 0);
+
+        if (mount(path, "/proc/self/cmdline", "bind", MS_BIND, NULL) < 0) {
+                /* This happens under selinux… Abort the test in this case. */
+                log_warning_errno(errno, "mount(..., \"/proc/self/cmdline\", \"bind\", ...) failed: %m");
+                assert(errno == EACCES);
+                return;
+        }
+
         assert_se(unlink(path) >= 0);
 
         assert_se(prctl(PR_SET_NAME, "testa") >= 0);
@@ -347,17 +355,77 @@ static void test_get_process_cmdline_harder(void) {
         _exit(0);
 }
 
+static void test_rename_process_one(const char *p, int ret) {
+        _cleanup_free_ char *comm = NULL, *cmdline = NULL;
+        pid_t pid;
+        int r;
+
+        pid = fork();
+        assert_se(pid >= 0);
+
+        if (pid > 0) {
+                siginfo_t si;
+
+                assert_se(wait_for_terminate(pid, &si) >= 0);
+                assert_se(si.si_code == CLD_EXITED);
+                assert_se(si.si_status == EXIT_SUCCESS);
+
+                return;
+        }
+
+        /* child */
+        r = rename_process(p);
+
+        assert_se(r == ret ||
+                  (ret == 0 && r >= 0) ||
+                  (ret > 0 && r > 0));
+
+        if (r < 0)
+                goto finish;
+
+#ifdef HAVE_VALGRIND_VALGRIND_H
+        /* see above, valgrind is weird, we can't verify what we are doing here */
+        if (RUNNING_ON_VALGRIND)
+                goto finish;
+#endif
+
+        assert_se(get_process_comm(0, &comm) >= 0);
+        log_info("comm = <%s>", comm);
+        assert_se(strneq(comm, p, 15));
+
+        assert_se(get_process_cmdline(0, 0, false, &cmdline) >= 0);
+        log_info("cmdline = <%s>", cmdline);
+        assert_se(strneq(p, cmdline, strlen("test-process-util")));
+        assert_se(startswith(p, cmdline));
+
+finish:
+        _exit(EXIT_SUCCESS);
+}
+
+static void test_rename_process(void) {
+        test_rename_process_one(NULL, -EINVAL);
+        test_rename_process_one("", -EINVAL);
+        test_rename_process_one("foo", 1); /* should always fit */
+        test_rename_process_one("this is a really really long process name, followed by some more words", 0); /* unlikely to fit */
+        test_rename_process_one("1234567", 1); /* should always fit */
+}
+
 int main(int argc, char *argv[]) {
+
+        log_set_max_level(LOG_DEBUG);
         log_parse_environment();
         log_open();
 
+        saved_argc = argc;
+        saved_argv = argv;
+
         if (argc > 1) {
                 pid_t pid = 0;
 
                 (void) parse_pid(argv[1], &pid);
                 test_get_process_comm(pid);
         } else {
-                test_get_process_comm(1);
+                TEST_REQ_RUNNING_SYSTEMD(test_get_process_comm(1));
                 test_get_process_comm(getpid());
         }
 
@@ -365,6 +433,7 @@ int main(int argc, char *argv[]) {
         test_pid_is_alive();
         test_personality();
         test_get_process_cmdline_harder();
+        test_rename_process();
 
         return 0;
 }
diff --git a/src/test/test-random-util.c b/src/test/test-random-util.c
new file mode 100644 (file)
index 0000000..50f4da2
--- /dev/null
@@ -0,0 +1,65 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2017 Zbigniew Jędrzejewski-Szmek
+
+  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 "hexdecoct.h"
+#include "random-util.h"
+#include "log.h"
+
+static void test_acquire_random_bytes(bool high_quality_required) {
+        uint8_t buf[16] = {};
+        unsigned i;
+
+        log_info("/* %s */", __func__);
+
+        for (i = 1; i < sizeof buf; i++) {
+                assert_se(acquire_random_bytes(buf, i, high_quality_required) == 0);
+                if (i + 1 < sizeof buf)
+                        assert_se(buf[i] == 0);
+
+                hexdump(stdout, buf, i);
+        }
+}
+
+static void test_pseudorandom_bytes(void) {
+        uint8_t buf[16] = {};
+        unsigned i;
+
+        log_info("/* %s */", __func__);
+
+        for (i = 1; i < sizeof buf; i++) {
+                pseudorandom_bytes(buf, i);
+                if (i + 1 < sizeof buf)
+                        assert_se(buf[i] == 0);
+
+                hexdump(stdout, buf, i);
+        }
+}
+
+int main(int argc, char **argv) {
+        log_set_max_level(LOG_DEBUG);
+        log_parse_environment();
+        log_open();
+
+        test_acquire_random_bytes(false);
+        test_acquire_random_bytes(true);
+
+        test_pseudorandom_bytes();
+
+        return 0;
+}
index 297effc..60e05d0 100644 (file)
@@ -25,7 +25,7 @@
 #include "util.h"
 
 static char *lookup(const char *variable, void *userdata) {
-        return strjoin("<<<", variable, ">>>", NULL);
+        return strjoin("<<<", variable, ">>>");
 }
 
 int main(int argc, char *argv[]) {
index c068f5c..81d9abc 100644 (file)
@@ -34,13 +34,12 @@ int main(int argc, char *argv[]) {
         FDSet *fdset = NULL;
         int r;
 
-        assert_se(runtime_dir = setup_fake_runtime_dir());
-
         /* prepare the test */
-        assert_se(set_unit_path(TEST_DIR) >= 0);
+        assert_se(set_unit_path(get_testdata_dir("")) >= 0);
+        assert_se(runtime_dir = setup_fake_runtime_dir());
         r = manager_new(UNIT_FILE_USER, true, &m);
         if (MANAGER_SKIP_TEST(r)) {
-                printf("Skipping test: manager_new: %s\n", strerror(-r));
+                log_notice_errno(r, "Skipping test: manager_new: %m");
                 return EXIT_TEST_SKIP;
         }
         assert_se(r >= 0);
diff --git a/src/test/test-seccomp.c b/src/test/test-seccomp.c
new file mode 100644 (file)
index 0000000..efd145e
--- /dev/null
@@ -0,0 +1,574 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <sched.h>
+#include <stdlib.h>
+#include <sys/eventfd.h>
+#include <sys/mman.h>
+#include <sys/poll.h>
+#include <sys/shm.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "alloc-util.h"
+#include "fd-util.h"
+#include "macro.h"
+#include "missing.h"
+#include "nsflags.h"
+#include "process-util.h"
+#include "raw-clone.h"
+#include "seccomp-util.h"
+#include "set.h"
+#include "string-util.h"
+#include "util.h"
+#include "virt.h"
+
+#if SCMP_SYS(socket) < 0 || defined(__i386__) || defined(__s390x__) || defined(__s390__)
+/* On these archs, socket() is implemented via the socketcall() syscall multiplexer,
+ * and we can't restrict it hence via seccomp. */
+#  define SECCOMP_RESTRICT_ADDRESS_FAMILIES_BROKEN 1
+#else
+#  define SECCOMP_RESTRICT_ADDRESS_FAMILIES_BROKEN 0
+#endif
+
+
+static void test_seccomp_arch_to_string(void) {
+        uint32_t a, b;
+        const char *name;
+
+        a = seccomp_arch_native();
+        assert_se(a > 0);
+        name = seccomp_arch_to_string(a);
+        assert_se(name);
+        assert_se(seccomp_arch_from_string(name, &b) >= 0);
+        assert_se(a == b);
+}
+
+static void test_architecture_table(void) {
+        const char *n, *n2;
+
+        NULSTR_FOREACH(n,
+                       "native\0"
+                       "x86\0"
+                       "x86-64\0"
+                       "x32\0"
+                       "arm\0"
+                       "arm64\0"
+                       "mips\0"
+                       "mips64\0"
+                       "mips64-n32\0"
+                       "mips-le\0"
+                       "mips64-le\0"
+                       "mips64-le-n32\0"
+                       "ppc\0"
+                       "ppc64\0"
+                       "ppc64-le\0"
+                       "s390\0"
+                       "s390x\0") {
+                uint32_t c;
+
+                assert_se(seccomp_arch_from_string(n, &c) >= 0);
+                n2 = seccomp_arch_to_string(c);
+                log_info("seccomp-arch: %s → 0x%"PRIx32" → %s", n, c, n2);
+                assert_se(streq_ptr(n, n2));
+        }
+}
+
+static void test_syscall_filter_set_find(void) {
+        assert_se(!syscall_filter_set_find(NULL));
+        assert_se(!syscall_filter_set_find(""));
+        assert_se(!syscall_filter_set_find("quux"));
+        assert_se(!syscall_filter_set_find("@quux"));
+
+        assert_se(syscall_filter_set_find("@clock") == syscall_filter_sets + SYSCALL_FILTER_SET_CLOCK);
+        assert_se(syscall_filter_set_find("@default") == syscall_filter_sets + SYSCALL_FILTER_SET_DEFAULT);
+        assert_se(syscall_filter_set_find("@raw-io") == syscall_filter_sets + SYSCALL_FILTER_SET_RAW_IO);
+}
+
+static void test_filter_sets(void) {
+        unsigned i;
+        int r;
+
+        if (!is_seccomp_available())
+                return;
+        if (geteuid() != 0)
+                return;
+
+        for (i = 0; i < _SYSCALL_FILTER_SET_MAX; i++) {
+                pid_t pid;
+
+                log_info("Testing %s", syscall_filter_sets[i].name);
+
+                pid = fork();
+                assert_se(pid >= 0);
+
+                if (pid == 0) { /* Child? */
+                        int fd;
+
+                        if (i == SYSCALL_FILTER_SET_DEFAULT) /* if we look at the default set, whitelist instead of blacklist */
+                                r = seccomp_load_syscall_filter_set(SCMP_ACT_ERRNO(EUCLEAN), syscall_filter_sets + i, SCMP_ACT_ALLOW);
+                        else
+                                r = seccomp_load_syscall_filter_set(SCMP_ACT_ALLOW, syscall_filter_sets + i, SCMP_ACT_ERRNO(EUCLEAN));
+                        if (r < 0)
+                                _exit(EXIT_FAILURE);
+
+                        /* Test the sycall filter with one random system call */
+                        fd = eventfd(0, EFD_NONBLOCK|EFD_CLOEXEC);
+                        if (IN_SET(i, SYSCALL_FILTER_SET_IO_EVENT, SYSCALL_FILTER_SET_DEFAULT))
+                                assert_se(fd < 0 && errno == EUCLEAN);
+                        else {
+                                assert_se(fd >= 0);
+                                safe_close(fd);
+                        }
+
+                        _exit(EXIT_SUCCESS);
+                }
+
+                assert_se(wait_for_terminate_and_warn(syscall_filter_sets[i].name, pid, true) == EXIT_SUCCESS);
+        }
+}
+
+static void test_restrict_namespace(void) {
+        _cleanup_free_ char *s = NULL;
+        unsigned long ul;
+        pid_t pid;
+
+        assert_se(namespace_flag_to_string(0) == NULL);
+        assert_se(streq(namespace_flag_to_string(CLONE_NEWNS), "mnt"));
+        assert_se(namespace_flag_to_string(CLONE_NEWNS|CLONE_NEWIPC) == NULL);
+        assert_se(streq(namespace_flag_to_string(CLONE_NEWCGROUP), "cgroup"));
+
+        assert_se(namespace_flag_from_string("mnt") == CLONE_NEWNS);
+        assert_se(namespace_flag_from_string(NULL) == 0);
+        assert_se(namespace_flag_from_string("") == 0);
+        assert_se(namespace_flag_from_string("uts") == CLONE_NEWUTS);
+        assert_se(namespace_flag_from_string(namespace_flag_to_string(CLONE_NEWUTS)) == CLONE_NEWUTS);
+        assert_se(streq(namespace_flag_to_string(namespace_flag_from_string("ipc")), "ipc"));
+
+        assert_se(namespace_flag_from_string_many(NULL, &ul) == 0 && ul == 0);
+        assert_se(namespace_flag_from_string_many("", &ul) == 0 && ul == 0);
+        assert_se(namespace_flag_from_string_many("mnt uts ipc", &ul) == 0 && ul == (CLONE_NEWNS|CLONE_NEWUTS|CLONE_NEWIPC));
+
+        assert_se(namespace_flag_to_string_many(NAMESPACE_FLAGS_ALL, &s) == 0);
+        assert_se(streq(s, "cgroup ipc net mnt pid user uts"));
+        assert_se(namespace_flag_from_string_many(s, &ul) == 0 && ul == NAMESPACE_FLAGS_ALL);
+
+        if (!is_seccomp_available())
+                return;
+        if (geteuid() != 0)
+                return;
+
+        pid = fork();
+        assert_se(pid >= 0);
+
+        if (pid == 0) {
+
+                assert_se(seccomp_restrict_namespaces(CLONE_NEWNS|CLONE_NEWNET) >= 0);
+
+                assert_se(unshare(CLONE_NEWNS) == 0);
+                assert_se(unshare(CLONE_NEWNET) == 0);
+                assert_se(unshare(CLONE_NEWUTS) == -1);
+                assert_se(errno == EPERM);
+                assert_se(unshare(CLONE_NEWIPC) == -1);
+                assert_se(errno == EPERM);
+                assert_se(unshare(CLONE_NEWNET|CLONE_NEWUTS) == -1);
+                assert_se(errno == EPERM);
+
+                /* We use fd 0 (stdin) here, which of course will fail with EINVAL on setns(). Except of course our
+                 * seccomp filter worked, and hits first and makes it return EPERM */
+                assert_se(setns(0, CLONE_NEWNS) == -1);
+                assert_se(errno == EINVAL);
+                assert_se(setns(0, CLONE_NEWNET) == -1);
+                assert_se(errno == EINVAL);
+                assert_se(setns(0, CLONE_NEWUTS) == -1);
+                assert_se(errno == EPERM);
+                assert_se(setns(0, CLONE_NEWIPC) == -1);
+                assert_se(errno == EPERM);
+                assert_se(setns(0, CLONE_NEWNET|CLONE_NEWUTS) == -1);
+                assert_se(errno == EPERM);
+                assert_se(setns(0, 0) == -1);
+                assert_se(errno == EPERM);
+
+                pid = raw_clone(CLONE_NEWNS);
+                assert_se(pid >= 0);
+                if (pid == 0)
+                        _exit(EXIT_SUCCESS);
+                pid = raw_clone(CLONE_NEWNET);
+                assert_se(pid >= 0);
+                if (pid == 0)
+                        _exit(EXIT_SUCCESS);
+                pid = raw_clone(CLONE_NEWUTS);
+                assert_se(pid < 0);
+                assert_se(errno == EPERM);
+                pid = raw_clone(CLONE_NEWIPC);
+                assert_se(pid < 0);
+                assert_se(errno == EPERM);
+                pid = raw_clone(CLONE_NEWNET|CLONE_NEWUTS);
+                assert_se(pid < 0);
+                assert_se(errno == EPERM);
+
+                _exit(EXIT_SUCCESS);
+        }
+
+        assert_se(wait_for_terminate_and_warn("nsseccomp", pid, true) == EXIT_SUCCESS);
+}
+
+static void test_protect_sysctl(void) {
+        pid_t pid;
+
+        if (!is_seccomp_available())
+                return;
+        if (geteuid() != 0)
+                return;
+
+        if (detect_container() > 0) /* in containers _sysctl() is likely missing anyway */
+                return;
+
+        pid = fork();
+        assert_se(pid >= 0);
+
+        if (pid == 0) {
+                assert_se(syscall(__NR__sysctl, NULL) < 0);
+                assert_se(errno == EFAULT);
+
+                assert_se(seccomp_protect_sysctl() >= 0);
+
+                assert_se(syscall(__NR__sysctl, 0, 0, 0) < 0);
+                assert_se(errno == EPERM);
+
+                _exit(EXIT_SUCCESS);
+        }
+
+        assert_se(wait_for_terminate_and_warn("sysctlseccomp", pid, true) == EXIT_SUCCESS);
+}
+
+static void test_restrict_address_families(void) {
+        pid_t pid;
+
+        if (!is_seccomp_available())
+                return;
+        if (geteuid() != 0)
+                return;
+
+        pid = fork();
+        assert_se(pid >= 0);
+
+        if (pid == 0) {
+                int fd;
+                Set *s;
+
+                fd = socket(AF_INET, SOCK_DGRAM, 0);
+                assert_se(fd >= 0);
+                safe_close(fd);
+
+                fd = socket(AF_UNIX, SOCK_DGRAM, 0);
+                assert_se(fd >= 0);
+                safe_close(fd);
+
+                fd = socket(AF_NETLINK, SOCK_DGRAM, 0);
+                assert_se(fd >= 0);
+                safe_close(fd);
+
+                assert_se(s = set_new(NULL));
+                assert_se(set_put(s, INT_TO_PTR(AF_UNIX)) >= 0);
+
+                assert_se(seccomp_restrict_address_families(s, false) >= 0);
+
+                fd = socket(AF_INET, SOCK_DGRAM, 0);
+                assert_se(fd >= 0);
+                safe_close(fd);
+
+                fd = socket(AF_UNIX, SOCK_DGRAM, 0);
+#if SECCOMP_RESTRICT_ADDRESS_FAMILIES_BROKEN
+                assert_se(fd >= 0);
+                safe_close(fd);
+#else
+                assert_se(fd < 0);
+                assert_se(errno == EAFNOSUPPORT);
+#endif
+
+                fd = socket(AF_NETLINK, SOCK_DGRAM, 0);
+                assert_se(fd >= 0);
+                safe_close(fd);
+
+                set_clear(s);
+
+                assert_se(set_put(s, INT_TO_PTR(AF_INET)) >= 0);
+
+                assert_se(seccomp_restrict_address_families(s, true) >= 0);
+
+                fd = socket(AF_INET, SOCK_DGRAM, 0);
+                assert_se(fd >= 0);
+                safe_close(fd);
+
+                fd = socket(AF_UNIX, SOCK_DGRAM, 0);
+#if SECCOMP_RESTRICT_ADDRESS_FAMILIES_BROKEN
+                assert_se(fd >= 0);
+                safe_close(fd);
+#else
+                assert_se(fd < 0);
+                assert_se(errno == EAFNOSUPPORT);
+#endif
+
+                fd = socket(AF_NETLINK, SOCK_DGRAM, 0);
+#if SECCOMP_RESTRICT_ADDRESS_FAMILIES_BROKEN
+                assert_se(fd >= 0);
+                safe_close(fd);
+#else
+                assert_se(fd < 0);
+                assert_se(errno == EAFNOSUPPORT);
+#endif
+
+                _exit(EXIT_SUCCESS);
+        }
+
+        assert_se(wait_for_terminate_and_warn("socketseccomp", pid, true) == EXIT_SUCCESS);
+}
+
+static void test_restrict_realtime(void) {
+        pid_t pid;
+
+        if (!is_seccomp_available())
+                return;
+        if (geteuid() != 0)
+                return;
+
+        if (detect_container() > 0) /* in containers RT privs are likely missing anyway */
+                return;
+
+        pid = fork();
+        assert_se(pid >= 0);
+
+        if (pid == 0) {
+                assert_se(sched_setscheduler(0, SCHED_FIFO, &(struct sched_param) { .sched_priority = 1 }) >= 0);
+                assert_se(sched_setscheduler(0, SCHED_RR, &(struct sched_param) { .sched_priority = 1 }) >= 0);
+                assert_se(sched_setscheduler(0, SCHED_IDLE, &(struct sched_param) { .sched_priority = 0 }) >= 0);
+                assert_se(sched_setscheduler(0, SCHED_BATCH, &(struct sched_param) { .sched_priority = 0 }) >= 0);
+                assert_se(sched_setscheduler(0, SCHED_OTHER, &(struct sched_param) {}) >= 0);
+
+                assert_se(seccomp_restrict_realtime() >= 0);
+
+                assert_se(sched_setscheduler(0, SCHED_IDLE, &(struct sched_param) { .sched_priority = 0 }) >= 0);
+                assert_se(sched_setscheduler(0, SCHED_BATCH, &(struct sched_param) { .sched_priority = 0 }) >= 0);
+                assert_se(sched_setscheduler(0, SCHED_OTHER, &(struct sched_param) {}) >= 0);
+
+                assert_se(sched_setscheduler(0, SCHED_FIFO, &(struct sched_param) { .sched_priority = 1 }) < 0);
+                assert_se(errno == EPERM);
+                assert_se(sched_setscheduler(0, SCHED_RR, &(struct sched_param) { .sched_priority = 1 }) < 0);
+                assert_se(errno == EPERM);
+
+                _exit(EXIT_SUCCESS);
+        }
+
+        assert_se(wait_for_terminate_and_warn("realtimeseccomp", pid, true) == EXIT_SUCCESS);
+}
+
+static void test_memory_deny_write_execute_mmap(void) {
+        pid_t pid;
+
+        if (!is_seccomp_available())
+                return;
+        if (geteuid() != 0)
+                return;
+
+        pid = fork();
+        assert_se(pid >= 0);
+
+        if (pid == 0) {
+                void *p;
+
+                p = mmap(NULL, page_size(), PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1,0);
+                assert_se(p != MAP_FAILED);
+                assert_se(munmap(p, page_size()) >= 0);
+
+                p = mmap(NULL, page_size(), PROT_WRITE|PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1,0);
+                assert_se(p != MAP_FAILED);
+                assert_se(munmap(p, page_size()) >= 0);
+
+                assert_se(seccomp_memory_deny_write_execute() >= 0);
+
+                p = mmap(NULL, page_size(), PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1,0);
+#if defined(__x86_64__) || defined(__i386__) || defined(__powerpc64__) || defined(__arm__) || defined(__aarch64__)
+                assert_se(p == MAP_FAILED);
+                assert_se(errno == EPERM);
+#else /* unknown architectures */
+                assert_se(p != MAP_FAILED);
+                assert_se(munmap(p, page_size()) >= 0);
+#endif
+
+                p = mmap(NULL, page_size(), PROT_WRITE|PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1,0);
+                assert_se(p != MAP_FAILED);
+                assert_se(munmap(p, page_size()) >= 0);
+
+                _exit(EXIT_SUCCESS);
+        }
+
+        assert_se(wait_for_terminate_and_warn("memoryseccomp-mmap", pid, true) == EXIT_SUCCESS);
+}
+
+static void test_memory_deny_write_execute_shmat(void) {
+        int shmid;
+        pid_t pid;
+
+        if (!is_seccomp_available())
+                return;
+        if (geteuid() != 0)
+                return;
+
+        shmid = shmget(IPC_PRIVATE, page_size(), 0);
+        assert_se(shmid >= 0);
+
+        pid = fork();
+        assert_se(pid >= 0);
+
+        if (pid == 0) {
+                void *p;
+
+                p = shmat(shmid, NULL, 0);
+                assert_se(p != MAP_FAILED);
+                assert_se(shmdt(p) == 0);
+
+                p = shmat(shmid, NULL, SHM_EXEC);
+                assert_se(p != MAP_FAILED);
+                assert_se(shmdt(p) == 0);
+
+                assert_se(seccomp_memory_deny_write_execute() >= 0);
+
+                p = shmat(shmid, NULL, SHM_EXEC);
+#if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__)
+                assert_se(p == MAP_FAILED);
+                assert_se(errno == EPERM);
+#else /* __i386__, __powerpc64__, and "unknown" architectures */
+                assert_se(p != MAP_FAILED);
+                assert_se(shmdt(p) == 0);
+#endif
+
+                p = shmat(shmid, NULL, 0);
+                assert_se(p != MAP_FAILED);
+                assert_se(shmdt(p) == 0);
+
+                _exit(EXIT_SUCCESS);
+        }
+
+        assert_se(wait_for_terminate_and_warn("memoryseccomp-shmat", pid, true) == EXIT_SUCCESS);
+}
+
+static void test_restrict_archs(void) {
+        pid_t pid;
+
+        if (!is_seccomp_available())
+                return;
+        if (geteuid() != 0)
+                return;
+
+        pid = fork();
+        assert_se(pid >= 0);
+
+        if (pid == 0) {
+                _cleanup_set_free_ Set *s = NULL;
+
+                assert_se(access("/", F_OK) >= 0);
+
+                assert_se(s = set_new(NULL));
+
+#ifdef __x86_64__
+                assert_se(set_put(s, UINT32_TO_PTR(SCMP_ARCH_X86+1)) >= 0);
+#endif
+                assert_se(seccomp_restrict_archs(s) >= 0);
+
+                assert_se(access("/", F_OK) >= 0);
+                assert_se(seccomp_restrict_archs(NULL) >= 0);
+
+                assert_se(access("/", F_OK) >= 0);
+
+                _exit(EXIT_SUCCESS);
+        }
+
+        assert_se(wait_for_terminate_and_warn("archseccomp", pid, true) == EXIT_SUCCESS);
+}
+
+static void test_load_syscall_filter_set_raw(void) {
+        pid_t pid;
+
+        if (!is_seccomp_available())
+                return;
+        if (geteuid() != 0)
+                return;
+
+        pid = fork();
+        assert_se(pid >= 0);
+
+        if (pid == 0) {
+                _cleanup_set_free_ Set *s = NULL;
+
+                assert_se(access("/", F_OK) >= 0);
+                assert_se(poll(NULL, 0, 0) == 0);
+
+                assert_se(seccomp_load_syscall_filter_set_raw(SCMP_ACT_ALLOW, NULL, SCMP_ACT_KILL) >= 0);
+                assert_se(access("/", F_OK) >= 0);
+                assert_se(poll(NULL, 0, 0) == 0);
+
+                assert_se(s = set_new(NULL));
+                assert_se(set_put(s, UINT32_TO_PTR(__NR_access + 1)) >= 0);
+
+                assert_se(seccomp_load_syscall_filter_set_raw(SCMP_ACT_ALLOW, s, SCMP_ACT_ERRNO(EUCLEAN)) >= 0);
+
+                assert_se(access("/", F_OK) < 0);
+                assert_se(errno == EUCLEAN);
+
+                assert_se(poll(NULL, 0, 0) == 0);
+
+                s = set_free(s);
+
+                assert_se(s = set_new(NULL));
+                assert_se(set_put(s, UINT32_TO_PTR(__NR_poll + 1)) >= 0);
+
+                assert_se(seccomp_load_syscall_filter_set_raw(SCMP_ACT_ALLOW, s, SCMP_ACT_ERRNO(EUNATCH)) >= 0);
+
+                assert_se(access("/", F_OK) < 0);
+                assert_se(errno == EUCLEAN);
+
+                assert_se(poll(NULL, 0, 0) < 0);
+                assert_se(errno == EUNATCH);
+
+                _exit(EXIT_SUCCESS);
+        }
+
+        assert_se(wait_for_terminate_and_warn("syscallrawseccomp", pid, true) == EXIT_SUCCESS);
+}
+
+int main(int argc, char *argv[]) {
+
+        log_set_max_level(LOG_DEBUG);
+
+        test_seccomp_arch_to_string();
+        test_architecture_table();
+        test_syscall_filter_set_find();
+        test_filter_sets();
+        test_restrict_namespace();
+        test_protect_sysctl();
+        test_restrict_address_families();
+        test_restrict_realtime();
+        test_memory_deny_write_execute_mmap();
+        test_memory_deny_write_execute_shmat();
+        test_restrict_archs();
+        test_load_syscall_filter_set_raw();
+
+        return 0;
+}
index 7545ad3..190736a 100644 (file)
@@ -35,16 +35,16 @@ static void test_testing(void) {
         b = mac_selinux_use();
         log_info("mac_selinux_use → %s", yes_no(b));
 
-        b = mac_selinux_have();
-        log_info("mac_selinux_have → %s", yes_no(b));
+        b = mac_selinux_use();
+        log_info("mac_selinux_use → %s", yes_no(b));
 
         mac_selinux_retest();
 
         b = mac_selinux_use();
         log_info("mac_selinux_use → %s", yes_no(b));
 
-        b = mac_selinux_have();
-        log_info("mac_selinux_have → %s", yes_no(b));
+        b = mac_selinux_use();
+        log_info("mac_selinux_use → %s", yes_no(b));
 }
 
 static void test_loading(void) {
@@ -56,7 +56,7 @@ static void test_loading(void) {
         n1 = now(CLOCK_MONOTONIC);
         r = mac_selinux_init();
         n2 = now(CLOCK_MONOTONIC);
-        log_info_errno(r, "mac_selinux_init → %d (%m) %.2fs", r, (n2 - n1)/1e6);
+        log_info_errno(r, "mac_selinux_init → %d %.2fs (%m)", r, (n2 - n1)/1e6);
 }
 
 static void test_cleanup(void) {
@@ -78,18 +78,18 @@ static void test_misc(const char* fname) {
         log_info("============ %s ==========", __func__);
 
         r = mac_selinux_get_our_label(&label);
-        log_info_errno(r, "mac_selinux_get_our_label → %d (%m), \"%s\"",
+        log_info_errno(r, "mac_selinux_get_our_label → %d, \"%s\" (%m)",
                        r, strnull(label));
 
         r = mac_selinux_get_create_label_from_exe(fname, &label2);
-        log_info_errno(r, "mac_selinux_create_label_from_exe → %d (%m), \"%s\"",
+        log_info_errno(r, "mac_selinux_create_label_from_exe → %d, \"%s\" (%m)",
                        r, strnull(label2));
 
         fd = socket(AF_INET, SOCK_DGRAM, 0);
         assert_se(fd >= 0);
 
         r = mac_selinux_get_child_mls_label(fd, fname, label2, &label3);
-        log_info_errno(r, "mac_selinux_get_child_mls_label → %d (%m), \"%s\"",
+        log_info_errno(r, "mac_selinux_get_child_mls_label → %d, \"%s\" (%m)",
                        r, strnull(label3));
 }
 
index 17b8174..7a4a8a6 100644 (file)
@@ -22,6 +22,9 @@
 #include "fd-util.h"
 #include "sigbus.h"
 #include "util.h"
+#ifdef HAVE_VALGRIND_VALGRIND_H
+#include <valgrind/valgrind.h>
+#endif
 
 int main(int argc, char *argv[]) {
         _cleanup_close_ int fd = -1;
@@ -29,13 +32,21 @@ int main(int argc, char *argv[]) {
         void *addr = NULL;
         uint8_t *p;
 
+#ifdef HAVE_VALGRIND_VALGRIND_H
+        if (RUNNING_ON_VALGRIND)
+                return EXIT_TEST_SKIP;
+#endif
+
+#ifdef __SANITIZE_ADDRESS__
+        return EXIT_TEST_SKIP;
+#endif
         sigbus_install();
 
         assert_se(sigbus_pop(&addr) == 0);
 
         assert_se((fd = mkostemp(template, O_RDWR|O_CREAT|O_EXCL)) >= 0);
         assert_se(unlink(template) >= 0);
-        assert_se(fallocate(fd, 0, 0, page_size() * 8) >= 0);
+        assert_se(posix_fallocate(fd, 0, page_size() * 8) >= 0);
 
         p = mmap(NULL, page_size() * 16, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
         assert_se(p != MAP_FAILED);
index 8f99a13..269adfd 100644 (file)
@@ -17,7 +17,8 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include "log.h"
+#include <stdio.h>
+
 #include "time-util.h"
 
 /* Print information about various types. Useful when diagnosing
 #pragma GCC diagnostic ignored "-Wtype-limits"
 
 #define info(t)                                                 \
-        log_info("%s → %zu bits%s", STRINGIFY(t),               \
-                 sizeof(t)*CHAR_BIT,                            \
-                 strstr(STRINGIFY(t), "signed") ? "" :          \
-                 ((t)-1 < (t)0 ? ", signed" : ", unsigned"));
+        printf("%s → %zu bits%s\n", STRINGIFY(t),               \
+               sizeof(t)*CHAR_BIT,                              \
+               strstr(STRINGIFY(t), "signed") ? "" :            \
+               ((t)-1 < (t)0 ? ", signed" : ", unsigned"));
+
+enum Enum {
+        enum_value,
+};
+
+enum BigEnum {
+        big_enum_value = UINT64_C(-1),
+};
 
 int main(void) {
         info(char);
@@ -39,6 +48,8 @@ int main(void) {
         info(unsigned);
         info(long unsigned);
         info(long long unsigned);
+        info(__syscall_ulong_t);
+        info(__syscall_slong_t);
 
         info(float);
         info(double);
@@ -48,6 +59,10 @@ int main(void) {
         info(ssize_t);
         info(time_t);
         info(usec_t);
+        info(__time_t);
+
+        info(enum Enum);
+        info(enum BigEnum);
 
         return 0;
 }
index 1f853a7..8ac1d79 100644 (file)
@@ -92,6 +92,14 @@ static void test_socket_address_parse(void) {
 
         assert_se(socket_address_parse(&a, "@abstract") >= 0);
         assert_se(a.sockaddr.sa.sa_family == AF_UNIX);
+
+        assert_se(socket_address_parse(&a, "vsock::1234") >= 0);
+        assert_se(a.sockaddr.sa.sa_family == AF_VSOCK);
+        assert_se(socket_address_parse(&a, "vsock:2:1234") >= 0);
+        assert_se(a.sockaddr.sa.sa_family == AF_VSOCK);
+        assert_se(socket_address_parse(&a, "vsock:2:1234x") < 0);
+        assert_se(socket_address_parse(&a, "vsock:2x:1234") < 0);
+        assert_se(socket_address_parse(&a, "vsock:2") < 0);
 }
 
 static void test_socket_address_parse_netlink(void) {
@@ -145,6 +153,14 @@ static void test_socket_address_equal(void) {
         assert_se(socket_address_parse_netlink(&a, "firewall") >= 0);
         assert_se(socket_address_parse_netlink(&b, "firewall") >= 0);
         assert_se(socket_address_equal(&a, &b));
+
+        assert_se(socket_address_parse(&a, "vsock:2:1234") >= 0);
+        assert_se(socket_address_parse(&b, "vsock:2:1234") >= 0);
+        assert_se(socket_address_equal(&a, &b));
+        assert_se(socket_address_parse(&b, "vsock:2:1235") >= 0);
+        assert_se(!socket_address_equal(&a, &b));
+        assert_se(socket_address_parse(&b, "vsock:3:1234") >= 0);
+        assert_se(!socket_address_equal(&a, &b));
 }
 
 static void test_socket_address_get_path(void) {
@@ -161,6 +177,9 @@ static void test_socket_address_get_path(void) {
 
         assert_se(socket_address_parse(&a, "/foo/bar") >= 0);
         assert_se(streq(socket_address_get_path(&a), "/foo/bar"));
+
+        assert_se(socket_address_parse(&a, "vsock:2:1234") >= 0);
+        assert_se(!socket_address_get_path(&a));
 }
 
 static void test_socket_address_is(void) {
@@ -408,11 +427,18 @@ static void test_sockaddr_equal(void) {
                 .in6.sin6_port = 0,
                 .in6.sin6_addr = IN6ADDR_ANY_INIT,
         };
+        union sockaddr_union e = {
+                .vm.svm_family = AF_VSOCK,
+                .vm.svm_port = 0,
+                .vm.svm_cid = VMADDR_CID_ANY,
+        };
         assert_se(sockaddr_equal(&a, &a));
         assert_se(sockaddr_equal(&a, &b));
         assert_se(sockaddr_equal(&d, &d));
+        assert_se(sockaddr_equal(&e, &e));
         assert_se(!sockaddr_equal(&a, &c));
         assert_se(!sockaddr_equal(&b, &c));
+        assert_se(!sockaddr_equal(&a, &e));
 }
 
 static void test_sockaddr_un_len(void) {
@@ -430,6 +456,23 @@ static void test_sockaddr_un_len(void) {
         assert_se(SOCKADDR_UN_LEN(abstract) == offsetof(struct sockaddr_un, sun_path) + 1 + strlen(abstract.sun_path + 1));
 }
 
+static void test_in_addr_is_multicast(void) {
+        union in_addr_union a, b;
+        int f;
+
+        assert_se(in_addr_from_string_auto("192.168.3.11", &f, &a) >= 0);
+        assert_se(in_addr_is_multicast(f, &a) == 0);
+
+        assert_se(in_addr_from_string_auto("224.0.0.1", &f, &a) >= 0);
+        assert_se(in_addr_is_multicast(f, &a) == 1);
+
+        assert_se(in_addr_from_string_auto("FF01:0:0:0:0:0:0:1", &f, &b) >= 0);
+        assert_se(in_addr_is_multicast(f, &b) == 1);
+
+        assert_se(in_addr_from_string_auto("2001:db8::c:69b:aeff:fe53:743e", &f, &b) >= 0);
+        assert_se(in_addr_is_multicast(f, &b) == 0);
+}
+
 int main(int argc, char *argv[]) {
 
         log_set_max_level(LOG_DEBUG);
@@ -456,5 +499,7 @@ int main(int argc, char *argv[]) {
 
         test_sockaddr_un_len();
 
+        test_in_addr_is_multicast();
+
         return 0;
 }
index 71ad597..9d56a71 100644 (file)
@@ -18,6 +18,7 @@
 ***/
 
 #include <fcntl.h>
+#include <linux/magic.h>
 #include <unistd.h>
 
 #include "alloc-util.h"
@@ -28,6 +29,8 @@
 #include "macro.h"
 #include "path-util.h"
 #include "rm-rf.h"
+#include "missing.h"
+#include "mount-util.h"
 #include "stat-util.h"
 #include "stdio-util.h"
 #include "string-util.h"
@@ -37,12 +40,14 @@ static void test_files_same(void) {
         char name[] = "/tmp/test-files_same.XXXXXX";
         char name_alias[] = "/tmp/test-files_same.alias";
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
         assert_se(symlink(name, name_alias) >= 0);
 
-        assert_se(files_same(name, name));
-        assert_se(files_same(name, name_alias));
+        assert_se(files_same(name, name, 0));
+        assert_se(files_same(name, name, AT_SYMLINK_NOFOLLOW));
+        assert_se(files_same(name, name_alias, 0));
+        assert_se(!files_same(name, name_alias, AT_SYMLINK_NOFOLLOW));
 
         unlink(name);
         unlink(name_alias);
@@ -53,7 +58,7 @@ static void test_is_symlink(void) {
         char name_link[] = "/tmp/test-is_symlink.link";
         _cleanup_close_ int fd = -1;
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
         assert_se(symlink(name, name_link) >= 0);
 
@@ -66,9 +71,38 @@ static void test_is_symlink(void) {
         unlink(name_link);
 }
 
+static void test_path_is_os_tree(void) {
+        assert_se(path_is_os_tree("/") > 0);
+        assert_se(path_is_os_tree("/etc") == 0);
+        assert_se(path_is_os_tree("/idontexist") == -ENOENT);
+}
+
+static void test_path_check_fstype(void) {
+        /* run might not be a mount point in build chroots */
+        if (path_is_mount_point("/run", NULL, AT_SYMLINK_FOLLOW) > 0) {
+                assert_se(path_check_fstype("/run", TMPFS_MAGIC) > 0);
+                assert_se(path_check_fstype("/run", BTRFS_SUPER_MAGIC) == 0);
+        }
+        assert_se(path_check_fstype("/proc", PROC_SUPER_MAGIC) > 0);
+        assert_se(path_check_fstype("/proc", BTRFS_SUPER_MAGIC) == 0);
+        assert_se(path_check_fstype("/proc", BTRFS_SUPER_MAGIC) == 0);
+        assert_se(path_check_fstype("/i-dont-exist", BTRFS_SUPER_MAGIC) == -ENOENT);
+}
+
+static void test_path_is_temporary_fs(void) {
+        /* run might not be a mount point in build chroots */
+        if (path_is_mount_point("/run", NULL, AT_SYMLINK_FOLLOW) > 0)
+                assert_se(path_is_temporary_fs("/run") > 0);
+        assert_se(path_is_temporary_fs("/proc") == 0);
+        assert_se(path_is_temporary_fs("/i-dont-exist") == -ENOENT);
+}
+
 int main(int argc, char *argv[]) {
         test_files_same();
         test_is_symlink();
+        test_path_is_os_tree();
+        test_path_check_fstype();
+        test_path_is_temporary_fs();
 
         return 0;
 }
index d0f84d7..4b3e924 100644 (file)
@@ -29,31 +29,20 @@ static void test_string_erase(void) {
         assert_se(streq(string_erase(x), ""));
 
         x = strdupa("1");
-        assert_se(streq(string_erase(x), "x"));
-
-        x = strdupa("12");
-        assert_se(streq(string_erase(x), "xx"));
-
-        x = strdupa("123");
-        assert_se(streq(string_erase(x), "xxx"));
-
-        x = strdupa("1234");
-        assert_se(streq(string_erase(x), "xxxx"));
-
-        x = strdupa("12345");
-        assert_se(streq(string_erase(x), "xxxxx"));
-
-        x = strdupa("123456");
-        assert_se(streq(string_erase(x), "xxxxxx"));
-
-        x = strdupa("1234567");
-        assert_se(streq(string_erase(x), "xxxxxxx"));
-
-        x = strdupa("12345678");
-        assert_se(streq(string_erase(x), "xxxxxxxx"));
+        assert_se(streq(string_erase(x), ""));
 
         x = strdupa("123456789");
-        assert_se(streq(string_erase(x), "xxxxxxxxx"));
+        assert_se(streq(string_erase(x), ""));
+
+        assert_se(x[1] == '\0');
+        assert_se(x[2] == '\0');
+        assert_se(x[3] == '\0');
+        assert_se(x[4] == '\0');
+        assert_se(x[5] == '\0');
+        assert_se(x[6] == '\0');
+        assert_se(x[7] == '\0');
+        assert_se(x[8] == '\0');
+        assert_se(x[9] == '\0');
 }
 
 static void test_ascii_strcasecmp_n(void) {
@@ -232,21 +221,25 @@ static void test_foreach_word(void) {
 }
 
 static void check(const char *test, char** expected, bool trailing) {
-        const char *word, *state;
-        size_t l;
-        int i = 0;
+        int i = 0, r;
 
         printf("<<<%s>>>\n", test);
-        FOREACH_WORD_QUOTED(word, l, test, state) {
-                _cleanup_free_ char *t = NULL;
-
-                assert_se(t = strndup(word, l));
-                assert_se(strneq(expected[i++], word, l));
-                printf("<%s>\n", t);
+        for (;;) {
+                _cleanup_free_ char *word = NULL;
+
+                r = extract_first_word(&test, &word, NULL, EXTRACT_QUOTES);
+                if (r == 0) {
+                        assert_se(!trailing);
+                        break;
+                } else if (r < 0) {
+                        assert_se(trailing);
+                        break;
+                }
+
+                assert_se(streq(word, expected[i++]));
+                printf("<%s>\n", word);
         }
-        printf("<<<%s>>>\n", state);
         assert_se(expected[i] == NULL);
-        assert_se(isempty(state) == !trailing);
 }
 
 static void test_foreach_word_quoted(void) {
index 841a367..88da69e 100644 (file)
@@ -54,6 +54,25 @@ static void test_specifier_printf(void) {
         puts(w);
 }
 
+static void test_str_in_set(void) {
+        assert_se(STR_IN_SET("x", "x", "y", "z"));
+        assert_se(!STR_IN_SET("X", "x", "y", "z"));
+        assert_se(!STR_IN_SET("", "x", "y", "z"));
+        assert_se(STR_IN_SET("x", "w", "x"));
+}
+
+static void test_strptr_in_set(void) {
+        assert_se(STRPTR_IN_SET("x", "x", "y", "z"));
+        assert_se(!STRPTR_IN_SET("X", "x", "y", "z"));
+        assert_se(!STRPTR_IN_SET("", "x", "y", "z"));
+        assert_se(STRPTR_IN_SET("x", "w", "x"));
+
+        assert_se(!STRPTR_IN_SET(NULL, "x", "y", "z"));
+        assert_se(!STRPTR_IN_SET(NULL, ""));
+        /* strv cannot contain a null, hence the result below */
+        assert_se(!STRPTR_IN_SET(NULL, NULL));
+}
+
 static const char* const input_table_multiple[] = {
         "one",
         "two",
@@ -434,9 +453,14 @@ static void test_strv_foreach_backwards(void) {
 
         assert_se(a);
 
-        STRV_FOREACH_BACKWARDS(check, a) {
+        STRV_FOREACH_BACKWARDS(check, a)
                 assert_se(streq_ptr(*check, input_table_multiple[i--]));
-        }
+
+        STRV_FOREACH_BACKWARDS(check, (char**) NULL)
+                assert_not_reached("Let's see that we check empty strv right, too.");
+
+        STRV_FOREACH_BACKWARDS(check, (char**) { NULL })
+                assert_not_reached("Let's see that we check empty strv right, too.");
 }
 
 static void test_strv_foreach_pair(void) {
@@ -703,6 +727,8 @@ static void test_strv_fnmatch(void) {
 
 int main(int argc, char *argv[]) {
         test_specifier_printf();
+        test_str_in_set();
+        test_strptr_in_set();
         test_strv_foreach();
         test_strv_foreach_backwards();
         test_strv_foreach_pair();
index 9bea770..d95945f 100644 (file)
@@ -51,6 +51,13 @@ static void test_strpcpyf(void) {
 
         assert_se(streq(target, "space left: 25. foobar"));
         assert_se(space_left == 3);
+
+        /* test overflow */
+        s = target;
+        space_left = strpcpyf(&s, 12, "00 left: %i. ", 999);
+        assert_se(streq(target, "00 left: 99"));
+        assert_se(space_left == 0);
+        assert_se(target[12] == '2');
 }
 
 static void test_strpcpyl(void) {
index 0be7492..294d219 100644 (file)
@@ -48,6 +48,7 @@
 #include "unit-name.h"
 #include "unit.h"
 #include "util.h"
+#include "virt.h"
 
 int main(int argc, char **argv) {
         test_table(architecture, ARCHITECTURE);
@@ -63,7 +64,7 @@ int main(int argc, char **argv) {
         test_table(device_state, DEVICE_STATE);
         test_table(exec_input, EXEC_INPUT);
         test_table(exec_output, EXEC_OUTPUT);
-        test_table(failure_action, FAILURE_ACTION);
+        test_table(emergency_action, EMERGENCY_ACTION);
         test_table(job_mode, JOB_MODE);
         test_table(job_result, JOB_RESULT);
         test_table(job_state, JOB_STATE);
@@ -114,6 +115,7 @@ int main(int argc, char **argv) {
         test_table(unit_load_state, UNIT_LOAD_STATE);
         test_table(unit_type, UNIT_TYPE);
         test_table(locale_variable, VARIABLE_LC);
+        test_table(virtualization, VIRTUALIZATION);
 
         test_table_sparse(object_compressed, OBJECT_COMPRESSED);
 
index 84b448a..373a1b7 100644 (file)
@@ -50,7 +50,7 @@ static void test_read_one_char(void) {
         char name[] = "/tmp/test-read_one_char.XXXXXX";
         int fd;
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
         file = fdopen(fd, "r+");
         assert_se(file);
index ee7d55c..b7a06c7 100644 (file)
@@ -17,6 +17,8 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
+#include "random-util.h"
+#include "string-util.h"
 #include "strv.h"
 #include "time-util.h"
 
@@ -41,6 +43,10 @@ static void test_parse_sec(void) {
         assert_se(u == 2500 * USEC_PER_MSEC);
         assert_se(parse_sec(".7", &u) >= 0);
         assert_se(u == 700 * USEC_PER_MSEC);
+        assert_se(parse_sec("23us", &u) >= 0);
+        assert_se(u == 23);
+        assert_se(parse_sec("23µs", &u) >= 0);
+        assert_se(u == 23);
         assert_se(parse_sec("infinity", &u) >= 0);
         assert_se(u == USEC_INFINITY);
         assert_se(parse_sec(" infinity ", &u) >= 0);
@@ -55,6 +61,19 @@ static void test_parse_sec(void) {
         assert_se(parse_sec(".3 infinity", &u) < 0);
 }
 
+static void test_parse_sec_fix_0(void) {
+        usec_t u;
+
+        assert_se(parse_sec_fix_0("5s", &u) >= 0);
+        assert_se(u == 5 * USEC_PER_SEC);
+        assert_se(parse_sec_fix_0("0s", &u) >= 0);
+        assert_se(u == 0 * USEC_PER_SEC);
+        assert_se(parse_sec_fix_0("0", &u) >= 0);
+        assert_se(u == USEC_INFINITY);
+        assert_se(parse_sec_fix_0(" 0", &u) >= 0);
+        assert_se(u == USEC_INFINITY);
+}
+
 static void test_parse_time(void) {
         usec_t u;
 
@@ -189,22 +208,192 @@ static void test_usec_add(void) {
         assert_se(usec_add(USEC_INFINITY, 2) == USEC_INFINITY);
 }
 
-static void test_usec_sub(void) {
-        assert_se(usec_sub(0, 0) == 0);
-        assert_se(usec_sub(4, 1) == 3);
-        assert_se(usec_sub(4, 4) == 0);
-        assert_se(usec_sub(4, 5) == 0);
-        assert_se(usec_sub(USEC_INFINITY-3, -3) == USEC_INFINITY);
-        assert_se(usec_sub(USEC_INFINITY-3, -3) == USEC_INFINITY);
-        assert_se(usec_sub(USEC_INFINITY-3, -4) == USEC_INFINITY);
-        assert_se(usec_sub(USEC_INFINITY-3, -5) == USEC_INFINITY);
-        assert_se(usec_sub(USEC_INFINITY, 5) == USEC_INFINITY);
+static void test_usec_sub_unsigned(void) {
+        assert_se(usec_sub_unsigned(0, 0) == 0);
+        assert_se(usec_sub_unsigned(0, 2) == 0);
+        assert_se(usec_sub_unsigned(0, USEC_INFINITY) == 0);
+        assert_se(usec_sub_unsigned(1, 0) == 1);
+        assert_se(usec_sub_unsigned(1, 1) == 0);
+        assert_se(usec_sub_unsigned(1, 2) == 0);
+        assert_se(usec_sub_unsigned(1, 3) == 0);
+        assert_se(usec_sub_unsigned(1, USEC_INFINITY) == 0);
+        assert_se(usec_sub_unsigned(USEC_INFINITY-1, 0) == USEC_INFINITY-1);
+        assert_se(usec_sub_unsigned(USEC_INFINITY-1, 1) == USEC_INFINITY-2);
+        assert_se(usec_sub_unsigned(USEC_INFINITY-1, 2) == USEC_INFINITY-3);
+        assert_se(usec_sub_unsigned(USEC_INFINITY-1, USEC_INFINITY-2) == 1);
+        assert_se(usec_sub_unsigned(USEC_INFINITY-1, USEC_INFINITY-1) == 0);
+        assert_se(usec_sub_unsigned(USEC_INFINITY-1, USEC_INFINITY) == 0);
+        assert_se(usec_sub_unsigned(USEC_INFINITY, 0) == USEC_INFINITY);
+        assert_se(usec_sub_unsigned(USEC_INFINITY, 1) == USEC_INFINITY);
+        assert_se(usec_sub_unsigned(USEC_INFINITY, 2) == USEC_INFINITY);
+        assert_se(usec_sub_unsigned(USEC_INFINITY, USEC_INFINITY) == USEC_INFINITY);
+}
+
+static void test_usec_sub_signed(void) {
+        assert_se(usec_sub_signed(0, 0) == 0);
+        assert_se(usec_sub_signed(4, 1) == 3);
+        assert_se(usec_sub_signed(4, 4) == 0);
+        assert_se(usec_sub_signed(4, 5) == 0);
+        assert_se(usec_sub_signed(USEC_INFINITY-3, -3) == USEC_INFINITY);
+        assert_se(usec_sub_signed(USEC_INFINITY-3, -3) == USEC_INFINITY);
+        assert_se(usec_sub_signed(USEC_INFINITY-3, -4) == USEC_INFINITY);
+        assert_se(usec_sub_signed(USEC_INFINITY-3, -5) == USEC_INFINITY);
+        assert_se(usec_sub_signed(USEC_INFINITY, 5) == USEC_INFINITY);
+}
+
+static void test_format_timestamp(void) {
+        unsigned i;
+
+        for (i = 0; i < 100; i++) {
+                char buf[MAX(FORMAT_TIMESTAMP_MAX, FORMAT_TIMESPAN_MAX)];
+                usec_t x, y;
+
+                random_bytes(&x, sizeof(x));
+                x = x % (2147483600 * USEC_PER_SEC) + 1;
+
+                assert_se(format_timestamp(buf, sizeof(buf), x));
+                log_info("%s", buf);
+                assert_se(parse_timestamp(buf, &y) >= 0);
+                assert_se(x / USEC_PER_SEC == y / USEC_PER_SEC);
+
+                assert_se(format_timestamp_utc(buf, sizeof(buf), x));
+                log_info("%s", buf);
+                assert_se(parse_timestamp(buf, &y) >= 0);
+                assert_se(x / USEC_PER_SEC == y / USEC_PER_SEC);
+
+                assert_se(format_timestamp_us(buf, sizeof(buf), x));
+                log_info("%s", buf);
+                assert_se(parse_timestamp(buf, &y) >= 0);
+                assert_se(x == y);
+
+                assert_se(format_timestamp_us_utc(buf, sizeof(buf), x));
+                log_info("%s", buf);
+                assert_se(parse_timestamp(buf, &y) >= 0);
+                assert_se(x == y);
+
+                assert_se(format_timestamp_relative(buf, sizeof(buf), x));
+                log_info("%s", buf);
+                assert_se(parse_timestamp(buf, &y) >= 0);
+
+                /* The two calls above will run with a slightly different local time. Make sure we are in the same
+                 * range however, but give enough leeway that this is unlikely to explode. And of course,
+                 * format_timestamp_relative() scales the accuracy with the distance from the current time up to one
+                 * month, cover for that too. */
+                assert_se(y > x ? y - x : x - y <= USEC_PER_MONTH + USEC_PER_DAY);
+        }
+}
+
+static void test_format_timestamp_utc_one(usec_t t, const char *result) {
+        char buf[FORMAT_TIMESTAMP_MAX];
+
+        assert_se(!format_timestamp_utc(buf, sizeof(buf), t) == !result);
+
+        if (result)
+                assert_se(streq(result, buf));
+}
+
+static void test_format_timestamp_utc(void) {
+        test_format_timestamp_utc_one(0, NULL);
+        test_format_timestamp_utc_one(1, "Thu 1970-01-01 00:00:00 UTC");
+        test_format_timestamp_utc_one(USEC_PER_SEC, "Thu 1970-01-01 00:00:01 UTC");
+
+#if SIZEOF_TIME_T == 8
+        test_format_timestamp_utc_one(USEC_TIMESTAMP_FORMATTABLE_MAX, "Thu 9999-12-30 23:59:59 UTC");
+#elif SIZEOF_TIME_T == 4
+        test_format_timestamp_utc_one(USEC_TIMESTAMP_FORMATTABLE_MAX, "Tue 2038-01-19 03:14:07 UTC");
+#endif
+
+        test_format_timestamp_utc_one(USEC_TIMESTAMP_FORMATTABLE_MAX+1, NULL);
+        test_format_timestamp_utc_one(USEC_INFINITY, NULL);
+}
+
+static void test_dual_timestamp_deserialize(void) {
+        int r;
+        dual_timestamp t;
+
+        r = dual_timestamp_deserialize("1234 5678", &t);
+        assert_se(r == 0);
+        assert_se(t.realtime == 1234);
+        assert_se(t.monotonic == 5678);
+
+        r = dual_timestamp_deserialize("1234x 5678", &t);
+        assert_se(r == -EINVAL);
+
+        r = dual_timestamp_deserialize("1234 5678y", &t);
+        assert_se(r == -EINVAL);
+
+        r = dual_timestamp_deserialize("-1234 5678", &t);
+        assert_se(r == -EINVAL);
+
+        r = dual_timestamp_deserialize("1234 -5678", &t);
+        assert_se(r == -EINVAL);
+
+        /* Check that output wasn't modified. */
+        assert_se(t.realtime == 1234);
+        assert_se(t.monotonic == 5678);
+
+        r = dual_timestamp_deserialize("+123 567", &t);
+        assert_se(r == 0);
+        assert_se(t.realtime == 123);
+        assert_se(t.monotonic == 567);
+
+        /* Check that we get "infinity" on overflow. */
+        r = dual_timestamp_deserialize("18446744073709551617 0", &t);
+        assert_se(r == 0);
+        assert_se(t.realtime == USEC_INFINITY);
+        assert_se(t.monotonic == 0);
+}
+
+static void assert_similar(usec_t a, usec_t b) {
+        usec_t d;
+
+        if (a > b)
+                d = a - b;
+        else
+                d = b - a;
+
+        assert(d < 10*USEC_PER_SEC);
+}
+
+static void test_usec_shift_clock(void) {
+        usec_t rt, mn, bt;
+
+        rt = now(CLOCK_REALTIME);
+        mn = now(CLOCK_MONOTONIC);
+        bt = now(clock_boottime_or_monotonic());
+
+        assert_se(usec_shift_clock(USEC_INFINITY, CLOCK_REALTIME, CLOCK_MONOTONIC) == USEC_INFINITY);
+
+        assert_similar(usec_shift_clock(rt + USEC_PER_HOUR, CLOCK_REALTIME, CLOCK_MONOTONIC), mn + USEC_PER_HOUR);
+        assert_similar(usec_shift_clock(rt + 2*USEC_PER_HOUR, CLOCK_REALTIME, clock_boottime_or_monotonic()), bt + 2*USEC_PER_HOUR);
+        assert_se(usec_shift_clock(rt + 3*USEC_PER_HOUR, CLOCK_REALTIME, CLOCK_REALTIME_ALARM) == rt + 3*USEC_PER_HOUR);
+
+        assert_similar(usec_shift_clock(mn + 4*USEC_PER_HOUR, CLOCK_MONOTONIC, CLOCK_REALTIME_ALARM), rt + 4*USEC_PER_HOUR);
+        assert_similar(usec_shift_clock(mn + 5*USEC_PER_HOUR, CLOCK_MONOTONIC, clock_boottime_or_monotonic()), bt + 5*USEC_PER_HOUR);
+        assert_se(usec_shift_clock(mn + 6*USEC_PER_HOUR, CLOCK_MONOTONIC, CLOCK_MONOTONIC) == mn + 6*USEC_PER_HOUR);
+
+        assert_similar(usec_shift_clock(bt + 7*USEC_PER_HOUR, clock_boottime_or_monotonic(), CLOCK_MONOTONIC), mn + 7*USEC_PER_HOUR);
+        assert_similar(usec_shift_clock(bt + 8*USEC_PER_HOUR, clock_boottime_or_monotonic(), CLOCK_REALTIME_ALARM), rt + 8*USEC_PER_HOUR);
+        assert_se(usec_shift_clock(bt + 9*USEC_PER_HOUR, clock_boottime_or_monotonic(), clock_boottime_or_monotonic()) == bt + 9*USEC_PER_HOUR);
+
+        if (mn > USEC_PER_MINUTE) {
+                assert_similar(usec_shift_clock(rt - 30 * USEC_PER_SEC, CLOCK_REALTIME_ALARM, CLOCK_MONOTONIC), mn - 30 * USEC_PER_SEC);
+                assert_similar(usec_shift_clock(rt - 50 * USEC_PER_SEC, CLOCK_REALTIME, clock_boottime_or_monotonic()), bt - 50 * USEC_PER_SEC);
+        }
 }
 
 int main(int argc, char *argv[]) {
         uintmax_t x;
 
+        log_info("realtime=" USEC_FMT "\n"
+                 "monotonic=" USEC_FMT "\n"
+                 "boottime=" USEC_FMT "\n",
+                 now(CLOCK_REALTIME),
+                 now(CLOCK_MONOTONIC),
+                 now(clock_boottime_or_monotonic()));
+
         test_parse_sec();
+        test_parse_sec_fix_0();
         test_parse_time();
         test_parse_nsec();
         test_format_timespan(1);
@@ -213,7 +402,12 @@ int main(int argc, char *argv[]) {
         test_timezone_is_valid();
         test_get_timezones();
         test_usec_add();
-        test_usec_sub();
+        test_usec_sub_signed();
+        test_usec_sub_unsigned();
+        test_format_timestamp();
+        test_format_timestamp_utc();
+        test_dual_timestamp_deserialize();
+        test_usec_shift_clock();
 
         /* Ensure time_t is signed */
         assert_cc((time_t) -1 < (time_t) 1);
index b34ebee..a7c86d1 100644 (file)
@@ -25,7 +25,7 @@
 #include "alloc-util.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "log.h"
 #include "string-util.h"
@@ -51,7 +51,7 @@ int main(int argc, char** argv) {
         log_debug("link1: %s", ans);
         assert_se(endswith(ans, " (deleted)"));
 
-        fd2 = mkostemp_safe(pattern, O_RDWR|O_CLOEXEC);
+        fd2 = mkostemp_safe(pattern);
         assert_se(fd >= 0);
         assert_se(unlink(pattern) == 0);
 
index e965b44..c84bd89 100644 (file)
@@ -88,7 +88,7 @@ int main(int argc, char *argv[]) {
         if (udev == NULL)
                 return EXIT_FAILURE;
 
-        log_debug("version %s", VERSION);
+        log_debug("version %s", PACKAGE_VERSION);
         mac_selinux_init();
 
         action = argv[1];
index ade0ff2..fd797b5 100644 (file)
@@ -56,12 +56,12 @@ static int test_unit_file_get_set(void) {
         r = unit_file_get_list(UNIT_FILE_SYSTEM, NULL, h, NULL, NULL);
 
         if (r == -EPERM || r == -EACCES) {
-                printf("Skipping test: unit_file_get_list: %s", strerror(-r));
+                log_notice_errno(r, "Skipping test: unit_file_get_list: %m");
                 return EXIT_TEST_SKIP;
         }
 
-        log_full(r == 0 ? LOG_INFO : LOG_ERR,
-                 "unit_file_get_list: %s", strerror(-r));
+        log_full_errno(r == 0 ? LOG_INFO : LOG_ERR, r,
+                       "unit_file_get_list: %m");
         if (r < 0)
                 return EXIT_FAILURE;
 
@@ -117,7 +117,7 @@ static void test_config_parse_exec(void) {
 
         r = manager_new(UNIT_FILE_USER, true, &m);
         if (MANAGER_SKIP_TEST(r)) {
-                printf("Skipping test: manager_new: %s\n", strerror(-r));
+                log_notice_errno(r, "Skipping test: manager_new: %m");
                 return;
         }
 
@@ -146,7 +146,7 @@ static void test_config_parse_exec(void) {
         r = config_parse_exec(NULL, "fake", 4, "section", 1,
                               "LValue", 0, "/RValue/ argv0 r1",
                               &c, u);
-        assert_se(r == 0);
+        assert_se(r == -ENOEXEC);
         assert_se(c1->command_next == NULL);
 
         log_info("/* honour_argv0 */");
@@ -161,7 +161,7 @@ static void test_config_parse_exec(void) {
         r = config_parse_exec(NULL, "fake", 3, "section", 1,
                               "LValue", 0, "@/RValue",
                               &c, u);
-        assert_se(r == 0);
+        assert_se(r == -ENOEXEC);
         assert_se(c1->command_next == NULL);
 
         log_info("/* no command, whitespace only, reset */");
@@ -220,7 +220,7 @@ static void test_config_parse_exec(void) {
                               "-@/RValue argv0 r1 ; ; "
                               "/goo/goo boo",
                               &c, u);
-        assert_se(r >= 0);
+        assert_se(r == -ENOEXEC);
         c1 = c1->command_next;
         check_execcommand(c1, "/RValue", "argv0", "r1", NULL, true);
 
@@ -374,7 +374,7 @@ static void test_config_parse_exec(void) {
                 r = config_parse_exec(NULL, "fake", 4, "section", 1,
                                       "LValue", 0, path,
                                       &c, u);
-                assert_se(r == 0);
+                assert_se(r == -ENOEXEC);
                 assert_se(c1->command_next == NULL);
         }
 
@@ -401,21 +401,21 @@ static void test_config_parse_exec(void) {
         r = config_parse_exec(NULL, "fake", 4, "section", 1,
                               "LValue", 0, "/path\\",
                               &c, u);
-        assert_se(r == 0);
+        assert_se(r == -ENOEXEC);
         assert_se(c1->command_next == NULL);
 
         log_info("/* missing ending ' */");
         r = config_parse_exec(NULL, "fake", 4, "section", 1,
                               "LValue", 0, "/path 'foo",
                               &c, u);
-        assert_se(r == 0);
+        assert_se(r == -ENOEXEC);
         assert_se(c1->command_next == NULL);
 
         log_info("/* missing ending ' with trailing backslash */");
         r = config_parse_exec(NULL, "fake", 4, "section", 1,
                               "LValue", 0, "/path 'foo\\",
                               &c, u);
-        assert_se(r == 0);
+        assert_se(r == -ENOEXEC);
         assert_se(c1->command_next == NULL);
 
         log_info("/* invalid space between modifiers */");
@@ -485,7 +485,7 @@ static void test_load_env_file_1(void) {
         char name[] = "/tmp/test-load-env-file.XXXXXX";
         _cleanup_close_ int fd;
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
         assert_se(write(fd, env_file_1, sizeof(env_file_1)) == sizeof(env_file_1));
 
@@ -508,7 +508,7 @@ static void test_load_env_file_2(void) {
         char name[] = "/tmp/test-load-env-file.XXXXXX";
         _cleanup_close_ int fd;
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
         assert_se(write(fd, env_file_2, sizeof(env_file_2)) == sizeof(env_file_2));
 
@@ -526,7 +526,7 @@ static void test_load_env_file_3(void) {
         char name[] = "/tmp/test-load-env-file.XXXXXX";
         _cleanup_close_ int fd;
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
         assert_se(write(fd, env_file_3, sizeof(env_file_3)) == sizeof(env_file_3));
 
@@ -542,7 +542,7 @@ static void test_load_env_file_4(void) {
         _cleanup_close_ int fd;
         int r;
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
         assert_se(write(fd, env_file_4, sizeof(env_file_4)) == sizeof(env_file_4));
 
@@ -562,7 +562,7 @@ static void test_load_env_file_5(void) {
         char name[] = "/tmp/test-load-env-file.XXXXXX";
         _cleanup_close_ int fd;
 
-        fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC);
+        fd = mkostemp_safe(name);
         assert_se(fd >= 0);
         assert_se(write(fd, env_file_5, sizeof(env_file_5)) == sizeof(env_file_5));
 
@@ -589,7 +589,7 @@ static void test_install_printf(void) {
         assert_se(specifier_machine_id('m', NULL, NULL, &mid) >= 0 && mid);
         assert_se(specifier_boot_id('b', NULL, NULL, &bid) >= 0 && bid);
         assert_se((host = gethostname_malloc()));
-        assert_se((user = getusername_malloc()));
+        assert_se((user = uid_to_name(getuid())));
         assert_se(asprintf(&uid, UID_FMT, getuid()) >= 0);
 
 #define expect(src, pattern, result)                                    \
index 8d1ec19..2a344a9 100644 (file)
@@ -61,6 +61,88 @@ static void test_uid_ptr(void) {
         assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
 }
 
+static void test_valid_user_group_name(void) {
+        assert_se(!valid_user_group_name(NULL));
+        assert_se(!valid_user_group_name(""));
+        assert_se(!valid_user_group_name("1"));
+        assert_se(!valid_user_group_name("65535"));
+        assert_se(!valid_user_group_name("-1"));
+        assert_se(!valid_user_group_name("-kkk"));
+        assert_se(!valid_user_group_name("rööt"));
+        assert_se(!valid_user_group_name("."));
+        assert_se(!valid_user_group_name("eff.eff"));
+        assert_se(!valid_user_group_name("foo\nbar"));
+        assert_se(!valid_user_group_name("0123456789012345678901234567890123456789"));
+        assert_se(!valid_user_group_name_or_id("aaa:bbb"));
+
+        assert_se(valid_user_group_name("root"));
+        assert_se(valid_user_group_name("lennart"));
+        assert_se(valid_user_group_name("LENNART"));
+        assert_se(valid_user_group_name("_kkk"));
+        assert_se(valid_user_group_name("kkk-"));
+        assert_se(valid_user_group_name("kk-k"));
+
+        assert_se(valid_user_group_name("some5"));
+        assert_se(!valid_user_group_name("5some"));
+        assert_se(valid_user_group_name("INNER5NUMBER"));
+}
+
+static void test_valid_user_group_name_or_id(void) {
+        assert_se(!valid_user_group_name_or_id(NULL));
+        assert_se(!valid_user_group_name_or_id(""));
+        assert_se(valid_user_group_name_or_id("0"));
+        assert_se(valid_user_group_name_or_id("1"));
+        assert_se(valid_user_group_name_or_id("65534"));
+        assert_se(!valid_user_group_name_or_id("65535"));
+        assert_se(valid_user_group_name_or_id("65536"));
+        assert_se(!valid_user_group_name_or_id("-1"));
+        assert_se(!valid_user_group_name_or_id("-kkk"));
+        assert_se(!valid_user_group_name_or_id("rööt"));
+        assert_se(!valid_user_group_name_or_id("."));
+        assert_se(!valid_user_group_name_or_id("eff.eff"));
+        assert_se(!valid_user_group_name_or_id("foo\nbar"));
+        assert_se(!valid_user_group_name_or_id("0123456789012345678901234567890123456789"));
+        assert_se(!valid_user_group_name_or_id("aaa:bbb"));
+
+        assert_se(valid_user_group_name_or_id("root"));
+        assert_se(valid_user_group_name_or_id("lennart"));
+        assert_se(valid_user_group_name_or_id("LENNART"));
+        assert_se(valid_user_group_name_or_id("_kkk"));
+        assert_se(valid_user_group_name_or_id("kkk-"));
+        assert_se(valid_user_group_name_or_id("kk-k"));
+
+        assert_se(valid_user_group_name_or_id("some5"));
+        assert_se(!valid_user_group_name_or_id("5some"));
+        assert_se(valid_user_group_name_or_id("INNER5NUMBER"));
+}
+
+static void test_valid_gecos(void) {
+
+        assert_se(!valid_gecos(NULL));
+        assert_se(valid_gecos(""));
+        assert_se(valid_gecos("test"));
+        assert_se(valid_gecos("Ümläüt"));
+        assert_se(!valid_gecos("In\nvalid"));
+        assert_se(!valid_gecos("In:valid"));
+}
+
+static void test_valid_home(void) {
+
+        assert_se(!valid_home(NULL));
+        assert_se(!valid_home(""));
+        assert_se(!valid_home("."));
+        assert_se(!valid_home("/home/.."));
+        assert_se(!valid_home("/home/../"));
+        assert_se(!valid_home("/home\n/foo"));
+        assert_se(!valid_home("./piep"));
+        assert_se(!valid_home("piep"));
+        assert_se(!valid_home("/home/user:lennart"));
+
+        assert_se(valid_home("/"));
+        assert_se(valid_home("/home"));
+        assert_se(valid_home("/home/foo"));
+}
+
 int main(int argc, char*argv[]) {
 
         test_uid_to_name_one(0, "root");
@@ -75,5 +157,10 @@ int main(int argc, char*argv[]) {
         test_parse_uid();
         test_uid_ptr();
 
+        test_valid_user_group_name();
+        test_valid_user_group_name_or_id();
+        test_valid_gecos();
+        test_valid_home();
+
         return 0;
 }
index 1b5cba8..f8bf0cb 100644 (file)
@@ -195,50 +195,6 @@ static void test_log2i(void) {
         assert_se(log2i(INT_MAX) == sizeof(int)*8-2);
 }
 
-static void test_execute_directory(void) {
-        char template_lo[] = "/tmp/test-readlink_and_make_absolute-lo.XXXXXXX";
-        char template_hi[] = "/tmp/test-readlink_and_make_absolute-hi.XXXXXXX";
-        const char * dirs[] = {template_hi, template_lo, NULL};
-        const char *name, *name2, *name3, *overridden, *override, *masked, *mask;
-
-        assert_se(mkdtemp(template_lo));
-        assert_se(mkdtemp(template_hi));
-
-        name = strjoina(template_lo, "/script");
-        name2 = strjoina(template_hi, "/script2");
-        name3 = strjoina(template_lo, "/useless");
-        overridden = strjoina(template_lo, "/overridden");
-        override = strjoina(template_hi, "/overridden");
-        masked = strjoina(template_lo, "/masked");
-        mask = strjoina(template_hi, "/masked");
-
-        assert_se(write_string_file(name, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works", WRITE_STRING_FILE_CREATE) == 0);
-        assert_se(write_string_file(name2, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/it_works2", WRITE_STRING_FILE_CREATE) == 0);
-        assert_se(write_string_file(overridden, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE) == 0);
-        assert_se(write_string_file(override, "#!/bin/sh\necho 'Executing '$0", WRITE_STRING_FILE_CREATE) == 0);
-        assert_se(write_string_file(masked, "#!/bin/sh\necho 'Executing '$0\ntouch $(dirname $0)/failed", WRITE_STRING_FILE_CREATE) == 0);
-        assert_se(symlink("/dev/null", mask) == 0);
-        assert_se(chmod(name, 0755) == 0);
-        assert_se(chmod(name2, 0755) == 0);
-        assert_se(chmod(overridden, 0755) == 0);
-        assert_se(chmod(override, 0755) == 0);
-        assert_se(chmod(masked, 0755) == 0);
-        assert_se(touch(name3) >= 0);
-
-        execute_directories(dirs, DEFAULT_TIMEOUT_USEC, NULL);
-
-        assert_se(chdir(template_lo) == 0);
-        assert_se(access("it_works", F_OK) >= 0);
-        assert_se(access("failed", F_OK) < 0);
-
-        assert_se(chdir(template_hi) == 0);
-        assert_se(access("it_works2", F_OK) >= 0);
-        assert_se(access("failed", F_OK) < 0);
-
-        (void) rm_rf(template_lo, REMOVE_ROOT|REMOVE_PHYSICAL);
-        (void) rm_rf(template_hi, REMOVE_ROOT|REMOVE_PHYSICAL);
-}
-
 static void test_raw_clone(void) {
         pid_t parent, pid, pid2;
 
@@ -359,7 +315,6 @@ int main(int argc, char *argv[]) {
         test_protect_errno();
         test_in_set();
         test_log2i();
-        test_execute_directory();
         test_raw_clone();
         test_physical_memory();
         test_physical_memory_scale();
diff --git a/src/timedate/meson.build b/src/timedate/meson.build
new file mode 100644 (file)
index 0000000..63124d6
--- /dev/null
@@ -0,0 +1,14 @@
+if conf.get('ENABLE_TIMEDATED', false)
+        install_data('org.freedesktop.timedate1.conf',
+                     install_dir : dbuspolicydir)
+        install_data('org.freedesktop.timedate1.service',
+                     install_dir : dbussystemservicedir)
+
+        custom_target(
+                'org.freedesktop.timedate1.policy',
+                input : 'org.freedesktop.timedate1.policy.in',
+                output : 'org.freedesktop.timedate1.policy',
+                command : intltool_command,
+                install : install_polkit,
+                install_dir : polkitpolicydir)
+endif
index 553ef67..281b153 100644 (file)
@@ -165,6 +165,8 @@ static int show_status(sd_bus *bus, char **args, unsigned n) {
                 { "RTCTimeUSec",     "t", NULL, offsetof(StatusInfo, rtc_time) },
                 {}
         };
+
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         int r;
 
         assert(bus);
@@ -173,9 +175,10 @@ static int show_status(sd_bus *bus, char **args, unsigned n) {
                                    "org.freedesktop.timedate1",
                                    "/org/freedesktop/timedate1",
                                    map,
+                                   &error,
                                    &info);
         if (r < 0)
-                return log_error_errno(r, "Failed to query server: %m");
+                return log_error_errno(r, "Failed to query server: %s", bus_error_message(&error, r));
 
         print_status_info(&info);
 
index ffec609..1061b09 100644 (file)
@@ -413,7 +413,7 @@ static int method_set_timezone(sd_bus_message *m, void *userdata, sd_bus_error *
         }
 
         log_struct(LOG_INFO,
-                   LOG_MESSAGE_ID(SD_MESSAGE_TIMEZONE_CHANGE),
+                   "MESSAGE_ID=" SD_MESSAGE_TIMEZONE_CHANGE_STR,
                    "TIMEZONE=%s", c->zone,
                    LOG_MESSAGE("Changed time zone to '%s'.", c->zone),
                    NULL);
@@ -591,7 +591,7 @@ static int method_set_time(sd_bus_message *m, void *userdata, sd_bus_error *erro
         clock_set_hwclock(tm);
 
         log_struct(LOG_INFO,
-                   LOG_MESSAGE_ID(SD_MESSAGE_TIME_CHANGE),
+                   "MESSAGE_ID=" SD_MESSAGE_TIME_CHANGE_STR,
                    "REALTIME="USEC_FMT, timespec_load(&ts),
                    LOG_MESSAGE("Changed local time to %s", ctime(&ts.tv_sec)),
                    NULL);
@@ -637,7 +637,7 @@ static int method_set_ntp(sd_bus_message *m, void *userdata, sd_bus_error *error
                 return r;
 
         c->use_ntp = enabled;
-        log_info("Set NTP to %s", enabled ? "enabled" : "disabled");
+        log_info("Set NTP to %sd", enable_disable(enabled));
 
         (void) sd_bus_emit_properties_changed(sd_bus_message_get_bus(m), "/org/freedesktop/timedate1", "org.freedesktop.timedate1", "NTP", NULL);
 
diff --git a/src/timesync/meson.build b/src/timesync/meson.build
new file mode 100644 (file)
index 0000000..4391afa
--- /dev/null
@@ -0,0 +1,42 @@
+systemd_timesyncd_sources = files('''
+        timesyncd.c
+        timesyncd-manager.c
+        timesyncd-manager.h
+        timesyncd-conf.c
+        timesyncd-conf.h
+        timesyncd-server.c
+        timesyncd-server.h
+'''.split())
+
+timesyncd_gperf_c = custom_target(
+        'timesyncd-gperf.c',
+        input : 'timesyncd-gperf.gperf',
+        output : 'timesyncd-gperf.c',
+        command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@'])
+
+systemd_timesyncd_sources += [timesyncd_gperf_c]
+
+if conf.get('ENABLE_TIMESYNCD', false)
+        timesyncd_conf = configure_file(
+                input : 'timesyncd.conf.in',
+                output : 'timesyncd.conf',
+                configuration : substs)
+        install_data(timesyncd_conf,
+                     install_dir : pkgsysconfdir)
+endif
+
+############################################################
+
+tests += [
+        [['src/timesync/test-timesync.c',
+          'src/timesync/timesyncd-manager.c',
+          'src/timesync/timesyncd-manager.h',
+          'src/timesync/timesyncd-conf.c',
+          'src/timesync/timesyncd-conf.h',
+          'src/timesync/timesyncd-server.c',
+          'src/timesync/timesyncd-server.h',
+          timesyncd_gperf_c],
+         [libshared],
+         [libm],
+         'ENABLE_TIMESYNCD'],
+]
diff --git a/src/timesync/test-timesync.c b/src/timesync/test-timesync.c
new file mode 100644 (file)
index 0000000..a5a3433
--- /dev/null
@@ -0,0 +1,51 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2017 Zbigniew Jędrzejewski-Szmek
+
+  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/>.
+***/
+
+/* Some unit tests for the helper functions in timesyncd. */
+
+#include "log.h"
+#include "macro.h"
+#include "timesyncd-conf.h"
+
+static void test_manager_parse_string(void) {
+        /* Make sure that NTP_SERVERS is configured to something
+         * that we can actually parse successfully. */
+
+        _cleanup_(manager_freep) Manager *m = NULL;
+
+        assert_se(manager_new(&m) == 0);
+
+        assert_se(!m->have_fallbacks);
+        assert_se(manager_parse_server_string(m, SERVER_FALLBACK, NTP_SERVERS) == 0);
+        assert_se(m->have_fallbacks);
+        assert_se(manager_parse_fallback_string(m, NTP_SERVERS) == 0);
+
+        assert_se(manager_parse_server_string(m, SERVER_SYSTEM, "time1.foobar.com time2.foobar.com") == 0);
+        assert_se(manager_parse_server_string(m, SERVER_FALLBACK, "time1.foobar.com time2.foobar.com") == 0);
+        assert_se(manager_parse_server_string(m, SERVER_LINK, "time1.foobar.com time2.foobar.com") == 0);
+}
+
+int main(int argc, char **argv) {
+        log_set_max_level(LOG_DEBUG);
+        log_parse_environment();
+
+        test_manager_parse_string();
+
+        return 0;
+}
index 20c64a3..f394d0a 100644 (file)
@@ -34,6 +34,9 @@ int manager_parse_server_string(Manager *m, ServerType type, const char *string)
 
         first = type == SERVER_FALLBACK ? m->fallback_servers : m->system_servers;
 
+        if (type == SERVER_FALLBACK)
+                 m->have_fallbacks = true;
+
         for (;;) {
                 _cleanup_free_ char *word = NULL;
                 bool found = false;
@@ -63,6 +66,13 @@ int manager_parse_server_string(Manager *m, ServerType type, const char *string)
         return 0;
 }
 
+int manager_parse_fallback_string(Manager *m, const char *string) {
+        if (m->have_fallbacks)
+                return 0;
+
+        return manager_parse_server_string(m, SERVER_FALLBACK, string);
+}
+
 int config_parse_servers(
                 const char *unit,
                 const char *filename,
@@ -98,9 +108,9 @@ int config_parse_servers(
 int manager_parse_config_file(Manager *m) {
         assert(m);
 
-        return config_parse_many(PKGSYSCONFDIR "/timesyncd.conf",
-                                 CONF_PATHS_NULSTR("systemd/timesyncd.conf.d"),
-                                 "Time\0",
-                                 config_item_perf_lookup, timesyncd_gperf_lookup,
-                                 false, m);
+        return config_parse_many_nulstr(PKGSYSCONFDIR "/timesyncd.conf",
+                                        CONF_PATHS_NULSTR("systemd/timesyncd.conf.d"),
+                                        "Time\0",
+                                        config_item_perf_lookup, timesyncd_gperf_lookup,
+                                        false, m);
 }
index cba0724..0c4b44e 100644 (file)
 #include "conf-parser.h"
 #include "timesyncd-manager.h"
 
-const struct ConfigPerfItem* timesyncd_gperf_lookup(const char *key, unsigned length);
+const struct ConfigPerfItem* timesyncd_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
 
 int manager_parse_server_string(Manager *m, ServerType type, const char *string);
 
 int config_parse_servers(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 
 int manager_parse_config_file(Manager *m);
+int manager_parse_fallback_string(Manager *m, const char *string);
index d5e16db..a24c821 100644 (file)
@@ -330,11 +330,13 @@ static int manager_adjust_clock(Manager *m, double offset, int leap_sec) {
                 tmx.esterror = 0;
                 log_debug("  adjust (slew): %+.3f sec", offset);
         } else {
-                tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_SETOFFSET;
+                tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_SETOFFSET | ADJ_MAXERROR | ADJ_ESTERROR;
 
                 /* ADJ_NANO uses nanoseconds in the microseconds field */
                 tmx.time.tv_sec = (long)offset;
                 tmx.time.tv_usec = (offset - tmx.time.tv_sec) * NSEC_PER_SEC;
+                tmx.maxerror = 0;
+                tmx.esterror = 0;
 
                 /* the kernel expects -0.3s as {-1, 7000.000.000} */
                 if (tmx.time.tv_usec < 0) {
@@ -376,12 +378,12 @@ static int manager_adjust_clock(Manager *m, double offset, int leap_sec) {
         m->drift_ppm = tmx.freq / 65536;
 
         log_debug("  status       : %04i %s\n"
-                  "  time now     : %li.%03llu\n"
-                  "  constant     : %li\n"
+                  "  time now     : %"PRI_TIME".%03"PRI_USEC"\n"
+                  "  constant     : %"PRI_TIMEX"\n"
                   "  offset       : %+.3f sec\n"
-                  "  freq offset  : %+li (%i ppm)\n",
+                  "  freq offset  : %+"PRI_TIMEX" (%i ppm)\n",
                   tmx.status, tmx.status & STA_UNSYNC ? "unsync" : "sync",
-                  tmx.time.tv_sec, (unsigned long long) (tmx.time.tv_usec / NSEC_PER_MSEC),
+                  tmx.time.tv_sec, tmx.time.tv_usec / NSEC_PER_MSEC,
                   tmx.constant,
                   (double)tmx.offset / NSEC_PER_SEC,
                   tmx.freq, m->drift_ppm);
@@ -1122,10 +1124,6 @@ int manager_new(Manager **ret) {
 
         RATELIMIT_INIT(m->ratelimit, RATELIMIT_INTERVAL_USEC, RATELIMIT_BURST);
 
-        r = manager_parse_server_string(m, SERVER_FALLBACK, NTP_SERVERS);
-        if (r < 0)
-                return r;
-
         r = sd_event_default(&m->event);
         if (r < 0)
                 return r;
index efe3e60..cf681f6 100644 (file)
@@ -38,6 +38,8 @@ struct Manager {
         LIST_HEAD(ServerName, link_servers);
         LIST_HEAD(ServerName, fallback_servers);
 
+        bool have_fallbacks:1;
+
         RateLimit ratelimit;
         bool exhausted_servers;
 
index 6bda86f..57a7bf2 100644 (file)
@@ -61,8 +61,7 @@ ServerAddress* server_address_free(ServerAddress *a) {
                         manager_set_server_address(a->name->manager, NULL);
         }
 
-        free(a);
-        return NULL;
+        return mfree(a);
 }
 
 int server_name_new(
@@ -137,9 +136,7 @@ ServerName *server_name_free(ServerName *n) {
         log_debug("Removed server %s.", n->string);
 
         free(n->string);
-        free(n);
-
-        return NULL;
+        return mfree(n);
 }
 
 void server_name_flush_addresses(ServerName *n) {
index b67d672..ff90f04 100644 (file)
@@ -132,6 +132,12 @@ int main(int argc, char *argv[]) {
         if (r < 0)
                 log_warning_errno(r, "Failed to parse configuration file: %m");
 
+        r = manager_parse_fallback_string(m, NTP_SERVERS);
+        if (r < 0) {
+                log_error_errno(r, "Failed to parse fallback server strings: %m");
+                goto finish;
+        }
+
         log_debug("systemd-timesyncd running as pid " PID_FMT, getpid());
         sd_notify(false,
                   "READY=1\n"
index 954f4aa..9419c99 100644 (file)
@@ -18,7 +18,6 @@
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <fnmatch.h>
 #include "conf-files.h"
 #include "copy.h"
 #include "def.h"
+#include "dirent-util.h"
 #include "escape.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "glob-util.h"
 #include "io-util.h"
@@ -380,12 +380,12 @@ static int dir_cleanup(
         bool deleted = false;
         int r = 0;
 
-        while ((dent = readdir(d))) {
+        FOREACH_DIRENT_ALL(dent, d, break) {
                 struct stat s;
                 usec_t age;
                 _cleanup_free_ char *sub_path = NULL;
 
-                if (STR_IN_SET(dent->d_name, ".", ".."))
+                if (dot_or_dot_dot(dent->d_name))
                         continue;
 
                 if (fstatat(dirfd(d), dent->d_name, &s, AT_SYMLINK_NOFOLLOW) < 0) {
@@ -422,7 +422,7 @@ static int dir_cleanup(
                         continue;
                 }
 
-                sub_path = strjoin(p, "/", dent->d_name, NULL);
+                sub_path = strjoin(p, "/", dent->d_name);
                 if (!sub_path) {
                         r = log_oom();
                         goto finish;
@@ -649,7 +649,7 @@ static int path_set_perms(Item *i, const char *path) {
                         else {
                                 log_debug("chmod \"%s\" to mode %o", path, m);
                                 if (chmod(fn, m) < 0)
-                                        return log_error_errno(errno, "chmod(%s) failed: %m", path);
+                                        return log_error_errno(errno, "chmod() of %s via %s failed: %m", path, fn);
                         }
                 }
 
@@ -662,7 +662,7 @@ static int path_set_perms(Item *i, const char *path) {
                         if (chown(fn,
                                   i->uid_set ? i->uid : UID_INVALID,
                                   i->gid_set ? i->gid : GID_INVALID) < 0)
-                                return log_error_errno(errno, "chown(%s) failed: %m", path);
+                                return log_error_errno(errno, "chown() of %s via %s failed: %m", path, fn);
                 }
         }
 
@@ -724,10 +724,9 @@ static int path_set_xattrs(Item *i, const char *path) {
 
                 n = strlen(*value);
                 log_debug("Setting extended attribute '%s=%s' on %s.", *name, *value, path);
-                if (lsetxattr(path, *name, *value, n, 0) < 0) {
-                        log_error("Setting extended attribute %s=%s on %s failed: %m", *name, *value, path);
-                        return -errno;
-                }
+                if (lsetxattr(path, *name, *value, n, 0) < 0)
+                        return log_error_errno(errno, "Setting extended attribute %s=%s on %s failed: %m",
+                                               *name, *value, path);
         }
         return 0;
 }
@@ -872,7 +871,7 @@ static int parse_attribute_from_arg(Item *item) {
                 { 's', FS_SECRM_FL },        /* Secure deletion */
                 { 'u', FS_UNRM_FL },         /* Undelete */
                 { 't', FS_NOTAIL_FL },       /* file tail should not be merged */
-                { 'T', FS_TOPDIR_FL },       /* Top of directory hierarchies*/
+                { 'T', FS_TOPDIR_FL },       /* Top of directory hierarchies */
                 { 'C', FS_NOCOW_FL },        /* Do not cow file */
         };
 
@@ -973,7 +972,7 @@ static int path_set_attribute(Item *item, const char *path) {
 
         r = chattr_fd(fd, f, item->attribute_mask);
         if (r < 0)
-                log_full_errno(r == -ENOTTY ? LOG_DEBUG : LOG_WARNING,
+                log_full_errno(r == -ENOTTY || r == -EOPNOTSUPP ? LOG_DEBUG : LOG_WARNING,
                                r,
                                "Cannot set file attribute for '%s', value=0x%08x, mask=0x%08x: %m",
                                path, item->attribute_value, item->attribute_mask);
@@ -1053,6 +1052,7 @@ typedef int (*action_t)(Item *, const char *);
 
 static int item_do_children(Item *i, const char *path, action_t action) {
         _cleanup_closedir_ DIR *d;
+        struct dirent *de;
         int r = 0;
 
         assert(i);
@@ -1065,24 +1065,14 @@ static int item_do_children(Item *i, const char *path, action_t action) {
         if (!d)
                 return errno == ENOENT || errno == ENOTDIR ? 0 : -errno;
 
-        for (;;) {
+        FOREACH_DIRENT_ALL(de, d, r = -errno) {
                 _cleanup_free_ char *p = NULL;
-                struct dirent *de;
                 int q;
 
-                errno = 0;
-                de = readdir(d);
-                if (!de) {
-                        if (errno > 0 && r == 0)
-                                r = -errno;
-
-                        break;
-                }
-
-                if (STR_IN_SET(de->d_name, ".", ".."))
+                if (dot_or_dot_dot(de->d_name))
                         continue;
 
-                p = strjoin(path, "/", de->d_name, NULL);
+                p = strjoin(path, "/", de->d_name);
                 if (!p)
                         return -ENOMEM;
 
@@ -1102,19 +1092,14 @@ static int item_do_children(Item *i, const char *path, action_t action) {
 
 static int glob_item(Item *i, action_t action, bool recursive) {
         _cleanup_globfree_ glob_t g = {
-                .gl_closedir = (void (*)(void *)) closedir,
-                .gl_readdir = (struct dirent *(*)(void *)) readdir,
                 .gl_opendir = (void *(*)(const char *)) opendir_nomod,
-                .gl_lstat = lstat,
-                .gl_stat = stat,
         };
         int r = 0, k;
         char **fn;
 
-        errno = 0;
-        k = glob(i->path, GLOB_NOSORT|GLOB_BRACE|GLOB_ALTDIRFUNC, NULL, &g);
-        if (k != 0 && k != GLOB_NOMATCH)
-                return log_error_errno(errno ?: EIO, "glob(%s) failed: %m", i->path);
+        k = safe_glob(i->path, GLOB_NOSORT|GLOB_BRACE, &g);
+        if (k < 0 && k != -ENOENT)
+                return log_error_errno(k, "glob(%s) failed: %m", i->path);
 
         STRV_FOREACH(fn, g.gl_pathv) {
                 k = action(i, *fn);
@@ -1179,7 +1164,7 @@ static int create_item(Item *i) {
                         return log_error_errno(r, "Failed to substitute specifiers in copy source %s: %m", i->argument);
 
                 log_debug("Copying tree \"%s\" to \"%s\".", resolved, i->path);
-                r = copy_tree(resolved, i->path, false);
+                r = copy_tree(resolved, i->path, i->uid_set ? i->uid : UID_INVALID, i->gid_set ? i->gid : GID_INVALID, COPY_REFLINK);
 
                 if (r == -EROFS && stat(i->path, &st) == 0)
                         r = -EEXIST;
index 8851af4..a17c006 100644 (file)
@@ -243,7 +243,7 @@ static int ask_password_plymouth(
         r = 0;
 
 finish:
-        memory_erase(buffer, sizeof(buffer));
+        explicit_bzero(buffer, sizeof(buffer));
         return r;
 }
 
@@ -283,7 +283,7 @@ static int send_passwords(const char *socket_name, char **passwords) {
                 r = log_debug_errno(errno, "sendto(): %m");
 
 finish:
-        memory_erase(packet, packet_length);
+        explicit_bzero(packet, packet_length);
         return r;
 }
 
@@ -827,7 +827,7 @@ static int ask_on_consoles(int argc, char *argv[]) {
                 break;
         }
 
-        if (!is_clean_exit(status.si_code, status.si_status, NULL))
+        if (!is_clean_exit(status.si_code, status.si_status, EXIT_CLEAN_DAEMON, NULL))
                 log_error("Password agent failed with: %d", status.si_status);
 
         terminate_agents(pids);
index 1e41466..ad152b9 100644 (file)
@@ -427,6 +427,8 @@ int main(int argc, char *argv[])
                 {}
         };
 
+        log_set_target(LOG_TARGET_AUTO);
+        udev_parse_config();
         log_parse_environment();
         log_open();
 
index 72f284f..1f906a8 100644 (file)
@@ -38,6 +38,7 @@
 
 #include "libudev-private.h"
 #include "random-util.h"
+#include "udev-util.h"
 
 /* device info */
 static unsigned int cd_cd_rom;
@@ -843,8 +844,7 @@ static int cd_media_toc(struct udev *udev, int fd)
         return 0;
 }
 
-int main(int argc, char *argv[])
-{
+int main(int argc, char *argv[]) {
         struct udev *udev;
         static const struct option options[] = {
                 { "lock-media", no_argument, NULL, 'l' },
@@ -862,6 +862,8 @@ int main(int argc, char *argv[])
         int cnt;
         int rc = 0;
 
+        log_set_target(LOG_TARGET_AUTO);
+        udev_parse_config();
         log_parse_environment();
         log_open();
 
index 349585b..57dfb01 100644 (file)
@@ -29,6 +29,7 @@
 #include "macro.h"
 #include "stdio-util.h"
 #include "string-util.h"
+#include "udev-util.h"
 
 #define BUFSIZE 16
 #define UDEV_ALARM_TIMEOUT 180
@@ -85,16 +86,16 @@ static void usage(void)
  */
 static int prepare(char *dir, char *filename)
 {
-        char buf[512];
+        char buf[PATH_MAX];
         int r, fd;
 
         r = mkdir(dir, 0700);
         if (r < 0 && errno != EEXIST)
                 return -errno;
 
-        xsprintf(buf, "%s/%s", dir, filename);
+        snprintf(buf, sizeof buf, "%s/%s", dir, filename);
 
-        fd = open(buf,O_RDWR|O_CREAT|O_CLOEXEC, S_IRUSR|S_IWUSR);
+        fd = open(buf, O_RDWR|O_CREAT|O_CLOEXEC, S_IRUSR|S_IWUSR);
         if (fd < 0)
                 fprintf(stderr, "Cannot open %s: %m\n", buf);
 
@@ -343,9 +344,7 @@ static void everybody(void)
         }
 }
 
-int main(int argc, char **argv)
-{
-        struct udev *udev;
+int main(int argc, char **argv) {
         static const struct option options[] = {
                 { "add", no_argument, NULL, 'a' },
                 { "remove", no_argument, NULL, 'r' },
@@ -361,11 +360,10 @@ int main(int argc, char **argv)
         int prune = 0;
         char tmpdir[UTIL_PATH_SIZE];
 
-        udev = udev_new();
-        if (udev == NULL) {
-                ret = EXIT_FAILURE;
-                goto exit;
-        }
+        log_set_target(LOG_TARGET_AUTO);
+        udev_parse_config();
+        log_parse_environment();
+        log_open();
 
         for (;;) {
                 int option;
@@ -386,26 +384,23 @@ int main(int argc, char **argv)
                         break;
                 case 'h':
                         usage();
-                        goto exit;
+                        return 0;
                 default:
-                        ret = 1;
-                        goto exit;
+                        return 1;
                 }
         }
 
         argi = optind;
         if (argi + 2 > argc) {
                 printf("Missing parameter(s)\n");
-                ret = 1;
-                goto exit;
+                return 1;
         }
         checkpoint = argv[argi++];
         us = argv[argi++];
 
         if (signal(SIGALRM, sig_alrm) == SIG_ERR) {
                 fprintf(stderr, "Cannot set SIGALRM: %m\n");
-                ret = 2;
-                goto exit;
+                return 2;
         }
 
         udev_list_node_init(&bunch);
@@ -485,7 +480,5 @@ out:
                 everybody();
         if (ret >= 0)
                 printf("COLLECT_%s=%d\n", checkpoint, ret);
-exit:
-        udev_unref(udev);
         return ret;
 }
diff --git a/src/udev/generate-keyboard-keys-gperf.sh b/src/udev/generate-keyboard-keys-gperf.sh
new file mode 100755 (executable)
index 0000000..5724e4e
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh -eu
+awk '   BEGIN {
+                print "struct key_name { const char* name; unsigned short id; };"
+                print "%null-strings"
+                print "%%"
+        }
+
+        /^KEY_/ { print tolower(substr($1 ,5)) ", " $1 }
+                { print tolower($1) ", " $1 }
+' < "$1"
diff --git a/src/udev/generate-keyboard-keys-list.sh b/src/udev/generate-keyboard-keys-list.sh
new file mode 100755 (executable)
index 0000000..7a74e0d
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/sh -eu
+
+$1 -dM -include linux/input.h - </dev/null | awk '
+        /\<(KEY_(MAX|MIN_INTERESTING))|(BTN_(MISC|MOUSE|JOYSTICK|GAMEPAD|DIGI|WHEEL|TRIGGER_HAPPY))\>/  { next }
+        /^#define[ \t]+(KEY|BTN)_[^ ]+[ \t]+[0-9BK]/                                                    { print $2 }
+'
diff --git a/src/udev/meson.build b/src/udev/meson.build
new file mode 100644 (file)
index 0000000..eeb341f
--- /dev/null
@@ -0,0 +1,152 @@
+udevadm_sources = files('''
+        udevadm.c
+        udevadm-info.c
+        udevadm-control.c
+        udevadm-monitor.c
+        udevadm-hwdb.c
+        udevadm-settle.c
+        udevadm-trigger.c
+        udevadm-test.c
+        udevadm-test-builtin.c
+        udevadm-util.c
+        udevadm-util.h
+'''.split())
+
+systemd_udevd_sources = files('udevd.c')
+
+libudev_core_sources = '''
+        udev.h
+        udev-event.c
+        udev-watch.c
+        udev-node.c
+        udev-rules.c
+        udev-ctrl.c
+        udev-builtin.c
+        udev-builtin-btrfs.c
+        udev-builtin-hwdb.c
+        udev-builtin-input_id.c
+        udev-builtin-keyboard.c
+        udev-builtin-net_id.c
+        udev-builtin-net_setup_link.c
+        udev-builtin-path_id.c
+        udev-builtin-usb_id.c
+        net/link-config.c
+        net/link-config.h
+        net/ethtool-util.c
+        net/ethtool-util.h
+'''.split()
+
+if conf.get('HAVE_KMOD', false)
+        libudev_core_sources += ['udev-builtin-kmod.c']
+endif
+
+if conf.get('HAVE_BLKID', false)
+        libudev_core_sources += ['udev-builtin-blkid.c']
+endif
+
+if conf.get('HAVE_ACL', false)
+        libudev_core_sources += ['udev-builtin-uaccess.c',
+                                logind_acl_c,
+                                 sd_login_c]
+endif
+
+############################################################
+
+generate_keyboard_keys_list = find_program('generate-keyboard-keys-list.sh')
+keyboard_keys_list_txt = custom_target(
+        'keyboard-keys-list.txt',
+        output : 'keyboard-keys-list.txt',
+        command : [generate_keyboard_keys_list, cpp],
+        capture : true)
+
+generate_keyboard_keys_gperf = find_program('generate-keyboard-keys-gperf.sh')
+fname = 'keyboard-keys-from-name.gperf'
+gperf_file = custom_target(
+        fname,
+        input : keyboard_keys_list_txt,
+        output : fname,
+        command : [generate_keyboard_keys_gperf, '@INPUT@'],
+        capture : true)
+
+fname = 'keyboard-keys-from-name.h'
+keyboard_keys_from_name_h = custom_target(
+        fname,
+        input : gperf_file,
+        output : fname,
+        command : [gperf,
+                   '-L', 'ANSI-C', '-t',
+                   '-N', 'keyboard_lookup_key',
+                   '-H', 'hash_key_name',
+                   '-p', '-C',
+                   '@INPUT@'],
+        capture : true)
+
+############################################################
+
+link_config_gperf_c = custom_target(
+        'link-config-gperf.c',
+        input : 'net/link-config-gperf.gperf',
+        output : 'link-config-gperf.c',
+        command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@'])
+
+############################################################
+
+if get_option('link-udev-shared')
+        udev_link_with = [libshared]
+        udev_rpath = rootlibexecdir
+else
+        udev_link_with = [libshared_static,
+                          libsystemd_internal]
+        udev_rpath = ''
+endif
+
+libudev_internal = static_library(
+        'udev',
+        libudev_sources,
+        include_directories : includes,
+        link_with : udev_link_with)
+
+libudev_core_includes = [includes, include_directories('net')]
+libudev_core = static_library(
+        'udev-core',
+        libudev_core_sources,
+        link_config_gperf_c,
+        keyboard_keys_from_name_h,
+        include_directories : libudev_core_includes,
+        link_with : udev_link_with,
+        dependencies : [libblkid, libkmod])
+
+foreach prog : [['ata_id/ata_id.c'],
+                ['cdrom_id/cdrom_id.c'],
+                ['collect/collect.c'],
+                ['scsi_id/scsi_id.c',
+                 'scsi_id/scsi_id.h',
+                 'scsi_id/scsi_serial.c',
+                 'scsi_id/scsi.h'],
+                ['v4l_id/v4l_id.c'],
+                ['mtd_probe/mtd_probe.c',
+                 'mtd_probe/mtd_probe.h',
+                 'mtd_probe/probe_smartmedia.c']]
+
+        executable(prog[0].split('/')[0],
+                   prog,
+                   include_directories : includes,
+                   c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
+                   link_with : [libudev_internal],
+                   install_rpath : udev_rpath,
+                   install : true,
+                   install_dir : udevlibexecdir)
+endforeach
+
+install_data('udev.conf',
+             install_dir : join_paths(sysconfdir, 'udev'))
+
+udev_pc = configure_file(
+        input : 'udev.pc.in',
+        output : 'udev.pc',
+        configuration : substs)
+install_data(udev_pc,
+             install_dir : pkgconfigdatadir)
+
+meson.add_install_script('sh', '-c',
+                         mkdir_p.format(join_paths(sysconfdir, 'udev/rules.d')))
index c00ff79..201fc23 100644 (file)
 #include "conf-parser.h"
 #include "ethtool-util.h"
 #include "log.h"
+#include "link-config.h"
+#include "socket-util.h"
 #include "string-table.h"
 #include "strxcpyx.h"
 #include "util.h"
+#include "missing.h"
 
 static const char* const duplex_table[_DUP_MAX] = {
         [DUP_FULL] = "full",
@@ -46,15 +49,33 @@ static const char* const wol_table[_WOL_MAX] = {
 DEFINE_STRING_TABLE_LOOKUP(wol, WakeOnLan);
 DEFINE_CONFIG_PARSE_ENUM(config_parse_wol, wol, WakeOnLan, "Failed to parse WakeOnLan setting");
 
+static const char* const port_table[_NET_DEV_PORT_MAX] = {
+        [NET_DEV_PORT_TP]     = "tp",
+        [NET_DEV_PORT_AUI]    = "aui",
+        [NET_DEV_PORT_MII]    = "mii",
+        [NET_DEV_PORT_FIBRE]  = "fibre",
+        [NET_DEV_PORT_BNC]    = "bnc"
+};
+
+DEFINE_STRING_TABLE_LOOKUP(port, NetDevPort);
+DEFINE_CONFIG_PARSE_ENUM(config_parse_port, port, NetDevPort, "Failed to parse Port setting");
+
+static const char* const netdev_feature_table[_NET_DEV_FEAT_MAX] = {
+        [NET_DEV_FEAT_GSO] = "tx-generic-segmentation",
+        [NET_DEV_FEAT_GRO] = "rx-gro",
+        [NET_DEV_FEAT_LRO] = "rx-lro",
+        [NET_DEV_FEAT_TSO] = "tx-tcp-segmentation",
+        [NET_DEV_FEAT_UFO] = "tx-udp-fragmentation",
+};
+
 int ethtool_connect(int *ret) {
         int fd;
 
         assert_return(ret, -EINVAL);
 
-        fd = socket(PF_INET, SOCK_DGRAM, 0);
+        fd = socket_ioctl_fd();
         if (fd < 0)
-                return -errno;
-
+                return fd;
         *ret = fd;
 
         return 0;
@@ -206,3 +227,323 @@ int ethtool_set_wol(int *fd, const char *ifname, WakeOnLan wol) {
 
         return 0;
 }
+
+static int ethtool_get_stringset(int *fd, struct ifreq *ifr, int stringset_id, struct ethtool_gstrings **gstrings) {
+        _cleanup_free_ struct ethtool_gstrings *strings = NULL;
+        struct {
+                struct ethtool_sset_info info;
+                uint32_t space;
+        } buffer = {
+                .info = {
+                        .cmd = ETHTOOL_GSSET_INFO,
+                        .sset_mask = UINT64_C(1) << stringset_id,
+                },
+        };
+        unsigned len;
+        int r;
+
+        ifr->ifr_data = (void *) &buffer.info;
+
+        r = ioctl(*fd, SIOCETHTOOL, ifr);
+        if (r < 0)
+                return -errno;
+
+        if (!buffer.info.sset_mask)
+                return -EINVAL;
+
+        len = buffer.info.data[0];
+
+        strings = malloc0(sizeof(struct ethtool_gstrings) + len * ETH_GSTRING_LEN);
+        if (!strings)
+                return -ENOMEM;
+
+        strings->cmd = ETHTOOL_GSTRINGS;
+        strings->string_set = stringset_id;
+        strings->len = len;
+
+        ifr->ifr_data = (void *) strings;
+
+        r = ioctl(*fd, SIOCETHTOOL, ifr);
+        if (r < 0)
+                return -errno;
+
+        *gstrings = strings;
+        strings = NULL;
+
+        return 0;
+}
+
+static int find_feature_index(struct ethtool_gstrings *strings, const char *feature) {
+        unsigned i;
+
+        for (i = 0; i < strings->len; i++) {
+                if (streq((char *) &strings->data[i * ETH_GSTRING_LEN], feature))
+                        return i;
+        }
+
+        return -1;
+}
+
+int ethtool_set_features(int *fd, const char *ifname, NetDevFeature *features) {
+        _cleanup_free_ struct ethtool_gstrings *strings = NULL;
+        struct ethtool_sfeatures *sfeatures;
+        int block, bit, i, r;
+        struct ifreq ifr = {};
+
+        if (*fd < 0) {
+                r = ethtool_connect(fd);
+                if (r < 0)
+                        return log_warning_errno(r, "link_config: could not connect to ethtool: %m");
+        }
+
+        strscpy(ifr.ifr_name, IFNAMSIZ, ifname);
+
+        r = ethtool_get_stringset(fd, &ifr, ETH_SS_FEATURES, &strings);
+        if (r < 0)
+                return log_warning_errno(r, "link_config: could not get ethtool features for %s", ifname);
+
+        sfeatures = alloca0(sizeof(struct ethtool_gstrings) + DIV_ROUND_UP(strings->len, 32U) * sizeof(sfeatures->features[0]));
+        sfeatures->cmd = ETHTOOL_SFEATURES;
+        sfeatures->size = DIV_ROUND_UP(strings->len, 32U);
+
+        for (i = 0; i < _NET_DEV_FEAT_MAX; i++) {
+
+                if (features[i] != -1) {
+
+                        r = find_feature_index(strings, netdev_feature_table[i]);
+                        if (r < 0) {
+                                log_warning_errno(r, "link_config: could not find feature: %s", netdev_feature_table[i]);
+                                continue;
+                        }
+
+                        block = r / 32;
+                        bit = r % 32;
+
+                        sfeatures->features[block].valid |= 1 << bit;
+
+                        if (features[i])
+                                sfeatures->features[block].requested |= 1 << bit;
+                        else
+                                sfeatures->features[block].requested &= ~(1 << bit);
+                }
+        }
+
+        ifr.ifr_data = (void *) sfeatures;
+
+        r = ioctl(*fd, SIOCETHTOOL, &ifr);
+        if (r < 0)
+                return log_warning_errno(r, "link_config: could not set ethtool features for %s", ifname);
+
+        return 0;
+}
+
+static int get_glinksettings(int *fd, struct ifreq *ifr, struct ethtool_link_usettings **g) {
+        struct ecmd {
+                struct ethtool_link_settings req;
+                __u32 link_mode_data[3 * ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32];
+        } ecmd = {
+                .req.cmd = ETHTOOL_GLINKSETTINGS,
+        };
+        struct ethtool_link_usettings *u;
+        unsigned offset;
+        int r;
+
+        /* The interaction user/kernel via the new API requires a small ETHTOOL_GLINKSETTINGS
+           handshake first to agree on the length of the link mode bitmaps. If kernel doesn't
+           agree with user, it returns the bitmap length it is expecting from user as a negative
+           length (and cmd field is 0). When kernel and user agree, kernel returns valid info in
+           all fields (ie. link mode length > 0 and cmd is ETHTOOL_GLINKSETTINGS). Based on
+           https://github.com/torvalds/linux/commit/3f1ac7a700d039c61d8d8b99f28d605d489a60cf
+        */
+
+        ifr->ifr_data = (void *) &ecmd;
+
+        r = ioctl(*fd, SIOCETHTOOL, ifr);
+        if (r < 0)
+                return -errno;
+
+        if (ecmd.req.link_mode_masks_nwords >= 0 || ecmd.req.cmd != ETHTOOL_GLINKSETTINGS)
+                return -ENOTSUP;
+
+        ecmd.req.link_mode_masks_nwords = -ecmd.req.link_mode_masks_nwords;
+
+        ifr->ifr_data = (void *) &ecmd;
+
+        r = ioctl(*fd, SIOCETHTOOL, ifr);
+        if (r < 0)
+                return -errno;
+
+        if (ecmd.req.link_mode_masks_nwords <= 0 || ecmd.req.cmd != ETHTOOL_GLINKSETTINGS)
+                return -ENOTSUP;
+
+        u = new0(struct ethtool_link_usettings , 1);
+        if (!u)
+                return -ENOMEM;
+
+        memcpy(&u->base, &ecmd.req, sizeof(struct ethtool_link_settings));
+
+        offset = 0;
+        memcpy(u->link_modes.supported, &ecmd.link_mode_data[offset], 4 * ecmd.req.link_mode_masks_nwords);
+
+        offset += ecmd.req.link_mode_masks_nwords;
+        memcpy(u->link_modes.advertising, &ecmd.link_mode_data[offset], 4 * ecmd.req.link_mode_masks_nwords);
+
+        offset += ecmd.req.link_mode_masks_nwords;
+        memcpy(u->link_modes.lp_advertising, &ecmd.link_mode_data[offset], 4 * ecmd.req.link_mode_masks_nwords);
+
+        *g = u;
+
+        return 0;
+}
+
+static int get_gset(int *fd, struct ifreq *ifr, struct ethtool_link_usettings **u) {
+        struct ethtool_link_usettings *e;
+        struct ethtool_cmd ecmd = {
+                .cmd = ETHTOOL_GSET,
+        };
+        int r;
+
+        ifr->ifr_data = (void *) &ecmd;
+
+        r = ioctl(*fd, SIOCETHTOOL, ifr);
+        if (r < 0)
+                return -errno;
+
+        e = new0(struct ethtool_link_usettings, 1);
+        if (!e)
+                return -ENOMEM;
+
+        e->base.cmd = ETHTOOL_GSET;
+
+        e->base.link_mode_masks_nwords = 1;
+        e->base.speed = ethtool_cmd_speed(&ecmd);
+        e->base.duplex = ecmd.duplex;
+        e->base.port = ecmd.port;
+        e->base.phy_address = ecmd.phy_address;
+        e->base.autoneg = ecmd.autoneg;
+        e->base.mdio_support = ecmd.mdio_support;
+
+        e->link_modes.supported[0] = ecmd.supported;
+        e->link_modes.advertising[0] = ecmd.advertising;
+        e->link_modes.lp_advertising[0] = ecmd.lp_advertising;
+
+        *u = e;
+
+        return 0;
+}
+
+static int set_slinksettings(int *fd, struct ifreq *ifr, const struct ethtool_link_usettings *u) {
+        struct {
+                struct ethtool_link_settings req;
+                __u32 link_mode_data[3 * ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32];
+        } ecmd = {
+                .req.cmd = ETHTOOL_SLINKSETTINGS,
+        };
+        unsigned int offset;
+        int r;
+
+        if (u->base.cmd != ETHTOOL_GLINKSETTINGS || u->base.link_mode_masks_nwords <= 0)
+                return -EINVAL;
+
+        offset = 0;
+        memcpy(&ecmd.link_mode_data[offset], u->link_modes.supported, 4 * ecmd.req.link_mode_masks_nwords);
+
+        offset += ecmd.req.link_mode_masks_nwords;
+        memcpy(&ecmd.link_mode_data[offset], u->link_modes.advertising, 4 * ecmd.req.link_mode_masks_nwords);
+
+        offset += ecmd.req.link_mode_masks_nwords;
+        memcpy(&ecmd.link_mode_data[offset], u->link_modes.lp_advertising, 4 * ecmd.req.link_mode_masks_nwords);
+
+        ifr->ifr_data = (void *) &ecmd;
+
+        r = ioctl(*fd, SIOCETHTOOL, ifr);
+        if (r < 0)
+                return -errno;
+
+        return 0;
+}
+
+static int set_sset(int *fd, struct ifreq *ifr, const struct ethtool_link_usettings *u) {
+        struct ethtool_cmd ecmd = {
+                .cmd = ETHTOOL_SSET,
+        };
+        int r;
+
+        if (u->base.cmd != ETHTOOL_GSET || u->base.link_mode_masks_nwords <= 0)
+                return -EINVAL;
+
+        ecmd.supported = u->link_modes.supported[0];
+        ecmd.advertising = u->link_modes.advertising[0];
+        ecmd.lp_advertising = u->link_modes.lp_advertising[0];
+
+        ethtool_cmd_speed_set(&ecmd, u->base.speed);
+
+        ecmd.duplex = u->base.duplex;
+        ecmd.port = u->base.port;
+        ecmd.phy_address = u->base.phy_address;
+        ecmd.autoneg = u->base.autoneg;
+        ecmd.mdio_support = u->base.mdio_support;
+
+        ifr->ifr_data = (void *) &ecmd;
+
+        r = ioctl(*fd, SIOCETHTOOL, ifr);
+        if (r < 0)
+                return -errno;
+
+        return 0;
+}
+
+/* If autonegotiation is disabled, the speed and duplex represent the fixed link
+ * mode and are writable if the driver supports multiple link modes. If it is
+ * enabled then they are read-only. If the link  is up they represent the negotiated
+ * link mode; if the link is down, the speed is 0, %SPEED_UNKNOWN or the highest
+ * enabled speed and @duplex is %DUPLEX_UNKNOWN or the best enabled duplex mode.
+ */
+
+int ethtool_set_glinksettings(int *fd, const char *ifname, struct link_config *link) {
+        _cleanup_free_ struct ethtool_link_usettings *u = NULL;
+        struct ifreq ifr = {};
+        int r;
+
+        if (link->autonegotiation != 0) {
+                log_info("link_config: autonegotiation is unset or enabled, the speed and duplex are not writable.");
+                return 0;
+        }
+
+        if (*fd < 0) {
+                r = ethtool_connect(fd);
+                if (r < 0)
+                        return log_warning_errno(r, "link_config: could not connect to ethtool: %m");
+        }
+
+        strscpy(ifr.ifr_name, IFNAMSIZ, ifname);
+
+        r = get_glinksettings(fd, &ifr, &u);
+        if (r < 0) {
+
+                r = get_gset(fd, &ifr, &u);
+                if (r < 0)
+                        return log_warning_errno(r, "link_config: Cannot get device settings for %s : %m", ifname);
+        }
+
+        if (link->speed)
+                u->base.speed = DIV_ROUND_UP(link->speed, 1000000);
+
+        if (link->duplex != _DUP_INVALID)
+                u->base.duplex = link->duplex;
+
+        if (link->port != _NET_DEV_PORT_INVALID)
+              u->base.port = link->port;
+
+        u->base.autoneg = link->autonegotiation;
+
+        if (u->base.cmd == ETHTOOL_GLINKSETTINGS)
+                r = set_slinksettings(fd, &ifr, u);
+        else
+                r = set_sset(fd, &ifr, u);
+
+        if (r < 0)
+                return log_warning_errno(r, "link_config: Cannot set device settings for %s : %m", ifname);
+
+        return r;
+}
index 7716516..27ce0e0 100644 (file)
 ***/
 
 #include <macro.h>
+#include <linux/ethtool.h>
+
+#include "missing.h"
+
+struct link_config;
 
 /* we can't use DUPLEX_ prefix, as it
  * clashes with <linux/ethtool.h> */
 typedef enum Duplex {
-        DUP_FULL,
-        DUP_HALF,
+        DUP_HALF = DUPLEX_HALF,
+        DUP_FULL = DUPLEX_FULL,
         _DUP_MAX,
         _DUP_INVALID = -1
 } Duplex;
@@ -38,11 +43,49 @@ typedef enum WakeOnLan {
         _WOL_INVALID = -1
 } WakeOnLan;
 
+typedef enum NetDevFeature {
+        NET_DEV_FEAT_GSO,
+        NET_DEV_FEAT_GRO,
+        NET_DEV_FEAT_LRO,
+        NET_DEV_FEAT_TSO,
+        NET_DEV_FEAT_UFO,
+        _NET_DEV_FEAT_MAX,
+        _NET_DEV_FEAT_INVALID = -1
+} NetDevFeature;
+
+typedef enum NetDevPort {
+        NET_DEV_PORT_TP     = 0x00,
+        NET_DEV_PORT_AUI    = 0x01,
+        NET_DEV_PORT_MII    = 0x02,
+        NET_DEV_PORT_FIBRE  = 0x03,
+        NET_DEV_PORT_BNC    = 0x04,
+        NET_DEV_PORT_DA     = 0x05,
+        NET_DEV_PORT_NONE   = 0xef,
+        NET_DEV_PORT_OTHER  = 0xff,
+        _NET_DEV_PORT_MAX,
+        _NET_DEV_PORT_INVALID = -1
+} NetDevPort;
+
+#define ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32    (SCHAR_MAX)
+
+/* layout of the struct passed from/to userland */
+struct ethtool_link_usettings {
+        struct ethtool_link_settings base;
+
+        struct {
+                uint32_t supported[ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32];
+                uint32_t advertising[ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32];
+                uint32_t lp_advertising[ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NU32];
+        } link_modes;
+};
+
 int ethtool_connect(int *ret);
 
 int ethtool_get_driver(int *fd, const char *ifname, char **ret);
 int ethtool_set_speed(int *fd, const char *ifname, unsigned int speed, Duplex duplex);
 int ethtool_set_wol(int *fd, const char *ifname, WakeOnLan wol);
+int ethtool_set_features(int *fd, const char *ifname, NetDevFeature *features);
+int ethtool_set_glinksettings(int *fd, const char *ifname, struct link_config *link);
 
 const char *duplex_to_string(Duplex d) _const_;
 Duplex duplex_from_string(const char *d) _pure_;
@@ -50,5 +93,9 @@ Duplex duplex_from_string(const char *d) _pure_;
 const char *wol_to_string(WakeOnLan wol) _const_;
 WakeOnLan wol_from_string(const char *wol) _pure_;
 
+const char *port_to_string(NetDevPort port) _const_;
+NetDevPort port_from_string(const char *port) _pure_;
+
 int config_parse_duplex(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_wol(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_port(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
index b25e4b3..5488867 100644 (file)
@@ -16,22 +16,29 @@ struct ConfigPerfItem;
 %struct-type
 %includes
 %%
-Match.MACAddress,          config_parse_hwaddr,        0,                             offsetof(link_config, match_mac)
-Match.OriginalName,        config_parse_ifnames,       0,                             offsetof(link_config, match_name)
-Match.Path,                config_parse_strv,          0,                             offsetof(link_config, match_path)
-Match.Driver,              config_parse_strv,          0,                             offsetof(link_config, match_driver)
-Match.Type,                config_parse_strv,          0,                             offsetof(link_config, match_type)
-Match.Host,                config_parse_net_condition, CONDITION_HOST,                offsetof(link_config, match_host)
-Match.Virtualization,      config_parse_net_condition, CONDITION_VIRTUALIZATION,      offsetof(link_config, match_virt)
-Match.KernelCommandLine,   config_parse_net_condition, CONDITION_KERNEL_COMMAND_LINE, offsetof(link_config, match_kernel)
-Match.Architecture,        config_parse_net_condition, CONDITION_ARCHITECTURE,        offsetof(link_config, match_arch)
-Link.Description,          config_parse_string,        0,                             offsetof(link_config, description)
-Link.MACAddressPolicy,     config_parse_mac_policy,    0,                             offsetof(link_config, mac_policy)
-Link.MACAddress,           config_parse_hwaddr,        0,                             offsetof(link_config, mac)
-Link.NamePolicy,           config_parse_name_policy,   0,                             offsetof(link_config, name_policy)
-Link.Name,                 config_parse_ifname,        0,                             offsetof(link_config, name)
-Link.Alias,                config_parse_ifalias,       0,                             offsetof(link_config, alias)
-Link.MTUBytes,             config_parse_iec_size,      0,                             offsetof(link_config, mtu)
-Link.BitsPerSecond,        config_parse_si_size,       0,                             offsetof(link_config, speed)
-Link.Duplex,               config_parse_duplex,        0,                             offsetof(link_config, duplex)
-Link.WakeOnLan,            config_parse_wol,           0,                             offsetof(link_config, wol)
+Match.MACAddress,                config_parse_hwaddr,        0,                             offsetof(link_config, match_mac)
+Match.OriginalName,              config_parse_ifnames,       0,                             offsetof(link_config, match_name)
+Match.Path,                      config_parse_strv,          0,                             offsetof(link_config, match_path)
+Match.Driver,                    config_parse_strv,          0,                             offsetof(link_config, match_driver)
+Match.Type,                      config_parse_strv,          0,                             offsetof(link_config, match_type)
+Match.Host,                      config_parse_net_condition, CONDITION_HOST,                offsetof(link_config, match_host)
+Match.Virtualization,            config_parse_net_condition, CONDITION_VIRTUALIZATION,      offsetof(link_config, match_virt)
+Match.KernelCommandLine,         config_parse_net_condition, CONDITION_KERNEL_COMMAND_LINE, offsetof(link_config, match_kernel)
+Match.Architecture,              config_parse_net_condition, CONDITION_ARCHITECTURE,        offsetof(link_config, match_arch)
+Link.Description,                config_parse_string,        0,                             offsetof(link_config, description)
+Link.MACAddressPolicy,           config_parse_mac_policy,    0,                             offsetof(link_config, mac_policy)
+Link.MACAddress,                 config_parse_hwaddr,        0,                             offsetof(link_config, mac)
+Link.NamePolicy,                 config_parse_name_policy,   0,                             offsetof(link_config, name_policy)
+Link.Name,                       config_parse_ifname,        0,                             offsetof(link_config, name)
+Link.Alias,                      config_parse_ifalias,       0,                             offsetof(link_config, alias)
+Link.MTUBytes,                   config_parse_iec_size,      0,                             offsetof(link_config, mtu)
+Link.BitsPerSecond,              config_parse_si_size,       0,                             offsetof(link_config, speed)
+Link.Duplex,                     config_parse_duplex,        0,                             offsetof(link_config, duplex)
+Link.AutoNegotiation,            config_parse_tristate,      0,                             offsetof(link_config, autonegotiation)
+Link.WakeOnLan,                  config_parse_wol,           0,                             offsetof(link_config, wol)
+Link.Port,                       config_parse_port,          0,                             offsetof(link_config, port)
+Link.GenericSegmentationOffload, config_parse_tristate,      0,                             offsetof(link_config, features[NET_DEV_FEAT_GSO])
+Link.TCPSegmentationOffload,     config_parse_tristate,      0,                             offsetof(link_config, features[NET_DEV_FEAT_TSO])
+Link.UDPSegmentationOffload,     config_parse_tristate,      0,                             offsetof(link_config, features[NET_DEV_FEAT_UFO])
+Link.GenericReceiveOffload,      config_parse_tristate,      0,                             offsetof(link_config, features[NET_DEV_FEAT_GRO])
+Link.LargeReceiveOffload,        config_parse_tristate,      0,                             offsetof(link_config, features[NET_DEV_FEAT_LRO])
index c665041..05a1863 100644 (file)
@@ -167,6 +167,10 @@ static int load_link(link_config_ctx *ctx, const char *filename) {
         link->mac_policy = _MACPOLICY_INVALID;
         link->wol = _WOL_INVALID;
         link->duplex = _DUP_INVALID;
+        link->port = _NET_DEV_PORT_INVALID;
+        link->autonegotiation = -1;
+
+        memset(&link->features, -1, sizeof(link->features));
 
         r = config_parse(NULL, filename, file,
                          "Match\0Link\0Ethernet\0",
@@ -189,28 +193,15 @@ static int load_link(link_config_ctx *ctx, const char *filename) {
 }
 
 static bool enable_name_policy(void) {
-        _cleanup_free_ char *line = NULL;
-        const char *word, *state;
-        int r;
-        size_t l;
+        bool b;
 
-        r = proc_cmdline(&line);
-        if (r < 0) {
-                log_warning_errno(r, "Failed to read /proc/cmdline, ignoring: %m");
-                return true;
-        }
-
-        FOREACH_WORD_QUOTED(word, l, line, state)
-                if (strneq(word, "net.ifnames=0", l))
-                        return false;
-
-        return true;
+        return proc_cmdline_get_bool("net.ifnames", &b) <= 0 || b;
 }
 
 int link_config_load(link_config_ctx *ctx) {
-        int r;
         _cleanup_strv_free_ char **files;
         char **f;
+        int r;
 
         link_configs_free(ctx);
 
@@ -370,11 +361,12 @@ static int get_mac(struct udev_device *device, bool want_random,
 
 int link_config_apply(link_config_ctx *ctx, link_config *config,
                       struct udev_device *device, const char **name) {
-        const char *old_name;
-        const char *new_name = NULL;
+        bool respect_predictable = false;
         struct ether_addr generated_mac;
         struct ether_addr *mac = NULL;
-        bool respect_predictable = false;
+        const char *new_name = NULL;
+        const char *old_name;
+        unsigned speed;
         int r, ifindex;
 
         assert(ctx);
@@ -386,17 +378,30 @@ 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);
-        if (r < 0)
-                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));
+        r = ethtool_set_glinksettings(&ctx->ethtool_fd, old_name, config);
+        if (r < 0) {
+
+                if (config->port != _NET_DEV_PORT_INVALID)
+                        log_warning_errno(r,  "Could not set port (%s) of %s: %m", port_to_string(config->port), old_name);
+
+                speed = DIV_ROUND_UP(config->speed, 1000000);
+                if (r == -EOPNOTSUPP)
+                        r = ethtool_set_speed(&ctx->ethtool_fd, old_name, speed, config->duplex);
+
+                if (r < 0)
+                        log_warning_errno(r, "Could not set speed or duplex of %s to %u Mbps (%s): %m",
+                                          old_name, speed, duplex_to_string(config->duplex));
+        }
 
         r = ethtool_set_wol(&ctx->ethtool_fd, old_name, config->wol);
         if (r < 0)
                 log_warning_errno(r, "Could not set WakeOnLan of %s to %s: %m",
                                   old_name, wol_to_string(config->wol));
 
+        r = ethtool_set_features(&ctx->ethtool_fd, old_name, config->features);
+        if (r < 0)
+                log_warning_errno(r, "Could not set offload features of %s: %m", old_name);
+
         ifindex = udev_device_get_ifindex(device);
         if (ifindex <= 0) {
                 log_warning("Could not find ifindex");
index 9df5529..ff91a65 100644 (file)
@@ -69,7 +69,10 @@ struct link_config {
         size_t mtu;
         size_t speed;
         Duplex duplex;
+        int autonegotiation;
         WakeOnLan wol;
+        NetDevPort port;
+        NetDevFeature features[_NET_DEV_FEAT_MAX];
 
         LIST_FIELDS(link_config, links);
 };
@@ -92,7 +95,7 @@ const char *mac_policy_to_string(MACPolicy p) _const_;
 MACPolicy mac_policy_from_string(const char *p) _pure_;
 
 /* gperf lookup function */
-const struct ConfigPerfItem* link_config_gperf_lookup(const char *key, unsigned length);
+const struct ConfigPerfItem* link_config_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
 
 int config_parse_mac_policy(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
 int config_parse_name_policy(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
index 4655691..3c3d7a6 100644 (file)
@@ -391,7 +391,7 @@ static int set_options(struct udev *udev,
                         break;
 
                 case 'V':
-                        printf("%s\n", VERSION);
+                        printf("%s\n", PACKAGE_VERSION);
                         exit(0);
 
                 case 'x':
@@ -577,6 +577,8 @@ int main(int argc, char **argv)
         int newargc;
         char **newargv = NULL;
 
+        log_set_target(LOG_TARGET_AUTO);
+        udev_parse_config();
         log_parse_environment();
         log_open();
 
index 3c58445..11d7085 100644 (file)
@@ -18,7 +18,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <blkid/blkid.h>
+#include <blkid.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <getopt.h>
@@ -30,6 +30,7 @@
 #include "sd-id128.h"
 
 #include "alloc-util.h"
+#include "blkid-util.h"
 #include "efivars.h"
 #include "fd-util.h"
 #include "gpt.h"
@@ -122,7 +123,7 @@ static int find_gpt_root(struct udev_device *dev, blkid_probe pr, bool test) {
         errno = 0;
         pl = blkid_probe_get_partitions(pr);
         if (!pl)
-                return errno > 0 ? -errno : -ENOMEM;
+                return -errno ?: -ENOMEM;
 
         nvals = blkid_partlist_numof_partitions(pl);
         for (i = 0; i < nvals; i++) {
@@ -193,7 +194,7 @@ static int probe_superblocks(blkid_probe pr) {
         int rc;
 
         if (fstat(blkid_probe_get_fd(pr), &st))
-                return -1;
+                return -errno;
 
         blkid_probe_enable_partitions(pr, 1);
 
@@ -225,10 +226,9 @@ static int builtin_blkid(struct udev_device *dev, int argc, char *argv[], bool t
         int64_t offset = 0;
         bool noraid = false;
         _cleanup_close_ int fd = -1;
-        blkid_probe pr;
+        _cleanup_blkid_free_probe_ blkid_probe pr = NULL;
         const char *data;
         const char *name;
-        const char *prtype = NULL;
         int nvals;
         int i;
         int err = 0;
@@ -264,8 +264,7 @@ static int builtin_blkid(struct udev_device *dev, int argc, char *argv[], bool t
         blkid_probe_set_superblocks_flags(pr,
                 BLKID_SUBLKS_LABEL | BLKID_SUBLKS_UUID |
                 BLKID_SUBLKS_TYPE | BLKID_SUBLKS_SECTYPE |
-                BLKID_SUBLKS_USAGE | BLKID_SUBLKS_VERSION |
-                BLKID_SUBLKS_BADCSUM);
+                BLKID_SUBLKS_USAGE | BLKID_SUBLKS_VERSION);
 
         if (noraid)
                 blkid_probe_filter_superblocks_usage(pr, BLKID_FLTR_NOTIN, BLKID_USAGE_RAID);
@@ -287,15 +286,6 @@ static int builtin_blkid(struct udev_device *dev, int argc, char *argv[], bool t
         err = probe_superblocks(pr);
         if (err < 0)
                 goto out;
-        if (blkid_probe_has_value(pr, "SBBADCSUM")) {
-                if (!blkid_probe_lookup_value(pr, "TYPE", &prtype, NULL))
-                        log_warning("incorrect %s checksum on %s",
-                                    prtype, udev_device_get_devnode(dev));
-                else
-                        log_warning("incorrect checksum on %s",
-                                    udev_device_get_devnode(dev));
-                goto out;
-        }
 
         /* If we are a partition then our parent passed on the root
          * partition UUID to us */
@@ -321,7 +311,6 @@ static int builtin_blkid(struct udev_device *dev, int argc, char *argv[], bool t
         if (is_gpt)
                 find_gpt_root(dev, pr, test);
 
-        blkid_free_probe(pr);
 out:
         if (err < 0)
                 return EXIT_FAILURE;
index f4a065a..acd1d1a 100644 (file)
@@ -43,7 +43,7 @@ int udev_builtin_hwdb_lookup(struct udev_device *dev,
                 return -ENOENT;
 
         if (prefix) {
-                lookup = strjoin(prefix, modalias, NULL);
+                lookup = strjoin(prefix, modalias);
                 if (!lookup)
                         return -ENOMEM;
                 modalias = lookup;
index 59b9804..60f760e 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/input.h>
 
 #include "fd-util.h"
+#include "missing.h"
 #include "stdio-util.h"
 #include "string-util.h"
 #include "udev.h"
 #define LONG(x) ((x)/BITS_PER_LONG)
 #define test_bit(bit, array)    ((array[LONG(bit)] >> OFF(bit)) & 1)
 
+struct range {
+        unsigned start;
+        unsigned end;
+};
+
+/* key code ranges above BTN_MISC (start is inclusive, stop is exclusive)*/
+static const struct range high_key_blocks[] = {
+        { KEY_OK, BTN_DPAD_UP },
+        { KEY_ALS_TOGGLE, BTN_TRIGGER_HAPPY }
+};
+
 static inline int abs_size_mm(const struct input_absinfo *absinfo) {
         /* Resolution is defined to be in units/mm for ABS_X/Y */
         return (absinfo->maximum - absinfo->minimum) / absinfo->resolution;
@@ -137,6 +149,7 @@ static bool test_pointers(struct udev_device *dev,
                           const unsigned long* bitmask_rel,
                           const unsigned long* bitmask_props,
                           bool test) {
+        int button, axis;
         bool has_abs_coordinates = false;
         bool has_rel_coordinates = false;
         bool has_mt_coordinates = false;
@@ -172,7 +185,8 @@ static bool test_pointers(struct udev_device *dev,
         is_pointing_stick = test_bit(INPUT_PROP_POINTING_STICK, bitmask_props);
         stylus_or_pen = test_bit(BTN_STYLUS, bitmask_key) || test_bit(BTN_TOOL_PEN, bitmask_key);
         finger_but_no_pen = test_bit(BTN_TOOL_FINGER, bitmask_key) && !test_bit(BTN_TOOL_PEN, bitmask_key);
-        has_mouse_button = test_bit(BTN_LEFT, bitmask_key);
+        for (button = BTN_MOUSE; button < BTN_JOYSTICK && !has_mouse_button; button++)
+                has_mouse_button = test_bit(button, bitmask_key);
         has_rel_coordinates = test_bit(EV_REL, bitmask_ev) && test_bit(REL_X, bitmask_rel) && test_bit(REL_Y, bitmask_rel);
         has_mt_coordinates = test_bit(ABS_MT_POSITION_X, bitmask_abs) && test_bit(ABS_MT_POSITION_Y, bitmask_abs);
 
@@ -183,18 +197,15 @@ static bool test_pointers(struct udev_device *dev,
         has_touch = test_bit(BTN_TOUCH, bitmask_key);
         /* joysticks don't necessarily have buttons; e. g.
          * rudders/pedals are joystick-like, but buttonless; they have
-         * other fancy axes */
-        has_joystick_axes_or_buttons = test_bit(BTN_TRIGGER, bitmask_key) ||
-                                       test_bit(BTN_A, bitmask_key) ||
-                                       test_bit(BTN_1, bitmask_key) ||
-                                       test_bit(ABS_RX, bitmask_abs) ||
-                                       test_bit(ABS_RY, bitmask_abs) ||
-                                       test_bit(ABS_RZ, bitmask_abs) ||
-                                       test_bit(ABS_THROTTLE, bitmask_abs) ||
-                                       test_bit(ABS_RUDDER, bitmask_abs) ||
-                                       test_bit(ABS_WHEEL, bitmask_abs) ||
-                                       test_bit(ABS_GAS, bitmask_abs) ||
-                                       test_bit(ABS_BRAKE, bitmask_abs);
+         * other fancy axes. Others have buttons only but no axes. */
+        for (button = BTN_JOYSTICK; button < BTN_DIGI && !has_joystick_axes_or_buttons; button++)
+                has_joystick_axes_or_buttons = test_bit(button, bitmask_key);
+        for (button = BTN_TRIGGER_HAPPY1; button <= BTN_TRIGGER_HAPPY40 && !has_joystick_axes_or_buttons; button++)
+                has_joystick_axes_or_buttons = test_bit(button, bitmask_key);
+        for (button = BTN_DPAD_UP; button <= BTN_DPAD_RIGHT && !has_joystick_axes_or_buttons; button++)
+                has_joystick_axes_or_buttons = test_bit(button, bitmask_key);
+        for (axis = ABS_RX; axis < ABS_PRESSURE && !has_joystick_axes_or_buttons; axis++)
+                has_joystick_axes_or_buttons = test_bit(axis, bitmask_abs);
 
         if (has_abs_coordinates) {
                 if (stylus_or_pen)
@@ -209,7 +220,10 @@ static bool test_pointers(struct udev_device *dev,
                         is_touchscreen = true;
                 else if (has_joystick_axes_or_buttons)
                         is_joystick = true;
+        } else if (has_joystick_axes_or_buttons) {
+                is_joystick = true;
         }
+
         if (has_mt_coordinates) {
                 if (stylus_or_pen)
                         is_tablet = true;
@@ -219,7 +233,9 @@ static bool test_pointers(struct udev_device *dev,
                         is_touchscreen = true;
         }
 
-        if (has_rel_coordinates && has_mouse_button)
+        if (has_mouse_button &&
+            (has_rel_coordinates ||
+            !has_abs_coordinates)) /* mouse buttons and no axis */
                 is_mouse = true;
 
         if (is_pointing_stick)
@@ -260,13 +276,16 @@ static bool test_key(struct udev_device *dev,
                 found |= bitmask_key[i];
                 log_debug("test_key: checking bit block %lu for any keys; found=%i", (unsigned long)i*BITS_PER_LONG, found > 0);
         }
-        /* If there are no keys in the lower block, check the higher block */
+        /* If there are no keys in the lower block, check the higher blocks */
         if (!found) {
-                for (i = KEY_OK; i < BTN_TRIGGER_HAPPY; ++i) {
-                        if (test_bit(i, bitmask_key)) {
-                                log_debug("test_key: Found key %x in high block", i);
-                                found = 1;
-                                break;
+                unsigned block;
+                for (block = 0; block < (sizeof(high_key_blocks) / sizeof(struct range)); ++block) {
+                        for (i = high_key_blocks[block].start; i < high_key_blocks[block].end; ++i) {
+                                if (test_bit(i, bitmask_key)) {
+                                        log_debug("test_key: Found key %x in high block", i);
+                                        found = 1;
+                                        break;
+                                }
                         }
                 }
         }
@@ -323,6 +342,9 @@ static int builtin_input_id(struct udev_device *dev, int argc, char *argv[], boo
                 if (!is_pointer && !is_key && test_bit(EV_REL, bitmask_ev) &&
                     (test_bit(REL_WHEEL, bitmask_rel) || test_bit(REL_HWHEEL, bitmask_rel)))
                         udev_builtin_add_property(dev, test, "ID_INPUT_KEY", "1");
+                if (test_bit(EV_SW, bitmask_ev))
+                        udev_builtin_add_property(dev, test, "ID_INPUT_SWITCH", "1");
+
         }
 
         devnode = udev_device_get_devnode(dev);
index aa10bea..e316bb9 100644 (file)
@@ -29,7 +29,7 @@
 #include "string-util.h"
 #include "udev.h"
 
-static const struct key *keyboard_lookup_key(const char *str, unsigned len);
+static const struct key_name *keyboard_lookup_key(const char *str, GPERF_LEN_TYPE len);
 #include "keyboard-keys-from-name.h"
 
 static int install_force_release(struct udev_device *dev, const unsigned *release, unsigned release_count) {
@@ -76,7 +76,7 @@ static void map_keycode(int fd, const char *devnode, int scancode, const char *k
                 unsigned key;
         } map;
         char *endptr;
-        const struct key *k;
+        const struct key_name *k;
         unsigned keycode_num;
 
         /* translate identifier to key code */
@@ -173,6 +173,9 @@ static void set_trackpoint_sensitivity(struct udev_device *dev, const char *valu
         if (r < 0) {
                 log_error("Unable to parse POINTINGSTICK_SENSITIVITY '%s' for '%s'", value, udev_device_get_devnode(dev));
                 return;
+        } else if (val_i < 0 || val_i > 255) {
+                log_error("POINTINGSTICK_SENSITIVITY %d outside range [0..255] for '%s' ", val_i, udev_device_get_devnode(dev));
+                return;
         }
 
         xsprintf(val_s, "%d", val_i);
@@ -198,6 +201,7 @@ static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], boo
         unsigned release_count = 0;
         _cleanup_close_ int fd = -1;
         const char *node;
+        int has_abs = -1;
 
         node = udev_device_get_devnode(dev);
         if (!node) {
@@ -258,6 +262,24 @@ static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], boo
                                         return EXIT_FAILURE;
                         }
 
+                        if (has_abs == -1) {
+                                unsigned long bits;
+                                int rc;
+
+                                rc = ioctl(fd, EVIOCGBIT(0, sizeof(bits)), &bits);
+                                if (rc < 0) {
+                                        log_error_errno(errno, "Unable to EVIOCGBIT device \"%s\"", node);
+                                        return EXIT_FAILURE;
+                                }
+
+                                has_abs = !!(bits & (1 << EV_ABS));
+                                if (!has_abs)
+                                        log_warning("EVDEV_ABS override set but no EV_ABS present on device \"%s\"", node);
+                        }
+
+                        if (!has_abs)
+                                continue;
+
                         override_abs(fd, node, evcode, udev_list_entry_get_value(entry));
                 } else if (streq(key, "POINTINGSTICK_SENSITIVITY"))
                         set_trackpoint_sensitivity(dev, udev_list_entry_get_value(entry));
index a7be2a4..46eb611 100644 (file)
  *
  * Type of names:
  *   b<number>                             — BCMA bus core number
- *   c<bus_id>                             — CCW bus group name, without leading zeros [s390]
- *   o<index>[d<dev_port>]                 — on-board device index number
- *   s<slot>[f<function>][d<dev_port>]     — hotplug slot index number
+ *   c<bus_id>                             — bus id of a grouped CCW or CCW device,
+ *                                           with all leading zeros stripped [s390]
+ *   o<index>[n<phys_port_name>|d<dev_port>]
+ *                                         — on-board device index number
+ *   s<slot>[f<function>][n<phys_port_name>|d<dev_port>]
+ *                                         — hotplug slot index number
  *   x<MAC>                                — MAC address
- *   [P<domain>]p<bus>s<slot>[f<function>][d<dev_port>]
+ *   [P<domain>]p<bus>s<slot>[f<function>][n<phys_port_name>|d<dev_port>]
  *                                         — PCI geographical location
  *   [P<domain>]p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>]
  *                                         — USB port number chain
+ *   v<slot>                               - VIO slot number (IBM PowerVM)
+ *   a<vendor><model>i<instance>           — Platform bus ACPI instance id
  *
  * All multi-function PCI devices will carry the [f<function>] number in the
  * device name, including the function 0 device.
  *   /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/net/enp0s29u1u2
  *   ID_NET_NAME_MAC=enxd626b3450fb5
  *   ID_NET_NAME_PATH=enp0s29u1u2
+ *
+ * s390 grouped CCW interface:
+ *  /sys/devices/css0/0.0.0007/0.0.f5f0/group_device/net/encf5f0
+ *  ID_NET_NAME_MAC=enx026d3c00000a
+ *  ID_NET_NAME_PATH=encf5f0
  */
 
 #include <errno.h>
 #include <unistd.h>
 #include <linux/pci_regs.h>
 
+#include "dirent-util.h"
 #include "fd-util.h"
 #include "fileio.h"
 #include "stdio-util.h"
@@ -112,7 +123,9 @@ enum netname_type{
         NET_USB,
         NET_BCMA,
         NET_VIRTIO,
-        NET_CCWGROUP,
+        NET_CCW,
+        NET_VIO,
+        NET_PLATFORM,
 };
 
 struct netnames {
@@ -129,15 +142,29 @@ struct netnames {
 
         char usb_ports[IFNAMSIZ];
         char bcma_core[IFNAMSIZ];
-        char ccw_group[IFNAMSIZ];
+        char ccw_busid[IFNAMSIZ];
+        char vio_slot[IFNAMSIZ];
+        char platform_path[IFNAMSIZ];
 };
 
+/* skip intermediate virtio devices */
+static struct udev_device *skip_virtio(struct udev_device *dev) {
+        struct udev_device *parent = dev;
+
+        /* there can only ever be one virtio bus per parent device, so we can
+           safely ignore any virtio buses. see
+           <http://lists.linuxfoundation.org/pipermail/virtualization/2015-August/030331.html> */
+        while (parent && streq_ptr("virtio", udev_device_get_subsystem(parent)))
+                parent = udev_device_get_parent(parent);
+        return parent;
+}
+
 /* retrieve on-board index number and label from firmware */
 static int dev_pci_onboard(struct udev_device *dev, struct netnames *names) {
         unsigned dev_port = 0;
         size_t l;
         char *s;
-        const char *attr;
+        const char *attr, *port_name;
         int idx;
 
         /* ACPI _DSM  — device specific method for naming a PCI or PCI Express device */
@@ -164,10 +191,15 @@ static int dev_pci_onboard(struct udev_device *dev, struct netnames *names) {
         if (attr)
                 dev_port = strtol(attr, NULL, 10);
 
+        /* kernel provided front panel port name for multiple port PCI device */
+        port_name = udev_device_get_sysattr_value(dev, "phys_port_name");
+
         s = names->pci_onboard;
         l = sizeof(names->pci_onboard);
         l = strpcpyf(&s, l, "o%d", idx);
-        if (dev_port > 0)
+        if (port_name)
+                l = strpcpyf(&s, l, "n%s", port_name);
+        else if (dev_port > 0)
                 l = strpcpyf(&s, l, "d%d", dev_port);
         if (l == 0)
                 names->pci_onboard[0] = '\0';
@@ -202,9 +234,9 @@ static int dev_pci_slot(struct udev_device *dev, struct netnames *names) {
         unsigned domain, bus, slot, func, dev_port = 0;
         size_t l;
         char *s;
-        const char *attr;
+        const char *attr, *port_name;
         struct udev_device *pci = NULL;
-        char slots[256], str[256];
+        char slots[PATH_MAX];
         _cleanup_closedir_ DIR *dir = NULL;
         struct dirent *dent;
         int hotplug_slot = 0, err = 0;
@@ -217,6 +249,9 @@ static int dev_pci_slot(struct udev_device *dev, struct netnames *names) {
         if (attr)
                 dev_port = strtol(attr, NULL, 10);
 
+        /* kernel provided front panel port name for multiple port PCI device */
+        port_name = udev_device_get_sysattr_value(dev, "phys_port_name");
+
         /* compose a name based on the raw kernel's PCI bus, slot numbers */
         s = names->pci_path;
         l = sizeof(names->pci_path);
@@ -225,7 +260,9 @@ static int dev_pci_slot(struct udev_device *dev, struct netnames *names) {
         l = strpcpyf(&s, l, "p%us%u", bus, slot);
         if (func > 0 || is_pci_multifunction(names->pcidev))
                 l = strpcpyf(&s, l, "f%u", func);
-        if (dev_port > 0)
+        if (port_name)
+                l = strpcpyf(&s, l, "n%s", port_name);
+        else if (dev_port > 0)
                 l = strpcpyf(&s, l, "d%u", dev_port);
         if (l == 0)
                 names->pci_path[0] = '\0';
@@ -236,17 +273,17 @@ static int dev_pci_slot(struct udev_device *dev, struct netnames *names) {
                 err = -ENOENT;
                 goto out;
         }
-        xsprintf(slots, "%s/slots", udev_device_get_syspath(pci));
+
+        snprintf(slots, sizeof slots, "%s/slots", udev_device_get_syspath(pci));
         dir = opendir(slots);
         if (!dir) {
                 err = -errno;
                 goto out;
         }
 
-        for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
+        FOREACH_DIRENT_ALL(dent, dir, break) {
                 int i;
-                char *rest;
-                char *address;
+                char *rest, *address, str[PATH_MAX];
 
                 if (dent->d_name[0] == '.')
                         continue;
@@ -255,7 +292,8 @@ static int dev_pci_slot(struct udev_device *dev, struct netnames *names) {
                         continue;
                 if (i < 1)
                         continue;
-                xsprintf(str, "%s/%s/address", slots, dent->d_name);
+
+                snprintf(str, sizeof str, "%s/%s/address", slots, dent->d_name);
                 if (read_one_line_file(str, &address) >= 0) {
                         /* match slot address with device by stripping the function */
                         if (strneq(address, udev_device_get_sysname(names->pcidev), strlen(address)))
@@ -275,7 +313,9 @@ static int dev_pci_slot(struct udev_device *dev, struct netnames *names) {
                 l = strpcpyf(&s, l, "s%d", hotplug_slot);
                 if (func > 0 || is_pci_multifunction(names->pcidev))
                         l = strpcpyf(&s, l, "f%d", func);
-                if (dev_port > 0)
+                if (port_name)
+                        l = strpcpyf(&s, l, "n%s", port_name);
+                else if (dev_port > 0)
                         l = strpcpyf(&s, l, "d%d", dev_port);
                 if (l == 0)
                         names->pci_slot[0] = '\0';
@@ -285,6 +325,87 @@ out:
         return err;
 }
 
+static int names_vio(struct udev_device *dev, struct netnames *names) {
+        struct udev_device *parent;
+        unsigned busid, slotid, ethid;
+        const char *syspath;
+
+        /* check if our direct parent is a VIO device with no other bus in-between */
+        parent = udev_device_get_parent(dev);
+        if (!parent)
+                return -ENOENT;
+
+        if (!streq_ptr("vio", udev_device_get_subsystem(parent)))
+                 return -ENOENT;
+
+        /* The devices' $DEVPATH number is tied to (virtual) hardware (slot id
+         * selected in the HMC), thus this provides a reliable naming (e.g.
+         * "/devices/vio/30000002/net/eth1"); we ignore the bus number, as
+         * there should only ever be one bus, and then remove leading zeros. */
+        syspath = udev_device_get_syspath(dev);
+
+        if (sscanf(syspath, "/sys/devices/vio/%4x%4x/net/eth%u", &busid, &slotid, &ethid) != 3)
+                return -EINVAL;
+
+        xsprintf(names->vio_slot, "v%u", slotid);
+        names->type = NET_VIO;
+        return 0;
+}
+
+#define _PLATFORM_TEST "/sys/devices/platform/vvvvPPPP"
+#define _PLATFORM_PATTERN4 "/sys/devices/platform/%4s%4x:%2x/net/eth%u"
+#define _PLATFORM_PATTERN3 "/sys/devices/platform/%3s%4x:%2x/net/eth%u"
+
+static int names_platform(struct udev_device *dev, struct netnames *names, bool test) {
+        struct udev_device *parent;
+        char vendor[5];
+        unsigned model, instance, ethid;
+        const char *syspath, *pattern, *validchars;
+
+        /* check if our direct parent is a platform device with no other bus in-between */
+        parent = udev_device_get_parent(dev);
+        if (!parent)
+                return -ENOENT;
+
+        if (!streq_ptr("platform", udev_device_get_subsystem(parent)))
+                 return -ENOENT;
+
+        syspath = udev_device_get_syspath(dev);
+
+        /* syspath is too short, to have a valid ACPI instance */
+        if (strlen(syspath) < sizeof _PLATFORM_TEST)
+                return -EINVAL;
+
+        /* Vendor ID can be either PNP ID (3 chars A-Z) or ACPI ID (4 chars A-Z and numerals) */
+        if (syspath[sizeof _PLATFORM_TEST - 1] == ':') {
+                pattern = _PLATFORM_PATTERN4;
+                validchars = UPPERCASE_LETTERS DIGITS;
+        } else {
+                pattern = _PLATFORM_PATTERN3;
+                validchars = UPPERCASE_LETTERS;
+        }
+
+        /* Platform devices are named after ACPI table match, and instance id
+         * eg. "/sys/devices/platform/HISI00C2:00");
+         * The Vendor (3 or 4 char), followed by hexdecimal model number : instance id.
+         */
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+        if (sscanf(syspath, pattern, vendor, &model, &instance, &ethid) != 4)
+                return -EINVAL;
+#pragma GCC diagnostic pop
+
+        if (!in_charset(vendor, validchars))
+                return -ENOENT;
+
+        ascii_strlower(vendor);
+
+        xsprintf(names->platform_path, "a%s%xi%u", vendor, model, instance);
+        names->type = NET_PLATFORM;
+        return 0;
+}
+
 static int names_pci(struct udev_device *dev, struct netnames *names) {
         struct udev_device *parent;
 
@@ -292,12 +413,8 @@ static int names_pci(struct udev_device *dev, struct netnames *names) {
         assert(names);
 
         parent = udev_device_get_parent(dev);
-
-        /* there can only ever be one virtio bus per parent device, so we can
-           safely ignore any virtio buses. see
-           <http://lists.linuxfoundation.org/pipermail/virtualization/2015-August/030331.html> */
-        while (parent && streq_ptr("virtio", udev_device_get_subsystem(parent)))
-                parent = udev_device_get_parent(parent);
+        /* skip virtio subsystem if present */
+        parent = skip_virtio(parent);
 
         if (!parent)
                 return -ENOENT;
@@ -396,8 +513,9 @@ static int names_bcma(struct udev_device *dev, struct netnames *names) {
 
 static int names_ccw(struct  udev_device *dev, struct netnames *names) {
         struct udev_device *cdev;
-        const char *bus_id;
+        const char *bus_id, *subsys;
         size_t bus_id_len;
+        size_t bus_id_start;
         int rc;
 
         assert(dev);
@@ -405,14 +523,17 @@ static int names_ccw(struct  udev_device *dev, struct netnames *names) {
 
         /* Retrieve the associated CCW device */
         cdev = udev_device_get_parent(dev);
+        /* skip virtio subsystem if present */
+        cdev = skip_virtio(cdev);
         if (!cdev)
                 return -ENOENT;
 
-        /* Network devices are always grouped CCW devices */
-        if (!streq_ptr("ccwgroup", udev_device_get_subsystem(cdev)))
+        /* Network devices are either single or grouped CCW devices */
+        subsys = udev_device_get_subsystem(cdev);
+        if (!STRPTR_IN_SET(subsys, "ccwgroup", "ccw"))
                 return -ENOENT;
 
-        /* Retrieve bus-ID of the grouped CCW device.  The bus-ID uniquely
+        /* Retrieve bus-ID of the CCW device.  The bus-ID uniquely
          * identifies the network device on the Linux on System z channel
          * subsystem.  Note that the bus-ID contains lowercase characters.
          */
@@ -431,14 +552,15 @@ static int names_ccw(struct  udev_device *dev, struct netnames *names) {
         /* Strip leading zeros from the bus id for aesthetic purposes. This
          * keeps the ccw names stable, yet much shorter in general case of
          * bus_id 0.0.0600 -> 600. This is similar to e.g. how PCI domain is
-         * not prepended when it is zero.
+         * not prepended when it is zero. Preserve the last 0 for 0.0.0000.
          */
-        bus_id += strspn(bus_id, ".0");
+        bus_id_start = strspn(bus_id, ".0");
+        bus_id += bus_id_start < bus_id_len ? bus_id_start : bus_id_len - 1;
 
         /* Store the CCW bus-ID for use as network device name */
-        rc = snprintf(names->ccw_group, sizeof(names->ccw_group), "c%s", bus_id);
-        if (rc >= 0 && rc < (int)sizeof(names->ccw_group))
-                names->type = NET_CCWGROUP;
+        rc = snprintf(names->ccw_busid, sizeof(names->ccw_busid), "c%s", bus_id);
+        if (rc >= 0 && rc < (int)sizeof(names->ccw_busid))
+                names->type = NET_CCW;
         return 0;
 }
 
@@ -548,10 +670,30 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
 
         /* get path names for Linux on System z network devices */
         err = names_ccw(dev, &names);
-        if (err >= 0 && names.type == NET_CCWGROUP) {
+        if (err >= 0 && names.type == NET_CCW) {
+                char str[IFNAMSIZ];
+
+                if (snprintf(str, sizeof(str), "%s%s", prefix, names.ccw_busid) < (int)sizeof(str))
+                        udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
+                goto out;
+        }
+
+        /* get ibmveth/ibmvnic slot-based names. */
+        err = names_vio(dev, &names);
+        if (err >= 0 && names.type == NET_VIO) {
+                char str[IFNAMSIZ];
+
+                if (snprintf(str, sizeof(str), "%s%s", prefix, names.vio_slot) < (int)sizeof(str))
+                        udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str);
+                goto out;
+        }
+
+        /* get ACPI path names for ARM64 platform devices */
+        err = names_platform(dev, &names, test);
+        if (err >= 0 && names.type == NET_PLATFORM) {
                 char str[IFNAMSIZ];
 
-                if (snprintf(str, sizeof(str), "%s%s", prefix, names.ccw_group) < (int)sizeof(str))
+                if (snprintf(str, sizeof(str), "%s%s", prefix, names.platform_path) < (int)sizeof(str))
                         udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
                 goto out;
         }
index 6e9adc6..8cb330d 100644 (file)
@@ -20,7 +20,6 @@
  */
 
 #include <ctype.h>
-#include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <getopt.h>
@@ -31,6 +30,7 @@
 #include <unistd.h>
 
 #include "alloc-util.h"
+#include "dirent-util.h"
 #include "string-util.h"
 #include "udev.h"
 
@@ -405,7 +405,7 @@ static struct udev_device *handle_scsi_default(struct udev_device *parent, char
                 parent = NULL;
                 goto out;
         }
-        for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
+        FOREACH_DIRENT_ALL(dent, dir, break) {
                 char *rest;
                 int i;
 
@@ -664,11 +664,8 @@ static int builtin_path_id(struct udev_device *dev, int argc, char *argv[], bool
                         parent = skip_subsystem(parent, "xen");
                         supported_parent = true;
                 } else if (streq(subsys, "virtio")) {
-                        while (parent && streq_ptr("virtio", udev_device_get_subsystem(parent)))
-                                parent = udev_device_get_parent(parent);
-                        path_prepend(&path, "virtio-pci-%s", udev_device_get_sysname(parent));
+                        parent = skip_subsystem(parent, "virtio");
                         supported_transport = true;
-                        supported_parent = true;
                 } else if (streq(subsys, "scm")) {
                         path_prepend(&path, "scm-%s", udev_device_get_sysname(parent));
                         parent = skip_subsystem(parent, "scm");
@@ -693,6 +690,15 @@ static int builtin_path_id(struct udev_device *dev, int argc, char *argv[], bool
                         parent = skip_subsystem(parent, "iucv");
                         supported_transport = true;
                         supported_parent = true;
+                } else if (streq(subsys, "nvme")) {
+                        const char *nsid = udev_device_get_sysattr_value(dev, "nsid");
+
+                        if (nsid) {
+                                path_prepend(&path, "nvme-%s", nsid);
+                                parent = skip_subsystem(parent, "nvme");
+                                supported_parent = true;
+                                supported_transport = true;
+                        }
                 }
 
                 if (parent)
index f68a09d..92e4f8d 100644 (file)
@@ -20,7 +20,7 @@
 
 #include "alloc-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "socket-util.h"
 #include "udev.h"
 
@@ -211,8 +211,7 @@ struct udev_ctrl_connection *udev_ctrl_get_connection(struct udev_ctrl *uctrl) {
 err:
         if (conn->sock >= 0)
                 close(conn->sock);
-        free(conn);
-        return NULL;
+        return mfree(conn);
 }
 
 struct udev_ctrl_connection *udev_ctrl_connection_ref(struct udev_ctrl_connection *conn) {
@@ -240,7 +239,7 @@ static int ctrl_send(struct udev_ctrl *uctrl, enum udev_ctrl_msg_type type, int
         int err = 0;
 
         memzero(&ctrl_msg_wire, sizeof(struct udev_ctrl_msg_wire));
-        strcpy(ctrl_msg_wire.version, "udev-" VERSION);
+        strcpy(ctrl_msg_wire.version, "udev-" PACKAGE_VERSION);
         ctrl_msg_wire.magic = UDEV_CTRL_MAGIC;
         ctrl_msg_wire.type = type;
 
index 54cd741..601f0ee 100644 (file)
@@ -32,7 +32,7 @@
 
 #include "alloc-util.h"
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "netlink-util.h"
 #include "process-util.h"
 #include "signal-util.h"
@@ -58,7 +58,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->birth_usec = clock_boottime_or_monotonic();
+        event->birth_usec = now(CLOCK_MONOTONIC);
         return event;
 }
 
@@ -73,27 +73,219 @@ void udev_event_unref(struct udev_event *event) {
         free(event);
 }
 
-size_t udev_event_apply_format(struct udev_event *event, const char *src, char *dest, size_t size) {
+enum subst_type {
+        SUBST_UNKNOWN,
+        SUBST_DEVNODE,
+        SUBST_ATTR,
+        SUBST_ENV,
+        SUBST_KERNEL,
+        SUBST_KERNEL_NUMBER,
+        SUBST_DRIVER,
+        SUBST_DEVPATH,
+        SUBST_ID,
+        SUBST_MAJOR,
+        SUBST_MINOR,
+        SUBST_RESULT,
+        SUBST_PARENT,
+        SUBST_NAME,
+        SUBST_LINKS,
+        SUBST_ROOT,
+        SUBST_SYS,
+};
+
+static size_t subst_format_var(struct udev_event *event, struct udev_device *dev,
+                               enum subst_type type, char *attr,
+                               char *dest, size_t l) {
+        char *s = dest;
+
+        switch (type) {
+        case SUBST_DEVPATH:
+                l = strpcpy(&s, l, udev_device_get_devpath(dev));
+                break;
+        case SUBST_KERNEL:
+                l = strpcpy(&s, l, udev_device_get_sysname(dev));
+                break;
+        case SUBST_KERNEL_NUMBER:
+                if (udev_device_get_sysnum(dev) == NULL)
+                        break;
+                l = strpcpy(&s, l, udev_device_get_sysnum(dev));
+                break;
+        case SUBST_ID:
+                if (event->dev_parent == NULL)
+                        break;
+                l = strpcpy(&s, l, udev_device_get_sysname(event->dev_parent));
+                break;
+        case SUBST_DRIVER: {
+                const char *driver;
+
+                if (event->dev_parent == NULL)
+                        break;
+
+                driver = udev_device_get_driver(event->dev_parent);
+                if (driver == NULL)
+                        break;
+                l = strpcpy(&s, l, driver);
+                break;
+        }
+        case SUBST_MAJOR: {
+                char num[UTIL_PATH_SIZE];
+
+                sprintf(num, "%u", major(udev_device_get_devnum(dev)));
+                l = strpcpy(&s, l, num);
+                break;
+        }
+        case SUBST_MINOR: {
+                char num[UTIL_PATH_SIZE];
+
+                sprintf(num, "%u", minor(udev_device_get_devnum(dev)));
+                l = strpcpy(&s, l, num);
+                break;
+        }
+        case SUBST_RESULT: {
+                char *rest;
+                int i;
+
+                if (event->program_result == NULL)
+                        break;
+                /* get part of the result string */
+                i = 0;
+                if (attr != NULL)
+                        i = strtoul(attr, &rest, 10);
+                if (i > 0) {
+                        char result[UTIL_PATH_SIZE];
+                        char tmp[UTIL_PATH_SIZE];
+                        char *cpos;
+
+                        strscpy(result, sizeof(result), event->program_result);
+                        cpos = result;
+                        while (--i) {
+                                while (cpos[0] != '\0' && !isspace(cpos[0]))
+                                        cpos++;
+                                while (isspace(cpos[0]))
+                                        cpos++;
+                                if (cpos[0] == '\0')
+                                        break;
+                        }
+                        if (i > 0) {
+                                log_error("requested part of result string not found");
+                                break;
+                        }
+                        strscpy(tmp, sizeof(tmp), cpos);
+                        /* %{2+}c copies the whole string from the second part on */
+                        if (rest[0] != '+') {
+                                cpos = strchr(tmp, ' ');
+                                if (cpos)
+                                        cpos[0] = '\0';
+                        }
+                        l = strpcpy(&s, l, tmp);
+                } else {
+                        l = strpcpy(&s, l, event->program_result);
+                }
+                break;
+        }
+        case SUBST_ATTR: {
+                const char *value = NULL;
+                char vbuf[UTIL_NAME_SIZE];
+                size_t len;
+                int count;
+
+                if (attr == NULL) {
+                        log_error("missing file parameter for attr");
+                        break;
+                }
+
+                /* try to read the value specified by "[dmi/id]product_name" */
+                if (util_resolve_subsys_kernel(event->udev, attr, vbuf, sizeof(vbuf), 1) == 0)
+                        value = vbuf;
+
+                /* try to read the attribute the device */
+                if (value == NULL)
+                        value = udev_device_get_sysattr_value(event->dev, attr);
+
+                /* try to read the attribute of the parent device, other matches have selected */
+                if (value == NULL && event->dev_parent != NULL && event->dev_parent != event->dev)
+                        value = udev_device_get_sysattr_value(event->dev_parent, attr);
+
+                if (value == NULL)
+                        break;
+
+                /* strip trailing whitespace, and replace unwanted characters */
+                if (value != vbuf)
+                        strscpy(vbuf, sizeof(vbuf), value);
+                len = strlen(vbuf);
+                while (len > 0 && isspace(vbuf[--len]))
+                        vbuf[len] = '\0';
+                count = util_replace_chars(vbuf, UDEV_ALLOWED_CHARS_INPUT);
+                if (count > 0)
+                        log_debug("%i character(s) replaced" , count);
+                l = strpcpy(&s, l, vbuf);
+                break;
+        }
+        case SUBST_PARENT: {
+                struct udev_device *dev_parent;
+                const char *devnode;
+
+                dev_parent = udev_device_get_parent(event->dev);
+                if (dev_parent == NULL)
+                        break;
+                devnode = udev_device_get_devnode(dev_parent);
+                if (devnode != NULL)
+                        l = strpcpy(&s, l, devnode + strlen("/dev/"));
+                break;
+        }
+        case SUBST_DEVNODE:
+                if (udev_device_get_devnode(dev) != NULL)
+                        l = strpcpy(&s, l, udev_device_get_devnode(dev));
+                break;
+        case SUBST_NAME:
+                if (event->name != NULL)
+                        l = strpcpy(&s, l, event->name);
+                else if (udev_device_get_devnode(dev) != NULL)
+                        l = strpcpy(&s, l, udev_device_get_devnode(dev) + strlen("/dev/"));
+                else
+                        l = strpcpy(&s, l, udev_device_get_sysname(dev));
+                break;
+        case SUBST_LINKS: {
+                struct udev_list_entry *list_entry;
+
+                list_entry = udev_device_get_devlinks_list_entry(dev);
+                if (list_entry == NULL)
+                        break;
+                l = strpcpy(&s, l, udev_list_entry_get_name(list_entry) + strlen("/dev/"));
+                udev_list_entry_foreach(list_entry, udev_list_entry_get_next(list_entry))
+                        l = strpcpyl(&s, l, " ", udev_list_entry_get_name(list_entry) + strlen("/dev/"), NULL);
+                break;
+        }
+        case SUBST_ROOT:
+                l = strpcpy(&s, l, "/dev");
+                break;
+        case SUBST_SYS:
+                l = strpcpy(&s, l, "/sys");
+                break;
+        case SUBST_ENV:
+                if (attr == NULL) {
+                        break;
+                } else {
+                        const char *value;
+
+                        value = udev_device_get_property_value(event->dev, attr);
+                        if (value == NULL)
+                                break;
+                        l = strpcpy(&s, l, value);
+                        break;
+                }
+        default:
+                log_error("unknown substitution type=%i", type);
+                break;
+        }
+
+        return s - dest;
+}
+
+size_t udev_event_apply_format(struct udev_event *event,
+                               const char *src, char *dest, size_t size,
+                               bool replace_whitespace) {
         struct udev_device *dev = event->dev;
-        enum subst_type {
-                SUBST_UNKNOWN,
-                SUBST_DEVNODE,
-                SUBST_ATTR,
-                SUBST_ENV,
-                SUBST_KERNEL,
-                SUBST_KERNEL_NUMBER,
-                SUBST_DRIVER,
-                SUBST_DEVPATH,
-                SUBST_ID,
-                SUBST_MAJOR,
-                SUBST_MINOR,
-                SUBST_RESULT,
-                SUBST_PARENT,
-                SUBST_NAME,
-                SUBST_LINKS,
-                SUBST_ROOT,
-                SUBST_SYS,
-        };
         static const struct subst_map {
                 const char *name;
                 const char fmt;
@@ -132,6 +324,7 @@ size_t udev_event_apply_format(struct udev_event *event, const char *src, char *
                 enum subst_type type = SUBST_UNKNOWN;
                 char attrbuf[UTIL_PATH_SIZE];
                 char *attr = NULL;
+                size_t subst_len;
 
                 while (from[0] != '\0') {
                         if (from[0] == '$') {
@@ -200,186 +393,17 @@ subst:
                         attr = NULL;
                 }
 
-                switch (type) {
-                case SUBST_DEVPATH:
-                        l = strpcpy(&s, l, udev_device_get_devpath(dev));
-                        break;
-                case SUBST_KERNEL:
-                        l = strpcpy(&s, l, udev_device_get_sysname(dev));
-                        break;
-                case SUBST_KERNEL_NUMBER:
-                        if (udev_device_get_sysnum(dev) == NULL)
-                                break;
-                        l = strpcpy(&s, l, udev_device_get_sysnum(dev));
-                        break;
-                case SUBST_ID:
-                        if (event->dev_parent == NULL)
-                                break;
-                        l = strpcpy(&s, l, udev_device_get_sysname(event->dev_parent));
-                        break;
-                case SUBST_DRIVER: {
-                        const char *driver;
-
-                        if (event->dev_parent == NULL)
-                                break;
-
-                        driver = udev_device_get_driver(event->dev_parent);
-                        if (driver == NULL)
-                                break;
-                        l = strpcpy(&s, l, driver);
-                        break;
-                }
-                case SUBST_MAJOR: {
-                        char num[UTIL_PATH_SIZE];
-
-                        sprintf(num, "%u", major(udev_device_get_devnum(dev)));
-                        l = strpcpy(&s, l, num);
-                        break;
-                }
-                case SUBST_MINOR: {
-                        char num[UTIL_PATH_SIZE];
+                subst_len = subst_format_var(event, dev, type, attr, s, l);
 
-                        sprintf(num, "%u", minor(udev_device_get_devnum(dev)));
-                        l = strpcpy(&s, l, num);
-                        break;
-                }
-                case SUBST_RESULT: {
-                        char *rest;
-                        int i;
+                /* SUBST_RESULT handles spaces itself */
+                if (replace_whitespace && type != SUBST_RESULT)
+                        /* util_replace_whitespace can replace in-place,
+                         * and does nothing if subst_len == 0
+                         */
+                        subst_len = util_replace_whitespace(s, s, subst_len);
 
-                        if (event->program_result == NULL)
-                                break;
-                        /* get part of the result string */
-                        i = 0;
-                        if (attr != NULL)
-                                i = strtoul(attr, &rest, 10);
-                        if (i > 0) {
-                                char result[UTIL_PATH_SIZE];
-                                char tmp[UTIL_PATH_SIZE];
-                                char *cpos;
-
-                                strscpy(result, sizeof(result), event->program_result);
-                                cpos = result;
-                                while (--i) {
-                                        while (cpos[0] != '\0' && !isspace(cpos[0]))
-                                                cpos++;
-                                        while (isspace(cpos[0]))
-                                                cpos++;
-                                        if (cpos[0] == '\0')
-                                                break;
-                                }
-                                if (i > 0) {
-                                        log_error("requested part of result string not found");
-                                        break;
-                                }
-                                strscpy(tmp, sizeof(tmp), cpos);
-                                /* %{2+}c copies the whole string from the second part on */
-                                if (rest[0] != '+') {
-                                        cpos = strchr(tmp, ' ');
-                                        if (cpos)
-                                                cpos[0] = '\0';
-                                }
-                                l = strpcpy(&s, l, tmp);
-                        } else {
-                                l = strpcpy(&s, l, event->program_result);
-                        }
-                        break;
-                }
-                case SUBST_ATTR: {
-                        const char *value = NULL;
-                        char vbuf[UTIL_NAME_SIZE];
-                        size_t len;
-                        int count;
-
-                        if (attr == NULL) {
-                                log_error("missing file parameter for attr");
-                                break;
-                        }
-
-                        /* try to read the value specified by "[dmi/id]product_name" */
-                        if (util_resolve_subsys_kernel(event->udev, attr, vbuf, sizeof(vbuf), 1) == 0)
-                                value = vbuf;
-
-                        /* try to read the attribute the device */
-                        if (value == NULL)
-                                value = udev_device_get_sysattr_value(event->dev, attr);
-
-                        /* try to read the attribute of the parent device, other matches have selected */
-                        if (value == NULL && event->dev_parent != NULL && event->dev_parent != event->dev)
-                                value = udev_device_get_sysattr_value(event->dev_parent, attr);
-
-                        if (value == NULL)
-                                break;
-
-                        /* strip trailing whitespace, and replace unwanted characters */
-                        if (value != vbuf)
-                                strscpy(vbuf, sizeof(vbuf), value);
-                        len = strlen(vbuf);
-                        while (len > 0 && isspace(vbuf[--len]))
-                                vbuf[len] = '\0';
-                        count = util_replace_chars(vbuf, UDEV_ALLOWED_CHARS_INPUT);
-                        if (count > 0)
-                                log_debug("%i character(s) replaced" , count);
-                        l = strpcpy(&s, l, vbuf);
-                        break;
-                }
-                case SUBST_PARENT: {
-                        struct udev_device *dev_parent;
-                        const char *devnode;
-
-                        dev_parent = udev_device_get_parent(event->dev);
-                        if (dev_parent == NULL)
-                                break;
-                        devnode = udev_device_get_devnode(dev_parent);
-                        if (devnode != NULL)
-                                l = strpcpy(&s, l, devnode + strlen("/dev/"));
-                        break;
-                }
-                case SUBST_DEVNODE:
-                        if (udev_device_get_devnode(dev) != NULL)
-                                l = strpcpy(&s, l, udev_device_get_devnode(dev));
-                        break;
-                case SUBST_NAME:
-                        if (event->name != NULL)
-                                l = strpcpy(&s, l, event->name);
-                        else if (udev_device_get_devnode(dev) != NULL)
-                                l = strpcpy(&s, l, udev_device_get_devnode(dev) + strlen("/dev/"));
-                        else
-                                l = strpcpy(&s, l, udev_device_get_sysname(dev));
-                        break;
-                case SUBST_LINKS: {
-                        struct udev_list_entry *list_entry;
-
-                        list_entry = udev_device_get_devlinks_list_entry(dev);
-                        if (list_entry == NULL)
-                                break;
-                        l = strpcpy(&s, l, udev_list_entry_get_name(list_entry) + strlen("/dev/"));
-                        udev_list_entry_foreach(list_entry, udev_list_entry_get_next(list_entry))
-                                l = strpcpyl(&s, l, " ", udev_list_entry_get_name(list_entry) + strlen("/dev/"), NULL);
-                        break;
-                }
-                case SUBST_ROOT:
-                        l = strpcpy(&s, l, "/dev");
-                        break;
-                case SUBST_SYS:
-                        l = strpcpy(&s, l, "/sys");
-                        break;
-                case SUBST_ENV:
-                        if (attr == NULL) {
-                                break;
-                        } else {
-                                const char *value;
-
-                                value = udev_device_get_property_value(event->dev, attr);
-                                if (value == NULL)
-                                        break;
-                                l = strpcpy(&s, l, value);
-                                break;
-                        }
-                default:
-                        log_error("unknown substitution type=%i", type);
-                        break;
-                }
+                s += subst_len;
+                l -= subst_len;
         }
 
 out:
@@ -496,7 +520,7 @@ static void spawn_read(struct udev_event *event,
                 if (timeout_usec > 0) {
                         usec_t age_usec;
 
-                        age_usec = clock_boottime_or_monotonic() - event->birth_usec;
+                        age_usec = now(CLOCK_MONOTONIC) - event->birth_usec;
                         if (age_usec >= timeout_usec) {
                                 log_error("timeout '%s'", cmd);
                                 return;
@@ -647,13 +671,13 @@ static int spawn_wait(struct udev_event *event,
         if (timeout_usec > 0) {
                 usec_t usec, age_usec;
 
-                usec = now(clock_boottime_or_monotonic());
+                usec = now(CLOCK_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;
 
-                                r = sd_event_add_time(e, NULL, clock_boottime_or_monotonic(),
+                                r = sd_event_add_time(e, NULL, CLOCK_MONOTONIC,
                                                       usec + spawn.timeout_warn, USEC_PER_SEC,
                                                       on_spawn_timeout_warning, &spawn);
                                 if (r < 0)
@@ -662,7 +686,7 @@ static int spawn_wait(struct udev_event *event,
 
                         spawn.timeout = timeout_usec - age_usec;
 
-                        r = sd_event_add_time(e, NULL, clock_boottime_or_monotonic(),
+                        r = sd_event_add_time(e, NULL, CLOCK_MONOTONIC,
                                               usec + spawn.timeout, USEC_PER_SEC, on_spawn_timeout, &spawn);
                         if (r < 0)
                                 return r;
@@ -927,7 +951,7 @@ void udev_event_execute_run(struct udev_event *event, usec_t timeout_usec, usec_
                 const char *cmd = udev_list_entry_get_name(list_entry);
                 enum udev_builtin_cmd builtin_cmd = udev_list_entry_get_num(list_entry);
 
-                udev_event_apply_format(event, cmd, command, sizeof(command));
+                udev_event_apply_format(event, cmd, command, sizeof(command), false);
 
                 if (builtin_cmd < UDEV_BUILTIN_MAX)
                         udev_builtin_run(event->dev, builtin_cmd, command, false);
index 5d2997f..53cfd9c 100644 (file)
@@ -15,7 +15,6 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <stdbool.h>
@@ -25,7 +24,8 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
-#include "formats-util.h"
+#include "dirent-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "selinux-util.h"
 #include "smack-util.h"
@@ -129,6 +129,7 @@ exit:
 static const char *link_find_prioritized(struct udev_device *dev, bool add, const char *stackdir, char *buf, size_t bufsize) {
         struct udev *udev = udev_device_get_udev(dev);
         DIR *dir;
+        struct dirent *dent;
         int priority = 0;
         const char *target = NULL;
 
@@ -141,12 +142,10 @@ static const char *link_find_prioritized(struct udev_device *dev, bool add, cons
         dir = opendir(stackdir);
         if (dir == NULL)
                 return target;
-        for (;;) {
+        FOREACH_DIRENT_ALL(dent, dir, break) {
                 struct udev_device *dev_db;
-                struct dirent *dent;
 
-                dent = readdir(dir);
-                if (dent == NULL || dent->d_name[0] == '\0')
+                if (dent->d_name[0] == '\0')
                         break;
                 if (dent->d_name[0] == '.')
                         continue;
@@ -337,7 +336,7 @@ out:
 void udev_node_add(struct udev_device *dev, bool apply,
                    mode_t mode, uid_t uid, gid_t gid,
                    struct udev_list *seclabel_list) {
-        char filename[UTIL_PATH_SIZE];
+        char filename[sizeof("/dev/block/:") + 2*DECIMAL_STR_MAX(unsigned)];
         struct udev_list_entry *list_entry;
 
         log_debug("handling device node '%s', devnum=%s, mode=%#o, uid="UID_FMT", gid="GID_FMT,
@@ -360,7 +359,7 @@ void udev_node_add(struct udev_device *dev, bool apply,
 
 void udev_node_remove(struct udev_device *dev) {
         struct udev_list_entry *list_entry;
-        char filename[UTIL_PATH_SIZE];
+        char filename[sizeof("/dev/block/:") + 2*DECIMAL_STR_MAX(unsigned)];
 
         /* remove/update symlinks, remove symlinks from name index */
         udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(dev))
index 26fa52c..294a322 100644 (file)
@@ -16,7 +16,6 @@
  */
 
 #include <ctype.h>
-#include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <fnmatch.h>
@@ -31,6 +30,7 @@
 
 #include "alloc-util.h"
 #include "conf-files.h"
+#include "dirent-util.h"
 #include "escape.h"
 #include "fd-util.h"
 #include "fs-util.h"
@@ -474,6 +474,13 @@ static int add_token(struct udev_rules *rules, struct token *token) {
         return 0;
 }
 
+static void log_unknown_owner(int error, const char *entity, const char *owner) {
+        if (IN_SET(abs(error), ENOENT, ESRCH))
+                log_error("Specified %s '%s' unknown", entity, owner);
+        else
+                log_error_errno(error, "Error resolving %s '%s': %m", entity, owner);
+}
+
 static uid_t add_uid(struct udev_rules *rules, const char *owner) {
         unsigned int i;
         uid_t uid = 0;
@@ -489,12 +496,8 @@ static uid_t add_uid(struct udev_rules *rules, const char *owner) {
                 }
         }
         r = get_user_creds(&owner, &uid, NULL, NULL, NULL);
-        if (r < 0) {
-                if (r == -ENOENT || r == -ESRCH)
-                        log_error("specified user '%s' unknown", owner);
-                else
-                        log_error_errno(r, "error resolving user '%s': %m", owner);
-        }
+        if (r < 0)
+                log_unknown_owner(r, "user", owner);
 
         /* grow buffer if needed */
         if (rules->uids_cur+1 >= rules->uids_max) {
@@ -536,12 +539,8 @@ static gid_t add_gid(struct udev_rules *rules, const char *group) {
                 }
         }
         r = get_group_creds(&group, &gid);
-        if (r < 0) {
-                if (r == -ENOENT || r == -ESRCH)
-                        log_error("specified group '%s' unknown", group);
-                else
-                        log_error_errno(r, "error resolving group '%s': %m", group);
-        }
+        if (r < 0)
+                log_unknown_owner(r, "group", group);
 
         /* grow buffer if needed */
         if (rules->gids_cur+1 >= rules->gids_max) {
@@ -614,7 +613,7 @@ static int import_property_from_string(struct udev_device *dev, char *line) {
 
         /* unquote */
         if (val[0] == '"' || val[0] == '\'') {
-                if (val[len-1] != val[0]) {
+                if (len == 1 || val[len-1] != val[0]) {
                         log_debug("inconsistent quoting: '%s', skip", line);
                         return -1;
                 }
@@ -703,7 +702,7 @@ static void attr_subst_subdir(char *attr, size_t len) {
         if (dir == NULL)
                 return;
 
-        for (dent = readdir(dir); dent != NULL; dent = readdir(dir))
+        FOREACH_DIRENT_ALL(dent, dir, break)
                 if (dent->d_name[0] != '.') {
                         char n[strlen(dent->d_name) + strlen(tail) + 1];
 
@@ -814,7 +813,7 @@ static const char *get_key_attribute(struct udev *udev, char *str) {
                 attr++;
                 pos = strchr(attr, '}');
                 if (pos == NULL) {
-                        log_error("missing closing brace for format");
+                        log_error("Missing closing brace for format");
                         return NULL;
                 }
                 pos[0] = '\0';
@@ -1583,8 +1582,7 @@ struct udev_rules *udev_rules_unref(struct udev_rules *rules) {
         strbuf_cleanup(rules->strbuf);
         free(rules->uids);
         free(rules->gids);
-        free(rules);
-        return NULL;
+        return mfree(rules);
 }
 
 bool udev_rules_check_timestamp(struct udev_rules *rules) {
@@ -1677,7 +1675,7 @@ static int match_attr(struct udev_rules *rules, struct udev_device *dev, struct
         name = rules_str(rules, cur->key.attr_off);
         switch (cur->key.attrsubst) {
         case SB_FORMAT:
-                udev_event_apply_format(event, name, nbuf, sizeof(nbuf));
+                udev_event_apply_format(event, name, nbuf, sizeof(nbuf), false);
                 name = nbuf;
                 /* fall through */
         case SB_NONE:
@@ -1839,7 +1837,7 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                         _cleanup_free_ char *value = NULL;
                         size_t len;
 
-                        udev_event_apply_format(event, rules_str(rules, cur->key.attr_off), filename, sizeof(filename));
+                        udev_event_apply_format(event, rules_str(rules, cur->key.attr_off), filename, sizeof(filename), false);
                         sysctl_normalize(filename);
                         if (sysctl_read(filename, &value) < 0)
                                 goto nomatch;
@@ -1917,7 +1915,7 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                         struct stat statbuf;
                         int match;
 
-                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), filename, sizeof(filename));
+                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), filename, sizeof(filename), false);
                         if (util_resolve_subsys_kernel(event->udev, filename, filename, sizeof(filename), 0) != 0) {
                                 if (filename[0] != '/') {
                                         char tmp[UTIL_PATH_SIZE];
@@ -1943,7 +1941,7 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                         char result[UTIL_LINE_SIZE];
 
                         event->program_result = mfree(event->program_result);
-                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), program, sizeof(program));
+                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), program, sizeof(program), false);
                         log_debug("PROGRAM '%s' %s:%u",
                                   program,
                                   rules_str(rules, rule->rule.filename_off),
@@ -1970,7 +1968,7 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                 case TK_M_IMPORT_FILE: {
                         char import[UTIL_PATH_SIZE];
 
-                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), import, sizeof(import));
+                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), import, sizeof(import), false);
                         if (import_file_into_properties(event->dev, import) != 0)
                                 if (cur->key.op != OP_NOMATCH)
                                         goto nomatch;
@@ -1979,7 +1977,7 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                 case TK_M_IMPORT_PROG: {
                         char import[UTIL_PATH_SIZE];
 
-                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), import, sizeof(import));
+                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), import, sizeof(import), false);
                         log_debug("IMPORT '%s' %s:%u",
                                   import,
                                   rules_str(rules, rule->rule.filename_off),
@@ -2010,7 +2008,7 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                                 event->builtin_run |= (1 << cur->key.builtin_cmd);
                         }
 
-                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), command, sizeof(command));
+                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), command, sizeof(command), false);
                         log_debug("IMPORT builtin '%s' %s:%u",
                                   udev_builtin_name(cur->key.builtin_cmd),
                                   rules_str(rules, rule->rule.filename_off),
@@ -2078,7 +2076,7 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                 case TK_M_IMPORT_PARENT: {
                         char import[UTIL_PATH_SIZE];
 
-                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), import, sizeof(import));
+                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), import, sizeof(import), false);
                         if (import_parent_into_properties(event->dev, import) != 0)
                                 if (cur->key.op != OP_NOMATCH)
                                         goto nomatch;
@@ -2116,15 +2114,11 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                                 break;
                         if (cur->key.op == OP_ASSIGN_FINAL)
                                 event->owner_final = true;
-                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), owner, sizeof(owner));
+                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), owner, sizeof(owner), false);
                         event->owner_set = true;
                         r = get_user_creds(&ow, &event->uid, NULL, NULL, NULL);
                         if (r < 0) {
-                                if (r == -ENOENT || r == -ESRCH)
-                                        log_error("specified user '%s' unknown", owner);
-                                else
-                                        log_error_errno(r, "error resolving user '%s': %m", owner);
-
+                                log_unknown_owner(r, "user", owner);
                                 event->uid = 0;
                         }
                         log_debug("OWNER %u %s:%u",
@@ -2142,15 +2136,11 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                                 break;
                         if (cur->key.op == OP_ASSIGN_FINAL)
                                 event->group_final = true;
-                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), group, sizeof(group));
+                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), group, sizeof(group), false);
                         event->group_set = true;
                         r = get_group_creds(&gr, &event->gid);
                         if (r < 0) {
-                                if (r == -ENOENT || r == -ESRCH)
-                                        log_error("specified group '%s' unknown", group);
-                                else
-                                        log_error_errno(r, "error resolving group '%s': %m", group);
-
+                                log_unknown_owner(r, "group", group);
                                 event->gid = 0;
                         }
                         log_debug("GROUP %u %s:%u",
@@ -2166,7 +2156,7 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
 
                         if (event->mode_final)
                                 break;
-                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), mode_str, sizeof(mode_str));
+                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), mode_str, sizeof(mode_str), false);
                         mode = strtol(mode_str, &endptr, 8);
                         if (endptr[0] != '\0') {
                                 log_error("ignoring invalid mode '%s'", mode_str);
@@ -2219,10 +2209,16 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                                   rule->rule.filename_line);
                         break;
                 case TK_A_SECLABEL: {
+                        char label_str[UTIL_LINE_SIZE] = {};
                         const char *name, *label;
 
                         name = rules_str(rules, cur->key.attr_off);
-                        label = rules_str(rules, cur->key.value_off);
+                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), label_str, sizeof(label_str), false);
+                        if (label_str[0] != '\0')
+                                label = label_str;
+                        else
+                                label = rules_str(rules, cur->key.value_off);
+
                         if (cur->key.op == OP_ASSIGN || cur->key.op == OP_ASSIGN_FINAL)
                                 udev_list_cleanup(&event->seclabel_list);
                         udev_list_entry_add(&event->seclabel_list, name, label);
@@ -2251,10 +2247,10 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                                 char temp[UTIL_NAME_SIZE];
 
                                 /* append value separated by space */
-                                udev_event_apply_format(event, value, temp, sizeof(temp));
+                                udev_event_apply_format(event, value, temp, sizeof(temp), false);
                                 strscpyl(value_new, sizeof(value_new), value_old, " ", temp, NULL);
                         } else
-                                udev_event_apply_format(event, value, value_new, sizeof(value_new));
+                                udev_event_apply_format(event, value, value_new, sizeof(value_new), false);
 
                         udev_device_add_property(event->dev, name, value_new);
                         break;
@@ -2263,7 +2259,7 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                         char tag[UTIL_PATH_SIZE];
                         const char *p;
 
-                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), tag, sizeof(tag));
+                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), tag, sizeof(tag), false);
                         if (cur->key.op == OP_ASSIGN || cur->key.op == OP_ASSIGN_FINAL)
                                 udev_device_cleanup_tags_list(event->dev);
                         for (p = tag; *p != '\0'; p++) {
@@ -2291,7 +2287,7 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                                 break;
                         if (cur->key.op == OP_ASSIGN_FINAL)
                                 event->name_final = true;
-                        udev_event_apply_format(event, name, name_str, sizeof(name_str));
+                        udev_event_apply_format(event, name, name_str, sizeof(name_str), false);
                         if (esc == ESCAPE_UNSET || esc == ESCAPE_REPLACE) {
                                 count = util_replace_chars(name_str, "/");
                                 if (count > 0)
@@ -2331,7 +2327,7 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                                 udev_device_cleanup_devlinks_list(event->dev);
 
                         /* allow  multiple symlinks separated by spaces */
-                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), temp, sizeof(temp));
+                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), temp, sizeof(temp), esc != ESCAPE_NONE);
                         if (esc == ESCAPE_UNSET)
                                 count = util_replace_chars(temp, "/ ");
                         else if (esc == ESCAPE_REPLACE)
@@ -2371,7 +2367,7 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                                 strscpyl(attr, sizeof(attr), udev_device_get_syspath(event->dev), "/", key_name, NULL);
                         attr_subst_subdir(attr, sizeof(attr));
 
-                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), value, sizeof(value));
+                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), value, sizeof(value), false);
                         log_debug("ATTR '%s' writing '%s' %s:%u", attr, value,
                                   rules_str(rules, rule->rule.filename_off),
                                   rule->rule.filename_line);
@@ -2387,9 +2383,9 @@ void udev_rules_apply_to_event(struct udev_rules *rules,
                         char value[UTIL_NAME_SIZE];
                         int r;
 
-                        udev_event_apply_format(event, rules_str(rules, cur->key.attr_off), filename, sizeof(filename));
+                        udev_event_apply_format(event, rules_str(rules, cur->key.attr_off), filename, sizeof(filename), false);
                         sysctl_normalize(filename);
-                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), value, sizeof(value));
+                        udev_event_apply_format(event, rules_str(rules, cur->key.value_off), value, sizeof(value), false);
                         log_debug("SYSCTL '%s' writing '%s' %s:%u", filename, value,
                                   rules_str(rules, rule->rule.filename_off), rule->rule.filename_line);
                         r = sysctl_write(filename, value);
@@ -2531,19 +2527,19 @@ int udev_rules_apply_static_dev_perms(struct udev_rules *rules) {
                         }
                         if (mode != (stats.st_mode & 01777)) {
                                 r = chmod(device_node, mode);
-                                if (r < 0) {
-                                        log_error("failed to chmod '%s' %#o", device_node, mode);
-                                        return -errno;
-                                else
+                                if (r < 0)
+                                        return log_error_errno(errno, "Failed to chmod '%s' %#o: %m",
+                                                               device_node, mode);
+                                else
                                         log_debug("chmod '%s' %#o", device_node, mode);
                         }
 
                         if ((uid != 0 && uid != stats.st_uid) || (gid != 0 && gid != stats.st_gid)) {
                                 r = chown(device_node, uid, gid);
-                                if (r < 0) {
-                                        log_error("failed to chown '%s' %u %u ", device_node, uid, gid);
-                                        return -errno;
-                                else
+                                if (r < 0)
+                                        return log_error_errno(errno, "Failed to chown '%s' %u %u: %m",
+                                                               device_node, uid, gid);
+                                else
                                         log_debug("chown '%s' %u %u", device_node, uid, gid);
                         }
 
index 9ce5e97..aa432bb 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <dirent.h>
 #include <errno.h>
 #include <stddef.h>
 #include <stdio.h>
 #include <sys/inotify.h>
 #include <unistd.h>
 
+#include "dirent-util.h"
 #include "stdio-util.h"
 #include "udev.h"
 
@@ -57,7 +57,7 @@ void udev_watch_restore(struct udev *udev) {
                         return;
                 }
 
-                for (ent = readdir(dir); ent != NULL; ent = readdir(dir)) {
+                FOREACH_DIRENT_ALL(ent, dir, break) {
                         char device[UTIL_PATH_SIZE];
                         ssize_t len;
                         struct udev_device *dev;
@@ -89,7 +89,7 @@ unlink:
 }
 
 void udev_watch_begin(struct udev *udev, struct udev_device *dev) {
-        char filename[UTIL_PATH_SIZE];
+        char filename[sizeof("/run/udev/watch/") + DECIMAL_STR_MAX(int)];
         int wd;
         int r;
 
@@ -116,7 +116,7 @@ void udev_watch_begin(struct udev *udev, struct udev_device *dev) {
 
 void udev_watch_end(struct udev *udev, struct udev_device *dev) {
         int wd;
-        char filename[UTIL_PATH_SIZE];
+        char filename[sizeof("/run/udev/watch/") + DECIMAL_STR_MAX(int)];
 
         if (inotify_fd < 0)
                 return;
@@ -135,7 +135,7 @@ void udev_watch_end(struct udev *udev, struct udev_device *dev) {
 }
 
 struct udev_device *udev_watch_lookup(struct udev *udev, int wd) {
-        char filename[UTIL_PATH_SIZE];
+        char filename[sizeof("/run/udev/watch/") + DECIMAL_STR_MAX(int)];
         char device[UTIL_NAME_SIZE];
         ssize_t len;
 
index 8433e8d..c0cb7ea 100644 (file)
@@ -80,7 +80,9 @@ int udev_rules_apply_static_dev_perms(struct udev_rules *rules);
 /* udev-event.c */
 struct udev_event *udev_event_new(struct udev_device *dev);
 void udev_event_unref(struct udev_event *event);
-size_t udev_event_apply_format(struct udev_event *event, const char *src, char *dest, size_t size);
+size_t udev_event_apply_format(struct udev_event *event,
+                               const char *src, char *dest, size_t size,
+                               bool replace_whitespace);
 int udev_event_apply_subsys_kernel(struct udev_event *event, const char *string,
                                    char *result, size_t maxsize, int read_value);
 int udev_event_spawn(struct udev_event *event,
index a0c2e82..e384a6f 100644 (file)
@@ -1,5 +1,5 @@
 Name: udev
 Description: udev
-Version: @VERSION@
+Version: @PACKAGE_VERSION@
 
 udevdir=@udevlibexecdir@
index 989decb..6f8e96a 100644 (file)
@@ -20,6 +20,7 @@
 #include <string.h>
 #include <unistd.h>
 
+#include "time-util.h"
 #include "udev-util.h"
 #include "udev.h"
 
@@ -60,7 +61,7 @@ static int adm_control(struct udev *udev, int argc, char *argv[]) {
         };
 
         if (getuid() != 0) {
-                fprintf(stderr, "root privileges required\n");
+                log_error("root privileges required");
                 return 1;
         }
 
@@ -81,7 +82,7 @@ static int adm_control(struct udev *udev, int argc, char *argv[]) {
 
                         i = util_log_priority(optarg);
                         if (i < 0) {
-                                fprintf(stderr, "invalid number '%s'\n", optarg);
+                                log_error("invalid number '%s'", optarg);
                                 return rc;
                         }
                         if (udev_ctrl_send_set_log_level(uctrl, util_log_priority(optarg), timeout) < 0)
@@ -110,7 +111,7 @@ static int adm_control(struct udev *udev, int argc, char *argv[]) {
                         break;
                 case 'p':
                         if (strchr(optarg, '=') == NULL) {
-                                fprintf(stderr, "expect <KEY>=<value> instead of '%s'\n", optarg);
+                                log_error("expect <KEY>=<value> instead of '%s'", optarg);
                                 return rc;
                         }
                         if (udev_ctrl_send_set_env(uctrl, optarg, timeout) < 0)
@@ -124,7 +125,7 @@ static int adm_control(struct udev *udev, int argc, char *argv[]) {
 
                         i = strtoul(optarg, &endp, 0);
                         if (endp[0] != '\0' || i < 1) {
-                                fprintf(stderr, "invalid number '%s'\n", optarg);
+                                log_error("invalid number '%s'", optarg);
                                 return rc;
                         }
                         if (udev_ctrl_send_set_children_max(uctrl, i, timeout) < 0)
@@ -134,13 +135,21 @@ static int adm_control(struct udev *udev, int argc, char *argv[]) {
                         break;
                 }
                 case 't': {
+                        usec_t s;
                         int seconds;
+                        int r;
 
-                        seconds = atoi(optarg);
-                        if (seconds >= 0)
+                        r = parse_sec(optarg, &s);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to parse timeout value '%s'.", optarg);
+
+                        if (((s + USEC_PER_SEC - 1) / USEC_PER_SEC) > INT_MAX)
+                                log_error("Timeout value is out of range.");
+                        else {
+                                seconds = s != USEC_INFINITY ? (int) ((s + USEC_PER_SEC - 1) / USEC_PER_SEC) : INT_MAX;
                                 timeout = seconds;
-                        else
-                                fprintf(stderr, "invalid timeout value\n");
+                                rc = 0;
+                        }
                         break;
                 }
                 case 'h':
@@ -150,9 +159,9 @@ static int adm_control(struct udev *udev, int argc, char *argv[]) {
                 }
 
         if (optind < argc)
-                fprintf(stderr, "Extraneous argument: %s\n", argv[optind]);
+                log_error("Extraneous argument: %s", argv[optind]);
         else if (optind == 1)
-                fprintf(stderr, "Option missing\n");
+                log_error("Option missing");
         return rc;
 }
 
index 1bffe8e..69b0b90 100644 (file)
@@ -352,7 +352,7 @@ static int trie_store(struct trie *trie, const char *filename) {
         int64_t size;
         struct trie_header_f h = {
                 .signature = HWDB_SIG,
-                .tool_version = htole64(atoi(VERSION)),
+                .tool_version = htole64(atoi(PACKAGE_VERSION)),
                 .header_size = htole64(sizeof(struct trie_header_f)),
                 .node_size = htole64(sizeof(struct trie_node_f)),
                 .child_entry_size = htole64(sizeof(struct trie_child_entry_f)),
@@ -653,7 +653,7 @@ static int adm_hwdb(struct udev *udev, int argc, char *argv[]) {
                 log_debug("strings dedup'ed: %8zu bytes (%8zu)",
                           trie->strings->dedup_len, trie->strings->dedup_count);
 
-                hwdb_bin = strjoin(root, "/", hwdb_bin_dir, "/hwdb.bin", NULL);
+                hwdb_bin = strjoin(root, "/", hwdb_bin_dir, "/hwdb.bin");
                 if (!hwdb_bin) {
                         rc = EXIT_FAILURE;
                         goto out;
index 6753c52..16b2aab 100644 (file)
@@ -16,7 +16,6 @@
  */
 
 #include <ctype.h>
-#include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <getopt.h>
@@ -26,6 +25,7 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
+#include "dirent-util.h"
 #include "fd-util.h"
 #include "string-util.h"
 #include "udev-util.h"
@@ -196,7 +196,7 @@ static void cleanup_dir(DIR *dir, mode_t mask, int depth) {
         if (depth <= 0)
                 return;
 
-        for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
+        FOREACH_DIRENT_ALL(dent, dir, break) {
                 struct stat stats;
 
                 if (dent->d_name[0] == '.')
@@ -376,7 +376,7 @@ static int uinfo(struct udev *udev, int argc, char *argv[]) {
                         export_prefix = optarg;
                         break;
                 case 'V':
-                        printf("%s\n", VERSION);
+                        printf("%s\n", PACKAGE_VERSION);
                         return 0;
                 case 'h':
                         help();
index f656c21..94a5918 100644 (file)
@@ -26,7 +26,7 @@
 #include <time.h>
 
 #include "fd-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "udev-util.h"
 #include "udev.h"
 
@@ -41,9 +41,9 @@ static void print_device(struct udev_device *device, const char *source, int pro
         struct timespec ts;
 
         assert_se(clock_gettime(CLOCK_MONOTONIC, &ts) == 0);
-        printf("%-6s[%"PRI_TIME".%06ld] %-8s %s (%s)\n",
+        printf("%-6s[%"PRI_TIME".%06"PRI_NSEC"] %-8s %s (%s)\n",
                source,
-               ts.tv_sec, ts.tv_nsec/1000,
+               ts.tv_sec, (nsec_t)ts.tv_nsec/1000,
                udev_device_get_action(device),
                udev_device_get_devpath(device),
                udev_device_get_subsystem(device));
index 702dbe5..e8ffe2f 100644 (file)
@@ -59,7 +59,7 @@ static int adm_test(struct udev *udev, int argc, char *argv[]) {
                 {}
         };
 
-        log_debug("version %s", VERSION);
+        log_debug("version %s", PACKAGE_VERSION);
 
         while ((c = getopt_long(argc, argv, "a:N:h", options, NULL)) >= 0)
                 switch (c) {
@@ -144,7 +144,7 @@ static int adm_test(struct udev *udev, int argc, char *argv[]) {
         udev_list_entry_foreach(entry, udev_list_get_entry(&event->run_list)) {
                 char program[UTIL_PATH_SIZE];
 
-                udev_event_apply_format(event, udev_list_entry_get_name(entry), program, sizeof(program));
+                udev_event_apply_format(event, udev_list_entry_get_name(entry), program, sizeof(program), false);
                 printf("run: '%s'\n", program);
         }
 out:
index a6a873e..befc3ba 100644 (file)
 #include "selinux-util.h"
 #include "string-util.h"
 #include "udev.h"
+#include "udev-util.h"
 
 static int adm_version(struct udev *udev, int argc, char *argv[]) {
-        printf("%s\n", VERSION);
+        printf("%s\n", PACKAGE_VERSION);
         return 0;
 }
 
@@ -87,14 +88,16 @@ int main(int argc, char *argv[]) {
         unsigned int i;
         int rc = 1, c;
 
-        udev = udev_new();
-        if (udev == NULL)
-                goto out;
-
+        udev_parse_config();
         log_parse_environment();
         log_open();
+
         mac_selinux_init();
 
+        udev = udev_new();
+        if (udev == NULL)
+                goto out;
+
         while ((c = getopt_long(argc, argv, "+dhV", options, NULL)) >= 0)
                 switch (c) {
 
index a893a2b..acbddd4 100644 (file)
@@ -49,7 +49,7 @@
 #include "dev-setup.h"
 #include "fd-util.h"
 #include "fileio.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "fs-util.h"
 #include "hashmap.h"
 #include "io-util.h"
@@ -284,12 +284,12 @@ static void worker_attach_event(struct worker *worker, struct event *event) {
 
         e = worker->manager->event;
 
-        assert_se(sd_event_now(e, clock_boottime_or_monotonic(), &usec) >= 0);
+        assert_se(sd_event_now(e, CLOCK_MONOTONIC, &usec) >= 0);
 
-        (void) sd_event_add_time(e, &event->timeout_warning, clock_boottime_or_monotonic(),
+        (void) sd_event_add_time(e, &event->timeout_warning, CLOCK_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(),
+        (void) sd_event_add_time(e, &event->timeout, CLOCK_MONOTONIC,
                                  usec + arg_event_timeout_usec, USEC_PER_SEC, on_event_timeout, event);
 }
 
@@ -755,9 +755,9 @@ static void manager_exit(Manager *manager) {
         event_queue_cleanup(manager, EVENT_QUEUED);
         manager_kill_workers(manager);
 
-        assert_se(sd_event_now(manager->event, clock_boottime_or_monotonic(), &usec) >= 0);
+        assert_se(sd_event_now(manager->event, CLOCK_MONOTONIC, &usec) >= 0);
 
-        r = sd_event_add_time(manager->event, NULL, clock_boottime_or_monotonic(),
+        r = sd_event_add_time(manager->event, NULL, CLOCK_MONOTONIC,
                               usec + 30 * USEC_PER_SEC, USEC_PER_SEC, on_exit_timeout, manager);
         if (r < 0)
                 return;
@@ -776,9 +776,9 @@ static void manager_reload(Manager *manager) {
         manager->rules = udev_rules_unref(manager->rules);
         udev_builtin_exit(manager->udev);
 
-        sd_notify(false,
-                  "READY=1\n"
-                  "STATUS=Processing...");
+        sd_notifyf(false,
+                   "READY=1\n"
+                   "STATUS=Processing with %u children at max", arg_children_max);
 }
 
 static void event_queue_start(Manager *manager) {
@@ -791,7 +791,7 @@ static void event_queue_start(Manager *manager) {
             manager->exit || manager->stop_exec_queue)
                 return;
 
-        assert_se(sd_event_now(manager->event, clock_boottime_or_monotonic(), &usec) >= 0);
+        assert_se(sd_event_now(manager->event, CLOCK_MONOTONIC, &usec) >= 0);
         /* check for changed config, every 3 seconds at most */
         if (manager->last_usec == 0 ||
             (usec - manager->last_usec) > 3 * USEC_PER_SEC) {
@@ -1000,6 +1000,10 @@ static int on_ctrl_msg(sd_event_source *s, int fd, uint32_t revents, void *userd
         if (i >= 0) {
                 log_debug("udevd message (SET_MAX_CHILDREN) received, children_max=%i", i);
                 arg_children_max = i;
+
+                (void) sd_notifyf(false,
+                                  "READY=1\n"
+                                  "STATUS=Processing with %u children at max", arg_children_max);
         }
 
         if (udev_ctrl_get_ping(ctrl_msg) > 0)
@@ -1206,7 +1210,7 @@ static int on_sigchld(sd_event_source *s, const struct signalfd_siginfo *si, voi
                         else
                                 log_warning("worker ["PID_FMT"] exited with return code %i", pid, WEXITSTATUS(status));
                 } else if (WIFSIGNALED(status)) {
-                        log_warning("worker ["PID_FMT"] terminated by signal %i (%s)", pid, WTERMSIG(status), strsignal(WTERMSIG(status)));
+                        log_warning("worker ["PID_FMT"] terminated by signal %i (%s)", pid, WTERMSIG(status), signal_to_string(WTERMSIG(status)));
                 } else if (WIFSTOPPED(status)) {
                         log_info("worker ["PID_FMT"] stopped", pid);
                         continue;
@@ -1341,7 +1345,7 @@ static int listen_fds(int *rctrl, int *rnetlink) {
                         return log_error_errno(netlink_fd, "could not get uevent fd: %m");
 
                 netlink_fd = fcntl(fd, F_DUPFD_CLOEXEC, 3);
-                if (ctrl_fd < 0)
+                if (netlink_fd < 0)
                         return log_error_errno(errno, "could not dup netlink fd: %m");
         }
 
@@ -1353,54 +1357,59 @@ static int listen_fds(int *rctrl, int *rnetlink) {
 
 /*
  * read the kernel command line, in case we need to get into debug mode
- *   udev.log-priority=<level>                 syslog priority
- *   udev.children-max=<number of workers>     events are fully serialized if set to 1
- *   udev.exec-delay=<number of seconds>       delay execution of every executed program
- *   udev.event-timeout=<number of seconds>    seconds to wait before terminating an event
+ *   udev.log_priority=<level>                 syslog priority
+ *   udev.children_max=<number of workers>     events are fully serialized if set to 1
+ *   udev.exec_delay=<number of seconds>       delay execution of every executed program
+ *   udev.event_timeout=<number of seconds>    seconds to wait before terminating an event
  */
-static int parse_proc_cmdline_item(const char *key, const char *value) {
-        const char *full_key = key;
-        int r;
+static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
+        int r = 0;
 
         assert(key);
 
         if (!value)
                 return 0;
 
-        if (startswith(key, "rd."))
-                key += strlen("rd.");
+        if (proc_cmdline_key_streq(key, "udev.log_priority")) {
 
-        if (startswith(key, "udev."))
-                key += strlen("udev.");
-        else
-                return 0;
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
-        if (streq(key, "log-priority")) {
-                int prio;
+                r = util_log_priority(value);
+                if (r >= 0)
+                        log_set_max_level(r);
+
+        } else if (proc_cmdline_key_streq(key, "udev.event_timeout")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
+                r = safe_atou64(value, &arg_event_timeout_usec);
+                if (r >= 0) {
+                        arg_event_timeout_usec *= USEC_PER_SEC;
+                        arg_event_timeout_warn_usec = (arg_event_timeout_usec / 3) ? : 1;
+                }
+
+        } else if (proc_cmdline_key_streq(key, "udev.children_max")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
 
-                prio = util_log_priority(value);
-                if (prio < 0)
-                        goto invalid;
-                log_set_max_level(prio);
-        } else if (streq(key, "children-max")) {
                 r = safe_atou(value, &arg_children_max);
-                if (r < 0)
-                        goto invalid;
-        } else if (streq(key, "exec-delay")) {
+
+        } else if (proc_cmdline_key_streq(key, "udev.exec_delay")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
                 r = safe_atoi(value, &arg_exec_delay);
-                if (r < 0)
-                        goto invalid;
-        } else if (streq(key, "event-timeout")) {
-                r = safe_atou64(value, &arg_event_timeout_usec);
-                if (r < 0)
-                        goto invalid;
-                arg_event_timeout_usec *= USEC_PER_SEC;
-                arg_event_timeout_warn_usec = (arg_event_timeout_usec / 3) ? : 1;
-        }
 
-        return 0;
-invalid:
-        log_warning("invalid %s ignored: %s", full_key, value);
+        } else if (startswith(key, "udev."))
+                log_warning("Unknown udev kernel command line option \"%s\"", key);
+
+        if (r < 0)
+                log_warning_errno(r, "Failed to parse \"%s=%s\", ignoring: %m", key, value);
+
         return 0;
 }
 
@@ -1483,7 +1492,7 @@ static int parse_argv(int argc, char *argv[]) {
                         help();
                         return 0;
                 case 'V':
-                        printf("%s\n", VERSION);
+                        printf("%s\n", PACKAGE_VERSION);
                         return 0;
                 case '?':
                         return -EINVAL;
@@ -1627,9 +1636,9 @@ static int run(int fd_ctrl, int fd_uevent, const char *cgroup) {
         if (r < 0)
                 log_error_errno(r, "failed to apply permissions on static device nodes: %m");
 
-        (void) sd_notify(false,
-                         "READY=1\n"
-                         "STATUS=Processing...");
+        (void) sd_notifyf(false,
+                          "READY=1\n"
+                          "STATUS=Processing with %u children at max", arg_children_max);
 
         r = sd_event_loop(manager->event);
         if (r < 0) {
@@ -1654,6 +1663,7 @@ int main(int argc, char *argv[]) {
         int r;
 
         log_set_target(LOG_TARGET_AUTO);
+        udev_parse_config();
         log_parse_environment();
         log_open();
 
@@ -1661,7 +1671,7 @@ int main(int argc, char *argv[]) {
         if (r <= 0)
                 goto exit;
 
-        r = parse_proc_cmdline(parse_proc_cmdline_item);
+        r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
         if (r < 0)
                 log_warning_errno(r, "failed to parse kernel command line, ignoring: %m");
 
@@ -1731,11 +1741,16 @@ int main(int argc, char *argv[]) {
         if (arg_daemonize) {
                 pid_t pid;
 
-                log_info("starting version " VERSION);
+                log_info("starting version " PACKAGE_VERSION);
 
                 /* connect /dev/null to stdin, stdout, stderr */
-                if (log_get_max_level() < LOG_DEBUG)
-                        (void) make_null_stdio();
+                if (log_get_max_level() < LOG_DEBUG) {
+                        r = make_null_stdio();
+                        if (r < 0)
+                                log_warning_errno(r, "Failed to redirect standard streams to /dev/null: %m");
+                }
+
+
 
                 pid = fork();
                 switch (pid) {
index da306a4..ec467f1 100644 (file)
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include "fd-util.h"
-#include "io-util.h"
+#include "alloc-util.h"
+#include "fileio-label.h"
 #include "selinux-util.h"
 #include "util.h"
 
 #define MESSAGE                                                         \
-        "This file was created by systemd-update-done. Its only \n"     \
-        "purpose is to hold a timestamp of the time this directory\n"   \
-        "was updated. See systemd-update-done.service(8).\n"
+        "# This file was created by systemd-update-done. Its only \n"   \
+        "# purpose is to hold a timestamp of the time this directory\n" \
+        "# was updated. See man:systemd-update-done.service(8).\n"
 
 static int apply_timestamp(const char *path, struct timespec *ts) {
-        struct timespec twice[2] = {
-                *ts,
-                *ts
-        };
-        struct stat st;
-
-        assert(path);
-        assert(ts);
-
-        if (stat(path, &st) >= 0) {
-                /* Is the timestamp file already newer than the OS? If
-                 * so, there's nothing to do. We ignore the nanosecond
-                 * component of the timestamp, since some file systems
-                 * do not support any better accuracy than 1s and we
-                 * have no way to identify the accuracy
-                 * available. Most notably ext4 on small disks (where
-                 * 128 byte inodes are used) does not support better
-                 * accuracy than 1s. */
-                if (st.st_mtim.tv_sec > ts->tv_sec)
-                        return 0;
-
-                /* It is older? Then let's update it */
-                if (utimensat(AT_FDCWD, path, twice, AT_SYMLINK_NOFOLLOW) < 0) {
-
-                        if (errno == EROFS)
-                                return log_debug("Can't update timestamp file %s, file system is read-only.", path);
-
-                        return log_error_errno(errno, "Failed to update timestamp on %s: %m", path);
-                }
-
-        } else if (errno == ENOENT) {
-                _cleanup_close_ int fd = -1;
-                int r;
-
-                /* The timestamp file doesn't exist yet? Then let's create it. */
-
-                r = mac_selinux_create_file_prepare(path, S_IFREG);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to set SELinux context for %s: %m", path);
-
-                fd = open(path, O_CREAT|O_EXCL|O_WRONLY|O_TRUNC|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW, 0644);
-                mac_selinux_create_file_clear();
-
-                if (fd < 0) {
-                        if (errno == EROFS)
-                                return log_debug("Can't create timestamp file %s, file system is read-only.", path);
-
-                        return log_error_errno(errno, "Failed to create timestamp file %s: %m", path);
-                }
-
-                (void) loop_write(fd, MESSAGE, strlen(MESSAGE), false);
-
-                if (futimens(fd, twice) < 0)
-                        return log_error_errno(errno, "Failed to update timestamp on %s: %m", path);
-        } else
-                log_error_errno(errno, "Failed to stat() timestamp file %s: %m", path);
-
+        _cleanup_free_ char *message = NULL;
+        int r;
+
+        /*
+         * We store the timestamp both as mtime of the file and in the file itself,
+         * to support filesystems which cannot store nanosecond-precision timestamps.
+         */
+
+        if (asprintf(&message,
+                     MESSAGE
+                     "TIMESTAMP_NSEC=" NSEC_FMT "\n",
+                     timespec_load_nsec(ts)) < 0)
+                return log_oom();
+
+        r = write_string_file_atomic_label_ts(path, message, ts);
+        if (r == -EROFS)
+                return log_debug("Cannot create \"%s\", file system is read-only.", path);
+        if (r < 0)
+                return log_error_errno(r, "Failed to write \"%s\": %m", path);
         return 0;
 }
 
index 8ae4a8a..ae9859c 100644 (file)
 #include "alloc-util.h"
 #include "bus-error.h"
 #include "bus-util.h"
-#include "formats-util.h"
+#include "format-util.h"
 #include "log.h"
 #include "macro.h"
 #include "special.h"
+#include "strv.h"
 #include "unit-name.h"
 #include "util.h"
 #include "utmp-wtmp.h"
@@ -107,7 +108,7 @@ static int get_current_runlevel(Context *c) {
                 if (r < 0)
                         return log_warning_errno(r, "Failed to get state: %s", bus_error_message(&error, r));
 
-                if (streq(state, "active") || streq(state, "reloading"))
+                if (STR_IN_SET(state, "active", "reloading"))
                         return table[i].runlevel;
         }
 
index 35b9ad5..84b4d57 100644 (file)
@@ -7,4 +7,4 @@
 
 # Each vtcon keeps its own state of fonts.
 #
-ACTION=="add", SUBSYSTEM=="vtconsole", KERNEL=="vtcon*", RUN+="@rootlibexecdir@/systemd-vconsole-setup"
+ACTION=="add", SUBSYSTEM=="vtconsole", KERNEL=="vtcon*", ATTR{name}!="*dummy device", RUN+="@rootlibexecdir@/systemd-vconsole-setup"
diff --git a/src/vconsole/meson.build b/src/vconsole/meson.build
new file mode 100644 (file)
index 0000000..1260b53
--- /dev/null
@@ -0,0 +1,8 @@
+if conf.get('ENABLE_VCONSOLE', false)
+        vconsole_rules = configure_file(
+                input : '90-vconsole.rules.in',
+                output : '90-vconsole.rules',
+                configuration : substs)
+        install_data(vconsole_rules,
+                     install_dir : udevrulesdir)
+endif
index 1118118..f531aec 100644 (file)
@@ -2,6 +2,7 @@
   This file is part of systemd.
 
   Copyright 2010 Kay Sievers
+  Copyright 2016 Michal Soltys <soltys@ziu.info>
 
   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
@@ -27,6 +28,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/ioctl.h>
+#include <sysexits.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "alloc-util.h"
 #include "signal-util.h"
 #include "stdio-util.h"
 #include "string-util.h"
+#include "strv.h"
 #include "terminal-util.h"
 #include "util.h"
 #include "virt.h"
 
-static bool is_vconsole(int fd) {
+static int verify_vc_device(int fd) {
         unsigned char data[1];
+        int r;
 
         data[0] = TIOCL_GETFGCONSOLE;
-        return ioctl(fd, TIOCLINUX, data) >= 0;
+        r = ioctl(fd, TIOCLINUX, data);
+        return r < 0 ? -errno : r;
 }
 
-static int disable_utf8(int fd) {
-        int r = 0, k;
+static int verify_vc_allocation(unsigned idx) {
+        char vcname[sizeof("/dev/vcs") + DECIMAL_STR_MAX(unsigned) - 2];
+        int r;
 
-        if (ioctl(fd, KDSKBMODE, K_XLATE) < 0)
-                r = -errno;
+        xsprintf(vcname, "/dev/vcs%u", idx);
+        r = access(vcname, F_OK);
+        return r < 0 ? -errno : r;
+}
 
-        k = loop_write(fd, "\033%@", 3, false);
-        if (k < 0)
-                r = k;
+static int verify_vc_allocation_byfd(int fd) {
+        struct vt_stat vcs = {};
+        int r;
 
-        k = write_string_file("/sys/module/vt/parameters/default_utf8", "0", 0);
-        if (k < 0)
-                r = k;
+        r = ioctl(fd, VT_GETSTATE, &vcs);
+        return r < 0 ? -errno : verify_vc_allocation(vcs.v_active);
+}
 
+static int verify_vc_kbmode(int fd) {
+        int r, curr_mode;
+
+        r = ioctl(fd, KDGKBMODE, &curr_mode);
+        /*
+         * Make sure we only adjust consoles in K_XLATE or K_UNICODE mode.
+         * Otherwise we would (likely) interfere with X11's processing of the
+         * key events.
+         *
+         * http://lists.freedesktop.org/archives/systemd-devel/2013-February/008573.html
+         */
         if (r < 0)
-                log_warning_errno(r, "Failed to disable UTF-8: %m");
+                return -errno;
 
-        return r;
+        return IN_SET(curr_mode, K_XLATE, K_UNICODE) ? 0 : -EBUSY;
 }
 
-static int enable_utf8(int fd) {
-        int r = 0, k;
-        long current = 0;
+static int toggle_utf8(const char *name, int fd, bool utf8) {
+        int r;
+        struct termios tc = {};
 
-        if (ioctl(fd, KDGKBMODE, &current) < 0 || current == K_XLATE) {
-                /*
-                 * Change the current keyboard to unicode, unless it
-                 * is currently in raw or off mode anyway. We
-                 * shouldn't interfere with X11's processing of the
-                 * key events.
-                 *
-                 * http://lists.freedesktop.org/archives/systemd-devel/2013-February/008573.html
-                 *
-                 */
+        assert(name);
 
-                if (ioctl(fd, KDSKBMODE, K_UNICODE) < 0)
-                        r = -errno;
+        r = ioctl(fd, KDSKBMODE, utf8 ? K_UNICODE : K_XLATE);
+        if (r < 0)
+                return log_warning_errno(errno, "Failed to %s UTF-8 kbdmode on %s: %m", enable_disable(utf8), name);
+
+        r = loop_write(fd, utf8 ? "\033%G" : "\033%@", 3, false);
+        if (r < 0)
+                return log_warning_errno(r, "Failed to %s UTF-8 term processing on %s: %m", enable_disable(utf8), name);
+
+        r = tcgetattr(fd, &tc);
+        if (r >= 0) {
+                SET_FLAG(tc.c_iflag, IUTF8, utf8);
+                r = tcsetattr(fd, TCSANOW, &tc);
         }
+        if (r < 0)
+                return log_warning_errno(errno, "Failed to %s iutf8 flag on %s: %m", enable_disable(utf8), name);
 
-        k = loop_write(fd, "\033%G", 3, false);
-        if (k < 0)
-                r = k;
+        log_debug("UTF-8 kbdmode %sd on %s", enable_disable(utf8), name);
+        return 0;
+}
 
-        k = write_string_file("/sys/module/vt/parameters/default_utf8", "1", 0);
-        if (k < 0)
-                r = k;
+static int toggle_utf8_sysfs(bool utf8) {
+        int r;
 
+        r = write_string_file("/sys/module/vt/parameters/default_utf8", one_zero(utf8), 0);
         if (r < 0)
-                log_warning_errno(r, "Failed to enable UTF-8: %m");
+                return log_warning_errno(r, "Failed to %s sysfs UTF-8 flag: %m", enable_disable(utf8));
 
-        return r;
+        log_debug("Sysfs UTF-8 flag %sd", enable_disable(utf8));
+        return 0;
 }
 
 static int keyboard_load_and_wait(const char *vc, const char *map, const char *map_toggle, bool utf8) {
+        _cleanup_free_ char *cmd = NULL;
         const char *args[8];
-        int i = 0, r;
+        unsigned i = 0;
         pid_t pid;
 
         /* An empty map means kernel map */
         if (isempty(map))
-                return 1;
+                return 0;
 
         args[i++] = KBD_LOADKEYS;
         args[i++] = "-q";
@@ -123,6 +148,9 @@ static int keyboard_load_and_wait(const char *vc, const char *map, const char *m
                 args[i++] = map_toggle;
         args[i++] = NULL;
 
+        log_debug("Executing \"%s\"...",
+                  strnull((cmd = strv_join((char**) args, " "))));
+
         pid = fork();
         if (pid < 0)
                 return log_error_errno(errno, "Failed to fork: %m");
@@ -135,36 +163,37 @@ static int keyboard_load_and_wait(const char *vc, const char *map, const char *m
                 _exit(EXIT_FAILURE);
         }
 
-        r = wait_for_terminate_and_warn(KBD_LOADKEYS, pid, true);
-        if (r < 0)
-                return r;
-
-        return r == 0;
+        return wait_for_terminate_and_warn(KBD_LOADKEYS, pid, true);
 }
 
 static int font_load_and_wait(const char *vc, const char *font, const char *map, const char *unimap) {
+        _cleanup_free_ char *cmd = NULL;
         const char *args[9];
-        int i = 0, r;
+        unsigned i = 0;
         pid_t pid;
 
-        /* An empty font means kernel font */
-        if (isempty(font))
-                return 1;
+        /* Any part can be set independently */
+        if (isempty(font) && isempty(map) && isempty(unimap))
+                return 0;
 
         args[i++] = KBD_SETFONT;
         args[i++] = "-C";
         args[i++] = vc;
-        args[i++] = font;
-        if (map) {
+        if (!isempty(map)) {
                 args[i++] = "-m";
                 args[i++] = map;
         }
-        if (unimap) {
+        if (!isempty(unimap)) {
                 args[i++] = "-u";
                 args[i++] = unimap;
         }
+        if (!isempty(font))
+                args[i++] = font;
         args[i++] = NULL;
 
+        log_debug("Executing \"%s\"...",
+                  strnull((cmd = strv_join((char**) args, " "))));
+
         pid = fork();
         if (pid < 0)
                 return log_error_errno(errno, "Failed to fork: %m");
@@ -177,26 +206,30 @@ static int font_load_and_wait(const char *vc, const char *font, const char *map,
                 _exit(EXIT_FAILURE);
         }
 
-        r = wait_for_terminate_and_warn(KBD_SETFONT, pid, true);
-        if (r < 0)
-                return r;
-
-        return r == 0;
+        return wait_for_terminate_and_warn(KBD_SETFONT, pid, true);
 }
 
 /*
- * A newly allocated VT uses the font from the active VT. Here
+ * A newly allocated VT uses the font from the source VT. Here
  * we update all possibly already allocated VTs with the configured
  * font. It also allows to restart systemd-vconsole-setup.service,
  * to apply a new font to all VTs.
+ *
+ * We also setup per-console utf8 related stuff: kbdmode, term
+ * processing, stty iutf8.
  */
-static void font_copy_to_all_vcs(int fd) {
-        struct vt_stat vcs = {};
-        unsigned char map8[E_TABSZ];
-        unsigned short map16[E_TABSZ];
+static void setup_remaining_vcs(int src_fd, unsigned src_idx, bool utf8) {
+        struct console_font_op cfo = {
+                .op = KD_FONT_OP_GET,
+                .width = UINT_MAX, .height = UINT_MAX,
+                .charcount = UINT_MAX,
+        };
+        struct unimapinit adv = {};
         struct unimapdesc unimapd;
         _cleanup_free_ struct unipair* unipairs = NULL;
-        int i, r;
+        _cleanup_free_ void *fontbuf = NULL;
+        unsigned i;
+        int r;
 
         unipairs = new(struct unipair, USHRT_MAX);
         if (!unipairs) {
@@ -204,66 +237,182 @@ static void font_copy_to_all_vcs(int fd) {
                 return;
         }
 
-        /* get active, and 16 bit mask of used VT numbers */
-        r = ioctl(fd, VT_GETSTATE, &vcs);
-        if (r < 0) {
-                log_debug_errno(errno, "VT_GETSTATE failed, ignoring: %m");
-                return;
+        /* get metadata of the current font (width, height, count) */
+        r = ioctl(src_fd, KDFONTOP, &cfo);
+        if (r < 0)
+                log_warning_errno(errno, "KD_FONT_OP_GET failed while trying to get the font metadata: %m");
+        else {
+                /* verify parameter sanity first */
+                if (cfo.width > 32 || cfo.height > 32 || cfo.charcount > 512)
+                        log_warning("Invalid font metadata - width: %u (max 32), height: %u (max 32), count: %u (max 512)",
+                                    cfo.width, cfo.height, cfo.charcount);
+                else {
+                        /*
+                         * Console fonts supported by the kernel are limited in size to 32 x 32 and maximum 512
+                         * characters. Thus with 1 bit per pixel it requires up to 65536 bytes. The height always
+                         * requries 32 per glyph, regardless of the actual height - see the comment above #define
+                         * max_font_size 65536 in drivers/tty/vt/vt.c for more details.
+                         */
+                        fontbuf = malloc((cfo.width + 7) / 8 * 32 * cfo.charcount);
+                        if (!fontbuf) {
+                                log_oom();
+                                return;
+                        }
+                        /* get fonts from the source console */
+                        cfo.data = fontbuf;
+                        r = ioctl(src_fd, KDFONTOP, &cfo);
+                        if (r < 0)
+                                log_warning_errno(errno, "KD_FONT_OP_GET failed while trying to read the font data: %m");
+                        else {
+                                unimapd.entries  = unipairs;
+                                unimapd.entry_ct = USHRT_MAX;
+                                r = ioctl(src_fd, GIO_UNIMAP, &unimapd);
+                                if (r < 0)
+                                        log_warning_errno(errno, "GIO_UNIMAP failed while trying to read unicode mappings: %m");
+                                else
+                                        cfo.op = KD_FONT_OP_SET;
+                        }
+                }
         }
 
-        for (i = 1; i <= 15; i++) {
-                char vcname[strlen("/dev/vcs") + DECIMAL_STR_MAX(int)];
-                _cleanup_close_ int vcfd = -1;
-                struct console_font_op cfo = {};
+        if (cfo.op != KD_FONT_OP_SET)
+                log_warning("Fonts will not be copied to remaining consoles");
+
+        for (i = 1; i <= 63; i++) {
+                char ttyname[sizeof("/dev/tty63")];
+                _cleanup_close_ int fd_d = -1;
+
+                if (i == src_idx || verify_vc_allocation(i) < 0)
+                        continue;
+
+                /* try to open terminal */
+                xsprintf(ttyname, "/dev/tty%u", i);
+                fd_d = open_terminal(ttyname, O_RDWR|O_CLOEXEC|O_NOCTTY);
+                if (fd_d < 0) {
+                        log_warning_errno(fd_d, "Unable to open tty%u, fonts will not be copied: %m", i);
+                        continue;
+                }
+
+                if (verify_vc_kbmode(fd_d) < 0)
+                        continue;
+
+                toggle_utf8(ttyname, fd_d, utf8);
+
+                if (cfo.op != KD_FONT_OP_SET)
+                        continue;
+
+                r = ioctl(fd_d, KDFONTOP, &cfo);
+                if (r < 0) {
+                        log_warning_errno(errno, "KD_FONT_OP_SET failed, fonts will not be copied to tty%u: %m", i);
+                        continue;
+                }
 
-                if (i == vcs.v_active)
+                /*
+                 * copy unicode translation table
+                 * unimapd is a ushort count and a pointer to an
+                 * array of struct unipair { ushort, ushort }
+                 */
+                r = ioctl(fd_d, PIO_UNIMAPCLR, &adv);
+                if (r < 0) {
+                        log_warning_errno(errno, "PIO_UNIMAPCLR failed, unimaps might be incorrect for tty%u: %m", i);
                         continue;
+                }
 
-                /* skip non-allocated ttys */
-                xsprintf(vcname, "/dev/vcs%i", i);
-                if (access(vcname, F_OK) < 0)
+                r = ioctl(fd_d, PIO_UNIMAP, &unimapd);
+                if (r < 0) {
+                        log_warning_errno(errno, "PIO_UNIMAP failed, unimaps might be incorrect for tty%u: %m", i);
                         continue;
+                }
+
+                log_debug("Font and unimap successfully copied to %s", ttyname);
+        }
+}
+
+static int find_source_vc(char **ret_path, unsigned *ret_idx) {
+        _cleanup_free_ char *path = NULL;
+        unsigned i;
+        int ret_fd, r, err = 0;
+
+        path = new(char, sizeof("/dev/tty63"));
+        if (path == NULL)
+                return log_oom();
 
-                xsprintf(vcname, "/dev/tty%i", i);
-                vcfd = open_terminal(vcname, O_RDWR|O_CLOEXEC);
-                if (vcfd < 0)
+        for (i = 1; i <= 63; i++) {
+                _cleanup_close_ int fd = -1;
+
+                r = verify_vc_allocation(i);
+                if (r < 0) {
+                        if (!err)
+                                err = -r;
                         continue;
+                }
 
-                /* copy font from active VT, where the font was uploaded to */
-                cfo.op = KD_FONT_OP_COPY;
-                cfo.height = vcs.v_active-1; /* tty1 == index 0 */
-                (void) ioctl(vcfd, KDFONTOP, &cfo);
-
-                /* copy map of 8bit chars */
-                if (ioctl(fd, GIO_SCRNMAP, map8) >= 0)
-                        (void) ioctl(vcfd, PIO_SCRNMAP, map8);
-
-                /* copy map of 8bit chars -> 16bit Unicode values */
-                if (ioctl(fd, GIO_UNISCRNMAP, map16) >= 0)
-                        (void) ioctl(vcfd, PIO_UNISCRNMAP, map16);
-
-                /* copy unicode translation table */
-                /* unimapd is a ushort count and a pointer to an
-                   array of struct unipair { ushort, ushort } */
-                unimapd.entries  = unipairs;
-                unimapd.entry_ct = USHRT_MAX;
-                if (ioctl(fd, GIO_UNIMAP, &unimapd) >= 0) {
-                        struct unimapinit adv = { 0, 0, 0 };
-
-                        (void) ioctl(vcfd, PIO_UNIMAPCLR, &adv);
-                        (void) ioctl(vcfd, PIO_UNIMAP, &unimapd);
+                sprintf(path, "/dev/tty%u", i);
+                fd = open_terminal(path, O_RDWR|O_CLOEXEC|O_NOCTTY);
+                if (fd < 0) {
+                        if (!err)
+                                err = -fd;
+                        continue;
+                }
+                r = verify_vc_kbmode(fd);
+                if (r < 0) {
+                        if (!err)
+                                err = -r;
+                        continue;
                 }
+
+                /* all checks passed, return this one as a source console */
+                *ret_idx = i;
+                *ret_path = path;
+                path = NULL;
+                ret_fd = fd;
+                fd = -1;
+                return ret_fd;
         }
+
+        return log_error_errno(err, "No usable source console found: %m");
+}
+
+static int verify_source_vc(char **ret_path, const char *src_vc) {
+        char *path;
+        _cleanup_close_ int fd = -1;
+        int ret_fd, r;
+
+        fd = open_terminal(src_vc, O_RDWR|O_CLOEXEC|O_NOCTTY);
+        if (fd < 0)
+                return log_error_errno(fd, "Failed to open %s: %m", src_vc);
+
+        r = verify_vc_device(fd);
+        if (r < 0)
+                return log_error_errno(r, "Device %s is not a virtual console: %m", src_vc);
+
+        r = verify_vc_allocation_byfd(fd);
+        if (r < 0)
+                return log_error_errno(r, "Virtual console %s is not allocated: %m", src_vc);
+
+        r = verify_vc_kbmode(fd);
+        if (r < 0)
+                return log_error_errno(r, "Virtual console %s is not in K_XLATE or K_UNICODE: %m", src_vc);
+
+        path = strdup(src_vc);
+        if (path == NULL)
+                return log_oom();
+
+        *ret_path = path;
+        ret_fd = fd;
+        fd = -1;
+        return ret_fd;
 }
 
 int main(int argc, char **argv) {
-        const char *vc;
         _cleanup_free_ char
+                *vc = NULL,
                 *vc_keymap = NULL, *vc_keymap_toggle = NULL,
                 *vc_font = NULL, *vc_font_map = NULL, *vc_font_unimap = NULL;
         _cleanup_close_ int fd = -1;
-        bool utf8, font_copy = false, font_ok, keyboard_ok;
-        int r = EXIT_FAILURE;
+        bool utf8, keyboard_ok;
+        unsigned idx = 0;
+        int r;
 
         log_set_target(LOG_TARGET_AUTO);
         log_parse_environment();
@@ -272,22 +421,12 @@ int main(int argc, char **argv) {
         umask(0022);
 
         if (argv[1])
-                vc = argv[1];
-        else {
-                vc = "/dev/tty0";
-                font_copy = true;
-        }
-
-        fd = open_terminal(vc, O_RDWR|O_CLOEXEC);
-        if (fd < 0) {
-                log_error_errno(fd, "Failed to open %s: %m", vc);
-                return EXIT_FAILURE;
-        }
+                fd = verify_source_vc(&vc, argv[1]);
+        else
+                fd = find_source_vc(&vc, &idx);
 
-        if (!is_vconsole(fd)) {
-                log_error("Device %s is not a virtual console.", vc);
+        if (fd < 0)
                 return EXIT_FAILURE;
-        }
 
         utf8 = is_locale_utf8();
 
@@ -298,7 +437,6 @@ int main(int argc, char **argv) {
                            "FONT_MAP", &vc_font_map,
                            "FONT_UNIMAP", &vc_font_unimap,
                            NULL);
-
         if (r < 0 && r != -ENOENT)
                 log_warning_errno(r, "Failed to read /etc/vconsole.conf: %m");
 
@@ -306,27 +444,36 @@ int main(int argc, char **argv) {
         if (detect_container() <= 0) {
                 r = parse_env_file("/proc/cmdline", WHITESPACE,
                                    "vconsole.keymap", &vc_keymap,
-                                   "vconsole.keymap.toggle", &vc_keymap_toggle,
+                                   "vconsole.keymap_toggle", &vc_keymap_toggle,
                                    "vconsole.font", &vc_font,
+                                   "vconsole.font_map", &vc_font_map,
+                                   "vconsole.font_unimap", &vc_font_unimap,
+                                   /* compatibility with obsolete multiple-dot scheme */
+                                   "vconsole.keymap.toggle", &vc_keymap_toggle,
                                    "vconsole.font.map", &vc_font_map,
                                    "vconsole.font.unimap", &vc_font_unimap,
                                    NULL);
-
                 if (r < 0 && r != -ENOENT)
                         log_warning_errno(r, "Failed to read /proc/cmdline: %m");
         }
 
-        if (utf8)
-                (void) enable_utf8(fd);
-        else
-                (void) disable_utf8(fd);
-
-        font_ok = font_load_and_wait(vc, vc_font, vc_font_map, vc_font_unimap) > 0;
-        keyboard_ok = keyboard_load_and_wait(vc, vc_keymap, vc_keymap_toggle, utf8) > 0;
-
-        /* Only copy the font when we executed setfont successfully */
-        if (font_copy && font_ok)
-                (void) font_copy_to_all_vcs(fd);
+        toggle_utf8_sysfs(utf8);
+        toggle_utf8(vc, fd, utf8);
+
+        r = font_load_and_wait(vc, vc_font, vc_font_map, vc_font_unimap);
+        keyboard_ok = keyboard_load_and_wait(vc, vc_keymap, vc_keymap_toggle, utf8) == 0;
+
+        if (idx > 0) {
+                if (r == 0)
+                        setup_remaining_vcs(fd, idx, utf8);
+                else if (r == EX_OSERR)
+                        /* setfont returns EX_OSERR when ioctl(KDFONTOP/PIO_FONTX/PIO_FONTX) fails.
+                         * This might mean various things, but in particular lack of a graphical
+                         * console. Let's be generous and not treat this as an error. */
+                        log_notice("Setting fonts failed with a \"system error\", ignoring.");
+                else
+                        log_warning("Setting source virtual console failed, ignoring remaining ones");
+        }
 
-        return font_ok && keyboard_ok ? EXIT_SUCCESS : EXIT_FAILURE;
+        return IN_SET(r, 0, EX_OSERR) && keyboard_ok ? EXIT_SUCCESS : EXIT_FAILURE;
 }
diff --git a/src/veritysetup/Makefile b/src/veritysetup/Makefile
new file mode 120000 (symlink)
index 0000000..d0b0e8e
--- /dev/null
@@ -0,0 +1 @@
+../Makefile
\ No newline at end of file
diff --git a/src/veritysetup/veritysetup-generator.c b/src/veritysetup/veritysetup-generator.c
new file mode 100644 (file)
index 0000000..0bb0bd6
--- /dev/null
@@ -0,0 +1,253 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <stdbool.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "alloc-util.h"
+#include "fd-util.h"
+#include "fileio.h"
+#include "fstab-util.h"
+#include "hexdecoct.h"
+#include "id128-util.h"
+#include "mkdir.h"
+#include "parse-util.h"
+#include "proc-cmdline.h"
+#include "string-util.h"
+#include "unit-name.h"
+
+static char *arg_dest = NULL;
+static bool arg_enabled = true;
+static char *arg_root_hash = NULL;
+static char *arg_data_what = NULL;
+static char *arg_hash_what = NULL;
+
+static int create_device(void) {
+        _cleanup_free_ char *u = NULL, *v = NULL, *d = NULL, *e = NULL;
+        _cleanup_fclose_ FILE *f = NULL;
+        const char *p, *to;
+        int r;
+
+        /* If all three pieces of information are missing, then verity is turned off */
+        if (!arg_root_hash && !arg_data_what && !arg_hash_what)
+                return 0;
+
+        /* if one of them is missing however, the data is simply incomplete and this is an error */
+        if (!arg_root_hash)
+                log_error("Verity information incomplete, root hash unspecified.");
+        if (!arg_data_what)
+                log_error("Verity information incomplete, root data device unspecified.");
+        if (!arg_hash_what)
+                log_error("Verity information incomplete, root hash device unspecified.");
+
+        if (!arg_root_hash || !arg_data_what || !arg_hash_what)
+                return -EINVAL;
+
+        log_debug("Using root verity data device %s,\n"
+                  "                  hash device %s,\n"
+                  "                and root hash %s.", arg_data_what, arg_hash_what, arg_root_hash);
+
+        p = strjoina(arg_dest, "/systemd-veritysetup@root.service");
+
+        u = fstab_node_to_udev_node(arg_data_what);
+        if (!u)
+                return log_oom();
+        v = fstab_node_to_udev_node(arg_hash_what);
+        if (!v)
+                return log_oom();
+
+        r = unit_name_from_path(u, ".device", &d);
+        if (r < 0)
+                return log_error_errno(r, "Failed to generate unit name: %m");
+        r = unit_name_from_path(v, ".device", &e);
+        if (r < 0)
+                return log_error_errno(r, "Failed to generate unit name: %m");
+
+        f = fopen(p, "wxe");
+        if (!f)
+                return log_error_errno(errno, "Failed to create unit file %s: %m", p);
+
+        fprintf(f,
+                "# Automatically generated by systemd-veritysetup-generator\n\n"
+                "[Unit]\n"
+                "Description=Integrity Protection Setup for %%I\n"
+                "Documentation=man:systemd-veritysetup-generator(8) man:systemd-veritysetup@.service(8)\n"
+                "SourcePath=/proc/cmdline\n"
+                "DefaultDependencies=no\n"
+                "Conflicts=umount.target\n"
+                "BindsTo=%s %s\n"
+                "IgnoreOnIsolate=true\n"
+                "After=cryptsetup-pre.target %s %s\n"
+                "Before=cryptsetup.target umount.target\n"
+                "\n[Service]\n"
+                "Type=oneshot\n"
+                "RemainAfterExit=yes\n"
+                "ExecStart=" ROOTLIBEXECDIR "/systemd-veritysetup attach root '%s' '%s' '%s'\n"
+                "ExecStop=" ROOTLIBEXECDIR "/systemd-veritysetup detach root\n",
+                d, e,
+                d, e,
+                u, v, arg_root_hash);
+
+        r = fflush_and_check(f);
+        if (r < 0)
+                return log_error_errno(r, "Failed to write file %s: %m", p);
+
+        to = strjoina(arg_dest, "/cryptsetup.target.requires/systemd-veritysetup@root.service");
+
+        (void) mkdir_parents(to, 0755);
+        if (symlink("../systemd-veritysetup@root.service", to) < 0)
+                return log_error_errno(errno, "Failed to create symlink %s: %m", to);
+
+        return 0;
+}
+
+static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
+        int r;
+
+        if (streq(key, "systemd.verity")) {
+
+                r = value ? parse_boolean(value) : 1;
+                if (r < 0)
+                        log_warning("Failed to parse verity= kernel command line switch %s. Ignoring.", value);
+                else
+                        arg_enabled = r;
+
+        } else if (streq(key, "roothash")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
+                r = free_and_strdup(&arg_root_hash, value);
+                if (r < 0)
+                        return log_oom();
+
+        } else if (streq(key, "systemd.verity_root_data")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
+                r = free_and_strdup(&arg_data_what, value);
+                if (r < 0)
+                        return log_oom();
+
+        } else if (streq(key, "systemd.verity_root_hash")) {
+
+                if (proc_cmdline_value_missing(key, value))
+                        return 0;
+
+                r = free_and_strdup(&arg_hash_what, value);
+                if (r < 0)
+                        return log_oom();
+        }
+
+        return 0;
+}
+
+static int determine_devices(void) {
+        _cleanup_free_ void *m = NULL;
+        sd_id128_t root_uuid, verity_uuid;
+        char ids[37];
+        size_t l;
+        int r;
+
+        /* Try to automatically derive the root data and hash device paths from the root hash */
+
+        if (!arg_root_hash)
+                return 0;
+
+        if (arg_data_what && arg_hash_what)
+                return 0;
+
+        r = unhexmem(arg_root_hash, strlen(arg_root_hash), &m, &l);
+        if (r < 0)
+                return log_error_errno(r, "Failed to parse root hash: %s", arg_root_hash);
+        if (l < sizeof(sd_id128_t)) {
+                log_debug("Root hash is shorter than 128 bits (32 characters), ignoring for discovering verity partition.");
+                return 0;
+        }
+
+        if (!arg_data_what) {
+                memcpy(&root_uuid, m, sizeof(root_uuid));
+
+                arg_data_what = strjoin("/dev/disk/by-partuuid/", id128_to_uuid_string(root_uuid, ids));
+                if (!arg_data_what)
+                        return log_oom();
+        }
+
+        if (!arg_hash_what) {
+                memcpy(&verity_uuid, (uint8_t*) m + l - sizeof(verity_uuid), sizeof(verity_uuid));
+
+                arg_hash_what = strjoin("/dev/disk/by-partuuid/", id128_to_uuid_string(verity_uuid, ids));
+                if (!arg_hash_what)
+                        return log_oom();
+        }
+
+        return 1;
+}
+
+int main(int argc, char *argv[]) {
+        int r;
+
+        if (argc > 1 && argc != 4) {
+                log_error("This program takes three or no arguments.");
+                return EXIT_FAILURE;
+        }
+
+        if (argc > 1)
+                arg_dest = argv[1];
+
+        log_set_target(LOG_TARGET_SAFE);
+        log_parse_environment();
+        log_open();
+
+        umask(0022);
+
+        r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
+        if (r < 0) {
+                log_warning_errno(r, "Failed to parse kernel command line: %m");
+                goto finish;
+        }
+
+        /* For now we only support the root device on verity. Later on we might want to add support for /etc/veritytab
+         * or similar to define additional mappings */
+
+        if (!arg_enabled) {
+                r = 0;
+                goto finish;
+        }
+
+        r = determine_devices();
+        if (r < 0)
+                goto finish;
+
+        r = create_device();
+        if (r < 0)
+                goto finish;
+
+        r = 0;
+
+finish:
+        free(arg_root_hash);
+        free(arg_data_what);
+        free(arg_hash_what);
+
+        return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+}
diff --git a/src/veritysetup/veritysetup.c b/src/veritysetup/veritysetup.c
new file mode 100644 (file)
index 0000000..f809d51
--- /dev/null
@@ -0,0 +1,154 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <libcryptsetup.h>
+#include <stdio.h>
+#include <sys/stat.h>
+
+#include "log.h"
+#include "hexdecoct.h"
+#include "string-util.h"
+#include "alloc-util.h"
+
+static char *arg_root_hash = NULL;
+static char *arg_data_what = NULL;
+static char *arg_hash_what = NULL;
+
+static int help(void) {
+        printf("%s attach VOLUME DATADEVICE HASHDEVICE ROOTHASH\n"
+               "%s detach VOLUME\n\n"
+               "Attaches or detaches an integrity protected block device.\n",
+               program_invocation_short_name,
+               program_invocation_short_name);
+
+        return 0;
+}
+
+static void log_glue(int level, const char *msg, void *usrptr) {
+        log_debug("%s", msg);
+}
+
+int main(int argc, char *argv[]) {
+        struct crypt_device *cd = NULL;
+        int r;
+
+        if (argc <= 1) {
+                r = help();
+                goto finish;
+        }
+
+        if (argc < 3) {
+                log_error("This program requires at least two arguments.");
+                r = -EINVAL;
+                goto finish;
+        }
+
+        log_set_target(LOG_TARGET_AUTO);
+        log_parse_environment();
+        log_open();
+
+        umask(0022);
+
+        if (streq(argv[1], "attach")) {
+                _cleanup_free_ void *m = NULL;
+                crypt_status_info status;
+                size_t l;
+
+                if (argc < 6) {
+                        log_error("attach requires at least two arguments.");
+                        r = -EINVAL;
+                        goto finish;
+                }
+
+                r = unhexmem(argv[5], strlen(argv[5]), &m, &l);
+                if (r < 0) {
+                        log_error("Failed to parse root hash.");
+                        goto finish;
+                }
+
+                r = crypt_init(&cd, argv[4]);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to open verity device %s: %m", argv[4]);
+                        goto finish;
+                }
+
+                crypt_set_log_callback(cd, log_glue, NULL);
+
+                status = crypt_status(cd, argv[2]);
+                if (status == CRYPT_ACTIVE || status == CRYPT_BUSY) {
+                        log_info("Volume %s already active.", argv[2]);
+                        r = 0;
+                        goto finish;
+                }
+
+                r = crypt_load(cd, CRYPT_VERITY, NULL);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to load verity superblock: %m");
+                        goto finish;
+                }
+
+                r = crypt_set_data_device(cd, argv[3]);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to configure data device: %m");
+                        goto finish;
+                }
+
+                r = crypt_activate_by_volume_key(cd, argv[2], m, l, CRYPT_ACTIVATE_READONLY);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to set up verity device: %m");
+                        goto finish;
+                }
+
+        } else if (streq(argv[1], "detach")) {
+
+                r = crypt_init_by_name(&cd, argv[2]);
+                if (r == -ENODEV) {
+                        log_info("Volume %s already inactive.", argv[2]);
+                        goto finish;
+                } else if (r < 0) {
+                        log_error_errno(r, "crypt_init_by_name() failed: %m");
+                        goto finish;
+                }
+
+                crypt_set_log_callback(cd, log_glue, NULL);
+
+                r = crypt_deactivate(cd, argv[2]);
+                if (r < 0) {
+                        log_error_errno(r, "Failed to deactivate: %m");
+                        goto finish;
+                }
+
+        } else {
+                log_error("Unknown verb %s.", argv[1]);
+                r = -EINVAL;
+                goto finish;
+        }
+
+        r = 0;
+
+finish:
+        if (cd)
+                crypt_free(cd);
+
+        free(arg_root_hash);
+        free(arg_data_what);
+        free(arg_hash_what);
+
+        return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+}
diff --git a/src/volatile-root/Makefile b/src/volatile-root/Makefile
new file mode 120000 (symlink)
index 0000000..d0b0e8e
--- /dev/null
@@ -0,0 +1 @@
+../Makefile
\ No newline at end of file
diff --git a/src/volatile-root/volatile-root.c b/src/volatile-root/volatile-root.c
new file mode 100644 (file)
index 0000000..3c0b6fa
--- /dev/null
@@ -0,0 +1,157 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2016 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 <sys/mount.h>
+
+#include "alloc-util.h"
+#include "fs-util.h"
+#include "mkdir.h"
+#include "mount-util.h"
+#include "stat-util.h"
+#include "volatile-util.h"
+#include "string-util.h"
+#include "path-util.h"
+
+static int make_volatile(const char *path) {
+        _cleanup_free_ char *old_usr = NULL;
+        int r;
+
+        r = path_is_mount_point(path, NULL, AT_SYMLINK_FOLLOW);
+        if (r < 0)
+                return log_error_errno(r, "Couldn't determine whether %s is a mount point: %m", path);
+        if (r == 0) {
+                log_error("%s is not a mount point.", path);
+                return -EINVAL;
+        }
+
+        r = path_is_temporary_fs(path);
+        if (r < 0)
+                return log_error_errno(r, "Couldn't determine whether %s is a temporary file system: %m", path);
+        if (r > 0) {
+                log_info("%s already is a temporary file system.", path);
+                return 0;
+        }
+
+        r = chase_symlinks("/usr", path, CHASE_PREFIX_ROOT, &old_usr);
+        if (r < 0)
+                return log_error_errno(r, "/usr not available in old root: %m");
+
+        r = mkdir_p("/run/systemd/volatile-sysroot", 0700);
+        if (r < 0)
+                return log_error_errno(r, "Couldn't generate volatile sysroot directory: %m");
+
+        r = mount_verbose(LOG_ERR, "tmpfs", "/run/systemd/volatile-sysroot", "tmpfs", MS_STRICTATIME, "mode=755");
+        if (r < 0)
+                goto finish_rmdir;
+
+        if (mkdir("/run/systemd/volatile-sysroot/usr", 0755) < 0) {
+                r = -errno;
+                goto finish_umount;
+        }
+
+        r = mount_verbose(LOG_ERR, old_usr, "/run/systemd/volatile-sysroot/usr", NULL, MS_BIND|MS_REC, NULL);
+        if (r < 0)
+                goto finish_umount;
+
+        r = bind_remount_recursive("/run/systemd/volatile-sysroot/usr", true, NULL);
+        if (r < 0)
+                goto finish_umount;
+
+        r = umount_recursive(path, 0);
+        if (r < 0) {
+                log_error_errno(r, "Failed to unmount %s: %m", path);
+                goto finish_umount;
+        }
+
+        if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL) < 0)
+                log_warning_errno(errno, "Failed to remount %s MS_SLAVE|MS_REC: %m", path);
+
+        r = mount_verbose(LOG_ERR, "/run/systemd/volatile-sysroot", path, NULL, MS_MOVE, NULL);
+
+finish_umount:
+        (void) umount_recursive("/run/systemd/volatile-sysroot", 0);
+
+finish_rmdir:
+        (void) rmdir("/run/systemd/volatile-sysroot");
+
+        return r;
+}
+
+int main(int argc, char *argv[]) {
+        VolatileMode m = _VOLATILE_MODE_INVALID;
+        const char *path;
+        int r;
+
+        log_set_target(LOG_TARGET_AUTO);
+        log_parse_environment();
+        log_open();
+
+        if (argc > 3) {
+                log_error("Too many arguments. Expected directory and mode.");
+                r = -EINVAL;
+                goto finish;
+        }
+
+        r = query_volatile_mode(&m);
+        if (r < 0) {
+                log_error_errno(r, "Failed to determine volatile mode from kernel command line.");
+                goto finish;
+        }
+        if (r == 0 && argc >= 2) {
+                /* The kernel command line always wins. However if nothing was set there, the argument passed here wins instead. */
+                m = volatile_mode_from_string(argv[1]);
+                if (m < 0) {
+                        log_error("Couldn't parse volatile mode: %s", argv[1]);
+                        r = -EINVAL;
+                        goto finish;
+                }
+        }
+
+        if (argc < 3)
+                path = "/sysroot";
+        else {
+                path = argv[2];
+
+                if (isempty(path)) {
+                        log_error("Directory name cannot be empty.");
+                        r = -EINVAL;
+                        goto finish;
+                }
+                if (!path_is_absolute(path)) {
+                        log_error("Directory must be specified as absolute path.");
+                        r = -EINVAL;
+                        goto finish;
+                }
+                if (path_equal(path, "/")) {
+                        log_error("Directory cannot be the root directory.");
+                        r = -EINVAL;
+                        goto finish;
+                }
+        }
+
+        if (m != VOLATILE_YES) {
+                r = 0;
+                goto finish;
+        }
+
+        r = make_volatile(path);
+
+finish:
+        return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+}
index d15f611..aff9930 100644 (file)
@@ -14,7 +14,8 @@
 # System Request functionality of the kernel (SYNC)
 #
 # Use kernel.sysrq = 1 to allow all keys.
-# See http://fedoraproject.org/wiki/QA/Sysrq for a list of values and keys.
+# See https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html for a list
+# of values and keys.
 kernel.sysrq = 16
 
 # Append the PID to the core filename
@@ -38,6 +39,3 @@ net.core.default_qdisc = fq_codel
 # Enable hard and soft link protection
 fs.protected_hardlinks = 1
 fs.protected_symlinks = 1
-
-# Max number of INotify instances per real user ID.
-fs.inotify.max_user_instances=1024
diff --git a/sysctl.d/meson.build b/sysctl.d/meson.build
new file mode 100644 (file)
index 0000000..1b6707d
--- /dev/null
@@ -0,0 +1,21 @@
+install_data(
+        '50-default.conf',
+        install_dir : sysctldir)
+
+in_files = []
+
+if conf.get('ENABLE_COREDUMP', false)
+        in_files += ['50-coredump.conf']
+endif
+
+foreach file : in_files
+        gen = configure_file(
+                input : file + '.in',
+                output : file,
+                configuration : substs)
+        install_data(gen,
+                     install_dir : sysctldir)
+endforeach
+
+meson.add_install_script('sh', '-c',
+                         mkdir_p.format(join_paths(sysconfdir, 'sysctl.d')))
index ee1b864..3ba4bb7 100644 (file)
@@ -17,16 +17,17 @@ enable systemd-networkd.service
 enable systemd-resolved.service
 
 disable console-getty.service
-disable console-shell.service
 disable debug-shell.service
 
 disable halt.target
 disable kexec.target
 disable poweroff.target
-disable reboot.target
+enable reboot.target
 disable rescue.target
+disable exit.target
 
 disable syslog.socket
 
 disable systemd-journal-gatewayd.*
-disable systemd-networkd-wait-online.service
+disable systemd-journal-remote.*
+disable systemd-journal-upload.*
index b2dc5eb..7d6021e 100644 (file)
@@ -29,6 +29,7 @@ g dialout -     -            -
 g disk    -     -            -
 g input   -     -            -
 g lp      -     -            -
+g kvm     -     -            -
 g tape    -     -            -
 g video   -     -            -
 
diff --git a/sysusers.d/meson.build b/sysusers.d/meson.build
new file mode 100644 (file)
index 0000000..b7c02cf
--- /dev/null
@@ -0,0 +1,31 @@
+in_files = ['basic.conf']
+
+enable_sysusers = conf.get('ENABLE_SYSUSERS', false)
+
+foreach file : in_files
+        gen = configure_file(
+                input : file + '.in',
+                output : file,
+                configuration : substs)
+        if enable_sysusers
+                install_data(gen,
+                             install_dir : sysusersdir)
+        endif
+endforeach
+
+m4_files = ['systemd.conf']
+
+if conf.get('ENABLE_REMOTE', false) and conf.get('HAVE_MICROHTTPD', false)
+        m4_files += ['systemd-remote.conf']
+endif
+
+foreach file : m4_files
+        custom_target(
+                'sysusers.d_' + file,
+                input : file + '.m4',
+                output: file,
+                command : [m4, '-P'] + m4_defines + ['@INPUT@'],
+                capture : true,
+                install : enable_sysusers,
+                install_dir : sysusersdir)
+endforeach
index fa7e73c..58f67f5 100644 (file)
@@ -3,7 +3,7 @@ subdirectories named "test/TEST-??-*", which are run one by one.
 
 To run the extended testsuite do the following:
 
-$ make all
+$ make all  # Avoid the "sudo make" below building anything as root
 $ cd test
 $ sudo make clean check
 ...
index 0c7d443..4892629 100755 (executable)
@@ -49,4 +49,32 @@ systemctl stop --job-mode=replace-irreversibly unstoppable.service || exit 1
 # Shutdown of the container/VM will hang if not.
 systemctl start unstoppable.service || exit 1
 
+# Test waiting for a started unit(s) to terminate again
+cat <<EOF >  /run/systemd/system/wait2.service
+[Unit]
+Description=Wait for 2 seconds
+[Service]
+ExecStart=/bin/sh -ec 'sleep 2'
+EOF
+cat <<EOF >  /run/systemd/system/wait5fail.service
+[Unit]
+Description=Wait for 5 seconds and fail
+[Service]
+ExecStart=/bin/sh -ec 'sleep 5; false'
+EOF
+
+# wait2 succeeds
+START_SEC=$(date -u '+%s')
+systemctl start --wait wait2.service || exit 1
+END_SEC=$(date -u '+%s')
+ELAPSED=$(($END_SEC-$START_SEC))
+[[ "$ELAPSED" -ge 2 ]] && [[ "$ELAPSED" -le 4 ]] || exit 1
+
+# wait5fail fails, so systemctl should fail
+START_SEC=$(date -u '+%s')
+! systemctl start --wait wait2.service wait5fail.service || exit 1
+END_SEC=$(date -u '+%s')
+ELAPSED=$(($END_SEC-$START_SEC))
+[[ "$ELAPSED" -ge 5 ]] && [[ "$ELAPSED" -le 7 ]] || exit 1
+
 touch /testok
index 6646ecc..493ff00 100755 (executable)
@@ -59,4 +59,12 @@ sleep 3
 systemctl stop forever-print-hola
 [[ ! -f "/i-lose-my-logs" ]]
 
+# https://github.com/systemd/systemd/issues/4408
+rm -f /i-lose-my-logs
+systemctl start forever-print-hola
+sleep 3
+systemctl kill --signal=SIGKILL systemd-journald
+sleep 3
+[[ ! -f "/i-lose-my-logs" ]]
+
 touch /testok
index e20f470..c252bdf 100755 (executable)
@@ -67,23 +67,23 @@ EOL
 systemctl start test.socket
 systemctl is-active test.socket
 [[ "$(stat --format='%G' /run/test.socket)" == adm ]]
-echo A | nc -U /run/test.socket
+echo A | nc -w1 -U /run/test.socket
 
 mv $U ${U}.disabled
 systemctl daemon-reload
 systemctl is-active test.socket
 [[ "$(stat --format='%G' /run/test.socket)" == adm ]]
-echo B | nc -U /run/test.socket && exit 1
+echo B | nc -w1 -U /run/test.socket && exit 1
 
 mv ${U}.disabled $U
 systemctl daemon-reload
 systemctl is-active test.socket
-echo C | nc -U /run/test.socket && exit 1
+echo C | nc -w1 -U /run/test.socket && exit 1
 [[ "$(stat --format='%G' /run/test.socket)" == adm ]]
 
 systemctl restart test.socket
 systemctl is-active test.socket
-echo D | nc -U /run/test.socket
+echo D | nc -w1 -U /run/test.socket
 [[ "$(stat --format='%G' /run/test.socket)" == adm ]]
 
 
diff --git a/test/TEST-13-NSPAWN-SMOKE/Makefile b/test/TEST-13-NSPAWN-SMOKE/Makefile
new file mode 100644 (file)
index 0000000..ff1470f
--- /dev/null
@@ -0,0 +1,11 @@
+all:
+       @make -s --no-print-directory -C ../.. all
+       @basedir=../.. TEST_BASE_DIR=../ ./test.sh --all
+setup:
+       @make --no-print-directory -C ../.. all
+       @basedir=../.. TEST_BASE_DIR=../ ./test.sh --setup
+clean:
+       @basedir=../.. TEST_BASE_DIR=../ ./test.sh --clean
+       @rm -f has-overflow
+run:
+       @basedir=../.. TEST_BASE_DIR=../ ./test.sh --run
diff --git a/test/TEST-13-NSPAWN-SMOKE/create-busybox-container b/test/TEST-13-NSPAWN-SMOKE/create-busybox-container
new file mode 100755 (executable)
index 0000000..868dfd8
--- /dev/null
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+set -e
+set -u
+set -o pipefail
+
+root="${1:?Usage $0 container-root}"
+mkdir -p "$root"
+mkdir "$root/bin"
+cp $(type -P busybox) "$root/bin"
+
+mkdir -p "$root/usr/lib"
+touch "$root/usr/lib/os-release"
+
+ln -s busybox "$root/bin/sh"
+ln -s busybox "$root/bin/cat"
+ln -s busybox "$root/bin/tr"
+ln -s busybox "$root/bin/ps"
+ln -s busybox "$root/bin/ip"
+
+mkdir -p "$root/sbin"
+cat <<'EOF' >"$root/sbin/init"
+#!/bin/sh
+
+printf "ps aufx:\n"
+ps aufx
+
+printf "/proc/1/cmdline:\n"
+printf "%s\n\n" "$(tr '\0' ' ' </proc/1/cmdline)"
+
+printf "/proc/1/environ:\n"
+printf "%s\n\n" "$(tr '\0' '\n' </proc/1/environ)"
+
+printf "/proc/1/mountinfo:\n"
+cat /proc/self/mountinfo
+printf "\n"
+
+printf "/proc/1/cgroup:\n"
+printf "%s\n\n" "$(cat /proc/1/cgroup)"
+
+printf "/proc/1/uid_map:\n"
+printf "%s\n\n" "$(cat /proc/1/uid_map)"
+
+printf "/proc/1/setgroups:\n"
+printf "%s\n\n" "$(cat /proc/1/setgroups)"
+
+printf "/proc/1/gid_map:\n"
+printf "%s\n\n" "$(cat /proc/1/gid_map)"
+
+printf "ip link:\n"
+ip link
+EOF
+chmod +x "$root/sbin/init"
diff --git a/test/TEST-13-NSPAWN-SMOKE/test.sh b/test/TEST-13-NSPAWN-SMOKE/test.sh
new file mode 100755 (executable)
index 0000000..75b9923
--- /dev/null
@@ -0,0 +1,162 @@
+#!/bin/bash
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+TEST_DESCRIPTION="systemd-nspawn smoke test"
+SKIP_INITRD=yes
+. $TEST_BASE_DIR/test-functions
+
+check_result_qemu() {
+    ret=1
+    mkdir -p $TESTDIR/root
+    mount ${LOOPDEV}p1 $TESTDIR/root
+    [[ -e $TESTDIR/root/testok ]] && ret=0
+    [[ -f $TESTDIR/root/failed ]] && cp -a $TESTDIR/root/failed $TESTDIR
+    cp -a $TESTDIR/root/var/log/journal $TESTDIR
+    umount $TESTDIR/root
+    [[ -f $TESTDIR/failed ]] && cat $TESTDIR/failed
+    ls -l $TESTDIR/journal/*/*.journal
+    test -s $TESTDIR/failed && ret=$(($ret+1))
+    return $ret
+}
+
+test_run() {
+    if run_qemu; then
+        check_result_qemu || return 1
+    else
+        dwarn "can't run QEMU, skipping"
+    fi
+    return 0
+}
+
+test_setup() {
+    create_empty_image
+    mkdir -p $TESTDIR/root
+    mount ${LOOPDEV}p1 $TESTDIR/root
+
+    # Create what will eventually be our root filesystem onto an overlay
+    (
+        LOG_LEVEL=5
+        eval $(udevadm info --export --query=env --name=${LOOPDEV}p2)
+
+        setup_basic_environment
+        dracut_install busybox chmod rmdir unshare
+
+        cp create-busybox-container $initdir/
+
+        ./create-busybox-container $initdir/nc-container
+        initdir="$initdir/nc-container" dracut_install nc
+
+        # setup the testsuite service
+        cat >$initdir/etc/systemd/system/testsuite.service <<EOF
+[Unit]
+Description=Testsuite service
+After=multi-user.target
+
+[Service]
+ExecStart=/test-nspawn.sh
+Type=oneshot
+EOF
+
+        cat >$initdir/test-nspawn.sh <<'EOF'
+#!/bin/bash
+set -x
+set -e
+set -u
+set -o pipefail
+
+export SYSTEMD_LOG_LEVEL=debug
+
+# check cgroup-v2
+is_v2_supported=no
+mkdir -p /tmp/cgroup2
+if mount -t cgroup2 cgroup2 /tmp/cgroup2; then
+    is_v2_supported=yes
+    umount /tmp/cgroup2
+fi
+rmdir /tmp/cgroup2
+
+# check cgroup namespaces
+is_cgns_supported=no
+if [[ -f /proc/1/ns/cgroup ]]; then
+    is_cgns_supported=yes
+fi
+
+is_user_ns_supported=no
+if unshare -U sh -c :; then
+    is_user_ns_supported=yes
+fi
+
+function check_bind_tmp_path {
+    # https://github.com/systemd/systemd/issues/4789
+    local _root="/var/lib/machines/bind-tmp-path"
+    /create-busybox-container "$_root"
+    >/tmp/bind
+    systemd-nspawn --register=no -D "$_root" --bind=/tmp/bind /bin/sh -c 'test -e /tmp/bind'
+}
+
+function check_notification_socket {
+    # https://github.com/systemd/systemd/issues/4944
+    local _cmd='echo a | $(busybox which nc) -U -u -w 1 /run/systemd/nspawn/notify'
+    systemd-nspawn --register=no -D /nc-container /bin/sh -x -c "$_cmd"
+    systemd-nspawn --register=no -D /nc-container -U /bin/sh -x -c "$_cmd"
+}
+
+function run {
+    if [[ "$1" = "yes" && "$is_v2_supported" = "no" ]]; then
+        printf "Unified cgroup hierarchy is not supported. Skipping.\n" >&2
+        return 0
+    fi
+    if [[ "$2" = "yes" && "$is_cgns_supported" = "no" ]];  then
+        printf "Cgroup namespaces are not supported. Skipping.\n" >&2
+        return 0
+    fi
+
+    local _root="/var/lib/machines/unified-$1-cgns-$2-api-vfs-writable-$3"
+    /create-busybox-container "$_root"
+    UNIFIED_CGROUP_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" -b
+    UNIFIED_CGROUP_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" --private-network -b
+
+    if UNIFIED_CGROUP_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" -U -b; then
+       [[ "$is_user_ns_supported" = "yes" && "$3" = "network" ]] && return 1
+    else
+       [[ "$is_user_ns_supported" = "no" && "$3" = "network" ]] && return 1
+    fi
+
+    if UNIFIED_CGROUP_HIERARCHY="$1" SYSTEMD_NSPAWN_USE_CGNS="$2" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$3" systemd-nspawn --register=no -D "$_root" --private-network -U -b; then
+       [[ "$is_user_ns_supported" = "yes" && "$3" = "yes" ]] && return 1
+    else
+       [[ "$is_user_ns_supported" = "no" && "$3" = "yes" ]] && return 1
+    fi
+
+    return 0
+}
+
+check_bind_tmp_path
+
+check_notification_socket
+
+for api_vfs_writable in yes no network; do
+    run no no $api_vfs_writable
+    run yes no $api_vfs_writable
+    run no yes $api_vfs_writable
+    run yes yes $api_vfs_writable
+done
+
+touch /testok
+EOF
+
+        chmod 0755 $initdir/test-nspawn.sh
+        setup_testsuite
+    ) || return 1
+
+    ddebug "umount $TESTDIR/root"
+    umount $TESTDIR/root
+}
+
+test_cleanup() {
+    umount $TESTDIR/root 2>/dev/null
+    [[ $LOOPDEV ]] && losetup -d $LOOPDEV
+    return 0
+}
+
+do_test "$@"
diff --git a/test/TEST-14-MACHINE-ID/Makefile b/test/TEST-14-MACHINE-ID/Makefile
new file mode 100644 (file)
index 0000000..5e89a29
--- /dev/null
@@ -0,0 +1,10 @@
+all:
+       @make -s --no-print-directory -C ../.. all
+       @basedir=../.. TEST_BASE_DIR=../ ./test.sh --all
+setup:
+       @make --no-print-directory -C ../.. all
+       @basedir=../.. TEST_BASE_DIR=../ ./test.sh --setup
+clean:
+       @basedir=../.. TEST_BASE_DIR=../ ./test.sh --clean
+run:
+       @basedir=../.. TEST_BASE_DIR=../ ./test.sh --run
diff --git a/test/TEST-14-MACHINE-ID/test.sh b/test/TEST-14-MACHINE-ID/test.sh
new file mode 100755 (executable)
index 0000000..35106e3
--- /dev/null
@@ -0,0 +1,119 @@
+#!/bin/bash
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+TEST_DESCRIPTION="Basic systemd setup"
+SKIP_INITRD=yes
+. $TEST_BASE_DIR/test-functions
+
+check_result_qemu() {
+    ret=1
+    mkdir -p $TESTDIR/root
+    mount ${LOOPDEV}p1 $TESTDIR/root
+    [[ -e $TESTDIR/root/testok ]] && ret=0
+    [[ -f $TESTDIR/root/failed ]] && cp -a $TESTDIR/root/failed $TESTDIR
+    cp -a $TESTDIR/root/var/log/journal $TESTDIR
+    umount $TESTDIR/root
+    [[ -f $TESTDIR/failed ]] && cat $TESTDIR/failed
+    ls -l $TESTDIR/journal/*/*.journal
+    test -s $TESTDIR/failed && ret=$(($ret+1))
+    return $ret
+}
+
+test_run() {
+    if run_qemu; then
+        check_result_qemu || return 1
+    else
+        dwarn "can't run QEMU, skipping"
+    fi
+    return 0
+}
+
+test_setup() {
+    create_empty_image
+    mkdir -p $TESTDIR/root
+    mount ${LOOPDEV}p1 $TESTDIR/root
+
+    # Create what will eventually be our root filesystem onto an overlay
+    (
+        LOG_LEVEL=5
+        eval $(udevadm info --export --query=env --name=${LOOPDEV}p2)
+
+        setup_basic_environment
+        printf "556f48e837bc4424a710fa2e2c9d3e3c\ne3d\n" >$initdir/etc/machine-id
+        dracut_install mount cmp
+
+        # setup the testsuite service
+        cat >$initdir/etc/systemd/system/testsuite.service <<EOF
+[Unit]
+Description=Testsuite service
+After=multi-user.target
+
+[Service]
+ExecStart=/bin/sh -e -x -c '/test-machine-id-setup.sh; systemctl --state=failed --no-legend --no-pager > /failed ; echo OK > /testok'
+Type=oneshot
+EOF
+
+cat >$initdir/test-machine-id-setup.sh <<'EOF'
+#!/bin/bash
+
+set -e
+set -x
+
+function setup_root {
+    local _root="$1"
+    mkdir -p "$_root"
+    mount -t tmpfs tmpfs "$_root"
+    mkdir -p "$_root/etc" "$_root/run"
+}
+
+function check {
+    printf "Expected\n"
+    cat "$1"
+    printf "\nGot\n"
+    cat "$2"
+    cmp "$1" "$2"
+}
+
+r="$(pwd)/overwrite-broken-machine-id"
+setup_root "$r"
+systemd-machine-id-setup --print --root "$r"
+echo abc >>"$r/etc/machine-id"
+id=$(systemd-machine-id-setup --print --root "$r")
+echo $id >expected
+check expected "$r/etc/machine-id"
+
+r="$(pwd)/transient-machine-id"
+setup_root "$r"
+systemd-machine-id-setup --print --root "$r"
+echo abc >>"$r/etc/machine-id"
+mount -o remount,ro "$r"
+mount -t tmpfs tmpfs "$r/run"
+transient_id=$(systemd-machine-id-setup --print --root "$r")
+mount -o remount,rw "$r"
+commited_id=$(systemd-machine-id-setup --print --commit --root "$r")
+[[ "$transient_id" = "$commited_id" ]]
+check "$r/etc/machine-id" "$r/run/machine-id"
+EOF
+chmod +x $initdir/test-machine-id-setup.sh
+
+        setup_testsuite
+    ) || return 1
+
+    # mask some services that we do not want to run in these tests
+    ln -s /dev/null $initdir/etc/systemd/system/systemd-hwdb-update.service
+    ln -s /dev/null $initdir/etc/systemd/system/systemd-journal-catalog-update.service
+    ln -s /dev/null $initdir/etc/systemd/system/systemd-networkd.service
+    ln -s /dev/null $initdir/etc/systemd/system/systemd-networkd.socket
+    ln -s /dev/null $initdir/etc/systemd/system/systemd-resolved.service
+
+    ddebug "umount $TESTDIR/root"
+    umount $TESTDIR/root
+}
+
+test_cleanup() {
+    umount $TESTDIR/root 2>/dev/null
+    [[ $LOOPDEV ]] && losetup -d $LOOPDEV
+    return 0
+}
+
+do_test "$@"
diff --git a/test/TEST-15-DROPIN/Makefile b/test/TEST-15-DROPIN/Makefile
new file mode 120000 (symlink)
index 0000000..e9f93b1
--- /dev/null
@@ -0,0 +1 @@
+../TEST-01-BASIC/Makefile
\ No newline at end of file
diff --git a/test/TEST-15-DROPIN/test-dropin.sh b/test/TEST-15-DROPIN/test-dropin.sh
new file mode 100755 (executable)
index 0000000..9d8af99
--- /dev/null
@@ -0,0 +1,274 @@
+#! /bin/bash
+
+set -e
+set -x
+
+_clear_service () {
+        systemctl stop $1.service 2>/dev/null || :
+        rm -f  /{etc,run,usr/lib}/systemd/system/$1.service
+        rm -fr /{etc,run,usr/lib}/systemd/system/$1.service.d
+        rm -fr /{etc,run,usr/lib}/systemd/system/$1.service.{wants,requires}
+}
+
+clear_services () {
+        for u in $*; do
+                _clear_service $u
+        done
+        systemctl daemon-reload
+}
+
+create_service () {
+        clear_services $1
+
+        cat >/etc/systemd/system/$1.service<<EOF
+[Unit]
+Description=$1 unit
+
+[Service]
+ExecStart=/bin/sleep 100000
+EOF
+        mkdir -p /{etc,run,usr/lib}/systemd/system/$1.service.d
+        mkdir -p /etc/systemd/system/$1.service.{wants,requires}
+        mkdir -p /run/systemd/system/$1.service.{wants,requires}
+        mkdir -p /usr/lib/systemd/system/$1.service.{wants,requires}
+}
+
+create_services () {
+        for u in $*; do
+                create_service $u
+        done
+}
+
+check_ok () {
+        [ $# -eq 3 ] || return
+
+        x="$(systemctl show --value -p $2 $1)"
+        case "$x" in
+        *$3*)      return 0 ;;
+        *)         return 1
+        esac
+}
+
+check_ko () {
+        ! check_ok "$@"
+}
+
+test_basic_dropins () {
+        echo "Testing basic dropins..."
+
+        echo "*** test a wants b wants c"
+        create_services a b c
+        ln -s ../b.service /etc/systemd/system/a.service.wants/
+        ln -s ../c.service /etc/systemd/system/b.service.wants/
+        check_ok a Wants b.service
+        check_ok b Wants c.service
+
+        echo "*** test a wants,requires b"
+        create_services a b c
+        ln -s ../b.service /etc/systemd/system/a.service.wants/
+        ln -s ../b.service /etc/systemd/system/a.service.requires/
+        check_ok a Wants b.service
+        check_ok a Requires b.service
+
+        echo "*** test a wants nonexistent"
+        create_service a
+        ln -s ../nonexistent.service /etc/systemd/system/a.service.wants/
+        check_ok a Wants nonexistent.service
+        systemctl start a
+        systemctl stop  a
+
+        echo "*** test a requires nonexistent"
+        ln -sf ../nonexistent.service /etc/systemd/system/a.service.requires/
+        systemctl daemon-reload
+        check_ok a Requires nonexistent.service
+
+        # 'b' is already loaded when 'c' pulls it in via a dropin.
+        echo "*** test a,c require b"
+        create_services a b c
+        ln -sf ../b.service /etc/systemd/system/a.service.requires/
+        ln -sf ../b.service /etc/systemd/system/c.service.requires/
+        systemctl start a
+        check_ok c Requires b.service
+        systemctl stop a b
+
+        # 'b'  is already loaded when 'c' pulls it in via an alias dropin.
+        echo "*** test a wants alias"
+        create_services a b c
+        ln -sf c.service /etc/systemd/system/c1.service
+        ln -sf ../c.service  /etc/systemd/system/a.service.wants/
+        ln -sf ../c1.service /etc/systemd/system/b.service.wants/
+        systemctl start a
+        check_ok a Wants c.service
+        check_ok b Wants c.service
+        systemctl stop a c
+
+        clear_services a b c
+}
+
+test_template_dropins () {
+        echo "Testing template dropins..."
+
+        create_services foo bar@ yup@
+
+        ln -s /etc/systemd/system/bar@.service /etc/systemd/system/foo.service.wants/bar@1.service
+        check_ok foo Wants bar@1.service
+
+        clear_services foo bar@ yup@
+}
+
+test_alias_dropins () {
+        echo "Testing alias dropins..."
+
+        echo "*** test a wants b1 alias of b"
+        create_services a b
+        ln -sf b.service /etc/systemd/system/b1.service
+        ln -sf ../b1.service /etc/systemd/system/a.service.wants/
+        check_ok a Wants b.service
+        systemctl start a
+        systemctl --quiet is-active b
+        systemctl stop a b
+        rm /etc/systemd/system/b1.service
+        clear_services a b
+
+        # A weird behavior: the dependencies for 'a' may vary. It can be
+        # changed by loading an alias...
+        #
+        # [1] 'a1' is loaded and then "renamed" into 'a'. 'a1' is therefore
+        # part of the names set so all its specific dropins are loaded.
+        #
+        # [2] 'a' is already loaded. 'a1' is simply only merged into 'a' so
+        # none of its dropins are loaded ('y' is missing from the deps).
+        echo "*** test 2"
+        create_services a x y
+        mkdir -p /etc/systemd/system/a1.service.wants/
+        ln -sf a.service /etc/systemd/system/a1.service
+        ln -sf ../x.service /etc/systemd/system/a.service.wants/
+        ln -sf ../y.service /etc/systemd/system/a1.service.wants/
+        check_ok a1 Wants x.service # see [1]
+        check_ok a1 Wants y.service
+        systemctl start a
+        check_ok a1 Wants x.service # see [2]
+        check_ko a1 Wants y.service
+        systemctl stop a x y
+        rm /etc/systemd/system/a1.service
+
+        clear_services a x y
+}
+
+test_masked_dropins () {
+        echo "Testing masked dropins..."
+
+        create_services a b
+
+        # 'b' is masked for both deps
+        echo "*** test a wants,requires b is masked"
+        ln -sf /dev/null /etc/systemd/system/a.service.wants/b.service
+        ln -sf /dev/null /etc/systemd/system/a.service.requires/b.service
+        check_ko a Wants b.service
+        check_ko a Requires b.service
+
+        # 'a' wants 'b' and 'b' is masked at a lower level
+        echo "*** test a wants b, mask override"
+        ln -sf ../b.service /etc/systemd/system/a.service.wants/b.service
+        ln -sf /dev/null /usr/lib/systemd/system/a.service.wants/b.service
+        check_ok a Wants b.service
+
+        # 'a' wants 'b' and 'b' is masked at a higher level
+        echo "*** test a wants b, mask"
+        ln -sf /dev/null /etc/systemd/system/a.service.wants/b.service
+        ln -sf ../b.service /usr/lib/systemd/system/a.service.wants/b.service
+        check_ko a Wants b.service
+
+        # 'b1' is an alias for 'b': masking 'b' dep should not influence 'b1' dep
+        echo "*** test a wants b, b1, and one is masked"
+        create_services a b
+        ln -sf b.service /etc/systemd/system/b1.service
+        ln -sf /dev/null /etc/systemd/system/a.service.wants/b.service
+        ln -sf ../b1.service /usr/lib/systemd/system/a.service.wants/b1.service
+        systemctl cat a
+        systemctl show -p Wants,Requires a
+        systemctl cat b1
+        systemctl show -p Wants,Requires b1
+        check_ok a Wants b.service
+        check_ko a Wants b1.service # the alias does not show up in the list of units
+        rm /etc/systemd/system/b1.service
+
+        # 'b1' is an alias for 'b': masking 'b1' should not influence 'b' dep
+        echo "*** test a wants b, alias dep is masked"
+        create_services a b
+        ln -sf b.service /etc/systemd/system/b1.service
+        ln -sf /dev/null /etc/systemd/system/a.service.wants/b1.service
+        ln -sf ../b.service /usr/lib/systemd/system/a.service.wants/b.service
+        check_ok a Wants b.service
+        check_ko a Wants b1.service # the alias does not show up in the list of units
+        rm /etc/systemd/system/b1.service
+
+        # 'a' has Wants=b.service but also has a masking
+        # dropin 'b': 'b' should still be pulled in.
+        echo "*** test a wants b both ways"
+        create_services a b
+        ln -sf /dev/null /etc/systemd/system/a.service.wants/b.service
+        cat >/usr/lib/systemd/system/a.service.d/wants-b.conf<<EOF
+[Unit]
+Wants=b.service
+EOF
+        check_ok a Wants b.service
+
+        # mask a dropin that points to an nonexistent unit.
+        echo "*** test a wants nonexistent is masked"
+        create_services a
+        ln -sf /dev/null /etc/systemd/system/a.service.requires/nonexistent.service
+        ln -sf ../nonexistent.service /usr/lib/systemd/system/a.service.requires/
+        check_ko a Requires nonexistent.service
+
+        # 'b' is already loaded when 'c' pulls it in via a dropin but 'b' is
+        # masked at a higher level.
+        echo "*** test a wants b is masked"
+        create_services a b c
+        ln -sf ../b.service /etc/systemd/system/a.service.requires/
+        ln -sf ../b.service /run/systemd/system/c.service.requires/
+        ln -sf /dev/null /etc/systemd/system/c.service.requires/b.service
+        systemctl start a
+        check_ko c Requires b.service
+        systemctl stop a b
+
+        # 'b' is already loaded when 'c' pulls it in via a dropin but 'b' is
+        # masked at a lower level.
+        echo "*** test a requires b is masked"
+        create_services a b c
+        ln -sf ../b.service /etc/systemd/system/a.service.requires/
+        ln -sf ../b.service /etc/systemd/system/c.service.requires/
+        ln -sf /dev/null /run/systemd/system/c.service.requires/b.service
+        systemctl start a
+        check_ok c Requires b.service
+        systemctl stop a b
+
+        # 'a' requires 2 aliases of 'b' and one of them is a mask.
+        echo "*** test a requires alias of b, other alias masked"
+        create_services a b
+        ln -sf b.service /etc/systemd/system/b1.service
+        ln -sf b.service /etc/systemd/system/b2.service
+        ln -sf /dev/null /etc/systemd/system/a.service.requires/b1.service
+        ln -sf ../b1.service /run/systemd/system/a.service.requires/
+        ln -sf ../b2.service /usr/lib/systemd/system/a.service.requires/
+        check_ok a Requires b
+
+        # Same as above but now 'b' is masked.
+        echo "*** test a requires alias of b, b dep masked"
+        create_services a b
+        ln -sf b.service /etc/systemd/system/b1.service
+        ln -sf b.service /etc/systemd/system/b2.service
+        ln -sf ../b1.service /run/systemd/system/a.service.requires/
+        ln -sf ../b2.service /usr/lib/systemd/system/a.service.requires/
+        ln -sf /dev/null /etc/systemd/system/a.service.requires/b.service
+        check_ok a Requires b
+
+        clear_services a b
+}
+
+test_basic_dropins
+test_template_dropins
+test_alias_dropins
+test_masked_dropins
+
+touch /testok
diff --git a/test/TEST-15-DROPIN/test.sh b/test/TEST-15-DROPIN/test.sh
new file mode 100755 (executable)
index 0000000..1b460db
--- /dev/null
@@ -0,0 +1,46 @@
+#!/bin/bash
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+TEST_DESCRIPTION="Dropin tests"
+
+. $TEST_BASE_DIR/test-functions
+
+
+test_run_nspawn() {
+        if ! run_nspawn; then
+                dwarn "can't run systemd-nspawn, skipping"
+                return 0
+        fi
+        check_result_nspawn
+}
+
+test_run() {
+        test_run_nspawn || return
+}
+
+test_setup() {
+        # create the basic filesystem layout
+        setup_basic_environment >/dev/null
+
+        # mask some services that we do not want to run in these tests
+        ln -s /dev/null $initdir/etc/systemd/system/systemd-hwdb-update.service
+        ln -s /dev/null $initdir/etc/systemd/system/systemd-journal-catalog-update.service
+        ln -s /dev/null $initdir/etc/systemd/system/systemd-networkd.service
+        ln -s /dev/null $initdir/etc/systemd/system/systemd-networkd.socket
+        ln -s /dev/null $initdir/etc/systemd/system/systemd-resolved.service
+
+        # import the test scripts in the rootfs and plug them in systemd
+        cp testsuite.service $initdir/etc/systemd/system/
+        cp test-dropin.sh    $initdir/
+        setup_testsuite
+
+        # create dedicated rootfs for nspawn (located in $TESTDIR/nspawn-root)
+        setup_nspawn_root
+}
+
+test_cleanup() {
+        return 0
+}
+
+do_test "$@"
diff --git a/test/TEST-15-DROPIN/testsuite.service b/test/TEST-15-DROPIN/testsuite.service
new file mode 100644 (file)
index 0000000..d9790c2
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Testsuite service
+After=multi-user.target
+
+[Service]
+ExecStart=/test-dropin.sh
+Type=oneshot
diff --git a/test/create-sys-script.py b/test/create-sys-script.py
new file mode 100755 (executable)
index 0000000..402b4f8
--- /dev/null
@@ -0,0 +1,183 @@
+#!/usr/bin/env python3
+
+OUTFILE_HEADER = """#!/usr/bin/env python3
+#
+# create-sys-script.py
+#
+# (C) 2017 Canonical Ltd.
+# Author: Dan Streetman <dan.streetman@canonical.com>
+#
+# 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/>.
+#
+"""
+
+# Use this only to (re-)create the test/sys-script.py script,
+# after adding or modifying anything in the test/sys/ directory
+
+
+import os, sys, stat, tempfile, filecmp
+
+
+OUTFILE = "sys-script.py"
+OUTFILE_MODE = 0o775
+
+OUTFILE_FUNCS = r"""
+import os, sys
+
+def d(path, mode):
+    os.mkdir(path, mode)
+
+def l(path, src):
+    os.symlink(src, path)
+
+def f(path, mode, contents):
+    with open(path, "wb") as f:
+        f.write(contents)
+    os.chmod(path, mode)
+
+"""
+
+OUTFILE_MAIN = """
+if len(sys.argv) < 2:
+    exit("Usage: {} <target dir>".format(sys.argv[0]))
+
+if not os.path.isdir(sys.argv[1]):
+    exit("Target dir {} not found".format(sys.argv[1]))
+
+os.chdir(sys.argv[1])
+
+"""
+
+
+def handle_dir(outfile, path):
+    m = os.lstat(path).st_mode & 0o777
+    outfile.write("d('{}', {:#o})\n".format(path, m))
+
+
+def handle_link(outfile, path):
+    src = os.readlink(path)
+    outfile.write("l('{}', '{}')\n".format(path, src))
+
+
+def escape_single_quotes(b):
+    # remove the b'' wrapping each line repr
+    r = repr(b)[2:-1]
+    # python escapes all ' only if there are ' and " in the string
+    if '"' not in r:
+        r = r.replace("'", r"\'")
+    # return line with all ' escaped
+    return r
+
+
+def handle_file(outfile, path):
+    m = os.lstat(path).st_mode & 0o777
+    with open(path, "rb") as f:
+        b = f.read()
+    if b.count(b"\n") > 1:
+        r = "\n".join([ escape_single_quotes(l) for l in b.split(b"\n") ])
+        r = "b'''{r}'''".format(r=r)
+    else:
+        r = repr(b)
+    outfile.write("f('{}', {:#o}, {})\n".format(path, m, r))
+
+
+def process_sysdir(outfile):
+    for (dirpath, dirnames, filenames) in os.walk("sys"):
+        handle_dir(outfile, dirpath)
+        for d in dirnames:
+            path = os.path.join(dirpath, d)
+            if stat.S_ISLNK(os.lstat(path).st_mode):
+                handle_link(outfile, path)
+        for f in filenames:
+            path = os.path.join(dirpath, f)
+            mode = os.lstat(path).st_mode
+            if stat.S_ISLNK(mode):
+                handle_link(outfile, path)
+            elif stat.S_ISREG(mode):
+                handle_file(outfile, path)
+
+
+def verify_dir(tmpd, path_a):
+    path_b = os.path.join(tmpd, path_a)
+    mode_a = os.lstat(path_a).st_mode
+    mode_b = os.lstat(path_b).st_mode
+    if not stat.S_ISDIR(mode_b):
+        raise Exception("Not directory")
+    if (mode_a & 0o777) != (mode_b & 0o777):
+        raise Exception("Permissions mismatch")
+
+
+def verify_link(tmpd, path_a):
+    path_b = os.path.join(tmpd, path_a)
+    if not stat.S_ISLNK(os.lstat(path_b).st_mode):
+        raise Exception("Not symlink")
+    if os.readlink(path_a) != os.readlink(path_b):
+        raise Exception("Symlink dest mismatch")
+
+
+def verify_file(tmpd, path_a):
+    path_b = os.path.join(tmpd, path_a)
+    mode_a = os.lstat(path_a).st_mode
+    mode_b = os.lstat(path_b).st_mode
+    if not stat.S_ISREG(mode_b):
+        raise Exception("Not file")
+    if (mode_a & 0o777) != (mode_b & 0o777):
+        raise Exception("Permissions mismatch")
+    if not filecmp.cmp(path_a, path_b, shallow=False):
+        raise Exception("File contents mismatch")
+
+
+def verify_script(tmpd):
+    for (dirpath, dirnames, filenames) in os.walk("sys"):
+        try:
+            path = dirpath
+            verify_dir(tmpd, path)
+            for d in dirnames:
+                path = os.path.join(dirpath, d)
+                if stat.S_ISLNK(os.lstat(path).st_mode):
+                    verify_link(tmpd, path)
+                for f in filenames:
+                    path = os.path.join(dirpath, f)
+                    mode = os.lstat(path).st_mode
+                    if stat.S_ISLNK(mode):
+                        verify_link(tmpd, path)
+                    elif stat.S_ISREG(mode):
+                        verify_file(tmpd, path)
+        except Exception:
+            print("FAIL on '{}'".format(path), file=sys.stderr)
+            raise
+
+
+if __name__ == "__main__":
+    # Always operate in the dir where this script is
+    os.chdir(os.path.dirname(sys.argv[0]))
+
+    if not os.path.isdir("sys"):
+        exit("No sys/ directory; please create before running this")
+
+    print("Creating {} using contents of sys/".format(OUTFILE))
+
+    with open(OUTFILE, "w") as f:
+        os.chmod(OUTFILE, OUTFILE_MODE)
+        f.write(OUTFILE_HEADER.replace(os.path.basename(sys.argv[0]), OUTFILE))
+        f.write(OUTFILE_FUNCS)
+        f.write(OUTFILE_MAIN)
+        process_sysdir(f)
+
+    with tempfile.TemporaryDirectory() as tmpd:
+        print("Recreating sys/ using {} at {}".format(OUTFILE, tmpd))
+        os.system("./{script} {tmpd}".format(script=OUTFILE, tmpd=tmpd))
+        verify_script(tmpd)
+
+    print("Verification successful, {} is correct".format(OUTFILE))
diff --git a/test/hwdb-test.sh b/test/hwdb-test.sh
new file mode 100755 (executable)
index 0000000..5373930
--- /dev/null
@@ -0,0 +1,72 @@
+#!/bin/sh
+# call built systemd-hwdb update on our hwdb files to ensure that they parse
+# without error
+#
+# (C) 2016 Canonical Ltd.
+# Author: Martin Pitt <martin.pitt@ubuntu.com>
+#
+# 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/>.
+
+set -e
+
+ROOTDIR=$(dirname $(dirname $(readlink -f $0)))
+SYSTEMD_HWDB=${builddir:-.}/systemd-hwdb
+
+if [ ! -x "$SYSTEMD_HWDB" ]; then
+    echo "$SYSTEMD_HWDB does not exist, please build first"
+    exit 1
+fi
+
+D=$(mktemp --directory)
+trap "rm -rf '$D'" EXIT INT QUIT PIPE
+mkdir -p "$D/etc/udev"
+ln -s "$ROOTDIR/hwdb" "$D/etc/udev/hwdb.d"
+
+# Test "good" properties" — no warnings or errors allowed
+err=$("$SYSTEMD_HWDB" update --root "$D" 2>&1 >/dev/null) && rc= || rc=$?
+if [ -n "$err" ]; then
+    echo "$err"
+    exit ${rc:-1}
+fi
+if [ -n "$rc" ]; then
+    echo "$SYSTEMD_HWDB returned $rc"
+    exit $rc
+fi
+
+if [ ! -e "$D/etc/udev/hwdb.bin" ]; then
+    echo "$D/etc/udev/hwdb.bin was not generated"
+    exit 1
+fi
+
+# Test "bad" properties" — warnings required, errors not allowed
+rm -f "$D/etc/udev/hwdb.bin" "$D/etc/udev/hwdb.d"
+
+ln -s "$ROOTDIR/test/hwdb" "$D/etc/udev/hwdb.d"
+err=$("$SYSTEMD_HWDB" update --root "$D" 2>&1 >/dev/null) && rc= || rc=$?
+if [ -n "$rc" ]; then
+    echo "$SYSTEMD_HWDB returned $rc"
+    exit $rc
+fi
+if [ -n "$err" ]; then
+    echo "Expected warnings"
+    echo "$err"
+else
+    echo "$SYSTEMD_HWDB unexpectedly printed no warnings"
+    exit 1
+fi
+
+if [ ! -e "$D/etc/udev/hwdb.bin" ]; then
+    echo "$D/etc/udev/hwdb.bin was not generated"
+    exit 1
+fi
diff --git a/test/hwdb/10-bad.hwdb b/test/hwdb/10-bad.hwdb
new file mode 100644 (file)
index 0000000..0e1e147
--- /dev/null
@@ -0,0 +1,26 @@
+BAD:1:no properties
+
+BAD:2:no properties
+BAD:2:no properties
+
+BAD:3:no properties
+BAD:3:no properties
+BAD:3:no properties
+
+GOOD:5:bad property
+ NO_VALUE
+
+GOOD:6:bad property
+ =NO_NAME
+ NO_VALUE=
+
+BAD:7:match at wrong place
+ X=Y
+BAD:7:match at wrong place
+
+BAD:8:match at wrong place
+ X=Y
+BAD:8:match at wrong place
+ Z=z
+
+BAD:8:match at EOF
diff --git a/test/journal-data/journal-1.txt b/test/journal-data/journal-1.txt
new file mode 100644 (file)
index 0000000..92a9199
Binary files /dev/null and b/test/journal-data/journal-1.txt differ
diff --git a/test/journal-data/journal-2.txt b/test/journal-data/journal-2.txt
new file mode 100644 (file)
index 0000000..4f582a0
Binary files /dev/null and b/test/journal-data/journal-2.txt differ
diff --git a/test/meson.build b/test/meson.build
new file mode 100644 (file)
index 0000000..55e693a
--- /dev/null
@@ -0,0 +1,167 @@
+test_data_files = '''
+        a.service
+        basic.target
+        b.service
+        c.service
+        daughter.service
+        d.service
+        end.service
+        e.service
+        f.service
+        grandchild.service
+        g.service
+        hello-after-sleep.target
+        hello.service
+        h.service
+        parent-deep.slice
+        parent.slice
+        sched_idle_bad.service
+        sched_idle_ok.service
+        sched_rr_bad.service
+        sched_rr_change.service
+        sched_rr_ok.service
+        shutdown.target
+        sleep.service
+        sockets.target
+        son.service
+        sysinit.target
+        testsuite.target
+        timers.target
+        unstoppable.service
+        test-path/paths.target
+        test-path/basic.target
+        test-path/sysinit.target
+        test-path/path-changed.service
+        test-path/path-directorynotempty.service
+        test-path/path-existsglob.service
+        test-path/path-exists.service
+        test-path/path-makedirectory.service
+        test-path/path-modified.service
+        test-path/path-mycustomunit.service
+        test-path/path-service.service
+        test-path/path-changed.path
+        test-path/path-directorynotempty.path
+        test-path/path-existsglob.path
+        test-path/path-exists.path
+        test-path/path-makedirectory.path
+        test-path/path-modified.path
+        test-path/path-unit.path
+        test-execute/exec-environment-empty.service
+        test-execute/exec-environment-multiple.service
+        test-execute/exec-environment.service
+        test-execute/exec-passenvironment-absent.service
+        test-execute/exec-passenvironment-empty.service
+        test-execute/exec-passenvironment-repeated.service
+        test-execute/exec-passenvironment.service
+        test-execute/exec-group.service
+        test-execute/exec-group-nfsnobody.service
+        test-execute/exec-supplementarygroups.service
+        test-execute/exec-supplementarygroups-single-group.service
+        test-execute/exec-supplementarygroups-single-group-user.service
+        test-execute/exec-supplementarygroups-multiple-groups-default-group-user.service
+        test-execute/exec-supplementarygroups-multiple-groups-withgid.service
+        test-execute/exec-supplementarygroups-multiple-groups-withuid.service
+        test-execute/exec-dynamicuser-fixeduser.service
+        test-execute/exec-dynamicuser-fixeduser-one-supplementarygroup.service
+        test-execute/exec-dynamicuser-supplementarygroups.service
+        test-execute/exec-ignoresigpipe-no.service
+        test-execute/exec-ignoresigpipe-yes.service
+        test-execute/exec-personality-x86-64.service
+        test-execute/exec-personality-x86.service
+        test-execute/exec-personality-s390.service
+        test-execute/exec-personality-ppc64.service
+        test-execute/exec-personality-ppc64le.service
+        test-execute/exec-personality-aarch64.service
+        test-execute/exec-privatedevices-no.service
+        test-execute/exec-privatedevices-yes.service
+        test-execute/exec-privatedevices-no-capability-mknod.service
+        test-execute/exec-privatedevices-yes-capability-mknod.service
+        test-execute/exec-protectkernelmodules-no-capabilities.service
+        test-execute/exec-protectkernelmodules-yes-capabilities.service
+        test-execute/exec-protectkernelmodules-yes-mount-propagation.service
+        test-execute/exec-privatetmp-no.service
+        test-execute/exec-privatetmp-yes.service
+        test-execute/exec-readonlypaths.service
+        test-execute/exec-readonlypaths-mount-propagation.service
+        test-execute/exec-readwritepaths-mount-propagation.service
+        test-execute/exec-inaccessiblepaths-mount-propagation.service
+        test-execute/exec-inaccessiblepaths-proc.service
+        test-execute/exec-spec-interpolation.service
+        test-execute/exec-systemcallerrornumber.service
+        test-execute/exec-systemcallfilter-failing2.service
+        test-execute/exec-systemcallfilter-failing.service
+        test-execute/exec-systemcallfilter-not-failing2.service
+        test-execute/exec-systemcallfilter-not-failing.service
+        test-execute/exec-systemcallfilter-system-user.service
+        test-execute/exec-systemcallfilter-system-user-nfsnobody.service
+        test-execute/exec-user.service
+        test-execute/exec-user-nfsnobody.service
+        test-execute/exec-workingdirectory.service
+        test-execute/exec-umask-0177.service
+        test-execute/exec-umask-default.service
+        test-execute/exec-privatenetwork-yes.service
+        test-execute/exec-environmentfile.service
+        test-execute/exec-oomscoreadjust-positive.service
+        test-execute/exec-oomscoreadjust-negative.service
+        test-execute/exec-ioschedulingclass-best-effort.service
+        test-execute/exec-ioschedulingclass-idle.service
+        test-execute/exec-ioschedulingclass-none.service
+        test-execute/exec-ioschedulingclass-realtime.service
+        test-execute/exec-capabilityboundingset-invert.service
+        test-execute/exec-capabilityboundingset-merge.service
+        test-execute/exec-capabilityboundingset-reset.service
+        test-execute/exec-capabilityboundingset-simple.service
+        test-execute/exec-capabilityambientset.service
+        test-execute/exec-capabilityambientset-nfsnobody.service
+        test-execute/exec-capabilityambientset-merge.service
+        test-execute/exec-capabilityambientset-merge-nfsnobody.service
+        test-execute/exec-runtimedirectory.service
+        test-execute/exec-runtimedirectory-mode.service
+        test-execute/exec-runtimedirectory-owner.service
+        test-execute/exec-runtimedirectory-owner-nfsnobody.service
+        test-execute/exec-restrict-namespaces-no.service
+        test-execute/exec-restrict-namespaces-yes.service
+        test-execute/exec-restrict-namespaces-mnt.service
+        test-execute/exec-restrict-namespaces-mnt-blacklist.service
+        test-execute/exec-read-only-path-succeed.service
+        test-execute/exec-privatedevices-yes-capability-sys-rawio.service
+        test-execute/exec-privatedevices-no-capability-sys-rawio.service
+        bus-policy/hello.conf
+        bus-policy/methods.conf
+        bus-policy/ownerships.conf
+        bus-policy/signals.conf
+        bus-policy/check-own-rules.conf
+        bus-policy/many-rules.conf
+        bus-policy/test.conf
+        hwdb/10-bad.hwdb
+        journal-data/journal-1.txt
+        journal-data/journal-2.txt
+'''.split()
+
+if conf.get('ENABLE_RESOLVED', false)
+        test_data_files += '''
+                test-resolve/_openpgpkey.fedoraproject.org.pkts
+                test-resolve/fedoraproject.org.pkts
+                test-resolve/gandi.net.pkts
+                test-resolve/google.com.pkts
+                test-resolve/root.pkts
+                test-resolve/sw1a1aa-sw1a2aa-sw1a2ab-sw1a2ac.find.me.uk.pkts
+                test-resolve/teamits.com.pkts
+                test-resolve/zbyszek@fedoraproject.org.pkts
+                test-resolve/_443._tcp.fedoraproject.org.pkts
+                test-resolve/kyhwana.org.pkts
+                test-resolve/fake-caa.pkts
+        '''.split()
+endif
+
+if install_tests
+        foreach file : test_data_files
+                subdir = file.split('/')[0]
+                if subdir == file
+                        subdir = ''
+                endif
+
+                install_data(file,
+                             install_dir : testsdir + '/testdata/' + subdir)
+        endforeach
+endif
index bfa1bf3..eee8b65 100755 (executable)
@@ -30,6 +30,7 @@
 # You should have received a copy of the GNU Lesser General Public License
 # along with systemd; If not, see <http://www.gnu.org/licenses/>.
 
+import errno
 import os
 import sys
 import time
@@ -37,38 +38,209 @@ import unittest
 import tempfile
 import subprocess
 import shutil
+import socket
 
-networkd_active = subprocess.call(['systemctl', 'is-active', '--quiet',
-                                   'systemd-networkd']) == 0
-have_dnsmasq = shutil.which('dnsmasq')
+HAVE_DNSMASQ = shutil.which('dnsmasq') is not None
+
+NETWORK_UNITDIR = '/run/systemd/network'
+
+NETWORKD_WAIT_ONLINE = shutil.which('systemd-networkd-wait-online',
+                                    path='/usr/lib/systemd:/lib/systemd')
 
 RESOLV_CONF = '/run/systemd/resolve/resolv.conf'
 
 
-@unittest.skipIf(networkd_active,
-                 'networkd is already active')
-class ClientTestBase:
+def setUpModule():
+    """Initialize the environment, and perform sanity checks on it."""
+    if NETWORKD_WAIT_ONLINE is None:
+        raise OSError(errno.ENOENT, 'systemd-networkd-wait-online not found')
+
+    # Do not run any tests if the system is using networkd already.
+    if subprocess.call(['systemctl', 'is-active', '--quiet',
+                        'systemd-networkd.service']) == 0:
+        raise unittest.SkipTest('networkd is already active')
+
+    # Avoid "Failed to open /dev/tty" errors in containers.
+    os.environ['SYSTEMD_LOG_TARGET'] = 'journal'
+
+    # Ensure the unit directory exists so tests can dump files into it.
+    os.makedirs(NETWORK_UNITDIR, exist_ok=True)
+
+
+class NetworkdTestingUtilities:
+    """Provide a set of utility functions to facilitate networkd tests.
+
+    This class must be inherited along with unittest.TestCase to define
+    some required methods.
+    """
+
+    def add_veth_pair(self, veth, peer, veth_options=(), peer_options=()):
+        """Add a veth interface pair, and queue them to be removed."""
+        subprocess.check_call(['ip', 'link', 'add', 'name', veth] +
+                              list(veth_options) +
+                              ['type', 'veth', 'peer', 'name', peer] +
+                              list(peer_options))
+        self.addCleanup(subprocess.call, ['ip', 'link', 'del', 'dev', peer])
+
+    def write_network(self, unit_name, contents):
+        """Write a network unit file, and queue it to be removed."""
+        unit_path = os.path.join(NETWORK_UNITDIR, unit_name)
+
+        with open(unit_path, 'w') as unit:
+            unit.write(contents)
+        self.addCleanup(os.remove, unit_path)
+
+    def write_network_dropin(self, unit_name, dropin_name, contents):
+        """Write a network unit drop-in, and queue it to be removed."""
+        dropin_dir = os.path.join(NETWORK_UNITDIR, "%s.d" % unit_name)
+        dropin_path = os.path.join(dropin_dir, "%s.conf" % dropin_name)
+
+        os.makedirs(dropin_dir, exist_ok=True)
+        self.addCleanup(os.rmdir, dropin_dir)
+        with open(dropin_path, 'w') as dropin:
+            dropin.write(contents)
+        self.addCleanup(os.remove, dropin_path)
+
+    def read_attr(self, link, attribute):
+        """Read a link attributed from the sysfs."""
+        # Note we we don't want to check if interface `link' is managed, we
+        # want to evaluate link variable and pass the value of the link to
+        # assert_link_states e.g. eth0=managed.
+        self.assert_link_states(**{link:'managed'})
+        with open(os.path.join('/sys/class/net', link, attribute)) as f:
+            return f.readline().strip()
+
+    def assert_link_states(self, **kwargs):
+        """Match networkctl link states to the given ones.
+
+        Each keyword argument should be the name of a network interface
+        with its expected value of the "SETUP" column in output from
+        networkctl.  The interfaces have five seconds to come online
+        before the check is performed.  Every specified interface must
+        be present in the output, and any other interfaces found in the
+        output are ignored.
+
+        A special interface state "managed" is supported, which matches
+        any value in the "SETUP" column other than "unmanaged".
+        """
+        if not kwargs:
+            return
+        interfaces = set(kwargs)
+
+        # Wait for the requested interfaces, but don't fail for them.
+        subprocess.call([NETWORKD_WAIT_ONLINE, '--timeout=5'] +
+                        ['--interface=%s' % iface for iface in kwargs])
+
+        # Validate each link state found in the networkctl output.
+        out = subprocess.check_output(['networkctl', '--no-legend']).rstrip()
+        for line in out.decode('utf-8').split('\n'):
+            fields = line.split()
+            if len(fields) >= 5 and fields[1] in kwargs:
+                iface = fields[1]
+                expected = kwargs[iface]
+                actual = fields[-1]
+                if (actual != expected and
+                        not (expected == 'managed' and actual != 'unmanaged')):
+                    self.fail("Link %s expects state %s, found %s" %
+                              (iface, expected, actual))
+                interfaces.remove(iface)
+
+        # Ensure that all requested interfaces have been covered.
+        if interfaces:
+            self.fail("Missing links in status output: %s" % interfaces)
+
+
+class BridgeTest(NetworkdTestingUtilities, unittest.TestCase):
+    """Provide common methods for testing networkd against servers."""
+
+    def setUp(self):
+        self.write_network('port1.netdev', '''\
+[NetDev]
+Name=port1
+Kind=dummy
+MACAddress=12:34:56:78:9a:bc''')
+        self.write_network('port2.netdev', '''\
+[NetDev]
+Name=port2
+Kind=dummy
+MACAddress=12:34:56:78:9a:bd''')
+        self.write_network('mybridge.netdev', '''\
+[NetDev]
+Name=mybridge
+Kind=bridge''')
+        self.write_network('port1.network', '''\
+[Match]
+Name=port1
+[Network]
+Bridge=mybridge''')
+        self.write_network('port2.network', '''\
+[Match]
+Name=port2
+[Network]
+Bridge=mybridge''')
+        self.write_network('mybridge.network', '''\
+[Match]
+Name=mybridge
+[Network]
+DNS=192.168.250.1
+Address=192.168.250.33/24
+Gateway=192.168.250.1''')
+        subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
+
+    def tearDown(self):
+        subprocess.check_call(['systemctl', 'stop', 'systemd-networkd'])
+        subprocess.check_call(['ip', 'link', 'del', 'mybridge'])
+        subprocess.check_call(['ip', 'link', 'del', 'port1'])
+        subprocess.check_call(['ip', 'link', 'del', 'port2'])
+
+    def test_bridge_init(self):
+        self.assert_link_states(
+            port1='managed',
+            port2='managed',
+            mybridge='managed')
+
+    def test_bridge_port_priority(self):
+        self.assertEqual(self.read_attr('port1', 'brport/priority'), '32')
+        self.write_network_dropin('port1.network', 'priority', '''\
+[Bridge]
+Priority=28
+''')
+        subprocess.check_call(['systemctl', 'restart', 'systemd-networkd'])
+        self.assertEqual(self.read_attr('port1', 'brport/priority'), '28')
+
+    def test_bridge_port_priority_set_zero(self):
+        """It should be possible to set the bridge port priority to 0"""
+        self.assertEqual(self.read_attr('port2', 'brport/priority'), '32')
+        self.write_network_dropin('port2.network', 'priority', '''\
+[Bridge]
+Priority=0
+''')
+        subprocess.check_call(['systemctl', 'restart', 'systemd-networkd'])
+        self.assertEqual(self.read_attr('port2', 'brport/priority'), '0')
+
+class ClientTestBase(NetworkdTestingUtilities):
+    """Provide common methods for testing networkd against servers."""
+
+    @classmethod
+    def setUpClass(klass):
+        klass.orig_log_level = subprocess.check_output(
+            ['systemctl', 'show', '--value', '--property', 'LogLevel'],
+            universal_newlines=True).strip()
+        subprocess.check_call(['systemd-analyze', 'set-log-level', 'debug'])
+
+    @classmethod
+    def tearDownClass(klass):
+        subprocess.check_call(['systemd-analyze', 'set-log-level', klass.orig_log_level])
+
     def setUp(self):
         self.iface = 'test_eth42'
         self.if_router = 'router_eth42'
         self.workdir_obj = tempfile.TemporaryDirectory()
         self.workdir = self.workdir_obj.name
-        self.config = '/run/systemd/network/test_eth42.network'
-        os.makedirs(os.path.dirname(self.config), exist_ok=True)
-
-        # avoid "Failed to open /dev/tty" errors in containers
-        os.environ['SYSTEMD_LOG_TARGET'] = 'journal'
-
-        # determine path to systemd-networkd-wait-online
-        for p in ['/usr/lib/systemd/systemd-networkd-wait-online',
-                  '/lib/systemd/systemd-networkd-wait-online']:
-            if os.path.exists(p):
-                self.networkd_wait_online = p
-                break
-        else:
-            self.fail('systemd-networkd-wait-online not found')
+        self.config = 'test_eth42.network'
 
         # get current journal cursor
+        subprocess.check_output(['journalctl', '--sync'])
         out = subprocess.check_output(['journalctl', '-b', '--quiet',
                                        '--no-pager', '-n0', '--show-cursor'],
                                       universal_newlines=True)
@@ -77,14 +249,15 @@ class ClientTestBase:
 
     def tearDown(self):
         self.shutdown_iface()
-        if os.path.exists(self.config):
-            os.unlink(self.config)
         subprocess.call(['systemctl', 'stop', 'systemd-networkd'])
+        subprocess.call(['ip', 'link', 'del', 'dummy0'],
+                        stderr=subprocess.DEVNULL)
 
     def show_journal(self, unit):
         '''Show journal of given unit since start of the test'''
 
         print('---- %s ----' % unit)
+        subprocess.check_output(['journalctl', '--sync'])
         sys.stdout.flush()
         subprocess.call(['journalctl', '-b', '--no-pager', '--quiet',
                          '--cursor', self.journal_cursor, '-u', unit])
@@ -106,9 +279,13 @@ class ClientTestBase:
 
     def do_test(self, coldplug=True, ipv6=False, extra_opts='',
                 online_timeout=10, dhcp_mode='yes'):
-        subprocess.check_call(['systemctl', 'start', 'systemd-resolved'])
-        with open(self.config, 'w') as f:
-            f.write('''[Match]
+        try:
+            subprocess.check_call(['systemctl', 'start', 'systemd-resolved'])
+        except subprocess.CalledProcessError:
+            self.show_journal('systemd-resolved.service')
+            raise
+        self.write_network(self.config, '''\
+[Match]
 Name=%s
 [Network]
 DHCP=%s
@@ -118,20 +295,23 @@ DHCP=%s
             # create interface first, then start networkd
             self.create_iface(ipv6=ipv6)
             subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
-        else:
+        elif coldplug is not None:
             # start networkd first, then create interface
             subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
             self.create_iface(ipv6=ipv6)
+        else:
+            # "None" means test sets up interface by itself
+            subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
 
         try:
-            subprocess.check_call([self.networkd_wait_online, '--interface',
+            subprocess.check_call([NETWORKD_WAIT_ONLINE, '--interface',
                                    self.iface, '--timeout=%i' % online_timeout])
 
             if ipv6:
                 # check iface state and IP 6 address; FIXME: we need to wait a bit
                 # longer, as the iface is "configured" already with IPv4 *or*
                 # IPv6, but we want to wait for both
-                for timeout in range(10):
+                for _ in range(10):
                     out = subprocess.check_output(['ip', 'a', 'show', 'dev', self.iface])
                     if b'state UP' in out and b'inet6 2600' in out and b'inet 192.168' in out:
                         break
@@ -144,33 +324,33 @@ DHCP=%s
             else:
                 # should have link-local address on IPv6 only
                 out = subprocess.check_output(['ip', '-6', 'a', 'show', 'dev', self.iface])
-                self.assertRegex(out, b'inet6 fe80::.* scope link')
+                self.assertRegex(out, br'inet6 fe80::.* scope link')
                 self.assertNotIn(b'scope global', out)
 
             # should have IPv4 address
             out = subprocess.check_output(['ip', '-4', 'a', 'show', 'dev', self.iface])
             self.assertIn(b'state UP', out)
-            self.assertRegex(out, b'inet 192.168.5.\d+/.* scope global dynamic')
+            self.assertRegex(out, br'inet 192.168.5.\d+/.* scope global dynamic')
 
             # check networkctl state
             out = subprocess.check_output(['networkctl'])
-            self.assertRegex(out, ('%s\s+ether\s+routable\s+unmanaged' % self.if_router).encode())
-            self.assertRegex(out, ('%s\s+ether\s+routable\s+configured' % self.iface).encode())
+            self.assertRegex(out, (r'%s\s+ether\s+routable\s+unmanaged' % self.if_router).encode())
+            self.assertRegex(out, (r'%s\s+ether\s+routable\s+configured' % self.iface).encode())
 
             out = subprocess.check_output(['networkctl', 'status', self.iface])
-            self.assertRegex(out, b'Type:\s+ether')
-            self.assertRegex(out, b'State:\s+routable.*configured')
-            self.assertRegex(out, b'Address:\s+192.168.5.\d+')
+            self.assertRegex(out, br'Type:\s+ether')
+            self.assertRegex(out, br'State:\s+routable.*configured')
+            self.assertRegex(out, br'Address:\s+192.168.5.\d+')
             if ipv6:
-                self.assertRegex(out, b'2600::')
+                self.assertRegex(out, br'2600::')
             else:
-                self.assertNotIn(b'2600::', out)
-            self.assertRegex(out, b'fe80::')
-            self.assertRegex(out, b'Gateway:\s+192.168.5.1')
-            self.assertRegex(out, b'DNS:\s+192.168.5.1')
+                self.assertNotIn(br'2600::', out)
+            self.assertRegex(out, br'fe80::')
+            self.assertRegex(out, br'Gateway:\s+192.168.5.1')
+            self.assertRegex(out, br'DNS:\s+192.168.5.1')
         except (AssertionError, subprocess.CalledProcessError):
             # show networkd status, journal, and DHCP server log on failure
-            with open(self.config) as f:
+            with open(os.path.join(NETWORK_UNITDIR, self.config)) as f:
                 print('\n---- %s ----\n%s' % (self.config, f.read()))
             print('---- interface status ----')
             sys.stdout.flush()
@@ -191,7 +371,7 @@ DHCP=%s
         else:
             self.fail('nameserver 192.168.5.1 not found in ' + RESOLV_CONF)
 
-        if not coldplug:
+        if coldplug is False:
             # check post-down.d hook
             self.shutdown_iface()
 
@@ -225,20 +405,18 @@ DHCP=%s
         self.do_test(coldplug=False, ipv6=True)
 
     def test_route_only_dns(self):
-        with open('/run/systemd/network/myvpn.netdev', 'w') as f:
-            f.write('''[NetDev]
+        self.write_network('myvpn.netdev', '''\
+[NetDev]
 Name=dummy0
 Kind=dummy
 MACAddress=12:34:56:78:9a:bc''')
-        with open('/run/systemd/network/myvpn.network', 'w') as f:
-            f.write('''[Match]
+        self.write_network('myvpn.network', '''\
+[Match]
 Name=dummy0
 [Network]
 Address=192.168.42.100
 DNS=192.168.42.1
 Domains= ~company''')
-        self.addCleanup(os.remove, '/run/systemd/network/myvpn.netdev')
-        self.addCleanup(os.remove, '/run/systemd/network/myvpn.network')
 
         self.do_test(coldplug=True, ipv6=False,
                      extra_opts='IPv6AcceptRouterAdvertisements=False')
@@ -249,22 +427,52 @@ Domains= ~company''')
             self.assertNotRegex(contents, 'search.*company')
             # our global server should appear
             self.assertIn('nameserver 192.168.5.1\n', contents)
+            # should not have domain-restricted server as global server
+            self.assertNotIn('nameserver 192.168.42.1\n', contents)
+
+    def test_route_only_dns_all_domains(self):
+        self.write_network('myvpn.netdev', '''[NetDev]
+Name=dummy0
+Kind=dummy
+MACAddress=12:34:56:78:9a:bc''')
+        self.write_network('myvpn.network', '''[Match]
+Name=dummy0
+[Network]
+Address=192.168.42.100
+DNS=192.168.42.1
+Domains= ~company ~.''')
+
+        self.do_test(coldplug=True, ipv6=False,
+                     extra_opts='IPv6AcceptRouterAdvertisements=False')
+
+        with open(RESOLV_CONF) as f:
+            contents = f.read()
 
+        # ~company is not a search domain, only a routing domain
+        self.assertNotRegex(contents, 'search.*company')
 
-@unittest.skipUnless(have_dnsmasq, 'dnsmasq not installed')
+        # our global server should appear
+        self.assertIn('nameserver 192.168.5.1\n', contents)
+        # should have company server as global server due to ~.
+        self.assertIn('nameserver 192.168.42.1\n', contents)
+
+
+@unittest.skipUnless(HAVE_DNSMASQ, 'dnsmasq not installed')
 class DnsmasqClientTest(ClientTestBase, unittest.TestCase):
     '''Test networkd client against dnsmasq'''
 
     def setUp(self):
         super().setUp()
         self.dnsmasq = None
+        self.iface_mac = 'de:ad:be:ef:47:11'
 
-    def create_iface(self, ipv6=False):
+    def create_iface(self, ipv6=False, dnsmasq_opts=None):
         '''Create test interface with DHCP server behind it'''
 
         # add veth pair
-        subprocess.check_call(['ip', 'link', 'add', 'name', self.iface, 'type',
-                               'veth', 'peer', 'name', self.if_router])
+        subprocess.check_call(['ip', 'link', 'add', 'name', self.iface,
+                               'address', self.iface_mac,
+                               'type', 'veth', 'peer', 'name', self.if_router])
 
         # give our router an IP
         subprocess.check_call(['ip', 'a', 'flush', 'dev', self.if_router])
@@ -280,6 +488,8 @@ class DnsmasqClientTest(ClientTestBase, unittest.TestCase):
             extra_opts = ['--enable-ra', '--dhcp-range=2600::10,2600::20']
         else:
             extra_opts = []
+        if dnsmasq_opts:
+            extra_opts += dnsmasq_opts
         self.dnsmasq = subprocess.Popen(
             ['dnsmasq', '--keep-in-foreground', '--log-queries',
              '--log-facility=' + self.dnsmasq_log, '--conf-file=/dev/null',
@@ -304,6 +514,194 @@ class DnsmasqClientTest(ClientTestBase, unittest.TestCase):
         with open(self.dnsmasq_log) as f:
             sys.stdout.write('\n\n---- dnsmasq log ----\n%s\n------\n\n' % f.read())
 
+    def test_resolved_domain_restricted_dns(self):
+        '''resolved: domain-restricted DNS servers'''
+
+        # create interface for generic connections; this will map all DNS names
+        # to 192.168.42.1
+        self.create_iface(dnsmasq_opts=['--address=/#/192.168.42.1'])
+        self.write_network('general.network', '''\
+[Match]
+Name=%s
+[Network]
+DHCP=ipv4
+IPv6AcceptRA=False''' % self.iface)
+
+        # create second device/dnsmasq for a .company/.lab VPN interface
+        # static IPs for simplicity
+        self.add_veth_pair('testvpnclient', 'testvpnrouter')
+        subprocess.check_call(['ip', 'a', 'flush', 'dev', 'testvpnrouter'])
+        subprocess.check_call(['ip', 'a', 'add', '10.241.3.1/24', 'dev', 'testvpnrouter'])
+        subprocess.check_call(['ip', 'link', 'set', 'testvpnrouter', 'up'])
+
+        vpn_dnsmasq_log = os.path.join(self.workdir, 'dnsmasq-vpn.log')
+        vpn_dnsmasq = subprocess.Popen(
+            ['dnsmasq', '--keep-in-foreground', '--log-queries',
+             '--log-facility=' + vpn_dnsmasq_log, '--conf-file=/dev/null',
+             '--dhcp-leasefile=/dev/null', '--bind-interfaces',
+             '--interface=testvpnrouter', '--except-interface=lo',
+             '--address=/math.lab/10.241.3.3', '--address=/cantina.company/10.241.4.4'])
+        self.addCleanup(vpn_dnsmasq.wait)
+        self.addCleanup(vpn_dnsmasq.kill)
+
+        self.write_network('vpn.network', '''\
+[Match]
+Name=testvpnclient
+[Network]
+IPv6AcceptRA=False
+Address=10.241.3.2/24
+DNS=10.241.3.1
+Domains= ~company ~lab''')
+
+        subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
+        subprocess.check_call([NETWORKD_WAIT_ONLINE, '--interface', self.iface,
+                               '--interface=testvpnclient', '--timeout=20'])
+
+        # ensure we start fresh with every test
+        subprocess.check_call(['systemctl', 'restart', 'systemd-resolved'])
+
+        # test vpnclient specific domains; these should *not* be answered by
+        # the general DNS
+        out = subprocess.check_output(['systemd-resolve', 'math.lab'])
+        self.assertIn(b'math.lab: 10.241.3.3', out)
+        out = subprocess.check_output(['systemd-resolve', 'kettle.cantina.company'])
+        self.assertIn(b'kettle.cantina.company: 10.241.4.4', out)
+
+        # test general domains
+        out = subprocess.check_output(['systemd-resolve', 'megasearch.net'])
+        self.assertIn(b'megasearch.net: 192.168.42.1', out)
+
+        with open(self.dnsmasq_log) as f:
+            general_log = f.read()
+        with open(vpn_dnsmasq_log) as f:
+            vpn_log = f.read()
+
+        # VPN domains should only be sent to VPN DNS
+        self.assertRegex(vpn_log, 'query.*math.lab')
+        self.assertRegex(vpn_log, 'query.*cantina.company')
+        self.assertNotIn('.lab', general_log)
+        self.assertNotIn('.company', general_log)
+
+        # general domains should not be sent to the VPN DNS
+        self.assertRegex(general_log, 'query.*megasearch.net')
+        self.assertNotIn('megasearch.net', vpn_log)
+
+    def test_resolved_etc_hosts(self):
+        '''resolved queries to /etc/hosts'''
+
+        # FIXME: -t MX query fails with enabled DNSSEC (even when using
+        # the known negative trust anchor .internal instead of .example)
+        conf = '/run/systemd/resolved.conf.d/test-disable-dnssec.conf'
+        os.makedirs(os.path.dirname(conf), exist_ok=True)
+        with open(conf, 'w') as f:
+            f.write('[Resolve]\nDNSSEC=no')
+        self.addCleanup(os.remove, conf)
+
+        # create /etc/hosts bind mount which resolves my.example for IPv4
+        hosts = os.path.join(self.workdir, 'hosts')
+        with open(hosts, 'w') as f:
+            f.write('172.16.99.99  my.example\n')
+        subprocess.check_call(['mount', '--bind', hosts, '/etc/hosts'])
+        self.addCleanup(subprocess.call, ['umount', '/etc/hosts'])
+        subprocess.check_call(['systemctl', 'stop', 'systemd-resolved.service'])
+
+        # note: different IPv4 address here, so that it's easy to tell apart
+        # what resolved the query
+        self.create_iface(dnsmasq_opts=['--host-record=my.example,172.16.99.1,2600::99:99',
+                                        '--host-record=other.example,172.16.0.42,2600::42',
+                                        '--mx-host=example,mail.example'],
+                          ipv6=True)
+        self.do_test(coldplug=None, ipv6=True)
+
+        try:
+            # family specific queries
+            out = subprocess.check_output(['systemd-resolve', '-4', 'my.example'])
+            self.assertIn(b'my.example: 172.16.99.99', out)
+            # we don't expect an IPv6 answer; if /etc/hosts has any IP address,
+            # it's considered a sufficient source
+            self.assertNotEqual(subprocess.call(['systemd-resolve', '-6', 'my.example']), 0)
+            # "any family" query; IPv4 should come from /etc/hosts
+            out = subprocess.check_output(['systemd-resolve', 'my.example'])
+            self.assertIn(b'my.example: 172.16.99.99', out)
+            # IP → name lookup; again, takes the /etc/hosts one
+            out = subprocess.check_output(['systemd-resolve', '172.16.99.99'])
+            self.assertIn(b'172.16.99.99: my.example', out)
+
+            # non-address RRs should fall back to DNS
+            out = subprocess.check_output(['systemd-resolve', '--type=MX', 'example'])
+            self.assertIn(b'example IN MX 1 mail.example', out)
+
+            # other domains query DNS
+            out = subprocess.check_output(['systemd-resolve', 'other.example'])
+            self.assertIn(b'172.16.0.42', out)
+            out = subprocess.check_output(['systemd-resolve', '172.16.0.42'])
+            self.assertIn(b'172.16.0.42: other.example', out)
+        except (AssertionError, subprocess.CalledProcessError):
+            self.show_journal('systemd-resolved.service')
+            self.print_server_log()
+            raise
+
+    def test_transient_hostname(self):
+        '''networkd sets transient hostname from DHCP'''
+
+        orig_hostname = socket.gethostname()
+        self.addCleanup(socket.sethostname, orig_hostname)
+        # temporarily move /etc/hostname away; restart hostnamed to pick it up
+        if os.path.exists('/etc/hostname'):
+            subprocess.check_call(['mount', '--bind', '/dev/null', '/etc/hostname'])
+            self.addCleanup(subprocess.call, ['umount', '/etc/hostname'])
+        subprocess.check_call(['systemctl', 'stop', 'systemd-hostnamed.service'])
+
+        self.create_iface(dnsmasq_opts=['--dhcp-host=%s,192.168.5.210,testgreen' % self.iface_mac])
+        self.do_test(coldplug=None, extra_opts='IPv6AcceptRA=False', dhcp_mode='ipv4')
+
+        try:
+            # should have received the fixed IP above
+            out = subprocess.check_output(['ip', '-4', 'a', 'show', 'dev', self.iface])
+            self.assertRegex(out, b'inet 192.168.5.210/24 .* scope global dynamic')
+            # should have set transient hostname in hostnamed; this is
+            # sometimes a bit lagging (issue #4753), so retry a few times
+            for retry in range(1, 6):
+                out = subprocess.check_output(['hostnamectl'])
+                if b'testgreen' in out:
+                    break
+                time.sleep(5)
+                sys.stdout.write('[retry %i] ' % retry)
+                sys.stdout.flush()
+            else:
+                self.fail('Transient hostname not found in hostnamectl:\n%s' % out.decode())
+            # and also applied to the system
+            self.assertEqual(socket.gethostname(), 'testgreen')
+        except AssertionError:
+            self.show_journal('systemd-networkd.service')
+            self.show_journal('systemd-hostnamed.service')
+            self.print_server_log()
+            raise
+
+    def test_transient_hostname_with_static(self):
+        '''transient hostname is not applied if static hostname exists'''
+
+        orig_hostname = socket.gethostname()
+        self.addCleanup(socket.sethostname, orig_hostname)
+        if not os.path.exists('/etc/hostname'):
+            self.writeConfig('/etc/hostname', orig_hostname)
+        subprocess.check_call(['systemctl', 'stop', 'systemd-hostnamed.service'])
+
+        self.create_iface(dnsmasq_opts=['--dhcp-host=%s,192.168.5.210,testgreen' % self.iface_mac])
+        self.do_test(coldplug=None, extra_opts='IPv6AcceptRA=False', dhcp_mode='ipv4')
+
+        try:
+            # should have received the fixed IP above
+            out = subprocess.check_output(['ip', '-4', 'a', 'show', 'dev', self.iface])
+            self.assertRegex(out, b'inet 192.168.5.210/24 .* scope global dynamic')
+            # static hostname wins over transient one, thus *not* applied
+            self.assertEqual(socket.gethostname(), orig_hostname)
+        except AssertionError:
+            self.show_journal('systemd-networkd.service')
+            self.show_journal('systemd-hostnamed.service')
+            self.print_server_log()
+            raise
+
 
 class NetworkdClientTest(ClientTestBase, unittest.TestCase):
     '''Test networkd client against networkd server'''
@@ -312,7 +710,7 @@ class NetworkdClientTest(ClientTestBase, unittest.TestCase):
         super().setUp()
         self.dnsmasq = None
 
-    def create_iface(self, ipv6=False):
+    def create_iface(self, ipv6=False, dhcpserver_opts=None):
         '''Create test interface with DHCP server behind it'''
 
         # run "router-side" networkd in own mount namespace to shield it from
@@ -320,7 +718,8 @@ class NetworkdClientTest(ClientTestBase, unittest.TestCase):
         (fd, script) = tempfile.mkstemp(prefix='networkd-router.sh')
         self.addCleanup(os.remove, script)
         with os.fdopen(fd, 'w+') as f:
-            f.write('''#!/bin/sh -eu
+            f.write('''\
+#!/bin/sh -eu
 mkdir -p /run/systemd/network
 mkdir -p /run/systemd/netif
 mount -t tmpfs none /run/systemd/network
@@ -349,11 +748,13 @@ DHCPServer=yes
 PoolOffset=10
 PoolSize=50
 DNS=192.168.5.1
+%(dhopts)s
 EOF
 
 # run networkd as in systemd-networkd.service
 exec $(systemctl cat systemd-networkd.service | sed -n '/^ExecStart=/ { s/^.*=//; p}')
-''' % {'ifr': self.if_router, 'ifc': self.iface, 'addr6': ipv6 and 'Address=2600::1/64' or ''})
+''' % {'ifr': self.if_router, 'ifc': self.iface, 'addr6': ipv6 and 'Address=2600::1/64' or '',
+       'dhopts': dhcpserver_opts or ''})
 
             os.fchmod(fd, 0o755)
 
@@ -364,7 +765,7 @@ exec $(systemctl cat systemd-networkd.service | sed -n '/^ExecStart=/ { s/^.*=//
                                '--service-type=notify', script])
 
         # wait until devices got created
-        for timeout in range(50):
+        for _ in range(50):
             out = subprocess.check_output(['ip', 'a', 'show', 'dev', self.if_router])
             if b'state UP' in out and b'scope global' in out:
                 break
@@ -398,20 +799,18 @@ exec $(systemctl cat systemd-networkd.service | sed -n '/^ExecStart=/ { s/^.*=//
         # we don't use this interface for this test
         self.if_router = None
 
-        with open('/run/systemd/network/test.netdev', 'w') as f:
-            f.write('''[NetDev]
+        self.write_network('test.netdev', '''\
+[NetDev]
 Name=dummy0
 Kind=dummy
 MACAddress=12:34:56:78:9a:bc''')
-        with open('/run/systemd/network/test.network', 'w') as f:
-            f.write('''[Match]
+        self.write_network('test.network', '''\
+[Match]
 Name=dummy0
 [Network]
 Address=192.168.42.100
 DNS=192.168.42.1
 Domains= one two three four five six seven eight nine ten''')
-        self.addCleanup(os.remove, '/run/systemd/network/test.netdev')
-        self.addCleanup(os.remove, '/run/systemd/network/test.network')
 
         subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
 
@@ -432,23 +831,18 @@ Domains= one two three four five six seven eight nine ten''')
 
         name_prefix = 'a' * 60
 
-        with open('/run/systemd/network/test.netdev', 'w') as f:
-            f.write('''[NetDev]
+        self.write_network('test.netdev', '''\
+[NetDev]
 Name=dummy0
 Kind=dummy
 MACAddress=12:34:56:78:9a:bc''')
-        with open('/run/systemd/network/test.network', 'w') as f:
-            f.write('''[Match]
+        self.write_network('test.network', '''\
+[Match]
 Name=dummy0
 [Network]
 Address=192.168.42.100
 DNS=192.168.42.1
-Domains=''')
-            for i in range(5):
-                f.write('%s%i ' % (name_prefix, i))
-
-        self.addCleanup(os.remove, '/run/systemd/network/test.netdev')
-        self.addCleanup(os.remove, '/run/systemd/network/test.network')
+Domains={p}0 {p}1 {p}2 {p}3 {p}4'''.format(p=name_prefix))
 
         subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
 
@@ -458,9 +852,173 @@ Domains=''')
             if ' one' in contents:
                 break
             time.sleep(0.1)
-        self.assertRegex(contents, 'search .*%(p)s0 %(p)s1 %(p)s2' % {'p': name_prefix})
+        self.assertRegex(contents, 'search .*{p}0 {p}1 {p}2'.format(p=name_prefix))
         self.assertIn('# Total length of all search domains is too long, remaining ones ignored.', contents)
 
+    def test_dropin(self):
+        # we don't use this interface for this test
+        self.if_router = None
+
+        self.write_network('test.netdev', '''\
+[NetDev]
+Name=dummy0
+Kind=dummy
+MACAddress=12:34:56:78:9a:bc''')
+        self.write_network('test.network', '''\
+[Match]
+Name=dummy0
+[Network]
+Address=192.168.42.100
+DNS=192.168.42.1''')
+        self.write_network_dropin('test.network', 'dns', '''\
+[Network]
+DNS=127.0.0.1''')
+
+        subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
+
+        for timeout in range(50):
+            with open(RESOLV_CONF) as f:
+                contents = f.read()
+            if ' 127.0.0.1' in contents:
+                break
+            time.sleep(0.1)
+        self.assertIn('nameserver 192.168.42.1\n', contents)
+        self.assertIn('nameserver 127.0.0.1\n', contents)
+
+    def test_dhcp_timezone(self):
+        '''networkd sets time zone from DHCP'''
+
+        def get_tz():
+            out = subprocess.check_output(['busctl', 'get-property', 'org.freedesktop.timedate1',
+                                           '/org/freedesktop/timedate1', 'org.freedesktop.timedate1', 'Timezone'])
+            assert out.startswith(b's "')
+            out = out.strip()
+            assert out.endswith(b'"')
+            return out[3:-1].decode()
+
+        orig_timezone = get_tz()
+        self.addCleanup(subprocess.call, ['timedatectl', 'set-timezone', orig_timezone])
+
+        self.create_iface(dhcpserver_opts='EmitTimezone=yes\nTimezone=Pacific/Honolulu')
+        self.do_test(coldplug=None, extra_opts='IPv6AcceptRA=false\n[DHCP]\nUseTimezone=true', dhcp_mode='ipv4')
+
+        # should have applied the received timezone
+        try:
+            self.assertEqual(get_tz(), 'Pacific/Honolulu')
+        except AssertionError:
+            self.show_journal('systemd-networkd.service')
+            self.show_journal('systemd-hostnamed.service')
+            raise
+
+
+class MatchClientTest(unittest.TestCase, NetworkdTestingUtilities):
+    """Test [Match] sections in .network files.
+
+    Be aware that matching the test host's interfaces will wipe their
+    configuration, so as a precaution, all network files should have a
+    restrictive [Match] section to only ever interfere with the
+    temporary veth interfaces created here.
+    """
+
+    def tearDown(self):
+        """Stop networkd."""
+        subprocess.call(['systemctl', 'stop', 'systemd-networkd'])
+
+    def test_basic_matching(self):
+        """Verify the Name= line works throughout this class."""
+        self.add_veth_pair('test_if1', 'fake_if2')
+        self.write_network('test.network', "[Match]\nName=test_*\n[Network]")
+        subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
+        self.assert_link_states(test_if1='managed', fake_if2='unmanaged')
+
+    def test_inverted_matching(self):
+        """Verify that a '!'-prefixed value inverts the match."""
+        # Use a MAC address as the interfaces' common matching attribute
+        # to avoid depending on udev, to support testing in containers.
+        mac = '00:01:02:03:98:99'
+        self.add_veth_pair('test_veth', 'test_peer',
+                           ['addr', mac], ['addr', mac])
+        self.write_network('no-veth.network', """\
+[Match]
+MACAddress=%s
+Name=!nonexistent *peer*
+[Network]""" % mac)
+        subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
+        self.assert_link_states(test_veth='managed', test_peer='unmanaged')
+
+
+class UnmanagedClientTest(unittest.TestCase, NetworkdTestingUtilities):
+    """Test if networkd manages the correct interfaces."""
+
+    def setUp(self):
+        """Write .network files to match the named veth devices."""
+        # Define the veth+peer pairs to be created.
+        # Their pairing doesn't actually matter, only their names do.
+        self.veths = {
+            'm1def': 'm0unm',
+            'm1man': 'm1unm',
+        }
+
+        # Define the contents of .network files to be read in order.
+        self.configs = (
+            "[Match]\nName=m1def\n",
+            "[Match]\nName=m1unm\n[Link]\nUnmanaged=yes\n",
+            "[Match]\nName=m1*\n[Link]\nUnmanaged=no\n",
+        )
+
+        # Write out the .network files to be cleaned up automatically.
+        for i, config in enumerate(self.configs):
+            self.write_network("%02d-test.network" % i, config)
+
+    def tearDown(self):
+        """Stop networkd."""
+        subprocess.call(['systemctl', 'stop', 'systemd-networkd'])
+
+    def create_iface(self):
+        """Create temporary veth pairs for interface matching."""
+        for veth, peer in self.veths.items():
+            self.add_veth_pair(veth, peer)
+
+    def test_unmanaged_setting(self):
+        """Verify link states with Unmanaged= settings, hot-plug."""
+        subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
+        self.create_iface()
+        self.assert_link_states(m1def='managed',
+                                m1man='managed',
+                                m1unm='unmanaged',
+                                m0unm='unmanaged')
+
+    def test_unmanaged_setting_coldplug(self):
+        """Verify link states with Unmanaged= settings, cold-plug."""
+        self.create_iface()
+        subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
+        self.assert_link_states(m1def='managed',
+                                m1man='managed',
+                                m1unm='unmanaged',
+                                m0unm='unmanaged')
+
+    def test_catchall_config(self):
+        """Verify link states with a catch-all config, hot-plug."""
+        # Don't actually catch ALL interfaces.  It messes up the host.
+        self.write_network('all.network', "[Match]\nName=m[01]???\n")
+        subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
+        self.create_iface()
+        self.assert_link_states(m1def='managed',
+                                m1man='managed',
+                                m1unm='unmanaged',
+                                m0unm='managed')
+
+    def test_catchall_config_coldplug(self):
+        """Verify link states with a catch-all config, cold-plug."""
+        # Don't actually catch ALL interfaces.  It messes up the host.
+        self.write_network('all.network', "[Match]\nName=m[01]???\n")
+        self.create_iface()
+        subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
+        self.assert_link_states(m1def='managed',
+                                m1man='managed',
+                                m1unm='unmanaged',
+                                m0unm='managed')
+
 
 if __name__ == '__main__':
     unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout,
old mode 100644 (file)
new mode 100755 (executable)
index e43a3da..14739df
@@ -1,3 +1,4 @@
+#!/usr/bin/env python3
 # Simple udev rules syntax checker
 #
 # (C) 2010 Canonical Ltd.
@@ -33,10 +34,10 @@ else:
         sys.exit(2)
     rules_files = glob(os.path.join(rules_dir, '*.rules'))
 
-no_args_tests = re.compile('(ACTION|DEVPATH|KERNELS?|NAME|SYMLINK|SUBSYSTEMS?|DRIVERS?|TAG|RESULT|TEST)\s*(?:=|!)=\s*"([^"]*)"$')
-args_tests = re.compile('(ATTRS?|ENV|TEST){([a-zA-Z0-9/_.*%-]+)}\s*(?:=|!)=\s*"([^"]*)"$')
-no_args_assign = re.compile('(NAME|SYMLINK|OWNER|GROUP|MODE|TAG|PROGRAM|RUN|LABEL|GOTO|OPTIONS|IMPORT)\s*(?:\+=|:=|=)\s*"([^"]*)"$')
-args_assign = re.compile('(ATTR|ENV|IMPORT|RUN){([a-zA-Z0-9/_.*%-]+)}\s*(=|\+=)\s*"([^"]*)"$')
+no_args_tests = re.compile(r'(ACTION|DEVPATH|KERNELS?|NAME|SYMLINK|SUBSYSTEMS?|DRIVERS?|TAG|RESULT|TEST)\s*(?:=|!)=\s*"([^"]*)"$')
+args_tests = re.compile(r'(ATTRS?|ENV|TEST){([a-zA-Z0-9/_.*%-]+)}\s*(?:=|!)=\s*"([^"]*)"$')
+no_args_assign = re.compile(r'(NAME|SYMLINK|OWNER|GROUP|MODE|TAG|PROGRAM|RUN|LABEL|GOTO|OPTIONS|IMPORT)\s*(?:\+=|:=|=)\s*"([^"]*)"$')
+args_assign = re.compile(r'(ATTR|ENV|IMPORT|RUN){([a-zA-Z0-9/_.*%-]+)}\s*(=|\+=)\s*"([^"]*)"$')
 
 result = 0
 buffer = ''
diff --git a/test/sys-script.py b/test/sys-script.py
new file mode 100755 (executable)
index 0000000..6c9ee5f
--- /dev/null
@@ -0,0 +1,16861 @@
+#!/usr/bin/env python3
+#
+# sys-script.py
+#
+# (C) 2017 Canonical Ltd.
+# Author: Dan Streetman <dan.streetman@canonical.com>
+#
+# 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/>.
+#
+
+import os, sys
+
+def d(path, mode):
+    os.mkdir(path, mode)
+
+def l(path, src):
+    os.symlink(src, path)
+
+def f(path, mode, contents):
+    with open(path, "wb") as f:
+        f.write(contents)
+    os.chmod(path, mode)
+
+
+if len(sys.argv) < 2:
+    exit("Usage: {} <target dir>".format(sys.argv[0]))
+
+if not os.path.isdir(sys.argv[1]):
+    exit("Target dir {} not found".format(sys.argv[1]))
+
+os.chdir(sys.argv[1])
+
+d('sys', 0o755)
+d('sys/kernel', 0o775)
+f('sys/kernel/kexec_crash_loaded', 0o664, b'0\n')
+f('sys/kernel/kexec_loaded', 0o664, b'0\n')
+f('sys/kernel/uevent_helper', 0o664, b'\n')
+f('sys/kernel/vmcoreinfo', 0o664, b'f15380 1000\n')
+f('sys/kernel/notes', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00Z\r!\x804\xc2\x8atA<"f5(\xe7m\xe8-i-')
+f('sys/kernel/uevent_seqnum', 0o664, b'1407\n')
+d('sys/kernel/slab', 0o775)
+d('sys/kernel/slab/kmalloc-96', 0o775)
+f('sys/kernel/slab/kmalloc-96/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-96/ctor', 0o664, b'')
+f('sys/kernel/slab/kmalloc-96/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-96/slab_size', 0o664, b'168\n')
+f('sys/kernel/slab/kmalloc-96/total_objects', 0o664, b'768\n')
+f('sys/kernel/slab/kmalloc-96/slabs', 0o664, b'32\n')
+f('sys/kernel/slab/kmalloc-96/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-96/alloc_calls', 0o664, b'''      5 sched_create_group+0x1f/0x220 age=8351870/8359354/8366881 pid=1333-2177 cpus=0-1
+     10 __register_sysctl_paths+0x56/0x340 age=8370387/8378535/8379888 pid=1-901 cpus=0-1
+     15 __create_workqueue_key+0x31/0x290 age=8370409/8377818/8380009 pid=1-900 cpus=0-1
+     59 load_module+0x19c0/0x1b30 age=8303111/8368469/8376350 pid=105-2754 cpus=0-1
+      5 __vmalloc_area_node+0xfb/0x140 age=8355400/8371519/8376226 pid=147-1813 cpus=0
+     22 __register_chrdev_region+0x2d/0x1a0 age=8309177/8375269/8380004 pid=1-2711 cpus=0-1
+      1 do_sys_poll+0xdb/0x450 age=9671 pid=2262 cpus=1
+     98 d_alloc+0x19d/0x1f0 age=22395/7516545/8376320 pid=317-13453 cpus=0-1
+      8 sys_eventfd2+0x51/0xb0 age=8339333/8339377/8339421 pid=2400 cpus=0
+      1 mb_cache_create+0x62/0x1f0 age=8379846 pid=1 cpus=1
+      9 sysfs_setattr+0x19a/0x1f0 age=61999/6511912/8377277 pid=63-13308 cpus=0-1
+      1 sysfs_open_file+0x1c5/0x230 age=0 pid=13466 cpus=0
+     17 copy_semundo+0x71/0xc0 age=3847042/8077586/8366263 pid=1370-2590 cpus=0-1
+      2 __crypto_alloc_tfm+0x43/0x1b0 age=8373678/8373678/8373678 pid=126 cpus=1
+      2 pcim_iomap_table+0x45/0x60 age=8379289/8379547/8379805 pid=1 cpus=0-1
+     26 pci_create_attr+0x3d/0x140 age=8378994/8378994/8378995 pid=1 cpus=0
+      8 pci_enable_msi+0xb1/0x2b0 age=8356336/8373963/8379844 pid=1-1541 cpus=0-1
+      1 fb_add_videomode+0x89/0xf0 age=8379841 pid=1 cpus=1
+      1 soft_cursor+0x92/0x220 age=8379841 pid=1 cpus=1
+     20 acpi_os_create_semaphore+0x36/0xaa age=8379969/8380118/8380142 pid=0-1 cpus=0
+      6 acpi_ds_build_internal_package_obj+0xaf/0x1df age=8379981/8379985/8379993 pid=1 cpus=0
+      2 acpi_ds_build_internal_buffer_obj+0xe1/0x121 age=8379986/8379986/8379987 pid=1 cpus=0
+      1 acpi_ev_create_gpe_block+0x5f/0x3bf age=8379999 pid=1 cpus=0
+     62 pnp_new_resource+0x25/0x60 age=8379891/8379894/8379895 pid=1 cpus=0
+      1 tty_register_driver+0x1b3/0x2a0 age=8379806 pid=1 cpus=1
+      5 kbd_connect+0x4e/0xe0 age=8374352/8375743/8379035 pid=17-341 cpus=0-1
+     17 __class_create+0x3d/0xa0 age=8374616/8377737/8380008 pid=1-215 cpus=0-1
+      2 scsi_probe_and_add_lun+0x65e/0xd80 age=8379084/8379252/8379421 pid=1 cpus=0-1
+      3 inet_rtm_newaddr+0xdb/0x220 age=8325560/8353789/8367912 pid=1197-1541 cpus=0-1
+      2 cache_add_dev+0x7c/0x546 age=8379855/8379855/8379856 pid=1 cpus=0
+     22 kernel_param_sysfs_setup+0x2f/0xc9 age=8380005/8380005/8380005 pid=1 cpus=0
+     15 acpi_system_init+0x12e/0x260 age=8379898/8379898/8379899 pid=1 cpus=0
+      1 pci_mmcfg_insert_resources+0x5d/0x123 age=8378994 pid=1 cpus=0
+      1 0xffffffffa0065104 age=8356008 pid=1766 cpus=0
+      1 bitmap_create+0x373/0xad0 [md_mod] age=8370145 pid=916 cpus=0
+    256 r1bio_pool_alloc+0x2f/0x60 [raid1] age=8370154/8370154/8370154 pid=916 cpus=0
+      8 ip6addrlbl_add+0x75/0x330 [ipv6] age=8360215/8360215/8360215 pid=1549 cpus=0
+      1 ip6_route_net_init+0x22/0xd0 [ipv6] age=8360216 pid=1549 cpus=0
+      6 snd_mixer_oss_build_input+0x431/0x5c0 [snd_mixer_oss] age=8355594/8355594/8355595 pid=1813 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-96/objs_per_slab', 0o664, b'24\n')
+f('sys/kernel/slab/kmalloc-96/shrink', 0o664, b'')
+f('sys/kernel/slab/kmalloc-96/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-96/object_size', 0o664, b'96\n')
+f('sys/kernel/slab/kmalloc-96/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-96/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-96/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-96/objects_partial', 0o664, b'95\n')
+f('sys/kernel/slab/kmalloc-96/objects', 0o664, b'743\n')
+f('sys/kernel/slab/kmalloc-96/order', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-96/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-96/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-96/align', 0o664, b'8\n')
+f('sys/kernel/slab/kmalloc-96/partial', 0o664, b'5\n')
+f('sys/kernel/slab/kmalloc-96/validate', 0o664, b'')
+f('sys/kernel/slab/kmalloc-96/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-96/free_calls', 0o664, b'''    507 <not-available> age=4303047439 pid=0 cpus=0
+      1 free_notes_attrs+0x4b/0x50 age=8375086 pid=383 cpus=0
+      1 audit_send_list+0x88/0xa0 age=8361087 pid=1538 cpus=1
+      6 __vunmap+0xe9/0x120 age=8309178/8363011/8375091 pid=126-2711 cpus=0-1
+      1 do_sys_poll+0x32b/0x450 age=9672 pid=2262 cpus=1
+     30 d_callback+0x22/0x40 age=22587/7808930/8375651 pid=0-13433 cpus=0-1
+     20 sysfs_release+0x63/0xa0 age=22407/6699376/8376561 pid=165-13453 cpus=0-1
+      1 release_sysfs_dirent+0x22/0xd0 age=8367199 pid=1309 cpus=1
+    116 free_rb_tree_fname+0x5c/0xb0 age=53501/7931736/8376455 pid=163-13373 cpus=0-1
+      7 kobject_uevent_env+0x11a/0x470 age=67088/6542620/8379296 pid=1-419 cpus=0-1
+      1 msi_free_irqs+0xad/0x110 age=8356355 pid=1541 cpus=0
+      1 acpi_os_execute_deferred+0x34/0x39 age=8379958 pid=13 cpus=1
+      1 acpi_walk_resources+0xa4/0xbd age=8379895 pid=1 cpus=0
+      1 acpi_pci_irq_add_prt+0x30b/0x324 age=8379922 pid=1 cpus=0
+      6 scsi_execute_req+0x9f/0xf0 age=8335607/8359788/8379422 pid=1-1456 cpus=0-1
+      9 netlink_destroy_callback+0x21/0x30 age=8325561/8347615/8367913 pid=1197-2527 cpus=0-1
+     12 huft_free+0x1e/0x2f age=8379857/8379857/8379857 pid=1 cpus=0
+      2 r1bio_pool_free+0x9/0x10 [raid1] age=8364428/8364431/8364434 pid=0 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-96/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/blkdev_requests', 0o775)
+f('sys/kernel/slab/blkdev_requests/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_requests/ctor', 0o664, b'')
+f('sys/kernel/slab/blkdev_requests/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_requests/slab_size', 0o664, b'376\n')
+f('sys/kernel/slab/blkdev_requests/total_objects', 0o664, b'84\n')
+f('sys/kernel/slab/blkdev_requests/slabs', 0o664, b'4\n')
+f('sys/kernel/slab/blkdev_requests/poison', 0o664, b'1\n')
+f('sys/kernel/slab/blkdev_requests/alloc_calls', 0o664, b'     12 mempool_alloc_slab+0x11/0x20 age=61529/5606309/8378864 pid=1-13295 cpus=0-1\n')
+f('sys/kernel/slab/blkdev_requests/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/blkdev_requests/shrink', 0o664, b'')
+f('sys/kernel/slab/blkdev_requests/trace', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_requests/object_size', 0o664, b'304\n')
+f('sys/kernel/slab/blkdev_requests/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_requests/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_requests/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_requests/objects_partial', 0o664, b'8\n')
+f('sys/kernel/slab/blkdev_requests/objects', 0o664, b'50\n')
+f('sys/kernel/slab/blkdev_requests/order', 0o664, b'1\n')
+f('sys/kernel/slab/blkdev_requests/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/blkdev_requests/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/blkdev_requests/align', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_requests/partial', 0o664, b'2\n')
+f('sys/kernel/slab/blkdev_requests/validate', 0o664, b'')
+f('sys/kernel/slab/blkdev_requests/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/blkdev_requests/free_calls', 0o664, b'''      7 <not-available> age=4303046881 pid=0 cpus=0
+      5 mempool_free_slab+0x12/0x20 age=63050/1742015/8378750 pid=0-1456 cpus=0
+''')
+f('sys/kernel/slab/blkdev_requests/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/tw_sock_TCP', 0o775)
+f('sys/kernel/slab/tw_sock_TCP/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCP/ctor', 0o664, b'')
+f('sys/kernel/slab/tw_sock_TCP/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/tw_sock_TCP/slab_size', 0o664, b'256\n')
+f('sys/kernel/slab/tw_sock_TCP/total_objects', 0o664, b'16\n')
+f('sys/kernel/slab/tw_sock_TCP/slabs', 0o664, b'1\n')
+f('sys/kernel/slab/tw_sock_TCP/poison', 0o664, b'1\n')
+f('sys/kernel/slab/tw_sock_TCP/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/tw_sock_TCP/objs_per_slab', 0o664, b'16\n')
+f('sys/kernel/slab/tw_sock_TCP/shrink', 0o664, b'')
+f('sys/kernel/slab/tw_sock_TCP/trace', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCP/object_size', 0o664, b'136\n')
+f('sys/kernel/slab/tw_sock_TCP/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCP/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCP/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCP/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCP/objects', 0o664, b'16\n')
+f('sys/kernel/slab/tw_sock_TCP/order', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCP/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/tw_sock_TCP/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/tw_sock_TCP/align', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCP/partial', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCP/validate', 0o664, b'')
+f('sys/kernel/slab/tw_sock_TCP/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/tw_sock_TCP/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/tw_sock_TCP/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/Acpi-Parse', 0o775)
+f('sys/kernel/slab/Acpi-Parse/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Parse/ctor', 0o664, b'')
+f('sys/kernel/slab/Acpi-Parse/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Parse/slab_size', 0o664, b'120\n')
+f('sys/kernel/slab/Acpi-Parse/total_objects', 0o664, b'68\n')
+f('sys/kernel/slab/Acpi-Parse/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/Acpi-Parse/poison', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-Parse/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/Acpi-Parse/objs_per_slab', 0o664, b'34\n')
+f('sys/kernel/slab/Acpi-Parse/shrink', 0o664, b'')
+f('sys/kernel/slab/Acpi-Parse/trace', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Parse/object_size', 0o664, b'48\n')
+f('sys/kernel/slab/Acpi-Parse/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Parse/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Parse/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Parse/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Parse/objects', 0o664, b'68\n')
+f('sys/kernel/slab/Acpi-Parse/order', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Parse/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-Parse/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-Parse/align', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Parse/partial', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Parse/validate', 0o664, b'')
+f('sys/kernel/slab/Acpi-Parse/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-Parse/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/Acpi-Parse/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/sgpool-8', 0o775)
+f('sys/kernel/slab/sgpool-8/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-8/ctor', 0o664, b'')
+f('sys/kernel/slab/sgpool-8/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-8/slab_size', 0o664, b'384\n')
+f('sys/kernel/slab/sgpool-8/total_objects', 0o664, b'42\n')
+f('sys/kernel/slab/sgpool-8/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/sgpool-8/poison', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-8/alloc_calls', 0o664, b'      2 mempool_alloc_slab+0x11/0x20 age=8379297/8379297/8379297 pid=1 cpus=0\n')
+f('sys/kernel/slab/sgpool-8/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/sgpool-8/shrink', 0o664, b'')
+f('sys/kernel/slab/sgpool-8/trace', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-8/object_size', 0o664, b'256\n')
+f('sys/kernel/slab/sgpool-8/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-8/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-8/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-8/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-8/objects', 0o664, b'42\n')
+f('sys/kernel/slab/sgpool-8/order', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-8/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-8/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-8/align', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-8/partial', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-8/validate', 0o664, b'')
+f('sys/kernel/slab/sgpool-8/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-8/free_calls', 0o664, b'      2 <not-available> age=4303046847 pid=0 cpus=0\n')
+f('sys/kernel/slab/sgpool-8/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/dnotify_cache', 0o775)
+f('sys/kernel/slab/dnotify_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/dnotify_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/dnotify_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/dnotify_cache/slab_size', 0o664, b'112\n')
+f('sys/kernel/slab/dnotify_cache/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/dnotify_cache/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/dnotify_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/dnotify_cache/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/dnotify_cache/objs_per_slab', 0o664, b'36\n')
+f('sys/kernel/slab/dnotify_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/dnotify_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/dnotify_cache/object_size', 0o664, b'40\n')
+f('sys/kernel/slab/dnotify_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/dnotify_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/dnotify_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/dnotify_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/dnotify_cache/objects', 0o664, b'0\n')
+f('sys/kernel/slab/dnotify_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/dnotify_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/dnotify_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/dnotify_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/dnotify_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/dnotify_cache/validate', 0o664, b'')
+f('sys/kernel/slab/dnotify_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/dnotify_cache/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/dnotify_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/kmalloc-16', 0o775)
+f('sys/kernel/slab/kmalloc-16/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-16/ctor', 0o664, b'')
+f('sys/kernel/slab/kmalloc-16/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-16/slab_size', 0o664, b'88\n')
+f('sys/kernel/slab/kmalloc-16/total_objects', 0o664, b'2254\n')
+f('sys/kernel/slab/kmalloc-16/slabs', 0o664, b'49\n')
+f('sys/kernel/slab/kmalloc-16/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-16/alloc_calls', 0o664, b'''      2 arch_acpi_processor_init_pdc+0x71/0x180 age=8375737/8375768/8375799 pid=330 cpus=0
+      2 arch_acpi_processor_init_pdc+0xab/0x180 age=8375737/8375768/8375799 pid=330 cpus=0
+      5 sched_create_group+0x40/0x220 age=8351840/8359324/8366851 pid=1333-2177 cpus=0-1
+      5 sched_create_group+0x62/0x220 age=8351840/8359324/8366851 pid=1333-2177 cpus=0-1
+      2 setup_modinfo_version+0x19/0x30 age=8374630/8375434/8376238 pid=122-126 cpus=0-1
+    365 load_module+0x1ac4/0x1b30 age=8303081/8369498/8376320 pid=105-2754 cpus=0-1
+     13 mempool_create_node+0x4b/0xf0 age=8379859/8379929/8379974 pid=1 cpus=0
+      1 krealloc+0x1e/0x60 age=8375802 pid=330 cpus=0
+      4 __vmalloc_area_node+0xfb/0x140 age=8374701/8375120/8375833 pid=126-392 cpus=0
+      7 alloc_vfsmnt+0x97/0x180 age=61473/7184623/8379853 pid=1-13348 cpus=0-1
+      2 proc_symlink+0x4d/0xb0 age=8380112/8380112/8380112 pid=0 cpus=0
+   1275 sysfs_new_dirent+0x10c/0x120 age=22645/7761348/8379979 pid=1-13295 cpus=0-1
+      2 ext3_fill_super+0x691/0x1a20 age=8369671/8374021/8378371 pid=1-962 cpus=0
+    406 kvasprintf+0x55/0x90 age=22645/7760583/8380112 pid=0-13295 cpus=0-1
+      1 bit_cursor+0x223/0x6a0 age=8356170 pid=7 cpus=0
+     12 acpi_ds_build_internal_package_obj+0xaf/0x1df age=8379944/8379946/8379954 pid=1 cpus=0
+     14 acpi_ds_build_internal_buffer_obj+0xe1/0x121 age=8379945/8379955/8379961 pid=1 cpus=0
+      2 acpi_ut_copy_simple_object+0x8f/0x11c age=8375657/8375665/8375674 pid=396 cpus=0
+      5 acpi_irq_stats_init+0x1bd/0x268 age=8379969/8379969/8379969 pid=1 cpus=0
+     14 pnp_add_id+0x1e/0xe0 age=8379861/8379863/8379866 pid=1 cpus=0
+      9 reserve_range+0x39/0x130 age=8379850/8379850/8379850 pid=1 cpus=0
+      1 trackpoint_detect+0x94/0x190 age=8378732 pid=17 cpus=0
+      2 proto_register+0xf2/0x260 age=8360199/8370021/8379844 pid=1-1549 cpus=0
+      2 neigh_sysctl_register+0x1cd/0x330 age=8360183/8366975/8373768 pid=126-1549 cpus=0-1
+      1 nl_pid_hash_rehash+0x180/0x1a0 age=8361057 pid=1533 cpus=0
+      1 genl_register_family+0x1b6/0x1e0 age=8379853 pid=1 cpus=0
+      1 __devinet_sysctl_register+0xb8/0x120 age=8373768 pid=126 cpus=1
+      1 pci_acpi_scan_root+0x3f/0x230 age=8379897 pid=1 cpus=0
+      1 acpi_parse_mcfg+0x61/0x140 age=8379976 pid=1 cpus=0
+      1 pci_mmcfg_arch_init+0x26/0x129 age=8379976 pid=1 cpus=0
+      1 icmp_sk_init+0x32/0x13f age=8379826 pid=1 cpus=0
+      5 hub_probe+0x26b/0x820 [usbcore] age=8374065/8374558/8374911 pid=143-147 cpus=0-1
+     12 usb_cache_string+0x65/0xa0 [usbcore] age=22646/4900582/8374931 pid=143-419 cpus=0-1
+      1 usb_create_ep_files+0x283/0x350 [usbcore] age=8374798 pid=143 cpus=0
+      1 0xffffffffa006595f age=8360191 pid=1549 cpus=0
+     13 snd_info_create_entry+0x30/0xa0 [snd] age=8355564/8372743/8374175 pid=107-1813 cpus=0-1
+      1 snd_oss_info_register+0x40/0xc0 [snd] age=8374813 pid=107 cpus=1
+      1 async_chainiv_givencrypt+0xf9/0x110 [crypto_blkcipher] age=8374570 pid=215 cpus=0
+      1 eseqiv_alloc+0x6d/0x80 [crypto_blkcipher] age=8374570 pid=215 cpus=0
+      1 run+0xa9/0x500 [raid1] age=8370124 pid=916 cpus=0
+      1 __addrconf_sysctl_register+0xcd/0x140 [ipv6] age=8360183 pid=1549 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-16/objs_per_slab', 0o664, b'46\n')
+f('sys/kernel/slab/kmalloc-16/shrink', 0o664, b'')
+f('sys/kernel/slab/kmalloc-16/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-16/object_size', 0o664, b'16\n')
+f('sys/kernel/slab/kmalloc-16/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-16/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-16/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-16/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-16/objects', 0o664, b'2254\n')
+f('sys/kernel/slab/kmalloc-16/order', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-16/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-16/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-16/align', 0o664, b'8\n')
+f('sys/kernel/slab/kmalloc-16/partial', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-16/validate', 0o664, b'')
+f('sys/kernel/slab/kmalloc-16/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-16/free_calls', 0o664, b'''   1912 <not-available> age=4303047409 pid=0 cpus=0
+      2 free_sched_group+0x62/0x80 age=8375109/8375395/8375681 pid=0-72 cpus=0-1
+      2 free_sched_group+0x6b/0x80 age=8375109/8375395/8375681 pid=0-72 cpus=0-1
+      3 free_sect_attrs+0x2e/0x50 age=8375055/8375055/8375055 pid=383 cpus=0
+      3 __vunmap+0xe9/0x120 age=8373650/8374619/8375152 pid=181-754 cpus=0
+      7 vfs_rename+0x301/0x450 age=125333/5028818/8367033 pid=829-13249 cpus=0
+     10 bio_free_map_data+0x14/0x30 age=23581/2550049/8379364 pid=0-1738 cpus=0-1
+     10 bio_free_map_data+0x1d/0x30 age=53581/4218001/8379379 pid=0-558 cpus=0-1
+     60 remove_kevent+0x44/0x60 age=61364/3011504/8354072 pid=1547-2544 cpus=0-1
+     49 release_sysfs_dirent+0x8c/0xd0 age=7824392/8263442/8379778 pid=1-2141 cpus=0-1
+      9 kobject_release+0xe1/0x140 age=7833231/8247578/8373891 pid=419-1541 cpus=0-1
+     70 kobject_uevent_env+0x11a/0x470 age=409229/8261185/8379979 pid=1-12942 cpus=0-1
+      2 bit_cursor+0x23b/0x6a0 age=8356171/8367984/8379797 pid=1-7 cpus=0-1
+      1 acpi_ds_create_operand+0x12c/0x209 age=8379867 pid=1 cpus=0
+      2 acpi_ns_get_node+0x92/0xa1 age=8374467/8374504/8374542 pid=215 cpus=0-1
+      8 acpi_ut_delete_internal_obj+0x15f/0x16f age=8366439/8374588/8375781 pid=330-1358 cpus=0
+     16 acpi_ut_delete_internal_object_list+0x28/0x2f age=8374469/8378935/8379920 pid=1-396 cpus=0
+      2 reserve_range+0x11d/0x130 age=8379851/8379851/8379851 pid=1 cpus=0
+      3 release_firmware+0x57/0x70 age=8356214/8363521/8367182 pid=1285-1541 cpus=0-1
+      8 module_add_driver+0x66/0xd0 age=8373538/8375876/8379266 pid=1-181 cpus=0-1
+      1 power_supply_uevent+0x1a0/0x210 age=8375647 pid=7 cpus=0
+      2 get_modalias+0xd4/0x120 age=8355835/8367906/8379977 pid=1-1772 cpus=0
+      1 nl_pid_hash_rehash+0x18e/0x1a0 age=8356437 pid=1708 cpus=0
+      2 fib_hash_free+0x35/0x40 age=8367899/8367899/8367899 pid=1185 cpus=0
+      2 wireless_send_event+0x172/0x330 age=8329605/8342854/8356103 pid=1545 cpus=0-1
+     10 usb_get_configuration+0x42d/0x1480 [usbcore] age=22733/6708190/8374932 pid=143-419 cpus=0-1
+''')
+f('sys/kernel/slab/kmalloc-16/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/filp', 0o775)
+f('sys/kernel/slab/filp/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/filp/ctor', 0o664, b'')
+f('sys/kernel/slab/filp/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/filp/slab_size', 0o664, b'384\n')
+f('sys/kernel/slab/filp/total_objects', 0o664, b'4158\n')
+f('sys/kernel/slab/filp/slabs', 0o664, b'198\n')
+f('sys/kernel/slab/filp/poison', 0o664, b'1\n')
+f('sys/kernel/slab/filp/alloc_calls', 0o664, b'   4081 get_empty_filp+0x44/0x1a0 age=0/7917861/8378089 pid=1-20296 cpus=0-1\n')
+f('sys/kernel/slab/filp/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/filp/shrink', 0o664, b'')
+f('sys/kernel/slab/filp/trace', 0o664, b'0\n')
+f('sys/kernel/slab/filp/object_size', 0o664, b'288\n')
+f('sys/kernel/slab/filp/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/filp/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/filp/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/filp/objects_partial', 0o664, b'685\n')
+f('sys/kernel/slab/filp/objects', 0o664, b'4064\n')
+f('sys/kernel/slab/filp/order', 0o664, b'1\n')
+f('sys/kernel/slab/filp/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/filp/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/filp/align', 0o664, b'0\n')
+f('sys/kernel/slab/filp/partial', 0o664, b'33\n')
+f('sys/kernel/slab/filp/validate', 0o664, b'')
+f('sys/kernel/slab/filp/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/filp/free_calls', 0o664, b'''    866 <not-available> age=4303047162 pid=0 cpus=0
+   3217 file_free_rcu+0x16/0x20 age=10/7799670/8377025 pid=0-20296 cpus=0-1
+''')
+f('sys/kernel/slab/filp/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/kmalloc-2048', 0o775)
+f('sys/kernel/slab/kmalloc-2048/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-2048/ctor', 0o664, b'')
+f('sys/kernel/slab/kmalloc-2048/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-2048/slab_size', 0o664, b'2120\n')
+f('sys/kernel/slab/kmalloc-2048/total_objects', 0o664, b'600\n')
+f('sys/kernel/slab/kmalloc-2048/slabs', 0o664, b'40\n')
+f('sys/kernel/slab/kmalloc-2048/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-2048/alloc_calls', 0o664, b'''     53 load_module+0x18d5/0x1b30 age=8303006/8368517/8376245 pid=105-2754 cpus=0-1
+      1 mempool_create_node+0x4b/0xf0 age=8370049 pid=916 cpus=0
+     20 sget+0xc4/0x460 age=61397/7958673/8380037 pid=0-13348 cpus=0-1
+     15 alloc_fdtable+0x81/0x160 age=4219/6197046/8357231 pid=1532-12336 cpus=0-1
+      2 journal_init_common+0x1a/0x130 age=8369592/8373942/8378292 pid=1-962 cpus=0
+     15 alloc_disk_node+0x1b/0x120 age=61949/7263912/8379312 pid=1-13295 cpus=0-1
+      1 pci_create_bus+0x3a/0x240 age=8379822 pid=1 cpus=0
+     21 alloc_pci_dev+0x1a/0x40 age=8379818/8379820/8379822 pid=1 cpus=0
+      1 framebuffer_alloc+0x3a/0x80 age=8379737 pid=1 cpus=1
+     74 acpi_add_single_object+0x4e/0xd3c age=8379823/8379836/8379852 pid=1 cpus=0
+      1 acpi_irq_stats_init+0xcb/0x268 age=8379894 pid=1 cpus=0
+     11 pnp_alloc_dev+0x35/0x120 age=8379786/8379789/8379791 pid=1 cpus=0
+     11 init_dev+0x12e/0x6f0 age=7217110/8250882/8378132 pid=33-2593 cpus=0-1
+      3 init_dev+0x2aa/0x6f0 age=7217110/7969221/8364310 pid=1258-2593 cpus=0-1
+      1 tty_register_driver+0x1b3/0x2a0 age=8379706 pid=1 cpus=1
+      2 tty_write+0x160/0x280 age=913316/4463710/8014104 pid=1206-3110 cpus=0
+      2 kobj_map_init+0x22/0xa0 age=8379899/8379968/8380037 pid=0-1 cpus=0
+      3 mousedev_create+0x36/0x2d0 age=53460/5603607/8378947 pid=1-419 cpus=0
+      1 atkbd_connect+0x33/0x290 age=8378940 pid=17 cpus=1
+      2 thermal_zone_device_register+0x6f/0x310 age=8374790/8374807/8374825 pid=329 cpus=0-1
+     15 sk_prot_alloc+0x83/0xb0 age=8328308/8367505/8379903 pid=1-2586 cpus=0-1
+      1 reqsk_queue_alloc+0x112/0x120 age=8356786 pid=1690 cpus=0
+    255 __netdev_alloc_skb+0x1f/0x40 age=8356300/8356301/8356303 pid=1541 cpus=0
+     10 neigh_sysctl_register+0x8d/0x330 age=8360107/8368337/8379760 pid=1-1549 cpus=0-1
+      6 __devinet_sysctl_register+0x74/0x120 age=8373573/8377097/8379760 pid=1-126 cpus=0-1
+      7 pci_add_new_bus+0x25/0x160 age=8379818/8379818/8379820 pid=1 cpus=0
+      1 i8042_create_aux_port+0x36/0x10f age=8378959 pid=1 cpus=0
+      1 i8042_probe+0x190/0x68d age=8378959 pid=1 cpus=0
+      1 netdev_init+0x32/0xc2 age=8379782 pid=1 cpus=0
+      1 netdev_init+0x66/0xc2 age=8379782 pid=1 cpus=0
+      1 fib_net_init+0x21/0x14c age=8379760 pid=1 cpus=0
+     10 usb_alloc_dev+0x36/0x2c0 [usbcore] age=22875/5876181/8374868 pid=143-419 cpus=0-1
+      2 acpi_thermal_add+0x36/0x4bb [thermal] age=8374792/8374809/8374827 pid=329 cpus=0-1
+      5 evdev_open+0xaf/0x1e0 [evdev] age=8364377/8364927/8365226 pid=1443 cpus=0-1
+      8 evdev_connect+0x54/0x1f0 [evdev] age=53452/7334685/8375002 pid=187-419 cpus=0-1
+      1 rtc_device_register+0xa4/0x260 [rtc_core] age=8374707 pid=208 cpus=0
+      1 iwl3945_bg_request_scan+0x5d3/0x660 [iwl3945] age=8356027 pid=733 cpus=0
+      1 iwl3945_pci_probe+0xd26/0x1020 [iwl3945] age=8373700 pid=126 cpus=1
+      1 patch_ad1981+0x1b/0x1d0 [snd_hda_intel] age=8374101 pid=107 cpus=1
+      1 rfkill_allocate+0x24/0xc0 [rfkill] age=8374401 pid=215 cpus=0
+      1 fuse_fill_super+0x26d/0x6d0 [fuse] age=8335736 pid=2476 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-2048/objs_per_slab', 0o664, b'15\n')
+f('sys/kernel/slab/kmalloc-2048/shrink', 0o664, b'')
+f('sys/kernel/slab/kmalloc-2048/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-2048/object_size', 0o664, b'2048\n')
+f('sys/kernel/slab/kmalloc-2048/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-2048/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-2048/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-2048/objects_partial', 0o664, b'59\n')
+f('sys/kernel/slab/kmalloc-2048/objects', 0o664, b'584\n')
+f('sys/kernel/slab/kmalloc-2048/order', 0o664, b'3\n')
+f('sys/kernel/slab/kmalloc-2048/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-2048/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-2048/align', 0o664, b'8\n')
+f('sys/kernel/slab/kmalloc-2048/partial', 0o664, b'5\n')
+f('sys/kernel/slab/kmalloc-2048/validate', 0o664, b'')
+f('sys/kernel/slab/kmalloc-2048/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-2048/free_calls', 0o664, b'''    424 <not-available> age=4303047334 pid=0 cpus=0
+      1 __vunmap+0xe9/0x120 age=8374513 pid=107 cpus=1
+     79 free_fdtable_rcu+0x71/0xb0 age=7254/7749386/8377555 pid=0-13365 cpus=0-1
+      4 show_stat+0x50e/0x530 age=23516/2125165/8360113 pid=1258-1868 cpus=0
+      4 acpi_add_single_object+0xc9a/0xd3c age=8379824/8379831/8379839 pid=1 cpus=0
+     20 release_one_tty+0x145/0x190 age=8352386/8360775/8370275 pid=55-2136 cpus=0-1
+      1 atkbd_connect+0x1ae/0x290 age=8378923 pid=17 cpus=0
+      8 sk_free+0xcd/0x100 age=656267/7395001/8360982 pid=1533-12333 cpus=0-1
+     18 skb_release_data+0x85/0xd0 age=61516/7352252/8379750 pid=1-13343 cpus=0-1
+      5 __scm_destroy+0x41/0x50 age=7217111/8111550/8352414 pid=2135-2593 cpus=0-1
+      1 huft_build+0x163/0x63e age=8379752 pid=1 cpus=0
+      1 inflate_fixed+0x17c/0x193 age=8379752 pid=1 cpus=0
+      1 usb_release_dev+0x59/0x70 [usbcore] age=53835 pid=419 cpus=0
+      1 acpi_processor_get_throttling_info+0x2e4/0x58c [processor] age=8375644 pid=330 cpus=0
+      1 acpi_thermal_add+0x457/0x4bb [thermal] age=8374828 pid=329 cpus=1
+      1 snd_ctl_ioctl+0x2cf/0x960 [snd] age=8373099 pid=786 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-2048/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/cfq_queue', 0o775)
+f('sys/kernel/slab/cfq_queue/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/cfq_queue/ctor', 0o664, b'')
+f('sys/kernel/slab/cfq_queue/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/cfq_queue/slab_size', 0o664, b'208\n')
+f('sys/kernel/slab/cfq_queue/total_objects', 0o664, b'95\n')
+f('sys/kernel/slab/cfq_queue/slabs', 0o664, b'5\n')
+f('sys/kernel/slab/cfq_queue/poison', 0o664, b'1\n')
+f('sys/kernel/slab/cfq_queue/alloc_calls', 0o664, b'     67 cfq_get_queue+0xc6/0x220 age=168/7825503/8379604 pid=1-13466 cpus=0-1\n')
+f('sys/kernel/slab/cfq_queue/objs_per_slab', 0o664, b'19\n')
+f('sys/kernel/slab/cfq_queue/shrink', 0o664, b'')
+f('sys/kernel/slab/cfq_queue/trace', 0o664, b'0\n')
+f('sys/kernel/slab/cfq_queue/object_size', 0o664, b'136\n')
+f('sys/kernel/slab/cfq_queue/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/cfq_queue/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/cfq_queue/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/cfq_queue/objects_partial', 0o664, b'35\n')
+f('sys/kernel/slab/cfq_queue/objects', 0o664, b'92\n')
+f('sys/kernel/slab/cfq_queue/order', 0o664, b'0\n')
+f('sys/kernel/slab/cfq_queue/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/cfq_queue/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/cfq_queue/align', 0o664, b'8\n')
+f('sys/kernel/slab/cfq_queue/partial', 0o664, b'2\n')
+f('sys/kernel/slab/cfq_queue/validate', 0o664, b'')
+f('sys/kernel/slab/cfq_queue/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/cfq_queue/free_calls', 0o664, b'''     11 <not-available> age=4303047621 pid=0 cpus=0
+     56 cfq_put_queue+0x6f/0xe0 age=45755/7905388/8375272 pid=163-26529 cpus=0-1
+''')
+f('sys/kernel/slab/cfq_queue/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/ext3_xattr', 0o775)
+f('sys/kernel/slab/ext3_xattr/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/ext3_xattr/ctor', 0o664, b'')
+f('sys/kernel/slab/ext3_xattr/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_xattr/slab_size', 0o664, b'160\n')
+f('sys/kernel/slab/ext3_xattr/total_objects', 0o664, b'25\n')
+f('sys/kernel/slab/ext3_xattr/slabs', 0o664, b'1\n')
+f('sys/kernel/slab/ext3_xattr/poison', 0o664, b'1\n')
+f('sys/kernel/slab/ext3_xattr/alloc_calls', 0o664, b'      4 mb_cache_entry_alloc+0x15/0x50 age=5766034/7671829/8319899 pid=2676-9046 cpus=0\n')
+f('sys/kernel/slab/ext3_xattr/objs_per_slab', 0o664, b'25\n')
+f('sys/kernel/slab/ext3_xattr/shrink', 0o664, b'')
+f('sys/kernel/slab/ext3_xattr/trace', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_xattr/object_size', 0o664, b'88\n')
+f('sys/kernel/slab/ext3_xattr/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_xattr/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_xattr/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_xattr/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_xattr/objects', 0o664, b'25\n')
+f('sys/kernel/slab/ext3_xattr/order', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_xattr/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/ext3_xattr/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/ext3_xattr/align', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_xattr/partial', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_xattr/validate', 0o664, b'')
+f('sys/kernel/slab/ext3_xattr/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/ext3_xattr/free_calls', 0o664, b'      4 <not-available> age=4303047503 pid=0 cpus=0\n')
+f('sys/kernel/slab/ext3_xattr/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/bio', 0o775)
+f('sys/kernel/slab/bio/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/bio/ctor', 0o664, b'')
+f('sys/kernel/slab/bio/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/bio/slab_size', 0o664, b'192\n')
+f('sys/kernel/slab/bio/total_objects', 0o664, b'42\n')
+f('sys/kernel/slab/bio/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/bio/poison', 0o664, b'1\n')
+f('sys/kernel/slab/bio/alloc_calls', 0o664, b'      2 mempool_alloc_slab+0x11/0x20 age=8379518/8379518/8379518 pid=1 cpus=0\n')
+f('sys/kernel/slab/bio/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/bio/shrink', 0o664, b'')
+f('sys/kernel/slab/bio/trace', 0o664, b'0\n')
+f('sys/kernel/slab/bio/object_size', 0o664, b'104\n')
+f('sys/kernel/slab/bio/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/bio/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/bio/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/bio/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/bio/objects', 0o664, b'42\n')
+f('sys/kernel/slab/bio/order', 0o664, b'0\n')
+f('sys/kernel/slab/bio/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/bio/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/bio/align', 0o664, b'8\n')
+f('sys/kernel/slab/bio/partial', 0o664, b'0\n')
+f('sys/kernel/slab/bio/validate', 0o664, b'')
+f('sys/kernel/slab/bio/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/bio/free_calls', 0o664, b'      2 <not-available> age=4303046952 pid=0 cpus=0\n')
+f('sys/kernel/slab/bio/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/TCP', 0o775)
+f('sys/kernel/slab/TCP/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/TCP/ctor', 0o664, b'')
+f('sys/kernel/slab/TCP/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/TCP/slab_size', 0o664, b'2304\n')
+f('sys/kernel/slab/TCP/total_objects', 0o664, b'28\n')
+f('sys/kernel/slab/TCP/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/TCP/poison', 0o664, b'1\n')
+f('sys/kernel/slab/TCP/alloc_calls', 0o664, b'      3 sk_prot_alloc+0x1e/0xb0 age=926836/5879023/8356238 pid=1206-1920 cpus=0\n')
+f('sys/kernel/slab/TCP/objs_per_slab', 0o664, b'14\n')
+f('sys/kernel/slab/TCP/shrink', 0o664, b'')
+f('sys/kernel/slab/TCP/trace', 0o664, b'0\n')
+f('sys/kernel/slab/TCP/object_size', 0o664, b'2200\n')
+f('sys/kernel/slab/TCP/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/TCP/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/TCP/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/TCP/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/TCP/objects', 0o664, b'28\n')
+f('sys/kernel/slab/TCP/order', 0o664, b'3\n')
+f('sys/kernel/slab/TCP/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/TCP/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/TCP/align', 0o664, b'0\n')
+f('sys/kernel/slab/TCP/partial', 0o664, b'0\n')
+f('sys/kernel/slab/TCP/validate', 0o664, b'')
+f('sys/kernel/slab/TCP/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/TCP/free_calls', 0o664, b'      3 sk_free+0x80/0x100 age=932105/5881414/8356684 pid=0-1762 cpus=0\n')
+f('sys/kernel/slab/TCP/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/nsproxy', 0o775)
+f('sys/kernel/slab/nsproxy/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/nsproxy/ctor', 0o664, b'')
+f('sys/kernel/slab/nsproxy/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/nsproxy/slab_size', 0o664, b'128\n')
+f('sys/kernel/slab/nsproxy/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/nsproxy/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/nsproxy/poison', 0o664, b'1\n')
+f('sys/kernel/slab/nsproxy/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/nsproxy/objs_per_slab', 0o664, b'32\n')
+f('sys/kernel/slab/nsproxy/shrink', 0o664, b'')
+f('sys/kernel/slab/nsproxy/trace', 0o664, b'0\n')
+f('sys/kernel/slab/nsproxy/object_size', 0o664, b'56\n')
+f('sys/kernel/slab/nsproxy/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/nsproxy/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/nsproxy/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/nsproxy/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/nsproxy/objects', 0o664, b'0\n')
+f('sys/kernel/slab/nsproxy/order', 0o664, b'0\n')
+f('sys/kernel/slab/nsproxy/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/nsproxy/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/nsproxy/align', 0o664, b'8\n')
+f('sys/kernel/slab/nsproxy/partial', 0o664, b'0\n')
+f('sys/kernel/slab/nsproxy/validate', 0o664, b'')
+f('sys/kernel/slab/nsproxy/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/nsproxy/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/nsproxy/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/inotify_watch_cache', 0o775)
+f('sys/kernel/slab/inotify_watch_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_watch_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/inotify_watch_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_watch_cache/slab_size', 0o664, b'144\n')
+f('sys/kernel/slab/inotify_watch_cache/total_objects', 0o664, b'168\n')
+f('sys/kernel/slab/inotify_watch_cache/slabs', 0o664, b'6\n')
+f('sys/kernel/slab/inotify_watch_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/inotify_watch_cache/alloc_calls', 0o664, b'    126 sys_inotify_add_watch+0x15e/0x1d0 age=60497/8227702/8376765 pid=72-13355 cpus=0-1\n')
+f('sys/kernel/slab/inotify_watch_cache/objs_per_slab', 0o664, b'28\n')
+f('sys/kernel/slab/inotify_watch_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/inotify_watch_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_watch_cache/object_size', 0o664, b'72\n')
+f('sys/kernel/slab/inotify_watch_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_watch_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_watch_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_watch_cache/objects_partial', 0o664, b'24\n')
+f('sys/kernel/slab/inotify_watch_cache/objects', 0o664, b'164\n')
+f('sys/kernel/slab/inotify_watch_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_watch_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/inotify_watch_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/inotify_watch_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_watch_cache/partial', 0o664, b'1\n')
+f('sys/kernel/slab/inotify_watch_cache/validate', 0o664, b'')
+f('sys/kernel/slab/inotify_watch_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/inotify_watch_cache/free_calls', 0o664, b'''    122 <not-available> age=4303047477 pid=0 cpus=0
+      4 free_inotify_user_watch+0x60/0x70 age=104648/4219698/8334832 pid=2423-13211 cpus=0
+''')
+f('sys/kernel/slab/inotify_watch_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/fs_cache', 0o775)
+f('sys/kernel/slab/fs_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/fs_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/fs_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/fs_cache/slab_size', 0o664, b'192\n')
+f('sys/kernel/slab/fs_cache/total_objects', 0o664, b'126\n')
+f('sys/kernel/slab/fs_cache/slabs', 0o664, b'6\n')
+f('sys/kernel/slab/fs_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/fs_cache/alloc_calls', 0o664, b'     79 __copy_fs_struct+0x28/0xc0 age=4126/7761540/8379883 pid=1-12336 cpus=0-1\n')
+f('sys/kernel/slab/fs_cache/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/fs_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/fs_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/fs_cache/object_size', 0o664, b'104\n')
+f('sys/kernel/slab/fs_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/fs_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/fs_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/fs_cache/objects_partial', 0o664, b'75\n')
+f('sys/kernel/slab/fs_cache/objects', 0o664, b'117\n')
+f('sys/kernel/slab/fs_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/fs_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/fs_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/fs_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/fs_cache/partial', 0o664, b'4\n')
+f('sys/kernel/slab/fs_cache/validate', 0o664, b'')
+f('sys/kernel/slab/fs_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/fs_cache/free_calls', 0o664, b'''      7 <not-available> age=4303047241 pid=0 cpus=0
+     72 put_fs_struct+0x37/0x40 age=7168/7706405/8375333 pid=145-20292 cpus=0-1
+''')
+f('sys/kernel/slab/fs_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/kmalloc-512', 0o775)
+f('sys/kernel/slab/kmalloc-512/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-512/ctor', 0o664, b'')
+f('sys/kernel/slab/kmalloc-512/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-512/slab_size', 0o664, b'584\n')
+f('sys/kernel/slab/kmalloc-512/total_objects', 0o664, b'504\n')
+f('sys/kernel/slab/kmalloc-512/slabs', 0o664, b'36\n')
+f('sys/kernel/slab/kmalloc-512/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-512/alloc_calls', 0o664, b'''     14 __register_sysctl_paths+0x56/0x340 age=8360125/8372514/8379788 pid=1-1549 cpus=0
+     14 param_sysfs_setup+0x87/0x140 age=8355309/8375663/8379919 pid=1-1813 cpus=0-1
+     59 module_add_modinfo_attrs+0x25/0xf0 age=8303025/8368384/8376264 pid=105-2754 cpus=0-1
+      2 __vmalloc_area_node+0xfb/0x140 age=8374650/8375296/8375942 pid=126-144 cpus=0
+      1 dma_kmalloc_cache+0xca/0x150 age=8375776 pid=163 cpus=0
+    107 kmem_cache_create+0x4e/0x2e0 age=8360130/8377702/8380056 pid=0-1549 cpus=0-1
+      2 __percpu_alloc_mask+0xbc/0x140 age=8379768/8379768/8379768 pid=1 cpus=1
+     17 sys_inotify_init1+0xaa/0x220 age=8333709/8350157/8376641 pid=72-2544 cpus=0-1
+      4 sys_epoll_create1+0x41/0x100 age=2416994/6871289/8356805 pid=1690-20296 cpus=0-1
+      2 __crypto_alloc_tfm+0x43/0x1b0 age=8373592/8373592/8373592 pid=126 cpus=1
+      1 crypto_alloc_instance+0x2b/0xe0 age=8373592 pid=745 cpus=0
+      3 elevator_alloc+0x67/0xc0 age=62000/5606780/8379335 pid=1-13295 cpus=0-1
+      3 cfq_init_queue+0x1b/0x120 age=62000/5606780/8379335 pid=1-13295 cpus=0-1
+      1 fb_alloc_cmap+0x66/0x150 age=8379756 pid=1 cpus=1
+      1 fb_alloc_cmap+0x81/0x150 age=8379756 pid=1 cpus=1
+      1 fb_alloc_cmap+0x9c/0x150 age=8379756 pid=1 cpus=1
+      1 fbcon_startup+0xd6/0x2f0 age=8379755 pid=1 cpus=1
+      1 acpi_ds_build_internal_buffer_obj+0xe1/0x121 age=8379896 pid=1 cpus=0
+      1 make_acpi_ec+0x1a/0xcb age=8379913 pid=1 cpus=0
+      1 acpi_irq_stats_init+0x83/0x268 age=8379913 pid=1 cpus=0
+      1 acpi_irq_stats_init+0xa7/0x268 age=8379913 pid=1 cpus=0
+      5 alloc_tty_driver+0x1c/0x40 age=8309091/8365595/8379725 pid=1-2711 cpus=1
+      2 vt_ioctl+0x1874/0x1c30 age=8356613/8356613/8356613 pid=1703 cpus=0
+      8 set_inverse_transl+0xa0/0xb0 age=8355024/8367389/8379755 pid=1-1898 cpus=1
+      2 con_clear_unimap+0x2a/0xd0 age=8355024/8367389/8379755 pid=1-1898 cpus=1
+      7 vc_allocate+0x99/0x1b0 age=8356563/8358748/8368241 pid=1135-1729 cpus=0-1
+      1 hpet_alloc+0x6b/0x3c0 age=8379798 pid=1 cpus=0
+      4 uart_open+0x36c/0x4b0 age=8368845/8368914/8369120 pid=1059-1073 cpus=0-1
+     43 bus_add_driver+0x4f/0x280 age=8303025/8373842/8379841 pid=1-2754 cpus=0-1
+      9 bus_register+0x35/0x290 age=8373434/8378695/8379923 pid=1-770 cpus=0-1
+     30 __class_register+0x28/0x1e0 age=8374523/8378099/8379922 pid=1-352 cpus=0-1
+      1 mousedev_open+0xc8/0x1d0 age=8354269 pid=1738 cpus=0
+      1 cpufreq_add_dev+0x8f/0x5c0 age=8366381 pid=1358 cpus=0
+      4 sock_alloc_send_skb+0x1cd/0x200 age=8330763/8342704/8350746 pid=1738 cpus=0-1
+      1 alloc_netdev_mq+0x6c/0x180 age=8373712 pid=126 cpus=1
+      4 inetdev_init+0x28/0x190 age=8373592/8375784/8379779 pid=1-126 cpus=0-1
+      2 fib_hash_table+0x1c/0x80 age=8379779/8379779/8379779 pid=1 cpus=0
+      1 ioapic_init_sysfs+0x74/0xcf age=8379769 pid=1 cpus=1
+      3 snd_malloc_sgbuf_pages+0xbe/0x1f0 [snd_page_alloc] age=8374119/8374119/8374119 pid=107 cpus=1
+      1 usb_get_configuration+0x18f/0x1480 [usbcore] age=22677 pid=419 cpus=0
+      1 usb_get_configuration+0x5f2/0x1480 [usbcore] age=8372692 pid=419 cpus=0
+      2 acpi_processor_get_throttling_info+0x21f/0x58c [processor] age=8375662/8375686/8375710 pid=330 cpus=0
+     48 snd_info_create_entry+0x1b/0xa0 [snd] age=8355304/8371157/8374867 pid=107-1813 cpus=0-1
+      4 snd_timer_new+0x40/0x190 [snd_timer] age=8374097/8374262/8374757 pid=107 cpus=1
+      2 ieee80211_key_alloc+0x37/0xe0 [mac80211] age=3544694/3544694/3544694 pid=1545 cpus=0
+      3 snd_pcm_new_stream+0x161/0x520 [snd_pcm] age=8374119/8374119/8374119 pid=107 cpus=1
+      1 snd_hda_bus_new+0x31/0xf4 [snd_hda_intel] age=8374122 pid=107 cpus=1
+      1 crypto_blkcipher_type+0x54/0xffffffffffffff8e [crypto_blkcipher] age=8374450 pid=215 cpus=0
+      1 md_import_device+0x32/0x290 [md_mod] age=8370110 pid=916 cpus=0
+      1 bitmap_create+0x5e/0xad0 [md_mod] age=8370066 pid=916 cpus=0
+      1 run+0x42/0x500 [raid1] age=8370068 pid=916 cpus=0
+      1 ip6_route_net_init+0x4d/0xd0 [ipv6] age=8360130 pid=1549 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-512/objs_per_slab', 0o664, b'14\n')
+f('sys/kernel/slab/kmalloc-512/shrink', 0o664, b'')
+f('sys/kernel/slab/kmalloc-512/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-512/object_size', 0o664, b'512\n')
+f('sys/kernel/slab/kmalloc-512/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-512/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-512/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-512/objects_partial', 0o664, b'79\n')
+f('sys/kernel/slab/kmalloc-512/objects', 0o664, b'443\n')
+f('sys/kernel/slab/kmalloc-512/order', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-512/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-512/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-512/align', 0o664, b'8\n')
+f('sys/kernel/slab/kmalloc-512/partial', 0o664, b'10\n')
+f('sys/kernel/slab/kmalloc-512/validate', 0o664, b'')
+f('sys/kernel/slab/kmalloc-512/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-512/free_calls', 0o664, b'''    163 <not-available> age=4303047353 pid=0 cpus=0
+      4 __vunmap+0xe9/0x120 age=8374515/8375319/8376179 pid=122-215 cpus=0
+      1 kmem_cache_shrink+0x5d/0x1b0 age=8379872 pid=1 cpus=0
+     33 load_elf_binary+0xa7e/0x1e20 age=8303117/8365402/8377217 pid=62-2754 cpus=0-1
+     19 load_elf_binary+0xc37/0x1e20 age=8355044/8370854/8376371 pid=197-1912 cpus=0-1
+      1 crypto_larval_destroy+0x2b/0x40 age=8373593 pid=126 cpus=1
+    210 skb_release_data+0x85/0xd0 age=22792/8177097/8379923 pid=1-20296 cpus=0-1
+      1 acpi_processor_get_power_info+0x2eb/0x569 [processor] age=8375661 pid=330 cpus=1
+      1 skcipher_geniv_alloc+0xea/0x3f0 [crypto_blkcipher] age=8374478 pid=215 cpus=0
+      1 snd_mixer_oss_build_input+0x402/0x5c0 [snd_mixer_oss] age=8355509 pid=1813 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-512/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/biovec-256', 0o775)
+f('sys/kernel/slab/biovec-256/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-256/ctor', 0o664, b'')
+f('sys/kernel/slab/biovec-256/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-256/slab_size', 0o664, b'4224\n')
+f('sys/kernel/slab/biovec-256/total_objects', 0o664, b'7\n')
+f('sys/kernel/slab/biovec-256/slabs', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-256/poison', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-256/alloc_calls', 0o664, b'      2 mempool_alloc_slab+0x11/0x20 age=8379465/8379465/8379465 pid=1 cpus=0\n')
+f('sys/kernel/slab/biovec-256/objs_per_slab', 0o664, b'7\n')
+f('sys/kernel/slab/biovec-256/shrink', 0o664, b'')
+f('sys/kernel/slab/biovec-256/trace', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-256/object_size', 0o664, b'4096\n')
+f('sys/kernel/slab/biovec-256/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-256/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-256/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-256/objects_partial', 0o664, b'2\n')
+f('sys/kernel/slab/biovec-256/objects', 0o664, b'2\n')
+f('sys/kernel/slab/biovec-256/order', 0o664, b'3\n')
+f('sys/kernel/slab/biovec-256/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-256/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-256/align', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-256/partial', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-256/validate', 0o664, b'')
+f('sys/kernel/slab/biovec-256/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-256/free_calls', 0o664, b'      2 <not-available> age=4303046899 pid=0 cpus=0\n')
+f('sys/kernel/slab/biovec-256/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/kmalloc-128', 0o775)
+f('sys/kernel/slab/kmalloc-128/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-128/ctor', 0o664, b'')
+f('sys/kernel/slab/kmalloc-128/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-128/slab_size', 0o664, b'200\n')
+f('sys/kernel/slab/kmalloc-128/total_objects', 0o664, b'360\n')
+f('sys/kernel/slab/kmalloc-128/slabs', 0o664, b'18\n')
+f('sys/kernel/slab/kmalloc-128/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-128/alloc_calls', 0o664, b'''     17 param_sysfs_setup+0x87/0x140 age=8366402/8376536/8379939 pid=1-1358 cpus=0-1
+      1 mempool_create_node+0x4b/0xf0 age=8379025 pid=1 cpus=0
+      4 __vmalloc_area_node+0xfb/0x140 age=8303049/8349608/8370350 pid=900-2754 cpus=0
+      2 shmem_fill_super+0x38/0x200 age=8377584/8378686/8379788 pid=1-46 cpus=0-1
+     56 __percpu_alloc_mask+0xbc/0x140 age=61988/7483637/8379799 pid=1-13295 cpus=0-1
+     11 cdev_alloc+0x1a/0x50 age=61988/7621848/8379938 pid=1-13295 cpus=0-1
+    110 d_alloc+0x19d/0x1f0 age=22451/5346628/8376065 pid=401-13439 cpus=0-1
+      2 bm_register_write+0x63/0x630 age=8354053/8354053/8354053 pid=2054 cpus=1
+      2 alloc_disk_node+0x6c/0x120 age=62016/4220683/8379351 pid=1-13295 cpus=1
+     20 ida_pre_get+0x86/0x90 age=8298034/8372144/8380076 pid=0-2761 cpus=0-1
+      5 acpi_ds_build_internal_package_obj+0xaf/0x1df age=8379905/8379914/8379918 pid=1 cpus=0
+      2 acpi_ds_build_internal_buffer_obj+0xe1/0x121 age=8379921/8379921/8379921 pid=1 cpus=0
+      1 acpi_ev_create_gpe_block+0xb2/0x3bf age=8379933 pid=1 cpus=0
+      4 acpi_add_single_object+0x5d8/0xd3c age=8379862/8379869/8379873 pid=1 cpus=0
+     41 con_insert_unipair+0xd6/0x110 age=8355044/8369520/8379775 pid=1-1898 cpus=1
+      2 thermal_zone_bind_cooling_device+0xde/0x2a0 age=8374828/8374828/8374828 pid=329 cpus=0
+      4 led_trigger_register_simple+0x2b/0x80 age=8375615/8375659/8375793 pid=392-396 cpus=0
+      1 sock_kmalloc+0x5c/0x70 age=8328344 pid=2586 cpus=0
+      3 alloc_netdev_mq+0x6c/0x180 age=8373612/8376531/8379814 pid=1-126 cpus=0-1
+      2 neigh_table_init_no_netlink+0xd2/0x250 age=8360154/8369976/8379799 pid=1-1549 cpus=0
+      8 neigh_parms_alloc+0x5d/0x110 age=8360146/8367976/8379799 pid=1-1549 cpus=0-1
+      4 fz_hash_alloc+0x4a/0x60 age=8325493/8357250/8367862 pid=1185-1541 cpus=0-1
+      1 get_local_pda+0x39/0x9b age=8380015 pid=1 cpus=0
+      1 mnt_init+0xf9/0x202 age=8380076 pid=0 cpus=0
+      1 net_ns_init+0x49/0x16d age=8379942 pid=1 cpus=0
+      3 sg_add+0x8c/0x400 [sg] age=61988/5604850/8376284 pid=169-13295 cpus=0
+      3 usb_get_configuration+0x5f2/0x1480 [usbcore] age=22696/22696/22696 pid=419 cpus=0
+     15 usb_get_configuration+0x1388/0x1480 [usbcore] age=22696/3922325/8372712 pid=419 cpus=0
+      1 0xffffffffa0065117 age=8374777 pid=107 cpus=1
+      1 ieee80211_led_init+0x1b/0x230 [mac80211] age=8373612 pid=126 cpus=1
+      1 ieee80211_led_init+0x83/0x230 [mac80211] age=8373612 pid=126 cpus=1
+      1 ieee80211_led_init+0xeb/0x230 [mac80211] age=8373611 pid=126 cpus=1
+      1 ieee80211_led_init+0x153/0x230 [mac80211] age=8373611 pid=126 cpus=1
+      1 snd_hda_codec_new+0x1ec/0x559 [snd_hda_intel] age=8374142 pid=107 cpus=1
+      1 md_register_thread+0x35/0xd0 [md_mod] age=8370088 pid=916 cpus=0
+      1 fib6_net_init+0x7e/0x130 [ipv6] age=8360149 pid=1549 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-128/objs_per_slab', 0o664, b'20\n')
+f('sys/kernel/slab/kmalloc-128/shrink', 0o664, b'')
+f('sys/kernel/slab/kmalloc-128/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-128/object_size', 0o664, b'128\n')
+f('sys/kernel/slab/kmalloc-128/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-128/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-128/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-128/objects_partial', 0o664, b'83\n')
+f('sys/kernel/slab/kmalloc-128/objects', 0o664, b'343\n')
+f('sys/kernel/slab/kmalloc-128/order', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-128/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-128/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-128/align', 0o664, b'8\n')
+f('sys/kernel/slab/kmalloc-128/partial', 0o664, b'5\n')
+f('sys/kernel/slab/kmalloc-128/validate', 0o664, b'')
+f('sys/kernel/slab/kmalloc-128/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-128/free_calls', 0o664, b'''    197 <not-available> age=4303047372 pid=0 cpus=0
+      3 call_usermodehelper_freeinfo+0x27/0x30 age=8360145/8367948/8373612 pid=745-1532 cpus=0
+      2 __vunmap+0xe9/0x120 age=8375480/8375882/8376284 pid=105-169 cpus=0
+      5 percpu_free+0x2d/0x60 age=7838031/7838092/7838171 pid=419-3347 cpus=0
+      1 cdev_dynamic_release+0x19/0x20 age=7838171 pid=419 cpus=0
+     49 d_callback+0x22/0x40 age=53327/5302082/8375461 pid=0-13314 cpus=0-1
+     51 load_elf_binary+0xaf/0x1e20 age=25315/7326461/8377585 pid=46-21952 cpus=0-1
+      1 free_rb_tree_fname+0x5c/0xb0 age=8366816 pid=1274 cpus=0
+      1 disk_release+0x2e/0x50 age=7838031 pid=3347 cpus=0
+      2 free_bitmap+0x29/0x80 age=8368053/8369024/8369995 pid=55 cpus=0-1
+      1 acpi_evaluate_reference+0x100/0x117 age=8374829 pid=329 cpus=0
+      6 acpi_get_object_info+0x1b6/0x1d4 age=8379736/8379841/8379873 pid=1 cpus=0-1
+      4 do_acpi_find_child+0x48/0x51 age=8379209/8379658/8379850 pid=1 cpus=0-1
+      1 unpack_to_rootfs+0x105/0xa39 age=8379790 pid=1 cpus=0
+      1 sg_remove+0x1ca/0x240 [sg] age=7838171 pid=419 cpus=0
+      6 usb_release_interface_cache+0x2c/0x60 [usbcore] age=7833192/7833192/7833192 pid=419 cpus=1
+      2 usb_release_interface_cache+0x47/0x60 [usbcore] age=7833192/7833192/7833192 pid=419 cpus=1
+      1 acpi_processor_get_throttling_info+0x15e/0x58c [processor] age=8375683 pid=330 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-128/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/ip_dst_cache', 0o775)
+f('sys/kernel/slab/ip_dst_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/ip_dst_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/ip_dst_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/ip_dst_cache/slab_size', 0o664, b'384\n')
+f('sys/kernel/slab/ip_dst_cache/total_objects', 0o664, b'42\n')
+f('sys/kernel/slab/ip_dst_cache/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/ip_dst_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/ip_dst_cache/alloc_calls', 0o664, b'      1 dst_alloc+0x2b/0x90 age=920684 pid=1206 cpus=0\n')
+f('sys/kernel/slab/ip_dst_cache/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/ip_dst_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/ip_dst_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/ip_dst_cache/object_size', 0o664, b'312\n')
+f('sys/kernel/slab/ip_dst_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/ip_dst_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/ip_dst_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/ip_dst_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/ip_dst_cache/objects', 0o664, b'42\n')
+f('sys/kernel/slab/ip_dst_cache/order', 0o664, b'1\n')
+f('sys/kernel/slab/ip_dst_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/ip_dst_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/ip_dst_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/ip_dst_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/ip_dst_cache/validate', 0o664, b'')
+f('sys/kernel/slab/ip_dst_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/ip_dst_cache/free_calls', 0o664, b'      1 <not-available> age=4303046733 pid=0 cpus=0\n')
+f('sys/kernel/slab/ip_dst_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/journal_head', 0o775)
+f('sys/kernel/slab/journal_head/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/journal_head/ctor', 0o664, b'')
+f('sys/kernel/slab/journal_head/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/journal_head/slab_size', 0o664, b'168\n')
+f('sys/kernel/slab/journal_head/total_objects', 0o664, b'7680\n')
+f('sys/kernel/slab/journal_head/slabs', 0o664, b'320\n')
+f('sys/kernel/slab/journal_head/poison', 0o664, b'1\n')
+f('sys/kernel/slab/journal_head/alloc_calls', 0o664, b'   7662 journal_add_journal_head+0x9f/0x1b0 age=0/2379/651354 pid=1336-13466 cpus=0-1\n')
+f('sys/kernel/slab/journal_head/objs_per_slab', 0o664, b'24\n')
+f('sys/kernel/slab/journal_head/shrink', 0o664, b'')
+f('sys/kernel/slab/journal_head/trace', 0o664, b'0\n')
+f('sys/kernel/slab/journal_head/object_size', 0o664, b'96\n')
+f('sys/kernel/slab/journal_head/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/journal_head/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/journal_head/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/journal_head/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/journal_head/objects', 0o664, b'7680\n')
+f('sys/kernel/slab/journal_head/order', 0o664, b'0\n')
+f('sys/kernel/slab/journal_head/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/journal_head/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/journal_head/align', 0o664, b'0\n')
+f('sys/kernel/slab/journal_head/partial', 0o664, b'0\n')
+f('sys/kernel/slab/journal_head/validate', 0o664, b'')
+f('sys/kernel/slab/journal_head/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/journal_head/free_calls', 0o664, b'''   7589 <not-available> age=4303047557 pid=0 cpus=0
+     74 __journal_remove_journal_head+0xcb/0x160 age=1585/52253/654521 pid=32-13248 cpus=0-1
+''')
+f('sys/kernel/slab/journal_head/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/scsi_data_buffer', 0o775)
+f('sys/kernel/slab/scsi_data_buffer/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_data_buffer/ctor', 0o664, b'')
+f('sys/kernel/slab/scsi_data_buffer/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_data_buffer/slab_size', 0o664, b'96\n')
+f('sys/kernel/slab/scsi_data_buffer/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_data_buffer/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_data_buffer/poison', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_data_buffer/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/scsi_data_buffer/objs_per_slab', 0o664, b'42\n')
+f('sys/kernel/slab/scsi_data_buffer/shrink', 0o664, b'')
+f('sys/kernel/slab/scsi_data_buffer/trace', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_data_buffer/object_size', 0o664, b'24\n')
+f('sys/kernel/slab/scsi_data_buffer/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_data_buffer/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_data_buffer/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_data_buffer/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_data_buffer/objects', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_data_buffer/order', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_data_buffer/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_data_buffer/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_data_buffer/align', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_data_buffer/partial', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_data_buffer/validate', 0o664, b'')
+f('sys/kernel/slab/scsi_data_buffer/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_data_buffer/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/scsi_data_buffer/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/fuse_request', 0o775)
+f('sys/kernel/slab/fuse_request/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/fuse_request/ctor', 0o664, b'')
+f('sys/kernel/slab/fuse_request/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/fuse_request/slab_size', 0o664, b'728\n')
+f('sys/kernel/slab/fuse_request/total_objects', 0o664, b'44\n')
+f('sys/kernel/slab/fuse_request/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/fuse_request/poison', 0o664, b'1\n')
+f('sys/kernel/slab/fuse_request/alloc_calls', 0o664, b'      1 fuse_request_alloc+0x1a/0x40 [fuse] age=8336120 pid=2476 cpus=0\n')
+f('sys/kernel/slab/fuse_request/objs_per_slab', 0o664, b'22\n')
+f('sys/kernel/slab/fuse_request/shrink', 0o664, b'')
+f('sys/kernel/slab/fuse_request/trace', 0o664, b'0\n')
+f('sys/kernel/slab/fuse_request/object_size', 0o664, b'656\n')
+f('sys/kernel/slab/fuse_request/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/fuse_request/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/fuse_request/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/fuse_request/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/fuse_request/objects', 0o664, b'44\n')
+f('sys/kernel/slab/fuse_request/order', 0o664, b'2\n')
+f('sys/kernel/slab/fuse_request/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/fuse_request/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/fuse_request/align', 0o664, b'0\n')
+f('sys/kernel/slab/fuse_request/partial', 0o664, b'0\n')
+f('sys/kernel/slab/fuse_request/validate', 0o664, b'')
+f('sys/kernel/slab/fuse_request/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/fuse_request/free_calls', 0o664, b'      1 <not-available> age=4303047718 pid=0 cpus=0\n')
+f('sys/kernel/slab/fuse_request/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/pid', 0o775)
+f('sys/kernel/slab/pid/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/pid/ctor', 0o664, b'')
+f('sys/kernel/slab/pid/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/pid/slab_size', 0o664, b'192\n')
+f('sys/kernel/slab/pid/total_objects', 0o664, b'252\n')
+f('sys/kernel/slab/pid/slabs', 0o664, b'12\n')
+f('sys/kernel/slab/pid/poison', 0o664, b'1\n')
+f('sys/kernel/slab/pid/alloc_calls', 0o664, b'    207 alloc_pid+0x26/0x430 age=4190/8015525/8379960 pid=0-13212 cpus=0-1\n')
+f('sys/kernel/slab/pid/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/pid/shrink', 0o664, b'')
+f('sys/kernel/slab/pid/trace', 0o664, b'0\n')
+f('sys/kernel/slab/pid/object_size', 0o664, b'80\n')
+f('sys/kernel/slab/pid/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/pid/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/pid/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/pid/objects_partial', 0o664, b'131\n')
+f('sys/kernel/slab/pid/objects', 0o664, b'236\n')
+f('sys/kernel/slab/pid/order', 0o664, b'0\n')
+f('sys/kernel/slab/pid/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/pid/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/pid/align', 0o664, b'8\n')
+f('sys/kernel/slab/pid/partial', 0o664, b'7\n')
+f('sys/kernel/slab/pid/validate', 0o664, b'')
+f('sys/kernel/slab/pid/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/pid/free_calls', 0o664, b'''     69 <not-available> age=4303047306 pid=0 cpus=0
+    138 put_pid+0x36/0x40 age=7228/7841898/8377070 pid=0-13258 cpus=0-1
+''')
+f('sys/kernel/slab/pid/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/ext2_inode_cache', 0o775)
+f('sys/kernel/slab/ext2_inode_cache/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/ext2_inode_cache/ctor', 0o664, b'init_once+0x0/0x60\n')
+f('sys/kernel/slab/ext2_inode_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/ext2_inode_cache/slab_size', 0o664, b'1456\n')
+f('sys/kernel/slab/ext2_inode_cache/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/ext2_inode_cache/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/ext2_inode_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/ext2_inode_cache/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/ext2_inode_cache/objs_per_slab', 0o664, b'22\n')
+f('sys/kernel/slab/ext2_inode_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/ext2_inode_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/ext2_inode_cache/object_size', 0o664, b'1384\n')
+f('sys/kernel/slab/ext2_inode_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/ext2_inode_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/ext2_inode_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/ext2_inode_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/ext2_inode_cache/objects', 0o664, b'0\n')
+f('sys/kernel/slab/ext2_inode_cache/order', 0o664, b'3\n')
+f('sys/kernel/slab/ext2_inode_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/ext2_inode_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/ext2_inode_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/ext2_inode_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/ext2_inode_cache/validate', 0o664, b'')
+f('sys/kernel/slab/ext2_inode_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/ext2_inode_cache/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/ext2_inode_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/kmalloc-1024', 0o775)
+f('sys/kernel/slab/kmalloc-1024/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-1024/ctor', 0o664, b'')
+f('sys/kernel/slab/kmalloc-1024/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-1024/slab_size', 0o664, b'1096\n')
+f('sys/kernel/slab/kmalloc-1024/total_objects', 0o664, b'580\n')
+f('sys/kernel/slab/kmalloc-1024/slabs', 0o664, b'20\n')
+f('sys/kernel/slab/kmalloc-1024/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-1024/alloc_calls', 0o664, b'''     23 __register_sysctl_paths+0x56/0x340 age=8360116/8368981/8379769 pid=1-1549 cpus=0-1
+      5 param_sysfs_setup+0x87/0x140 age=8355550/8371926/8379909 pid=1-1805 cpus=0-1
+      5 load_module+0x18d5/0x1b30 age=8328407/8365286/8375764 pid=208-2578 cpus=0
+      2 __vmalloc_area_node+0xfb/0x140 age=8360170/8367347/8374524 pid=107-1549 cpus=0
+      4 __percpu_alloc_mask+0xbc/0x140 age=8379760/8379760/8379760 pid=1 cpus=0
+    113 alloc_pipe_info+0x25/0x60 age=125624/8270722/8377065 pid=1-13212 cpus=0-1
+      2 alloc_fdtable+0x81/0x160 age=2417000/5386894/8356789 pid=1690 cpus=0-1
+      1 mb_cache_create+0xb6/0x1f0 age=8379750 pid=1 cpus=1
+      1 mb_cache_create+0x11e/0x1f0 age=8379750 pid=1 cpus=1
+      8 add_partition+0x45/0x250 age=61959/7339549/8379206 pid=1-13295 cpus=0
+      2 __crypto_alloc_tfm+0x43/0x1b0 age=3544684/3544684/3544684 pid=1545 cpus=0
+      1 pci_create_bus+0x82/0x240 age=8379831 pid=1 cpus=0
+     14 pcie_port_device_register+0x254/0x4a0 age=8379746/8379746/8379748 pid=1 cpus=1
+      1 acpi_ev_create_gpe_block+0x10b/0x3bf age=8379903 pid=1 cpus=0
+      1 acpi_tb_resize_root_table_list+0x66/0xdb age=8375731 pid=330 cpus=0
+      2 tty_buffer_request_room+0x136/0x190 age=8214639/8272696/8330753 pid=0-2262 cpus=0
+      1 tty_register_driver+0x1b3/0x2a0 age=8309081 pid=2711 cpus=1
+     10 tty_write+0x160/0x280 age=7214010/8238951/8377659 pid=34-2590 cpus=0-1
+      2 set_inverse_trans_unicode+0xce/0xf0 age=8355014/8367379/8379745 pid=1-1898 cpus=1
+      1 uart_register_driver+0x31/0x1c0 age=8379710 pid=1 cpus=1
+    166 device_create_vargs+0x8c/0x100 age=22658/8173620/8379911 pid=1-13295 cpus=0-1
+      8 platform_device_alloc+0x37/0x90 age=8367172/8376785/8379911 pid=1-1285 cpus=0-1
+      3 scsi_alloc_target+0x63/0x2e0 age=61990/5606770/8379325 pid=1-13295 cpus=0-1
+      2 sd_probe+0x86/0x430 age=61986/4220653/8379321 pid=1-13295 cpus=1
+      1 ahci_port_start+0x34/0xe0 age=8379708 pid=1 cpus=1
+      1 psmouse_connect+0x5b/0x2c0 age=8378898 pid=17 cpus=1
+      2 thermal_cooling_device_register+0x7f/0x290 age=8375643/8375667/8375692 pid=330 cpus=0-1
+      1 hid_add_field+0xcc/0x3a0 age=53473 pid=419 cpus=0
+      4 sock_alloc_send_skb+0x1cd/0x200 age=8344775/8349266/8350926 pid=1738 cpus=0-1
+      3 __rtnl_register+0x79/0x90 age=8360119/8373266/8379912 pid=1-1549 cpus=0
+      6 qdisc_alloc+0x34/0xd0 age=8356043/8356079/8356257 pid=1541 cpus=0
+      1 dmi_id_init+0x2a4/0x30c age=8379910 pid=1 cpus=0
+      5 hub_probe+0xdd/0x820 [usbcore] age=8373999/8374492/8374845 pid=143-147 cpus=0-1
+      5 usb_create_hcd+0x39/0x150 [usbcore] age=8374071/8374526/8374892 pid=143-147 cpus=0
+     26 usb_set_configuration+0x441/0x5f0 [usbcore] age=22663/3237429/8374857 pid=143-419 cpus=0-1
+     10 usb_get_configuration+0x92/0x1480 [usbcore] age=22667/5876069/8374865 pid=143-419 cpus=0-1
+     34 usb_create_ep_files+0x51/0x350 [usbcore] age=22579/5431762/8374732 pid=143-419 cpus=0-1
+      1 acpi_battery_add+0x29/0x1d3 [battery] age=8375630 pid=396 cpus=0
+      1 snd_card_new+0x38/0x370 [snd] age=8374136 pid=107 cpus=0
+      1 sta_info_alloc+0x3c/0x1d0 [mac80211] age=8329523 pid=742 cpus=0
+      2 snd_pcm_new+0x47/0x130 [snd_pcm] age=8374109/8374109/8374109 pid=107 cpus=1
+      1 rs_alloc_sta+0x25/0x120 [iwl3945] age=8329523 pid=742 cpus=0
+      1 get_alloc_hash+0x9b/0x140 [snd_hda_intel] age=8373108 pid=786 cpus=0
+      1 azx_probe+0xb3/0xc20 [snd_hda_intel] age=8374129 pid=107 cpus=0
+      1 azx_probe+0x4a9/0xc20 [snd_hda_intel] age=8374122 pid=107 cpus=0
+      1 snd_hda_codec_new+0x3e/0x559 [snd_hda_intel] age=8374112 pid=107 cpus=1
+      1 md_probe+0xa1/0x360 [md_mod] age=8370183 pid=916 cpus=0
+      8 loop_alloc+0x28/0x140 [loop] age=8369639/8369639/8369639 pid=951 cpus=0
+      4 ipv6_add_dev+0x69/0x330 [ipv6] age=8360116/8360117/8360119 pid=1549 cpus=0
+      1 ipv6_route_sysctl_init+0x22/0xb0 [ipv6] age=8360115 pid=1549 cpus=0
+      2 snd_seq_create_port+0x35/0x180 [snd_seq] age=8355549/8355549/8355549 pid=1805 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-1024/objs_per_slab', 0o664, b'29\n')
+f('sys/kernel/slab/kmalloc-1024/shrink', 0o664, b'')
+f('sys/kernel/slab/kmalloc-1024/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-1024/object_size', 0o664, b'1024\n')
+f('sys/kernel/slab/kmalloc-1024/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-1024/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-1024/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-1024/objects_partial', 0o664, b'196\n')
+f('sys/kernel/slab/kmalloc-1024/objects', 0o664, b'544\n')
+f('sys/kernel/slab/kmalloc-1024/order', 0o664, b'3\n')
+f('sys/kernel/slab/kmalloc-1024/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-1024/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-1024/align', 0o664, b'8\n')
+f('sys/kernel/slab/kmalloc-1024/partial', 0o664, b'8\n')
+f('sys/kernel/slab/kmalloc-1024/validate', 0o664, b'')
+f('sys/kernel/slab/kmalloc-1024/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-1024/free_calls', 0o664, b'''    216 <not-available> age=4303047343 pid=0 cpus=0
+      1 __vunmap+0xe9/0x120 age=8360137 pid=1549 cpus=0
+     64 __free_pipe_info+0x5c/0x70 age=55301/8227248/8377668 pid=34-13363 cpus=0-1
+     19 acpi_ds_delete_walk_state+0xc9/0xcd age=8355814/8376228/8380000 pid=0-1772 cpus=0-1
+      1 acpi_tb_resize_root_table_list+0xbf/0xdb age=8375732 pid=330 cpus=0
+      2 release_one_tty+0xc7/0x190 age=8352476/8361380/8370284 pid=55-1253 cpus=0-1
+      1 vt_ioctl+0x273/0x1c30 age=8356598 pid=1703 cpus=0
+     14 device_create_release+0x9/0x10 age=8352395/8354628/8356598 pid=1703-2139 cpus=0-1
+      1 fw_dev_release+0x20/0x30 age=8356148 pid=1541 cpus=0
+    184 skb_release_data+0x85/0xd0 age=22639/7036434/8379911 pid=0-13303 cpus=0-1
+''')
+f('sys/kernel/slab/kmalloc-1024/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/files_cache', 0o775)
+f('sys/kernel/slab/files_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/files_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/files_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/files_cache/slab_size', 0o664, b'896\n')
+f('sys/kernel/slab/files_cache/total_objects', 0o664, b'108\n')
+f('sys/kernel/slab/files_cache/slabs', 0o664, b'6\n')
+f('sys/kernel/slab/files_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/files_cache/alloc_calls', 0o664, b'     80 dup_fd+0x2e/0x420 age=4136/7769280/8379905 pid=0-12336 cpus=0-1\n')
+f('sys/kernel/slab/files_cache/objs_per_slab', 0o664, b'18\n')
+f('sys/kernel/slab/files_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/files_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/files_cache/object_size', 0o664, b'768\n')
+f('sys/kernel/slab/files_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/files_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/files_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/files_cache/objects_partial', 0o664, b'29\n')
+f('sys/kernel/slab/files_cache/objects', 0o664, b'101\n')
+f('sys/kernel/slab/files_cache/order', 0o664, b'2\n')
+f('sys/kernel/slab/files_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/files_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/files_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/files_cache/partial', 0o664, b'2\n')
+f('sys/kernel/slab/files_cache/validate', 0o664, b'')
+f('sys/kernel/slab/files_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/files_cache/free_calls', 0o664, b'''      9 <not-available> age=4303047250 pid=0 cpus=0
+     31 put_files_struct+0xb4/0xe0 age=7177/7367129/8366999 pid=1202-20292 cpus=0-1
+     40 free_fdtable_rcu+0xa0/0xb0 age=61634/7953135/8376143 pid=0-12335 cpus=0-1
+''')
+f('sys/kernel/slab/files_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/UDP-Lite', 0o775)
+f('sys/kernel/slab/UDP-Lite/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/UDP-Lite/ctor', 0o664, b'')
+f('sys/kernel/slab/UDP-Lite/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/UDP-Lite/slab_size', 0o664, b'1344\n')
+f('sys/kernel/slab/UDP-Lite/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/UDP-Lite/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/UDP-Lite/poison', 0o664, b'1\n')
+f('sys/kernel/slab/UDP-Lite/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/UDP-Lite/objs_per_slab', 0o664, b'12\n')
+f('sys/kernel/slab/UDP-Lite/shrink', 0o664, b'')
+f('sys/kernel/slab/UDP-Lite/trace', 0o664, b'0\n')
+f('sys/kernel/slab/UDP-Lite/object_size', 0o664, b'1232\n')
+f('sys/kernel/slab/UDP-Lite/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/UDP-Lite/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/UDP-Lite/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/UDP-Lite/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/UDP-Lite/objects', 0o664, b'0\n')
+f('sys/kernel/slab/UDP-Lite/order', 0o664, b'2\n')
+f('sys/kernel/slab/UDP-Lite/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/UDP-Lite/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/UDP-Lite/align', 0o664, b'0\n')
+f('sys/kernel/slab/UDP-Lite/partial', 0o664, b'0\n')
+f('sys/kernel/slab/UDP-Lite/validate', 0o664, b'')
+f('sys/kernel/slab/UDP-Lite/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/UDP-Lite/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/UDP-Lite/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/mnt_cache', 0o775)
+f('sys/kernel/slab/mnt_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/mnt_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/mnt_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/mnt_cache/slab_size', 0o664, b'320\n')
+f('sys/kernel/slab/mnt_cache/total_objects', 0o664, b'36\n')
+f('sys/kernel/slab/mnt_cache/slabs', 0o664, b'3\n')
+f('sys/kernel/slab/mnt_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/mnt_cache/alloc_calls', 0o664, b'     25 alloc_vfsmnt+0x1f/0x180 age=61162/8041266/8379801 pid=0-13348 cpus=0-1\n')
+f('sys/kernel/slab/mnt_cache/objs_per_slab', 0o664, b'12\n')
+f('sys/kernel/slab/mnt_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/mnt_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/mnt_cache/object_size', 0o664, b'224\n')
+f('sys/kernel/slab/mnt_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/mnt_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/mnt_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/mnt_cache/objects_partial', 0o664, b'4\n')
+f('sys/kernel/slab/mnt_cache/objects', 0o664, b'28\n')
+f('sys/kernel/slab/mnt_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/mnt_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/mnt_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/mnt_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/mnt_cache/partial', 0o664, b'1\n')
+f('sys/kernel/slab/mnt_cache/validate', 0o664, b'')
+f('sys/kernel/slab/mnt_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/mnt_cache/free_calls', 0o664, b'''     24 <not-available> age=4303047098 pid=0 cpus=0
+      1 free_vfsmnt+0x2c/0x40 age=7837771 pid=3347 cpus=0
+''')
+f('sys/kernel/slab/mnt_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/skbuff_head_cache', 0o775)
+f('sys/kernel/slab/skbuff_head_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/skbuff_head_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/skbuff_head_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/skbuff_head_cache/slab_size', 0o664, b'320\n')
+f('sys/kernel/slab/skbuff_head_cache/total_objects', 0o664, b'588\n')
+f('sys/kernel/slab/skbuff_head_cache/slabs', 0o664, b'49\n')
+f('sys/kernel/slab/skbuff_head_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/skbuff_head_cache/alloc_calls', 0o664, b'    550 __alloc_skb+0x44/0x150 age=1665/3999351/8355948 pid=733-1738 cpus=0-1\n')
+f('sys/kernel/slab/skbuff_head_cache/objs_per_slab', 0o664, b'12\n')
+f('sys/kernel/slab/skbuff_head_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/skbuff_head_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/skbuff_head_cache/object_size', 0o664, b'208\n')
+f('sys/kernel/slab/skbuff_head_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/skbuff_head_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/skbuff_head_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/skbuff_head_cache/objects_partial', 0o664, b'18\n')
+f('sys/kernel/slab/skbuff_head_cache/objects', 0o664, b'570\n')
+f('sys/kernel/slab/skbuff_head_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/skbuff_head_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/skbuff_head_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/skbuff_head_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/skbuff_head_cache/partial', 0o664, b'3\n')
+f('sys/kernel/slab/skbuff_head_cache/validate', 0o664, b'')
+f('sys/kernel/slab/skbuff_head_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/skbuff_head_cache/free_calls', 0o664, b'''    333 <not-available> age=4303046979 pid=0 cpus=0
+    217 __kfree_skb+0x3a/0xa0 age=1666/662694/8356220 pid=0-13466 cpus=0-1
+''')
+f('sys/kernel/slab/skbuff_head_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/fuse_inode', 0o775)
+f('sys/kernel/slab/fuse_inode/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/fuse_inode/ctor', 0o664, b'fuse_inode_init_once+0x0/0x10 [fuse]\n')
+f('sys/kernel/slab/fuse_inode/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/fuse_inode/slab_size', 0o664, b'1344\n')
+f('sys/kernel/slab/fuse_inode/total_objects', 0o664, b'12\n')
+f('sys/kernel/slab/fuse_inode/slabs', 0o664, b'1\n')
+f('sys/kernel/slab/fuse_inode/poison', 0o664, b'1\n')
+f('sys/kernel/slab/fuse_inode/alloc_calls', 0o664, b'      1 fuse_alloc_inode+0x1a/0xe0 [fuse] age=8336111 pid=2476 cpus=0\n')
+f('sys/kernel/slab/fuse_inode/objs_per_slab', 0o664, b'12\n')
+f('sys/kernel/slab/fuse_inode/shrink', 0o664, b'')
+f('sys/kernel/slab/fuse_inode/trace', 0o664, b'0\n')
+f('sys/kernel/slab/fuse_inode/object_size', 0o664, b'1248\n')
+f('sys/kernel/slab/fuse_inode/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/fuse_inode/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/fuse_inode/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/fuse_inode/objects_partial', 0o664, b'1\n')
+f('sys/kernel/slab/fuse_inode/objects', 0o664, b'1\n')
+f('sys/kernel/slab/fuse_inode/order', 0o664, b'2\n')
+f('sys/kernel/slab/fuse_inode/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/fuse_inode/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/fuse_inode/align', 0o664, b'0\n')
+f('sys/kernel/slab/fuse_inode/partial', 0o664, b'1\n')
+f('sys/kernel/slab/fuse_inode/validate', 0o664, b'')
+f('sys/kernel/slab/fuse_inode/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/fuse_inode/free_calls', 0o664, b'      1 <not-available> age=4303047710 pid=0 cpus=0\n')
+f('sys/kernel/slab/fuse_inode/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/skbuff_fclone_cache', 0o775)
+f('sys/kernel/slab/skbuff_fclone_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/skbuff_fclone_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/skbuff_fclone_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/skbuff_fclone_cache/slab_size', 0o664, b'512\n')
+f('sys/kernel/slab/skbuff_fclone_cache/total_objects', 0o664, b'32\n')
+f('sys/kernel/slab/skbuff_fclone_cache/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/skbuff_fclone_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/skbuff_fclone_cache/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/skbuff_fclone_cache/objs_per_slab', 0o664, b'16\n')
+f('sys/kernel/slab/skbuff_fclone_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/skbuff_fclone_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/skbuff_fclone_cache/object_size', 0o664, b'420\n')
+f('sys/kernel/slab/skbuff_fclone_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/skbuff_fclone_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/skbuff_fclone_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/skbuff_fclone_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/skbuff_fclone_cache/objects', 0o664, b'32\n')
+f('sys/kernel/slab/skbuff_fclone_cache/order', 0o664, b'1\n')
+f('sys/kernel/slab/skbuff_fclone_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/skbuff_fclone_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/skbuff_fclone_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/skbuff_fclone_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/skbuff_fclone_cache/validate', 0o664, b'')
+f('sys/kernel/slab/skbuff_fclone_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/skbuff_fclone_cache/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/skbuff_fclone_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/buffer_head', 0o775)
+f('sys/kernel/slab/buffer_head/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/buffer_head/ctor', 0o664, b'init_buffer_head+0x0/0x20\n')
+f('sys/kernel/slab/buffer_head/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/buffer_head/slab_size', 0o664, b'176\n')
+f('sys/kernel/slab/buffer_head/total_objects', 0o664, b'31487\n')
+f('sys/kernel/slab/buffer_head/slabs', 0o664, b'1369\n')
+f('sys/kernel/slab/buffer_head/poison', 0o664, b'1\n')
+f('sys/kernel/slab/buffer_head/alloc_calls', 0o664, b'  31488 alloc_buffer_head+0x19/0x50 age=1/3079345/8378152 pid=1-32767 cpus=0-1\n')
+f('sys/kernel/slab/buffer_head/objs_per_slab', 0o664, b'23\n')
+f('sys/kernel/slab/buffer_head/shrink', 0o664, b'')
+f('sys/kernel/slab/buffer_head/trace', 0o664, b'0\n')
+f('sys/kernel/slab/buffer_head/object_size', 0o664, b'104\n')
+f('sys/kernel/slab/buffer_head/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/buffer_head/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/buffer_head/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/buffer_head/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/buffer_head/objects', 0o664, b'31487\n')
+f('sys/kernel/slab/buffer_head/order', 0o664, b'0\n')
+f('sys/kernel/slab/buffer_head/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/buffer_head/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/buffer_head/align', 0o664, b'0\n')
+f('sys/kernel/slab/buffer_head/partial', 0o664, b'0\n')
+f('sys/kernel/slab/buffer_head/validate', 0o664, b'')
+f('sys/kernel/slab/buffer_head/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/buffer_head/free_calls', 0o664, b'''  14436 <not-available> age=4303047199 pid=0 cpus=0
+  17053 free_buffer_head+0x20/0x40 age=1227/1928220/8379062 pid=1-32759 cpus=0-1
+''')
+f('sys/kernel/slab/buffer_head/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/blkdev_queue', 0o775)
+f('sys/kernel/slab/blkdev_queue/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_queue/ctor', 0o664, b'')
+f('sys/kernel/slab/blkdev_queue/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_queue/slab_size', 0o664, b'2496\n')
+f('sys/kernel/slab/blkdev_queue/total_objects', 0o664, b'26\n')
+f('sys/kernel/slab/blkdev_queue/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/blkdev_queue/poison', 0o664, b'1\n')
+f('sys/kernel/slab/blkdev_queue/alloc_calls', 0o664, b'     12 blk_alloc_queue_node+0x1c/0xc0 age=61520/7678497/8378855 pid=1-13295 cpus=0-1\n')
+f('sys/kernel/slab/blkdev_queue/objs_per_slab', 0o664, b'13\n')
+f('sys/kernel/slab/blkdev_queue/shrink', 0o664, b'')
+f('sys/kernel/slab/blkdev_queue/trace', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_queue/object_size', 0o664, b'2424\n')
+f('sys/kernel/slab/blkdev_queue/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_queue/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_queue/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_queue/objects_partial', 0o664, b'10\n')
+f('sys/kernel/slab/blkdev_queue/objects', 0o664, b'23\n')
+f('sys/kernel/slab/blkdev_queue/order', 0o664, b'3\n')
+f('sys/kernel/slab/blkdev_queue/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/blkdev_queue/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/blkdev_queue/align', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_queue/partial', 0o664, b'1\n')
+f('sys/kernel/slab/blkdev_queue/validate', 0o664, b'')
+f('sys/kernel/slab/blkdev_queue/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/blkdev_queue/free_calls', 0o664, b'     12 <not-available> age=4303046873 pid=0 cpus=0\n')
+f('sys/kernel/slab/blkdev_queue/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/RAW', 0o775)
+f('sys/kernel/slab/RAW/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/RAW/ctor', 0o664, b'')
+f('sys/kernel/slab/RAW/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/RAW/slab_size', 0o664, b'1280\n')
+f('sys/kernel/slab/RAW/total_objects', 0o664, b'12\n')
+f('sys/kernel/slab/RAW/slabs', 0o664, b'1\n')
+f('sys/kernel/slab/RAW/poison', 0o664, b'1\n')
+f('sys/kernel/slab/RAW/alloc_calls', 0o664, b'      3 sk_prot_alloc+0x1e/0xb0 age=8379168/8379171/8379177 pid=1 cpus=0\n')
+f('sys/kernel/slab/RAW/objs_per_slab', 0o664, b'12\n')
+f('sys/kernel/slab/RAW/shrink', 0o664, b'')
+f('sys/kernel/slab/RAW/trace', 0o664, b'0\n')
+f('sys/kernel/slab/RAW/object_size', 0o664, b'1208\n')
+f('sys/kernel/slab/RAW/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/RAW/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/RAW/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/RAW/objects_partial', 0o664, b'3\n')
+f('sys/kernel/slab/RAW/objects', 0o664, b'3\n')
+f('sys/kernel/slab/RAW/order', 0o664, b'2\n')
+f('sys/kernel/slab/RAW/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/RAW/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/RAW/align', 0o664, b'0\n')
+f('sys/kernel/slab/RAW/partial', 0o664, b'1\n')
+f('sys/kernel/slab/RAW/validate', 0o664, b'')
+f('sys/kernel/slab/RAW/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/RAW/free_calls', 0o664, b'      3 <not-available> age=4303046751 pid=0 cpus=0\n')
+f('sys/kernel/slab/RAW/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/blkdev_ioc', 0o775)
+f('sys/kernel/slab/blkdev_ioc/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_ioc/ctor', 0o664, b'')
+f('sys/kernel/slab/blkdev_ioc/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_ioc/slab_size', 0o664, b'200\n')
+f('sys/kernel/slab/blkdev_ioc/total_objects', 0o664, b'100\n')
+f('sys/kernel/slab/blkdev_ioc/slabs', 0o664, b'5\n')
+f('sys/kernel/slab/blkdev_ioc/poison', 0o664, b'1\n')
+f('sys/kernel/slab/blkdev_ioc/alloc_calls', 0o664, b'     64 alloc_io_context+0x19/0xa0 age=3410/8058449/8378873 pid=1-13466 cpus=0-1\n')
+f('sys/kernel/slab/blkdev_ioc/objs_per_slab', 0o664, b'20\n')
+f('sys/kernel/slab/blkdev_ioc/shrink', 0o664, b'')
+f('sys/kernel/slab/blkdev_ioc/trace', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_ioc/object_size', 0o664, b'128\n')
+f('sys/kernel/slab/blkdev_ioc/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_ioc/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_ioc/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_ioc/objects_partial', 0o664, b'38\n')
+f('sys/kernel/slab/blkdev_ioc/objects', 0o664, b'98\n')
+f('sys/kernel/slab/blkdev_ioc/order', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_ioc/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/blkdev_ioc/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/blkdev_ioc/align', 0o664, b'0\n')
+f('sys/kernel/slab/blkdev_ioc/partial', 0o664, b'2\n')
+f('sys/kernel/slab/blkdev_ioc/validate', 0o664, b'')
+f('sys/kernel/slab/blkdev_ioc/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/blkdev_ioc/free_calls', 0o664, b'''      9 <not-available> age=4303046891 pid=0 cpus=0
+     55 put_io_context+0xb2/0xd0 age=45025/8043308/8374605 pid=145-13349 cpus=0-1
+''')
+f('sys/kernel/slab/blkdev_ioc/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/sigqueue', 0o775)
+f('sys/kernel/slab/sigqueue/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/sigqueue/ctor', 0o664, b'')
+f('sys/kernel/slab/sigqueue/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/sigqueue/slab_size', 0o664, b'232\n')
+f('sys/kernel/slab/sigqueue/total_objects', 0o664, b'34\n')
+f('sys/kernel/slab/sigqueue/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/sigqueue/poison', 0o664, b'1\n')
+f('sys/kernel/slab/sigqueue/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/sigqueue/objs_per_slab', 0o664, b'17\n')
+f('sys/kernel/slab/sigqueue/shrink', 0o664, b'')
+f('sys/kernel/slab/sigqueue/trace', 0o664, b'0\n')
+f('sys/kernel/slab/sigqueue/object_size', 0o664, b'160\n')
+f('sys/kernel/slab/sigqueue/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/sigqueue/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/sigqueue/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/sigqueue/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/sigqueue/objects', 0o664, b'34\n')
+f('sys/kernel/slab/sigqueue/order', 0o664, b'0\n')
+f('sys/kernel/slab/sigqueue/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/sigqueue/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/sigqueue/align', 0o664, b'8\n')
+f('sys/kernel/slab/sigqueue/partial', 0o664, b'0\n')
+f('sys/kernel/slab/sigqueue/validate', 0o664, b'')
+f('sys/kernel/slab/sigqueue/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/sigqueue/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/sigqueue/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/TCPv6', 0o775)
+f('sys/kernel/slab/TCPv6/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/TCPv6/ctor', 0o664, b'')
+f('sys/kernel/slab/TCPv6/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/TCPv6/slab_size', 0o664, b'2432\n')
+f('sys/kernel/slab/TCPv6/total_objects', 0o664, b'26\n')
+f('sys/kernel/slab/TCPv6/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/TCPv6/poison', 0o664, b'1\n')
+f('sys/kernel/slab/TCPv6/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/TCPv6/objs_per_slab', 0o664, b'13\n')
+f('sys/kernel/slab/TCPv6/shrink', 0o664, b'')
+f('sys/kernel/slab/TCPv6/trace', 0o664, b'0\n')
+f('sys/kernel/slab/TCPv6/object_size', 0o664, b'2336\n')
+f('sys/kernel/slab/TCPv6/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/TCPv6/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/TCPv6/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/TCPv6/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/TCPv6/objects', 0o664, b'26\n')
+f('sys/kernel/slab/TCPv6/order', 0o664, b'3\n')
+f('sys/kernel/slab/TCPv6/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/TCPv6/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/TCPv6/align', 0o664, b'0\n')
+f('sys/kernel/slab/TCPv6/partial', 0o664, b'0\n')
+f('sys/kernel/slab/TCPv6/validate', 0o664, b'')
+f('sys/kernel/slab/TCPv6/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/TCPv6/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/TCPv6/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/kioctx', 0o775)
+f('sys/kernel/slab/kioctx/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kioctx/ctor', 0o664, b'')
+f('sys/kernel/slab/kioctx/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/kioctx/slab_size', 0o664, b'640\n')
+f('sys/kernel/slab/kioctx/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/kioctx/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kioctx/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kioctx/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/kioctx/objs_per_slab', 0o664, b'12\n')
+f('sys/kernel/slab/kioctx/shrink', 0o664, b'')
+f('sys/kernel/slab/kioctx/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kioctx/object_size', 0o664, b'512\n')
+f('sys/kernel/slab/kioctx/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kioctx/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/kioctx/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kioctx/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/kioctx/objects', 0o664, b'0\n')
+f('sys/kernel/slab/kioctx/order', 0o664, b'1\n')
+f('sys/kernel/slab/kioctx/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kioctx/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kioctx/align', 0o664, b'8\n')
+f('sys/kernel/slab/kioctx/partial', 0o664, b'0\n')
+f('sys/kernel/slab/kioctx/validate', 0o664, b'')
+f('sys/kernel/slab/kioctx/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kioctx/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/kioctx/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/kmalloc-32', 0o775)
+f('sys/kernel/slab/kmalloc-32/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-32/ctor', 0o664, b'')
+f('sys/kernel/slab/kmalloc-32/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-32/slab_size', 0o664, b'104\n')
+f('sys/kernel/slab/kmalloc-32/total_objects', 0o664, b'624\n')
+f('sys/kernel/slab/kmalloc-32/slabs', 0o664, b'16\n')
+f('sys/kernel/slab/kmalloc-32/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-32/alloc_calls', 0o664, b'''      1 mtrr_file_add+0xb0/0xe0 age=8355511 pid=1738 cpus=0
+      2 arch_acpi_processor_init_pdc+0x8e/0x180 age=8375727/8375758/8375789 pid=330 cpus=0
+      1 pm_qos_add_requirement+0x34/0xe0 age=8376080 pid=122 cpus=1
+     59 setup_modinfo_srcversion+0x19/0x30 age=8303075/8368435/8376316 pid=105-2754 cpus=0-1
+     42 load_module+0x1455/0x1b30 age=8303075/8366312/8375832 pid=107-2754 cpus=0-1
+    151 load_module+0x1ac4/0x1b30 age=8303071/8368871/8376310 pid=105-2754 cpus=0-1
+      3 mempool_create_node+0x4b/0xf0 age=62046/5606826/8379381 pid=1-13295 cpus=0-1
+      1 strndup_user+0x6d/0xc0 age=8374925 pid=107 cpus=0
+     16 __vmalloc_area_node+0xfb/0x140 age=8328464/8366300/8376086 pid=107-2578 cpus=0-1
+      1 do_kern_mount+0xca/0x110 age=8335800 pid=2476 cpus=0
+      1 do_sys_poll+0xdb/0x450 age=1303 pid=1333 cpus=1
+      1 alloc_vfsmnt+0x97/0x180 age=8335801 pid=2476 cpus=0
+      1 single_open+0x3c/0xb0 age=8355816 pid=1738 cpus=0
+     66 sysfs_new_dirent+0x10c/0x120 age=8360190/8377926/8379815 pid=1-1549 cpus=0-1
+     30 do_shmat+0x169/0x410 age=8274161/8330033/8348616 pid=1738-2621 cpus=0-1
+     21 register_blkdev+0x60/0x150 age=8369695/8377753/8379765 pid=1-951 cpus=0-1
+     39 kvasprintf+0x55/0x90 age=8360190/8378048/8379814 pid=1-1549 cpus=0-1
+      7 pci_save_state+0x1a4/0x250 age=8373637/8378406/8379803 pid=1-126 cpus=0-1
+      2 pcim_enable_device+0x86/0xb0 age=8379255/8379510/8379765 pid=1 cpus=0-1
+     15 acpi_ds_build_internal_package_obj+0xaf/0x1df age=8379932/8379938/8379947 pid=1 cpus=0
+     21 acpi_ds_build_internal_buffer_obj+0xe1/0x121 age=3847501/7731852/8379949 pid=1-330 cpus=0
+      1 acpi_install_gpe_handler+0xa7/0x13a age=8379959 pid=1 cpus=0
+      1 acpi_ev_create_gpe_block+0x282/0x3bf age=8379959 pid=1 cpus=0
+      1 acpi_pci_bind_root+0x8d/0x13e age=8379883 pid=1 cpus=0
+     18 acpi_pci_bind+0x85/0x28d age=8379879/8379879/8379882 pid=1 cpus=0
+     15 rand_initialize_disk+0x1d/0x30 age=62014/7263977/8379377 pid=1-13295 cpus=0-1
+      1 ata_host_start+0xcb/0x1e0 age=8379764 pid=1 cpus=1
+      1 hidinput_connect+0x2372/0x24e0 age=53529 pid=419 cpus=0
+      1 sock_kmalloc+0x5c/0x70 age=8325518 pid=1849 cpus=1
+      2 proto_register+0x7c/0x260 age=8360191/8370012/8379834 pid=1-1549 cpus=0
+      2 neigh_hash_alloc+0x42/0x50 age=8325417/8327412/8329408 pid=0-1849 cpus=1
+      1 nl_pid_hash_rehash+0x180/0x1a0 age=947530 pid=1189 cpus=0
+     28 unix_bind+0xd8/0x3a0 age=8356458/8357177/8366824 pid=1336-1738 cpus=0-1
+      3 ipc_init_proc_interface+0x2e/0x7c age=8379805/8379805/8379805 pid=1 cpus=1
+     13 usb_cache_string+0x65/0xa0 [usbcore] age=22649/4521883/8374921 pid=143-419 cpus=0-1
+      6 usb_get_configuration+0x18f/0x1480 [usbcore] age=67053/6989971/8374921 pid=143-419 cpus=0-1
+      2 _snd_ctl_register_ioctl+0x2b/0x80 [snd] age=8374675/8374675/8374675 pid=107 cpus=0
+      2 snd_oss_info_register+0x40/0xc0 [snd] age=8355350/8355452/8355555 pid=1813 cpus=0
+      6 adjust_io+0xeb/0x120 [rsrc_nonstatic] age=8373110/8373182/8373542 pid=352-800 cpus=0
+      5 adjust_memory+0xe5/0x1a0 [rsrc_nonstatic] age=8373110/8373278/8373535 pid=352-800 cpus=0
+      1 ieee80211_sta_set_extra_ie+0x7d/0xe0 [mac80211] age=8329597 pid=1545 cpus=0
+      2 ieee80211_rx_bss_info+0x4df/0xa20 [mac80211] age=8330170/8342783/8355397 pid=0 cpus=0
+      2 ieee80211_rx_bss_info+0x568/0xa20 [mac80211] age=22736/4188782/8354829 pid=742-1951 cpus=0
+      2 ieee80211_rx_bss_info+0x5f7/0xa20 [mac80211] age=22736/4189294/8355852 pid=742-1772 cpus=0
+      1 rate_control_alloc+0x32/0x110 [mac80211] age=8373757 pid=126 cpus=1
+      2 ieee80211_rate_control_register+0x72/0xf0 [mac80211] age=8374580/8374635/8374690 pid=126 cpus=0-1
+      2 azx_probe+0x9a4/0xc20 [snd_hda_intel] age=8374165/8374165/8374165 pid=107 cpus=1
+      1 async_chainiv_givencrypt+0x71/0x110 [crypto_blkcipher] age=8374560 pid=215 cpus=0
+      1 run+0x66/0x500 [raid1] age=8370114 pid=916 cpus=0
+      1 acpi_cpufreq_cpu_init+0x4d/0x45c [acpi_cpufreq] age=8366427 pid=1358 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-32/objs_per_slab', 0o664, b'39\n')
+f('sys/kernel/slab/kmalloc-32/shrink', 0o664, b'')
+f('sys/kernel/slab/kmalloc-32/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-32/object_size', 0o664, b'32\n')
+f('sys/kernel/slab/kmalloc-32/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-32/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-32/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-32/objects_partial', 0o664, b'149\n')
+f('sys/kernel/slab/kmalloc-32/objects', 0o664, b'617\n')
+f('sys/kernel/slab/kmalloc-32/order', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-32/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-32/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-32/align', 0o664, b'8\n')
+f('sys/kernel/slab/kmalloc-32/partial', 0o664, b'4\n')
+f('sys/kernel/slab/kmalloc-32/validate', 0o664, b'')
+f('sys/kernel/slab/kmalloc-32/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-32/free_calls', 0o664, b'''    409 <not-available> age=4303047399 pid=0 cpus=0
+      4 __vunmap+0xe9/0x120 age=8366429/8372533/8374823 pid=215-1358 cpus=0-1
+      1 vfs_rename+0x301/0x450 age=8274772 pid=2851 cpus=0
+      8 do_sys_poll+0x32b/0x450 age=1304/6728883/8333312 pid=1333 cpus=0-1
+      1 seq_release_private+0x2d/0x60 age=8352378 pid=2141 cpus=0
+      5 single_release+0x2e/0x40 age=8343903/8358822/8366889 pid=1258-1806 cpus=0
+      1 setxattr+0xa6/0x130 age=8355591 pid=1816 cpus=0
+      6 bio_free_map_data+0x25/0x30 age=53571/4350975/8375998 pid=0-318 cpus=0
+      6 remove_kevent+0x44/0x60 age=7219423/7961750/8346613 pid=2271-2423 cpus=0-1
+     57 load_elf_binary+0xa72/0x1e20 age=22671/8213994/8376585 pid=102-13419 cpus=0-1
+      1 generic_acl_set+0x15e/0x1a0 age=8355591 pid=1816 cpus=0
+     67 kobject_uevent_env+0x11a/0x470 age=62016/8246870/8379965 pid=1-13295 cpus=0-1
+      2 pci_get_subsys+0x74/0xa0 age=8375728/8375759/8375790 pid=330 cpus=0
+      8 acpi_evaluate_integer+0xbf/0xd1 age=3847577/7810351/8379888 pid=1-2097 cpus=0
+      3 acpi_ds_create_operand+0x12c/0x209 age=3847578/6867437/8379889 pid=1-2097 cpus=0
+      3 acpi_ns_get_node+0x92/0xa1 age=8374447/8376288/8379960 pid=1-215 cpus=0-1
+      5 acpi_ut_delete_internal_obj+0x15f/0x16f age=8366428/8373878/8375771 pid=330-1358 cpus=0
+      3 acpi_pci_bind+0x277/0x28d age=8379881/8379881/8379883 pid=1 cpus=0
+      1 get_modalias+0xd4/0x120 age=8355825 pid=1772 cpus=0
+      2 ioctl_standard_iw_point+0x179/0x350 age=63360/84363/105367 pid=1541 cpus=0
+      1 pci_bus_assign_resources+0xfe/0x4d0 age=8379836 pid=1 cpus=0
+      1 sg_clean+0x3e/0x80 [usbcore] age=59566 pid=13294 cpus=0
+      9 usb_get_device_descriptor+0x9b/0xa0 [usbcore] age=22724/6523118/8374922 pid=143-419 cpus=0-1
+      1 ieee80211_rx_bss_info+0x552/0xa20 [mac80211] age=22737 pid=742 cpus=0
+      2 ieee80211_rx_bss_info+0x5e1/0xa20 [mac80211] age=22737/4189295/8355853 pid=742-1772 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-32/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/kmalloc-64', 0o775)
+f('sys/kernel/slab/kmalloc-64/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-64/ctor', 0o664, b'')
+f('sys/kernel/slab/kmalloc-64/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-64/slab_size', 0o664, b'136\n')
+f('sys/kernel/slab/kmalloc-64/total_objects', 0o664, b'15300\n')
+f('sys/kernel/slab/kmalloc-64/slabs', 0o664, b'510\n')
+f('sys/kernel/slab/kmalloc-64/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-64/alloc_calls', 0o664, b'''     30 alternatives_smp_module_add+0x81/0x160 age=8303055/8368397/8380085 pid=0-2754 cpus=0-1
+     39 __request_region+0x39/0x120 age=8373811/8378273/8379949 pid=1-352 cpus=0-1
+      1 audit_log_start+0x353/0x3f0 age=8379797 pid=1 cpus=1
+     16 request_irq+0x9a/0xf0 age=8356279/8374005/8379942 pid=1-1541 cpus=0-1
+      3 devm_request_irq+0x4b/0xc0 age=8379232/8379403/8379747 pid=1 cpus=0-1
+      1 strndup_user+0x6d/0xc0 age=8374545 pid=215 cpus=0
+     95 __get_vm_area_node+0x9b/0x220 age=8303058/8371551/8380085 pid=0-2754 cpus=0-1
+     17 __vmalloc_area_node+0xfb/0x140 age=8309125/8366469/8376299 pid=105-2711 cpus=0-1
+      1 add_swap_extent+0x57/0xc0 age=8372039 pid=867 cpus=0
+     33 dma_pool_alloc+0x6d/0x200 age=8309120/8340771/8374904 pid=143-2711 cpus=0-1
+     40 alloc_kmem_cache_cpu+0x81/0x90 age=8360159/8368022/8379787 pid=1-1549 cpus=0-1
+    164 __percpu_alloc_mask+0x52/0x140 age=61997/8067718/8380085 pid=0-13295 cpus=0-1
+    184 __percpu_alloc_mask+0xbc/0x140 age=62029/8100825/8380085 pid=0-13295 cpus=0-1
+    604 d_alloc+0x19d/0x1f0 age=22685/7859083/8376462 pid=72-24701 cpus=0-1
+     17 alloc_fdtable+0x57/0x160 age=4267/6101781/8357279 pid=1532-12336 cpus=0-1
+     17 alloc_fdtable+0xb4/0x160 age=4267/6101781/8357279 pid=1532-12336 cpus=0-1
+      1 bioset_create+0x21/0xc0 age=8379947 pid=1 cpus=0
+      1 bd_claim_by_disk+0x6f/0x270 age=8370131 pid=916 cpus=0
+     14 posix_acl_alloc+0x1b/0x30 age=53326/7759393/8352180 pid=2175-13390 cpus=0-1
+      5 proc_reg_open+0x3f/0x170 age=8355799/8361268/8366755 pid=1327-1738 cpus=0
+  12754 ext3_init_block_alloc_info+0x22/0x80 age=1/498494/8368528 pid=1-23373 cpus=0-1
+      4 ext3_readdir+0x617/0x650 age=8352064/8352079/8352114 pid=1370 cpus=0
+      8 ext3_htree_store_dirent+0x37/0x130 age=8352064/8352072/8352099 pid=1370 cpus=0
+    277 kobject_create+0x1a/0x40 age=22618/7771015/8380085 pid=0-13295 cpus=0-1
+      1 pci_create_sysfs_dev_files+0x23e/0x3b0 age=8378937 pid=1 cpus=0
+     11 acpi_os_validate_address+0x3d/0xa3 age=8379914/8379927/8379932 pid=1 cpus=0
+    124 acpi_ds_build_internal_package_obj+0xaf/0x1df age=3847484/8233379/8379936 pid=1-330 cpus=0
+      6 acpi_ds_build_internal_buffer_obj+0xe1/0x121 age=8379920/8379925/8379934 pid=1 cpus=0
+      1 acpi_ev_system_memory_region_setup+0x68/0x8f age=8379914 pid=1 cpus=0
+      3 acpi_add_single_object+0x596/0xd3c age=8379878/8379880/8379882 pid=1 cpus=0
+      3 acpi_add_single_object+0x5d8/0xd3c age=8379886/8379888/8379890 pid=1 cpus=0
+     27 acpi_add_single_object+0x9f7/0xd3c age=8379871/8379888/8379900 pid=1 cpus=0
+     55 acpi_ec_add_query_handler+0x31/0x91 age=8379870/8379870/8379870 pid=1 cpus=0
+      1 find_dock+0x2c9/0x426 age=8379950 pid=1 cpus=0
+      6 find_dock_devices+0x5e/0x92 age=8379950/8379950/8379950 pid=1 cpus=0
+      8 acpi_pci_link_add+0x32/0x1db age=8379843/8379844/8379846 pid=1 cpus=0
+     39 acpi_pci_irq_add_prt+0x181/0x324 age=8379862/8379863/8379865 pid=1 cpus=0
+     15 init_dev+0x3c8/0x6f0 age=7217158/8282400/8378180 pid=33-2593 cpus=0-1
+     15 init_dev+0x437/0x6f0 age=7217158/8282400/8378180 pid=33-2593 cpus=0-1
+      3 init_dev+0x5b2/0x6f0 age=7217158/7969269/8364358 pid=1258-2593 cpus=0-1
+      3 init_dev+0x637/0x6f0 age=7217158/7969269/8364358 pid=1258-2593 cpus=0-1
+      2 kobj_map_init+0x36/0xa0 age=8379947/8380016/8380085 pid=0-1 cpus=0
+     38 kobj_map+0x79/0x1a0 age=61997/7936136/8379947 pid=1-13295 cpus=0-1
+      3 dmam_alloc_coherent+0x3f/0xa0 age=8379232/8379403/8379747 pid=1 cpus=0-1
+      1 scsi_probe_and_add_lun+0x65e/0xd80 age=62028 pid=13295 cpus=0
+    170 scsi_dev_info_list_add+0x3d/0x120 age=8379831/8379831/8379831 pid=1 cpus=0
+      1 ahci_init_one+0x137/0xcb0 age=8379748 pid=1 cpus=1
+      1 cpufreq_stat_notifier_policy+0xa1/0x2e0 age=8366410 pid=1358 cpus=0
+      1 cpufreq_stat_notifier_policy+0x17e/0x2e0 age=8366410 pid=1358 cpus=0
+      1 hid_parse_report+0xa9/0x2c0 age=53512 pid=419 cpus=0
+     10 __dev_addr_add+0x69/0xe0 age=8325501/8345496/8360156 pid=8-1849 cpus=0-1
+''')
+f('sys/kernel/slab/kmalloc-64/objs_per_slab', 0o664, b'30\n')
+f('sys/kernel/slab/kmalloc-64/shrink', 0o664, b'')
+f('sys/kernel/slab/kmalloc-64/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-64/object_size', 0o664, b'64\n')
+f('sys/kernel/slab/kmalloc-64/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-64/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-64/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-64/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-64/objects', 0o664, b'15300\n')
+f('sys/kernel/slab/kmalloc-64/order', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-64/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-64/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-64/align', 0o664, b'8\n')
+f('sys/kernel/slab/kmalloc-64/partial', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-64/validate', 0o664, b'')
+f('sys/kernel/slab/kmalloc-64/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-64/free_calls', 0o664, b'''  13029 <not-available> age=4303047386 pid=0 cpus=0
+      1 iounmap+0xc2/0x100 age=8379917 pid=1 cpus=0
+      1 memtype_get_idx+0x75/0xc0 age=782 pid=13466 cpus=0
+      2 __release_region+0xc6/0xd0 age=8379754/8379754/8379754 pid=1 cpus=1
+      3 __request_region+0x86/0x120 age=8379828/8379828/8379828 pid=1 cpus=0
+      1 generic_smp_call_function_single_interrupt+0xce/0xe0 age=8355499 pid=0 cpus=1
+     53 __stop_machine+0x216/0x220 age=8303059/8367652/8376299 pid=105-2754 cpus=0-1
+      2 free_irq+0xef/0x190 age=8356302/8367658/8379015 pid=1-1541 cpus=0
+     28 __vunmap+0xcd/0x120 age=8309125/8366969/8376298 pid=105-2711 cpus=0-1
+      8 __vunmap+0xe9/0x120 age=8328457/8364062/8376068 pid=107-2578 cpus=0-1
+      1 percpu_free+0x2d/0x60 age=61987 pid=13295 cpus=0
+     10 do_sys_poll+0x32b/0x450 age=61481/7500944/8334758 pid=1333-2262 cpus=0-1
+    187 d_callback+0x22/0x40 age=22704/7997936/8376459 pid=0-2156 cpus=0-1
+    198 free_fdtable_rcu+0x7a/0xb0 age=1292/3883175/8376371 pid=0-13456 cpus=0-1
+    224 free_fdtable_rcu+0x82/0xb0 age=1292/3491449/8377150 pid=0-13456 cpus=0-1
+     42 proc_reg_release+0x96/0x120 age=3564/7013222/8376067 pid=126-2586 cpus=0-1
+     50 proc_reg_open+0x138/0x170 age=656297/2956669/8367924 pid=1184-12336 cpus=0-1
+   1046 free_rb_tree_fname+0x5c/0xb0 age=5905/4315279/8376402 pid=102-24701 cpus=0-1
+     79 ext3_htree_free_dir_info+0x19/0x20 age=5905/6235661/8376402 pid=102-24701 cpus=0-1
+     26 ext3_clear_inode+0xa5/0xb0 age=12954/2421572/8354304 pid=1253-8445 cpus=0-1
+      1 dynamic_kobj_release+0x2c/0x40 age=8356191 pid=1541 cpus=0
+     66 kobject_uevent_env+0x11a/0x470 age=22624/7608199/8379955 pid=1-2711 cpus=0-1
+     16 acpi_ds_call_control_method+0xfe/0x180 age=3020/4710292/8379848 pid=1-13466 cpus=0-1
+      1 acpi_ev_execute_reg_method+0x129/0x13a age=8379946 pid=1 cpus=0
+      1 acpi_ev_asynch_execute_gpe_method+0xcc/0x119 age=8379905 pid=12 cpus=1
+     33 acpi_evaluate_object+0x1ea/0x1fc age=3015/5838124/8379955 pid=1-13466 cpus=0-1
+      4 acpi_get_object_info+0x1c4/0x1d4 age=8379876/8379888/8379895 pid=1 cpus=0
+      1 acpi_walk_resources+0xa4/0xbd age=8379755 pid=1 cpus=1
+     41 acpi_ut_evaluate_object+0x18d/0x19b age=8379223/8379861/8379919 pid=1 cpus=0-1
+      4 acpi_ut_delete_internal_obj+0x15f/0x16f age=8366416/8373412/8375744 pid=330-1358 cpus=0
+      7 acpi_bus_get_ejd+0x73/0x80 age=8379955/8379955/8379955 pid=1 cpus=0
+     11 pnp_show_options+0x459/0x600 age=1578/1602/1627 pid=13466 cpus=0
+     11 pnp_show_current_resources+0x16f/0x180 age=1578/1603/1628 pid=13466 cpus=0
+     19 release_one_tty+0x53/0x190 age=804540/7566113/8370327 pid=55-2106 cpus=0-1
+     24 release_one_tty+0x60/0x190 age=804540/7729452/8370327 pid=55-2141 cpus=0-1
+      6 release_one_tty+0x167/0x190 age=8352429/8353224/8354794 pid=1967-2141 cpus=0
+      4 devres_remove_group+0x9e/0xe0 age=8379026/8379313/8379753 pid=1 cpus=0-1
+      1 ata_acpi_on_devcfg+0x385/0x6a0 age=8379406 pid=25 cpus=0
+      3 serio_free_event+0x1d/0x30 age=8378463/8378812/8378999 pid=17 cpus=0-1
+      6 input_register_device+0x17c/0x230 age=53514/6988336/8378983 pid=17-803 cpus=0-1
+      1 ip_cork_release+0x1f/0x50 age=8333854 pid=2536 cpus=1
+      1 unix_sock_destructor+0x75/0xd0 age=7217178 pid=2344 cpus=0
+     13 huft_free+0x1e/0x2f age=8379804/8379804/8379804 pid=1 cpus=0
+      6 hub_port_init+0x522/0x740 [usbcore] age=22825/4210550/8374275 pid=419 cpus=0-1
+      1 usb_release_interface_cache+0x2c/0x60 [usbcore] age=8373868 pid=419 cpus=0
+      1 usb_release_interface_cache+0x47/0x60 [usbcore] age=8373868 pid=419 cpus=0
+      1 __param_str_act+0x16c/0xfffffffffffffb13 [thermal] age=8375113 pid=383 cpus=0
+      3 snd_card_file_remove+0x73/0x130 [snd] age=8333050/8337203/8339297 pid=2400-2425 cpus=0
+      2 hid_probe+0x222/0xf30 [usbhid] age=53517/4212911/8372306 pid=419-803 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-64/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/sgpool-128', 0o775)
+f('sys/kernel/slab/sgpool-128/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-128/ctor', 0o664, b'')
+f('sys/kernel/slab/sgpool-128/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-128/slab_size', 0o664, b'4224\n')
+f('sys/kernel/slab/sgpool-128/total_objects', 0o664, b'14\n')
+f('sys/kernel/slab/sgpool-128/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/sgpool-128/poison', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-128/alloc_calls', 0o664, b'      2 mempool_alloc_slab+0x11/0x20 age=8379262/8379262/8379262 pid=1 cpus=0\n')
+f('sys/kernel/slab/sgpool-128/objs_per_slab', 0o664, b'7\n')
+f('sys/kernel/slab/sgpool-128/shrink', 0o664, b'')
+f('sys/kernel/slab/sgpool-128/trace', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-128/object_size', 0o664, b'4096\n')
+f('sys/kernel/slab/sgpool-128/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-128/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-128/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-128/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-128/objects', 0o664, b'14\n')
+f('sys/kernel/slab/sgpool-128/order', 0o664, b'3\n')
+f('sys/kernel/slab/sgpool-128/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-128/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-128/align', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-128/partial', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-128/validate', 0o664, b'')
+f('sys/kernel/slab/sgpool-128/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-128/free_calls', 0o664, b'      2 <not-available> age=4303046812 pid=0 cpus=0\n')
+f('sys/kernel/slab/sgpool-128/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/kcopyd_job', 0o775)
+f('sys/kernel/slab/kcopyd_job/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kcopyd_job/ctor', 0o664, b'')
+f('sys/kernel/slab/kcopyd_job/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/kcopyd_job/slab_size', 0o664, b'544\n')
+f('sys/kernel/slab/kcopyd_job/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/kcopyd_job/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kcopyd_job/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kcopyd_job/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/kcopyd_job/objs_per_slab', 0o664, b'15\n')
+f('sys/kernel/slab/kcopyd_job/shrink', 0o664, b'')
+f('sys/kernel/slab/kcopyd_job/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kcopyd_job/object_size', 0o664, b'472\n')
+f('sys/kernel/slab/kcopyd_job/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kcopyd_job/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/kcopyd_job/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kcopyd_job/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/kcopyd_job/objects', 0o664, b'0\n')
+f('sys/kernel/slab/kcopyd_job/order', 0o664, b'1\n')
+f('sys/kernel/slab/kcopyd_job/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kcopyd_job/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kcopyd_job/align', 0o664, b'8\n')
+f('sys/kernel/slab/kcopyd_job/partial', 0o664, b'0\n')
+f('sys/kernel/slab/kcopyd_job/validate', 0o664, b'')
+f('sys/kernel/slab/kcopyd_job/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kcopyd_job/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/kcopyd_job/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/dm_target_io', 0o775)
+f('sys/kernel/slab/dm_target_io/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/dm_target_io/ctor', 0o664, b'')
+f('sys/kernel/slab/dm_target_io/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/dm_target_io/slab_size', 0o664, b'96\n')
+f('sys/kernel/slab/dm_target_io/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/dm_target_io/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/dm_target_io/poison', 0o664, b'1\n')
+f('sys/kernel/slab/dm_target_io/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/dm_target_io/objs_per_slab', 0o664, b'42\n')
+f('sys/kernel/slab/dm_target_io/shrink', 0o664, b'')
+f('sys/kernel/slab/dm_target_io/trace', 0o664, b'0\n')
+f('sys/kernel/slab/dm_target_io/object_size', 0o664, b'24\n')
+f('sys/kernel/slab/dm_target_io/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/dm_target_io/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/dm_target_io/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/dm_target_io/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/dm_target_io/objects', 0o664, b'0\n')
+f('sys/kernel/slab/dm_target_io/order', 0o664, b'0\n')
+f('sys/kernel/slab/dm_target_io/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/dm_target_io/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/dm_target_io/align', 0o664, b'8\n')
+f('sys/kernel/slab/dm_target_io/partial', 0o664, b'0\n')
+f('sys/kernel/slab/dm_target_io/validate', 0o664, b'')
+f('sys/kernel/slab/dm_target_io/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/dm_target_io/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/dm_target_io/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/signal_cache', 0o775)
+f('sys/kernel/slab/signal_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/signal_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/signal_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/signal_cache/slab_size', 0o664, b'1024\n')
+f('sys/kernel/slab/signal_cache/total_objects', 0o664, b'160\n')
+f('sys/kernel/slab/signal_cache/slabs', 0o664, b'10\n')
+f('sys/kernel/slab/signal_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/signal_cache/alloc_calls', 0o664, b'    124 copy_process+0x93c/0x1220 age=4145/7851187/8379914 pid=0-12336 cpus=0-1\n')
+f('sys/kernel/slab/signal_cache/objs_per_slab', 0o664, b'16\n')
+f('sys/kernel/slab/signal_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/signal_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/signal_cache/object_size', 0o664, b'896\n')
+f('sys/kernel/slab/signal_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/signal_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/signal_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/signal_cache/objects_partial', 0o664, b'70\n')
+f('sys/kernel/slab/signal_cache/objects', 0o664, b'150\n')
+f('sys/kernel/slab/signal_cache/order', 0o664, b'2\n')
+f('sys/kernel/slab/signal_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/signal_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/signal_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/signal_cache/partial', 0o664, b'5\n')
+f('sys/kernel/slab/signal_cache/validate', 0o664, b'')
+f('sys/kernel/slab/signal_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/signal_cache/free_calls', 0o664, b'''     42 <not-available> age=4303047259 pid=0 cpus=0
+     82 __cleanup_signal+0x20/0x30 age=7186/7586663/8375843 pid=1-13288 cpus=0-1
+''')
+f('sys/kernel/slab/signal_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/radix_tree_node', 0o775)
+f('sys/kernel/slab/radix_tree_node/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/radix_tree_node/ctor', 0o664, b'radix_tree_node_ctor+0x0/0x10\n')
+f('sys/kernel/slab/radix_tree_node/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/radix_tree_node/slab_size', 0o664, b'624\n')
+f('sys/kernel/slab/radix_tree_node/total_objects', 0o664, b'6747\n')
+f('sys/kernel/slab/radix_tree_node/slabs', 0o664, b'519\n')
+f('sys/kernel/slab/radix_tree_node/poison', 0o664, b'1\n')
+f('sys/kernel/slab/radix_tree_node/alloc_calls', 0o664, b'   6737 radix_tree_preload+0x3b/0xb0 age=16/6612251/8379044 pid=1-32767 cpus=0-1\n')
+f('sys/kernel/slab/radix_tree_node/objs_per_slab', 0o664, b'13\n')
+f('sys/kernel/slab/radix_tree_node/shrink', 0o664, b'')
+f('sys/kernel/slab/radix_tree_node/trace', 0o664, b'0\n')
+f('sys/kernel/slab/radix_tree_node/object_size', 0o664, b'552\n')
+f('sys/kernel/slab/radix_tree_node/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/radix_tree_node/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/radix_tree_node/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/radix_tree_node/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/radix_tree_node/objects', 0o664, b'6747\n')
+f('sys/kernel/slab/radix_tree_node/order', 0o664, b'1\n')
+f('sys/kernel/slab/radix_tree_node/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/radix_tree_node/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/radix_tree_node/align', 0o664, b'0\n')
+f('sys/kernel/slab/radix_tree_node/partial', 0o664, b'0\n')
+f('sys/kernel/slab/radix_tree_node/validate', 0o664, b'')
+f('sys/kernel/slab/radix_tree_node/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/radix_tree_node/free_calls', 0o664, b'''   4146 <not-available> age=4303047064 pid=0 cpus=0
+   2591 radix_tree_node_rcu_free+0x41/0x50 age=39290/6239072/8378908 pid=0-32584 cpus=0-1
+''')
+f('sys/kernel/slab/radix_tree_node/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/uid_cache', 0o775)
+f('sys/kernel/slab/uid_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/uid_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/uid_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/uid_cache/slab_size', 0o664, b'320\n')
+f('sys/kernel/slab/uid_cache/total_objects', 0o664, b'24\n')
+f('sys/kernel/slab/uid_cache/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/uid_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/uid_cache/alloc_calls', 0o664, b'      5 alloc_uid+0xbd/0x1e0 age=8351086/8358570/8366097 pid=1333-2177 cpus=0-1\n')
+f('sys/kernel/slab/uid_cache/objs_per_slab', 0o664, b'12\n')
+f('sys/kernel/slab/uid_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/uid_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/uid_cache/object_size', 0o664, b'216\n')
+f('sys/kernel/slab/uid_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/uid_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/uid_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/uid_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/uid_cache/objects', 0o664, b'24\n')
+f('sys/kernel/slab/uid_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/uid_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/uid_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/uid_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/uid_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/uid_cache/validate', 0o664, b'')
+f('sys/kernel/slab/uid_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/uid_cache/free_calls', 0o664, b'''      2 <not-available> age=4303046654 pid=0 cpus=0
+      3 remove_user_sysfs_dir+0xd0/0x100 age=8357175/8367109/8374935 pid=7 cpus=0
+''')
+f('sys/kernel/slab/uid_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/tw_sock_TCPv6', 0o775)
+f('sys/kernel/slab/tw_sock_TCPv6/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCPv6/ctor', 0o664, b'')
+f('sys/kernel/slab/tw_sock_TCPv6/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/tw_sock_TCPv6/slab_size', 0o664, b'256\n')
+f('sys/kernel/slab/tw_sock_TCPv6/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCPv6/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCPv6/poison', 0o664, b'1\n')
+f('sys/kernel/slab/tw_sock_TCPv6/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/tw_sock_TCPv6/objs_per_slab', 0o664, b'16\n')
+f('sys/kernel/slab/tw_sock_TCPv6/shrink', 0o664, b'')
+f('sys/kernel/slab/tw_sock_TCPv6/trace', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCPv6/object_size', 0o664, b'168\n')
+f('sys/kernel/slab/tw_sock_TCPv6/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCPv6/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCPv6/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCPv6/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCPv6/objects', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCPv6/order', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCPv6/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/tw_sock_TCPv6/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/tw_sock_TCPv6/align', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCPv6/partial', 0o664, b'0\n')
+f('sys/kernel/slab/tw_sock_TCPv6/validate', 0o664, b'')
+f('sys/kernel/slab/tw_sock_TCPv6/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/tw_sock_TCPv6/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/tw_sock_TCPv6/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/sighand_cache', 0o775)
+f('sys/kernel/slab/sighand_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/sighand_cache/ctor', 0o664, b'sighand_ctor+0x0/0x40\n')
+f('sys/kernel/slab/sighand_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/sighand_cache/slab_size', 0o664, b'2304\n')
+f('sys/kernel/slab/sighand_cache/total_objects', 0o664, b'154\n')
+f('sys/kernel/slab/sighand_cache/slabs', 0o664, b'11\n')
+f('sys/kernel/slab/sighand_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/sighand_cache/alloc_calls', 0o664, b'''    123 copy_process+0x82a/0x1220 age=4154/7846897/8379923 pid=0-12336 cpus=0-1
+      1 flush_old_exec+0x4e1/0x8a0 age=8378174 pid=1 cpus=0
+''')
+f('sys/kernel/slab/sighand_cache/objs_per_slab', 0o664, b'14\n')
+f('sys/kernel/slab/sighand_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/sighand_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/sighand_cache/object_size', 0o664, b'2184\n')
+f('sys/kernel/slab/sighand_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/sighand_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/sighand_cache/destroy_by_rcu', 0o664, b'1\n')
+f('sys/kernel/slab/sighand_cache/objects_partial', 0o664, b'61\n')
+f('sys/kernel/slab/sighand_cache/objects', 0o664, b'145\n')
+f('sys/kernel/slab/sighand_cache/order', 0o664, b'3\n')
+f('sys/kernel/slab/sighand_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/sighand_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/sighand_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/sighand_cache/partial', 0o664, b'5\n')
+f('sys/kernel/slab/sighand_cache/validate', 0o664, b'')
+f('sys/kernel/slab/sighand_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/sighand_cache/free_calls', 0o664, b'''     46 <not-available> age=4303047268 pid=0 cpus=0
+     78 __cleanup_sighand+0x27/0x30 age=7195/7547046/8375852 pid=1-13288 cpus=0-1
+''')
+f('sys/kernel/slab/sighand_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/names_cache', 0o775)
+f('sys/kernel/slab/names_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/names_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/names_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/names_cache/slab_size', 0o664, b'4224\n')
+f('sys/kernel/slab/names_cache/total_objects', 0o664, b'14\n')
+f('sys/kernel/slab/names_cache/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/names_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/names_cache/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/names_cache/objs_per_slab', 0o664, b'7\n')
+f('sys/kernel/slab/names_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/names_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/names_cache/object_size', 0o664, b'4096\n')
+f('sys/kernel/slab/names_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/names_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/names_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/names_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/names_cache/objects', 0o664, b'14\n')
+f('sys/kernel/slab/names_cache/order', 0o664, b'3\n')
+f('sys/kernel/slab/names_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/names_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/names_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/names_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/names_cache/validate', 0o664, b'')
+f('sys/kernel/slab/names_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/names_cache/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/names_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/dm_io', 0o775)
+f('sys/kernel/slab/dm_io/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/dm_io/ctor', 0o664, b'')
+f('sys/kernel/slab/dm_io/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/dm_io/slab_size', 0o664, b'104\n')
+f('sys/kernel/slab/dm_io/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/dm_io/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/dm_io/poison', 0o664, b'1\n')
+f('sys/kernel/slab/dm_io/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/dm_io/objs_per_slab', 0o664, b'39\n')
+f('sys/kernel/slab/dm_io/shrink', 0o664, b'')
+f('sys/kernel/slab/dm_io/trace', 0o664, b'0\n')
+f('sys/kernel/slab/dm_io/object_size', 0o664, b'32\n')
+f('sys/kernel/slab/dm_io/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/dm_io/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/dm_io/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/dm_io/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/dm_io/objects', 0o664, b'0\n')
+f('sys/kernel/slab/dm_io/order', 0o664, b'0\n')
+f('sys/kernel/slab/dm_io/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/dm_io/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/dm_io/align', 0o664, b'8\n')
+f('sys/kernel/slab/dm_io/partial', 0o664, b'0\n')
+f('sys/kernel/slab/dm_io/validate', 0o664, b'')
+f('sys/kernel/slab/dm_io/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/dm_io/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/dm_io/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/key_jar', 0o775)
+f('sys/kernel/slab/key_jar/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/key_jar/ctor', 0o664, b'')
+f('sys/kernel/slab/key_jar/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/key_jar/slab_size', 0o664, b'320\n')
+f('sys/kernel/slab/key_jar/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/key_jar/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/key_jar/poison', 0o664, b'1\n')
+f('sys/kernel/slab/key_jar/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/key_jar/objs_per_slab', 0o664, b'12\n')
+f('sys/kernel/slab/key_jar/shrink', 0o664, b'')
+f('sys/kernel/slab/key_jar/trace', 0o664, b'0\n')
+f('sys/kernel/slab/key_jar/object_size', 0o664, b'232\n')
+f('sys/kernel/slab/key_jar/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/key_jar/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/key_jar/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/key_jar/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/key_jar/objects', 0o664, b'0\n')
+f('sys/kernel/slab/key_jar/order', 0o664, b'0\n')
+f('sys/kernel/slab/key_jar/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/key_jar/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/key_jar/align', 0o664, b'0\n')
+f('sys/kernel/slab/key_jar/partial', 0o664, b'0\n')
+f('sys/kernel/slab/key_jar/validate', 0o664, b'')
+f('sys/kernel/slab/key_jar/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/key_jar/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/key_jar/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/tcp_bind_bucket', 0o775)
+f('sys/kernel/slab/tcp_bind_bucket/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/tcp_bind_bucket/ctor', 0o664, b'')
+f('sys/kernel/slab/tcp_bind_bucket/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/tcp_bind_bucket/slab_size', 0o664, b'128\n')
+f('sys/kernel/slab/tcp_bind_bucket/total_objects', 0o664, b'64\n')
+f('sys/kernel/slab/tcp_bind_bucket/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/tcp_bind_bucket/poison', 0o664, b'1\n')
+f('sys/kernel/slab/tcp_bind_bucket/alloc_calls', 0o664, b'      3 inet_bind_bucket_create+0x27/0x80 age=926731/5878918/8356133 pid=1206-1920 cpus=0\n')
+f('sys/kernel/slab/tcp_bind_bucket/objs_per_slab', 0o664, b'32\n')
+f('sys/kernel/slab/tcp_bind_bucket/shrink', 0o664, b'')
+f('sys/kernel/slab/tcp_bind_bucket/trace', 0o664, b'0\n')
+f('sys/kernel/slab/tcp_bind_bucket/object_size', 0o664, b'40\n')
+f('sys/kernel/slab/tcp_bind_bucket/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/tcp_bind_bucket/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/tcp_bind_bucket/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/tcp_bind_bucket/objects_partial', 0o664, b'2\n')
+f('sys/kernel/slab/tcp_bind_bucket/objects', 0o664, b'34\n')
+f('sys/kernel/slab/tcp_bind_bucket/order', 0o664, b'0\n')
+f('sys/kernel/slab/tcp_bind_bucket/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/tcp_bind_bucket/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/tcp_bind_bucket/align', 0o664, b'0\n')
+f('sys/kernel/slab/tcp_bind_bucket/partial', 0o664, b'1\n')
+f('sys/kernel/slab/tcp_bind_bucket/validate', 0o664, b'')
+f('sys/kernel/slab/tcp_bind_bucket/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/tcp_bind_bucket/free_calls', 0o664, b'''      1 <not-available> age=4303046680 pid=0 cpus=0
+      2 inet_bind_bucket_destroy+0x29/0x30 age=1107644/4731733/8355822 pid=0-1707 cpus=0
+''')
+f('sys/kernel/slab/tcp_bind_bucket/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/mm_struct', 0o775)
+f('sys/kernel/slab/mm_struct/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/mm_struct/ctor', 0o664, b'')
+f('sys/kernel/slab/mm_struct/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/mm_struct/slab_size', 0o664, b'1216\n')
+f('sys/kernel/slab/mm_struct/total_objects', 0o664, b'91\n')
+f('sys/kernel/slab/mm_struct/slabs', 0o664, b'7\n')
+f('sys/kernel/slab/mm_struct/poison', 0o664, b'1\n')
+f('sys/kernel/slab/mm_struct/alloc_calls', 0o664, b'''     52 mm_alloc+0x15/0x50 age=4100/7453183/8378125 pid=1-20296 cpus=0-1
+     27 dup_mm+0x61/0x390 age=8335613/8355052/8376513 pid=71-2467 cpus=0-1
+''')
+f('sys/kernel/slab/mm_struct/objs_per_slab', 0o664, b'13\n')
+f('sys/kernel/slab/mm_struct/shrink', 0o664, b'')
+f('sys/kernel/slab/mm_struct/trace', 0o664, b'0\n')
+f('sys/kernel/slab/mm_struct/object_size', 0o664, b'1144\n')
+f('sys/kernel/slab/mm_struct/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/mm_struct/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/mm_struct/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/mm_struct/objects_partial', 0o664, b'23\n')
+f('sys/kernel/slab/mm_struct/objects', 0o664, b'88\n')
+f('sys/kernel/slab/mm_struct/order', 0o664, b'2\n')
+f('sys/kernel/slab/mm_struct/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/mm_struct/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/mm_struct/align', 0o664, b'0\n')
+f('sys/kernel/slab/mm_struct/partial', 0o664, b'2\n')
+f('sys/kernel/slab/mm_struct/validate', 0o664, b'')
+f('sys/kernel/slab/mm_struct/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/mm_struct/free_calls', 0o664, b'''      6 <not-available> age=4303047216 pid=0 cpus=0
+     73 __mmdrop+0x47/0x60 age=7143/7714522/8376982 pid=1-20295 cpus=0-1
+''')
+f('sys/kernel/slab/mm_struct/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/dentry', 0o775)
+f('sys/kernel/slab/dentry/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/dentry/ctor', 0o664, b'')
+f('sys/kernel/slab/dentry/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/dentry/slab_size', 0o664, b'328\n')
+f('sys/kernel/slab/dentry/total_objects', 0o664, b'49656\n')
+f('sys/kernel/slab/dentry/slabs', 0o664, b'4138\n')
+f('sys/kernel/slab/dentry/poison', 0o664, b'1\n')
+f('sys/kernel/slab/dentry/alloc_calls', 0o664, b'  49656 d_alloc+0x22/0x1f0 age=0/4250434/8379825 pid=0-32757 cpus=0-1\n')
+f('sys/kernel/slab/dentry/objs_per_slab', 0o664, b'12\n')
+f('sys/kernel/slab/dentry/shrink', 0o664, b'')
+f('sys/kernel/slab/dentry/trace', 0o664, b'0\n')
+f('sys/kernel/slab/dentry/object_size', 0o664, b'256\n')
+f('sys/kernel/slab/dentry/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/dentry/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/dentry/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/dentry/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/dentry/objects', 0o664, b'49656\n')
+f('sys/kernel/slab/dentry/order', 0o664, b'0\n')
+f('sys/kernel/slab/dentry/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/dentry/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/dentry/align', 0o664, b'8\n')
+f('sys/kernel/slab/dentry/partial', 0o664, b'0\n')
+f('sys/kernel/slab/dentry/validate', 0o664, b'')
+f('sys/kernel/slab/dentry/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/dentry/free_calls', 0o664, b'''  30093 <not-available> age=4303047137 pid=0 cpus=0
+   2265 d_free+0x6c/0x80 age=519/5532797/8376904 pid=1-32728 cpus=0-1
+  17299 d_callback+0x31/0x40 age=1040/2433896/8379551 pid=0-30210 cpus=0-1
+''')
+f('sys/kernel/slab/dentry/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/UDPv6', 0o775)
+f('sys/kernel/slab/UDPv6/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/UDPv6/ctor', 0o664, b'')
+f('sys/kernel/slab/UDPv6/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/UDPv6/slab_size', 0o664, b'1472\n')
+f('sys/kernel/slab/UDPv6/total_objects', 0o664, b'22\n')
+f('sys/kernel/slab/UDPv6/slabs', 0o664, b'1\n')
+f('sys/kernel/slab/UDPv6/poison', 0o664, b'1\n')
+f('sys/kernel/slab/UDPv6/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/UDPv6/objs_per_slab', 0o664, b'22\n')
+f('sys/kernel/slab/UDPv6/shrink', 0o664, b'')
+f('sys/kernel/slab/UDPv6/trace', 0o664, b'0\n')
+f('sys/kernel/slab/UDPv6/object_size', 0o664, b'1368\n')
+f('sys/kernel/slab/UDPv6/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/UDPv6/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/UDPv6/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/UDPv6/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/UDPv6/objects', 0o664, b'22\n')
+f('sys/kernel/slab/UDPv6/order', 0o664, b'3\n')
+f('sys/kernel/slab/UDPv6/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/UDPv6/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/UDPv6/align', 0o664, b'0\n')
+f('sys/kernel/slab/UDPv6/partial', 0o664, b'0\n')
+f('sys/kernel/slab/UDPv6/validate', 0o664, b'')
+f('sys/kernel/slab/UDPv6/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/UDPv6/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/UDPv6/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/mqueue_inode_cache', 0o775)
+f('sys/kernel/slab/mqueue_inode_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/mqueue_inode_cache/ctor', 0o664, b'init_once+0x0/0x10\n')
+f('sys/kernel/slab/mqueue_inode_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/mqueue_inode_cache/slab_size', 0o664, b'1536\n')
+f('sys/kernel/slab/mqueue_inode_cache/total_objects', 0o664, b'21\n')
+f('sys/kernel/slab/mqueue_inode_cache/slabs', 0o664, b'1\n')
+f('sys/kernel/slab/mqueue_inode_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/mqueue_inode_cache/alloc_calls', 0o664, b'      1 mqueue_alloc_inode+0x15/0x30 age=8380010 pid=1 cpus=1\n')
+f('sys/kernel/slab/mqueue_inode_cache/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/mqueue_inode_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/mqueue_inode_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/mqueue_inode_cache/object_size', 0o664, b'1456\n')
+f('sys/kernel/slab/mqueue_inode_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/mqueue_inode_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/mqueue_inode_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/mqueue_inode_cache/objects_partial', 0o664, b'1\n')
+f('sys/kernel/slab/mqueue_inode_cache/objects', 0o664, b'1\n')
+f('sys/kernel/slab/mqueue_inode_cache/order', 0o664, b'3\n')
+f('sys/kernel/slab/mqueue_inode_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/mqueue_inode_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/mqueue_inode_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/mqueue_inode_cache/partial', 0o664, b'1\n')
+f('sys/kernel/slab/mqueue_inode_cache/validate', 0o664, b'')
+f('sys/kernel/slab/mqueue_inode_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/mqueue_inode_cache/free_calls', 0o664, b'      1 <not-available> age=4303047603 pid=0 cpus=0\n')
+f('sys/kernel/slab/mqueue_inode_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/biovec-128', 0o775)
+f('sys/kernel/slab/biovec-128/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-128/ctor', 0o664, b'')
+f('sys/kernel/slab/biovec-128/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-128/slab_size', 0o664, b'2176\n')
+f('sys/kernel/slab/biovec-128/total_objects', 0o664, b'15\n')
+f('sys/kernel/slab/biovec-128/slabs', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-128/poison', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-128/alloc_calls', 0o664, b'      2 mempool_alloc_slab+0x11/0x20 age=8379474/8379474/8379474 pid=1 cpus=0\n')
+f('sys/kernel/slab/biovec-128/objs_per_slab', 0o664, b'15\n')
+f('sys/kernel/slab/biovec-128/shrink', 0o664, b'')
+f('sys/kernel/slab/biovec-128/trace', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-128/object_size', 0o664, b'2048\n')
+f('sys/kernel/slab/biovec-128/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-128/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-128/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-128/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-128/objects', 0o664, b'15\n')
+f('sys/kernel/slab/biovec-128/order', 0o664, b'3\n')
+f('sys/kernel/slab/biovec-128/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-128/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-128/align', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-128/partial', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-128/validate', 0o664, b'')
+f('sys/kernel/slab/biovec-128/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-128/free_calls', 0o664, b'      2 <not-available> age=4303046908 pid=0 cpus=0\n')
+f('sys/kernel/slab/biovec-128/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/kmalloc-192', 0o775)
+f('sys/kernel/slab/kmalloc-192/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-192/ctor', 0o664, b'')
+f('sys/kernel/slab/kmalloc-192/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-192/slab_size', 0o664, b'264\n')
+f('sys/kernel/slab/kmalloc-192/total_objects', 0o664, b'255\n')
+f('sys/kernel/slab/kmalloc-192/slabs', 0o664, b'17\n')
+f('sys/kernel/slab/kmalloc-192/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-192/alloc_calls', 0o664, b'''     10 sched_create_group+0x91/0x220 age=8351861/8359345/8366872 pid=1333-2177 cpus=0-1
+     10 sched_create_group+0xae/0x220 age=8351861/8359345/8366872 pid=1333-2177 cpus=0-1
+     10 groups_alloc+0x41/0xe0 age=17070/6159814/8366872 pid=1333-20296 cpus=0-1
+      9 param_sysfs_setup+0x87/0x140 age=8303102/8368759/8379996 pid=1-2754 cpus=0-1
+      2 futex_lock_pi+0x776/0xb00 age=125614/1986240/3846867 pid=2411-13213 cpus=0-1
+     18 mempool_create_node+0x2e/0xf0 age=62077/7917175/8379995 pid=1-13295 cpus=0-1
+      4 __vmalloc_area_node+0xfb/0x140 age=8370390/8373664/8374956 pid=107-901 cpus=0
+     30 __percpu_alloc_mask+0xbc/0x140 age=8370400/8377809/8380000 pid=1-900 cpus=0-1
+      4 d_alloc+0x19d/0x1f0 age=61160/6282991/8356935 pid=1706-13349 cpus=0-1
+      1 bm_register_write+0x63/0x630 age=8354110 pid=2054 cpus=1
+      1 sysfs_open_file+0xd6/0x230 age=0 pid=13466 cpus=0
+     15 ipc_rcu_alloc+0x4a/0x70 age=8274192/8330064/8348647 pid=2177-2621 cpus=0-1
+     28 kset_create_and_add+0x35/0xa0 age=8355999/8378311/8380000 pid=1-1766 cpus=0-1
+      1 acpi_ds_build_internal_package_obj+0xaf/0x1df age=8379979 pid=1 cpus=0
+      3 acpi_ds_build_internal_buffer_obj+0xe1/0x121 age=8379976/8379976/8379977 pid=1 cpus=0
+      1 acpi_power_add+0x4a/0x1d6 age=8379890 pid=1 cpus=0
+      2 ata_host_alloc+0x4f/0xf0 age=8379280/8379538/8379796 pid=1 cpus=0-1
+      8 cpuidle_add_state_sysfs+0xc3/0x140 age=125753/125759/125766 pid=13 cpus=0-1
+      1 hid_parse_report+0x43/0x2c0 age=53560 pid=419 cpus=0
+      2 hid_add_field+0x18a/0x3a0 age=53560/53560/53560 pid=419 cpus=0
+      6 fib_create_info+0x61/0x970 age=8324536/8346547/8367903 pid=1197-1541 cpus=0-1
+      1 unix_sysctl_register+0x2a/0x80 age=8379847 pid=1 cpus=0
+      1 rtnetlink_init+0x38/0x113 age=8379999 pid=1 cpus=0
+      1 inet_diag_init+0x15/0x6b age=8378998 pid=1 cpus=0
+     41 usb_alloc_urb+0x19/0x50 [usbcore] age=22746/1043846/8374920 pid=143-419 cpus=0-1
+      1 usb_get_configuration+0x5f2/0x1480 [usbcore] age=22753 pid=419 cpus=0
+      2 usb_get_configuration+0x1388/0x1480 [usbcore] age=8372394/8372581/8372769 pid=419 cpus=0
+      1 sr_probe+0x76/0x540 [sr_mod] age=8375854 pid=163 cpus=0
+     18 snd_ctl_new+0x28/0x90 [snd] age=8374174/8374174/8374174 pid=107 cpus=1
+      1 iwl3945_pci_probe+0xd3f/0x1020 [iwl3945] age=8373796 pid=126 cpus=1
+      1 blkcipher_walk_next+0x29c/0x390 [crypto_blkcipher] age=8374562 pid=215 cpus=1
+      3 dm_register_target+0x1f/0xf0 [dm_mod] age=8370400/8370400/8370401 pid=900 cpus=0
+      1 ipv6_icmp_sysctl_init+0x22/0x40 [ipv6] age=8360202 pid=1549 cpus=0
+      1 snd_seq_pool_new+0x1b/0x80 [snd_seq] age=8355636 pid=1805 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-192/objs_per_slab', 0o664, b'15\n')
+f('sys/kernel/slab/kmalloc-192/shrink', 0o664, b'')
+f('sys/kernel/slab/kmalloc-192/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-192/object_size', 0o664, b'192\n')
+f('sys/kernel/slab/kmalloc-192/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-192/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-192/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-192/objects_partial', 0o664, b'14\n')
+f('sys/kernel/slab/kmalloc-192/objects', 0o664, b'254\n')
+f('sys/kernel/slab/kmalloc-192/order', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-192/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-192/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-192/align', 0o664, b'8\n')
+f('sys/kernel/slab/kmalloc-192/partial', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-192/validate', 0o664, b'')
+f('sys/kernel/slab/kmalloc-192/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-192/free_calls', 0o664, b'''    149 <not-available> age=4303047430 pid=0 cpus=0
+      5 free_sched_group+0x3b/0x80 age=363179/6767246/8375130 pid=0-1614 cpus=0-1
+      1 free_sched_group+0x50/0x80 age=8369988 pid=0 cpus=0
+      1 do_exit+0x713/0x960 age=8333169 pid=2558 cpus=1
+      7 groups_free+0x56/0x60 age=17071/4081875/8369994 pid=0-1690 cpus=0-1
+      1 __vunmap+0xe9/0x120 age=8356237 pid=1748 cpus=1
+      1 do_readv_writev+0xe4/0x1e0 age=8331191 pid=2262 cpus=0
+      4 getxattr+0x8c/0x140 age=0/6266155/8357946 pid=1610-13466 cpus=0-1
+     20 sysfs_release+0x7c/0xa0 age=53608/7118781/8376453 pid=226-2519 cpus=0-1
+      1 ipc_immediate_free+0x9/0x10 age=8330259 pid=2568 cpus=0
+      1 acpi_pci_irq_add_prt+0x30b/0x324 age=8379911 pid=1 cpus=0
+      6 cpuidle_remove_state_sysfs+0x4f/0x70 age=125768/1366349/3847513 pid=13 cpus=0
+      4 free_fib_info+0x34/0x60 age=8367904/8367909/8367920 pid=1185-1197 cpus=0-1
+     36 urb_destroy+0x23/0x30 [usbcore] age=22749/2596918/8374921 pid=143-13294 cpus=0-1
+      1 sg_clean+0x3e/0x80 [usbcore] age=61399 pid=13294 cpus=0
+      1 0xffffffffa006521f age=8355637 pid=1805 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-192/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/task_struct', 0o775)
+f('sys/kernel/slab/task_struct/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/task_struct/ctor', 0o664, b'')
+f('sys/kernel/slab/task_struct/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/task_struct/slab_size', 0o664, b'4400\n')
+f('sys/kernel/slab/task_struct/total_objects', 0o664, b'224\n')
+f('sys/kernel/slab/task_struct/slabs', 0o664, b'32\n')
+f('sys/kernel/slab/task_struct/poison', 0o664, b'1\n')
+f('sys/kernel/slab/task_struct/alloc_calls', 0o664, b'    203 copy_process+0xa4/0x1220 age=4172/8008848/8379941 pid=0-13212 cpus=0-1\n')
+f('sys/kernel/slab/task_struct/objs_per_slab', 0o664, b'7\n')
+f('sys/kernel/slab/task_struct/shrink', 0o664, b'')
+f('sys/kernel/slab/task_struct/trace', 0o664, b'0\n')
+f('sys/kernel/slab/task_struct/object_size', 0o664, b'4320\n')
+f('sys/kernel/slab/task_struct/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/task_struct/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/task_struct/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/task_struct/objects_partial', 0o664, b'57\n')
+f('sys/kernel/slab/task_struct/objects', 0o664, b'211\n')
+f('sys/kernel/slab/task_struct/order', 0o664, b'3\n')
+f('sys/kernel/slab/task_struct/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/task_struct/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/task_struct/align', 0o664, b'16\n')
+f('sys/kernel/slab/task_struct/partial', 0o664, b'10\n')
+f('sys/kernel/slab/task_struct/validate', 0o664, b'')
+f('sys/kernel/slab/task_struct/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/task_struct/free_calls', 0o664, b'''     93 <not-available> age=4303047286 pid=0 cpus=0
+    110 free_task+0x30/0x40 age=7208/7706854/8377050 pid=0-13258 cpus=0-1
+''')
+f('sys/kernel/slab/task_struct/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/sgpool-16', 0o775)
+f('sys/kernel/slab/sgpool-16/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-16/ctor', 0o664, b'')
+f('sys/kernel/slab/sgpool-16/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-16/slab_size', 0o664, b'640\n')
+f('sys/kernel/slab/sgpool-16/total_objects', 0o664, b'24\n')
+f('sys/kernel/slab/sgpool-16/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/sgpool-16/poison', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-16/alloc_calls', 0o664, b'      2 mempool_alloc_slab+0x11/0x20 age=8379289/8379289/8379289 pid=1 cpus=0\n')
+f('sys/kernel/slab/sgpool-16/objs_per_slab', 0o664, b'12\n')
+f('sys/kernel/slab/sgpool-16/shrink', 0o664, b'')
+f('sys/kernel/slab/sgpool-16/trace', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-16/object_size', 0o664, b'512\n')
+f('sys/kernel/slab/sgpool-16/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-16/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-16/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-16/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-16/objects', 0o664, b'24\n')
+f('sys/kernel/slab/sgpool-16/order', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-16/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-16/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-16/align', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-16/partial', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-16/validate', 0o664, b'')
+f('sys/kernel/slab/sgpool-16/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-16/free_calls', 0o664, b'      2 <not-available> age=4303046838 pid=0 cpus=0\n')
+f('sys/kernel/slab/sgpool-16/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/request_sock_TCPv6', 0o775)
+f('sys/kernel/slab/request_sock_TCPv6/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCPv6/ctor', 0o664, b'')
+f('sys/kernel/slab/request_sock_TCPv6/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/request_sock_TCPv6/slab_size', 0o664, b'256\n')
+f('sys/kernel/slab/request_sock_TCPv6/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCPv6/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCPv6/poison', 0o664, b'1\n')
+f('sys/kernel/slab/request_sock_TCPv6/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/request_sock_TCPv6/objs_per_slab', 0o664, b'16\n')
+f('sys/kernel/slab/request_sock_TCPv6/shrink', 0o664, b'')
+f('sys/kernel/slab/request_sock_TCPv6/trace', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCPv6/object_size', 0o664, b'136\n')
+f('sys/kernel/slab/request_sock_TCPv6/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCPv6/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCPv6/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCPv6/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCPv6/objects', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCPv6/order', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCPv6/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/request_sock_TCPv6/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/request_sock_TCPv6/align', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCPv6/partial', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCPv6/validate', 0o664, b'')
+f('sys/kernel/slab/request_sock_TCPv6/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/request_sock_TCPv6/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/request_sock_TCPv6/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/Acpi-Namespace', 0o775)
+f('sys/kernel/slab/Acpi-Namespace/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Namespace/ctor', 0o664, b'')
+f('sys/kernel/slab/Acpi-Namespace/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Namespace/slab_size', 0o664, b'104\n')
+f('sys/kernel/slab/Acpi-Namespace/total_objects', 0o664, b'1755\n')
+f('sys/kernel/slab/Acpi-Namespace/slabs', 0o664, b'45\n')
+f('sys/kernel/slab/Acpi-Namespace/poison', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-Namespace/alloc_calls', 0o664, b'   1709 acpi_ns_create_node+0x34/0x45 age=8375345/8379655/8379737 pid=0-330 cpus=0\n')
+f('sys/kernel/slab/Acpi-Namespace/objs_per_slab', 0o664, b'39\n')
+f('sys/kernel/slab/Acpi-Namespace/shrink', 0o664, b'')
+f('sys/kernel/slab/Acpi-Namespace/trace', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Namespace/object_size', 0o664, b'32\n')
+f('sys/kernel/slab/Acpi-Namespace/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Namespace/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Namespace/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Namespace/objects_partial', 0o664, b'32\n')
+f('sys/kernel/slab/Acpi-Namespace/objects', 0o664, b'1709\n')
+f('sys/kernel/slab/Acpi-Namespace/order', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Namespace/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-Namespace/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-Namespace/align', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Namespace/partial', 0o664, b'2\n')
+f('sys/kernel/slab/Acpi-Namespace/validate', 0o664, b'')
+f('sys/kernel/slab/Acpi-Namespace/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-Namespace/free_calls', 0o664, b'   1709 <not-available> age=4303047034 pid=0 cpus=0\n')
+f('sys/kernel/slab/Acpi-Namespace/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/posix_timers_cache', 0o775)
+f('sys/kernel/slab/posix_timers_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/posix_timers_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/posix_timers_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/posix_timers_cache/slab_size', 0o664, b'320\n')
+f('sys/kernel/slab/posix_timers_cache/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/posix_timers_cache/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/posix_timers_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/posix_timers_cache/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/posix_timers_cache/objs_per_slab', 0o664, b'12\n')
+f('sys/kernel/slab/posix_timers_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/posix_timers_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/posix_timers_cache/object_size', 0o664, b'248\n')
+f('sys/kernel/slab/posix_timers_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/posix_timers_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/posix_timers_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/posix_timers_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/posix_timers_cache/objects', 0o664, b'0\n')
+f('sys/kernel/slab/posix_timers_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/posix_timers_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/posix_timers_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/posix_timers_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/posix_timers_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/posix_timers_cache/validate', 0o664, b'')
+f('sys/kernel/slab/posix_timers_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/posix_timers_cache/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/posix_timers_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/scsi_cmd_cache', 0o775)
+f('sys/kernel/slab/scsi_cmd_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_cmd_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/scsi_cmd_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_cmd_cache/slab_size', 0o664, b'448\n')
+f('sys/kernel/slab/scsi_cmd_cache/total_objects', 0o664, b'36\n')
+f('sys/kernel/slab/scsi_cmd_cache/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/scsi_cmd_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_cmd_cache/alloc_calls', 0o664, b'      7 scsi_pool_alloc_command+0x25/0x80 age=67290/7192324/8380005 pid=1-419 cpus=0-1\n')
+f('sys/kernel/slab/scsi_cmd_cache/objs_per_slab', 0o664, b'18\n')
+f('sys/kernel/slab/scsi_cmd_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/scsi_cmd_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_cmd_cache/object_size', 0o664, b'320\n')
+f('sys/kernel/slab/scsi_cmd_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_cmd_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_cmd_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_cmd_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_cmd_cache/objects', 0o664, b'36\n')
+f('sys/kernel/slab/scsi_cmd_cache/order', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_cmd_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_cmd_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_cmd_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_cmd_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_cmd_cache/validate', 0o664, b'')
+f('sys/kernel/slab/scsi_cmd_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_cmd_cache/free_calls', 0o664, b'''      5 <not-available> age=4303047639 pid=0 cpus=0
+      2 scsi_pool_free_command+0x4c/0x60 age=67789/4223648/8379508 pid=0 cpus=0
+''')
+f('sys/kernel/slab/scsi_cmd_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/eventpoll_pwq', 0o775)
+f('sys/kernel/slab/eventpoll_pwq/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/eventpoll_pwq/ctor', 0o664, b'')
+f('sys/kernel/slab/eventpoll_pwq/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/eventpoll_pwq/slab_size', 0o664, b'144\n')
+f('sys/kernel/slab/eventpoll_pwq/total_objects', 0o664, b'112\n')
+f('sys/kernel/slab/eventpoll_pwq/slabs', 0o664, b'4\n')
+f('sys/kernel/slab/eventpoll_pwq/poison', 0o664, b'1\n')
+f('sys/kernel/slab/eventpoll_pwq/alloc_calls', 0o664, b'     65 ep_ptable_queue_proc+0x35/0xa0 age=2416434/8173328/8356246 pid=1690-20296 cpus=0-1\n')
+f('sys/kernel/slab/eventpoll_pwq/objs_per_slab', 0o664, b'28\n')
+f('sys/kernel/slab/eventpoll_pwq/shrink', 0o664, b'')
+f('sys/kernel/slab/eventpoll_pwq/trace', 0o664, b'0\n')
+f('sys/kernel/slab/eventpoll_pwq/object_size', 0o664, b'72\n')
+f('sys/kernel/slab/eventpoll_pwq/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/eventpoll_pwq/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/eventpoll_pwq/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/eventpoll_pwq/objects_partial', 0o664, b'7\n')
+f('sys/kernel/slab/eventpoll_pwq/objects', 0o664, b'91\n')
+f('sys/kernel/slab/eventpoll_pwq/order', 0o664, b'0\n')
+f('sys/kernel/slab/eventpoll_pwq/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/eventpoll_pwq/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/eventpoll_pwq/align', 0o664, b'0\n')
+f('sys/kernel/slab/eventpoll_pwq/partial', 0o664, b'1\n')
+f('sys/kernel/slab/eventpoll_pwq/validate', 0o664, b'')
+f('sys/kernel/slab/eventpoll_pwq/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/eventpoll_pwq/free_calls', 0o664, b'''     61 <not-available> age=4303046794 pid=0 cpus=0
+      4 ep_unregister_pollwait+0x61/0x80 age=2416452/6864185/8356241 pid=1690-2073 cpus=0-1
+''')
+f('sys/kernel/slab/eventpoll_pwq/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/journal_handle', 0o775)
+f('sys/kernel/slab/journal_handle/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/journal_handle/ctor', 0o664, b'')
+f('sys/kernel/slab/journal_handle/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/journal_handle/slab_size', 0o664, b'128\n')
+f('sys/kernel/slab/journal_handle/total_objects', 0o664, b'64\n')
+f('sys/kernel/slab/journal_handle/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/journal_handle/poison', 0o664, b'1\n')
+f('sys/kernel/slab/journal_handle/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/journal_handle/objs_per_slab', 0o664, b'32\n')
+f('sys/kernel/slab/journal_handle/shrink', 0o664, b'')
+f('sys/kernel/slab/journal_handle/trace', 0o664, b'0\n')
+f('sys/kernel/slab/journal_handle/object_size', 0o664, b'56\n')
+f('sys/kernel/slab/journal_handle/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/journal_handle/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/journal_handle/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/journal_handle/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/journal_handle/objects', 0o664, b'64\n')
+f('sys/kernel/slab/journal_handle/order', 0o664, b'0\n')
+f('sys/kernel/slab/journal_handle/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/journal_handle/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/journal_handle/align', 0o664, b'0\n')
+f('sys/kernel/slab/journal_handle/partial', 0o664, b'0\n')
+f('sys/kernel/slab/journal_handle/validate', 0o664, b'')
+f('sys/kernel/slab/journal_handle/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/journal_handle/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/journal_handle/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/bsg_cmd', 0o775)
+f('sys/kernel/slab/bsg_cmd/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/bsg_cmd/ctor', 0o664, b'')
+f('sys/kernel/slab/bsg_cmd/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/bsg_cmd/slab_size', 0o664, b'384\n')
+f('sys/kernel/slab/bsg_cmd/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/bsg_cmd/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/bsg_cmd/poison', 0o664, b'1\n')
+f('sys/kernel/slab/bsg_cmd/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/bsg_cmd/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/bsg_cmd/shrink', 0o664, b'')
+f('sys/kernel/slab/bsg_cmd/trace', 0o664, b'0\n')
+f('sys/kernel/slab/bsg_cmd/object_size', 0o664, b'312\n')
+f('sys/kernel/slab/bsg_cmd/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/bsg_cmd/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/bsg_cmd/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/bsg_cmd/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/bsg_cmd/objects', 0o664, b'0\n')
+f('sys/kernel/slab/bsg_cmd/order', 0o664, b'1\n')
+f('sys/kernel/slab/bsg_cmd/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/bsg_cmd/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/bsg_cmd/align', 0o664, b'0\n')
+f('sys/kernel/slab/bsg_cmd/partial', 0o664, b'0\n')
+f('sys/kernel/slab/bsg_cmd/validate', 0o664, b'')
+f('sys/kernel/slab/bsg_cmd/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/bsg_cmd/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/bsg_cmd/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/kiocb', 0o775)
+f('sys/kernel/slab/kiocb/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kiocb/ctor', 0o664, b'')
+f('sys/kernel/slab/kiocb/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/kiocb/slab_size', 0o664, b'320\n')
+f('sys/kernel/slab/kiocb/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/kiocb/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kiocb/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kiocb/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/kiocb/objs_per_slab', 0o664, b'12\n')
+f('sys/kernel/slab/kiocb/shrink', 0o664, b'')
+f('sys/kernel/slab/kiocb/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kiocb/object_size', 0o664, b'240\n')
+f('sys/kernel/slab/kiocb/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kiocb/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/kiocb/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kiocb/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/kiocb/objects', 0o664, b'0\n')
+f('sys/kernel/slab/kiocb/order', 0o664, b'0\n')
+f('sys/kernel/slab/kiocb/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kiocb/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kiocb/align', 0o664, b'8\n')
+f('sys/kernel/slab/kiocb/partial', 0o664, b'0\n')
+f('sys/kernel/slab/kiocb/validate', 0o664, b'')
+f('sys/kernel/slab/kiocb/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kiocb/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/kiocb/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/file_lock_cache', 0o775)
+f('sys/kernel/slab/file_lock_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/file_lock_cache/ctor', 0o664, b'init_once+0x0/0x10\n')
+f('sys/kernel/slab/file_lock_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/file_lock_cache/slab_size', 0o664, b'296\n')
+f('sys/kernel/slab/file_lock_cache/total_objects', 0o664, b'26\n')
+f('sys/kernel/slab/file_lock_cache/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/file_lock_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/file_lock_cache/alloc_calls', 0o664, b'''      2 flock_lock_file_wait+0x2d6/0x2f0 age=8355055/8355767/8356479 pid=1690-1807 cpus=0
+      1 __posix_lock_file+0x3f/0x560 age=8349601 pid=2262 cpus=0
+''')
+f('sys/kernel/slab/file_lock_cache/objs_per_slab', 0o664, b'13\n')
+f('sys/kernel/slab/file_lock_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/file_lock_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/file_lock_cache/object_size', 0o664, b'224\n')
+f('sys/kernel/slab/file_lock_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/file_lock_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/file_lock_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/file_lock_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/file_lock_cache/objects', 0o664, b'26\n')
+f('sys/kernel/slab/file_lock_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/file_lock_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/file_lock_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/file_lock_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/file_lock_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/file_lock_cache/validate', 0o664, b'')
+f('sys/kernel/slab/file_lock_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/file_lock_cache/free_calls', 0o664, b'      3 locks_free_lock+0x3e/0x60 age=8351291/8355422/8359832 pid=1549-2189 cpus=0\n')
+f('sys/kernel/slab/file_lock_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/inet_peer_cache', 0o775)
+f('sys/kernel/slab/inet_peer_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/inet_peer_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/inet_peer_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/inet_peer_cache/slab_size', 0o664, b'192\n')
+f('sys/kernel/slab/inet_peer_cache/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/inet_peer_cache/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/inet_peer_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/inet_peer_cache/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/inet_peer_cache/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/inet_peer_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/inet_peer_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/inet_peer_cache/object_size', 0o664, b'64\n')
+f('sys/kernel/slab/inet_peer_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/inet_peer_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/inet_peer_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/inet_peer_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/inet_peer_cache/objects', 0o664, b'0\n')
+f('sys/kernel/slab/inet_peer_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/inet_peer_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/inet_peer_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/inet_peer_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/inet_peer_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/inet_peer_cache/validate', 0o664, b'')
+f('sys/kernel/slab/inet_peer_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/inet_peer_cache/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/inet_peer_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/arp_cache', 0o775)
+f('sys/kernel/slab/arp_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/arp_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/arp_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/arp_cache/slab_size', 0o664, b'448\n')
+f('sys/kernel/slab/arp_cache/total_objects', 0o664, b'36\n')
+f('sys/kernel/slab/arp_cache/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/arp_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/arp_cache/alloc_calls', 0o664, b'      1 neigh_create+0x8b/0x530 age=1133499 pid=952 cpus=0\n')
+f('sys/kernel/slab/arp_cache/objs_per_slab', 0o664, b'18\n')
+f('sys/kernel/slab/arp_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/arp_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/arp_cache/object_size', 0o664, b'348\n')
+f('sys/kernel/slab/arp_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/arp_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/arp_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/arp_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/arp_cache/objects', 0o664, b'36\n')
+f('sys/kernel/slab/arp_cache/order', 0o664, b'1\n')
+f('sys/kernel/slab/arp_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/arp_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/arp_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/arp_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/arp_cache/validate', 0o664, b'')
+f('sys/kernel/slab/arp_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/arp_cache/free_calls', 0o664, b'      1 neigh_destroy+0x10c/0x160 age=1135741 pid=0 cpus=0\n')
+f('sys/kernel/slab/arp_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/biovec-4', 0o775)
+f('sys/kernel/slab/biovec-4/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-4/ctor', 0o664, b'')
+f('sys/kernel/slab/biovec-4/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-4/slab_size', 0o664, b'192\n')
+f('sys/kernel/slab/biovec-4/total_objects', 0o664, b'42\n')
+f('sys/kernel/slab/biovec-4/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/biovec-4/poison', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-4/alloc_calls', 0o664, b'      2 mempool_alloc_slab+0x11/0x20 age=8379500/8379500/8379500 pid=1 cpus=0\n')
+f('sys/kernel/slab/biovec-4/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/biovec-4/shrink', 0o664, b'')
+f('sys/kernel/slab/biovec-4/trace', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-4/object_size', 0o664, b'64\n')
+f('sys/kernel/slab/biovec-4/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-4/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-4/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-4/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-4/objects', 0o664, b'42\n')
+f('sys/kernel/slab/biovec-4/order', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-4/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-4/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-4/align', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-4/partial', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-4/validate', 0o664, b'')
+f('sys/kernel/slab/biovec-4/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-4/free_calls', 0o664, b'      2 <not-available> age=4303046934 pid=0 cpus=0\n')
+f('sys/kernel/slab/biovec-4/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/scsi_sense_cache', 0o775)
+f('sys/kernel/slab/scsi_sense_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_sense_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/scsi_sense_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_sense_cache/slab_size', 0o664, b'192\n')
+f('sys/kernel/slab/scsi_sense_cache/total_objects', 0o664, b'42\n')
+f('sys/kernel/slab/scsi_sense_cache/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/scsi_sense_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_sense_cache/alloc_calls', 0o664, b'      7 scsi_pool_alloc_command+0x4a/0x80 age=67299/7192333/8380014 pid=1-419 cpus=0-1\n')
+f('sys/kernel/slab/scsi_sense_cache/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/scsi_sense_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/scsi_sense_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_sense_cache/object_size', 0o664, b'96\n')
+f('sys/kernel/slab/scsi_sense_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_sense_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_sense_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_sense_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_sense_cache/objects', 0o664, b'42\n')
+f('sys/kernel/slab/scsi_sense_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_sense_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_sense_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_sense_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_sense_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_sense_cache/validate', 0o664, b'')
+f('sys/kernel/slab/scsi_sense_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_sense_cache/free_calls', 0o664, b'''      5 <not-available> age=4303047648 pid=0 cpus=0
+      2 scsi_pool_free_command+0x40/0x60 age=67798/4223657/8379517 pid=0 cpus=0
+''')
+f('sys/kernel/slab/scsi_sense_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/cfq_io_context', 0o775)
+f('sys/kernel/slab/cfq_io_context/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/cfq_io_context/ctor', 0o664, b'')
+f('sys/kernel/slab/cfq_io_context/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/cfq_io_context/slab_size', 0o664, b'240\n')
+f('sys/kernel/slab/cfq_io_context/total_objects', 0o664, b'85\n')
+f('sys/kernel/slab/cfq_io_context/slabs', 0o664, b'5\n')
+f('sys/kernel/slab/cfq_io_context/poison', 0o664, b'1\n')
+f('sys/kernel/slab/cfq_io_context/alloc_calls', 0o664, b'     69 cfq_set_request+0x13d/0x390 age=177/7837888/8379613 pid=1-13466 cpus=0-1\n')
+f('sys/kernel/slab/cfq_io_context/objs_per_slab', 0o664, b'17\n')
+f('sys/kernel/slab/cfq_io_context/shrink', 0o664, b'')
+f('sys/kernel/slab/cfq_io_context/trace', 0o664, b'0\n')
+f('sys/kernel/slab/cfq_io_context/object_size', 0o664, b'168\n')
+f('sys/kernel/slab/cfq_io_context/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/cfq_io_context/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/cfq_io_context/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/cfq_io_context/objects_partial', 0o664, b'16\n')
+f('sys/kernel/slab/cfq_io_context/objects', 0o664, b'84\n')
+f('sys/kernel/slab/cfq_io_context/order', 0o664, b'0\n')
+f('sys/kernel/slab/cfq_io_context/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/cfq_io_context/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/cfq_io_context/align', 0o664, b'8\n')
+f('sys/kernel/slab/cfq_io_context/partial', 0o664, b'1\n')
+f('sys/kernel/slab/cfq_io_context/validate', 0o664, b'')
+f('sys/kernel/slab/cfq_io_context/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/cfq_io_context/free_calls', 0o664, b'''     12 <not-available> age=4303047630 pid=0 cpus=0
+     57 cfq_cic_free_rcu+0x21/0xc0 age=61842/7747595/8376055 pid=0-2535 cpus=0-1
+''')
+f('sys/kernel/slab/cfq_io_context/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/idr_layer_cache', 0o775)
+f('sys/kernel/slab/idr_layer_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/idr_layer_cache/ctor', 0o664, b'idr_cache_ctor+0x0/0x10\n')
+f('sys/kernel/slab/idr_layer_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/idr_layer_cache/slab_size', 0o664, b'616\n')
+f('sys/kernel/slab/idr_layer_cache/total_objects', 0o664, b'442\n')
+f('sys/kernel/slab/idr_layer_cache/slabs', 0o664, b'34\n')
+f('sys/kernel/slab/idr_layer_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/idr_layer_cache/alloc_calls', 0o664, b'    406 idr_pre_get+0x5d/0x80 age=60336/8278969/8380018 pid=0-13355 cpus=0-1\n')
+f('sys/kernel/slab/idr_layer_cache/objs_per_slab', 0o664, b'13\n')
+f('sys/kernel/slab/idr_layer_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/idr_layer_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/idr_layer_cache/object_size', 0o664, b'544\n')
+f('sys/kernel/slab/idr_layer_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/idr_layer_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/idr_layer_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/idr_layer_cache/objects_partial', 0o664, b'82\n')
+f('sys/kernel/slab/idr_layer_cache/objects', 0o664, b'420\n')
+f('sys/kernel/slab/idr_layer_cache/order', 0o664, b'1\n')
+f('sys/kernel/slab/idr_layer_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/idr_layer_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/idr_layer_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/idr_layer_cache/partial', 0o664, b'8\n')
+f('sys/kernel/slab/idr_layer_cache/validate', 0o664, b'')
+f('sys/kernel/slab/idr_layer_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/idr_layer_cache/free_calls', 0o664, b'''    304 <not-available> age=4303047315 pid=0 cpus=0
+      3 idr_destroy+0x2f/0x40 age=104486/3178486/4715486 pid=13211-13803 cpus=0-1
+      4 idr_layer_rcu_free+0x17/0x20 age=8334501/8362397/8377168 pid=0-1155 cpus=0-1
+     95 ida_get_new_above+0x141/0x210 age=812584/8292482/8380019 pid=0-2593 cpus=0-1
+''')
+f('sys/kernel/slab/idr_layer_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/vm_area_struct', 0o775)
+f('sys/kernel/slab/vm_area_struct/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/vm_area_struct/ctor', 0o664, b'')
+f('sys/kernel/slab/vm_area_struct/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/vm_area_struct/slab_size', 0o664, b'240\n')
+f('sys/kernel/slab/vm_area_struct/total_objects', 0o664, b'12087\n')
+f('sys/kernel/slab/vm_area_struct/slabs', 0o664, b'711\n')
+f('sys/kernel/slab/vm_area_struct/poison', 0o664, b'1\n')
+f('sys/kernel/slab/vm_area_struct/alloc_calls', 0o664, b'''   2751 dup_mm+0x194/0x390 age=8335622/8348807/8376522 pid=71-2467 cpus=0-1
+     52 install_special_mapping+0x3d/0xe0 age=4109/7453125/8378118 pid=1-20296 cpus=0-1
+   4006 split_vma+0x61/0x140 age=4107/7930710/8366050 pid=1206-20296 cpus=0-1
+      3 copy_vma+0x125/0x1b0 age=8353805/8353815/8353824 pid=1738 cpus=0
+     54 do_brk+0x2ec/0x360 age=4107/7486452/8378131 pid=1-20296 cpus=0-1
+   5097 mmap_region+0x195/0x5c0 age=4105/7877577/8378131 pid=1-20296 cpus=0-1
+     52 bprm_mm_init+0xa0/0x1b0 age=4109/7453192/8378134 pid=1-20296 cpus=0-1
+''')
+f('sys/kernel/slab/vm_area_struct/objs_per_slab', 0o664, b'17\n')
+f('sys/kernel/slab/vm_area_struct/shrink', 0o664, b'')
+f('sys/kernel/slab/vm_area_struct/trace', 0o664, b'0\n')
+f('sys/kernel/slab/vm_area_struct/object_size', 0o664, b'168\n')
+f('sys/kernel/slab/vm_area_struct/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/vm_area_struct/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/vm_area_struct/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/vm_area_struct/objects_partial', 0o664, b'47\n')
+f('sys/kernel/slab/vm_area_struct/objects', 0o664, b'12049\n')
+f('sys/kernel/slab/vm_area_struct/order', 0o664, b'0\n')
+f('sys/kernel/slab/vm_area_struct/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/vm_area_struct/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/vm_area_struct/align', 0o664, b'0\n')
+f('sys/kernel/slab/vm_area_struct/partial', 0o664, b'5\n')
+f('sys/kernel/slab/vm_area_struct/validate', 0o664, b'')
+f('sys/kernel/slab/vm_area_struct/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/vm_area_struct/free_calls', 0o664, b'''   6424 <not-available> age=4303047229 pid=0 cpus=0
+   5590 remove_vma+0x53/0x70 age=4110/7683818/8376767 pid=71-20296 cpus=0-1
+      1 vma_adjust+0x32c/0x570 age=8364245 pid=1371 cpus=0
+''')
+f('sys/kernel/slab/vm_area_struct/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/biovec-1', 0o775)
+f('sys/kernel/slab/biovec-1/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-1/ctor', 0o664, b'')
+f('sys/kernel/slab/biovec-1/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-1/slab_size', 0o664, b'96\n')
+f('sys/kernel/slab/biovec-1/total_objects', 0o664, b'126\n')
+f('sys/kernel/slab/biovec-1/slabs', 0o664, b'3\n')
+f('sys/kernel/slab/biovec-1/poison', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-1/alloc_calls', 0o664, b'      2 mempool_alloc_slab+0x11/0x20 age=8379509/8379509/8379509 pid=1 cpus=0\n')
+f('sys/kernel/slab/biovec-1/objs_per_slab', 0o664, b'42\n')
+f('sys/kernel/slab/biovec-1/shrink', 0o664, b'')
+f('sys/kernel/slab/biovec-1/trace', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-1/object_size', 0o664, b'16\n')
+f('sys/kernel/slab/biovec-1/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-1/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-1/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-1/objects_partial', 0o664, b'2\n')
+f('sys/kernel/slab/biovec-1/objects', 0o664, b'86\n')
+f('sys/kernel/slab/biovec-1/order', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-1/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-1/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-1/align', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-1/partial', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-1/validate', 0o664, b'')
+f('sys/kernel/slab/biovec-1/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-1/free_calls', 0o664, b'      2 <not-available> age=4303046943 pid=0 cpus=0\n')
+f('sys/kernel/slab/biovec-1/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/secpath_cache', 0o775)
+f('sys/kernel/slab/secpath_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/secpath_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/secpath_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/secpath_cache/slab_size', 0o664, b'128\n')
+f('sys/kernel/slab/secpath_cache/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/secpath_cache/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/secpath_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/secpath_cache/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/secpath_cache/objs_per_slab', 0o664, b'32\n')
+f('sys/kernel/slab/secpath_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/secpath_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/secpath_cache/object_size', 0o664, b'56\n')
+f('sys/kernel/slab/secpath_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/secpath_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/secpath_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/secpath_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/secpath_cache/objects', 0o664, b'0\n')
+f('sys/kernel/slab/secpath_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/secpath_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/secpath_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/secpath_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/secpath_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/secpath_cache/validate', 0o664, b'')
+f('sys/kernel/slab/secpath_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/secpath_cache/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/secpath_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/UNIX', 0o775)
+f('sys/kernel/slab/UNIX/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/UNIX/ctor', 0o664, b'')
+f('sys/kernel/slab/UNIX/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/UNIX/slab_size', 0o664, b'1472\n')
+f('sys/kernel/slab/UNIX/total_objects', 0o664, b'506\n')
+f('sys/kernel/slab/UNIX/slabs', 0o664, b'23\n')
+f('sys/kernel/slab/UNIX/poison', 0o664, b'1\n')
+f('sys/kernel/slab/UNIX/alloc_calls', 0o664, b'    450 sk_prot_alloc+0x1e/0xb0 age=61033/8220474/8376385 pid=71-20296 cpus=0-1\n')
+f('sys/kernel/slab/UNIX/objs_per_slab', 0o664, b'22\n')
+f('sys/kernel/slab/UNIX/shrink', 0o664, b'')
+f('sys/kernel/slab/UNIX/trace', 0o664, b'0\n')
+f('sys/kernel/slab/UNIX/object_size', 0o664, b'1376\n')
+f('sys/kernel/slab/UNIX/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/UNIX/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/UNIX/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/UNIX/objects_partial', 0o664, b'178\n')
+f('sys/kernel/slab/UNIX/objects', 0o664, b'486\n')
+f('sys/kernel/slab/UNIX/order', 0o664, b'3\n')
+f('sys/kernel/slab/UNIX/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/UNIX/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/UNIX/align', 0o664, b'0\n')
+f('sys/kernel/slab/UNIX/partial', 0o664, b'9\n')
+f('sys/kernel/slab/UNIX/validate', 0o664, b'')
+f('sys/kernel/slab/UNIX/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/UNIX/free_calls', 0o664, b'''    235 <not-available> age=4303046663 pid=0 cpus=0
+    215 sk_free+0x80/0x100 age=61050/8083366/8375930 pid=76-20292 cpus=0-1
+''')
+f('sys/kernel/slab/UNIX/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/RAWv6', 0o775)
+f('sys/kernel/slab/RAWv6/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/RAWv6/ctor', 0o664, b'')
+f('sys/kernel/slab/RAWv6/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/RAWv6/slab_size', 0o664, b'1472\n')
+f('sys/kernel/slab/RAWv6/total_objects', 0o664, b'22\n')
+f('sys/kernel/slab/RAWv6/slabs', 0o664, b'1\n')
+f('sys/kernel/slab/RAWv6/poison', 0o664, b'1\n')
+f('sys/kernel/slab/RAWv6/alloc_calls', 0o664, b'      5 sk_prot_alloc+0x1e/0xb0 age=8360545/8360552/8360555 pid=1549 cpus=0\n')
+f('sys/kernel/slab/RAWv6/objs_per_slab', 0o664, b'22\n')
+f('sys/kernel/slab/RAWv6/shrink', 0o664, b'')
+f('sys/kernel/slab/RAWv6/trace', 0o664, b'0\n')
+f('sys/kernel/slab/RAWv6/object_size', 0o664, b'1376\n')
+f('sys/kernel/slab/RAWv6/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/RAWv6/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/RAWv6/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/RAWv6/objects_partial', 0o664, b'5\n')
+f('sys/kernel/slab/RAWv6/objects', 0o664, b'5\n')
+f('sys/kernel/slab/RAWv6/order', 0o664, b'3\n')
+f('sys/kernel/slab/RAWv6/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/RAWv6/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/RAWv6/align', 0o664, b'0\n')
+f('sys/kernel/slab/RAWv6/partial', 0o664, b'1\n')
+f('sys/kernel/slab/RAWv6/validate', 0o664, b'')
+f('sys/kernel/slab/RAWv6/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/RAWv6/free_calls', 0o664, b'      5 <not-available> age=4303047773 pid=0 cpus=0\n')
+f('sys/kernel/slab/RAWv6/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/sgpool-64', 0o775)
+f('sys/kernel/slab/sgpool-64/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-64/ctor', 0o664, b'')
+f('sys/kernel/slab/sgpool-64/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-64/slab_size', 0o664, b'2176\n')
+f('sys/kernel/slab/sgpool-64/total_objects', 0o664, b'30\n')
+f('sys/kernel/slab/sgpool-64/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/sgpool-64/poison', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-64/alloc_calls', 0o664, b'      2 mempool_alloc_slab+0x11/0x20 age=8379271/8379271/8379271 pid=1 cpus=0\n')
+f('sys/kernel/slab/sgpool-64/objs_per_slab', 0o664, b'15\n')
+f('sys/kernel/slab/sgpool-64/shrink', 0o664, b'')
+f('sys/kernel/slab/sgpool-64/trace', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-64/object_size', 0o664, b'2048\n')
+f('sys/kernel/slab/sgpool-64/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-64/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-64/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-64/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-64/objects', 0o664, b'30\n')
+f('sys/kernel/slab/sgpool-64/order', 0o664, b'3\n')
+f('sys/kernel/slab/sgpool-64/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-64/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-64/align', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-64/partial', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-64/validate', 0o664, b'')
+f('sys/kernel/slab/sgpool-64/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-64/free_calls', 0o664, b'      2 <not-available> age=4303046820 pid=0 cpus=0\n')
+f('sys/kernel/slab/sgpool-64/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/bdev_cache', 0o775)
+f('sys/kernel/slab/bdev_cache/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/bdev_cache/ctor', 0o664, b'init_once+0x0/0x100\n')
+f('sys/kernel/slab/bdev_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/bdev_cache/slab_size', 0o664, b'1536\n')
+f('sys/kernel/slab/bdev_cache/total_objects', 0o664, b'42\n')
+f('sys/kernel/slab/bdev_cache/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/bdev_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/bdev_cache/alloc_calls', 0o664, b'     13 bdev_alloc_inode+0x15/0x30 age=61383/7093434/8379778 pid=0-13333 cpus=0\n')
+f('sys/kernel/slab/bdev_cache/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/bdev_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/bdev_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/bdev_cache/object_size', 0o664, b'1432\n')
+f('sys/kernel/slab/bdev_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/bdev_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/bdev_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/bdev_cache/objects_partial', 0o664, b'11\n')
+f('sys/kernel/slab/bdev_cache/objects', 0o664, b'32\n')
+f('sys/kernel/slab/bdev_cache/order', 0o664, b'3\n')
+f('sys/kernel/slab/bdev_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/bdev_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/bdev_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/bdev_cache/partial', 0o664, b'1\n')
+f('sys/kernel/slab/bdev_cache/validate', 0o664, b'')
+f('sys/kernel/slab/bdev_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/bdev_cache/free_calls', 0o664, b'''      9 <not-available> age=4303047074 pid=0 cpus=0
+      4 bdev_destroy_inode+0x1f/0x30 age=61405/4218130/8374840 pid=488-13325 cpus=0-1
+''')
+f('sys/kernel/slab/bdev_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/fasync_cache', 0o775)
+f('sys/kernel/slab/fasync_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/fasync_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/fasync_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/fasync_cache/slab_size', 0o664, b'96\n')
+f('sys/kernel/slab/fasync_cache/total_objects', 0o664, b'42\n')
+f('sys/kernel/slab/fasync_cache/slabs', 0o664, b'1\n')
+f('sys/kernel/slab/fasync_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/fasync_cache/alloc_calls', 0o664, b'      1 fasync_helper+0x115/0x130 age=8354059 pid=1738 cpus=0\n')
+f('sys/kernel/slab/fasync_cache/objs_per_slab', 0o664, b'42\n')
+f('sys/kernel/slab/fasync_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/fasync_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/fasync_cache/object_size', 0o664, b'24\n')
+f('sys/kernel/slab/fasync_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/fasync_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/fasync_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/fasync_cache/objects_partial', 0o664, b'1\n')
+f('sys/kernel/slab/fasync_cache/objects', 0o664, b'1\n')
+f('sys/kernel/slab/fasync_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/fasync_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/fasync_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/fasync_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/fasync_cache/partial', 0o664, b'1\n')
+f('sys/kernel/slab/fasync_cache/validate', 0o664, b'')
+f('sys/kernel/slab/fasync_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/fasync_cache/free_calls', 0o664, b'      1 <not-available> age=4303047449 pid=0 cpus=0\n')
+f('sys/kernel/slab/fasync_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/UDPLITEv6', 0o775)
+f('sys/kernel/slab/UDPLITEv6/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/UDPLITEv6/ctor', 0o664, b'')
+f('sys/kernel/slab/UDPLITEv6/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/UDPLITEv6/slab_size', 0o664, b'1472\n')
+f('sys/kernel/slab/UDPLITEv6/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/UDPLITEv6/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/UDPLITEv6/poison', 0o664, b'1\n')
+f('sys/kernel/slab/UDPLITEv6/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/UDPLITEv6/objs_per_slab', 0o664, b'22\n')
+f('sys/kernel/slab/UDPLITEv6/shrink', 0o664, b'')
+f('sys/kernel/slab/UDPLITEv6/trace', 0o664, b'0\n')
+f('sys/kernel/slab/UDPLITEv6/object_size', 0o664, b'1368\n')
+f('sys/kernel/slab/UDPLITEv6/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/UDPLITEv6/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/UDPLITEv6/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/UDPLITEv6/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/UDPLITEv6/objects', 0o664, b'0\n')
+f('sys/kernel/slab/UDPLITEv6/order', 0o664, b'3\n')
+f('sys/kernel/slab/UDPLITEv6/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/UDPLITEv6/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/UDPLITEv6/align', 0o664, b'0\n')
+f('sys/kernel/slab/UDPLITEv6/partial', 0o664, b'0\n')
+f('sys/kernel/slab/UDPLITEv6/validate', 0o664, b'')
+f('sys/kernel/slab/UDPLITEv6/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/UDPLITEv6/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/UDPLITEv6/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/Acpi-Operand', 0o775)
+f('sys/kernel/slab/Acpi-Operand/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Operand/ctor', 0o664, b'')
+f('sys/kernel/slab/Acpi-Operand/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Operand/slab_size', 0o664, b'144\n')
+f('sys/kernel/slab/Acpi-Operand/total_objects', 0o664, b'2688\n')
+f('sys/kernel/slab/Acpi-Operand/slabs', 0o664, b'96\n')
+f('sys/kernel/slab/Acpi-Operand/poison', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-Operand/alloc_calls', 0o664, b'   2653 acpi_ut_allocate_object_desc_dbg+0x39/0x75 age=2625/8339457/8379700 pid=0-13466 cpus=0-1\n')
+f('sys/kernel/slab/Acpi-Operand/objs_per_slab', 0o664, b'28\n')
+f('sys/kernel/slab/Acpi-Operand/shrink', 0o664, b'')
+f('sys/kernel/slab/Acpi-Operand/trace', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Operand/object_size', 0o664, b'72\n')
+f('sys/kernel/slab/Acpi-Operand/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Operand/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Operand/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Operand/objects_partial', 0o664, b'171\n')
+f('sys/kernel/slab/Acpi-Operand/objects', 0o664, b'2663\n')
+f('sys/kernel/slab/Acpi-Operand/order', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Operand/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-Operand/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-Operand/align', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-Operand/partial', 0o664, b'7\n')
+f('sys/kernel/slab/Acpi-Operand/validate', 0o664, b'')
+f('sys/kernel/slab/Acpi-Operand/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-Operand/free_calls', 0o664, b'''   2267 <not-available> age=4303046997 pid=0 cpus=0
+    386 acpi_os_release_object+0x9/0xd age=2626/8137233/8379689 pid=0-13466 cpus=0-1
+''')
+f('sys/kernel/slab/Acpi-Operand/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/xfrm_dst_cache', 0o775)
+f('sys/kernel/slab/xfrm_dst_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/xfrm_dst_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/xfrm_dst_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/xfrm_dst_cache/slab_size', 0o664, b'448\n')
+f('sys/kernel/slab/xfrm_dst_cache/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/xfrm_dst_cache/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/xfrm_dst_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/xfrm_dst_cache/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/xfrm_dst_cache/objs_per_slab', 0o664, b'18\n')
+f('sys/kernel/slab/xfrm_dst_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/xfrm_dst_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/xfrm_dst_cache/object_size', 0o664, b'344\n')
+f('sys/kernel/slab/xfrm_dst_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/xfrm_dst_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/xfrm_dst_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/xfrm_dst_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/xfrm_dst_cache/objects', 0o664, b'0\n')
+f('sys/kernel/slab/xfrm_dst_cache/order', 0o664, b'1\n')
+f('sys/kernel/slab/xfrm_dst_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/xfrm_dst_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/xfrm_dst_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/xfrm_dst_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/xfrm_dst_cache/validate', 0o664, b'')
+f('sys/kernel/slab/xfrm_dst_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/xfrm_dst_cache/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/xfrm_dst_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/eventpoll_epi', 0o775)
+f('sys/kernel/slab/eventpoll_epi/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/eventpoll_epi/ctor', 0o664, b'')
+f('sys/kernel/slab/eventpoll_epi/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/eventpoll_epi/slab_size', 0o664, b'256\n')
+f('sys/kernel/slab/eventpoll_epi/total_objects', 0o664, b'96\n')
+f('sys/kernel/slab/eventpoll_epi/slabs', 0o664, b'6\n')
+f('sys/kernel/slab/eventpoll_epi/poison', 0o664, b'1\n')
+f('sys/kernel/slab/eventpoll_epi/alloc_calls', 0o664, b'     65 sys_epoll_ctl+0x1a4/0x4d0 age=2416443/8173337/8356255 pid=1690-20296 cpus=0-1\n')
+f('sys/kernel/slab/eventpoll_epi/objs_per_slab', 0o664, b'16\n')
+f('sys/kernel/slab/eventpoll_epi/shrink', 0o664, b'')
+f('sys/kernel/slab/eventpoll_epi/trace', 0o664, b'0\n')
+f('sys/kernel/slab/eventpoll_epi/object_size', 0o664, b'128\n')
+f('sys/kernel/slab/eventpoll_epi/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/eventpoll_epi/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/eventpoll_epi/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/eventpoll_epi/objects_partial', 0o664, b'15\n')
+f('sys/kernel/slab/eventpoll_epi/objects', 0o664, b'79\n')
+f('sys/kernel/slab/eventpoll_epi/order', 0o664, b'0\n')
+f('sys/kernel/slab/eventpoll_epi/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/eventpoll_epi/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/eventpoll_epi/align', 0o664, b'0\n')
+f('sys/kernel/slab/eventpoll_epi/partial', 0o664, b'2\n')
+f('sys/kernel/slab/eventpoll_epi/validate', 0o664, b'')
+f('sys/kernel/slab/eventpoll_epi/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/eventpoll_epi/free_calls', 0o664, b'''     61 <not-available> age=4303046803 pid=0 cpus=0
+      4 ep_remove+0xae/0xc0 age=2416461/6864194/8356250 pid=1690-2073 cpus=0-1
+''')
+f('sys/kernel/slab/eventpoll_epi/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/revoke_table', 0o775)
+f('sys/kernel/slab/revoke_table/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/revoke_table/ctor', 0o664, b'')
+f('sys/kernel/slab/revoke_table/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/revoke_table/slab_size', 0o664, b'88\n')
+f('sys/kernel/slab/revoke_table/total_objects', 0o664, b'46\n')
+f('sys/kernel/slab/revoke_table/slabs', 0o664, b'1\n')
+f('sys/kernel/slab/revoke_table/poison', 0o664, b'1\n')
+f('sys/kernel/slab/revoke_table/alloc_calls', 0o664, b'      4 journal_init_revoke_table+0x1b/0xb0 age=8369805/8374155/8378505 pid=1-962 cpus=0\n')
+f('sys/kernel/slab/revoke_table/objs_per_slab', 0o664, b'46\n')
+f('sys/kernel/slab/revoke_table/shrink', 0o664, b'')
+f('sys/kernel/slab/revoke_table/trace', 0o664, b'0\n')
+f('sys/kernel/slab/revoke_table/object_size', 0o664, b'16\n')
+f('sys/kernel/slab/revoke_table/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/revoke_table/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/revoke_table/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/revoke_table/objects_partial', 0o664, b'4\n')
+f('sys/kernel/slab/revoke_table/objects', 0o664, b'4\n')
+f('sys/kernel/slab/revoke_table/order', 0o664, b'0\n')
+f('sys/kernel/slab/revoke_table/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/revoke_table/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/revoke_table/align', 0o664, b'0\n')
+f('sys/kernel/slab/revoke_table/partial', 0o664, b'1\n')
+f('sys/kernel/slab/revoke_table/validate', 0o664, b'')
+f('sys/kernel/slab/revoke_table/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/revoke_table/free_calls', 0o664, b'      4 <not-available> age=4303047546 pid=0 cpus=0\n')
+f('sys/kernel/slab/revoke_table/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/sgpool-32', 0o775)
+f('sys/kernel/slab/sgpool-32/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-32/ctor', 0o664, b'')
+f('sys/kernel/slab/sgpool-32/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-32/slab_size', 0o664, b'1152\n')
+f('sys/kernel/slab/sgpool-32/total_objects', 0o664, b'28\n')
+f('sys/kernel/slab/sgpool-32/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/sgpool-32/poison', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-32/alloc_calls', 0o664, b'      2 mempool_alloc_slab+0x11/0x20 age=8379280/8379280/8379280 pid=1 cpus=0\n')
+f('sys/kernel/slab/sgpool-32/objs_per_slab', 0o664, b'14\n')
+f('sys/kernel/slab/sgpool-32/shrink', 0o664, b'')
+f('sys/kernel/slab/sgpool-32/trace', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-32/object_size', 0o664, b'1024\n')
+f('sys/kernel/slab/sgpool-32/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-32/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-32/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-32/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-32/objects', 0o664, b'28\n')
+f('sys/kernel/slab/sgpool-32/order', 0o664, b'2\n')
+f('sys/kernel/slab/sgpool-32/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-32/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-32/align', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-32/partial', 0o664, b'0\n')
+f('sys/kernel/slab/sgpool-32/validate', 0o664, b'')
+f('sys/kernel/slab/sgpool-32/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/sgpool-32/free_calls', 0o664, b'      2 <not-available> age=4303046829 pid=0 cpus=0\n')
+f('sys/kernel/slab/sgpool-32/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/fib6_nodes', 0o775)
+f('sys/kernel/slab/fib6_nodes/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/fib6_nodes/ctor', 0o664, b'')
+f('sys/kernel/slab/fib6_nodes/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/fib6_nodes/slab_size', 0o664, b'128\n')
+f('sys/kernel/slab/fib6_nodes/total_objects', 0o664, b'64\n')
+f('sys/kernel/slab/fib6_nodes/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/fib6_nodes/poison', 0o664, b'1\n')
+f('sys/kernel/slab/fib6_nodes/alloc_calls', 0o664, b'''      3 fib6_add+0x112/0x6a0 [ipv6] age=8328809/8339785/8360575 pid=8-2080 cpus=0-1
+      1 fib6_add+0x2a2/0x6a0 [ipv6] age=8329973 pid=8 cpus=1
+      1 fib6_add+0x2b6/0x6a0 [ipv6] age=8329973 pid=8 cpus=1
+''')
+f('sys/kernel/slab/fib6_nodes/objs_per_slab', 0o664, b'32\n')
+f('sys/kernel/slab/fib6_nodes/shrink', 0o664, b'')
+f('sys/kernel/slab/fib6_nodes/trace', 0o664, b'0\n')
+f('sys/kernel/slab/fib6_nodes/object_size', 0o664, b'48\n')
+f('sys/kernel/slab/fib6_nodes/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/fib6_nodes/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/fib6_nodes/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/fib6_nodes/objects_partial', 0o664, b'5\n')
+f('sys/kernel/slab/fib6_nodes/objects', 0o664, b'5\n')
+f('sys/kernel/slab/fib6_nodes/order', 0o664, b'0\n')
+f('sys/kernel/slab/fib6_nodes/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/fib6_nodes/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/fib6_nodes/align', 0o664, b'0\n')
+f('sys/kernel/slab/fib6_nodes/partial', 0o664, b'2\n')
+f('sys/kernel/slab/fib6_nodes/validate', 0o664, b'')
+f('sys/kernel/slab/fib6_nodes/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/fib6_nodes/free_calls', 0o664, b'      5 <not-available> age=4303047799 pid=0 cpus=0\n')
+f('sys/kernel/slab/fib6_nodes/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/flow_cache', 0o775)
+f('sys/kernel/slab/flow_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/flow_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/flow_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/flow_cache/slab_size', 0o664, b'168\n')
+f('sys/kernel/slab/flow_cache/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/flow_cache/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/flow_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/flow_cache/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/flow_cache/objs_per_slab', 0o664, b'24\n')
+f('sys/kernel/slab/flow_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/flow_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/flow_cache/object_size', 0o664, b'96\n')
+f('sys/kernel/slab/flow_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/flow_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/flow_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/flow_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/flow_cache/objects', 0o664, b'0\n')
+f('sys/kernel/slab/flow_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/flow_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/flow_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/flow_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/flow_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/flow_cache/validate', 0o664, b'')
+f('sys/kernel/slab/flow_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/flow_cache/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/flow_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/fat_cache', 0o775)
+f('sys/kernel/slab/fat_cache/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/fat_cache/ctor', 0o664, b'init_once+0x0/0x10\n')
+f('sys/kernel/slab/fat_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/fat_cache/slab_size', 0o664, b'104\n')
+f('sys/kernel/slab/fat_cache/total_objects', 0o664, b'39\n')
+f('sys/kernel/slab/fat_cache/slabs', 0o664, b'1\n')
+f('sys/kernel/slab/fat_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/fat_cache/alloc_calls', 0o664, b'     14 fat_cache_add+0x11f/0x1c0 age=61297/61310/61330 pid=13349 cpus=0\n')
+f('sys/kernel/slab/fat_cache/objs_per_slab', 0o664, b'39\n')
+f('sys/kernel/slab/fat_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/fat_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/fat_cache/object_size', 0o664, b'32\n')
+f('sys/kernel/slab/fat_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/fat_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/fat_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/fat_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/fat_cache/objects', 0o664, b'39\n')
+f('sys/kernel/slab/fat_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/fat_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/fat_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/fat_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/fat_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/fat_cache/validate', 0o664, b'')
+f('sys/kernel/slab/fat_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/fat_cache/free_calls', 0o664, b'     14 <not-available> age=4303047585 pid=0 cpus=0\n')
+f('sys/kernel/slab/fat_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/sock_inode_cache', 0o775)
+f('sys/kernel/slab/sock_inode_cache/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/sock_inode_cache/ctor', 0o664, b'init_once+0x0/0x10\n')
+f('sys/kernel/slab/sock_inode_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/sock_inode_cache/slab_size', 0o664, b'1280\n')
+f('sys/kernel/slab/sock_inode_cache/total_objects', 0o664, b'504\n')
+f('sys/kernel/slab/sock_inode_cache/slabs', 0o664, b'42\n')
+f('sys/kernel/slab/sock_inode_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/sock_inode_cache/alloc_calls', 0o664, b'    481 sock_alloc_inode+0x1a/0x70 age=61330/8214562/8379530 pid=1-20296 cpus=0-1\n')
+f('sys/kernel/slab/sock_inode_cache/objs_per_slab', 0o664, b'12\n')
+f('sys/kernel/slab/sock_inode_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/sock_inode_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/sock_inode_cache/object_size', 0o664, b'1192\n')
+f('sys/kernel/slab/sock_inode_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/sock_inode_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/sock_inode_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/sock_inode_cache/objects_partial', 0o664, b'83\n')
+f('sys/kernel/slab/sock_inode_cache/objects', 0o664, b'491\n')
+f('sys/kernel/slab/sock_inode_cache/order', 0o664, b'2\n')
+f('sys/kernel/slab/sock_inode_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/sock_inode_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/sock_inode_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/sock_inode_cache/partial', 0o664, b'8\n')
+f('sys/kernel/slab/sock_inode_cache/validate', 0o664, b'')
+f('sys/kernel/slab/sock_inode_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/sock_inode_cache/free_calls', 0o664, b'''    276 <not-available> age=4303046961 pid=0 cpus=0
+    205 sock_destroy_inode+0x14/0x20 age=61348/8035806/8376228 pid=76-20292 cpus=0-1
+''')
+f('sys/kernel/slab/sock_inode_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/ip_fib_hash', 0o775)
+f('sys/kernel/slab/ip_fib_hash/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_hash/ctor', 0o664, b'')
+f('sys/kernel/slab/ip_fib_hash/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_hash/slab_size', 0o664, b'144\n')
+f('sys/kernel/slab/ip_fib_hash/total_objects', 0o664, b'56\n')
+f('sys/kernel/slab/ip_fib_hash/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/ip_fib_hash/poison', 0o664, b'1\n')
+f('sys/kernel/slab/ip_fib_hash/alloc_calls', 0o664, b'     11 fn_hash_insert+0x5a6/0x800 age=8323831/8347847/8367198 pid=1197-1541 cpus=0-1\n')
+f('sys/kernel/slab/ip_fib_hash/objs_per_slab', 0o664, b'28\n')
+f('sys/kernel/slab/ip_fib_hash/shrink', 0o664, b'')
+f('sys/kernel/slab/ip_fib_hash/trace', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_hash/object_size', 0o664, b'72\n')
+f('sys/kernel/slab/ip_fib_hash/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_hash/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_hash/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_hash/objects_partial', 0o664, b'11\n')
+f('sys/kernel/slab/ip_fib_hash/objects', 0o664, b'11\n')
+f('sys/kernel/slab/ip_fib_hash/order', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_hash/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/ip_fib_hash/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/ip_fib_hash/align', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_hash/partial', 0o664, b'2\n')
+f('sys/kernel/slab/ip_fib_hash/validate', 0o664, b'')
+f('sys/kernel/slab/ip_fib_hash/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/ip_fib_hash/free_calls', 0o664, b'''      7 <not-available> age=4303046724 pid=0 cpus=0
+      4 fn_hash_delete+0x22c/0x290 age=8367201/8367201/8367201 pid=1195 cpus=1
+''')
+f('sys/kernel/slab/ip_fib_hash/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/kmalloc_dma-512', 0o775)
+f('sys/kernel/slab/kmalloc_dma-512/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc_dma-512/ctor', 0o664, b'')
+f('sys/kernel/slab/kmalloc_dma-512/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc_dma-512/slab_size', 0o664, b'584\n')
+f('sys/kernel/slab/kmalloc_dma-512/total_objects', 0o664, b'14\n')
+f('sys/kernel/slab/kmalloc_dma-512/slabs', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc_dma-512/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc_dma-512/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/kmalloc_dma-512/objs_per_slab', 0o664, b'14\n')
+f('sys/kernel/slab/kmalloc_dma-512/shrink', 0o664, b'')
+f('sys/kernel/slab/kmalloc_dma-512/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc_dma-512/object_size', 0o664, b'512\n')
+f('sys/kernel/slab/kmalloc_dma-512/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc_dma-512/cache_dma', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc_dma-512/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc_dma-512/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc_dma-512/objects', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc_dma-512/order', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc_dma-512/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc_dma-512/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc_dma-512/align', 0o664, b'8\n')
+f('sys/kernel/slab/kmalloc_dma-512/partial', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc_dma-512/validate', 0o664, b'')
+f('sys/kernel/slab/kmalloc_dma-512/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc_dma-512/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/kmalloc_dma-512/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/inode_cache', 0o775)
+f('sys/kernel/slab/inode_cache/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/inode_cache/ctor', 0o664, b'init_once+0x0/0x10\n')
+f('sys/kernel/slab/inode_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/inode_cache/slab_size', 0o664, b'1144\n')
+f('sys/kernel/slab/inode_cache/total_objects', 0o664, b'11676\n')
+f('sys/kernel/slab/inode_cache/slabs', 0o664, b'834\n')
+f('sys/kernel/slab/inode_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/inode_cache/alloc_calls', 0o664, b'  11655 alloc_inode+0x251/0x280 age=665/7686826/8379810 pid=0-13466 cpus=0-1\n')
+f('sys/kernel/slab/inode_cache/objs_per_slab', 0o664, b'14\n')
+f('sys/kernel/slab/inode_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/inode_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/inode_cache/object_size', 0o664, b'1072\n')
+f('sys/kernel/slab/inode_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/inode_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/inode_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/inode_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/inode_cache/objects', 0o664, b'11676\n')
+f('sys/kernel/slab/inode_cache/order', 0o664, b'2\n')
+f('sys/kernel/slab/inode_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/inode_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/inode_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/inode_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/inode_cache/validate', 0o664, b'')
+f('sys/kernel/slab/inode_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/inode_cache/free_calls', 0o664, b'''  11113 <not-available> age=4303047110 pid=0 cpus=0
+    542 destroy_inode+0x4f/0x60 age=1016/6891707/8377435 pid=7-15896 cpus=0-1
+''')
+f('sys/kernel/slab/inode_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/inotify_event_cache', 0o775)
+f('sys/kernel/slab/inotify_event_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_event_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/inotify_event_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_event_cache/slab_size', 0o664, b'112\n')
+f('sys/kernel/slab/inotify_event_cache/total_objects', 0o664, b'72\n')
+f('sys/kernel/slab/inotify_event_cache/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/inotify_event_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/inotify_event_cache/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/inotify_event_cache/objs_per_slab', 0o664, b'36\n')
+f('sys/kernel/slab/inotify_event_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/inotify_event_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_event_cache/object_size', 0o664, b'40\n')
+f('sys/kernel/slab/inotify_event_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_event_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_event_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_event_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_event_cache/objects', 0o664, b'72\n')
+f('sys/kernel/slab/inotify_event_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_event_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/inotify_event_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/inotify_event_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_event_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/inotify_event_cache/validate', 0o664, b'')
+f('sys/kernel/slab/inotify_event_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/inotify_event_cache/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/inotify_event_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/UDP', 0o775)
+f('sys/kernel/slab/UDP/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/UDP/ctor', 0o664, b'')
+f('sys/kernel/slab/UDP/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/UDP/slab_size', 0o664, b'1344\n')
+f('sys/kernel/slab/UDP/total_objects', 0o664, b'24\n')
+f('sys/kernel/slab/UDP/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/UDP/poison', 0o664, b'1\n')
+f('sys/kernel/slab/UDP/alloc_calls', 0o664, b'      5 sk_prot_alloc+0x1e/0xb0 age=8327731/8349275/8355457 pid=1545-2586 cpus=0-1\n')
+f('sys/kernel/slab/UDP/objs_per_slab', 0o664, b'12\n')
+f('sys/kernel/slab/UDP/shrink', 0o664, b'')
+f('sys/kernel/slab/UDP/trace', 0o664, b'0\n')
+f('sys/kernel/slab/UDP/object_size', 0o664, b'1232\n')
+f('sys/kernel/slab/UDP/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/UDP/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/UDP/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/UDP/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/UDP/objects', 0o664, b'24\n')
+f('sys/kernel/slab/UDP/order', 0o664, b'2\n')
+f('sys/kernel/slab/UDP/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/UDP/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/UDP/align', 0o664, b'0\n')
+f('sys/kernel/slab/UDP/partial', 0o664, b'0\n')
+f('sys/kernel/slab/UDP/validate', 0o664, b'')
+f('sys/kernel/slab/UDP/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/UDP/free_calls', 0o664, b'''      1 <not-available> age=4303046759 pid=0 cpus=0
+      4 sk_free+0x80/0x100 age=8327731/8350484/8364461 pid=1371-2586 cpus=0-1
+''')
+f('sys/kernel/slab/UDP/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/Acpi-ParseExt', 0o775)
+f('sys/kernel/slab/Acpi-ParseExt/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-ParseExt/ctor', 0o664, b'')
+f('sys/kernel/slab/Acpi-ParseExt/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-ParseExt/slab_size', 0o664, b'144\n')
+f('sys/kernel/slab/Acpi-ParseExt/total_objects', 0o664, b'56\n')
+f('sys/kernel/slab/Acpi-ParseExt/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/Acpi-ParseExt/poison', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-ParseExt/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/Acpi-ParseExt/objs_per_slab', 0o664, b'28\n')
+f('sys/kernel/slab/Acpi-ParseExt/shrink', 0o664, b'')
+f('sys/kernel/slab/Acpi-ParseExt/trace', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-ParseExt/object_size', 0o664, b'72\n')
+f('sys/kernel/slab/Acpi-ParseExt/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-ParseExt/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-ParseExt/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-ParseExt/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-ParseExt/objects', 0o664, b'56\n')
+f('sys/kernel/slab/Acpi-ParseExt/order', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-ParseExt/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-ParseExt/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-ParseExt/align', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-ParseExt/partial', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-ParseExt/validate', 0o664, b'')
+f('sys/kernel/slab/Acpi-ParseExt/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-ParseExt/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/Acpi-ParseExt/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/kmalloc-8', 0o775)
+f('sys/kernel/slab/kmalloc-8/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-8/ctor', 0o664, b'')
+f('sys/kernel/slab/kmalloc-8/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-8/slab_size', 0o664, b'80\n')
+f('sys/kernel/slab/kmalloc-8/total_objects', 0o664, b'3366\n')
+f('sys/kernel/slab/kmalloc-8/slabs', 0o664, b'66\n')
+f('sys/kernel/slab/kmalloc-8/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-8/alloc_calls', 0o664, b'''      1 cache_k8_northbridges+0x5f/0x130 age=8379864 pid=1 cpus=0
+      1 pm_qos_add_requirement+0x51/0xe0 age=8376100 pid=122 cpus=1
+      5 setup_modinfo_version+0x19/0x30 age=8355991/8370769/8376336 pid=169-1766 cpus=0-1
+    379 load_module+0x1ac4/0x1b30 age=8303091/8368856/8376330 pid=105-2754 cpus=0-1
+     57 strndup_user+0x6d/0xc0 age=8303095/8368234/8376336 pid=105-2754 cpus=0-1
+      4 krealloc+0x1e/0x60 age=8355270/8362240/8377141 pid=71-1849 cpus=0-1
+      5 __vmalloc_area_node+0xfb/0x140 age=8373659/8374450/8375164 pid=181-754 cpus=0-1
+     17 alloc_vfsmnt+0x97/0x180 age=8354102/8377143/8380122 pid=0-2064 cpus=0-1
+      1 proc_symlink+0x4d/0xb0 age=8374163 pid=107 cpus=1
+   1954 sysfs_new_dirent+0x10c/0x120 age=22655/7531182/8380122 pid=0-13295 cpus=0-1
+    690 kvasprintf+0x55/0x90 age=22668/7820060/8380122 pid=0-13295 cpus=0-1
+      1 proc_bus_pci_open+0x1d/0x50 age=8355838 pid=1738 cpus=0
+      5 pcie_port_device_register+0x25/0x4a0 age=8379822/8379823/8379824 pid=1 cpus=1
+     19 acpi_ds_build_internal_buffer_obj+0xe1/0x121 age=8379961/8379970/8379972 pid=1 cpus=0
+      9 acpi_ev_pci_config_region_setup+0x162/0x270 age=8379256/8379854/8379947 pid=1-12 cpus=0-1
+      2 acpi_ut_copy_simple_object+0x8f/0x11c age=8375678/8375686/8375694 pid=396 cpus=0
+     35 acpi_irq_stats_init+0x1bd/0x268 age=8379979/8379979/8379979 pid=1 cpus=0
+      8 neigh_sysctl_register+0x1cd/0x330 age=8360192/8368781/8379845 pid=1-1549 cpus=0-1
+      7 netlink_kernel_create+0xab/0x1a0 age=8378987/8379768/8379988 pid=1 cpus=0-1
+      5 __devinet_sysctl_register+0xb8/0x120 age=8373658/8377862/8379845 pid=1-126 cpus=0-1
+      1 fz_hash_alloc+0x4a/0x60 age=8324525 pid=1541 cpus=0
+      1 init_vdso_vars+0x4c/0x24a age=8379835 pid=1 cpus=1
+     30 netlink_proto_init+0xf1/0x16b age=8379988/8379988/8379988 pid=1 cpus=0
+      5 hub_probe+0x20b/0x820 [usbcore] age=8374075/8374568/8374921 pid=143-147 cpus=0-1
+      3 usb_cache_string+0x65/0xa0 [usbcore] age=22742/37518/67072 pid=419 cpus=0
+     10 usb_get_configuration+0xbd/0x1480 [usbcore] age=22743/5876145/8374941 pid=143-419 cpus=0-1
+     35 snd_info_create_entry+0x30/0xa0 [snd] age=8355370/8370655/8374933 pid=107-1813 cpus=0-1
+      1 async_chainiv_givencrypt_first+0x56/0x80 [crypto_blkcipher] age=8374580 pid=215 cpus=0
+      1 md_seq_open+0x2d/0x90 [md_mod] age=8366135 pid=1371 cpus=0
+      1 bitmap_create+0x3aa/0xad0 [md_mod] age=8370125 pid=916 cpus=0
+      5 __addrconf_sysctl_register+0xcd/0x140 [ipv6] age=8360192/8360193/8360195 pid=1549 cpus=0
+      1 fib6_net_init+0x5d/0x130 [ipv6] age=8360195 pid=1549 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-8/objs_per_slab', 0o664, b'51\n')
+f('sys/kernel/slab/kmalloc-8/shrink', 0o664, b'')
+f('sys/kernel/slab/kmalloc-8/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-8/object_size', 0o664, b'8\n')
+f('sys/kernel/slab/kmalloc-8/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-8/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-8/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-8/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-8/objects', 0o664, b'3366\n')
+f('sys/kernel/slab/kmalloc-8/order', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-8/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-8/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-8/align', 0o664, b'8\n')
+f('sys/kernel/slab/kmalloc-8/partial', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-8/validate', 0o664, b'')
+f('sys/kernel/slab/kmalloc-8/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-8/free_calls', 0o664, b'''   2657 <not-available> age=4303047420 pid=0 cpus=0
+      3 free_sect_attrs+0x2e/0x50 age=8375066/8375066/8375066 pid=383 cpus=0
+      6 load_module+0x73f/0x1b30 age=8374844/8375309/8376003 pid=143-332 cpus=0-1
+      1 free_module+0xb9/0xf0 age=8375066 pid=383 cpus=0
+      1 krealloc+0x3a/0x60 age=8375814 pid=330 cpus=0
+     41 __vunmap+0xe9/0x120 age=8355636/8372979/8376319 pid=105-1805 cpus=0-1
+      1 vfs_rename+0x301/0x450 age=8367176 pid=72 cpus=1
+    254 release_sysfs_dirent+0x8c/0xd0 age=125751/7762571/8379789 pid=1-3347 cpus=0-1
+     61 kobject_release+0xe1/0x140 age=125751/6939731/8378264 pid=1-3347 cpus=0-1
+      1 match_number+0x95/0xb0 age=8335823 pid=2476 cpus=0
+      2 proc_bus_pci_release+0x18/0x30 age=8355841/8356005/8356169 pid=1738 cpus=0
+     49 acpi_ds_create_operand+0x12c/0x209 age=125757/8029619/8379980 pid=1-1442 cpus=0-1
+    128 acpi_ns_get_node+0x92/0xa1 age=8366449/8379363/8379989 pid=1-1358 cpus=0-1
+      2 acpi_ut_delete_internal_obj+0x15f/0x16f age=8375669/8375730/8375792 pid=330-396 cpus=0
+      2 module_add_driver+0x66/0xd0 age=8375989/8375992/8375996 pid=144 cpus=0
+      2 sd_media_changed+0xca/0x210 age=7839601/7929600/8019600 pid=2796 cpus=0
+      3 get_modalias+0xd4/0x120 age=8355846/8370834/8379988 pid=1-1772 cpus=0-1
+      1 fib_hash_free+0x35/0x40 age=8367910 pid=1185 cpus=0
+      1 usb_release_dev+0x39/0x70 [usbcore] age=7833240 pid=419 cpus=1
+      2 usb_release_dev+0x45/0x70 [usbcore] age=7833240/7835719/7838199 pid=419 cpus=0-1
+      4 sg_clean+0x3e/0x80 [usbcore] age=62037/2121033/8297977 pid=2760-13294 cpus=0
+     59 usb_control_msg+0xef/0x110 [usbcore] age=22658/5520135/8374943 pid=143-419 cpus=0-1
+      7 usb_set_configuration+0x338/0x5f0 [usbcore] age=53566/5999072/8374935 pid=143-419 cpus=0-1
+      4 usb_destroy_configuration+0x78/0x140 [usbcore] age=7824401/7967435/8373902 pid=419 cpus=0-1
+      7 sr_media_change+0xeb/0x2a0 [sr_mod] age=53597/5984195/8374963 pid=558-1456 cpus=0-1
+''')
+f('sys/kernel/slab/kmalloc-8/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/revoke_record', 0o775)
+f('sys/kernel/slab/revoke_record/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/revoke_record/ctor', 0o664, b'')
+f('sys/kernel/slab/revoke_record/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/revoke_record/slab_size', 0o664, b'128\n')
+f('sys/kernel/slab/revoke_record/total_objects', 0o664, b'64\n')
+f('sys/kernel/slab/revoke_record/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/revoke_record/poison', 0o664, b'1\n')
+f('sys/kernel/slab/revoke_record/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/revoke_record/objs_per_slab', 0o664, b'32\n')
+f('sys/kernel/slab/revoke_record/shrink', 0o664, b'')
+f('sys/kernel/slab/revoke_record/trace', 0o664, b'0\n')
+f('sys/kernel/slab/revoke_record/object_size', 0o664, b'32\n')
+f('sys/kernel/slab/revoke_record/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/revoke_record/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/revoke_record/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/revoke_record/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/revoke_record/objects', 0o664, b'64\n')
+f('sys/kernel/slab/revoke_record/order', 0o664, b'0\n')
+f('sys/kernel/slab/revoke_record/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/revoke_record/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/revoke_record/align', 0o664, b'0\n')
+f('sys/kernel/slab/revoke_record/partial', 0o664, b'0\n')
+f('sys/kernel/slab/revoke_record/validate', 0o664, b'')
+f('sys/kernel/slab/revoke_record/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/revoke_record/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/revoke_record/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/ext3_inode_cache', 0o775)
+f('sys/kernel/slab/ext3_inode_cache/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/ext3_inode_cache/ctor', 0o664, b'init_once+0x0/0x70\n')
+f('sys/kernel/slab/ext3_inode_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_inode_cache/slab_size', 0o664, b'1544\n')
+f('sys/kernel/slab/ext3_inode_cache/total_objects', 0o664, b'27342\n')
+f('sys/kernel/slab/ext3_inode_cache/slabs', 0o664, b'1302\n')
+f('sys/kernel/slab/ext3_inode_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/ext3_inode_cache/alloc_calls', 0o664, b'  27338 ext3_alloc_inode+0x15/0x60 age=0/2288559/8378475 pid=1-27944 cpus=0-1\n')
+f('sys/kernel/slab/ext3_inode_cache/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/ext3_inode_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/ext3_inode_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_inode_cache/object_size', 0o664, b'1472\n')
+f('sys/kernel/slab/ext3_inode_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_inode_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_inode_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_inode_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_inode_cache/objects', 0o664, b'27342\n')
+f('sys/kernel/slab/ext3_inode_cache/order', 0o664, b'3\n')
+f('sys/kernel/slab/ext3_inode_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/ext3_inode_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/ext3_inode_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_inode_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/ext3_inode_cache/validate', 0o664, b'')
+f('sys/kernel/slab/ext3_inode_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/ext3_inode_cache/free_calls', 0o664, b'''  25981 <not-available> age=4303047521 pid=0 cpus=0
+   1358 ext3_destroy_inode+0x2f/0x90 age=13089/2437961/8371953 pid=542-32759 cpus=0-1
+''')
+f('sys/kernel/slab/ext3_inode_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/ndisc_cache', 0o775)
+f('sys/kernel/slab/ndisc_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/ndisc_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/ndisc_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/ndisc_cache/slab_size', 0o664, b'448\n')
+f('sys/kernel/slab/ndisc_cache/total_objects', 0o664, b'18\n')
+f('sys/kernel/slab/ndisc_cache/slabs', 0o664, b'1\n')
+f('sys/kernel/slab/ndisc_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/ndisc_cache/alloc_calls', 0o664, b'      1 neigh_create+0x8b/0x530 age=8360557 pid=1549 cpus=0\n')
+f('sys/kernel/slab/ndisc_cache/objs_per_slab', 0o664, b'18\n')
+f('sys/kernel/slab/ndisc_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/ndisc_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/ndisc_cache/object_size', 0o664, b'360\n')
+f('sys/kernel/slab/ndisc_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/ndisc_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/ndisc_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/ndisc_cache/objects_partial', 0o664, b'1\n')
+f('sys/kernel/slab/ndisc_cache/objects', 0o664, b'1\n')
+f('sys/kernel/slab/ndisc_cache/order', 0o664, b'1\n')
+f('sys/kernel/slab/ndisc_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/ndisc_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/ndisc_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/ndisc_cache/partial', 0o664, b'1\n')
+f('sys/kernel/slab/ndisc_cache/validate', 0o664, b'')
+f('sys/kernel/slab/ndisc_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/ndisc_cache/free_calls', 0o664, b'      1 <not-available> age=4303047782 pid=0 cpus=0\n')
+f('sys/kernel/slab/ndisc_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/ip_fib_alias', 0o775)
+f('sys/kernel/slab/ip_fib_alias/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_alias/ctor', 0o664, b'')
+f('sys/kernel/slab/ip_fib_alias/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_alias/slab_size', 0o664, b'104\n')
+f('sys/kernel/slab/ip_fib_alias/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_alias/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_alias/poison', 0o664, b'1\n')
+f('sys/kernel/slab/ip_fib_alias/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/ip_fib_alias/objs_per_slab', 0o664, b'39\n')
+f('sys/kernel/slab/ip_fib_alias/shrink', 0o664, b'')
+f('sys/kernel/slab/ip_fib_alias/trace', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_alias/object_size', 0o664, b'32\n')
+f('sys/kernel/slab/ip_fib_alias/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_alias/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_alias/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_alias/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_alias/objects', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_alias/order', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_alias/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/ip_fib_alias/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/ip_fib_alias/align', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_alias/partial', 0o664, b'0\n')
+f('sys/kernel/slab/ip_fib_alias/validate', 0o664, b'')
+f('sys/kernel/slab/ip_fib_alias/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/ip_fib_alias/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/ip_fib_alias/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/proc_inode_cache', 0o775)
+f('sys/kernel/slab/proc_inode_cache/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/proc_inode_cache/ctor', 0o664, b'init_once+0x0/0x10\n')
+f('sys/kernel/slab/proc_inode_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/proc_inode_cache/slab_size', 0o664, b'1192\n')
+f('sys/kernel/slab/proc_inode_cache/total_objects', 0o664, b'1677\n')
+f('sys/kernel/slab/proc_inode_cache/slabs', 0o664, b'129\n')
+f('sys/kernel/slab/proc_inode_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/proc_inode_cache/alloc_calls', 0o664, b'   1627 proc_alloc_inode+0x1b/0x90 age=61424/8163415/8379746 pid=0-19241 cpus=0-1\n')
+f('sys/kernel/slab/proc_inode_cache/objs_per_slab', 0o664, b'13\n')
+f('sys/kernel/slab/proc_inode_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/proc_inode_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/proc_inode_cache/object_size', 0o664, b'1120\n')
+f('sys/kernel/slab/proc_inode_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/proc_inode_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/proc_inode_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/proc_inode_cache/objects_partial', 0o664, b'78\n')
+f('sys/kernel/slab/proc_inode_cache/objects', 0o664, b'1651\n')
+f('sys/kernel/slab/proc_inode_cache/order', 0o664, b'2\n')
+f('sys/kernel/slab/proc_inode_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/proc_inode_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/proc_inode_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/proc_inode_cache/partial', 0o664, b'8\n')
+f('sys/kernel/slab/proc_inode_cache/validate', 0o664, b'')
+f('sys/kernel/slab/proc_inode_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/proc_inode_cache/free_calls', 0o664, b'''   1124 <not-available> age=4303047043 pid=0 cpus=0
+    503 proc_destroy_inode+0x14/0x20 age=61430/7970819/8372808 pid=1-12336 cpus=0-1
+''')
+f('sys/kernel/slab/proc_inode_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/biovec-16', 0o775)
+f('sys/kernel/slab/biovec-16/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-16/ctor', 0o664, b'')
+f('sys/kernel/slab/biovec-16/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-16/slab_size', 0o664, b'384\n')
+f('sys/kernel/slab/biovec-16/total_objects', 0o664, b'63\n')
+f('sys/kernel/slab/biovec-16/slabs', 0o664, b'3\n')
+f('sys/kernel/slab/biovec-16/poison', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-16/alloc_calls', 0o664, b'      2 mempool_alloc_slab+0x11/0x20 age=8379491/8379491/8379491 pid=1 cpus=0\n')
+f('sys/kernel/slab/biovec-16/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/biovec-16/shrink', 0o664, b'')
+f('sys/kernel/slab/biovec-16/trace', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-16/object_size', 0o664, b'256\n')
+f('sys/kernel/slab/biovec-16/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-16/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-16/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-16/objects_partial', 0o664, b'2\n')
+f('sys/kernel/slab/biovec-16/objects', 0o664, b'44\n')
+f('sys/kernel/slab/biovec-16/order', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-16/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-16/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-16/align', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-16/partial', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-16/validate', 0o664, b'')
+f('sys/kernel/slab/biovec-16/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-16/free_calls', 0o664, b'      2 <not-available> age=4303046925 pid=0 cpus=0\n')
+f('sys/kernel/slab/biovec-16/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/Acpi-State', 0o775)
+f('sys/kernel/slab/Acpi-State/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-State/ctor', 0o664, b'')
+f('sys/kernel/slab/Acpi-State/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-State/slab_size', 0o664, b'152\n')
+f('sys/kernel/slab/Acpi-State/total_objects', 0o664, b'52\n')
+f('sys/kernel/slab/Acpi-State/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/Acpi-State/poison', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-State/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/Acpi-State/objs_per_slab', 0o664, b'26\n')
+f('sys/kernel/slab/Acpi-State/shrink', 0o664, b'')
+f('sys/kernel/slab/Acpi-State/trace', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-State/object_size', 0o664, b'80\n')
+f('sys/kernel/slab/Acpi-State/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-State/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-State/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-State/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-State/objects', 0o664, b'52\n')
+f('sys/kernel/slab/Acpi-State/order', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-State/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-State/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-State/align', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-State/partial', 0o664, b'0\n')
+f('sys/kernel/slab/Acpi-State/validate', 0o664, b'')
+f('sys/kernel/slab/Acpi-State/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/Acpi-State/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/Acpi-State/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/ip6_dst_cache', 0o775)
+f('sys/kernel/slab/ip6_dst_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/ip6_dst_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/ip6_dst_cache/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/ip6_dst_cache/slab_size', 0o664, b'384\n')
+f('sys/kernel/slab/ip6_dst_cache/total_objects', 0o664, b'42\n')
+f('sys/kernel/slab/ip6_dst_cache/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/ip6_dst_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/ip6_dst_cache/alloc_calls', 0o664, b'      4 dst_alloc+0x2b/0x90 age=8329964/8337614/8360566 pid=8-1549 cpus=0-1\n')
+f('sys/kernel/slab/ip6_dst_cache/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/ip6_dst_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/ip6_dst_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/ip6_dst_cache/object_size', 0o664, b'304\n')
+f('sys/kernel/slab/ip6_dst_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/ip6_dst_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/ip6_dst_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/ip6_dst_cache/objects_partial', 0o664, b'4\n')
+f('sys/kernel/slab/ip6_dst_cache/objects', 0o664, b'4\n')
+f('sys/kernel/slab/ip6_dst_cache/order', 0o664, b'1\n')
+f('sys/kernel/slab/ip6_dst_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/ip6_dst_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/ip6_dst_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/ip6_dst_cache/partial', 0o664, b'2\n')
+f('sys/kernel/slab/ip6_dst_cache/validate', 0o664, b'')
+f('sys/kernel/slab/ip6_dst_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/ip6_dst_cache/free_calls', 0o664, b'      4 <not-available> age=4303047790 pid=0 cpus=0\n')
+f('sys/kernel/slab/ip6_dst_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/task_xstate', 0o775)
+f('sys/kernel/slab/task_xstate/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/task_xstate/ctor', 0o664, b'')
+f('sys/kernel/slab/task_xstate/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/task_xstate/slab_size', 0o664, b'592\n')
+f('sys/kernel/slab/task_xstate/total_objects', 0o664, b'169\n')
+f('sys/kernel/slab/task_xstate/slabs', 0o664, b'13\n')
+f('sys/kernel/slab/task_xstate/poison', 0o664, b'1\n')
+f('sys/kernel/slab/task_xstate/alloc_calls', 0o664, b'''     99 arch_dup_task_struct+0x51/0xa0 age=125559/8275901/8376574 pid=71-13212 cpus=0-1
+     51 init_fpu+0xef/0x110 age=4157/7436734/8378165 pid=1-20296 cpus=0-1
+''')
+f('sys/kernel/slab/task_xstate/objs_per_slab', 0o664, b'13\n')
+f('sys/kernel/slab/task_xstate/shrink', 0o664, b'')
+f('sys/kernel/slab/task_xstate/trace', 0o664, b'0\n')
+f('sys/kernel/slab/task_xstate/object_size', 0o664, b'512\n')
+f('sys/kernel/slab/task_xstate/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/task_xstate/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/task_xstate/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/task_xstate/objects_partial', 0o664, b'57\n')
+f('sys/kernel/slab/task_xstate/objects', 0o664, b'161\n')
+f('sys/kernel/slab/task_xstate/order', 0o664, b'1\n')
+f('sys/kernel/slab/task_xstate/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/task_xstate/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/task_xstate/align', 0o664, b'16\n')
+f('sys/kernel/slab/task_xstate/partial', 0o664, b'5\n')
+f('sys/kernel/slab/task_xstate/validate', 0o664, b'')
+f('sys/kernel/slab/task_xstate/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/task_xstate/free_calls', 0o664, b'''     53 <not-available> age=4303047277 pid=0 cpus=0
+     97 free_thread_xstate+0x24/0x40 age=7199/7795238/8375118 pid=0-20296 cpus=0-1
+''')
+f('sys/kernel/slab/task_xstate/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/scsi_io_context', 0o775)
+f('sys/kernel/slab/scsi_io_context/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_io_context/ctor', 0o664, b'')
+f('sys/kernel/slab/scsi_io_context/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_io_context/slab_size', 0o664, b'184\n')
+f('sys/kernel/slab/scsi_io_context/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_io_context/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_io_context/poison', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_io_context/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/scsi_io_context/objs_per_slab', 0o664, b'22\n')
+f('sys/kernel/slab/scsi_io_context/shrink', 0o664, b'')
+f('sys/kernel/slab/scsi_io_context/trace', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_io_context/object_size', 0o664, b'112\n')
+f('sys/kernel/slab/scsi_io_context/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_io_context/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_io_context/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_io_context/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_io_context/objects', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_io_context/order', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_io_context/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_io_context/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_io_context/align', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_io_context/partial', 0o664, b'0\n')
+f('sys/kernel/slab/scsi_io_context/validate', 0o664, b'')
+f('sys/kernel/slab/scsi_io_context/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/scsi_io_context/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/scsi_io_context/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/anon_vma', 0o775)
+f('sys/kernel/slab/anon_vma/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/anon_vma/ctor', 0o664, b'anon_vma_ctor+0x0/0x40\n')
+f('sys/kernel/slab/anon_vma/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/anon_vma/slab_size', 0o664, b'144\n')
+f('sys/kernel/slab/anon_vma/total_objects', 0o664, b'3304\n')
+f('sys/kernel/slab/anon_vma/slabs', 0o664, b'118\n')
+f('sys/kernel/slab/anon_vma/poison', 0o664, b'1\n')
+f('sys/kernel/slab/anon_vma/alloc_calls', 0o664, b'   3234 anon_vma_prepare+0xe0/0x100 age=4177/7981073/8378201 pid=1-20296 cpus=0-1\n')
+f('sys/kernel/slab/anon_vma/objs_per_slab', 0o664, b'28\n')
+f('sys/kernel/slab/anon_vma/shrink', 0o664, b'')
+f('sys/kernel/slab/anon_vma/trace', 0o664, b'0\n')
+f('sys/kernel/slab/anon_vma/object_size', 0o664, b'72\n')
+f('sys/kernel/slab/anon_vma/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/anon_vma/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/anon_vma/destroy_by_rcu', 0o664, b'1\n')
+f('sys/kernel/slab/anon_vma/objects_partial', 0o664, b'185\n')
+f('sys/kernel/slab/anon_vma/objects', 0o664, b'3265\n')
+f('sys/kernel/slab/anon_vma/order', 0o664, b'0\n')
+f('sys/kernel/slab/anon_vma/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/anon_vma/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/anon_vma/align', 0o664, b'0\n')
+f('sys/kernel/slab/anon_vma/partial', 0o664, b'8\n')
+f('sys/kernel/slab/anon_vma/validate', 0o664, b'')
+f('sys/kernel/slab/anon_vma/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/anon_vma/free_calls', 0o664, b'''   1575 <not-available> age=4303047296 pid=0 cpus=0
+   1659 anon_vma_unlink+0x5f/0x70 age=7225/7638870/8377152 pid=56-20292 cpus=0-1
+''')
+f('sys/kernel/slab/anon_vma/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/uhci_urb_priv', 0o775)
+f('sys/kernel/slab/uhci_urb_priv/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/uhci_urb_priv/ctor', 0o664, b'')
+f('sys/kernel/slab/uhci_urb_priv/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/uhci_urb_priv/slab_size', 0o664, b'128\n')
+f('sys/kernel/slab/uhci_urb_priv/total_objects', 0o664, b'32\n')
+f('sys/kernel/slab/uhci_urb_priv/slabs', 0o664, b'1\n')
+f('sys/kernel/slab/uhci_urb_priv/poison', 0o664, b'1\n')
+f('sys/kernel/slab/uhci_urb_priv/alloc_calls', 0o664, b'      1 uhci_urb_enqueue+0xb6/0xa30 [uhci_hcd] age=53794 pid=419 cpus=0\n')
+f('sys/kernel/slab/uhci_urb_priv/objs_per_slab', 0o664, b'32\n')
+f('sys/kernel/slab/uhci_urb_priv/shrink', 0o664, b'')
+f('sys/kernel/slab/uhci_urb_priv/trace', 0o664, b'0\n')
+f('sys/kernel/slab/uhci_urb_priv/object_size', 0o664, b'56\n')
+f('sys/kernel/slab/uhci_urb_priv/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/uhci_urb_priv/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/uhci_urb_priv/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/uhci_urb_priv/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/uhci_urb_priv/objects', 0o664, b'32\n')
+f('sys/kernel/slab/uhci_urb_priv/order', 0o664, b'0\n')
+f('sys/kernel/slab/uhci_urb_priv/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/uhci_urb_priv/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/uhci_urb_priv/align', 0o664, b'0\n')
+f('sys/kernel/slab/uhci_urb_priv/partial', 0o664, b'0\n')
+f('sys/kernel/slab/uhci_urb_priv/validate', 0o664, b'')
+f('sys/kernel/slab/uhci_urb_priv/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/uhci_urb_priv/free_calls', 0o664, b'      1 uhci_free_urb_priv+0x79/0xd0 [uhci_hcd] age=53806 pid=0 cpus=0\n')
+f('sys/kernel/slab/uhci_urb_priv/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/shmem_inode_cache', 0o775)
+f('sys/kernel/slab/shmem_inode_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/shmem_inode_cache/ctor', 0o664, b'init_once+0x0/0x40\n')
+f('sys/kernel/slab/shmem_inode_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/shmem_inode_cache/slab_size', 0o664, b'1400\n')
+f('sys/kernel/slab/shmem_inode_cache/total_objects', 0o664, b'1173\n')
+f('sys/kernel/slab/shmem_inode_cache/slabs', 0o664, b'51\n')
+f('sys/kernel/slab/shmem_inode_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/shmem_inode_cache/alloc_calls', 0o664, b'   1144 shmem_alloc_inode+0x15/0x30 age=21584/7506265/8379043 pid=1-13453 cpus=0-1\n')
+f('sys/kernel/slab/shmem_inode_cache/objs_per_slab', 0o664, b'23\n')
+f('sys/kernel/slab/shmem_inode_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/shmem_inode_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/shmem_inode_cache/object_size', 0o664, b'1328\n')
+f('sys/kernel/slab/shmem_inode_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/shmem_inode_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/shmem_inode_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/shmem_inode_cache/objects_partial', 0o664, b'42\n')
+f('sys/kernel/slab/shmem_inode_cache/objects', 0o664, b'1169\n')
+f('sys/kernel/slab/shmem_inode_cache/order', 0o664, b'3\n')
+f('sys/kernel/slab/shmem_inode_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/shmem_inode_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/shmem_inode_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/shmem_inode_cache/partial', 0o664, b'2\n')
+f('sys/kernel/slab/shmem_inode_cache/validate', 0o664, b'')
+f('sys/kernel/slab/shmem_inode_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/shmem_inode_cache/free_calls', 0o664, b'''    741 <not-available> age=4303046628 pid=0 cpus=0
+    403 shmem_destroy_inode+0x24/0x30 age=21598/7406739/8375758 pid=72-13332 cpus=0-1
+''')
+f('sys/kernel/slab/shmem_inode_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/fat_inode_cache', 0o775)
+f('sys/kernel/slab/fat_inode_cache/reclaim_account', 0o664, b'1\n')
+f('sys/kernel/slab/fat_inode_cache/ctor', 0o664, b'init_once+0x0/0x60\n')
+f('sys/kernel/slab/fat_inode_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/fat_inode_cache/slab_size', 0o664, b'1272\n')
+f('sys/kernel/slab/fat_inode_cache/total_objects', 0o664, b'100\n')
+f('sys/kernel/slab/fat_inode_cache/slabs', 0o664, b'4\n')
+f('sys/kernel/slab/fat_inode_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/fat_inode_cache/alloc_calls', 0o664, b'     76 fat_alloc_inode+0x15/0x30 age=61228/61276/61657 pid=13348-13354 cpus=0-1\n')
+f('sys/kernel/slab/fat_inode_cache/objs_per_slab', 0o664, b'25\n')
+f('sys/kernel/slab/fat_inode_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/fat_inode_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/fat_inode_cache/object_size', 0o664, b'1200\n')
+f('sys/kernel/slab/fat_inode_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/fat_inode_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/fat_inode_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/fat_inode_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/fat_inode_cache/objects', 0o664, b'100\n')
+f('sys/kernel/slab/fat_inode_cache/order', 0o664, b'3\n')
+f('sys/kernel/slab/fat_inode_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/fat_inode_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/fat_inode_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/fat_inode_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/fat_inode_cache/validate', 0o664, b'')
+f('sys/kernel/slab/fat_inode_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/fat_inode_cache/free_calls', 0o664, b'     76 <not-available> age=4303047594 pid=0 cpus=0\n')
+f('sys/kernel/slab/fat_inode_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/kmalloc-256', 0o775)
+f('sys/kernel/slab/kmalloc-256/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-256/ctor', 0o664, b'')
+f('sys/kernel/slab/kmalloc-256/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-256/slab_size', 0o664, b'328\n')
+f('sys/kernel/slab/kmalloc-256/total_objects', 0o664, b'516\n')
+f('sys/kernel/slab/kmalloc-256/slabs', 0o664, b'43\n')
+f('sys/kernel/slab/kmalloc-256/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-256/alloc_calls', 0o664, b'''      2 mempool_kmalloc+0x11/0x20 age=8379928/8379928/8379928 pid=1 cpus=0
+      2 __vmalloc_area_node+0xfb/0x140 age=8374585/8375388/8376192 pid=122-126 cpus=0-1
+     32 dma_pool_create+0x90/0x1e0 age=8374074/8374505/8374905 pid=143-147 cpus=0-1
+     28 __percpu_alloc_mask+0xbc/0x140 age=8360136/8365750/8379780 pid=1-1549 cpus=0
+      2 seq_open+0x84/0xa0 age=8355780/8360929/8366079 pid=1371-1738 cpus=0
+     19 inotify_init+0x1b/0x90 age=8333719/8353284/8379778 pid=1-2544 cpus=0-1
+      1 mounts_open_common+0x11e/0x210 age=8365844 pid=1371 cpus=0
+    347 __proc_create+0xa5/0x150 age=8355314/8375854/8380066 pid=0-1813 cpus=0-1
+      6 start_this_handle+0x3f5/0x410 age=4241/38502/142468 pid=21-13466 cpus=0-1
+      3 elevator_alloc+0x1b/0xc0 age=62010/5606790/8379345 pid=1-13295 cpus=0-1
+      2 acpi_ds_build_internal_buffer_obj+0xe1/0x121 age=8379913/8379914/8379915 pid=1 cpus=0
+      1 find_dock+0x414/0x426 age=8379931 pid=1 cpus=0
+      6 con_insert_unipair+0x96/0x110 age=8355034/8367399/8379765 pid=1-1898 cpus=1
+      2 neigh_resolve_output+0x226/0x2e0 age=1134112/4736669/8339226 pid=0-2401 cpus=0-1
+      1 genl_register_family+0x1b6/0x1e0 age=8375014 pid=126 cpus=0
+      5 ip_mc_inc_group+0x6b/0x280 age=8325482/8352347/8367852 pid=1185-1849 cpus=0-1
+      2 cache_add_dev+0x17b/0x546 age=8379779/8379779/8379780 pid=1 cpus=0-1
+     10 audit_register_class+0x1e/0xa1 age=8379779/8379779/8379779 pid=1 cpus=1
+      1 proc_net_ns_init+0x1b/0x81 age=8380066 pid=0 cpus=0
+      3 snd_malloc_sgbuf_pages+0xfa/0x1f0 [snd_page_alloc] age=8374129/8374129/8374129 pid=107 cpus=1
+      1 usb_get_configuration+0x18f/0x1480 [usbcore] age=8372709 pid=419 cpus=0
+      1 acpi_ac_add+0x3a/0x1b1 [ac] age=8375784 pid=392 cpus=0
+      1 acpi_processor_register_performance+0x2a0/0x3a6 [processor] age=8366391 pid=1358 cpus=0
+      3 snd_ctl_open+0x8e/0x180 [snd] age=8333026/8337179/8339273 pid=2400-2425 cpus=0
+      8 ieee80211_rx_bss_add+0x4e/0x140 [mac80211] age=8354793/8355457/8355979 pid=0-1951 cpus=0
+      2 ipv6_add_addr+0x199/0x3c0 [ipv6] age=8329536/8344837/8360138 pid=8-1549 cpus=0-1
+      5 ipv6_dev_mc_inc+0x141/0x3f0 [ipv6] age=8329536/8354016/8360138 pid=8-1549 cpus=0-1
+''')
+f('sys/kernel/slab/kmalloc-256/objs_per_slab', 0o664, b'12\n')
+f('sys/kernel/slab/kmalloc-256/shrink', 0o664, b'')
+f('sys/kernel/slab/kmalloc-256/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-256/object_size', 0o664, b'256\n')
+f('sys/kernel/slab/kmalloc-256/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-256/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-256/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-256/objects_partial', 0o664, b'60\n')
+f('sys/kernel/slab/kmalloc-256/objects', 0o664, b'504\n')
+f('sys/kernel/slab/kmalloc-256/order', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-256/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-256/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-256/align', 0o664, b'8\n')
+f('sys/kernel/slab/kmalloc-256/partial', 0o664, b'6\n')
+f('sys/kernel/slab/kmalloc-256/validate', 0o664, b'')
+f('sys/kernel/slab/kmalloc-256/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-256/free_calls', 0o664, b'''    389 <not-available> age=4303047363 pid=0 cpus=0
+      1 __vunmap+0xe9/0x120 age=8374878 pid=107 cpus=1
+     38 do_execve+0x2b1/0x2d0 age=7303/7294190/8377088 pid=71-13465 cpus=0-1
+     51 seq_release+0x20/0x30 age=23541/7877166/8376202 pid=105-2535 cpus=0-1
+      3 free_proc_entry+0x73/0x90 age=8356279/8369643/8378992 pid=1-1541 cpus=0
+      3 __journal_drop_transaction+0xe6/0x170 age=8360317/8363466/8366128 pid=32 cpus=0
+      1 acpi_pci_irq_add_prt+0xc2/0x324 age=8379845 pid=1 cpus=0
+      2 acpi_pci_bind+0x26b/0x28d age=8379844/8379845/8379846 pid=1 cpus=0
+      1 wireless_send_event+0x172/0x330 age=8329538 pid=742 cpus=1
+      3 usb_string+0x17c/0x1e0 [usbcore] age=8374367/8374614/8374886 pid=143 cpus=0
+      3 snd_ctl_release+0xf9/0x130 [snd] age=8333027/8337180/8339274 pid=2400-2425 cpus=0
+      1 ieee80211_set_associated+0x421/0x520 [mac80211] age=8329538 pid=742 cpus=1
+''')
+f('sys/kernel/slab/kmalloc-256/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/biovec-64', 0o775)
+f('sys/kernel/slab/biovec-64/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-64/ctor', 0o664, b'')
+f('sys/kernel/slab/biovec-64/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-64/slab_size', 0o664, b'1152\n')
+f('sys/kernel/slab/biovec-64/total_objects', 0o664, b'28\n')
+f('sys/kernel/slab/biovec-64/slabs', 0o664, b'2\n')
+f('sys/kernel/slab/biovec-64/poison', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-64/alloc_calls', 0o664, b'      2 mempool_alloc_slab+0x11/0x20 age=8379482/8379482/8379482 pid=1 cpus=0\n')
+f('sys/kernel/slab/biovec-64/objs_per_slab', 0o664, b'14\n')
+f('sys/kernel/slab/biovec-64/shrink', 0o664, b'')
+f('sys/kernel/slab/biovec-64/trace', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-64/object_size', 0o664, b'1024\n')
+f('sys/kernel/slab/biovec-64/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-64/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-64/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-64/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-64/objects', 0o664, b'28\n')
+f('sys/kernel/slab/biovec-64/order', 0o664, b'2\n')
+f('sys/kernel/slab/biovec-64/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-64/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-64/align', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-64/partial', 0o664, b'0\n')
+f('sys/kernel/slab/biovec-64/validate', 0o664, b'')
+f('sys/kernel/slab/biovec-64/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/biovec-64/free_calls', 0o664, b'      2 <not-available> age=4303046917 pid=0 cpus=0\n')
+f('sys/kernel/slab/biovec-64/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/sysfs_dir_cache', 0o775)
+f('sys/kernel/slab/sysfs_dir_cache/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/sysfs_dir_cache/ctor', 0o664, b'')
+f('sys/kernel/slab/sysfs_dir_cache/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/sysfs_dir_cache/slab_size', 0o664, b'152\n')
+f('sys/kernel/slab/sysfs_dir_cache/total_objects', 0o664, b'11518\n')
+f('sys/kernel/slab/sysfs_dir_cache/slabs', 0o664, b'443\n')
+f('sys/kernel/slab/sysfs_dir_cache/poison', 0o664, b'1\n')
+f('sys/kernel/slab/sysfs_dir_cache/alloc_calls', 0o664, b'  11488 sysfs_new_dirent+0x38/0x120 age=22320/7764235/8379787 pid=0-13295 cpus=0-1\n')
+f('sys/kernel/slab/sysfs_dir_cache/objs_per_slab', 0o664, b'26\n')
+f('sys/kernel/slab/sysfs_dir_cache/shrink', 0o664, b'')
+f('sys/kernel/slab/sysfs_dir_cache/trace', 0o664, b'0\n')
+f('sys/kernel/slab/sysfs_dir_cache/object_size', 0o664, b'80\n')
+f('sys/kernel/slab/sysfs_dir_cache/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/sysfs_dir_cache/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/sysfs_dir_cache/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/sysfs_dir_cache/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/sysfs_dir_cache/objects', 0o664, b'11518\n')
+f('sys/kernel/slab/sysfs_dir_cache/order', 0o664, b'0\n')
+f('sys/kernel/slab/sysfs_dir_cache/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/sysfs_dir_cache/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/sysfs_dir_cache/align', 0o664, b'0\n')
+f('sys/kernel/slab/sysfs_dir_cache/partial', 0o664, b'0\n')
+f('sys/kernel/slab/sysfs_dir_cache/validate', 0o664, b'')
+f('sys/kernel/slab/sysfs_dir_cache/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/sysfs_dir_cache/free_calls', 0o664, b'''  11006 <not-available> age=4303047087 pid=0 cpus=0
+    482 release_sysfs_dirent+0x5c/0xd0 age=61294/6319346/8379456 pid=1-2141 cpus=0-1
+''')
+f('sys/kernel/slab/sysfs_dir_cache/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/request_sock_TCP', 0o775)
+f('sys/kernel/slab/request_sock_TCP/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCP/ctor', 0o664, b'')
+f('sys/kernel/slab/request_sock_TCP/hwcache_align', 0o664, b'1\n')
+f('sys/kernel/slab/request_sock_TCP/slab_size', 0o664, b'192\n')
+f('sys/kernel/slab/request_sock_TCP/total_objects', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCP/slabs', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCP/poison', 0o664, b'1\n')
+f('sys/kernel/slab/request_sock_TCP/alloc_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/request_sock_TCP/objs_per_slab', 0o664, b'21\n')
+f('sys/kernel/slab/request_sock_TCP/shrink', 0o664, b'')
+f('sys/kernel/slab/request_sock_TCP/trace', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCP/object_size', 0o664, b'88\n')
+f('sys/kernel/slab/request_sock_TCP/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCP/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCP/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCP/objects_partial', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCP/objects', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCP/order', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCP/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/request_sock_TCP/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/request_sock_TCP/align', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCP/partial', 0o664, b'0\n')
+f('sys/kernel/slab/request_sock_TCP/validate', 0o664, b'')
+f('sys/kernel/slab/request_sock_TCP/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/request_sock_TCP/free_calls', 0o664, b'No data\n')
+f('sys/kernel/slab/request_sock_TCP/aliases', 0o664, b'0\n')
+d('sys/kernel/slab/kmalloc-4096', 0o775)
+f('sys/kernel/slab/kmalloc-4096/reclaim_account', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-4096/ctor', 0o664, b'')
+f('sys/kernel/slab/kmalloc-4096/hwcache_align', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-4096/slab_size', 0o664, b'4168\n')
+f('sys/kernel/slab/kmalloc-4096/total_objects', 0o664, b'385\n')
+f('sys/kernel/slab/kmalloc-4096/slabs', 0o664, b'55\n')
+f('sys/kernel/slab/kmalloc-4096/poison', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-4096/alloc_calls', 0o664, b'''      1 load_module+0x18d5/0x1b30 age=8375716 pid=330 cpus=0
+      1 __vmalloc_area_node+0xfb/0x140 age=8371983 pid=867 cpus=0
+     24 __percpu_alloc_mask+0xbc/0x140 age=8360098/8363374/8379742 pid=1-1549 cpus=0
+      1 seq_read+0x2f0/0x360 age=8365263 pid=1371 cpus=0
+      2 ext3_fill_super+0x68/0x1a20 age=8369599/8373987/8378375 pid=1-962 cpus=0
+      4 journal_init_revoke_table+0x4d/0xb0 age=8369583/8373933/8378283 pid=1-962 cpus=0
+      2 journal_init_inode+0x8d/0x130 age=8369583/8373933/8378283 pid=1-962 cpus=0
+      1 fat_fill_super+0x40/0xdd0 age=61388 pid=13348 cpus=1
+      7 scsi_host_alloc+0x35/0x360 age=66976/7192011/8379690 pid=1-419 cpus=0-1
+      3 scsi_alloc_sdev+0x6a/0x270 age=61972/5606752/8379307 pid=1-13295 cpus=0-1
+      8 input_allocate_device+0x1a/0xb0 age=53455/7335718/8378931 pid=17-419 cpus=0-1
+      1 reqsk_queue_alloc+0x112/0x120 age=8354535 pid=1920 cpus=0
+      3 alloc_netdev_mq+0x4f/0x180 age=8373564/8375671/8379766 pid=1-126 cpus=0-1
+      1 pidmap_init+0x15/0x4e age=8380028 pid=0 cpus=0
+      1 netlink_proto_init+0x47/0x16b age=8379894 pid=1 cpus=0
+      2 acpi_processor_add+0x25/0x6d [processor] age=8375653/8375684/8375715 pid=330 cpus=0
+      1 yenta_probe+0x38/0x6cd [yenta_socket] age=8373766 pid=352 cpus=0
+    281 iwl3945_rx_allocate+0xd5/0x160 [iwl3945] age=2011/7577/13684 pid=733 cpus=0
+      1 skcipher_geniv_alloc+0x304/0x3f0 [crypto_blkcipher] age=8374372 pid=215 cpus=1
+      2 bitmap_get_counter+0x153/0x220 [md_mod] age=8370027/8370029/8370031 pid=916 cpus=0
+      1 bitmap_create+0x2bc/0xad0 [md_mod] age=8370031 pid=916 cpus=0
+      6 __addrconf_sysctl_register+0x7b/0x140 [ipv6] age=8360098/8360099/8360101 pid=1549 cpus=0
+      1 acm_probe+0x34c/0xa50 [cdc_acm] age=22641 pid=419 cpus=0
+''')
+f('sys/kernel/slab/kmalloc-4096/objs_per_slab', 0o664, b'7\n')
+f('sys/kernel/slab/kmalloc-4096/shrink', 0o664, b'')
+f('sys/kernel/slab/kmalloc-4096/trace', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-4096/object_size', 0o664, b'4096\n')
+f('sys/kernel/slab/kmalloc-4096/cpu_slabs', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-4096/cache_dma', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-4096/destroy_by_rcu', 0o664, b'0\n')
+f('sys/kernel/slab/kmalloc-4096/objects_partial', 0o664, b'17\n')
+f('sys/kernel/slab/kmalloc-4096/objects', 0o664, b'367\n')
+f('sys/kernel/slab/kmalloc-4096/order', 0o664, b'3\n')
+f('sys/kernel/slab/kmalloc-4096/sanity_checks', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-4096/store_user', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-4096/align', 0o664, b'8\n')
+f('sys/kernel/slab/kmalloc-4096/partial', 0o664, b'5\n')
+f('sys/kernel/slab/kmalloc-4096/validate', 0o664, b'')
+f('sys/kernel/slab/kmalloc-4096/red_zone', 0o664, b'1\n')
+f('sys/kernel/slab/kmalloc-4096/free_calls', 0o664, b'''    187 <not-available> age=4303047324 pid=0 cpus=0
+      5 seq_release+0x18/0x30 age=61430/6709712/8374782 pid=107-1371 cpus=0-1
+      1 cryptomgr_probe+0x81/0xf0 age=8373564 pid=745 cpus=0
+     30 kobject_uevent_env+0x122/0x470 age=22643/7542644/8379894 pid=1-1549 cpus=0-1
+      1 show_uevent+0xee/0x110 age=2013 pid=13466 cpus=0
+      1 input_dev_release+0x23/0x40 age=8378913 pid=17 cpus=0
+    130 skb_release_data+0x85/0xd0 age=2011/73374/8354535 pid=0-13466 cpus=0-1
+''')
+f('sys/kernel/slab/kmalloc-4096/aliases', 0o664, b'0\n')
+d('sys/kernel/debug', 0o775)
+d('sys/kernel/debug/x86', 0o775)
+f('sys/kernel/debug/x86/pat_memtype_list', 0o664, b'')
+d('sys/kernel/debug/bdi', 0o775)
+d('sys/kernel/debug/bdi/7:1', 0o775)
+f('sys/kernel/debug/bdi/7:1/stats', 0o664, b'''BdiWriteback:            0 kB
+BdiReclaimable:          0 kB
+BdiDirtyThresh:          0 kB
+DirtyThresh:        189288 kB
+BackgroundThresh:    94644 kB
+''')
+d('sys/kernel/debug/bdi/7:0', 0o775)
+f('sys/kernel/debug/bdi/7:0/stats', 0o664, b'''BdiWriteback:            0 kB
+BdiReclaimable:          0 kB
+BdiDirtyThresh:          0 kB
+DirtyThresh:        189292 kB
+BackgroundThresh:    94644 kB
+''')
+d('sys/kernel/debug/bdi/7:2', 0o775)
+f('sys/kernel/debug/bdi/7:2/stats', 0o664, b'''BdiWriteback:            0 kB
+BdiReclaimable:          0 kB
+BdiDirtyThresh:          0 kB
+DirtyThresh:        189288 kB
+BackgroundThresh:    94644 kB
+''')
+d('sys/kernel/debug/bdi/7:4', 0o775)
+f('sys/kernel/debug/bdi/7:4/stats', 0o664, b'''BdiWriteback:            0 kB
+BdiReclaimable:          0 kB
+BdiDirtyThresh:          0 kB
+DirtyThresh:        189288 kB
+BackgroundThresh:    94644 kB
+''')
+d('sys/kernel/debug/bdi/7:3', 0o775)
+f('sys/kernel/debug/bdi/7:3/stats', 0o664, b'''BdiWriteback:            0 kB
+BdiReclaimable:          0 kB
+BdiDirtyThresh:          0 kB
+DirtyThresh:        189288 kB
+BackgroundThresh:    94644 kB
+''')
+d('sys/kernel/debug/bdi/11:0', 0o775)
+f('sys/kernel/debug/bdi/11:0/stats', 0o664, b'''BdiWriteback:            0 kB
+BdiReclaimable:          0 kB
+BdiDirtyThresh:          0 kB
+DirtyThresh:        189292 kB
+BackgroundThresh:    94644 kB
+''')
+d('sys/kernel/debug/bdi/7:5', 0o775)
+f('sys/kernel/debug/bdi/7:5/stats', 0o664, b'''BdiWriteback:            0 kB
+BdiReclaimable:          0 kB
+BdiDirtyThresh:          0 kB
+DirtyThresh:        189288 kB
+BackgroundThresh:    94644 kB
+''')
+d('sys/kernel/debug/bdi/8:0', 0o775)
+f('sys/kernel/debug/bdi/8:0/stats', 0o664, b'''BdiWriteback:            0 kB
+BdiReclaimable:      13696 kB
+BdiDirtyThresh:      83368 kB
+DirtyThresh:        189292 kB
+BackgroundThresh:    94644 kB
+''')
+d('sys/kernel/debug/bdi/default', 0o775)
+f('sys/kernel/debug/bdi/default/stats', 0o664, b'''BdiWriteback:            0 kB
+BdiReclaimable:          0 kB
+BdiDirtyThresh:          0 kB
+DirtyThresh:        189292 kB
+BackgroundThresh:    94644 kB
+''')
+d('sys/kernel/debug/bdi/0:16', 0o775)
+f('sys/kernel/debug/bdi/0:16/stats', 0o664, b'''BdiWriteback:            0 kB
+BdiReclaimable:          0 kB
+BdiDirtyThresh:          0 kB
+DirtyThresh:        189272 kB
+BackgroundThresh:    94636 kB
+''')
+d('sys/kernel/debug/bdi/8:16', 0o775)
+f('sys/kernel/debug/bdi/8:16/stats', 0o664, b'''BdiWriteback:            0 kB
+BdiReclaimable:          0 kB
+BdiDirtyThresh:          0 kB
+DirtyThresh:        189272 kB
+BackgroundThresh:    94636 kB
+''')
+d('sys/kernel/debug/bdi/9:0', 0o775)
+f('sys/kernel/debug/bdi/9:0/stats', 0o664, b'''BdiWriteback:            0 kB
+BdiReclaimable:          0 kB
+BdiDirtyThresh:          0 kB
+DirtyThresh:        189292 kB
+BackgroundThresh:    94644 kB
+''')
+d('sys/kernel/debug/bdi/7:7', 0o775)
+f('sys/kernel/debug/bdi/7:7/stats', 0o664, b'''BdiWriteback:            0 kB
+BdiReclaimable:          0 kB
+BdiDirtyThresh:          0 kB
+DirtyThresh:        189288 kB
+BackgroundThresh:    94644 kB
+''')
+d('sys/kernel/debug/bdi/7:6', 0o775)
+f('sys/kernel/debug/bdi/7:6/stats', 0o664, b'''BdiWriteback:            0 kB
+BdiReclaimable:          0 kB
+BdiDirtyThresh:          0 kB
+DirtyThresh:        189288 kB
+BackgroundThresh:    94644 kB
+''')
+d('sys/kernel/uids', 0o775)
+d('sys/kernel/uids/100', 0o775)
+f('sys/kernel/uids/100/cpu_share', 0o664, b'1024\n')
+d('sys/kernel/uids/103', 0o775)
+f('sys/kernel/uids/103/cpu_share', 0o664, b'1024\n')
+d('sys/kernel/uids/51', 0o775)
+f('sys/kernel/uids/51/cpu_share', 0o664, b'1024\n')
+d('sys/kernel/uids/105', 0o775)
+f('sys/kernel/uids/105/cpu_share', 0o664, b'1024\n')
+d('sys/kernel/uids/2702', 0o775)
+f('sys/kernel/uids/2702/cpu_share', 0o664, b'1024\n')
+d('sys/kernel/uids/0', 0o775)
+f('sys/kernel/uids/0/cpu_share', 0o664, b'2048\n')
+d('sys/power', 0o775)
+f('sys/power/state', 0o664, b'mem\n')
+d('sys/firmware', 0o775)
+d('sys/firmware/memmap', 0o775)
+d('sys/firmware/memmap/8', 0o775)
+f('sys/firmware/memmap/8/start', 0o664, b'0xfec00000\n')
+f('sys/firmware/memmap/8/type', 0o664, b'reserved\n')
+f('sys/firmware/memmap/8/end', 0o664, b'0xfec0ffff\n')
+d('sys/firmware/memmap/11', 0o775)
+f('sys/firmware/memmap/11/start', 0o664, b'0xfed1c000\n')
+f('sys/firmware/memmap/11/type', 0o664, b'reserved\n')
+f('sys/firmware/memmap/11/end', 0o664, b'0xfed8ffff\n')
+d('sys/firmware/memmap/6', 0o775)
+f('sys/firmware/memmap/6/start', 0o664, b'0x7ff00000\n')
+f('sys/firmware/memmap/6/type', 0o664, b'reserved\n')
+f('sys/firmware/memmap/6/end', 0o664, b'0x7fffffff\n')
+d('sys/firmware/memmap/5', 0o775)
+f('sys/firmware/memmap/5/start', 0o664, b'0x7fedf000\n')
+f('sys/firmware/memmap/5/type', 0o664, b'ACPI Non-volatile Storage\n')
+f('sys/firmware/memmap/5/end', 0o664, b'0x7fefffff\n')
+d('sys/firmware/memmap/9', 0o775)
+f('sys/firmware/memmap/9/start', 0o664, b'0xfed00000\n')
+f('sys/firmware/memmap/9/type', 0o664, b'reserved\n')
+f('sys/firmware/memmap/9/end', 0o664, b'0xfed003ff\n')
+d('sys/firmware/memmap/2', 0o775)
+f('sys/firmware/memmap/2/start', 0o664, b'0xdc000\n')
+f('sys/firmware/memmap/2/type', 0o664, b'reserved\n')
+f('sys/firmware/memmap/2/end', 0o664, b'0xfffff\n')
+d('sys/firmware/memmap/12', 0o775)
+f('sys/firmware/memmap/12/start', 0o664, b'0xfee00000\n')
+f('sys/firmware/memmap/12/type', 0o664, b'reserved\n')
+f('sys/firmware/memmap/12/end', 0o664, b'0xfee00fff\n')
+d('sys/firmware/memmap/4', 0o775)
+f('sys/firmware/memmap/4/start', 0o664, b'0x7fed0000\n')
+f('sys/firmware/memmap/4/type', 0o664, b'ACPI Tables\n')
+f('sys/firmware/memmap/4/end', 0o664, b'0x7fedefff\n')
+d('sys/firmware/memmap/3', 0o775)
+f('sys/firmware/memmap/3/start', 0o664, b'0x100000\n')
+f('sys/firmware/memmap/3/type', 0o664, b'System RAM\n')
+f('sys/firmware/memmap/3/end', 0o664, b'0x7fecffff\n')
+d('sys/firmware/memmap/10', 0o775)
+f('sys/firmware/memmap/10/start', 0o664, b'0xfed14000\n')
+f('sys/firmware/memmap/10/type', 0o664, b'reserved\n')
+f('sys/firmware/memmap/10/end', 0o664, b'0xfed19fff\n')
+d('sys/firmware/memmap/0', 0o775)
+f('sys/firmware/memmap/0/start', 0o664, b'0x0\n')
+f('sys/firmware/memmap/0/type', 0o664, b'System RAM\n')
+f('sys/firmware/memmap/0/end', 0o664, b'0x9efff\n')
+d('sys/firmware/memmap/7', 0o775)
+f('sys/firmware/memmap/7/start', 0o664, b'0xf0000000\n')
+f('sys/firmware/memmap/7/type', 0o664, b'reserved\n')
+f('sys/firmware/memmap/7/end', 0o664, b'0xf3ffffff\n')
+d('sys/firmware/memmap/1', 0o775)
+f('sys/firmware/memmap/1/start', 0o664, b'0x9f000\n')
+f('sys/firmware/memmap/1/type', 0o664, b'reserved\n')
+f('sys/firmware/memmap/1/end', 0o664, b'0x9ffff\n')
+d('sys/firmware/memmap/13', 0o775)
+f('sys/firmware/memmap/13/start', 0o664, b'0xff800000\n')
+f('sys/firmware/memmap/13/type', 0o664, b'reserved\n')
+f('sys/firmware/memmap/13/end', 0o664, b'0xffffffff\n')
+d('sys/firmware/edd', 0o775)
+d('sys/firmware/edd/int13_dev80', 0o775)
+l('sys/firmware/edd/int13_dev80/pci_dev', '../../../devices/pci0000:00/0000:00:1f.2')
+f('sys/firmware/edd/int13_dev80/version', 0o664, b'0x30\n')
+f('sys/firmware/edd/int13_dev80/raw_data', 0o664, b'J\x00\x01\x00\xff?\x00\x00\x10\x00\x00\x00?\x00\x00\x000"\xa5\x0b\x00\x00\x00\x00\x00\x02\xc6\x00@\x00\xdd\xbe,\x00\x00\x00PCI ATA     \x00\x1f\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5')
+f('sys/firmware/edd/int13_dev80/sectors', 0o664, b'195371568\n')
+f('sys/firmware/edd/int13_dev80/default_sectors_per_track', 0o664, b'63\n')
+f('sys/firmware/edd/int13_dev80/legacy_max_cylinder', 0o664, b'1022\n')
+f('sys/firmware/edd/int13_dev80/interface', 0o664, b'ATA     \tdevice: 0\n')
+f('sys/firmware/edd/int13_dev80/host_bus', 0o664, b'PCI \t00:1f.2  channel: 1\n')
+f('sys/firmware/edd/int13_dev80/legacy_max_head', 0o664, b'239\n')
+f('sys/firmware/edd/int13_dev80/mbr_signature', 0o664, b'0x00087b5f\n')
+f('sys/firmware/edd/int13_dev80/info_flags', 0o664, b'DMA boundary error transparent\n')
+f('sys/firmware/edd/int13_dev80/default_heads', 0o664, b'16\n')
+f('sys/firmware/edd/int13_dev80/default_cylinders', 0o664, b'16383\n')
+f('sys/firmware/edd/int13_dev80/legacy_sectors_per_track', 0o664, b'63\n')
+f('sys/firmware/edd/int13_dev80/extensions', 0o664, b'''Fixed disk access
+Enhanced Disk Drive support
+''')
+d('sys/firmware/acpi', 0o775)
+d('sys/firmware/acpi/tables', 0o775)
+f('sys/firmware/acpi/tables/DSDT', 0o664, b'''DSDT4\xd2\x00\x00\x01\x9aLENOVOTP-7I    \x11\x00\x00MSFT\x0e\x00\x00\x01\x10 \\_PR_[\x83\x0bCPU0\x00\x10\x10\x00\x00\x06[\x83\x0bCPU1\x01\x10\x10\x00\x00\x06\x10\x83I\x0b\\_SB_\x14C2_INI\x00\xa0(\x93\\SCMP\\_OS_\rMicrosoft Windows\x00\x00p
+\x01\\W98F\xa1C\x11\xa0F\t[\x12\\_OSI`\xa0,\\_OSI\rWindows 2001\x00p
+\x01\\WNTFp
+\x01\\WXPFp
+\x00\\WSPV\xa0 \\_OSI\rWindows 2001 SP1\x00p
+\x01\\WSPV\xa0 \\_OSI\rWindows 2001 SP2\x00p
+\x02\\WSPV\xa0\x1c\\_OSI\rWindows 2006\x00p
+\x01\\WVIS\xa1I\x07\xa0+\x93\\SCMP\\_OS_\rMicrosoft Windows NT\x00\x00p
+\x01\\WNTF\xa1J\x04\xa0G\x04\x93\\SCMP\\_OS_\rMicrosoft WindowsME: Millennium Edition\x00\x00p
+\x01\\WMEFp
+\x01\\W98F\xa0\x12\x92\x95\\_REV
+\x02p
+\x01\\H8DRp
+\x01\\OSIF\\/\x05_SB_PCI0LPC_MOU_MHIDp\\SRAH\\/\x03_SB_PCI0RID_\xa0\x1eVIGDp\\SRHE\\/\x04_SB_PCI0VID_RID_\xa1\x1ap\\SRHE\\/\x04_SB_PCI0AGP_RID_p\\SRE0\\/\x04_SB_PCI0EXP0RID_p\\SRE1\\/\x04_SB_PCI0EXP1RID_p\\SRE2\\/\x04_SB_PCI0EXP2RID_p\\SRE3\\/\x04_SB_PCI0EXP3RID_p\\SRU0\\/\x04_SB_PCI0USB0RID_p\\SRU1\\/\x04_SB_PCI0USB1RID_p\\SRU2\\/\x04_SB_PCI0USB2RID_p\\SRU3\\/\x04_SB_PCI0USB3RID_p\\SRU7\\/\x04_SB_PCI0USB7RID_p\\SRPB\\/\x04_SB_PCI0PCI1RID_p\\SRLP\\/\x04_SB_PCI0LPC_RID_p\\SRSA\\/\x04_SB_PCI0IDE0RID_p\\SRSA\\/\x04_SB_PCI0SATARID_p\\SRSM\\/\x04_SB_PCI0SMBURID_[\x82K\x11LNKA\x08_HID\x0cA\xd0\x0c\x0f\x08_UID
+\x01\x14(_STA\x00\xa0\x1c\x92VPIR\\/\x04_SB_PCI0LPC_PIRA\xa4
+\t\xa1\x04\xa4
+\x0b\x08_PRS\x11\t
+\x06#\xf8\x0e\x18y\x00\x14/_DIS\x00}\\/\x04_SB_PCI0LPC_PIRA
+\x80\\/\x04_SB_PCI0LPC_PIRA\x08BUFA\x11\t
+\x06#\x00\x00\x18y\x00\x8bBUFA
+\x01IRA1\x14:_CRS\x00{\\/\x04_SB_PCI0LPC_PIRA
+\x8f`\xa0\x0eVPIR`y
+\x01`IRA1\xa1\x08p
+\x00IRA1\xa4BUFA\x14F\x04_SRS\x01\x8bh
+\x01IRA2\x82IRA2`{\\/\x04_SB_PCI0LPC_PIRA
+pa}av`apa\\/\x04_SB_PCI0LPC_PIRA[\x82K\x11LNKB\x08_HID\x0cA\xd0\x0c\x0f\x08_UID
+\x02\x14(_STA\x00\xa0\x1c\x92VPIR\\/\x04_SB_PCI0LPC_PIRB\xa4
+\t\xa1\x04\xa4
+\x0b\x08_PRS\x11\t
+\x06#\xf8\x0e\x18y\x00\x14/_DIS\x00}\\/\x04_SB_PCI0LPC_PIRB
+\x80\\/\x04_SB_PCI0LPC_PIRB\x08BUFB\x11\t
+\x06#\x00\x00\x18y\x00\x8bBUFB
+\x01IRB1\x14:_CRS\x00{\\/\x04_SB_PCI0LPC_PIRB
+\x8f`\xa0\x0eVPIR`y
+\x01`IRB1\xa1\x08p
+\x00IRB1\xa4BUFB\x14F\x04_SRS\x01\x8bh
+\x01IRB2\x82IRB2`{\\/\x04_SB_PCI0LPC_PIRB
+pa}av`apa\\/\x04_SB_PCI0LPC_PIRB[\x82K\x11LNKC\x08_HID\x0cA\xd0\x0c\x0f\x08_UID
+\x03\x14(_STA\x00\xa0\x1c\x92VPIR\\/\x04_SB_PCI0LPC_PIRC\xa4
+\t\xa1\x04\xa4
+\x0b\x08_PRS\x11\t
+\x06#\xf8\x0e\x18y\x00\x14/_DIS\x00}\\/\x04_SB_PCI0LPC_PIRC
+\x80\\/\x04_SB_PCI0LPC_PIRC\x08BUFC\x11\t
+\x06#\x00\x00\x18y\x00\x8bBUFC
+\x01IRC1\x14:_CRS\x00{\\/\x04_SB_PCI0LPC_PIRC
+\x8f`\xa0\x0eVPIR`y
+\x01`IRC1\xa1\x08p
+\x00IRC1\xa4BUFC\x14F\x04_SRS\x01\x8bh
+\x01IRC2\x82IRC2`{\\/\x04_SB_PCI0LPC_PIRC
+pa}av`apa\\/\x04_SB_PCI0LPC_PIRC[\x82K\x11LNKD\x08_HID\x0cA\xd0\x0c\x0f\x08_UID
+\x04\x14(_STA\x00\xa0\x1c\x92VPIR\\/\x04_SB_PCI0LPC_PIRD\xa4
+\t\xa1\x04\xa4
+\x0b\x08_PRS\x11\t
+\x06#\xf8\x0e\x18y\x00\x14/_DIS\x00}\\/\x04_SB_PCI0LPC_PIRD
+\x80\\/\x04_SB_PCI0LPC_PIRD\x08BUFD\x11\t
+\x06#\x00\x00\x18y\x00\x8bBUFD
+\x01IRD1\x14:_CRS\x00{\\/\x04_SB_PCI0LPC_PIRD
+\x8f`\xa0\x0eVPIR`y
+\x01`IRD1\xa1\x08p
+\x00IRD1\xa4BUFD\x14F\x04_SRS\x01\x8bh
+\x01IRD2\x82IRD2`{\\/\x04_SB_PCI0LPC_PIRD
+pa}av`apa\\/\x04_SB_PCI0LPC_PIRD[\x82K\x11LNKE\x08_HID\x0cA\xd0\x0c\x0f\x08_UID
+\x05\x14(_STA\x00\xa0\x1c\x92VPIR\\/\x04_SB_PCI0LPC_PIRE\xa4
+\t\xa1\x04\xa4
+\x0b\x08_PRS\x11\t
+\x06#\xf8\x0e\x18y\x00\x14/_DIS\x00}\\/\x04_SB_PCI0LPC_PIRE
+\x80\\/\x04_SB_PCI0LPC_PIRE\x08BUFE\x11\t
+\x06#\x00\x00\x18y\x00\x8bBUFE
+\x01IRE1\x14:_CRS\x00{\\/\x04_SB_PCI0LPC_PIRE
+\x8f`\xa0\x0eVPIR`y
+\x01`IRE1\xa1\x08p
+\x00IRE1\xa4BUFE\x14F\x04_SRS\x01\x8bh
+\x01IRE2\x82IRE2`{\\/\x04_SB_PCI0LPC_PIRE
+pa}av`apa\\/\x04_SB_PCI0LPC_PIRE[\x82K\x11LNKF\x08_HID\x0cA\xd0\x0c\x0f\x08_UID
+\x06\x14(_STA\x00\xa0\x1c\x92VPIR\\/\x04_SB_PCI0LPC_PIRF\xa4
+\t\xa1\x04\xa4
+\x0b\x08_PRS\x11\t
+\x06#\xf8\x0e\x18y\x00\x14/_DIS\x00}\\/\x04_SB_PCI0LPC_PIRF
+\x80\\/\x04_SB_PCI0LPC_PIRF\x08BUFF\x11\t
+\x06#\x00\x00\x18y\x00\x8bBUFF
+\x01IRF1\x14:_CRS\x00{\\/\x04_SB_PCI0LPC_PIRF
+\x8f`\xa0\x0eVPIR`y
+\x01`IRF1\xa1\x08p
+\x00IRF1\xa4BUFF\x14F\x04_SRS\x01\x8bh
+\x01IRF2\x82IRF2`{\\/\x04_SB_PCI0LPC_PIRF
+pa}av`apa\\/\x04_SB_PCI0LPC_PIRF[\x82K\x11LNKG\x08_HID\x0cA\xd0\x0c\x0f\x08_UID
+\x07\x14(_STA\x00\xa0\x1c\x92VPIR\\/\x04_SB_PCI0LPC_PIRG\xa4
+\t\xa1\x04\xa4
+\x0b\x08_PRS\x11\t
+\x06#\xf8\x0e\x18y\x00\x14/_DIS\x00}\\/\x04_SB_PCI0LPC_PIRG
+\x80\\/\x04_SB_PCI0LPC_PIRG\x08BUFG\x11\t
+\x06#\x00\x00\x18y\x00\x8bBUFG
+\x01IRG1\x14:_CRS\x00{\\/\x04_SB_PCI0LPC_PIRG
+\x8f`\xa0\x0eVPIR`y
+\x01`IRG1\xa1\x08p
+\x00IRG1\xa4BUFG\x14F\x04_SRS\x01\x8bh
+\x01IRG2\x82IRG2`{\\/\x04_SB_PCI0LPC_PIRG
+pa}av`apa\\/\x04_SB_PCI0LPC_PIRG[\x82K\x11LNKH\x08_HID\x0cA\xd0\x0c\x0f\x08_UID
+\x08\x14(_STA\x00\xa0\x1c\x92VPIR\\/\x04_SB_PCI0LPC_PIRH\xa4
+\t\xa1\x04\xa4
+\x0b\x08_PRS\x11\t
+\x06#\xf8\x0e\x18y\x00\x14/_DIS\x00}\\/\x04_SB_PCI0LPC_PIRH
+\x80\\/\x04_SB_PCI0LPC_PIRH\x08BUFH\x11\t
+\x06#\x00\x00\x18y\x00\x8bBUFH
+\x01IRH1\x14:_CRS\x00{\\/\x04_SB_PCI0LPC_PIRH
+\x8f`\xa0\x0eVPIR`y
+\x01`IRH1\xa1\x08p
+\x00IRH1\xa4BUFH\x14F\x04_SRS\x01\x8bh
+\x01IRH2\x82IRH2`{\\/\x04_SB_PCI0LPC_PIRH
+pa}av`apa\\/\x04_SB_PCI0LPC_PIRH\x149VPIR\x01p
+\x01`\xa0
+{h
+\x80\x00p
+\x00`\xa1!{h
+\x0fa\xa0\t\x95a
+\x03p
+\x00`\xa1\x10\xa0\x0e\x91\x93a
+\x08\x93a
+\rp
+\x00`\xa4`[\x82HhMEM_\x08_HID\x0cA\xd0\x0c\x01\x08ME98\x11B\x04
+>\x86\t\x00\x01\x00\x00\x00\x00\x00\x00
+\x00\x86\t\x00\x00\x00\x00\x0e\x00\x00\x00\x02\x00\x86\t\x00\x01\x00\x00\x10\x00\x00\x00\xee\x01\x86\t\x00\x00\x00\x00\xc0\xfe\x00\x00\x14\x00\x86\t\x00\x00\x00\x10\xd4\xfe\x00\xf0+\x01y\x00\x8aME98
+\x1cMEB0\x8aME98
+ MEL0\x08MGAP\x11\x11
+\x0e\x86\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00y\x00\x8aMGAP
+\x04MGPB\x8aMGAP
+\x08MGPL\x08MEMS\x11B\r
+\xce\x86\t\x00\x01\x00\x00\x00\x00\x00\x00
+\x00\x86\t\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x86\t\x00\x00\x00@\x0c\x00\x00\x00\x00\x00\x86\t\x00\x00\x00\x80\x0c\x00\x00\x00\x00\x00\x86\t\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x86\t\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x86\t\x00\x00\x00@\r\x00\x00\x00\x00\x00\x86\t\x00\x00\x00\x80\r\x00\x00\x00\x00\x00\x86\t\x00\x00\x00\xc0\r\x00\x00\x00\x00\x00\x86\t\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x86\t\x00\x00\x00@\x0e\x00\x00\x00\x00\x00\x86\t\x00\x00\x00\x80\x0e\x00\x00\x00\x00\x00\x86\t\x00\x00\x00\xc0\x0e\x00\x00\x00\x00\x00\x86\t\x00\x00\x00\x00\x0f\x00\x00\x00\x01\x00\x86\t\x00\x01\x00\x00\x10\x00\x00\x00\xee\x01\x86\t\x00\x00\x00\x00\xc0\xfe\x00\x00\x14\x00\x86\t\x00\x00\x00\x10\xd4\xfe\x00\xf0+\x01y\x00\x8aMEMS
+\x14MC0L\x8aMEMS
+ MC4L\x8aMEMS
+,MC8L\x8aMEMS
+8MCCL\x8aMEMS
+DMD0L\x8aMEMS
+PMD4L\x8aMEMS
+\\MD8L\x8aMEMS
+hMDCL\x8aMEMS
+tME0L\x8aMEMS
+\x80ME4L\x8aMEMS
+\x8cME8L\x8aMEMS
+\x98MECL\x8dMEMS
+xMC0W\x8dMEMS
+\xd8MC4W\x8dMEMS\x0b8\x01MC8W\x8dMEMS\x0b\x98\x01MCCW\x8dMEMS\x0b\xf8\x01MD0W\x8dMEMS\x0bX\x02MD4W\x8dMEMS\x0b\xb8\x02MD8W\x8dMEMS\x0b\x18\x03MDCW\x8dMEMS\x0bx\x03ME0W\x8dMEMS\x0b\xd8\x03ME4W\x8dMEMS\x0b8\x04ME8W\x8dMEMS\x0b\x98\x04MECW\x8aMEMS
+\xacMEB1\x8aMEMS
+\xb0MEL1\x8aMEMS
+\xbcMEL2\x8aMEMS
+\xc8MEL3\x14F=_CRS\x00\xa0M\x17\\W98Ft\\MEMXMEB0MEL0p\\GAPAMGPBp\\GAPLMGPL\xa0I\x0c\x90MGPBMGPLt\x87ME98
+\x02`\x08MBF0\x11\x02`r`\x87MGAP`\x08MBF1\x11\x02`pME98MBF0sMBF0MGAPMBF1\xa0O\x07\x92\x93\\/\x05_SB_PCI0LPC_TPM__STA
+\x0ft\x87MBF1
+\x02`\x08MBF2\x11\x02`r`\x87\\/\x05_SB_PCI0LPC_TPM__CRS`\x08MBF3\x11\x02`pMBF1MBF2sMBF2\\/\x05_SB_PCI0LPC_TPM__CRSMBF3\xa4MBF3\xa1\x06\xa4MBF1\xa1I\x08\xa0O\x07\x92\x93\\/\x05_SB_PCI0LPC_TPM__STA
+\x0ft\x87ME98
+\x02`\x08MBF4\x11\x02`r`\x87\\/\x05_SB_PCI0LPC_TPM__CRS`\x08MBF5\x11\x02`pME98MBF4sMBF4\\/\x05_SB_PCI0LPC_TPM__CRSMBF5\xa4MBF5\xa1\x06\xa4ME98{\\/\x03_SB_PCI0PAM1
+\x03`\xa0\x18`p\x0b\x00@MC0L\xa0\r{`
+\x02\x00p
+\x01MC0W{\\/\x03_SB_PCI0PAM1
+0`\xa0\x18`p\x0b\x00@MC4L\xa0\r{`
+ \x00p
+\x01MC4W{\\/\x03_SB_PCI0PAM2
+\x03`\xa0\x18`p\x0b\x00@MC8L\xa0\r{`
+\x02\x00p
+\x01MC8W{\\/\x03_SB_PCI0PAM2
+0`\xa0\x18`p\x0b\x00@MCCL\xa0\r{`
+ \x00p
+\x01MCCW{\\/\x03_SB_PCI0PAM3
+\x03`\xa0\x18`p\x0b\x00@MD0L\xa0\r{`
+\x02\x00p
+\x01MD0W{\\/\x03_SB_PCI0PAM3
+0`\xa0\x18`p\x0b\x00@MD4L\xa0\r{`
+ \x00p
+\x01MD4W{\\/\x03_SB_PCI0PAM4
+\x03`\xa0\x18`p\x0b\x00@MD8L\xa0\r{`
+\x02\x00p
+\x01MD8W{\\/\x03_SB_PCI0PAM4
+0`\xa0\x18`p\x0b\x00@MDCL\xa0\r{`
+ \x00p
+\x01MDCW{\\/\x03_SB_PCI0PAM5
+\x03`\xa0\x18`p\x0b\x00@ME0L\xa0\r{`
+\x02\x00p
+\x01ME0W{\\/\x03_SB_PCI0PAM5
+0`\xa0\x18`p\x0b\x00@ME4L\xa0\r{`
+ \x00p
+\x01ME4W{\\/\x03_SB_PCI0PAM6
+\x03`\xa0\x18`p\x0b\x00@ME8L\xa0\r{`
+\x02\x00p
+\x01ME8W{\\/\x03_SB_PCI0PAM6
+0`\xa0\x18`p\x0b\x00@MECL\xa0\r{`
+ \x00p
+\x01MECWt\\MEMXMEB1MEL1\xa0-\x92\x93\\/\x05_SB_PCI0LPC_TPM__STA
+\x0fp\x0c\x00\x00@\x01MEL2p
+\x00MEL3\xa4MEMS[\x82I\rLID_\x08_HID\x0cA\xd0\x0c\r\x14<_LID\x00\xa0\x1e\\H8DR\xa4\\/\x05_SB_PCI0LPC_EC__HPLD\xa1\x16\xa0\x0f{\\RBEC
+F
+\x04\x00\xa4
+\x01\xa1\x04\xa4
+\x00\x14&_PRW\x00\xa0\x15\x90\\W98F\x92\\WMEF\xa4\x12\x06\x02
+\x18
+\x04\xa1\t\xa4\x12\x06\x02
+\x18
+\x03\x14D\x06_PSW\x01\xa0?\\H8DR\xa0\x1chp
+\x01\\/\x05_SB_PCI0LPC_EC__HWLO\xa1\x1bp
+\x00\\/\x05_SB_PCI0LPC_EC__HWLO\xa1\x1c\xa0\rh\\MBEC
+2
+\xff
+\x04\xa1\x0c\\MBEC
+2
+\xfb
+\x00[\x82L\tSLPB\x08_HID\x0cA\xd0\x0c\x0e\x14&_PRW\x00\xa0\x15\x90\\W98F\x92\\WMEF\xa4\x12\x06\x02
+\x18
+\x04\xa1\t\xa4\x12\x06\x02
+\x18
+\x03\x14D\x06_PSW\x01\xa0?\\H8DR\xa0\x1chp
+\x01\\/\x05_SB_PCI0LPC_EC__HWFN\xa1\x1bp
+\x00\\/\x05_SB_PCI0LPC_EC__HWFN\xa1\x1c\xa0\rh\\MBEC
+2
+\xff
+\x10\xa1\x0c\\MBEC
+2
+\xef
+\x00[\x82\x8fH\x07PCI0[\x82\x8a\x96\x04LPC_\x08_ADR\x0c\x00\x00\x1f\x00\x08_S3D
+\x03\x08RID_
+\x00[\x82M\x1aSIO_\x08_HID\x0cA\xd0\x0c\x02\x08_UID
+\x00\x08SCRS\x11B\x10
+\xfeG\x01\x10\x00\x10\x00\x01\x10G\x01\x90\x00\x90\x00\x01\x10G\x01$\x00$\x00\x01\x02G\x01(\x00(\x00\x01\x02G\x01,\x00,\x00\x01\x02G\x010\x000\x00\x01\x02G\x014\x004\x00\x01\x02G\x018\x008\x00\x01\x02G\x01<\x00<\x00\x01\x02G\x01\xa4\x00\xa4\x00\x01\x02G\x01\xa8\x00\xa8\x00\x01\x02G\x01\xac\x00\xac\x00\x01\x02G\x01\xb0\x00\xb0\x00\x01\x06G\x01\xb8\x00\xb8\x00\x01\x02G\x01\xbc\x00\xbc\x00\x01\x02G\x01P\x00P\x00\x01\x04G\x01r\x00r\x00\x01\x06G\x01N\x16N\x16\x01\x02G\x01.\x00.\x00\x01\x02G\x01\x00\x10\x00\x10\x01\x80G\x01\x80\x11\x80\x11\x01@G\x01\x00\x08\x00\x08\x01\x10G\x01\xe0\x15\xe0\x15\x01\x10G\x01\x00\x16\x00\x16\x01`\x86\t\x00\x01\x00\x00\x00\xf0\x00\x00\x00\x04\x86\t\x00\x01\x00\xc0\xd1\xfe\x00@\x00\x00\x86\t\x00\x01\x00@\xd1\xfe\x00@\x00\x00\x86\t\x00\x01\x00\x80\xd1\xfe\x00\x10\x00\x00\x86\t\x00\x01\x00\x90\xd1\xfe\x00\x10\x00\x00y\x00\x14M\x08_CRS\x00\xa0 \x93\\/\x05_SB_PCI0LPC_TPM__STA
+\x0f\xa4SCRS\xa1D\x06t\x87SCRS
+\x02`\x08BUF0\x11\x02`r`\x87\\/\x05_SB_PCI0LPC_TPM__CRS`\x08BUF1\x11\x02`pSCRSBUF0sBUF0\\/\x05_SB_PCI0LPC_TPM__CRSBUF1\xa4BUF1[\x80LPCS\x02
+\x00\x0b\x00\x01[\x81G
+LPCS\x00\x00@0PIRA\x08PIRB\x08PIRC\x08PIRD\x08SERQ\x08\x00\x18PIRE\x08PIRF\x08PIRG\x08PIRH\x08\x00@
+XU1A\x03\x00\x01XU2A\x03\x00\x01XPA_\x02\x00\x02XFA_\x01\x00\x03XU1E\x01XU2E\x01XPE_\x01XFE_\x01\x00\x0cXG1E\x01\x00\x06XG1A\t\x00\x10XG2E\x01\x00\x03XG2A\x0c\x00@\x0b\x00\x02CLKR\x01GYEN\x01\x00\x03C4C3\x01\x00\x02EXPE\x01\x00\x05[\x80LPIO\x01\x0b\x80\x11
+@[\x81O
+LPIO\x03GU00\x08GU01\x08GU02\x08GU03\x08GI00\x08GI01\x08GI02\x08GI03\x08\x00 GL00\x08GL01\x08GL02\x08GL03\x08\x00@\x04GB00\x08GB01\x08GB02\x08GB03\x08\x00@\x08GV00\x08GV01\x08GV02\x08GV03\x08GU04\x08GU05\x08GU06\x08GU07\x08GI04\x08GI05\x08GI06\x08GI07\x08GL04\x08GL05\x08GL06\x08GL07\x08[\x80PMIO\x01\x0b\x00\x10
+\x80[\x81\x10PMIO\x00\x00@!\x00\x01SWGE\x01[\x823PIC_\x08_HID\x0bA\xd0\x08_CRS\x11 
+\x1dG\x01 \x00 \x00\x01\x02G\x01\xa0\x00\xa0\x00\x01\x02G\x01\xd0\x04\xd0\x04\x01\x02"\x04\x00y\x00[\x82%TIMR\x08_HID\x0cA\xd0\x01\x00\x08_CRS\x11\x10
+\rG\x01@\x00@\x00\x01\x04"\x01\x00y\x00[\x82B\x05HPET\x08_HID\x0cA\xd0\x01\x03\x14*_STA\x00\xa0\x08W98F\xa4
+\x00\xa1\x17\xa0\x10\x90\\WNTF\x92\\WXPF\xa4
+\x00\xa1\x04\xa4
+\x0f\xa4
+\x00\x08_CRS\x11\x11
+\x0e\x86\t\x00\x00\x00\x00\xd0\xfe\x00\x04\x00\x00y\x00[\x825DMAC\x08_HID\x0cA\xd0\x02\x00\x08_CRS\x11 
+\x1dG\x01\x00\x00\x00\x00\x01\x10G\x01\x80\x00\x80\x00\x01\x10G\x01\xc0\x00\xc0\x00\x01 *\x10\x05y\x00[\x82"SPKR\x08_HID\x0cA\xd0\x08\x00\x08_CRS\x11\r
+
+G\x01a\x00a\x00\x01\x01y\x00[\x82%FPU_\x08_HID\x0cA\xd0\x0c\x04\x08_CRS\x11\x10
+\rG\x01\xf0\x00\xf0\x00\x01\x01"\x00 y\x00[\x82%RTC_\x08_HID\x0cA\xd0\x0b\x00\x08_CRS\x11\x10
+\rG\x01p\x00p\x00\x01\x02"\x00\x01y\x00[\x82-KBD_\x08_HID\x0cA\xd0\x03\x03\x08_CRS\x11\x18
+\x15G\x01`\x00`\x00\x01\x01G\x01d\x00d\x00\x01\x01"\x02\x00y\x00[\x82J\x05MOU_\x08_HID\x0c$M7\x80\x08_CID\x0cA\xd0\x0f\x13\x08_CRS\x11\x08
+\x05"\x00\x10y\x00\x141MHID\x00\xa0\x1e\\/\x04_SB_PCI0LPC_PADDp\x0c$M7\x80_HID\xa1\x0bp\x0c$M\x00W_HID[\x80IMGA\x01\x0b\xe0\x15
+\x10[\x81!IMGA\x01\x00\x08\x00\x08\x00\x08WAKR\x10\x008GAIX\x08\x00\x08GADT\x08\x00\x08[\x86I\x0bGAIXGADT\x01\x00H VAUX\x02\x00\x01WOLE\x01\x00\x04\x00@\x07\x00\x01CBPW\x01CBSL\x01VDPW\x01PDNE\x01BLPL\x01\x00\x01LEDS\x01TP4R\x01PADR\x01BPAD\x01\x00\x01\x00\x01PADD\x01\x00
+DLAN\x01\x00G\x06BUSC\x01BUSD\x01\x00\x01DSCI\x01\x00\x04EPWG\x01\x00\x02DSCS\x01\x00\x04CSON\x01URST\x01\x00N\x06GDR0\x01GDR1\x01GDR2\x01\x00\x05GDT0\x01GDT1\x01GDT2\x01\x00E(GAID\x08[\x80NCFG\x01
+.
+\x02[\x81\x10NCFG\x01INDX\x08DATA\x08[\x86B
+INDXDATA\x01\x008LDN_\x08\x00@\x0cSIOD\x08\x00\x08SCF2\x08\x00\x08SCF4\x08\x00\x02PPSE\x01\x00\x04PNF_\x01FDCD\x01PPD_\x01SP2D\x01SP1D\x01\x00\x01GPSR\x02\x00\x01SRID\x08\x00\x08SCF9\x08\x00\x08\x00(LDA_\x01\x00\x07\x00H\x17IOHI\x08IOLW\x08\x00@\x07IRQN\x04IRQW\x01\x00\x03IRQT\x01IRQL\x01\x00\x06\x00\x10DMA0\x03\x00\x05DMA1\x03\x00\x05[\x86#INDXDATA\x01\x00@xPTRS\x01PPMC\x01\x00\x02PERA\x01PMDS\x03[\x86#INDXDATA\x01\x00@xSTRS\x01SPMC\x01SBSY\x01\x00\x04SBSE\x01[\x86\x1cINDXDATA\x01\x00@xGPPS\x08GPPC\x08GPER\x08[\x80CFGS\x01\x0bN\x16
+\x02[\x81\x10CFGS\x01NDXS\x08ATAS\x08[\x86J
+NDXSATAS\x01\x008LDNS\x08\x00@\x0c\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x02PSES\x01\x00\x04PNFS\x01DCDS\x01PPDS\x01SP2S\x01SP1S\x01\x00\x01PSRS\x02\x00\x01RIDS\x08\x00\x08CCSS\x02CCES\x01MCSS\x01MESS\x01\x00\x03\x00\x08\x00(LDAS\x01\x00\x07\x00H\x17OHIS\x08OLWS\x08\x00@\x07RQNS\x04RQWS\x01\x00\x03RQTS\x01RQLS\x01\x00\x06\x00\x10MA0S\x03\x00\x05MA1S\x03\x00\x05[\x86#NDXSATAS\x01\x00@xTRSS\x01PMCS\x01BSYS\x01\x00\x04SESS\x01[\x80NSDL\x01\x0bL\x16
+\x01[\x81\x0bNSDL\x01DLPC\x08[\x80NSIO\x01\x0b\x80\x16
+\x0c[\x81\'NSIO\x01DRST\x01DLPD\x01\x00\x06\x00\x04DKI0\x01\x00\x03\x008DKI1\x01DKI2\x01[\x80DSIO\x01\x0b \x16
+\x0c[\x81\x0fDSIO\x01\x00\x01DUSB\x01\x00\x06[\x82K\x18FDC_\x08_HID\x0cA\xd0\x07\x00\x14 _STA\x00\xa0\x14\\LFDC\xa0\x08XFE_\xa4
+\x0f\xa1\x04\xa4
+\r\xa1\x04\xa4
+\x00\x14)_DIS\x00p
+\x00XFE_p
+\x00LDN_p
+\x00IRQNp
+\x00LDA_p
+\x01FDCD\x08_CRS\x11\x1b
+\x18G\x01\xf0\x03\xf0\x03\x01\x06G\x01\xf7\x03\xf7\x03\x01\x01"@\x00*\x04\x00y\x00\x08_PRS\x11\x1b
+\x18G\x01\xf0\x03\xf0\x03\x01\x06G\x01\xf7\x03\xf7\x03\x01\x01"@\x00*\x04\x00y\x00\x14M\x04_SRS\x01p
+\x00LDN_p
+\x00LDA_p
+\x03IOHIp
+\xf0IOLWp
+\x06IRQNp
+\x02DMA0p
+\x00FDCDp
+\x01LDA_p
+\x00XFA_p
+\x01XFE_\x14\x1b_PSC\x00p
+\x00LDN_\xa0\x08LDA_\xa4
+\x00\xa1\x04\xa4
+\x03\x14\x14_PS0\x00p
+\x00LDN_p
+\x01LDA_\x14\x14_PS3\x00p
+\x00LDN_p
+\x00LDA_\x14#SLFD\x01\xa0\x0eh\\MISA\x0b\xf3\x03
+\xf3
+\x04\xa1\r\\MISA\x0b\xf3\x03
+\xf3
+\x00[\x824FDD0\x08_ADR
+\x00\x08_FDI\x12"\x10
+\x00
+\x04
+O
+\x12
+\x01
+\xdf
+\x02
+%
+\x02
+\x12
+\x1b
+\xff
+l
+\xf6
+\x0f
+\x05\x10\x86/\x01\\/\x03_SB_PCI0LPC_[\x82A-LURT\x08_UID
+\x00\x14-_STA\x00\xa0\x16\x93\\/\x03_SB_LCIO_STA
+\x00\xa4
+\x00\xa1\x0f\xa0\x08XU1E\xa4
+\x0f\xa1\x04\xa4
+\r\x08_HID\x0cA\xd0\x05\x01\x08_PRW\x12\x06\x02
+\x18
+\x03\x14D\x06_PSW\x01\xa0?\\H8DR\xa0\x1chp
+\x01\\/\x05_SB_PCI0LPC_EC__HWRI\xa1\x1bp
+\x00\\/\x05_SB_PCI0LPC_EC__HWRI\xa1\x1c\xa0\rh\\MBEC
+2
+\xff
+@\xa1\x0c\\MBEC
+2
+\xbf
+\x00\x14)_DIS\x00p
+\x00XU1Ep
+\x03LDN_p
+\x00IRQNp
+\x00LDA_p
+\x01SP1D\x08U1BF\x11\x10
+\rG\x01\x00\x00\x00\x00\x01\x08"\x00\x00y\x00\x8bU1BF
+\x02U1MN\x8bU1BF
+\x04U1MX\x8bU1BF
+\tU1IQ\x14J\x04_CRS\x00p
+\x03LDN_}yIOHI
+\x08\x00IOLW`p`U1MNp`U1MXpIRQN`\xa0\r`y
+\x01IRQNU1IQ\xa1\x08p
+\x00U1IQ\xa4U1BF\x08_PRS\x11O\x06
+k1\x00G\x01\xf8\x03\xf8\x03\x01\x08"\x10\x001\x01G\x01\xf8\x02\xf8\x02\x01\x08"\x08\x001\x01G\x01\xe8\x03\xe8\x03\x01\x08"\x10\x001\x01G\x01\xe8\x02\xe8\x02\x01\x08"\x08\x001\x02G\x01\xf8\x03\xf8\x03\x01\x08"\xa8\x001\x02G\x01\xf8\x02\xf8\x02\x01\x08"\xb0\x001\x02G\x01\xe8\x03\xe8\x03\x01\x08"\xa8\x001\x02G\x01\xe8\x02\xe8\x02\x01\x08"\xb0\x008y\x00\x14O\x0c_SRS\x01\x8ch
+\x02RUIL\x8ch
+\x03RUIH\x8bh
+\x02RUIO\x8bh
+\tRUIQp
+\x03LDN_p
+\x00LDA_pRUILIOLWpRUIHIOHI\xa0\x12RUIQ\x82RUIQ`pv`IRQN\xa1\x08p
+\x00IRQNp
+\x00SP1Dp
+\x01LDA_\xa0\x10\x93RUIO\x0b\xf8\x03p
+\x00XU1A\xa1E\x04\xa0\x10\x93RUIO\x0b\xf8\x02p
+\x01XU1A\xa11\xa0\x10\x93RUIO\x0b\xe8\x03p
+\x07XU1A\xa1\x1e\xa0\x10\x93RUIO\x0b\xe8\x02p
+\x05XU1A\xa1\x0b[2\x02\x00\x00\x02\x90\x0b\xb5\x01p
+\x01XU1E\x14\x1b_PSC\x00p
+\x03LDN_\xa0\x08LDA_\xa4
+\x00\xa1\x04\xa4
+\x03\x14\x06_PS0\x00\x14\x06_PS3\x00[\x82G-DURT\x08_UID
+\x01\x143_STA\x00\xa0\x1c\x92{
+\x08\\/\x04_SB_PCI0LPC_DLPC\x00\xa4
+\x00\xa1\x0f\xa0\x08XU1E\xa4
+\x0f\xa1\x04\xa4
+\r\x08_HID\x0cA\xd0\x05\x01\x08_PRW\x12\x06\x02
+\x18
+\x03\x14D\x06_PSW\x01\xa0?\\H8DR\xa0\x1chp
+\x01\\/\x05_SB_PCI0LPC_EC__HWRI\xa1\x1bp
+\x00\\/\x05_SB_PCI0LPC_EC__HWRI\xa1\x1c\xa0\rh\\MBEC
+2
+\xff
+@\xa1\x0c\\MBEC
+2
+\xbf
+\x00\x14)_DIS\x00p
+\x00XU1Ep
+\x03LDN_p
+\x00IRQNp
+\x00LDA_p
+\x01SP1D\x08U1BF\x11\x10
+\rG\x01\x00\x00\x00\x00\x01\x08"\x00\x00y\x00\x8bU1BF
+\x02U1MN\x8bU1BF
+\x04U1MX\x8bU1BF
+\tU1IQ\x14J\x04_CRS\x00p
+\x03LDN_}yIOHI
+\x08\x00IOLW`p`U1MNp`U1MXpIRQN`\xa0\r`y
+\x01IRQNU1IQ\xa1\x08p
+\x00U1IQ\xa4U1BF\x08_PRS\x11O\x06
+k1\x00G\x01\xf8\x03\xf8\x03\x01\x08"\x10\x001\x01G\x01\xf8\x02\xf8\x02\x01\x08"\x08\x001\x01G\x01\xe8\x03\xe8\x03\x01\x08"\x10\x001\x01G\x01\xe8\x02\xe8\x02\x01\x08"\x08\x001\x02G\x01\xf8\x03\xf8\x03\x01\x08"\xa8\x001\x02G\x01\xf8\x02\xf8\x02\x01\x08"\xb0\x001\x02G\x01\xe8\x03\xe8\x03\x01\x08"\xa8\x001\x02G\x01\xe8\x02\xe8\x02\x01\x08"\xb0\x008y\x00\x14O\x0c_SRS\x01\x8ch
+\x02RUIL\x8ch
+\x03RUIH\x8bh
+\x02RUIO\x8bh
+\tRUIQp
+\x03LDN_p
+\x00LDA_pRUILIOLWpRUIHIOHI\xa0\x12RUIQ\x82RUIQ`pv`IRQN\xa1\x08p
+\x00IRQNp
+\x00SP1Dp
+\x01LDA_\xa0\x10\x93RUIO\x0b\xf8\x03p
+\x00XU1A\xa1E\x04\xa0\x10\x93RUIO\x0b\xf8\x02p
+\x01XU1A\xa11\xa0\x10\x93RUIO\x0b\xe8\x03p
+\x07XU1A\xa1\x1e\xa0\x10\x93RUIO\x0b\xe8\x02p
+\x05XU1A\xa1\x0b[2\x02\x00\x00\x02\x90\x0b\xb5\x01p
+\x01XU1E\x14\x1b_PSC\x00p
+\x03LDN_\xa0\x08LDA_\xa4
+\x00\xa1\x04\xa4
+\x03\x14\x06_PS0\x00\x14\x06_PS3\x00[\x82L1LLPT\x08_UID
+\x00\x14=_STA\x00\xa0\x16\x93\\/\x03_SB_LCIO_STA
+\x00\xa4
+\x00\xa1\x1f\xa0\x18\x92\x93\\PMOD
+\x03\xa0\x08XPE_\xa4
+\x0f\xa1\x04\xa4
+\r\xa1\x04\xa4
+\x00\x08_HID\x0cA\xd0\x04\x00\x14)_DIS\x00p
+\x00XPE_p
+\x01LDN_p
+\x00IRQNp
+\x00LDA_p
+\x01PPD_\x08PPBF\x11\x10
+\rG\x01\x00\x00\x00\x00\x01\x00"\x00\x00y\x00\x8bPPBF
+\x02LPN0\x8bPPBF
+\x04LPX0\x8cPPBF
+\x07LPL0\x8bPPBF
+\tLPIQ\x14@\x07_CRS\x00\xa0\x0e\x93\\PMOD
+\x03\xa4PPBFp
+\x01LDN_}yIOHI
+\x08\x00IOLW`p`LPN0p`LPX0\xa0\r\x93`\x0b\xbc\x03p
+\x03LPL0\xa1\x08p
+\x08LPL0pIRQN`\xa0\r`y
+\x01IRQNLPIQ\xa1\x08p
+\x00LPIQ\xa4PPBF\x14\x19_PRS\x00\xa0\x0b\\PMOD\xa4PEPP\xa1\x06\xa4PLPT\x08PLPT\x11O\x04
+K0G\x01\xbc\x03\xbc\x03\x01\x03"\x80\x000G\x01x\x03x\x03\x01\x08"\x80\x000G\x01x\x02x\x02\x01\x08" \x000G\x01\xbc\x03\xbc\x03\x01\x03" \x000G\x01x\x03x\x03\x01\x08" \x000G\x01x\x02x\x02\x01\x08"\x80\x008y\x00\x08PEPP\x116
+30G\x01x\x03x\x03\x01\x08"\x80\x000G\x01x\x02x\x02\x01\x08" \x000G\x01x\x03x\x03\x01\x08" \x000G\x01x\x02x\x02\x01\x08"\x80\x008y\x00\x14H\x0f_SRS\x01\x8ch
+\x02RLIL\x8ch
+\x03RLIH\x8bh
+\x02RLIO\x8bh
+\tRLIQp
+\x01LDN_p
+\x00LDA_pRLILIOLWpRLIHIOHI\xa0\x12RLIQ\x82RLIQ`pv`IRQN\xa1\x08p
+\x00IRQN\xa0 \x93\\PMOD
+\x00\xa0\r\\PDIRp
+\x01PMDS\xa1\x08p
+\x00PMDS\xa1\x1b\xa0\x10\x93\\PMOD
+\x01p
+\x02PMDS\xa1\x08p
+\x03PMDSp
+\x00PPD_p
+\x01LDA_\xa0\x10\x93RLIO\x0bx\x03p
+\x00XPA_\xa11\xa0\x10\x93RLIO\x0bx\x02p
+\x01XPA_\xa1\x1e\xa0\x10\x93RLIO\x0b\xbc\x03p
+\x02XPA_\xa1\x0b[2\x02\x00\x00\x02\x90\x0b\xce\x01p
+\x01XPE_\x14\x1b_PSC\x00p
+\x01LDN_\xa0\x08LDA_\xa4
+\x00\xa1\x04\xa4
+\x03\x14\x14_PS0\x00p
+\x01LDN_p
+\x01LDA_\x14\x14_PS3\x00p
+\x01LDN_p
+\x00LDA_[\x82C2DLPT\x08_UID
+\x01\x14D\x04_STA\x00\xa0\x1c\x92{
+\x08\\/\x04_SB_PCI0LPC_DLPC\x00\xa4
+\x00\xa1\x1f\xa0\x18\x92\x93\\PMOD
+\x03\xa0\x08XPE_\xa4
+\x0f\xa1\x04\xa4
+\r\xa1\x04\xa4
+\x00\x08_HID\x0cA\xd0\x04\x00\x14)_DIS\x00p
+\x00XPE_p
+\x01LDN_p
+\x00IRQNp
+\x00LDA_p
+\x01PPD_\x08PPBF\x11\x10
+\rG\x01\x00\x00\x00\x00\x01\x00"\x00\x00y\x00\x8bPPBF
+\x02LPN0\x8bPPBF
+\x04LPX0\x8cPPBF
+\x07LPL0\x8bPPBF
+\tLPIQ\x14@\x07_CRS\x00\xa0\x0e\x93\\PMOD
+\x03\xa4PPBFp
+\x01LDN_}yIOHI
+\x08\x00IOLW`p`LPN0p`LPX0\xa0\r\x93`\x0b\xbc\x03p
+\x03LPL0\xa1\x08p
+\x08LPL0pIRQN`\xa0\r`y
+\x01IRQNLPIQ\xa1\x08p
+\x00LPIQ\xa4PPBF\x14\x19_PRS\x00\xa0\x0b\\PMOD\xa4PEPP\xa1\x06\xa4PLPT\x08PLPT\x11O\x04
+K0G\x01\xbc\x03\xbc\x03\x01\x03"\x80\x000G\x01x\x03x\x03\x01\x08"\x80\x000G\x01x\x02x\x02\x01\x08" \x000G\x01\xbc\x03\xbc\x03\x01\x03" \x000G\x01x\x03x\x03\x01\x08" \x000G\x01x\x02x\x02\x01\x08"\x80\x008y\x00\x08PEPP\x116
+30G\x01x\x03x\x03\x01\x08"\x80\x000G\x01x\x02x\x02\x01\x08" \x000G\x01x\x03x\x03\x01\x08" \x000G\x01x\x02x\x02\x01\x08"\x80\x008y\x00\x14H\x0f_SRS\x01\x8ch
+\x02RLIL\x8ch
+\x03RLIH\x8bh
+\x02RLIO\x8bh
+\tRLIQp
+\x01LDN_p
+\x00LDA_pRLILIOLWpRLIHIOHI\xa0\x12RLIQ\x82RLIQ`pv`IRQN\xa1\x08p
+\x00IRQN\xa0 \x93\\PMOD
+\x00\xa0\r\\PDIRp
+\x01PMDS\xa1\x08p
+\x00PMDS\xa1\x1b\xa0\x10\x93\\PMOD
+\x01p
+\x02PMDS\xa1\x08p
+\x03PMDSp
+\x00PPD_p
+\x01LDA_\xa0\x10\x93RLIO\x0bx\x03p
+\x00XPA_\xa11\xa0\x10\x93RLIO\x0bx\x02p
+\x01XPA_\xa1\x1e\xa0\x10\x93RLIO\x0b\xbc\x03p
+\x02XPA_\xa1\x0b[2\x02\x00\x00\x02\x90\x0b\xce\x01p
+\x01XPE_\x14\x1b_PSC\x00p
+\x01LDN_\xa0\x08LDA_\xa4
+\x00\xa1\x04\xa4
+\x03\x14\x14_PS0\x00p
+\x01LDN_p
+\x01LDA_\x14\x14_PS3\x00p
+\x01LDN_p
+\x00LDA_[\x82E7LECP\x08_UID
+\x00\x14<_STA\x00\xa0\x16\x93\\/\x03_SB_LCIO_STA
+\x00\xa4
+\x00\xa1\x1e\xa0\x17\x93\\PMOD
+\x03\xa0\x08XPE_\xa4
+\x0f\xa1\x04\xa4
+\r\xa1\x04\xa4
+\x00\x08_HID\x0cA\xd0\x04\x01\x14)_DIS\x00p
+\x00XPE_p
+\x01LDN_p
+\x00IRQNp
+\x00LDA_p
+\x01PPD_\x08EPBF\x11\x1b
+\x18G\x01\x00\x00\x00\x00\x01\x00G\x01\x00\x00\x00\x00\x01\x00"\x00\x00*\x00\x00y\x00\x8bEPBF
+\x02ECN0\x8bEPBF
+\x04ECX0\x8cEPBF
+\x07ECL0\x8bEPBF
+
+ECN1\x8bEPBF
+\x0cECX1\x8cEPBF
+\x0fECL1\x8bEPBF
+\x11ECIQ\x8bEPBF
+\x14ECDQ\x14N
+_CRS\x00\xa0\x0f\x92\x93\\PMOD
+\x03\xa4EPBFp
+\x01LDN_}yIOHI
+\x08\x00IOLW`p`ECN0p`ECX0r`\x0b\x00\x04ECN1r`\x0b\x00\x04ECX1\xa0\x14\x93`\x0b\xbc\x03p
+\x03ECL0p
+\x03ECL1\xa1\x0fp
+\x08ECL0p
+\x08ECL1pIRQN`\xa0\r`y
+\x01IRQNECIQ\xa1\x08p
+\x00ECIQpDMA0`\xa0\r\x95`
+\x04y
+\x01`ECDQ\xa1\x08p
+\x00ECDQ\xa4EPBF\x08_PRS\x11A\t
+\x8d0G\x01x\x03x\x03\x01\x08G\x01x\x07x\x07\x01\x08"\x80\x00*\x0b\x000G\x01x\x02x\x02\x01\x08G\x01x\x06x\x06\x01\x08" \x00*\x0b\x000G\x01\xbc\x03\xbc\x03\x01\x03G\x01\xbc\x07\xbc\x07\x01\x03"\x80\x00*\x0b\x000G\x01x\x03x\x03\x01\x08G\x01x\x07x\x07\x01\x08" \x00*\x0b\x000G\x01x\x02x\x02\x01\x08G\x01x\x06x\x06\x01\x08"\x80\x00*\x0b\x000G\x01\xbc\x03\xbc\x03\x01\x03G\x01\xbc\x07\xbc\x07\x01\x03" \x00*\x0b\x008y\x00\x14A\x0f_SRS\x01\x8ch
+\x02RLIL\x8ch
+\x03RLIH\x8bh
+\x02RLIO\x8bh
+\x11RLIQ\x8ch
+\x14RLDQp
+\x01LDN_p
+\x00LDA_p
+\x07PMDSp
+\x01PERApRLILIOLWpRLIHIOHI\xa0\x12RLIQ\x82RLIQ`pv`IRQN\xa1\x08p
+\x00IRQN\xa0\x16{RLDQ
+\x0f\x00\x82RLDQ`pv`DMA0\xa1\x08p
+\x04DMA0p
+\x00PPD_p
+\x01LDA_\xa0\x10\x93RLIO\x0bx\x03p
+\x00XPA_\xa11\xa0\x10\x93RLIO\x0bx\x02p
+\x01XPA_\xa1\x1e\xa0\x10\x93RLIO\x0b\xbc\x03p
+\x02XPA_\xa1\x0b[2\x02\x00\x00\x02\x90\x0b\x9f\x01p
+\x01XPE_\x14\x1b_PSC\x00p
+\x01LDN_\xa0\x08LDA_\xa4
+\x00\xa1\x04\xa4
+\x03\x14\x14_PS0\x00p
+\x01LDN_p
+\x01LDA_\x14\x14_PS3\x00p
+\x01LDN_p
+\x00LDA_[\x82L7DECP\x08_UID
+\x01\x14C\x04_STA\x00\xa0\x1c\x92{
+\x08\\/\x04_SB_PCI0LPC_DLPC\x00\xa4
+\x00\xa1\x1e\xa0\x17\x93\\PMOD
+\x03\xa0\x08XPE_\xa4
+\x0f\xa1\x04\xa4
+\r\xa1\x04\xa4
+\x00\x08_HID\x0cA\xd0\x04\x01\x14)_DIS\x00p
+\x00XPE_p
+\x01LDN_p
+\x00IRQNp
+\x00LDA_p
+\x01PPD_\x08EPBF\x11\x1b
+\x18G\x01\x00\x00\x00\x00\x01\x00G\x01\x00\x00\x00\x00\x01\x00"\x00\x00*\x00\x00y\x00\x8bEPBF
+\x02ECN0\x8bEPBF
+\x04ECX0\x8cEPBF
+\x07ECL0\x8bEPBF
+
+ECN1\x8bEPBF
+\x0cECX1\x8cEPBF
+\x0fECL1\x8bEPBF
+\x11ECIQ\x8bEPBF
+\x14ECDQ\x14N
+_CRS\x00\xa0\x0f\x92\x93\\PMOD
+\x03\xa4EPBFp
+\x01LDN_}yIOHI
+\x08\x00IOLW`p`ECN0p`ECX0r`\x0b\x00\x04ECN1r`\x0b\x00\x04ECX1\xa0\x14\x93`\x0b\xbc\x03p
+\x03ECL0p
+\x03ECL1\xa1\x0fp
+\x08ECL0p
+\x08ECL1pIRQN`\xa0\r`y
+\x01IRQNECIQ\xa1\x08p
+\x00ECIQpDMA0`\xa0\r\x95`
+\x04y
+\x01`ECDQ\xa1\x08p
+\x00ECDQ\xa4EPBF\x08_PRS\x11A\t
+\x8d0G\x01x\x03x\x03\x01\x08G\x01x\x07x\x07\x01\x08"\x80\x00*\x0b\x000G\x01x\x02x\x02\x01\x08G\x01x\x06x\x06\x01\x08" \x00*\x0b\x000G\x01\xbc\x03\xbc\x03\x01\x03G\x01\xbc\x07\xbc\x07\x01\x03"\x80\x00*\x0b\x000G\x01x\x03x\x03\x01\x08G\x01x\x07x\x07\x01\x08" \x00*\x0b\x000G\x01x\x02x\x02\x01\x08G\x01x\x06x\x06\x01\x08"\x80\x00*\x0b\x000G\x01\xbc\x03\xbc\x03\x01\x03G\x01\xbc\x07\xbc\x07\x01\x03" \x00*\x0b\x008y\x00\x14A\x0f_SRS\x01\x8ch
+\x02RLIL\x8ch
+\x03RLIH\x8bh
+\x02RLIO\x8bh
+\x11RLIQ\x8ch
+\x14RLDQp
+\x01LDN_p
+\x00LDA_p
+\x07PMDSp
+\x01PERApRLILIOLWpRLIHIOHI\xa0\x12RLIQ\x82RLIQ`pv`IRQN\xa1\x08p
+\x00IRQN\xa0\x16{RLDQ
+\x0f\x00\x82RLDQ`pv`DMA0\xa1\x08p
+\x04DMA0p
+\x00PPD_p
+\x01LDA_\xa0\x10\x93RLIO\x0bx\x03p
+\x00XPA_\xa11\xa0\x10\x93RLIO\x0bx\x02p
+\x01XPA_\xa1\x1e\xa0\x10\x93RLIO\x0b\xbc\x03p
+\x02XPA_\xa1\x0b[2\x02\x00\x00\x02\x90\x0b\x9f\x01p
+\x01XPE_\x14\x1b_PSC\x00p
+\x01LDN_\xa0\x08LDA_\xa4
+\x00\xa1\x04\xa4
+\x03\x14\x14_PS0\x00p
+\x01LDN_p
+\x01LDA_\x14\x14_PS3\x00p
+\x01LDN_p
+\x00LDA_\x10#\\/\x04_SB_PCI0LPC_LURT\x08_EJD\r_SB.LCIO\x00\x10#\\/\x04_SB_PCI0LPC_DURT\x08_EJD\r_SB.GDCK\x00\x10#\\/\x04_SB_PCI0LPC_LLPT\x08_EJD\r_SB.LCIO\x00\x10#\\/\x04_SB_PCI0LPC_DLPT\x08_EJD\r_SB.GDCK\x00\x10#\\/\x04_SB_PCI0LPC_LECP\x08_EJD\r_SB.LCIO\x00\x10#\\/\x04_SB_PCI0LPC_DECP\x08_EJD\r_SB.GDCK\x00[\x82H.FIR_\x08_HID\x0c$M\x00q\x08_CID\x0cA\xd0\x05\x11\x14\x1d_STA\x00\xa0\x08HDIR\xa4
+\x00\xa0\x08XU2E\xa4
+\x0f\xa1\x04\xa4
+\r\x14)_DIS\x00p
+\x00XU2Ep
+\x02LDNSp
+\x00RQNSp
+\x00LDASp
+\x01SP2S\x08U2BF\x11\x13
+\x10G\x01\x00\x00\x00\x00\x01\x08"\x00\x00*\x00\x00y\x00\x8bU2BF
+\x02IRMN\x8bU2BF
+\x04IRMX\x8bU2BF
+\tIRIQ\x8cU2BF
+\x0cIRDQ\x14G\x06_CRS\x00p
+\x02LDNS}yOHIS
+\x08\x00OLWS`p`IRMNp`IRMXpRQNS`\xa0\r`y
+\x01RQNSIRIQ\xa1\x08p
+\x00IRIQpMA0S`\xa0\r\x95`
+\x04y
+\x01`IRDQ\xa1\x08p
+\x00IRDQ\xa4U2BF\x08_PRS\x11G\x08
+\x831\x00G\x01\xf8\x02\xf8\x02\x01\x08"\x08\x00*\x0b\x001\x01G\x01\xf8\x03\xf8\x03\x01\x08"\x10\x00*\x0b\x001\x01G\x01\xe8\x02\xe8\x02\x01\x08"\x08\x00*\x0b\x001\x01G\x01\xe8\x03\xe8\x03\x01\x08"\x10\x00*\x0b\x001\x02G\x01\xf8\x02\xf8\x02\x01\x08"\xb0\x00*\x0b\x001\x02G\x01\xf8\x03\xf8\x03\x01\x08"\xa8\x00*\x0b\x001\x02G\x01\xe8\x02\xe8\x02\x01\x08"\xb0\x00*\x0b\x001\x02G\x01\xe8\x03\xe8\x03\x01\x08"\xa8\x00*\x0b\x008y\x00\x14E\x10_SRS\x01\x8ch
+\x02RIIL\x8ch
+\x03RIIH\x8bh
+\x02RIIO\x8bh
+\tRIIQ\x8ch
+\x0cRIDQp
+\x02LDNSp
+\x00LDASpRIILOLWSpRIIHOHIS\xa0\x12RIIQ\x82RIIQ`pv`RQNS\xa1\x08p
+\x00RQNS\xa0\x16{RIDQ
+\x0f\x00\x82RIDQ`pv`MA0S\xa1\x08p
+\x04MA0Sp
+\x04MA1Sp
+\x01SESSp
+\x00SP2Sp
+\x01LDAS\xa0\x10\x93RIIO\x0b\xf8\x03p
+\x00XU2A\xa1E\x04\xa0\x10\x93RIIO\x0b\xf8\x02p
+\x01XU2A\xa11\xa0\x10\x93RIIO\x0b\xe8\x03p
+\x07XU2A\xa1\x1e\xa0\x10\x93RIIO\x0b\xe8\x02p
+\x05XU2A\xa1\x0b[2\x02\x00\x00\x02\x90\x0b\xa4\x01p
+\x01XU2E\x14\x1b_PSC\x00p
+\x02LDNS\xa0\x08LDAS\xa4
+\x00\xa1\x04\xa4
+\x03\x14\x14_PS0\x00p
+\x02LDNSp
+\x01LDAS\x14\x14_PS3\x00p
+\x02LDNSp
+\x00LDAS\x10C\x0e\\/\x03_SB_PCI0LPC_\x14A\rLCON\x01\xa0K
+h\xa0G
+EPWGp
+\x01DLPDp
+\x07DLPC\xa2\x0e\x92{
+\x08DLPC\x00["
+\x01p
+\x01DRST\xa0L\x07\x92\x93SIOD
+\xff}SCF9
+\xa0SCF9\xa2\x0e\x92{
+\x10SCF9\x00["
+\x01}SCF2
+\xebSCF2p
+\x07LDN_{\x0b \x16
+\xff`p`IOLWz\x0b \x16
+\x08`{`
+\xffIOHIp
+\x01LDA_p
+\x01GPPSp
+\x03GPPCp
+\x02GPPSp
+\x03GPPCp
+\x00DUSB\xa1\x1dp
+\x01DUSBp
+\x00DRSTp
+\x00DLPDp
+\x00DLPC[\x82GKTPM_\x08_HID\x0c\x06\x8d\x12\x00\x08_CID\x0cA\xd0\x0c1\x14\x1d_STA\x00\xa0\x0e{\\TPMP
+\x01\x00p
+\x0f`\xa1\x05p
+\x00`\xa4`\x08_CRS\x11\x11
+\x0e\x86\t\x00\x01\x00\x00\xd4\xfe\x00\x10\x00\x00y\x00\x14GF_DSM\x0c\x08TMPB\x11\x05
+\x02\x00\x00\x8cTMPB
+\x00LPCT\x8cTMPB
+\x01SSUM\x08LRSP
+\x00\x08PPRC
+\x00\x08RQS1\x12\x06\x02
+\x0c
+\r\x08PTOP\x12\x06\x02
+\x00
+\x00\x08RTOP\x12\x08\x03
+\x00
+\x00
+\x00\x8ah
+\x00IID0\x8ah
+\x04IID1\x8ah
+\x08IID2\x8ah
+\x0cIID3\x08UID0\x11\x13
+\x10\xa6\xfa\xdd=\x1b6\xb4N\xa4$\x8d\x10\x08\x9d\x16S\x8aUID0
+\x00EID0\x8aUID0
+\x04EID1\x8aUID0
+\x08EID2\x8aUID0
+\x0cEID3\xa0I,\x90\x90\x93IID0EID0\x93IID1EID1\x90\x93IID2EID2\x93IID3EID3\xa0\x0b\x93j
+\x00\xa4\x11\x04
+\x01?\xa0\x0b\x93j
+\x01\xa4\r1.0\x00\xa0L\x1c\x93j
+\x02p
+\x00PPRCTPHY
+\x00p\\PH02LPCT\xa0@\x1aLPCTp
+\x00SSUMrSSUM\\PH01SSUMrSSUM\\PH02SSUMrSSUM\\PH03SSUMrSSUM\\PH04SSUMrSSUM\\PH05SSUMrSSUM\\PH06SSUMrSSUM\\PH07SSUMrSSUM\\PH08SSUMrSSUM\\PH09SSUMrSSUM\\PH0ASSUMrSSUM\\PH0BSSUM\xa0\x0cSSUMp
+\x02PPRC\xa1K\x0ep\x83\x88k
+\x00\x00\\PH04p\x89RQS1\x01\\PH04\x00
+\x00
+\x00`\xa0\x0c\x92\x93`\xffp
+\x01PPRC\xa1M\x0bp
+\x00\\PH03p
+\x00SSUMrSSUM\\PH01SSUMrSSUM\\PH02SSUMrSSUM\\PH03SSUMrSSUM\\PH04SSUMrSSUM\\PH05SSUMrSSUM\\PH06SSUMrSSUM\\PH07SSUMrSSUM\\PH08SSUMrSSUM\\PH09SSUMrSSUM\\PH0ASSUMrSSUM\\PH0BSSUMt
+\x00SSUM\\PH03TPHY
+\x01\xa1\x08p
+\x02PPRC\xa4PPRC\xa0\x1e\x93j
+\x03TPHY
+\x00p\\PH04\x88PTOP
+\x01\x00\xa4PTOP\xa0\x08\x93j
+\x04\xa4
+\x01\xa0I\x08\x93j
+\x05TPHY
+\x00p\\PH07`p\\PH06LRSPp}y`
+\x08`LRSP\x00LRSP\xa0\x1c\x90\x93\\PH06
+\xf0\x93\\PH07
+\xffp\x0c\xf0\xff\xff\xffLRSP\xa1\x1e\xa0\x1c\x90\x93\\PH06
+\xf1\x93\\PH07
+\xffp\x0c\xf1\xff\xff\xffLRSPpLRSP\x88RTOP
+\x02\x00p\\PH05\x88RTOP
+\x01\x00\xa4RTOP\xa0\x08\x93j
+\x06\xa4
+\x02\x08UID1\x11\x13
+\x10\xedT`7\x13\xccuF\x90\x1cGV\xd7\xf2\xd4]\x8aUID1
+\x00EID4\x8aUID1
+\x04EID5\x8aUID1
+\x08EID6\x8aUID1
+\x0cEID7\xa0@\t\x90\x90\x93IID0EID4\x93IID1EID5\x90\x93IID2EID6\x93IID3EID7pj[1pk[1\xa0\x0b\x93j
+\x00\xa4\x11\x04
+\x01\x01\xa0O\x04\x93j
+\x01\xa0\x12\x93\x83\x88k
+\x00\x00
+\x00p
+\x00\\TCG0\xa0\x12\x93\x83\x88k
+\x00\x00
+\x01p
+\x01\\TCG0\xa0\x0f\x93\\TCG0
+\x00TMOR
+\x00\xa0\x0f\x93\\TCG0
+\x01TMOR
+\x01\xa4
+\x00\xa4
+\x01\xa4\x11\x04
+\x01\x00[\x80TSES\x00\x0c\x00\x00\xe8\xff\x0b\x00\x02[\x81F\x08TSES\x01\x00@\x06TSCM\x08\x00@(TCT0\x08TCT1\x08TCT2\x08\x00@\x05TMT0\x08\x00H\x04TMT1\x08\x00H\x04TMT2\x08\x00HzTLD0\x08TLD1\x08TLD2\x08TLDL\x18TLDB\x18TLDS\x10TSB0\x08TSB1\x08TSB2\x08TSBL\x08TSBBH\x04TSBF\x10TSBC\x10\x00@\x1aTSIM\x08[\x81\x0fTSES\x01\x00H.TCTAH\x11[\x81\x0fTSES\x01\x00@\xbaTCTLH\x05[\x81\x0fTSES\x01\x00H\xbfTCTBH\x08\x148TCSZ\x02\xa01\x92\x93TSCM
+\x12\xa0\x0b\x93
+\x01hpiTCZ1\xa1\x1b\xa0\x0b\x93
+\x02hpiTCZ2\xa1\r\xa0\x0b\x93
+\x03hpiTCZ3\x14I\x0cTCST\x02\xa0A\x0c\x92\x93TSCM
+\x12p
+\x00`\xa0\x1e\x93
+\x01h\xa0\x18\x94iTMT0p
+\x04TSIMpiTMT0p
+\x01`\xa1B\x04\xa0\x1e\x93
+\x02h\xa0\x18\x94iTMT1p
+\x04TSIMpiTMT1p
+\x01`\xa1 \xa0\x1e\x93
+\x03h\xa0\x18\x94iTMT2p
+\x04TSIMpiTMT2p
+\x01`\xa0@\x05`p
+\x00TCT2\x08TCTC\x11\x03
+#pTCTATCTCp
+"cp
+\x00a\xa2\x12cp\x83\x88TCTCc\x00brabavcp\x80a\x00bub{b
+\xffapaTCT2p
+\xfeTSIM\x14I\x08TCBS\x04\xa0A\x08\x92\x93TSCM
+\x12\xa0F\x07\x93{h
+\x07\x00
+\x00p
+\x12TSIMphTSBLpiTSBBpjTSBFpkTSBCp
+\x00TSB2\x08TCTD\x11\x03
+#pTCTBTCTDp
+\x10`p
+\x00a\xa2\x12`p\x83\x88TCTD`\x00brabav`p\x80a\x00bub{b
+\xffapaTSB2p
+\xfeTSIM\x14@\x07TSCL\x02\xa0H\x06\x92\x93TSCM
+\x12p
+\x15TSIMrTLDSiTLDSp
+\x00TLD2\x08TLDD\x11\x03
+\x0bpTCTLTLDDp
+
+`p
+\x00a\xa2\x12`p\x83\x88TLDD`\x00brabav`p\x80a\x00bub{b
+\xffapaTLD2p
+\xfeTSIM[\x82\x8e\x00\x02EC__\x08_HID\x0cA\xd0\x0c\t\x08_UID
+\x00\x08_GPE
+\x1c\x14\x13_REG\x02\xa0\x0c\x93h
+\x03pi\\H8DR[\x80ECOR\x03
+\x00\x0b\x00\x01[\x81J+ECOR\x01HDBM\x01\x00\x01\x00\x01HFNE\x01\x00\x01\x00\x01HLDM\x01\x00\x01\x00\x01BTCM\x01\x00\x01\x00\x01\x00\x01HBPR\x01BTPC\x01\x00\x01HDUE\x01\x00\x07\x00\x01HETE\x01\x00\x0eHSPA\x01\x00\x07HSUN\x08HSRP\x08\x00 HLCL\x08\x00\x08HFNS\x02\x00\x06\x00\x04HAAA\x03\x00\x01HAM0\x08HAM1\x08HAM2\x08HAM3\x08HAM4\x08HAM5\x08HAM6\x08HAM7\x08HAM8\x08HAM9\x08HAMA\x08HAMB\x08HAMC\x08HAMD\x08HAME\x08HAMF\x08HT00\x01HT01\x01HT02\x01HT03\x01HT10\x01HT11\x01HT12\x01HT13\x01\x00\x10HANT\x08\x00\x10\x00\x01\x00\x01HANA\x02\x00\x01\x00\x01\x00\x1aHATR\x08HT0H\x08HT0L\x08HT1H\x08HT1L\x08HFSP\x08\x00\x06HMUT\x01\x00\x01HBRV\x08HWPM\x01HWLB\x01HWLO\x01HWDK\x01HWFN\x01HWBT\x01HWRI\x01HWBU\x01HWLU\x01\x00\x07\x00\x07HPLO\x01\x00\x08\x00\x10HB0S\x07HB0A\x01HB1S\x07HB1A\x01HCMU\x01\x00\x02OVRQ\x01DCBD\x01DCWL\x01DCWW\x01HB1I\x01\x00\x01KBLT\x01BTPW\x01BTDT\x01HUBS\x01BDPW\x01BDDT\x01HUBB\x01\x00@\x05\x00\x01BTWK\x01HPLD\x01\x00\x01HPAC\x01BTST\x01\x00\x02HPBU\x01\x00\x01HBID\x04HBCS\x01HPNF\x01\x00\x01GSTS\x01\x00\x02HLBU\x01BDST\x01HCBL\x01\x00)HWAK\x10HMPR\x08HMST\x05\x00\x02HMDN\x01HMAD\x08HMCM\x08\x00@\x10HMBC\x08\x00\x18TMP0\x08TMP1\x08TMP2\x08TMP3\x08TMP4\x08TMP5\x08TMP6\x08TMP7\x08\x00\x08HIID\x08\x00\x08HFNI\x08\x00 HDEC\x08HDEO\x08\x00\x18HDAA\x03HDAB\x03HDAC\x02\x00@\x11HDEN HDEP HDEM\x08HDES\x08\x00@\x07ATMX\x08HWAT\x08\x00H\x11\x00\x04HDDD\x01\x14A\x04_INI\x00\xa0\r\\H8DRp
+\x00HSPA\xa1\x0c\\MBEC
+\x05
+\xfe
+\x00BINI\\/\x06_SB_PCI0LPC_EC__HKEYWGIN\x08_CRS\x11\x15
+\x12G\x01b\x00b\x00\x01\x01G\x01f\x00f\x00\x01\x01y\x00\x14!LED_\x02}hi`\xa0\x0c\\H8DRp`HLCL\xa1\t\\WBEC
+\x0c`\x08BAON
+\x00\x08WBON
+\x00\x14N\x18BEEP\x01\xa0\x0c\x93h
+\x05p
+\x00WBONpWBONb\xa0O\x04BAON\xa0$\x93h
+\x00p
+\x00BAON\xa0\rWBONp
+\x03`p
+\x08a\xa1\tp
+\x00`p
+\x00a\xa1#p
+\xff`p
+\xffa\xa0\x0c\x93h
+\x11p
+\x00WBON\xa0\x0c\x93h
+\x10p
+\x01WBON\xa1G\x04ph`p
+\xffa\xa0\x13\x93h
+\x0fph`p
+\x08ap
+\x01BAON\xa0\x14\x93h
+\x11p
+\x00`p
+\x00ap
+\x00WBON\xa0\x14\x93h
+\x10p
+\x03`p
+\x08ap
+\x01WBON\xa02\x93h
+\x03p
+\x00WBON\xa0%bp
+\x07`\xa0\x1e\x91\x93\\SPS_
+\x03\x93\\SPS_
+\x04p
+\x00bp
+\xff`p
+\xffa\xa0\x14\x93h
+\x07\xa0\x0ebp
+\x00bp
+\xff`p
+\xffa\xa0C\x04\x90\\H8DR\x92\\W98F\xa0\x1a\x90b\x92WBONp
+\x00HSRPp
+\x00HSUN["
+d\xa0\x0c\x92\x93a
+\xffpaHSRP\xa0\x0c\x92\x93`
+\xffp`HSUN\xa1>\xa0\x1e\x90b\x92WBON\\WBEC
+\x07
+\x00\\WBEC
+\x06
+\x00["
+d\xa0\x0e\x92\x93a
+\xff\\WBEC
+\x07a\xa0\x0e\x92\x93`
+\xff\\WBEC
+\x06`\xa0\x05\x93h
+\x03\xa0
+\x93h
+\x07["\x0b\xf4\x01\x14C\tEVNT\x01\xa07\\H8DR\xa0\x18h}HAM7
+\x01HAM7}HAM5
+\x04HAM5\xa1\x17{HAM7
+\xfeHAM7{HAM5
+\xfbHAM5\xa1C\x05\xa0(h\\MBEC
+\x17
+\xff
+\x01\\MBEC
+\x15
+\xff
+\x04\xa0\x0f\\W98F\\WBEC
+\x18
+\xff\xa1\'\\MBEC
+\x17
+\xfe
+\x00\\MBEC
+\x15
+\xfb
+\x00\xa0\x0f\\W98F\\WBEC
+\x18
+\x00\x14K\x07PNST\x01\xa0=\x90hBSTA
+\x02\xa0\x1b\x90\\H8DR\x92\\W98Fp
+\x01HBPRp
+\x01HUBB\xa1\x17\\MBEC
+\x01
+\xff
+ \\MBEC
+;
+\xff
+\x80\xa15\xa0\x1b\x90\\H8DR\x92\\W98Fp
+\x00HBPRp
+\x00HUBB\xa1\x17\\MBEC
+\x01
+\xdf
+\x00\\MBEC
+;
+\x7f
+\x00[\x84I\x07PUBS\x03\x00\x00\x14+_STA\x00\xa0\x0c\\H8DRpHUBS`\xa1\x0c{\\RBEC
+;
+\x10`\xa0\x05`\xa4
+\x01\xa1\x04\xa4
+\x00\x14!_ON_\x00\xa0\r\\H8DRp
+\x01HUBS\xa1\x0c\\MBEC
+;
+\xff
+\x10\x14!_OFF\x00\xa0\r\\H8DRp
+\x00HUBS\xa1\x0c\\MBEC
+;
+\xef
+\x00\x14E\x0fLPMD\x00p
+\x00`p
+\x00ap
+\x00b\xa0B\x06\\H8DR\xa0J\x05HPLO\xa0J\x04HPAC\xa0C\x04\x95HWAT
+Z\xa0\x16\x91\x92HB0A\x95{HB0S
+\x0f\x00
+\x03p
+\x01a\xa0\x16\x91\x92HB1A\x95{HB1S
+\x0f\x00
+\x03p
+\x01b\xa0\x0b\x90abp\\LPST`\xa1\x08p\\LPST`\xa1L\x07\xa0I\x07{\\RBEC
+4
+\x80\x00\xa0B\x06{\\RBEC
+F
+\x10\x00\xa0D\x05\x95\\RBEC
+\xc9
+Zp\\RBEC
+8c\xa0\x14\x91\x92{c
+\x80\x00\x95{c
+\x0f\x00
+\x03p
+\x01ap\\RBEC
+9c\xa0\x14\x91\x92{c
+\x80\x00\x95{c
+\x0f\x00
+\x03p
+\x01b\xa0\x0b\x90abp\\LPST`\xa1\x08p\\LPST`\xa4`[\x01MCPU\x07\x14D\x04_Q10\x00\xa0<\\/\x06_SB_PCI0LPC_EC__HKEYMHKK
+\x01\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x01\x10\x14G\x04_Q11\x00\xa0<\\/\x06_SB_PCI0LPC_EC__HKEYMHKK
+\x02\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x02\x10\xa1\x02\xa3\x14$_Q12\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x03\x10\x14A\x05_Q13\x00\xa0:\\/\x06_SB_PCI0LPC_EC__HKEYDHKC\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x04\x10\xa1\x0e\x86\\._SB_SLPB
+\x80\x14M\x10_Q64\x00\xa0<\\/\x06_SB_PCI0LPC_EC__HKEYMHKK
+\x10\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x05\x10\xa1H\x0c\xa0>\x92{\\/\x06_SB_PCI0LPC_EC__HKEYWGFL
+ \x00\\/\x06_SB_PCI0LPC_EC__HKEYBPWC
+\x01\xa1F\x08\\/\x06_SB_PCI0LPC_EC__HKEYBPWC
+\x00\xa0F\x06\x92\\WVIS\xa0>\x92{\\/\x06_SB_PCI0LPC_EC__HKEYWGFL
+\x02\x00\\/\x06_SB_PCI0LPC_EC__HKEYWPWC
+\x01\xa1\x1e\\/\x06_SB_PCI0LPC_EC__HKEYWPWC
+\x00\x14D\x04_Q65\x00\xa0<\\/\x06_SB_PCI0LPC_EC__HKEYMHKK
+ \\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x06\x10\x14C
+_Q16\x00\xa0\'\\VPDFp
+\x00\\VPDF\xa0\x18VIGD\\/\x04_SB_PCI0VID_VSPD\xa1C\x07\xa0<\\/\x06_SB_PCI0LPC_EC__HKEYMHKK
+@\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x07\x10\xa13\xa0\x18VIGD\\/\x04_SB_PCI0VID_VSWT\xa1\x18\\/\x05_SB_PCI0AGP_VID_VSWT\x14B\x05_Q17\x00\xa0<\\/\x06_SB_PCI0LPC_EC__HKEYMHKK
+\x80\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x08\x10\xa1\r\xa0\x0b\x92\\WNTFVEXP\x14F\x04_Q18\x00\xa0=\\/\x06_SB_PCI0LPC_EC__HKEYMHKK\x0b\x00\x01\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\t\x10\xa3\x14E\x04_Q66\x00\xa0=\\/\x06_SB_PCI0LPC_EC__HKEYMHKK\x0b\x00\x02\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b
+\x10\x14E\x04_Q1A\x00\xa0=\\/\x06_SB_PCI0LPC_EC__HKEYMHKK\x0b\x00\x04\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x0b\x10\x14$_Q1B\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x0c\x10\x14E\x04_Q62\x00\xa0=\\/\x06_SB_PCI0LPC_EC__HKEYMHKK\x0b\x00\x10\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\r\x10\x14E\x04_Q60\x00\xa0=\\/\x06_SB_PCI0LPC_EC__HKEYMHKK\x0b\x00 \\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x0e\x10\x14E\x04_Q61\x00\xa0=\\/\x06_SB_PCI0LPC_EC__HKEYMHKK\x0b\x00@\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x0f\x10\x14N\x04_Q1F\x00\xa0?\\/\x06_SB_PCI0LPC_EC__HKEYMHKK\x0c\x00\x00\x02\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x12\x10\\UCMS
+\x0e\x14G\x04_Q67\x00\xa0?\\/\x06_SB_PCI0LPC_EC__HKEYMHKK\x0c\x00\x00\x04\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x13\x10\x14O\x0e_Q26\x00\\UCMS
+\x12DSPD
+\x00["\x0b\xf4\x01\x86AC__
+\x80\x86\\._TZ_THM0
+\x80\x86\\._TZ_THM1
+\x80\xa0\x0e\\WXPF[#MCPU\xff\xff\xa07\\SPEN\xa0\'\\OSPX\x86\\._PR_CPU0
+\x80\xa0\x13\\MPEN\x86\\._PR_CPU1
+\x80\xa1\x08\\STEP
+\x00\xa0
+\\WXPF["
+d\xa0\'\\OSC4\x86\\._PR_CPU0
+\x81\xa0\x13\\MPEN\x86\\._PR_CPU1
+\x81\xa0\x0c\\WXPF[\'MCPU\xa0#\x90\x92\\WXPF\\WNTFp
+\x00\\/\x04_SB_PCI0LPC_C4C3ATMCDSPD
+\x01\x14K\x12_Q27\x00\\UCMS
+\x12["\x0b\xf4\x01\x86AC__
+\x80\x86\\._TZ_THM0
+\x80\x86\\._TZ_THM1
+\x80\xa0\x0e\\WXPF[#MCPU\xff\xff\xa07\\SPEN\xa0\'\\OSPX\x86\\._PR_CPU0
+\x80\xa0\x13\\MPEN\x86\\._PR_CPU1
+\x80\xa1\x08\\STEP
+\x01\xa0
+\\WXPF["
+d\xa0\'\\OSC4\x86\\._PR_CPU0
+\x81\xa0\x13\\MPEN\x86\\._PR_CPU1
+\x81\xa0\x0c\\WXPF[\'MCPU\xa01\x90\\CWAC\x92\\CWAS\xa0#\x90\x92\\WXPF\\WNTFp
+\x01\\/\x04_SB_PCI0LPC_C4C3ATMC\xa09\x91\x93\\/\x03_SB_GDCKGDID\x0c$M\x00L\x93\\/\x03_SB_GDCKGDID\x0c$M\x00D\x86\\._SB_GDCK
+\x01\x14H\x06_Q2A\x00\xa0\x1aVIGD\\/\x04_SB_PCI0VID_VLOC
+\x01\xa1\x1a\\/\x05_SB_PCI0AGP_VID_VLOC
+\x01\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x02P\x86\\._SB_LID_
+\x80\x148_Q2B\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x01P\\UCMS
+\r\x86\\._SB_LID_
+\x80\x14\x06_Q3D\x00\x14>_Q48\x00\xa07\\SPEN\xa0\'\\OSPX\x86\\._PR_CPU0
+\x80\xa0\x13\\MPEN\x86\\._PR_CPU1
+\x80\xa1\x08\\STEP
+\x04\x14>_Q49\x00\xa07\\SPEN\xa0\'\\OSPX\x86\\._PR_CPU0
+\x80\xa0\x13\\MPEN\x86\\._PR_CPU1
+\x80\xa1\x08\\STEP
+\x05\x14\x10_Q7F\x00[2\x01\x00\x00\x01\x80\x0b+\x03\x14$_Q4E\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x11`\x14$_Q4F\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x12`\x14\x1d_Q75\x00\\/\x05_SB_PCI0LPC_EC__TATR\x14$_Q46\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x12`\x14 _Q22\x00\xa0\x0cHB0A\x86BAT0
+\x80\xa0\x0cHB1A\x86BAT1
+\x80\x14\r_Q4A\x00\x86BAT0
+\x81\x14\r_Q4B\x00\x86BAT0
+\x80\x14
+_Q4C\x00_Q38\x14%_Q4D\x00\xa0\x1e{^.BAT1B1ST^.BAT1XB1S\x00\x86BAT1
+\x80\x14\r_Q24\x00\x86BAT0
+\x80\x14%_Q25\x00\xa0\x1e{^.BAT1B1ST^.BAT1XB1S\x00\x86BAT1
+\x80[\x811ECOR\x01\x00@PSBRC\x10SBFC\x10SBAE\x10SBRS\x10SBAC\x10SBVO\x10SBAF\x10SBBS\x10[\x81\x1aECOR\x01\x00@P\x00\x0fSBCM\x01SBMD\x10SBCC\x10[\x81\'ECOR\x01\x00@PSBDC\x10SBDV\x10SBOM\x10SBSI\x10SBDT\x10SBSN\x10[\x81\x0eECOR\x01\x00@PSBCH [\x81\x0fECOR\x01\x00@PSBMN@\x08[\x81\x0fECOR\x01\x00@PSBDN@\x08[\x01BATM\x07\x14C\x16GBIF\x03[#BATM\xff\xff\xa0C\x12j}h
+\x01HIIDpSBCMg\x7fg
+\x01\x88i
+\x00\x00phHIID\xa0
+gwSBFC
+
+a\xa1\x07pSBFCapa\x88i
+\x02\x00}h
+\x02HIID\xa0
+gwSBDC
+
+`\xa1\x07pSBDC`p`\x88i
+\x01\x00xa
+\x14b\x88i
+\x05\x00\xa0
+gp
+\xc8\x88i
+\x06\x00\xa1!\xa0\x15SBDVx\x0c@\r\x03\x00SBDVb\x88i
+\x06\x00\xa1\tp
+\x00\x88i
+\x06\x00pSBDV\x88i
+\x04\x00pSBSN`\x08SERN\x11\t
+\x06     \x00p
+\x04b\xa2\x15`x`
+
+a`ra
+0\x88SERNb\x00vbpSERN\x88i
+
+\x00}h
+\x06HIIDpSBDN\x88i
+\t\x00}h
+\x04HIID\x08BTYP\x11\x08
+\x05\x00\x00\x00\x00\x00pSBCHBTYPpBTYP\x88i
+\x0b\x00}h
+\x05HIIDpSBMN\x88i
+\x0c\x00\xa1\'p\x0c\xff\xff\xff\xff\x88i
+\x01\x00p
+\x00\x88i
+\x05\x00p
+\x00\x88i
+\x06\x00p\x0c\xff\xff\xff\xff\x88i
+\x02\x00[\'BATM\xa4i\x14J\rGBST\x04[#BATM\xff\xff\xa0
+{i
+ \x00p
+\x02`\xa1\x12\xa0
+{i
+@\x00p
+\x01`\xa1\x05p
+\x00`\xa0\x06{i
+\x0f\x00\xa1\x06}`
+\x04`\xa0\x19\x93{i
+\x0f\x00
+\x0fp
+\x04`p
+\x00ap
+\x00bp
+\x00c\xa1@\x06phHIIDpSBVOc\xa0
+jwSBRC
+
+b\xa1\x07pSBRCbpSBACa\xa0\x1c\x92\x95a\x0b\x00\x80\xa0\x0e{`
+\x01\x00t\x0c\x00\x00\x01\x00aa\xa1\x05p
+\x00a\xa1\r\xa0\x0b\x92{`
+\x02\x00p
+\x00a\xa0\rjwcaaxa\x0b\xe8\x03gap`\x88k
+\x00\x00pa\x88k
+\x01\x00pb\x88k
+\x02\x00pc\x88k
+\x03\x00[\'BATM\xa4k[\x82G\x15BAT0\x08_HID\x0cA\xd0\x0c
+\x08_UID
+\x00\x08_PCL\x12\x07\x01\\_SB_\x08B0ST
+\x00\x08BT0I\x12#\r
+\x00\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff
+\x01\x0b0*
+\x00
+\x00
+\x01
+\x01\r\x00\r\x00\r\x00\r\x00\x08BT0P\x12\x02\x04\x14D\x04_STA\x00\xa0\x0f\\H8DRpHB0AB0ST\xa1\x1e\xa0\x13{\\RBEC
+8
+\x80\x00p
+\x01B0ST\xa1\x08p
+\x00B0ST\xa0\x08B0ST\xa4
+\x1f\xa1\x04\xa4
+\x0f\x14G\x04_BIF\x00p
+\x00gp
+
+f\xa2+\x90\x92gf\xa0\x1fHB0A\xa0\x13\x93{HB0S
+\x0f\x00
+\x0f["\x0b\xe8\x03vf\xa1\x05p
+\x01g\xa1\x05p
+\x00f\xa4GBIF
+\x00BT0Ig\x14#_BST\x00\x7f\x83\x88BT0I
+\x00\x00
+\x01`\xa4GBST
+\x00HB0S`BT0P\x14I\x04_BTP\x01{HAM4
+\xefHAM4\xa06hpha\xa0\x11\x92\x83\x88BT0I
+\x00\x00xa
+
+`a{a
+\xffHT0L{za
+\x08\x00
+\xffHT0H}HAM4
+\x10HAM4[\x82A\x18BAT1\x08_HID\x0cA\xd0\x0c
+\x08_UID
+\x01\x08_PCL\x12\x07\x01\\_SB_\x08B1ST
+\x00\x08XB1S
+\x01\x08BT1I\x12#\r
+\x00\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff
+\x01\x0b0*
+\x00
+\x00
+\x01
+\x01\r\x00\r\x00\r\x00\r\x00\x08BT1P\x12\x02\x04\x14G\x06_STA\x00\xa0\x0f\\H8DRpHB1AB1ST\xa1\x1e\xa0\x13{\\RBEC
+9
+\x80\x00p
+\x01B1ST\xa1\x08p
+\x00B1ST\xa0\x1fB1ST\xa0\x08XB1S\xa4
+\x1f\xa1\x10\xa0\t\\WNTF\xa4
+\x00\xa1\x04\xa4
+\x1f\xa1\x10\xa0\t\\WNTF\xa4
+\x00\xa1\x04\xa4
+\x0f\x14G\x04_BIF\x00p
+\x00gp
+
+f\xa2+\x90\x92gf\xa0\x1fHB1A\xa0\x13\x93{HB1S
+\x0f\x00
+\x0f["\x0b\xe8\x03vf\xa1\x05p
+\x01g\xa1\x05p
+\x00f\xa4GBIF
+\x10BT1Ig\x14#_BST\x00\x7f\x83\x88BT1I
+\x00\x00
+\x01`\xa4GBST
+\x10HB1S`BT1P\x14I\x04_BTP\x01{HAM4
+\xdfHAM4\xa06hpha\xa0\x11\x92\x83\x88BT1I
+\x00\x00xa
+
+`a{a
+\xffHT1L{za
+\x08\x00
+\xffHT1H}HAM4
+ HAM4[\x82>AC__\x08_HID\rACPI0003\x00\x08_UID
+\x00\x08_PCL\x12\x07\x01\\_SB_\x14\x0b_PSR\x00\xa4HPAC\x14\t_STA\x00\xa4
+\x0f[\x82IQHKEY\x08_HID\x0c$M\x00h\x14\t_STA\x00\xa4
+\x0f\x14
+MHKV\x00\xa4\x0b\x00\x01\x08DHKC
+\x00\x08DHKB
+\x01[\x01XDHK\x07\x08DHKH
+\x00\x08DHKW
+\x00\x08DHKS
+\x00\x08DHKD
+\x00\x08DHKN\x0b\x0c\x08\x08DHKT
+\x00\x08DHWW
+\x00\x14\x0cMHKA\x00\xa4\x0c\xff\xff\xff\x00\x14\x0bMHKN\x00\xa4DHKN\x14\x18MHKK\x01\xa0\rDHKC\xa4{DHKNh\x00\xa1\x03\xa4\x00\x14@\x05MHKM\x02[#XDHK\xff\xff\xa0\x06\x94h
+ \xa3\xa13y\x01vh`\xa0){`\x0c\xff\xff\xff\x00\x00\xa0\x0ci}`DHKNDHKN\xa1\x12{DHKN\x7f`\x0c\xff\xff\xff\xff\x00DHKN\xa1\x02\xa3[\'XDHK\x14\x13MHKS\x00\x86\\._SB_SLPB
+\x80\x14\x0cMHKC\x01phDHKC\x14I\x08MHKP\x00[#XDHK\xff\xff\xa0\x11DHWWpDHWWap\x00DHWW\xa1O\x05\xa0\x11DHKWpDHKWap\x00DHKW\xa1J\x04\xa0\x11DHKDpDHKDap\x00DHKD\xa15\xa0\x11DHKSpDHKSap\x00DHKS\xa1!\xa0\x11DHKTpDHKTap\x00DHKT\xa1\rpDHKHap\x00DHKH[\'XDHK\xa4a\x14>MHKE\x01phDHKB[#XDHK\xff\xffp\x00DHKHp\x00DHKWp\x00DHKSp\x00DHKDp\x00DHKTp\x00DHWW[\'XDHK\x14E\x0bMHKQ\x01\xa0M
+DHKB\xa0@\tDHKC[#XDHK\xff\xff\xa0\x06\x95h\x0b\x00\x10\xa1M\x06\xa0\x0c\x95h\x0b\x00 phDHKH\xa1M\x05\xa0\x0c\x95h\x0b\x000phDHKW\xa1M\x04\xa0\x0c\x95h\x0b\x00@phDHKS\xa1=\xa0\x0c\x95h\x0b\x00PphDHKD\xa1.\xa0\x0c\x95h\x0b\x00`phDHKH\xa1\x1f\xa0\x0c\x95h\x0b\x00pphDHKT\xa1\x10\xa0\x0c\x95h\x0b\x00\x80phDHWW\xa1\x01[\'XDHK\x86HKEY
+\x80\xa1\x15\xa0\x13\x93h\x0b\x04\x10\x86\\._SB_SLPB
+\x80\x14I\x05MHKB\x01\xa0&\x93h
+\x00\\/\x05_SB_PCI0LPC_EC__BEEP
+\x11p
+\x00\\LIDB\xa1*\xa0&\x93h
+\x01\\/\x05_SB_PCI0LPC_EC__BEEP
+\x10p
+\x01\\LIDB\xa1\x01\x14<MHKD\x00\xa0\x1aVIGD\\/\x04_SB_PCI0VID_VLOC
+\x00\xa1\x1a\\/\x05_SB_PCI0AGP_VID_VLOC
+\x00\x14>MHQC\x01\xa01\\WNTF\xa0\x0b\x93h
+\x00\xa4\\CWAC\xa1\x1e\xa0\x0b\x93h
+\x01\xa4\\CWAP\xa1\x10\xa0\x0b\x93h
+\x02\xa4\\CWAT\xa1\x02\xa3\xa1\x02\xa3\xa4
+\x00\x14A\x08MHGC\x00\xa0C\x07\\WNTF[#XDHK\xff\xff\xa0:\\OSC4\xa0 \\/\x06_SB_PCI0LPC_EC__AC___PSRp
+\x03`\xa1\x12\xa0
+\\C4NAp
+\x03`\xa1\x05p
+\x04`\xa1 \xa0\x18\\/\x04_SB_PCI0LPC_C4C3p
+\x04`\xa1\x05p
+\x03`[\'XDHK\xa4`\xa1\x02\xa3\xa4
+\x00\x14A\x13MHSC\x01\xa0F\x12\x90\\CWAC\\WNTF[#XDHK\xff\xff\xa0J\x08\\OSC4\xa0>\x93h
+\x03\xa08\x92\\CWAS\x86\\._PR_CPU0
+\x81\xa0\x13\\MPEN\x86\\._PR_CPU1
+\x81p
+\x01\\CWASp
+\x01\\C4NA\xa1C\x04\xa0=\x93h
+\x04\xa07\\CWAS\x86\\._PR_CPU0
+\x81\xa0\x13\\MPEN\x86\\._PR_CPU1
+\x81p
+\x00\\CWASp
+\x00\\C4NA\xa1\x02\xa3\xa1O\x07\xa0+\x93h
+\x03\xa0%\x92\\CWASp
+\x00\\/\x04_SB_PCI0LPC_C4C3p
+\x01\\CWAS\xa1@\x05\xa0J\x04\x93h
+\x04\xa0C\x04\\CWAS\xa03\x92\\/\x06_SB_PCI0LPC_EC__AC___PSRp
+\x01\\/\x04_SB_PCI0LPC_C4C3p
+\x00\\CWAS\xa1\x02\xa3[\'XDHK\xa1\x02\xa3\x10G\x14\\/\x05_SB_PCI0LPC_EC__HKEY\x14M\x04TDSC\x01p
+\x01`\xa2\x1b`p\\/\x05_SB_PCI0LPC_EC__HANT`ph\\/\x05_SB_PCI0LPC_EC__HANT\xa0\x0c\x93h
+!\\ATCC
+\x00\x14\x0cTDSS\x01\\ATCCh\x14N\x08TDSG\x01{h
+\xff`p`\\/\x05_SB_PCI0LPC_EC__HDAAzh
+\x08`{`
+\xffapa\\/\x05_SB_PCI0LPC_EC__HDABzh
+\x10`{`
+\xffapa\\/\x05_SB_PCI0LPC_EC__HDACzh
+\x18`{`
+\xffapa\\/\x05_SB_PCI0LPC_EC__HANA\x14!TDGC\x00p\\/\x05_SB_PCI0LPC_EC__HDDD`\xa4`\x14!TDGS\x00p\\/\x05_SB_PCI0LPC_EC__HAAA`\xa4`[\x81\x18ECOR\x11\x00@*HSD0\x08HSD1\x08HSD2\x08[\x81\x0eECOR\x11\x00@+HSDL\x10[\x81\x19ECOR\x11\x00@+HSDBH\x04HSDF\x10HSDC\x10[\x01I2CM\x07\x14?CHKS\x00p\x0b\xe8\x03`\xa2\x13HMPR["
+\x01v`\xa0\x07\x92`\xa4\x0b\x80\x80\xa0\x19HMDN\xa0\x0fHMST\xa4}\x0b\x00\x80HMST\x00\xa1\x03\xa4\x00\xa1\x05\xa4\x0b\x81\x80\x14 I2RT\x00p
+\x02HMADp
+!HMCMp
+\x0bHMPR\xa4CHKS\x14&I2NT\x01p
+\x02HMADp
+"HMCMphHSD0p
+\x06HMPR\xa4CHKS\x14K\x0eTATR\x00\xa0C\x0e\\H8DR[#I2CM\xff\xffI2RTpHSD0`\xa0%\x93`
+ \\/\x04_SB_PCI0LPC_TCSZHSD1HSD2I2NT`\xa1M\t\xa0%\x93`
+!\\/\x04_SB_PCI0LPC_TCSTHSD1HSD2I2NT`\xa1D\x07\xa0I\x04\x93`
+"\x08TSDC\x11\x0c
+\t        \x00pHSDBTSDC\\/\x04_SB_PCI0LPC_TCBSHSD1TSDCHSDFHSDCI2NT`\xa1\'\xa0%\x93`
+#\\/\x04_SB_PCI0LPC_TSCLHSD1HSDLI2NT`[\'I2CM\x14\rTATE\x00p
+\x01HETE\x08_ADR
+\x00\x08_S3D
+\x02\x08RID_
+\x00\x08LRRT\x12G\x13\x0e\x12\x15\x04\x0c\xff\xff\x01\x00
+\x00\\._SB_LNKA
+\x00\x12\x15\x04\x0c\xff\xff\x02\x00
+\x00\\._SB_LNKA
+\x00\x12\x15\x04\x0c\xff\xff\x1b\x00
+\x01\\._SB_LNKB
+\x00\x12\x15\x04\x0c\xff\xff\x1c\x00
+\x00\\._SB_LNKE
+\x00\x12\x15\x04\x0c\xff\xff\x1c\x00
+\x01\\._SB_LNKF
+\x00\x12\x15\x04\x0c\xff\xff\x1c\x00
+\x02\\._SB_LNKG
+\x00\x12\x15\x04\x0c\xff\xff\x1c\x00
+\x03\\._SB_LNKH
+\x00\x12\x15\x04\x0c\xff\xff\x1d\x00
+\x00\\._SB_LNKA
+\x00\x12\x15\x04\x0c\xff\xff\x1d\x00
+\x01\\._SB_LNKB
+\x00\x12\x15\x04\x0c\xff\xff\x1d\x00
+\x02\\._SB_LNKC
+\x00\x12\x15\x04\x0c\xff\xff\x1d\x00
+\x03\\._SB_LNKD
+\x00\x12\x15\x04\x0c\xff\xff\x1f\x00
+\x00\\._SB_LNKH
+\x00\x12\x15\x04\x0c\xff\xff\x1f\x00
+\x02\\._SB_LNKA
+\x00\x12\x15\x04\x0c\xff\xff\x1f\x00
+\x01\\._SB_LNKA
+\x00\x08ARRT\x12G\x0c\x0e\x12\r\x04\x0c\xff\xff\x01\x00
+\x00
+\x00
+\x10\x12\r\x04\x0c\xff\xff\x02\x00
+\x00
+\x00
+\x10\x12\r\x04\x0c\xff\xff\x1b\x00
+\x01
+\x00
+\x11\x12\r\x04\x0c\xff\xff\x1c\x00
+\x00
+\x00
+\x14\x12\r\x04\x0c\xff\xff\x1c\x00
+\x01
+\x00
+\x15\x12\r\x04\x0c\xff\xff\x1c\x00
+\x02
+\x00
+\x16\x12\r\x04\x0c\xff\xff\x1c\x00
+\x03
+\x00
+\x17\x12\r\x04\x0c\xff\xff\x1d\x00
+\x00
+\x00
+\x10\x12\r\x04\x0c\xff\xff\x1d\x00
+\x01
+\x00
+\x11\x12\r\x04\x0c\xff\xff\x1d\x00
+\x02
+\x00
+\x12\x12\r\x04\x0c\xff\xff\x1d\x00
+\x03
+\x00
+\x13\x12\r\x04\x0c\xff\xff\x1f\x00
+\x00
+\x00
+\x17\x12\r\x04\x0c\xff\xff\x1f\x00
+\x02
+\x00
+\x10\x12\r\x04\x0c\xff\xff\x1f\x00
+\x01
+\x00
+\x10\x14\x19_PRT\x00\xa0\x0b\\GPIC\xa4ARRT\xa1\x06\xa4LRRT\x08_HID\x0cA\xd0
+\x08\x08_CID\x0cA\xd0
+\x03\x08_BBN
+\x00[\x80MHCS\x02
+\x00\x0b\x00\x01[\x815MHCS\x03\x00@HPAM0\x08PAM1\x08PAM2\x08PAM3\x08PAM4\x08PAM5\x08PAM6\x08\x00(\x00\x03TOUD\x05\x08_CRS\x11E\x1c\x0b\xc0\x01\x88\r\x00\x02\x0c\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x01G\x01\xf8\x0c\xf8\x0c\x01\x08\x88\r\x00\x01\x0c\x03\x00\x00\x00\x00\xf7\x0c\x00\x00\xf8\x0c\x88\r\x00\x01\x0c\x03\x00\x00\x00\r\xff\xff\x00\x00\x00\xf3\x87\x17\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x00
+\x00\xff\xff\x0b\x00\x00\x00\x00\x00\x00\x00\x02\x00\x87\x17\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x00\x0c\x00\xff?\x0c\x00\x00\x00\x00\x00\x00@\x00\x00\x87\x17\x00\x00\x0c\x03\x00\x00\x00\x00\x00@\x0c\x00\xff\x7f\x0c\x00\x00\x00\x00\x00\x00@\x00\x00\x87\x17\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x80\x0c\x00\xff\xbf\x0c\x00\x00\x00\x00\x00\x00@\x00\x00\x87\x17\x00\x00\x0c\x03\x00\x00\x00\x00\x00\xc0\x0c\x00\xff\xff\x0c\x00\x00\x00\x00\x00\x00@\x00\x00\x87\x17\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x00\r\x00\xff?\r\x00\x00\x00\x00\x00\x00@\x00\x00\x87\x17\x00\x00\x0c\x03\x00\x00\x00\x00\x00@\r\x00\xff\x7f\r\x00\x00\x00\x00\x00\x00@\x00\x00\x87\x17\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x80\r\x00\xff\xbf\r\x00\x00\x00\x00\x00\x00@\x00\x00\x87\x17\x00\x00\x0c\x03\x00\x00\x00\x00\x00\xc0\r\x00\xff\xff\r\x00\x00\x00\x00\x00\x00@\x00\x00\x87\x17\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x00\x0e\x00\xff?\x0e\x00\x00\x00\x00\x00\x00@\x00\x00\x87\x17\x00\x00\x0c\x03\x00\x00\x00\x00\x00@\x0e\x00\xff\x7f\x0e\x00\x00\x00\x00\x00\x00@\x00\x00\x87\x17\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x80\x0e\x00\xff\xbf\x0e\x00\x00\x00\x00\x00\x00@\x00\x00\x87\x17\x00\x00\x0c\x03\x00\x00\x00\x00\x00\xc0\x0e\x00\xff\xff\x0e\x00\x00\x00\x00\x00\x00@\x00\x00\x87\x17\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x00\x10\x00\xff\xff\xbf\xfe\x00\x00\x00\x00\x00\x00\xb0\xfe\x87\x17\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x00\xd4\xfe\xff\x0f\xd4\xfe\x00\x00\x00\x00\x00\x10\x00\x00y\x00\x8a_CRS
+hC0LN\x8a_CRS
+\x82C4LN\x8a_CRS
+\x9cC8LN\x8a_CRS
+\xb6CCLN\x8a_CRS
+\xd0D0LN\x8a_CRS
+\xeaD4LN\x8a_CRS\x0b\x04\x01D8LN\x8a_CRS\x0b\x1e\x01DCLN\x8a_CRS\x0b8\x01E0LN\x8a_CRS\x0bR\x01E4LN\x8a_CRS\x0bl\x01E8LN\x8a_CRS\x0b\x86\x01ECLN\x8a_CRS\x0b\x94\x01XXMN\x8a_CRS\x0b\x98\x01XXMX\x8a_CRS\x0b\xa0\x01XXLN\x8a_CRS\x0b\xae\x01F4MN\x8a_CRS\x0b\xb2\x01F4MX\x8a_CRS\x0b\xba\x01F4LN\x14A\x12_INI\x08\xa0\x11\x92\\OSIF\\._SB__INIyTOUD
+\x1b`p`\\MEMXp`XXMNrtXXMXXXMN\x00
+\x01XXLN\xa0\x15\x92\x93{\\TPMP
+\x01\x00
+\x01p
+\x00F4LN\xa0\x10{PAM1
+\x03\x00p
+\x00C0LN\xa0\x10{PAM1
+0\x00p
+\x00C4LN\xa0\x10{PAM2
+\x03\x00p
+\x00C8LN\xa0\x10{PAM2
+0\x00p
+\x00CCLN\xa0\x10{PAM3
+\x03\x00p
+\x00D0LN\xa0\x10{PAM3
+0\x00p
+\x00D4LN\xa0\x10{PAM4
+\x03\x00p
+\x00D8LN\xa0\x10{PAM4
+0\x00p
+\x00DCLN\xa0\x10{PAM5
+\x03\x00p
+\x00E0LN\xa0\x10{PAM5
+0\x00p
+\x00E4LN\xa0\x10{PAM6
+\x03\x00p
+\x00E8LN\xa0\x10{PAM6
+0\x00p
+\x00ECLN\x08SUPP
+\x00\x08CTRL
+\x00\x14E,_OSC\x04\x8ak
+\x00CDW1\x8ak
+\x04CDW2\x8ak
+\x08CDW3\x8ah
+\x00IID0\x8ah
+\x04IID1\x8ah
+\x08IID2\x8ah
+\x0cIID3\x08UID0\x11\x13
+\x10[M\xdb3\xf7\x1f\x1c@\x96WtA\xc0=\xd7f\x8aUID0
+\x00EID0\x8aUID0
+\x04EID1\x8aUID0
+\x08EID2\x8aUID0
+\x0cEID3\xa0A#\x90\x90\x93IID0EID0\x93IID1EID1\x90\x93IID2EID2\x93IID3EID3pCDW2SUPPpCDW3CTRL{CTRL
+\x1dCTRL\xa0H\x1b\x80{CDW1
+\x01\x00\x00\xa0F\x0f{CTRL
+\x01\x00\xa03\x92\\VIGDp
+\x00\\/\x04_SB_PCI0AGP_HPGPp
+\x00\\/\x04_SB_PCI0AGP_GMGPp
+\x00\\/\x04_SB_PCI0EXP0HPCEp
+\x01\\/\x04_SB_PCI0EXP0HPCSp
+\x01\\/\x04_SB_PCI0EXP0ABP_p
+\x01\\/\x04_SB_PCI0EXP0PDS_p
+\x00\\/\x04_SB_PCI0EXP2HPCEp
+\x01\\/\x04_SB_PCI0EXP2HPCSp
+\x01\\/\x04_SB_PCI0EXP2ABP_p
+\x01\\/\x04_SB_PCI0EXP2PDS_p
+\x01\\NHPS\xa0D\x0b{CTRL
+\x04\x00\xa03\x92\\VIGDp
+\x00\\/\x04_SB_PCI0AGP_PMGPp
+\x00\\/\x04_SB_PCI0AGP_GMGPp
+\x00\\/\x04_SB_PCI0EXP0PMCEp
+\x01\\/\x04_SB_PCI0EXP0PMCSp
+\x00\\/\x04_SB_PCI0EXP2PMCEp
+\x01\\/\x04_SB_PCI0EXP2PMCSp
+\x00\\/\x04_SB_PCI0LPC_EXPEp
+\x01\\NPME\xa0\x11\x92\x93i
+\x01}CDW1
+
+CDW1\xa0\x16\x92\x93CDW3CTRL}CDW1
+\x10CDW1pCTRLCDW3\xa1\x0c}CDW1
+\x06CDW1\xa4k[\x01MDGS\x07\x08VDEE
+\x01\x08VDDA\x11\x03
+\x02\x8dVDDA
+\x00VUPC\x8dVDDA
+\x01VQDL\x8dVDDA
+\x02VQDC\x8dVDDA
+\x03VQDT\x8dVDDA
+\x04VQDD\x8dVDDA
+\x05VSDL\x8dVDDA
+\x06VSDC\x8dVDDA
+\x07VSDT\x8dVDDA
+\x08VSDD\x8dVDDA
+
+MSWT\x8dVDDA
+\x0bVWST[\x82OJVID_\x08_ADR\x0c\x00\x00\x02\x00\x08RID_
+\x00[\x80VPCG\x02
+\x00\x0b\x00\x01[\x81\x0eVPCG\x03\x00@jVPWR \x08_S3D
+\x03\x145_INI\x00\\VUPS
+\x02p\\VCDLVQDLp\\VCDCVQDCp\\VCDTVQDTp\\VCDDVQDD\x14\x07_PS0\x00\xa3\x14\x07_PS1\x00\xa3\x14\x07_PS2\x00\xa3\x14\x07_PS3\x00\xa3\x140VSWT\x00\xa0\x0f\\WVISp\\VEVT
+\x07`\xa1
+p\\VEVT
+\x05`{
+\x0f`a\xa0\taASWTa
+\x01\x14E\x08VLOC\x01\xa0M\x07\x93h\\/\x03_SB_LID__LID\\VSLDh\xa0C\x06\x93VPWR
+\x00\xa0?hp\\VEVT
+\x01`\xa0\x13\\WXPF\x86\\._SB_PCI0
+\x00\xa1\x1a\xa0\x18\\WNTF\x86\\/\x03_SB_PCI0VID_
+\x00["\x0b\xee\x02\xa1
+p\\VEVT
+\x02`{
+\x0f`a\xa0\taASWTa
+\x00\x14G\x07_DOS\x01\xa0:\x93h
+\x02p
+\x14`\xa20`v`[#MDGS\xff\xff\xa0\x19\x93
+\x00MSWTp
+\x01MSWTp
+\x00`phVDEE[\'MDGS["
+\xc8\xa14[#MDGS\xff\xff\xa0\x0f\x93VDEE
+\x02p
+\x00MSWT\xa0\x0c\x94h
+\x02p
+\x01VDEE\xa1\x07phVDEE[\'MDGS\x14\x13_DOD\x00\xa4\x12\x0b\x03\x0b\x00\x01\x0b\x00\x03\x0b\x00\x04\x14L\x0bASWT\x02\xa0\x14\x93
+\x01VDEE{
+\x01ia\\VSDSha\xa1O\tp
+\x14`\xa2A\x08`v`[#MDGS\xff\xff\xa0I\x06\x93
+\x00MSWTp
+\x00`\xa0\r{
+\x01i\x00p
+\x01VUPC\xa1\x08p
+\x00VUPC\xa0\r{
+\x01h\x00p
+\x01VQDL\xa1\x08p
+\x00VQDL\xa0\r{
+\x02h\x00p
+\x01VQDC\xa1\x08p
+\x00VQDC\xa0\r{
+\x08h\x00p
+\x01VQDD\xa1\x08p
+\x00VQDD[\'MDGS["
+\xc8\xa0\r{
+\x02i\x00\x86VID_
+\x81\xa1\x08\x86VID_
+\x80\x14I\x06VDSW\x01\xa0A\x06\x93VPWR
+\x00\xa0D\x04hp\\VEVT
+\x03`\xa0\x15\\WVIS{
+\x0f`a\xa0\taASWTa
+\x00\xa1!\xa0\x07\\WXPF\xa3\xa1\x17\xa0\x15\\WNTF{
+\x0f`a\xa0\taASWTa
+\x00\xa1\x12p\\VEVT
+\x04`ASWT
+\x01
+\x00\x14\x1eVSPD\x00p\\VEVT
+\x06`{
+\x0f`a\xa0\taASWTa
+\x01[\x82H\x06LCD0\x08_ADR\x0b\x00\x04\x14\x1c_DCS\x00\\VUPS
+\x00\xa0\t\\VCDL\xa4
+\x1f\xa1\x04\xa4
+\x1d\x14\x0b_DGS\x00\xa4VQDL\x140_DSS\x01{h
+\x01VSDL\xa0!{h\x0c\x00\x00\x00\x80\x00\xa0\x0f{h\x0c\x00\x00\x00@\x00DSWT
+\x02\xa1\x07DSWT
+\x01[\x82@\x08CRT0\x08_ADR\x0b\x00\x01\x144_DCS\x00\\VUPS
+\x01\xa0\x15\\VCSS\xa0\t\\VCDC\xa4
+\x1f\xa1\x04\xa4
+\x1d\xa1\x10\xa0\t\\VCDC\xa4
+\x0f\xa1\x04\xa4
+\r\x14\x0b_DGS\x00\xa4VQDC\x140_DSS\x01{h
+\x01VSDC\xa0!{h\x0c\x00\x00\x00\x80\x00\xa0\x0f{h\x0c\x00\x00\x00@\x00DSWT
+\x02\xa1\x07DSWT
+\x01[\x82H\x06DVI0\x08_ADR\x0b\x00\x03\x14\x1c_DCS\x00\\VUPS
+\x00\xa0\t\\VCDD\xa4
+\x1f\xa1\x04\xa4
+\x1d\x14\x0b_DGS\x00\xa4VQDD\x140_DSS\x01{h
+\x01VSDD\xa0!{h\x0c\x00\x00\x00\x80\x00\xa0\x0f{h\x0c\x00\x00\x00@\x00DSWT
+\x02\xa1\x07DSWT
+\x01\x14?DSWT\x01\xa0\tVSDLp
+\x01`\xa1\x05p
+\x00`\xa0
+VSDC}
+\x02``\xa0
+VSDD}
+\x08``\xa0\x0f`\xa0\x0cVUPC\\VSDS`h\xa1\x02\xa3[\x82BUAGP_\x08_ADR\x0c\x00\x00\x01\x00\x08_S3D
+\x03\x08RID_
+\x00\x08LART\x12*\x02\x12\x13\x04\x0b\xff\xff
+\x00\\._SB_LNKA
+\x00\x12\x13\x04\x0b\xff\xff
+\x01\\._SB_LNKB
+\x00\x08AART\x12\x1a\x02\x12\x0b\x04\x0b\xff\xff
+\x00
+\x00
+\x10\x12\x0b\x04\x0b\xff\xff
+\x01
+\x00
+\x11\x14\x19_PRT\x00\xa0\x0b\\GPIC\xa4AART\xa1\x06\xa4LART[\x01MDGS\x07\x08VDEE
+\x01\x08VDDA\x11\x03
+\x02\x8dVDDA
+\x00VUPC\x8dVDDA
+\x01VQDL\x8dVDDA
+\x02VQDC\x8dVDDA
+\x03VQDT\x8dVDDA
+\x04VQDD\x8dVDDA
+\x05VSDL\x8dVDDA
+\x06VSDC\x8dVDDA
+\x07VSDT\x8dVDDA
+\x08VSDD\x8dVDDA
+
+MSWT\x8dVDDA
+\x0bVWST[\x82BAVID_\x08_ADR
+\x00[\x80VPCG\x02
+\x00\x0b\x00\x01[\x81\x0eVPCG\x03\x00@*VPWR \x08_S3D
+\x03\x145_INI\x00\\VUPS
+\x02p\\VCDLVQDLp\\VCDCVQDCp\\VCDTVQDTp\\VCDDVQDD\x14\x07_PS0\x00\xa3\x14\x07_PS1\x00\xa3\x14\x07_PS2\x00\xa3\x14\x07_PS3\x00\xa3\x140VSWT\x00\xa0\x0f\\WVISp\\VEVT
+\x07`\xa1
+p\\VEVT
+\x05`{
+\x0f`a\xa0\taASWTa
+\x01\x14@\x05VLOC\x01\xa0H\x04\x93h\\/\x03_SB_LID__LID\\VSLDh\xa0.\x93VPWR
+\x00\xa0\x0bhp\\VEVT
+\x01`\xa1
+p\\VEVT
+\x02`{
+\x0f`a\xa0\taASWTa
+\x00\x14G\x07_DOS\x01\xa0:\x93h
+\x02p
+\x14`\xa20`v`[#MDGS\xff\xff\xa0\x19\x93
+\x00MSWTp
+\x01MSWTp
+\x00`phVDEE[\'MDGS["
+\xc8\xa14[#MDGS\xff\xff\xa0\x0f\x93VDEE
+\x02p
+\x00MSWT\xa0\x0c\x94h
+\x02p
+\x01VDEE\xa1\x07phVDEE[\'MDGS\x14\x13_DOD\x00\xa4\x12\x0b\x03\x0b\x00\x01\x0b\x10\x02\x0b\x10\x01\x14L\x0bASWT\x02\xa0\x14\x93
+\x01VDEE{
+\x01ia\\VSDSha\xa1O\tp
+\x14`\xa2A\x08`v`[#MDGS\xff\xff\xa0I\x06\x93
+\x00MSWTp
+\x00`\xa0\r{
+\x01i\x00p
+\x01VUPC\xa1\x08p
+\x00VUPC\xa0\r{
+\x01h\x00p
+\x01VQDL\xa1\x08p
+\x00VQDL\xa0\r{
+\x02h\x00p
+\x01VQDC\xa1\x08p
+\x00VQDC\xa0\r{
+\x08h\x00p
+\x01VQDD\xa1\x08p
+\x00VQDD[\'MDGS["
+\xc8\xa0\r{
+\x02i\x00\x86VID_
+\x81\xa1\x08\x86VID_
+\x80[\x82C\tLCD0\x08_ADR\x0b\x10\x01\x14\x1c_DCS\x00\\VUPS
+\x00\xa0\t\\VCDL\xa4
+\x1f\xa1\x04\xa4
+\x1d\x14*_DDC\x01\\VDDC\xa0\x0b\x93h
+\x01\xa4\\DDC1\xa1\x12\xa0\x0b\x93h
+\x02\xa4\\DDC2\xa1\x04\xa4
+\x00\x14\x0b_DGS\x00\xa4VQDL\x140_DSS\x01{h
+\x01VSDL\xa0!{h\x0c\x00\x00\x00\x80\x00\xa0\x0f{h\x0c\x00\x00\x00@\x00DSWT
+\x02\xa1\x07DSWT
+\x01[\x82@\x08CRT0\x08_ADR\x0b\x00\x01\x144_DCS\x00\\VUPS
+\x01\xa0\x15\\VCSS\xa0\t\\VCDC\xa4
+\x1f\xa1\x04\xa4
+\x1d\xa1\x10\xa0\t\\VCDC\xa4
+\x0f\xa1\x04\xa4
+\r\x14\x0b_DGS\x00\xa4VQDC\x140_DSS\x01{h
+\x01VSDC\xa0!{h\x0c\x00\x00\x00\x80\x00\xa0\x0f{h\x0c\x00\x00\x00@\x00DSWT
+\x02\xa1\x07DSWT
+\x01[\x82H\x06DVI0\x08_ADR\x0b\x10\x02\x14\x1c_DCS\x00\\VUPS
+\x00\xa0\t\\VCDD\xa4
+\x1f\xa1\x04\xa4
+\x1d\x14\x0b_DGS\x00\xa4VQDD\x140_DSS\x01{h
+\x01VSDD\xa0!{h\x0c\x00\x00\x00\x80\x00\xa0\x0f{h\x0c\x00\x00\x00@\x00DSWT
+\x02\xa1\x07DSWT
+\x01\x14?DSWT\x01\xa0\tVSDLp
+\x01`\xa1\x05p
+\x00`\xa0
+VSDC}
+\x02``\xa0
+VSDD}
+\x08``\xa0\x0f`\xa0\x0cVUPC\\VSDS`h\xa1\x02\xa3[\x80PEGC\x02
+\x00\x0b\x00\x01[\x81\x18PEGC\x03\x00@vGMGP\x01HPGP\x01PMGP\x01[\x82I\x12EXP0\x08_ADR\x0c\x00\x00\x1c\x00\x08RID_
+\x00[\x80P0CS\x02
+\x00\x0b\x00\x01[\x81M\x04P0CS\x03\x00@-ABP_\x01\x00\x02PDC_\x01\x00\x02PDS_\x01\x00\x01\x00(RID0\x10PSP0\x01PPP0\x01\x00F<\x00\x06HPCE\x01PMCE\x01\x00\x18\x00\x06HPCS\x01PMCS\x01\x08_PRW\x12\x06\x02
+\t
+\x04\x08LPRT\x12C\x05\x04\x12\x13\x04\x0b\xff\xff
+\x00\\._SB_LNKA
+\x00\x12\x13\x04\x0b\xff\xff
+\x01\\._SB_LNKB
+\x00\x12\x13\x04\x0b\xff\xff
+\x02\\._SB_LNKC
+\x00\x12\x13\x04\x0b\xff\xff
+\x03\\._SB_LNKD
+\x00\x08APRT\x122\x04\x12\x0b\x04\x0b\xff\xff
+\x00
+\x00
+\x10\x12\x0b\x04\x0b\xff\xff
+\x01
+\x00
+\x11\x12\x0b\x04\x0b\xff\xff
+\x02
+\x00
+\x12\x12\x0b\x04\x0b\xff\xff
+\x03
+\x00
+\x13\x14\x19_PRT\x00\xa0\x0b\\GPIC\xa4APRT\xa1\x06\xa4LPRT[\x82D\x0fEXP1\x08_ADR\x0c\x01\x00\x1c\x00\x08RID_
+\x00[\x80P1CS\x02
+\x00\x0b\x00\x01[\x81\x18P1CS\x03\x00@0RID1\x10PSP1\x01PPP1\x01\x08_PRW\x12\x06\x02
+\t
+\x04\x08LPRT\x12C\x05\x04\x12\x13\x04\x0b\xff\xff
+\x00\\._SB_LNKB
+\x00\x12\x13\x04\x0b\xff\xff
+\x01\\._SB_LNKC
+\x00\x12\x13\x04\x0b\xff\xff
+\x02\\._SB_LNKD
+\x00\x12\x13\x04\x0b\xff\xff
+\x03\\._SB_LNKA
+\x00\x08APRT\x122\x04\x12\x0b\x04\x0b\xff\xff
+\x00
+\x00
+\x11\x12\x0b\x04\x0b\xff\xff
+\x01
+\x00
+\x12\x12\x0b\x04\x0b\xff\xff
+\x02
+\x00
+\x13\x12\x0b\x04\x0b\xff\xff
+\x03
+\x00
+\x10\x14\x19_PRT\x00\xa0\x0b\\GPIC\xa4APRT\xa1\x06\xa4LPRT[\x82H\x14EXP2\x08_ADR\x0c\x02\x00\x1c\x00\x08RID_
+\x00\x08XCPF
+\x00[\x80P2CS\x02
+\x00\x0b\x00\x01[\x81M\x04P2CS\x03\x00@-ABP_\x01\x00\x02PDC_\x01\x00\x02PDS_\x01\x00\x01\x00(RID2\x10PSP2\x01PPP2\x01\x00F<\x00\x06HPCE\x01PMCE\x01\x00\x18\x00\x06HPCS\x01PMCS\x01\x08_PRW\x12\x06\x02
+\t
+\x04\x08LPRT\x12C\x05\x04\x12\x13\x04\x0b\xff\xff
+\x00\\._SB_LNKC
+\x00\x12\x13\x04\x0b\xff\xff
+\x01\\._SB_LNKD
+\x00\x12\x13\x04\x0b\xff\xff
+\x02\\._SB_LNKA
+\x00\x12\x13\x04\x0b\xff\xff
+\x03\\._SB_LNKB
+\x00\x08APRT\x122\x04\x12\x0b\x04\x0b\xff\xff
+\x00
+\x00
+\x12\x12\x0b\x04\x0b\xff\xff
+\x01
+\x00
+\x13\x12\x0b\x04\x0b\xff\xff
+\x02
+\x00
+\x10\x12\x0b\x04\x0b\xff\xff
+\x03
+\x00
+\x11\x14\x19_PRT\x00\xa0\x0b\\GPIC\xa4APRT\xa1\x06\xa4LPRT[\x82\x16EXUP\x08_ADR
+\x00\x14\t_RMV\x00\xa4
+\x01[\x82B\x10EXP3\x08_ADR\x0c\x03\x00\x1c\x00\x08RID_
+\x00[\x80P3CS\x02
+\x00\x0b\x00\x01[\x81\x18P3CS\x03\x00@0RID3\x10PSP3\x01PPP3\x01\x08_PRW\x12\x06\x02
+\t
+\x04\x08LPRT\x12C\x05\x04\x12\x13\x04\x0b\xff\xff
+\x00\\._SB_LNKD
+\x00\x12\x13\x04\x0b\xff\xff
+\x01\\._SB_LNKA
+\x00\x12\x13\x04\x0b\xff\xff
+\x02\\._SB_LNKB
+\x00\x12\x13\x04\x0b\xff\xff
+\x03\\._SB_LNKC
+\x00\x08APRT\x122\x04\x12\x0b\x04\x0b\xff\xff
+\x00
+\x00
+\x13\x12\x0b\x04\x0b\xff\xff
+\x01
+\x00
+\x10\x12\x0b\x04\x0b\xff\xff
+\x02
+\x00
+\x11\x12\x0b\x04\x0b\xff\xff
+\x03
+\x00
+\x12\x14\x19_PRT\x00\xa0\x0b\\GPIC\xa4APRT\xa1\x06\xa4LPRT[\x82\x0cEXPD\x08_ADR
+\x00[\x82O\x16PCI1\x08_ADR\x0c\x00\x00\x1e\x00\x08_S3D
+\x02\x08RID_
+\x00\x08LPRT\x12G\t\x07\x12\x13\x04\x0b\xff\xff
+\x00\\._SB_LNKA
+\x00\x12\x13\x04\x0b\xff\xff
+\x01\\._SB_LNKB
+\x00\x12\x13\x04\x0b\xff\xff
+\x02\\._SB_LNKC
+\x00\x12\x15\x04\x0c\xff\xff\x01\x00
+\x00\\._SB_LNKA
+\x00\x12\x15\x04\x0c\xff\xff\x02\x00
+\x00\\._SB_LNKF
+\x00\x12\x15\x04\x0c\xff\xff\x02\x00
+\x01\\._SB_LNKG
+\x00\x12\x15\x04\x0c\xff\xff\x08\x00
+\x00\\._SB_LNKE
+\x00\x08APRT\x12O\x05\x07\x12\x0b\x04\x0b\xff\xff
+\x00
+\x00
+\x10\x12\x0b\x04\x0b\xff\xff
+\x01
+\x00
+\x11\x12\x0b\x04\x0b\xff\xff
+\x02
+\x00
+\x12\x12\r\x04\x0c\xff\xff\x01\x00
+\x00
+\x00
+\x10\x12\r\x04\x0c\xff\xff\x02\x00
+\x00
+\x00
+\x15\x12\r\x04\x0c\xff\xff\x02\x00
+\x01
+\x00
+\x16\x12\r\x04\x0c\xff\xff\x08\x00
+\x00
+\x00
+\x14\x14\x19_PRT\x00\xa0\x0b\\GPIC\xa4APRT\xa1\x06\xa4LPRT\x08_PRW\x12\x06\x02
+\x0b
+\x04[\x82\'CDBS\x08_ADR
+\x00\x14\x13_S3D\x00\xa0\t\\WMEF\xa4
+\x02\xa4
+\x03\x08_SUN
+\x01[\x82L\xb8IDE0\x08_ADR\x0c\x01\x00\x1f\x00\x08_S3D
+\x03\x08RID_
+\x00[\x80IDCS\x02
+\x00\x0b\x00\x01[\x81@\x12IDCS\x03\x00@ PFT0\x01PIE0\x01PPE0\x01PDT0\x01PFT1\x01PIE1\x01PPE1\x01PDT1\x01PRC0\x02\x00\x02PIS0\x02PSIE\x01PIDE\x01SFT0\x01SIE0\x01SPE0\x01SDT0\x01SFT1\x01SIE1\x01SPE1\x01SDT1\x01SRC0\x02\x00\x02SIS0\x02SSIE\x01SIDE\x01PRC1\x02PIS1\x02SRC1\x02SIS1\x02\x00\x18PSD0\x01PSD1\x01SSD0\x01SSD1\x01\x00\x0cPCT0\x02\x00\x02PCT1\x02\x00\x02SCT0\x02\x00\x02SCT1\x02\x00\x02\x00@\x04PCB0\x01PCB1\x01SCB0\x01SCB1\x01PCR0\x01PCR1\x01SCR0\x01SCR1\x01\x00\x02WRPP\x01\x00\x01FPB0\x01FPB1\x01FSB0\x01FSB1\x01PSIG\x02SSIG\x02[\x81\x1fIDCS\x03\x00@ PTI0\x04PTI1\x04\x00\x08STI0\x04STI1\x04\x14\'GPCT\x04\xa0\t\x92}hi\x00\xa4
+\x00\xa0\t\x90\x92hi\xa4\x0b\x84\x03\xa4wt
+\trjk\x00\x00
+\x1e\x00\x14*GDCT\x04\xa0\x06\x92h\xa4
+\x00\xa0\x05i\xa4
+\x14\xa0\x0cj\xa4wt
+\x04k\x00
+\x0f\x00\xa4wt
+\x04k\x00
+\x1e\x00\x142MTIM\x02p
+\x00`\xa0\x07h}`
+\x01`\xa0\x0b\x92\x95h
+\x02}`
+\x02`\xa0\x08\x92i}`
+\x04`\xa0\x08\x92h}`
+\x08`\xa4`\x14\x1aMISP\x01\xa0\x06\x92h\xa4
+\x00\xa0\t\x92\x94h
+\x02\xa4
+\x01\xa4
+\x02\x14\x1cMRCT\x01\xa0\t\x92\x94h
+\x02\xa4
+\x00\xa0\x08\x93h
+\x03\xa4
+\x01\xa4
+\x03[\x82O\x95PRIM\x08_ADR
+\x00\x08BGTM\x11\x03
+\x14\x8aBGTM
+\x00GTP0\x8aBGTM
+\x04GTD0\x8aBGTM
+\x08GTP1\x8aBGTM
+\x0cGTD1\x8aBGTM
+\x10GTMF\x08BPI0
+\x00\x08BDM0
+\x00\x08BPI1
+\x00\x08BDM1
+\x00\x08DRE0
+\x00\x08DRE1
+\x00\x08DIP0
+\x00\x08DIP1
+\x00\x14M\x11_GTM\x00pGPCTPFT0PDT0PIS0PRC0GTP0pGDCTPSD0FPB0PCB0PCT0GTD0\xa0\x0f\x92GTD0pGTP0GTD0\xa0H\x04PSIEpGPCTPFT1PDT1PIS1PRC1GTP1pGDCTPSD1FPB1PCB1PCT1GTD1\xa0\x0f\x92GTD1pGTP1GTD1\xa1\x0fp
+\x00GTP1p
+\x00GTD1p
+\x00GTMF\xa0\x10PSD0}GTMF
+\x01GTMF\xa0\x1f\x92GTP0}GTMF
+\x01GTMFp
+xGTP0p
+\x14GTD0\xa0\x10PIE0}GTMF
+\x02GTMF\xa0\x10PSD1}GTMF
+\x04GTMF\xa0\x10PIE1}GTMF
+\x08GTMF}GTMF
+\x10GTMF\xa4BGTM\x14@G_STM\x03\x8ah
+\x00STP0\x8ah
+\x04STD0\x8ah
+\x08STP1\x8ah
+\x0cSTD1\x8ah
+\x10STMFp
+\x00DRE0p
+\x00DIP0\xa0G$\x93\x87i\x0b\x00\x02\x8bi
+\x00M000\x8bi
+bM049\x8bi
+fM051\x8bi
+jM053\x8bi
+|M062\x8bi
+~M063\x8bi
+\x80M064\x8bi
+\x82M065\x8bi
+\x88M068\x8bi
+\x9cM078\x8bi
+\xacM086\x8bi
+\xb0M088\x8bi
+\xeeM119\x8bi\x0b(\x01M148\xa0\x1f\x93{M148\x0b\x00\xc0\x00\x0b\x00@\xa0\x10{M148
+\x04\x00p
+\x01DRE0\xa0\x1b{M086\x0b\x00\x80\x00\xa0\x10{M119
+\x01\x00p
+\x01DRE0\xa0E\t\\W98Fp\\UUDMM053M088STD0\xa0\x10STD0}STMF
+\x01STMF\xa1\x0c{STMF
+\xfeSTMFp\\UMDMM053M063M062M065STP0\xa0 \x92STP0p\\UPIOM053M064M051M068STP0\xa0\x15{M049\x0b\x00\x08\x00}STMF
+\x02STMF\xa1\x0c{STMF
+\xfdSTMFp\\DPIOSTP0{STMF
+\x02\x00`p\\DUDMSTD0{STMF
+\x01\x00a\xa0&\x92\x95\\/\x05_SB_PCI0LPC_EC__BGID
+\x00
+\x0cp
+\x00`p
+\xffapMTIM`{M000\x0b\x00\x80\x00PTI0pMISP`PIS0pMRCT`PRC0\xa0\x0c\x93a
+\xffp
+\x00PSD0\xa1C\x06p
+\x01PSD0\xa0\x0c\x92\x94a
+\x02paPCT0\xa1\x18\xa0\r{a
+\x01\x00p
+\x01PCT0\xa1\x08p
+\x02PCT0\xa0\r\x92\x95a
+\x03p
+\x01PCB0\xa1\x08p
+\x00PCB0\xa0\x0c\x93a
+\x05p
+\x01FPB0\xa1\x08p
+\x00FPB0p
+\x01PCR0p\\FDMA`aBDM0p\\FPIO`BPI0\xa0J\x1e\x93\x87j\x0b\x00\x02\x8bj
+\x00S000\x8bj
+bS049\x8bj
+fS051\x8bj
+jS053\x8bj
+|S062\x8bj
+~S063\x8bj
+\x80S064\x8bj
+\x82S065\x8bj
+\x88S068\x8bj
+\xb0S088\xa0E\t\\W98Fp\\UUDMS053S088STD1\xa0\x10STD1}STMF
+\x04STMF\xa1\x0c{STMF
+\xfbSTMFp\\UMDMS053S063S062S065STP1\xa0 \x92STP1p\\UPIOS053S064S051S068STP1\xa0\x15{S049\x0b\x00\x08\x00}STMF
+\x08STMF\xa1\x0c{STMF
+\xf7STMFp\\DPIOSTP1{STMF
+\x08\x00`p\\DUDMSTD1{STMF
+\x04\x00a\xa0=STP1pMTIM`{S000\x0b\x00\x80\x00PTI1\xa0${STMF
+\x10\x00pMISP`PIS1pMRCT`PRC1p
+\x01PSIE\xa1\x0fp
+\x00PTI1p
+\x00PSIE\xa0\x0c\x93a
+\xffp
+\x00PSD1\xa1C\x06p
+\x01PSD1\xa0\x0c\x92\x94a
+\x02paPCT1\xa1\x18\xa0\r{a
+\x01\x00p
+\x01PCT1\xa1\x08p
+\x02PCT1\xa0\r\x92\x95a
+\x03p
+\x01PCB1\xa1\x08p
+\x00PCB1\xa0\x0c\x93a
+\x05p
+\x01FPB1\xa1\x08p
+\x00FPB1p
+\x01PCR1p\\FDMA`aBDM1p\\FPIO`BPI1[\x82I4MSTR\x08_ADR
+\x00\x08HDTF\x11\x1f
+\x1c\x02\x00\x00\x00\x00\xa0\xef\x00\x00\x00\x00\x00\xa0\xf5\x03\x00\x00\x00\x00\xa0\xef\x03\x00\x00\x00\x00\xa0\xef\x8cHDTF
+\x0fHDMA\x8cHDTF
+\x16HPIO\x8cHDTF
+\rHFLC\x08ERTF\x11&
+#\x02\x00\x00\x00\x00\xa0\xef\x00\x00\x00\x00\x00\xa0\xf5\x03\x00\x00\x00\x00\xa0\xef\x03\x00\x00\x00\x00\xa0\xef_\x00\x00\x00\x00\xa0\xef\x8cERTF
+\x0fEDMA\x8cERTF
+\x16EPIO\x8cERTF
+\rEFLC\x08HPTF\x11&
+#\x02\x00\x00\x00\x00\xa0\xef\x00\x00\x00\x00\x00\xa0\xf5\x03\x00\x00\x00\x00\xa0\xef\x03\x00\x00\x00\x00\xa0\xef\x10\x03\x00\x00\x00\xa0\xef\x8cHPTF
+\x0fPDMA\x8cHPTF
+\x16PPIO\x8cHPTF
+\rPFLC\x08HXTF\x11-
+*\x02\x00\x00\x00\x00\xa0\xef\x00\x00\x00\x00\x00\xa0\xf5\x03\x00\x00\x00\x00\xa0\xef\x03\x00\x00\x00\x00\xa0\xef_\x00\x00\x00\x00\xa0\xef\x10\x03\x00\x00\x00\xa0\xef\x8cHXTF
+\x0fXDMA\x8cHXTF
+\x16XPIO\x8cHXTF
+\rXFLC\x08IDTF\x11\x11
+\x0e\x03\x00\x00\x00\x00\xa0\xef\x03\x00\x00\x00\x00\xa0\xef\x8cIDTF
+\x01IDMA\x8cIDTF
+\x08IPIO\x08DDTF\x11\x1f
+\x1c\x03\x00\x00\x00\x00\xa0\xef\x03\x00\x00\x00\x00\xa0\xef\x00\x00\x00\x00\x00\xa0\xe3\x00\x00\x00\x00\x00\xa0\xe3\x8cDDTF
+\x01DDMA\x8cDDTF
+\x08DPIO\x8cDDTF
+\x0fDTAT\x8cDDTF
+\x16DTFT\x14@\x14_GTF\x00p\\/\x05_SB_PCI0LPC_EC__BGID
+\x00`\xa0"\\OSSSp
+\xe1HFLCp
+\xe1EFLCp
+\xe1PFLCp
+\xe1XFLC\xa0M\x08\x93`
+\x06\xa0H\x04^^DRE0\xa0"^^DIP0p^^BDM0XDMAp^^BPI0XPIO\xa4HXTF\xa1\x1cp^^BDM0EDMAp^^BPI0EPIO\xa4ERTF\xa0"^^DIP0p^^BDM0PDMAp^^BPI0PPIO\xa4HPTFp^^BDM0HDMAp^^BPI0HPIO\xa4HDTFp\x00a\xa0\x08\x93`
+\x03p\x01a\xa0\x08\x93`
+
+p\x01a\xa0\x08\x93`
+\x0bp\x01a\xa01ap\\CDFLDTFTp\\CDAHDTATp^^BDM0DDMAp^^BPI0DPIO\xa4DDTF\xa1\x1cp^^BDM0IDMAp^^BPI0IPIO\xa4IDTF\x14\x1e_EJ0\x01\\/\x05_SB_PCI0LPC_EC__BEJ0h\x14)_STA\x00\xa0\x1d\\/\x05_SB_PCI0LPC_EC__BSTA
+\x01\xa4
+\x0f\xa1\x04\xa4
+\x00[\x82K"SATA\x08_ADR\x0c\x02\x00\x1f\x00\x08_S3D
+\x03\x08RID_
+\x00[\x80IDCS\x02
+\x00\x0b\x00\x01[\x81@\x12IDCS\x03\x00@ PFT0\x01PIE0\x01PPE0\x01PDT0\x01PFT1\x01PIE1\x01PPE1\x01PDT1\x01PRC0\x02\x00\x02PIS0\x02PSIE\x01PIDE\x01SFT0\x01SIE0\x01SPE0\x01SDT0\x01SFT1\x01SIE1\x01SPE1\x01SDT1\x01SRC0\x02\x00\x02SIS0\x02SSIE\x01SIDE\x01PRC1\x02PIS1\x02SRC1\x02SIS1\x02\x00\x18PSD0\x01PSD1\x01SSD0\x01SSD1\x01\x00\x0cPCT0\x02\x00\x02PCT1\x02\x00\x02SCT0\x02\x00\x02SCT1\x02\x00\x02\x00@\x04PCB0\x01PCB1\x01SCB0\x01SCB1\x01PCR0\x01PCR1\x01SCR0\x01SCR1\x01\x00\x02WRPP\x01\x00\x01FPB0\x01FPB1\x01FSB0\x01FSB1\x01PSIG\x02SSIG\x02[\x81\x1fIDCS\x03\x00@ PTI0\x04PTI1\x04\x00\x08STI0\x04STI1\x04\x14\'GPCT\x04\xa0\t\x92}hi\x00\xa4
+\x00\xa0\t\x90\x92hi\xa4\x0b\x84\x03\xa4wt
+\trjk\x00\x00
+\x1e\x00\x14*GDCT\x04\xa0\x06\x92h\xa4
+\x00\xa0\x05i\xa4
+\x14\xa0\x0cj\xa4wt
+\x04k\x00
+\x0f\x00\xa4wt
+\x04k\x00
+\x1e\x00\x142MTIM\x02p
+\x00`\xa0\x07h}`
+\x01`\xa0\x0b\x92\x95h
+\x02}`
+\x02`\xa0\x08\x92i}`
+\x04`\xa0\x08\x92h}`
+\x08`\xa4`\x14\x1aMISP\x01\xa0\x06\x92h\xa4
+\x00\xa0\t\x92\x94h
+\x02\xa4
+\x01\xa4
+\x02\x14\x1cMRCT\x01\xa0\t\x92\x94h
+\x02\xa4
+\x00\xa0\x08\x93h
+\x03\xa4
+\x01\xa4
+\x03[\x82\x1dSMBU\x08_ADR\x0c\x03\x00\x1f\x00\x08_S3D
+\x03\x08RID_
+\x00[\x82J\x0eUSB0\x08_ADR\x0c\x00\x00\x1d\x00\x08_S3D
+\x02\x08RID_
+\x00[\x80U0CS\x02
+\xc4
+\x04[\x81\rU0CS\x03U0EN\x02\x00\x1e\x08_PR0\x12\x19\x01\\/\x05_SB_PCI0LPC_EC__PUBS\x08_PR1\x12\x19\x01\\/\x05_SB_PCI0LPC_EC__PUBS\x08_PR2\x12\x19\x01\\/\x05_SB_PCI0LPC_EC__PUBS\x08_PRW\x12\x1d\x03
+\x03
+\x03\\/\x05_SB_PCI0LPC_EC__PUBS\x141_PSW\x01\xa0\thp
+\x03U0EN\xa1\x08p
+\x00U0EN\\/\x05_SB_PCI0LPC_EC__PNSTh[\x82J\x07USB1\x08_ADR\x0c\x01\x00\x1d\x00\x08_S3D
+\x02\x08RID_
+\x00[\x80U1CS\x02
+\xc4
+\x04[\x81\rU1CS\x03U1EN\x02\x00\x1e\x08_PRW\x12\x06\x02
+\x04
+\x03\x14\x19_PSW\x01\xa0\thp
+\x03U1EN\xa1\x08p
+\x00U1EN[\x82\x1aURTH\x08_ADR
+\x00[\x82\x0cUPEX\x08_ADR
+\x02[\x82N\x0eUSB2\x08_ADR\x0c\x02\x00\x1d\x00\x08_S3D
+\x02\x08RID_
+\x00[\x80U2CS\x02
+\xc4
+\x04[\x81\rU2CS\x03U2EN\x02\x00\x1e\x08_PR0\x12\x19\x01\\/\x05_SB_PCI0LPC_EC__PUBS\x08_PR1\x12\x19\x01\\/\x05_SB_PCI0LPC_EC__PUBS\x08_PR2\x12\x19\x01\\/\x05_SB_PCI0LPC_EC__PUBS\x08_PRW\x12\x1d\x03
+\x0c
+\x03\\/\x05_SB_PCI0LPC_EC__PUBS\x14\x19_PSW\x01\xa0\thp
+\x03U2EN\xa1\x08p
+\x00U2EN[\x82\x1aURTH\x08_ADR
+\x00[\x82\x0cUPDK\x08_ADR
+\x02[\x82\x16USB3\x08_ADR\x0c\x03\x00\x1d\x00\x08RID_
+\x00[\x82N\x0fUSB7\x08_ADR\x0c\x07\x00\x1d\x00\x08_S3D
+\x03\x08RID_
+\x00[\x80U7CS\x02
+`
+\x04[\x81\x14U7CS\x03\x00\x10PWKI\x01PWUC\x06\x00\t\x08_PR0\x12\x19\x01\\/\x05_SB_PCI0LPC_EC__PUBS\x08_PR1\x12\x19\x01\\/\x05_SB_PCI0LPC_EC__PUBS\x08_PR2\x12\x19\x01\\/\x05_SB_PCI0LPC_EC__PUBS\x14\x14_INI\x00p
+\x01PWKIp
+\x0fPWUC\x08_PRW\x12\x1d\x03
+\r
+\x03\\/\x05_SB_PCI0LPC_EC__PUBS[\x82(URTH\x08_ADR
+\x00[\x82\x0cUPDK\x08_ADR
+\x06[\x82\x0cUPEX\x08_ADR
+\x04[\x821HDEF\x08_ADR\x0c\x00\x00\x1b\x00\x08_S3D
+\x03\x08RID_
+\x00\x08_PRW\x12\x06\x02
+\x05
+\x04\x14\x07_PSW\x01\xa3\x10C\xbe\\/\x04_SB_PCI0LPC_EC__\x08BDEV
+\xff\x08BSTS
+\x00\x08BHKE
+\x00\x08BXCN
+\x00\x142_Q2C\x00\xa0+\x93BSTS
+\x00pBGID
+\x00BDEV\xa0\rBXCNNXREBDEV\xa1\tNBREBDEV\x14)_Q2D\x00pBGID
+\x00BDEV\xa0\rBXCNNXRCBDEV\xa1\tNBINBDEV\x14D\x07_Q38\x00pBGID
+\x00`\xa01\x93`
+\x0fBDIS\xa0\x17BXCNpBDEV`p
+\x0fBDEVNXEJ`\xa1\x0fNBEJBDEVp`BDEV\xa12\xa0\x16HPBU\xa0\x10BXCNp`BDEVNXIN`\xa1\x19p`BDEV\xa0
+BXCNNXRC`\xa1\x06NBIN`\x14B\rNBRE\x01\xa0&\x93h
+\r\xa0 \\LFDC\x86\\/\x05_SB_PCI0LPC_FDC_FDD0
+\x03\xa0F\x04\x95h
+\x0c\xa0#\x93\\BIDE
+\x03\x86\\/\x05_SB_PCI0SATASCNDMSTR
+\x03\xa1\x1b\x86\\/\x05_SB_PCI0IDE0PRIMMSTR
+\x03\xa0I\x04\x93h
+\x10\xa0+\x91HPACHB0A\xa0 \\WNTF\x86\\/\x05_SB_PCI0LPC_EC__BAT1
+\x03\xa1\x16LED_
+\x04
+\xc0BEEP
+\x0fp
+\x02BSTS\xa0\x12\x93h
+\x11\x86\\._SB_LCIO
+\x03\x14K\x0eNBEJ\x01\xa0N\x0c\x93BSTS
+\x00\xa0&\x93h
+\r\xa0 \\LFDC\x86\\/\x05_SB_PCI0LPC_FDC_FDD0
+\x01\xa0F\x04\x95h
+\x0c\xa0#\x93\\BIDE
+\x03\x86\\/\x05_SB_PCI0SATASCNDMSTR
+\x01\xa1\x1b\x86\\/\x05_SB_PCI0IDE0PRIMMSTR
+\x01\xa0C\x04\x93h
+\x10\xa0 \\WNTF\x86\\/\x05_SB_PCI0LPC_EC__BAT1
+\x01\xa1\x1b\x86\\/\x05_SB_PCI0LPC_EC__BAT1
+\x81\xa0\x12\x93h
+\x11\x86\\._SB_LCIO
+\x01LED_
+\x04
+\x00BEEP
+\x00p
+\x00BSTS\x14B\x15NBIN\x01\xa08\x93h
+\r\xa02\\LFDCBEN_
+\x00BSFDLED_
+\x04
+\x80\x86\\/\x05_SB_PCI0LPC_FDC_FDD0
+\x01\xa0B\x06\x95h
+\x0c\xa0\x0b\x93h
+\x06BEN_
+\x02\xa1\x07BEN_
+\x01LED_
+\x04
+\x80\xa0#\x93\\BIDE
+\x03\x86\\/\x05_SB_PCI0SATASCNDMSTR
+\x01\xa1\x1b\x86\\/\x05_SB_PCI0IDE0PRIMMSTR
+\x01\xa0I\x06\x93h
+\x10LED_
+\x04
+\x80\xa0>\\WNTFp
+\x01\\/\x06_SB_PCI0LPC_EC__BAT1XB1S\x86\\/\x05_SB_PCI0LPC_EC__BAT1
+\x01\xa1\x1b\x86\\/\x05_SB_PCI0LPC_EC__BAT1
+\x81\xa07\x93h
+\x11\xa01\x92\\/\x04_SB_PCI0LPC_CSONLED_
+\x04
+\x80\xa0\x13\\WNTF\x86\\._SB_LCIO
+\x01BEEP
+\x00p
+\x00BSTS\x14J\x07BEJ0\x01\xa0A\x06hBDISLED_
+\x04
+\x00\\BHDP
+\x01
+\x00p
+\x01BSTS\xa0*BHKEp
+\x00BHKE\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x030\xa0\x16\x93BDEV
+\x11p
+\x0fBDEVp
+\x00BSTS\xa1\x10LED_
+\x04
+\x80p
+\x00BSTS\x14\x1dBEJ3\x01\xa0\rhBDISp
+\x01BSTS\xa1\x08p
+\x00BSTS\x14I\x07BPTS\x01p
+\x01HDBM\xa0\x17\x92\x93BSTS
+\x00p
+\x0fBDEVp
+\x00BSTSp
+\x00BHKEp
+\x01`\xa0\x1d\x92\x93BDEV
+\x0f\xa0\x13\x90\x92\\LFDC\x93BDEV
+\rp
+\x00`\xa1\x05p
+\x00`\xa0
+\x92\x95h
+\x04p
+\x00`\xa0\x08`BUWK
+\x01\xa1\x0fLED_
+\x04
+\x00BUWK
+\x00\x14D\x14BWAK\x01BUWK
+\x00pBGID
+\x00`\xa0\x10\x90\x92\\LFDC\x93`
+\rBDIS\\/\x05_SB_PCI0LPC_FDC__INI\xa0K\x05\\LFDC\xa0C\x05\x92\x93`
+\r\xa0K\x04\x93\\/\x05_SB_PCI0LPC_FDC_FD0S\\/\x05_SB_PCI0LPC_EC__HPNF\x86\\/\x05_SB_PCI0LPC_FDC_FDD0
+\x01\xa0J
+\x93BSTS
+\x00\xa0.\x92\x93`BDEV\xa0\x10BXCNp`BDEVNXRC`\xa1\x14NBEJBDEVp`BDEVNBIN`\xa1A\x07\xa0N\x06\x91\\LFDC\x92\x93BDEV
+\r\xa0M\x05\x92\x93`
+\x0fLED_
+\x04
+\x80\xa0M\x04HPBU}yh
+\x08\x00\x0b\x05 BHKE\\/\x06_SB_PCI0LPC_EC__HKEYMHKQBHKE\xa0\x06\x92\x94h
+\x02\xa1\x13\xa0
+BXCNNXRE`\xa1\x06NBRE`\x14N\x0fBDIS\x00\xa0F\x0f\x92\\/\x04_SB_PCI0LPC_CSON\xa0F\x06\x93\\BIDE
+\x03p
+\x00\\/\x04_SB_PCI0SATASIE0p
+\x00\\/\x04_SB_PCI0SATASTI0p
+\x00\\/\x04_SB_PCI0LPC_URST[!
+\x0fp
+\x01\\/\x04_SB_PCI0SATASSIG\xa1N\x05p
+\x00\\/\x04_SB_PCI0IDE0PIE0p
+\x00\\/\x04_SB_PCI0IDE0PTI0p
+\x00\\/\x04_SB_PCI0LPC_URST[!
+\x0fp
+\x01\\/\x04_SB_PCI0IDE0PSIGp
+\x01\\/\x04_SB_PCI0LPC_CSONBSFD\x14A\x0eBEN_\x01\xa0I\r\\/\x04_SB_PCI0LPC_CSONp
+\x00\\/\x04_SB_PCI0LPC_URSTp
+\x00\\/\x04_SB_PCI0LPC_CSON["
+\x0f\xa0C\th\xa05\x93\\BIDE
+\x03p
+\x00\\/\x04_SB_PCI0SATASSIGp
+\x01\\/\x04_SB_PCI0SATASIDE\xa1-p
+\x00\\/\x04_SB_PCI0IDE0PSIGp
+\x01\\/\x04_SB_PCI0IDE0PIDE[!
+-p
+\x01\\/\x04_SB_PCI0LPC_URST\xa0
+\x93h
+\x02["\x0b\xd0\x07\xa1\x06["\x0b\x90\x01\x14N\x05BSTA\x01\xa0\x17\\/\x04_SB_PCI0LPC_CSON\xa4
+\x00BINI\xa0\r\x93h
+\x00\xa4\x93BDEV
+\r\xa0\r\x93h
+\x01\xa4\x95BDEV
+\x0c\xa0\r\x93h
+\x02\xa4\x93BDEV
+\x0e\xa0\r\x93h
+\x03\xa4\x93BDEV
+\x11\xa4
+\x00\x14D\x06BUWK\x01\xa0?\\H8DR\xa0\x1chp
+\x01\\/\x05_SB_PCI0LPC_EC__HWBU\xa1\x1bp
+\x00\\/\x05_SB_PCI0LPC_EC__HWBU\xa1\x1c\xa0\rh\\MBEC
+2
+\xff
+\x80\xa1\x0c\\MBEC
+2
+\x7f
+\x00\x14\x1aBINI\x00\xa0\x13\x93BDEV
+\xffpBGID
+\x00BDEV\x14F\x0bBGID\x01\xa0\x06hp
+\xff`\xa1E
+\xa0\x0c\\H8DRpHBID`\xa1\x10zRBEC
+G
+\x02`{`
+\x0f`{`
+\x03`\xa0\t\x93`
+\x00p
+\x03`\xa1\x11\xa0\t\x93`
+\x02p
+\x06`\xa1\x05p
+\x0f`\xa0)\x93`
+\x0f\xa0\x10\\H8DR\xa0\tHB1Ap
+\x10`\xa1\x12\xa0\x10{\\RBEC
+9
+\x80\x00p
+\x10`\xa09\x93`
+\x0f\xa03\x92\\/\x04_SB_PCI0LPC_CSON\xa0\x1d\x92{\\/\x04_SB_PCI0LPC_GL00
+@\x00p
+\x11`\xa4`\x14(BSFD\x00\xa0\x13BSTA
+\x00\\MISA\x0b\xf3\x03
+\xf3
+\x00\xa1\r\\MISA\x0b\xf3\x03
+\xf3
+\x04\x14A\x0bNXRE\x01\xa0\x14\x93h
+\x0fLED_
+\x04
+\x00p
+\x00BSTS\xa0!\x93h
+\r\xa0\x1b\\LFDCLED_
+\x04
+\xc0\x86\\._SB_SWAP
+\x83\xa0\x1a\x95h
+\x0cLED_
+\x04
+\xc0\x86\\._SB_SWAP
+\x83\xa0\x1a\x93h
+\x0eLED_
+\x04
+\xc0\x86\\._SB_SWAP
+\x83\xa0<\x93h
+\x10\xa0\x1f\x91HPACHB0ALED_
+\x04
+\xc0\x86\\._SB_SWAP
+\x83\xa1\x16LED_
+\x04
+\xc0BEEP
+\x0fp
+\x02BSTS\x14E\x0cNXRC\x01\xa0+\x93h
+\r\xa0%\\LFDCLED_
+\x04
+\x80BEN_
+\x00BSFD\x86\\._SB_SWAP
+\x80\xa0.\x95h
+\x0cLED_
+\x04
+\x80\xa0\x0b\x93h
+\x06BEN_
+\x02\xa1\x07BEN_
+\x01\x86\\._SB_SWAP
+\x80\xa0 \x93h
+\x0eLED_
+\x04
+\x80BEN_
+\x00\x86\\._SB_SWAP
+\x80\xa04\x93h
+\x10\x86\\/\x05_SB_PCI0LPC_EC__BAT1
+\x81LED_
+\x04
+\x80\x86\\._SB_SWAP
+\x80BEEP
+\x00p
+\x00BSTS\x14I\x04NXEJ\x01\xa0\x1f\x93h
+\x10\x86\\/\x05_SB_PCI0LPC_EC__BAT1
+\x81\x86\\._SB_SWAP
+\x82LED_
+\x04
+\x00BEEP
+\x00p
+\x00BSTS\x14\x13NXIN\x01\x86\\._SB_SWAP
+\x81\x10C\x10\\/\x04_SB_PCI0LPC_FDC_\x08XFDS
+\x00\x08DCFD
+\x00\x14C\x05_INI\x00p
+\x00XFDS\xa07\\H8DR}\\/\x05_SB_PCI0LPC_EC__HAMA
+\x0c\\/\x05_SB_PCI0LPC_EC__HAMA\xa1\x0c\\MBEC
+\x1a
+\xff
+\x0c\x08FDEB\x11\x17
+\x14\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x8cFDEB
+\x00FD0S\x14C\x06_FDE\x00\xa0&\x91\\/\x05_SB_PCI0LPC_EC__BSTA
+\x00DCFDp
+\x01FD0S\xa1/\xa0$\x91\\/\x05_SB_PCI0LPC_EC__HPNFXFDSp
+\x00FD0S\xa1\x08p
+\x01FD0S\xa4FDEB\x10E\x06\\/\x05_SB_PCI0LPC_FDC_FDD0\x14K\x04_EJ0\x01\xa02\\/\x05_SB_PCI0LPC_EC__BSTA
+\x00\\/\x05_SB_PCI0LPC_EC__BEJ0h\xa1\x10\xa0\x05DCFD\xa1\x08p
+\x01XFDS\x10A\x12\\/\x04_SB_PCI0LPC_EC__\x14C\t_Q52\x00\xa02\\/\x05_SB_PCI0LPC_FDC_XFDSp
+\x00\\/\x05_SB_PCI0LPC_FDC_XFDS\xa1H\x05\xa02\x91\\/\x05_SB_PCI0LPC_EC__BSTA
+\x00\\/\x05_SB_PCI0LPC_FDC_DCFD\xa1"\xa0 \\LFDC\x86\\/\x05_SB_PCI0LPC_FDC_FDD0
+\x01\x14G\x07_Q53\x00p
+\x00\\/\x05_SB_PCI0LPC_FDC_XFDS\xa02\x91\\/\x05_SB_PCI0LPC_EC__BSTA
+\x00\\/\x05_SB_PCI0LPC_FDC_DCFD\xa1"\xa0 \\LFDC\x86\\/\x05_SB_PCI0LPC_FDC_FDD0
+\x01\x10F\x04\\/\x05_SB_PCI0LPC_EC__BAT1\x14,_EJ0\x01p
+\x00B1STp
+\x00XB1S\\/\x05_SB_PCI0LPC_EC__BEJ0h\x10@3\\_SB_[\x82G2SWAP\x08_HID\x0c$M\x00i\x14\x15_STA\x00\xa0\t\\WMEF\xa4
+\x0f\xa1\x04\xa4
+\x00\x14"XCNN\x01ph\\/\x05_SB_PCI0LPC_EC__BXCN\xa4
+\t\x14\tXSWP\x00\xa4
+\x01\x14\x1eXEJ0\x01\\/\x05_SB_PCI0LPC_EC__BEJ0h\x14\x1eXEJ3\x01\\/\x05_SB_PCI0LPC_EC__BEJ3h\x14@\x1fXDID\x00\x08XPCK\x12\x17\x06
+\x00
+\x00\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff\x0c\xff\xff\xff\xff
+\x00p\\/\x05_SB_PCI0LPC_EC__BDEV`p`\x88XPCK
+\x00\x00\xa0D\r\x95`
+\x0c\xa0J\x06\x93\\BIDE
+\x03p\\/\x04_SB_PCI0SATA_ADR\x88XPCK
+\x02\x00p\\/\x05_SB_PCI0SATASCND_ADR\x88XPCK
+\x03\x00p\\/\x06_SB_PCI0SATASCNDMSTR_ADR\x88XPCK
+\x04\x00\xa1B\x06p\\/\x04_SB_PCI0IDE0_ADR\x88XPCK
+\x02\x00p\\/\x05_SB_PCI0IDE0PRIM_ADR\x88XPCK
+\x03\x00p\\/\x06_SB_PCI0IDE0PRIMMSTR_ADR\x88XPCK
+\x04\x00\xa0O\x05\x93`
+\r\xa0K\x04\\LFDCp\\/\x05_SB_PCI0LPC_FDC__HID\x88XPCK
+\x02\x00p\\/\x06_SB_PCI0LPC_FDC_FDD0_ADR\x88XPCK
+\x04\x00\xa1\x0cp
+\x0f\x88XPCK
+\x00\x00\xa0N\x04\x93`
+\x10p\\/\x06_SB_PCI0LPC_EC__BAT1_HID\x88XPCK
+\x02\x00p\\/\x06_SB_PCI0LPC_EC__BAT1_UID\x88XPCK
+\x04\x00p\x7f\\/\x04_SB_PCI0LPC_CSON
+\x01\x00\x88XPCK
+\x05\x00\xa4XPCK\x14H\x05XSTM\x01\x08XDMY\x11\x03
+\x14\xa0\'\x93\\BIDE
+\x03\\/\x05_SB_PCI0SATASCND_STMXDMYh
+\x00\xa1\x1f\\/\x05_SB_PCI0IDE0PRIM_STMXDMYh
+\x00\x14K\x04XGTF\x00\xa0%\x93\\BIDE
+\x03\xa4\\/\x06_SB_PCI0SATASCNDMSTR_GTF\xa1\x1d\xa4\\/\x06_SB_PCI0IDE0PRIMMSTR_GTF\x10L\xe9\\_SB_[\x82C\xe9GDCK\x08_HID\x0c$M\x00y\x08_CID\x0cA\xd0\x0c\x15\x08DOID\x0c\xff\xff\xff\xff\x08DIDB\x0c\xff\xff\xff\xff\x08FLAG
+\x00\x08WUCT
+\x00\x08DHKE
+\x00[\x02DEVT\x14?DSTA\x00UDCKUDKT\xa0\x1a\x91\x93GDID\x0c$M\x00L\x93GDID\x0c$M\x00Dp
+\x0f`\xa1\x13\xa0\x0b\x92\\W98Fp
+\x00`\xa1\x05p
+\x0c`\xa4`\x14G\x07DPTS\x01\xa0O\x06\x90\x92\x95h
+\x01\x92\x94h
+\x04p
+\x00DHKE\xa0\x18DFLG
+\x02
+\x02p
+\x00DOIDDFLG
+\x01
+\x02\xa0/\x91\x93GDID\x0c$M\x00L\x93GDID\x0c$M\x00D\\/\x05_SB_PCI0LPC_EC__DDWK
+\x01pGDIDDIDBDFLG
+\x00\x0b\x00\x01\x08DDTM
+\x00\x14J\x18DWAK\x01p\x0c\xff\xff\xff\xffDOID\xa0H\x17\x90\x92\x95h
+\x01\x92\x94h
+\x04p
+\x00DDTM\xa0\x1d\x91\x93DIDB\x0c$M\x00L\x93DIDB\x0c$M\x00Dp
+\x01DDTM\xa0B\rDDTMp
+\x00DDTM\xa0\x12\x93GDID\x0c$M\x00Lp
+\x01DDTM\xa0\x12\x93GDID\x0c$M\x00Dp
+\x01DDTM\xa0;DDTM\xa0"\x93h
+\x04\xa0\x1c{\\/\x04_SB_PCI0LPC_WAKR
+\x08\x00DGPEyh
+\x08DHKE\xa0
+\x92DFLG
+\x02
+\x08\xa1B\x06p
+\x01\\/\x04_SB_PCI0LPC_BUSD\\/\x05_SB_PCI0LPC_EC__DATT
+\x00
+\x01\\/\x05_SB_PCI0LPC_EC__DATT
+\x01
+\x00\x86\\._SB_GDCK
+\x00\\DHDP
+\x00\xa1;p
+\x00DDTM\xa0\x12\x93GDID\x0c$M\x00Lp
+\x01DDTM\xa0\x12\x93GDID\x0c$M\x00Dp
+\x01DDTM\xa0\tDDTMWDCK\xa1\x02\xa3DFLG
+\x01\x0b\x00\x01DFLG
+\x01
+\x02DFLG
+\x01
+\x10DFLG
+\x01
+ p
+\x01\\/\x04_SB_PCI0LPC_DSCI\x14\x0eDGPE\x00DFLG
+\x00
+\x08\x14N\x12DDCK\x01\xa0J\x08h\\/\x05_SB_PCI0LPC_EC__LED_
+\x08
+\x00\\/\x05_SB_PCI0LPC_EC__LED_
+\t
+\x80\\/\x04_SB_PCI0LPC_LCON
+\x01BCON
+\x01\\/\x05_SB_PCI0LPC_EC__DATT
+\x00
+\x00\\/\x05_SB_PCI0LPC_EC__DATT
+\x01
+\x01\xa1H\t\\/\x05_SB_PCI0LPC_EC__LED_
+\x08
+\x80\\/\x05_SB_PCI0LPC_EC__LED_
+\t
+\xc0DFLG
+\x00
+\x02\\DHDP
+\x00BCON
+\x00\\/\x04_SB_PCI0LPC_LCON
+\x00\\/\x05_SB_PCI0LPC_EC__DATT
+\x00
+\x01\\/\x05_SB_PCI0LPC_EC__DATT
+\x01
+\x00\xa4
+\x01\x14C\x05DEJ0\x01\xa0\rhp
+\x00DOIDUDKIDFLG
+\x01
+\x02\\/\x05_SB_PCI0LPC_EC__LED_
+\x08
+\x00\\/\x05_SB_PCI0LPC_EC__LED_
+\t
+\x00\x14\x1fDEJ3\x01\xa0\x18hDFLG
+\x00
+\x10\xa0\r\x93\\SPS_
+\x03PDE3\x14\x11DEJ4\x01\xa0
+hDFLG
+\x00
+ \x14\x07PDE3\x00\xa3\x08HIDE
+\x00\x14@\x08WDCK\x00\xa0/\x91DFLG
+\x02
+\x10DFLG
+\x02
+ DDCK
+\x01\xa0\x16\\W98FDFLG
+\x00\x0b\x00\x02p
+\x05HIDE\xa1H\x04\xa06\x93\\/\x05_SB_PCI0LPC_EC__BGID
+\x00
+\x11\\/\x05_SB_PCI0LPC_EC__NBRE
+\x11\xa1\x0e\x86\\._SB_GDCK
+\x00\x14O\x07UDCK\x00\xa0G\x07DFLG
+\x02
+\x08\xa0L\x06\x92DFLG
+\x02\x0b\x00\x01}DHKE\x0b\x04 DHKE\xa0(\x93\\UOPT
+\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQDHKE\xa0\x13\\W98F\x86\\._SB_GDCK
+\x01\xa1\x0e\x86\\._SB_GDCK
+\x03DFLG
+\x01
+\x08\x14\x1dUDKI\x00\xa0\r\\WNTFp
+\x01WUCT\xa1\x08p
+\x05WUCT\x14C\x05UDKT\x00\xa0K\x04{DHKE\x0b\x04 \x00\xa0?\x93GDID
+\x00\xa06\x92vWUCTp
+\x00DHKE\xa0\'\x93\\UOPT
+\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x03@\x145GDID\x00\xa0)\x93DOID\x0c\xff\xff\xff\xffp\x0c\xff\xff\xff\xff\\/\x03_SB_GDCKG_IDpRDIDDOID\xa4DOID\x14O\tRDID\x00p
+\x00`\xa0A\t\\/\x04_SB_PCI0LPC_EPWG\xa0@\x06\x93\\/\x03_SB_GDCKGGID
+\x00\xa0B\x04\\H8DR\xa01\\/\x05_SB_PCI0LPC_EC__EEPRp\\/\x05_SB_PCI0LPC_EC__HDEP`\xa1\x08p\x0c$M\x00L`\xa1\x08p\\DCKI`\xa0\x1a\x93\\/\x03_SB_GDCKGGID
+\x01p\x0c$M\x00D`\xa4`\x14G\x08RDSR\x00p
+\x00`\xa0I\x07\x92\x93GDID
+\x00\xa0F\x05\x93\\/\x03_SB_GDCKGGID
+\x00\xa08\\H8DR\xa01\\/\x05_SB_PCI0LPC_EC__EEPRp\\/\x05_SB_PCI0LPC_EC__HDEN`\xa1\x08p\\DCKS`\xa0\x17\x93\\/\x03_SB_GDCKGGID
+\x01p
+\x00`\xa4`\x14E\x17BCON\x01p\\/\x05_SB_PCI0LPC_EC__DATT
+\x00
+\x02`\\/\x05_SB_PCI0LPC_EC__DATT
+\x00
+\x01}\\/\x04_SB_PCI0LPC_SERQ
+@\\/\x04_SB_PCI0LPC_SERQ{\\/\x04_SB_PCI0LPC_SERQ
+\x7f\\/\x04_SB_PCI0LPC_SERQp\\/\x04_SB_PCI0LPC_CLKRa\xa0.hp
+\x00\\/\x04_SB_PCI0LPC_CLKRp
+\x01\\/\x04_SB_PCI0LPC_BUSC\xa1\x17p
+\x01\\/\x04_SB_PCI0LPC_BUSDpa\\/\x04_SB_PCI0LPC_CLKR}\\/\x04_SB_PCI0LPC_SERQ
+\xc0\\/\x04_SB_PCI0LPC_SERQ{\\/\x04_SB_PCI0LPC_SERQ
+\xbf\\/\x04_SB_PCI0LPC_SERQ\xa0 \x93`
+\x00\\/\x05_SB_PCI0LPC_EC__DATT
+\x00
+\x00\x149DFLG\x02\xa0\x0f\x93h
+\x00}FLAGiFLAG\xa0\x11\x93h
+\x01{FLAG\x80i\x00FLAG\xa0\x0b{FLAGi\x00\xa4
+\x01\xa1\x04\xa4
+\x00\x10L\x1b\\/\x04_SB_PCI0LPC_EC__\x14A\x11_Q37\x00\xa0I\x10\\/\x04_SB_PCI0LPC_EPWGp\x0b\xd0\x07`["
+dp\x0c\xff\xff\xff\xff\\/\x03_SB_GDCKG_ID\xa20\x90\x93\\/\x03_SB_GDCKGGID
+\x07`["
+\x01p\x0c\xff\xff\xff\xff\\/\x03_SB_GDCKG_IDv`p\x0c\xff\xff\xff\xff\\/\x03_SB_GDCKDOID\xa0O\x08\x91\x93\\/\x03_SB_GDCKGDID\x0c$M\x00L\x93\\/\x03_SB_GDCKGDID\x0c$M\x00D\xa06\x93\\/\x05_SB_PCI0LPC_EC__BGID
+\x00
+\x11\\/\x05_SB_PCI0LPC_EC__NBRE
+\x11\xa1*\xa0(HPACp
+\x00\\/\x04_SB_PCI0LPC_DRST\x86\\._SB_GDCK
+\x00\x14D\tEEPR\x00p
+\x00`\xa0F\x08\\H8DRp
+\x00HDEOp
+
+HDEC\xa2\x0e\x92{HDEC
+\xc0\x00["
+\x01\xa0A\x06\x92{HDEC
+@\x00p
+\x00apHDENbp
+\x04c\xa2\x11cra{b
+\xff\x00azb
+\x08bvcpHDEPbp
+\x04c\xa2\x11cra{b
+\xff\x00azb
+\x08bvcraHDEMaraHDESa\xa0\x0b\x92{a
+\xff\x00p
+\x01`\xa4`\x14D\x04_STA\x00pGGID`\xa0\x0b\x92\\W98Fp
+\x00a\xa1\x05p
+\x0ca\xa0\x1b\x91\x93`
+\x00\x93`
+\x01p\\/\x03_SB_GDCKDSTAa\xa0\x06\x93`
+\x02\xa3\xa4a\x14H\x0c_INI\x00\\/\x05_SB_PCI0LPC_EC__DATT
+\x02
+\x01\xa0>\x93GGID
+\x07\\/\x05_SB_PCI0LPC_EC__DATT
+\x01
+\x00\\/\x05_SB_PCI0LPC_EC__DATT
+\x00
+\x01\xa17\\/\x05_SB_PCI0LPC_EC__DATT
+\x01
+\x01\\/\x05_SB_PCI0LPC_EC__DATT
+\x00
+\x00\\/\x05_SB_PCI0LPC_EC__DDWK
+\x00p
+\x01\\/\x04_SB_PCI0LPC_DSCI\x14K\x04_DCK\x01p
+\x00`\xa0"\x91\x93GGID
+\x00\x93GGID
+\x01p\\/\x03_SB_GDCKDDCKh`\xa0\x1a\\VIGD\\/\x04_SB_PCI0VID_VDSWh\xa4`\x08UDOP
+\x00\x148_EJ0\x01\xa0\x18\x93GGID
+\x00\\/\x03_SB_GDCKDEJ0h\xa0\x18\x93GGID
+\x01\\/\x03_SB_GDCKDEJ0h\x148XEJ3\x01\xa0\x18\x93GGID
+\x00\\/\x03_SB_GDCKDEJ3h\xa0\x18\x93GGID
+\x01\\/\x03_SB_GDCKDEJ3h\x148_EJ4\x01\xa0\x18\x93GGID
+\x00\\/\x03_SB_GDCKDEJ4h\xa0\x18\x93GGID
+\x01\\/\x03_SB_GDCKDEJ4h\x146PEJ3\x00\xa0\x17\x93GGID
+\x00\\/\x03_SB_GDCKPDE3\xa0\x17\x93GGID
+\x01\\/\x03_SB_GDCKPDE3\x14A\x04_BDN\x00p
+\x00`\xa0\x19\x93GGID
+\x00p\\/\x03_SB_GDCKRDID`\xa0\x19\x93GGID
+\x01p\\/\x03_SB_GDCKRDID`\xa4`\x14A\x04_UID\x00p
+\x00`\xa0\x19\x93GGID
+\x00p\\/\x03_SB_GDCKRDSR`\xa0\x19\x93GGID
+\x01p\\/\x03_SB_GDCKRDSR`\xa4`\x14.GPTS\x01\\/\x03_SB_GDCKDPTSh\\/\x05_SB_PCI0LPC_EC__RPTSh\x14H\x04GWAK\x01\\/\x03_SB_GDCKDWAKh\\/\x05_SB_PCI0LPC_EC__RWAKh\\/\x05_SB_PCI0LPC_EC__DDWK
+\x00\x146GGPE\x00\xa0\x17\x93GGID
+\x00\\/\x03_SB_GDCKDGPE\xa0\x17\x93GGID
+\x01\\/\x03_SB_GDCKDGPE\x08G_ID\x0c\xff\xff\xff\xff\x14N\x06GGID\x00pG_ID`\xa0N\x05\x93`\x0c\xff\xff\xff\xffp\\/\x04_SB_PCI0LPC_DKI0`p\\/\x04_SB_PCI0LPC_DKI1ap\\/\x04_SB_PCI0LPC_DKI2b}`ya
+\x01\x00`}`yb
+\x02\x00`p`G_ID\xa4`\x10F*\\/\x04_SB_PCI0LPC_EC__\x14M\x07_Q50\x00p\\/\x03_SB_GDCKGGID`\xa0D\x06\x91\x93`
+\x00\x93`
+\x01\\/\x05_SB_PCI0LPC_EC__LED_
+\x08
+\x80\\/\x05_SB_PCI0LPC_EC__LED_
+\t
+\xc0\xa0\x13\\W98F\x86\\._SB_GDCK
+\x01\xa1\x0e\x86\\._SB_GDCK
+\x03\x14F\x19DATT\x02p
+\x00`\xa0B\x08\x93h
+\x00\xa0(\x93i
+\x01\xa0\x11\\H8DR}HAM6
+\x80HAM6\xa1\x0c\\MBEC
+\x16
+\xff
+\x80p
+\x01`\xa0$\x93i
+\x00\xa0\x11\\H8DR{HAM6
+\x7fHAM6\xa1\x0c\\MBEC
+\x16
+\x7f
+\x00\xa0-\x93i
+\x02\xa0\x14\\H8DR\xa0\r{HAM6
+\x80\x00p
+\x01`\xa1\x12\xa0\x10{\\RBEC
+\x16
+\x80\x00p
+\x01`\xa0B\x08\x93h
+\x01\xa0(\x93i
+\x01\xa0\x11\\H8DR}HAMA
+\x01HAMA\xa1\x0c\\MBEC
+\x1a
+\xff
+\x01p
+\x01`\xa0$\x93i
+\x00\xa0\x11\\H8DR{HAMA
+\xfeHAMA\xa1\x0c\\MBEC
+\x1a
+\xfe
+\x00\xa0-\x93i
+\x02\xa0\x14\\H8DR\xa0\r{HAMA
+\x01\x00p
+\x01`\xa1\x12\xa0\x10{\\RBEC
+\x1a
+\x01\x00p
+\x01`\xa0B\x08\x93h
+\x02\xa0(\x93i
+\x01\xa0\x11\\H8DR}HAMB
+\x01HAMB\xa1\x0c\\MBEC
+\x1b
+\xff
+\x01p
+\x01`\xa0$\x93i
+\x00\xa0\x11\\H8DR{HAMB
+\xfeHAMB\xa1\x0c\\MBEC
+\x1a
+\xfe
+\x00\xa0-\x93i
+\x02\xa0\x14\\H8DR\xa0\r{HAMB
+\x01\x00p
+\x01`\xa1\x12\xa0\x10{\\RBEC
+\x1b
+\x01\x00p
+\x01`\xa4`\x14K\x07DDWK\x01p
+\x00`\xa0#\x93h
+\x01\xa0\x0c\\H8DRp\x01HWDK\xa1\x0c\\MBEC
+2
+\xff
+\x08p
+\x01`\xa0\x1f\x93h
+\x00\xa0\x0c\\H8DRp\x00HWDK\xa1\x0c\\MBEC
+2
+\xf7
+\x00\xa0)\x93h
+\x02\xa0\x10\\H8DR\xa0\tHWDKp
+\x01`\xa1\x12\xa0\x10{\\RBEC
+2
+\x08\x00p
+\x01`\xa4`\x10#\\/\x04_SB_PCI0LPC_EC__\x14\x07RPTS\x01\xa3\x14\x06RWAK\x01\x10B\x10\\/\x04_SB_PCI0LPC_EC__\x14N\x04_Q1C\x00\xa0?\\/\x06_SB_PCI0LPC_EC__HKEYMHKK\x0c\x00\x00 \x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x16\x10\\UCMS
+\x00\x14N\x04_Q1D\x00\xa0?\\/\x06_SB_PCI0LPC_EC__HKEYMHKK\x0c\x00\x00\x10\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x15\x10\\UCMS
+\x01\x14N\x04_Q1E\x00\xa0?\\/\x06_SB_PCI0LPC_EC__HKEYMHKK\x0c\x00\x00@\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x17\x10\\UCMS
+\x02\x10L\x13\\/\x04_SB_PCI0LPC_EC__\x08BRTF
+\x01\x14N\x08_Q14\x00\xa0=\\/\x06_SB_PCI0LPC_EC__HKEYMHKK\x0b\x00\x80\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x10\x10\xa0?\\NBCF\xa0\x1c\\VIGD\x86\\/\x04_SB_PCI0VID_LCD0
+\x86\xa1\x1b\x86\\/\x05_SB_PCI0AGP_VID_LCD0
+\x86\xa1\x08\\UCMS
+\x04\x14@\t_Q15\x00\xa0?\\/\x06_SB_PCI0LPC_EC__HKEYMHKK\x0c\x00\x00\x01\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x11\x10\xa0?\\NBCF\xa0\x1c\\VIGD\x86\\/\x04_SB_PCI0VID_LCD0
+\x87\xa1\x1b\x86\\/\x05_SB_PCI0AGP_VID_LCD0
+\x87\xa1\x08\\UCMS
+\x05\x10D\x06\\/\x04_SB_PCI0LPC_EC__\x14N\x04_Q19\x00\xa0?\\/\x06_SB_PCI0LPC_EC__HKEYMHKK\x0c\x00\x00\x80\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x18\x10\\UCMS
+\x03\x10D\x06\\/\x04_SB_PCI0LPC_EC__\x14N\x04_Q63\x00\xa0?\\/\x06_SB_PCI0LPC_EC__HKEYMHKK\x0c\x00\x00\x08\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x14\x10\\UCMS
+\x0b\x10C\t\\/\x04_SB_PCI0LPC_EC__\x14
+_Q70\x00FNST\x14
+_Q72\x00FNST\x14
+_Q73\x00FNST\x14L\x05FNST\x00\xa0\x12\\H8DRpHFNS`pHFNEa\xa1\x17{\\RBEC
+\x0e
+\x03`{\\RBEC
+\x00
+\x08a\xa0)a\xa0\x0c\x93`
+\x00\\UCMS
+\x11\xa0\x0c\x93`
+\x01\\UCMS
+\x0f\xa0\x0c\x93`
+\x02\\UCMS
+\x10\x10I<\\/\x05_SB_PCI0LPC_EC__HKEY\x08WGFL
+\x00\x14\x1eWLSW\x00\xa4\\/\x05_SB_PCI0LPC_EC__GSTS\x14B\x04GWAN\x00p
+\x00`\xa0\x0e{WGFL
+\x01\x00}`
+\x01`\xa0\x0b{WGFL
+\x08\x00\xa4`\xa0
+WPWS}`
+\x02`\xa0\x0e{WGFL
+\x04\x00}`
+\x04`\xa4`\x14K\x04SWAN\x01\xa0\x0c{h
+\x02\x00WPWC
+\x01\xa1\x07WPWC
+\x00\xa0\x18{h
+\x04\x00}WGFL
+\x04WGFL\\WGSV
+\x02\xa1\x15{WGFL\x80
+\x04\x00WGFL\\WGSV
+\x03\x14B\x04GBDC\x00p
+\x00`\xa0\x0e{WGFL
+\x10\x00}`
+\x01`\xa0\x0b{WGFL
+\x80\x00\xa4`\xa0
+BPWS}`
+\x02`\xa0\x0e{WGFL
+@\x00}`
+\x04`\xa4`\x14K\x04SBDC\x01\xa0\x0c{h
+\x02\x00BPWC
+\x01\xa1\x07BPWC
+\x00\xa0\x18{h
+\x04\x00}WGFL
+@WGFL\\BLTH
+\x02\xa1\x15{WGFL\x80
+@\x00WGFL\\BLTH
+\x03\x14;WPWS\x00\xa0\x1f\\H8DRp\\/\x05_SB_PCI0LPC_EC__DCWW`\xa1\x12pz{\\RBEC
+:
+@\x00
+\x06\x00`\xa4`\x14\x19WTGL\x00\xa0\x12{WGFL
+\x01\x00WPWC\x92WPWS\x14B\tWPWC\x01\xa0N\x04\x90h\x90{WGFL
+\x01\x00\x92{WGFL
+\x08\x00\xa0\x1f\\H8DRp\x01\\/\x05_SB_PCI0LPC_EC__DCWW\xa1\x0c\\MBEC
+:
+\xff
+@}WGFL
+\x02WGFL\xa1;\xa0\x1f\\H8DRp\x00\\/\x05_SB_PCI0LPC_EC__DCWW\xa1\x0c\\MBEC
+:
+\xbf
+\x00{WGFL\x80
+\x02\x00WGFL\x14;BPWS\x00\xa0\x1f\\H8DRp\\/\x05_SB_PCI0LPC_EC__DCBD`\xa1\x12pz{\\RBEC
+:
+\x10\x00
+\x04\x00`\xa4`\x14\x19BTGL\x00\xa0\x12{WGFL
+\x10\x00BPWC\x92BPWS\x14B\tBPWC\x01\xa0N\x04\x90h\x90{WGFL
+\x10\x00\x92{WGFL
+\x80\x00\xa0\x1f\\H8DRp\x01\\/\x05_SB_PCI0LPC_EC__DCBD\xa1\x0c\\MBEC
+:
+\xff
+\x10}WGFL
+ WGFL\xa1;\xa0\x1f\\H8DRp\x00\\/\x05_SB_PCI0LPC_EC__DCBD\xa1\x0c\\MBEC
+:
+\xef
+\x00{WGFL\x80
+ \x00WGFL\x14;WGIN\x00p
+\x00WGFLp\\WGSV
+\x01WGFL\xa0\x10WPWS}WGFL
+\x02WGFL\xa0\x10BPWS}WGFL
+ WGFL\x146WGPS\x01\xa0\r\x92\x95h
+\x04\\BLTH
+\x05\xa0\x10\x92{WGFL
+\x04\x00WPWC
+\x00\xa0\x10\x92{WGFL
+@\x00BPWC
+\x00\x14&WGWK\x01\xa0\x0f{WGFL
+ \x00BPWC
+\x01\xa0\x0f{WGFL
+\x02\x00WPWC
+\x01\x109\\/\x04_SB_PCI0LPC_EC__\x14$_Q41\x00\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b\x00p\x10N\x0b\\_SB_[\x82E\x0bLCIO\x08_HID\x0c0\xae\x00\x01\x08_CID\x0cA\xd0
+\x06\x14)_STA\x00\xa0\x1d\\/\x05_SB_PCI0LPC_EC__BSTA
+\x03\xa4
+\x0f\xa1\x04\xa4
+\x00\x14@\x07_EJ0\x01\\/\x05_SB_PCI0LPC_EC__BEJ0h\xa0@\x05\x91\x93\\/\x03_SB_GDCKGDID\x0c$M\x00L\x93\\/\x03_SB_GDCKGDID\x0c$M\x00Dp
+\x00\\/\x04_SB_PCI0LPC_DRST\x86\\._SB_GDCK
+\x00\x10#\\/\x04_SB_PCI0EXP3EXPD\x08_EJD\r_SB.GDCK\x00\x10\'\\/\x05_SB_PCI0USB2URTHUPDK\x08_EJD\r_SB.GDCK\x00\x10\'\\/\x05_SB_PCI0USB7URTHUPDK\x08_EJD\r_SB.GDCK\x00\x101\\/\x05_SB_PCI0USB1URTHUPEX\x08_EJD\r_SB.PCI0.EXP2.EXUP\x00\x101\\/\x05_SB_PCI0USB7URTHUPEX\x08_EJD\r_SB.PCI0.EXP2.EXUP\x00\x102\\/\x04_SB_PCI0EXP2EXUP\x08_EJD\r_SB.PCI0.USB7.URTH.UPEX\x00\x08\\_S0_\x12
+\x04
+\x00
+\x00
+\x00
+\x00\x08\\_S3_\x12
+\x04
+\x05
+\x05
+\x00
+\x00\x08\\_S4_\x12
+\x04
+\x06
+\x06
+\x00
+\x00\x08\\_S5_\x12
+\x04
+\x07
+\x07
+\x00
+\x00\x14O\x1d\\_PTS\x01p
+\x01`\xa0\x0c\x93h\\SPS_p
+\x00`\xa0\x0f\x91\x93h
+\x00\x92\x95h
+\x06p
+\x00`\xa0E\x1b`ph\\SPS_\\/\x06_SB_PCI0LPC_EC__HKEYMHKE
+\x00\xa0\x1f\\/\x05_SB_PCI0LPC_EC__KBLT\\UCMS
+\r\xa0G\x05\x93h
+\x01p\\/\x05_SB_PCI0LPC_EC__HFNI\\FNIDp
+\x00\\/\x05_SB_PCI0LPC_EC__HFNIp
+\x00\\/\x05_SB_PCI0LPC_EC__HFSP\xa02\x93h
+\x03\\VVPD
+\x03\\TRAPp\\/\x06_SB_PCI0LPC_EC__AC___PSR\\ACST\xa0)\x93h
+\x04\\/\x03_SB_SLPB_PSW
+\x00\xa0\r\\SPEN\\STEP
+\x07\\TRAP\xa0
+\x93h
+\x05\\TRAP\\/\x05_SB_PCI0LPC_EC__BPTSh\xa0 \x92\x95h
+\x04p
+\x00\\/\x05_SB_PCI0LPC_EC__HWLB\xa1\x1bp
+\x01\\/\x05_SB_PCI0LPC_EC__HWLB\xa0<\x92\x93h
+\x05p
+\x01\\/\x05_SB_PCI0LPC_EC__HCMU\\/\x03_SB_GDCKGPTSh\xa0\x0b\\W98F\\CBRI\\/\x06_SB_PCI0LPC_EC__HKEYWGPSh\x08WAKI\x12\x06\x02
+\x00
+\x00\x14AJ\\_WAK\x01\xa0\x10\x91\x93h
+\x00\x92\x95h
+\x05\xa4WAKIp
+\x00\\SPS_p
+\x00\\/\x05_SB_PCI0LPC_EC__HCMUp
+\x80\\/\x05_SB_PCI0LPC_EC__HFSP\\/\x05_SB_PCI0LPC_EC__EVNT
+\x01\\/\x06_SB_PCI0LPC_EC__HKEYMHKE
+\x01\\/\x05_SB_PCI0LPC_EC__FNST\\UCMS
+\rp
+\x00\\LIDB\xa0"\x93h
+\x01p\\/\x05_SB_PCI0LPC_EC__HFNI\\FNID\xa0A\x13\x93h
+\x03THRM
+\x00\xa0E\x04\\WXPFp
+\x00\\/\x04_SB_PCI0LPC_C4C3\xa0\'\\OSC4\x86\\._PR_CPU0
+\x81\xa0\x13\\MPEN\x86\\._PR_CPU1
+\x81\xa1D\x07\xa0A\x07\\WNTF\xa02\\/\x06_SB_PCI0LPC_EC__AC___PSRp
+\x00\\/\x04_SB_PCI0LPC_C4C3\xa16\xa0\x1c\\CWASp
+\x00\\/\x04_SB_PCI0LPC_C4C3\xa1\x17p
+\x01\\/\x04_SB_PCI0LPC_C4C3\xa0:\x92\x93\\ACST\\/\x06_SB_PCI0LPC_EC__AC___PSR\\/\x05_SB_PCI0LPC_EC__ATMC\xa0.\x90{\\CFGD\x0c\x00\x00\x00\x01\x00\x90\\WXPF\x92\x94\\WSPV
+\x01\xa0\x10{\\CFGD
+\xf0\x00PPMS
+\x00\xa0@\x13\x93h
+\x04\xa0\x0bDTSETHRM
+\x02\xa0\x13\\W98F\x86\\._SB_SLPB
+\x02\xa0\x1f\\WMEF\\/\x05_SB_PCI0LPC_EC__BEEP
+\x05\xa0!\x92\\W98Fp
+\x00\\/\x05_SB_PCI0LPC_EC__HSPA\xa0.\\WXPF\xa0\'\\OSC4\x86\\._PR_CPU0
+\x81\xa0\x13\\MPEN\x86\\._PR_CPU1
+\x81\xa1D\x04\xa0A\x04\\WNTF\xa09\x91\x92\\/\x06_SB_PCI0LPC_EC__AC___PSR\\CWASp
+\x00\\/\x04_SB_PCI0LPC_C4C3\xa0\r\\SPEN\\STEP
+\x08\\/\x05_SB_PCI0LPC_EC__ATMC\xa0.\x90{\\CFGD\x0c\x00\x00\x00\x01\x00\x90\\WXPF\x92\x94\\WSPV
+\x01\xa0\x10{\\CFGD
+\xf0\x00PPMS
+\x00\xa0O\x07\x7f\\/\x04_SB_PCI0EXP2PDS_\\/\x04_SB_PCI0EXP2XCPF\x00\xa0*\\/\x04_SB_PCI0EXP2PDS_p
+\x01\\/\x04_SB_PCI0EXP2XCPF\xa1\x17p
+\x00\\/\x04_SB_PCI0EXP2XCPF\x86\\/\x03_SB_PCI0EXP2
+\x00\\/\x03_SB_GDCKGWAKh\\/\x05_SB_PCI0LPC_EC__BWAKh\\/\x06_SB_PCI0LPC_EC__HKEYWGWKh\x86\\._TZ_THM0
+\x80\x86\\._TZ_THM1
+\x80\\VSLD\\/\x03_SB_LID__LID\xa01\x90\\W98F\x92\\WMEF\x86\\/\x03_SB_PCI0USB0
+\x00\x86\\/\x03_SB_PCI0USB1
+\x00\xa09\x95h
+\x04\xa03{\\RRBF
+\x02\x00yh
+\x08`p}\x0b\x13 `\x00`\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ`p\x00\\RRBF\xa4WAKI\x10@\x1e\\_SI_\x14H\x1d_SST\x01\xa0;\x93h
+\x00\\/\x05_SB_PCI0LPC_EC__LED_
+\x00
+\x00\\/\x05_SB_PCI0LPC_EC__LED_
+\x07
+\x00\xa0B\x06\x93h
+\x01\xa0%\x91\\SPS_\\WNTF\\/\x05_SB_PCI0LPC_EC__BEEP
+\x05\\/\x05_SB_PCI0LPC_EC__LED_
+\x00
+\x80\\/\x05_SB_PCI0LPC_EC__LED_
+\x07
+\x00\xa0;\x93h
+\x02\\/\x05_SB_PCI0LPC_EC__LED_
+\x00
+\x80\\/\x05_SB_PCI0LPC_EC__LED_
+\x07
+\xc0\xa0K\x0b\x93h
+\x03\xa0"\x94\\SPS_
+\x03\\/\x05_SB_PCI0LPC_EC__BEEP
+\x07\xa1O\x04\xa01\x93\\SPS_
+\x03\\/\x05_SB_PCI0LPC_EC__BEEP
+\x03\\/\x03_SB_GDCKPEJ3\xa1\x1a\\/\x05_SB_PCI0LPC_EC__BEEP
+\x04\xa0\t\x93\\SPS_
+\x03\xa1\x1c\\/\x05_SB_PCI0LPC_EC__LED_
+\x00
+\x80\\/\x05_SB_PCI0LPC_EC__LED_
+\x07
+\xc0\xa09\x93h
+\x04\\/\x05_SB_PCI0LPC_EC__BEEP
+\x03\\/\x05_SB_PCI0LPC_EC__LED_
+\x07
+\xc0\x10C<\\_GPE[\x01MGPE\x07\x14N
+_L18\x00p\\/\x05_SB_PCI0LPC_EC__HWAK`p`\\RRBF["
+
+\xa0\x06{`
+\x02\x00\xa0){`
+\x04\x00\xa0\x13\\W98F\x86\\._SB_SLPB
+\x02\xa1\x0e\x86\\._SB_LID_
+\x02\xa0"{`
+\x08\x00\\/\x03_SB_GDCKGGPE\x86\\._SB_SLPB
+\x02\xa0\x13{`
+\x10\x00\x86\\._SB_SLPB
+\x02\xa0\x06{`
+@\x00\xa0\x13{`
+\x80\x00\x86\\._SB_SLPB
+\x02\x14K\x0f_L09\x00\xa0<\\/\x04_SB_PCI0EXP0PSP0p
+\x01\\/\x04_SB_PCI0EXP0PSP0\x86\\/\x03_SB_PCI0EXP0
+\x02\xa0<\\/\x04_SB_PCI0EXP1PSP1p
+\x01\\/\x04_SB_PCI0EXP1PSP1\x86\\/\x03_SB_PCI0EXP1
+\x02\xa0<\\/\x04_SB_PCI0EXP2PSP2p
+\x01\\/\x04_SB_PCI0EXP2PSP2\x86\\/\x03_SB_PCI0EXP2
+\x02\xa0<\\/\x04_SB_PCI0EXP3PSP3p
+\x01\\/\x04_SB_PCI0EXP3PSP3\x86\\/\x03_SB_PCI0EXP3
+\x02\x14D\x17_L01\x00\xa0@\x0f\\/\x04_SB_PCI0EXP2HPCSp
+\x01\\/\x04_SB_PCI0EXP2HPCS\xa0*\\/\x04_SB_PCI0EXP2ABP_p
+\x01\\/\x04_SB_PCI0EXP2ABP_\xa0I\t\\/\x04_SB_PCI0EXP2PDC_p
+\x01\\/\x04_SB_PCI0EXP2PDC_p
+\x00\\/\x04_SB_PCI0EXP2XCPF\x86\\/\x03_SB_PCI0EXP2
+\x00\xa0E\x04\\/\x04_SB_PCI0EXP2PDS_p
+\x01\\/\x04_SB_PCI0EXP2XCPF["
+d\x86\\/\x04_SB_PCI0EXP2EXUP
+\x01[#MGPE\xff\xff\xa0M\x06\\/\x04_SB_PCI0EXP0HPCSp
+\x01\\/\x04_SB_PCI0EXP0HPCS\xa0A\x04\\/\x04_SB_PCI0EXP0PDC_["
+\xc8p
+\x01\\/\x04_SB_PCI0EXP0PDC_\x86\\/\x03_SB_PCI0EXP0
+\x00[\'MGPE\x14D\t_L02\x00p
+\x00\\/\x04_SB_PCI0LPC_SWGE\xa0A\x04\\/\x06_SB_PCI0LPC_EC__HKEYDHKC\xa0#DT02\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b"`\x86\\._TZ_THM1
+\x80\xa0\'\\OSPX\x86\\._PR_CPU0
+\x80\xa0\x13\\MPEN\x86\\._PR_CPU1
+\x80\x10@(\\/\x05_SB_PCI0LPC_EC__HKEY\x14H\x0cMHQT\x01\xa0M\x0b\x90\\WNTF\\TATC\xa0\x0e\x93h
+\x00p\\TATC`\xa4`\xa1@
+\xa0K\x04\x93h
+\x01p\\TDFA`r`y\\TDTA
+\x04\x00`r`y\\TDFD
+\x08\x00`r`y\\TDTD
+\x0c\x00`r`y\\TNFT
+\x10\x00`r`y\\TNTT
+\x14\x00`\xa4`\xa1A\x05\xa02\x93h
+\x02p\\TCFA`r`y\\TCTA
+\x04\x00`r`y\\TCFD
+\x08\x00`r`y\\TCTD
+\x0c\x00`\xa4`\xa1\x1b\xa0\x05\x93h
+\x03\xa1\x13\xa0\x0e\x93h
+\x04p\\TATW`\xa4`\xa1\x02\xa3\xa4
+\x00\x14O\x07MHAT\x01\xa0D\x07\x90\\WNTF\\TATCp{h
+\xff\x00`\xa0
+\x92ATMV`\xa4
+\x00p{zh
+\x08\x00
+\xff\x00`\xa0
+\x92ATMV`\xa4
+\x00p{h
+\x0f\x00\\TCFAp{zh
+\x04\x00
+\x0f\x00\\TCTAp{zh
+\x08\x00
+\x0f\x00\\TCFDp{zh
+\x0c\x00
+\x0f\x00\\TCTDATMC\xa4
+\x01\xa4
+\x00\x14@\rMHGT\x01\xa0E\x0c\x90\\WNTF\\TATCpy\\TSFT
+\x10\x00`r`y\\TSTT
+\x14\x00`p{h
+\xff\x00a\xa0\x0b\x92ATMVa\xa4\x0b\xff\xffp{h
+\x0f\x00a\xa0\r\x93a
+\x00r`\\TIF0`\xa1&\xa0\r\x93a
+\x01r`\\TIF1`\xa1\x16\xa0\r\x93a
+\x02r`\\TIF2`\xa1\x06r`
+\xff`p{zh
+\x04\x00
+\x0f\x00a\xa0\x11\x93a
+\x00r`y\\TIT0
+\x08\x00`\xa12\xa0\x11\x93a
+\x01r`y\\TIT1
+\x08\x00`\xa1\x1e\xa0\x11\x93a
+\x02r`y\\TIT2
+\x08\x00`\xa1
+r`y
+\xff
+\x08\x00`\xa4`\xa4
+\x00\x14L\x04ATMV\x01p{h
+\x0f\x00ap\\TNFT`\xa0\x08\x92\x95a`\xa4
+\x00p{zh
+\x04\x00
+\x0f\x00bp\\TNTT`\xa0\x08\x92\x95b`\xa4
+\x00\xa0\x0f\\TATL\xa0\x08\x7fab\x00\xa4
+\x00\xa4
+\x01\x10F\x10\\/\x04_SB_PCI0LPC_EC__\x14@\x0fATMC\x00\xa0H\x0e\x90\\WNTF\\TATC\xa0E\x06HPACp\\TCFA`p\\TCTAap}ya
+\x04\x00`\x00ATMX\xa0\x1f\x93\\TCTA
+\x00p\\TCR0\\TCRTp\\TPS0\\TPSV\xa1#\xa0\x1f\x93\\TCTA
+\x01p\\TCR1\\TCRTp\\TPS1\\TPSV\xa1\x01\xa1A\x06p\\TCFD`p\\TCTDap}ya
+\x04\x00`\x00ATMX\xa0\x1f\x93\\TCTD
+\x00p\\TCR0\\TCRTp\\TPS0\\TPSV\xa1#\xa0\x1f\x93\\TCTD
+\x01p\\TCR1\\TCRTp\\TPS1\\TPSV\xa1\x01\x86\\._TZ_THM0
+\x81THRM
+\x01\x10C\x1f\\_TZ_[\x85L\x0cTHM0\x14\r_CRT\x00\xa4C2K_
+\x7f\x14G\x0b_TMP\x00\xa0B\x05\\H8DRp\\/\x05_SB_PCI0LPC_EC__TMP0`p\\/\x05_SB_PCI0LPC_EC__HT12ap\\/\x05_SB_PCI0LPC_EC__HT13b\xa1$p\\RBEC
+x`p{\\RBEC
+@\x00ap{\\RBEC
+\x80\x00b\xa0\tb\xa4C2K_
+\x80\xa0\'\x92\\/\x06_SB_PCI0LPC_EC__HKEYDHKC\xa0\ta\xa4C2K_
+\x80\xa4C2K_`[\x85@\x0fTHM1\x143_PSL\x00\xa0\x1e\\MPEN\xa4\x12\x16\x02\\._PR_CPU0\\._PR_CPU1\xa4\x12\x0c\x01\\._PR_CPU0\x14\x0c_CRT\x00\xa4\\TCRT\x14\x0c_PSV\x00\xa4\\TPSV\x14\x0c_TC1\x00\xa4\\TTC1\x14\x0c_TC2\x00\xa4\\TTC2\x14\x0c_TSP\x00\xa4\\TTSP\x14D\x07_TMP\x00\xa0J\x05\\DTSETHRM
+\x02pDTS1`\xa0\x11\x92\x95DTS0DTS1pDTS0`\xa0.\x92\\/\x06_SB_PCI0LPC_EC__HKEYDHKC\xa0\x10DT02r\\TCRT
+\x01`\xa4`\xa4C2K_`\xa1\x11\xa4\\/\x03_TZ_THM0_TMP\x14+C2K_\x01rwh
+
+\x00\x0b\xac
+`\xa0\x0c\x92\x94`\x0b\xac
+p\x0b\xb8\x0b`\xa0\x0b\x94`\x0b\xac\x0fp\x0b\xb8\x0b`\xa4`\x10O\x13\\/\x04_SB_PCI0LPC_EC__\x14I\x12_Q40\x00\x86\\._TZ_THM0
+\x80\xa08\\H8DRp\\/\x05_SB_PCI0LPC_EC__HT11`p\\/\x05_SB_PCI0LPC_EC__HT12a\xa1\x1bp{\\RBEC
+ \x00`p{\\RBEC
+@\x00a\xa0=\\/\x06_SB_PCI0LPC_EC__HKEYDHKC\xa0 a\\/\x06_SB_PCI0LPC_EC__HKEYMHKQ\x0b"`\xa0\x06VIGD\xa3\xa1\x06\\VTHR\xa0C\x07\\SPEN\xa0\'\\OSPX\x86\\._PR_CPU0
+\x80\xa0\x13\\MPEN\x86\\._PR_CPU1
+\x80\xa1C\x04\xa07\x91\\/\x05_SB_PCI0LPC_EC__HT00\\/\x05_SB_PCI0LPC_EC__HT10\\STEP
+\t\xa1\x08\\STEP
+
+\x08GPIC
+\x00\x14\r_PIC\x01ph\\GPIC[\x80MNVS\x00\x0c\x00@\xef\x7f\x0b\x00\x10[\x81B+MNVS\x03\x00\x80\x80\x07GAPA GAPL DCKI DCKS VCDL\x01VCDC\x01VCDT\x01VCDD\x01VIGD\x01VCSS\x01VCDB\x01VCIN\x01VPDF\x01\x00\x07VLID\x04VVPO\x04\x00\x08CDFL\x08CDAH\x08PMOD\x02PDIR\x01PDMA\x01\x00\x04LFDC\x01\x00\x07C2NA\x01C3NA\x01C4NA\x01\x00\x05SPEN\x01\x00\x01\x00\x01\x00\x01MPEN\x01\x00\x03OSPX\x01OSC4\x01OSSS\x01NHPS\x01NPME\x01\x00\x03UOPT\x08BTID LWST\x08LPST\x08TCRT\x10TPSV\x10TTC1\x10TTC2\x10TTSP\x10SRAH\x08SRHE\x08SRE0\x08SRE1\x08SRE2\x08SRE3\x08SRE4\x08SRE5\x08SRU0\x08SRU1\x08SRU2\x08SRU3\x08SRU7\x08SRPB\x08SRLP\x08SRSA\x08SRSM\x08CWAC\x01CWAS\x01\x00\x06CWAP\x10CWAT\x10DBGC\x01\x00\x07FS1L\x10FS1M\x10FS1H\x10FS2L\x10FS2M\x10FS2H\x10FS3L\x10FS3M\x10FS3H\x10TATC\x01\x00\x06TATL\x01TATW\x08TNFT\x04TNTT\x04TDFA\x04TDTA\x04TDFD\x04TDTD\x04TCFA\x04TCTA\x04TCFD\x04TCTD\x04TSFT\x04TSTT\x04TIT0\x08TCR0\x10TPS0\x10TIT1\x08TCR1\x10TPS1\x10TIT2\x08TCR2\x10TPS2\x10TIF0\x08TIF1\x08TIF2\x08\x00 TCZ1\x08TCZ2\x08TCZ3\x08BTHI\x01\x00\x07HDIR\x01HDEH\x01\x00\x06TPMP\x01TPMS\x01\x00\x06BIDE\x08\x00\x01DTSE\x01\x00\x06DTS0\x08DTS1\x08DT00\x01DT01\x01DT02\x01DT03\x01\x00\x04PH01\x08PH02\x08PH03\x08PH04\x08PH05\x08PH06\x08PH07\x08PH08\x08PH09\x08PH0A\x08PH0B\x08LIDB\x01\x00\x07TCG0\x01\x00\x07[\x81\x13MNVS\x01\x00\x80\x00\x07DDC1@@\x00@@[\x81\x10MNVS\x01\x00\x80\x00\x07DDC2@\x80[\x80SMI0\x01
+\xb2
+\x01[\x81\x0bSMI0\x01APMC\x08[\x81(MNVS\x00\x00\x80\xe0\x07CMD_\x08ERR_ PAR0 PAR1 PAR2 PAR3 [\x01MSMI\x07\x14F\x05SMI_\x05[#MSMI\xff\xffphCMD_piPAR0pjPAR1pkPAR2plPAR3p
+\xf5APMC\xa2\x13\x93ERR_
+\x01["
+dp
+\xf5APMCpPAR0`[\'MSMI\xa4`\x14\x14RPCI\x01\xa4SMI_
+\x00
+\x00h
+\x00
+\x00\x14\x12WPCI\x02SMI_
+\x00
+\x01hi
+\x00\x14\x11MPCI\x03SMI_
+\x00
+\x02hij\x14\x14RBEC\x01\xa4SMI_
+\x00
+\x03h
+\x00
+\x00\x14\x12WBEC\x02SMI_
+\x00
+\x04hi
+\x00\x14\x11MBEC\x03SMI_
+\x00
+\x05hij\x14\x14RISA\x01\xa4SMI_
+\x00
+\x06h
+\x00
+\x00\x14\x12WISA\x02SMI_
+\x00
+\x07hi
+\x00\x14\x11MISA\x03SMI_
+\x00
+\x08hij\x14\x14VEXP\x00SMI_
+\x01
+\x00
+\x00
+\x00
+\x00\x14\x13VUPS\x01SMI_
+\x01
+\x01h
+\x00
+\x00\x14\x12VSDS\x02SMI_
+\x01
+\x02hi
+\x00\x14\x14VDDC\x00SMI_
+\x01
+\x03
+\x00
+\x00
+\x00\x14\x13VVPD\x01SMI_
+\x01
+\x04h
+\x00
+\x00\x14\x13VNRS\x01SMI_
+\x01
+\x05h
+\x00
+\x00\x14\x15GLPW\x00\xa4SMI_
+\x01
+\x06
+\x00
+\x00
+\x00\x14\x13VSLD\x01SMI_
+\x01
+\x07h
+\x00
+\x00\x14\x14VEVT\x01\xa4SMI_
+\x01
+\x08h
+\x00
+\x00\x14\x15VTHR\x00\xa4SMI_
+\x01
+\t
+\x00
+\x00
+\x00\x14\x13VBRC\x01SMI_
+\x01
+
+h
+\x00
+\x00\x14\x15VBRG\x00\xa4SMI_
+\x01
+\x0e
+\x00
+\x00
+\x00\x14\x14UCMS\x01\xa4SMI_
+\x02h
+\x00
+\x00
+\x00\x14\x13BHDP\x02\xa4SMI_
+\x03
+\x00hi
+\x00\x14\x14DHDP\x01\xa4SMI_
+\x03
+\x01h
+\x00
+\x00\x14\x13STEP\x01SMI_
+\x04h
+\x00
+\x00
+\x00\x14\x14TRAP\x00SMI_
+\x05
+\x00
+\x00
+\x00
+\x00\x14\x14CBRI\x00SMI_
+\x05
+\x01
+\x00
+\x00
+\x00\x14"DSPD\x01\xa0\x18\x92\x94h
+\x01rh
+\x02hSMI_
+\x05h
+\x00
+\x00
+\x00\xa1\x02\xa3\x14\x14BLTH\x01\xa4SMI_
+\x06h
+\x00
+\x00
+\x00\x14\x14FISP\x00SMI_
+\x07
+\x00
+\x00
+\x00
+\x00\x14\x13ATCC\x01SMI_
+\x08h
+\x00
+\x00
+\x00\x14\x14WGSV\x01\xa4SMI_
+\th
+\x00
+\x00
+\x00\x14\x14THRM\x01\xa4SMI_
+
+h
+\x00
+\x00
+\x00\x14\x14PPMS\x01\xa4SMI_
+\x0bh
+\x00
+\x00
+\x00\x14\x13TPHY\x01SMI_
+\x0ch
+\x00
+\x00
+\x00\x14\x13TMOR\x01SMI_
+\rh
+\x00
+\x00
+\x00\x143DPIO\x02\xa0\x06\x92h\xa4
+\x00\xa0\x08\x94h
+\xf0\xa4
+\x00\xa0\x10\x94h
+\xb4\xa0\x05i\xa4
+\x02\xa1\x04\xa4
+\x01\xa0\x08\x94h
+x\xa4
+\x03\xa4
+\x04\x14=DUDM\x02\xa0\x06\x92i\xa4
+\xff\xa0\x08\x94h
+Z\xa4
+\x00\xa0\x08\x94h
+<\xa4
+\x01\xa0\x08\x94h
+-\xa4
+\x02\xa0\x08\x94h
+\x1e\xa4
+\x03\xa0\x08\x94h
+\x14\xa4
+\x04\xa4
+\x05\x14(DMDM\x02\xa0\x05i\xa4
+\x00\xa0\x06\x92h\xa4
+\x00\xa0\x08\x94h
+\x96\xa4
+\x01\xa0\x08\x94h
+x\xa4
+\x02\xa4
+\x03\x14A\x05UUDM\x02\xa0
+\x92{h
+\x04\x00\xa4
+\x00\xa0\t{i
+ \x00\xa4
+\x14\xa0\t{i
+\x10\x00\xa4
+\x1e\xa0\t{i
+\x08\x00\xa4
+-\xa0\t{i
+\x04\x00\xa4
+<\xa0\t{i
+\x02\x00\xa4
+Z\xa0\t{i
+\x01\x00\xa4
+x\xa4
+\x00\x14H\x04UMDM\x04\xa0
+\x92{h
+\x02\x00\xa4
+\x00\xa0\x08{i
+\x04\x00\xa4k\xa0\x14{i
+\x02\x00\xa0\t\x92\x94k
+x\xa4
+\xb4\xa1\x03\xa4k\xa0\x14{j
+\x04\x00\xa0\t\x92\x94k
+\xb4\xa4
+\xf0\xa1\x03\xa4k\xa4
+\x00\x14K\x04UPIO\x04\xa0\x16\x92{h
+\x02\x00\xa0\x08\x93j
+\x02\xa4
+\xf0\xa1\x05\xa4\x0b\x84\x03\xa0\x08{i
+\x02\x00\xa4k\xa0\x14{i
+\x01\x00\xa0\t\x92\x94k
+x\xa4
+\xb4\xa1\x03\xa4k\xa0\x08\x93j
+\x02\xa4
+\xf0\xa1\x05\xa4\x0b\x84\x03\x14-FDMA\x02\xa0\x0c\x92\x93i
+\xff\xa4}i
+@\x00\xa0\x10\x92\x95h
+\x03\xa4}th
+\x02\x00
+ \x00\xa0\x05h\xa4
+\x12\xa4
+\x00\x14\x1fFPIO\x01\xa0\x0c\x92\x95h
+\x03\xa4}h
+\x08\x00\xa0\x08\x93h
+\x01\xa4
+\x01\xa4
+\x00\x14J\x05SCMP\x02p\x87h`\xa0\x08\x92\x93`\x87i\xa4\x01u`\x08STR1\x11\x02`\x08STR2\x11\x02`phSTR1piSTR2p\x00a\xa2"\x95a`p\x83\x88STR1a\x00bp\x83\x88STR2a\x00c\xa0\x07\x92\x93bc\xa4\x01ua\xa4\x00\x08SPS_
+\x00\x08OSIF
+\x00\x08W98F
+\x00\x08WNTF
+\x00\x08WMEF
+\x00\x08WXPF
+\x00\x08WVIS
+\x00\x08WSPV
+\x00\x08LNUX
+\x00\x08H8DR
+\x00\x08MEMX
+\x00\x08ACST
+\x00\x08FNID
+\x00\x08RRBF
+\x00\x08NBCF
+\x00''')
+f('sys/firmware/acpi/tables/SSDT1', 0o664, b'''SSDT\xaa\x01\x00\x00\x01\x89LENOVOTP-7I    \x11\x00\x00MSFT\x0e\x00\x00\x01\x10\x0e\\\x00\x14
+KOU2\x00[!
+d\x10I\x0b\\/\x04_SB_PCI0VID_LCD0\x14&_BCL\x00p
+\x01\\NBCF\xa4\x12\x16
+
+d
+\x1e
+\x1e
+(
+2
+<
+F
+P
+Z
+d\x08BCLP\x12\x12\x08
+\x1e
+(
+2
+<
+F
+P
+Z
+d\x08BCLL\x12\x12\x08
+\x00
+\x01
+\x02
+\x03
+\x04
+\x05
+\x06
+\x07\x14*_BCM\x01p\x89BCLP\x01h\x00
+\x00
+\x00`\xa0\x15\x92\x93`\xffp\x83\x88BCLL`\x00a\\VBRCa\x14!_BQC\x00p\\VBRG`\xa0\x0f\x92\x94`
+\x07\xa4\x83\x88BCLP`\x00\xa1\x03\xa4\x00\x10L\x0b\\/\x05_SB_PCI0AGP_VID_LCD0\x14%_BCL\x00p
+\x01NBCF\xa4\x12\x16
+
+d
+\x1e
+\x1e
+(
+2
+<
+F
+P
+Z
+d\x08BCLP\x12\x12\x08
+\x1e
+(
+2
+<
+F
+P
+Z
+d\x08BCLL\x12\x12\x08
+\x00
+\x01
+\x02
+\x03
+\x04
+\x05
+\x06
+\x07\x14*_BCM\x01p\x89BCLP\x01h\x00
+\x00
+\x00`\xa0\x15\x92\x93`\xffp\x83\x88BCLL`\x00a\\VBRCa\x14!_BQC\x00p\\VBRG`\xa0\x0f\x92\x94`
+\x07\xa4\x83\x88BCLP`\x00\xa1\x03\xa4\x00''')
+f('sys/firmware/acpi/tables/SLIC', 0o664, b'SLICv\x01\x00\x00\x01\x1dLENOVOTP-7I    \x11\x00\x00 LTP\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x06\x02\x00\x00\x00$\x00\x00RSA1\x00\x04\x00\x00\x01\x00\x01\x00i\x16J\x9f\xb1K:\xfb\x80 \xaa\xaf\xc4\xf9>\xc1\x80I\xeeje&r\x1e\xcd\xbf_/\x96\xd6\xc0\n\x92\xf5\x06\xb5\x00\xb2;)\x02\xe2L\x8d\xc2\xf2\xbcAw\x9cp\xf0\xf3\x1b\t\xd2cZ\xdc\xa8\x83\xf8^\xc9\x15\x95\xf9\xfa\xfd\xdc\x05\xb7Mg\x7f-\xb3\x843 \xe1\xd1y*\xa7jw\xd1\xb6 *vB\xc5\xd5\xe9\xb6C@UD\xc3\xc97\x99_A\x97p\xf3\xd1\xf6\x07\xec{\x1a)\xa1\xc1\xf1\x91\xfdH\x86n>\xce\xcb\x01\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x02\x00LENOVOTP-7I   WINDOWS \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8bz\xb4\xe1\x0e{\x7fc\xd3M%N\xd7\tBd\x9c\x89\xf6F\xb8L\xd5M\x86sy\xf0\x15\xf2\x98\xad\x806\t\xbd\x8c%wn\xb8C\xf4\xb1\xf0W\x08x\x8d\xc6\x18T\xe1`G\xf07\xfdH\xd2\xfdM\x07\xdd\x91O\x9e*\xd6\xdd4\xeb\x9ac\x9a\xb8O%\xd4o\xf0\x95\xbb\xce\xbd:X\x04\xc5l\xb8\xa8\xd89\xf5\x02Oh\x84\x9c)K\xd0\x9b\x16\xb5\xf5A\xb0\x9d\xb8A\x07\x9dJ\x11\xaf\x19\xbd\xb7\xc7\x05\xb6\xa7\x93H\xf6\xcb')
+f('sys/firmware/acpi/tables/SSDT3', 0o664, b'''SSDT\xa6\x00\x00\x00\x01hLENOVOTP-7I    \x11\x00\x00INTL\x13\x05\x05 \x10A\x08\\._PR_CPU1\x08_TPC
+\x00\x14\x16_PTC\x00\xa4\\/\x03_PR_CPU0_PTC\x14\x16_TSS\x00\xa4\\/\x03_PR_CPU0_TSS\x14?_TSD\x00\xa0\'\x90{CFGD\x0c\x00\x00\x00\x01\x00\x92{PDC1
+\x04\x00\xa4\x12\x0f\x01\x12\x0c\x05
+\x05
+\x00
+\x00
+\xfd
+\x02\xa4\x12\x0f\x01\x12\x0c\x05
+\x05
+\x00
+\x01
+\xfc
+\x01''')
+f('sys/firmware/acpi/tables/SSDT5', 0o664, b'''SSDT\xd8\x01\x00\x00\x01\tLENOVOTP-7I    \x11\x00\x00INTL\x13\x05\x05 \x10C\x1b\\/\x03_SB_PCI0SATA[\x82@\x1aPRT0\x08DRE0
+\x00\x08DIP0
+\x00\x08HDTF\x11\x11
+\x0e\x02\x00\x00\x00\x00\xa0\xef\x00\x00\x00\x00\x00\xa0\xf5\x8cHDTF
+\rHFLC\x08ERTF\x11\x18
+\x15\x02\x00\x00\x00\x00\xa0\xef\x00\x00\x00\x00\x00\xa0\xf5_\x00\x00\x00\x00\xa0\xef\x8cERTF
+\rEFLC\x08HPTF\x11\x18
+\x15\x02\x00\x00\x00\x00\xa0\xef\x00\x00\x00\x00\x00\xa0\xf5\x10\x03\x00\x00\x00\xa0\xef\x8cHPTF
+\rPFLC\x08HXTF\x11\x1f
+\x1c\x02\x00\x00\x00\x00\xa0\xef\x00\x00\x00\x00\x00\xa0\xf5_\x00\x00\x00\x00\xa0\xef\x10\x03\x00\x00\x00\xa0\xef\x8cHXTF
+\rXFLC\x08_ADR\x0b\xff\xff\x14L\x08_SDD\x01p
+\x00DRE0p
+\x00DIP0\xa0F\x07\x93\x87h\x0b\x00\x02\x8bh
+\x9cM078\x8bh
+\xacM086\x8bh
+\xeeM119\x8bh\x0b(\x01M148\xa0\x1f\x93{M148\x0b\x00\xc0\x00\x0b\x00@\xa0\x10{M148
+\x04\x00p
+\x01DRE0\xa0\x1b{M086\x0b\x00\x80\x00\xa0\x10{M119
+\x01\x00p
+\x01DRE0\xa0\x10{M078
+\x08\x00p
+\x01DIP0\x14B\x05_GTF\x00\xa0"\\OSSSp
+\xe1XFLCp
+\xe1EFLCp
+\xe1HFLCp
+\xe1PFLC\xa0\x17DRE0\xa0
+DIP0\xa4HXTF\xa1\x06\xa4ERTF\xa0
+DIP0\xa4HPTF\xa4HDTF''')
+f('sys/firmware/acpi/tables/HPET', 0o664, b'HPET8\x00\x00\x00\x01\xaaLENOVOTP-7I    \x11\x00\x00LNVO\x01\x00\x00\x00\x01\xa2\x86\x80\x00\x00\x00\x00\x00\x00\xd0\xfe\x00\x00\x00\x00\x00\x80\x00\x00')
+f('sys/firmware/acpi/tables/FACP', 0o664, b'FACP\xf4\x00\x00\x00\x03\xf0LENOVOTP-7I    \x11\x00\x00LNVO\x01\x00\x00\x00\x00@\xef\x7f^\x19\xed\x7f\x00\x02\t\x00\xb2\x00\x00\x00\xf0\xf1\x00\xf3\x00\x10\x00\x00\x00\x00\x00\x00\x04\x10\x00\x00\x00\x00\x00\x00 \x10\x00\x00\x08\x10\x00\x00(\x10\x00\x00\x00\x00\x00\x00\x04\x02\x01\x04\x08\x00\x00\xf4\x01\x00U\x00\x00\x00\x00\x00\x01\x03\r\x002\x12\x00\x00\xad\xc2\x00\x00\x01\x08\x00\x00\xf9\x0c\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00@\xef\x7f\x00\x00\x00\x00^\x19\xed\x7f\x00\x00\x00\x00\x01 \x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\x04\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x00 \x10\x00\x00\x00\x00\x00\x00\x01 \x00\x00\x08\x10\x00\x00\x00\x00\x00\x00\x01 \x00\x00(\x10\x00\x00\x00\x00\x00\x00\x01 \x00\x00,\x10\x00\x00\x00\x00\x00\x00')
+f('sys/firmware/acpi/tables/APIC', 0o664, b'''APICh\x00\x00\x00\x01lLENOVOTP-7I    \x11\x00\x00LNVO\x01\x00\x00\x00\x00\x00\xe0\xfe\x01\x00\x00\x00\x00\x08\x00\x00\x01\x00\x00\x00\x00\x08\x01\x01\x01\x00\x00\x00\x01\x0c\x01\x00\x00\x00\xc0\xfe\x00\x00\x00\x00\x02
+\x00\x00\x02\x00\x00\x00\x00\x00\x02
+\x00\t\t\x00\x00\x00\r\x00\x04\x06\x00\x05\x00\x01\x04\x06\x01\x05\x00\x01''')
+f('sys/firmware/acpi/tables/SSDT2', 0o664, b'''SSDT_\x02\x00\x00\x01\xc2LENOVOTP-7I    \x11\x00\x00INTL\x13\x05\x05 \x10J#\\._PR_CPU0\x08_TPC
+\x00\x14M\x06_PTC\x00\xa07{PDC0
+\x04\x00\xa4\x12,\x02\x11\x14
+\x11\x82\x0c\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00y\x00\x11\x14
+\x11\x82\x0c\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00y\x00\xa4\x12,\x02\x11\x14
+\x11\x82\x0c\x00\x01\x04\x01\x00\x10\x10\x00\x00\x00\x00\x00\x00y\x00\x11\x14
+\x11\x82\x0c\x00\x01\x04\x01\x00\x10\x10\x00\x00\x00\x00\x00\x00y\x00\x08TSSI\x12A\x07\x08\x12\r\x05
+d\x0b\xe8\x03
+\x00
+\x00
+\x00\x12\r\x05
+X\x0bk\x03
+\x00
+\x0f
+\x00\x12\r\x05
+K\x0b\xee\x02
+\x00
+\x0e
+\x00\x12\r\x05
+?\x0bq\x02
+\x00
+\r
+\x00\x12\r\x05
+2\x0b\xf4\x01
+\x00
+\x0c
+\x00\x12\r\x05
+&\x0bw\x01
+\x00
+\x0b
+\x00\x12\x0c\x05
+\x19
+\xfa
+\x00
+
+
+\x00\x12\x0c\x05
+\r
+}
+\x00
+\t
+\x00\x08TSSM\x12A\x07\x08\x12\r\x05
+d\x0b\xe8\x03
+\x00
+\x00
+\x00\x12\r\x05
+X\x0bk\x03
+\x00
+\x1e
+\x00\x12\r\x05
+K\x0b\xee\x02
+\x00
+\x1c
+\x00\x12\r\x05
+?\x0bq\x02
+\x00
+\x1a
+\x00\x12\r\x05
+2\x0b\xf4\x01
+\x00
+\x18
+\x00\x12\r\x05
+&\x0bw\x01
+\x00
+\x16
+\x00\x12\x0c\x05
+\x19
+\xfa
+\x00
+\x14
+\x00\x12\x0c\x05
+\r
+}
+\x00
+\x12
+\x00\x08TSSF
+\x00\x14C\x08_TSS\x00\xa0G\x06\x90\x92TSSF[\x12_PSS\x00p_PSS`p\x87`avap\x83\x88\x83\x88`a\x00
+\x01\x00bp
+\x00c\xa25\x95c\x87TSSIpxwbt
+\x08c\x00\x00
+\x08\x00\x00dpd\x88\x83\x88TSSIc\x00
+\x01\x00pd\x88\x83\x88TSSMc\x00
+\x01\x00ucp\xffTSSF\xa0\x0e{PDC0
+\x04\x00\xa4TSSM\xa4TSSI\x14?_TSD\x00\xa0\'\x90{CFGD\x0c\x00\x00\x00\x01\x00\x92{PDC0
+\x04\x00\xa4\x12\x0f\x01\x12\x0c\x05
+\x05
+\x00
+\x00
+\xfd
+\x02\xa4\x12\x0f\x01\x12\x0c\x05
+\x05
+\x00
+\x00
+\xfc
+\x01''')
+f('sys/firmware/acpi/tables/BOOT', 0o664, b'BOOT(\x00\x00\x00\x01\xa8LENOVOTP-7I    \x11\x00\x00 LTP\x01\x00\x00\x005\x00\x00\x00')
+f('sys/firmware/acpi/tables/TCPA', 0o664, b'TCPA2\x00\x00\x00\x02YLENOVOTP-7I    \x11\x00\x00LNVO\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\xce\x1a\xee\x7f\x00\x00\x00\x00')
+f('sys/firmware/acpi/tables/SSDT4', 0o664, b'''SSDT\xf7\x04\x00\x00\x01\xa6LENOVOTP-7I    \x11\x00\x00INTL\x13\x05\x05 \x10E\x08\\\x00\x08SSDT\x12C\x05\x0c\rCPU0IST \x00\x0c6\x1d\xef\x7f\x0c\xc4\x02\x00\x00\rCPU1IST \x00\x0cn\x1c\xef\x7f\x0c\xc8\x00\x00\x00\rCPU0CST \x00\x0c\x7f \xef\x7f\x0cZ\x06\x00\x00\rCPU1CST \x00\x0c\xfa\x1f\xef\x7f\x0c\x85\x00\x00\x00\x08CFGD\x0c\xf1i;\x11\x08\\PDC0\x0c\x00\x00\x00\x80\x08\\PDC1\x0c\x00\x00\x00\x80\x08\\SDTL
+\x00\x10@!\\._PR_CPU0\x08HI0_
+\x00\x08HC0_
+\x00\x14H\x06_PDC\x01\x8ah
+\x00REVS\x8ah
+\x04SIZEp\x87h`pt`
+\x08\x00a[\x13h
+@wa
+\x08\x00TEMP\x08STS0\x11\x07
+\x04\x00\x00\x00\x00sSTS0TEMPb_OSC\x11\x13
+\x10\x16\xa6w@\x0c)\xbeG\x9e\xbd\xd8pXq9SREVSSIZEb\x14L\x18_OSC\x04\x8ak
+\x00STS0\x8ak
+\x04CAP0\x8ah
+\x00IID0\x8ah
+\x04IID1\x8ah
+\x08IID2\x8ah
+\x0cIID3\x08UID0\x11\x13
+\x10\x16\xa6w@\x0c)\xbeG\x9e\xbd\xd8pXq9S\x8aUID0
+\x00EID0\x8aUID0
+\x04EID1\x8aUID0
+\x08EID2\x8aUID0
+\x0cEID3\xa02\x92\x90\x90\x93IID0EID0\x93IID1EID1\x90\x93IID2EID2\x93IID3EID3p
+\x06STS0\xa4k\xa0\x0f\x92\x93i
+\x01p
+
+STS0\xa4k}{PDC0\x0c\xff\xff\xff\x7f\x00CAP0PDC0\xa0L\x05{CFGD
+\x01\x00\xa0A\x05\x90\x90{CFGD\x0c\x00\x00\x00\x01\x00\x93{PDC0
+\t\x00
+\t\x92{SDTL
+\x01\x00}SDTL
+\x01SDTL[\x80IST0\x00\x83\x88SSDT
+\x01\x00\x83\x88SSDT
+\x02\x00[ IST0HI0_\xa0I\x05{CFGD
+\xf0\x00\xa0N\x04\x90\x90{CFGD\x0c\x00\x00\x00\x01\x00{PDC0
+\x18\x00\x92{SDTL
+\x02\x00}SDTL
+\x02SDTL[\x80CST0\x00\x83\x88SSDT
+\x07\x00\x83\x88SSDT
+\x08\x00[ CST0HC0_\xa4k\x10K#\\._PR_CPU1\x08HI1_
+\x00\x08HC1_
+\x00\x14H\x06_PDC\x01\x8ah
+\x00REVS\x8ah
+\x04SIZEp\x87h`pt`
+\x08\x00a[\x13h
+@wa
+\x08\x00TEMP\x08STS1\x11\x07
+\x04\x00\x00\x00\x00sSTS1TEMPb_OSC\x11\x13
+\x10\x16\xa6w@\x0c)\xbeG\x9e\xbd\xd8pXq9SREVSSIZEb\x14L\x18_OSC\x04\x8ak
+\x00STS1\x8ak
+\x04CAP1\x8ah
+\x00IID0\x8ah
+\x04IID1\x8ah
+\x08IID2\x8ah
+\x0cIID3\x08UID1\x11\x13
+\x10\x16\xa6w@\x0c)\xbeG\x9e\xbd\xd8pXq9S\x8aUID1
+\x00EID0\x8aUID1
+\x04EID1\x8aUID1
+\x08EID2\x8aUID1
+\x0cEID3\xa02\x92\x90\x90\x93IID0EID0\x93IID1EID1\x90\x93IID2EID2\x93IID3EID3p
+\x06STS1\xa4k\xa0\x0f\x92\x93i
+\x01p
+
+STS1\xa4k}{PDC1\x0c\xff\xff\xff\x7f\x00CAP1PDC1\xa0L\x05{CFGD
+\x01\x00\xa0A\x05\x90\x90{CFGD\x0c\x00\x00\x00\x01\x00\x93{PDC1
+\t\x00
+\t\x92{SDTL
+\x10\x00}SDTL
+\x10SDTL[\x80IST1\x00\x83\x88SSDT
+\x04\x00\x83\x88SSDT
+\x05\x00[ IST1HI1_\xa0I\x05{CFGD
+\xf0\x00\xa0N\x04\x90\x90{CFGD\x0c\x00\x00\x00\x01\x00{PDC1
+\x18\x00\x92{SDTL
+ \x00}SDTL
+ SDTL[\x80CST1\x00\x83\x88SSDT
+
+\x00\x83\x88SSDT
+\x0b\x00[ CST1HC1_\xa4k\x14*_INI\x00\xa0\x0c\\DTSETHRM
+\x00\xa0\x16\x90\\WXPF\x92\x94\\WSPV
+\x01PPMS
+\x00''')
+f('sys/firmware/acpi/tables/ECDT', 0o664, b'ECDTR\x00\x00\x00\x01ULENOVOTP-7I    \x11\x00\x00LNVO\x01\x00\x00\x00\x01\x08\x00\x00f\x00\x00\x00\x00\x00\x00\x00\x01\x08\x00\x00b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\\_SB.PCI0.LPC.EC\x00')
+f('sys/firmware/acpi/tables/FACS', 0o664, b'FACS@\x00\x00\x00/\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+f('sys/firmware/acpi/tables/MCFG', 0o664, b'MCFG<\x00\x00\x00\x01\x82LENOVOTP-7I    \x11\x00\x00LNVO\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00')
+d('sys/firmware/acpi/interrupts', 0o775)
+f('sys/firmware/acpi/interrupts/gpe1A', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe12', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe11', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe10', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/ff_pmtimer', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe0C', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe04', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe06', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe14', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe0B', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/sci', 0o664, b'   14240\n')
+f('sys/firmware/acpi/interrupts/gpe08', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe15', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe17', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe0A', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/ff_rt_clk', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe09', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe19', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe03', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe01', 0o664, b'       1\tenable\n')
+f('sys/firmware/acpi/interrupts/ff_slp_btn', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/error', 0o664, b'       0\n')
+f('sys/firmware/acpi/interrupts/gpe1C', 0o664, b'   14039\tenable\n')
+f('sys/firmware/acpi/interrupts/ff_pwr_btn', 0o664, b'       0\tenable\n')
+f('sys/firmware/acpi/interrupts/gpe0D', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe05', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe02', 0o664, b'     200\tenable\n')
+f('sys/firmware/acpi/interrupts/gpe1E', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe18', 0o664, b'       0\tenable\n')
+f('sys/firmware/acpi/interrupts/gpe1D', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe1F', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe0E', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe00', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe1B', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe0F', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe07', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe16', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe13', 0o664, b'       0  invalid\n')
+f('sys/firmware/acpi/interrupts/gpe_all', 0o664, b'   14240\n')
+f('sys/firmware/acpi/interrupts/ff_gbl_lock', 0o664, b'       0\tenable\n')
+d('sys/bus', 0o755)
+d('sys/bus/pci_express', 0o755)
+f('sys/bus/pci_express/drivers_autoprobe', 0o644, b'1\n')
+d('sys/bus/pci_express/devices', 0o755)
+l('sys/bus/pci_express/devices/0000:00:1c.2:pcie02', '../../../devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie02')
+l('sys/bus/pci_express/devices/0000:00:1c.2:pcie00', '../../../devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie00')
+l('sys/bus/pci_express/devices/0000:00:1c.0:pcie03', '../../../devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie03')
+l('sys/bus/pci_express/devices/0000:00:01.0:pcie03', '../../../devices/pci0000:00/0000:00:01.0/0000:00:01.0:pcie03')
+l('sys/bus/pci_express/devices/0000:00:1c.2:pcie03', '../../../devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie03')
+l('sys/bus/pci_express/devices/0000:00:1c.1:pcie02', '../../../devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie02')
+l('sys/bus/pci_express/devices/0000:00:1c.0:pcie00', '../../../devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie00')
+l('sys/bus/pci_express/devices/0000:00:1c.3:pcie02', '../../../devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie02')
+l('sys/bus/pci_express/devices/0000:00:1c.0:pcie02', '../../../devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie02')
+l('sys/bus/pci_express/devices/0000:00:1c.1:pcie03', '../../../devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie03')
+l('sys/bus/pci_express/devices/0000:00:1c.3:pcie03', '../../../devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie03')
+l('sys/bus/pci_express/devices/0000:00:1c.1:pcie00', '../../../devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie00')
+l('sys/bus/pci_express/devices/0000:00:1c.3:pcie00', '../../../devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie00')
+l('sys/bus/pci_express/devices/0000:00:01.0:pcie00', '../../../devices/pci0000:00/0000:00:01.0/0000:00:01.0:pcie00')
+d('sys/bus/acpi', 0o775)
+f('sys/bus/acpi/drivers_autoprobe', 0o664, b'1\n')
+d('sys/bus/acpi/drivers', 0o775)
+d('sys/bus/acpi/drivers/thinkpad_hotkey', 0o775)
+l('sys/bus/acpi/drivers/thinkpad_hotkey/IBM0068:00', '../../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/IBM0068:00')
+d('sys/bus/acpi/drivers/button', 0o775)
+l('sys/bus/acpi/drivers/button/PNP0C0E:00', '../../../../devices/LNXSYSTM:00/device:00/PNP0C0E:00')
+l('sys/bus/acpi/drivers/button/PNP0C0D:00', '../../../../devices/LNXSYSTM:00/device:00/PNP0C0D:00')
+l('sys/bus/acpi/drivers/button/LNXPWRBN:00', '../../../../devices/LNXSYSTM:00/LNXPWRBN:00')
+d('sys/bus/acpi/drivers/processor', 0o775)
+l('sys/bus/acpi/drivers/processor/ACPI0007:01', '../../../../devices/LNXSYSTM:00/ACPI0007:01')
+l('sys/bus/acpi/drivers/processor/ACPI0007:00', '../../../../devices/LNXSYSTM:00/ACPI0007:00')
+d('sys/bus/acpi/drivers/power', 0o775)
+l('sys/bus/acpi/drivers/power/LNXPOWER:00', '../../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/LNXPOWER:00')
+d('sys/bus/acpi/drivers/pci_link', 0o775)
+l('sys/bus/acpi/drivers/pci_link/PNP0C0F:05', '../../../../devices/LNXSYSTM:00/device:00/PNP0C0F:05')
+l('sys/bus/acpi/drivers/pci_link/PNP0C0F:07', '../../../../devices/LNXSYSTM:00/device:00/PNP0C0F:07')
+l('sys/bus/acpi/drivers/pci_link/PNP0C0F:04', '../../../../devices/LNXSYSTM:00/device:00/PNP0C0F:04')
+l('sys/bus/acpi/drivers/pci_link/PNP0C0F:02', '../../../../devices/LNXSYSTM:00/device:00/PNP0C0F:02')
+l('sys/bus/acpi/drivers/pci_link/PNP0C0F:00', '../../../../devices/LNXSYSTM:00/device:00/PNP0C0F:00')
+l('sys/bus/acpi/drivers/pci_link/PNP0C0F:01', '../../../../devices/LNXSYSTM:00/device:00/PNP0C0F:01')
+l('sys/bus/acpi/drivers/pci_link/PNP0C0F:06', '../../../../devices/LNXSYSTM:00/device:00/PNP0C0F:06')
+l('sys/bus/acpi/drivers/pci_link/PNP0C0F:03', '../../../../devices/LNXSYSTM:00/device:00/PNP0C0F:03')
+d('sys/bus/acpi/drivers/battery', 0o775)
+l('sys/bus/acpi/drivers/battery/PNP0C0A:00', '../../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00')
+d('sys/bus/acpi/drivers/ec', 0o775)
+l('sys/bus/acpi/drivers/ec/PNP0C09:00', '../../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00')
+d('sys/bus/acpi/drivers/pci_root', 0o775)
+l('sys/bus/acpi/drivers/pci_root/PNP0A08:00', '../../../../devices/LNXSYSTM:00/device:00/PNP0A08:00')
+d('sys/bus/acpi/drivers/thermal', 0o775)
+l('sys/bus/acpi/drivers/thermal/LNXTHERM:01', '../../../../devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:01')
+l('sys/bus/acpi/drivers/thermal/LNXTHERM:02', '../../../../devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:02')
+d('sys/bus/acpi/drivers/ac', 0o775)
+l('sys/bus/acpi/drivers/ac/ACPI0003:00', '../../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00')
+d('sys/bus/acpi/devices', 0o775)
+l('sys/bus/acpi/devices/device:11', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11')
+l('sys/bus/acpi/devices/device:21', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21')
+l('sys/bus/acpi/devices/PNP0000:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0000:00')
+l('sys/bus/acpi/devices/device:0b', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0b')
+l('sys/bus/acpi/devices/device:1f', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/device:1e/device:1f')
+l('sys/bus/acpi/devices/LNXTHERM:01', '../../../devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:01')
+l('sys/bus/acpi/devices/PNP0103:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0103:00')
+l('sys/bus/acpi/devices/LNXPOWER:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/LNXPOWER:00')
+l('sys/bus/acpi/devices/device:1c', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/device:1b/device:1c')
+l('sys/bus/acpi/devices/device:06', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06')
+l('sys/bus/acpi/devices/ACPI0003:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00')
+l('sys/bus/acpi/devices/PNP0C0A:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00')
+l('sys/bus/acpi/devices/device:0e', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d/device:0e')
+l('sys/bus/acpi/devices/ATM1200:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/ATM1200:00')
+l('sys/bus/acpi/devices/device:08', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:08')
+l('sys/bus/acpi/devices/PNP0C0F:05', '../../../devices/LNXSYSTM:00/device:00/PNP0C0F:05')
+l('sys/bus/acpi/devices/device:18', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:18')
+l('sys/bus/acpi/devices/device:0c', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0c')
+l('sys/bus/acpi/devices/PNP0303:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0303:00')
+l('sys/bus/acpi/devices/device:17', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:16/device:17')
+l('sys/bus/acpi/devices/device:02', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02')
+l('sys/bus/acpi/devices/ACPI0007:01', '../../../devices/LNXSYSTM:00/ACPI0007:01')
+l('sys/bus/acpi/devices/device:13', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13')
+l('sys/bus/acpi/devices/PNP0C0E:00', '../../../devices/LNXSYSTM:00/device:00/PNP0C0E:00')
+l('sys/bus/acpi/devices/device:04', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:04')
+l('sys/bus/acpi/devices/PNP0A08:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00')
+l('sys/bus/acpi/devices/PNP0C04:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C04:00')
+l('sys/bus/acpi/devices/LNXTHERM:00', '../../../devices/LNXSYSTM:00/LNXTHERM:00')
+l('sys/bus/acpi/devices/device:15', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/device:14/device:15')
+l('sys/bus/acpi/devices/IBM0079:00', '../../../devices/LNXSYSTM:00/device:00/IBM0079:00')
+l('sys/bus/acpi/devices/device:1d', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d')
+l('sys/bus/acpi/devices/PNP0C0D:00', '../../../devices/LNXSYSTM:00/device:00/PNP0C0D:00')
+l('sys/bus/acpi/devices/device:23', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/device:23')
+l('sys/bus/acpi/devices/device:19', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:19')
+l('sys/bus/acpi/devices/device:12', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11/device:12')
+l('sys/bus/acpi/devices/device:1a', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a')
+l('sys/bus/acpi/devices/device:00', '../../../devices/LNXSYSTM:00/device:00')
+l('sys/bus/acpi/devices/PNP0800:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0800:00')
+l('sys/bus/acpi/devices/PNP0C02:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C02:00')
+l('sys/bus/acpi/devices/device:10', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0f/device:10')
+l('sys/bus/acpi/devices/PNP0100:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0100:00')
+l('sys/bus/acpi/devices/device:0d', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d')
+l('sys/bus/acpi/devices/IBM0068:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/IBM0068:00')
+l('sys/bus/acpi/devices/device:25', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:25')
+l('sys/bus/acpi/devices/PNP0C01:00', '../../../devices/LNXSYSTM:00/device:00/PNP0C01:00')
+l('sys/bus/acpi/devices/device:01', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01')
+l('sys/bus/acpi/devices/PNP0C0F:07', '../../../devices/LNXSYSTM:00/device:00/PNP0C0F:07')
+l('sys/bus/acpi/devices/PNP0C0F:04', '../../../devices/LNXSYSTM:00/device:00/PNP0C0F:04')
+l('sys/bus/acpi/devices/device:1b', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/device:1b')
+l('sys/bus/acpi/devices/device:24', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/device:24')
+l('sys/bus/acpi/devices/device:1e', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/device:1e')
+l('sys/bus/acpi/devices/ACPI0007:00', '../../../devices/LNXSYSTM:00/ACPI0007:00')
+l('sys/bus/acpi/devices/LNXTHERM:02', '../../../devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:02')
+l('sys/bus/acpi/devices/PNP0C09:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00')
+l('sys/bus/acpi/devices/device:20', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:20')
+l('sys/bus/acpi/devices/PNP0C0F:02', '../../../devices/LNXSYSTM:00/device:00/PNP0C0F:02')
+l('sys/bus/acpi/devices/LNXSYSTM:00', '../../../devices/LNXSYSTM:00')
+l('sys/bus/acpi/devices/device:05', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:05')
+l('sys/bus/acpi/devices/PNP0C0F:00', '../../../devices/LNXSYSTM:00/device:00/PNP0C0F:00')
+l('sys/bus/acpi/devices/device:0f', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0f')
+l('sys/bus/acpi/devices/device:16', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:16')
+l('sys/bus/acpi/devices/device:09', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:09')
+l('sys/bus/acpi/devices/device:07', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07')
+l('sys/bus/acpi/devices/device:03', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:03')
+l('sys/bus/acpi/devices/device:22', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22')
+l('sys/bus/acpi/devices/PNP0C0F:01', '../../../devices/LNXSYSTM:00/device:00/PNP0C0F:01')
+l('sys/bus/acpi/devices/PNP0C0F:06', '../../../devices/LNXSYSTM:00/device:00/PNP0C0F:06')
+l('sys/bus/acpi/devices/device:0a', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:0a')
+l('sys/bus/acpi/devices/PNP0200:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0200:00')
+l('sys/bus/acpi/devices/device:14', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/device:14')
+l('sys/bus/acpi/devices/IBM0057:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/IBM0057:00')
+l('sys/bus/acpi/devices/PNP0B00:00', '../../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0B00:00')
+l('sys/bus/acpi/devices/PNP0C0F:03', '../../../devices/LNXSYSTM:00/device:00/PNP0C0F:03')
+l('sys/bus/acpi/devices/LNXPWRBN:00', '../../../devices/LNXSYSTM:00/LNXPWRBN:00')
+d('sys/bus/serio', 0o755)
+f('sys/bus/serio/drivers_autoprobe', 0o644, b'1\n')
+d('sys/bus/serio/drivers', 0o755)
+d('sys/bus/serio/drivers/psmouse', 0o755)
+l('sys/bus/serio/drivers/psmouse/module', '../../../../module/psmouse')
+l('sys/bus/serio/drivers/psmouse/serio1', '../../../../devices/platform/i8042/serio1')
+f('sys/bus/serio/drivers/psmouse/bind_mode', 0o644, b'auto\n')
+f('sys/bus/serio/drivers/psmouse/description', 0o644, b'PS/2 mouse driver\n')
+d('sys/bus/serio/drivers/atkbd', 0o755)
+l('sys/bus/serio/drivers/atkbd/serio0', '../../../../devices/platform/i8042/serio0')
+l('sys/bus/serio/drivers/atkbd/module', '../../../../module/atkbd')
+f('sys/bus/serio/drivers/atkbd/bind_mode', 0o644, b'auto\n')
+f('sys/bus/serio/drivers/atkbd/description', 0o644, b'AT and PS/2 keyboard driver\n')
+d('sys/bus/serio/devices', 0o755)
+l('sys/bus/serio/devices/serio0', '../../../devices/platform/i8042/serio0')
+l('sys/bus/serio/devices/serio1', '../../../devices/platform/i8042/serio1')
+d('sys/bus/scsi', 0o755)
+f('sys/bus/scsi/drivers_autoprobe', 0o644, b'1\n')
+d('sys/bus/scsi/drivers', 0o755)
+d('sys/bus/scsi/drivers/sd', 0o755)
+l('sys/bus/scsi/drivers/sd/7:0:0:0', '../../../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0')
+l('sys/bus/scsi/drivers/sd/0:0:0:0', '../../../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0')
+d('sys/bus/scsi/drivers/sr', 0o755)
+l('sys/bus/scsi/drivers/sr/4:0:0:0', '../../../../devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0')
+d('sys/bus/scsi/devices', 0o755)
+l('sys/bus/scsi/devices/target4:0:0', '../../../devices/pci0000:00/0000:00:1f.1/host4/target4:0:0')
+l('sys/bus/scsi/devices/host0', '../../../devices/pci0000:00/0000:00:1f.2/host0')
+l('sys/bus/scsi/devices/host5', '../../../devices/pci0000:00/0000:00:1f.1/host5')
+l('sys/bus/scsi/devices/host1', '../../../devices/pci0000:00/0000:00:1f.2/host1')
+l('sys/bus/scsi/devices/target0:0:0', '../../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0')
+l('sys/bus/scsi/devices/host4', '../../../devices/pci0000:00/0000:00:1f.1/host4')
+l('sys/bus/scsi/devices/7:0:0:0', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0')
+l('sys/bus/scsi/devices/target7:0:0', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0')
+l('sys/bus/scsi/devices/0:0:0:0', '../../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0')
+l('sys/bus/scsi/devices/host2', '../../../devices/pci0000:00/0000:00:1f.2/host2')
+l('sys/bus/scsi/devices/host7', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7')
+l('sys/bus/scsi/devices/4:0:0:0', '../../../devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0')
+l('sys/bus/scsi/devices/host3', '../../../devices/pci0000:00/0000:00:1f.2/host3')
+d('sys/bus/usb', 0o755)
+f('sys/bus/usb/drivers_autoprobe', 0o644, b'1\n')
+d('sys/bus/usb/drivers', 0o755)
+d('sys/bus/usb/drivers/usb-storage', 0o755)
+l('sys/bus/usb/drivers/usb-storage/module', '../../../../module/usb_storage')
+l('sys/bus/usb/drivers/usb-storage/5-1:1.0', '../../../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0')
+d('sys/bus/usb/drivers/cdc_acm', 0o755)
+l('sys/bus/usb/drivers/cdc_acm/5-2:1.1', '../../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1')
+l('sys/bus/usb/drivers/cdc_acm/5-2:1.0', '../../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0')
+l('sys/bus/usb/drivers/cdc_acm/module', '../../../../module/cdc_acm')
+d('sys/bus/usb/drivers/usbhid', 0o755)
+l('sys/bus/usb/drivers/usbhid/3-1:1.0', '../../../../devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0')
+l('sys/bus/usb/drivers/usbhid/module', '../../../../module/usbhid')
+d('sys/bus/usb/drivers/hub', 0o755)
+l('sys/bus/usb/drivers/hub/3-0:1.0', '../../../../devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0')
+l('sys/bus/usb/drivers/hub/1-0:1.0', '../../../../devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0')
+l('sys/bus/usb/drivers/hub/4-0:1.0', '../../../../devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0')
+l('sys/bus/usb/drivers/hub/module', '../../../../module/usbcore')
+l('sys/bus/usb/drivers/hub/2-0:1.0', '../../../../devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0')
+l('sys/bus/usb/drivers/hub/5-0:1.0', '../../../../devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0')
+d('sys/bus/usb/drivers/usb', 0o755)
+l('sys/bus/usb/drivers/usb/usb5', '../../../../devices/pci0000:00/0000:00:1d.7/usb5')
+l('sys/bus/usb/drivers/usb/usb1', '../../../../devices/pci0000:00/0000:00:1d.0/usb1')
+l('sys/bus/usb/drivers/usb/4-2', '../../../../devices/pci0000:00/0000:00:1d.3/usb4/4-2')
+l('sys/bus/usb/drivers/usb/5-1', '../../../../devices/pci0000:00/0000:00:1d.7/usb5/5-1')
+l('sys/bus/usb/drivers/usb/5-2', '../../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2')
+l('sys/bus/usb/drivers/usb/4-1', '../../../../devices/pci0000:00/0000:00:1d.3/usb4/4-1')
+l('sys/bus/usb/drivers/usb/module', '../../../../module/usbcore')
+l('sys/bus/usb/drivers/usb/usb4', '../../../../devices/pci0000:00/0000:00:1d.3/usb4')
+l('sys/bus/usb/drivers/usb/usb3', '../../../../devices/pci0000:00/0000:00:1d.2/usb3')
+l('sys/bus/usb/drivers/usb/usb2', '../../../../devices/pci0000:00/0000:00:1d.1/usb2')
+l('sys/bus/usb/drivers/usb/3-1', '../../../../devices/pci0000:00/0000:00:1d.2/usb3/3-1')
+d('sys/bus/usb/drivers/usbfs', 0o755)
+l('sys/bus/usb/drivers/usbfs/module', '../../../../module/usbcore')
+d('sys/bus/usb/devices', 0o755)
+l('sys/bus/usb/devices/4-1:1.3', '../../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.3')
+l('sys/bus/usb/devices/5-2:1.4', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.4')
+l('sys/bus/usb/devices/usb5', '../../../devices/pci0000:00/0000:00:1d.7/usb5')
+l('sys/bus/usb/devices/4-1:1.0', '../../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0')
+l('sys/bus/usb/devices/5-2:1.2', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2')
+l('sys/bus/usb/devices/3-0:1.0', '../../../devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0')
+l('sys/bus/usb/devices/usb1', '../../../devices/pci0000:00/0000:00:1d.0/usb1')
+l('sys/bus/usb/devices/4-2', '../../../devices/pci0000:00/0000:00:1d.3/usb4/4-2')
+l('sys/bus/usb/devices/5-2:1.1', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1')
+l('sys/bus/usb/devices/1-0:1.0', '../../../devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0')
+l('sys/bus/usb/devices/5-1', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-1')
+l('sys/bus/usb/devices/5-2:1.10', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.10')
+l('sys/bus/usb/devices/4-0:1.0', '../../../devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0')
+l('sys/bus/usb/devices/5-2:1.0', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0')
+l('sys/bus/usb/devices/5-2', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2')
+l('sys/bus/usb/devices/5-2:1.9', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.9')
+l('sys/bus/usb/devices/3-1:1.0', '../../../devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0')
+l('sys/bus/usb/devices/5-2:1.13', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.13')
+l('sys/bus/usb/devices/5-2:1.5', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.5')
+l('sys/bus/usb/devices/4-1', '../../../devices/pci0000:00/0000:00:1d.3/usb4/4-1')
+l('sys/bus/usb/devices/4-1:1.2', '../../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2')
+l('sys/bus/usb/devices/usb4', '../../../devices/pci0000:00/0000:00:1d.3/usb4')
+l('sys/bus/usb/devices/2-0:1.0', '../../../devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0')
+l('sys/bus/usb/devices/5-2:1.11', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.11')
+l('sys/bus/usb/devices/usb3', '../../../devices/pci0000:00/0000:00:1d.2/usb3')
+l('sys/bus/usb/devices/5-2:1.12', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.12')
+l('sys/bus/usb/devices/5-2:1.3', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3')
+l('sys/bus/usb/devices/5-2:1.6', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.6')
+l('sys/bus/usb/devices/4-1:1.1', '../../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1')
+l('sys/bus/usb/devices/5-1:1.0', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0')
+l('sys/bus/usb/devices/5-0:1.0', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0')
+l('sys/bus/usb/devices/4-2:1.0', '../../../devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0')
+l('sys/bus/usb/devices/usb2', '../../../devices/pci0000:00/0000:00:1d.1/usb2')
+l('sys/bus/usb/devices/3-1', '../../../devices/pci0000:00/0000:00:1d.2/usb3/3-1')
+d('sys/bus/pci', 0o755)
+f('sys/bus/pci/drivers_autoprobe', 0o644, b'1\n')
+d('sys/bus/pci/drivers', 0o755)
+d('sys/bus/pci/drivers/pcieport-driver', 0o755)
+l('sys/bus/pci/drivers/pcieport-driver/0000:00:1c.2', '../../../../devices/pci0000:00/0000:00:1c.2')
+l('sys/bus/pci/drivers/pcieport-driver/0000:00:1c.1', '../../../../devices/pci0000:00/0000:00:1c.1')
+l('sys/bus/pci/drivers/pcieport-driver/0000:00:1c.3', '../../../../devices/pci0000:00/0000:00:1c.3')
+l('sys/bus/pci/drivers/pcieport-driver/0000:00:1c.0', '../../../../devices/pci0000:00/0000:00:1c.0')
+l('sys/bus/pci/drivers/pcieport-driver/0000:00:01.0', '../../../../devices/pci0000:00/0000:00:01.0')
+d('sys/bus/pci/drivers/uhci_hcd', 0o755)
+l('sys/bus/pci/drivers/uhci_hcd/0000:00:1d.3', '../../../../devices/pci0000:00/0000:00:1d.3')
+l('sys/bus/pci/drivers/uhci_hcd/module', '../../../../module/uhci_hcd')
+l('sys/bus/pci/drivers/uhci_hcd/0000:00:1d.0', '../../../../devices/pci0000:00/0000:00:1d.0')
+l('sys/bus/pci/drivers/uhci_hcd/0000:00:1d.2', '../../../../devices/pci0000:00/0000:00:1d.2')
+l('sys/bus/pci/drivers/uhci_hcd/0000:00:1d.1', '../../../../devices/pci0000:00/0000:00:1d.1')
+d('sys/bus/pci/drivers/HDA Intel', 0o755)
+l('sys/bus/pci/drivers/HDA Intel/0000:00:1b.0', '../../../../devices/pci0000:00/0000:00:1b.0')
+l('sys/bus/pci/drivers/HDA Intel/module', '../../../../module/snd_hda_intel')
+d('sys/bus/pci/drivers/ata_piix', 0o755)
+l('sys/bus/pci/drivers/ata_piix/0000:00:1f.1', '../../../../devices/pci0000:00/0000:00:1f.1')
+d('sys/bus/pci/drivers/yenta_cardbus', 0o755)
+l('sys/bus/pci/drivers/yenta_cardbus/module', '../../../../module/yenta_socket')
+l('sys/bus/pci/drivers/yenta_cardbus/0000:15:00.0', '../../../../devices/pci0000:00/0000:00:1e.0/0000:15:00.0')
+d('sys/bus/pci/drivers/e1000e', 0o755)
+l('sys/bus/pci/drivers/e1000e/0000:02:00.0', '../../../../devices/pci0000:00/0000:00:1c.0/0000:02:00.0')
+l('sys/bus/pci/drivers/e1000e/module', '../../../../module/e1000e')
+d('sys/bus/pci/drivers/iwl3945', 0o755)
+l('sys/bus/pci/drivers/iwl3945/module', '../../../../module/iwl3945')
+l('sys/bus/pci/drivers/iwl3945/0000:03:00.0', '../../../../devices/pci0000:00/0000:00:1c.1/0000:03:00.0')
+d('sys/bus/pci/drivers/ehci_hcd', 0o755)
+l('sys/bus/pci/drivers/ehci_hcd/module', '../../../../module/ehci_hcd')
+d('sys/bus/pci/drivers/agpgart-intel', 0o755)
+l('sys/bus/pci/drivers/agpgart-intel/module', '../../../../module/intel_agp')
+d('sys/bus/pci/drivers/ahci', 0o755)
+l('sys/bus/pci/drivers/ahci/module', '../../../../module/ahci')
+l('sys/bus/pci/drivers/ahci/0000:00:1f.2', '../../../../devices/pci0000:00/0000:00:1f.2')
+d('sys/bus/pci/devices', 0o755)
+l('sys/bus/pci/devices/0000:00:1d.3', '../../../devices/pci0000:00/0000:00:1d.3')
+l('sys/bus/pci/devices/0000:00:1c.2', '../../../devices/pci0000:00/0000:00:1c.2')
+l('sys/bus/pci/devices/0000:00:1b.0', '../../../devices/pci0000:00/0000:00:1b.0')
+l('sys/bus/pci/devices/0000:02:00.0', '../../../devices/pci0000:00/0000:00:1c.0/0000:02:00.0')
+l('sys/bus/pci/devices/0000:00:1c.1', '../../../devices/pci0000:00/0000:00:1c.1')
+l('sys/bus/pci/devices/0000:00:00.0', '../../../devices/pci0000:00/0000:00:00.0')
+l('sys/bus/pci/devices/0000:01:00.0', '../../../devices/pci0000:00/0000:00:01.0/0000:01:00.0')
+l('sys/bus/pci/devices/0000:00:1c.3', '../../../devices/pci0000:00/0000:00:1c.3')
+l('sys/bus/pci/devices/0000:00:1f.0', '../../../devices/pci0000:00/0000:00:1f.0')
+l('sys/bus/pci/devices/0000:00:1c.0', '../../../devices/pci0000:00/0000:00:1c.0')
+l('sys/bus/pci/devices/0000:15:00.0', '../../../devices/pci0000:00/0000:00:1e.0/0000:15:00.0')
+l('sys/bus/pci/devices/0000:00:1f.3', '../../../devices/pci0000:00/0000:00:1f.3')
+l('sys/bus/pci/devices/0000:00:1d.0', '../../../devices/pci0000:00/0000:00:1d.0')
+l('sys/bus/pci/devices/0000:00:1f.2', '../../../devices/pci0000:00/0000:00:1f.2')
+l('sys/bus/pci/devices/0000:00:1d.2', '../../../devices/pci0000:00/0000:00:1d.2')
+l('sys/bus/pci/devices/0000:03:00.0', '../../../devices/pci0000:00/0000:00:1c.1/0000:03:00.0')
+l('sys/bus/pci/devices/0000:00:01.0', '../../../devices/pci0000:00/0000:00:01.0')
+l('sys/bus/pci/devices/0000:00:1f.1', '../../../devices/pci0000:00/0000:00:1f.1')
+l('sys/bus/pci/devices/0000:00:1e.0', '../../../devices/pci0000:00/0000:00:1e.0')
+l('sys/bus/pci/devices/0000:00:1d.1', '../../../devices/pci0000:00/0000:00:1d.1')
+d('sys/bus/pnp', 0o755)
+f('sys/bus/pnp/drivers_autoprobe', 0o644, b'1\n')
+d('sys/bus/pnp/drivers', 0o755)
+d('sys/bus/pnp/drivers/system', 0o755)
+l('sys/bus/pnp/drivers/system/00:02', '../../../../devices/pnp0/00:02')
+l('sys/bus/pnp/drivers/system/00:00', '../../../../devices/pnp0/00:00')
+d('sys/bus/pnp/drivers/i8042 kbd', 0o755)
+l('sys/bus/pnp/drivers/i8042 kbd/00:08', '../../../../devices/pnp0/00:08')
+d('sys/bus/pnp/drivers/rtc_cmos', 0o755)
+l('sys/bus/pnp/drivers/rtc_cmos/00:07', '../../../../devices/pnp0/00:07')
+d('sys/bus/pnp/drivers/i8042 aux', 0o755)
+l('sys/bus/pnp/drivers/i8042 aux/00:09', '../../../../devices/pnp0/00:09')
+d('sys/bus/pnp/devices', 0o755)
+l('sys/bus/pnp/devices/00:04', '../../../devices/pnp0/00:04')
+l('sys/bus/pnp/devices/00:0a', '../../../devices/pnp0/00:0a')
+l('sys/bus/pnp/devices/00:03', '../../../devices/pnp0/00:03')
+l('sys/bus/pnp/devices/00:02', '../../../devices/pnp0/00:02')
+l('sys/bus/pnp/devices/00:00', '../../../devices/pnp0/00:00')
+l('sys/bus/pnp/devices/00:09', '../../../devices/pnp0/00:09')
+l('sys/bus/pnp/devices/00:07', '../../../devices/pnp0/00:07')
+l('sys/bus/pnp/devices/00:06', '../../../devices/pnp0/00:06')
+l('sys/bus/pnp/devices/00:08', '../../../devices/pnp0/00:08')
+l('sys/bus/pnp/devices/00:05', '../../../devices/pnp0/00:05')
+l('sys/bus/pnp/devices/00:01', '../../../devices/pnp0/00:01')
+d('sys/bus/pcmcia', 0o755)
+f('sys/bus/pcmcia/drivers_autoprobe', 0o644, b'1\n')
+d('sys/bus/platform', 0o755)
+f('sys/bus/platform/drivers_autoprobe', 0o644, b'1\n')
+d('sys/bus/platform/drivers', 0o755)
+d('sys/bus/platform/drivers/pcspkr', 0o755)
+l('sys/bus/platform/drivers/pcspkr/pcspkr', '../../../../devices/platform/pcspkr')
+l('sys/bus/platform/drivers/pcspkr/module', '../../../../module/pcspkr')
+d('sys/bus/platform/drivers/serial8250', 0o755)
+l('sys/bus/platform/drivers/serial8250/serial8250', '../../../../devices/platform/serial8250')
+d('sys/bus/platform/drivers/thinkpad_acpi', 0o755)
+l('sys/bus/platform/drivers/thinkpad_acpi/module', '../../../../module/thinkpad_acpi')
+l('sys/bus/platform/drivers/thinkpad_acpi/thinkpad_acpi', '../../../../devices/platform/thinkpad_acpi')
+f('sys/bus/platform/drivers/thinkpad_acpi/version', 0o644, b'ThinkPad ACPI Extras v0.21\n')
+f('sys/bus/platform/drivers/thinkpad_acpi/debug_level', 0o644, b'0x0000\n')
+f('sys/bus/platform/drivers/thinkpad_acpi/interface_version', 0o644, b'0x00020200\n')
+d('sys/bus/platform/drivers/vesafb', 0o755)
+l('sys/bus/platform/drivers/vesafb/vesafb.0', '../../../../devices/platform/vesafb.0')
+d('sys/bus/platform/drivers/thinkpad_hwmon', 0o755)
+l('sys/bus/platform/drivers/thinkpad_hwmon/module', '../../../../module/thinkpad_acpi')
+l('sys/bus/platform/drivers/thinkpad_hwmon/thinkpad_hwmon', '../../../../devices/platform/thinkpad_hwmon')
+f('sys/bus/platform/drivers/thinkpad_hwmon/version', 0o644, b'ThinkPad ACPI Extras v0.21\n')
+f('sys/bus/platform/drivers/thinkpad_hwmon/fan_watchdog', 0o644, b'0\n')
+f('sys/bus/platform/drivers/thinkpad_hwmon/debug_level', 0o644, b'0x0000\n')
+f('sys/bus/platform/drivers/thinkpad_hwmon/interface_version', 0o644, b'0x00020200\n')
+d('sys/bus/platform/drivers/i8042', 0o755)
+l('sys/bus/platform/drivers/i8042/i8042', '../../../../devices/platform/i8042')
+d('sys/bus/platform/devices', 0o755)
+l('sys/bus/platform/devices/pcspkr', '../../../devices/platform/pcspkr')
+l('sys/bus/platform/devices/vesafb.0', '../../../devices/platform/vesafb.0')
+l('sys/bus/platform/devices/dock.0', '../../../devices/platform/dock.0')
+l('sys/bus/platform/devices/serial8250', '../../../devices/platform/serial8250')
+l('sys/bus/platform/devices/thinkpad_acpi', '../../../devices/platform/thinkpad_acpi')
+l('sys/bus/platform/devices/thinkpad_hwmon', '../../../devices/platform/thinkpad_hwmon')
+l('sys/bus/platform/devices/microcode', '../../../devices/platform/microcode')
+l('sys/bus/platform/devices/i8042', '../../../devices/platform/i8042')
+d('sys/fs', 0o775)
+d('sys/fs/fuse', 0o775)
+d('sys/fs/fuse/connections', 0o775)
+d('sys/fs/fuse/connections/16', 0o775)
+f('sys/fs/fuse/connections/16/waiting', 0o664, b'0\n')
+f('sys/fs/fuse/connections/16/abort', 0o664, b'')
+d('sys/dev', 0o755)
+d('sys/dev/char', 0o755)
+l('sys/dev/char/4:39', '../../devices/virtual/tty/tty39')
+l('sys/dev/char/116:33', '../../devices/virtual/sound/timer')
+l('sys/dev/char/10:229', '../../devices/virtual/misc/fuse')
+l('sys/dev/char/4:23', '../../devices/virtual/tty/tty23')
+l('sys/dev/char/4:19', '../../devices/virtual/tty/tty19')
+l('sys/dev/char/252:1', '../../devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00')
+l('sys/dev/char/4:48', '../../devices/virtual/tty/tty48')
+l('sys/dev/char/7:129', '../../devices/virtual/vc/vcsa1')
+l('sys/dev/char/4:34', '../../devices/virtual/tty/tty34')
+l('sys/dev/char/189:0', '../../devices/pci0000:00/0000:00:1d.0/usb1')
+l('sys/dev/char/4:61', '../../devices/virtual/tty/tty61')
+l('sys/dev/char/4:5', '../../devices/virtual/tty/tty5')
+l('sys/dev/char/10:1', '../../devices/virtual/misc/psaux')
+l('sys/dev/char/4:47', '../../devices/virtual/tty/tty47')
+l('sys/dev/char/254:2', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/bsg/7:0:0:0')
+l('sys/dev/char/252:7', '../../devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00')
+l('sys/dev/char/7:1', '../../devices/virtual/vc/vcs1')
+l('sys/dev/char/4:37', '../../devices/virtual/tty/tty37')
+l('sys/dev/char/4:3', '../../devices/virtual/tty/tty3')
+l('sys/dev/char/252:3', '../../devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00')
+l('sys/dev/char/1:3', '../../devices/virtual/mem/null')
+l('sys/dev/char/14:12', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/adsp')
+l('sys/dev/char/7:0', '../../devices/virtual/vc/vcs')
+l('sys/dev/char/252:14', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02')
+l('sys/dev/char/4:52', '../../devices/virtual/tty/tty52')
+l('sys/dev/char/252:18', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04')
+l('sys/dev/char/1:5', '../../devices/virtual/mem/zero')
+l('sys/dev/char/13:66', '../../devices/platform/pcspkr/input/input2/event2')
+l('sys/dev/char/10:223', '../../devices/virtual/misc/uinput')
+l('sys/dev/char/7:2', '../../devices/virtual/vc/vcs2')
+l('sys/dev/char/4:40', '../../devices/virtual/tty/tty40')
+l('sys/dev/char/4:31', '../../devices/virtual/tty/tty31')
+l('sys/dev/char/252:21', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02')
+l('sys/dev/char/4:11', '../../devices/virtual/tty/tty11')
+l('sys/dev/char/4:17', '../../devices/virtual/tty/tty17')
+l('sys/dev/char/252:31', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84')
+l('sys/dev/char/189:256', '../../devices/pci0000:00/0000:00:1d.2/usb3')
+l('sys/dev/char/252:5', '../../devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00')
+l('sys/dev/char/7:4', '../../devices/virtual/vc/vcs4')
+l('sys/dev/char/4:38', '../../devices/virtual/tty/tty38')
+l('sys/dev/char/4:66', '../../devices/platform/serial8250/tty/ttyS2')
+l('sys/dev/char/4:0', '../../devices/virtual/tty/tty0')
+l('sys/dev/char/21:0', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_generic/sg0')
+l('sys/dev/char/7:134', '../../devices/virtual/vc/vcsa6')
+l('sys/dev/char/116:24', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0c')
+l('sys/dev/char/4:29', '../../devices/virtual/tty/tty29')
+l('sys/dev/char/21:2', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_generic/sg2')
+l('sys/dev/char/4:27', '../../devices/virtual/tty/tty27')
+l('sys/dev/char/4:21', '../../devices/virtual/tty/tty21')
+l('sys/dev/char/13:64', '../../devices/platform/i8042/serio0/input/input0/event0')
+l('sys/dev/char/252:30', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83')
+l('sys/dev/char/4:51', '../../devices/virtual/tty/tty51')
+l('sys/dev/char/254:1', '../../devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/bsg/4:0:0:0')
+l('sys/dev/char/4:18', '../../devices/virtual/tty/tty18')
+l('sys/dev/char/7:3', '../../devices/virtual/vc/vcs3')
+l('sys/dev/char/252:32', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02')
+l('sys/dev/char/252:27', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81')
+l('sys/dev/char/252:12', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81')
+l('sys/dev/char/1:1', '../../devices/virtual/mem/mem')
+l('sys/dev/char/189:386', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-2')
+l('sys/dev/char/10:62', '../../devices/virtual/misc/network_latency')
+l('sys/dev/char/252:4', '../../devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81')
+l('sys/dev/char/5:1', '../../devices/virtual/tty/console')
+l('sys/dev/char/1:7', '../../devices/virtual/mem/full')
+l('sys/dev/char/7:5', '../../devices/virtual/vc/vcs5')
+l('sys/dev/char/4:4', '../../devices/virtual/tty/tty4')
+l('sys/dev/char/4:15', '../../devices/virtual/tty/tty15')
+l('sys/dev/char/4:9', '../../devices/virtual/tty/tty9')
+l('sys/dev/char/4:20', '../../devices/virtual/tty/tty20')
+l('sys/dev/char/10:228', '../../devices/virtual/misc/hpet')
+l('sys/dev/char/4:59', '../../devices/virtual/tty/tty59')
+l('sys/dev/char/252:2', '../../devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81')
+l('sys/dev/char/4:7', '../../devices/virtual/tty/tty7')
+l('sys/dev/char/4:35', '../../devices/virtual/tty/tty35')
+l('sys/dev/char/254:0', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/bsg/0:0:0:0')
+l('sys/dev/char/189:128', '../../devices/pci0000:00/0000:00:1d.1/usb2')
+l('sys/dev/char/10:184', '../../devices/virtual/misc/microcode')
+l('sys/dev/char/7:131', '../../devices/virtual/vc/vcsa3')
+l('sys/dev/char/116:1', '../../devices/virtual/sound/seq')
+l('sys/dev/char/252:17', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84')
+l('sys/dev/char/10:61', '../../devices/virtual/misc/network_throughput')
+l('sys/dev/char/7:130', '../../devices/virtual/vc/vcsa2')
+l('sys/dev/char/252:0', '../../devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81')
+l('sys/dev/char/4:33', '../../devices/virtual/tty/tty33')
+l('sys/dev/char/4:10', '../../devices/virtual/tty/tty10')
+l('sys/dev/char/13:71', '../../devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/event7')
+l('sys/dev/char/252:10', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81')
+l('sys/dev/char/253:0', '../../devices/pnp0/00:07/rtc/rtc0')
+l('sys/dev/char/252:19', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00')
+l('sys/dev/char/7:10', '../../devices/virtual/vc/vcs10')
+l('sys/dev/char/4:42', '../../devices/virtual/tty/tty42')
+l('sys/dev/char/10:144', '../../devices/virtual/misc/nvram')
+l('sys/dev/char/4:63', '../../devices/virtual/tty/tty63')
+l('sys/dev/char/252:25', '../../devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81')
+l('sys/dev/char/189:520', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2')
+l('sys/dev/char/4:55', '../../devices/virtual/tty/tty55')
+l('sys/dev/char/13:33', '../../devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/mouse1')
+l('sys/dev/char/13:70', '../../devices/virtual/input/input6/event6')
+l('sys/dev/char/252:29', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01')
+l('sys/dev/char/4:45', '../../devices/virtual/tty/tty45')
+l('sys/dev/char/4:56', '../../devices/virtual/tty/tty56')
+l('sys/dev/char/10:60', '../../devices/virtual/misc/device-mapper')
+l('sys/dev/char/5:2', '../../devices/virtual/tty/ptmx')
+l('sys/dev/char/252:8', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81')
+l('sys/dev/char/14:3', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/dsp')
+l('sys/dev/char/13:68', '../../devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/event4')
+l('sys/dev/char/13:67', '../../devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/event3')
+l('sys/dev/char/1:4', '../../devices/virtual/mem/port')
+l('sys/dev/char/116:0', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/controlC0')
+l('sys/dev/char/4:46', '../../devices/virtual/tty/tty46')
+l('sys/dev/char/4:41', '../../devices/virtual/tty/tty41')
+l('sys/dev/char/189:512', '../../devices/pci0000:00/0000:00:1d.7/usb5')
+l('sys/dev/char/4:62', '../../devices/virtual/tty/tty62')
+l('sys/dev/char/252:15', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83')
+l('sys/dev/char/7:133', '../../devices/virtual/vc/vcsa5')
+l('sys/dev/char/4:2', '../../devices/virtual/tty/tty2')
+l('sys/dev/char/1:8', '../../devices/virtual/mem/random')
+l('sys/dev/char/7:138', '../../devices/virtual/vc/vcsa10')
+l('sys/dev/char/4:64', '../../devices/platform/serial8250/tty/ttyS0')
+l('sys/dev/char/4:1', '../../devices/virtual/tty/tty1')
+l('sys/dev/char/4:28', '../../devices/virtual/tty/tty28')
+l('sys/dev/char/13:32', '../../devices/platform/i8042/serio1/input/input1/mouse0')
+l('sys/dev/char/4:44', '../../devices/virtual/tty/tty44')
+l('sys/dev/char/4:36', '../../devices/virtual/tty/tty36')
+l('sys/dev/char/4:43', '../../devices/virtual/tty/tty43')
+l('sys/dev/char/7:128', '../../devices/virtual/vc/vcsa')
+l('sys/dev/char/4:60', '../../devices/virtual/tty/tty60')
+l('sys/dev/char/7:135', '../../devices/virtual/vc/vcsa7')
+l('sys/dev/char/4:6', '../../devices/virtual/tty/tty6')
+l('sys/dev/char/4:49', '../../devices/virtual/tty/tty49')
+l('sys/dev/char/189:518', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1')
+l('sys/dev/char/29:0', '../../devices/platform/vesafb.0/graphics/fb0')
+l('sys/dev/char/252:23', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00')
+l('sys/dev/char/10:227', '../../devices/virtual/misc/mcelog')
+l('sys/dev/char/4:14', '../../devices/virtual/tty/tty14')
+l('sys/dev/char/4:54', '../../devices/virtual/tty/tty54')
+l('sys/dev/char/7:132', '../../devices/virtual/vc/vcsa4')
+l('sys/dev/char/5:0', '../../devices/virtual/tty/tty')
+l('sys/dev/char/252:26', '../../devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00')
+l('sys/dev/char/1:2', '../../devices/virtual/mem/kmem')
+l('sys/dev/char/189:259', '../../devices/pci0000:00/0000:00:1d.2/usb3/3-1')
+l('sys/dev/char/252:11', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02')
+l('sys/dev/char/4:26', '../../devices/virtual/tty/tty26')
+l('sys/dev/char/252:33', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00')
+l('sys/dev/char/4:22', '../../devices/virtual/tty/tty22')
+l('sys/dev/char/10:63', '../../devices/virtual/misc/cpu_dma_latency')
+l('sys/dev/char/4:13', '../../devices/virtual/tty/tty13')
+l('sys/dev/char/116:17', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D1p')
+l('sys/dev/char/116:16', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0p')
+l('sys/dev/char/252:16', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03')
+l('sys/dev/char/4:8', '../../devices/virtual/tty/tty8')
+l('sys/dev/char/252:28', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82')
+l('sys/dev/char/21:1', '../../devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_generic/sg1')
+l('sys/dev/char/4:24', '../../devices/virtual/tty/tty24')
+l('sys/dev/char/7:7', '../../devices/virtual/vc/vcs7')
+l('sys/dev/char/252:20', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81')
+l('sys/dev/char/166:0', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0')
+l('sys/dev/char/4:58', '../../devices/virtual/tty/tty58')
+l('sys/dev/char/4:57', '../../devices/virtual/tty/tty57')
+l('sys/dev/char/189:384', '../../devices/pci0000:00/0000:00:1d.3/usb4')
+l('sys/dev/char/4:50', '../../devices/virtual/tty/tty50')
+l('sys/dev/char/7:6', '../../devices/virtual/vc/vcs6')
+l('sys/dev/char/4:25', '../../devices/virtual/tty/tty25')
+l('sys/dev/char/4:16', '../../devices/virtual/tty/tty16')
+l('sys/dev/char/4:65', '../../devices/platform/serial8250/tty/ttyS1')
+l('sys/dev/char/13:65', '../../devices/platform/i8042/serio1/input/input1/event1')
+l('sys/dev/char/13:69', '../../devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/event5')
+l('sys/dev/char/252:22', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83')
+l('sys/dev/char/1:11', '../../devices/virtual/mem/kmsg')
+l('sys/dev/char/189:385', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1')
+l('sys/dev/char/4:12', '../../devices/virtual/tty/tty12')
+l('sys/dev/char/252:13', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82')
+l('sys/dev/char/1:9', '../../devices/virtual/mem/urandom')
+l('sys/dev/char/4:67', '../../devices/platform/serial8250/tty/ttyS3')
+l('sys/dev/char/13:63', '../../devices/virtual/input/mice')
+l('sys/dev/char/252:24', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00')
+l('sys/dev/char/252:9', '../../devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00')
+l('sys/dev/char/4:53', '../../devices/virtual/tty/tty53')
+l('sys/dev/char/4:30', '../../devices/virtual/tty/tty30')
+l('sys/dev/char/14:4', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/audio')
+l('sys/dev/char/14:0', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/mixer')
+l('sys/dev/char/252:6', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81')
+l('sys/dev/char/4:32', '../../devices/virtual/tty/tty32')
+d('sys/dev/block', 0o755)
+l('sys/dev/block/7:1', '../../devices/virtual/block/loop1')
+l('sys/dev/block/7:0', '../../devices/virtual/block/loop0')
+l('sys/dev/block/8:17', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/sdb1')
+l('sys/dev/block/7:2', '../../devices/virtual/block/loop2')
+l('sys/dev/block/7:4', '../../devices/virtual/block/loop4')
+l('sys/dev/block/8:8', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8')
+l('sys/dev/block/7:3', '../../devices/virtual/block/loop3')
+l('sys/dev/block/11:0', '../../devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0')
+l('sys/dev/block/7:5', '../../devices/virtual/block/loop5')
+l('sys/dev/block/8:5', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5')
+l('sys/dev/block/8:10', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10')
+l('sys/dev/block/8:0', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda')
+l('sys/dev/block/8:9', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9')
+l('sys/dev/block/8:7', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7')
+l('sys/dev/block/8:16', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb')
+l('sys/dev/block/9:0', '../../devices/virtual/block/md0')
+l('sys/dev/block/7:7', '../../devices/virtual/block/loop7')
+l('sys/dev/block/8:6', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6')
+l('sys/dev/block/7:6', '../../devices/virtual/block/loop6')
+l('sys/dev/block/8:1', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1')
+d('sys/module', 0o775)
+d('sys/module/arc4', 0o775)
+f('sys/module/arc4/initstate', 0o664, b'live\n')
+f('sys/module/arc4/srcversion', 0o664, b'0E7B177AF22D87B5B21A577\n')
+f('sys/module/arc4/refcnt', 0o664, b'2\n')
+d('sys/module/arc4/sections', 0o775)
+f('sys/module/arc4/sections/.exit.text', 0o664, b'0xffffffffa006b0dc\n')
+f('sys/module/arc4/sections/.note.gnu.build-id', 0o664, b'0xffffffffa006b0f0\n')
+f('sys/module/arc4/sections/.strtab', 0o664, b'0xffffffffa006b400\n')
+f('sys/module/arc4/sections/.bss', 0o664, b'0xffffffffa006ba00\n')
+f('sys/module/arc4/sections/.text', 0o664, b'0xffffffffa006b000\n')
+f('sys/module/arc4/sections/.init.text', 0o664, b'0xffffffffa009a000\n')
+f('sys/module/arc4/sections/.data', 0o664, b'0xffffffffa006b520\n')
+f('sys/module/arc4/sections/.symtab', 0o664, b'0xffffffffa006b118\n')
+f('sys/module/arc4/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa006b640\n')
+d('sys/module/arc4/notes', 0o775)
+f('sys/module/arc4/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00[P \tR\xc2\xa7\xdd\xf0H\xaa\x06\x1a,\xb3\xa1\xa4\x9a\x13G')
+d('sys/module/vt', 0o775)
+d('sys/module/vt/parameters', 0o775)
+f('sys/module/vt/parameters/default_grn', 0o664, b'0,0,170,85,0,0,170,170,85,85,255,255,85,85,255,255\n')
+f('sys/module/vt/parameters/default_red', 0o664, b'0,170,0,170,0,170,0,170,85,255,85,255,85,255,85,255\n')
+f('sys/module/vt/parameters/italic', 0o664, b'2\n')
+f('sys/module/vt/parameters/underline', 0o664, b'3\n')
+f('sys/module/vt/parameters/default_blu', 0o664, b'0,0,0,0,170,170,170,170,85,85,85,85,255,255,255,255\n')
+f('sys/module/vt/parameters/default_utf8', 0o664, b'1\n')
+d('sys/module/cdrom', 0o775)
+f('sys/module/cdrom/initstate', 0o664, b'live\n')
+f('sys/module/cdrom/srcversion', 0o664, b'D868CCB0789DA27F51280A8\n')
+f('sys/module/cdrom/refcnt', 0o664, b'1\n')
+d('sys/module/cdrom/holders', 0o775)
+l('sys/module/cdrom/holders/sr_mod', '../../sr_mod')
+d('sys/module/cdrom/sections', 0o775)
+f('sys/module/cdrom/sections/__ksymtab_strings', 0o664, b'0xffffffffa002fe20\n')
+f('sys/module/cdrom/sections/.exit.text', 0o664, b'0xffffffffa002e0f8\n')
+f('sys/module/cdrom/sections/.note.gnu.build-id', 0o664, b'0xffffffffa002e120\n')
+f('sys/module/cdrom/sections/.strtab', 0o664, b'0xffffffffa0030f60\n')
+f('sys/module/cdrom/sections/__ksymtab', 0o664, b'0xffffffffa002fc10\n')
+f('sys/module/cdrom/sections/.rodata', 0o664, b'0xffffffffa002e160\n')
+f('sys/module/cdrom/sections/__param', 0o664, b'0xffffffffa002fd30\n')
+f('sys/module/cdrom/sections/.bss', 0o664, b'0xffffffffa0032380\n')
+f('sys/module/cdrom/sections/.text', 0o664, b'0xffffffffa0029000\n')
+f('sys/module/cdrom/sections/.init.text', 0o664, b'0xffffffffa0034000\n')
+f('sys/module/cdrom/sections/__kcrctab', 0o664, b'0xffffffffa002fcd0\n')
+f('sys/module/cdrom/sections/.data', 0o664, b'0xffffffffa0031b80\n')
+f('sys/module/cdrom/sections/.symtab', 0o664, b'0xffffffffa002fef8\n')
+f('sys/module/cdrom/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0031fc0\n')
+f('sys/module/cdrom/sections/.rodata.str1.1', 0o664, b'0xffffffffa002f896\n')
+d('sys/module/cdrom/notes', 0o775)
+f('sys/module/cdrom/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00C\x03\x04\xe9\x8a\x17\x19\x8b\xc7Y\xea\x1a\xa35\x85K\x9e\x1e\xf8=')
+d('sys/module/rfkill', 0o775)
+f('sys/module/rfkill/version', 0o664, b'1.0\n')
+f('sys/module/rfkill/initstate', 0o664, b'live\n')
+f('sys/module/rfkill/srcversion', 0o664, b'6B4E68548C57FD365EB4E71\n')
+f('sys/module/rfkill/refcnt', 0o664, b'2\n')
+d('sys/module/rfkill/holders', 0o775)
+l('sys/module/rfkill/holders/thinkpad_acpi', '../../thinkpad_acpi')
+d('sys/module/rfkill/parameters', 0o775)
+f('sys/module/rfkill/parameters/default_state', 0o664, b'1\n')
+d('sys/module/rfkill/sections', 0o775)
+f('sys/module/rfkill/sections/__ksymtab_gpl', 0o664, b'0xffffffffa01d9f70\n')
+f('sys/module/rfkill/sections/.smp_locks', 0o664, b'0xffffffffa01d9e80\n')
+f('sys/module/rfkill/sections/__bug_table', 0o664, b'0xffffffffa01d9e36\n')
+f('sys/module/rfkill/sections/__ksymtab_strings', 0o664, b'0xffffffffa01d9fe0\n')
+f('sys/module/rfkill/sections/.exit.text', 0o664, b'0xffffffffa01d9c88\n')
+f('sys/module/rfkill/sections/.note.gnu.build-id', 0o664, b'0xffffffffa01d9cb0\n')
+f('sys/module/rfkill/sections/.strtab', 0o664, b'0xffffffffa01dae08\n')
+f('sys/module/rfkill/sections/__ksymtab', 0o664, b'0xffffffffa01d9ee0\n')
+f('sys/module/rfkill/sections/.rodata', 0o664, b'0xffffffffa01d9cd8\n')
+f('sys/module/rfkill/sections/__param', 0o664, b'0xffffffffa01d9fb8\n')
+f('sys/module/rfkill/sections/.bss', 0o664, b'0xffffffffa01dbe00\n')
+f('sys/module/rfkill/sections/.text', 0o664, b'0xffffffffa01d9000\n')
+f('sys/module/rfkill/sections/.init.text', 0o664, b'0xffffffffa009a000\n')
+f('sys/module/rfkill/sections/__kcrctab', 0o664, b'0xffffffffa01d9f40\n')
+f('sys/module/rfkill/sections/.data', 0o664, b'0xffffffffa01db780\n')
+f('sys/module/rfkill/sections/.symtab', 0o664, b'0xffffffffa01da088\n')
+f('sys/module/rfkill/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa01dba40\n')
+f('sys/module/rfkill/sections/.rodata.str1.1', 0o664, b'0xffffffffa01d9d36\n')
+f('sys/module/rfkill/sections/__kcrctab_gpl', 0o664, b'0xffffffffa01d9fa0\n')
+d('sys/module/rfkill/notes', 0o775)
+f('sys/module/rfkill/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xd1\x1fs\x98\x9b\x97\xc4\xec\x9dd\xac:\x94m\x1e\xc0Y\xcfd"')
+d('sys/module/uinput', 0o775)
+f('sys/module/uinput/version', 0o664, b'0.3\n')
+f('sys/module/uinput/initstate', 0o664, b'live\n')
+f('sys/module/uinput/srcversion', 0o664, b'2C3E0DB9E2496AD70174B85\n')
+f('sys/module/uinput/refcnt', 0o664, b'0\n')
+d('sys/module/uinput/sections', 0o775)
+f('sys/module/uinput/sections/.smp_locks', 0o664, b'0xffffffffa0206448\n')
+f('sys/module/uinput/sections/.exit.text', 0o664, b'0xffffffffa0206278\n')
+f('sys/module/uinput/sections/.note.gnu.build-id', 0o664, b'0xffffffffa020628c\n')
+f('sys/module/uinput/sections/.strtab', 0o664, b'0xffffffffa0206c88\n')
+f('sys/module/uinput/sections/.rodata', 0o664, b'0xffffffffa02062c0\n')
+f('sys/module/uinput/sections/.bss', 0o664, b'0xffffffffa02074c0\n')
+f('sys/module/uinput/sections/.text', 0o664, b'0xffffffffa0205000\n')
+f('sys/module/uinput/sections/.init.text', 0o664, b'0xffffffffa0070000\n')
+f('sys/module/uinput/sections/.data', 0o664, b'0xffffffffa02070c0\n')
+f('sys/module/uinput/sections/.symtab', 0o664, b'0xffffffffa0206490\n')
+f('sys/module/uinput/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0207100\n')
+f('sys/module/uinput/sections/.rodata.str1.1', 0o664, b'0xffffffffa0206398\n')
+d('sys/module/uinput/notes', 0o775)
+f('sys/module/uinput/notes/.note.gnu.build-id', 0o664, b"\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00'\n{\xdf\xe9m\x80\xea\xa8k\x8f=\x90\x8c\xe1\xf7{\x06\x15S")
+d('sys/module/fuse', 0o775)
+f('sys/module/fuse/initstate', 0o664, b'live\n')
+f('sys/module/fuse/srcversion', 0o664, b'A6C92EE44A51B1B0DC4377D\n')
+f('sys/module/fuse/refcnt', 0o664, b'3\n')
+d('sys/module/fuse/sections', 0o775)
+f('sys/module/fuse/sections/.smp_locks', 0o664, b'0xffffffffa0249d78\n')
+f('sys/module/fuse/sections/__bug_table', 0o664, b'0xffffffffa024a032\n')
+f('sys/module/fuse/sections/.exit.text', 0o664, b'0xffffffffa02493d0\n')
+f('sys/module/fuse/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0249414\n')
+f('sys/module/fuse/sections/.strtab', 0o664, b'0xffffffffa024c4e8\n')
+f('sys/module/fuse/sections/.rodata', 0o664, b'0xffffffffa0249440\n')
+f('sys/module/fuse/sections/.bss', 0o664, b'0xffffffffa024e300\n')
+f('sys/module/fuse/sections/.text', 0o664, b'0xffffffffa0240000\n')
+f('sys/module/fuse/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/fuse/sections/.data', 0o664, b'0xffffffffa024dba0\n')
+f('sys/module/fuse/sections/.symtab', 0o664, b'0xffffffffa024a208\n')
+f('sys/module/fuse/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa024df40\n')
+f('sys/module/fuse/sections/.rodata.str1.1', 0o664, b'0xffffffffa0249e50\n')
+d('sys/module/fuse/notes', 0o775)
+f('sys/module/fuse/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\x7fh\xfe:\x1f\xc6\xddW\x96\x80\x16\x9fK\x7f\xba,\x8a\xc6\xf6E')
+d('sys/module/hid', 0o775)
+d('sys/module/hid/parameters', 0o775)
+f('sys/module/hid/parameters/pb_fnmode', 0o664, b'1\n')
+d('sys/module/uhci_hcd', 0o775)
+f('sys/module/uhci_hcd/initstate', 0o664, b'live\n')
+f('sys/module/uhci_hcd/srcversion', 0o664, b'E3F4B6BEC99D6670259FCC9\n')
+f('sys/module/uhci_hcd/refcnt', 0o664, b'0\n')
+d('sys/module/uhci_hcd/drivers', 0o775)
+l('sys/module/uhci_hcd/drivers/pci:uhci_hcd', '../../../bus/pci/drivers/uhci_hcd')
+d('sys/module/uhci_hcd/parameters', 0o775)
+f('sys/module/uhci_hcd/parameters/ignore_oc', 0o664, b'N\n')
+d('sys/module/uhci_hcd/sections', 0o775)
+f('sys/module/uhci_hcd/sections/.smp_locks', 0o664, b'0xffffffffa00c6850\n')
+f('sys/module/uhci_hcd/sections/.exit.text', 0o664, b'0xffffffffa00c621c\n')
+f('sys/module/uhci_hcd/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00c6254\n')
+f('sys/module/uhci_hcd/sections/.strtab', 0o664, b'0xffffffffa00c7690\n')
+f('sys/module/uhci_hcd/sections/.rodata', 0o664, b'0xffffffffa00c6280\n')
+f('sys/module/uhci_hcd/sections/__param', 0o664, b'0xffffffffa00c6888\n')
+f('sys/module/uhci_hcd/sections/.bss', 0o664, b'0xffffffffa00c8400\n')
+f('sys/module/uhci_hcd/sections/.text', 0o664, b'0xffffffffa00c2000\n')
+f('sys/module/uhci_hcd/sections/.init.text', 0o664, b'0xffffffffa0027000\n')
+f('sys/module/uhci_hcd/sections/.data', 0o664, b'0xffffffffa00c7ee0\n')
+f('sys/module/uhci_hcd/sections/.symtab', 0o664, b'0xffffffffa00c68b0\n')
+f('sys/module/uhci_hcd/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa00c8040\n')
+f('sys/module/uhci_hcd/sections/.rodata.str1.1', 0o664, b'0xffffffffa00c67d2\n')
+d('sys/module/uhci_hcd/notes', 0o775)
+f('sys/module/uhci_hcd/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00t\xd0\xa5\xd2A\xa2\x874\x12\xb5\xf6\x9c\xff\xb9\xee`\x8d\x9f[\x04')
+d('sys/module/crypto_blkcipher', 0o775)
+f('sys/module/crypto_blkcipher/initstate', 0o664, b'live\n')
+f('sys/module/crypto_blkcipher/srcversion', 0o664, b'723F00BD2391209F4D65272\n')
+f('sys/module/crypto_blkcipher/refcnt', 0o664, b'1\n')
+d('sys/module/crypto_blkcipher/holders', 0o775)
+l('sys/module/crypto_blkcipher/holders/ecb', '../../ecb')
+d('sys/module/crypto_blkcipher/sections', 0o775)
+f('sys/module/crypto_blkcipher/sections/__ksymtab_gpl', 0o664, b'0xffffffffa01f1610\n')
+f('sys/module/crypto_blkcipher/sections/.smp_locks', 0o664, b'0xffffffffa01f18c0\n')
+f('sys/module/crypto_blkcipher/sections/__bug_table', 0o664, b'0xffffffffa01f185f\n')
+f('sys/module/crypto_blkcipher/sections/__ksymtab_strings', 0o664, b'0xffffffffa01f1748\n')
+f('sys/module/crypto_blkcipher/sections/.exit.text', 0o664, b'0xffffffffa01f138c\n')
+f('sys/module/crypto_blkcipher/sections/.note.gnu.build-id', 0o664, b'0xffffffffa01f13b0\n')
+f('sys/module/crypto_blkcipher/sections/.strtab', 0o664, b'0xffffffffa01f2b10\n')
+f('sys/module/crypto_blkcipher/sections/.rodata', 0o664, b'0xffffffffa01f13e0\n')
+f('sys/module/crypto_blkcipher/sections/.bss', 0o664, b'0xffffffffa01f3ec0\n')
+f('sys/module/crypto_blkcipher/sections/.text', 0o664, b'0xffffffffa01ef000\n')
+f('sys/module/crypto_blkcipher/sections/.init.text', 0o664, b'0xffffffffa0027000\n')
+f('sys/module/crypto_blkcipher/sections/.data', 0o664, b'0xffffffffa01f39e0\n')
+f('sys/module/crypto_blkcipher/sections/.symtab', 0o664, b'0xffffffffa01f18f8\n')
+f('sys/module/crypto_blkcipher/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa01f3b00\n')
+f('sys/module/crypto_blkcipher/sections/.rodata.str1.1', 0o664, b'0xffffffffa01f1440\n')
+f('sys/module/crypto_blkcipher/sections/__kcrctab_gpl', 0o664, b'0xffffffffa01f16e0\n')
+d('sys/module/crypto_blkcipher/notes', 0o775)
+f('sys/module/crypto_blkcipher/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00-_P~\xd2\x1eM\xee\xb0!\xc0\xd8\xb7\x00\x1b\xe4#-\xc8\xe0')
+d('sys/module/soundcore', 0o775)
+f('sys/module/soundcore/initstate', 0o664, b'live\n')
+f('sys/module/soundcore/srcversion', 0o664, b'E4F49ED9C4CFD1A5A923330\n')
+f('sys/module/soundcore/refcnt', 0o664, b'1\n')
+d('sys/module/soundcore/holders', 0o775)
+l('sys/module/soundcore/holders/snd', '../../snd')
+d('sys/module/soundcore/sections', 0o775)
+f('sys/module/soundcore/sections/__ksymtab_strings', 0o664, b'0xffffffffa0067bf0\n')
+f('sys/module/soundcore/sections/.exit.text', 0o664, b'0xffffffffa0067850\n')
+f('sys/module/soundcore/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0067874\n')
+f('sys/module/soundcore/sections/.strtab', 0o664, b'0xffffffffa00686d0\n')
+f('sys/module/soundcore/sections/__ksymtab', 0o664, b'0xffffffffa0067b00\n')
+f('sys/module/soundcore/sections/.rodata', 0o664, b'0xffffffffa00678a0\n')
+f('sys/module/soundcore/sections/.bss', 0o664, b'0xffffffffa00692c0\n')
+f('sys/module/soundcore/sections/.text', 0o664, b'0xffffffffa0067000\n')
+f('sys/module/soundcore/sections/.init.text', 0o664, b'0xffffffffa006b000\n')
+f('sys/module/soundcore/sections/__kcrctab', 0o664, b'0xffffffffa0067ba0\n')
+f('sys/module/soundcore/sections/.data', 0o664, b'0xffffffffa0068ec0\n')
+f('sys/module/soundcore/sections/.symtab', 0o664, b'0xffffffffa0067cc8\n')
+f('sys/module/soundcore/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0068f00\n')
+f('sys/module/soundcore/sections/.rodata.str1.1', 0o664, b'0xffffffffa00679f8\n')
+d('sys/module/soundcore/notes', 0o775)
+f('sys/module/soundcore/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00^\x97fIs2\xf4Ck\xe0$]\xd8)]\xe2\x9c\xea\x1d\x0c')
+d('sys/module/pcspkr', 0o775)
+f('sys/module/pcspkr/initstate', 0o664, b'live\n')
+f('sys/module/pcspkr/srcversion', 0o664, b'5757E9C81E627525BA9D165\n')
+f('sys/module/pcspkr/refcnt', 0o664, b'0\n')
+d('sys/module/pcspkr/drivers', 0o775)
+l('sys/module/pcspkr/drivers/platform:pcspkr', '../../../bus/platform/drivers/pcspkr')
+d('sys/module/pcspkr/sections', 0o775)
+f('sys/module/pcspkr/sections/.exit.text', 0o664, b'0xffffffffa009e15c\n')
+f('sys/module/pcspkr/sections/.note.gnu.build-id', 0o664, b'0xffffffffa009e250\n')
+f('sys/module/pcspkr/sections/.strtab', 0o664, b'0xffffffffa009e6e8\n')
+f('sys/module/pcspkr/sections/.devexit.text', 0o664, b'0xffffffffa009e16e\n')
+f('sys/module/pcspkr/sections/.bss', 0o664, b'0xffffffffa009ed80\n')
+f('sys/module/pcspkr/sections/.text', 0o664, b'0xffffffffa009e000\n')
+f('sys/module/pcspkr/sections/.init.text', 0o664, b'0xffffffffa00a0000\n')
+f('sys/module/pcspkr/sections/.data', 0o664, b'0xffffffffa009e900\n')
+f('sys/module/pcspkr/sections/.devinit.text', 0o664, b'0xffffffffa009e1ad\n')
+f('sys/module/pcspkr/sections/.symtab', 0o664, b'0xffffffffa009e298\n')
+f('sys/module/pcspkr/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa009e9c0\n')
+f('sys/module/pcspkr/sections/.rodata.str1.1', 0o664, b'0xffffffffa009e274\n')
+d('sys/module/pcspkr/notes', 0o775)
+f('sys/module/pcspkr/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xe3\xfd\xb1\xf7b\xd2\x8f\xc1\xd2C\xfc\xfe\xdf8\x80\x82\x85A\xc9!')
+d('sys/module/sr_mod', 0o775)
+f('sys/module/sr_mod/initstate', 0o664, b'live\n')
+f('sys/module/sr_mod/srcversion', 0o664, b'3484F077F1A71803F453437\n')
+f('sys/module/sr_mod/refcnt', 0o664, b'0\n')
+d('sys/module/sr_mod/parameters', 0o775)
+f('sys/module/sr_mod/parameters/xa_test', 0o664, b'0\n')
+d('sys/module/sr_mod/sections', 0o775)
+f('sys/module/sr_mod/sections/.smp_locks', 0o664, b'0xffffffffa0061488\n')
+f('sys/module/sr_mod/sections/.exit.text', 0o664, b'0xffffffffa006126c\n')
+f('sys/module/sr_mod/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0061290\n')
+f('sys/module/sr_mod/sections/.strtab', 0o664, b'0xffffffffa00623f0\n')
+f('sys/module/sr_mod/sections/.rodata', 0o664, b'0xffffffffa00612c0\n')
+f('sys/module/sr_mod/sections/__param', 0o664, b'0xffffffffa0061750\n')
+f('sys/module/sr_mod/sections/.bss', 0o664, b'0xffffffffa00630c0\n')
+f('sys/module/sr_mod/sections/.text', 0o664, b'0xffffffffa005f000\n')
+f('sys/module/sr_mod/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/sr_mod/sections/.data', 0o664, b'0xffffffffa0062aa0\n')
+f('sys/module/sr_mod/sections/.symtab', 0o664, b'0xffffffffa0061778\n')
+f('sys/module/sr_mod/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0062d00\n')
+f('sys/module/sr_mod/sections/.rodata.str1.1', 0o664, b'0xffffffffa0061308\n')
+d('sys/module/sr_mod/notes', 0o775)
+f('sys/module/sr_mod/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xae\xa7\xdcHo\xe7\xe1\xa0#\x94\x9a\xfeV8\xa6O$@\xc1(')
+d('sys/module/cfg80211', 0o775)
+f('sys/module/cfg80211/initstate', 0o664, b'live\n')
+f('sys/module/cfg80211/srcversion', 0o664, b'C43F275505B181F0D1625BE\n')
+f('sys/module/cfg80211/refcnt', 0o664, b'2\n')
+d('sys/module/cfg80211/holders', 0o775)
+l('sys/module/cfg80211/holders/mac80211', '../../mac80211')
+l('sys/module/cfg80211/holders/iwl3945', '../../iwl3945')
+d('sys/module/cfg80211/parameters', 0o775)
+f('sys/module/cfg80211/parameters/ieee80211_regdom', 0o664, b'US\n')
+d('sys/module/cfg80211/sections', 0o775)
+f('sys/module/cfg80211/sections/.smp_locks', 0o664, b'0xffffffffa00bd2a0\n')
+f('sys/module/cfg80211/sections/__bug_table', 0o664, b'0xffffffffa00bd166\n')
+f('sys/module/cfg80211/sections/__ksymtab_strings', 0o664, b'0xffffffffa00bd448\n')
+f('sys/module/cfg80211/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00bce58\n')
+f('sys/module/cfg80211/sections/.strtab', 0o664, b'0xffffffffa00be8c0\n')
+f('sys/module/cfg80211/sections/__ksymtab', 0o664, b'0xffffffffa00bd370\n')
+f('sys/module/cfg80211/sections/.rodata', 0o664, b'0xffffffffa00bce80\n')
+f('sys/module/cfg80211/sections/.data.read_mostly', 0o664, b'0xffffffffa00bfe60\n')
+f('sys/module/cfg80211/sections/__param', 0o664, b'0xffffffffa00bd518\n')
+f('sys/module/cfg80211/sections/.bss', 0o664, b'0xffffffffa00c02c0\n')
+f('sys/module/cfg80211/sections/.text', 0o664, b'0xffffffffa00b9000\n')
+f('sys/module/cfg80211/sections/__kcrctab', 0o664, b'0xffffffffa00bd400\n')
+f('sys/module/cfg80211/sections/.data', 0o664, b'0xffffffffa00bf760\n')
+f('sys/module/cfg80211/sections/.symtab', 0o664, b'0xffffffffa00bd540\n')
+f('sys/module/cfg80211/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa00bff00\n')
+f('sys/module/cfg80211/sections/.rodata.str1.1', 0o664, b'0xffffffffa00bd078\n')
+d('sys/module/cfg80211/notes', 0o775)
+f('sys/module/cfg80211/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00}-\xdb\xa6\xb1\xf6I\x90\xaf\xbdX\xed\x8d\xac\x86o(\xc8zC')
+d('sys/module/snd_seq', 0o775)
+f('sys/module/snd_seq/initstate', 0o664, b'live\n')
+f('sys/module/snd_seq/srcversion', 0o664, b'94E19F6DBC8F63B241414FE\n')
+f('sys/module/snd_seq/refcnt', 0o664, b'0\n')
+d('sys/module/snd_seq/parameters', 0o775)
+f('sys/module/snd_seq/parameters/seq_default_timer_device', 0o664, b'0\n')
+f('sys/module/snd_seq/parameters/seq_default_timer_class', 0o664, b'1\n')
+f('sys/module/snd_seq/parameters/seq_client_load', 0o664, b'-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1\n')
+f('sys/module/snd_seq/parameters/seq_default_timer_sclass', 0o664, b'0\n')
+f('sys/module/snd_seq/parameters/seq_default_timer_resolution', 0o664, b'0\n')
+f('sys/module/snd_seq/parameters/seq_default_timer_subdevice', 0o664, b'0\n')
+f('sys/module/snd_seq/parameters/seq_default_timer_card', 0o664, b'-1\n')
+d('sys/module/snd_seq/sections', 0o775)
+f('sys/module/snd_seq/sections/.smp_locks', 0o664, b'0xffffffffa02b1d30\n')
+f('sys/module/snd_seq/sections/__ksymtab_strings', 0o664, b'0xffffffffa02b1748\n')
+f('sys/module/snd_seq/sections/.exit.text', 0o664, b'0xffffffffa02b0ff0\n')
+f('sys/module/snd_seq/sections/.note.gnu.build-id', 0o664, b'0xffffffffa02b10bc\n')
+f('sys/module/snd_seq/sections/.strtab', 0o664, b'0xffffffffa02b4590\n')
+f('sys/module/snd_seq/sections/__ksymtab', 0o664, b'0xffffffffa02b1610\n')
+f('sys/module/snd_seq/sections/.rodata', 0o664, b'0xffffffffa02b10e0\n')
+f('sys/module/snd_seq/sections/__param', 0o664, b'0xffffffffa02b1320\n')
+f('sys/module/snd_seq/sections/.bss', 0o664, b'0xffffffffa02b6f80\n')
+f('sys/module/snd_seq/sections/.text', 0o664, b'0xffffffffa02a9000\n')
+f('sys/module/snd_seq/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/snd_seq/sections/__kcrctab', 0o664, b'0xffffffffa02b16e0\n')
+f('sys/module/snd_seq/sections/.data', 0o664, b'0xffffffffa02b6860\n')
+f('sys/module/snd_seq/sections/.symtab', 0o664, b'0xffffffffa02b1fc8\n')
+f('sys/module/snd_seq/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa02b6bc0\n')
+f('sys/module/snd_seq/sections/.rodata.str1.1', 0o664, b'0xffffffffa02b18b6\n')
+d('sys/module/snd_seq/notes', 0o775)
+f('sys/module/snd_seq/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00O@T\xdaF\x1cl\x11\xfev\xdd\xaa \xea\x87\x92P\xfe\xb1\xf8')
+d('sys/module/usb_storage', 0o775)
+f('sys/module/usb_storage/initstate', 0o664, b'live\n')
+f('sys/module/usb_storage/srcversion', 0o664, b'D07F7C47643AB7AFB6BEF6F\n')
+f('sys/module/usb_storage/refcnt', 0o664, b'1\n')
+d('sys/module/usb_storage/drivers', 0o775)
+l('sys/module/usb_storage/drivers/usb:usb-storage', '../../../bus/usb/drivers/usb-storage')
+d('sys/module/usb_storage/parameters', 0o775)
+f('sys/module/usb_storage/parameters/swi_tru_install', 0o664, b'1\n')
+f('sys/module/usb_storage/parameters/delay_use', 0o664, b'5\n')
+d('sys/module/usb_storage/sections', 0o775)
+f('sys/module/usb_storage/sections/.smp_locks', 0o664, b'0xffffffffa02e1820\n')
+f('sys/module/usb_storage/sections/.exit.text', 0o664, b'0xffffffffa02e056c\n')
+f('sys/module/usb_storage/sections/.note.gnu.build-id', 0o664, b'0xffffffffa02e0580\n')
+f('sys/module/usb_storage/sections/.strtab', 0o664, b'0xffffffffa02e42d0\n')
+f('sys/module/usb_storage/sections/.rodata', 0o664, b'0xffffffffa02e05b0\n')
+f('sys/module/usb_storage/sections/__param', 0o664, b'0xffffffffa02e18b0\n')
+f('sys/module/usb_storage/sections/.bss', 0o664, b'0xffffffffa02e9400\n')
+f('sys/module/usb_storage/sections/.text', 0o664, b'0xffffffffa02dd000\n')
+f('sys/module/usb_storage/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/usb_storage/sections/.data', 0o664, b'0xffffffffa02e5dc0\n')
+f('sys/module/usb_storage/sections/.symtab', 0o664, b'0xffffffffa02e1900\n')
+f('sys/module/usb_storage/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa02e9040\n')
+f('sys/module/usb_storage/sections/.rodata.str1.1', 0o664, b'0xffffffffa02e0ab1\n')
+d('sys/module/usb_storage/notes', 0o775)
+f('sys/module/usb_storage/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00B~(&&u\xc4Ax\xd8|\x80n\xc4G(i\xf3kG')
+d('sys/module/acpi_cpufreq', 0o775)
+f('sys/module/acpi_cpufreq/initstate', 0o664, b'live\n')
+f('sys/module/acpi_cpufreq/srcversion', 0o664, b'09166B6001DCE2189668F16\n')
+f('sys/module/acpi_cpufreq/refcnt', 0o664, b'1\n')
+d('sys/module/acpi_cpufreq/parameters', 0o775)
+f('sys/module/acpi_cpufreq/parameters/acpi_pstate_strict', 0o664, b'0\n')
+d('sys/module/acpi_cpufreq/sections', 0o775)
+f('sys/module/acpi_cpufreq/sections/.smp_locks', 0o664, b'0xffffffffa0254d68\n')
+f('sys/module/acpi_cpufreq/sections/.exit.text', 0o664, b'0xffffffffa0254c4c\n')
+f('sys/module/acpi_cpufreq/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0254c6c\n')
+f('sys/module/acpi_cpufreq/sections/.strtab', 0o664, b'0xffffffffa0255620\n')
+f('sys/module/acpi_cpufreq/sections/.rodata', 0o664, b'0xffffffffa0254ca0\n')
+f('sys/module/acpi_cpufreq/sections/__param', 0o664, b'0xffffffffa0254d70\n')
+f('sys/module/acpi_cpufreq/sections/.bss', 0o664, b'0xffffffffa0256000\n')
+f('sys/module/acpi_cpufreq/sections/.text', 0o664, b'0xffffffffa0254000\n')
+f('sys/module/acpi_cpufreq/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/acpi_cpufreq/sections/.data', 0o664, b'0xffffffffa0255bc0\n')
+f('sys/module/acpi_cpufreq/sections/.symtab', 0o664, b'0xffffffffa0254dc8\n')
+f('sys/module/acpi_cpufreq/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0255c40\n')
+f('sys/module/acpi_cpufreq/sections/.rodata.str1.1', 0o664, b'0xffffffffa0254d98\n')
+d('sys/module/acpi_cpufreq/notes', 0o775)
+f('sys/module/acpi_cpufreq/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xa4\xfd\x13\xe7*\xbd\x99\x95\x99C\xf6\x95\x04\xf1r\xf9\xf7}aL')
+d('sys/module/button', 0o775)
+f('sys/module/button/initstate', 0o664, b'live\n')
+f('sys/module/button/srcversion', 0o664, b'2713981C971D8EC4C059338\n')
+f('sys/module/button/refcnt', 0o664, b'0\n')
+d('sys/module/button/sections', 0o775)
+f('sys/module/button/sections/.smp_locks', 0o664, b'0xffffffffa00a7c98\n')
+f('sys/module/button/sections/.exit.text', 0o664, b'0xffffffffa00a781c\n')
+f('sys/module/button/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00a7898\n')
+f('sys/module/button/sections/.strtab', 0o664, b'0xffffffffa00a84d8\n')
+f('sys/module/button/sections/.rodata', 0o664, b'0xffffffffa00a78c0\n')
+f('sys/module/button/sections/.bss', 0o664, b'0xffffffffa00a8f40\n')
+f('sys/module/button/sections/.text', 0o664, b'0xffffffffa00a7000\n')
+f('sys/module/button/sections/.init.text', 0o664, b'0xffffffffa00aa000\n')
+f('sys/module/button/sections/.data', 0o664, b'0xffffffffa00a89e0\n')
+f('sys/module/button/sections/.symtab', 0o664, b'0xffffffffa00a7cb0\n')
+f('sys/module/button/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa00a8b80\n')
+f('sys/module/button/sections/.rodata.str1.1', 0o664, b'0xffffffffa00a7b60\n')
+d('sys/module/button/notes', 0o775)
+f('sys/module/button/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00;\xc1\xa4qIi\xa7\xa0g\x7fb\xcb\xb4\xba\x80\xb1\x17Z#\xb5')
+d('sys/module/processor', 0o775)
+f('sys/module/processor/initstate', 0o664, b'live\n')
+f('sys/module/processor/srcversion', 0o664, b'8A1C302AFF80867DBAC4684\n')
+f('sys/module/processor/refcnt', 0o664, b'4\n')
+d('sys/module/processor/holders', 0o775)
+l('sys/module/processor/holders/acpi_cpufreq', '../../acpi_cpufreq')
+l('sys/module/processor/holders/thermal', '../../thermal')
+d('sys/module/processor/parameters', 0o775)
+f('sys/module/processor/parameters/ignore_ppc', 0o664, b'0\n')
+f('sys/module/processor/parameters/latency_factor', 0o664, b'2\n')
+d('sys/module/processor/sections', 0o775)
+f('sys/module/processor/sections/.smp_locks', 0o664, b'0xffffffffa0077788\n')
+f('sys/module/processor/sections/__ex_table', 0o664, b'0xffffffffa0077768\n')
+f('sys/module/processor/sections/__bug_table', 0o664, b'0xffffffffa0077621\n')
+f('sys/module/processor/sections/__ksymtab_strings', 0o664, b'0xffffffffa00776b8\n')
+f('sys/module/processor/sections/.exit.text', 0o664, b'0xffffffffa00763a9\n')
+f('sys/module/processor/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00765c4\n')
+f('sys/module/processor/sections/.strtab', 0o664, b'0xffffffffa0079438\n')
+f('sys/module/processor/sections/.fixup', 0o664, b'0xffffffffa00765ad\n')
+f('sys/module/processor/sections/__ksymtab', 0o664, b'0xffffffffa0077640\n')
+f('sys/module/processor/sections/.rodata', 0o664, b'0xffffffffa00765f0\n')
+f('sys/module/processor/sections/.data.read_mostly', 0o664, b'0xffffffffa007b7d8\n')
+f('sys/module/processor/sections/__param', 0o664, b'0xffffffffa00777f0\n')
+f('sys/module/processor/sections/.bss', 0o664, b'0xffffffffa007bbc0\n')
+f('sys/module/processor/sections/.text', 0o664, b'0xffffffffa0072000\n')
+f('sys/module/processor/sections/.init.text', 0o664, b'0xffffffffa007d000\n')
+f('sys/module/processor/sections/__kcrctab', 0o664, b'0xffffffffa0077690\n')
+f('sys/module/processor/sections/.data', 0o664, b'0xffffffffa007ab90\n')
+f('sys/module/processor/sections/.cpuinit.data', 0o664, b'0xffffffffa007b040\n')
+f('sys/module/processor/sections/.symtab', 0o664, b'0xffffffffa0077890\n')
+f('sys/module/processor/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa007b800\n')
+f('sys/module/processor/sections/.rodata.str1.1', 0o664, b'0xffffffffa0076863\n')
+f('sys/module/processor/sections/.cpuinit.text', 0o664, b'0xffffffffa0075abc\n')
+f('sys/module/processor/sections/.ref.text', 0o664, b'0xffffffffa007641a\n')
+d('sys/module/processor/notes', 0o775)
+f('sys/module/processor/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xa1\x01$C\tS,+Ue\\\x8cg\xb0Z\xe9\xa1\xaf[\xe5')
+d('sys/module/oprofile', 0o775)
+d('sys/module/oprofile/parameters', 0o775)
+f('sys/module/oprofile/parameters/timer', 0o664, b'0\n')
+d('sys/module/spurious', 0o775)
+d('sys/module/spurious/parameters', 0o775)
+f('sys/module/spurious/parameters/noirqdebug', 0o664, b'N\n')
+f('sys/module/spurious/parameters/irqfixup', 0o664, b'0\n')
+d('sys/module/raid1', 0o775)
+f('sys/module/raid1/initstate', 0o664, b'live\n')
+f('sys/module/raid1/srcversion', 0o664, b'EA08FDD37C2EEFA95DE4413\n')
+f('sys/module/raid1/refcnt', 0o664, b'1\n')
+d('sys/module/raid1/sections', 0o775)
+f('sys/module/raid1/sections/.smp_locks', 0o664, b'0xffffffffa0236438\n')
+f('sys/module/raid1/sections/__bug_table', 0o664, b'0xffffffffa02369c0\n')
+f('sys/module/raid1/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0236414\n')
+f('sys/module/raid1/sections/.strtab', 0o664, b'0xffffffffa02376f8\n')
+f('sys/module/raid1/sections/.bss', 0o664, b'0xffffffffa0238280\n')
+f('sys/module/raid1/sections/.text', 0o664, b'0xffffffffa0232000\n')
+f('sys/module/raid1/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/raid1/sections/.data', 0o664, b'0xffffffffa0237e20\n')
+f('sys/module/raid1/sections/.symtab', 0o664, b'0xffffffffa0236a08\n')
+f('sys/module/raid1/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0237ec0\n')
+f('sys/module/raid1/sections/.rodata.str1.1', 0o664, b'0xffffffffa0236618\n')
+d('sys/module/raid1/notes', 0o775)
+f('sys/module/raid1/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xcd\xdf0\xe8v}\x0cuP}\x93\xe1\x19\xcd\xed~\xf7\x14\xdd@')
+d('sys/module/edd', 0o775)
+f('sys/module/edd/version', 0o664, b'0.16\n')
+f('sys/module/edd/initstate', 0o664, b'live\n')
+f('sys/module/edd/srcversion', 0o664, b'ED68C1ACC4B2D1B19C7BEA7\n')
+f('sys/module/edd/refcnt', 0o664, b'0\n')
+d('sys/module/edd/sections', 0o775)
+f('sys/module/edd/sections/.exit.text', 0o664, b'0xffffffffa02a1de8\n')
+f('sys/module/edd/sections/.note.gnu.build-id', 0o664, b'0xffffffffa02a1e6c\n')
+f('sys/module/edd/sections/.strtab', 0o664, b'0xffffffffa02a2b88\n')
+f('sys/module/edd/sections/.rodata', 0o664, b'0xffffffffa02a1ea0\n')
+f('sys/module/edd/sections/.bss', 0o664, b'0xffffffffa02a3880\n')
+f('sys/module/edd/sections/.text', 0o664, b'0xffffffffa02a1000\n')
+f('sys/module/edd/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/edd/sections/.data', 0o664, b'0xffffffffa02a3120\n')
+f('sys/module/edd/sections/.symtab', 0o664, b'0xffffffffa02a22b8\n')
+f('sys/module/edd/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa02a34c0\n')
+f('sys/module/edd/sections/.rodata.str1.1', 0o664, b'0xffffffffa02a1f18\n')
+d('sys/module/edd/notes', 0o775)
+f('sys/module/edd/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xbe\x92\xcfW\xc8l\x08\xaf\xb6\x1a\xb7!E\xb8\xd1\x9eU\xd2\xddM')
+d('sys/module/hwmon', 0o775)
+f('sys/module/hwmon/initstate', 0o664, b'live\n')
+f('sys/module/hwmon/srcversion', 0o664, b'9344A0FAA4A298DC9AEBDC8\n')
+f('sys/module/hwmon/refcnt', 0o664, b'1\n')
+d('sys/module/hwmon/holders', 0o775)
+l('sys/module/hwmon/holders/thinkpad_acpi', '../../thinkpad_acpi')
+d('sys/module/hwmon/sections', 0o775)
+f('sys/module/hwmon/sections/__ksymtab_gpl', 0o664, b'0xffffffffa007d1d0\n')
+f('sys/module/hwmon/sections/__ksymtab_strings', 0o664, b'0xffffffffa007d200\n')
+f('sys/module/hwmon/sections/.exit.text', 0o664, b'0xffffffffa007d138\n')
+f('sys/module/hwmon/sections/.note.gnu.build-id', 0o664, b'0xffffffffa007d14c\n')
+f('sys/module/hwmon/sections/.strtab', 0o664, b'0xffffffffa007d770\n')
+f('sys/module/hwmon/sections/.bss', 0o664, b'0xffffffffa007de80\n')
+f('sys/module/hwmon/sections/.text', 0o664, b'0xffffffffa007d000\n')
+f('sys/module/hwmon/sections/.init.text', 0o664, b'0xffffffffa009a000\n')
+f('sys/module/hwmon/sections/.data', 0o664, b'0xffffffffa007da20\n')
+f('sys/module/hwmon/sections/.symtab', 0o664, b'0xffffffffa007d230\n')
+f('sys/module/hwmon/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa007dac0\n')
+f('sys/module/hwmon/sections/.rodata.str1.1', 0o664, b'0xffffffffa007d170\n')
+f('sys/module/hwmon/sections/__kcrctab_gpl', 0o664, b'0xffffffffa007d1f0\n')
+d('sys/module/hwmon/notes', 0o775)
+f('sys/module/hwmon/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\x0fR\x0b\x94!\x19\xde\x14\x93\xac\x9e@\xa2&\xcam,\xba\x12\xd1')
+d('sys/module/backlight', 0o775)
+f('sys/module/backlight/initstate', 0o664, b'live\n')
+f('sys/module/backlight/srcversion', 0o664, b'AFD1565C65F3DA6D942CB52\n')
+f('sys/module/backlight/refcnt', 0o664, b'1\n')
+d('sys/module/backlight/holders', 0o775)
+l('sys/module/backlight/holders/thinkpad_acpi', '../../thinkpad_acpi')
+d('sys/module/backlight/sections', 0o775)
+f('sys/module/backlight/sections/__ksymtab_strings', 0o664, b'0xffffffffa0131700\n')
+f('sys/module/backlight/sections/.exit.text', 0o664, b'0xffffffffa01315ec\n')
+f('sys/module/backlight/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0131600\n')
+f('sys/module/backlight/sections/.strtab', 0o664, b'0xffffffffa0131de0\n')
+f('sys/module/backlight/sections/__ksymtab', 0o664, b'0xffffffffa01316d0\n')
+f('sys/module/backlight/sections/.bss', 0o664, b'0xffffffffa01326c0\n')
+f('sys/module/backlight/sections/.text', 0o664, b'0xffffffffa0131000\n')
+f('sys/module/backlight/sections/.init.text', 0o664, b'0xffffffffa0070000\n')
+f('sys/module/backlight/sections/__kcrctab', 0o664, b'0xffffffffa01316f0\n')
+f('sys/module/backlight/sections/.data', 0o664, b'0xffffffffa0132220\n')
+f('sys/module/backlight/sections/.symtab', 0o664, b'0xffffffffa0131738\n')
+f('sys/module/backlight/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0132300\n')
+f('sys/module/backlight/sections/.rodata.str1.1', 0o664, b'0xffffffffa0131624\n')
+d('sys/module/backlight/notes', 0o775)
+f('sys/module/backlight/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00d\xb6_\xb64[\x83\x90Fm(\x91J\xb1\xce\xf5\xaa\xd2\xf4}')
+d('sys/module/snd', 0o775)
+f('sys/module/snd/initstate', 0o664, b'live\n')
+f('sys/module/snd/srcversion', 0o664, b'D48337942305C9A41A7CC12\n')
+f('sys/module/snd/refcnt', 0o664, b'13\n')
+d('sys/module/snd/holders', 0o775)
+l('sys/module/snd/holders/snd_seq', '../../snd_seq')
+l('sys/module/snd/holders/snd_timer', '../../snd_timer')
+l('sys/module/snd/holders/snd_pcm', '../../snd_pcm')
+l('sys/module/snd/holders/snd_hda_intel', '../../snd_hda_intel')
+l('sys/module/snd/holders/snd_mixer_oss', '../../snd_mixer_oss')
+l('sys/module/snd/holders/snd_pcm_oss', '../../snd_pcm_oss')
+l('sys/module/snd/holders/snd_seq_device', '../../snd_seq_device')
+d('sys/module/snd/parameters', 0o775)
+f('sys/module/snd/parameters/slots', 0o664, b'snd-hda-intel,<NULL>,<NULL>,<NULL>,<NULL>,<NULL>,<NULL>,<NULL>\n')
+f('sys/module/snd/parameters/major', 0o664, b'116\n')
+f('sys/module/snd/parameters/cards_limit', 0o664, b'1\n')
+d('sys/module/snd/sections', 0o775)
+f('sys/module/snd/sections/__ksymtab_strings', 0o664, b'0xffffffffa00d32e8\n')
+f('sys/module/snd/sections/.exit.text', 0o664, b'0xffffffffa00d1bc4\n')
+f('sys/module/snd/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00d1c8c\n')
+f('sys/module/snd/sections/.strtab', 0o664, b'0xffffffffa00d6cc8\n')
+f('sys/module/snd/sections/__ksymtab', 0o664, b'0xffffffffa00d2d00\n')
+f('sys/module/snd/sections/.rodata', 0o664, b'0xffffffffa00d1cc0\n')
+f('sys/module/snd/sections/__param', 0o664, b'0xffffffffa00d3270\n')
+f('sys/module/snd/sections/.bss', 0o664, b'0xffffffffa00da480\n')
+f('sys/module/snd/sections/.text', 0o664, b'0xffffffffa00ca000\n')
+f('sys/module/snd/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/snd/sections/__kcrctab', 0o664, b'0xffffffffa00d30a0\n')
+f('sys/module/snd/sections/.data', 0o664, b'0xffffffffa00d9be0\n')
+f('sys/module/snd/sections/.symtab', 0o664, b'0xffffffffa00d3770\n')
+f('sys/module/snd/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa00da0c0\n')
+f('sys/module/snd/sections/.rodata.str1.1', 0o664, b'0xffffffffa00d2558\n')
+d('sys/module/snd/notes', 0o775)
+f('sys/module/snd/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xee\x11+\xc0\xd4\x8f\x10\x02v\xf8\t\xb4\xa8\xf6[z\xd3\xb3\xb7\x87')
+d('sys/module/mac80211', 0o775)
+f('sys/module/mac80211/initstate', 0o664, b'live\n')
+f('sys/module/mac80211/srcversion', 0o664, b'330E8FB2F2933F478C444A4\n')
+f('sys/module/mac80211/refcnt', 0o664, b'1\n')
+d('sys/module/mac80211/holders', 0o775)
+l('sys/module/mac80211/holders/iwl3945', '../../iwl3945')
+d('sys/module/mac80211/parameters', 0o775)
+f('sys/module/mac80211/parameters/ieee80211_default_rc_algo', 0o664, b'pid\n')
+d('sys/module/mac80211/sections', 0o775)
+f('sys/module/mac80211/sections/__ksymtab_gpl', 0o664, b'0xffffffffa0127a50\n')
+f('sys/module/mac80211/sections/.smp_locks', 0o664, b'0xffffffffa01270a0\n')
+f('sys/module/mac80211/sections/__bug_table', 0o664, b'0xffffffffa0124183\n')
+f('sys/module/mac80211/sections/__ksymtab_strings', 0o664, b'0xffffffffa0127630\n')
+f('sys/module/mac80211/sections/.exit.text', 0o664, b'0xffffffffa0122de4\n')
+f('sys/module/mac80211/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0122df4\n')
+f('sys/module/mac80211/sections/.strtab', 0o664, b'0xffffffffa012b890\n')
+f('sys/module/mac80211/sections/__ksymtab', 0o664, b'0xffffffffa01272a0\n')
+f('sys/module/mac80211/sections/.rodata', 0o664, b'0xffffffffa0122e20\n')
+f('sys/module/mac80211/sections/__param', 0o664, b'0xffffffffa0127a28\n')
+f('sys/module/mac80211/sections/.bss', 0o664, b'0xffffffffa012fa40\n')
+f('sys/module/mac80211/sections/.text', 0o664, b'0xffffffffa0109000\n')
+f('sys/module/mac80211/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/mac80211/sections/__kcrctab', 0o664, b'0xffffffffa0127500\n')
+f('sys/module/mac80211/sections/.data', 0o664, b'0xffffffffa012f340\n')
+f('sys/module/mac80211/sections/.symtab', 0o664, b'0xffffffffa0127a80\n')
+f('sys/module/mac80211/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa012f680\n')
+f('sys/module/mac80211/sections/.rodata.str1.1', 0o664, b'0xffffffffa0123c40\n')
+f('sys/module/mac80211/sections/__kcrctab_gpl', 0o664, b'0xffffffffa0127a70\n')
+d('sys/module/mac80211/notes', 0o775)
+f('sys/module/mac80211/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00"i\xe2\xa0\x92\xbc7\xc4#\xbc\xda\xf11\x02\x13\xd5\x155\x1cS')
+d('sys/module/printk', 0o775)
+d('sys/module/printk/parameters', 0o775)
+f('sys/module/printk/parameters/time', 0o664, b'N\n')
+d('sys/module/rtc_lib', 0o775)
+f('sys/module/rtc_lib/initstate', 0o664, b'live\n')
+f('sys/module/rtc_lib/srcversion', 0o664, b'7884E7FF8728D88C6BD1427\n')
+f('sys/module/rtc_lib/refcnt', 0o664, b'1\n')
+d('sys/module/rtc_lib/holders', 0o775)
+l('sys/module/rtc_lib/holders/rtc_core', '../../rtc_core')
+d('sys/module/rtc_lib/sections', 0o775)
+f('sys/module/rtc_lib/sections/__ksymtab_strings', 0o664, b'0xffffffffa009c3f8\n')
+f('sys/module/rtc_lib/sections/.note.gnu.build-id', 0o664, b'0xffffffffa009c31c\n')
+f('sys/module/rtc_lib/sections/.strtab', 0o664, b'0xffffffffa009c8f0\n')
+f('sys/module/rtc_lib/sections/__ksymtab', 0o664, b'0xffffffffa009c380\n')
+f('sys/module/rtc_lib/sections/.rodata', 0o664, b'0xffffffffa009c340\n')
+f('sys/module/rtc_lib/sections/.bss', 0o664, b'0xffffffffa009cf80\n')
+f('sys/module/rtc_lib/sections/.text', 0o664, b'0xffffffffa009c000\n')
+f('sys/module/rtc_lib/sections/__kcrctab', 0o664, b'0xffffffffa009c3d0\n')
+f('sys/module/rtc_lib/sections/.data', 0o664, b'0xffffffffa009cba8\n')
+f('sys/module/rtc_lib/sections/.symtab', 0o664, b'0xffffffffa009c440\n')
+f('sys/module/rtc_lib/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa009cbc0\n')
+d('sys/module/rtc_lib/notes', 0o775)
+f('sys/module/rtc_lib/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xb4\xe2\xcfLw\x17j\xb2\xc7\xf1 \xfa\xc7G\x99+b^+S')
+d('sys/module/mousedev', 0o775)
+d('sys/module/mousedev/parameters', 0o775)
+f('sys/module/mousedev/parameters/tap_time', 0o664, b'200\n')
+f('sys/module/mousedev/parameters/yres', 0o664, b'768\n')
+f('sys/module/mousedev/parameters/xres', 0o664, b'1024\n')
+d('sys/module/rtc_cmos', 0o775)
+f('sys/module/rtc_cmos/initstate', 0o664, b'live\n')
+f('sys/module/rtc_cmos/srcversion', 0o664, b'7BE4B8C2A52556D0C62CB0B\n')
+f('sys/module/rtc_cmos/refcnt', 0o664, b'0\n')
+d('sys/module/rtc_cmos/sections', 0o775)
+f('sys/module/rtc_cmos/sections/.exit.text', 0o664, b'0xffffffffa00fe370\n')
+f('sys/module/rtc_cmos/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00fe4e4\n')
+f('sys/module/rtc_cmos/sections/.strtab', 0o664, b'0xffffffffa00ff1a8\n')
+f('sys/module/rtc_cmos/sections/.rodata', 0o664, b'0xffffffffa00fe520\n')
+f('sys/module/rtc_cmos/sections/.bss', 0o664, b'0xffffffffa00ffd40\n')
+f('sys/module/rtc_cmos/sections/.text', 0o664, b'0xffffffffa00fd000\n')
+f('sys/module/rtc_cmos/sections/.init.text', 0o664, b'0xffffffffa007d000\n')
+f('sys/module/rtc_cmos/sections/.data', 0o664, b'0xffffffffa00ff800\n')
+f('sys/module/rtc_cmos/sections/.devinit.text', 0o664, b'0xffffffffa00fe44f\n')
+f('sys/module/rtc_cmos/sections/.symtab', 0o664, b'0xffffffffa00fe6e0\n')
+f('sys/module/rtc_cmos/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa00ff980\n')
+f('sys/module/rtc_cmos/sections/.rodata.str1.1', 0o664, b'0xffffffffa00fe6a2\n')
+d('sys/module/rtc_cmos/notes', 0o775)
+f('sys/module/rtc_cmos/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xf4\x82\xed4\xe7\x10\xb9\x7f\xa9 \x0c\xedIf0\x86u\xd41\x87')
+d('sys/module/battery', 0o775)
+f('sys/module/battery/initstate', 0o664, b'live\n')
+f('sys/module/battery/srcversion', 0o664, b'5A2CE8D302B31A112CFB57A\n')
+f('sys/module/battery/refcnt', 0o664, b'0\n')
+d('sys/module/battery/parameters', 0o775)
+f('sys/module/battery/parameters/cache_time', 0o664, b'1000\n')
+d('sys/module/battery/sections', 0o775)
+f('sys/module/battery/sections/.exit.text', 0o664, b'0xffffffffa008008c\n')
+f('sys/module/battery/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00800ac\n')
+f('sys/module/battery/sections/.strtab', 0o664, b'0xffffffffa0081318\n')
+f('sys/module/battery/sections/.rodata', 0o664, b'0xffffffffa00800d0\n')
+f('sys/module/battery/sections/__param', 0o664, b'0xffffffffa0080798\n')
+f('sys/module/battery/sections/.bss', 0o664, b'0xffffffffa0082440\n')
+f('sys/module/battery/sections/.text', 0o664, b'0xffffffffa007f000\n')
+f('sys/module/battery/sections/.init.text', 0o664, b'0xffffffffa0084000\n')
+f('sys/module/battery/sections/.data', 0o664, b'0xffffffffa0081a90\n')
+f('sys/module/battery/sections/.symtab', 0o664, b'0xffffffffa00807c0\n')
+f('sys/module/battery/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0082080\n')
+f('sys/module/battery/sections/.rodata.str1.1', 0o664, b'0xffffffffa008025b\n')
+d('sys/module/battery/notes', 0o775)
+f('sys/module/battery/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xe3\xa8\xcc.j\xb3\xda\xc8\x88\x03\xca\xf6\xf0*\x9c-\xffE!\xd3')
+d('sys/module/yenta_socket', 0o775)
+f('sys/module/yenta_socket/initstate', 0o664, b'live\n')
+f('sys/module/yenta_socket/srcversion', 0o664, b'B0538CB6E6ED071E80A4575\n')
+f('sys/module/yenta_socket/refcnt', 0o664, b'1\n')
+d('sys/module/yenta_socket/drivers', 0o775)
+l('sys/module/yenta_socket/drivers/pci:yenta_cardbus', '../../../bus/pci/drivers/yenta_cardbus')
+d('sys/module/yenta_socket/parameters', 0o775)
+f('sys/module/yenta_socket/parameters/isa_probe', 0o664, b'Y\n')
+f('sys/module/yenta_socket/parameters/disable_clkrun', 0o664, b'N\n')
+f('sys/module/yenta_socket/parameters/pwr_irqs_off', 0o664, b'N\n')
+d('sys/module/yenta_socket/sections', 0o775)
+f('sys/module/yenta_socket/sections/__bug_table', 0o664, b'0xffffffffa0104aa6\n')
+f('sys/module/yenta_socket/sections/.exit.text', 0o664, b'0xffffffffa0103c44\n')
+f('sys/module/yenta_socket/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0104330\n')
+f('sys/module/yenta_socket/sections/.strtab', 0o664, b'0xffffffffa0105e80\n')
+f('sys/module/yenta_socket/sections/.rodata', 0o664, b'0xffffffffa0104354\n')
+f('sys/module/yenta_socket/sections/__param', 0o664, b'0xffffffffa0104ad8\n')
+f('sys/module/yenta_socket/sections/.bss', 0o664, b'0xffffffffa0107800\n')
+f('sys/module/yenta_socket/sections/.text', 0o664, b'0xffffffffa0101000\n')
+f('sys/module/yenta_socket/sections/.init.text', 0o664, b'0xffffffffa0084000\n')
+f('sys/module/yenta_socket/sections/.data', 0o664, b'0xffffffffa0106ac0\n')
+f('sys/module/yenta_socket/sections/.devinit.text', 0o664, b'0xffffffffa0103c60\n')
+f('sys/module/yenta_socket/sections/.symtab', 0o664, b'0xffffffffa0104b78\n')
+f('sys/module/yenta_socket/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0107440\n')
+f('sys/module/yenta_socket/sections/.rodata.str1.1', 0o664, b'0xffffffffa0104388\n')
+d('sys/module/yenta_socket/notes', 0o775)
+f('sys/module/yenta_socket/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00H\xa8\xe9\xf1\x06e\xb4\xe4\xd7\xa1\x7f\xf8G)\x1a\xa3\xec\xe7m<')
+d('sys/module/acpi', 0o775)
+d('sys/module/acpi/parameters', 0o775)
+f('sys/module/acpi/parameters/acpica_version', 0o664, b'20080609\n')
+d('sys/module/cdc_acm', 0o775)
+f('sys/module/cdc_acm/initstate', 0o664, b'live\n')
+f('sys/module/cdc_acm/srcversion', 0o664, b'5DED3866AA046376E4E36DD\n')
+f('sys/module/cdc_acm/refcnt', 0o664, b'0\n')
+d('sys/module/cdc_acm/drivers', 0o775)
+l('sys/module/cdc_acm/drivers/usb:cdc_acm', '../../../bus/usb/drivers/cdc_acm')
+d('sys/module/cdc_acm/sections', 0o775)
+f('sys/module/cdc_acm/sections/.smp_locks', 0o664, b'0xffffffffa02d9660\n')
+f('sys/module/cdc_acm/sections/.exit.text', 0o664, b'0xffffffffa02d949c\n')
+f('sys/module/cdc_acm/sections/.note.gnu.build-id', 0o664, b'0xffffffffa02d94c8\n')
+f('sys/module/cdc_acm/sections/.strtab', 0o664, b'0xffffffffa02da838\n')
+f('sys/module/cdc_acm/sections/.rodata', 0o664, b'0xffffffffa02d9500\n')
+f('sys/module/cdc_acm/sections/.bss', 0o664, b'0xffffffffa02db8c0\n')
+f('sys/module/cdc_acm/sections/.text', 0o664, b'0xffffffffa02d7000\n')
+f('sys/module/cdc_acm/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/cdc_acm/sections/.data', 0o664, b'0xffffffffa02db0e0\n')
+f('sys/module/cdc_acm/sections/.symtab', 0o664, b'0xffffffffa02d9968\n')
+f('sys/module/cdc_acm/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa02db500\n')
+f('sys/module/cdc_acm/sections/.rodata.str1.1', 0o664, b'0xffffffffa02d9698\n')
+d('sys/module/cdc_acm/notes', 0o775)
+f('sys/module/cdc_acm/notes/.note.gnu.build-id', 0o664, b"\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xe1=\x89\xe9\xe8L\t\xfe|o\x9c+\xfe\x81\xe8\xc6P'\xa4$")
+d('sys/module/snd_timer', 0o775)
+f('sys/module/snd_timer/initstate', 0o664, b'live\n')
+f('sys/module/snd_timer/srcversion', 0o664, b'1F1836030C5B604CF478CFC\n')
+f('sys/module/snd_timer/refcnt', 0o664, b'2\n')
+d('sys/module/snd_timer/holders', 0o775)
+l('sys/module/snd_timer/holders/snd_seq', '../../snd_seq')
+l('sys/module/snd_timer/holders/snd_pcm', '../../snd_pcm')
+d('sys/module/snd_timer/parameters', 0o775)
+f('sys/module/snd_timer/parameters/timer_tstamp_monotonic', 0o664, b'1\n')
+f('sys/module/snd_timer/parameters/timer_limit', 0o664, b'1\n')
+d('sys/module/snd_timer/sections', 0o775)
+f('sys/module/snd_timer/sections/.smp_locks', 0o664, b'0xffffffffa00f8908\n')
+f('sys/module/snd_timer/sections/__bug_table', 0o664, b'0xffffffffa00f888f\n')
+f('sys/module/snd_timer/sections/__ksymtab_strings', 0o664, b'0xffffffffa00f8a98\n')
+f('sys/module/snd_timer/sections/.exit.text', 0o664, b'0xffffffffa00f8520\n')
+f('sys/module/snd_timer/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00f8590\n')
+f('sys/module/snd_timer/sections/.strtab', 0o664, b'0xffffffffa00f9e90\n')
+f('sys/module/snd_timer/sections/__ksymtab', 0o664, b'0xffffffffa00f8910\n')
+f('sys/module/snd_timer/sections/.rodata', 0o664, b'0xffffffffa00f85c0\n')
+f('sys/module/snd_timer/sections/__param', 0o664, b'0xffffffffa00f8a48\n')
+f('sys/module/snd_timer/sections/.bss', 0o664, b'0xffffffffa00fb200\n')
+f('sys/module/snd_timer/sections/.text', 0o664, b'0xffffffffa00f5000\n')
+f('sys/module/snd_timer/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/snd_timer/sections/__kcrctab', 0o664, b'0xffffffffa00f89e0\n')
+f('sys/module/snd_timer/sections/.data', 0o664, b'0xffffffffa00fad00\n')
+f('sys/module/snd_timer/sections/.symtab', 0o664, b'0xffffffffa00f8b88\n')
+f('sys/module/snd_timer/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa00fae40\n')
+f('sys/module/snd_timer/sections/.rodata.str1.1', 0o664, b'0xffffffffa00f8723\n')
+d('sys/module/snd_timer/notes', 0o775)
+f('sys/module/snd_timer/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xb2uP\xf49\x98_\xdcY\xc1\xbfY\xa4yn\xb0\xbe\x9c\xf2F')
+d('sys/module/e1000e', 0o775)
+f('sys/module/e1000e/version', 0o664, b'0.3.3.3-k2\n')
+f('sys/module/e1000e/initstate', 0o664, b'live\n')
+f('sys/module/e1000e/srcversion', 0o664, b'5B93BF2B618524ED19305C8\n')
+f('sys/module/e1000e/refcnt', 0o664, b'0\n')
+d('sys/module/e1000e/drivers', 0o775)
+l('sys/module/e1000e/drivers/pci:e1000e', '../../../bus/pci/drivers/e1000e')
+d('sys/module/e1000e/parameters', 0o775)
+f('sys/module/e1000e/parameters/copybreak', 0o664, b'256\n')
+d('sys/module/e1000e/sections', 0o775)
+f('sys/module/e1000e/sections/.devinit.data', 0o664, b'0xffffffffa0024fe0\n')
+f('sys/module/e1000e/sections/.smp_locks', 0o664, b'0xffffffffa001e730\n')
+f('sys/module/e1000e/sections/__bug_table', 0o664, b'0xffffffffa001e590\n')
+f('sys/module/e1000e/sections/.exit.text', 0o664, b'0xffffffffa001c64f\n')
+f('sys/module/e1000e/sections/.note.gnu.build-id', 0o664, b'0xffffffffa001c750\n')
+f('sys/module/e1000e/sections/.strtab', 0o664, b'0xffffffffa0021ac0\n')
+f('sys/module/e1000e/sections/.devexit.text', 0o664, b'0xffffffffa001c672\n')
+f('sys/module/e1000e/sections/.rodata', 0o664, b'0xffffffffa001c780\n')
+f('sys/module/e1000e/sections/__param', 0o664, b'0xffffffffa001e5f0\n')
+f('sys/module/e1000e/sections/.bss', 0o664, b'0xffffffffa0025800\n')
+f('sys/module/e1000e/sections/.text', 0o664, b'0xffffffffa0009000\n')
+f('sys/module/e1000e/sections/.init.text', 0o664, b'0xffffffffa0027000\n')
+f('sys/module/e1000e/sections/.data', 0o664, b'0xffffffffa00243c0\n')
+f('sys/module/e1000e/sections/.devinit.text', 0o664, b'0xffffffffa001b380\n')
+f('sys/module/e1000e/sections/.symtab', 0o664, b'0xffffffffa001e8b0\n')
+f('sys/module/e1000e/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0025440\n')
+f('sys/module/e1000e/sections/.rodata.str1.1', 0o664, b'0xffffffffa001d6f0\n')
+d('sys/module/e1000e/notes', 0o775)
+f('sys/module/e1000e/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xcbJ\xb1\x8eG^\xf7\xba\xbf\xa6\x1b\x03\xfasqDl\xf7"\xf1')
+d('sys/module/aes_x86_64', 0o775)
+f('sys/module/aes_x86_64/initstate', 0o664, b'live\n')
+f('sys/module/aes_x86_64/srcversion', 0o664, b'4E315E23114A08593D5D731\n')
+f('sys/module/aes_x86_64/refcnt', 0o664, b'2\n')
+d('sys/module/aes_x86_64/sections', 0o775)
+f('sys/module/aes_x86_64/sections/.exit.text', 0o664, b'0xffffffffa02d471c\n')
+f('sys/module/aes_x86_64/sections/.note.gnu.build-id', 0o664, b'0xffffffffa02d4730\n')
+f('sys/module/aes_x86_64/sections/.strtab', 0o664, b'0xffffffffa02d4b60\n')
+f('sys/module/aes_x86_64/sections/.bss', 0o664, b'0xffffffffa02d5200\n')
+f('sys/module/aes_x86_64/sections/.text', 0o664, b'0xffffffffa02d3000\n')
+f('sys/module/aes_x86_64/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/aes_x86_64/sections/.data', 0o664, b'0xffffffffa02d4d20\n')
+f('sys/module/aes_x86_64/sections/.symtab', 0o664, b'0xffffffffa02d4758\n')
+f('sys/module/aes_x86_64/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa02d4e40\n')
+d('sys/module/aes_x86_64/notes', 0o775)
+f('sys/module/aes_x86_64/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\x1e3\x8c\xa9\xdd\xa1\xeb\\\xcf\xd3\x0f\xd1\xfc\xaa\xd2y\x08+f\xca')
+d('sys/module/dm_mod', 0o775)
+f('sys/module/dm_mod/initstate', 0o664, b'live\n')
+f('sys/module/dm_mod/srcversion', 0o664, b'458AEB289C7AA031FFD0011\n')
+f('sys/module/dm_mod/refcnt', 0o664, b'0\n')
+d('sys/module/dm_mod/sections', 0o775)
+f('sys/module/dm_mod/sections/__ksymtab_gpl', 0o664, b'0xffffffffa02122b0\n')
+f('sys/module/dm_mod/sections/.smp_locks', 0o664, b'0xffffffffa0210eb8\n')
+f('sys/module/dm_mod/sections/__bug_table', 0o664, b'0xffffffffa0211f54\n')
+f('sys/module/dm_mod/sections/__ksymtab_strings', 0o664, b'0xffffffffa0212310\n')
+f('sys/module/dm_mod/sections/.exit.text', 0o664, b'0xffffffffa0210c20\n')
+f('sys/module/dm_mod/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0210c54\n')
+f('sys/module/dm_mod/sections/.strtab', 0o664, b'0xffffffffa02151f0\n')
+f('sys/module/dm_mod/sections/__ksymtab', 0o664, b'0xffffffffa02120d0\n')
+f('sys/module/dm_mod/sections/.rodata', 0o664, b'0xffffffffa0210c80\n')
+f('sys/module/dm_mod/sections/__param', 0o664, b'0xffffffffa02120a8\n')
+f('sys/module/dm_mod/sections/.bss', 0o664, b'0xffffffffa02177c0\n')
+f('sys/module/dm_mod/sections/.text', 0o664, b'0xffffffffa0209000\n')
+f('sys/module/dm_mod/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/dm_mod/sections/__kcrctab', 0o664, b'0xffffffffa0212210\n')
+f('sys/module/dm_mod/sections/.data', 0o664, b'0xffffffffa0216f40\n')
+f('sys/module/dm_mod/sections/.init.data', 0o664, b'0xffffffffa00652c0\n')
+f('sys/module/dm_mod/sections/.symtab', 0o664, b'0xffffffffa02124a8\n')
+f('sys/module/dm_mod/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0217400\n')
+f('sys/module/dm_mod/sections/.rodata.str1.1', 0o664, b'0xffffffffa0211c4d\n')
+f('sys/module/dm_mod/sections/__kcrctab_gpl', 0o664, b'0xffffffffa02122f0\n')
+d('sys/module/dm_mod/notes', 0o775)
+f('sys/module/dm_mod/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00^(\xdd\x16OD6\xfb\x89\xe6\xca3Vl\xb0\xd7MBp\x84')
+d('sys/module/usbhid', 0o775)
+f('sys/module/usbhid/initstate', 0o664, b'live\n')
+f('sys/module/usbhid/srcversion', 0o664, b'3D7B82FE16E5E534DE4C12B\n')
+f('sys/module/usbhid/refcnt', 0o664, b'0\n')
+d('sys/module/usbhid/drivers', 0o775)
+l('sys/module/usbhid/drivers/usb:usbhid', '../../../bus/usb/drivers/usbhid')
+d('sys/module/usbhid/parameters', 0o775)
+f('sys/module/usbhid/parameters/mousepoll', 0o664, b'0\n')
+f('sys/module/usbhid/parameters/rdesc_quirks', 0o664, b'<NULL>,<NULL>,<NULL>,<NULL>\n')
+f('sys/module/usbhid/parameters/quirks', 0o664, b'<NULL>,<NULL>,<NULL>,<NULL>\n')
+d('sys/module/usbhid/sections', 0o775)
+f('sys/module/usbhid/sections/__ksymtab_gpl', 0o664, b'0xffffffffa0201e60\n')
+f('sys/module/usbhid/sections/.smp_locks', 0o664, b'0xffffffffa0201700\n')
+f('sys/module/usbhid/sections/__ksymtab_strings', 0o664, b'0xffffffffa0201e78\n')
+f('sys/module/usbhid/sections/.exit.text', 0o664, b'0xffffffffa0200c6c\n')
+f('sys/module/usbhid/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0200c84\n')
+f('sys/module/usbhid/sections/.strtab', 0o664, b'0xffffffffa0202e68\n')
+f('sys/module/usbhid/sections/.rodata', 0o664, b'0xffffffffa0200cc0\n')
+f('sys/module/usbhid/sections/__param', 0o664, b'0xffffffffa0201de0\n')
+f('sys/module/usbhid/sections/.bss', 0o664, b'0xffffffffa0203d80\n')
+f('sys/module/usbhid/sections/.text', 0o664, b'0xffffffffa01fe000\n')
+f('sys/module/usbhid/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/usbhid/sections/.data', 0o664, b'0xffffffffa02037c0\n')
+f('sys/module/usbhid/sections/.symtab', 0o664, b'0xffffffffa0201e90\n')
+f('sys/module/usbhid/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa02039c0\n')
+f('sys/module/usbhid/sections/.rodata.str1.1', 0o664, b'0xffffffffa02017a8\n')
+f('sys/module/usbhid/sections/__kcrctab_gpl', 0o664, b'0xffffffffa0201e70\n')
+d('sys/module/usbhid/notes', 0o775)
+f('sys/module/usbhid/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00F\xd8\xa9\xb5\x91:~\xd6KY>\x94\xe1\x1d\xab\xf6\xe5\xeeu*')
+d('sys/module/iwl3945', 0o775)
+f('sys/module/iwl3945/version', 0o664, b'1.2.26ks\n')
+f('sys/module/iwl3945/initstate', 0o664, b'live\n')
+f('sys/module/iwl3945/srcversion', 0o664, b'5C079549ABD48E07B20F3C7\n')
+f('sys/module/iwl3945/refcnt', 0o664, b'0\n')
+d('sys/module/iwl3945/drivers', 0o775)
+l('sys/module/iwl3945/drivers/pci:iwl3945', '../../../bus/pci/drivers/iwl3945')
+d('sys/module/iwl3945/parameters', 0o775)
+f('sys/module/iwl3945/parameters/disable_hw_scan', 0o664, b'0\n')
+f('sys/module/iwl3945/parameters/queues_num', 0o664, b'8\n')
+f('sys/module/iwl3945/parameters/debug', 0o664, b'0\n')
+f('sys/module/iwl3945/parameters/disable', 0o664, b'0\n')
+f('sys/module/iwl3945/parameters/hwcrypto', 0o664, b'0\n')
+f('sys/module/iwl3945/parameters/antenna', 0o664, b'0\n')
+f('sys/module/iwl3945/parameters/qos_enable', 0o664, b'1\n')
+d('sys/module/iwl3945/sections', 0o775)
+f('sys/module/iwl3945/sections/.smp_locks', 0o664, b'0xffffffffa015e0e0\n')
+f('sys/module/iwl3945/sections/__bug_table', 0o664, b'0xffffffffa015e300\n')
+f('sys/module/iwl3945/sections/.exit.text', 0o664, b'0xffffffffa015b2e4\n')
+f('sys/module/iwl3945/sections/.note.gnu.build-id', 0o664, b'0xffffffffa015b2fc\n')
+f('sys/module/iwl3945/sections/.strtab', 0o664, b'0xffffffffa0160f20\n')
+f('sys/module/iwl3945/sections/.devexit.text', 0o664, b'0xffffffffa015b044\n')
+f('sys/module/iwl3945/sections/.rodata', 0o664, b'0xffffffffa015b320\n')
+f('sys/module/iwl3945/sections/__param', 0o664, b'0xffffffffa015e4b0\n')
+f('sys/module/iwl3945/sections/.bss', 0o664, b'0xffffffffa0163d80\n')
+f('sys/module/iwl3945/sections/.text', 0o664, b'0xffffffffa014b000\n')
+f('sys/module/iwl3945/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/iwl3945/sections/.data', 0o664, b'0xffffffffa0162f00\n')
+f('sys/module/iwl3945/sections/.symtab', 0o664, b'0xffffffffa015e5c8\n')
+f('sys/module/iwl3945/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa01639c0\n')
+f('sys/module/iwl3945/sections/.rodata.str1.1', 0o664, b'0xffffffffa015bc0c\n')
+d('sys/module/iwl3945/notes', 0o775)
+f('sys/module/iwl3945/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xd1^"`\xf9\xf2&\x0b\xe0T\x9b\xe1,\xab\x88\x9bos\x0b\xdb')
+d('sys/module/rsrc_nonstatic', 0o775)
+f('sys/module/rsrc_nonstatic/initstate', 0o664, b'live\n')
+f('sys/module/rsrc_nonstatic/srcversion', 0o664, b'8554CBDFE6293476856E830\n')
+f('sys/module/rsrc_nonstatic/refcnt', 0o664, b'1\n')
+d('sys/module/rsrc_nonstatic/holders', 0o775)
+l('sys/module/rsrc_nonstatic/holders/yenta_socket', '../../yenta_socket')
+d('sys/module/rsrc_nonstatic/parameters', 0o775)
+f('sys/module/rsrc_nonstatic/parameters/probe_mem', 0o664, b'1\n')
+d('sys/module/rsrc_nonstatic/sections', 0o775)
+f('sys/module/rsrc_nonstatic/sections/__ksymtab_strings', 0o664, b'0xffffffffa00ef8a0\n')
+f('sys/module/rsrc_nonstatic/sections/.exit.text', 0o664, b'0xffffffffa00ef624\n')
+f('sys/module/rsrc_nonstatic/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00ef69c\n')
+f('sys/module/rsrc_nonstatic/sections/.strtab', 0o664, b'0xffffffffa00f0260\n')
+f('sys/module/rsrc_nonstatic/sections/__ksymtab', 0o664, b'0xffffffffa00ef860\n')
+f('sys/module/rsrc_nonstatic/sections/.devexit.text', 0o664, b'0xffffffffa00ef636\n')
+f('sys/module/rsrc_nonstatic/sections/.rodata', 0o664, b'0xffffffffa00ef6c0\n')
+f('sys/module/rsrc_nonstatic/sections/__param', 0o664, b'0xffffffffa00ef878\n')
+f('sys/module/rsrc_nonstatic/sections/.bss', 0o664, b'0xffffffffa00f0dc0\n')
+f('sys/module/rsrc_nonstatic/sections/.text', 0o664, b'0xffffffffa00ee000\n')
+f('sys/module/rsrc_nonstatic/sections/.init.text', 0o664, b'0xffffffffa0084000\n')
+f('sys/module/rsrc_nonstatic/sections/__kcrctab', 0o664, b'0xffffffffa00ef870\n')
+f('sys/module/rsrc_nonstatic/sections/.ref.data', 0o664, b'0xffffffffa00f09c0\n')
+f('sys/module/rsrc_nonstatic/sections/.data', 0o664, b'0xffffffffa00f0820\n')
+f('sys/module/rsrc_nonstatic/sections/.devinit.text', 0o664, b'0xffffffffa00ef665\n')
+f('sys/module/rsrc_nonstatic/sections/.symtab', 0o664, b'0xffffffffa00ef8b8\n')
+f('sys/module/rsrc_nonstatic/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa00f0a00\n')
+f('sys/module/rsrc_nonstatic/sections/.rodata.str1.1', 0o664, b'0xffffffffa00ef78d\n')
+d('sys/module/rsrc_nonstatic/notes', 0o775)
+f('sys/module/rsrc_nonstatic/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xd5n\x94\x07\x89\xe1\x08\xe3\x07C\xb9\x83\x0c\x19*6\xe8\xe3\x10R')
+d('sys/module/thinkpad_acpi', 0o775)
+f('sys/module/thinkpad_acpi/version', 0o664, b'0.21\n')
+f('sys/module/thinkpad_acpi/initstate', 0o664, b'live\n')
+f('sys/module/thinkpad_acpi/srcversion', 0o664, b'FA276F7EFAA90BF39100654\n')
+f('sys/module/thinkpad_acpi/refcnt', 0o664, b'0\n')
+d('sys/module/thinkpad_acpi/drivers', 0o775)
+l('sys/module/thinkpad_acpi/drivers/platform:thinkpad_hwmon', '../../../bus/platform/drivers/thinkpad_hwmon')
+l('sys/module/thinkpad_acpi/drivers/platform:thinkpad_acpi', '../../../bus/platform/drivers/thinkpad_acpi')
+d('sys/module/thinkpad_acpi/sections', 0o775)
+f('sys/module/thinkpad_acpi/sections/.smp_locks', 0o664, b'0xffffffffa01e6088\n')
+f('sys/module/thinkpad_acpi/sections/__bug_table', 0o664, b'0xffffffffa01e60e0\n')
+f('sys/module/thinkpad_acpi/sections/.note.gnu.build-id', 0o664, b'0xffffffffa01e3a80\n')
+f('sys/module/thinkpad_acpi/sections/.strtab', 0o664, b'0xffffffffa01e98b8\n')
+f('sys/module/thinkpad_acpi/sections/.rodata', 0o664, b'0xffffffffa01e3ac0\n')
+f('sys/module/thinkpad_acpi/sections/__param', 0o664, b'0xffffffffa01e61a0\n')
+f('sys/module/thinkpad_acpi/sections/.bss', 0o664, b'0xffffffffa01ed600\n')
+f('sys/module/thinkpad_acpi/sections/.text', 0o664, b'0xffffffffa01dd000\n')
+f('sys/module/thinkpad_acpi/sections/.init.text', 0o664, b'0xffffffffa01ef000\n')
+f('sys/module/thinkpad_acpi/sections/.data', 0o664, b'0xffffffffa01ebd60\n')
+f('sys/module/thinkpad_acpi/sections/.init.data', 0o664, b'0xffffffffa01f1700\n')
+f('sys/module/thinkpad_acpi/sections/.symtab', 0o664, b'0xffffffffa01e6498\n')
+f('sys/module/thinkpad_acpi/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa01ed240\n')
+f('sys/module/thinkpad_acpi/sections/.rodata.str1.1', 0o664, b'0xffffffffa01e3df0\n')
+d('sys/module/thinkpad_acpi/notes', 0o775)
+f('sys/module/thinkpad_acpi/notes/.note.gnu.build-id', 0o664, b"\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00]\xca\x1f\xba\xb1J'\xa8\x14\x83cj=h\x11\xe60;\x08\xd6")
+d('sys/module/psmouse', 0o775)
+d('sys/module/psmouse/drivers', 0o775)
+l('sys/module/psmouse/drivers/serio:psmouse', '../../../bus/serio/drivers/psmouse')
+d('sys/module/psmouse/parameters', 0o775)
+f('sys/module/psmouse/parameters/proto', 0o664, b'''auto
+
+''')
+f('sys/module/psmouse/parameters/resync_time', 0o664, b'0\n')
+f('sys/module/psmouse/parameters/resolution', 0o664, b'200\n')
+f('sys/module/psmouse/parameters/resetafter', 0o664, b'5\n')
+f('sys/module/psmouse/parameters/rate', 0o664, b'100\n')
+f('sys/module/psmouse/parameters/smartscroll', 0o664, b'Y\n')
+d('sys/module/md_mod', 0o775)
+f('sys/module/md_mod/initstate', 0o664, b'live\n')
+f('sys/module/md_mod/srcversion', 0o664, b'1DB954BE8FA97D4755DC15B\n')
+f('sys/module/md_mod/refcnt', 0o664, b'1\n')
+d('sys/module/md_mod/holders', 0o775)
+l('sys/module/md_mod/holders/raid1', '../../raid1')
+d('sys/module/md_mod/parameters', 0o775)
+f('sys/module/md_mod/parameters/start_ro', 0o664, b'0\n')
+f('sys/module/md_mod/parameters/start_dirty_degraded', 0o664, b'0\n')
+d('sys/module/md_mod/sections', 0o775)
+f('sys/module/md_mod/sections/__ksymtab_gpl', 0o664, b'0xffffffffa022a790\n')
+f('sys/module/md_mod/sections/.smp_locks', 0o664, b'0xffffffffa022a038\n')
+f('sys/module/md_mod/sections/__bug_table', 0o664, b'0xffffffffa022a4b8\n')
+f('sys/module/md_mod/sections/__ksymtab_strings', 0o664, b'0xffffffffa022a7f0\n')
+f('sys/module/md_mod/sections/.exit.text', 0o664, b'0xffffffffa02283a0\n')
+f('sys/module/md_mod/sections/.note.gnu.build-id', 0o664, b'0xffffffffa02284c8\n')
+f('sys/module/md_mod/sections/.strtab', 0o664, b'0xffffffffa022d7a0\n')
+f('sys/module/md_mod/sections/__ksymtab', 0o664, b'0xffffffffa022a590\n')
+f('sys/module/md_mod/sections/.rodata', 0o664, b'0xffffffffa0228500\n')
+f('sys/module/md_mod/sections/__param', 0o664, b'0xffffffffa022a740\n')
+f('sys/module/md_mod/sections/.bss', 0o664, b'0xffffffffa0230880\n')
+f('sys/module/md_mod/sections/.text', 0o664, b'0xffffffffa021a000\n')
+f('sys/module/md_mod/sections/.init.text', 0o664, b'0xffffffffa0070000\n')
+f('sys/module/md_mod/sections/__kcrctab', 0o664, b'0xffffffffa022a6b0\n')
+f('sys/module/md_mod/sections/.data', 0o664, b'0xffffffffa022f660\n')
+f('sys/module/md_mod/sections/.symtab', 0o664, b'0xffffffffa022a968\n')
+f('sys/module/md_mod/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa02304c0\n')
+f('sys/module/md_mod/sections/.rodata.str1.1', 0o664, b'0xffffffffa022869e\n')
+f('sys/module/md_mod/sections/__kcrctab_gpl', 0o664, b'0xffffffffa022a7d0\n')
+d('sys/module/md_mod/notes', 0o775)
+f('sys/module/md_mod/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xbd\xb6!\x84\x88Z\x8bnL\x0f\xf0\xbe\xf0]\n"\xd8\xf3\xb0*')
+d('sys/module/snd_pcm', 0o775)
+f('sys/module/snd_pcm/initstate', 0o664, b'live\n')
+f('sys/module/snd_pcm/srcversion', 0o664, b'96530AD1426FF7F73757C4F\n')
+f('sys/module/snd_pcm/refcnt', 0o664, b'2\n')
+d('sys/module/snd_pcm/holders', 0o775)
+l('sys/module/snd_pcm/holders/snd_hda_intel', '../../snd_hda_intel')
+l('sys/module/snd_pcm/holders/snd_pcm_oss', '../../snd_pcm_oss')
+d('sys/module/snd_pcm/parameters', 0o775)
+f('sys/module/snd_pcm/parameters/preallocate_dma', 0o664, b'1\n')
+f('sys/module/snd_pcm/parameters/maximum_substreams', 0o664, b'4\n')
+d('sys/module/snd_pcm/sections', 0o775)
+f('sys/module/snd_pcm/sections/.smp_locks', 0o664, b'0xffffffffa0141af8\n')
+f('sys/module/snd_pcm/sections/__ex_table', 0o664, b'0xffffffffa0141b30\n')
+f('sys/module/snd_pcm/sections/__ksymtab_strings', 0o664, b'0xffffffffa01415f0\n')
+f('sys/module/snd_pcm/sections/.exit.text', 0o664, b'0xffffffffa01401d4\n')
+f('sys/module/snd_pcm/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0140260\n')
+f('sys/module/snd_pcm/sections/.strtab', 0o664, b'0xffffffffa0145428\n')
+f('sys/module/snd_pcm/sections/.fixup', 0o664, b'0xffffffffa01401fe\n')
+f('sys/module/snd_pcm/sections/__ksymtab', 0o664, b'0xffffffffa01410b0\n')
+f('sys/module/snd_pcm/sections/.rodata', 0o664, b'0xffffffffa01402a0\n')
+f('sys/module/snd_pcm/sections/__param', 0o664, b'0xffffffffa0141bb0\n')
+f('sys/module/snd_pcm/sections/.bss', 0o664, b'0xffffffffa0149640\n')
+f('sys/module/snd_pcm/sections/.text', 0o664, b'0xffffffffa0134000\n')
+f('sys/module/snd_pcm/sections/.init.text', 0o664, b'0xffffffffa007d000\n')
+f('sys/module/snd_pcm/sections/__kcrctab', 0o664, b'0xffffffffa0141430\n')
+f('sys/module/snd_pcm/sections/.data', 0o664, b'0xffffffffa0148b60\n')
+f('sys/module/snd_pcm/sections/.symtab', 0o664, b'0xffffffffa0141c00\n')
+f('sys/module/snd_pcm/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0149280\n')
+f('sys/module/snd_pcm/sections/.rodata.str1.1', 0o664, b'0xffffffffa0140930\n')
+d('sys/module/snd_pcm/notes', 0o775)
+f('sys/module/snd_pcm/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xc8N\x86\x9c\x8dq\x14\x04\xe7\xed\xee\x9b\xe0\x8f\xe4\x8fvF{\xfe')
+d('sys/module/snd_hda_intel', 0o775)
+f('sys/module/snd_hda_intel/initstate', 0o664, b'live\n')
+f('sys/module/snd_hda_intel/srcversion', 0o664, b'B76633A09F11336101E5480\n')
+f('sys/module/snd_hda_intel/refcnt', 0o664, b'3\n')
+d('sys/module/snd_hda_intel/drivers', 0o775)
+l('sys/module/snd_hda_intel/drivers/pci:HDA Intel', '../../../bus/pci/drivers/HDA Intel')
+d('sys/module/snd_hda_intel/parameters', 0o775)
+f('sys/module/snd_hda_intel/parameters/bdl_pos_adj', 0o664, b'1,-1,-1,-1,-1,-1,-1,-1\n')
+f('sys/module/snd_hda_intel/parameters/enable', 0o664, b'Y,Y,Y,Y,Y,Y,Y,Y\n')
+f('sys/module/snd_hda_intel/parameters/id', 0o664, b'<NULL>,<NULL>,<NULL>,<NULL>,<NULL>,<NULL>,<NULL>,<NULL>\n')
+f('sys/module/snd_hda_intel/parameters/probe_mask', 0o664, b'1,-1,-1,-1,-1,-1,-1,-1\n')
+f('sys/module/snd_hda_intel/parameters/enable_msi', 0o664, b'0\n')
+f('sys/module/snd_hda_intel/parameters/index', 0o664, b'-1,-1,-1,-1,-1,-1,-1,-1\n')
+f('sys/module/snd_hda_intel/parameters/single_cmd', 0o664, b'N\n')
+f('sys/module/snd_hda_intel/parameters/model', 0o664, b'<NULL>,<NULL>,<NULL>,<NULL>,<NULL>,<NULL>,<NULL>,<NULL>\n')
+f('sys/module/snd_hda_intel/parameters/position_fix', 0o664, b'0,0,0,0,0,0,0,0\n')
+d('sys/module/snd_hda_intel/sections', 0o775)
+f('sys/module/snd_hda_intel/sections/.devinit.data', 0o664, b'0xffffffffa01d7340\n')
+f('sys/module/snd_hda_intel/sections/.exit.text', 0o664, b'0xffffffffa0182a58\n')
+f('sys/module/snd_hda_intel/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0183f4c\n')
+f('sys/module/snd_hda_intel/sections/.strtab', 0o664, b'0xffffffffa0193910\n')
+f('sys/module/snd_hda_intel/sections/.devexit.text', 0o664, b'0xffffffffa0182a6a\n')
+f('sys/module/snd_hda_intel/sections/.rodata', 0o664, b'0xffffffffa0183f80\n')
+f('sys/module/snd_hda_intel/sections/__param', 0o664, b'0xffffffffa0189de8\n')
+f('sys/module/snd_hda_intel/sections/.bss', 0o664, b'0xffffffffa01d7800\n')
+f('sys/module/snd_hda_intel/sections/.text', 0o664, b'0xffffffffa0165000\n')
+f('sys/module/snd_hda_intel/sections/.init.text', 0o664, b'0xffffffffa0070000\n')
+f('sys/module/snd_hda_intel/sections/.data', 0o664, b'0xffffffffa019bd40\n')
+f('sys/module/snd_hda_intel/sections/.devinit.text', 0o664, b'0xffffffffa0182aa0\n')
+f('sys/module/snd_hda_intel/sections/.symtab', 0o664, b'0xffffffffa0189f50\n')
+f('sys/module/snd_hda_intel/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa01d7440\n')
+f('sys/module/snd_hda_intel/sections/.rodata.str1.1', 0o664, b'0xffffffffa0186d8b\n')
+d('sys/module/snd_hda_intel/notes', 0o775)
+f('sys/module/snd_hda_intel/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x002\xfe\x91\xd2K\x86\x1d\x92P\xdcX/c\x07=\xf3\xceY\xbc-')
+d('sys/module/ehci_hcd', 0o775)
+f('sys/module/ehci_hcd/initstate', 0o664, b'live\n')
+f('sys/module/ehci_hcd/srcversion', 0o664, b'6EBBF13EC8AD467D8AB11A4\n')
+f('sys/module/ehci_hcd/refcnt', 0o664, b'0\n')
+d('sys/module/ehci_hcd/drivers', 0o775)
+l('sys/module/ehci_hcd/drivers/pci:ehci_hcd', '../../../bus/pci/drivers/ehci_hcd')
+d('sys/module/ehci_hcd/parameters', 0o775)
+f('sys/module/ehci_hcd/parameters/park', 0o664, b'0\n')
+f('sys/module/ehci_hcd/parameters/ignore_oc', 0o664, b'N\n')
+f('sys/module/ehci_hcd/parameters/log2_irq_thresh', 0o664, b'0\n')
+d('sys/module/ehci_hcd/sections', 0o775)
+f('sys/module/ehci_hcd/sections/.smp_locks', 0o664, b'0xffffffffa00e4048\n')
+f('sys/module/ehci_hcd/sections/__bug_table', 0o664, b'0xffffffffa00e3f22\n')
+f('sys/module/ehci_hcd/sections/.exit.text', 0o664, b'0xffffffffa00e3b98\n')
+f('sys/module/ehci_hcd/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00e3bac\n')
+f('sys/module/ehci_hcd/sections/.strtab', 0o664, b'0xffffffffa00e54a8\n')
+f('sys/module/ehci_hcd/sections/.rodata', 0o664, b'0xffffffffa00e3be0\n')
+f('sys/module/ehci_hcd/sections/__param', 0o664, b'0xffffffffa00e42f0\n')
+f('sys/module/ehci_hcd/sections/.bss', 0o664, b'0xffffffffa00e6480\n')
+f('sys/module/ehci_hcd/sections/.text', 0o664, b'0xffffffffa00dd000\n')
+f('sys/module/ehci_hcd/sections/.init.text', 0o664, b'0xffffffffa006b000\n')
+f('sys/module/ehci_hcd/sections/.data', 0o664, b'0xffffffffa00e5f40\n')
+f('sys/module/ehci_hcd/sections/.symtab', 0o664, b'0xffffffffa00e4368\n')
+f('sys/module/ehci_hcd/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa00e60c0\n')
+f('sys/module/ehci_hcd/sections/.rodata.str1.1', 0o664, b'0xffffffffa00e3dd0\n')
+d('sys/module/ehci_hcd/notes', 0o775)
+f('sys/module/ehci_hcd/notes/.note.gnu.build-id', 0o664, b"\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00 \xc7\x01\xa9Mi;\xcaNB'\x08T\xc4\xf9\x80\xd7\x10\xb3h")
+d('sys/module/sg', 0o775)
+f('sys/module/sg/version', 0o664, b'3.5.34\n')
+f('sys/module/sg/initstate', 0o664, b'live\n')
+f('sys/module/sg/srcversion', 0o664, b'DC7DE342543B6D7AB46D718\n')
+f('sys/module/sg/refcnt', 0o664, b'0\n')
+d('sys/module/sg/parameters', 0o775)
+f('sys/module/sg/parameters/allow_dio', 0o664, b'0\n')
+f('sys/module/sg/parameters/scatter_elem_sz', 0o664, b'32768\n')
+f('sys/module/sg/parameters/def_reserved_size', 0o664, b'32768\n')
+d('sys/module/sg/sections', 0o775)
+f('sys/module/sg/sections/.smp_locks', 0o664, b'0xffffffffa00054d8\n')
+f('sys/module/sg/sections/__ex_table', 0o664, b'0xffffffffa0005530\n')
+f('sys/module/sg/sections/__bug_table', 0o664, b'0xffffffffa00054e8\n')
+f('sys/module/sg/sections/.exit.text', 0o664, b'0xffffffffa00049f0\n')
+f('sys/module/sg/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0004afc\n')
+f('sys/module/sg/sections/.strtab', 0o664, b'0xffffffffa0006710\n')
+f('sys/module/sg/sections/.fixup', 0o664, b'0xffffffffa0004a33\n')
+f('sys/module/sg/sections/.rodata', 0o664, b'0xffffffffa0004b20\n')
+f('sys/module/sg/sections/__param', 0o664, b'0xffffffffa0005630\n')
+f('sys/module/sg/sections/.bss', 0o664, b'0xffffffffa0007640\n')
+f('sys/module/sg/sections/.text', 0o664, b'0xffffffffa0000000\n')
+f('sys/module/sg/sections/.init.text', 0o664, b'0xffffffffa0009000\n')
+f('sys/module/sg/sections/.data', 0o664, b'0xffffffffa0007040\n')
+f('sys/module/sg/sections/.symtab', 0o664, b'0xffffffffa00056a8\n')
+f('sys/module/sg/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0007280\n')
+f('sys/module/sg/sections/.rodata.str1.1', 0o664, b'0xffffffffa0004bc0\n')
+d('sys/module/sg/notes', 0o775)
+f('sys/module/sg/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00q\x06\xb5<\xb3\x13\xd4\xe6\xc5W\xbb;{\x14\x93\xd5\x07\xc7\x13\xfa')
+d('sys/module/snd_mixer_oss', 0o775)
+f('sys/module/snd_mixer_oss/initstate', 0o664, b'live\n')
+f('sys/module/snd_mixer_oss/srcversion', 0o664, b'9D2BFE821DD0ACFA2CFF364\n')
+f('sys/module/snd_mixer_oss/refcnt', 0o664, b'1\n')
+d('sys/module/snd_mixer_oss/holders', 0o775)
+l('sys/module/snd_mixer_oss/holders/snd_pcm_oss', '../../snd_pcm_oss')
+d('sys/module/snd_mixer_oss/sections', 0o775)
+f('sys/module/snd_mixer_oss/sections/__ksymtab_strings', 0o664, b'0xffffffffa02bba78\n')
+f('sys/module/snd_mixer_oss/sections/.exit.text', 0o664, b'0xffffffffa02bb508\n')
+f('sys/module/snd_mixer_oss/sections/.note.gnu.build-id', 0o664, b'0xffffffffa02bb54c\n')
+f('sys/module/snd_mixer_oss/sections/.strtab', 0o664, b'0xffffffffa02bc470\n')
+f('sys/module/snd_mixer_oss/sections/__ksymtab', 0o664, b'0xffffffffa02bba60\n')
+f('sys/module/snd_mixer_oss/sections/.rodata', 0o664, b'0xffffffffa02bb580\n')
+f('sys/module/snd_mixer_oss/sections/.bss', 0o664, b'0xffffffffa02bd240\n')
+f('sys/module/snd_mixer_oss/sections/.text', 0o664, b'0xffffffffa02b9000\n')
+f('sys/module/snd_mixer_oss/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/snd_mixer_oss/sections/__kcrctab', 0o664, b'0xffffffffa02bba70\n')
+f('sys/module/snd_mixer_oss/sections/.data', 0o664, b'0xffffffffa02bcb20\n')
+f('sys/module/snd_mixer_oss/sections/.symtab', 0o664, b'0xffffffffa02bba98\n')
+f('sys/module/snd_mixer_oss/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa02bce80\n')
+f('sys/module/snd_mixer_oss/sections/.rodata.str1.1', 0o664, b'0xffffffffa02bb760\n')
+d('sys/module/snd_mixer_oss/notes', 0o775)
+f('sys/module/snd_mixer_oss/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xc3u\x0b\x0eh,\x90W\xba\xf3S\xa9\x16\\<\x97u\x0f.\xa6')
+d('sys/module/pcmcia', 0o775)
+f('sys/module/pcmcia/initstate', 0o664, b'live\n')
+f('sys/module/pcmcia/srcversion', 0o664, b'6544CB07B8D7D79F19A4CD6\n')
+f('sys/module/pcmcia/refcnt', 0o664, b'0\n')
+d('sys/module/pcmcia/parameters', 0o775)
+f('sys/module/pcmcia/parameters/io_speed', 0o664, b'0\n')
+d('sys/module/pcmcia/sections', 0o775)
+f('sys/module/pcmcia/sections/__ksymtab_strings', 0o664, b'0xffffffffa01f9890\n')
+f('sys/module/pcmcia/sections/.exit.text', 0o664, b'0xffffffffa01f85c4\n')
+f('sys/module/pcmcia/sections/.note.gnu.build-id', 0o664, b'0xffffffffa01f86c8\n')
+f('sys/module/pcmcia/sections/.strtab', 0o664, b'0xffffffffa01fb138\n')
+f('sys/module/pcmcia/sections/__ksymtab', 0o664, b'0xffffffffa01f9710\n')
+f('sys/module/pcmcia/sections/.rodata', 0o664, b'0xffffffffa01f8700\n')
+f('sys/module/pcmcia/sections/__param', 0o664, b'0xffffffffa01f9a00\n')
+f('sys/module/pcmcia/sections/.bss', 0o664, b'0xffffffffa01fcb40\n')
+f('sys/module/pcmcia/sections/.text', 0o664, b'0xffffffffa01f5000\n')
+f('sys/module/pcmcia/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/pcmcia/sections/__kcrctab', 0o664, b'0xffffffffa01f9810\n')
+f('sys/module/pcmcia/sections/.ref.data', 0o664, b'0xffffffffa01fc720\n')
+f('sys/module/pcmcia/sections/.data', 0o664, b'0xffffffffa01fc3a0\n')
+f('sys/module/pcmcia/sections/.devinit.text', 0o664, b'0xffffffffa01f85e2\n')
+f('sys/module/pcmcia/sections/.symtab', 0o664, b'0xffffffffa01f9a28\n')
+f('sys/module/pcmcia/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa01fc780\n')
+f('sys/module/pcmcia/sections/.rodata.str1.1', 0o664, b'0xffffffffa01f913d\n')
+d('sys/module/pcmcia/notes', 0o775)
+f('sys/module/pcmcia/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00v\xd6BR5q\xd2\xd4\x05y\xe0\x84j\x17\xab\xb2\xe6o\xd43')
+d('sys/module/nvram', 0o775)
+f('sys/module/nvram/initstate', 0o664, b'live\n')
+f('sys/module/nvram/srcversion', 0o664, b'ECD12B2949BC771BDCE8146\n')
+f('sys/module/nvram/refcnt', 0o664, b'1\n')
+d('sys/module/nvram/holders', 0o775)
+l('sys/module/nvram/holders/thinkpad_acpi', '../../thinkpad_acpi')
+d('sys/module/nvram/sections', 0o775)
+f('sys/module/nvram/sections/__ksymtab_strings', 0o664, b'0xffffffffa00ad2c0\n')
+f('sys/module/nvram/sections/.exit.text', 0o664, b'0xffffffffa00ace3c\n')
+f('sys/module/nvram/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00ace5c\n')
+f('sys/module/nvram/sections/.strtab', 0o664, b'0xffffffffa00adc38\n')
+f('sys/module/nvram/sections/__ksymtab', 0o664, b'0xffffffffa00ad230\n')
+f('sys/module/nvram/sections/.rodata', 0o664, b'0xffffffffa00ace80\n')
+f('sys/module/nvram/sections/.bss', 0o664, b'0xffffffffa00ae640\n')
+f('sys/module/nvram/sections/.text', 0o664, b'0xffffffffa00ac000\n')
+f('sys/module/nvram/sections/.init.text', 0o664, b'0xffffffffa00b0000\n')
+f('sys/module/nvram/sections/__kcrctab', 0o664, b'0xffffffffa00ad290\n')
+f('sys/module/nvram/sections/.data', 0o664, b'0xffffffffa00ae200\n')
+f('sys/module/nvram/sections/.symtab', 0o664, b'0xffffffffa00ad338\n')
+f('sys/module/nvram/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa00ae280\n')
+f('sys/module/nvram/sections/.rodata.str1.1', 0o664, b'0xffffffffa00acfb8\n')
+d('sys/module/nvram/notes', 0o775)
+f('sys/module/nvram/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\x00j\xf9\trf\x94M\xafD\\s\xced\xcc\x97c\xd5L\n')
+d('sys/module/scsi_mod', 0o775)
+d('sys/module/scsi_mod/parameters', 0o775)
+f('sys/module/scsi_mod/parameters/scan', 0o664, b'sync\n')
+f('sys/module/scsi_mod/parameters/default_dev_flags', 0o664, b'0\n')
+f('sys/module/scsi_mod/parameters/scsi_logging_level', 0o664, b'0\n')
+f('sys/module/scsi_mod/parameters/inq_timeout', 0o664, b'5\n')
+f('sys/module/scsi_mod/parameters/max_luns', 0o664, b'512\n')
+f('sys/module/scsi_mod/parameters/max_report_luns', 0o664, b'511\n')
+d('sys/module/pcmcia_core', 0o775)
+f('sys/module/pcmcia_core/initstate', 0o664, b'live\n')
+f('sys/module/pcmcia_core/srcversion', 0o664, b'7C1220572DE8897E4D560EB\n')
+f('sys/module/pcmcia_core/refcnt', 0o664, b'3\n')
+d('sys/module/pcmcia_core/holders', 0o775)
+l('sys/module/pcmcia_core/holders/yenta_socket', '../../yenta_socket')
+l('sys/module/pcmcia_core/holders/rsrc_nonstatic', '../../rsrc_nonstatic')
+l('sys/module/pcmcia_core/holders/pcmcia', '../../pcmcia')
+d('sys/module/pcmcia_core/parameters', 0o775)
+f('sys/module/pcmcia_core/parameters/setup_delay', 0o664, b'10\n')
+f('sys/module/pcmcia_core/parameters/cis_speed', 0o664, b'300\n')
+f('sys/module/pcmcia_core/parameters/unreset_delay', 0o664, b'10\n')
+f('sys/module/pcmcia_core/parameters/shutdown_delay', 0o664, b'3\n')
+f('sys/module/pcmcia_core/parameters/cis_width', 0o664, b'0\n')
+f('sys/module/pcmcia_core/parameters/unreset_limit', 0o664, b'30\n')
+f('sys/module/pcmcia_core/parameters/reset_time', 0o664, b'10\n')
+f('sys/module/pcmcia_core/parameters/resume_delay', 0o664, b'20\n')
+f('sys/module/pcmcia_core/parameters/unreset_check', 0o664, b'10\n')
+f('sys/module/pcmcia_core/parameters/vcc_settle', 0o664, b'40\n')
+d('sys/module/pcmcia_core/sections', 0o775)
+f('sys/module/pcmcia_core/sections/__ksymtab_strings', 0o664, b'0xffffffffa0094310\n')
+f('sys/module/pcmcia_core/sections/.exit.text', 0o664, b'0xffffffffa0093558\n')
+f('sys/module/pcmcia_core/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0093668\n')
+f('sys/module/pcmcia_core/sections/.strtab', 0o664, b'0xffffffffa0096898\n')
+f('sys/module/pcmcia_core/sections/__ksymtab', 0o664, b'0xffffffffa0093e50\n')
+f('sys/module/pcmcia_core/sections/.rodata', 0o664, b'0xffffffffa00936a0\n')
+f('sys/module/pcmcia_core/sections/__param', 0o664, b'0xffffffffa0094180\n')
+f('sys/module/pcmcia_core/sections/.bss', 0o664, b'0xffffffffa0098f40\n')
+f('sys/module/pcmcia_core/sections/.text', 0o664, b'0xffffffffa008f000\n')
+f('sys/module/pcmcia_core/sections/.init.text', 0o664, b'0xffffffffa009a000\n')
+f('sys/module/pcmcia_core/sections/__kcrctab', 0o664, b'0xffffffffa0094070\n')
+f('sys/module/pcmcia_core/sections/.data', 0o664, b'0xffffffffa0098700\n')
+f('sys/module/pcmcia_core/sections/.symtab', 0o664, b'0xffffffffa00945d0\n')
+f('sys/module/pcmcia_core/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0098b80\n')
+f('sys/module/pcmcia_core/sections/.rodata.str1.1', 0o664, b'0xffffffffa0093a88\n')
+f('sys/module/pcmcia_core/sections/.ref.text', 0o664, b'0xffffffffa0093580\n')
+d('sys/module/pcmcia_core/notes', 0o775)
+f('sys/module/pcmcia_core/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00M\xe5~\xb9\x10\x7f(\xb8\x18\xe2ma\xb4\xdc\x9a\x8er\xb2t\xbc')
+d('sys/module/rtc_core', 0o775)
+f('sys/module/rtc_core/initstate', 0o664, b'live\n')
+f('sys/module/rtc_core/srcversion', 0o664, b'8684A14821938B7D8E50DB5\n')
+f('sys/module/rtc_core/refcnt', 0o664, b'1\n')
+d('sys/module/rtc_core/holders', 0o775)
+l('sys/module/rtc_core/holders/rtc_cmos', '../../rtc_cmos')
+d('sys/module/rtc_core/sections', 0o775)
+f('sys/module/rtc_core/sections/__ksymtab_gpl', 0o664, b'0xffffffffa00ea380\n')
+f('sys/module/rtc_core/sections/.smp_locks', 0o664, b'0xffffffffa00ea5b8\n')
+f('sys/module/rtc_core/sections/__ksymtab_strings', 0o664, b'0xffffffffa00ea4d0\n')
+f('sys/module/rtc_core/sections/.exit.text', 0o664, b'0xffffffffa00e9e60\n')
+f('sys/module/rtc_core/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00e9ea4\n')
+f('sys/module/rtc_core/sections/.strtab', 0o664, b'0xffffffffa00eb9c0\n')
+f('sys/module/rtc_core/sections/.rodata', 0o664, b'0xffffffffa00e9ee0\n')
+f('sys/module/rtc_core/sections/.bss', 0o664, b'0xffffffffa00ecd80\n')
+f('sys/module/rtc_core/sections/.text', 0o664, b'0xffffffffa00e8000\n')
+f('sys/module/rtc_core/sections/.init.text', 0o664, b'0xffffffffa007d000\n')
+f('sys/module/rtc_core/sections/.data', 0o664, b'0xffffffffa00ec760\n')
+f('sys/module/rtc_core/sections/.symtab', 0o664, b'0xffffffffa00ea5e0\n')
+f('sys/module/rtc_core/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa00ec9c0\n')
+f('sys/module/rtc_core/sections/.rodata.str1.1', 0o664, b'0xffffffffa00ea098\n')
+f('sys/module/rtc_core/sections/__kcrctab_gpl', 0o664, b'0xffffffffa00ea460\n')
+d('sys/module/rtc_core/notes', 0o775)
+f('sys/module/rtc_core/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xfbj\x90X\x98\xf7\x0e\x95\x19\xc6\xa1\xa1\xcd\xe0\x835$\x0e\x96\x17')
+d('sys/module/led_class', 0o775)
+f('sys/module/led_class/initstate', 0o664, b'live\n')
+f('sys/module/led_class/srcversion', 0o664, b'B916A50F53ABBBB19DFF203\n')
+f('sys/module/led_class/refcnt', 0o664, b'2\n')
+d('sys/module/led_class/holders', 0o775)
+l('sys/module/led_class/holders/iwl3945', '../../iwl3945')
+l('sys/module/led_class/holders/thinkpad_acpi', '../../thinkpad_acpi')
+d('sys/module/led_class/sections', 0o775)
+f('sys/module/led_class/sections/__ksymtab_gpl', 0o664, b'0xffffffffa00f23c0\n')
+f('sys/module/led_class/sections/__ksymtab_strings', 0o664, b'0xffffffffa00f2420\n')
+f('sys/module/led_class/sections/.exit.text', 0o664, b'0xffffffffa00f2330\n')
+f('sys/module/led_class/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00f2344\n')
+f('sys/module/led_class/sections/.strtab', 0o664, b'0xffffffffa00f2bf8\n')
+f('sys/module/led_class/sections/.bss', 0o664, b'0xffffffffa00f3500\n')
+f('sys/module/led_class/sections/.text', 0o664, b'0xffffffffa00f2000\n')
+f('sys/module/led_class/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/led_class/sections/.data', 0o664, b'0xffffffffa00f30c0\n')
+f('sys/module/led_class/sections/.symtab', 0o664, b'0xffffffffa00f2478\n')
+f('sys/module/led_class/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa00f3140\n')
+f('sys/module/led_class/sections/.rodata.str1.1', 0o664, b'0xffffffffa00f2368\n')
+f('sys/module/led_class/sections/__kcrctab_gpl', 0o664, b'0xffffffffa00f2400\n')
+d('sys/module/led_class/notes', 0o775)
+f('sys/module/led_class/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00Iq;\xaf\xad\xf1\xe5\xcf8\xa5\x86u\xa9tMV\x02*\xfd\r')
+d('sys/module/libata', 0o775)
+d('sys/module/libata/parameters', 0o775)
+f('sys/module/libata/parameters/acpi_gtf_filter', 0o664, b'7\n')
+f('sys/module/libata/parameters/noacpi', 0o664, b'0\n')
+f('sys/module/libata/parameters/atapi_passthru16', 0o664, b'1\n')
+f('sys/module/libata/parameters/ata_probe_timeout', 0o664, b'0\n')
+f('sys/module/libata/parameters/dma', 0o664, b'7\n')
+f('sys/module/libata/parameters/atapi_dmadir', 0o664, b'0\n')
+f('sys/module/libata/parameters/fua', 0o664, b'0\n')
+f('sys/module/libata/parameters/ignore_hpa', 0o664, b'0\n')
+f('sys/module/libata/parameters/atapi_enabled', 0o664, b'1\n')
+f('sys/module/libata/parameters/allow_tpm', 0o664, b'0\n')
+d('sys/module/thermal', 0o775)
+f('sys/module/thermal/initstate', 0o664, b'live\n')
+f('sys/module/thermal/srcversion', 0o664, b'1787CE9FEB053C917D031A9\n')
+f('sys/module/thermal/refcnt', 0o664, b'0\n')
+d('sys/module/thermal/parameters', 0o775)
+f('sys/module/thermal/parameters/act', 0o664, b'0\n')
+f('sys/module/thermal/parameters/tzp', 0o664, b'0\n')
+f('sys/module/thermal/parameters/crt', 0o664, b'0\n')
+f('sys/module/thermal/parameters/psv', 0o664, b'0\n')
+d('sys/module/thermal/sections', 0o775)
+f('sys/module/thermal/sections/.exit.text', 0o664, b'0xffffffffa00a1f14\n')
+f('sys/module/thermal/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00a1f3c\n')
+f('sys/module/thermal/sections/.strtab', 0o664, b'0xffffffffa00a3b28\n')
+f('sys/module/thermal/sections/.rodata', 0o664, b'0xffffffffa00a1f60\n')
+f('sys/module/thermal/sections/__param', 0o664, b'0xffffffffa00a29d0\n')
+f('sys/module/thermal/sections/.bss', 0o664, b'0xffffffffa00a4bc0\n')
+f('sys/module/thermal/sections/.text', 0o664, b'0xffffffffa00a0000\n')
+f('sys/module/thermal/sections/.init.text', 0o664, b'0xffffffffa0070000\n')
+f('sys/module/thermal/sections/.data', 0o664, b'0xffffffffa00a4640\n')
+f('sys/module/thermal/sections/.init.data', 0o664, b'0xffffffffa0070090\n')
+f('sys/module/thermal/sections/.symtab', 0o664, b'0xffffffffa00a2ac0\n')
+f('sys/module/thermal/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa00a4800\n')
+f('sys/module/thermal/sections/.rodata.str1.1', 0o664, b'0xffffffffa00a242a\n')
+d('sys/module/thermal/notes', 0o775)
+f('sys/module/thermal/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\x97\xa9\xec\xf2\x01\x86!\x94\x89\xa4n%q\t\xb7\xb4\x97a\x1a\x85')
+d('sys/module/keyboard', 0o775)
+d('sys/module/keyboard/parameters', 0o775)
+f('sys/module/keyboard/parameters/brl_nbchords', 0o664, b'1\n')
+f('sys/module/keyboard/parameters/brl_timeout', 0o664, b'300\n')
+d('sys/module/ahci', 0o775)
+d('sys/module/ahci/drivers', 0o775)
+l('sys/module/ahci/drivers/pci:ahci', '../../../bus/pci/drivers/ahci')
+d('sys/module/ahci/parameters', 0o775)
+f('sys/module/ahci/parameters/marvell_enable', 0o664, b'1\n')
+f('sys/module/ahci/parameters/ahci_em_messages', 0o664, b'1\n')
+f('sys/module/ahci/parameters/skip_host_reset', 0o664, b'0\n')
+d('sys/module/snd_pcm_oss', 0o775)
+f('sys/module/snd_pcm_oss/initstate', 0o664, b'live\n')
+f('sys/module/snd_pcm_oss/srcversion', 0o664, b'E3D05A52B04130012283029\n')
+f('sys/module/snd_pcm_oss/refcnt', 0o664, b'0\n')
+d('sys/module/snd_pcm_oss/parameters', 0o775)
+f('sys/module/snd_pcm_oss/parameters/dsp_map', 0o664, b'0,0,0,0,0,0,0,0\n')
+f('sys/module/snd_pcm_oss/parameters/nonblock_open', 0o664, b'Y\n')
+f('sys/module/snd_pcm_oss/parameters/adsp_map', 0o664, b'1,1,1,1,1,1,1,1\n')
+d('sys/module/snd_pcm_oss/sections', 0o775)
+f('sys/module/snd_pcm_oss/sections/.exit.text', 0o664, b'0xffffffffa02c6e7c\n')
+f('sys/module/snd_pcm_oss/sections/.note.gnu.build-id', 0o664, b'0xffffffffa02c6e94\n')
+f('sys/module/snd_pcm_oss/sections/.strtab', 0o664, b'0xffffffffa02c8818\n')
+f('sys/module/snd_pcm_oss/sections/.rodata', 0o664, b'0xffffffffa02c6ec0\n')
+f('sys/module/snd_pcm_oss/sections/__param', 0o664, b'0xffffffffa02c7378\n')
+f('sys/module/snd_pcm_oss/sections/.bss', 0o664, b'0xffffffffa02c9b00\n')
+f('sys/module/snd_pcm_oss/sections/.text', 0o664, b'0xffffffffa02bf000\n')
+f('sys/module/snd_pcm_oss/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/snd_pcm_oss/sections/.data', 0o664, b'0xffffffffa02c96c0\n')
+f('sys/module/snd_pcm_oss/sections/.symtab', 0o664, b'0xffffffffa02c73f0\n')
+f('sys/module/snd_pcm_oss/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa02c9740\n')
+f('sys/module/snd_pcm_oss/sections/.rodata.str1.1', 0o664, b'0xffffffffa02c71a8\n')
+d('sys/module/snd_pcm_oss/notes', 0o775)
+f('sys/module/snd_pcm_oss/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xd7y|\xbf\xa5\x8aZm\x86\x85CF\x11s\xd3\xf5f\xbd7\xc6')
+d('sys/module/ac', 0o775)
+f('sys/module/ac/initstate', 0o664, b'live\n')
+f('sys/module/ac/srcversion', 0o664, b'6E9CD20EE5BE8425A61B938\n')
+f('sys/module/ac/refcnt', 0o664, b'0\n')
+d('sys/module/ac/sections', 0o775)
+f('sys/module/ac/sections/.exit.text', 0o664, b'0xffffffffa006d43c\n')
+f('sys/module/ac/sections/.note.gnu.build-id', 0o664, b'0xffffffffa006d45c\n')
+f('sys/module/ac/sections/.strtab', 0o664, b'0xffffffffa006dd28\n')
+f('sys/module/ac/sections/.rodata', 0o664, b'0xffffffffa006d480\n')
+f('sys/module/ac/sections/.bss', 0o664, b'0xffffffffa006e600\n')
+f('sys/module/ac/sections/.text', 0o664, b'0xffffffffa006d000\n')
+f('sys/module/ac/sections/.init.text', 0o664, b'0xffffffffa0070000\n')
+f('sys/module/ac/sections/.data', 0o664, b'0xffffffffa006e0d0\n')
+f('sys/module/ac/sections/.symtab', 0o664, b'0xffffffffa006d668\n')
+f('sys/module/ac/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa006e240\n')
+f('sys/module/ac/sections/.rodata.str1.1', 0o664, b'0xffffffffa006d5a0\n')
+d('sys/module/ac/notes', 0o775)
+f('sys/module/ac/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00^h\xf0\x19\xcc\x94"G\xf8\xbc\x1c\xf0\xa3\x8d?\xec\xa5\xc4\x95\x9f')
+d('sys/module/dock', 0o775)
+d('sys/module/dock/parameters', 0o775)
+f('sys/module/dock/parameters/immediate_undock', 0o664, b'Y\n')
+d('sys/module/pcie_aspm', 0o775)
+d('sys/module/pcie_aspm/parameters', 0o775)
+f('sys/module/pcie_aspm/parameters/policy', 0o664, b'[default] performance powersave \n')
+d('sys/module/lockdep', 0o775)
+d('sys/module/lockdep/parameters', 0o775)
+f('sys/module/lockdep/parameters/lock_stat', 0o664, b'1\n')
+d('sys/module/tcp_cubic', 0o775)
+d('sys/module/tcp_cubic/parameters', 0o775)
+f('sys/module/tcp_cubic/parameters/tcp_friendliness', 0o664, b'1\n')
+f('sys/module/tcp_cubic/parameters/beta', 0o664, b'717\n')
+f('sys/module/tcp_cubic/parameters/bic_scale', 0o664, b'41\n')
+f('sys/module/tcp_cubic/parameters/fast_convergence', 0o664, b'1\n')
+f('sys/module/tcp_cubic/parameters/initial_ssthresh', 0o664, b'0\n')
+d('sys/module/ecb', 0o775)
+f('sys/module/ecb/initstate', 0o664, b'live\n')
+f('sys/module/ecb/srcversion', 0o664, b'5BBA8E5CDEA4EA8BA5ED31D\n')
+f('sys/module/ecb/refcnt', 0o664, b'2\n')
+d('sys/module/ecb/sections', 0o775)
+f('sys/module/ecb/sections/.exit.text', 0o664, b'0xffffffffa0027300\n')
+f('sys/module/ecb/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0027314\n')
+f('sys/module/ecb/sections/.strtab', 0o664, b'0xffffffffa00277c0\n')
+f('sys/module/ecb/sections/.bss', 0o664, b'0xffffffffa0027e80\n')
+f('sys/module/ecb/sections/.text', 0o664, b'0xffffffffa0027000\n')
+f('sys/module/ecb/sections/.init.text', 0o664, b'0xffffffffa006b000\n')
+f('sys/module/ecb/sections/.data', 0o664, b'0xffffffffa0027a40\n')
+f('sys/module/ecb/sections/.symtab', 0o664, b'0xffffffffa0027340\n')
+f('sys/module/ecb/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0027ac0\n')
+f('sys/module/ecb/sections/.rodata.str1.1', 0o664, b'0xffffffffa0027338\n')
+d('sys/module/ecb/notes', 0o775)
+f('sys/module/ecb/notes/.note.gnu.build-id', 0o664, b"\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xc20'\x18T\x8bW#\xf5\xe5\xf8JvI\xcb\xc4\x91\x95\nJ")
+d('sys/module/snd_page_alloc', 0o775)
+f('sys/module/snd_page_alloc/initstate', 0o664, b'live\n')
+f('sys/module/snd_page_alloc/srcversion', 0o664, b'D9E59C27F28D5DA2B935016\n')
+f('sys/module/snd_page_alloc/refcnt', 0o664, b'2\n')
+d('sys/module/snd_page_alloc/holders', 0o775)
+l('sys/module/snd_page_alloc/holders/snd_pcm', '../../snd_pcm')
+l('sys/module/snd_page_alloc/holders/snd_hda_intel', '../../snd_hda_intel')
+d('sys/module/snd_page_alloc/sections', 0o775)
+f('sys/module/snd_page_alloc/sections/__ksymtab_strings', 0o664, b'0xffffffffa00350e8\n')
+f('sys/module/snd_page_alloc/sections/.exit.text', 0o664, b'0xffffffffa0034cc0\n')
+f('sys/module/snd_page_alloc/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0034cf8\n')
+f('sys/module/snd_page_alloc/sections/.strtab', 0o664, b'0xffffffffa0035be8\n')
+f('sys/module/snd_page_alloc/sections/__ksymtab', 0o664, b'0xffffffffa0035040\n')
+f('sys/module/snd_page_alloc/sections/.rodata', 0o664, b'0xffffffffa0034d20\n')
+f('sys/module/snd_page_alloc/sections/.bss', 0o664, b'0xffffffffa0036780\n')
+f('sys/module/snd_page_alloc/sections/.text', 0o664, b'0xffffffffa0034000\n')
+f('sys/module/snd_page_alloc/sections/.init.text', 0o664, b'0xffffffffa0038000\n')
+f('sys/module/snd_page_alloc/sections/__kcrctab', 0o664, b'0xffffffffa00350b0\n')
+f('sys/module/snd_page_alloc/sections/.data', 0o664, b'0xffffffffa0036300\n')
+f('sys/module/snd_page_alloc/sections/.symtab', 0o664, b'0xffffffffa0035180\n')
+f('sys/module/snd_page_alloc/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa00363c0\n')
+f('sys/module/snd_page_alloc/sections/.rodata.str1.1', 0o664, b'0xffffffffa0034fd5\n')
+d('sys/module/snd_page_alloc/notes', 0o775)
+f('sys/module/snd_page_alloc/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00s\xc1\x8a\x9a\xf7g\x83-x\xc0\xbe\x98\xb0[\x95"\xd7\x97Q=')
+d('sys/module/loop', 0o775)
+f('sys/module/loop/initstate', 0o664, b'live\n')
+f('sys/module/loop/srcversion', 0o664, b'7595F5D46DFDB4A2D489DDD\n')
+f('sys/module/loop/refcnt', 0o664, b'0\n')
+d('sys/module/loop/sections', 0o775)
+f('sys/module/loop/sections/__bug_table', 0o664, b'0xffffffffa023ca1f\n')
+f('sys/module/loop/sections/__ksymtab_strings', 0o664, b'0xffffffffa023caf0\n')
+f('sys/module/loop/sections/.exit.text', 0o664, b'0xffffffffa023c72c\n')
+f('sys/module/loop/sections/.note.gnu.build-id', 0o664, b'0xffffffffa023c7e4\n')
+f('sys/module/loop/sections/.strtab', 0o664, b'0xffffffffa023d960\n')
+f('sys/module/loop/sections/__ksymtab', 0o664, b'0xffffffffa023ca70\n')
+f('sys/module/loop/sections/.rodata', 0o664, b'0xffffffffa023c808\n')
+f('sys/module/loop/sections/__param', 0o664, b'0xffffffffa023caa0\n')
+f('sys/module/loop/sections/.bss', 0o664, b'0xffffffffa023e780\n')
+f('sys/module/loop/sections/.text', 0o664, b'0xffffffffa023a000\n')
+f('sys/module/loop/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/loop/sections/__kcrctab', 0o664, b'0xffffffffa023ca90\n')
+f('sys/module/loop/sections/.data', 0o664, b'0xffffffffa023e180\n')
+f('sys/module/loop/sections/.symtab', 0o664, b'0xffffffffa023cb20\n')
+f('sys/module/loop/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa023e3c0\n')
+f('sys/module/loop/sections/.rodata.str1.1', 0o664, b'0xffffffffa023c88a\n')
+d('sys/module/loop/notes', 0o775)
+f('sys/module/loop/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x007;\xf4\xa1\x0e\xe8\x13\xedX\xe6\xbc\xa4\xcd\xde_\x7fe\x84\x90\x85')
+d('sys/module/aes_generic', 0o775)
+f('sys/module/aes_generic/initstate', 0o664, b'live\n')
+f('sys/module/aes_generic/srcversion', 0o664, b'CE7DEF557FD2F72DE36DE4A\n')
+f('sys/module/aes_generic/refcnt', 0o664, b'1\n')
+d('sys/module/aes_generic/holders', 0o775)
+l('sys/module/aes_generic/holders/aes_x86_64', '../../aes_x86_64')
+d('sys/module/aes_generic/sections', 0o775)
+f('sys/module/aes_generic/sections/__ksymtab_gpl', 0o664, b'0xffffffffa02ccef0\n')
+f('sys/module/aes_generic/sections/__ksymtab_strings', 0o664, b'0xffffffffa02ccf80\n')
+f('sys/module/aes_generic/sections/.exit.text', 0o664, b'0xffffffffa02cceb8\n')
+f('sys/module/aes_generic/sections/.note.gnu.build-id', 0o664, b'0xffffffffa02ccecc\n')
+f('sys/module/aes_generic/sections/.strtab', 0o664, b'0xffffffffa02cd678\n')
+f('sys/module/aes_generic/sections/.bss', 0o664, b'0xffffffffa02cdf80\n')
+f('sys/module/aes_generic/sections/.text', 0o664, b'0xffffffffa02cb000\n')
+f('sys/module/aes_generic/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/aes_generic/sections/.data', 0o664, b'0xffffffffa02cda80\n')
+f('sys/module/aes_generic/sections/.init.data', 0o664, b'0xffffffffa0065300\n')
+f('sys/module/aes_generic/sections/.symtab', 0o664, b'0xffffffffa02ccfe8\n')
+f('sys/module/aes_generic/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa02cdbc0\n')
+f('sys/module/aes_generic/sections/__kcrctab_gpl', 0o664, b'0xffffffffa02ccf50\n')
+d('sys/module/aes_generic/notes', 0o775)
+f('sys/module/aes_generic/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00V@\xa6&\x10\xf7X\xe0q\xbf\xb9G\xd9d\x004\x06h\xe6\x13')
+d('sys/module/snd_seq_device', 0o775)
+f('sys/module/snd_seq_device/initstate', 0o664, b'live\n')
+f('sys/module/snd_seq_device/srcversion', 0o664, b'A166653189DAF15E3F2B588\n')
+f('sys/module/snd_seq_device/refcnt', 0o664, b'1\n')
+d('sys/module/snd_seq_device/holders', 0o775)
+l('sys/module/snd_seq_device/holders/snd_seq', '../../snd_seq')
+d('sys/module/snd_seq_device/sections', 0o775)
+f('sys/module/snd_seq_device/sections/__ksymtab_strings', 0o664, b'0xffffffffa02a5d10\n')
+f('sys/module/snd_seq_device/sections/.exit.text', 0o664, b'0xffffffffa02a5a5c\n')
+f('sys/module/snd_seq_device/sections/.note.gnu.build-id', 0o664, b'0xffffffffa02a5a90\n')
+f('sys/module/snd_seq_device/sections/.strtab', 0o664, b'0xffffffffa02a66e0\n')
+f('sys/module/snd_seq_device/sections/__ksymtab', 0o664, b'0xffffffffa02a5c80\n')
+f('sys/module/snd_seq_device/sections/.bss', 0o664, b'0xffffffffa02a7280\n')
+f('sys/module/snd_seq_device/sections/.text', 0o664, b'0xffffffffa02a5000\n')
+f('sys/module/snd_seq_device/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/snd_seq_device/sections/__kcrctab', 0o664, b'0xffffffffa02a5ce0\n')
+f('sys/module/snd_seq_device/sections/.data', 0o664, b'0xffffffffa02a6de0\n')
+f('sys/module/snd_seq_device/sections/.symtab', 0o664, b'0xffffffffa02a5db0\n')
+f('sys/module/snd_seq_device/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa02a6ec0\n')
+f('sys/module/snd_seq_device/sections/.rodata.str1.1', 0o664, b'0xffffffffa02a5bd0\n')
+d('sys/module/snd_seq_device/notes', 0o775)
+f('sys/module/snd_seq_device/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xb6B\x93\xc2\xcc\x83\xa8\xfc\xc2r\xf6\x8c\xcej\n\xc5\x87ys\r')
+d('sys/module/8250', 0o775)
+d('sys/module/8250/parameters', 0o775)
+f('sys/module/8250/parameters/share_irqs', 0o664, b'0\n')
+f('sys/module/8250/parameters/nr_uarts', 0o664, b'4\n')
+d('sys/module/ipv6', 0o775)
+f('sys/module/ipv6/initstate', 0o664, b'live\n')
+f('sys/module/ipv6/srcversion', 0o664, b'184C844E7A78529619B4C9D\n')
+f('sys/module/ipv6/refcnt', 0o664, b'10\n')
+d('sys/module/ipv6/sections', 0o775)
+f('sys/module/ipv6/sections/__ksymtab_gpl', 0o664, b'0xffffffffa028ac10\n')
+f('sys/module/ipv6/sections/.smp_locks', 0o664, b'0xffffffffa028a240\n')
+f('sys/module/ipv6/sections/__bug_table', 0o664, b'0xffffffffa0288edd\n')
+f('sys/module/ipv6/sections/__ksymtab_strings', 0o664, b'0xffffffffa028b108\n')
+f('sys/module/ipv6/sections/.exit.text', 0o664, b'0xffffffffa0285e40\n')
+f('sys/module/ipv6/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0286024\n')
+f('sys/module/ipv6/sections/.strtab', 0o664, b'0xffffffffa02937f0\n')
+f('sys/module/ipv6/sections/__ksymtab', 0o664, b'0xffffffffa028ad90\n')
+f('sys/module/ipv6/sections/.rodata', 0o664, b'0xffffffffa0286060\n')
+f('sys/module/ipv6/sections/.data.read_mostly', 0o664, b'0xffffffffa029cf20\n')
+f('sys/module/ipv6/sections/.bss', 0o664, b'0xffffffffa029dd80\n')
+f('sys/module/ipv6/sections/.text', 0o664, b'0xffffffffa0258000\n')
+f('sys/module/ipv6/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/ipv6/sections/__kcrctab', 0o664, b'0xffffffffa028afe0\n')
+f('sys/module/ipv6/sections/.data', 0o664, b'0xffffffffa02998c0\n')
+f('sys/module/ipv6/sections/.init.data', 0o664, b'0xffffffffa0065d80\n')
+f('sys/module/ipv6/sections/.symtab', 0o664, b'0xffffffffa028b4c8\n')
+f('sys/module/ipv6/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa029d9c0\n')
+f('sys/module/ipv6/sections/.rodata.str1.1', 0o664, b'0xffffffffa02883c0\n')
+f('sys/module/ipv6/sections/.ref.text', 0o664, b'0xffffffffa0285f40\n')
+f('sys/module/ipv6/sections/__kcrctab_gpl', 0o664, b'0xffffffffa028ad10\n')
+d('sys/module/ipv6/notes', 0o775)
+f('sys/module/ipv6/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\x90\x01\xde\xf3>\xfd_r\xbc\xbb\x16\xbd\xceIf\xc2vC\xbd\xc9')
+d('sys/module/microcode', 0o775)
+f('sys/module/microcode/initstate', 0o664, b'live\n')
+f('sys/module/microcode/srcversion', 0o664, b'FC3DA13E858B639D12F2043\n')
+f('sys/module/microcode/refcnt', 0o664, b'0\n')
+d('sys/module/microcode/sections', 0o775)
+f('sys/module/microcode/sections/__bug_table', 0o664, b'0xffffffffa02516f7\n')
+f('sys/module/microcode/sections/.exit.text', 0o664, b'0xffffffffa0250ff6\n')
+f('sys/module/microcode/sections/.note.gnu.build-id', 0o664, b'0xffffffffa0251040\n')
+f('sys/module/microcode/sections/.strtab', 0o664, b'0xffffffffa02520b8\n')
+f('sys/module/microcode/sections/.rodata', 0o664, b'0xffffffffa0251080\n')
+f('sys/module/microcode/sections/.bss', 0o664, b'0xffffffffa0252c40\n')
+f('sys/module/microcode/sections/.text', 0o664, b'0xffffffffa0250000\n')
+f('sys/module/microcode/sections/.init.text', 0o664, b'0xffffffffa0065000\n')
+f('sys/module/microcode/sections/.ref.data', 0o664, b'0xffffffffa0252850\n')
+f('sys/module/microcode/sections/.data', 0o664, b'0xffffffffa0252600\n')
+f('sys/module/microcode/sections/.symtab', 0o664, b'0xffffffffa0251740\n')
+f('sys/module/microcode/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa0252880\n')
+f('sys/module/microcode/sections/.rodata.str1.1', 0o664, b'0xffffffffa0251218\n')
+f('sys/module/microcode/sections/.cpuinit.text', 0o664, b'0xffffffffa0250d90\n')
+d('sys/module/microcode/notes', 0o775)
+f('sys/module/microcode/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\x81 p\x0b\x99+\x14\x05\x9c\xb2\xf6{\xacs\xa9\xf3<\xb5\x99\x1a')
+d('sys/module/i8042', 0o775)
+d('sys/module/i8042/parameters', 0o775)
+f('sys/module/i8042/parameters/debug', 0o664, b'N\n')
+f('sys/module/i8042/parameters/panicblink', 0o664, b'500\n')
+d('sys/module/usbcore', 0o775)
+f('sys/module/usbcore/initstate', 0o664, b'live\n')
+f('sys/module/usbcore/srcversion', 0o664, b'4FF77EB8DAB25F4076D7357\n')
+f('sys/module/usbcore/refcnt', 0o664, b'5\n')
+d('sys/module/usbcore/holders', 0o775)
+l('sys/module/usbcore/holders/uhci_hcd', '../../uhci_hcd')
+l('sys/module/usbcore/holders/usb_storage', '../../usb_storage')
+l('sys/module/usbcore/holders/cdc_acm', '../../cdc_acm')
+l('sys/module/usbcore/holders/usbhid', '../../usbhid')
+l('sys/module/usbcore/holders/ehci_hcd', '../../ehci_hcd')
+d('sys/module/usbcore/drivers', 0o775)
+l('sys/module/usbcore/drivers/usb:usbfs', '../../../bus/usb/drivers/usbfs')
+l('sys/module/usbcore/drivers/usb:usb', '../../../bus/usb/drivers/usb')
+l('sys/module/usbcore/drivers/usb:hub', '../../../bus/usb/drivers/hub')
+d('sys/module/usbcore/parameters', 0o775)
+f('sys/module/usbcore/parameters/use_both_schemes', 0o664, b'Y\n')
+f('sys/module/usbcore/parameters/blinkenlights', 0o664, b'N\n')
+f('sys/module/usbcore/parameters/usbfs_snoop', 0o664, b'N\n')
+f('sys/module/usbcore/parameters/autosuspend', 0o664, b'2\n')
+f('sys/module/usbcore/parameters/nousb', 0o664, b'N\n')
+f('sys/module/usbcore/parameters/old_scheme_first', 0o664, b'N\n')
+d('sys/module/usbcore/sections', 0o775)
+f('sys/module/usbcore/sections/__ksymtab_gpl', 0o664, b'0xffffffffa004ea30\n')
+f('sys/module/usbcore/sections/.smp_locks', 0o664, b'0xffffffffa004f930\n')
+f('sys/module/usbcore/sections/__ex_table', 0o664, b'0xffffffffa004fa58\n')
+f('sys/module/usbcore/sections/__bug_table', 0o664, b'0xffffffffa004fa40\n')
+f('sys/module/usbcore/sections/__ksymtab_strings', 0o664, b'0xffffffffa004f300\n')
+f('sys/module/usbcore/sections/.exit.text', 0o664, b'0xffffffffa004ba30\n')
+f('sys/module/usbcore/sections/.note.gnu.build-id', 0o664, b'0xffffffffa004bb30\n')
+f('sys/module/usbcore/sections/.strtab', 0o664, b'0xffffffffa0055cf8\n')
+f('sys/module/usbcore/sections/.fixup', 0o664, b'0xffffffffa004ba87\n')
+f('sys/module/usbcore/sections/.rodata', 0o664, b'0xffffffffa004bb60\n')
+f('sys/module/usbcore/sections/__param', 0o664, b'0xffffffffa004f210\n')
+f('sys/module/usbcore/sections/.bss', 0o664, b'0xffffffffa005cec0\n')
+f('sys/module/usbcore/sections/.text', 0o664, b'0xffffffffa0038000\n')
+f('sys/module/usbcore/sections/.init.text', 0o664, b'0xffffffffa0027000\n')
+f('sys/module/usbcore/sections/.data', 0o664, b'0xffffffffa005af00\n')
+f('sys/module/usbcore/sections/.symtab', 0o664, b'0xffffffffa004fb18\n')
+f('sys/module/usbcore/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa005cb00\n')
+f('sys/module/usbcore/sections/.rodata.str1.1', 0o664, b'0xffffffffa004c044\n')
+f('sys/module/usbcore/sections/__kcrctab_gpl', 0o664, b'0xffffffffa004ef70\n')
+d('sys/module/usbcore/notes', 0o775)
+f('sys/module/usbcore/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00!\xbeP\xa2@m\xffg\xff\x1b\xa8\x8f\xd2\xb3\x11\x14[\xb0\x89\x1e')
+d('sys/module/intel_agp', 0o775)
+f('sys/module/intel_agp/initstate', 0o664, b'live\n')
+f('sys/module/intel_agp/srcversion', 0o664, b'98AFACFFF6A1ADC3A6FAB67\n')
+f('sys/module/intel_agp/refcnt', 0o664, b'0\n')
+d('sys/module/intel_agp/drivers', 0o775)
+l('sys/module/intel_agp/drivers/pci:agpgart-intel', '../../../bus/pci/drivers/agpgart-intel')
+d('sys/module/intel_agp/sections', 0o775)
+f('sys/module/intel_agp/sections/.smp_locks', 0o664, b'0xffffffffa008ae38\n')
+f('sys/module/intel_agp/sections/.exit.text', 0o664, b'0xffffffffa00893ac\n')
+f('sys/module/intel_agp/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00896b0\n')
+f('sys/module/intel_agp/sections/.strtab', 0o664, b'0xffffffffa008c1b8\n')
+f('sys/module/intel_agp/sections/.devexit.text', 0o664, b'0xffffffffa00893be\n')
+f('sys/module/intel_agp/sections/.rodata', 0o664, b'0xffffffffa00896e0\n')
+f('sys/module/intel_agp/sections/.bss', 0o664, b'0xffffffffa008da00\n')
+f('sys/module/intel_agp/sections/.text', 0o664, b'0xffffffffa0086000\n')
+f('sys/module/intel_agp/sections/.init.text', 0o664, b'0xffffffffa008f000\n')
+f('sys/module/intel_agp/sections/.data', 0o664, b'0xffffffffa008cf60\n')
+f('sys/module/intel_agp/sections/.devinit.text', 0o664, b'0xffffffffa0089400\n')
+f('sys/module/intel_agp/sections/.symtab', 0o664, b'0xffffffffa008ae50\n')
+f('sys/module/intel_agp/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa008d640\n')
+f('sys/module/intel_agp/sections/.rodata.str1.1', 0o664, b'0xffffffffa008a9c0\n')
+d('sys/module/intel_agp/notes', 0o775)
+f('sys/module/intel_agp/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\xb0\xb5IU\x04F\xdb\x80\xdf\x9a8\xedq\x0b\xd4\xc7K\x851\x86')
+d('sys/module/evdev', 0o775)
+f('sys/module/evdev/initstate', 0o664, b'live\n')
+f('sys/module/evdev/srcversion', 0o664, b'6F6934C1F95317926EA0520\n')
+f('sys/module/evdev/refcnt', 0o664, b'5\n')
+d('sys/module/evdev/sections', 0o775)
+f('sys/module/evdev/sections/.exit.text', 0o664, b'0xffffffffa00b3724\n')
+f('sys/module/evdev/sections/.note.gnu.build-id', 0o664, b'0xffffffffa00b3738\n')
+f('sys/module/evdev/sections/.strtab', 0o664, b'0xffffffffa00b4610\n')
+f('sys/module/evdev/sections/.rodata', 0o664, b'0xffffffffa00b3760\n')
+f('sys/module/evdev/sections/.bss', 0o664, b'0xffffffffa00b50c0\n')
+f('sys/module/evdev/sections/.text', 0o664, b'0xffffffffa00b2000\n')
+f('sys/module/evdev/sections/.init.text', 0o664, b'0xffffffffa00b7000\n')
+f('sys/module/evdev/sections/.data', 0o664, b'0xffffffffa00b4be0\n')
+f('sys/module/evdev/sections/.symtab', 0o664, b'0xffffffffa00b3b60\n')
+f('sys/module/evdev/sections/.gnu.linkonce.this_module', 0o664, b'0xffffffffa00b4d00\n')
+f('sys/module/evdev/sections/.rodata.str1.1', 0o664, b'0xffffffffa00b3a38\n')
+d('sys/module/evdev/notes', 0o775)
+f('sys/module/evdev/notes/.note.gnu.build-id', 0o664, b'\x04\x00\x00\x00\x14\x00\x00\x00\x03\x00\x00\x00GNU\x00\x8d/u!\xb1\xf2\xe7\x10z\x8a\xf7\x0c\x88\x17\x1c4i\\2\xa8')
+d('sys/module/atkbd', 0o775)
+d('sys/module/atkbd/drivers', 0o775)
+l('sys/module/atkbd/drivers/serio:atkbd', '../../../bus/serio/drivers/atkbd')
+d('sys/class', 0o755)
+d('sys/class/rfkill', 0o755)
+l('sys/class/rfkill/rfkill0', '../../devices/platform/thinkpad_acpi/rfkill/rfkill0')
+d('sys/class/rtc', 0o755)
+l('sys/class/rtc/rtc0', '../../devices/pnp0/00:07/rtc/rtc0')
+d('sys/class/usb_endpoint', 0o755)
+l('sys/class/usb_endpoint/usbdev1.1_ep00', '../../devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00')
+l('sys/class/usb_endpoint/usbdev4.3_ep83', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83')
+l('sys/class/usb_endpoint/usbdev4.2_ep04', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04')
+l('sys/class/usb_endpoint/usbdev1.1_ep81', '../../devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81')
+l('sys/class/usb_endpoint/usbdev3.1_ep81', '../../devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81')
+l('sys/class/usb_endpoint/usbdev4.1_ep00', '../../devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00')
+l('sys/class/usb_endpoint/usbdev3.4_ep00', '../../devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00')
+l('sys/class/usb_endpoint/usbdev4.2_ep00', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00')
+l('sys/class/usb_endpoint/usbdev5.7_ep81', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81')
+l('sys/class/usb_endpoint/usbdev5.9_ep81', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81')
+l('sys/class/usb_endpoint/usbdev5.9_ep83', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83')
+l('sys/class/usb_endpoint/usbdev5.9_ep84', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84')
+l('sys/class/usb_endpoint/usbdev5.9_ep00', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00')
+l('sys/class/usb_endpoint/usbdev4.2_ep03', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03')
+l('sys/class/usb_endpoint/usbdev4.2_ep84', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84')
+l('sys/class/usb_endpoint/usbdev3.1_ep00', '../../devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00')
+l('sys/class/usb_endpoint/usbdev4.2_ep83', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83')
+l('sys/class/usb_endpoint/usbdev4.2_ep02', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02')
+l('sys/class/usb_endpoint/usbdev4.3_ep00', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00')
+l('sys/class/usb_endpoint/usbdev5.7_ep00', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00')
+l('sys/class/usb_endpoint/usbdev4.1_ep81', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81')
+l('sys/class/usb_endpoint/usbdev5.9_ep02', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02')
+l('sys/class/usb_endpoint/usbdev4.2_ep82', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82')
+l('sys/class/usb_endpoint/usbdev2.1_ep81', '../../devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81')
+l('sys/class/usb_endpoint/usbdev4.3_ep81', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81')
+l('sys/class/usb_endpoint/usbdev2.1_ep00', '../../devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00')
+l('sys/class/usb_endpoint/usbdev5.1_ep81', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81')
+l('sys/class/usb_endpoint/usbdev4.2_ep81', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81')
+l('sys/class/usb_endpoint/usbdev3.4_ep81', '../../devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81')
+l('sys/class/usb_endpoint/usbdev4.3_ep02', '../../devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02')
+l('sys/class/usb_endpoint/usbdev5.7_ep02', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02')
+l('sys/class/usb_endpoint/usbdev5.1_ep00', '../../devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00')
+l('sys/class/usb_endpoint/usbdev5.9_ep01', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01')
+l('sys/class/usb_endpoint/usbdev5.9_ep82', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82')
+d('sys/class/ieee80211', 0o755)
+l('sys/class/ieee80211/phy0', '../../devices/pci0000:00/0000:00:1c.1/0000:03:00.0/ieee80211/phy0')
+d('sys/class/scsi_disk', 0o755)
+l('sys/class/scsi_disk/7:0:0:0', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_disk/7:0:0:0')
+l('sys/class/scsi_disk/0:0:0:0', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0')
+d('sys/class/vc', 0o755)
+l('sys/class/vc/vcsa3', '../../devices/virtual/vc/vcsa3')
+l('sys/class/vc/vcsa6', '../../devices/virtual/vc/vcsa6')
+l('sys/class/vc/vcsa2', '../../devices/virtual/vc/vcsa2')
+l('sys/class/vc/vcsa', '../../devices/virtual/vc/vcsa')
+l('sys/class/vc/vcs2', '../../devices/virtual/vc/vcs2')
+l('sys/class/vc/vcs7', '../../devices/virtual/vc/vcs7')
+l('sys/class/vc/vcsa5', '../../devices/virtual/vc/vcsa5')
+l('sys/class/vc/vcsa10', '../../devices/virtual/vc/vcsa10')
+l('sys/class/vc/vcs10', '../../devices/virtual/vc/vcs10')
+l('sys/class/vc/vcsa1', '../../devices/virtual/vc/vcsa1')
+l('sys/class/vc/vcsa4', '../../devices/virtual/vc/vcsa4')
+l('sys/class/vc/vcs', '../../devices/virtual/vc/vcs')
+l('sys/class/vc/vcs1', '../../devices/virtual/vc/vcs1')
+l('sys/class/vc/vcs4', '../../devices/virtual/vc/vcs4')
+l('sys/class/vc/vcsa7', '../../devices/virtual/vc/vcsa7')
+l('sys/class/vc/vcs6', '../../devices/virtual/vc/vcs6')
+l('sys/class/vc/vcs3', '../../devices/virtual/vc/vcs3')
+l('sys/class/vc/vcs5', '../../devices/virtual/vc/vcs5')
+d('sys/class/mem', 0o755)
+l('sys/class/mem/zero', '../../devices/virtual/mem/zero')
+l('sys/class/mem/kmsg', '../../devices/virtual/mem/kmsg')
+l('sys/class/mem/mem', '../../devices/virtual/mem/mem')
+l('sys/class/mem/urandom', '../../devices/virtual/mem/urandom')
+l('sys/class/mem/port', '../../devices/virtual/mem/port')
+l('sys/class/mem/null', '../../devices/virtual/mem/null')
+l('sys/class/mem/kmem', '../../devices/virtual/mem/kmem')
+l('sys/class/mem/full', '../../devices/virtual/mem/full')
+l('sys/class/mem/random', '../../devices/virtual/mem/random')
+d('sys/class/pci_bus', 0o755)
+l('sys/class/pci_bus/0000:00', '../../devices/pci0000:00/pci_bus/0000:00')
+l('sys/class/pci_bus/0000:01', '../../devices/pci0000:00/0000:00:01.0/pci_bus/0000:01')
+l('sys/class/pci_bus/0000:03', '../../devices/pci0000:00/0000:00:1c.1/pci_bus/0000:03')
+l('sys/class/pci_bus/0000:0c', '../../devices/pci0000:00/0000:00:1c.3/pci_bus/0000:0c')
+l('sys/class/pci_bus/0000:16', '../../devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pci_bus/0000:16')
+l('sys/class/pci_bus/0000:04', '../../devices/pci0000:00/0000:00:1c.2/pci_bus/0000:04')
+l('sys/class/pci_bus/0000:02', '../../devices/pci0000:00/0000:00:1c.0/pci_bus/0000:02')
+l('sys/class/pci_bus/0000:15', '../../devices/pci0000:00/0000:00:1e.0/pci_bus/0000:15')
+d('sys/class/hwmon', 0o755)
+l('sys/class/hwmon/hwmon0', '../../devices/platform/thinkpad_hwmon/hwmon/hwmon0')
+d('sys/class/net', 0o755)
+l('sys/class/net/wmaster0', '../../devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0')
+l('sys/class/net/wlan0', '../../devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0')
+l('sys/class/net/lo', '../../devices/virtual/net/lo')
+l('sys/class/net/eth0', '../../devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0')
+d('sys/class/dmi', 0o755)
+l('sys/class/dmi/id', '../../devices/virtual/dmi/id')
+d('sys/class/firmware', 0o755)
+f('sys/class/firmware/timeout', 0o644, b'60\n')
+d('sys/class/scsi_generic', 0o755)
+l('sys/class/scsi_generic/sg0', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_generic/sg0')
+l('sys/class/scsi_generic/sg1', '../../devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_generic/sg1')
+l('sys/class/scsi_generic/sg2', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_generic/sg2')
+d('sys/class/bdi', 0o755)
+l('sys/class/bdi/7:1', '../../devices/virtual/bdi/7:1')
+l('sys/class/bdi/7:0', '../../devices/virtual/bdi/7:0')
+l('sys/class/bdi/7:2', '../../devices/virtual/bdi/7:2')
+l('sys/class/bdi/7:4', '../../devices/virtual/bdi/7:4')
+l('sys/class/bdi/7:3', '../../devices/virtual/bdi/7:3')
+l('sys/class/bdi/11:0', '../../devices/virtual/bdi/11:0')
+l('sys/class/bdi/7:5', '../../devices/virtual/bdi/7:5')
+l('sys/class/bdi/8:0', '../../devices/virtual/bdi/8:0')
+l('sys/class/bdi/default', '../../devices/virtual/bdi/default')
+l('sys/class/bdi/0:16', '../../devices/virtual/bdi/0:16')
+l('sys/class/bdi/8:16', '../../devices/virtual/bdi/8:16')
+l('sys/class/bdi/9:0', '../../devices/virtual/bdi/9:0')
+l('sys/class/bdi/7:7', '../../devices/virtual/bdi/7:7')
+l('sys/class/bdi/7:6', '../../devices/virtual/bdi/7:6')
+d('sys/class/leds', 0o755)
+l('sys/class/leds/iwl-phy0:TX', '../../devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:TX')
+l('sys/class/leds/tpacpi::bay_active', '../../devices/platform/thinkpad_acpi/leds/tpacpi::bay_active')
+l('sys/class/leds/tpacpi:orange:batt', '../../devices/platform/thinkpad_acpi/leds/tpacpi:orange:batt')
+l('sys/class/leds/tpacpi::dock_active', '../../devices/platform/thinkpad_acpi/leds/tpacpi::dock_active')
+l('sys/class/leds/tpacpi::unknown_led', '../../devices/platform/thinkpad_acpi/leds/tpacpi::unknown_led')
+l('sys/class/leds/iwl-phy0:assoc', '../../devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:assoc')
+l('sys/class/leds/tpacpi:green:batt', '../../devices/platform/thinkpad_acpi/leds/tpacpi:green:batt')
+l('sys/class/leds/iwl-phy0:radio', '../../devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:radio')
+l('sys/class/leds/iwl-phy0:RX', '../../devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:RX')
+l('sys/class/leds/tpacpi::dock_batt', '../../devices/platform/thinkpad_acpi/leds/tpacpi::dock_batt')
+l('sys/class/leds/tpacpi::thinklight', '../../devices/platform/thinkpad_acpi/leds/tpacpi::thinklight')
+l('sys/class/leds/tpacpi::power', '../../devices/platform/thinkpad_acpi/leds/tpacpi::power')
+l('sys/class/leds/tpacpi::standby', '../../devices/platform/thinkpad_acpi/leds/tpacpi::standby')
+d('sys/class/usb_host', 0o755)
+l('sys/class/usb_host/usb_host1', '../../devices/pci0000:00/0000:00:1d.0/usb_host/usb_host1')
+l('sys/class/usb_host/usb_host2', '../../devices/pci0000:00/0000:00:1d.1/usb_host/usb_host2')
+l('sys/class/usb_host/usb_host4', '../../devices/pci0000:00/0000:00:1d.3/usb_host/usb_host4')
+l('sys/class/usb_host/usb_host5', '../../devices/pci0000:00/0000:00:1d.7/usb_host/usb_host5')
+l('sys/class/usb_host/usb_host3', '../../devices/pci0000:00/0000:00:1d.2/usb_host/usb_host3')
+d('sys/class/pcmcia_socket', 0o755)
+l('sys/class/pcmcia_socket/pcmcia_socket0', '../../devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0')
+d('sys/class/sound', 0o755)
+l('sys/class/sound/audio', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/audio')
+l('sys/class/sound/dsp', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/dsp')
+l('sys/class/sound/timer', '../../devices/virtual/sound/timer')
+l('sys/class/sound/card0', '../../devices/pci0000:00/0000:00:1b.0/sound/card0')
+l('sys/class/sound/seq', '../../devices/virtual/sound/seq')
+l('sys/class/sound/mixer', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/mixer')
+l('sys/class/sound/pcmC0D0p', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0p')
+l('sys/class/sound/controlC0', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/controlC0')
+l('sys/class/sound/pcmC0D0c', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0c')
+l('sys/class/sound/adsp', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/adsp')
+l('sys/class/sound/pcmC0D1p', '../../devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D1p')
+d('sys/class/misc', 0o755)
+l('sys/class/misc/uinput', '../../devices/virtual/misc/uinput')
+l('sys/class/misc/fuse', '../../devices/virtual/misc/fuse')
+l('sys/class/misc/hpet', '../../devices/virtual/misc/hpet')
+l('sys/class/misc/cpu_dma_latency', '../../devices/virtual/misc/cpu_dma_latency')
+l('sys/class/misc/mcelog', '../../devices/virtual/misc/mcelog')
+l('sys/class/misc/device-mapper', '../../devices/virtual/misc/device-mapper')
+l('sys/class/misc/psaux', '../../devices/virtual/misc/psaux')
+l('sys/class/misc/nvram', '../../devices/virtual/misc/nvram')
+l('sys/class/misc/network_latency', '../../devices/virtual/misc/network_latency')
+l('sys/class/misc/network_throughput', '../../devices/virtual/misc/network_throughput')
+l('sys/class/misc/microcode', '../../devices/virtual/misc/microcode')
+d('sys/class/vtconsole', 0o755)
+l('sys/class/vtconsole/vtcon1', '../../devices/virtual/vtconsole/vtcon1')
+l('sys/class/vtconsole/vtcon0', '../../devices/virtual/vtconsole/vtcon0')
+d('sys/class/bsg', 0o755)
+l('sys/class/bsg/7:0:0:0', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/bsg/7:0:0:0')
+l('sys/class/bsg/0:0:0:0', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/bsg/0:0:0:0')
+l('sys/class/bsg/4:0:0:0', '../../devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/bsg/4:0:0:0')
+d('sys/class/input', 0o755)
+l('sys/class/input/event0', '../../devices/platform/i8042/serio0/input/input0/event0')
+l('sys/class/input/input0', '../../devices/platform/i8042/serio0/input/input0')
+l('sys/class/input/event4', '../../devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/event4')
+l('sys/class/input/mouse0', '../../devices/platform/i8042/serio1/input/input1/mouse0')
+l('sys/class/input/mouse1', '../../devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/mouse1')
+l('sys/class/input/event2', '../../devices/platform/pcspkr/input/input2/event2')
+l('sys/class/input/input2', '../../devices/platform/pcspkr/input/input2')
+l('sys/class/input/input5', '../../devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5')
+l('sys/class/input/input8', '../../devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8')
+l('sys/class/input/input3', '../../devices/LNXSYSTM:00/LNXPWRBN:00/input/input3')
+l('sys/class/input/input1', '../../devices/platform/i8042/serio1/input/input1')
+l('sys/class/input/mice', '../../devices/virtual/input/mice')
+l('sys/class/input/event6', '../../devices/virtual/input/input6/event6')
+l('sys/class/input/input6', '../../devices/virtual/input/input6')
+l('sys/class/input/event3', '../../devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/event3')
+l('sys/class/input/event1', '../../devices/platform/i8042/serio1/input/input1/event1')
+l('sys/class/input/input4', '../../devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4')
+l('sys/class/input/event7', '../../devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/event7')
+l('sys/class/input/event5', '../../devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/event5')
+d('sys/class/thermal', 0o755)
+l('sys/class/thermal/thermal_zone1', '../../devices/virtual/thermal/thermal_zone1')
+l('sys/class/thermal/cooling_device1', '../../devices/virtual/thermal/cooling_device1')
+l('sys/class/thermal/cooling_device0', '../../devices/virtual/thermal/cooling_device0')
+l('sys/class/thermal/thermal_zone0', '../../devices/virtual/thermal/thermal_zone0')
+d('sys/class/power_supply', 0o755)
+l('sys/class/power_supply/AC', '../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/power_supply/AC')
+l('sys/class/power_supply/BAT0', '../../devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0')
+d('sys/class/block', 0o755)
+l('sys/class/block/loop1', '../../devices/virtual/block/loop1')
+l('sys/class/block/loop7', '../../devices/virtual/block/loop7')
+l('sys/class/block/loop0', '../../devices/virtual/block/loop0')
+l('sys/class/block/sda10', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10')
+l('sys/class/block/sr0', '../../devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0')
+l('sys/class/block/loop5', '../../devices/virtual/block/loop5')
+l('sys/class/block/loop3', '../../devices/virtual/block/loop3')
+l('sys/class/block/sda9', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9')
+l('sys/class/block/sda7', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7')
+l('sys/class/block/loop6', '../../devices/virtual/block/loop6')
+l('sys/class/block/sdb', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb')
+l('sys/class/block/sda1', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1')
+l('sys/class/block/loop2', '../../devices/virtual/block/loop2')
+l('sys/class/block/sda8', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8')
+l('sys/class/block/sda5', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5')
+l('sys/class/block/loop4', '../../devices/virtual/block/loop4')
+l('sys/class/block/sda6', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6')
+l('sys/class/block/sda', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda')
+l('sys/class/block/md0', '../../devices/virtual/block/md0')
+l('sys/class/block/sdb1', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/sdb1')
+d('sys/class/scsi_host', 0o755)
+l('sys/class/scsi_host/host0', '../../devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0')
+l('sys/class/scsi_host/host5', '../../devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5')
+l('sys/class/scsi_host/host1', '../../devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1')
+l('sys/class/scsi_host/host4', '../../devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4')
+l('sys/class/scsi_host/host2', '../../devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2')
+l('sys/class/scsi_host/host7', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7')
+l('sys/class/scsi_host/host3', '../../devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3')
+d('sys/class/graphics', 0o755)
+l('sys/class/graphics/fbcon', '../../devices/virtual/graphics/fbcon')
+l('sys/class/graphics/fb0', '../../devices/platform/vesafb.0/graphics/fb0')
+d('sys/class/tty', 0o755)
+l('sys/class/tty/tty51', '../../devices/virtual/tty/tty51')
+l('sys/class/tty/tty24', '../../devices/virtual/tty/tty24')
+l('sys/class/tty/tty61', '../../devices/virtual/tty/tty61')
+l('sys/class/tty/ttyS1', '../../devices/platform/serial8250/tty/ttyS1')
+l('sys/class/tty/tty40', '../../devices/virtual/tty/tty40')
+l('sys/class/tty/tty60', '../../devices/virtual/tty/tty60')
+l('sys/class/tty/tty15', '../../devices/virtual/tty/tty15')
+l('sys/class/tty/tty27', '../../devices/virtual/tty/tty27')
+l('sys/class/tty/tty7', '../../devices/virtual/tty/tty7')
+l('sys/class/tty/tty43', '../../devices/virtual/tty/tty43')
+l('sys/class/tty/tty23', '../../devices/virtual/tty/tty23')
+l('sys/class/tty/tty14', '../../devices/virtual/tty/tty14')
+l('sys/class/tty/tty56', '../../devices/virtual/tty/tty56')
+l('sys/class/tty/tty3', '../../devices/virtual/tty/tty3')
+l('sys/class/tty/ttyS3', '../../devices/platform/serial8250/tty/ttyS3')
+l('sys/class/tty/tty49', '../../devices/virtual/tty/tty49')
+l('sys/class/tty/tty47', '../../devices/virtual/tty/tty47')
+l('sys/class/tty/tty57', '../../devices/virtual/tty/tty57')
+l('sys/class/tty/tty30', '../../devices/virtual/tty/tty30')
+l('sys/class/tty/tty45', '../../devices/virtual/tty/tty45')
+l('sys/class/tty/tty22', '../../devices/virtual/tty/tty22')
+l('sys/class/tty/tty55', '../../devices/virtual/tty/tty55')
+l('sys/class/tty/tty11', '../../devices/virtual/tty/tty11')
+l('sys/class/tty/tty53', '../../devices/virtual/tty/tty53')
+l('sys/class/tty/tty12', '../../devices/virtual/tty/tty12')
+l('sys/class/tty/tty28', '../../devices/virtual/tty/tty28')
+l('sys/class/tty/tty58', '../../devices/virtual/tty/tty58')
+l('sys/class/tty/tty32', '../../devices/virtual/tty/tty32')
+l('sys/class/tty/tty44', '../../devices/virtual/tty/tty44')
+l('sys/class/tty/tty6', '../../devices/virtual/tty/tty6')
+l('sys/class/tty/tty9', '../../devices/virtual/tty/tty9')
+l('sys/class/tty/tty26', '../../devices/virtual/tty/tty26')
+l('sys/class/tty/tty10', '../../devices/virtual/tty/tty10')
+l('sys/class/tty/tty39', '../../devices/virtual/tty/tty39')
+l('sys/class/tty/tty0', '../../devices/virtual/tty/tty0')
+l('sys/class/tty/tty36', '../../devices/virtual/tty/tty36')
+l('sys/class/tty/tty34', '../../devices/virtual/tty/tty34')
+l('sys/class/tty/tty16', '../../devices/virtual/tty/tty16')
+l('sys/class/tty/tty25', '../../devices/virtual/tty/tty25')
+l('sys/class/tty/tty13', '../../devices/virtual/tty/tty13')
+l('sys/class/tty/tty52', '../../devices/virtual/tty/tty52')
+l('sys/class/tty/ttyS0', '../../devices/platform/serial8250/tty/ttyS0')
+l('sys/class/tty/tty31', '../../devices/virtual/tty/tty31')
+l('sys/class/tty/tty35', '../../devices/virtual/tty/tty35')
+l('sys/class/tty/tty54', '../../devices/virtual/tty/tty54')
+l('sys/class/tty/tty63', '../../devices/virtual/tty/tty63')
+l('sys/class/tty/tty1', '../../devices/virtual/tty/tty1')
+l('sys/class/tty/tty33', '../../devices/virtual/tty/tty33')
+l('sys/class/tty/tty18', '../../devices/virtual/tty/tty18')
+l('sys/class/tty/ttyACM0', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0')
+l('sys/class/tty/tty42', '../../devices/virtual/tty/tty42')
+l('sys/class/tty/tty8', '../../devices/virtual/tty/tty8')
+l('sys/class/tty/tty37', '../../devices/virtual/tty/tty37')
+l('sys/class/tty/tty5', '../../devices/virtual/tty/tty5')
+l('sys/class/tty/tty48', '../../devices/virtual/tty/tty48')
+l('sys/class/tty/tty17', '../../devices/virtual/tty/tty17')
+l('sys/class/tty/tty62', '../../devices/virtual/tty/tty62')
+l('sys/class/tty/tty59', '../../devices/virtual/tty/tty59')
+l('sys/class/tty/tty50', '../../devices/virtual/tty/tty50')
+l('sys/class/tty/tty21', '../../devices/virtual/tty/tty21')
+l('sys/class/tty/ttyS2', '../../devices/platform/serial8250/tty/ttyS2')
+l('sys/class/tty/tty19', '../../devices/virtual/tty/tty19')
+l('sys/class/tty/ptmx', '../../devices/virtual/tty/ptmx')
+l('sys/class/tty/tty46', '../../devices/virtual/tty/tty46')
+l('sys/class/tty/tty2', '../../devices/virtual/tty/tty2')
+l('sys/class/tty/console', '../../devices/virtual/tty/console')
+l('sys/class/tty/tty41', '../../devices/virtual/tty/tty41')
+l('sys/class/tty/tty4', '../../devices/virtual/tty/tty4')
+l('sys/class/tty/tty29', '../../devices/virtual/tty/tty29')
+l('sys/class/tty/tty', '../../devices/virtual/tty/tty')
+l('sys/class/tty/tty38', '../../devices/virtual/tty/tty38')
+l('sys/class/tty/tty20', '../../devices/virtual/tty/tty20')
+d('sys/class/scsi_device', 0o755)
+l('sys/class/scsi_device/7:0:0:0', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_device/7:0:0:0')
+l('sys/class/scsi_device/0:0:0:0', '../../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_device/0:0:0:0')
+l('sys/class/scsi_device/4:0:0:0', '../../devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_device/4:0:0:0')
+d('sys/block', 0o755)
+l('sys/block/loop1', '../devices/virtual/block/loop1')
+l('sys/block/loop7', '../devices/virtual/block/loop7')
+l('sys/block/loop0', '../devices/virtual/block/loop0')
+l('sys/block/sr0', '../devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0')
+l('sys/block/loop5', '../devices/virtual/block/loop5')
+l('sys/block/loop3', '../devices/virtual/block/loop3')
+l('sys/block/loop6', '../devices/virtual/block/loop6')
+l('sys/block/sdb', '../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb')
+l('sys/block/loop2', '../devices/virtual/block/loop2')
+l('sys/block/loop4', '../devices/virtual/block/loop4')
+l('sys/block/sda', '../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda')
+l('sys/block/md0', '../devices/virtual/block/md0')
+d('sys/devices', 0o755)
+d('sys/devices/system', 0o755)
+d('sys/devices/system/machinecheck', 0o755)
+d('sys/devices/system/machinecheck/machinecheck1', 0o755)
+f('sys/devices/system/machinecheck/machinecheck1/trigger', 0o644, b'\n')
+f('sys/devices/system/machinecheck/machinecheck1/bank0ctl', 0o644, b'ffffffffffffffff\n')
+f('sys/devices/system/machinecheck/machinecheck1/check_interval', 0o644, b'12c\n')
+f('sys/devices/system/machinecheck/machinecheck1/tolerant', 0o644, b'1\n')
+f('sys/devices/system/machinecheck/machinecheck1/bank1ctl', 0o644, b'ffffffffffffffff\n')
+f('sys/devices/system/machinecheck/machinecheck1/bank5ctl', 0o644, b'ffffffffffffffff\n')
+f('sys/devices/system/machinecheck/machinecheck1/bank3ctl', 0o644, b'ffffffffffffffff\n')
+f('sys/devices/system/machinecheck/machinecheck1/bank2ctl', 0o644, b'ffffffffffffffff\n')
+f('sys/devices/system/machinecheck/machinecheck1/bank4ctl', 0o644, b'ffffffffffffffff\n')
+d('sys/devices/system/machinecheck/machinecheck0', 0o755)
+f('sys/devices/system/machinecheck/machinecheck0/trigger', 0o644, b'\n')
+f('sys/devices/system/machinecheck/machinecheck0/bank0ctl', 0o644, b'ffffffffffffffff\n')
+f('sys/devices/system/machinecheck/machinecheck0/check_interval', 0o644, b'12c\n')
+f('sys/devices/system/machinecheck/machinecheck0/tolerant', 0o644, b'1\n')
+f('sys/devices/system/machinecheck/machinecheck0/bank1ctl', 0o644, b'ffffffffffffffff\n')
+f('sys/devices/system/machinecheck/machinecheck0/bank5ctl', 0o644, b'ffffffffffffffff\n')
+f('sys/devices/system/machinecheck/machinecheck0/bank3ctl', 0o644, b'ffffffffffffffff\n')
+f('sys/devices/system/machinecheck/machinecheck0/bank2ctl', 0o644, b'ffffffffffffffff\n')
+f('sys/devices/system/machinecheck/machinecheck0/bank4ctl', 0o644, b'ffffffffffffffff\n')
+d('sys/devices/system/clocksource', 0o755)
+d('sys/devices/system/clocksource/clocksource0', 0o755)
+f('sys/devices/system/clocksource/clocksource0/available_clocksource', 0o644, b'hpet acpi_pm jiffies tsc \n')
+f('sys/devices/system/clocksource/clocksource0/current_clocksource', 0o644, b'hpet\n')
+d('sys/devices/system/cpu', 0o755)
+f('sys/devices/system/cpu/possible', 0o644, b'0-1\n')
+f('sys/devices/system/cpu/online', 0o644, b'0-1\n')
+f('sys/devices/system/cpu/present', 0o644, b'0-1\n')
+f('sys/devices/system/cpu/sched_mc_power_savings', 0o644, b'1\n')
+d('sys/devices/system/cpu/cpu0', 0o755)
+f('sys/devices/system/cpu/cpu0/crash_notes', 0o644, b'7fb20920\n')
+d('sys/devices/system/cpu/cpu0/topology', 0o755)
+f('sys/devices/system/cpu/cpu0/topology/thread_siblings', 0o644, b'01\n')
+f('sys/devices/system/cpu/cpu0/topology/thread_siblings_list', 0o644, b'0\n')
+f('sys/devices/system/cpu/cpu0/topology/core_siblings_list', 0o644, b'0-1\n')
+f('sys/devices/system/cpu/cpu0/topology/core_siblings', 0o644, b'03\n')
+f('sys/devices/system/cpu/cpu0/topology/core_id', 0o644, b'0\n')
+f('sys/devices/system/cpu/cpu0/topology/physical_package_id', 0o644, b'0\n')
+d('sys/devices/system/cpu/cpu0/thermal_throttle', 0o755)
+f('sys/devices/system/cpu/cpu0/thermal_throttle/count', 0o644, b'0\n')
+d('sys/devices/system/cpu/cpu0/cache', 0o755)
+d('sys/devices/system/cpu/cpu0/cache/index0', 0o755)
+f('sys/devices/system/cpu/cpu0/cache/index0/ways_of_associativity', 0o644, b'8\n')
+f('sys/devices/system/cpu/cpu0/cache/index0/type', 0o644, b'Data\n')
+f('sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size', 0o644, b'64\n')
+f('sys/devices/system/cpu/cpu0/cache/index0/number_of_sets', 0o644, b'64\n')
+f('sys/devices/system/cpu/cpu0/cache/index0/size', 0o644, b'32K\n')
+f('sys/devices/system/cpu/cpu0/cache/index0/physical_line_partition', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu0/cache/index0/shared_cpu_map', 0o644, b'01\n')
+f('sys/devices/system/cpu/cpu0/cache/index0/level', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu0/cache/index0/shared_cpu_list', 0o644, b'0\n')
+d('sys/devices/system/cpu/cpu0/cache/index2', 0o755)
+f('sys/devices/system/cpu/cpu0/cache/index2/ways_of_associativity', 0o644, b'16\n')
+f('sys/devices/system/cpu/cpu0/cache/index2/type', 0o644, b'Unified\n')
+f('sys/devices/system/cpu/cpu0/cache/index2/coherency_line_size', 0o644, b'64\n')
+f('sys/devices/system/cpu/cpu0/cache/index2/number_of_sets', 0o644, b'4096\n')
+f('sys/devices/system/cpu/cpu0/cache/index2/size', 0o644, b'4096K\n')
+f('sys/devices/system/cpu/cpu0/cache/index2/physical_line_partition', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu0/cache/index2/shared_cpu_map', 0o644, b'03\n')
+f('sys/devices/system/cpu/cpu0/cache/index2/level', 0o644, b'2\n')
+f('sys/devices/system/cpu/cpu0/cache/index2/shared_cpu_list', 0o644, b'0-1\n')
+d('sys/devices/system/cpu/cpu0/cache/index1', 0o755)
+f('sys/devices/system/cpu/cpu0/cache/index1/ways_of_associativity', 0o644, b'8\n')
+f('sys/devices/system/cpu/cpu0/cache/index1/type', 0o644, b'Instruction\n')
+f('sys/devices/system/cpu/cpu0/cache/index1/coherency_line_size', 0o644, b'64\n')
+f('sys/devices/system/cpu/cpu0/cache/index1/number_of_sets', 0o644, b'64\n')
+f('sys/devices/system/cpu/cpu0/cache/index1/size', 0o644, b'32K\n')
+f('sys/devices/system/cpu/cpu0/cache/index1/physical_line_partition', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu0/cache/index1/shared_cpu_map', 0o644, b'01\n')
+f('sys/devices/system/cpu/cpu0/cache/index1/level', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu0/cache/index1/shared_cpu_list', 0o644, b'0\n')
+d('sys/devices/system/cpu/cpu0/cpuidle', 0o755)
+d('sys/devices/system/cpu/cpu0/cpuidle/state2', 0o755)
+f('sys/devices/system/cpu/cpu0/cpuidle/state2/desc', 0o644, b'ACPI FFH INTEL MWAIT 0x10\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state2/power', 0o644, b'500\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state2/latency', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state2/usage', 0o644, b'689\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state2/name', 0o644, b'C2\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state2/time', 0o644, b'209561\n')
+d('sys/devices/system/cpu/cpu0/cpuidle/state3', 0o755)
+f('sys/devices/system/cpu/cpu0/cpuidle/state3/desc', 0o644, b'ACPI FFH INTEL MWAIT 0x30\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state3/power', 0o644, b'100\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state3/latency', 0o644, b'57\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state3/usage', 0o644, b'11774\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state3/name', 0o644, b'C3\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state3/time', 0o644, b'116651688\n')
+d('sys/devices/system/cpu/cpu0/cpuidle/state1', 0o755)
+f('sys/devices/system/cpu/cpu0/cpuidle/state1/desc', 0o644, b'ACPI FFH INTEL MWAIT 0x0\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state1/power', 0o644, b'1000\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state1/latency', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state1/usage', 0o644, b'2\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state1/name', 0o644, b'C1\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state1/time', 0o644, b'1044\n')
+d('sys/devices/system/cpu/cpu0/cpuidle/state0', 0o755)
+f('sys/devices/system/cpu/cpu0/cpuidle/state0/desc', 0o644, b'<null>\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state0/power', 0o644, b'4294967295\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state0/latency', 0o644, b'0\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state0/usage', 0o644, b'0\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state0/name', 0o644, b'<null>\n')
+f('sys/devices/system/cpu/cpu0/cpuidle/state0/time', 0o644, b'0\n')
+d('sys/devices/system/cpu/cpu0/cpufreq', 0o755)
+f('sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq', 0o644, b'1000000\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq', 0o644, b'2333000\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies', 0o644, b'2333000 2000000 1667000 1333000 1000000 \n')
+f('sys/devices/system/cpu/cpu0/cpufreq/scaling_governor', 0o644, b'ondemand\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors', 0o644, b'ondemand performance \n')
+f('sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq', 0o644, b'1000000\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/affected_cpus', 0o644, b'0 1\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/related_cpus', 0o644, b'0 1\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed', 0o644, b'<unsupported>\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/scaling_driver', 0o644, b'acpi-cpufreq\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq', 0o644, b'1000000\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq', 0o644, b'1000000\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq', 0o644, b'1000000\n')
+d('sys/devices/system/cpu/cpu0/cpufreq/stats', 0o755)
+f('sys/devices/system/cpu/cpu0/cpufreq/stats/total_trans', 0o644, b'12627\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state', 0o644, b'''2333000 92206
+2000000 442
+1667000 1009
+1333000 1713
+1000000 740740
+''')
+d('sys/devices/system/cpu/cpu0/cpufreq/ondemand', 0o755)
+f('sys/devices/system/cpu/cpu0/cpufreq/ondemand/powersave_bias', 0o644, b'0\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate_max', 0o644, b'10000000\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate', 0o644, b'20000\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/ondemand/up_threshold', 0o644, b'90\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/ondemand/ignore_nice_load', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate_min', 0o644, b'10000\n')
+d('sys/devices/system/cpu/cpu0/microcode', 0o755)
+f('sys/devices/system/cpu/cpu0/microcode/version', 0o644, b'0xc7\n')
+f('sys/devices/system/cpu/cpu0/microcode/processor_flags', 0o644, b'0x20\n')
+d('sys/devices/system/cpu/cpuidle', 0o755)
+f('sys/devices/system/cpu/cpuidle/current_driver', 0o644, b'acpi_idle\n')
+f('sys/devices/system/cpu/cpuidle/current_governor_ro', 0o644, b'menu\n')
+d('sys/devices/system/cpu/cpu1', 0o755)
+l('sys/devices/system/cpu/cpu1/cpufreq', '../cpu0/cpufreq')
+f('sys/devices/system/cpu/cpu1/crash_notes', 0o644, b'7fb20b68\n')
+f('sys/devices/system/cpu/cpu1/online', 0o644, b'1\n')
+d('sys/devices/system/cpu/cpu1/topology', 0o755)
+f('sys/devices/system/cpu/cpu1/topology/thread_siblings', 0o644, b'02\n')
+f('sys/devices/system/cpu/cpu1/topology/thread_siblings_list', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu1/topology/core_siblings_list', 0o644, b'0-1\n')
+f('sys/devices/system/cpu/cpu1/topology/core_siblings', 0o644, b'03\n')
+f('sys/devices/system/cpu/cpu1/topology/core_id', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu1/topology/physical_package_id', 0o644, b'0\n')
+d('sys/devices/system/cpu/cpu1/thermal_throttle', 0o755)
+f('sys/devices/system/cpu/cpu1/thermal_throttle/count', 0o644, b'0\n')
+d('sys/devices/system/cpu/cpu1/cache', 0o755)
+d('sys/devices/system/cpu/cpu1/cache/index0', 0o755)
+f('sys/devices/system/cpu/cpu1/cache/index0/ways_of_associativity', 0o644, b'8\n')
+f('sys/devices/system/cpu/cpu1/cache/index0/type', 0o644, b'Data\n')
+f('sys/devices/system/cpu/cpu1/cache/index0/coherency_line_size', 0o644, b'64\n')
+f('sys/devices/system/cpu/cpu1/cache/index0/number_of_sets', 0o644, b'64\n')
+f('sys/devices/system/cpu/cpu1/cache/index0/size', 0o644, b'32K\n')
+f('sys/devices/system/cpu/cpu1/cache/index0/physical_line_partition', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu1/cache/index0/shared_cpu_map', 0o644, b'02\n')
+f('sys/devices/system/cpu/cpu1/cache/index0/level', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu1/cache/index0/shared_cpu_list', 0o644, b'1\n')
+d('sys/devices/system/cpu/cpu1/cache/index2', 0o755)
+f('sys/devices/system/cpu/cpu1/cache/index2/ways_of_associativity', 0o644, b'16\n')
+f('sys/devices/system/cpu/cpu1/cache/index2/type', 0o644, b'Unified\n')
+f('sys/devices/system/cpu/cpu1/cache/index2/coherency_line_size', 0o644, b'64\n')
+f('sys/devices/system/cpu/cpu1/cache/index2/number_of_sets', 0o644, b'4096\n')
+f('sys/devices/system/cpu/cpu1/cache/index2/size', 0o644, b'4096K\n')
+f('sys/devices/system/cpu/cpu1/cache/index2/physical_line_partition', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu1/cache/index2/shared_cpu_map', 0o644, b'03\n')
+f('sys/devices/system/cpu/cpu1/cache/index2/level', 0o644, b'2\n')
+f('sys/devices/system/cpu/cpu1/cache/index2/shared_cpu_list', 0o644, b'0-1\n')
+d('sys/devices/system/cpu/cpu1/cache/index1', 0o755)
+f('sys/devices/system/cpu/cpu1/cache/index1/ways_of_associativity', 0o644, b'8\n')
+f('sys/devices/system/cpu/cpu1/cache/index1/type', 0o644, b'Instruction\n')
+f('sys/devices/system/cpu/cpu1/cache/index1/coherency_line_size', 0o644, b'64\n')
+f('sys/devices/system/cpu/cpu1/cache/index1/number_of_sets', 0o644, b'64\n')
+f('sys/devices/system/cpu/cpu1/cache/index1/size', 0o644, b'32K\n')
+f('sys/devices/system/cpu/cpu1/cache/index1/physical_line_partition', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu1/cache/index1/shared_cpu_map', 0o644, b'02\n')
+f('sys/devices/system/cpu/cpu1/cache/index1/level', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu1/cache/index1/shared_cpu_list', 0o644, b'1\n')
+d('sys/devices/system/cpu/cpu1/cpuidle', 0o755)
+d('sys/devices/system/cpu/cpu1/cpuidle/state2', 0o755)
+f('sys/devices/system/cpu/cpu1/cpuidle/state2/desc', 0o644, b'ACPI FFH INTEL MWAIT 0x10\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state2/power', 0o644, b'500\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state2/latency', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state2/usage', 0o644, b'271\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state2/name', 0o644, b'C2\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state2/time', 0o644, b'47233\n')
+d('sys/devices/system/cpu/cpu1/cpuidle/state3', 0o755)
+f('sys/devices/system/cpu/cpu1/cpuidle/state3/desc', 0o644, b'ACPI FFH INTEL MWAIT 0x30\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state3/power', 0o644, b'100\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state3/latency', 0o644, b'57\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state3/usage', 0o644, b'10601\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state3/name', 0o644, b'C3\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state3/time', 0o644, b'117038054\n')
+d('sys/devices/system/cpu/cpu1/cpuidle/state1', 0o755)
+f('sys/devices/system/cpu/cpu1/cpuidle/state1/desc', 0o644, b'ACPI FFH INTEL MWAIT 0x0\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state1/power', 0o644, b'1000\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state1/latency', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state1/usage', 0o644, b'1\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state1/name', 0o644, b'C1\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state1/time', 0o644, b'8\n')
+d('sys/devices/system/cpu/cpu1/cpuidle/state0', 0o755)
+f('sys/devices/system/cpu/cpu1/cpuidle/state0/desc', 0o644, b'<null>\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state0/power', 0o644, b'4294967295\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state0/latency', 0o644, b'0\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state0/usage', 0o644, b'0\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state0/name', 0o644, b'<null>\n')
+f('sys/devices/system/cpu/cpu1/cpuidle/state0/time', 0o644, b'0\n')
+d('sys/devices/system/cpu/cpu1/microcode', 0o755)
+f('sys/devices/system/cpu/cpu1/microcode/version', 0o644, b'0xc7\n')
+f('sys/devices/system/cpu/cpu1/microcode/processor_flags', 0o644, b'0x20\n')
+d('sys/devices/pnp0', 0o755)
+f('sys/devices/pnp0/uevent', 0o644, b'')
+d('sys/devices/pnp0/00:04', 0o755)
+l('sys/devices/pnp0/00:04/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0200:00')
+l('sys/devices/pnp0/00:04/subsystem', '../../../bus/pnp')
+f('sys/devices/pnp0/00:04/options', 0o644, b'')
+f('sys/devices/pnp0/00:04/id', 0o644, b'PNP0200\n')
+f('sys/devices/pnp0/00:04/resources', 0o644, b'''state = active
+io 0x0-0xf
+io 0x80-0x8f
+io 0xc0-0xdf
+dma 4
+''')
+f('sys/devices/pnp0/00:04/uevent', 0o644, b'')
+d('sys/devices/pnp0/00:04/power', 0o755)
+f('sys/devices/pnp0/00:04/power/wakeup', 0o644, b'\n')
+d('sys/devices/pnp0/00:0a', 0o755)
+l('sys/devices/pnp0/00:0a/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:01/ATM1200:00')
+l('sys/devices/pnp0/00:0a/subsystem', '../../../bus/pnp')
+f('sys/devices/pnp0/00:0a/options', 0o644, b'')
+f('sys/devices/pnp0/00:0a/id', 0o644, b'''ATM1200
+PNP0c31
+''')
+f('sys/devices/pnp0/00:0a/resources', 0o644, b'''state = active
+mem 0xfed40000-0xfed40fff
+''')
+f('sys/devices/pnp0/00:0a/uevent', 0o644, b'')
+d('sys/devices/pnp0/00:0a/power', 0o755)
+f('sys/devices/pnp0/00:0a/power/wakeup', 0o644, b'\n')
+d('sys/devices/pnp0/00:03', 0o755)
+l('sys/devices/pnp0/00:03/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0103:00')
+l('sys/devices/pnp0/00:03/subsystem', '../../../bus/pnp')
+f('sys/devices/pnp0/00:03/options', 0o644, b'')
+f('sys/devices/pnp0/00:03/id', 0o644, b'PNP0103\n')
+f('sys/devices/pnp0/00:03/resources', 0o644, b'''state = active
+mem 0xfed00000-0xfed003ff
+''')
+f('sys/devices/pnp0/00:03/uevent', 0o644, b'')
+d('sys/devices/pnp0/00:03/power', 0o755)
+f('sys/devices/pnp0/00:03/power/wakeup', 0o644, b'\n')
+d('sys/devices/pnp0/00:02', 0o755)
+l('sys/devices/pnp0/00:02/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C02:00')
+l('sys/devices/pnp0/00:02/subsystem', '../../../bus/pnp')
+l('sys/devices/pnp0/00:02/driver', '../../../bus/pnp/drivers/system')
+f('sys/devices/pnp0/00:02/options', 0o644, b'')
+f('sys/devices/pnp0/00:02/id', 0o644, b'PNP0c02\n')
+f('sys/devices/pnp0/00:02/resources', 0o644, b'''state = active
+io 0x10-0x1f
+io 0x90-0x9f
+io 0x24-0x25
+io 0x28-0x29
+io 0x2c-0x2d
+io 0x30-0x31
+io 0x34-0x35
+io 0x38-0x39
+io 0x3c-0x3d
+io 0xa4-0xa5
+io 0xa8-0xa9
+io 0xac-0xad
+io 0xb0-0xb5
+io 0xb8-0xb9
+io 0xbc-0xbd
+io 0x50-0x53
+io 0x72-0x77
+io 0x164e-0x164f
+io 0x2e-0x2f
+io 0x1000-0x107f
+io 0x1180-0x11bf
+io 0x800-0x80f
+io 0x15e0-0x15ef
+io 0x1600-0x165f
+mem 0xf0000000-0xf3ffffff
+mem 0xfed1c000-0xfed1ffff
+mem 0xfed14000-0xfed17fff
+mem 0xfed18000-0xfed18fff
+mem 0xfed19000-0xfed19fff
+''')
+f('sys/devices/pnp0/00:02/uevent', 0o644, b'DRIVER=system\n')
+d('sys/devices/pnp0/00:02/power', 0o755)
+f('sys/devices/pnp0/00:02/power/wakeup', 0o644, b'\n')
+d('sys/devices/pnp0/00:00', 0o755)
+l('sys/devices/pnp0/00:00/firmware_node', '../../LNXSYSTM:00/device:00/PNP0C01:00')
+l('sys/devices/pnp0/00:00/subsystem', '../../../bus/pnp')
+l('sys/devices/pnp0/00:00/driver', '../../../bus/pnp/drivers/system')
+f('sys/devices/pnp0/00:00/options', 0o644, b'')
+f('sys/devices/pnp0/00:00/id', 0o644, b'PNP0c01\n')
+f('sys/devices/pnp0/00:00/resources', 0o644, b'''state = active
+mem 0x0-0x9ffff
+mem 0xc0000-0xc3fff
+mem 0xc4000-0xc7fff
+mem 0xc8000-0xcbfff
+mem 0xcc000-0xcffff
+mem disabled
+mem disabled
+mem disabled
+mem 0xdc000-0xdffff
+mem 0xe0000-0xe3fff
+mem 0xe4000-0xe7fff
+mem 0xe8000-0xebfff
+mem 0xec000-0xeffff
+mem 0xf0000-0xfffff
+mem 0x100000-0x7fffffff
+mem 0xfec00000-0xfed3ffff
+mem 0xfed41000-0xffffffff
+''')
+f('sys/devices/pnp0/00:00/uevent', 0o644, b'DRIVER=system\n')
+d('sys/devices/pnp0/00:00/power', 0o755)
+f('sys/devices/pnp0/00:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pnp0/power', 0o755)
+f('sys/devices/pnp0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pnp0/00:09', 0o755)
+l('sys/devices/pnp0/00:09/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:01/IBM0057:00')
+l('sys/devices/pnp0/00:09/subsystem', '../../../bus/pnp')
+l('sys/devices/pnp0/00:09/driver', '../../../bus/pnp/drivers/i8042 aux')
+f('sys/devices/pnp0/00:09/options', 0o644, b'')
+f('sys/devices/pnp0/00:09/id', 0o644, b'''IBM0057
+PNP0f13
+''')
+f('sys/devices/pnp0/00:09/resources', 0o644, b'''state = active
+irq 12
+''')
+f('sys/devices/pnp0/00:09/uevent', 0o644, b'DRIVER=i8042 aux\n')
+d('sys/devices/pnp0/00:09/power', 0o755)
+f('sys/devices/pnp0/00:09/power/wakeup', 0o644, b'\n')
+d('sys/devices/pnp0/00:07', 0o755)
+l('sys/devices/pnp0/00:07/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0B00:00')
+l('sys/devices/pnp0/00:07/subsystem', '../../../bus/pnp')
+l('sys/devices/pnp0/00:07/driver', '../../../bus/pnp/drivers/rtc_cmos')
+f('sys/devices/pnp0/00:07/options', 0o644, b'')
+f('sys/devices/pnp0/00:07/id', 0o644, b'PNP0b00\n')
+f('sys/devices/pnp0/00:07/nvram', 0o644, b'\x00\x00\x00\x00\x00\x00\x03\x80\x02\x00\xfc\x01\x00\x03\x00\x9f\x16\x00\x00\x02\x00\x00\x00\x01\x05\x00\x00\x11\x11\x01\x00\x00\x02e\x00\xfc \x8c\xc1\x01\x00|\x00\x00\x00\x00\x00\x00\x00\x00\x08D\xb0\x11\x00c\x11T/\x06\xd00\x80\x00\x00\x00\x00\x00\xc0\x05R\xfc\x01\x1d\x00[\x0f\x02\x03\x00\x00\x04\x04\x00\xdf8\xd3\xa0\x13r\xf2\x06\x13\xf9\xa7\xf1\x0e\x00\xc5\xfe\x00\x00\xf1\xff\xff\xff\xff\x00\x00\x00IS\xb2\x00')
+f('sys/devices/pnp0/00:07/resources', 0o644, b'''state = active
+io 0x70-0x71
+irq 8
+''')
+f('sys/devices/pnp0/00:07/uevent', 0o644, b'DRIVER=rtc_cmos\n')
+d('sys/devices/pnp0/00:07/rtc', 0o755)
+d('sys/devices/pnp0/00:07/rtc/rtc0', 0o755)
+l('sys/devices/pnp0/00:07/rtc/rtc0/subsystem', '../../../../../class/rtc')
+l('sys/devices/pnp0/00:07/rtc/rtc0/device', '../../../00:07')
+f('sys/devices/pnp0/00:07/rtc/rtc0/date', 0o644, b'2008-09-29\n')
+f('sys/devices/pnp0/00:07/rtc/rtc0/dev', 0o644, b'253:0\n')
+f('sys/devices/pnp0/00:07/rtc/rtc0/max_user_freq', 0o644, b'64\n')
+f('sys/devices/pnp0/00:07/rtc/rtc0/wakealarm', 0o644, b'')
+f('sys/devices/pnp0/00:07/rtc/rtc0/since_epoch', 0o644, b'1222655451\n')
+f('sys/devices/pnp0/00:07/rtc/rtc0/name', 0o644, b'rtc_cmos\n')
+f('sys/devices/pnp0/00:07/rtc/rtc0/time', 0o644, b'02:30:51\n')
+f('sys/devices/pnp0/00:07/rtc/rtc0/uevent', 0o644, b'''MAJOR=253
+MINOR=0
+''')
+d('sys/devices/pnp0/00:07/rtc/rtc0/power', 0o755)
+f('sys/devices/pnp0/00:07/rtc/rtc0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pnp0/00:07/power', 0o755)
+f('sys/devices/pnp0/00:07/power/wakeup', 0o644, b'enabled\n')
+d('sys/devices/pnp0/00:06', 0o755)
+l('sys/devices/pnp0/00:06/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C04:00')
+l('sys/devices/pnp0/00:06/subsystem', '../../../bus/pnp')
+f('sys/devices/pnp0/00:06/options', 0o644, b'')
+f('sys/devices/pnp0/00:06/id', 0o644, b'PNP0c04\n')
+f('sys/devices/pnp0/00:06/resources', 0o644, b'''state = active
+io 0xf0-0xf0
+irq 13
+''')
+f('sys/devices/pnp0/00:06/uevent', 0o644, b'')
+d('sys/devices/pnp0/00:06/power', 0o755)
+f('sys/devices/pnp0/00:06/power/wakeup', 0o644, b'\n')
+d('sys/devices/pnp0/00:08', 0o755)
+l('sys/devices/pnp0/00:08/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0303:00')
+l('sys/devices/pnp0/00:08/subsystem', '../../../bus/pnp')
+l('sys/devices/pnp0/00:08/driver', '../../../bus/pnp/drivers/i8042 kbd')
+f('sys/devices/pnp0/00:08/options', 0o644, b'')
+f('sys/devices/pnp0/00:08/id', 0o644, b'PNP0303\n')
+f('sys/devices/pnp0/00:08/resources', 0o644, b'''state = active
+io 0x60-0x60
+io 0x64-0x64
+irq 1
+''')
+f('sys/devices/pnp0/00:08/uevent', 0o644, b'DRIVER=i8042 kbd\n')
+d('sys/devices/pnp0/00:08/power', 0o755)
+f('sys/devices/pnp0/00:08/power/wakeup', 0o644, b'\n')
+d('sys/devices/pnp0/00:05', 0o755)
+l('sys/devices/pnp0/00:05/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0800:00')
+l('sys/devices/pnp0/00:05/subsystem', '../../../bus/pnp')
+f('sys/devices/pnp0/00:05/options', 0o644, b'')
+f('sys/devices/pnp0/00:05/id', 0o644, b'PNP0800\n')
+f('sys/devices/pnp0/00:05/resources', 0o644, b'''state = active
+io 0x61-0x61
+''')
+f('sys/devices/pnp0/00:05/uevent', 0o644, b'')
+d('sys/devices/pnp0/00:05/power', 0o755)
+f('sys/devices/pnp0/00:05/power/wakeup', 0o644, b'\n')
+d('sys/devices/pnp0/00:01', 0o755)
+l('sys/devices/pnp0/00:01/subsystem', '../../../bus/pnp')
+f('sys/devices/pnp0/00:01/options', 0o644, b'')
+f('sys/devices/pnp0/00:01/id', 0o644, b'''PNP0a08
+PNP0a03
+''')
+f('sys/devices/pnp0/00:01/resources', 0o644, b'''state = active
+io 0xcf8-0xcff
+''')
+f('sys/devices/pnp0/00:01/uevent', 0o644, b'')
+d('sys/devices/pnp0/00:01/power', 0o755)
+f('sys/devices/pnp0/00:01/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00', 0o755)
+l('sys/devices/pci0000:00/firmware_node', '../LNXSYSTM:00/device:00/PNP0A08:00')
+f('sys/devices/pci0000:00/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1d.3', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:20')
+l('sys/devices/pci0000:00/0000:00:1d.3/subsystem', '../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:1d.3/driver', '../../../bus/pci/drivers/uhci_hcd')
+f('sys/devices/pci0000:00/0000:00:1d.3/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/enable', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/modalias', 0o644, b'pci:v00008086d000027CBsv000017AAsd0000200Abc0Csc03i00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/resource', 0o644, b'''0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000001860 0x000000000000187f 0x0000000000020101
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/config', 0o644, b"\x86\x80\xcb'\x05\x00\x80\x02\x02\x00\x03\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00a\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x17\n \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x0f\x02\x00\x00\x00\x00\x00")
+f('sys/devices/pci0000:00/0000:00:1d.3/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/subsystem_device', 0o644, b'0x200a\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/irq', 0o644, b'19\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/pools', 0o644, b'''poolinfo - 0.1
+uhci_qh            13   32  128  1
+uhci_td             3   64   64  1
+buffer-2048         0    0 2048  0
+buffer-512          0    0  512  0
+buffer-128          0    0  128  0
+buffer-32           1  128   32  1
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/device', 0o644, b'0x27cb\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/class', 0o644, b'0x0c0300\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/msi_bus', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.3/subsystem_vendor', 0o644, b'0x17aa\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/uevent', 0o644, b'''DRIVER=uhci_hcd
+PCI_CLASS=C0300
+PCI_ID=8086:27CB
+PCI_SUBSYS_ID=17AA:200A
+PCI_SLOT_NAME=0000:00:1d.3
+MODALIAS=pci:v00008086d000027CBsv000017AAsd0000200Abc0Csc03i00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/resource4', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.3/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb_host', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.3/usb_host/usb_host4', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb_host/usb_host4/subsystem', '../../../../../class/usb_host')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb_host/usb_host4/device', '../../../0000:00:1d.3')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb_host/usb_host4/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb_host/usb_host4/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb_host/usb_host4/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/subsystem', '../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/driver', '../../../../bus/usb/drivers/usb')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/ep_00', 'usb_endpoint/usbdev4.1_ep00')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/version', 0o644, b' 1.10\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/authorized_default', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/maxchild', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/bDeviceClass', 0o644, b'09\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/bcdDevice', 0o644, b'0206\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/devnum', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/bDeviceProtocol', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/idProduct', 0o644, b'0001\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/product', 0o644, b'UHCI Host Controller\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/bDeviceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/configuration', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/dev', 0o644, b'189:384\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/urbnum', 0o644, b'62\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/authorized', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/descriptors', 0o644, b'\x12\x01\x10\x01\t\x00\x00@k\x1d\x01\x00\x06\x02\x03\x02\x01\x01\t\x02\x19\x00\x01\x01\x00\xe0\x00\t\x04\x00\x00\x01\t\x00\x00\x00\x07\x05\x81\x03\x02\x00\xff')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/bNumConfigurations', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/serial', 0o644, b'0000:00:1d.3\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/speed', 0o644, b'12\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/bMaxPacketSize0', 0o644, b'64\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/bmAttributes', 0o644, b'e0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/busnum', 0o644, b'4\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/quirks', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/bConfigurationValue', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/uevent', 0o644, b'''MAJOR=189
+MINOR=384
+DEVTYPE=usb_device
+DRIVER=usb
+PRODUCT=1d6b/1/206
+TYPE=9/0/0
+BUSNUM=004
+DEVNUM=001
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/manufacturer', 0o644, b'Linux 2.6.27-rc7-00106-g6ef190c-dirty uhci_hcd\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/idVendor', 0o644, b'1d6b\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/bNumInterfaces', 0o644, b' 1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/bMaxPower', 0o644, b'  0mA\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00/subsystem', '../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00/device', '../../../usb4')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00/bEndpointAddress', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00/type', 0o644, b'Control\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00/dev', 0o644, b'252:7\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00/direction', 0o644, b'both\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00/wMaxPacketSize', 0o644, b'0040\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00/bmAttributes', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00/uevent', 0o644, b'''MAJOR=252
+MINOR=7
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00/bInterval', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/usb_endpoint/usbdev4.1_ep00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/subsystem', '../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/driver', '../../../../../bus/usb/drivers/usb')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/ep_00', 'usb_endpoint/usbdev4.3_ep00')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/version', 0o644, b' 1.00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/maxchild', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/bDeviceClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/bcdDevice', 0o644, b'0001\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/devnum', 0o644, b'3\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/bDeviceProtocol', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/idProduct', 0o644, b'2016\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/product', 0o644, b'Biometric Coprocessor\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/bDeviceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/configuration', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/dev', 0o644, b'189:386\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/urbnum', 0o644, b'9\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/authorized', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/descriptors', 0o644, b"\x12\x01\x00\x01\x00\x00\x00\x08\x83\x04\x16 \x01\x00\x01\x02\x00\x01\t\x02'\x00\x01\x01\x00\xa02\t\x04\x00\x00\x03\xff\x00\x00\x00\x07\x05\x81\x02@\x00\x00\x07\x05\x02\x02@\x00\x00\x07\x05\x83\x03\x04\x00\x14")
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/bNumConfigurations', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/speed', 0o644, b'12\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/bMaxPacketSize0', 0o644, b'8\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/bmAttributes', 0o644, b'a0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/busnum', 0o644, b'4\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/quirks', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/bConfigurationValue', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/uevent', 0o644, b'''MAJOR=189
+MINOR=386
+DEVTYPE=usb_device
+DRIVER=usb
+PRODUCT=483/2016/1
+TYPE=0/0/0
+BUSNUM=004
+DEVNUM=003
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/manufacturer', 0o644, b'STMicroelectronics\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/idVendor', 0o644, b'0483\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/bNumInterfaces', 0o644, b' 1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/bMaxPower', 0o644, b'100mA\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00/subsystem', '../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00/device', '../../../4-2')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00/bEndpointAddress', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00/type', 0o644, b'Control\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00/dev', 0o644, b'252:23\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00/direction', 0o644, b'both\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00/wMaxPacketSize', 0o644, b'0008\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00/bmAttributes', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00/uevent', 0o644, b'''MAJOR=252
+MINOR=23
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00/bInterval', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/usb_endpoint/usbdev4.3_ep00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/power/active_duration', 0o644, b'8370363\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/power/wakeup', 0o644, b'enabled\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/power/connected_duration', 0o644, b'8370362\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/power/autosuspend', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/power/persist', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/power/level', 0o644, b'on\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/subsystem', '../../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/ep_83', 'usb_endpoint/usbdev4.3_ep83')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/ep_81', 'usb_endpoint/usbdev4.3_ep81')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/ep_02', 'usb_endpoint/usbdev4.3_ep02')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/modalias', 0o644, b'usb:v0483p2016d0001dc00dsc00dp00icFFisc00ip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/bInterfaceNumber', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/bNumEndpoints', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/bInterfaceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/bInterfaceClass', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=483/2016/1
+TYPE=0/0/0
+INTERFACE=255/0/0
+MODALIAS=usb:v0483p2016d0001dc00dsc00dp00icFFisc00ip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83/device', '../../../4-2:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83/interval', 0o644, b'20ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83/bEndpointAddress', 0o644, b'83\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83/type', 0o644, b'Interrupt\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83/dev', 0o644, b'252:22\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83/wMaxPacketSize', 0o644, b'0004\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83/bmAttributes', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83/uevent', 0o644, b'''MAJOR=252
+MINOR=22
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83/bInterval', 0o644, b'14\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep83/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81/device', '../../../4-2:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81/bEndpointAddress', 0o644, b'81\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81/type', 0o644, b'Bulk\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81/dev', 0o644, b'252:20\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81/wMaxPacketSize', 0o644, b'0040\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81/bmAttributes', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81/uevent', 0o644, b'''MAJOR=252
+MINOR=20
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81/bInterval', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep81/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02/device', '../../../4-2:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02/bEndpointAddress', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02/type', 0o644, b'Bulk\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02/dev', 0o644, b'252:21\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02/direction', 0o644, b'out\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02/wMaxPacketSize', 0o644, b'0040\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02/bmAttributes', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02/uevent', 0o644, b'''MAJOR=252
+MINOR=21
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02/bInterval', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/usb_endpoint/usbdev4.3_ep02/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-2/4-2:1.0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/subsystem', '../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/ep_81', 'usb_endpoint/usbdev4.1_ep81')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/driver', '../../../../../bus/usb/drivers/hub')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/modalias', 0o644, b'usb:v1D6Bp0001d0206dc09dsc00dp00ic09isc00ip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/bInterfaceNumber', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/bNumEndpoints', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/bInterfaceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/bInterfaceClass', 0o644, b'09\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/uevent', 0o644, b'''DEVTYPE=usb_interface
+DRIVER=hub
+PRODUCT=1d6b/1/206
+TYPE=9/0/0
+INTERFACE=9/0/0
+MODALIAS=usb:v1D6Bp0001d0206dc09dsc00dp00ic09isc00ip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81/subsystem', '../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81/device', '../../../4-0:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81/interval', 0o644, b'255ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81/bEndpointAddress', 0o644, b'81\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81/type', 0o644, b'Interrupt\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81/dev', 0o644, b'252:6\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81/wMaxPacketSize', 0o644, b'0002\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81/bmAttributes', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81/uevent', 0o644, b'''MAJOR=252
+MINOR=6
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81/bInterval', 0o644, b'ff\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/usb_endpoint/usbdev4.1_ep81/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-0:1.0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/power/active_duration', 0o644, b'8372033\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/power/wakeup', 0o644, b'enabled\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/power/connected_duration', 0o644, b'8372033\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/power/autosuspend', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/power/level', 0o644, b'auto\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/subsystem', '../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/driver', '../../../../../bus/usb/drivers/usb')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/ep_00', 'usb_endpoint/usbdev4.2_ep00')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/version', 0o644, b' 2.00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/maxchild', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/bDeviceClass', 0o644, b'e0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/bcdDevice', 0o644, b'0100\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/devnum', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/bDeviceProtocol', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/idProduct', 0o644, b'2110\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/product', 0o644, b'BCM2045B\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/bDeviceSubClass', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/configuration', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/dev', 0o644, b'189:385\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/urbnum', 0o644, b'12\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/authorized', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/descriptors', 0o644, b'\x12\x01\x00\x02\xe0\x01\x01@\\\n\x10!\x00\x01\x01\x02\x00\x01\t\x02\xd8\x00\x04\x01\x00\xe0\x00\t\x04\x00\x00\x03\xe0\x01\x01\x00\x07\x05\x81\x03\x10\x00\x01\x07\x05\x82\x02@\x00\x01\x07\x05\x02\x02@\x00\x01\t\x04\x01\x00\x02\xe0\x01\x01\x00\x07\x05\x83\x01\x00\x00\x01\x07\x05\x03\x01\x00\x00\x01\t\x04\x01\x01\x02\xe0\x01\x01\x00\x07\x05\x83\x01\t\x00\x01\x07\x05\x03\x01\t\x00\x01\t\x04\x01\x02\x02\xe0\x01\x01\x00\x07\x05\x83\x01\x11\x00\x01\x07\x05\x03\x01\x11\x00\x01\t\x04\x01\x03\x02\xe0\x01\x01\x00\x07\x05\x83\x01 \x00\x01\x07\x05\x03\x01 \x00\x01\t\x04\x01\x04\x02\xe0\x01\x01\x00\x07\x05\x83\x01@\x00\x01\x07\x05\x03\x01@\x00\x01\t\x04\x01\x05\x02\xe0\x01\x01\x00\x07\x05\x83\x01@\x00\x01\x07\x05\x03\x01@\x00\x01\t\x04\x02\x00\x02\xff\xff\xff\x00\x07\x05\x84\x02 \x00\x01\x07\x05\x04\x02 \x00\x01\t\x04\x03\x00\x00\xfe\x01\x00\x00\x07!\x07\x88\x13@\x00')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/bNumConfigurations', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/speed', 0o644, b'12\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/bMaxPacketSize0', 0o644, b'64\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/bmAttributes', 0o644, b'e0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/busnum', 0o644, b'4\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/quirks', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/bConfigurationValue', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/uevent', 0o644, b'''MAJOR=189
+MINOR=385
+DEVTYPE=usb_device
+DRIVER=usb
+PRODUCT=a5c/2110/100
+TYPE=224/1/1
+BUSNUM=004
+DEVNUM=002
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/manufacturer', 0o644, b'Broadcom Corp\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/idVendor', 0o644, b'0a5c\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/bNumInterfaces', 0o644, b' 4\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/bMaxPower', 0o644, b'  0mA\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.3', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.3/subsystem', '../../../../../../bus/usb')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.3/modalias', 0o644, b'usb:v0A5Cp2110d0100dcE0dsc01dp01icFEisc01ip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.3/bInterfaceNumber', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.3/bNumEndpoints', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.3/bInterfaceSubClass', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.3/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.3/bInterfaceClass', 0o644, b'fe\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.3/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=a5c/2110/100
+TYPE=224/1/1
+INTERFACE=254/1/0
+MODALIAS=usb:v0A5Cp2110d0100dcE0dsc01dp01icFEisc01ip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.3/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.3/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.3/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00/subsystem', '../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00/device', '../../../4-1')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00/bEndpointAddress', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00/type', 0o644, b'Control\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00/dev', 0o644, b'252:19\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00/direction', 0o644, b'both\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00/wMaxPacketSize', 0o644, b'0040\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00/bmAttributes', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00/uevent', 0o644, b'''MAJOR=252
+MINOR=19
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00/bInterval', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/usb_endpoint/usbdev4.2_ep00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/subsystem', '../../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/ep_81', 'usb_endpoint/usbdev4.2_ep81')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/ep_02', 'usb_endpoint/usbdev4.2_ep02')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/ep_82', 'usb_endpoint/usbdev4.2_ep82')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/modalias', 0o644, b'usb:v0A5Cp2110d0100dcE0dsc01dp01icE0isc01ip01\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/bInterfaceNumber', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/bNumEndpoints', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/bInterfaceSubClass', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/bInterfaceClass', 0o644, b'e0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=a5c/2110/100
+TYPE=224/1/1
+INTERFACE=224/1/1
+MODALIAS=usb:v0A5Cp2110d0100dcE0dsc01dp01icE0isc01ip01
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/bInterfaceProtocol', 0o644, b'01\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02/device', '../../../4-1:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02/bEndpointAddress', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02/type', 0o644, b'Bulk\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02/dev', 0o644, b'252:14\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02/direction', 0o644, b'out\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02/wMaxPacketSize', 0o644, b'0040\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02/bmAttributes', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02/uevent', 0o644, b'''MAJOR=252
+MINOR=14
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02/bInterval', 0o644, b'01\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep02/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82/device', '../../../4-1:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82/bEndpointAddress', 0o644, b'82\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82/type', 0o644, b'Bulk\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82/dev', 0o644, b'252:13\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82/wMaxPacketSize', 0o644, b'0040\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82/bmAttributes', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82/uevent', 0o644, b'''MAJOR=252
+MINOR=13
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82/bInterval', 0o644, b'01\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep82/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81/device', '../../../4-1:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81/interval', 0o644, b'1ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81/bEndpointAddress', 0o644, b'81\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81/type', 0o644, b'Interrupt\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81/dev', 0o644, b'252:12\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81/wMaxPacketSize', 0o644, b'0010\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81/bmAttributes', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81/uevent', 0o644, b'''MAJOR=252
+MINOR=12
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81/bInterval', 0o644, b'01\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/usb_endpoint/usbdev4.2_ep81/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/power/active_duration', 0o644, b'8370651\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/power/wakeup', 0o644, b'enabled\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/power/connected_duration', 0o644, b'8370650\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/power/autosuspend', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/power/persist', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/power/level', 0o644, b'on\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/subsystem', '../../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/ep_84', 'usb_endpoint/usbdev4.2_ep84')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/ep_04', 'usb_endpoint/usbdev4.2_ep04')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/modalias', 0o644, b'usb:v0A5Cp2110d0100dcE0dsc01dp01icFFiscFFipFF\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/bInterfaceNumber', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/bNumEndpoints', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/bInterfaceSubClass', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/bInterfaceClass', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=a5c/2110/100
+TYPE=224/1/1
+INTERFACE=255/255/255
+MODALIAS=usb:v0A5Cp2110d0100dcE0dsc01dp01icFFiscFFipFF
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/bInterfaceProtocol', 0o644, b'ff\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04/device', '../../../4-1:1.2')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04/bEndpointAddress', 0o644, b'04\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04/type', 0o644, b'Bulk\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04/dev', 0o644, b'252:18\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04/direction', 0o644, b'out\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04/wMaxPacketSize', 0o644, b'0020\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04/bmAttributes', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04/uevent', 0o644, b'''MAJOR=252
+MINOR=18
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04/bInterval', 0o644, b'01\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep04/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84/device', '../../../4-1:1.2')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84/bEndpointAddress', 0o644, b'84\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84/type', 0o644, b'Bulk\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84/dev', 0o644, b'252:17\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84/wMaxPacketSize', 0o644, b'0020\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84/bmAttributes', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84/uevent', 0o644, b'''MAJOR=252
+MINOR=17
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84/bInterval', 0o644, b'01\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/usb_endpoint/usbdev4.2_ep84/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.2/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/subsystem', '../../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/ep_83', 'usb_endpoint/usbdev4.2_ep83')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/ep_03', 'usb_endpoint/usbdev4.2_ep03')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/modalias', 0o644, b'usb:v0A5Cp2110d0100dcE0dsc01dp01icE0isc01ip01\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/bInterfaceNumber', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/bNumEndpoints', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/bInterfaceSubClass', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/bInterfaceClass', 0o644, b'e0\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=a5c/2110/100
+TYPE=224/1/1
+INTERFACE=224/1/1
+MODALIAS=usb:v0A5Cp2110d0100dcE0dsc01dp01icE0isc01ip01
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/bInterfaceProtocol', 0o644, b'01\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03/device', '../../../4-1:1.1')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03/interval', 0o644, b'1ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03/bEndpointAddress', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03/type', 0o644, b'Isoc\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03/dev', 0o644, b'252:16\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03/direction', 0o644, b'out\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03/wMaxPacketSize', 0o644, b'0000\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03/bmAttributes', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03/uevent', 0o644, b'''MAJOR=252
+MINOR=16
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03/bInterval', 0o644, b'01\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep03/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83/device', '../../../4-1:1.1')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83/interval', 0o644, b'1ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83/bEndpointAddress', 0o644, b'83\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83/type', 0o644, b'Isoc\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83/dev', 0o644, b'252:15\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83/wMaxPacketSize', 0o644, b'0000\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83/bmAttributes', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83/uevent', 0o644, b'''MAJOR=252
+MINOR=15
+''')
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83/bInterval', 0o644, b'01\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/usb_endpoint/usbdev4.2_ep83/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.3/usb4/4-1/4-1:1.1/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.2', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.2/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:0d')
+l('sys/devices/pci0000:00/0000:00:1c.2/subsystem', '../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:1c.2/driver', '../../../bus/pci/drivers/pcieport-driver')
+f('sys/devices/pci0000:00/0000:00:1c.2/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1c.2/enable', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1c.2/modalias', 0o644, b'pci:v00008086d000027D4sv00000000sd00000000bc06sc04i00\n')
+f('sys/devices/pci0000:00/0000:00:1c.2/resource', 0o644, b'''0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000006000 0x0000000000007fff 0x0000000000000100
+0x00000000e8000000 0x00000000e9ffffff 0x0000000000000200
+0x00000000e4100000 0x00000000e41fffff 0x0000000000001201
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1c.2/config', 0o644, b"\x86\x80\xd4'\x07\x05\x10\x00\x02\x00\x04\x06\x10\x00\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x0b\x00`p\x00\x00\x00\xe8\xf0\xe9\x11\xe4\x11\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x0b\x03\x04\x00\x10\x80A\x01\xc0\x0f\x00\x00\x00\x00\x10\x00\x11L\x11\x03\x00\x00\x01\x10\xe0\xa0 \x00(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x90\x01\x00\x0c0\xe0\xfe\x89A\x00\x00\x00\x00\x00\x00\r\xa0\x00\x00\xaa\x17\x11 \x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x11\xc0\x00\x00\x00\x00\x00\x00\xc7\x00\x06\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x0f\x02\x00\x00\x00\x00\x00\x02\x00\x01\x18\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\xff\x00\x00\x80\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x11\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x01\x00\x00\x01\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x00\x00\x00\x00\x01\xc0\xd1\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07`\x00`\x00\x00\x00\x00`\x02\x00\x00\x0c\x00\x06\x00\x00\x00\x00\x00[`\xc9\xc0\x00p&u\x00\x10\x00\x00\xff\x0f\x00\x00\x16\x00\x00\x14\xb5\xbcJ\xbc\x0b*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x10\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
+f('sys/devices/pci0000:00/0000:00:1c.2/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1c.2/subsystem_device', 0o644, b'0x0000\n')
+f('sys/devices/pci0000:00/0000:00:1c.2/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1c.2/irq', 0o644, b'508\n')
+f('sys/devices/pci0000:00/0000:00:1c.2/device', 0o644, b'0x27d4\n')
+f('sys/devices/pci0000:00/0000:00:1c.2/class', 0o644, b'0x060400\n')
+f('sys/devices/pci0000:00/0000:00:1c.2/msi_bus', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1c.2/subsystem_vendor', 0o644, b'0x0000\n')
+f('sys/devices/pci0000:00/0000:00:1c.2/uevent', 0o644, b'''DRIVER=pcieport-driver
+PCI_CLASS=60400
+PCI_ID=8086:27D4
+PCI_SUBSYS_ID=0000:0000
+PCI_SLOT_NAME=0000:00:1c.2
+MODALIAS=pci:v00008086d000027D4sv00000000sd00000000bc06sc04i00
+''')
+f('sys/devices/pci0000:00/0000:00:1c.2/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie02', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie02/subsystem', '../../../../bus/pci_express')
+f('sys/devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie02/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie02/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie02/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie00', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie00/subsystem', '../../../../bus/pci_express')
+f('sys/devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie00/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie00/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.2/pci_bus', 0o755)
+d('sys/devices/pci0000:00/0000:00:1c.2/pci_bus/0000:04', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.2/pci_bus/0000:04/subsystem', '../../../../../class/pci_bus')
+l('sys/devices/pci0000:00/0000:00:1c.2/pci_bus/0000:04/device', '../../../0000:00:1c.2')
+f('sys/devices/pci0000:00/0000:00:1c.2/pci_bus/0000:04/cpuaffinity', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1c.2/pci_bus/0000:04/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.2/pci_bus/0000:04/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.2/pci_bus/0000:04/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.2/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.2/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie03', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie03/subsystem', '../../../../bus/pci_express')
+f('sys/devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie03/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie03/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.2/0000:00:1c.2:pcie03/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1b.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1b.0/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:25')
+l('sys/devices/pci0000:00/0000:00:1b.0/subsystem', '../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:1b.0/driver', '../../../bus/pci/drivers/HDA Intel')
+f('sys/devices/pci0000:00/0000:00:1b.0/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/enable', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/modalias', 0o644, b'pci:v00008086d000027D8sv000017AAsd00002010bc04sc03i00\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/resource', 0o644, b'''0x00000000ee400000 0x00000000ee403fff 0x0000000000020204
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1b.0/config', 0o644, b"\x86\x80\xd8'\x06\x01\x10\x00\x02\x00\x03\x04\x10\x00\x00\x00\x04\x00@\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x17\x10 \x00\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x0b\x02\x00\x00\x03\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x01`B\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05p\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x91\x00\x00\x00\x00\x00\x00\x08\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x0f\x02\x00\x00\x00\x00\x00\x02\x00\x01\x13\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x01\x00\x00\x01\x02\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\xc0\xd1\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
+f('sys/devices/pci0000:00/0000:00:1b.0/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/subsystem_device', 0o644, b'0x2010\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/irq', 0o644, b'17\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/device', 0o644, b'0x27d8\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/class', 0o644, b'0x040300\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/msi_bus', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1b.0/resource0', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1b.0/subsystem_vendor', 0o644, b'0x17aa\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/uevent', 0o644, b'''DRIVER=HDA Intel
+PCI_CLASS=40300
+PCI_ID=8086:27D8
+PCI_SUBSYS_ID=17AA:2010
+PCI_SLOT_NAME=0000:00:1b.0
+MODALIAS=pci:v00008086d000027D8sv000017AAsd00002010bc04sc03i00
+''')
+f('sys/devices/pci0000:00/0000:00:1b.0/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1b.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1b.0/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound', 0o755)
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/subsystem', '../../../../../class/sound')
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/device', '../../../0000:00:1b.0')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/audio', 0o755)
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/audio/subsystem', '../../../../../../class/sound')
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/audio/device', '../../card0')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/audio/dev', 0o644, b'14:4\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/audio/uevent', 0o644, b'''MAJOR=14
+MINOR=4
+''')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/audio/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/audio/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/dsp', 0o755)
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/dsp/subsystem', '../../../../../../class/sound')
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/dsp/device', '../../card0')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/dsp/dev', 0o644, b'14:3\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/dsp/uevent', 0o644, b'''MAJOR=14
+MINOR=3
+''')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/dsp/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/dsp/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/mixer', 0o755)
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/mixer/subsystem', '../../../../../../class/sound')
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/mixer/device', '../../card0')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/mixer/dev', 0o644, b'14:0\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/mixer/uevent', 0o644, b'''MAJOR=14
+MINOR=0
+''')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/mixer/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/mixer/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0p', 0o755)
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0p/subsystem', '../../../../../../class/sound')
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0p/device', '../../card0')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0p/pcm_class', 0o644, b'generic\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0p/dev', 0o644, b'116:16\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0p/uevent', 0o644, b'''MAJOR=116
+MINOR=16
+''')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0p/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0p/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/controlC0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/controlC0/subsystem', '../../../../../../class/sound')
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/controlC0/device', '../../card0')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/controlC0/dev', 0o644, b'116:0\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/controlC0/uevent', 0o644, b'''MAJOR=116
+MINOR=0
+''')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/controlC0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/controlC0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0c', 0o755)
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0c/subsystem', '../../../../../../class/sound')
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0c/device', '../../card0')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0c/pcm_class', 0o644, b'generic\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0c/dev', 0o644, b'116:24\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0c/uevent', 0o644, b'''MAJOR=116
+MINOR=24
+''')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0c/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D0c/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/adsp', 0o755)
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/adsp/subsystem', '../../../../../../class/sound')
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/adsp/device', '../../card0')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/adsp/dev', 0o644, b'14:12\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/adsp/uevent', 0o644, b'''MAJOR=14
+MINOR=12
+''')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/adsp/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/adsp/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D1p', 0o755)
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D1p/subsystem', '../../../../../../class/sound')
+l('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D1p/device', '../../card0')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D1p/pcm_class', 0o644, b'generic\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D1p/dev', 0o644, b'116:17\n')
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D1p/uevent', 0o644, b'''MAJOR=116
+MINOR=17
+''')
+d('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D1p/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1b.0/sound/card0/pcmC0D1p/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/pci_bus', 0o755)
+d('sys/devices/pci0000:00/pci_bus/0000:00', 0o755)
+l('sys/devices/pci0000:00/pci_bus/0000:00/subsystem', '../../../../class/pci_bus')
+l('sys/devices/pci0000:00/pci_bus/0000:00/device', '../../../pci0000:00')
+f('sys/devices/pci0000:00/pci_bus/0000:00/cpuaffinity', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/pci_bus/0000:00/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/pci_bus/0000:00/power', 0o755)
+f('sys/devices/pci0000:00/pci_bus/0000:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/power', 0o755)
+f('sys/devices/pci0000:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:21')
+l('sys/devices/pci0000:00/0000:00:1d.7/subsystem', '../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:1d.7/driver', '../../../bus/pci/drivers/ehci_hcd')
+f('sys/devices/pci0000:00/0000:00:1d.7/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/enable', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/modalias', 0o644, b'pci:v00008086d000027CCsv000017AAsd0000200Bbc0Csc03i20\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/resource', 0o644, b'''0x00000000ee404000 0x00000000ee4043ff 0x0000000000020200
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/config', 0o644, b"\x86\x80\xcc'\x06\x01\x90\x02\x02 \x03\x0c\x00\x00\x00\x00\x00@@\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x17\x0b \x00\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x0b\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01X\xc2\xc9\x00\x80\x00\x00\n\x00\xa0 \x00\x00\x00\x00  \x9f\x01\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x08\x80\x00\x00\xd7?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\xff\x00\xff\x00\xff\x00 \x00\x00\x88\x00\x00\x00\x00\xdb\xb6m\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\t\x88\x85@\x00\x86\x0f\x02\x00\x06\x17\x02 ")
+f('sys/devices/pci0000:00/0000:00:1d.7/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/subsystem_device', 0o644, b'0x200b\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/irq', 0o644, b'19\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/pools', 0o644, b'''poolinfo - 0.1
+ehci_sitd           0    0   96  0
+ehci_itd            0    0  192  0
+ehci_qh             5   25  160  1
+ehci_qtd            5   42   96  1
+buffer-2048        16   32 2048 16
+buffer-512          0    0  512  0
+buffer-128          2   32  128  1
+buffer-32           2  128   32  1
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/device', 0o644, b'0x27cc\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/class', 0o644, b'0x0c0320\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/msi_bus', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.7/resource0', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.7/subsystem_vendor', 0o644, b'0x17aa\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/uevent', 0o644, b'''DRIVER=ehci_hcd
+PCI_CLASS=C0320
+PCI_ID=8086:27CC
+PCI_SUBSYS_ID=17AA:200B
+PCI_SLOT_NAME=0000:00:1d.7
+MODALIAS=pci:v00008086d000027CCsv000017AAsd0000200Bbc0Csc03i20
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/subsystem', '../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/driver', '../../../../bus/usb/drivers/usb')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/ep_00', 'usb_endpoint/usbdev5.1_ep00')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/version', 0o644, b' 2.00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/authorized_default', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/maxchild', 0o644, b'8\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/bDeviceClass', 0o644, b'09\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/bcdDevice', 0o644, b'0206\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/devnum', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/bDeviceProtocol', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/idProduct', 0o644, b'0002\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/product', 0o644, b'EHCI Host Controller\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/bDeviceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/configuration', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/dev', 0o644, b'189:512\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/urbnum', 0o644, b'151\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/authorized', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/descriptors', 0o644, b'\x12\x01\x00\x02\t\x00\x00@k\x1d\x02\x00\x06\x02\x03\x02\x01\x01\t\x02\x19\x00\x01\x01\x00\xe0\x00\t\x04\x00\x00\x01\t\x00\x00\x00\x07\x05\x81\x03\x04\x00\x0c')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/bNumConfigurations', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/serial', 0o644, b'0000:00:1d.7\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/speed', 0o644, b'480\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/bMaxPacketSize0', 0o644, b'64\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/bmAttributes', 0o644, b'e0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/busnum', 0o644, b'5\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/quirks', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/bConfigurationValue', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/uevent', 0o644, b'''MAJOR=189
+MINOR=512
+DEVTYPE=usb_device
+DRIVER=usb
+PRODUCT=1d6b/2/206
+TYPE=9/0/0
+BUSNUM=005
+DEVNUM=001
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/manufacturer', 0o644, b'Linux 2.6.27-rc7-00106-g6ef190c-dirty ehci_hcd\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/idVendor', 0o644, b'1d6b\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/bNumInterfaces', 0o644, b' 1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/bMaxPower', 0o644, b'  0mA\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00/subsystem', '../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00/device', '../../../usb5')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00/bEndpointAddress', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00/type', 0o644, b'Control\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00/dev', 0o644, b'252:9\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00/direction', 0o644, b'both\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00/wMaxPacketSize', 0o644, b'0040\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00/bmAttributes', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00/uevent', 0o644, b'''MAJOR=252
+MINOR=9
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00/bInterval', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/usb_endpoint/usbdev5.1_ep00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/subsystem', '../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/driver', '../../../../../bus/usb/drivers/usb')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/ep_00', 'usb_endpoint/usbdev5.7_ep00')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/version', 0o644, b' 2.00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/maxchild', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/bDeviceClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/bcdDevice', 0o644, b'0100\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/devnum', 0o644, b'7\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/bDeviceProtocol', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/idProduct', 0o644, b'8012\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/product', 0o644, b'Flash Disk\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/bDeviceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/configuration', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/dev', 0o644, b'189:518\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/urbnum', 0o644, b'743\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/authorized', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/descriptors', 0o644, b'\x12\x01\x00\x02\x00\x00\x00@C\x10\x12\x80\x00\x01\x01\x02\x00\x01\t\x02 \x00\x01\x01\x00\x802\t\x04\x00\x00\x02\x08\x06P\x00\x07\x05\x81\x02\x00\x02\x00\x07\x05\x02\x02\x00\x02\x00')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/bNumConfigurations', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/speed', 0o644, b'480\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/bMaxPacketSize0', 0o644, b'64\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/bmAttributes', 0o644, b'80\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/busnum', 0o644, b'5\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/quirks', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/bConfigurationValue', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/uevent', 0o644, b'''MAJOR=189
+MINOR=518
+DEVTYPE=usb_device
+DRIVER=usb
+PRODUCT=1043/8012/100
+TYPE=0/0/0
+BUSNUM=005
+DEVNUM=007
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/manufacturer', 0o644, b'Generic\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/idVendor', 0o644, b'1043\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/bNumInterfaces', 0o644, b' 1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/bMaxPower', 0o644, b'100mA\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00/subsystem', '../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00/device', '../../../5-1')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00/bEndpointAddress', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00/type', 0o644, b'Control\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00/dev', 0o644, b'252:24\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00/direction', 0o644, b'both\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00/wMaxPacketSize', 0o644, b'0040\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00/bmAttributes', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00/uevent', 0o644, b'''MAJOR=252
+MINOR=24
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00/bInterval', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/usb_endpoint/usbdev5.7_ep00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/power/active_duration', 0o644, b'65113\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/power/wakeup', 0o644, b'\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/power/connected_duration', 0o644, b'65113\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/power/autosuspend', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/power/persist', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/power/level', 0o644, b'on\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/subsystem', '../../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/ep_81', 'usb_endpoint/usbdev5.7_ep81')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/ep_02', 'usb_endpoint/usbdev5.7_ep02')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/driver', '../../../../../../bus/usb/drivers/usb-storage')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/modalias', 0o644, b'usb:v1043p8012d0100dc00dsc00dp00ic08isc06ip50\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/bInterfaceNumber', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/bNumEndpoints', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/bInterfaceSubClass', 0o644, b'06\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/bInterfaceClass', 0o644, b'08\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/uevent', 0o644, b'''DEVTYPE=usb_interface
+DRIVER=usb-storage
+PRODUCT=1043/8012/100
+TYPE=0/0/0
+INTERFACE=8/6/80
+MODALIAS=usb:v1043p8012d0100dc00dsc00dp00ic08isc06ip50
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/bInterfaceProtocol', 0o644, b'50\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81/device', '../../../5-1:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81/bEndpointAddress', 0o644, b'81\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81/type', 0o644, b'Bulk\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81/dev', 0o644, b'252:10\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81/wMaxPacketSize', 0o644, b'0200\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81/bmAttributes', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81/uevent', 0o644, b'''MAJOR=252
+MINOR=10
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81/bInterval', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep81/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02/device', '../../../5-1:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02/bEndpointAddress', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02/type', 0o644, b'Bulk\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02/dev', 0o644, b'252:11\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02/direction', 0o644, b'out\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02/wMaxPacketSize', 0o644, b'0200\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02/bmAttributes', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02/uevent', 0o644, b'''MAJOR=252
+MINOR=11
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02/bInterval', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/usb_endpoint/usbdev5.7_ep02/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/subsystem', '../../../../../../../bus/scsi')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/uevent', 0o644, b'DEVTYPE=scsi_host\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/subsystem', '../../../../../../../../bus/scsi')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/uevent', 0o644, b'DEVTYPE=scsi_target\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/generic', 'scsi_generic/sg2')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/subsystem', '../../../../../../../../../bus/scsi')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/driver', '../../../../../../../../../bus/scsi/drivers/sd')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/iodone_cnt', 0o644, b'0xc3\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/device_blocked', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/max_sectors', 0o644, b'240\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/modalias', 0o644, b'scsi:t-0x00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_level', 0o644, b'3\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/queue_depth', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/rev', 0o644, b'1.00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/type', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/iocounterbits', 0o644, b'32\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/vendor', 0o644, b'Generic \n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/state', 0o644, b'running\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/queue_type', 0o644, b'none\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/iorequest_cnt', 0o644, b'0xc3\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/evt_media_change', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/model', 0o644, b'USB Flash Drive \n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/ioerr_cnt', 0o644, b'0x2\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/uevent', 0o644, b'''DEVTYPE=scsi_device
+DRIVER=sd
+MODALIAS=scsi:t-0x00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/timeout', 0o644, b'60\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_disk', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_disk/7:0:0:0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_disk/7:0:0:0/subsystem', '../../../../../../../../../../../class/scsi_disk')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_disk/7:0:0:0/device', '../../../7:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_disk/7:0:0:0/app_tag_own', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_disk/7:0:0:0/FUA', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_disk/7:0:0:0/cache_type', 0o644, b'write through\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_disk/7:0:0:0/protection_type', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_disk/7:0:0:0/manage_start_stop', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_disk/7:0:0:0/allow_restart', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_disk/7:0:0:0/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_disk/7:0:0:0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_disk/7:0:0:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_generic', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_generic/sg2', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_generic/sg2/subsystem', '../../../../../../../../../../../class/scsi_generic')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_generic/sg2/device', '../../../7:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_generic/sg2/dev', 0o644, b'21:2\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_generic/sg2/uevent', 0o644, b'''MAJOR=21
+MINOR=2
+''')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_generic/sg2/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_generic/sg2/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/bsg', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/bsg/7:0:0:0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/bsg/7:0:0:0/subsystem', '../../../../../../../../../../../class/bsg')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/bsg/7:0:0:0/device', '../../../7:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/bsg/7:0:0:0/dev', 0o644, b'254:2\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/bsg/7:0:0:0/uevent', 0o644, b'''MAJOR=254
+MINOR=2
+''')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/bsg/7:0:0:0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/bsg/7:0:0:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/subsystem', '../../../../../../../../../../../class/block')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/bdi', '../../../../../../../../../../virtual/bdi/8:16')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/device', '../../../7:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/capability', 0o644, b'13\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/ro', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/make-it-fail', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/size', 0o644, b'257024\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/dev', 0o644, b'8:16\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/range', 0o644, b'16\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/removable', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/stat', 0o644, b'     117      409     2103      272        0        0        0        0        0      194      272\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/uevent', 0o644, b'''MAJOR=8
+MINOR=16
+DEVTYPE=disk
+''')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/bsg', '../../../bsg/7:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/nr_requests', 0o644, b'128\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/nomerges', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/scheduler', 0o644, b'noop anticipatory deadline [cfq] \n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/hw_sector_size', 0o644, b'512\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/max_hw_sectors_kb', 0o644, b'120\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/read_ahead_kb', 0o644, b'128\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/max_sectors_kb', 0o644, b'120\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/iosched', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/iosched/slice_async_rq', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/iosched/back_seek_max', 0o644, b'16384\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/iosched/slice_sync', 0o644, b'100\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/iosched/slice_async', 0o644, b'40\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/iosched/fifo_expire_sync', 0o644, b'125\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/iosched/slice_idle', 0o644, b'8\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/iosched/back_seek_penalty', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/iosched/fifo_expire_async', 0o644, b'250\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/queue/iosched/quantum', 0o644, b'4\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/sdb1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/sdb1/subsystem', '../../../../../../../../../../../../class/block')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/sdb1/start', 0o644, b'32\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/sdb1/make-it-fail', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/sdb1/size', 0o644, b'256992\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/sdb1/dev', 0o644, b'8:17\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/sdb1/stat', 0o644, b'     109      392     1903      246        0        0        0        0        0      169      246\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/sdb1/uevent', 0o644, b'''MAJOR=8
+MINOR=17
+DEVTYPE=partition
+''')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/sdb1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/block/sdb/sdb1/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_device', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_device/7:0:0:0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_device/7:0:0:0/subsystem', '../../../../../../../../../../../class/scsi_device')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_device/7:0:0:0/device', '../../../7:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_device/7:0:0:0/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_device/7:0:0:0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:0/scsi_device/7:0:0:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/subsystem', '../../../../../../../../../class/scsi_host')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/device', '../../../host7')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/unique_id', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/can_queue', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/unchecked_isa_dma', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/active_mode', 0o644, b'Initiator\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/sg_tablesize', 0o644, b'128\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/prot_guard_type', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/host_busy', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/proc_name', 0o644, b'usb-storage\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/state', 0o644, b'running\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/cmd_per_lun', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/supported_mode', 0o644, b'Initiator\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/uevent', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/prot_capabilities', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/scsi_host/host7/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/subsystem', '../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/driver', '../../../../../bus/usb/drivers/usb')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/ep_00', 'usb_endpoint/usbdev5.9_ep00')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/version', 0o644, b' 2.00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/maxchild', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/bDeviceClass', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/bcdDevice', 0o644, b'0100\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/devnum', 0o644, b'9\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/bDeviceProtocol', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/idProduct', 0o644, b'007b\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/product', 0o644, b'N78\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/bDeviceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/configuration', 0o644, b'Bulk transfer method configuration\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/dev', 0o644, b'189:520\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/urbnum', 0o644, b'20\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/authorized', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/descriptors', 0o644, b'''\x12\x01\x00\x02\x02\x00\x00@!\x04{\x00\x00\x01\x01\x02\x03\x01\t\x02\xab\x01\x0e\x01\x04\xc02\t\x04\x00\x00\x01\x02\x02\x01\x06\x05$\x00\x00\x01\x04$\x02\x0f\x05$\x06\x00\x01\x07\x05\x81\x03@\x00\x08\t\x04\x01\x00\x02
+\x00\x00\x07\x07\x05\x82\x02\x00\x02\xff\x07\x05\x01\x02\x00\x02\xff\t\x04\x02\x00\x01\x02\x02\xff\x08\x05$\x00\x00\x01\x04$\x02\x0f\x05$\x06\x02\x03\x07\x05\x83\x03@\x00\x08\t\x04\x03\x00\x02
+\x00\x00\t\x07\x05\x84\x02\x00\x02\xff\x07\x05\x02\x02\x00\x02\xff\t\x04\x04\x00\x00\x02\x08\x00\x00\x05$\x00\x10\x01\x05$\x11\x00\x01\r$\x06\x04\x05\x06\x07\x08\t
+\x0b\x0c\r\t\x04\x05\x00\x00\x02\x0b\x00
+\x05$\x00\x10\x01\x05$\x15\x00\x01\x05$\x06\x05\x06\t\x04\x06\x00\x00
+\x00\x00\x00\t\x04\x06\x01\x02
+\x00\x00\x00\x07\x05\x85\x02\x00\x02\xff\x07\x05\x03\x02\x00\x02\xff\t\x04\x07\x00\x00\x02\x0b\x00\x0b\x05$\x00\x10\x01\x05$\x15\x00\x01\x05$\x06\x07\x08\t\x04\x08\x00\x00
+\x00\x00\x00\t\x04\x08\x01\x02
+\x00\x00\x00\x07\x05\x86\x02\x00\x02\xff\x07\x05\x04\x02\x00\x02\xff\t\x04\t\x00\x00\x02\x08\x01\x00\x05$\x00\x10\x01\x05$\x08\x00\x01\x06$\x06\t
+\x0b\t\x04
+\x00\x00\x02\xfe\x00\x00\x05$\x00\x10\x01\x05$\xab\x05\x15\x05$\x06
+\x0b\t\x04\x0b\x00\x00
+\x00\x00\x00\t\x04\x0b\x01\x02
+\x00\x00\x00\x04$\xfd\x01\x07\x05\x05\x02\x00\x02\xff\x07\x05\x87\x02\x00\x02\xff\t\x04\x0c\x00\x00\x02\xfd\x00\x0c\x05$\x00\x10\x01\x05$\xfc\x00\x01\x05$\x06\x0c\r\x04$\xfd\x00\t\x04\r\x00\x00
+\x00\x00\x00\t\x04\r\x01\x02
+\x00\x00\x00\x07\x05\x88\x03\x00\x02\x06\x07\x05\x06\x02\x00\x02\xff\t\x04\r\x02\x02
+\x00\x00\x00\x07\x05\x88\x02\x00\x02\xff\x07\x05\x06\x02\x00\x02\xff''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/bNumConfigurations', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/serial', 0o644, b'354172020305000\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/speed', 0o644, b'480\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/bMaxPacketSize0', 0o644, b'64\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/bmAttributes', 0o644, b'c0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/busnum', 0o644, b'5\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/quirks', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/bConfigurationValue', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/uevent', 0o644, b'''MAJOR=189
+MINOR=520
+DEVTYPE=usb_device
+DRIVER=usb
+PRODUCT=421/7b/100
+TYPE=2/0/0
+BUSNUM=005
+DEVNUM=009
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/manufacturer', 0o644, b'Nokia\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/idVendor', 0o644, b'0421\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/bNumInterfaces', 0o644, b'14\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/bMaxPower', 0o644, b'100mA\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.4', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.4/subsystem', '../../../../../../bus/usb')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.4/modalias', 0o644, b'usb:v0421p007Bd0100dc02dsc00dp00ic02isc08ip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.4/bInterfaceNumber', 0o644, b'04\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.4/bNumEndpoints', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.4/bInterfaceSubClass', 0o644, b'08\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.4/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.4/bInterfaceClass', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.4/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=421/7b/100
+TYPE=2/0/0
+INTERFACE=2/8/0
+MODALIAS=usb:v0421p007Bd0100dc02dsc00dp00ic02isc08ip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.4/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.4/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.4/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00/subsystem', '../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00/device', '../../../5-2')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00/bEndpointAddress', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00/type', 0o644, b'Control\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00/dev', 0o644, b'252:33\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00/direction', 0o644, b'both\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00/wMaxPacketSize', 0o644, b'0040\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00/bmAttributes', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00/uevent', 0o644, b'''MAJOR=252
+MINOR=33
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00/bInterval', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/usb_endpoint/usbdev5.9_ep00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/subsystem', '../../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/ep_83', 'usb_endpoint/usbdev5.9_ep83')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/modalias', 0o644, b'usb:v0421p007Bd0100dc02dsc00dp00ic02isc02ipFF\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/bInterfaceNumber', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/bNumEndpoints', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/interface', 0o644, b'CDC Comms Interface\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/bInterfaceSubClass', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/bInterfaceClass', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=421/7b/100
+TYPE=2/0/0
+INTERFACE=2/2/255
+MODALIAS=usb:v0421p007Bd0100dc02dsc00dp00ic02isc02ipFF
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/bInterfaceProtocol', 0o644, b'ff\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83/device', '../../../5-2:1.2')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83/interval', 0o644, b'16ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83/bEndpointAddress', 0o644, b'83\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83/type', 0o644, b'Interrupt\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83/dev', 0o644, b'252:30\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83/wMaxPacketSize', 0o644, b'0040\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83/bmAttributes', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83/uevent', 0o644, b'''MAJOR=252
+MINOR=30
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83/bInterval', 0o644, b'08\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/usb_endpoint/usbdev5.9_ep83/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.2/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/subsystem', '../../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/ep_01', 'usb_endpoint/usbdev5.9_ep01')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/ep_82', 'usb_endpoint/usbdev5.9_ep82')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/driver', '../../../../../../bus/usb/drivers/cdc_acm')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/modalias', 0o644, b'usb:v0421p007Bd0100dc02dsc00dp00ic0Aisc00ip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/bInterfaceNumber', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/bNumEndpoints', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/interface', 0o644, b'CDC Data Interface\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/bInterfaceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/bInterfaceClass', 0o644, b'0a\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/uevent', 0o644, b'''DEVTYPE=usb_interface
+DRIVER=cdc_acm
+PRODUCT=421/7b/100
+TYPE=2/0/0
+INTERFACE=10/0/0
+MODALIAS=usb:v0421p007Bd0100dc02dsc00dp00ic0Aisc00ip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01/device', '../../../5-2:1.1')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01/interval', 0o644, b'31875us\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01/bEndpointAddress', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01/type', 0o644, b'Bulk\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01/dev', 0o644, b'252:29\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01/direction', 0o644, b'out\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01/wMaxPacketSize', 0o644, b'0200\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01/bmAttributes', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01/uevent', 0o644, b'''MAJOR=252
+MINOR=29
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01/bInterval', 0o644, b'ff\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep01/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82/device', '../../../5-2:1.1')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82/bEndpointAddress', 0o644, b'82\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82/type', 0o644, b'Bulk\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82/dev', 0o644, b'252:28\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82/wMaxPacketSize', 0o644, b'0200\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82/bmAttributes', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82/uevent', 0o644, b'''MAJOR=252
+MINOR=28
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82/bInterval', 0o644, b'ff\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/usb_endpoint/usbdev5.9_ep82/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.1/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.10', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.10/subsystem', '../../../../../../bus/usb')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.10/modalias', 0o644, b'usb:v0421p007Bd0100dc02dsc00dp00ic02iscFEip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.10/bInterfaceNumber', 0o644, b'0a\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.10/bNumEndpoints', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.10/bInterfaceSubClass', 0o644, b'fe\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.10/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.10/bInterfaceClass', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.10/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=421/7b/100
+TYPE=2/0/0
+INTERFACE=2/254/0
+MODALIAS=usb:v0421p007Bd0100dc02dsc00dp00ic02iscFEip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.10/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.10/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.10/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.7', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.7/subsystem', '../../../../../../bus/usb')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.7/modalias', 0o644, b'usb:v0421p007Bd0100dc02dsc00dp00ic02isc0Bip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.7/bInterfaceNumber', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.7/bNumEndpoints', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.7/interface', 0o644, b'PC Suite Services\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.7/bInterfaceSubClass', 0o644, b'0b\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.7/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.7/bInterfaceClass', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.7/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=421/7b/100
+TYPE=2/0/0
+INTERFACE=2/11/0
+MODALIAS=usb:v0421p007Bd0100dc02dsc00dp00ic02isc0Bip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.7/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.7/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.7/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/subsystem', '../../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/ep_81', 'usb_endpoint/usbdev5.9_ep81')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/driver', '../../../../../../bus/usb/drivers/cdc_acm')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/modalias', 0o644, b'usb:v0421p007Bd0100dc02dsc00dp00ic02isc02ip01\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/bInterfaceNumber', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/bmCapabilities', 0o644, b'15')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/bNumEndpoints', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/interface', 0o644, b'CDC Comms Interface\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/bInterfaceSubClass', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/bInterfaceClass', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/uevent', 0o644, b'''DEVTYPE=usb_interface
+DRIVER=cdc_acm
+PRODUCT=421/7b/100
+TYPE=2/0/0
+INTERFACE=2/2/1
+MODALIAS=usb:v0421p007Bd0100dc02dsc00dp00ic02isc02ip01
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/bInterfaceProtocol', 0o644, b'01\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81/device', '../../../5-2:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81/interval', 0o644, b'16ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81/bEndpointAddress', 0o644, b'81\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81/type', 0o644, b'Interrupt\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81/dev', 0o644, b'252:27\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81/wMaxPacketSize', 0o644, b'0040\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81/bmAttributes', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81/uevent', 0o644, b'''MAJOR=252
+MINOR=27
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81/bInterval', 0o644, b'08\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/usb_endpoint/usbdev5.9_ep81/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0/subsystem', '../../../../../../../../class/tty')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0/device', '../../../5-2:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0/dev', 0o644, b'166:0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0/uevent', 0o644, b'''MAJOR=166
+MINOR=0
+DEVNAME=ttyACM0
+''')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.9', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.9/subsystem', '../../../../../../bus/usb')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.9/modalias', 0o644, b'usb:v0421p007Bd0100dc02dsc00dp00ic02isc08ip01\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.9/bInterfaceNumber', 0o644, b'09\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.9/bNumEndpoints', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.9/bInterfaceSubClass', 0o644, b'08\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.9/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.9/bInterfaceClass', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.9/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=421/7b/100
+TYPE=2/0/0
+INTERFACE=2/8/1
+MODALIAS=usb:v0421p007Bd0100dc02dsc00dp00ic02isc08ip01
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.9/bInterfaceProtocol', 0o644, b'01\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.9/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.9/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.8', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.8/subsystem', '../../../../../../bus/usb')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.8/modalias', 0o644, b'usb:v0421p007Bd0100dc02dsc00dp00ic0Aisc00ip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.8/bInterfaceNumber', 0o644, b'08\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.8/bNumEndpoints', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.8/bInterfaceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.8/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.8/bInterfaceClass', 0o644, b'0a\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.8/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=421/7b/100
+TYPE=2/0/0
+INTERFACE=10/0/0
+MODALIAS=usb:v0421p007Bd0100dc02dsc00dp00ic0Aisc00ip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.8/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.8/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.8/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/power/active_duration', 0o644, b'20902\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/power/wakeup', 0o644, b'\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/power/connected_duration', 0o644, b'20901\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/power/autosuspend', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/power/persist', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/power/level', 0o644, b'on\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.13', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.13/subsystem', '../../../../../../bus/usb')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.13/modalias', 0o644, b'usb:v0421p007Bd0100dc02dsc00dp00ic0Aisc00ip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.13/bInterfaceNumber', 0o644, b'0d\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.13/bNumEndpoints', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.13/bInterfaceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.13/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.13/bInterfaceClass', 0o644, b'0a\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.13/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=421/7b/100
+TYPE=2/0/0
+INTERFACE=10/0/0
+MODALIAS=usb:v0421p007Bd0100dc02dsc00dp00ic0Aisc00ip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.13/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.13/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.13/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.5', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.5/subsystem', '../../../../../../bus/usb')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.5/modalias', 0o644, b'usb:v0421p007Bd0100dc02dsc00dp00ic02isc0Bip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.5/bInterfaceNumber', 0o644, b'05\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.5/bNumEndpoints', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.5/interface', 0o644, b'SYNCML-SYNC\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.5/bInterfaceSubClass', 0o644, b'0b\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.5/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.5/bInterfaceClass', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.5/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=421/7b/100
+TYPE=2/0/0
+INTERFACE=2/11/0
+MODALIAS=usb:v0421p007Bd0100dc02dsc00dp00ic02isc0Bip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.5/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.5/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.5/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.11', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.11/subsystem', '../../../../../../bus/usb')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.11/modalias', 0o644, b'usb:v0421p007Bd0100dc02dsc00dp00ic0Aisc00ip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.11/bInterfaceNumber', 0o644, b'0b\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.11/bNumEndpoints', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.11/bInterfaceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.11/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.11/bInterfaceClass', 0o644, b'0a\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.11/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=421/7b/100
+TYPE=2/0/0
+INTERFACE=10/0/0
+MODALIAS=usb:v0421p007Bd0100dc02dsc00dp00ic0Aisc00ip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.11/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.11/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.11/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.12', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.12/subsystem', '../../../../../../bus/usb')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.12/modalias', 0o644, b'usb:v0421p007Bd0100dc02dsc00dp00ic02iscFDip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.12/bInterfaceNumber', 0o644, b'0c\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.12/bNumEndpoints', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.12/interface', 0o644, b'LCIF_Alt0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.12/bInterfaceSubClass', 0o644, b'fd\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.12/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.12/bInterfaceClass', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.12/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=421/7b/100
+TYPE=2/0/0
+INTERFACE=2/253/0
+MODALIAS=usb:v0421p007Bd0100dc02dsc00dp00ic02iscFDip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.12/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.12/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.12/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/subsystem', '../../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/ep_02', 'usb_endpoint/usbdev5.9_ep02')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/ep_84', 'usb_endpoint/usbdev5.9_ep84')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/modalias', 0o644, b'usb:v0421p007Bd0100dc02dsc00dp00ic0Aisc00ip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/bInterfaceNumber', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/bNumEndpoints', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/interface', 0o644, b'CDC Data Interface\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/bInterfaceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/bInterfaceClass', 0o644, b'0a\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=421/7b/100
+TYPE=2/0/0
+INTERFACE=10/0/0
+MODALIAS=usb:v0421p007Bd0100dc02dsc00dp00ic0Aisc00ip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84/device', '../../../5-2:1.3')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84/bEndpointAddress', 0o644, b'84\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84/type', 0o644, b'Bulk\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84/dev', 0o644, b'252:31\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84/wMaxPacketSize', 0o644, b'0200\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84/bmAttributes', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84/uevent', 0o644, b'''MAJOR=252
+MINOR=31
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84/bInterval', 0o644, b'ff\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep84/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02/device', '../../../5-2:1.3')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02/interval', 0o644, b'31875us\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02/bEndpointAddress', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02/type', 0o644, b'Bulk\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02/dev', 0o644, b'252:32\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02/direction', 0o644, b'out\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02/wMaxPacketSize', 0o644, b'0200\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02/bmAttributes', 0o644, b'02\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02/uevent', 0o644, b'''MAJOR=252
+MINOR=32
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02/bInterval', 0o644, b'ff\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/usb_endpoint/usbdev5.9_ep02/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.3/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.6', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.6/subsystem', '../../../../../../bus/usb')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.6/modalias', 0o644, b'usb:v0421p007Bd0100dc02dsc00dp00ic0Aisc00ip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.6/bInterfaceNumber', 0o644, b'06\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.6/bNumEndpoints', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.6/bInterfaceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.6/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.6/bInterfaceClass', 0o644, b'0a\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.6/uevent', 0o644, b'''DEVTYPE=usb_interface
+PRODUCT=421/7b/100
+TYPE=2/0/0
+INTERFACE=10/0/0
+MODALIAS=usb:v0421p007Bd0100dc02dsc00dp00ic0Aisc00ip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.6/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.6/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.6/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/power/active_duration', 0o644, b'547102\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/power/wakeup', 0o644, b'enabled\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/power/connected_duration', 0o644, b'8371932\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/power/autosuspend', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/power/level', 0o644, b'auto\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/subsystem', '../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/ep_81', 'usb_endpoint/usbdev5.1_ep81')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/driver', '../../../../../bus/usb/drivers/hub')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/modalias', 0o644, b'usb:v1D6Bp0002d0206dc09dsc00dp00ic09isc00ip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/bInterfaceNumber', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/bNumEndpoints', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/bInterfaceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/bInterfaceClass', 0o644, b'09\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/uevent', 0o644, b'''DEVTYPE=usb_interface
+DRIVER=hub
+PRODUCT=1d6b/2/206
+TYPE=9/0/0
+INTERFACE=9/0/0
+MODALIAS=usb:v1D6Bp0002d0206dc09dsc00dp00ic09isc00ip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81/subsystem', '../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81/device', '../../../5-0:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81/interval', 0o644, b'256ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81/bEndpointAddress', 0o644, b'81\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81/type', 0o644, b'Interrupt\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81/dev', 0o644, b'252:8\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81/wMaxPacketSize', 0o644, b'0004\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81/bmAttributes', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81/uevent', 0o644, b'''MAJOR=252
+MINOR=8
+''')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81/bInterval', 0o644, b'0c\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/usb_endpoint/usbdev5.1_ep81/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb_host', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.7/usb_host/usb_host5', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.7/usb_host/usb_host5/subsystem', '../../../../../class/usb_host')
+l('sys/devices/pci0000:00/0000:00:1d.7/usb_host/usb_host5/device', '../../../0000:00:1d.7')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb_host/usb_host5/companion', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.7/usb_host/usb_host5/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1d.7/usb_host/usb_host5/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.7/usb_host/usb_host5/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.1/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:0c')
+l('sys/devices/pci0000:00/0000:00:1c.1/subsystem', '../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:1c.1/driver', '../../../bus/pci/drivers/pcieport-driver')
+f('sys/devices/pci0000:00/0000:00:1c.1/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/enable', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/modalias', 0o644, b'pci:v00008086d000027D2sv00000000sd00000000bc06sc04i00\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/resource', 0o644, b'''0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000004000 0x0000000000005fff 0x0000000000000100
+0x00000000ec000000 0x00000000edffffff 0x0000000000000200
+0x00000000e4000000 0x00000000e40fffff 0x0000000000001201
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1c.1/config', 0o644, b"\x86\x80\xd2'\x07\x05\x10\x00\x02\x00\x04\x06\x10\x00\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03\x00@P\x00\x00\x00\xec\xf0\xed\x01\xe4\x01\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x0b\x02\x04\x00\x10\x80A\x01\xc0\x0f\x00\x00\x00\x00\x11\x00\x11,\x11\x02B\x00\x110\xe0\xa0\x18\x00\x00\x00H\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x90\x01\x00\x0c0\xe0\xfe\x81A\x00\x00\x00\x00\x00\x00\r\xa0\x00\x00\xaa\x17\x11 \x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x11\x00\x00\x00\x00\x00\x00\x0f\xc7\x80\x06\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x0f\x02\x00\x00\x00\x00\x00\x02\x00\x01\x18\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x80\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x06\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x01\x00\x00\x01\x02\x02\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x00\x00\x00\x00\x01\xc0\xd1\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07`\x00`\x00\x00\x00\x00`\x02\x00\x00\x0c\x00\x06\x00\x00\x00\x001[`\xc9\xc0\x00p&u\xa2\x178\x00\xa1\x07G\x02\x16\x00\x00\x14\xb5\xbcJ\xbc\x0b*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x0c\xb4\x00\xc4\x0c\xb6\x00A\x08z\x00Y\x00\x1b\x00[\x00\x1d\x00\x01\x00\xba\x00\xe3\x0f\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
+f('sys/devices/pci0000:00/0000:00:1c.1/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/subsystem_device', 0o644, b'0x0000\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/irq', 0o644, b'509\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/device', 0o644, b'0x27d2\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/class', 0o644, b'0x060400\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/msi_bus', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/subsystem_vendor', 0o644, b'0x0000\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/uevent', 0o644, b'''DRIVER=pcieport-driver
+PCI_CLASS=60400
+PCI_ID=8086:27D2
+PCI_SUBSYS_ID=0000:0000
+PCI_SLOT_NAME=0000:00:1c.1
+MODALIAS=pci:v00008086d000027D2sv00000000sd00000000bc06sc04i00
+''')
+f('sys/devices/pci0000:00/0000:00:1c.1/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/pci_bus', 0o755)
+d('sys/devices/pci0000:00/0000:00:1c.1/pci_bus/0000:03', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.1/pci_bus/0000:03/subsystem', '../../../../../class/pci_bus')
+l('sys/devices/pci0000:00/0000:00:1c.1/pci_bus/0000:03/device', '../../../0000:00:1c.1')
+f('sys/devices/pci0000:00/0000:00:1c.1/pci_bus/0000:03/cpuaffinity', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/pci_bus/0000:03/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.1/pci_bus/0000:03/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/pci_bus/0000:03/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie02', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie02/subsystem', '../../../../bus/pci_express')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie02/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie02/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie02/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie03', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie03/subsystem', '../../../../bus/pci_express')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie03/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie03/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie03/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/subsystem', '../../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/driver', '../../../../bus/pci/drivers/iwl3945')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/enable', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/rs_window', 0o644, b''' 54Mbs: 00000000000000000000000000000000000000000000000000000000000000
+ 48Mbs: 00000000000000000000000000000000000000000000000000000000000000
+ 36Mbs: 00000000000000000000000000000000000000000000000000000000000000
+ 24Mbs: 00000000000000000000000000000000000000000000000000000000000000
+ 18Mbs: 00000000000000000000000000000000000000000000000000000000000000
+ 12Mbs: 00000000000000000000000000000000000000000000000000000000000000
+ 11Mbs: 00000000000000000000000000000000000000000000000000000000000000
+  9Mbs: 00000000000000000000000000000000000000000000000000000000000000
+  6Mbs: 00000000000000000000000000000000000000000000000000000000000000
+  5Mbs: 00000000000000000000000000000000000000000000000000000000000000
+  2Mbs: 00000000000000000000000000000000000000000000000000000000000000
+  1Mbs: 00000000000000000000000000000000000000000000000000000000000000
+
+Average rate: 0Mbs
+''')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/modalias', 0o644, b'pci:v00008086d00004227sv00008086sd00001011bc02sc80i00\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/resource', 0o644, b'''0x00000000edf00000 0x00000000edf00fff 0x0000000000020200
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/statistics', 0o644, b'''02 00 01 00 a4 c0 02 00 c6 27 01 00 80 16 01 00  .........\'......
+e9 0c 00 00 00 00 00 00 00 00 00 00 69 05 00 00  ............i...
+de 98 01 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
+00 00 00 00 00 00 00 00 bd 01 00 00 00 00 00 00  ................
+fd 68 08 00 ae d3 06 00 78 65 04 00 b8 2b 00 00  .h......xe...+..
+00 00 00 00 00 00 00 00 7e 42 02 00 4f 95 01 00  ........~B..O...
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
+00 00 00 00 da 01 00 00 00 00 00 00 00 00 00 00  ................
+00 00 00 00 d8 dc 00 00 59 10 01 00 00 00 00 00  ........Y.......
+df 0c 00 00 16 00 00 00 00 00 00 00 00 00 00 00  ................
+88 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00  ................
+00 00 00 00 72 ff ff ff 00 00 00 00 00 00 00 00  ....r...........
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
+00 00 00 00 01 00 00 00 bb 45 98 35 1c 91 e7 f1  .........E.5....
+4c 19 00 00 c2 0c 00 00 e7 ed 00 00 1c 4c 00 00  L............L..
+''')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/config', 0o644, b'\x86\x80\'B\x06\x05\x10\x00\x02\x00\x80\x02\x10\x00\x00\x00\x00\x00\xf0\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x80\x11\x10\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xd0"H\x00\x00\x00\r\x05\xe0\x81\x00\x0c\x10\xe0\xfe\x00\x00\x00\x00\xd1A\x00\x00\x10\x00\x11\x00\xc0\x0e\x00\x00\x10\x08\n\x00\x11\x1c\x07\x00B\x01\x11\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x14\x00\x00\x10\x00\x00\x00\x00\x00\x11 \x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x01\x00\x00\x04\x0f\x1a\x00\x00\x00\x01\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x01\x00\xd1\xaeu\xff\xff\xd2\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/filter_flags', 0o644, b'0x0024\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/retry_rate', 0o644, b'1')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/channels', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/subsystem_device', 0o644, b'0x1011\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/tx_power', 0o644, b'16\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/irq', 0o644, b'504\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/antenna', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/device', 0o644, b'0x4227\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/class', 0o644, b'0x028000\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/power_level', 0o644, b'6 (AC) OFF\n\x00')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/msi_bus', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/flags', 0o644, b'0x8015\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/resource0', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/temperature', 0o644, b'-142\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/measurement', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/subsystem_vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/uevent', 0o644, b'''DRIVER=iwl3945
+PCI_CLASS=28000
+PCI_ID=8086:4227
+PCI_SUBSYS_ID=8086:1011
+PCI_SLOT_NAME=0000:03:00.0
+MODALIAS=pci:v00008086d00004227sv00008086sd00001011bc02sc80i00
+''')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/status', 0o644, b'0x000002e4\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/ieee80211', 0o755)
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/ieee80211/phy0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/ieee80211/phy0/subsystem', '../../../../../../class/ieee80211')
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/ieee80211/phy0/device', '../../../0000:03:00.0')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/ieee80211/phy0/index', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/ieee80211/phy0/uevent', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/ieee80211/phy0/macaddress', 0o644, b'00:19:d2:75:ae:d1\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/ieee80211/phy0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/ieee80211/phy0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net', 0o755)
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/subsystem', '../../../../../../class/net')
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/device', '../../../0000:03:00.0')
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/phy80211', '../../ieee80211/phy0')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/ifindex', 0o644, b'3\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/features', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/iflink', 0o644, b'3\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/dormant', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/dev_id', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/type', 0o644, b'801\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/operstate', 0o644, b'unknown\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/carrier', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/link_mode', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/tx_queue_len', 0o644, b'1000\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/flags', 0o644, b'0x1003\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/addr_len', 0o644, b'6\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/address', 0o644, b'00:19:d2:75:ae:ff\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/uevent', 0o644, b'''INTERFACE=wmaster0
+IFINDEX=3
+''')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/mtu', 0o644, b'1500\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/broadcast', 0o644, b'ff:ff:ff:ff:ff:ff\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/tx_aborted_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/rx_crc_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/rx_bytes', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/rx_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/tx_packets', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/tx_carrier_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/tx_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/rx_dropped', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/tx_fifo_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/rx_length_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/tx_dropped', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/rx_fifo_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/rx_missed_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/tx_window_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/collisions', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/rx_frame_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/rx_packets', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/rx_compressed', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/tx_compressed', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/multicast', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/rx_over_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/tx_bytes', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/statistics/tx_heartbeat_errors', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wmaster0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/subsystem', '../../../../../../class/net')
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/device', '../../../0000:03:00.0')
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/phy80211', '../../ieee80211/phy0')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/ifindex', 0o644, b'4\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/features', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/iflink', 0o644, b'4\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/dormant', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/dev_id', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/type', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/operstate', 0o644, b'up\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/carrier', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/link_mode', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/tx_queue_len', 0o644, b'1000\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/flags', 0o644, b'0x1003\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/addr_len', 0o644, b'6\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/address', 0o644, b'00:19:d2:75:ae:ff\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/uevent', 0o644, b'''INTERFACE=wlan0
+IFINDEX=4
+''')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/mtu', 0o644, b'1500\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/broadcast', 0o644, b'ff:ff:ff:ff:ff:ff\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/tx_aborted_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/rx_crc_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/rx_bytes', 0o644, b'289996\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/rx_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/tx_packets', 0o644, b'1029\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/tx_carrier_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/tx_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/rx_dropped', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/tx_fifo_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/rx_length_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/tx_dropped', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/rx_fifo_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/rx_missed_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/tx_window_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/collisions', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/rx_frame_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/rx_packets', 0o644, b'788\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/rx_compressed', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/tx_compressed', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/multicast', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/rx_over_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/tx_bytes', 0o644, b'530013\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/statistics/tx_heartbeat_errors', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/wireless', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/wireless/beacon', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/wireless/link', 0o644, b'77\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/wireless/nwid', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/wireless/retries', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/wireless/fragment', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/wireless/misc', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/wireless/crypt', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/wireless/noise', 0o644, b'178\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/wireless/level', 0o644, b'199\n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlan0/wireless/status', 0o644, b'0x0\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds', 0o755)
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:TX', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:TX/subsystem', '../../../../../../class/leds')
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:TX/device', '../../../0000:03:00.0')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:TX/trigger', 0o644, b'none AC-online BAT0-charging-or-full BAT0-charging BAT0-full rfkill0 phy0rx [phy0tx] phy0assoc phy0radio \n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:TX/brightness', 0o644, b'0\n\x00')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:TX/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:TX/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:TX/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:assoc', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:assoc/subsystem', '../../../../../../class/leds')
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:assoc/device', '../../../0000:03:00.0')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:assoc/trigger', 0o644, b'none AC-online BAT0-charging-or-full BAT0-charging BAT0-full rfkill0 phy0rx phy0tx [phy0assoc] phy0radio \n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:assoc/brightness', 0o644, b'255\n\x00')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:assoc/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:assoc/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:assoc/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:radio', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:radio/subsystem', '../../../../../../class/leds')
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:radio/device', '../../../0000:03:00.0')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:radio/trigger', 0o644, b'none AC-online BAT0-charging-or-full BAT0-charging BAT0-full rfkill0 phy0rx phy0tx phy0assoc [phy0radio] \n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:radio/brightness', 0o644, b'255\n\x00')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:radio/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:radio/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:radio/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:RX', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:RX/subsystem', '../../../../../../class/leds')
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:RX/device', '../../../0000:03:00.0')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:RX/trigger', 0o644, b'none AC-online BAT0-charging-or-full BAT0-charging BAT0-full rfkill0 [phy0rx] phy0tx phy0assoc phy0radio \n')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:RX/brightness', 0o644, b'0\n\x00')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:RX/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:RX/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/leds/iwl-phy0:RX/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie00', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie00/subsystem', '../../../../bus/pci_express')
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie00/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie00/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.1/0000:00:1c.1:pcie00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:00.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:00.0/subsystem', '../../../bus/pci')
+f('sys/devices/pci0000:00/0000:00:00.0/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:00.0/enable', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:00.0/modalias', 0o644, b'pci:v00008086d000027A0sv000017AAsd00002015bc06sc00i00\n')
+f('sys/devices/pci0000:00/0000:00:00.0/resource', 0o644, b'''0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:00.0/config', 0o644, b"\x86\x80\xa0'\x06\x01\x90 \x03\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x17\x15 \x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x90\xd1\xfe\x01@\xd1\xfe\x05\x00\x00\xf0\x01\x80\xd1\xfe\x00\x00\x02\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x11\x11\x000\x11\x11\x00\xff\x03\x00\x00\x80\x1a9\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\t\x00\tQJ\x00J\xb0\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x0f\x05\x00\x10\x00\x00\x00")
+f('sys/devices/pci0000:00/0000:00:00.0/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:00.0/subsystem_device', 0o644, b'0x2015\n')
+f('sys/devices/pci0000:00/0000:00:00.0/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:00.0/irq', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:00.0/device', 0o644, b'0x27a0\n')
+f('sys/devices/pci0000:00/0000:00:00.0/class', 0o644, b'0x060000\n')
+f('sys/devices/pci0000:00/0000:00:00.0/msi_bus', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:00.0/subsystem_vendor', 0o644, b'0x17aa\n')
+f('sys/devices/pci0000:00/0000:00:00.0/uevent', 0o644, b'''PCI_CLASS=60000
+PCI_ID=8086:27A0
+PCI_SUBSYS_ID=17AA:2015
+PCI_SLOT_NAME=0000:00:00.0
+MODALIAS=pci:v00008086d000027A0sv000017AAsd00002015bc06sc00i00
+''')
+f('sys/devices/pci0000:00/0000:00:00.0/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:00.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:00.0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.3', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.3/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:0f')
+l('sys/devices/pci0000:00/0000:00:1c.3/subsystem', '../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:1c.3/driver', '../../../bus/pci/drivers/pcieport-driver')
+f('sys/devices/pci0000:00/0000:00:1c.3/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1c.3/enable', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1c.3/modalias', 0o644, b'pci:v00008086d000027D6sv00000000sd00000000bc06sc04i00\n')
+f('sys/devices/pci0000:00/0000:00:1c.3/resource', 0o644, b'''0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000008000 0x0000000000009fff 0x0000000000000100
+0x00000000ea000000 0x00000000ebffffff 0x0000000000000200
+0x00000000e4200000 0x00000000e42fffff 0x0000000000001201
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1c.3/config', 0o644, b"\x86\x80\xd6'\x07\x05\x10\x00\x02\x00\x04\x06\x10\x00\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x13\x00\x80\x90\x00\x00\x00\xea\xf0\xeb!\xe4!\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x0b\x04\x04\x00\x10\x80A\x01\xc0\x0f\x00\x00\x00\x00\x10\x00\x11L\x11\x04\x00\x00\x01\x10\xe0\xa0(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x90\x01\x00\x0c0\xe0\xfe\x91A\x00\x00\x00\x00\x00\x00\r\xa0\x00\x00\xaa\x17\x11 \x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x11\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x06\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x0f\x02\x00\x00\x00\x00\x00\x02\x00\x01\x18\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\xff\x00\x00\x80\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x01\x00\x00\x01\x02\x04\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x00\x00\x00\x00\x01\xc0\xd1\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07`\x00`\x00\x00\x00\x00`\x02\x00\x00\x0c\x00\x06\x00\x00\x00\x00\x00[`\xc9\xc0\x00p&u\x00\x10\x00\x00\xff\x0f\x00\x00\x16\x00\x00\x14\xb5\xbcJ\xbc\x0b*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
+f('sys/devices/pci0000:00/0000:00:1c.3/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1c.3/subsystem_device', 0o644, b'0x0000\n')
+f('sys/devices/pci0000:00/0000:00:1c.3/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1c.3/irq', 0o644, b'507\n')
+f('sys/devices/pci0000:00/0000:00:1c.3/device', 0o644, b'0x27d6\n')
+f('sys/devices/pci0000:00/0000:00:1c.3/class', 0o644, b'0x060400\n')
+f('sys/devices/pci0000:00/0000:00:1c.3/msi_bus', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1c.3/subsystem_vendor', 0o644, b'0x0000\n')
+f('sys/devices/pci0000:00/0000:00:1c.3/uevent', 0o644, b'''DRIVER=pcieport-driver
+PCI_CLASS=60400
+PCI_ID=8086:27D6
+PCI_SUBSYS_ID=0000:0000
+PCI_SLOT_NAME=0000:00:1c.3
+MODALIAS=pci:v00008086d000027D6sv00000000sd00000000bc06sc04i00
+''')
+f('sys/devices/pci0000:00/0000:00:1c.3/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1c.3/pci_bus', 0o755)
+d('sys/devices/pci0000:00/0000:00:1c.3/pci_bus/0000:0c', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.3/pci_bus/0000:0c/subsystem', '../../../../../class/pci_bus')
+l('sys/devices/pci0000:00/0000:00:1c.3/pci_bus/0000:0c/device', '../../../0000:00:1c.3')
+f('sys/devices/pci0000:00/0000:00:1c.3/pci_bus/0000:0c/cpuaffinity', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1c.3/pci_bus/0000:0c/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.3/pci_bus/0000:0c/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.3/pci_bus/0000:0c/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.3/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.3/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie02', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie02/subsystem', '../../../../bus/pci_express')
+f('sys/devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie02/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie02/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie02/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie03', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie03/subsystem', '../../../../bus/pci_express')
+f('sys/devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie03/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie03/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie03/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie00', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie00/subsystem', '../../../../bus/pci_express')
+f('sys/devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie00/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie00/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.3/0000:00:1c.3:pcie00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.0/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:01')
+l('sys/devices/pci0000:00/0000:00:1f.0/subsystem', '../../../bus/pci')
+f('sys/devices/pci0000:00/0000:00:1f.0/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1f.0/enable', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.0/modalias', 0o644, b'pci:v00008086d000027B9sv000017AAsd00002009bc06sc01i00\n')
+f('sys/devices/pci0000:00/0000:00:1f.0/resource', 0o644, b'''0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1f.0/config', 0o644, b'''\x86\x80\xb9\'\x07\x00\x10\x02\x02\x00\x01\x06\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x17\t \x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\x80\x00\x00\x00\x81\x11\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x8b\x8b\x8b\x92\x00\x00\x00\x8b\x8b\x8b\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00
+\x1f\x01\x16|\x00\xe1\x15\x0c\x00\x81\x16\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x06\x02\x00\x00\x00\x00\x00\x13\x1c
+\x00\x00\x03\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x12
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D\x12\x11\x00gE\x00\x00\xc0\xff\x00\x00\x01\x00\x00\x00\t\x00\x0c\x10\xb4\x02$\x17\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\xd1\xfe\x00\x00\x00\x00\x86\x0f\x02\x00\x00\x00\x00\x00''')
+f('sys/devices/pci0000:00/0000:00:1f.0/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1f.0/subsystem_device', 0o644, b'0x2009\n')
+f('sys/devices/pci0000:00/0000:00:1f.0/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1f.0/irq', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.0/device', 0o644, b'0x27b9\n')
+f('sys/devices/pci0000:00/0000:00:1f.0/class', 0o644, b'0x060100\n')
+f('sys/devices/pci0000:00/0000:00:1f.0/msi_bus', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.0/subsystem_vendor', 0o644, b'0x17aa\n')
+f('sys/devices/pci0000:00/0000:00:1f.0/uevent', 0o644, b'''PCI_CLASS=60100
+PCI_ID=8086:27B9
+PCI_SUBSYS_ID=17AA:2009
+PCI_SLOT_NAME=0000:00:1f.0
+MODALIAS=pci:v00008086d000027B9sv000017AAsd00002009bc06sc01i00
+''')
+f('sys/devices/pci0000:00/0000:00:1f.0/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1f.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.0/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:0b')
+l('sys/devices/pci0000:00/0000:00:1c.0/subsystem', '../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:1c.0/driver', '../../../bus/pci/drivers/pcieport-driver')
+f('sys/devices/pci0000:00/0000:00:1c.0/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/enable', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/modalias', 0o644, b'pci:v00008086d000027D0sv00000000sd00000000bc06sc04i00\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/resource', 0o644, b'''0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000003000 0x0000000000003fff 0x0000000000000100
+0x00000000ee000000 0x00000000ee0fffff 0x0000000000000200
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1c.0/config', 0o644, b"\x86\x80\xd0'\x07\x05\x10\x00\x02\x00\x04\x06\x10\x00\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02\x0000\x00\x00\x00\xee\x00\xee\xf1\xff\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x04\x00\x10\x80A\x01\xc0\x0f\x00\x00\x00\x00\x11\x00\x11,\x11\x01B\x00\x110\xe0\xa0\x10\x00(\x00@\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x90\x01\x00\x0c0\xe0\xfeyA\x00\x00\x00\x00\x00\x00\r\xa0\x00\x00\xaa\x17\x11 \x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x11\xc0\x00\x00\x00\x00\x00\x0f\xc7\x00\x06\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x0f\x02\x00\x00\x00\x00\x00\x02\x00\x01\x18\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x80\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x11\x00\x06\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x01\x00\x00\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x00\x00\x00\x00\x01\xc0\xd1\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07`\x00`\x00\x00\x00\x00`\x02\x00\x00\x0c\x00\x06\x00\x00\x00\x00\x08[`\xc9\xc0\x00p&u:\x188\x009\x08\x9e\x0e\x16\x00\x00\x14\xb5\xbcJ\xbc\x0b*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\t\xec\x00\xfc\t\xee\x00c\x00W\x00i\x00J\x00k\x00L\x00\x01\x00\x05\x00\x10\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
+f('sys/devices/pci0000:00/0000:00:1c.0/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/subsystem_device', 0o644, b'0x0000\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/irq', 0o644, b'510\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/device', 0o644, b'0x27d0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/class', 0o644, b'0x060400\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/msi_bus', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/subsystem_vendor', 0o644, b'0x0000\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/uevent', 0o644, b'''DRIVER=pcieport-driver
+PCI_CLASS=60400
+PCI_ID=8086:27D0
+PCI_SUBSYS_ID=0000:0000
+PCI_SLOT_NAME=0000:00:1c.0
+MODALIAS=pci:v00008086d000027D0sv00000000sd00000000bc06sc04i00
+''')
+f('sys/devices/pci0000:00/0000:00:1c.0/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie03', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie03/subsystem', '../../../../bus/pci_express')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie03/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie03/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie03/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.0/pci_bus', 0o755)
+d('sys/devices/pci0000:00/0000:00:1c.0/pci_bus/0000:02', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.0/pci_bus/0000:02/subsystem', '../../../../../class/pci_bus')
+l('sys/devices/pci0000:00/0000:00:1c.0/pci_bus/0000:02/device', '../../../0000:00:1c.0')
+f('sys/devices/pci0000:00/0000:00:1c.0/pci_bus/0000:02/cpuaffinity', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/pci_bus/0000:02/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.0/pci_bus/0000:02/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.0/pci_bus/0000:02/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.0/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/subsystem', '../../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/driver', '../../../../bus/pci/drivers/e1000e')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/enable', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/modalias', 0o644, b'pci:v00008086d0000109Asv000017AAsd00002001bc02sc00i00\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/resource', 0o644, b'''0x00000000ee000000 0x00000000ee01ffff 0x0000000000020200
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000003000 0x000000000000301f 0x0000000000020101
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/config', 0o644, b'\x86\x80\x9a\x10\x07\x05\x10\x00\x00\x00\x00\x02\x10\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\x00\x010\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x17\x01 \x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xd0"\xc8\x00 \x00\x0f\x05\xe0\x81\x00\x0c\x10\xe0\xfe\x00\x00\x00\x00\xc9A\x00\x00\x10\x00\x01\x00\xc1\x0c\x00\x00\x10(\x1a\x00\x11\x1c\x07\x00@\x01\x11\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x14\x00\x00\x10\x00\x00\x00\x00\x00\x11 \x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x01\x00\x00\x04\x0f\x03\x00\x00\x00\x01\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x01\x00\xc7\x8d\xe2\xff\xffA\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/resource2', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/subsystem_device', 0o644, b'0x2001\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/irq', 0o644, b'505\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/device', 0o644, b'0x109a\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/class', 0o644, b'0x020000\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/msi_bus', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/resource0', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/subsystem_vendor', 0o644, b'0x17aa\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/uevent', 0o644, b'''DRIVER=e1000e
+PCI_CLASS=20000
+PCI_ID=8086:109A
+PCI_SUBSYS_ID=17AA:2001
+PCI_SLOT_NAME=0000:02:00.0
+MODALIAS=pci:v00008086d0000109Asv000017AAsd00002001bc02sc00i00
+''')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net', 0o755)
+d('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/subsystem', '../../../../../../class/net')
+l('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/device', '../../../0000:02:00.0')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/ifindex', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/features', 0o644, b'0x111ba9\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/iflink', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/dormant', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/dev_id', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/type', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/operstate', 0o644, b'down\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/carrier', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/link_mode', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/tx_queue_len', 0o644, b'1000\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/flags', 0o644, b'0x1003\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/addr_len', 0o644, b'6\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/address', 0o644, b'00:16:41:e2:8d:ff\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/uevent', 0o644, b'''INTERFACE=eth0
+IFINDEX=2
+''')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/mtu', 0o644, b'1500\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/broadcast', 0o644, b'ff:ff:ff:ff:ff:ff\n')
+d('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/tx_aborted_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/rx_crc_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/rx_bytes', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/rx_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/tx_packets', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/tx_carrier_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/tx_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/rx_dropped', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/tx_fifo_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/rx_length_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/tx_dropped', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/rx_fifo_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/rx_missed_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/tx_window_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/collisions', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/rx_frame_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/rx_packets', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/rx_compressed', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/tx_compressed', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/multicast', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/rx_over_errors', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/tx_bytes', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/statistics/tx_heartbeat_errors', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/net/eth0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie00', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie00/subsystem', '../../../../bus/pci_express')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie00/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie00/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie02', 0o755)
+l('sys/devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie02/subsystem', '../../../../bus/pci_express')
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie02/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie02/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1c.0/0000:00:1c.0:pcie02/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.3', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.3/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:18')
+l('sys/devices/pci0000:00/0000:00:1f.3/subsystem', '../../../bus/pci')
+f('sys/devices/pci0000:00/0000:00:1f.3/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1f.3/enable', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.3/modalias', 0o644, b'pci:v00008086d000027DAsv000017AAsd0000200Fbc0Csc05i00\n')
+f('sys/devices/pci0000:00/0000:00:1f.3/resource', 0o644, b'''0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x00000000000018e0 0x00000000000018ff 0x0000000000020101
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1f.3/config', 0o644, b"\x86\x80\xda'\x01\x01\x80\x02\x02\x00\x05\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x17\x0f \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x0f\x02\x00\x00\x00\x00\x00")
+f('sys/devices/pci0000:00/0000:00:1f.3/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1f.3/subsystem_device', 0o644, b'0x200f\n')
+f('sys/devices/pci0000:00/0000:00:1f.3/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1f.3/irq', 0o644, b'11\n')
+f('sys/devices/pci0000:00/0000:00:1f.3/device', 0o644, b'0x27da\n')
+f('sys/devices/pci0000:00/0000:00:1f.3/class', 0o644, b'0x0c0500\n')
+f('sys/devices/pci0000:00/0000:00:1f.3/msi_bus', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.3/subsystem_vendor', 0o644, b'0x17aa\n')
+f('sys/devices/pci0000:00/0000:00:1f.3/uevent', 0o644, b'''PCI_CLASS=C0500
+PCI_ID=8086:27DA
+PCI_SUBSYS_ID=17AA:200F
+PCI_SLOT_NAME=0000:00:1f.3
+MODALIAS=pci:v00008086d000027DAsv000017AAsd0000200Fbc0Csc05i00
+''')
+f('sys/devices/pci0000:00/0000:00:1f.3/resource4', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.3/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1f.3/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.3/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.0/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:19')
+l('sys/devices/pci0000:00/0000:00:1d.0/subsystem', '../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:1d.0/driver', '../../../bus/pci/drivers/uhci_hcd')
+f('sys/devices/pci0000:00/0000:00:1d.0/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/enable', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/modalias', 0o644, b'pci:v00008086d000027C8sv000017AAsd0000200Abc0Csc03i00\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/resource', 0o644, b'''0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000001800 0x000000000000181f 0x0000000000020101
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1d.0/config', 0o644, b"\x86\x80\xc8'\x05\x00\x80\x02\x02\x00\x03\x0c\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x17\n \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x0f\x02\x00\x00\x00\x00\x00")
+f('sys/devices/pci0000:00/0000:00:1d.0/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/subsystem_device', 0o644, b'0x200a\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/irq', 0o644, b'16\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/pools', 0o644, b'''poolinfo - 0.1
+uhci_qh            11   32  128  1
+uhci_td             1   64   64  1
+buffer-2048         0    0 2048  0
+buffer-512          0    0  512  0
+buffer-128          0    0  128  0
+buffer-32           1  128   32  1
+''')
+f('sys/devices/pci0000:00/0000:00:1d.0/device', 0o644, b'0x27c8\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/class', 0o644, b'0x0c0300\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/msi_bus', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.0/subsystem_vendor', 0o644, b'0x17aa\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/uevent', 0o644, b'''DRIVER=uhci_hcd
+PCI_CLASS=C0300
+PCI_ID=8086:27C8
+PCI_SUBSYS_ID=17AA:200A
+PCI_SLOT_NAME=0000:00:1d.0
+MODALIAS=pci:v00008086d000027C8sv000017AAsd0000200Abc0Csc03i00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.0/resource4', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.0/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1d.0/usb1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.0/usb1/subsystem', '../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.0/usb1/driver', '../../../../bus/usb/drivers/usb')
+l('sys/devices/pci0000:00/0000:00:1d.0/usb1/ep_00', 'usb_endpoint/usbdev1.1_ep00')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/version', 0o644, b' 1.10\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/authorized_default', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/maxchild', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/bDeviceClass', 0o644, b'09\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/bcdDevice', 0o644, b'0206\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/devnum', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/bDeviceProtocol', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/idProduct', 0o644, b'0001\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/product', 0o644, b'UHCI Host Controller\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/bDeviceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/configuration', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/dev', 0o644, b'189:0\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/urbnum', 0o644, b'16\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/authorized', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/descriptors', 0o644, b'\x12\x01\x10\x01\t\x00\x00@k\x1d\x01\x00\x06\x02\x03\x02\x01\x01\t\x02\x19\x00\x01\x01\x00\xe0\x00\t\x04\x00\x00\x01\t\x00\x00\x00\x07\x05\x81\x03\x02\x00\xff')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/bNumConfigurations', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/serial', 0o644, b'0000:00:1d.0\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/speed', 0o644, b'12\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/bMaxPacketSize0', 0o644, b'64\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/bmAttributes', 0o644, b'e0\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/busnum', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/quirks', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/bConfigurationValue', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/uevent', 0o644, b'''MAJOR=189
+MINOR=0
+DEVTYPE=usb_device
+DRIVER=usb
+PRODUCT=1d6b/1/206
+TYPE=9/0/0
+BUSNUM=001
+DEVNUM=001
+''')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/manufacturer', 0o644, b'Linux 2.6.27-rc7-00106-g6ef190c-dirty uhci_hcd\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/idVendor', 0o644, b'1d6b\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/bNumInterfaces', 0o644, b' 1\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/bMaxPower', 0o644, b'  0mA\n')
+d('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00/subsystem', '../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00/device', '../../../usb1')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00/bEndpointAddress', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00/type', 0o644, b'Control\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00/dev', 0o644, b'252:1\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00/direction', 0o644, b'both\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00/wMaxPacketSize', 0o644, b'0040\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00/bmAttributes', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00/uevent', 0o644, b'''MAJOR=252
+MINOR=1
+''')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00/bInterval', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/usb_endpoint/usbdev1.1_ep00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/subsystem', '../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/ep_81', 'usb_endpoint/usbdev1.1_ep81')
+l('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/driver', '../../../../../bus/usb/drivers/hub')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/modalias', 0o644, b'usb:v1D6Bp0001d0206dc09dsc00dp00ic09isc00ip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/bInterfaceNumber', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/bNumEndpoints', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/bInterfaceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/bInterfaceClass', 0o644, b'09\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/uevent', 0o644, b'''DEVTYPE=usb_interface
+DRIVER=hub
+PRODUCT=1d6b/1/206
+TYPE=9/0/0
+INTERFACE=9/0/0
+MODALIAS=usb:v1D6Bp0001d0206dc09dsc00dp00ic09isc00ip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81/subsystem', '../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81/device', '../../../1-0:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81/interval', 0o644, b'255ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81/bEndpointAddress', 0o644, b'81\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81/type', 0o644, b'Interrupt\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81/dev', 0o644, b'252:0\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81/wMaxPacketSize', 0o644, b'0002\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81/bmAttributes', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81/uevent', 0o644, b'''MAJOR=252
+MINOR=0
+''')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81/bInterval', 0o644, b'ff\n')
+d('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/usb_endpoint/usbdev1.1_ep81/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/1-0:1.0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.0/usb1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/power/active_duration', 0o644, b'2532\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/power/wakeup', 0o644, b'enabled\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/power/connected_duration', 0o644, b'8372376\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/power/autosuspend', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb1/power/level', 0o644, b'auto\n')
+d('sys/devices/pci0000:00/0000:00:1d.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.0/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/pci0000:00/0000:00:1d.0/usb_host', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.0/usb_host/usb_host1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.0/usb_host/usb_host1/subsystem', '../../../../../class/usb_host')
+l('sys/devices/pci0000:00/0000:00:1d.0/usb_host/usb_host1/device', '../../../0000:00:1d.0')
+f('sys/devices/pci0000:00/0000:00:1d.0/usb_host/usb_host1/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1d.0/usb_host/usb_host1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.0/usb_host/usb_host1/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:16')
+l('sys/devices/pci0000:00/0000:00:1f.2/subsystem', '../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:1f.2/driver', '../../../bus/pci/drivers/ahci')
+f('sys/devices/pci0000:00/0000:00:1f.2/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/resource3', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/enable', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/modalias', 0o644, b'pci:v00008086d000027C5sv000017AAsd0000200Dbc01sc06i01\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/resource', 0o644, b'''0x00000000000018c8 0x00000000000018cf 0x0000000000020101
+0x00000000000018ac 0x00000000000018af 0x0000000000020101
+0x00000000000018c0 0x00000000000018c7 0x0000000000020101
+0x00000000000018a8 0x00000000000018ab 0x0000000000020101
+0x00000000000018b0 0x00000000000018bf 0x0000000000020101
+0x00000000ee404400 0x00000000ee4047ff 0x0000000000020200
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1f.2/config', 0o644, b"\x86\x80\xc5'\x07\x04\xb0\x02\x02\x01\x06\x01\x00\x00\x00\x00\xc9\x18\x00\x00\xad\x18\x00\x00\xc1\x18\x00\x00\xa9\x18\x00\x00\xb1\x18\x00\x00\x00D@\xee\x00\x00\x00\x00\xaa\x17\r \x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x0b\x02\x00\x00\x07\xa3\x00\x80\x00\x00\x00\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05p\x01\x00\x0c0\xe0\xfe\x99A\x00\x00\x00\x00\x00\x00@\x00\x11\x10\x80\x01\x00J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x0f\x02\x00\x00\x00\x00\x00")
+f('sys/devices/pci0000:00/0000:00:1f.2/resource1', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/resource2', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/subsystem_device', 0o644, b'0x200d\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/irq', 0o644, b'506\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/device', 0o644, b'0x27c5\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/class', 0o644, b'0x010601\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/resource5', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/msi_bus', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/resource0', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/subsystem_vendor', 0o644, b'0x17aa\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/uevent', 0o644, b'''DRIVER=ahci
+PCI_CLASS=10601
+PCI_ID=8086:27C5
+PCI_SUBSYS_ID=17AA:200D
+PCI_SLOT_NAME=0000:00:1f.2
+MODALIAS=pci:v00008086d000027C5sv000017AAsd0000200Dbc01sc06i01
+''')
+f('sys/devices/pci0000:00/0000:00:1f.2/resource4', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/subsystem', '../../../../bus/scsi')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/uevent', 0o644, b'DEVTYPE=scsi_host\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/subsystem', '../../../../../bus/scsi')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/uevent', 0o644, b'DEVTYPE=scsi_target\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/generic', 'scsi_generic/sg0')
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/subsystem', '../../../../../../bus/scsi')
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/driver', '../../../../../../bus/scsi/drivers/sd')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/iodone_cnt', 0o644, b'0x6877\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/device_blocked', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/modalias', 0o644, b'scsi:t-0x00\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_level', 0o644, b'6\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/queue_depth', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/rev', 0o644, b'4.06\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/type', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/sw_activity', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/whitespace_test', 0o644, b'WHITE  SPACE   \n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/iocounterbits', 0o644, b'32\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/vendor', 0o644, b'ATA     \n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/state', 0o644, b'running\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/queue_type', 0o644, b'none\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/iorequest_cnt', 0o644, b'0x6877\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/evt_media_change', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/model', 0o644, b'ST910021AS      \n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/ioerr_cnt', 0o644, b'0x6\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/uevent', 0o644, b'''DEVTYPE=scsi_device
+DRIVER=sd
+MODALIAS=scsi:t-0x00
+''')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/timeout', 0o644, b'60\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_disk', 0o755)
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/subsystem', '../../../../../../../../class/scsi_disk')
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/device', '../../../0:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/app_tag_own', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/FUA', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/cache_type', 0o644, b'write back\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/protection_type', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/manage_start_stop', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/allow_restart', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_generic', 0o755)
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_generic/sg0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_generic/sg0/subsystem', '../../../../../../../../class/scsi_generic')
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_generic/sg0/device', '../../../0:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_generic/sg0/dev', 0o644, b'21:0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_generic/sg0/uevent', 0o644, b'''MAJOR=21
+MINOR=0
+''')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_generic/sg0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_generic/sg0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/bsg', 0o755)
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/bsg/0:0:0:0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/bsg/0:0:0:0/subsystem', '../../../../../../../../class/bsg')
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/bsg/0:0:0:0/device', '../../../0:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/bsg/0:0:0:0/dev', 0o644, b'254:0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/bsg/0:0:0:0/uevent', 0o644, b'''MAJOR=254
+MINOR=0
+''')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/bsg/0:0:0:0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/bsg/0:0:0:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block', 0o755)
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/subsystem', '../../../../../../../../class/block')
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/bdi', '../../../../../../../virtual/bdi/8:0')
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/device', '../../../0:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/capability', 0o644, b'12\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/ro', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/make-it-fail', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/test:colon+plus', 0o644, b'colon\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/size', 0o644, b'195371568\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/dev', 0o644, b'8:0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/range', 0o644, b'16\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/removable', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/stat', 0o644, b'   12939     5801   590192   194190    13755    63323   617056  2678026        0   114408  2872209\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/uevent', 0o644, b'''MAJOR=8
+MINOR=0
+DEVTYPE=disk
+DEVNAME=sda
+''')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/test_empty_file', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/bsg', '../../../bsg/0:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/nr_requests', 0o644, b'128\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/nomerges', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/scheduler', 0o644, b'noop anticipatory deadline [cfq] \n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/hw_sector_size', 0o644, b'512\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/max_hw_sectors_kb', 0o644, b'32767\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/read_ahead_kb', 0o644, b'128\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/max_sectors_kb', 0o644, b'512\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/iosched', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/iosched/slice_async_rq', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/iosched/back_seek_max', 0o644, b'16384\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/iosched/slice_sync', 0o644, b'100\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/iosched/slice_async', 0o644, b'40\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/iosched/fifo_expire_sync', 0o644, b'125\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/iosched/slice_idle', 0o644, b'8\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/iosched/back_seek_penalty', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/iosched/fifo_expire_async', 0o644, b'250\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/queue/iosched/quantum', 0o644, b'4\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10/subsystem', '../../../../../../../../../class/block')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10/start', 0o644, b'190820133\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10/make-it-fail', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10/size', 0o644, b'4546332\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10/dev', 0o644, b'8:10\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10/stat', 0o644, b'      42       43      384      417        0        0        0        0        0      286      417\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10/uevent', 0o644, b'''MAJOR=8
+MINOR=10
+DEVTYPE=partition
+''')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda10/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9/subsystem', '../../../../../../../../../class/block')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9/start', 0o644, b'143942463\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9/make-it-fail', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9/size', 0o644, b'46877607\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9/dev', 0o644, b'8:9\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9/stat', 0o644, b'      70      322      896      800        3        0       40      240        0      945     1039\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9/uevent', 0o644, b'''MAJOR=8
+MINOR=9
+DEVTYPE=partition
+''')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9/holders', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9/holders/md0', '../../../../../../../../../virtual/block/md0')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7/subsystem', '../../../../../../../../../class/block')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7/start', 0o644, b'104872383\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7/make-it-fail', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7/size', 0o644, b'19534977\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7/dev', 0o644, b'8:7\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7/stat', 0o644, b'      35      263      298      419        0        0        0        0        0      298      419\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7/uevent', 0o644, b'''MAJOR=8
+MINOR=7
+DEVTYPE=partition
+''')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda7/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1/subsystem', '../../../../../../../../../class/block')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1/start', 0o644, b'63\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1/make-it-fail', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1/size', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1/dev', 0o644, b'8:1\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1/stat', 0o644, b'       2        0        4       36        0        0        0        0        0       36       36\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1/uevent', 0o644, b'''MAJOR=8
+MINOR=1
+DEVTYPE=partition
+DEVNAME=sda1
+''')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8/subsystem', '../../../../../../../../../class/block')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8/start', 0o644, b'124407423\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8/make-it-fail', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8/size', 0o644, b'19534977\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8/dev', 0o644, b'8:8\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8/stat', 0o644, b'      34      264      298      498        0        0        0        0        0      368      498\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8/uevent', 0o644, b'''MAJOR=8
+MINOR=8
+DEVTYPE=partition
+''')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda8/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5/subsystem', '../../../../../../../../../class/block')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5/start', 0o644, b'126\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5/make-it-fail', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5/size', 0o644, b'62926479\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5/dev', 0o644, b'8:5\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5/stat', 0o644, b'   11087     4819   566626   169007     2951     4548    59992   129572        0    65249   298573\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5/uevent', 0o644, b'''MAJOR=8
+MINOR=5
+DEVTYPE=partition
+DEVNAME=sda5
+''')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda5/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6/subsystem', '../../../../../../../../../class/block')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6/start', 0o644, b'62926668\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6/make-it-fail', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6/size', 0o644, b'41945652\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6/dev', 0o644, b'8:6\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6/stat', 0o644, b'    1648       67    21334    22824    10801    58775   557024  2548214        0    51231  2571037\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6/uevent', 0o644, b'''MAJOR=8
+MINOR=6
+DEVTYPE=partition
+''')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda6/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_device', 0o755)
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_device/0:0:0:0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_device/0:0:0:0/subsystem', '../../../../../../../../class/scsi_device')
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_device/0:0:0:0/device', '../../../0:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_device/0:0:0:0/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_device/0:0:0:0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/scsi_device/0:0:0:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host', 0o755)
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/subsystem', '../../../../../../class/scsi_host')
+l('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/device', '../../../host0')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/unique_id', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/can_queue', 0o644, b'31\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/unchecked_isa_dma', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/active_mode', 0o644, b'Initiator\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/sg_tablesize', 0o644, b'168\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/prot_guard_type', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/link_power_management_policy', 0o644, b'medium_power\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/host_busy', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/proc_name', 0o644, b'ahci\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/state', 0o644, b'running\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/cmd_per_lun', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/em_message', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/em_message_type', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/supported_mode', 0o644, b'Initiator\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/uevent', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/prot_capabilities', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host1/subsystem', '../../../../bus/scsi')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/uevent', 0o644, b'DEVTYPE=scsi_host\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host', 0o755)
+d('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/subsystem', '../../../../../../class/scsi_host')
+l('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/device', '../../../host1')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/unique_id', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/can_queue', 0o644, b'31\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/unchecked_isa_dma', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/active_mode', 0o644, b'Initiator\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/sg_tablesize', 0o644, b'168\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/prot_guard_type', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/link_power_management_policy', 0o644, b'max_performance\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/host_busy', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/proc_name', 0o644, b'ahci\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/state', 0o644, b'running\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/cmd_per_lun', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/em_message', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/em_message_type', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/supported_mode', 0o644, b'Initiator\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/uevent', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/prot_capabilities', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host2', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host2/subsystem', '../../../../bus/scsi')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/uevent', 0o644, b'DEVTYPE=scsi_host\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host2/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host', 0o755)
+d('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/subsystem', '../../../../../../class/scsi_host')
+l('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/device', '../../../host2')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/unique_id', 0o644, b'3\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/can_queue', 0o644, b'31\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/unchecked_isa_dma', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/active_mode', 0o644, b'Initiator\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/sg_tablesize', 0o644, b'168\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/prot_guard_type', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/link_power_management_policy', 0o644, b'max_performance\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/host_busy', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/proc_name', 0o644, b'ahci\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/state', 0o644, b'running\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/cmd_per_lun', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/em_message', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/em_message_type', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/supported_mode', 0o644, b'Initiator\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/uevent', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/prot_capabilities', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host3', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host3/subsystem', '../../../../bus/scsi')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/uevent', 0o644, b'DEVTYPE=scsi_host\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host3/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host', 0o755)
+d('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/subsystem', '../../../../../../class/scsi_host')
+l('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/device', '../../../host3')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/unique_id', 0o644, b'4\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/can_queue', 0o644, b'31\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/unchecked_isa_dma', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/active_mode', 0o644, b'Initiator\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/sg_tablesize', 0o644, b'168\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/prot_guard_type', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/link_power_management_policy', 0o644, b'max_performance\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/host_busy', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/proc_name', 0o644, b'ahci\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/state', 0o644, b'running\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/cmd_per_lun', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/em_message', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/em_message_type', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/supported_mode', 0o644, b'Initiator\n')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/uevent', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/prot_capabilities', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.2', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.2/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:1d')
+l('sys/devices/pci0000:00/0000:00:1d.2/subsystem', '../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:1d.2/driver', '../../../bus/pci/drivers/uhci_hcd')
+f('sys/devices/pci0000:00/0000:00:1d.2/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/enable', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/modalias', 0o644, b'pci:v00008086d000027CAsv000017AAsd0000200Abc0Csc03i00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/resource', 0o644, b'''0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000001840 0x000000000000185f 0x0000000000020101
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1d.2/config', 0o644, b"\x86\x80\xca'\x05\x00\x80\x02\x02\x00\x03\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00A\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x17\n \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x0f\x02\x00\x00\x00\x00\x00")
+f('sys/devices/pci0000:00/0000:00:1d.2/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/subsystem_device', 0o644, b'0x200a\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/irq', 0o644, b'18\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/pools', 0o644, b'''poolinfo - 0.1
+uhci_qh            13   32  128  1
+uhci_td             4   64   64  1
+buffer-2048         0    0 2048  0
+buffer-512          0    0  512  0
+buffer-128          3   32  128  1
+buffer-32           2  128   32  1
+''')
+f('sys/devices/pci0000:00/0000:00:1d.2/device', 0o644, b'0x27ca\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/class', 0o644, b'0x0c0300\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/msi_bus', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.2/subsystem_vendor', 0o644, b'0x17aa\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/uevent', 0o644, b'''DRIVER=uhci_hcd
+PCI_CLASS=C0300
+PCI_ID=8086:27CA
+PCI_SUBSYS_ID=17AA:200A
+PCI_SLOT_NAME=0000:00:1d.2
+MODALIAS=pci:v00008086d000027CAsv000017AAsd0000200Abc0Csc03i00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.2/resource4', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.2/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.2/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb_host', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.2/usb_host/usb_host3', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.2/usb_host/usb_host3/subsystem', '../../../../../class/usb_host')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb_host/usb_host3/device', '../../../0000:00:1d.2')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb_host/usb_host3/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb_host/usb_host3/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.2/usb_host/usb_host3/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/subsystem', '../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/driver', '../../../../bus/usb/drivers/usb')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/ep_00', 'usb_endpoint/usbdev3.1_ep00')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/version', 0o644, b' 1.10\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/authorized_default', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/maxchild', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/bDeviceClass', 0o644, b'09\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/bcdDevice', 0o644, b'0206\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/devnum', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/bDeviceProtocol', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/idProduct', 0o644, b'0001\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/product', 0o644, b'UHCI Host Controller\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/bDeviceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/configuration', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/dev', 0o644, b'189:256\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/urbnum', 0o644, b'68\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/authorized', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/descriptors', 0o644, b'\x12\x01\x10\x01\t\x00\x00@k\x1d\x01\x00\x06\x02\x03\x02\x01\x01\t\x02\x19\x00\x01\x01\x00\xe0\x00\t\x04\x00\x00\x01\t\x00\x00\x00\x07\x05\x81\x03\x02\x00\xff')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/bNumConfigurations', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/serial', 0o644, b'0000:00:1d.2\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/speed', 0o644, b'12\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/bMaxPacketSize0', 0o644, b'64\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/bmAttributes', 0o644, b'e0\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/busnum', 0o644, b'3\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/quirks', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/bConfigurationValue', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/uevent', 0o644, b'''MAJOR=189
+MINOR=256
+DEVTYPE=usb_device
+DRIVER=usb
+PRODUCT=1d6b/1/206
+TYPE=9/0/0
+BUSNUM=003
+DEVNUM=001
+''')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/manufacturer', 0o644, b'Linux 2.6.27-rc7-00106-g6ef190c-dirty uhci_hcd\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/idVendor', 0o644, b'1d6b\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/bNumInterfaces', 0o644, b' 1\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/bMaxPower', 0o644, b'  0mA\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00/subsystem', '../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00/device', '../../../usb3')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00/bEndpointAddress', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00/type', 0o644, b'Control\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00/dev', 0o644, b'252:5\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00/direction', 0o644, b'both\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00/wMaxPacketSize', 0o644, b'0040\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00/bmAttributes', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00/uevent', 0o644, b'''MAJOR=252
+MINOR=5
+''')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00/bInterval', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/usb_endpoint/usbdev3.1_ep00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/subsystem', '../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/ep_81', 'usb_endpoint/usbdev3.1_ep81')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/driver', '../../../../../bus/usb/drivers/hub')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/modalias', 0o644, b'usb:v1D6Bp0001d0206dc09dsc00dp00ic09isc00ip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/bInterfaceNumber', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/bNumEndpoints', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/bInterfaceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/bInterfaceClass', 0o644, b'09\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/uevent', 0o644, b'''DEVTYPE=usb_interface
+DRIVER=hub
+PRODUCT=1d6b/1/206
+TYPE=9/0/0
+INTERFACE=9/0/0
+MODALIAS=usb:v1D6Bp0001d0206dc09dsc00dp00ic09isc00ip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81/subsystem', '../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81/device', '../../../3-0:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81/interval', 0o644, b'255ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81/bEndpointAddress', 0o644, b'81\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81/type', 0o644, b'Interrupt\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81/dev', 0o644, b'252:4\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81/wMaxPacketSize', 0o644, b'0002\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81/bmAttributes', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81/uevent', 0o644, b'''MAJOR=252
+MINOR=4
+''')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81/bInterval', 0o644, b'ff\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/usb_endpoint/usbdev3.1_ep81/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-0:1.0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/power/active_duration', 0o644, b'603809\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/power/wakeup', 0o644, b'enabled\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/power/connected_duration', 0o644, b'8372166\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/power/autosuspend', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/power/level', 0o644, b'auto\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/subsystem', '../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/driver', '../../../../../bus/usb/drivers/usb')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/ep_00', 'usb_endpoint/usbdev3.4_ep00')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/version', 0o644, b' 2.00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/maxchild', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/bDeviceClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/bcdDevice', 0o644, b'2000\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/devnum', 0o644, b'4\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/bDeviceProtocol', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/idProduct', 0o644, b'c03e\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/product', 0o644, b'USB-PS/2 Optical Mouse\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/bDeviceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/configuration', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/dev', 0o644, b'189:259\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/urbnum', 0o644, b'12\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/authorized', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/descriptors', 0o644, b'\x12\x01\x00\x02\x00\x00\x00\x08m\x04>\xc0\x00 \x01\x02\x00\x01\t\x02"\x00\x01\x01\x00\xa01\t\x04\x00\x00\x01\x03\x01\x02\x00\t!\x10\x01\x00\x01"2\x00\x07\x05\x81\x03\x04\x00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/bNumConfigurations', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/speed', 0o644, b'1.5\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/bMaxPacketSize0', 0o644, b'8\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/bmAttributes', 0o644, b'a0\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/busnum', 0o644, b'3\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/quirks', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/bConfigurationValue', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/uevent', 0o644, b'''MAJOR=189
+MINOR=259
+DEVTYPE=usb_device
+DRIVER=usb
+PRODUCT=46d/c03e/2000
+TYPE=0/0/0
+BUSNUM=003
+DEVNUM=004
+''')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/manufacturer', 0o644, b'Logitech\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/idVendor', 0o644, b'046d\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/bNumInterfaces', 0o644, b' 1\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/bMaxPower', 0o644, b' 98mA\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00/subsystem', '../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00/device', '../../../3-1')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00/bEndpointAddress', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00/type', 0o644, b'Control\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00/dev', 0o644, b'252:26\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00/direction', 0o644, b'both\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00/wMaxPacketSize', 0o644, b'0008\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00/bmAttributes', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00/uevent', 0o644, b'''MAJOR=252
+MINOR=26
+''')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00/bInterval', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/usb_endpoint/usbdev3.4_ep00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/power/active_duration', 0o644, b'51384\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/power/wakeup', 0o644, b'enabled\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/power/connected_duration', 0o644, b'51383\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/power/autosuspend', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/power/persist', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/power/level', 0o644, b'on\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/subsystem', '../../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/ep_81', 'usb_endpoint/usbdev3.4_ep81')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/driver', '../../../../../../bus/usb/drivers/usbhid')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/modalias', 0o644, b'usb:v046DpC03Ed2000dc00dsc00dp00ic03isc01ip02\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/bInterfaceNumber', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/bNumEndpoints', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/bInterfaceSubClass', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/bInterfaceClass', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/uevent', 0o644, b'''DEVTYPE=usb_interface
+DRIVER=usbhid
+PRODUCT=46d/c03e/2000
+TYPE=0/0/0
+INTERFACE=3/1/2
+MODALIAS=usb:v046DpC03Ed2000dc00dsc00dp00ic03isc01ip02
+''')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/bInterfaceProtocol', 0o644, b'02\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81/subsystem', '../../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81/device', '../../../3-1:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81/interval', 0o644, b'10ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81/bEndpointAddress', 0o644, b'81\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81/type', 0o644, b'Interrupt\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81/dev', 0o644, b'252:25\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81/wMaxPacketSize', 0o644, b'0004\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81/bmAttributes', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81/uevent', 0o644, b'''MAJOR=252
+MINOR=25
+''')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81/bInterval', 0o644, b'0a\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/usb_endpoint/usbdev3.4_ep81/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/subsystem', '../../../../../../../../class/input')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/device', '../../../3-1:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/uniq', 0o644, b'\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/phys', 0o644, b'usb-0000:00:1d.2-1/input0\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/modalias', 0o644, b'input:b0003v046DpC03Ee0110-e0,1,2,4,k110,111,112,r0,1,8,am4,lsfw\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/name', 0o644, b'Logitech USB-PS/2 Optical Mouse\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/uevent', 0o644, b'''PRODUCT=3/46d/c03e/110
+NAME="Logitech USB-PS/2 Optical Mouse"
+PHYS="usb-0000:00:1d.2-1/input0"
+UNIQ=""
+EV==17
+KEY==70000 0 0 0 0
+REL==103
+MSC==10
+MODALIAS=input:b0003v046DpC03Ee0110-e0,1,2,4,k110,111,112,r0,1,8,am4,lsfw
+''')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/mouse1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/mouse1/subsystem', '../../../../../../../../../class/input')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/mouse1/device', '../../input8')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/mouse1/dev', 0o644, b'13:33\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/mouse1/uevent', 0o644, b'''MAJOR=13
+MINOR=33
+''')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/mouse1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/mouse1/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/id', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/id/version', 0o644, b'0110\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/id/product', 0o644, b'c03e\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/id/vendor', 0o644, b'046d\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/id/bustype', 0o644, b'0003\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/event7', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/event7/subsystem', '../../../../../../../../../class/input')
+l('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/event7/device', '../../input8')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/event7/dev', 0o644, b'13:71\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/event7/uevent', 0o644, b'''MAJOR=13
+MINOR=71
+''')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/event7/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/event7/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/capabilities', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/capabilities/msc', 0o644, b'10\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/capabilities/abs', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/capabilities/snd', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/capabilities/ff', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/capabilities/key', 0o644, b'70000 0 0 0 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/capabilities/rel', 0o644, b'103\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/capabilities/sw', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/capabilities/ev', 0o644, b'17\n')
+f('sys/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input8/capabilities/led', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:01.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:01.0/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:06')
+l('sys/devices/pci0000:00/0000:00:01.0/subsystem', '../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:01.0/driver', '../../../bus/pci/drivers/pcieport-driver')
+f('sys/devices/pci0000:00/0000:00:01.0/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:01.0/enable', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:01.0/modalias', 0o644, b'pci:v00008086d000027A1sv00000000sd00000000bc06sc04i00\n')
+f('sys/devices/pci0000:00/0000:00:01.0/resource', 0o644, b'''0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000002000 0x0000000000002fff 0x0000000000000100
+0x00000000ee100000 0x00000000ee1fffff 0x0000000000000200
+0x00000000d0000000 0x00000000dfffffff 0x0000000000001201
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:01.0/config', 0o644, b'\x86\x80\xa1\'\x07\x05\x10\x00\x03\x00\x04\x06\x10\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00  \x00\x00\x10\xee\x10\xee\x01\xd0\xf1\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\x90\x02\xc8\x00\x00\x00\x00\r\x80\x00\x00\xaa\x17\x14 \x05\xa0\x01\x00\x0c0\xe0\xfeqA\x00\x00\x00\x00\x00\x00\x10\x00A\x01\x00\x00\x00\x00\x00\x00\x01\x00\x01M\x01\x02\x03\x00\x01\x11\x80%\x08\x00\xc0\x01H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x0f\x00\x00\x00\x00\x86\x0f\x05\x00\x00\x00\x00\x80\x02\x00\x01\x14\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x80\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x01\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x01\x00\x00\x01\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x90\xd1\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x06\x00\x01\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x7f \x08\xf4\x0c\x00\x00\xb04 \x00\x00\x00\x00\x003\x0f\x00\x00\xff\xff\x03\x00\xd0\x0f\xf1\x05\xd1\x0f\xd1\x0f\x08\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\r/B\x00\x0c\x00\x00\x14\xb5\xbcJ\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\x0b\xe0\x00Q\x0b\xfe\x00 \x00\x08\x00\x85\x03\xf1\x00\x87\x03\xf3\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x04\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x14\x08\x88\x00\x00\x00\x00\x00\x00\x00\x00"wD\xb23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06`\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x06b\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\n\x06`\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\r\x06b\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x06`\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x06b\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x003\x06`\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x004\x06b\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x06`\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x002\x06b\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x004\x06`\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x002\x06b\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00;\x06`\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x003\x06b\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x009\x06`\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00:\x06b\x00 \x00\x00`\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x007')
+f('sys/devices/pci0000:00/0000:00:01.0/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:01.0/subsystem_device', 0o644, b'0x0000\n')
+f('sys/devices/pci0000:00/0000:00:01.0/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:01.0/irq', 0o644, b'511\n')
+f('sys/devices/pci0000:00/0000:00:01.0/device', 0o644, b'0x27a1\n')
+f('sys/devices/pci0000:00/0000:00:01.0/class', 0o644, b'0x060400\n')
+f('sys/devices/pci0000:00/0000:00:01.0/msi_bus', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:01.0/subsystem_vendor', 0o644, b'0x0000\n')
+f('sys/devices/pci0000:00/0000:00:01.0/uevent', 0o644, b'''DRIVER=pcieport-driver
+PCI_CLASS=60400
+PCI_ID=8086:27A1
+PCI_SUBSYS_ID=0000:0000
+PCI_SLOT_NAME=0000:00:01.0
+MODALIAS=pci:v00008086d000027A1sv00000000sd00000000bc06sc04i00
+''')
+f('sys/devices/pci0000:00/0000:00:01.0/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:01.0/pci_bus', 0o755)
+d('sys/devices/pci0000:00/0000:00:01.0/pci_bus/0000:01', 0o755)
+l('sys/devices/pci0000:00/0000:00:01.0/pci_bus/0000:01/subsystem', '../../../../../class/pci_bus')
+l('sys/devices/pci0000:00/0000:00:01.0/pci_bus/0000:01/device', '../../../0000:00:01.0')
+f('sys/devices/pci0000:00/0000:00:01.0/pci_bus/0000:01/cpuaffinity', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:01.0/pci_bus/0000:01/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:01.0/pci_bus/0000:01/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:01.0/pci_bus/0000:01/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:01.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:01.0/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/pci0000:00/0000:00:01.0/0000:00:01.0:pcie03', 0o755)
+l('sys/devices/pci0000:00/0000:00:01.0/0000:00:01.0:pcie03/subsystem', '../../../../bus/pci_express')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:00:01.0:pcie03/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:01.0/0000:00:01.0:pcie03/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:01.0/0000:00:01.0:pcie03/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/firmware_node', '../../../LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07')
+l('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/subsystem', '../../../../bus/pci')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/enable', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/modalias', 0o644, b'pci:v00001002d000071D4sv000017AAsd000020A4bc03sc00i00\n')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/resource', 0o644, b'''0x00000000d0000000 0x00000000dfffffff 0x0000000000021208
+0x0000000000002000 0x00000000000020ff 0x0000000000020101
+0x00000000ee100000 0x00000000ee10ffff 0x0000000000020200
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x00000000ee120000 0x00000000ee13ffff 0x0000000000027202
+''')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/config', 0o644, b'\x02\x10\xd4q\x07\x01\x10\x00\x00\x00\x00\x03\x10\x00\x00\x00\x08\x00\x00\xd0\x01 \x00\x00\x00\x00\x10\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x17\xa4 \x00\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x17\xa4 \x01X\x02\x06\x00\x00\x00\x00\x10\x80\x11\x00\xa0\x0f,\x01\x10\x08\x00\x00\x01\r\x00\x00C\x00\x01\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11 \x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00@\x03\x00\x00\x00$\x8f\x0b\x00\xff\xff\x07e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/resource1', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/resource2', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/subsystem_device', 0o644, b'0x20a4\n')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/vendor', 0o644, b'0x1002\n')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/irq', 0o644, b'11\n')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/device', 0o644, b'0x71d4\n')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/class', 0o644, b'0x030000\n')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/rom', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/msi_bus', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/resource0', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/subsystem_vendor', 0o644, b'0x17aa\n')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/uevent', 0o644, b'''PCI_CLASS=30000
+PCI_ID=1002:71D4
+PCI_SUBSYS_ID=17AA:20A4
+PCI_SLOT_NAME=0000:01:00.0
+MODALIAS=pci:v00001002d000071D4sv000017AAsd000020A4bc03sc00i00
+''')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/resource0_wc', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:01.0/0000:00:01.0:pcie00', 0o755)
+l('sys/devices/pci0000:00/0000:00:01.0/0000:00:01.0:pcie00/subsystem', '../../../../bus/pci_express')
+f('sys/devices/pci0000:00/0000:00:01.0/0000:00:01.0:pcie00/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:01.0/0000:00:01.0:pcie00/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:01.0/0000:00:01.0:pcie00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.1/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:13')
+l('sys/devices/pci0000:00/0000:00:1f.1/subsystem', '../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:1f.1/driver', '../../../bus/pci/drivers/ata_piix')
+f('sys/devices/pci0000:00/0000:00:1f.1/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/resource3', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.1/enable', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/modalias', 0o644, b'pci:v00008086d000027DFsv000017AAsd0000200Cbc01sc01i8a\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/resource', 0o644, b'''0x00000000000001f0 0x00000000000001f7 0x0000000000000110
+0x00000000000003f6 0x00000000000003f6 0x0000000000000110
+0x0000000000000170 0x0000000000000177 0x0000000000000110
+0x0000000000000376 0x0000000000000376 0x0000000000000110
+0x0000000000001880 0x000000000000188f 0x0000000000020101
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1f.1/config', 0o644, b"\x86\x80\xdf'\x05\x00\x80\x02\x02\x8a\x01\x01\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x81\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x17\x0c \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x03\x00\x00\x03\xe3\x00@\x00\x00\x00\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x0f\x02\x00\x00\x00\x00\x00")
+f('sys/devices/pci0000:00/0000:00:1f.1/resource1', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.1/resource2', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.1/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/subsystem_device', 0o644, b'0x200c\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/irq', 0o644, b'16\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/device', 0o644, b'0x27df\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/class', 0o644, b'0x01018a\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/msi_bus', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.1/resource0', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.1/subsystem_vendor', 0o644, b'0x17aa\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/uevent', 0o644, b'''DRIVER=ata_piix
+PCI_CLASS=1018A
+PCI_ID=8086:27DF
+PCI_SUBSYS_ID=17AA:200C
+PCI_SLOT_NAME=0000:00:1f.1
+MODALIAS=pci:v00008086d000027DFsv000017AAsd0000200Cbc01sc01i8a
+''')
+f('sys/devices/pci0000:00/0000:00:1f.1/resource4', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.1/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host5', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.1/host5/subsystem', '../../../../bus/scsi')
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/uevent', 0o644, b'DEVTYPE=scsi_host\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host5/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host', 0o755)
+d('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/subsystem', '../../../../../../class/scsi_host')
+l('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/device', '../../../host5')
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/unique_id', 0o644, b'6\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/can_queue', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/unchecked_isa_dma', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/active_mode', 0o644, b'Initiator\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/sg_tablesize', 0o644, b'128\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/prot_guard_type', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/host_busy', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/proc_name', 0o644, b'ata_piix\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/state', 0o644, b'running\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/cmd_per_lun', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/supported_mode', 0o644, b'Initiator\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/uevent', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/prot_capabilities', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.1/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/subsystem', '../../../../bus/scsi')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/uevent', 0o644, b'DEVTYPE=scsi_host\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/subsystem', '../../../../../bus/scsi')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/uevent', 0o644, b'DEVTYPE=scsi_target\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/generic', 'scsi_generic/sg1')
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/subsystem', '../../../../../../bus/scsi')
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/driver', '../../../../../../bus/scsi/drivers/sr')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/iodone_cnt', 0o644, b'0x20b3\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/device_blocked', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/modalias', 0o644, b'scsi:t-0x05\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_level', 0o644, b'6\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/queue_depth', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/rev', 0o644, b'RB01\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/type', 0o644, b'5\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/iocounterbits', 0o644, b'32\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/vendor', 0o644, b'MATSHITA\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/state', 0o644, b'running\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/queue_type', 0o644, b'none\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/iorequest_cnt', 0o644, b'0x82a9\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/evt_media_change', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/model', 0o644, b'DVD-RAM UJ-842  \n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/ioerr_cnt', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/uevent', 0o644, b'''DEVTYPE=scsi_device
+DRIVER=sr
+MODALIAS=scsi:t-0x05
+''')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/timeout', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_generic', 0o755)
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_generic/sg1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_generic/sg1/subsystem', '../../../../../../../../class/scsi_generic')
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_generic/sg1/device', '../../../4:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_generic/sg1/dev', 0o644, b'21:1\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_generic/sg1/uevent', 0o644, b'''MAJOR=21
+MINOR=1
+''')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_generic/sg1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_generic/sg1/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/bsg', 0o755)
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/bsg/4:0:0:0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/bsg/4:0:0:0/subsystem', '../../../../../../../../class/bsg')
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/bsg/4:0:0:0/device', '../../../4:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/bsg/4:0:0:0/dev', 0o644, b'254:1\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/bsg/4:0:0:0/uevent', 0o644, b'''MAJOR=254
+MINOR=1
+''')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/bsg/4:0:0:0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/bsg/4:0:0:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block', 0o755)
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/subsystem', '../../../../../../../../class/block')
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/bdi', '../../../../../../../virtual/bdi/11:0')
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/device', '../../../4:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/capability', 0o644, b'19\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/ro', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/make-it-fail', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/size', 0o644, b'2097151\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/dev', 0o644, b'11:0\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/range', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/removable', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/stat', 0o644, b'       0        0        0        0        0        0        0        0        0        0        0\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/uevent', 0o644, b'''MAJOR=11
+MINOR=0
+DEVTYPE=disk
+''')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/nr_requests', 0o644, b'128\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/nomerges', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/scheduler', 0o644, b'noop anticipatory deadline [cfq] \n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/hw_sector_size', 0o644, b'512\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/max_hw_sectors_kb', 0o644, b'128\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/read_ahead_kb', 0o644, b'128\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/max_sectors_kb', 0o644, b'128\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/iosched', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/iosched/slice_async_rq', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/iosched/back_seek_max', 0o644, b'16384\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/iosched/slice_sync', 0o644, b'100\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/iosched/slice_async', 0o644, b'40\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/iosched/fifo_expire_sync', 0o644, b'125\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/iosched/slice_idle', 0o644, b'8\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/iosched/back_seek_penalty', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/iosched/fifo_expire_async', 0o644, b'250\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/queue/iosched/quantum', 0o644, b'4\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/block/sr0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_device', 0o755)
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_device/4:0:0:0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_device/4:0:0:0/subsystem', '../../../../../../../../class/scsi_device')
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_device/4:0:0:0/device', '../../../4:0:0:0')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_device/4:0:0:0/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_device/4:0:0:0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0/scsi_device/4:0:0:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host', 0o755)
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4', 0o755)
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/subsystem', '../../../../../../class/scsi_host')
+l('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/device', '../../../host4')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/unique_id', 0o644, b'5\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/can_queue', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/unchecked_isa_dma', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/active_mode', 0o644, b'Initiator\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/sg_tablesize', 0o644, b'128\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/prot_guard_type', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/host_busy', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/proc_name', 0o644, b'ata_piix\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/state', 0o644, b'running\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/cmd_per_lun', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/supported_mode', 0o644, b'Initiator\n')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/uevent', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/prot_capabilities', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1e.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1e.0/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:11')
+l('sys/devices/pci0000:00/0000:00:1e.0/subsystem', '../../../bus/pci')
+f('sys/devices/pci0000:00/0000:00:1e.0/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/enable', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/modalias', 0o644, b'pci:v00008086d00002448sv00000000sd00000000bc06sc04i01\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/resource', 0o644, b'''0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x000000000000a000 0x000000000000dfff 0x0000000000000100
+0x00000000e4300000 0x00000000e7ffffff 0x0000000000000200
+0x00000000e0000000 0x00000000e3ffffff 0x0000000000001201
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1e.0/config', 0o644, b'\x86\x80H$\x07\x00\x10\x00\xe2\x01\x04\x06\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x18 \xa0\xd0\x80"0\xe4\xf0\xe7\x01\xe0\xf1\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\r\x00\x00\x00\xaa\x17\x13 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x0f\x02\x00\x00\x00\x00\x00')
+f('sys/devices/pci0000:00/0000:00:1e.0/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/subsystem_device', 0o644, b'0x0000\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/irq', 0o644, b'0\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/device', 0o644, b'0x2448\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/class', 0o644, b'0x060401\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/msi_bus', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/subsystem_vendor', 0o644, b'0x0000\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/uevent', 0o644, b'''PCI_CLASS=60401
+PCI_ID=8086:2448
+PCI_SUBSYS_ID=0000:0000
+PCI_SLOT_NAME=0000:00:1e.0
+MODALIAS=pci:v00008086d00002448sv00000000sd00000000bc06sc04i01
+''')
+f('sys/devices/pci0000:00/0000:00:1e.0/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1e.0/pci_bus', 0o755)
+d('sys/devices/pci0000:00/0000:00:1e.0/pci_bus/0000:15', 0o755)
+l('sys/devices/pci0000:00/0000:00:1e.0/pci_bus/0000:15/subsystem', '../../../../../class/pci_bus')
+l('sys/devices/pci0000:00/0000:00:1e.0/pci_bus/0000:15/device', '../../../0000:00:1e.0')
+f('sys/devices/pci0000:00/0000:00:1e.0/pci_bus/0000:15/cpuaffinity', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/pci_bus/0000:15/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1e.0/pci_bus/0000:15/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1e.0/pci_bus/0000:15/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1e.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1e.0/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/firmware_node', '../../../LNXSYSTM:00/device:00/PNP0A08:00/device:11/device:12')
+l('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/subsystem', '../../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/driver', '../../../../bus/pci/drivers/yenta_cardbus')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/enable', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/modalias', 0o644, b'pci:v0000104Cd0000AC56sv000017AAsd00002012bc06sc07i00\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/resource', 0o644, b'''0x00000000e4300000 0x00000000e4300fff 0x0000000000020200
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x000000000000a000 0x000000000000a0ff 0x0000000000020100
+0x000000000000a400 0x000000000000a4ff 0x0000000000020100
+0x00000000e0000000 0x00000000e3ffffff 0x0000000000021200
+0x0000000088000000 0x000000008bffffff 0x0000000000020200
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/config', 0o644, b'L\x10V\xac\x07\x00\x10\x02\x00\x00\x07\x06\x10\xa8\x02\x00\x00\x000\xe4\xa0\x00\x00\x02\x15\x16\x17\xb0\x00\x00\x00\xe0\x00\xf0\xff\xe3\x00\x00\x00\x88\x00\xf0\xff\x8b\x00\xa0\x00\x00\xfc\xa0\x00\x00\x00\xa4\x00\x00\xfc\xa4\x00\x00\x0b\x01\xc0\x05\xaa\x17\x12 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xd0D\x08\x00\x00\x00\x00\x00\x00\x00\x00\x02\x10\xd0\x01\xc0\x02d@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x12\xfe\x00\x00\xc0\x00\x07\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/yenta_registers', 0o644, b'''CB registers:
+00: 00000000 00000006 30000087 00000000
+10: 00000400 00000000 00000000 00000000
+20: 00000000
+
+ExCA registers:
+00: 84 01 00 50 00 08 00 00 - 00 00 01 00 00 00 01 00
+10: 00 00 00 00 00 00 c0 00 - 00 00 00 00 00 00 00 00
+20: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
+30: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
+40: 00 00 00 00 00
+''')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/subsystem_device', 0o644, b'0x2012\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/vendor', 0o644, b'0x104c\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/irq', 0o644, b'16\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/device', 0o644, b'0xac56\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/class', 0o644, b'0x060700\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/msi_bus', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/resource0', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/subsystem_vendor', 0o644, b'0x17aa\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/uevent', 0o644, b'''DRIVER=yenta_cardbus
+PCI_CLASS=60700
+PCI_ID=104C:AC56
+PCI_SUBSYS_ID=17AA:2012
+PCI_SLOT_NAME=0000:15:00.0
+MODALIAS=pci:v0000104Cd0000AC56sv000017AAsd00002012bc06sc07i00
+''')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pci_bus', 0o755)
+d('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pci_bus/0000:16', 0o755)
+l('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pci_bus/0000:16/subsystem', '../../../../../../class/pci_bus')
+l('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pci_bus/0000:16/device', '../../../0000:15:00.0')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pci_bus/0000:16/cpuaffinity', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pci_bus/0000:16/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pci_bus/0000:16/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pci_bus/0000:16/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket', 0o755)
+d('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0/subsystem', '../../../../../../class/pcmcia_socket')
+l('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0/device', '../../../0000:15:00.0')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0/card_vpp', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0/available_resources_mem', 0o644, b'''0x000c0000 - 0x000fffff
+0x60000000 - 0x60ffffff
+0xa0000000 - 0xa0ffffff
+0xe0000000 - 0xe3ffffff
+0xe4300000 - 0xe7ffffff
+''')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0/available_resources_io', 0o644, b'''0x00000100 - 0x000003af
+0x000003e0 - 0x000004ff
+0x00000820 - 0x000008ff
+0x00000a00 - 0x00000aff
+0x00000c00 - 0x00000cf7
+0x0000a000 - 0x0000dfff
+''')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0/card_voltage', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0/cis', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0/available_resources_setup_done', 0o644, b'yes\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0/card_irq_mask', 0o644, b'0x0cf8\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0/card_pm_state', 0o644, b'on\n')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0/card_vcc', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0/card_type', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0/uevent', 0o644, b'SOCKET_NO=0\n')
+d('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1e.0/0000:15:00.0/pcmcia_socket/pcmcia_socket0/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.1', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.1/firmware_node', '../../LNXSYSTM:00/device:00/PNP0A08:00/device:1a')
+l('sys/devices/pci0000:00/0000:00:1d.1/subsystem', '../../../bus/pci')
+l('sys/devices/pci0000:00/0000:00:1d.1/driver', '../../../bus/pci/drivers/uhci_hcd')
+f('sys/devices/pci0000:00/0000:00:1d.1/local_cpulist', 0o644, b'0-7\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/enable', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/modalias', 0o644, b'pci:v00008086d000027C9sv000017AAsd0000200Abc0Csc03i00\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/resource', 0o644, b'''0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000001820 0x000000000000183f 0x0000000000020101
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+0x0000000000000000 0x0000000000000000 0x0000000000000000
+''')
+f('sys/devices/pci0000:00/0000:00:1d.1/config', 0o644, b"\x86\x80\xc9'\x05\x00\x80\x02\x02\x00\x03\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x17\n \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x0f\x02\x00\x00\x00\x00\x00")
+f('sys/devices/pci0000:00/0000:00:1d.1/local_cpus', 0o644, b'ff\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/subsystem_device', 0o644, b'0x200a\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/vendor', 0o644, b'0x8086\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/irq', 0o644, b'17\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/pools', 0o644, b'''poolinfo - 0.1
+uhci_qh            11   32  128  1
+uhci_td             1   64   64  1
+buffer-2048         0    0 2048  0
+buffer-512          0    0  512  0
+buffer-128          0    0  128  0
+buffer-32           1  128   32  1
+''')
+f('sys/devices/pci0000:00/0000:00:1d.1/device', 0o644, b'0x27c9\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/class', 0o644, b'0x0c0300\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/msi_bus', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.1/subsystem_vendor', 0o644, b'0x17aa\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/uevent', 0o644, b'''DRIVER=uhci_hcd
+PCI_CLASS=C0300
+PCI_ID=8086:27C9
+PCI_SUBSYS_ID=17AA:200A
+PCI_SLOT_NAME=0000:00:1d.1
+MODALIAS=pci:v00008086d000027C9sv000017AAsd0000200Abc0Csc03i00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.1/resource4', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.1/broken_parity_status', 0o644, b'0\n')
+d('sys/devices/pci0000:00/0000:00:1d.1/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.1/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/pci0000:00/0000:00:1d.1/usb_host', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.1/usb_host/usb_host2', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.1/usb_host/usb_host2/subsystem', '../../../../../class/usb_host')
+l('sys/devices/pci0000:00/0000:00:1d.1/usb_host/usb_host2/device', '../../../0000:00:1d.1')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb_host/usb_host2/uevent', 0o644, b'')
+d('sys/devices/pci0000:00/0000:00:1d.1/usb_host/usb_host2/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.1/usb_host/usb_host2/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.1/usb2', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.1/usb2/subsystem', '../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.1/usb2/driver', '../../../../bus/usb/drivers/usb')
+l('sys/devices/pci0000:00/0000:00:1d.1/usb2/ep_00', 'usb_endpoint/usbdev2.1_ep00')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/version', 0o644, b' 1.10\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/authorized_default', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/maxchild', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/bDeviceClass', 0o644, b'09\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/bcdDevice', 0o644, b'0206\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/devnum', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/bDeviceProtocol', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/idProduct', 0o644, b'0001\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/product', 0o644, b'UHCI Host Controller\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/bDeviceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/configuration', 0o644, b'')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/dev', 0o644, b'189:128\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/urbnum', 0o644, b'16\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/authorized', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/descriptors', 0o644, b'\x12\x01\x10\x01\t\x00\x00@k\x1d\x01\x00\x06\x02\x03\x02\x01\x01\t\x02\x19\x00\x01\x01\x00\xe0\x00\t\x04\x00\x00\x01\t\x00\x00\x00\x07\x05\x81\x03\x02\x00\xff')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/bNumConfigurations', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/serial', 0o644, b'0000:00:1d.1\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/speed', 0o644, b'12\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/bMaxPacketSize0', 0o644, b'64\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/bmAttributes', 0o644, b'e0\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/busnum', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/quirks', 0o644, b'0x0\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/bConfigurationValue', 0o644, b'1\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/uevent', 0o644, b'''MAJOR=189
+MINOR=128
+DEVTYPE=usb_device
+DRIVER=usb
+PRODUCT=1d6b/1/206
+TYPE=9/0/0
+BUSNUM=002
+DEVNUM=001
+''')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/manufacturer', 0o644, b'Linux 2.6.27-rc7-00106-g6ef190c-dirty uhci_hcd\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/idVendor', 0o644, b'1d6b\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/bNumInterfaces', 0o644, b' 1\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/bMaxPower', 0o644, b'  0mA\n')
+d('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00/subsystem', '../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00/device', '../../../usb2')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00/interval', 0o644, b'0ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00/bEndpointAddress', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00/type', 0o644, b'Control\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00/dev', 0o644, b'252:3\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00/direction', 0o644, b'both\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00/wMaxPacketSize', 0o644, b'0040\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00/bmAttributes', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00/uevent', 0o644, b'''MAJOR=252
+MINOR=3
+''')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00/bInterval', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/usb_endpoint/usbdev2.1_ep00/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.1/usb2/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/power/active_duration', 0o644, b'2363\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/power/wakeup', 0o644, b'enabled\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/power/connected_duration', 0o644, b'8372254\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/power/autosuspend', 0o644, b'2\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/power/level', 0o644, b'auto\n')
+d('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/subsystem', '../../../../../bus/usb')
+l('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/ep_81', 'usb_endpoint/usbdev2.1_ep81')
+l('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/driver', '../../../../../bus/usb/drivers/hub')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/modalias', 0o644, b'usb:v1D6Bp0001d0206dc09dsc00dp00ic09isc00ip00\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/bInterfaceNumber', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/bNumEndpoints', 0o644, b'01\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/bInterfaceSubClass', 0o644, b'00\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/bAlternateSetting', 0o644, b' 0\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/bInterfaceClass', 0o644, b'09\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/uevent', 0o644, b'''DEVTYPE=usb_interface
+DRIVER=hub
+PRODUCT=1d6b/1/206
+TYPE=9/0/0
+INTERFACE=9/0/0
+MODALIAS=usb:v1D6Bp0001d0206dc09dsc00dp00ic09isc00ip00
+''')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/bInterfaceProtocol', 0o644, b'00\n')
+d('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint', 0o755)
+d('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81', 0o755)
+l('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81/subsystem', '../../../../../../../class/usb_endpoint')
+l('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81/device', '../../../2-0:1.0')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81/interval', 0o644, b'255ms\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81/bEndpointAddress', 0o644, b'81\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81/type', 0o644, b'Interrupt\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81/dev', 0o644, b'252:2\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81/direction', 0o644, b'in\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81/bLength', 0o644, b'07\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81/wMaxPacketSize', 0o644, b'0002\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81/bmAttributes', 0o644, b'03\n')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81/uevent', 0o644, b'''MAJOR=252
+MINOR=2
+''')
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81/bInterval', 0o644, b'ff\n')
+d('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/usb_endpoint/usbdev2.1_ep81/power/wakeup', 0o644, b'\n')
+d('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/power', 0o755)
+f('sys/devices/pci0000:00/0000:00:1d.1/usb2/2-0:1.0/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual', 0o755)
+d('sys/devices/virtual/vc', 0o755)
+d('sys/devices/virtual/vc/vcsa3', 0o755)
+l('sys/devices/virtual/vc/vcsa3/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcsa3/dev', 0o644, b'7:131\n')
+f('sys/devices/virtual/vc/vcsa3/uevent', 0o644, b'''MAJOR=7
+MINOR=131
+''')
+d('sys/devices/virtual/vc/vcsa3/power', 0o755)
+f('sys/devices/virtual/vc/vcsa3/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcsa6', 0o755)
+l('sys/devices/virtual/vc/vcsa6/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcsa6/dev', 0o644, b'7:134\n')
+f('sys/devices/virtual/vc/vcsa6/uevent', 0o644, b'''MAJOR=7
+MINOR=134
+''')
+d('sys/devices/virtual/vc/vcsa6/power', 0o755)
+f('sys/devices/virtual/vc/vcsa6/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcsa2', 0o755)
+l('sys/devices/virtual/vc/vcsa2/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcsa2/dev', 0o644, b'7:130\n')
+f('sys/devices/virtual/vc/vcsa2/uevent', 0o644, b'''MAJOR=7
+MINOR=130
+''')
+d('sys/devices/virtual/vc/vcsa2/power', 0o755)
+f('sys/devices/virtual/vc/vcsa2/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcsa', 0o755)
+l('sys/devices/virtual/vc/vcsa/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcsa/dev', 0o644, b'7:128\n')
+f('sys/devices/virtual/vc/vcsa/uevent', 0o644, b'''MAJOR=7
+MINOR=128
+''')
+d('sys/devices/virtual/vc/vcsa/power', 0o755)
+f('sys/devices/virtual/vc/vcsa/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcs2', 0o755)
+l('sys/devices/virtual/vc/vcs2/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcs2/dev', 0o644, b'7:2\n')
+f('sys/devices/virtual/vc/vcs2/uevent', 0o644, b'''MAJOR=7
+MINOR=2
+''')
+d('sys/devices/virtual/vc/vcs2/power', 0o755)
+f('sys/devices/virtual/vc/vcs2/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcs7', 0o755)
+l('sys/devices/virtual/vc/vcs7/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcs7/dev', 0o644, b'7:7\n')
+f('sys/devices/virtual/vc/vcs7/uevent', 0o644, b'''MAJOR=7
+MINOR=7
+''')
+d('sys/devices/virtual/vc/vcs7/power', 0o755)
+f('sys/devices/virtual/vc/vcs7/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcsa5', 0o755)
+l('sys/devices/virtual/vc/vcsa5/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcsa5/dev', 0o644, b'7:133\n')
+f('sys/devices/virtual/vc/vcsa5/uevent', 0o644, b'''MAJOR=7
+MINOR=133
+''')
+d('sys/devices/virtual/vc/vcsa5/power', 0o755)
+f('sys/devices/virtual/vc/vcsa5/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcsa10', 0o755)
+l('sys/devices/virtual/vc/vcsa10/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcsa10/dev', 0o644, b'7:138\n')
+f('sys/devices/virtual/vc/vcsa10/uevent', 0o644, b'''MAJOR=7
+MINOR=138
+''')
+d('sys/devices/virtual/vc/vcsa10/power', 0o755)
+f('sys/devices/virtual/vc/vcsa10/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcs10', 0o755)
+l('sys/devices/virtual/vc/vcs10/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcs10/dev', 0o644, b'7:10\n')
+f('sys/devices/virtual/vc/vcs10/uevent', 0o644, b'''MAJOR=7
+MINOR=10
+''')
+d('sys/devices/virtual/vc/vcs10/power', 0o755)
+f('sys/devices/virtual/vc/vcs10/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcsa1', 0o755)
+l('sys/devices/virtual/vc/vcsa1/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcsa1/dev', 0o644, b'7:129\n')
+f('sys/devices/virtual/vc/vcsa1/uevent', 0o644, b'''MAJOR=7
+MINOR=129
+''')
+d('sys/devices/virtual/vc/vcsa1/power', 0o755)
+f('sys/devices/virtual/vc/vcsa1/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcsa4', 0o755)
+l('sys/devices/virtual/vc/vcsa4/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcsa4/dev', 0o644, b'7:132\n')
+f('sys/devices/virtual/vc/vcsa4/uevent', 0o644, b'''MAJOR=7
+MINOR=132
+''')
+d('sys/devices/virtual/vc/vcsa4/power', 0o755)
+f('sys/devices/virtual/vc/vcsa4/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcs', 0o755)
+l('sys/devices/virtual/vc/vcs/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcs/dev', 0o644, b'7:0\n')
+f('sys/devices/virtual/vc/vcs/uevent', 0o644, b'''MAJOR=7
+MINOR=0
+''')
+d('sys/devices/virtual/vc/vcs/power', 0o755)
+f('sys/devices/virtual/vc/vcs/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcs1', 0o755)
+l('sys/devices/virtual/vc/vcs1/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcs1/dev', 0o644, b'7:1\n')
+f('sys/devices/virtual/vc/vcs1/uevent', 0o644, b'''MAJOR=7
+MINOR=1
+''')
+d('sys/devices/virtual/vc/vcs1/power', 0o755)
+f('sys/devices/virtual/vc/vcs1/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcs4', 0o755)
+l('sys/devices/virtual/vc/vcs4/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcs4/dev', 0o644, b'7:4\n')
+f('sys/devices/virtual/vc/vcs4/uevent', 0o644, b'''MAJOR=7
+MINOR=4
+''')
+d('sys/devices/virtual/vc/vcs4/power', 0o755)
+f('sys/devices/virtual/vc/vcs4/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcsa7', 0o755)
+l('sys/devices/virtual/vc/vcsa7/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcsa7/dev', 0o644, b'7:135\n')
+f('sys/devices/virtual/vc/vcsa7/uevent', 0o644, b'''MAJOR=7
+MINOR=135
+''')
+d('sys/devices/virtual/vc/vcsa7/power', 0o755)
+f('sys/devices/virtual/vc/vcsa7/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcs6', 0o755)
+l('sys/devices/virtual/vc/vcs6/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcs6/dev', 0o644, b'7:6\n')
+f('sys/devices/virtual/vc/vcs6/uevent', 0o644, b'''MAJOR=7
+MINOR=6
+''')
+d('sys/devices/virtual/vc/vcs6/power', 0o755)
+f('sys/devices/virtual/vc/vcs6/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcs3', 0o755)
+l('sys/devices/virtual/vc/vcs3/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcs3/dev', 0o644, b'7:3\n')
+f('sys/devices/virtual/vc/vcs3/uevent', 0o644, b'''MAJOR=7
+MINOR=3
+''')
+d('sys/devices/virtual/vc/vcs3/power', 0o755)
+f('sys/devices/virtual/vc/vcs3/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vc/vcs5', 0o755)
+l('sys/devices/virtual/vc/vcs5/subsystem', '../../../../class/vc')
+f('sys/devices/virtual/vc/vcs5/dev', 0o644, b'7:5\n')
+f('sys/devices/virtual/vc/vcs5/uevent', 0o644, b'''MAJOR=7
+MINOR=5
+''')
+d('sys/devices/virtual/vc/vcs5/power', 0o755)
+f('sys/devices/virtual/vc/vcs5/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/mem', 0o755)
+d('sys/devices/virtual/mem/zero', 0o755)
+l('sys/devices/virtual/mem/zero/subsystem', '../../../../class/mem')
+f('sys/devices/virtual/mem/zero/dev', 0o644, b'1:5\n')
+f('sys/devices/virtual/mem/zero/uevent', 0o644, b'''MAJOR=1
+MINOR=5
+''')
+d('sys/devices/virtual/mem/zero/power', 0o755)
+f('sys/devices/virtual/mem/zero/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/mem/kmsg', 0o755)
+l('sys/devices/virtual/mem/kmsg/subsystem', '../../../../class/mem')
+f('sys/devices/virtual/mem/kmsg/dev', 0o644, b'1:11\n')
+f('sys/devices/virtual/mem/kmsg/uevent', 0o644, b'''MAJOR=1
+MINOR=11
+''')
+d('sys/devices/virtual/mem/kmsg/power', 0o755)
+f('sys/devices/virtual/mem/kmsg/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/mem/mem', 0o755)
+l('sys/devices/virtual/mem/mem/subsystem', '../../../../class/mem')
+f('sys/devices/virtual/mem/mem/dev', 0o644, b'1:1\n')
+f('sys/devices/virtual/mem/mem/uevent', 0o644, b'''MAJOR=1
+MINOR=1
+''')
+d('sys/devices/virtual/mem/mem/power', 0o755)
+f('sys/devices/virtual/mem/mem/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/mem/urandom', 0o755)
+l('sys/devices/virtual/mem/urandom/subsystem', '../../../../class/mem')
+f('sys/devices/virtual/mem/urandom/dev', 0o644, b'1:9\n')
+f('sys/devices/virtual/mem/urandom/uevent', 0o644, b'''MAJOR=1
+MINOR=9
+''')
+d('sys/devices/virtual/mem/urandom/power', 0o755)
+f('sys/devices/virtual/mem/urandom/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/mem/port', 0o755)
+l('sys/devices/virtual/mem/port/subsystem', '../../../../class/mem')
+f('sys/devices/virtual/mem/port/dev', 0o644, b'1:4\n')
+f('sys/devices/virtual/mem/port/uevent', 0o644, b'''MAJOR=1
+MINOR=4
+''')
+d('sys/devices/virtual/mem/port/power', 0o755)
+f('sys/devices/virtual/mem/port/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/mem/null', 0o755)
+l('sys/devices/virtual/mem/null/subsystem', '../../../../class/mem')
+f('sys/devices/virtual/mem/null/dev', 0o644, b'1:3\n')
+f('sys/devices/virtual/mem/null/uevent', 0o644, b'''MAJOR=1
+MINOR=3
+''')
+d('sys/devices/virtual/mem/null/power', 0o755)
+f('sys/devices/virtual/mem/null/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/mem/kmem', 0o755)
+l('sys/devices/virtual/mem/kmem/subsystem', '../../../../class/mem')
+f('sys/devices/virtual/mem/kmem/dev', 0o644, b'1:2\n')
+f('sys/devices/virtual/mem/kmem/uevent', 0o644, b'''MAJOR=1
+MINOR=2
+''')
+d('sys/devices/virtual/mem/kmem/power', 0o755)
+f('sys/devices/virtual/mem/kmem/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/mem/full', 0o755)
+l('sys/devices/virtual/mem/full/subsystem', '../../../../class/mem')
+f('sys/devices/virtual/mem/full/dev', 0o644, b'1:7\n')
+f('sys/devices/virtual/mem/full/uevent', 0o644, b'''MAJOR=1
+MINOR=7
+''')
+d('sys/devices/virtual/mem/full/power', 0o755)
+f('sys/devices/virtual/mem/full/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/mem/random', 0o755)
+l('sys/devices/virtual/mem/random/subsystem', '../../../../class/mem')
+f('sys/devices/virtual/mem/random/dev', 0o644, b'1:8\n')
+f('sys/devices/virtual/mem/random/uevent', 0o644, b'''MAJOR=1
+MINOR=8
+''')
+d('sys/devices/virtual/mem/random/power', 0o755)
+f('sys/devices/virtual/mem/random/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/net', 0o755)
+d('sys/devices/virtual/net/lo', 0o755)
+l('sys/devices/virtual/net/lo/subsystem', '../../../../class/net')
+f('sys/devices/virtual/net/lo/ifindex', 0o644, b'1\n')
+f('sys/devices/virtual/net/lo/features', 0o644, b'0x13865\n')
+f('sys/devices/virtual/net/lo/iflink', 0o644, b'1\n')
+f('sys/devices/virtual/net/lo/dormant', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/dev_id', 0o644, b'0x0\n')
+f('sys/devices/virtual/net/lo/type', 0o644, b'772\n')
+f('sys/devices/virtual/net/lo/operstate', 0o644, b'unknown\n')
+f('sys/devices/virtual/net/lo/carrier', 0o644, b'1\n')
+f('sys/devices/virtual/net/lo/link_mode', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/tx_queue_len', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/flags', 0o644, b'0x9\n')
+f('sys/devices/virtual/net/lo/addr_len', 0o644, b'6\n')
+f('sys/devices/virtual/net/lo/address', 0o644, b'00:00:00:00:00:00\n')
+f('sys/devices/virtual/net/lo/uevent', 0o644, b'''INTERFACE=lo
+IFINDEX=1
+''')
+f('sys/devices/virtual/net/lo/mtu', 0o644, b'16436\n')
+f('sys/devices/virtual/net/lo/broadcast', 0o644, b'00:00:00:00:00:00\n')
+d('sys/devices/virtual/net/lo/statistics', 0o755)
+f('sys/devices/virtual/net/lo/statistics/tx_aborted_errors', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/rx_crc_errors', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/rx_bytes', 0o644, b'3380\n')
+f('sys/devices/virtual/net/lo/statistics/rx_errors', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/tx_packets', 0o644, b'46\n')
+f('sys/devices/virtual/net/lo/statistics/tx_carrier_errors', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/tx_errors', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/rx_dropped', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/tx_fifo_errors', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/rx_length_errors', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/tx_dropped', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/rx_fifo_errors', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/rx_missed_errors', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/tx_window_errors', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/collisions', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/rx_frame_errors', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/rx_packets', 0o644, b'46\n')
+f('sys/devices/virtual/net/lo/statistics/rx_compressed', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/tx_compressed', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/multicast', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/rx_over_errors', 0o644, b'0\n')
+f('sys/devices/virtual/net/lo/statistics/tx_bytes', 0o644, b'3380\n')
+f('sys/devices/virtual/net/lo/statistics/tx_heartbeat_errors', 0o644, b'0\n')
+d('sys/devices/virtual/net/lo/power', 0o755)
+f('sys/devices/virtual/net/lo/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/dmi', 0o755)
+d('sys/devices/virtual/dmi/id', 0o755)
+l('sys/devices/virtual/dmi/id/subsystem', '../../../../class/dmi')
+f('sys/devices/virtual/dmi/id/product_name', 0o644, b'8741C4G\n')
+f('sys/devices/virtual/dmi/id/modalias', 0o644, b'dmi:bvnLENOVO:bvr7IET31WW(1.12):bd09/19/2007:svnLENOVO:pn8741C4G:pvrThinkPadT60p:rvnLENOVO:rn8741C4G:rvrNotAvailable:cvnLENOVO:ct10:cvrNotAvailable:\n')
+f('sys/devices/virtual/dmi/id/chassis_serial', 0o644, b'Not Available\n')
+f('sys/devices/virtual/dmi/id/board_version', 0o644, b'Not Available\n')
+f('sys/devices/virtual/dmi/id/board_serial', 0o644, b'VF0UV72C10X\n')
+f('sys/devices/virtual/dmi/id/chassis_type', 0o644, b'10\n')
+f('sys/devices/virtual/dmi/id/chassis_asset_tag', 0o644, b'No Asset Information\n')
+f('sys/devices/virtual/dmi/id/product_uuid', 0o644, b'82161681-492E-11CB-BCCA-A7FDE26F414B\n')
+f('sys/devices/virtual/dmi/id/board_name', 0o644, b'8741C4G\n')
+f('sys/devices/virtual/dmi/id/board_asset_tag', 0o644, b'\n')
+f('sys/devices/virtual/dmi/id/bios_date', 0o644, b'09/19/2007\n')
+f('sys/devices/virtual/dmi/id/bios_version', 0o644, b'7IET31WW (1.12 )\n')
+f('sys/devices/virtual/dmi/id/product_serial', 0o644, b'L3AK195\n')
+f('sys/devices/virtual/dmi/id/chassis_version', 0o644, b'Not Available\n')
+f('sys/devices/virtual/dmi/id/chassis_vendor', 0o644, b'LENOVO\n')
+f('sys/devices/virtual/dmi/id/product_version', 0o644, b'ThinkPad T60p\n')
+f('sys/devices/virtual/dmi/id/board_vendor', 0o644, b'LENOVO\n')
+f('sys/devices/virtual/dmi/id/uevent', 0o644, b'MODALIAS=dmi:bvnLENOVO:bvr7IET31WW(1.12):bd09/19/2007:svnLENOVO:pn8741C4G:pvrThinkPadT60p:rvnLENOVO:rn8741C4G:rvrNotAvailable:cvnLENOVO:ct10:cvrNotAvailable:\n')
+f('sys/devices/virtual/dmi/id/sys_vendor', 0o644, b'LENOVO\n')
+f('sys/devices/virtual/dmi/id/bios_vendor', 0o644, b'LENOVO\n')
+d('sys/devices/virtual/dmi/id/power', 0o755)
+f('sys/devices/virtual/dmi/id/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/bdi', 0o755)
+d('sys/devices/virtual/bdi/7:1', 0o755)
+l('sys/devices/virtual/bdi/7:1/subsystem', '../../../../class/bdi')
+f('sys/devices/virtual/bdi/7:1/read_ahead_kb', 0o644, b'0\n')
+f('sys/devices/virtual/bdi/7:1/uevent', 0o644, b'')
+f('sys/devices/virtual/bdi/7:1/max_ratio', 0o644, b'100\n')
+f('sys/devices/virtual/bdi/7:1/min_ratio', 0o644, b'0\n')
+d('sys/devices/virtual/bdi/7:1/power', 0o755)
+f('sys/devices/virtual/bdi/7:1/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/bdi/7:0', 0o755)
+l('sys/devices/virtual/bdi/7:0/subsystem', '../../../../class/bdi')
+f('sys/devices/virtual/bdi/7:0/read_ahead_kb', 0o644, b'0\n')
+f('sys/devices/virtual/bdi/7:0/uevent', 0o644, b'')
+f('sys/devices/virtual/bdi/7:0/max_ratio', 0o644, b'100\n')
+f('sys/devices/virtual/bdi/7:0/min_ratio', 0o644, b'0\n')
+d('sys/devices/virtual/bdi/7:0/power', 0o755)
+f('sys/devices/virtual/bdi/7:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/bdi/7:2', 0o755)
+l('sys/devices/virtual/bdi/7:2/subsystem', '../../../../class/bdi')
+f('sys/devices/virtual/bdi/7:2/read_ahead_kb', 0o644, b'0\n')
+f('sys/devices/virtual/bdi/7:2/uevent', 0o644, b'')
+f('sys/devices/virtual/bdi/7:2/max_ratio', 0o644, b'100\n')
+f('sys/devices/virtual/bdi/7:2/min_ratio', 0o644, b'0\n')
+d('sys/devices/virtual/bdi/7:2/power', 0o755)
+f('sys/devices/virtual/bdi/7:2/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/bdi/7:4', 0o755)
+l('sys/devices/virtual/bdi/7:4/subsystem', '../../../../class/bdi')
+f('sys/devices/virtual/bdi/7:4/read_ahead_kb', 0o644, b'0\n')
+f('sys/devices/virtual/bdi/7:4/uevent', 0o644, b'')
+f('sys/devices/virtual/bdi/7:4/max_ratio', 0o644, b'100\n')
+f('sys/devices/virtual/bdi/7:4/min_ratio', 0o644, b'0\n')
+d('sys/devices/virtual/bdi/7:4/power', 0o755)
+f('sys/devices/virtual/bdi/7:4/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/bdi/7:3', 0o755)
+l('sys/devices/virtual/bdi/7:3/subsystem', '../../../../class/bdi')
+f('sys/devices/virtual/bdi/7:3/read_ahead_kb', 0o644, b'0\n')
+f('sys/devices/virtual/bdi/7:3/uevent', 0o644, b'')
+f('sys/devices/virtual/bdi/7:3/max_ratio', 0o644, b'100\n')
+f('sys/devices/virtual/bdi/7:3/min_ratio', 0o644, b'0\n')
+d('sys/devices/virtual/bdi/7:3/power', 0o755)
+f('sys/devices/virtual/bdi/7:3/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/bdi/11:0', 0o755)
+l('sys/devices/virtual/bdi/11:0/subsystem', '../../../../class/bdi')
+f('sys/devices/virtual/bdi/11:0/read_ahead_kb', 0o644, b'128\n')
+f('sys/devices/virtual/bdi/11:0/uevent', 0o644, b'')
+f('sys/devices/virtual/bdi/11:0/max_ratio', 0o644, b'100\n')
+f('sys/devices/virtual/bdi/11:0/min_ratio', 0o644, b'0\n')
+d('sys/devices/virtual/bdi/11:0/power', 0o755)
+f('sys/devices/virtual/bdi/11:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/bdi/7:5', 0o755)
+l('sys/devices/virtual/bdi/7:5/subsystem', '../../../../class/bdi')
+f('sys/devices/virtual/bdi/7:5/read_ahead_kb', 0o644, b'0\n')
+f('sys/devices/virtual/bdi/7:5/uevent', 0o644, b'')
+f('sys/devices/virtual/bdi/7:5/max_ratio', 0o644, b'100\n')
+f('sys/devices/virtual/bdi/7:5/min_ratio', 0o644, b'0\n')
+d('sys/devices/virtual/bdi/7:5/power', 0o755)
+f('sys/devices/virtual/bdi/7:5/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/bdi/8:0', 0o755)
+l('sys/devices/virtual/bdi/8:0/subsystem', '../../../../class/bdi')
+f('sys/devices/virtual/bdi/8:0/read_ahead_kb', 0o644, b'128\n')
+f('sys/devices/virtual/bdi/8:0/uevent', 0o644, b'')
+f('sys/devices/virtual/bdi/8:0/max_ratio', 0o644, b'100\n')
+f('sys/devices/virtual/bdi/8:0/min_ratio', 0o644, b'0\n')
+d('sys/devices/virtual/bdi/8:0/power', 0o755)
+f('sys/devices/virtual/bdi/8:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/bdi/default', 0o755)
+l('sys/devices/virtual/bdi/default/subsystem', '../../../../class/bdi')
+f('sys/devices/virtual/bdi/default/read_ahead_kb', 0o644, b'128\n')
+f('sys/devices/virtual/bdi/default/uevent', 0o644, b'')
+f('sys/devices/virtual/bdi/default/max_ratio', 0o644, b'100\n')
+f('sys/devices/virtual/bdi/default/min_ratio', 0o644, b'0\n')
+d('sys/devices/virtual/bdi/default/power', 0o755)
+f('sys/devices/virtual/bdi/default/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/bdi/0:16', 0o755)
+l('sys/devices/virtual/bdi/0:16/subsystem', '../../../../class/bdi')
+f('sys/devices/virtual/bdi/0:16/read_ahead_kb', 0o644, b'128\n')
+f('sys/devices/virtual/bdi/0:16/uevent', 0o644, b'')
+f('sys/devices/virtual/bdi/0:16/max_ratio', 0o644, b'1\n')
+f('sys/devices/virtual/bdi/0:16/min_ratio', 0o644, b'0\n')
+d('sys/devices/virtual/bdi/0:16/power', 0o755)
+f('sys/devices/virtual/bdi/0:16/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/bdi/8:16', 0o755)
+l('sys/devices/virtual/bdi/8:16/subsystem', '../../../../class/bdi')
+f('sys/devices/virtual/bdi/8:16/read_ahead_kb', 0o644, b'128\n')
+f('sys/devices/virtual/bdi/8:16/uevent', 0o644, b'')
+f('sys/devices/virtual/bdi/8:16/max_ratio', 0o644, b'100\n')
+f('sys/devices/virtual/bdi/8:16/min_ratio', 0o644, b'0\n')
+d('sys/devices/virtual/bdi/8:16/power', 0o755)
+f('sys/devices/virtual/bdi/8:16/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/bdi/9:0', 0o755)
+l('sys/devices/virtual/bdi/9:0/subsystem', '../../../../class/bdi')
+f('sys/devices/virtual/bdi/9:0/read_ahead_kb', 0o644, b'128\n')
+f('sys/devices/virtual/bdi/9:0/uevent', 0o644, b'')
+f('sys/devices/virtual/bdi/9:0/max_ratio', 0o644, b'100\n')
+f('sys/devices/virtual/bdi/9:0/min_ratio', 0o644, b'0\n')
+d('sys/devices/virtual/bdi/9:0/power', 0o755)
+f('sys/devices/virtual/bdi/9:0/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/bdi/7:7', 0o755)
+l('sys/devices/virtual/bdi/7:7/subsystem', '../../../../class/bdi')
+f('sys/devices/virtual/bdi/7:7/read_ahead_kb', 0o644, b'0\n')
+f('sys/devices/virtual/bdi/7:7/uevent', 0o644, b'')
+f('sys/devices/virtual/bdi/7:7/max_ratio', 0o644, b'100\n')
+f('sys/devices/virtual/bdi/7:7/min_ratio', 0o644, b'0\n')
+d('sys/devices/virtual/bdi/7:7/power', 0o755)
+f('sys/devices/virtual/bdi/7:7/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/bdi/7:6', 0o755)
+l('sys/devices/virtual/bdi/7:6/subsystem', '../../../../class/bdi')
+f('sys/devices/virtual/bdi/7:6/read_ahead_kb', 0o644, b'0\n')
+f('sys/devices/virtual/bdi/7:6/uevent', 0o644, b'')
+f('sys/devices/virtual/bdi/7:6/max_ratio', 0o644, b'100\n')
+f('sys/devices/virtual/bdi/7:6/min_ratio', 0o644, b'0\n')
+d('sys/devices/virtual/bdi/7:6/power', 0o755)
+f('sys/devices/virtual/bdi/7:6/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/sound', 0o755)
+d('sys/devices/virtual/sound/timer', 0o755)
+l('sys/devices/virtual/sound/timer/subsystem', '../../../../class/sound')
+f('sys/devices/virtual/sound/timer/dev', 0o644, b'116:33\n')
+f('sys/devices/virtual/sound/timer/uevent', 0o644, b'''MAJOR=116
+MINOR=33
+''')
+d('sys/devices/virtual/sound/timer/power', 0o755)
+f('sys/devices/virtual/sound/timer/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/sound/seq', 0o755)
+l('sys/devices/virtual/sound/seq/subsystem', '../../../../class/sound')
+f('sys/devices/virtual/sound/seq/dev', 0o644, b'116:1\n')
+f('sys/devices/virtual/sound/seq/uevent', 0o644, b'''MAJOR=116
+MINOR=1
+''')
+d('sys/devices/virtual/sound/seq/power', 0o755)
+f('sys/devices/virtual/sound/seq/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/misc', 0o755)
+d('sys/devices/virtual/misc/misc-fake89999', 0o755)
+l('sys/devices/virtual/misc/misc-fake89999/subsystem', '../../../../class/misc')
+f('sys/devices/virtual/misc/misc-fake89999/dev', 0o644, b'4095:89999\n')
+f('sys/devices/virtual/misc/misc-fake89999/uevent', 0o644, b'''MAJOR=4095
+MINOR=89999
+DEVNAME=misc-fake89999
+''')
+d('sys/devices/virtual/misc/misc-fake89999/power', 0o755)
+f('sys/devices/virtual/misc/misc-fake89999/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/misc/uinput', 0o755)
+l('sys/devices/virtual/misc/uinput/subsystem', '../../../../class/misc')
+f('sys/devices/virtual/misc/uinput/dev', 0o644, b'10:223\n')
+f('sys/devices/virtual/misc/uinput/uevent', 0o644, b'''MAJOR=10
+MINOR=223
+''')
+d('sys/devices/virtual/misc/uinput/power', 0o755)
+f('sys/devices/virtual/misc/uinput/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/misc/fuse', 0o755)
+l('sys/devices/virtual/misc/fuse/subsystem', '../../../../class/misc')
+f('sys/devices/virtual/misc/fuse/dev', 0o644, b'10:229\n')
+f('sys/devices/virtual/misc/fuse/uevent', 0o644, b'''MAJOR=10
+MINOR=229
+''')
+d('sys/devices/virtual/misc/fuse/power', 0o755)
+f('sys/devices/virtual/misc/fuse/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/misc/hpet', 0o755)
+l('sys/devices/virtual/misc/hpet/subsystem', '../../../../class/misc')
+f('sys/devices/virtual/misc/hpet/dev', 0o644, b'10:228\n')
+f('sys/devices/virtual/misc/hpet/uevent', 0o644, b'''MAJOR=10
+MINOR=228
+''')
+d('sys/devices/virtual/misc/hpet/power', 0o755)
+f('sys/devices/virtual/misc/hpet/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/misc/cpu_dma_latency', 0o755)
+l('sys/devices/virtual/misc/cpu_dma_latency/subsystem', '../../../../class/misc')
+f('sys/devices/virtual/misc/cpu_dma_latency/dev', 0o644, b'10:63\n')
+f('sys/devices/virtual/misc/cpu_dma_latency/uevent', 0o644, b'''MAJOR=10
+MINOR=63
+''')
+d('sys/devices/virtual/misc/cpu_dma_latency/power', 0o755)
+f('sys/devices/virtual/misc/cpu_dma_latency/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/misc/mcelog', 0o755)
+l('sys/devices/virtual/misc/mcelog/subsystem', '../../../../class/misc')
+f('sys/devices/virtual/misc/mcelog/dev', 0o644, b'10:227\n')
+f('sys/devices/virtual/misc/mcelog/uevent', 0o644, b'''MAJOR=10
+MINOR=227
+''')
+d('sys/devices/virtual/misc/mcelog/power', 0o755)
+f('sys/devices/virtual/misc/mcelog/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/misc/device-mapper', 0o755)
+l('sys/devices/virtual/misc/device-mapper/subsystem', '../../../../class/misc')
+f('sys/devices/virtual/misc/device-mapper/dev', 0o644, b'10:60\n')
+f('sys/devices/virtual/misc/device-mapper/uevent', 0o644, b'''MAJOR=10
+MINOR=60
+''')
+d('sys/devices/virtual/misc/device-mapper/power', 0o755)
+f('sys/devices/virtual/misc/device-mapper/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/misc/psaux', 0o755)
+l('sys/devices/virtual/misc/psaux/subsystem', '../../../../class/misc')
+f('sys/devices/virtual/misc/psaux/dev', 0o644, b'10:1\n')
+f('sys/devices/virtual/misc/psaux/uevent', 0o644, b'''MAJOR=10
+MINOR=1
+''')
+d('sys/devices/virtual/misc/psaux/power', 0o755)
+f('sys/devices/virtual/misc/psaux/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/misc/misc-fake1', 0o755)
+l('sys/devices/virtual/misc/misc-fake1/subsystem', '../../../../class/misc')
+f('sys/devices/virtual/misc/misc-fake1/dev', 0o644, b'4095:1\n')
+f('sys/devices/virtual/misc/misc-fake1/uevent', 0o644, b'''MAJOR=4095
+MINOR=1
+DEVNAME=misc-fake1
+
+''')
+d('sys/devices/virtual/misc/misc-fake1/power', 0o755)
+f('sys/devices/virtual/misc/misc-fake1/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/misc/nvram', 0o755)
+l('sys/devices/virtual/misc/nvram/subsystem', '../../../../class/misc')
+f('sys/devices/virtual/misc/nvram/dev', 0o644, b'10:144\n')
+f('sys/devices/virtual/misc/nvram/uevent', 0o644, b'''MAJOR=10
+MINOR=144
+''')
+d('sys/devices/virtual/misc/nvram/power', 0o755)
+f('sys/devices/virtual/misc/nvram/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/misc/network_latency', 0o755)
+l('sys/devices/virtual/misc/network_latency/subsystem', '../../../../class/misc')
+f('sys/devices/virtual/misc/network_latency/dev', 0o644, b'10:62\n')
+f('sys/devices/virtual/misc/network_latency/uevent', 0o644, b'''MAJOR=10
+MINOR=62
+''')
+d('sys/devices/virtual/misc/network_latency/power', 0o755)
+f('sys/devices/virtual/misc/network_latency/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/misc/network_throughput', 0o755)
+l('sys/devices/virtual/misc/network_throughput/subsystem', '../../../../class/misc')
+f('sys/devices/virtual/misc/network_throughput/dev', 0o644, b'10:61\n')
+f('sys/devices/virtual/misc/network_throughput/uevent', 0o644, b'''MAJOR=10
+MINOR=61
+''')
+d('sys/devices/virtual/misc/network_throughput/power', 0o755)
+f('sys/devices/virtual/misc/network_throughput/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/misc/microcode', 0o755)
+l('sys/devices/virtual/misc/microcode/subsystem', '../../../../class/misc')
+f('sys/devices/virtual/misc/microcode/dev', 0o644, b'10:184\n')
+f('sys/devices/virtual/misc/microcode/uevent', 0o644, b'''MAJOR=10
+MINOR=184
+''')
+d('sys/devices/virtual/misc/microcode/power', 0o755)
+f('sys/devices/virtual/misc/microcode/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vtconsole', 0o755)
+d('sys/devices/virtual/vtconsole/vtcon1', 0o755)
+l('sys/devices/virtual/vtconsole/vtcon1/subsystem', '../../../../class/vtconsole')
+f('sys/devices/virtual/vtconsole/vtcon1/bind', 0o644, b'1\n')
+f('sys/devices/virtual/vtconsole/vtcon1/name', 0o644, b'(M) frame buffer device\n')
+f('sys/devices/virtual/vtconsole/vtcon1/uevent', 0o644, b'')
+d('sys/devices/virtual/vtconsole/vtcon1/power', 0o755)
+f('sys/devices/virtual/vtconsole/vtcon1/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/vtconsole/vtcon0', 0o755)
+l('sys/devices/virtual/vtconsole/vtcon0/subsystem', '../../../../class/vtconsole')
+f('sys/devices/virtual/vtconsole/vtcon0/bind', 0o644, b'0\n')
+f('sys/devices/virtual/vtconsole/vtcon0/name', 0o644, b'(S) dummy device\n')
+f('sys/devices/virtual/vtconsole/vtcon0/uevent', 0o644, b'')
+d('sys/devices/virtual/vtconsole/vtcon0/power', 0o755)
+f('sys/devices/virtual/vtconsole/vtcon0/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/input', 0o755)
+d('sys/devices/virtual/input/mice', 0o755)
+l('sys/devices/virtual/input/mice/subsystem', '../../../../class/input')
+f('sys/devices/virtual/input/mice/dev', 0o644, b'13:63\n')
+f('sys/devices/virtual/input/mice/uevent', 0o644, b'''MAJOR=13
+MINOR=63
+''')
+d('sys/devices/virtual/input/mice/power', 0o755)
+f('sys/devices/virtual/input/mice/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/input/input6', 0o755)
+l('sys/devices/virtual/input/input6/subsystem', '../../../../class/input')
+f('sys/devices/virtual/input/input6/uniq', 0o644, b'\n')
+f('sys/devices/virtual/input/input6/phys', 0o644, b'thinkpad_acpi/input0\n')
+f('sys/devices/virtual/input/input6/modalias', 0o644, b'input:b0019v17AAp5054e4101-e0,1,4,5,k71,72,73,8E,98,C0,C2,CD,E0,E1,E3,E4,EC,F0,168,174,181,1D2,1D7,1DB,1DC,ram4,lsfw3,\n')
+f('sys/devices/virtual/input/input6/name', 0o644, b'ThinkPad Extra Buttons\n')
+f('sys/devices/virtual/input/input6/uevent', 0o644, b'''PRODUCT=19/17aa/5054/4101
+NAME="ThinkPad Extra Buttons"
+PHYS="thinkpad_acpi/input0"
+EV==33
+KEY==18840000 2 10010000000000 0 1101b00002005 1004000 e000000000000 0
+MSC==10
+SW==8
+MODALIAS=input:b0019v17AAp5054e4101-e0,1,4,5,k71,72,73,8E,98,C0,C2,CD,E0,E1,E3,E4,EC,F0,168,174,181,1D2,1D7,1DB,1DC,ram4,lsfw3,
+''')
+d('sys/devices/virtual/input/input6/id', 0o755)
+f('sys/devices/virtual/input/input6/id/version', 0o644, b'4101\n')
+f('sys/devices/virtual/input/input6/id/product', 0o644, b'5054\n')
+f('sys/devices/virtual/input/input6/id/vendor', 0o644, b'17aa\n')
+f('sys/devices/virtual/input/input6/id/bustype', 0o644, b'0019\n')
+d('sys/devices/virtual/input/input6/power', 0o755)
+f('sys/devices/virtual/input/input6/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/input/input6/event6', 0o755)
+l('sys/devices/virtual/input/input6/event6/subsystem', '../../../../../class/input')
+l('sys/devices/virtual/input/input6/event6/device', '../../input6')
+f('sys/devices/virtual/input/input6/event6/dev', 0o644, b'13:70\n')
+f('sys/devices/virtual/input/input6/event6/uevent', 0o644, b'''MAJOR=13
+MINOR=70
+''')
+d('sys/devices/virtual/input/input6/event6/power', 0o755)
+f('sys/devices/virtual/input/input6/event6/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/input/input6/capabilities', 0o755)
+f('sys/devices/virtual/input/input6/capabilities/msc', 0o644, b'10\n')
+f('sys/devices/virtual/input/input6/capabilities/abs', 0o644, b'0\n')
+f('sys/devices/virtual/input/input6/capabilities/snd', 0o644, b'0\n')
+f('sys/devices/virtual/input/input6/capabilities/ff', 0o644, b'0\n')
+f('sys/devices/virtual/input/input6/capabilities/key', 0o644, b'18840000 2 10010000000000 0 1101b00002005 1004000 e000000000000 0\n')
+f('sys/devices/virtual/input/input6/capabilities/rel', 0o644, b'0\n')
+f('sys/devices/virtual/input/input6/capabilities/sw', 0o644, b'8\n')
+f('sys/devices/virtual/input/input6/capabilities/ev', 0o644, b'33\n')
+f('sys/devices/virtual/input/input6/capabilities/led', 0o644, b'0\n')
+d('sys/devices/virtual/thermal', 0o755)
+d('sys/devices/virtual/thermal/thermal_zone1', 0o755)
+l('sys/devices/virtual/thermal/thermal_zone1/subsystem', '../../../../class/thermal')
+l('sys/devices/virtual/thermal/thermal_zone1/cdev1', '../cooling_device0')
+l('sys/devices/virtual/thermal/thermal_zone1/cdev0', '../cooling_device1')
+l('sys/devices/virtual/thermal/thermal_zone1/device', '../../../LNXSYSTM:00/LNXTHERM:00/LNXTHERM:02')
+f('sys/devices/virtual/thermal/thermal_zone1/trip_point_0_type', 0o644, b'critical\n')
+f('sys/devices/virtual/thermal/thermal_zone1/trip_point_0_temp', 0o644, b'100000\n')
+f('sys/devices/virtual/thermal/thermal_zone1/trip_point_1_temp', 0o644, b'95500\n')
+f('sys/devices/virtual/thermal/thermal_zone1/type', 0o644, b'acpitz\n')
+f('sys/devices/virtual/thermal/thermal_zone1/cdev1_trip_point', 0o644, b'1\n')
+f('sys/devices/virtual/thermal/thermal_zone1/mode', 0o644, b'kernel\n')
+f('sys/devices/virtual/thermal/thermal_zone1/temp', 0o644, b'47000\n')
+f('sys/devices/virtual/thermal/thermal_zone1/cdev0_trip_point', 0o644, b'1\n')
+f('sys/devices/virtual/thermal/thermal_zone1/uevent', 0o644, b'')
+f('sys/devices/virtual/thermal/thermal_zone1/trip_point_1_type', 0o644, b'passive\n')
+d('sys/devices/virtual/thermal/thermal_zone1/power', 0o755)
+f('sys/devices/virtual/thermal/thermal_zone1/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/thermal/cooling_device1', 0o755)
+l('sys/devices/virtual/thermal/cooling_device1/subsystem', '../../../../class/thermal')
+l('sys/devices/virtual/thermal/cooling_device1/device', '../../../LNXSYSTM:00/ACPI0007:01')
+f('sys/devices/virtual/thermal/cooling_device1/type', 0o644, b'Processor\n')
+f('sys/devices/virtual/thermal/cooling_device1/max_state', 0o644, b'10\n')
+f('sys/devices/virtual/thermal/cooling_device1/cur_state', 0o644, b'0\n')
+f('sys/devices/virtual/thermal/cooling_device1/uevent', 0o644, b'')
+d('sys/devices/virtual/thermal/cooling_device1/power', 0o755)
+f('sys/devices/virtual/thermal/cooling_device1/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/thermal/cooling_device0', 0o755)
+l('sys/devices/virtual/thermal/cooling_device0/subsystem', '../../../../class/thermal')
+l('sys/devices/virtual/thermal/cooling_device0/device', '../../../LNXSYSTM:00/ACPI0007:00')
+f('sys/devices/virtual/thermal/cooling_device0/type', 0o644, b'Processor\n')
+f('sys/devices/virtual/thermal/cooling_device0/max_state', 0o644, b'10\n')
+f('sys/devices/virtual/thermal/cooling_device0/cur_state', 0o644, b'0\n')
+f('sys/devices/virtual/thermal/cooling_device0/uevent', 0o644, b'')
+d('sys/devices/virtual/thermal/cooling_device0/power', 0o755)
+f('sys/devices/virtual/thermal/cooling_device0/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/thermal/thermal_zone0', 0o755)
+l('sys/devices/virtual/thermal/thermal_zone0/subsystem', '../../../../class/thermal')
+l('sys/devices/virtual/thermal/thermal_zone0/device', '../../../LNXSYSTM:00/LNXTHERM:00/LNXTHERM:01')
+f('sys/devices/virtual/thermal/thermal_zone0/trip_point_0_type', 0o644, b'critical\n')
+f('sys/devices/virtual/thermal/thermal_zone0/trip_point_0_temp', 0o644, b'127000\n')
+f('sys/devices/virtual/thermal/thermal_zone0/type', 0o644, b'acpitz\n')
+f('sys/devices/virtual/thermal/thermal_zone0/mode', 0o644, b'kernel\n')
+f('sys/devices/virtual/thermal/thermal_zone0/temp', 0o644, b'46000\n')
+f('sys/devices/virtual/thermal/thermal_zone0/uevent', 0o644, b'')
+d('sys/devices/virtual/thermal/thermal_zone0/power', 0o755)
+f('sys/devices/virtual/thermal/thermal_zone0/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/block', 0o755)
+d('sys/devices/virtual/block/loop1', 0o755)
+l('sys/devices/virtual/block/loop1/subsystem', '../../../../class/block')
+l('sys/devices/virtual/block/loop1/bdi', '../../bdi/7:1')
+f('sys/devices/virtual/block/loop1/capability', 0o644, b'10\n')
+f('sys/devices/virtual/block/loop1/ro', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop1/make-it-fail', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop1/size', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop1/dev', 0o644, b'7:1\n')
+f('sys/devices/virtual/block/loop1/range', 0o644, b'1\n')
+f('sys/devices/virtual/block/loop1/removable', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop1/stat', 0o644, b'       0        0        0        0        0        0        0        0        0        0        0\n')
+f('sys/devices/virtual/block/loop1/uevent', 0o644, b'''MAJOR=7
+MINOR=1
+DEVTYPE=disk
+''')
+d('sys/devices/virtual/block/loop1/power', 0o755)
+f('sys/devices/virtual/block/loop1/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/block/loop7', 0o755)
+l('sys/devices/virtual/block/loop7/subsystem', '../../../../class/block')
+l('sys/devices/virtual/block/loop7/bdi', '../../bdi/7:7')
+f('sys/devices/virtual/block/loop7/capability', 0o644, b'10\n')
+f('sys/devices/virtual/block/loop7/ro', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop7/make-it-fail', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop7/size', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop7/dev', 0o644, b'7:7\n')
+f('sys/devices/virtual/block/loop7/range', 0o644, b'1\n')
+f('sys/devices/virtual/block/loop7/removable', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop7/stat', 0o644, b'       0        0        0        0        0        0        0        0        0        0        0\n')
+f('sys/devices/virtual/block/loop7/uevent', 0o644, b'''MAJOR=7
+MINOR=7
+DEVTYPE=disk
+''')
+d('sys/devices/virtual/block/loop7/power', 0o755)
+f('sys/devices/virtual/block/loop7/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/block/loop0', 0o755)
+l('sys/devices/virtual/block/loop0/subsystem', '../../../../class/block')
+l('sys/devices/virtual/block/loop0/bdi', '../../bdi/7:0')
+f('sys/devices/virtual/block/loop0/capability', 0o644, b'10\n')
+f('sys/devices/virtual/block/loop0/ro', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop0/make-it-fail', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop0/size', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop0/dev', 0o644, b'7:0\n')
+f('sys/devices/virtual/block/loop0/range', 0o644, b'1\n')
+f('sys/devices/virtual/block/loop0/removable', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop0/stat', 0o644, b'       0        0        0        0        0        0        0        0        0        0        0\n')
+f('sys/devices/virtual/block/loop0/uevent', 0o644, b'''MAJOR=7
+MINOR=0
+DEVTYPE=disk
+''')
+d('sys/devices/virtual/block/loop0/power', 0o755)
+f('sys/devices/virtual/block/loop0/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/block/loop5', 0o755)
+l('sys/devices/virtual/block/loop5/subsystem', '../../../../class/block')
+l('sys/devices/virtual/block/loop5/bdi', '../../bdi/7:5')
+f('sys/devices/virtual/block/loop5/capability', 0o644, b'10\n')
+f('sys/devices/virtual/block/loop5/ro', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop5/make-it-fail', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop5/size', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop5/dev', 0o644, b'7:5\n')
+f('sys/devices/virtual/block/loop5/range', 0o644, b'1\n')
+f('sys/devices/virtual/block/loop5/removable', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop5/stat', 0o644, b'       0        0        0        0        0        0        0        0        0        0        0\n')
+f('sys/devices/virtual/block/loop5/uevent', 0o644, b'''MAJOR=7
+MINOR=5
+DEVTYPE=disk
+''')
+d('sys/devices/virtual/block/loop5/power', 0o755)
+f('sys/devices/virtual/block/loop5/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/block/loop3', 0o755)
+l('sys/devices/virtual/block/loop3/subsystem', '../../../../class/block')
+l('sys/devices/virtual/block/loop3/bdi', '../../bdi/7:3')
+f('sys/devices/virtual/block/loop3/capability', 0o644, b'10\n')
+f('sys/devices/virtual/block/loop3/ro', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop3/make-it-fail', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop3/size', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop3/dev', 0o644, b'7:3\n')
+f('sys/devices/virtual/block/loop3/range', 0o644, b'1\n')
+f('sys/devices/virtual/block/loop3/removable', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop3/stat', 0o644, b'       0        0        0        0        0        0        0        0        0        0        0\n')
+f('sys/devices/virtual/block/loop3/uevent', 0o644, b'''MAJOR=7
+MINOR=3
+DEVTYPE=disk
+''')
+d('sys/devices/virtual/block/loop3/power', 0o755)
+f('sys/devices/virtual/block/loop3/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/block/loop6', 0o755)
+l('sys/devices/virtual/block/loop6/subsystem', '../../../../class/block')
+l('sys/devices/virtual/block/loop6/bdi', '../../bdi/7:6')
+f('sys/devices/virtual/block/loop6/capability', 0o644, b'10\n')
+f('sys/devices/virtual/block/loop6/ro', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop6/make-it-fail', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop6/size', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop6/dev', 0o644, b'7:6\n')
+f('sys/devices/virtual/block/loop6/range', 0o644, b'1\n')
+f('sys/devices/virtual/block/loop6/removable', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop6/stat', 0o644, b'       0        0        0        0        0        0        0        0        0        0        0\n')
+f('sys/devices/virtual/block/loop6/uevent', 0o644, b'''MAJOR=7
+MINOR=6
+DEVTYPE=disk
+''')
+d('sys/devices/virtual/block/loop6/power', 0o755)
+f('sys/devices/virtual/block/loop6/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/block/loop2', 0o755)
+l('sys/devices/virtual/block/loop2/subsystem', '../../../../class/block')
+l('sys/devices/virtual/block/loop2/bdi', '../../bdi/7:2')
+f('sys/devices/virtual/block/loop2/capability', 0o644, b'10\n')
+f('sys/devices/virtual/block/loop2/ro', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop2/make-it-fail', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop2/size', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop2/dev', 0o644, b'7:2\n')
+f('sys/devices/virtual/block/loop2/range', 0o644, b'1\n')
+f('sys/devices/virtual/block/loop2/removable', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop2/stat', 0o644, b'       0        0        0        0        0        0        0        0        0        0        0\n')
+f('sys/devices/virtual/block/loop2/uevent', 0o644, b'''MAJOR=7
+MINOR=2
+DEVTYPE=disk
+''')
+d('sys/devices/virtual/block/loop2/power', 0o755)
+f('sys/devices/virtual/block/loop2/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/block/fake!blockdev0', 0o755)
+l('sys/devices/virtual/block/fake!blockdev0/subsystem', '../../../../class/block')
+f('sys/devices/virtual/block/fake!blockdev0/capability', 0o644, b'10\n')
+f('sys/devices/virtual/block/fake!blockdev0/ro', 0o644, b'0\n')
+f('sys/devices/virtual/block/fake!blockdev0/size', 0o644, b'0\n')
+f('sys/devices/virtual/block/fake!blockdev0/dev', 0o644, b'711:0\n')
+f('sys/devices/virtual/block/fake!blockdev0/range', 0o644, b'1\n')
+f('sys/devices/virtual/block/fake!blockdev0/removable', 0o644, b'0\n')
+f('sys/devices/virtual/block/fake!blockdev0/stat', 0o644, b'       0        0        0        0        0        0        0        0        0        0        0\n')
+f('sys/devices/virtual/block/fake!blockdev0/uevent', 0o644, b'''MAJOR=7
+MINOR=0
+DEVTYPE=disk
+DEVNAME=fake/blockdev0
+''')
+d('sys/devices/virtual/block/loop4', 0o755)
+l('sys/devices/virtual/block/loop4/subsystem', '../../../../class/block')
+l('sys/devices/virtual/block/loop4/bdi', '../../bdi/7:4')
+f('sys/devices/virtual/block/loop4/capability', 0o644, b'10\n')
+f('sys/devices/virtual/block/loop4/ro', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop4/make-it-fail', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop4/size', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop4/dev', 0o644, b'7:4\n')
+f('sys/devices/virtual/block/loop4/range', 0o644, b'1\n')
+f('sys/devices/virtual/block/loop4/removable', 0o644, b'0\n')
+f('sys/devices/virtual/block/loop4/stat', 0o644, b'       0        0        0        0        0        0        0        0        0        0        0\n')
+f('sys/devices/virtual/block/loop4/uevent', 0o644, b'''MAJOR=7
+MINOR=4
+DEVTYPE=disk
+''')
+d('sys/devices/virtual/block/loop4/power', 0o755)
+f('sys/devices/virtual/block/loop4/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/block/md0', 0o755)
+l('sys/devices/virtual/block/md0/subsystem', '../../../../class/block')
+l('sys/devices/virtual/block/md0/bdi', '../../bdi/9:0')
+f('sys/devices/virtual/block/md0/capability', 0o644, b'10\n')
+f('sys/devices/virtual/block/md0/ro', 0o644, b'0\n')
+f('sys/devices/virtual/block/md0/make-it-fail', 0o644, b'0\n')
+f('sys/devices/virtual/block/md0/size', 0o644, b'19534848\n')
+f('sys/devices/virtual/block/md0/dev', 0o644, b'9:0\n')
+f('sys/devices/virtual/block/md0/range', 0o644, b'1\n')
+f('sys/devices/virtual/block/md0/removable', 0o644, b'0\n')
+f('sys/devices/virtual/block/md0/stat', 0o644, b'      60        0      480        0        0        0        0        0        0        0        0\n')
+f('sys/devices/virtual/block/md0/uevent', 0o644, b'''MAJOR=9
+MINOR=0
+DEVTYPE=disk
+''')
+d('sys/devices/virtual/block/md0/power', 0o755)
+f('sys/devices/virtual/block/md0/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/block/md0/md', 0o755)
+l('sys/devices/virtual/block/md0/md/rd1', 'dev-sda9')
+f('sys/devices/virtual/block/md0/md/chunk_size', 0o644, b'0\n')
+f('sys/devices/virtual/block/md0/md/sync_action', 0o644, b'idle\n')
+f('sys/devices/virtual/block/md0/md/sync_speed_min', 0o644, b'1000 (system)\n')
+f('sys/devices/virtual/block/md0/md/sync_force_parallel', 0o644, b'0\n')
+f('sys/devices/virtual/block/md0/md/sync_min', 0o644, b'0\n')
+f('sys/devices/virtual/block/md0/md/mismatch_cnt', 0o644, b'0\n')
+f('sys/devices/virtual/block/md0/md/suspend_hi', 0o644, b'0\n')
+f('sys/devices/virtual/block/md0/md/sync_completed', 0o644, b'0 / 19534848\n')
+f('sys/devices/virtual/block/md0/md/sync_max', 0o644, b'max\n')
+f('sys/devices/virtual/block/md0/md/safe_mode_delay', 0o644, b'0.201\n')
+f('sys/devices/virtual/block/md0/md/degraded', 0o644, b'1\n')
+f('sys/devices/virtual/block/md0/md/component_size', 0o644, b'9767424\n')
+f('sys/devices/virtual/block/md0/md/suspend_lo', 0o644, b'0\n')
+f('sys/devices/virtual/block/md0/md/resync_start', 0o644, b'18446744073709551615\n')
+f('sys/devices/virtual/block/md0/md/sync_speed', 0o644, b'0\n')
+f('sys/devices/virtual/block/md0/md/reshape_position', 0o644, b'none\n')
+f('sys/devices/virtual/block/md0/md/array_state', 0o644, b'clean\n')
+f('sys/devices/virtual/block/md0/md/sync_speed_max', 0o644, b'200000 (system)\n')
+f('sys/devices/virtual/block/md0/md/level', 0o644, b'raid1\n')
+f('sys/devices/virtual/block/md0/md/layout', 0o644, b'0\n')
+f('sys/devices/virtual/block/md0/md/raid_disks', 0o644, b'2\n')
+f('sys/devices/virtual/block/md0/md/metadata_version', 0o644, b'0.90\n')
+d('sys/devices/virtual/block/md0/md/dev-sda9', 0o755)
+l('sys/devices/virtual/block/md0/md/dev-sda9/block', '../../../../../pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9')
+f('sys/devices/virtual/block/md0/md/dev-sda9/slot', 0o644, b'1\n')
+f('sys/devices/virtual/block/md0/md/dev-sda9/size', 0o644, b'23438720\n')
+f('sys/devices/virtual/block/md0/md/dev-sda9/state', 0o644, b'in_sync\n')
+f('sys/devices/virtual/block/md0/md/dev-sda9/errors', 0o644, b'0\n')
+f('sys/devices/virtual/block/md0/md/dev-sda9/offset', 0o644, b'0\n')
+d('sys/devices/virtual/block/md0/slaves', 0o755)
+l('sys/devices/virtual/block/md0/slaves/sda9', '../../../../pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda9')
+d('sys/devices/virtual/graphics', 0o755)
+d('sys/devices/virtual/graphics/fbcon', 0o755)
+l('sys/devices/virtual/graphics/fbcon/subsystem', '../../../../class/graphics')
+f('sys/devices/virtual/graphics/fbcon/cursor_blink', 0o644, b'0\n')
+f('sys/devices/virtual/graphics/fbcon/rotate', 0o644, b'0\n')
+f('sys/devices/virtual/graphics/fbcon/uevent', 0o644, b'')
+d('sys/devices/virtual/graphics/fbcon/power', 0o755)
+f('sys/devices/virtual/graphics/fbcon/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty', 0o755)
+d('sys/devices/virtual/tty/tty51', 0o755)
+l('sys/devices/virtual/tty/tty51/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty51/dev', 0o644, b'4:51\n')
+f('sys/devices/virtual/tty/tty51/uevent', 0o644, b'''MAJOR=4
+MINOR=51
+''')
+d('sys/devices/virtual/tty/tty51/power', 0o755)
+f('sys/devices/virtual/tty/tty51/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty24', 0o755)
+l('sys/devices/virtual/tty/tty24/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty24/dev', 0o644, b'4:24\n')
+f('sys/devices/virtual/tty/tty24/uevent', 0o644, b'''MAJOR=4
+MINOR=24
+''')
+d('sys/devices/virtual/tty/tty24/power', 0o755)
+f('sys/devices/virtual/tty/tty24/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty61', 0o755)
+l('sys/devices/virtual/tty/tty61/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty61/dev', 0o644, b'4:61\n')
+f('sys/devices/virtual/tty/tty61/uevent', 0o644, b'''MAJOR=4
+MINOR=61
+''')
+d('sys/devices/virtual/tty/tty61/power', 0o755)
+f('sys/devices/virtual/tty/tty61/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty40', 0o755)
+l('sys/devices/virtual/tty/tty40/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty40/dev', 0o644, b'4:40\n')
+f('sys/devices/virtual/tty/tty40/uevent', 0o644, b'''MAJOR=4
+MINOR=40
+''')
+d('sys/devices/virtual/tty/tty40/power', 0o755)
+f('sys/devices/virtual/tty/tty40/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty60', 0o755)
+l('sys/devices/virtual/tty/tty60/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty60/dev', 0o644, b'4:60\n')
+f('sys/devices/virtual/tty/tty60/uevent', 0o644, b'''MAJOR=4
+MINOR=60
+''')
+d('sys/devices/virtual/tty/tty60/power', 0o755)
+f('sys/devices/virtual/tty/tty60/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty15', 0o755)
+l('sys/devices/virtual/tty/tty15/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty15/dev', 0o644, b'4:15\n')
+f('sys/devices/virtual/tty/tty15/uevent', 0o644, b'''MAJOR=4
+MINOR=15
+''')
+d('sys/devices/virtual/tty/tty15/power', 0o755)
+f('sys/devices/virtual/tty/tty15/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty27', 0o755)
+l('sys/devices/virtual/tty/tty27/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty27/dev', 0o644, b'4:27\n')
+f('sys/devices/virtual/tty/tty27/uevent', 0o644, b'''MAJOR=4
+MINOR=27
+''')
+d('sys/devices/virtual/tty/tty27/power', 0o755)
+f('sys/devices/virtual/tty/tty27/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty7', 0o755)
+l('sys/devices/virtual/tty/tty7/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty7/dev', 0o644, b'4:7\n')
+f('sys/devices/virtual/tty/tty7/uevent', 0o644, b'''MAJOR=4
+MINOR=7
+''')
+d('sys/devices/virtual/tty/tty7/power', 0o755)
+f('sys/devices/virtual/tty/tty7/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty43', 0o755)
+l('sys/devices/virtual/tty/tty43/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty43/dev', 0o644, b'4:43\n')
+f('sys/devices/virtual/tty/tty43/uevent', 0o644, b'''MAJOR=4
+MINOR=43
+''')
+d('sys/devices/virtual/tty/tty43/power', 0o755)
+f('sys/devices/virtual/tty/tty43/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty23', 0o755)
+l('sys/devices/virtual/tty/tty23/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty23/dev', 0o644, b'4:23\n')
+f('sys/devices/virtual/tty/tty23/uevent', 0o644, b'''MAJOR=4
+MINOR=23
+''')
+d('sys/devices/virtual/tty/tty23/power', 0o755)
+f('sys/devices/virtual/tty/tty23/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty14', 0o755)
+l('sys/devices/virtual/tty/tty14/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty14/dev', 0o644, b'4:14\n')
+f('sys/devices/virtual/tty/tty14/uevent', 0o644, b'''MAJOR=4
+MINOR=14
+''')
+d('sys/devices/virtual/tty/tty14/power', 0o755)
+f('sys/devices/virtual/tty/tty14/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty56', 0o755)
+l('sys/devices/virtual/tty/tty56/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty56/dev', 0o644, b'4:56\n')
+f('sys/devices/virtual/tty/tty56/uevent', 0o644, b'''MAJOR=4
+MINOR=56
+''')
+d('sys/devices/virtual/tty/tty56/power', 0o755)
+f('sys/devices/virtual/tty/tty56/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty3', 0o755)
+l('sys/devices/virtual/tty/tty3/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty3/dev', 0o644, b'4:3\n')
+f('sys/devices/virtual/tty/tty3/uevent', 0o644, b'''MAJOR=4
+MINOR=3
+''')
+d('sys/devices/virtual/tty/tty3/power', 0o755)
+f('sys/devices/virtual/tty/tty3/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty49', 0o755)
+l('sys/devices/virtual/tty/tty49/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty49/dev', 0o644, b'4:49\n')
+f('sys/devices/virtual/tty/tty49/uevent', 0o644, b'''MAJOR=4
+MINOR=49
+''')
+d('sys/devices/virtual/tty/tty49/power', 0o755)
+f('sys/devices/virtual/tty/tty49/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty47', 0o755)
+l('sys/devices/virtual/tty/tty47/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty47/dev', 0o644, b'4:47\n')
+f('sys/devices/virtual/tty/tty47/uevent', 0o644, b'''MAJOR=4
+MINOR=47
+''')
+d('sys/devices/virtual/tty/tty47/power', 0o755)
+f('sys/devices/virtual/tty/tty47/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty57', 0o755)
+l('sys/devices/virtual/tty/tty57/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty57/dev', 0o644, b'4:57\n')
+f('sys/devices/virtual/tty/tty57/uevent', 0o644, b'''MAJOR=4
+MINOR=57
+''')
+d('sys/devices/virtual/tty/tty57/power', 0o755)
+f('sys/devices/virtual/tty/tty57/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty30', 0o755)
+l('sys/devices/virtual/tty/tty30/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty30/dev', 0o644, b'4:30\n')
+f('sys/devices/virtual/tty/tty30/uevent', 0o644, b'''MAJOR=4
+MINOR=30
+''')
+d('sys/devices/virtual/tty/tty30/power', 0o755)
+f('sys/devices/virtual/tty/tty30/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty45', 0o755)
+l('sys/devices/virtual/tty/tty45/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty45/dev', 0o644, b'4:45\n')
+f('sys/devices/virtual/tty/tty45/uevent', 0o644, b'''MAJOR=4
+MINOR=45
+''')
+d('sys/devices/virtual/tty/tty45/power', 0o755)
+f('sys/devices/virtual/tty/tty45/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty22', 0o755)
+l('sys/devices/virtual/tty/tty22/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty22/dev', 0o644, b'4:22\n')
+f('sys/devices/virtual/tty/tty22/uevent', 0o644, b'''MAJOR=4
+MINOR=22
+''')
+d('sys/devices/virtual/tty/tty22/power', 0o755)
+f('sys/devices/virtual/tty/tty22/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty55', 0o755)
+l('sys/devices/virtual/tty/tty55/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty55/dev', 0o644, b'4:55\n')
+f('sys/devices/virtual/tty/tty55/uevent', 0o644, b'''MAJOR=4
+MINOR=55
+''')
+d('sys/devices/virtual/tty/tty55/power', 0o755)
+f('sys/devices/virtual/tty/tty55/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty11', 0o755)
+l('sys/devices/virtual/tty/tty11/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty11/dev', 0o644, b'4:11\n')
+f('sys/devices/virtual/tty/tty11/uevent', 0o644, b'''MAJOR=4
+MINOR=11
+''')
+d('sys/devices/virtual/tty/tty11/power', 0o755)
+f('sys/devices/virtual/tty/tty11/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty53', 0o755)
+l('sys/devices/virtual/tty/tty53/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty53/dev', 0o644, b'4:53\n')
+f('sys/devices/virtual/tty/tty53/uevent', 0o644, b'''MAJOR=4
+MINOR=53
+''')
+d('sys/devices/virtual/tty/tty53/power', 0o755)
+f('sys/devices/virtual/tty/tty53/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty12', 0o755)
+l('sys/devices/virtual/tty/tty12/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty12/dev', 0o644, b'4:12\n')
+f('sys/devices/virtual/tty/tty12/uevent', 0o644, b'''MAJOR=4
+MINOR=12
+''')
+d('sys/devices/virtual/tty/tty12/power', 0o755)
+f('sys/devices/virtual/tty/tty12/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty28', 0o755)
+l('sys/devices/virtual/tty/tty28/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty28/dev', 0o644, b'4:28\n')
+f('sys/devices/virtual/tty/tty28/uevent', 0o644, b'''MAJOR=4
+MINOR=28
+''')
+d('sys/devices/virtual/tty/tty28/power', 0o755)
+f('sys/devices/virtual/tty/tty28/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty58', 0o755)
+l('sys/devices/virtual/tty/tty58/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty58/dev', 0o644, b'4:58\n')
+f('sys/devices/virtual/tty/tty58/uevent', 0o644, b'''MAJOR=4
+MINOR=58
+''')
+d('sys/devices/virtual/tty/tty58/power', 0o755)
+f('sys/devices/virtual/tty/tty58/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty32', 0o755)
+l('sys/devices/virtual/tty/tty32/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty32/dev', 0o644, b'4:32\n')
+f('sys/devices/virtual/tty/tty32/uevent', 0o644, b'''MAJOR=4
+MINOR=32
+''')
+d('sys/devices/virtual/tty/tty32/power', 0o755)
+f('sys/devices/virtual/tty/tty32/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty44', 0o755)
+l('sys/devices/virtual/tty/tty44/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty44/dev', 0o644, b'4:44\n')
+f('sys/devices/virtual/tty/tty44/uevent', 0o644, b'''MAJOR=4
+MINOR=44
+''')
+d('sys/devices/virtual/tty/tty44/power', 0o755)
+f('sys/devices/virtual/tty/tty44/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty6', 0o755)
+l('sys/devices/virtual/tty/tty6/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty6/dev', 0o644, b'4:6\n')
+f('sys/devices/virtual/tty/tty6/uevent', 0o644, b'''MAJOR=4
+MINOR=6
+''')
+d('sys/devices/virtual/tty/tty6/power', 0o755)
+f('sys/devices/virtual/tty/tty6/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty9', 0o755)
+l('sys/devices/virtual/tty/tty9/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty9/dev', 0o644, b'4:9\n')
+f('sys/devices/virtual/tty/tty9/uevent', 0o644, b'''MAJOR=4
+MINOR=9
+''')
+d('sys/devices/virtual/tty/tty9/power', 0o755)
+f('sys/devices/virtual/tty/tty9/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty26', 0o755)
+l('sys/devices/virtual/tty/tty26/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty26/dev', 0o644, b'4:26\n')
+f('sys/devices/virtual/tty/tty26/uevent', 0o644, b'''MAJOR=4
+MINOR=26
+''')
+d('sys/devices/virtual/tty/tty26/power', 0o755)
+f('sys/devices/virtual/tty/tty26/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty10', 0o755)
+l('sys/devices/virtual/tty/tty10/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty10/dev', 0o644, b'4:10\n')
+f('sys/devices/virtual/tty/tty10/uevent', 0o644, b'''MAJOR=4
+MINOR=10
+''')
+d('sys/devices/virtual/tty/tty10/power', 0o755)
+f('sys/devices/virtual/tty/tty10/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty39', 0o755)
+l('sys/devices/virtual/tty/tty39/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty39/dev', 0o644, b'4:39\n')
+f('sys/devices/virtual/tty/tty39/uevent', 0o644, b'''MAJOR=4
+MINOR=39
+''')
+d('sys/devices/virtual/tty/tty39/power', 0o755)
+f('sys/devices/virtual/tty/tty39/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty0', 0o755)
+l('sys/devices/virtual/tty/tty0/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty0/dev', 0o644, b'4:0\n')
+f('sys/devices/virtual/tty/tty0/uevent', 0o644, b'''MAJOR=4
+MINOR=0
+DEVNAME=tty0
+''')
+d('sys/devices/virtual/tty/tty0/power', 0o755)
+f('sys/devices/virtual/tty/tty0/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty36', 0o755)
+l('sys/devices/virtual/tty/tty36/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty36/dev', 0o644, b'4:36\n')
+f('sys/devices/virtual/tty/tty36/uevent', 0o644, b'''MAJOR=4
+MINOR=36
+''')
+d('sys/devices/virtual/tty/tty36/power', 0o755)
+f('sys/devices/virtual/tty/tty36/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty34', 0o755)
+l('sys/devices/virtual/tty/tty34/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty34/dev', 0o644, b'4:34\n')
+f('sys/devices/virtual/tty/tty34/uevent', 0o644, b'''MAJOR=4
+MINOR=34
+''')
+d('sys/devices/virtual/tty/tty34/power', 0o755)
+f('sys/devices/virtual/tty/tty34/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty16', 0o755)
+l('sys/devices/virtual/tty/tty16/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty16/dev', 0o644, b'4:16\n')
+f('sys/devices/virtual/tty/tty16/uevent', 0o644, b'''MAJOR=4
+MINOR=16
+''')
+d('sys/devices/virtual/tty/tty16/power', 0o755)
+f('sys/devices/virtual/tty/tty16/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty25', 0o755)
+l('sys/devices/virtual/tty/tty25/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty25/dev', 0o644, b'4:25\n')
+f('sys/devices/virtual/tty/tty25/uevent', 0o644, b'''MAJOR=4
+MINOR=25
+''')
+d('sys/devices/virtual/tty/tty25/power', 0o755)
+f('sys/devices/virtual/tty/tty25/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty13', 0o755)
+l('sys/devices/virtual/tty/tty13/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty13/dev', 0o644, b'4:13\n')
+f('sys/devices/virtual/tty/tty13/uevent', 0o644, b'''MAJOR=4
+MINOR=13
+''')
+d('sys/devices/virtual/tty/tty13/power', 0o755)
+f('sys/devices/virtual/tty/tty13/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty52', 0o755)
+l('sys/devices/virtual/tty/tty52/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty52/dev', 0o644, b'4:52\n')
+f('sys/devices/virtual/tty/tty52/uevent', 0o644, b'''MAJOR=4
+MINOR=52
+''')
+d('sys/devices/virtual/tty/tty52/power', 0o755)
+f('sys/devices/virtual/tty/tty52/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty31', 0o755)
+l('sys/devices/virtual/tty/tty31/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty31/dev', 0o644, b'4:31\n')
+f('sys/devices/virtual/tty/tty31/uevent', 0o644, b'''MAJOR=4
+MINOR=31
+''')
+d('sys/devices/virtual/tty/tty31/power', 0o755)
+f('sys/devices/virtual/tty/tty31/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty35', 0o755)
+l('sys/devices/virtual/tty/tty35/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty35/dev', 0o644, b'4:35\n')
+f('sys/devices/virtual/tty/tty35/uevent', 0o644, b'''MAJOR=4
+MINOR=35
+''')
+d('sys/devices/virtual/tty/tty35/power', 0o755)
+f('sys/devices/virtual/tty/tty35/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty54', 0o755)
+l('sys/devices/virtual/tty/tty54/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty54/dev', 0o644, b'4:54\n')
+f('sys/devices/virtual/tty/tty54/uevent', 0o644, b'''MAJOR=4
+MINOR=54
+''')
+d('sys/devices/virtual/tty/tty54/power', 0o755)
+f('sys/devices/virtual/tty/tty54/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty63', 0o755)
+l('sys/devices/virtual/tty/tty63/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty63/dev', 0o644, b'4:63\n')
+f('sys/devices/virtual/tty/tty63/uevent', 0o644, b'''MAJOR=4
+MINOR=63
+''')
+d('sys/devices/virtual/tty/tty63/power', 0o755)
+f('sys/devices/virtual/tty/tty63/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty1', 0o755)
+l('sys/devices/virtual/tty/tty1/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty1/dev', 0o644, b'4:1\n')
+f('sys/devices/virtual/tty/tty1/uevent', 0o644, b'''MAJOR=4
+MINOR=1
+''')
+d('sys/devices/virtual/tty/tty1/power', 0o755)
+f('sys/devices/virtual/tty/tty1/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty33', 0o755)
+l('sys/devices/virtual/tty/tty33/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty33/dev', 0o644, b'4:33\n')
+f('sys/devices/virtual/tty/tty33/uevent', 0o644, b'''MAJOR=4
+MINOR=33
+DEVNAME=tty33
+''')
+d('sys/devices/virtual/tty/tty33/power', 0o755)
+f('sys/devices/virtual/tty/tty33/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty18', 0o755)
+l('sys/devices/virtual/tty/tty18/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty18/dev', 0o644, b'4:18\n')
+f('sys/devices/virtual/tty/tty18/uevent', 0o644, b'''MAJOR=4
+MINOR=18
+''')
+d('sys/devices/virtual/tty/tty18/power', 0o755)
+f('sys/devices/virtual/tty/tty18/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty42', 0o755)
+l('sys/devices/virtual/tty/tty42/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty42/dev', 0o644, b'4:42\n')
+f('sys/devices/virtual/tty/tty42/uevent', 0o644, b'''MAJOR=4
+MINOR=42
+''')
+d('sys/devices/virtual/tty/tty42/power', 0o755)
+f('sys/devices/virtual/tty/tty42/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty8', 0o755)
+l('sys/devices/virtual/tty/tty8/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty8/dev', 0o644, b'4:8\n')
+f('sys/devices/virtual/tty/tty8/uevent', 0o644, b'''MAJOR=4
+MINOR=8
+''')
+d('sys/devices/virtual/tty/tty8/power', 0o755)
+f('sys/devices/virtual/tty/tty8/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty37', 0o755)
+l('sys/devices/virtual/tty/tty37/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty37/dev', 0o644, b'4:37\n')
+f('sys/devices/virtual/tty/tty37/uevent', 0o644, b'''MAJOR=4
+MINOR=37
+''')
+d('sys/devices/virtual/tty/tty37/power', 0o755)
+f('sys/devices/virtual/tty/tty37/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty5', 0o755)
+l('sys/devices/virtual/tty/tty5/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty5/dev', 0o644, b'4:5\n')
+f('sys/devices/virtual/tty/tty5/uevent', 0o644, b'''MAJOR=4
+MINOR=5
+''')
+d('sys/devices/virtual/tty/tty5/power', 0o755)
+f('sys/devices/virtual/tty/tty5/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty48', 0o755)
+l('sys/devices/virtual/tty/tty48/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty48/dev', 0o644, b'4:48\n')
+f('sys/devices/virtual/tty/tty48/uevent', 0o644, b'''MAJOR=4
+MINOR=48
+''')
+d('sys/devices/virtual/tty/tty48/power', 0o755)
+f('sys/devices/virtual/tty/tty48/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty17', 0o755)
+l('sys/devices/virtual/tty/tty17/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty17/dev', 0o644, b'4:17\n')
+f('sys/devices/virtual/tty/tty17/uevent', 0o644, b'''MAJOR=4
+MINOR=17
+''')
+d('sys/devices/virtual/tty/tty17/power', 0o755)
+f('sys/devices/virtual/tty/tty17/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty62', 0o755)
+l('sys/devices/virtual/tty/tty62/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty62/dev', 0o644, b'4:62\n')
+f('sys/devices/virtual/tty/tty62/uevent', 0o644, b'''MAJOR=4
+MINOR=62
+''')
+d('sys/devices/virtual/tty/tty62/power', 0o755)
+f('sys/devices/virtual/tty/tty62/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty59', 0o755)
+l('sys/devices/virtual/tty/tty59/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty59/dev', 0o644, b'4:59\n')
+f('sys/devices/virtual/tty/tty59/uevent', 0o644, b'''MAJOR=4
+MINOR=59
+''')
+d('sys/devices/virtual/tty/tty59/power', 0o755)
+f('sys/devices/virtual/tty/tty59/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty50', 0o755)
+l('sys/devices/virtual/tty/tty50/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty50/dev', 0o644, b'4:50\n')
+f('sys/devices/virtual/tty/tty50/uevent', 0o644, b'''MAJOR=4
+MINOR=50
+''')
+d('sys/devices/virtual/tty/tty50/power', 0o755)
+f('sys/devices/virtual/tty/tty50/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty21', 0o755)
+l('sys/devices/virtual/tty/tty21/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty21/dev', 0o644, b'4:21\n')
+f('sys/devices/virtual/tty/tty21/uevent', 0o644, b'''MAJOR=4
+MINOR=21
+''')
+d('sys/devices/virtual/tty/tty21/power', 0o755)
+f('sys/devices/virtual/tty/tty21/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty19', 0o755)
+l('sys/devices/virtual/tty/tty19/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty19/dev', 0o644, b'4:19\n')
+f('sys/devices/virtual/tty/tty19/uevent', 0o644, b'''MAJOR=4
+MINOR=19
+''')
+d('sys/devices/virtual/tty/tty19/power', 0o755)
+f('sys/devices/virtual/tty/tty19/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/ptmx', 0o755)
+l('sys/devices/virtual/tty/ptmx/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/ptmx/dev', 0o644, b'5:2\n')
+f('sys/devices/virtual/tty/ptmx/uevent', 0o644, b'''MAJOR=5
+MINOR=2
+''')
+d('sys/devices/virtual/tty/ptmx/power', 0o755)
+f('sys/devices/virtual/tty/ptmx/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty46', 0o755)
+l('sys/devices/virtual/tty/tty46/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty46/dev', 0o644, b'4:46\n')
+f('sys/devices/virtual/tty/tty46/uevent', 0o644, b'''MAJOR=4
+MINOR=46
+''')
+d('sys/devices/virtual/tty/tty46/power', 0o755)
+f('sys/devices/virtual/tty/tty46/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty2', 0o755)
+l('sys/devices/virtual/tty/tty2/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty2/dev', 0o644, b'4:2\n')
+f('sys/devices/virtual/tty/tty2/uevent', 0o644, b'''MAJOR=4
+MINOR=2
+''')
+d('sys/devices/virtual/tty/tty2/power', 0o755)
+f('sys/devices/virtual/tty/tty2/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/console', 0o755)
+l('sys/devices/virtual/tty/console/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/console/dev', 0o644, b'5:1\n')
+f('sys/devices/virtual/tty/console/uevent', 0o644, b'''MAJOR=5
+MINOR=1
+DEVNAME=console
+''')
+d('sys/devices/virtual/tty/console/power', 0o755)
+f('sys/devices/virtual/tty/console/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty41', 0o755)
+l('sys/devices/virtual/tty/tty41/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty41/dev', 0o644, b'4:41\n')
+f('sys/devices/virtual/tty/tty41/uevent', 0o644, b'''MAJOR=4
+MINOR=41
+''')
+d('sys/devices/virtual/tty/tty41/power', 0o755)
+f('sys/devices/virtual/tty/tty41/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty4', 0o755)
+l('sys/devices/virtual/tty/tty4/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty4/dev', 0o644, b'4:4\n')
+f('sys/devices/virtual/tty/tty4/uevent', 0o644, b'''MAJOR=4
+MINOR=4
+''')
+d('sys/devices/virtual/tty/tty4/power', 0o755)
+f('sys/devices/virtual/tty/tty4/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty29', 0o755)
+l('sys/devices/virtual/tty/tty29/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty29/dev', 0o644, b'4:29\n')
+f('sys/devices/virtual/tty/tty29/uevent', 0o644, b'''MAJOR=4
+MINOR=29
+''')
+d('sys/devices/virtual/tty/tty29/power', 0o755)
+f('sys/devices/virtual/tty/tty29/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty', 0o755)
+l('sys/devices/virtual/tty/tty/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty/dev', 0o644, b'5:0\n')
+f('sys/devices/virtual/tty/tty/uevent', 0o644, b'''MAJOR=5
+MINOR=0
+''')
+d('sys/devices/virtual/tty/tty/power', 0o755)
+f('sys/devices/virtual/tty/tty/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty38', 0o755)
+l('sys/devices/virtual/tty/tty38/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty38/dev', 0o644, b'4:38\n')
+f('sys/devices/virtual/tty/tty38/uevent', 0o644, b'''MAJOR=4
+MINOR=38
+''')
+d('sys/devices/virtual/tty/tty38/power', 0o755)
+f('sys/devices/virtual/tty/tty38/power/wakeup', 0o644, b'\n')
+d('sys/devices/virtual/tty/tty20', 0o755)
+l('sys/devices/virtual/tty/tty20/subsystem', '../../../../class/tty')
+f('sys/devices/virtual/tty/tty20/dev', 0o644, b'4:20\n')
+f('sys/devices/virtual/tty/tty20/uevent', 0o644, b'''MAJOR=4
+MINOR=20
+''')
+d('sys/devices/virtual/tty/tty20/power', 0o755)
+f('sys/devices/virtual/tty/tty20/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00', 0o755)
+l('sys/devices/LNXSYSTM:00/subsystem', '../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/hid', 0o644, b'LNXSYSTM\n')
+f('sys/devices/LNXSYSTM:00/modalias', 0o644, b'acpi:LNXSYSTM:\n')
+f('sys/devices/LNXSYSTM:00/path', 0o644, b'\\\n')
+f('sys/devices/LNXSYSTM:00/uevent', 0o644, b'MODALIAS=acpi:LNXSYSTM:\n')
+d('sys/devices/LNXSYSTM:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/ACPI0007:01', 0o755)
+l('sys/devices/LNXSYSTM:00/ACPI0007:01/thermal_cooling', '../../virtual/thermal/cooling_device1')
+l('sys/devices/LNXSYSTM:00/ACPI0007:01/subsystem', '../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/ACPI0007:01/sysdev', '../../system/cpu/cpu1')
+l('sys/devices/LNXSYSTM:00/ACPI0007:01/driver', '../../../bus/acpi/drivers/processor')
+f('sys/devices/LNXSYSTM:00/ACPI0007:01/hid', 0o644, b'ACPI0007\n')
+f('sys/devices/LNXSYSTM:00/ACPI0007:01/modalias', 0o644, b'acpi:ACPI0007:\n')
+f('sys/devices/LNXSYSTM:00/ACPI0007:01/path', 0o644, b'\\_PR_.CPU1\n')
+f('sys/devices/LNXSYSTM:00/ACPI0007:01/uevent', 0o644, b'''DRIVER=processor
+MODALIAS=acpi:ACPI0007:
+''')
+d('sys/devices/LNXSYSTM:00/ACPI0007:01/power', 0o755)
+f('sys/devices/LNXSYSTM:00/ACPI0007:01/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/LNXTHERM:00', 0o755)
+l('sys/devices/LNXSYSTM:00/LNXTHERM:00/subsystem', '../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/LNXTHERM:00/hid', 0o644, b'LNXTHERM\n')
+f('sys/devices/LNXSYSTM:00/LNXTHERM:00/modalias', 0o644, b'acpi:LNXTHERM:\n')
+f('sys/devices/LNXSYSTM:00/LNXTHERM:00/path', 0o644, b'\\_TZ_\n')
+f('sys/devices/LNXSYSTM:00/LNXTHERM:00/uevent', 0o644, b'MODALIAS=acpi:LNXTHERM:\n')
+d('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:01', 0o755)
+l('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:01/subsystem', '../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:01/thermal_zone', '../../../virtual/thermal/thermal_zone0')
+l('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:01/driver', '../../../../bus/acpi/drivers/thermal')
+f('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:01/hid', 0o644, b'LNXTHERM\n')
+f('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:01/modalias', 0o644, b'acpi:LNXTHERM:\n')
+f('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:01/path', 0o644, b'\\_TZ_.THM0\n')
+f('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:01/uevent', 0o644, b'''DRIVER=thermal
+MODALIAS=acpi:LNXTHERM:
+''')
+d('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:01/power', 0o755)
+f('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:01/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/LNXTHERM:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/LNXTHERM:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:02', 0o755)
+l('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:02/subsystem', '../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:02/thermal_zone', '../../../virtual/thermal/thermal_zone1')
+l('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:02/driver', '../../../../bus/acpi/drivers/thermal')
+f('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:02/hid', 0o644, b'LNXTHERM\n')
+f('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:02/modalias', 0o644, b'acpi:LNXTHERM:\n')
+f('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:02/path', 0o644, b'\\_TZ_.THM1\n')
+f('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:02/uevent', 0o644, b'''DRIVER=thermal
+MODALIAS=acpi:LNXTHERM:
+''')
+d('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:02/power', 0o755)
+f('sys/devices/LNXSYSTM:00/LNXTHERM:00/LNXTHERM:02/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/subsystem', '../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/path', 0o644, b'\\_SB_\n')
+f('sys/devices/LNXSYSTM:00/device:00/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:05', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:05/subsystem', '../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:05/driver', '../../../../bus/acpi/drivers/pci_link')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:05/hid', 0o644, b'PNP0C0F\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:05/modalias', 0o644, b'acpi:PNP0C0F:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:05/path', 0o644, b'\\_SB_.LNKF\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:05/uevent', 0o644, b'''DRIVER=pci_link
+MODALIAS=acpi:PNP0C0F:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:05/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:05/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/subsystem', '../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/driver', '../../../../bus/acpi/drivers/button')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/hid', 0o644, b'PNP0C0E\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/modalias', 0o644, b'acpi:PNP0C0E:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/path', 0o644, b'\\_SB_.SLPB\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/uevent', 0o644, b'''DRIVER=button
+MODALIAS=acpi:PNP0C0E:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input', 0o755)
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/subsystem', '../../../../../../class/input')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/device', '../../../PNP0C0E:00')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/uniq', 0o644, b'\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/phys', 0o644, b'PNP0C0E/button/input0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/modalias', 0o644, b'input:b0019v0000p0003e0000-e0,1,k8E,ramlsfw\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/name', 0o644, b'Sleep Button (CM)\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/uevent', 0o644, b'''PRODUCT=19/0/3/0
+NAME="Sleep Button (CM)"
+PHYS="PNP0C0E/button/input0"
+EV==3
+KEY==4000 0 0
+MODALIAS=input:b0019v0000p0003e0000-e0,1,k8E,ramlsfw
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/id', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/id/version', 0o644, b'0000\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/id/product', 0o644, b'0003\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/id/vendor', 0o644, b'0000\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/id/bustype', 0o644, b'0019\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/event5', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/event5/subsystem', '../../../../../../../class/input')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/event5/device', '../../input5')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/event5/dev', 0o644, b'13:69\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/event5/uevent', 0o644, b'''MAJOR=13
+MINOR=69
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/event5/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/event5/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/capabilities', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/capabilities/msc', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/capabilities/abs', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/capabilities/snd', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/capabilities/ff', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/capabilities/key', 0o644, b'4000 0 0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/capabilities/rel', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/capabilities/sw', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/capabilities/ev', 0o644, b'3\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0E:00/input/input5/capabilities/led', 0o644, b'0\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/subsystem', '../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/physical_node', '../../../pci0000:00')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/driver', '../../../../bus/acpi/drivers/pci_root')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/hid', 0o644, b'PNP0A08\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/modalias', 0o644, b'acpi:PNP0A08:PNP0A03:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/path', 0o644, b'\\_SB_.PCI0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/uevent', 0o644, b'''DRIVER=pci_root
+MODALIAS=acpi:PNP0A08:PNP0A03:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11/physical_node', '../../../../pci0000:00/0000:00:1e.0')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11/path', 0o644, b'\\_SB_.PCI0.PCI1\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11/device:12', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11/device:12/subsystem', '../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11/device:12/physical_node', '../../../../../pci0000:00/0000:00:1e.0/0000:15:00.0')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11/device:12/path', 0o644, b'\\_SB_.PCI0.PCI1.CDBS\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11/device:12/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11/device:12/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:11/device:12/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/physical_node', '../../../../pci0000:00/0000:00:1d.7')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/path', 0o644, b'\\_SB_.PCI0.USB7\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/subsystem', '../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/path', 0o644, b'\\_SB_.PCI0.USB7.URTH\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/device:23', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/device:23/subsystem', '../../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/device:23/path', 0o644, b'\\_SB_.PCI0.USB7.URTH.UPDK\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/device:23/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/device:23/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/device:23/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/device:24', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/device:24/subsystem', '../../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/device:24/path', 0o644, b'\\_SB_.PCI0.USB7.URTH.UPEX\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/device:24/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/device:24/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:21/device:22/device:24/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0b', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0b/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0b/physical_node', '../../../../pci0000:00/0000:00:1c.0')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0b/path', 0o644, b'\\_SB_.PCI0.EXP0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0b/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0b/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0b/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/physical_node', '../../../../pci0000:00/0000:00:01.0')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/path', 0o644, b'\\_SB_.PCI0.AGP_\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/subsystem', '../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/physical_node', '../../../../../pci0000:00/0000:00:01.0/0000:01:00.0')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/modalias', 0o644, b'acpi:LNXVIDEO:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/path', 0o644, b'\\_SB_.PCI0.AGP_.VID_\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/uevent', 0o644, b'MODALIAS=acpi:LNXVIDEO:\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:08', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:08/subsystem', '../../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:08/path', 0o644, b'\\_SB_.PCI0.AGP_.VID_.LCD0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:08/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:08/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:08/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:09', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:09/subsystem', '../../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:09/path', 0o644, b'\\_SB_.PCI0.AGP_.VID_.CRT0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:09/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:09/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:09/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:0a', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:0a/subsystem', '../../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:0a/path', 0o644, b'\\_SB_.PCI0.AGP_.VID_.DVI0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:0a/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:0a/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:06/device:07/device:0a/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:18', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:18/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:18/physical_node', '../../../../pci0000:00/0000:00:1f.3')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:18/path', 0o644, b'\\_SB_.PCI0.SMBU\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:18/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:18/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:18/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0c', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0c/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0c/physical_node', '../../../../pci0000:00/0000:00:1c.1')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0c/path', 0o644, b'\\_SB_.PCI0.EXP1\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0c/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0c/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0c/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/subsystem', '../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/modalias', 0o644, b'acpi:LNXVIDEO:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/path', 0o644, b'\\_SB_.PCI0.VID_\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/uevent', 0o644, b'MODALIAS=acpi:LNXVIDEO:\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:04', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:04/subsystem', '../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:04/path', 0o644, b'\\_SB_.PCI0.VID_.CRT0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:04/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:04/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:04/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:05', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:05/subsystem', '../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:05/path', 0o644, b'\\_SB_.PCI0.VID_.DVI0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:05/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:05/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:05/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:03', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:03/subsystem', '../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:03/path', 0o644, b'\\_SB_.PCI0.VID_.LCD0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:03/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:03/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:02/device:03/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/physical_node', '../../../../pci0000:00/0000:00:1f.1')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/path', 0o644, b'\\_SB_.PCI0.IDE0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/device:14', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/device:14/subsystem', '../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/device:14/path', 0o644, b'\\_SB_.PCI0.IDE0.PRIM\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/device:14/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/device:14/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/device:14/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/device:14/device:15', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/device:14/device:15/subsystem', '../../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/device:14/device:15/modalias', 0o644, b'acpi:LNXIOBAY:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/device:14/device:15/path', 0o644, b'\\_SB_.PCI0.IDE0.PRIM.MSTR\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/device:14/device:15/uevent', 0o644, b'MODALIAS=acpi:LNXIOBAY:\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/device:14/device:15/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:13/device:14/device:15/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/physical_node', '../../../../pci0000:00/0000:00:1d.2')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/path', 0o644, b'\\_SB_.PCI0.USB2\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/device:1e', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/device:1e/subsystem', '../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/device:1e/path', 0o644, b'\\_SB_.PCI0.USB2.URTH\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/device:1e/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/device:1e/device:1f', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/device:1e/device:1f/subsystem', '../../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/device:1e/device:1f/path', 0o644, b'\\_SB_.PCI0.USB2.URTH.UPDK\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/device:1e/device:1f/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/device:1e/device:1f/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/device:1e/device:1f/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/device:1e/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1d/device:1e/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:19', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:19/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:19/physical_node', '../../../../pci0000:00/0000:00:1d.0')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:19/path', 0o644, b'\\_SB_.PCI0.USB0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:19/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:19/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:19/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/physical_node', '../../../../pci0000:00/0000:00:1d.1')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/path', 0o644, b'\\_SB_.PCI0.USB1\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/device:1b', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/device:1b/subsystem', '../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/device:1b/path', 0o644, b'\\_SB_.PCI0.USB1.URTH\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/device:1b/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/device:1b/device:1c', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/device:1b/device:1c/subsystem', '../../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/device:1b/device:1c/path', 0o644, b'\\_SB_.PCI0.USB1.URTH.UPEX\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/device:1b/device:1c/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/device:1b/device:1c/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/device:1b/device:1c/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/device:1b/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:1a/device:1b/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d/physical_node', '../../../../pci0000:00/0000:00:1c.2')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d/path', 0o644, b'\\_SB_.PCI0.EXP2\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d/device:0e', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d/device:0e/subsystem', '../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d/device:0e/path', 0o644, b'\\_SB_.PCI0.EXP2.EXUP\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d/device:0e/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d/device:0e/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d/device:0e/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:25', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:25/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:25/physical_node', '../../../../pci0000:00/0000:00:1b.0')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:25/path', 0o644, b'\\_SB_.PCI0.HDEF\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:25/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:25/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:25/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/physical_node', '../../../../pci0000:00/0000:00:1f.0')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/path', 0o644, b'\\_SB_.PCI0.LPC_\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0000:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0000:00/subsystem', '../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0000:00/hid', 0o644, b'PNP0000\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0000:00/modalias', 0o644, b'acpi:PNP0000:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0000:00/path', 0o644, b'\\_SB_.PCI0.LPC_.PIC_\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0000:00/uevent', 0o644, b'MODALIAS=acpi:PNP0000:\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0000:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0000:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0103:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0103:00/subsystem', '../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0103:00/physical_node', '../../../../../pnp0/00:03')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0103:00/hid', 0o644, b'PNP0103\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0103:00/modalias', 0o644, b'acpi:PNP0103:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0103:00/path', 0o644, b'\\_SB_.PCI0.LPC_.HPET\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0103:00/uevent', 0o644, b'MODALIAS=acpi:PNP0103:\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0103:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0103:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/ATM1200:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/ATM1200:00/subsystem', '../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/ATM1200:00/physical_node', '../../../../../pnp0/00:0a')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/ATM1200:00/hid', 0o644, b'ATM1200\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/ATM1200:00/modalias', 0o644, b'acpi:ATM1200:PNP0C31:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/ATM1200:00/path', 0o644, b'\\_SB_.PCI0.LPC_.TPM_\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/ATM1200:00/uevent', 0o644, b'MODALIAS=acpi:ATM1200:PNP0C31:\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/ATM1200:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/ATM1200:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0303:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0303:00/subsystem', '../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0303:00/physical_node', '../../../../../pnp0/00:08')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0303:00/hid', 0o644, b'PNP0303\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0303:00/modalias', 0o644, b'acpi:PNP0303:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0303:00/path', 0o644, b'\\_SB_.PCI0.LPC_.KBD_\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0303:00/uevent', 0o644, b'MODALIAS=acpi:PNP0303:\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0303:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0303:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C04:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C04:00/subsystem', '../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C04:00/physical_node', '../../../../../pnp0/00:06')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C04:00/hid', 0o644, b'PNP0C04\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C04:00/modalias', 0o644, b'acpi:PNP0C04:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C04:00/path', 0o644, b'\\_SB_.PCI0.LPC_.FPU_\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C04:00/uevent', 0o644, b'MODALIAS=acpi:PNP0C04:\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C04:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C04:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0800:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0800:00/subsystem', '../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0800:00/physical_node', '../../../../../pnp0/00:05')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0800:00/hid', 0o644, b'PNP0800\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0800:00/modalias', 0o644, b'acpi:PNP0800:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0800:00/path', 0o644, b'\\_SB_.PCI0.LPC_.SPKR\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0800:00/uevent', 0o644, b'MODALIAS=acpi:PNP0800:\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0800:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0800:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C02:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C02:00/subsystem', '../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C02:00/physical_node', '../../../../../pnp0/00:02')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C02:00/hid', 0o644, b'PNP0C02\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C02:00/modalias', 0o644, b'acpi:PNP0C02:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C02:00/path', 0o644, b'\\_SB_.PCI0.LPC_.SIO_\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C02:00/uevent', 0o644, b'MODALIAS=acpi:PNP0C02:\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C02:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C02:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0100:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0100:00/subsystem', '../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0100:00/hid', 0o644, b'PNP0100\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0100:00/modalias', 0o644, b'acpi:PNP0100:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0100:00/path', 0o644, b'\\_SB_.PCI0.LPC_.TIMR\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0100:00/uevent', 0o644, b'MODALIAS=acpi:PNP0100:\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0100:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0100:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/subsystem', '../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/driver', '../../../../../../bus/acpi/drivers/ec')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/hid', 0o644, b'PNP0C09\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/modalias', 0o644, b'acpi:PNP0C09:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/path', 0o644, b'\\_SB_.PCI0.LPC_.EC__\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/uevent', 0o644, b'''DRIVER=ec
+MODALIAS=acpi:PNP0C09:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/LNXPOWER:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/LNXPOWER:00/subsystem', '../../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/LNXPOWER:00/driver', '../../../../../../../bus/acpi/drivers/power')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/LNXPOWER:00/hid', 0o644, b'LNXPOWER\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/LNXPOWER:00/modalias', 0o644, b'acpi:LNXPOWER:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/LNXPOWER:00/path', 0o644, b'\\_SB_.PCI0.LPC_.EC__.PUBS\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/LNXPOWER:00/uevent', 0o644, b'''DRIVER=power
+MODALIAS=acpi:LNXPOWER:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/LNXPOWER:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/LNXPOWER:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/subsystem', '../../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/driver', '../../../../../../../bus/acpi/drivers/ac')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/hid', 0o644, b'ACPI0003\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/modalias', 0o644, b'acpi:ACPI0003:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/path', 0o644, b'\\_SB_.PCI0.LPC_.EC__.AC__\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/uevent', 0o644, b'''DRIVER=ac
+MODALIAS=acpi:ACPI0003:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/power_supply', 0o755)
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/power_supply/AC', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/power_supply/AC/subsystem', '../../../../../../../../../class/power_supply')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/power_supply/AC/device', '../../../ACPI0003:00')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/power_supply/AC/type', 0o644, b'Mains\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/power_supply/AC/online', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/power_supply/AC/uevent', 0o644, b'''POWER_SUPPLY_NAME=AC
+POWER_SUPPLY_TYPE=Mains
+POWER_SUPPLY_ONLINE=0
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/power_supply/AC/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/subsystem', '../../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/driver', '../../../../../../../bus/acpi/drivers/battery')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/hid', 0o644, b'PNP0C0A\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/modalias', 0o644, b'acpi:PNP0C0A:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/path', 0o644, b'\\_SB_.PCI0.LPC_.EC__.BAT0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/uevent', 0o644, b'''DRIVER=battery
+MODALIAS=acpi:PNP0C0A:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply', 0o755)
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/subsystem', '../../../../../../../../../class/power_supply')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/device', '../../../PNP0C0A:00')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/model_name', 0o644, b'42T5245\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/voltage_min_design', 0o644, b'10800000\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/type', 0o644, b'Battery\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/current_now', 0o644, b'25830000\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/energy_now', 0o644, b'59980000\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/technology', 0o644, b'Li-ion\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/voltage_now', 0o644, b'12207000\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/energy_full_design', 0o644, b'84240000\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/serial_number', 0o644, b' 6463\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/present', 0o644, b'1\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/alarm', 0o644, b'3075000\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/uevent', 0o644, b'''POWER_SUPPLY_NAME=BAT0
+POWER_SUPPLY_TYPE=Battery
+POWER_SUPPLY_STATUS=Discharging
+POWER_SUPPLY_PRESENT=1
+POWER_SUPPLY_TECHNOLOGY=Li-ion
+POWER_SUPPLY_VOLTAGE_MIN_DESIGN=10800000
+POWER_SUPPLY_VOLTAGE_NOW=12207000
+POWER_SUPPLY_CURRENT_NOW=25830000
+POWER_SUPPLY_ENERGY_FULL_DESIGN=84240000
+POWER_SUPPLY_ENERGY_FULL=61510000
+POWER_SUPPLY_ENERGY_NOW=59980000
+POWER_SUPPLY_MODEL_NAME=42T5245
+POWER_SUPPLY_MANUFACTURER=SANYO
+POWER_SUPPLY_SERIAL_NUMBER= 6463
+''')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/manufacturer', 0o644, b'SANYO\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/energy_full', 0o644, b'61510000\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/status', 0o644, b'Discharging\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/IBM0068:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/IBM0068:00/subsystem', '../../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/IBM0068:00/driver', '../../../../../../../bus/acpi/drivers/thinkpad_hotkey')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/IBM0068:00/hid', 0o644, b'IBM0068\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/IBM0068:00/modalias', 0o644, b'acpi:IBM0068:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/IBM0068:00/path', 0o644, b'\\_SB_.PCI0.LPC_.EC__.HKEY\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/IBM0068:00/uevent', 0o644, b'''DRIVER=thinkpad_hotkey
+MODALIAS=acpi:IBM0068:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/IBM0068:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0C09:00/IBM0068:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0200:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0200:00/subsystem', '../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0200:00/physical_node', '../../../../../pnp0/00:04')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0200:00/hid', 0o644, b'PNP0200\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0200:00/modalias', 0o644, b'acpi:PNP0200:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0200:00/path', 0o644, b'\\_SB_.PCI0.LPC_.DMAC\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0200:00/uevent', 0o644, b'MODALIAS=acpi:PNP0200:\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0200:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0200:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/IBM0057:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/IBM0057:00/subsystem', '../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/IBM0057:00/physical_node', '../../../../../pnp0/00:09')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/IBM0057:00/hid', 0o644, b'IBM0057\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/IBM0057:00/modalias', 0o644, b'acpi:IBM0057:PNP0F13:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/IBM0057:00/path', 0o644, b'\\_SB_.PCI0.LPC_.MOU_\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/IBM0057:00/uevent', 0o644, b'MODALIAS=acpi:IBM0057:PNP0F13:\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/IBM0057:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/IBM0057:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0B00:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0B00:00/subsystem', '../../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0B00:00/physical_node', '../../../../../pnp0/00:07')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0B00:00/hid', 0o644, b'PNP0B00\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0B00:00/modalias', 0o644, b'acpi:PNP0B00:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0B00:00/path', 0o644, b'\\_SB_.PCI0.LPC_.RTC_\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0B00:00/uevent', 0o644, b'MODALIAS=acpi:PNP0B00:\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0B00:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:01/PNP0B00:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:20', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:20/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:20/physical_node', '../../../../pci0000:00/0000:00:1d.3')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:20/path', 0o644, b'\\_SB_.PCI0.USB3\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:20/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:20/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:20/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0f', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0f/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0f/physical_node', '../../../../pci0000:00/0000:00:1c.3')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0f/path', 0o644, b'\\_SB_.PCI0.EXP3\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0f/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0f/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0f/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0f/device:10', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0f/device:10/subsystem', '../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0f/device:10/path', 0o644, b'\\_SB_.PCI0.EXP3.EXPD\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0f/device:10/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0f/device:10/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0f/device:10/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:16', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:16/subsystem', '../../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:16/physical_node', '../../../../pci0000:00/0000:00:1f.2')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:16/path', 0o644, b'\\_SB_.PCI0.SATA\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:16/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:16/device:17', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:16/device:17/subsystem', '../../../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:16/device:17/path', 0o644, b'\\_SB_.PCI0.SATA.PRT0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:16/device:17/uevent', 0o644, b'')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:16/device:17/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:16/device:17/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:16/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:16/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/IBM0079:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/IBM0079:00/subsystem', '../../../../bus/acpi')
+f('sys/devices/LNXSYSTM:00/device:00/IBM0079:00/hid', 0o644, b'IBM0079\n')
+f('sys/devices/LNXSYSTM:00/device:00/IBM0079:00/modalias', 0o644, b'acpi:IBM0079:PNP0C15:LNXDOCK:\n')
+f('sys/devices/LNXSYSTM:00/device:00/IBM0079:00/path', 0o644, b'\\_SB_.GDCK\n')
+f('sys/devices/LNXSYSTM:00/device:00/IBM0079:00/uevent', 0o644, b'MODALIAS=acpi:IBM0079:PNP0C15:LNXDOCK:\n')
+d('sys/devices/LNXSYSTM:00/device:00/IBM0079:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/IBM0079:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/subsystem', '../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/driver', '../../../../bus/acpi/drivers/button')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/hid', 0o644, b'PNP0C0D\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/modalias', 0o644, b'acpi:PNP0C0D:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/path', 0o644, b'\\_SB_.LID_\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/uevent', 0o644, b'''DRIVER=button
+MODALIAS=acpi:PNP0C0D:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input', 0o755)
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/subsystem', '../../../../../../class/input')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/device', '../../../PNP0C0D:00')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/uniq', 0o644, b'\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/phys', 0o644, b'PNP0C0D/button/input0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/modalias', 0o644, b'input:b0019v0000p0005e0000-e0,5,kramlsfw0,\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/name', 0o644, b'Lid Switch\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/uevent', 0o644, b'''PRODUCT=19/0/5/0
+NAME="Lid Switch"
+PHYS="PNP0C0D/button/input0"
+EV==21
+SW==1
+MODALIAS=input:b0019v0000p0005e0000-e0,5,kramlsfw0,
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/event4', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/event4/subsystem', '../../../../../../../class/input')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/event4/device', '../../input4')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/event4/dev', 0o644, b'13:68\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/event4/uevent', 0o644, b'''MAJOR=13
+MINOR=68
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/event4/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/event4/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/id', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/id/version', 0o644, b'0000\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/id/product', 0o644, b'0005\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/id/vendor', 0o644, b'0000\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/id/bustype', 0o644, b'0019\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/capabilities', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/capabilities/msc', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/capabilities/abs', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/capabilities/snd', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/capabilities/ff', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/capabilities/key', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/capabilities/rel', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/capabilities/sw', 0o644, b'1\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/capabilities/ev', 0o644, b'21\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input4/capabilities/led', 0o644, b'0\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C01:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C01:00/subsystem', '../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C01:00/physical_node', '../../../pnp0/00:00')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C01:00/hid', 0o644, b'PNP0C01\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C01:00/modalias', 0o644, b'acpi:PNP0C01:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C01:00/path', 0o644, b'\\_SB_.MEM_\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C01:00/uevent', 0o644, b'MODALIAS=acpi:PNP0C01:\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C01:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C01:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:07', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:07/subsystem', '../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:07/driver', '../../../../bus/acpi/drivers/pci_link')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:07/hid', 0o644, b'PNP0C0F\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:07/modalias', 0o644, b'acpi:PNP0C0F:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:07/path', 0o644, b'\\_SB_.LNKH\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:07/uevent', 0o644, b'''DRIVER=pci_link
+MODALIAS=acpi:PNP0C0F:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:07/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:07/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:04', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:04/subsystem', '../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:04/driver', '../../../../bus/acpi/drivers/pci_link')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:04/hid', 0o644, b'PNP0C0F\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:04/modalias', 0o644, b'acpi:PNP0C0F:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:04/path', 0o644, b'\\_SB_.LNKE\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:04/uevent', 0o644, b'''DRIVER=pci_link
+MODALIAS=acpi:PNP0C0F:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:04/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:04/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:02', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:02/subsystem', '../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:02/driver', '../../../../bus/acpi/drivers/pci_link')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:02/hid', 0o644, b'PNP0C0F\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:02/modalias', 0o644, b'acpi:PNP0C0F:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:02/path', 0o644, b'\\_SB_.LNKC\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:02/uevent', 0o644, b'''DRIVER=pci_link
+MODALIAS=acpi:PNP0C0F:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:02/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:02/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:00', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:00/subsystem', '../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:00/driver', '../../../../bus/acpi/drivers/pci_link')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:00/hid', 0o644, b'PNP0C0F\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:00/modalias', 0o644, b'acpi:PNP0C0F:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:00/path', 0o644, b'\\_SB_.LNKA\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:00/uevent', 0o644, b'''DRIVER=pci_link
+MODALIAS=acpi:PNP0C0F:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:01', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:01/subsystem', '../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:01/driver', '../../../../bus/acpi/drivers/pci_link')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:01/hid', 0o644, b'PNP0C0F\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:01/modalias', 0o644, b'acpi:PNP0C0F:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:01/path', 0o644, b'\\_SB_.LNKB\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:01/uevent', 0o644, b'''DRIVER=pci_link
+MODALIAS=acpi:PNP0C0F:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:01/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:01/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:06', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:06/subsystem', '../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:06/driver', '../../../../bus/acpi/drivers/pci_link')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:06/hid', 0o644, b'PNP0C0F\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:06/modalias', 0o644, b'acpi:PNP0C0F:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:06/path', 0o644, b'\\_SB_.LNKG\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:06/uevent', 0o644, b'''DRIVER=pci_link
+MODALIAS=acpi:PNP0C0F:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:06/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:06/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:03', 0o755)
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:03/subsystem', '../../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:03/driver', '../../../../bus/acpi/drivers/pci_link')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:03/hid', 0o644, b'PNP0C0F\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:03/modalias', 0o644, b'acpi:PNP0C0F:\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:03/path', 0o644, b'\\_SB_.LNKD\n')
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:03/uevent', 0o644, b'''DRIVER=pci_link
+MODALIAS=acpi:PNP0C0F:
+''')
+d('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:03/power', 0o755)
+f('sys/devices/LNXSYSTM:00/device:00/PNP0C0F:03/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/ACPI0007:00', 0o755)
+l('sys/devices/LNXSYSTM:00/ACPI0007:00/thermal_cooling', '../../virtual/thermal/cooling_device0')
+l('sys/devices/LNXSYSTM:00/ACPI0007:00/subsystem', '../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/ACPI0007:00/sysdev', '../../system/cpu/cpu0')
+l('sys/devices/LNXSYSTM:00/ACPI0007:00/driver', '../../../bus/acpi/drivers/processor')
+f('sys/devices/LNXSYSTM:00/ACPI0007:00/hid', 0o644, b'ACPI0007\n')
+f('sys/devices/LNXSYSTM:00/ACPI0007:00/modalias', 0o644, b'acpi:ACPI0007:\n')
+f('sys/devices/LNXSYSTM:00/ACPI0007:00/path', 0o644, b'\\_PR_.CPU0\n')
+f('sys/devices/LNXSYSTM:00/ACPI0007:00/uevent', 0o644, b'''DRIVER=processor
+MODALIAS=acpi:ACPI0007:
+''')
+d('sys/devices/LNXSYSTM:00/ACPI0007:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/ACPI0007:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/LNXPWRBN:00', 0o755)
+l('sys/devices/LNXSYSTM:00/LNXPWRBN:00/subsystem', '../../../bus/acpi')
+l('sys/devices/LNXSYSTM:00/LNXPWRBN:00/driver', '../../../bus/acpi/drivers/button')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/hid', 0o644, b'LNXPWRBN\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/modalias', 0o644, b'acpi:LNXPWRBN:\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/uevent', 0o644, b'''DRIVER=button
+MODALIAS=acpi:LNXPWRBN:
+''')
+d('sys/devices/LNXSYSTM:00/LNXPWRBN:00/power', 0o755)
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input', 0o755)
+d('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3', 0o755)
+l('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/subsystem', '../../../../../class/input')
+l('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/device', '../../../LNXPWRBN:00')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/uniq', 0o644, b'\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/phys', 0o644, b'LNXPWRBN/button/input0\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/modalias', 0o644, b'input:b0019v0000p0002e0000-e0,1,k74,ramlsfw\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/name', 0o644, b'Power Button (FF)\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/uevent', 0o644, b'''PRODUCT=19/0/2/0
+NAME="Power Button (FF)"
+PHYS="LNXPWRBN/button/input0"
+EV==3
+KEY==10000000000000 0
+MODALIAS=input:b0019v0000p0002e0000-e0,1,k74,ramlsfw
+''')
+d('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/id', 0o755)
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/id/version', 0o644, b'0000\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/id/product', 0o644, b'0002\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/id/vendor', 0o644, b'0000\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/id/bustype', 0o644, b'0019\n')
+d('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/power', 0o755)
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/event3', 0o755)
+l('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/event3/subsystem', '../../../../../../class/input')
+l('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/event3/device', '../../input3')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/event3/dev', 0o644, b'13:67\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/event3/uevent', 0o644, b'''MAJOR=13
+MINOR=67
+''')
+d('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/event3/power', 0o755)
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/event3/power/wakeup', 0o644, b'\n')
+d('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/capabilities', 0o755)
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/capabilities/msc', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/capabilities/abs', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/capabilities/snd', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/capabilities/ff', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/capabilities/key', 0o644, b'10000000000000 0\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/capabilities/rel', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/capabilities/sw', 0o644, b'0\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/capabilities/ev', 0o644, b'3\n')
+f('sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3/capabilities/led', 0o644, b'0\n')
+d('sys/devices/platform', 0o755)
+f('sys/devices/platform/uevent', 0o644, b'')
+d('sys/devices/platform/pcspkr', 0o755)
+l('sys/devices/platform/pcspkr/subsystem', '../../../bus/platform')
+l('sys/devices/platform/pcspkr/driver', '../../../bus/platform/drivers/pcspkr')
+f('sys/devices/platform/pcspkr/modalias', 0o644, b'platform:pcspkr\n')
+f('sys/devices/platform/pcspkr/uevent', 0o644, b'''DRIVER=pcspkr
+MODALIAS=platform:pcspkr
+''')
+d('sys/devices/platform/pcspkr/power', 0o755)
+f('sys/devices/platform/pcspkr/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/pcspkr/input', 0o755)
+d('sys/devices/platform/pcspkr/input/input2', 0o755)
+l('sys/devices/platform/pcspkr/input/input2/subsystem', '../../../../../class/input')
+l('sys/devices/platform/pcspkr/input/input2/device', '../../../pcspkr')
+f('sys/devices/platform/pcspkr/input/input2/uniq', 0o644, b'\n')
+f('sys/devices/platform/pcspkr/input/input2/phys', 0o644, b'isa0061/input0\n')
+f('sys/devices/platform/pcspkr/input/input2/modalias', 0o644, b'input:b0010v001Fp0001e0100-e0,12,kramls1,2,fw\n')
+f('sys/devices/platform/pcspkr/input/input2/name', 0o644, b'PC Speaker\n')
+f('sys/devices/platform/pcspkr/input/input2/uevent', 0o644, b'''PRODUCT=10/1f/1/100
+NAME="PC Speaker"
+PHYS="isa0061/input0"
+EV==40001
+SND==6
+MODALIAS=input:b0010v001Fp0001e0100-e0,12,kramls1,2,fw
+''')
+d('sys/devices/platform/pcspkr/input/input2/event2', 0o755)
+l('sys/devices/platform/pcspkr/input/input2/event2/subsystem', '../../../../../../class/input')
+l('sys/devices/platform/pcspkr/input/input2/event2/device', '../../input2')
+f('sys/devices/platform/pcspkr/input/input2/event2/dev', 0o644, b'13:66\n')
+f('sys/devices/platform/pcspkr/input/input2/event2/uevent', 0o644, b'''MAJOR=13
+MINOR=66
+''')
+d('sys/devices/platform/pcspkr/input/input2/event2/power', 0o755)
+f('sys/devices/platform/pcspkr/input/input2/event2/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/pcspkr/input/input2/id', 0o755)
+f('sys/devices/platform/pcspkr/input/input2/id/version', 0o644, b'0100\n')
+f('sys/devices/platform/pcspkr/input/input2/id/product', 0o644, b'0001\n')
+f('sys/devices/platform/pcspkr/input/input2/id/vendor', 0o644, b'001f\n')
+f('sys/devices/platform/pcspkr/input/input2/id/bustype', 0o644, b'0010\n')
+d('sys/devices/platform/pcspkr/input/input2/power', 0o755)
+f('sys/devices/platform/pcspkr/input/input2/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/pcspkr/input/input2/capabilities', 0o755)
+f('sys/devices/platform/pcspkr/input/input2/capabilities/msc', 0o644, b'0\n')
+f('sys/devices/platform/pcspkr/input/input2/capabilities/abs', 0o644, b'0\n')
+f('sys/devices/platform/pcspkr/input/input2/capabilities/snd', 0o644, b'6\n')
+f('sys/devices/platform/pcspkr/input/input2/capabilities/ff', 0o644, b'0\n')
+f('sys/devices/platform/pcspkr/input/input2/capabilities/key', 0o644, b'0\n')
+f('sys/devices/platform/pcspkr/input/input2/capabilities/rel', 0o644, b'0\n')
+f('sys/devices/platform/pcspkr/input/input2/capabilities/sw', 0o644, b'0\n')
+f('sys/devices/platform/pcspkr/input/input2/capabilities/ev', 0o644, b'40001\n')
+f('sys/devices/platform/pcspkr/input/input2/capabilities/led', 0o644, b'0\n')
+d('sys/devices/platform/power', 0o755)
+f('sys/devices/platform/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/vesafb.0', 0o755)
+l('sys/devices/platform/vesafb.0/subsystem', '../../../bus/platform')
+l('sys/devices/platform/vesafb.0/driver', '../../../bus/platform/drivers/vesafb')
+f('sys/devices/platform/vesafb.0/modalias', 0o644, b'platform:vesafb\n')
+f('sys/devices/platform/vesafb.0/uevent', 0o644, b'''DRIVER=vesafb
+MODALIAS=platform:vesafb
+''')
+d('sys/devices/platform/vesafb.0/power', 0o755)
+f('sys/devices/platform/vesafb.0/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/vesafb.0/graphics', 0o755)
+d('sys/devices/platform/vesafb.0/graphics/fb0', 0o755)
+l('sys/devices/platform/vesafb.0/graphics/fb0/subsystem', '../../../../../class/graphics')
+l('sys/devices/platform/vesafb.0/graphics/fb0/device', '../../../vesafb.0')
+f('sys/devices/platform/vesafb.0/graphics/fb0/pan', 0o644, b'0,0\n')
+f('sys/devices/platform/vesafb.0/graphics/fb0/rotate', 0o644, b'0\n')
+f('sys/devices/platform/vesafb.0/graphics/fb0/mode', 0o644, b'')
+f('sys/devices/platform/vesafb.0/graphics/fb0/virtual_size', 0o644, b'800,600\n')
+f('sys/devices/platform/vesafb.0/graphics/fb0/dev', 0o644, b'29:0\n')
+f('sys/devices/platform/vesafb.0/graphics/fb0/state', 0o644, b'0\n')
+f('sys/devices/platform/vesafb.0/graphics/fb0/blank', 0o644, b'')
+f('sys/devices/platform/vesafb.0/graphics/fb0/bits_per_pixel', 0o644, b'16\n')
+f('sys/devices/platform/vesafb.0/graphics/fb0/stride', 0o644, b'1600\n')
+f('sys/devices/platform/vesafb.0/graphics/fb0/name', 0o644, b'VESA VGA\n')
+f('sys/devices/platform/vesafb.0/graphics/fb0/modes', 0o644, b'U:800x600p-75\n')
+f('sys/devices/platform/vesafb.0/graphics/fb0/cursor', 0o644, b'')
+f('sys/devices/platform/vesafb.0/graphics/fb0/uevent', 0o644, b'''MAJOR=29
+MINOR=0
+''')
+f('sys/devices/platform/vesafb.0/graphics/fb0/console', 0o644, b'')
+d('sys/devices/platform/vesafb.0/graphics/fb0/power', 0o755)
+f('sys/devices/platform/vesafb.0/graphics/fb0/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/dock.0', 0o755)
+l('sys/devices/platform/dock.0/subsystem', '../../../bus/platform')
+f('sys/devices/platform/dock.0/modalias', 0o644, b'platform:dock\n')
+f('sys/devices/platform/dock.0/uid', 0o644, b'0\n')
+f('sys/devices/platform/dock.0/flags', 0o644, b'0\n')
+f('sys/devices/platform/dock.0/docked', 0o644, b'0\n')
+f('sys/devices/platform/dock.0/uevent', 0o644, b'MODALIAS=platform:dock\n')
+d('sys/devices/platform/dock.0/power', 0o755)
+f('sys/devices/platform/dock.0/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/serial8250', 0o755)
+l('sys/devices/platform/serial8250/subsystem', '../../../bus/platform')
+l('sys/devices/platform/serial8250/driver', '../../../bus/platform/drivers/serial8250')
+f('sys/devices/platform/serial8250/modalias', 0o644, b'platform:serial8250\n')
+f('sys/devices/platform/serial8250/uevent', 0o644, b'''DRIVER=serial8250
+MODALIAS=platform:serial8250
+''')
+d('sys/devices/platform/serial8250/power', 0o755)
+f('sys/devices/platform/serial8250/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/serial8250/tty', 0o755)
+d('sys/devices/platform/serial8250/tty/ttyS1', 0o755)
+l('sys/devices/platform/serial8250/tty/ttyS1/subsystem', '../../../../../class/tty')
+l('sys/devices/platform/serial8250/tty/ttyS1/device', '../../../serial8250')
+f('sys/devices/platform/serial8250/tty/ttyS1/dev', 0o644, b'4:65\n')
+f('sys/devices/platform/serial8250/tty/ttyS1/uevent', 0o644, b'''MAJOR=4
+MINOR=65
+''')
+d('sys/devices/platform/serial8250/tty/ttyS1/power', 0o755)
+f('sys/devices/platform/serial8250/tty/ttyS1/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/platform/serial8250/tty/ttyS3', 0o755)
+l('sys/devices/platform/serial8250/tty/ttyS3/subsystem', '../../../../../class/tty')
+l('sys/devices/platform/serial8250/tty/ttyS3/device', '../../../serial8250')
+f('sys/devices/platform/serial8250/tty/ttyS3/dev', 0o644, b'4:67\n')
+f('sys/devices/platform/serial8250/tty/ttyS3/uevent', 0o644, b'''MAJOR=4
+MINOR=67
+''')
+d('sys/devices/platform/serial8250/tty/ttyS3/power', 0o755)
+f('sys/devices/platform/serial8250/tty/ttyS3/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/platform/serial8250/tty/ttyS0', 0o755)
+l('sys/devices/platform/serial8250/tty/ttyS0/subsystem', '../../../../../class/tty')
+l('sys/devices/platform/serial8250/tty/ttyS0/device', '../../../serial8250')
+f('sys/devices/platform/serial8250/tty/ttyS0/dev', 0o644, b'4:64\n')
+f('sys/devices/platform/serial8250/tty/ttyS0/uevent', 0o644, b'''MAJOR=4
+MINOR=64
+''')
+d('sys/devices/platform/serial8250/tty/ttyS0/power', 0o755)
+f('sys/devices/platform/serial8250/tty/ttyS0/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/platform/serial8250/tty/ttyS2', 0o755)
+l('sys/devices/platform/serial8250/tty/ttyS2/subsystem', '../../../../../class/tty')
+l('sys/devices/platform/serial8250/tty/ttyS2/device', '../../../serial8250')
+f('sys/devices/platform/serial8250/tty/ttyS2/dev', 0o644, b'4:66\n')
+f('sys/devices/platform/serial8250/tty/ttyS2/uevent', 0o644, b'''MAJOR=4
+MINOR=66
+''')
+d('sys/devices/platform/serial8250/tty/ttyS2/power', 0o755)
+f('sys/devices/platform/serial8250/tty/ttyS2/power/wakeup', 0o644, b'disabled\n')
+d('sys/devices/platform/thinkpad_acpi', 0o755)
+l('sys/devices/platform/thinkpad_acpi/subsystem', '../../../bus/platform')
+l('sys/devices/platform/thinkpad_acpi/driver', '../../../bus/platform/drivers/thinkpad_acpi')
+f('sys/devices/platform/thinkpad_acpi/modalias', 0o644, b'platform:thinkpad_acpi\n')
+f('sys/devices/platform/thinkpad_acpi/hotkey_all_mask', 0o644, b'0x00ffffff\n')
+f('sys/devices/platform/thinkpad_acpi/hotkey_poll_freq', 0o644, b'10\n')
+f('sys/devices/platform/thinkpad_acpi/hotkey_bios_enabled', 0o644, b'0\n')
+f('sys/devices/platform/thinkpad_acpi/hotkey_recommended_mask', 0o644, b'0x008c7fff\n')
+f('sys/devices/platform/thinkpad_acpi/hotkey_bios_mask', 0o644, b'0x0000080c\n')
+f('sys/devices/platform/thinkpad_acpi/hotkey_mask', 0o644, b'0x00ffffff\n')
+f('sys/devices/platform/thinkpad_acpi/wakeup_hotunplug_complete', 0o644, b'0\n')
+f('sys/devices/platform/thinkpad_acpi/hotkey_source_mask', 0o644, b'0x00000000\n')
+f('sys/devices/platform/thinkpad_acpi/hotkey_report_mode', 0o644, b'1\n')
+f('sys/devices/platform/thinkpad_acpi/hotkey_radio_sw', 0o644, b'1\n')
+f('sys/devices/platform/thinkpad_acpi/hotkey_enable', 0o644, b'1\n')
+f('sys/devices/platform/thinkpad_acpi/uevent', 0o644, b'''DRIVER=thinkpad_acpi
+MODALIAS=platform:thinkpad_acpi
+''')
+f('sys/devices/platform/thinkpad_acpi/bluetooth_enable', 0o644, b'1\n')
+f('sys/devices/platform/thinkpad_acpi/wakeup_reason', 0o644, b'0\n')
+d('sys/devices/platform/thinkpad_acpi/rfkill', 0o755)
+d('sys/devices/platform/thinkpad_acpi/rfkill/rfkill0', 0o755)
+l('sys/devices/platform/thinkpad_acpi/rfkill/rfkill0/subsystem', '../../../../../class/rfkill')
+l('sys/devices/platform/thinkpad_acpi/rfkill/rfkill0/device', '../../../thinkpad_acpi')
+f('sys/devices/platform/thinkpad_acpi/rfkill/rfkill0/type', 0o644, b'bluetooth\n')
+f('sys/devices/platform/thinkpad_acpi/rfkill/rfkill0/state', 0o644, b'1\n')
+f('sys/devices/platform/thinkpad_acpi/rfkill/rfkill0/name', 0o644, b'tpacpi_bluetooth_sw\n')
+f('sys/devices/platform/thinkpad_acpi/rfkill/rfkill0/uevent', 0o644, b'''RFKILL_NAME=tpacpi_bluetooth_sw
+RFKILL_TYPE=bluetooth
+RFKILL_STATE=1
+''')
+f('sys/devices/platform/thinkpad_acpi/rfkill/rfkill0/claim', 0o644, b'0\n')
+d('sys/devices/platform/thinkpad_acpi/rfkill/rfkill0/power', 0o755)
+f('sys/devices/platform/thinkpad_acpi/rfkill/rfkill0/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/thinkpad_acpi/power', 0o755)
+f('sys/devices/platform/thinkpad_acpi/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/thinkpad_acpi/leds', 0o755)
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi::bay_active', 0o755)
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi::bay_active/subsystem', '../../../../../class/leds')
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi::bay_active/device', '../../../thinkpad_acpi')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::bay_active/trigger', 0o644, b'[none] AC-online BAT0-charging-or-full BAT0-charging BAT0-full rfkill0 phy0rx phy0tx phy0assoc phy0radio \n')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::bay_active/brightness', 0o644, b'0\n\x00')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::bay_active/uevent', 0o644, b'')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi::bay_active/power', 0o755)
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::bay_active/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi:orange:batt', 0o755)
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi:orange:batt/subsystem', '../../../../../class/leds')
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi:orange:batt/device', '../../../thinkpad_acpi')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi:orange:batt/trigger', 0o644, b'[none] AC-online BAT0-charging-or-full BAT0-charging BAT0-full rfkill0 phy0rx phy0tx phy0assoc phy0radio \n')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi:orange:batt/brightness', 0o644, b'0\n\x00')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi:orange:batt/uevent', 0o644, b'')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi:orange:batt/power', 0o755)
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi:orange:batt/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_active', 0o755)
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_active/subsystem', '../../../../../class/leds')
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_active/device', '../../../thinkpad_acpi')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_active/trigger', 0o644, b'[none] AC-online BAT0-charging-or-full BAT0-charging BAT0-full rfkill0 phy0rx phy0tx phy0assoc phy0radio \n')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_active/brightness', 0o644, b'0\n\x00')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_active/uevent', 0o644, b'')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_active/power', 0o755)
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_active/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi::unknown_led', 0o755)
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi::unknown_led/subsystem', '../../../../../class/leds')
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi::unknown_led/device', '../../../thinkpad_acpi')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::unknown_led/trigger', 0o644, b'[none] AC-online BAT0-charging-or-full BAT0-charging BAT0-full rfkill0 phy0rx phy0tx phy0assoc phy0radio \n')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::unknown_led/brightness', 0o644, b'0\n\x00')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::unknown_led/uevent', 0o644, b'')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi::unknown_led/power', 0o755)
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::unknown_led/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi:green:batt', 0o755)
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi:green:batt/subsystem', '../../../../../class/leds')
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi:green:batt/device', '../../../thinkpad_acpi')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi:green:batt/trigger', 0o644, b'[none] AC-online BAT0-charging-or-full BAT0-charging BAT0-full rfkill0 phy0rx phy0tx phy0assoc phy0radio \n')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi:green:batt/brightness', 0o644, b'0\n\x00')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi:green:batt/uevent', 0o644, b'')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi:green:batt/power', 0o755)
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi:green:batt/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_batt', 0o755)
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_batt/subsystem', '../../../../../class/leds')
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_batt/device', '../../../thinkpad_acpi')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_batt/trigger', 0o644, b'[none] AC-online BAT0-charging-or-full BAT0-charging BAT0-full rfkill0 phy0rx phy0tx phy0assoc phy0radio \n')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_batt/brightness', 0o644, b'0\n\x00')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_batt/uevent', 0o644, b'')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_batt/power', 0o755)
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::dock_batt/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi::thinklight', 0o755)
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi::thinklight/subsystem', '../../../../../class/leds')
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi::thinklight/device', '../../../thinkpad_acpi')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::thinklight/trigger', 0o644, b'[none] AC-online BAT0-charging-or-full BAT0-charging BAT0-full rfkill0 phy0rx phy0tx phy0assoc phy0radio \n')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::thinklight/brightness', 0o644, b'255\n\x00')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::thinklight/uevent', 0o644, b'')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi::thinklight/power', 0o755)
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::thinklight/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi::power', 0o755)
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi::power/subsystem', '../../../../../class/leds')
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi::power/device', '../../../thinkpad_acpi')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::power/trigger', 0o644, b'[none] AC-online BAT0-charging-or-full BAT0-charging BAT0-full rfkill0 phy0rx phy0tx phy0assoc phy0radio \n')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::power/brightness', 0o644, b'0\n\x00')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::power/uevent', 0o644, b'')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi::power/power', 0o755)
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::power/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi::standby', 0o755)
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi::standby/subsystem', '../../../../../class/leds')
+l('sys/devices/platform/thinkpad_acpi/leds/tpacpi::standby/device', '../../../thinkpad_acpi')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::standby/trigger', 0o644, b'[none] AC-online BAT0-charging-or-full BAT0-charging BAT0-full rfkill0 phy0rx phy0tx phy0assoc phy0radio \n')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::standby/brightness', 0o644, b'0\n\x00')
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::standby/uevent', 0o644, b'')
+d('sys/devices/platform/thinkpad_acpi/leds/tpacpi::standby/power', 0o755)
+f('sys/devices/platform/thinkpad_acpi/leds/tpacpi::standby/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/thinkpad_hwmon', 0o755)
+l('sys/devices/platform/thinkpad_hwmon/subsystem', '../../../bus/platform')
+l('sys/devices/platform/thinkpad_hwmon/driver', '../../../bus/platform/drivers/thinkpad_hwmon')
+f('sys/devices/platform/thinkpad_hwmon/fan1_input', 0o644, b'3446\n')
+f('sys/devices/platform/thinkpad_hwmon/temp4_input', 0o644, b'63000\n')
+f('sys/devices/platform/thinkpad_hwmon/pwm1', 0o644, b'255\n')
+f('sys/devices/platform/thinkpad_hwmon/temp11_input', 0o644, b'43000\n')
+f('sys/devices/platform/thinkpad_hwmon/modalias', 0o644, b'platform:thinkpad_hwmon\n')
+f('sys/devices/platform/thinkpad_hwmon/temp15_input', 0o644, b'')
+f('sys/devices/platform/thinkpad_hwmon/temp2_input', 0o644, b'41000\n')
+f('sys/devices/platform/thinkpad_hwmon/temp1_input', 0o644, b'46000\n')
+f('sys/devices/platform/thinkpad_hwmon/temp5_input', 0o644, b'35000\n')
+f('sys/devices/platform/thinkpad_hwmon/temp13_input', 0o644, b'')
+f('sys/devices/platform/thinkpad_hwmon/temp6_input', 0o644, b'')
+f('sys/devices/platform/thinkpad_hwmon/temp8_input', 0o644, b'')
+f('sys/devices/platform/thinkpad_hwmon/pwm1_enable', 0o644, b'2\n')
+f('sys/devices/platform/thinkpad_hwmon/temp10_input', 0o644, b'49000\n')
+f('sys/devices/platform/thinkpad_hwmon/temp3_input', 0o644, b'33000\n')
+f('sys/devices/platform/thinkpad_hwmon/temp9_input', 0o644, b'35000\n')
+f('sys/devices/platform/thinkpad_hwmon/name', 0o644, b'thinkpad\n')
+f('sys/devices/platform/thinkpad_hwmon/temp12_input', 0o644, b'')
+f('sys/devices/platform/thinkpad_hwmon/uevent', 0o644, b'''DRIVER=thinkpad_hwmon
+MODALIAS=platform:thinkpad_hwmon
+''')
+f('sys/devices/platform/thinkpad_hwmon/temp7_input', 0o644, b'33000\n')
+f('sys/devices/platform/thinkpad_hwmon/temp16_input', 0o644, b'')
+f('sys/devices/platform/thinkpad_hwmon/temp14_input', 0o644, b'')
+d('sys/devices/platform/thinkpad_hwmon/hwmon', 0o755)
+d('sys/devices/platform/thinkpad_hwmon/hwmon/hwmon0', 0o755)
+l('sys/devices/platform/thinkpad_hwmon/hwmon/hwmon0/subsystem', '../../../../../class/hwmon')
+l('sys/devices/platform/thinkpad_hwmon/hwmon/hwmon0/device', '../../../thinkpad_hwmon')
+f('sys/devices/platform/thinkpad_hwmon/hwmon/hwmon0/uevent', 0o644, b'')
+d('sys/devices/platform/thinkpad_hwmon/hwmon/hwmon0/power', 0o755)
+f('sys/devices/platform/thinkpad_hwmon/hwmon/hwmon0/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/thinkpad_hwmon/power', 0o755)
+f('sys/devices/platform/thinkpad_hwmon/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/microcode', 0o755)
+l('sys/devices/platform/microcode/subsystem', '../../../bus/platform')
+f('sys/devices/platform/microcode/modalias', 0o644, b'platform:microcode\n')
+f('sys/devices/platform/microcode/uevent', 0o644, b'MODALIAS=platform:microcode\n')
+d('sys/devices/platform/microcode/power', 0o755)
+f('sys/devices/platform/microcode/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/i8042', 0o755)
+l('sys/devices/platform/i8042/subsystem', '../../../bus/platform')
+l('sys/devices/platform/i8042/driver', '../../../bus/platform/drivers/i8042')
+f('sys/devices/platform/i8042/modalias', 0o644, b'platform:i8042\n')
+f('sys/devices/platform/i8042/uevent', 0o644, b'''DRIVER=i8042
+MODALIAS=platform:i8042
+''')
+d('sys/devices/platform/i8042/power', 0o755)
+f('sys/devices/platform/i8042/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/i8042/serio0', 0o755)
+l('sys/devices/platform/i8042/serio0/subsystem', '../../../../bus/serio')
+l('sys/devices/platform/i8042/serio0/driver', '../../../../bus/serio/drivers/atkbd')
+f('sys/devices/platform/i8042/serio0/modalias', 0o644, b'serio:ty06pr00id00ex00\n')
+f('sys/devices/platform/i8042/serio0/set', 0o644, b'2\n')
+f('sys/devices/platform/i8042/serio0/bind_mode', 0o644, b'auto\n')
+f('sys/devices/platform/i8042/serio0/description', 0o644, b'i8042 KBD port\n')
+f('sys/devices/platform/i8042/serio0/softrepeat', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio0/scroll', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio0/softraw', 0o644, b'1\n')
+f('sys/devices/platform/i8042/serio0/err_count', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio0/extra', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio0/uevent', 0o644, b'''DRIVER=atkbd
+SERIO_TYPE=06
+SERIO_PROTO=00
+SERIO_ID=00
+SERIO_EXTRA=00
+MODALIAS=serio:ty06pr00id00ex00
+''')
+d('sys/devices/platform/i8042/serio0/id', 0o755)
+f('sys/devices/platform/i8042/serio0/id/proto', 0o644, b'00\n')
+f('sys/devices/platform/i8042/serio0/id/id', 0o644, b'00\n')
+f('sys/devices/platform/i8042/serio0/id/type', 0o644, b'06\n')
+f('sys/devices/platform/i8042/serio0/id/extra', 0o644, b'00\n')
+d('sys/devices/platform/i8042/serio0/power', 0o755)
+f('sys/devices/platform/i8042/serio0/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/i8042/serio0/input', 0o755)
+d('sys/devices/platform/i8042/serio0/input/input0', 0o755)
+l('sys/devices/platform/i8042/serio0/input/input0/subsystem', '../../../../../../class/input')
+l('sys/devices/platform/i8042/serio0/input/input0/device', '../../../serio0')
+f('sys/devices/platform/i8042/serio0/input/input0/uniq', 0o644, b'\n')
+f('sys/devices/platform/i8042/serio0/input/input0/phys', 0o644, b'isa0060/serio0/input0\n')
+f('sys/devices/platform/i8042/serio0/input/input0/modalias', 0o644, b'input:b0011v0001p0001eAB54-e0,1,4,11,14,k71,72,73,74,75,76,77,79,7A,7B,7C,7D,7E,7F,80,8C,8E,8F,9B,9C,9D,9E,9F,A3,A4,A5,A6,AC,AD,B7,B8,B9,D9,E2,ram4,l0,1,2,sfw\n')
+f('sys/devices/platform/i8042/serio0/input/input0/name', 0o644, b'AT Translated Set 2 keyboard\n')
+f('sys/devices/platform/i8042/serio0/input/input0/uevent', 0o644, b'''PRODUCT=11/1/1/ab54
+NAME="AT Translated Set 2 keyboard"
+PHYS="isa0060/serio0/input0"
+EV==120013
+KEY==402000000 3803078f800d001 feffffdfffefffff fffffffffffffffe
+MSC==10
+LED==7
+MODALIAS=input:b0011v0001p0001eAB54-e0,1,4,11,14,k71,72,73,74,75,76,77,79,7A,7B,7C,7D,7E,7F,80,8C,8E,8F,9B,9C,9D,9E,9F,A3,A4,A5,A6,AC,AD,B7,B8,B9,D9,E2,ram4,l0,1,2,sfw
+''')
+d('sys/devices/platform/i8042/serio0/input/input0/event0', 0o755)
+l('sys/devices/platform/i8042/serio0/input/input0/event0/subsystem', '../../../../../../../class/input')
+l('sys/devices/platform/i8042/serio0/input/input0/event0/device', '../../input0')
+f('sys/devices/platform/i8042/serio0/input/input0/event0/dev', 0o644, b'13:64\n')
+f('sys/devices/platform/i8042/serio0/input/input0/event0/uevent', 0o644, b'''MAJOR=13
+MINOR=64
+''')
+d('sys/devices/platform/i8042/serio0/input/input0/event0/power', 0o755)
+f('sys/devices/platform/i8042/serio0/input/input0/event0/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/i8042/serio0/input/input0/id', 0o755)
+f('sys/devices/platform/i8042/serio0/input/input0/id/version', 0o644, b'ab54\n')
+f('sys/devices/platform/i8042/serio0/input/input0/id/product', 0o644, b'0001\n')
+f('sys/devices/platform/i8042/serio0/input/input0/id/vendor', 0o644, b'0001\n')
+f('sys/devices/platform/i8042/serio0/input/input0/id/bustype', 0o644, b'0011\n')
+d('sys/devices/platform/i8042/serio0/input/input0/power', 0o755)
+f('sys/devices/platform/i8042/serio0/input/input0/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/i8042/serio0/input/input0/capabilities', 0o755)
+f('sys/devices/platform/i8042/serio0/input/input0/capabilities/msc', 0o644, b'10\n')
+f('sys/devices/platform/i8042/serio0/input/input0/capabilities/abs', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio0/input/input0/capabilities/snd', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio0/input/input0/capabilities/ff', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio0/input/input0/capabilities/key', 0o644, b'402000000 3803078f800d001 feffffdfffefffff fffffffffffffffe\n')
+f('sys/devices/platform/i8042/serio0/input/input0/capabilities/rel', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio0/input/input0/capabilities/sw', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio0/input/input0/capabilities/ev', 0o644, b'120013\n')
+f('sys/devices/platform/i8042/serio0/input/input0/capabilities/led', 0o644, b'7\n')
+d('sys/devices/platform/i8042/serio1', 0o755)
+l('sys/devices/platform/i8042/serio1/subsystem', '../../../../bus/serio')
+l('sys/devices/platform/i8042/serio1/driver', '../../../../bus/serio/drivers/psmouse')
+f('sys/devices/platform/i8042/serio1/upthresh', 0o644, b'255\n')
+f('sys/devices/platform/i8042/serio1/modalias', 0o644, b'serio:ty01pr00id00ex00\n')
+f('sys/devices/platform/i8042/serio1/resync_time', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio1/skipback', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio1/draghys', 0o644, b'255\n')
+f('sys/devices/platform/i8042/serio1/ext_dev', 0o644, b'1\n')
+f('sys/devices/platform/i8042/serio1/bind_mode', 0o644, b'auto\n')
+f('sys/devices/platform/i8042/serio1/resolution', 0o644, b'200\n')
+f('sys/devices/platform/i8042/serio1/resetafter', 0o644, b'5\n')
+f('sys/devices/platform/i8042/serio1/sensitivity', 0o644, b'128\n')
+f('sys/devices/platform/i8042/serio1/rate', 0o644, b'100\n')
+f('sys/devices/platform/i8042/serio1/inertia', 0o644, b'6\n')
+f('sys/devices/platform/i8042/serio1/mindrag', 0o644, b'20\n')
+f('sys/devices/platform/i8042/serio1/reach', 0o644, b'10\n')
+f('sys/devices/platform/i8042/serio1/description', 0o644, b'i8042 AUX port\n')
+f('sys/devices/platform/i8042/serio1/press_to_select', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio1/ztime', 0o644, b'38\n')
+f('sys/devices/platform/i8042/serio1/speed', 0o644, b'97\n')
+f('sys/devices/platform/i8042/serio1/thresh', 0o644, b'8\n')
+f('sys/devices/platform/i8042/serio1/jenks', 0o644, b'135\n')
+f('sys/devices/platform/i8042/serio1/uevent', 0o644, b'''DRIVER=psmouse
+SERIO_TYPE=01
+SERIO_PROTO=00
+SERIO_ID=00
+SERIO_EXTRA=00
+MODALIAS=serio:ty01pr00id00ex00
+''')
+f('sys/devices/platform/i8042/serio1/protocol', 0o644, b'TPPS/2\n')
+d('sys/devices/platform/i8042/serio1/id', 0o755)
+f('sys/devices/platform/i8042/serio1/id/proto', 0o644, b'00\n')
+f('sys/devices/platform/i8042/serio1/id/id', 0o644, b'00\n')
+f('sys/devices/platform/i8042/serio1/id/type', 0o644, b'01\n')
+f('sys/devices/platform/i8042/serio1/id/extra', 0o644, b'00\n')
+d('sys/devices/platform/i8042/serio1/power', 0o755)
+f('sys/devices/platform/i8042/serio1/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/i8042/serio1/input', 0o755)
+d('sys/devices/platform/i8042/serio1/input/input1', 0o755)
+l('sys/devices/platform/i8042/serio1/input/input1/subsystem', '../../../../../../class/input')
+l('sys/devices/platform/i8042/serio1/input/input1/device', '../../../serio1')
+f('sys/devices/platform/i8042/serio1/input/input1/uniq', 0o644, b'\n')
+f('sys/devices/platform/i8042/serio1/input/input1/phys', 0o644, b'isa0060/serio1/input0\n')
+f('sys/devices/platform/i8042/serio1/input/input1/modalias', 0o644, b'input:b0011v0002p000Ae0000-e0,1,2,k110,111,112,r0,1,amlsfw\n')
+f('sys/devices/platform/i8042/serio1/input/input1/name', 0o644, b'TPPS/2 IBM TrackPoint\n')
+f('sys/devices/platform/i8042/serio1/input/input1/uevent', 0o644, b'''PRODUCT=11/2/a/0
+NAME="TPPS/2 IBM TrackPoint"
+PHYS="isa0060/serio1/input0"
+EV==7
+KEY==70000 0 0 0 0
+REL==3
+MODALIAS=input:b0011v0002p000Ae0000-e0,1,2,k110,111,112,r0,1,amlsfw
+''')
+d('sys/devices/platform/i8042/serio1/input/input1/mouse0', 0o755)
+l('sys/devices/platform/i8042/serio1/input/input1/mouse0/subsystem', '../../../../../../../class/input')
+l('sys/devices/platform/i8042/serio1/input/input1/mouse0/device', '../../input1')
+f('sys/devices/platform/i8042/serio1/input/input1/mouse0/dev', 0o644, b'13:32\n')
+f('sys/devices/platform/i8042/serio1/input/input1/mouse0/uevent', 0o644, b'''MAJOR=13
+MINOR=32
+''')
+d('sys/devices/platform/i8042/serio1/input/input1/mouse0/power', 0o755)
+f('sys/devices/platform/i8042/serio1/input/input1/mouse0/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/i8042/serio1/input/input1/id', 0o755)
+f('sys/devices/platform/i8042/serio1/input/input1/id/version', 0o644, b'0000\n')
+f('sys/devices/platform/i8042/serio1/input/input1/id/product', 0o644, b'000a\n')
+f('sys/devices/platform/i8042/serio1/input/input1/id/vendor', 0o644, b'0002\n')
+f('sys/devices/platform/i8042/serio1/input/input1/id/bustype', 0o644, b'0011\n')
+d('sys/devices/platform/i8042/serio1/input/input1/power', 0o755)
+f('sys/devices/platform/i8042/serio1/input/input1/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/i8042/serio1/input/input1/event1', 0o755)
+l('sys/devices/platform/i8042/serio1/input/input1/event1/subsystem', '../../../../../../../class/input')
+l('sys/devices/platform/i8042/serio1/input/input1/event1/device', '../../input1')
+f('sys/devices/platform/i8042/serio1/input/input1/event1/dev', 0o644, b'13:65\n')
+f('sys/devices/platform/i8042/serio1/input/input1/event1/uevent', 0o644, b'''MAJOR=13
+MINOR=65
+''')
+d('sys/devices/platform/i8042/serio1/input/input1/event1/power', 0o755)
+f('sys/devices/platform/i8042/serio1/input/input1/event1/power/wakeup', 0o644, b'\n')
+d('sys/devices/platform/i8042/serio1/input/input1/capabilities', 0o755)
+f('sys/devices/platform/i8042/serio1/input/input1/capabilities/msc', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio1/input/input1/capabilities/abs', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio1/input/input1/capabilities/snd', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio1/input/input1/capabilities/ff', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio1/input/input1/capabilities/key', 0o644, b'70000 0 0 0 0\n')
+f('sys/devices/platform/i8042/serio1/input/input1/capabilities/rel', 0o644, b'3\n')
+f('sys/devices/platform/i8042/serio1/input/input1/capabilities/sw', 0o644, b'0\n')
+f('sys/devices/platform/i8042/serio1/input/input1/capabilities/ev', 0o644, b'7\n')
+f('sys/devices/platform/i8042/serio1/input/input1/capabilities/led', 0o644, b'0\n')
diff --git a/test/sys.tar.xz b/test/sys.tar.xz
deleted file mode 100644 (file)
index 49ee802..0000000
Binary files a/test/sys.tar.xz and /dev/null differ
index 838dd57..d116fff 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python3
 #
 # systemd-sysv-generator integration test
 #
@@ -308,7 +308,7 @@ class SysvGeneratorTest(unittest.TestCase):
         err, results = self.run_generator()
         self.assertEqual(list(results), ['foo.service'])
         self.assertEqual(os.readlink(os.path.join(self.out_dir, 'foo\\x2b.service')),
-                'foo.service')
+                         'foo.service')
         self.assertNotIn('Overwriting', err)
 
     def test_same_provides_in_multiple_scripts(self):
index cd4699d..0216c83 100755 (executable)
@@ -1,30 +1,38 @@
 #!/bin/bash -e
 
+out="$1"
+systemd_efi="$2"
+boot_stub="$3"
+splash_bmp="$4"
+if [ -z "$out" -o -z "$systemd_efi" -o -z "$boot_stub" -o -z "$splash_bmp" ]; then
+        exit 1
+fi
+
 # create GPT table with EFI System Partition
-rm -f test-efi-disk.img
-dd if=/dev/null of=test-efi-disk.img bs=1M seek=512 count=1
-parted --script test-efi-disk.img "mklabel gpt" "mkpart ESP fat32 1MiB 511MiB" "set 1 boot on"
+rm -f "$out"
+dd if=/dev/null of="$out" bs=1M seek=512 count=1 status=none
+parted --script "$out" "mklabel gpt" "mkpart ESP fat32 1MiB 511MiB" "set 1 boot on"
 
 # create FAT32 file system
-LOOP=$(losetup --show -f -P test-efi-disk.img)
+LOOP=$(losetup --show -f -P "$out")
 mkfs.vfat -F32 ${LOOP}p1
 mkdir -p mnt
 mount ${LOOP}p1 mnt
 
 mkdir -p mnt/EFI/{BOOT,systemd}
-cp systemd-bootx64.efi mnt/EFI/BOOT/BOOTX64.efi
+cp "$systemd_efi" mnt/EFI/BOOT/BOOTX64.efi
 
 [ -e /boot/shellx64.efi ] && cp /boot/shellx64.efi mnt/
 
 mkdir mnt/EFI/Linux
-echo -n "foo=yes bar=no root=/dev/fakeroot debug rd.break=initqueue" > mnt/cmdline.txt
+echo -n "foo=yes bar=no root=/dev/fakeroot debug rd.break=initqueue" >mnt/cmdline.txt
 objcopy \
-  --add-section .osrel=/etc/os-release --change-section-vma .osrel=0x20000 \
-  --add-section .cmdline=mnt/cmdline.txt --change-section-vma .cmdline=0x30000 \
-  --add-section .splash=test/splash.bmp --change-section-vma .splash=0x40000 \
-  --add-section .linux=/boot/$(cat /etc/machine-id)/$(uname -r)/linux --change-section-vma .linux=0x2000000 \
-  --add-section .initrd=/boot/$(cat /etc/machine-id)/$(uname -r)/initrd --change-section-vma .initrd=0x3000000 \
-  linuxx64.efi.stub mnt/EFI/Linux/linux-test.efi
+        --add-section .osrel=/etc/os-release --change-section-vma .osrel=0x20000 \
+        --add-section .cmdline=mnt/cmdline.txt --change-section-vma .cmdline=0x30000 \
+        --add-section .splash="$splash_bmp" --change-section-vma .splash=0x40000 \
+        --add-section .linux=/boot/$(cat /etc/machine-id)/$(uname -r)/linux --change-section-vma .linux=0x2000000 \
+        --add-section .initrd=/boot/$(cat /etc/machine-id)/$(uname -r)/initrd --change-section-vma .initrd=0x3000000 \
+        "$boot_stub" mnt/EFI/Linux/linux-test.efi
 
 # install entries
 mkdir -p mnt/loader/entries
diff --git a/test/test-exec-deserialization.py b/test/test-exec-deserialization.py
new file mode 100755 (executable)
index 0000000..39a9e62
--- /dev/null
@@ -0,0 +1,192 @@
+#!/usr/bin/env python3
+
+#
+#  Copyright 2017 Michal Sekletar <msekleta@redhat.com>
+#
+#  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/>.
+
+# ATTENTION: This uses the *installed* systemd, not the one from the built
+# source tree.
+
+import unittest
+import time
+import os
+import tempfile
+import subprocess
+
+from enum import Enum
+
+class UnitFileChange(Enum):
+    NO_CHANGE = 0
+    LINES_SWAPPED = 1
+    COMMAND_ADDED_BEFORE = 2
+    COMMAND_ADDED_AFTER = 3
+    COMMAND_INTERLEAVED = 4
+    REMOVAL = 5
+
+class ExecutionResumeTest(unittest.TestCase):
+    def setUp(self):
+        self.unit = 'test-issue-518.service'
+        self.unitfile_path = '/run/systemd/system/{0}'.format(self.unit)
+        self.output_file = tempfile.mktemp()
+        self.unit_files = {}
+
+        unit_file_content = '''
+        [Service]
+        Type=oneshot
+        ExecStart=/bin/sleep 2
+        ExecStart=/bin/bash -c "echo foo >> {0}"
+        '''.format(self.output_file)
+        self.unit_files[UnitFileChange.NO_CHANGE] = unit_file_content
+
+        unit_file_content = '''
+        [Service]
+        Type=oneshot
+        ExecStart=/bin/bash -c "echo foo >> {0}"
+        ExecStart=/bin/sleep 2
+        '''.format(self.output_file)
+        self.unit_files[UnitFileChange.LINES_SWAPPED] = unit_file_content
+
+        unit_file_content = '''
+        [Service]
+        Type=oneshot
+        ExecStart=/bin/bash -c "echo bar >> {0}"
+        ExecStart=/bin/sleep 2
+        ExecStart=/bin/bash -c "echo foo >> {0}"
+        '''.format(self.output_file)
+        self.unit_files[UnitFileChange.COMMAND_ADDED_BEFORE] = unit_file_content
+
+        unit_file_content = '''
+        [Service]
+        Type=oneshot
+        ExecStart=/bin/sleep 2
+        ExecStart=/bin/bash -c "echo foo >> {0}"
+        ExecStart=/bin/bash -c "echo bar >> {0}"
+        '''.format(self.output_file)
+        self.unit_files[UnitFileChange.COMMAND_ADDED_AFTER] = unit_file_content
+
+        unit_file_content = '''
+        [Service]
+        Type=oneshot
+        ExecStart=/bin/bash -c "echo baz >> {0}"
+        ExecStart=/bin/sleep 2
+        ExecStart=/bin/bash -c "echo foo >> {0}"
+        ExecStart=/bin/bash -c "echo bar >> {0}"
+        '''.format(self.output_file)
+        self.unit_files[UnitFileChange.COMMAND_INTERLEAVED] = unit_file_content
+
+        unit_file_content = '''
+        [Service]
+        Type=oneshot
+        ExecStart=/bin/bash -c "echo bar >> {0}"
+        ExecStart=/bin/bash -c "echo baz >> {0}"
+        '''.format(self.output_file)
+        self.unit_files[UnitFileChange.REMOVAL] = unit_file_content
+
+    def reload(self):
+        subprocess.check_call(['systemctl', 'daemon-reload'])
+
+    def write_unit_file(self, unit_file_change):
+        if not isinstance(unit_file_change, UnitFileChange):
+            raise ValueError('Unknown unit file change')
+
+        content = self.unit_files[unit_file_change]
+
+        with open(self.unitfile_path, 'w') as f:
+            f.write(content)
+
+        self.reload()
+
+    def check_output(self, expected_output):
+        try:
+            with open(self.output_file, 'r') as log:
+                output = log.read()
+        except IOError:
+            self.fail()
+
+        self.assertEqual(output, expected_output)
+
+    def setup_unit(self):
+        self.write_unit_file(UnitFileChange.NO_CHANGE)
+        subprocess.check_call(['systemctl', '--job-mode=replace', '--no-block', 'start', self.unit])
+
+    def test_no_change(self):
+        expected_output = 'foo\n'
+
+        self.setup_unit()
+        self.reload()
+        time.sleep(4)
+
+        self.check_output(expected_output)
+
+    def test_swapped(self):
+        expected_output = ''
+
+        self.setup_unit()
+        self.write_unit_file(UnitFileChange.LINES_SWAPPED)
+        self.reload()
+        time.sleep(4)
+
+        self.assertTrue(not os.path.exists(self.output_file))
+
+    def test_added_before(self):
+        expected_output = 'foo\n'
+
+        self.setup_unit()
+        self.write_unit_file(UnitFileChange.COMMAND_ADDED_BEFORE)
+        self.reload()
+        time.sleep(4)
+
+        self.check_output(expected_output)
+
+    def test_added_after(self):
+        expected_output = 'foo\nbar\n'
+
+        self.setup_unit()
+        self.write_unit_file(UnitFileChange.COMMAND_ADDED_AFTER)
+        self.reload()
+        time.sleep(4)
+
+        self.check_output(expected_output)
+
+    def test_interleaved(self):
+        expected_output = 'foo\nbar\n'
+
+        self.setup_unit()
+        self.write_unit_file(UnitFileChange.COMMAND_INTERLEAVED)
+        self.reload()
+        time.sleep(4)
+
+        self.check_output(expected_output)
+
+    def test_removal(self):
+        self.setup_unit()
+        self.write_unit_file(UnitFileChange.REMOVAL)
+        self.reload()
+        time.sleep(4)
+
+        self.assertTrue(not os.path.exists(self.output_file))
+
+    def tearDown(self):
+        for f in [self.output_file, self.unitfile_path]:
+            try:
+                os.remove(f)
+            except OSError:
+                # ignore error if log file doesn't exist
+                pass
+
+        self.reload()
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/test/test-execute/exec-dynamicuser-fixeduser-one-supplementarygroup.service b/test/test-execute/exec-dynamicuser-fixeduser-one-supplementarygroup.service
new file mode 100644 (file)
index 0000000..de1a6e7
--- /dev/null
@@ -0,0 +1,9 @@
+[Unit]
+Description=Test DynamicUser with User= and SupplementaryGroups=
+
+[Service]
+ExecStart=/bin/sh -x -c 'test "$$(id -G)" = "1" && test "$$(id -g)" = "1" && test "$$(id -u)" = "1"'
+Type=oneshot
+User=1
+DynamicUser=yes
+SupplementaryGroups=1
diff --git a/test/test-execute/exec-dynamicuser-fixeduser.service b/test/test-execute/exec-dynamicuser-fixeduser.service
new file mode 100644 (file)
index 0000000..1d84af0
--- /dev/null
@@ -0,0 +1,8 @@
+[Unit]
+Description=Test DynamicUser with User=
+
+[Service]
+ExecStart=/bin/sh -x -c 'test "$$(id -G)" = "1" && test "$$(id -g)" = "1" && test "$$(id -u)" = "1"'
+Type=oneshot
+User=1
+DynamicUser=yes
diff --git a/test/test-execute/exec-dynamicuser-supplementarygroups.service b/test/test-execute/exec-dynamicuser-supplementarygroups.service
new file mode 100644 (file)
index 0000000..a47b7fa
--- /dev/null
@@ -0,0 +1,8 @@
+[Unit]
+Description=Test DynamicUser with SupplementaryGroups=
+
+[Service]
+ExecStart=/bin/sh -x -c 'test "$$(id -G | cut -d " " --complement -f 1)" = "1 2 3"'
+Type=oneshot
+DynamicUser=yes
+SupplementaryGroups=1 2 3
diff --git a/test/test-execute/exec-inaccessiblepaths-mount-propagation.service b/test/test-execute/exec-inaccessiblepaths-mount-propagation.service
new file mode 100644 (file)
index 0000000..430a6b7
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test to make sure that InaccessiblePaths= disconnect mount propagation
+
+[Service]
+InaccessiblePaths=-/i-dont-exist
+ExecStart=/bin/sh -x -c 'd=$$(mktemp -d -p /tmp); trap "umount \'$$d\' && rmdir \'$$d\'" EXIT; mount -t tmpfs tmpfs "$$d"; grep "$$d" /proc/self/mountinfo && ! grep "$$d" /proc/$${PPID}/mountinfo && ! grep "$$d" /proc/1/mountinfo'
+Type=oneshot
diff --git a/test/test-execute/exec-inaccessiblepaths-proc.service b/test/test-execute/exec-inaccessiblepaths-proc.service
new file mode 100644 (file)
index 0000000..ebdb484
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test to make sure that mount namespace setup works properly with the 'InaccessiblePaths=/proc' option
+
+[Service]
+InaccessiblePaths=/proc
+ExecStart=/bin/sh -x -c 'test "$$(stat -c %%a /proc)" = "0"'
+Type=oneshot
diff --git a/test/test-execute/exec-personality-aarch64.service b/test/test-execute/exec-personality-aarch64.service
new file mode 100644 (file)
index 0000000..40b6d95
--- /dev/null
@@ -0,0 +1,7 @@
+Unit]
+Description=Test for Personality=aarch64
+
+[Service]
+ExecStart=/bin/sh -c 'echo $(uname -m); exit $(test $(uname -m) = "aarch64")'
+Type=oneshot
+Personality=aarch64
diff --git a/test/test-execute/exec-personality-ppc64.service b/test/test-execute/exec-personality-ppc64.service
new file mode 100644 (file)
index 0000000..ccc2c8d
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test for Personality=ppc64
+
+[Service]
+ExecStart=/bin/sh -c 'echo $(uname -m); exit $(test $(uname -m) = "ppc64")'
+Type=oneshot
+Personality=ppc64
diff --git a/test/test-execute/exec-personality-ppc64le.service b/test/test-execute/exec-personality-ppc64le.service
new file mode 100644 (file)
index 0000000..2a76250
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test for Personality=ppc64le
+
+[Service]
+ExecStart=/bin/sh -c 'echo $(uname -m); exit $(test $(uname -m) = "ppc64le")'
+Type=oneshot
+Personality=ppc64le
diff --git a/test/test-execute/exec-privatedevices-no-capability-mknod.service b/test/test-execute/exec-privatedevices-no-capability-mknod.service
new file mode 100644 (file)
index 0000000..6d39469
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test CAP_MKNOD capability for PrivateDevices=no
+
+[Service]
+PrivateDevices=no
+ExecStart=/bin/sh -x -c 'capsh --print | grep cap_mknod'
+Type=oneshot
diff --git a/test/test-execute/exec-privatedevices-no-capability-sys-rawio.service b/test/test-execute/exec-privatedevices-no-capability-sys-rawio.service
new file mode 100644 (file)
index 0000000..e7f529c
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test CAP_SYS_RAWIO capability for PrivateDevices=no
+
+[Service]
+PrivateDevices=no
+ExecStart=/bin/sh -x -c 'capsh --print | grep cap_sys_rawio'
+Type=oneshot
index 77aeb95..0285a83 100644 (file)
@@ -2,6 +2,6 @@
 Description=Test for PrivateDev=no
 
 [Service]
-ExecStart=/bin/sh -x -c 'test -c /dev/mem'
+ExecStart=/bin/sh -x -c 'test -c /dev/kmsg'
 Type=oneshot
 PrivateDevices=no
diff --git a/test/test-execute/exec-privatedevices-yes-capability-mknod.service b/test/test-execute/exec-privatedevices-yes-capability-mknod.service
new file mode 100644 (file)
index 0000000..fb1fc28
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test CAP_MKNOD capability for PrivateDevices=yes
+
+[Service]
+PrivateDevices=yes
+ExecStart=/bin/sh -x -c '! capsh --print | grep cap_mknod'
+Type=oneshot
diff --git a/test/test-execute/exec-privatedevices-yes-capability-sys-rawio.service b/test/test-execute/exec-privatedevices-yes-capability-sys-rawio.service
new file mode 100644 (file)
index 0000000..cebc493
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test CAP_SYS_RAWIO capability for PrivateDevices=yes
+
+[Service]
+PrivateDevices=yes
+ExecStart=/bin/sh -x -c '! capsh --print | grep cap_sys_rawio'
+Type=oneshot
index ab958b6..094257f 100644 (file)
@@ -2,6 +2,6 @@
 Description=Test for PrivateDev=yes
 
 [Service]
-ExecStart=/bin/sh -c 'test ! -c /dev/mem'
+ExecStart=/bin/sh -c 'test ! -c /dev/kmsg'
 Type=oneshot
 PrivateDevices=yes
diff --git a/test/test-execute/exec-protectkernelmodules-no-capabilities.service b/test/test-execute/exec-protectkernelmodules-no-capabilities.service
new file mode 100644 (file)
index 0000000..b2f2cd6
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test CAP_SYS_MODULE ProtectKernelModules=no
+
+[Service]
+ProtectKernelModules=no
+ExecStart=/bin/sh -x -c 'capsh --print | grep cap_sys_module'
+Type=oneshot
diff --git a/test/test-execute/exec-protectkernelmodules-yes-capabilities.service b/test/test-execute/exec-protectkernelmodules-yes-capabilities.service
new file mode 100644 (file)
index 0000000..84bf39b
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test CAP_SYS_MODULE for ProtectKernelModules=yes
+
+[Service]
+ProtectKernelModules=yes
+ExecStart=/bin/sh -x -c '! capsh --print | grep cap_sys_module'
+Type=oneshot
diff --git a/test/test-execute/exec-protectkernelmodules-yes-mount-propagation.service b/test/test-execute/exec-protectkernelmodules-yes-mount-propagation.service
new file mode 100644 (file)
index 0000000..0775812
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test to make sure that passing ProtectKernelModules=yes disconnect mount propagation
+
+[Service]
+ProtectKernelModules=yes
+ExecStart=/bin/sh -x -c 'd=$$(mktemp -d -p /tmp); trap "umount \'$$d\' && rmdir \'$$d\'" EXIT; mount -t tmpfs tmpfs "$$d"; grep "$$d" /proc/self/mountinfo && ! grep "$$d" /proc/$${PPID}/mountinfo && ! grep "$$d" /proc/1/mountinfo'
+Type=oneshot
diff --git a/test/test-execute/exec-read-only-path-succeed.service b/test/test-execute/exec-read-only-path-succeed.service
new file mode 100644 (file)
index 0000000..b54d48f
--- /dev/null
@@ -0,0 +1,8 @@
+[Service]
+Type=oneshot
+# This should work, as we explicitly disable the effect of ReadOnlyPaths=
+ExecStart=+/bin/touch /tmp/thisisasimpletest
+# This should also work, as we do not disable the effect of ReadOnlyPaths= but invert the exit code
+ExecStart=/bin/sh -x -c '! /bin/touch /tmp/thisisasimpletest'
+ExecStart=+/bin/rm /tmp/thisisasimpletest
+ReadOnlyPaths=/tmp
diff --git a/test/test-execute/exec-readonlypaths-mount-propagation.service b/test/test-execute/exec-readonlypaths-mount-propagation.service
new file mode 100644 (file)
index 0000000..7edb0da
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test to make sure that passing ReadOnlyPaths= disconnect mount propagation
+
+[Service]
+ReadOnlyPaths=-/i-dont-exist
+ExecStart=/bin/sh -x -c 'd=$$(mktemp -d -p /tmp); trap "umount \'$$d\' && rmdir \'$$d\'" EXIT; mount -t tmpfs tmpfs "$$d"; grep "$$d" /proc/self/mountinfo && ! grep "$$d" /proc/$${PPID}/mountinfo && ! grep "$$d" /proc/1/mountinfo'
+Type=oneshot
diff --git a/test/test-execute/exec-readonlypaths.service b/test/test-execute/exec-readonlypaths.service
new file mode 100644 (file)
index 0000000..6866fdc
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test for ReadOnlyPaths=
+
+[Service]
+ReadOnlyPaths=/etc -/i-dont-exist /usr
+ExecStart=/bin/sh -x -c 'test ! -w /etc && test ! -w /usr && test ! -e /i-dont-exist && test -w /var'
+Type=oneshot
diff --git a/test/test-execute/exec-readwritepaths-mount-propagation.service b/test/test-execute/exec-readwritepaths-mount-propagation.service
new file mode 100644 (file)
index 0000000..b38978d
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test to make sure that passing ReadWritePaths= disconnect mount propagation
+
+[Service]
+ReadWritePaths=-/i-dont-exist
+ExecStart=/bin/sh -x -c 'd=$$(mktemp -d -p /tmp); trap "umount \'$$d\' && rmdir \'$$d\'" EXIT; mount -t tmpfs tmpfs "$$d"; grep "$$d" /proc/self/mountinfo && ! grep "$$d" /proc/$${PPID}/mountinfo && ! grep "$$d" /proc/1/mountinfo'
+Type=oneshot
diff --git a/test/test-execute/exec-restrict-namespaces-mnt-blacklist.service b/test/test-execute/exec-restrict-namespaces-mnt-blacklist.service
new file mode 100644 (file)
index 0000000..ab909cb
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test RestrictNamespaces=~mnt
+
+[Service]
+RestrictNamespaces=~mnt
+ExecStart=/bin/sh -x -c 'unshare -m'
+Type=oneshot
diff --git a/test/test-execute/exec-restrict-namespaces-mnt.service b/test/test-execute/exec-restrict-namespaces-mnt.service
new file mode 100644 (file)
index 0000000..1aeed72
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test RestrictNamespaces=mnt
+
+[Service]
+RestrictNamespaces=mnt
+ExecStart=/bin/sh -x -c 'unshare -m'
+Type=oneshot
diff --git a/test/test-execute/exec-restrict-namespaces-no.service b/test/test-execute/exec-restrict-namespaces-no.service
new file mode 100644 (file)
index 0000000..3350030
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test RestrictNamespaces=no
+
+[Service]
+RestrictNamespaces=no
+ExecStart=/bin/sh -x -c 'unshare -m -u -i -n -p -f'
+Type=oneshot
diff --git a/test/test-execute/exec-restrict-namespaces-yes.service b/test/test-execute/exec-restrict-namespaces-yes.service
new file mode 100644 (file)
index 0000000..3fe70e2
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test RestrictNamespaces=yes
+
+[Service]
+RestrictNamespaces=yes
+ExecStart=/bin/sh -x -c 'unshare -m'
+Type=oneshot
diff --git a/test/test-execute/exec-supplementarygroups-multiple-groups-default-group-user.service b/test/test-execute/exec-supplementarygroups-multiple-groups-default-group-user.service
new file mode 100644 (file)
index 0000000..a49c9d2
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test for Supplementary Group with multiple groups without Group and User
+
+[Service]
+ExecStart=/bin/sh -x -c 'test "$$(id -G)" = "0 1 2 3" && test "$$(id -g)" = "0" && test "$$(id -u)" = "0"'
+Type=oneshot
+SupplementaryGroups=1 2 3
diff --git a/test/test-execute/exec-supplementarygroups-multiple-groups-withgid.service b/test/test-execute/exec-supplementarygroups-multiple-groups-withgid.service
new file mode 100644 (file)
index 0000000..5c62c1d
--- /dev/null
@@ -0,0 +1,8 @@
+[Unit]
+Description=Test for Supplementary Group with multiple groups and Group=1
+
+[Service]
+ExecStart=/bin/sh -x -c 'test "$$(id -G)" = "1 2 3" && test "$$(id -g)" = "1" && test "$$(id -u)" = "0"'
+Type=oneshot
+Group=1
+SupplementaryGroups=1 2 3
diff --git a/test/test-execute/exec-supplementarygroups-multiple-groups-withuid.service b/test/test-execute/exec-supplementarygroups-multiple-groups-withuid.service
new file mode 100644 (file)
index 0000000..00523e3
--- /dev/null
@@ -0,0 +1,8 @@
+[Unit]
+Description=Test for Supplementary Group with multiple groups and Uid=1
+
+[Service]
+ExecStart=/bin/sh -x -c 'test "$$(id -G)" = "1 2 3" && test "$$(id -g)" = "1" && test "$$(id -u)" = "1"'
+Type=oneshot
+User=1
+SupplementaryGroups=1 2 3
diff --git a/test/test-execute/exec-supplementarygroups-single-group-user.service b/test/test-execute/exec-supplementarygroups-single-group-user.service
new file mode 100644 (file)
index 0000000..ed6276d
--- /dev/null
@@ -0,0 +1,9 @@
+[Unit]
+Description=Test for Supplementary Group with only one group and uid 1
+
+[Service]
+ExecStart=/bin/sh -x -c 'test "$$(id -G)" = "1" && test "$$(id -g)" = "1" && test "$$(id -u)" = "1"'
+Type=oneshot
+User=1
+Group=1
+SupplementaryGroups=1
diff --git a/test/test-execute/exec-supplementarygroups-single-group.service b/test/test-execute/exec-supplementarygroups-single-group.service
new file mode 100644 (file)
index 0000000..ee502b3
--- /dev/null
@@ -0,0 +1,8 @@
+[Unit]
+Description=Test for Supplementary Group with only one group
+
+[Service]
+ExecStart=/bin/sh -x -c 'test "$$(id -G)" = "1" && test "$$(id -g)" = "1" && test "$$(id -u)" = "0"'
+Type=oneshot
+Group=1
+SupplementaryGroups=1
diff --git a/test/test-execute/exec-supplementarygroups.service b/test/test-execute/exec-supplementarygroups.service
new file mode 100644 (file)
index 0000000..43a9a98
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Test for Supplementary Group
+
+[Service]
+ExecStart=/bin/sh -x -c 'test "$$(id -G)" = "0 1"'
+Type=oneshot
+SupplementaryGroups=1
index 9fd5c7e..a0b9ef1 100644 (file)
@@ -5,13 +5,15 @@ PATH=/sbin:/bin:/usr/sbin:/usr/bin
 export PATH
 
 LOOKS_LIKE_DEBIAN=$(source /etc/os-release && [[ "$ID" = "debian" || "$ID_LIKE" = "debian" ]] && echo yes)
+LOOKS_LIKE_ARCH=$(source /etc/os-release && [[ "$ID" = "arch" ]] && echo yes)
+LOOKS_LIKE_SUSE=$(source /etc/os-release && [[ "$ID_LIKE" = "suse" ]] && echo yes)
 KERNEL_VER=${KERNEL_VER-$(uname -r)}
 KERNEL_MODS="/lib/modules/$KERNEL_VER/"
 QEMU_TIMEOUT="${QEMU_TIMEOUT:-infinity}"
 NSPAWN_TIMEOUT="${NSPAWN_TIMEOUT:-infinity}"
 TIMED_OUT=  # will be 1 after run_* if *_TIMEOUT is set and test timed out
-FSTYPE="${FSTYPE:-ext3}"
-UNIFIED_CGROUP_HIERARCHY="${UNIFIED_CGROUP_HIERARCHY:-no}"
+[[ "$LOOKS_LIKE_SUSE" ]] && FSTYPE="${FSTYPE:-btrfs}" || FSTYPE="${FSTYPE:-ext3}"
+UNIFIED_CGROUP_HIERARCHY="${UNIFIED_CGROUP_HIERARCHY:-default}"
 
 if ! ROOTLIBDIR=$(pkg-config --variable=systemdutildir systemd); then
     echo "WARNING! Cannot determine rootlibdir from pkg-config, assuming /usr/lib/systemd" >&2
@@ -39,6 +41,9 @@ function find_qemu_bin() {
         # i386 version of QEMU
         [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a qemu 2>/dev/null | grep '^/' -m1)
         ;;
+    ppc64*)
+        [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a qemu-system-$ARCH 2>/dev/null | grep '^/' -m1)
+        ;;
     esac
 
     if [ ! -e "$QEMU_BIN" ]; then
@@ -58,23 +63,60 @@ run_qemu() {
             && KERNEL_BIN="/boot/$MACHINE_ID/$KERNEL_VER/linux"
     fi
 
+    if [[ ! "$KERNEL_BIN" ]]; then
+        if [[ "$LOOKS_LIKE_ARCH" ]]; then
+            KERNEL_BIN=/boot/vmlinuz-linux
+        else
+            KERNEL_BIN=/boot/vmlinuz-$KERNEL_VER
+        fi
+    fi
+
     default_fedora_initrd=/boot/initramfs-${KERNEL_VER}.img
     default_debian_initrd=/boot/initrd.img-${KERNEL_VER}
-    [ "$KERNEL_BIN" ] || KERNEL_BIN=/boot/vmlinuz-$KERNEL_VER
-    [ "$INITRD" ]     || { [ -e "$default_fedora_initrd" ] && INITRD=$default_fedora_initrd; }
-    [ "$INITRD" ]     || { [ "$LOOKS_LIKE_DEBIAN" ] && [ -e "$default_debian_initrd" ] && INITRD=$default_debian_initrd; }
+    default_arch_initrd=/boot/initramfs-linux.img
+    default_suse_initrd=/boot/initrd-${KERNEL_VER}
+    if [[ ! "$INITRD" ]]; then
+        if [[ -e "$default_fedora_initrd" ]]; then
+            INITRD="$default_fedora_initrd"
+        elif [[ "$LOOKS_LIKE_DEBIAN" && -e "$default_debian_initrd" ]]; then
+            INITRD="$default_debian_initrd"
+        elif [[ "$LOOKS_LIKE_ARCH" && -e "$default_arch_initrd" ]]; then
+            INITRD="$default_arch_initrd"
+        elif [[ "$LOOKS_LIKE_SUSE" && -e "$default_suse_initrd" ]]; then
+            INITRD="$default_suse_initrd"
+        fi
+    fi
+
     [ "$QEMU_SMP" ]   || QEMU_SMP=1
 
     find_qemu_bin || return 1
 
-    KERNEL_APPEND="root=/dev/sda1 \
+    local _cgroup_args
+    if [[ "$UNIFIED_CGROUP_HIERARCHY" = "yes" ]]; then
+        _cgroup_args="systemd.unified_cgroup_hierarchy=yes"
+    elif [[ "$UNIFIED_CGROUP_HIERARCHY" = "no" ]]; then
+        _cgroup_args="systemd.unified_cgroup_hierarchy=no systemd.legacy_systemd_cgroup_controller=yes"
+    elif [[ "$UNIFIED_CGROUP_HIERARCHY" = "hybrid" ]]; then
+        _cgroup_args="systemd.unified_cgroup_hierarchy=no systemd.legacy_systemd_cgroup_controller=no"
+    elif [[ "$UNIFIED_CGROUP_HIERARCHY" != "default" ]]; then
+        dfatal "Unknown UNIFIED_CGROUP_HIERARCHY. Got $UNIFIED_CGROUP_HIERARCHY, expected [yes|no|hybrid|default]"
+        exit 1
+    fi
+
+if [[ "$LOOKS_LIKE_SUSE" ]]; then
+    PARAMS+="rd.hostonly=0"
+else
+    PARAMS+="ro"
+fi
+
+KERNEL_APPEND="$PARAMS \
+root=/dev/sda1 \
 raid=noautodetect \
 loglevel=2 \
 init=$ROOTLIBDIR/systemd \
-ro \
 console=ttyS0 \
 selinux=0 \
-systemd.unified_cgroup_hierarchy=$UNIFIED_CGROUP_HIERARCHY \
+$_cgroup_args \
 $KERNEL_APPEND \
 "
 
@@ -118,7 +160,17 @@ run_nspawn() {
         _nspawn_cmd="timeout --foreground $NSPAWN_TIMEOUT $_nspawn_cmd"
     fi
 
-    _nspawn_cmd="env UNIFIED_CGROUP_HIERARCHY=$UNIFIED_CGROUP_HIERARCHY $_nspawn_cmd"
+    if [[ "$UNIFIED_CGROUP_HIERARCHY" = "hybrid" ]]; then
+        dwarn "nspawn doesn't support UNIFIED_CGROUP_HIERARCHY=hybrid, skipping"
+        exit
+    elif [[ "$UNIFIED_CGROUP_HIERARCHY" = "yes" || "$UNIFIED_CGROUP_HIERARCHY" = "no" ]]; then
+        _nspawn_cmd="env UNIFIED_CGROUP_HIERARCHY=$UNIFIED_CGROUP_HIERARCHY $_nspawn_cmd"
+    elif [[ "$UNIFIED_CGROUP_HIERARCHY" = "default" ]]; then
+        _nspawn_cmd="env --unset=UNIFIED_CGROUP_HIERARCHY $_nspawn_cmd"
+    else
+        dfatal "Unknown UNIFIED_CGROUP_HIERARCHY. Got $UNIFIED_CGROUP_HIERARCHY, expected [yes|no|hybrid|default]"
+        exit 1
+    fi
 
     (set -x; $_nspawn_cmd)
     rc=$?
@@ -225,6 +277,7 @@ create_valgrind_wrapper() {
     cat >$_valgrind_wrapper <<EOF
 #!/bin/bash
 
+mount -t proc proc /proc
 exec valgrind --leak-check=full --log-file=/valgrind.out $ROOTLIBDIR/systemd "\$@"
 EOF
     chmod 0755 $_valgrind_wrapper
@@ -271,6 +324,8 @@ install_systemd() {
     # and it could fill the available space
     strip_binaries
 
+   [[ "$LOOKS_LIKE_SUSE" ]] && setup_suse
+
     # enable debug logging in PID1
     echo LogLevel=debug >> $initdir/etc/systemd/system.conf
 }
@@ -399,8 +454,14 @@ install_config_files() {
     # set the hostname
     echo systemd-testsuite > $initdir/etc/hostname
     # fstab
+    if [[ "$LOOKS_LIKE_SUSE" ]]; then
+       ROOTMOUNT="/dev/sda1           /       ${FSTYPE}    rw 0 1"
+    else
+       ROOTMOUNT="LABEL=systemd           /       ${FSTYPE}    rw 0 1"
+    fi
+
     cat >$initdir/etc/fstab <<EOF
-LABEL=systemd           /       ${FSTYPE}    rw 0 1
+$ROOTMOUNT
 EOF
 }
 
@@ -1293,6 +1354,12 @@ inst_libdir_file() {
     fi
 }
 
+setup_suse() {
+    ln -s ../usr/bin/systemctl $initdir/bin/systemctl
+    ln -s ../usr/lib/systemd $initdir/lib/systemd
+    inst_simple "/usr/lib/systemd/system/haveged.service"
+}
+
 do_test() {
     if [[ $UID != "0" ]]; then
         echo "TEST: $TEST_DESCRIPTION [SKIPPED]: not root" >&2
index da0a4e1..7e33479 100755 (executable)
@@ -37,7 +37,7 @@ my $EXIT_TEST_SKIP      = 77;
 
 my $rules_10k_tags      = "";
 for (my $i = 1; $i <= 10000; ++$i) {
-    $rules_10k_tags .= 'KERNEL=="sda", TAG+="test' . $i . "\"\n";
+        $rules_10k_tags .= 'KERNEL=="sda", TAG+="test' . $i . "\"\n";
 }
 
 my @tests = (
@@ -741,6 +741,86 @@ KERNEL=="ttyACM[0-9]*", SYMLINK="  one     two        "
 EOF
         },
         {
+                desc            => "symlink with spaces in substituted variable",
+                devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
+                exp_name        => "name-one_two_three-end",
+                not_exp_name    => " ",
+                rules           => <<EOF
+ENV{WITH_WS}="one two three"
+SYMLINK="name-\$env{WITH_WS}-end"
+EOF
+        },
+        {
+                desc            => "symlink with leading space in substituted variable",
+                devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
+                exp_name        => "name-one_two_three-end",
+                not_exp_name    => " ",
+                rules           => <<EOF
+ENV{WITH_WS}="   one two three"
+SYMLINK="name-\$env{WITH_WS}-end"
+EOF
+        },
+        {
+                desc            => "symlink with trailing space in substituted variable",
+                devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
+                exp_name        => "name-one_two_three-end",
+                not_exp_name    => " ",
+                rules           => <<EOF
+ENV{WITH_WS}="one two three   "
+SYMLINK="name-\$env{WITH_WS}-end"
+EOF
+        },
+        {
+                desc            => "symlink with lots of space in substituted variable",
+                devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
+                exp_name        => "name-one_two_three-end",
+                not_exp_name    => " ",
+                rules           => <<EOF
+ENV{WITH_WS}="   one two three   "
+SYMLINK="name-\$env{WITH_WS}-end"
+EOF
+        },
+        {
+                desc            => "symlink with multiple spaces in substituted variable",
+                devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
+                exp_name        => "name-one_two_three-end",
+                not_exp_name    => " ",
+                rules           => <<EOF
+ENV{WITH_WS}="   one  two  three   "
+SYMLINK="name-\$env{WITH_WS}-end"
+EOF
+        },
+        {
+                desc            => "symlink with space and var with space, part 1",
+                devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
+                exp_name        => "first",
+                not_exp_name    => " ",
+                rules           => <<EOF
+ENV{WITH_WS}="   one  two  three   "
+SYMLINK="  first  name-\$env{WITH_WS}-end another_symlink a b c "
+EOF
+        },
+        {
+                desc            => "symlink with space and var with space, part 2",
+                devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
+                exp_name        => "name-one_two_three-end",
+                not_exp_name    => " ",
+                rules           => <<EOF
+ENV{WITH_WS}="   one  two  three   "
+SYMLINK="  first  name-\$env{WITH_WS}-end another_symlink a b c "
+EOF
+        },
+        {
+                desc            => "symlink with space and var with space, part 3",
+                devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
+                exp_name        => "another_symlink",
+                not_exp_name    => " ",
+                rules           => <<EOF
+ENV{WITH_WS}="   one  two  three   "
+SYMLINK="  first  name-\$env{WITH_WS}-end another_symlink a b c "
+EOF
+        },
+        {
                 desc            => "symlink creation (same directory)",
                 devpath         => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
                 exp_name        => "modem0",
@@ -1535,11 +1615,18 @@ if (!($<==0)) {
         exit($EXIT_TEST_SKIP);
 }
 
+# skip the test when running in a chroot
+system("systemd-detect-virt", "-r", "-q");
+if ($? >> 8 == 0) {
+        print "Running in a chroot, skipping the test.\n";
+        exit($EXIT_TEST_SKIP);
+}
+
 # skip the test when running in a container
 system("systemd-detect-virt", "-c", "-q");
 if ($? >> 8 == 0) {
-    print "Running in a container, skipping the test.\n";
-    exit($EXIT_TEST_SKIP);
+        print "Running in a container, skipping the test.\n";
+        exit($EXIT_TEST_SKIP);
 }
 
 udev_setup();
@@ -1589,6 +1676,6 @@ system("umount", "$udev_tmpfs");
 rmdir($udev_tmpfs);
 
 if ($error > 0) {
-    exit(1);
+        exit(1);
 }
 exit(0);
index 4f0ecaa..73c62c1 100644 (file)
@@ -1,2 +1,4 @@
 /etc.conf
 /systemd.conf
+/systemd-remote.conf
+/var.conf
diff --git a/tmpfiles.d/meson.build b/tmpfiles.d/meson.build
new file mode 100644 (file)
index 0000000..0563f91
--- /dev/null
@@ -0,0 +1,50 @@
+enable_tmpfiles = conf.get('ENABLE_TMPFILES', false)
+
+tmpfiles = [['home.conf',            ''],
+            ['journal-nocow.conf',   ''],
+            ['systemd-nologin.conf', ''],
+            ['systemd-nspawn.conf',  ''],
+            ['tmp.conf',             ''],
+            ['x11.conf',             ''],
+            ['legacy.conf',          'HAVE_SYSV_COMPAT'],
+           ]
+
+foreach pair : tmpfiles
+        if not enable_tmpfiles
+                # do nothing
+        elif pair[1] == '' or conf.get(pair[1], false)
+                install_data(pair[0], install_dir : tmpfilesdir)
+        else
+                message('Not installing tmpfiles.d/@0@ because @1@ is @2@'
+                        .format(pair[0], pair[1], conf.get(pair[1], 0)))
+        endif
+endforeach
+
+m4_files = [['systemd.conf',         ''],
+            ['systemd-remote.conf',  'ENABLE_REMOTE'],
+            ['var.conf',             ''],
+           ]
+
+foreach pair : m4_files
+        if not enable_tmpfiles
+                # do nothing
+        elif pair[1] == '' or conf.get(pair[1], false)
+                custom_target(
+                        'tmpfiles.d_' + pair[0],
+                         input : pair[0] + '.m4',
+                         output: pair[0],
+                         command : [m4, '-P'] + m4_defines + ['@INPUT@'],
+                         capture : true,
+                         install : true,
+                         install_dir : tmpfilesdir)
+        else
+                message('Not installing tmpfiles.d/@0@.m4 because @1@ is @2@'
+                        .format(pair[0], pair[1], conf.get(pair[1], 0)))
+        endif
+endforeach
+
+if enable_tmpfiles
+        meson.add_install_script(
+                'sh', '-c',
+                mkdir_p.format(join_paths(sysconfdir, 'tmpfiles.d')))
+endif
similarity index 89%
rename from tmpfiles.d/systemd-remote.conf
rename to tmpfiles.d/systemd-remote.conf.m4
index e19230f..7a0f698 100644 (file)
@@ -6,8 +6,12 @@
 #  (at your option) any later version.
 
 # See tmpfiles.d(5) for details
+m4_ifdef(`HAVE_LIBCURL',
 
 d /var/lib/systemd/journal-upload 0755 systemd-journal-upload systemd-journal-upload - -
+)m4_dnl
+m4_ifdef(`HAVE_MICROHTTPD',
 
 z /var/log/journal/remote 2755 systemd-journal-remote systemd-journal-remote - -
 z /run/log/journal/remote 2755 systemd-journal-remote systemd-journal-remote - -
+)m4_dnl
index 2cd58e9..76e3829 100644 (file)
@@ -49,21 +49,21 @@ z /var/log/journal/%m/system.journal 0640 root systemd-journal - -
 m4_ifdef(`HAVE_ACL',`m4_dnl
 m4_ifdef(`ENABLE_ADM_GROUP',`m4_dnl
 m4_ifdef(`ENABLE_WHEEL_GROUP',``
-a+ /var/log/journal    - - - - d:group:adm:r-x,d:group:wheel:r-x
-a+ /var/log/journal    - - - - group:adm:r-x,group:wheel:r-x
+a+ /var/log/journal    - - - - d:group::r-x,d:group:adm:r-x,d:group:wheel:r-x
+a+ /var/log/journal    - - - - group::r-x,group:adm:r-x,group:wheel:r-x
 a+ /var/log/journal/%m - - - - d:group:adm:r-x,d:group:wheel:r-x
 a+ /var/log/journal/%m - - - - group:adm:r-x,group:wheel:r-x
 a+ /var/log/journal/%m/system.journal - - - - group:adm:r--,group:wheel:r--
 '', ``
-a+ /var/log/journal    - - - - d:group:adm:r-x
-a+ /var/log/journal    - - - - group:adm:r-x
+a+ /var/log/journal    - - - - d:group::r-x,d:group:adm:r-x
+a+ /var/log/journal    - - - - group::r-x,group:adm:r-x
 a+ /var/log/journal/%m - - - - d:group:adm:r-x
 a+ /var/log/journal/%m - - - - group:adm:r-x
 a+ /var/log/journal/%m/system.journal - - - - group:adm:r--
 '')',`m4_dnl
 m4_ifdef(`ENABLE_WHEEL_GROUP',``
-a+ /var/log/journal    - - - - d:group:wheel:r-x
-a+ /var/log/journal    - - - - group:wheel:r-x
+a+ /var/log/journal    - - - - d:group::r-x,d:group:wheel:r-x
+a+ /var/log/journal    - - - - group::r-x,group:wheel:r-x
 a+ /var/log/journal/%m - - - - d:group:wheel:r-x
 a+ /var/log/journal/%m - - - - group:wheel:r-x
 a+ /var/log/journal/%m/system.journal - - - - group:wheel:r--
index 6bbd1aa..22555a0 100644 (file)
@@ -16,3 +16,7 @@ x /tmp/systemd-private-%b-*
 X /tmp/systemd-private-%b-*/tmp
 x /var/tmp/systemd-private-%b-*
 X /var/tmp/systemd-private-%b-*/tmp
+
+# Remove top-level private temporary directories on each boot
+R! /tmp/systemd-private-*
+R! /var/tmp/systemd-private-*
similarity index 88%
rename from tmpfiles.d/var.conf
rename to tmpfiles.d/var.conf.m4
index ae7952e..e640fcd 100644 (file)
@@ -12,8 +12,11 @@ q /var 0755 - - -
 L /var/run - - - - ../run
 
 d /var/log 0755 - - -
+m4_ifdef(`HAVE_UTMP',
 f /var/log/wtmp 0664 root utmp -
 f /var/log/btmp 0600 root utmp -
+f /var/log/lastlog 0664 root utmp -
+)m4_dnl
 
 d /var/cache 0755 - - -
 
diff --git a/tools/catalog-report.py b/tools/catalog-report.py
new file mode 100755 (executable)
index 0000000..357e498
--- /dev/null
@@ -0,0 +1,87 @@
+#!/usr/bin/env python3
+# -*- Mode: python; coding: utf-8; indent-tabs-mode: nil -*- */
+#
+# This file is part of systemd. It is distrubuted under the MIT license, see
+# below.
+#
+# Copyright 2016 Zbigniew Jędrzejewski-Szmek
+#
+# The MIT License (MIT)
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+"""
+Prints out journal entries with no or bad catalog explanations.
+"""
+
+import re
+from systemd import journal, id128
+
+j = journal.Reader()
+
+logged = set()
+pattern = re.compile('@[A-Z0-9_]+@')
+
+mids = {v:k for k,v in id128.__dict__.items()
+        if k.startswith('SD_MESSAGE')}
+
+freq = 1000
+
+def log_entry(x):
+    if 'CODE_FILE' in x:
+        # some of our code was using 'CODE_FUNCTION' instead of 'CODE_FUNC'
+        print('{}:{} {}'.format(x.get('CODE_FILE', '???'),
+                                x.get('CODE_LINE', '???'),
+                                x.get('CODE_FUNC', None) or x.get('CODE_FUNCTION', '???')))
+    print('    {}'.format(x.get('MESSAGE', 'no message!')))
+    for k, v in x.items():
+        if k.startswith('CODE_') or k in {'MESSAGE_ID', 'MESSAGE'}:
+            continue
+        print('    {}={}'.format(k, v))
+    print()
+
+for i, x in enumerate(j):
+    if i % freq == 0:
+        print(i, end='\r')
+
+    try:
+        mid = x['MESSAGE_ID']
+    except KeyError:
+        continue
+    name = mids.get(mid, 'unknown')
+
+    try:
+        desc = journal.get_catalog(mid)
+    except FileNotFoundError:
+        if mid in logged:
+            continue
+
+        print('{} {.hex}: no catalog entry'.format(name, mid))
+        log_entry(x)
+        logged.add(mid)
+        continue
+
+    fields = [field[1:-1] for field in pattern.findall(desc)]
+    for field in fields:
+        index = (mid, field)
+        if field in x or index in logged:
+            continue
+        print('{} {.hex}: no field {}'.format(name, mid, field))
+        log_entry(x)
+        logged.add(index)
index 9ee81fb..62ce800 100644 (file)
@@ -1,3 +1,4 @@
+#!/usr/bin/env python3
 #  -*- Mode: python; coding: utf-8; indent-tabs-mode: nil -*- */
 #
 #  This file is part of systemd.
index 256ff3d..1b28799 100755 (executable)
@@ -1,3 +1,4 @@
+#!/usr/bin/env python3
 #  -*- Mode: python; coding: utf-8; indent-tabs-mode: nil -*- */
 #
 #  This file is part of systemd.
index 74a47b8..abc33e7 100755 (executable)
@@ -1,3 +1,4 @@
+#!/usr/bin/env python3
 #  -*- Mode: python; coding: utf-8; indent-tabs-mode: nil -*- */
 #
 #  This file is part of systemd.
old mode 100644 (file)
new mode 100755 (executable)
index 5e61917..e9e39f1
@@ -1,8 +1,9 @@
+#!/usr/bin/env python3
 #  -*- Mode: python; coding: utf-8; indent-tabs-mode: nil -*- */
 #
 #  This file is part of systemd.
 #
-#  Copyright 2013 Zbigniew Jędrzejewski-Szmek
+#  Copyright 2013, 2017 Zbigniew Jędrzejewski-Szmek
 #
 #  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
@@ -21,6 +22,7 @@ from __future__ import print_function
 import collections
 import sys
 import os.path
+import pprint
 from xml_helper import *
 
 SECTION = '''\
@@ -65,11 +67,13 @@ EXTRA_DIST += \\
        {dist_files}
 '''
 
+meson = False
+
 def man(page, number):
-    return 'man/{}.{}'.format(page, number)
+    return ('man/' if not meson else '') + '{}.{}'.format(page, number)
 
 def xml(file):
-    return 'man/{}'.format(os.path.basename(file))
+    return ('man/' if not meson else '') + os.path.basename(file)
 
 def add_rules(rules, name):
     xml = xml_parse(name)
@@ -121,9 +125,40 @@ def make_makefile(rules, dist_files):
         for conditional,rulegroup in sorted(rules.items())
         ) + FOOTER.format(dist_files=mjoin(sorted(dist_files)))
 
+MESON_HEADER = '''\
+# Do not edit. Generated by make-man-rules.py.
+manpages = ['''
+
+MESON_FOOTER = '''\
+]
+# Really, do not edit.'''
+
+def make_mesonfile(rules, dist_files):
+    # reformat rules as
+    # grouped = [ [name, section, [alias...], condition], ...]
+    #
+    # but first create a dictionary like
+    # lists = { (name, condition) => [alias...]
+    grouped = collections.defaultdict(list)
+    for condition, items in rules.items():
+        for alias, name in items.items():
+            group = grouped[(name, condition)]
+            if name != alias:
+                group.append(alias)
+
+    lines = [ [p[0][:-2], p[0][-1], sorted(a[:-2] for a in aliases), p[1]]
+              for p, aliases in sorted(grouped.items()) ]
+    return '\n'.join((MESON_HEADER, pprint.pformat(lines)[1:-1], MESON_FOOTER))
+
 if __name__ == '__main__':
-    rules = create_rules(sys.argv[1:])
-    dist_files = (xml(file) for file in sys.argv[1:]
+    meson = sys.argv[1] == '--meson'
+    pages = sys.argv[1+meson:]
+
+    rules = create_rules(pages)
+    dist_files = (xml(file) for file in pages
                   if not file.endswith(".directives.xml") and
                      not file.endswith(".index.xml"))
-    print(make_makefile(rules, dist_files), end='')
+    if meson:
+        print(make_mesonfile(rules, dist_files))
+    else:
+        print(make_makefile(rules, dist_files), end='')
diff --git a/tools/meson-check-compilation.sh b/tools/meson-check-compilation.sh
new file mode 100755 (executable)
index 0000000..d3b2a31
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh -eu
+
+"$@" '-' -o/dev/null </dev/null
diff --git a/tools/meson-check-help.sh b/tools/meson-check-help.sh
new file mode 100755 (executable)
index 0000000..47a5099
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/sh -eu
+
+# output width
+if "$1"  --help | grep -v 'default:' | grep -E -q '.{80}.'; then
+        echo "$(basename "$1") --help output is too wide:"
+        "$1"  --help | awk 'length > 80' | grep -E --color=yes '.{80}'
+        exit 1
+fi
+
+# no --help output to stdout
+if "$1" --help 2>&1 1>/dev/null | grep .; then
+        echo "$(basename "$1") --help prints to stderr"
+        exit 2
+fi
+
+# error output to stderr
+if ! "$1" --no-such-parameter 2>&1 1>/dev/null | grep -q .; then
+        echo "$(basename "$1") with an unknown parameter does not print to stderr"
+        exit 3
+fi
diff --git a/tools/meson-git-contrib.sh b/tools/meson-git-contrib.sh
new file mode 100755 (executable)
index 0000000..c543b3a
--- /dev/null
@@ -0,0 +1,8 @@
+#!/bin/sh -eu
+
+git shortlog -s `git describe --abbrev=0`.. | \
+        cut -c8- | \
+        sed 's/ / /g' | \
+        awk '{ print $$0 "," }' | \
+        sed -e 's/ / /g' | \
+        sort -u
diff --git a/tools/meson-hwdb-update.sh b/tools/meson-hwdb-update.sh
new file mode 100755 (executable)
index 0000000..4c91907
--- /dev/null
@@ -0,0 +1,15 @@
+#!/bin/sh -eu
+
+cd "$1"
+
+curl -L -o usb.ids 'http://www.linux-usb.org/usb.ids'
+curl -L -o pci.ids 'http://pci-ids.ucw.cz/v2.2/pci.ids'
+curl -L -o ma-large.txt 'http://standards-oui.ieee.org/oui/oui.txt'
+curl -L -o ma-medium.txt 'http://standards-oui.ieee.org/oui28/mam.txt'
+curl -L -o ma-small.txt 'http://standards-oui.ieee.org/oui36/oui36.txt'
+curl -L -o pnp_id_registry.html 'http://www.uefi.org/uefi-pnp-export'
+curl -L -o acpi_id_registry.html 'http://www.uefi.org/uefi-acpi-export'
+./ids-update.pl
+./acpi-update.py > 20-acpi-vendor.hwdb.base
+patch -p0 -o- 20-acpi-vendor.hwdb.base <20-acpi-vendor.hwdb.patch >20-acpi-vendor.hwdb
+diff -u 20-acpi-vendor.hwdb.base 20-acpi-vendor.hwdb >20-acpi-vendor.hwdb.patch
diff --git a/tools/meson-link-test.c b/tools/meson-link-test.c
new file mode 100644 (file)
index 0000000..825bbff
--- /dev/null
@@ -0,0 +1 @@
+int main(void) {return 0;}
diff --git a/tools/meson-make-symlink.sh b/tools/meson-make-symlink.sh
new file mode 100755 (executable)
index 0000000..4c21909
--- /dev/null
@@ -0,0 +1,17 @@
+#!/bin/sh -eu
+
+relpath() {
+        python -c 'import os.path, sys;\
+                   print os.path.relpath(sys.argv[1],sys.argv[2])' "$1" "${2-$PWD}"
+}
+
+# this is needed mostly because $DESTDIR is provided as a variable,
+# and we need to create the target directory...
+
+mkdir -vp "$(dirname "${DESTDIR:-}$2")"
+if [ "$(dirname $1)" = . ]; then
+        ln -vfs -T "$1" "${DESTDIR:-}$2"
+else
+        reltarget="$(relpath "${DESTDIR:-}$1" "$(dirname "${DESTDIR:-}$2")")"
+        ln -vfs -T "$reltarget" "${DESTDIR:-}$2"
+fi
old mode 100644 (file)
new mode 100755 (executable)
index e87126f..0088be5
@@ -1,3 +1,4 @@
+#!/usr/bin/env python3
 #  -*- Mode: python; coding: utf-8; indent-tabs-mode: nil -*- */
 #
 #  This file is part of systemd.
index 47e9915..4398a59 100644 (file)
@@ -1,8 +1,6 @@
 /user@.service.m4
 /console-getty.service
 /console-getty.service.m4
-/console-shell.service
-/console-shell.service.m4
 /container-getty@.service
 /container-getty@.service.m4
 /debug-shell.service
@@ -18,6 +16,7 @@
 /rc-local.service
 /rescue.service
 /serial-getty@.service
+/system-update-cleanup.service
 /systemd-ask-password-console.service
 /systemd-ask-password-wall.service
 /systemd-backlight@.service
@@ -76,5 +75,6 @@
 /systemd-update-utmp.service
 /systemd-user-sessions.service
 /systemd-vconsole-setup.service
+/systemd-volatile-root.service
 /tmp.mount
 /user@.service
similarity index 80%
rename from units/booting-done.service
rename to units/booting-done.service.in
index f4591d3..41d14ad 100644 (file)
@@ -6,6 +6,6 @@ RefuseManualStop=yes
 [Service]
 User=system_fw
 Group=system_fw
-ExecStart=/usr/bin/wait-delayed-target.sh
+ExecStart=@rootbindir@/wait-delayed-target.sh
 RemainAfterExit=yes
 SmackProcessLabel=System
index 903894f..4d91ffc 100644 (file)
@@ -16,7 +16,10 @@ After=rc-local.service
 Before=getty.target
 
 [Service]
-ExecStart=-/sbin/agetty --noclear --keep-baud console 115200,38400,9600 $TERM
+# The '-o' option value tells agetty to replace 'login' arguments with an
+# option to preserve environment (-p), followed by '--' for safety, and then
+# the entered username.
+ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear --keep-baud console 115200,38400,9600 $TERM
 Type=idle
 Restart=always
 RestartSec=0
diff --git a/units/console-shell.service.m4.in b/units/console-shell.service.m4.in
deleted file mode 100644 (file)
index bb612f3..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#  This file is part of systemd.
-#
-#  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.
-
-[Unit]
-Description=Console Shell
-Documentation=man:sulogin(8)
-After=systemd-user-sessions.service plymouth-quit-wait.service
-m4_ifdef(`HAVE_SYSV_COMPAT',
-After=rc-local.service
-)m4_dnl
-Before=getty.target
-
-[Service]
-Environment=HOME=/root
-WorkingDirectory=-/root
-ExecStart=-@SULOGIN@
-ExecStopPost=-@SYSTEMCTL@ poweroff
-Type=idle
-StandardInput=tty-force
-StandardOutput=inherit
-StandardError=inherit
-KillMode=process
-IgnoreSIGPIPE=no
-SendSIGHUP=yes
-SmackProcessLabel=System
-
-[Install]
-WantedBy=getty.target
index be0a8fc..22f9786 100644 (file)
@@ -17,7 +17,10 @@ IgnoreOnIsolate=yes
 ConditionPathExists=/dev/pts/%I
 
 [Service]
-ExecStart=-/sbin/agetty --noclear --keep-baud pts/%I 115200,38400,9600 $TERM
+# The '-o' option value tells agetty to replace 'login' arguments with an
+# option to preserve environment (-p), followed by '--' for safety, and then
+# the entered username.
+ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear --keep-baud pts/%I 115200,38400,9600 $TERM
 Type=idle
 Restart=always
 RestartSec=0
index 882adb4..86ad7ac 100644 (file)
@@ -8,11 +8,12 @@
 [Unit]
 Description=Huge Pages File System
 Documentation=https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
 DefaultDependencies=no
 Before=sysinit.target
 ConditionPathExists=/sys/kernel/mm/hugepages
 ConditionCapability=CAP_SYS_ADMIN
+ConditionVirtualization=!private-users
 
 [Mount]
 What=hugetlbfs
index 8d29f96..b2adfeb 100644 (file)
@@ -8,7 +8,7 @@
 [Unit]
 Description=POSIX Message Queue File System
 Documentation=man:mq_overview(7)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
 DefaultDependencies=no
 Before=sysinit.target
 ConditionPathExists=/proc/sys/fs/mqueue
index 454ec38..663e0ce 100644 (file)
@@ -17,9 +17,7 @@ Before=shutdown.target
 [Service]
 Environment=HOME=/root
 WorkingDirectory=-/root
-ExecStartPre=-/bin/plymouth --wait quit
-ExecStartPre=-/bin/echo -e 'You are in emergency mode. After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\ntry again to boot into default mode.'
-ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --job-mode=fail --no-block default"
+ExecStart=-@rootlibexecdir@/systemd-sulogin-shell emergency
 Type=idle
 StandardInput=tty-force
 StandardOutput=inherit
index 1853a7c..9269758 100644 (file)
@@ -33,7 +33,10 @@ ConditionPathExists=/dev/tty0
 
 [Service]
 # the VT is cleared by TTYVTDisallocate
-ExecStart=-/sbin/agetty --noclear %I $TERM
+# The '-o' option value tells agetty to replace 'login' arguments with an
+# option to preserve environment (-p), followed by '--' for safety, and then
+# the entered username.
+ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear %I $TERM
 Type=idle
 Restart=always
 RestartSec=0
index dae6748..2e883e5 100644 (file)
@@ -15,7 +15,5 @@ AllowIsolate=yes
 
 [Service]
 Type=oneshot
-# we have to use "--force" here, otherwise systemd would umount /run
-ExecStart=@rootbindir@/systemctl --no-block --force switch-root /sysroot
-KillMode=none
 SmackProcessLabel=System
+ExecStart=@rootbindir@/systemctl --no-block switch-root /sysroot
index f347687..934d82f 100644 (file)
@@ -12,5 +12,5 @@ DefaultDependencies=no
 Requires=initrd-switch-root.service
 Before=initrd-switch-root.service
 AllowIsolate=yes
-Wants=initrd-udevadm-cleanup-db.service initrd-root-fs.target initrd-fs.target systemd-journald.service
+Wants=initrd-udevadm-cleanup-db.service initrd-root-fs.target initrd-fs.target systemd-journald.service initrd-cleanup.service
 After=initrd-udevadm-cleanup-db.service initrd-root-fs.target initrd-fs.target emergency.service emergency.target
diff --git a/units/meson-add-wants.sh b/units/meson-add-wants.sh
new file mode 100755 (executable)
index 0000000..081a0c3
--- /dev/null
@@ -0,0 +1,34 @@
+#!/bin/sh -eu
+
+unitdir="$1"
+target="$2"
+unit="$3"
+
+case "$target" in
+        */?*) # a path, but not just a slash at the end
+                dir="${DESTDIR:-}${target}"
+                ;;
+        *)
+                dir="${DESTDIR:-}${unitdir}/${target}"
+                ;;
+esac
+
+unitpath="${DESTDIR:-}${unitdir}/${unit}"
+
+relpath() {
+        python -c 'import os.path, sys;\
+                   print os.path.relpath(sys.argv[1],sys.argv[2])' "$1" "${2-$PWD}"
+}
+
+case "$target" in
+        */)
+                mkdir -p -m 0755 "$dir"
+                reltarget="$(relpath "$unitpath" "$dir")"
+                ;;
+        *)
+                mkdir -p -m 0755 "$(basename "$dir")"
+                reltarget="$(relpath "$unitpath" "$(dirname "$dir")")"
+                ;;
+esac
+
+ln -vfs "$reltarget" "$dir"
diff --git a/units/meson.build b/units/meson.build
new file mode 100644 (file)
index 0000000..237d751
--- /dev/null
@@ -0,0 +1,337 @@
+units = [
+        ['basic.target',                        ''],
+        ['bluetooth.target',                    ''],
+        ['cryptsetup-pre.target',               'HAVE_LIBCRYPTSETUP'],
+        ['cryptsetup.target',                   'HAVE_LIBCRYPTSETUP',
+         'sysinit.target.wants/'],
+        ['dev-hugepages.mount',                 '',
+         'sysinit.target.wants/'],
+        ['dev-mqueue.mount',                    '',
+         'sysinit.target.wants/'],
+        ['emergency.target',                    ''],
+        ['exit.target',                         ''],
+        ['final.target',                        ''],
+        ['getty.target',                        '',
+         'multi-user.target.wants/'],
+        ['graphical.target',                    '',
+         'runlevel5.target default.target'],
+        ['halt.target',                         ''],
+        ['hibernate.target',                    'ENABLE_HIBERNATE'],
+        ['hybrid-sleep.target',                 'ENABLE_HIBERNATE'],
+        ['initrd-fs.target',                    ''],
+        ['initrd-root-device.target',           ''],
+        ['initrd-root-fs.target',               ''],
+        ['initrd-switch-root.target',           ''],
+        ['initrd.target',                       ''],
+        ['kexec.target',                        ''],
+        ['ldconfig.service',                    'ENABLE_LDCONFIG',
+         'sysinit.target.wants/'],
+        ['local-fs-pre.target',                 ''],
+        ['local-fs.target',                     ''],
+        ['machine.slice',                       'ENABLE_MACHINED'],
+        ['machines.target',                     'ENABLE_MACHINED',
+         join_paths(pkgsysconfdir, 'system/multi-user.target.wants/')],
+        ['multi-user.target',                   '',
+         'runlevel2.target runlevel3.target runlevel4.target'],
+        ['network-online.target',               ''],
+        ['network-pre.target',                  ''],
+        ['network.target',                      ''],
+        ['nss-lookup.target',                   ''],
+        ['nss-user-lookup.target',              ''],
+        ['paths.target',                        ''],
+        ['poweroff.target',                     '',
+         'runlevel0.target'],
+        ['printer.target',                      ''],
+        ['proc-sys-fs-binfmt_misc.automount',   'ENABLE_BINFMT',
+         'sysinit.target.wants/'],
+        ['proc-sys-fs-binfmt_misc.mount',       'ENABLE_BINFMT'],
+        ['reboot.target',                       '',
+         'runlevel6.target ctrl-alt-del.target'],
+        ['remote-fs-pre.target',                ''],
+        ['remote-fs.target',                    '',
+         join_paths(pkgsysconfdir, 'system/multi-user.target.wants/')],
+        ['rescue.target',                       '',
+         'runlevel1.target'],
+        ['rpcbind.target',                      ''],
+        ['shutdown.target',                     ''],
+        ['sigpwr.target',                       ''],
+        ['sleep.target',                        ''],
+        ['slices.target',                       ''],
+        ['smartcard.target',                    ''],
+        ['sockets.target',                      ''],
+        ['sound.target',                        ''],
+        ['suspend.target',                      ''],
+        ['swap.target',                         ''],
+        ['delayed.target',                      ''],
+        ['sys-fs-fuse-connections.mount',       '',
+         'sysinit.target.wants/'],
+        ['sys-kernel-config.mount',             '',
+         'sysinit.target.wants/'],
+        ['sys-kernel-debug.mount',              '',
+         'sysinit.target.wants/'],
+        ['sysinit.target',                      ''],
+        ['syslog.socket',                       ''],
+        ['system-update.target',                ''],
+        ['system.slice',                        ''],
+        ['systemd-ask-password-console.path',   '',
+         'sysinit.target.wants/'],
+        ['systemd-ask-password-wall.path',      '',
+         'multi-user.target.wants/'],
+        ['systemd-coredump.socket',             'ENABLE_COREDUMP',
+         'sockets.target.wants/'],
+        ['systemd-initctl.socket',              '',
+         'sockets.target.wants/'],
+        ['systemd-journal-gatewayd.socket',     'ENABLE_REMOTE HAVE_MICROHTTPD'],
+        ['systemd-journal-remote.socket',       'ENABLE_REMOTE HAVE_MICROHTTPD'],
+        ['systemd-journald-audit.socket',       '',
+         'sockets.target.wants/'],
+        ['systemd-journald-dev-log.socket',     '',
+         'sockets.target.wants/'],
+        ['systemd-journald.socket',             '',
+         'sockets.target.wants/'],
+        ['systemd-networkd.socket',             '',
+         join_paths(pkgsysconfdir, 'system/sockets.target.wants/')],
+        ['systemd-rfkill.socket',               'ENABLE_RFKILL'],
+        ['systemd-tmpfiles-clean.timer',        '',
+         'timers.target.wants/'],
+        ['systemd-udevd-control.socket',        '',
+         'sockets.target.wants/'],
+        ['systemd-udevd-kernel.socket',         '',
+         'sockets.target.wants/'],
+        ['time-sync.target',                    ''],
+        ['timers.target',                       ''],
+        ['umount.target',                       ''],
+        ['user.slice',                          ''],
+        ['var-lib-machines.mount',              'ENABLE_MACHINED',
+         'remote-fs.target.wants/ machines.target.wants/ local-fs.target.wants/'],
+]
+
+in_units = [
+        ['debug-shell.service',                  ''],
+        ['emergency.service',                    ''],
+        ['halt-local.service',                   'HAVE_SYSV_COMPAT'],
+        ['initrd-cleanup.service',               ''],
+        ['initrd-parse-etc.service',             ''],
+        ['initrd-switch-root.service',           ''],
+        ['initrd-udevadm-cleanup-db.service',    ''],
+        ['kmod-static-nodes.service',            'HAVE_KMOD ENABLE_TMPFILES',
+         'sysinit.target.wants/'],
+        ['quotaon.service',                      'ENABLE_QUOTACHECK'],
+        ['rc-local.service',                     'HAVE_SYSV_COMPAT'],
+        ['rescue.service',                       ''],
+        ['system-update-cleanup.service',        ''],
+        ['systemd-ask-password-console.service', ''],
+        ['systemd-ask-password-wall.service',    ''],
+        ['systemd-backlight@.service',           'ENABLE_BACKLIGHT'],
+        ['systemd-binfmt.service',               'ENABLE_BINFMT',
+         'sysinit.target.wants/'],
+        ['systemd-coredump@.service',            'ENABLE_COREDUMP'],
+        ['systemd-exit.service',                 ''],
+        ['systemd-firstboot.service',            'ENABLE_FIRSTBOOT',
+         'sysinit.target.wants/'],
+        ['systemd-fsck-root.service',            ''],
+        ['systemd-fsck@.service',                ''],
+        ['systemd-halt.service',                 ''],
+        ['systemd-hibernate-resume@.service',    'ENABLE_HIBERNATE'],
+        ['systemd-hibernate.service',            'ENABLE_HIBERNATE'],
+        ['systemd-hybrid-sleep.service',         'ENABLE_HIBERNATE'],
+        ['systemd-hostnamed.service',            'ENABLE_HOSTNAMED',
+         'dbus-org.freedesktop.hostname1.service'],
+        ['systemd-hwdb-update.service',          'ENABLE_HWDB',
+         'sysinit.target.wants/'],
+        ['systemd-importd.service',              'ENABLE_IMPORTD',
+         'dbus-org.freedesktop.import1.service'],
+        ['systemd-initctl.service',               ''],
+        ['systemd-journal-catalog-update.service', '',
+         'sysinit.target.wants/'],
+        ['systemd-journal-flush.service',         '',
+         'sysinit.target.wants/'],
+        ['systemd-journal-gatewayd.service',     'ENABLE_REMOTE HAVE_MICROHTTPD'],
+        ['systemd-journal-remote.service',       'ENABLE_REMOTE HAVE_MICROHTTPD'],
+        ['systemd-journal-upload.service',       'ENABLE_REMOTE HAVE_LIBCURL'],
+        ['systemd-journald.service',             '',
+         'sysinit.target.wants/'],
+        ['systemd-kexec.service',                ''],
+        ['systemd-localed.service',              'ENABLE_LOCALED',
+         'dbus-org.freedesktop.locale1.service'],
+        ['systemd-logind.service',               'ENABLE_LOGIND',
+         'multi-user.target.wants/ dbus-org.freedesktop.login1.service'],
+        ['systemd-machine-id-commit.service',    '',
+         'sysinit.target.wants/'],
+        ['systemd-machined.service',             'ENABLE_MACHINED',
+         'dbus-org.freedesktop.machine1.service'],
+        ['systemd-modules-load.service',         'HAVE_KMOD',
+         'sysinit.target.wants/'],
+        ['systemd-networkd-wait-online.service', 'ENABLE_NETWORKD',
+         join_paths(pkgsysconfdir, 'system/network-online.target.wants/')],
+        ['systemd-nspawn@.service',              ''],
+        ['systemd-poweroff.service',             ''],
+        ['systemd-quotacheck.service',           'ENABLE_QUOTACHECK'],
+        ['systemd-random-seed.service',          'ENABLE_RANDOMSEED',
+         'sysinit.target.wants/'],
+        ['systemd-reboot.service',               ''],
+        ['systemd-remount-fs.service',           '',
+         'local-fs.target.wants/'],
+        ['systemd-rfkill.service',               'ENABLE_RFKILL'],
+        ['systemd-suspend.service',              ''],
+        ['systemd-sysctl.service',               '',
+         'sysinit.target.wants/'],
+        ['systemd-sysusers.service',             'ENABLE_SYSUSERS',
+         'sysinit.target.wants/'],
+        ['systemd-timedated.service',            'ENABLE_TIMEDATED',
+         'dbus-org.freedesktop.timedate1.service'],
+        ['systemd-timesyncd.service',            'ENABLE_TIMESYNCD',
+         join_paths(pkgsysconfdir, 'system/sysinit.target.wants/')],
+        ['systemd-tmpfiles-clean.service',       'ENABLE_TMPFILES'],
+        ['systemd-tmpfiles-setup-dev.service',   'ENABLE_TMPFILES',
+         'sysinit.target.wants/'],
+        ['systemd-tmpfiles-setup.service',       'ENABLE_TMPFILES',
+         'sysinit.target.wants/'],
+        ['systemd-udev-settle.service',          ''],
+        ['systemd-udev-trigger.service',         '',
+         'sysinit.target.wants/'],
+        ['systemd-udevd.service',                '',
+         'sysinit.target.wants/'],
+        ['systemd-update-done.service',          '',
+         'sysinit.target.wants/'],
+        ['systemd-update-utmp-runlevel.service', 'HAVE_UTMP HAVE_SYSV_COMPAT',
+         'multi-user.target.wants/ graphical.target.wants/ rescue.target.wants/'],
+        ['systemd-update-utmp.service',          'HAVE_UTMP',
+         'sysinit.target.wants/'],
+        ['systemd-user-sessions.service',        '',
+         'multi-user.target.wants/'],
+        ['systemd-vconsole-setup.service',       'ENABLE_VCONSOLE',
+         'sysinit.target.wants/'],
+        ['systemd-volatile-root.service',        ''],
+               ['booting-done.service',                 '',
+         'delayed.target.wants/'],
+               ['system-delayed-target-done.service',   '',
+         'delayed.target.wants/'],
+        ['system-default-target-done.service',  '', 'graphical.target.wants/'],
+        ['system-delayed-target-trigger.service', '', 'graphical.target.wants/'],
+]
+
+m4_units = [
+        ['getty@.service',                     '',
+         'autovt@.service ' +
+         join_paths(pkgsysconfdir, 'system/getty.target.wants/getty@tty1.service')],
+        ['serial-getty@.service',              ''],
+        ['tmp.mount',                          '',
+         'local-fs.target.wants/'],
+]
+
+m4_in_units = [
+        ['console-getty.service',              ''],
+        ['container-getty@.service',           ''],
+        ['systemd-networkd.service',           'ENABLE_NETWORKD',
+         join_paths(pkgsysconfdir, 'system/dbus-org.freedesktop.network1.service') + ' ' +
+         join_paths(pkgsysconfdir, 'system/multi-user.target.wants/')],
+        ['systemd-resolved.service',           'ENABLE_RESOLVED',
+         join_paths(pkgsysconfdir, 'system/dbus-org.freedesktop.resolve1.service') + ' ' +
+         join_paths(pkgsysconfdir, 'system/multi-user.target.wants/')],
+        ['user@.service',                      ''],
+]
+
+foreach tuple : m4_in_units
+        file = tuple[0]
+
+        gen = configure_file(
+                input : file + '.m4.in',
+                output : file + '.m4',
+                configuration : substs)
+
+        m4_units += [[file, tuple.get(1, ''), tuple.get(2, ''), gen]]
+endforeach
+
+foreach tuple : in_units
+        file = tuple[0]
+
+        # we do this here because install_data does not accept custom_target output
+        conds = tuple[1].split(' ')
+        install = ((conds.get(0, '') == '' or conf.get(conds[0], false)) and
+                   (conds.get(1, '') == '' or conf.get(conds[1], false)))
+
+        gen1 = configure_file(
+                input : file + '.in',
+                output : file + '.tmp',
+                configuration : substs)
+        gen2 = custom_target(
+                file,
+                input : gen1,
+                output : file,
+                command : [sed, '/^## /d', '@INPUT@'],
+                capture : true,
+                install : install,
+                install_dir : systemunitdir)
+
+        if install and tuple.length() > 2
+                foreach target : tuple[2].split()
+                        meson.add_install_script('meson-add-wants.sh', systemunitdir, target, file)
+                endforeach
+        endif
+endforeach
+
+foreach tuple : m4_units
+        file = tuple[0]
+        input = tuple.get(3, file + '.m4')
+
+        # we do this here because install_data does not accept custom_target output
+        conds = tuple[1].split(' ')
+        install = ((conds.get(0, '') == '' or conf.get(conds[0], false)) and
+                   (conds.get(1, '') == '' or conf.get(conds[1], false)))
+
+        custom_target(
+                file,
+                input : input,
+                output: file,
+                command : [m4, '-P'] + m4_defines + ['@INPUT@'],
+                capture : true,
+                install : install,
+                install_dir : systemunitdir)
+
+        if tuple.length() > 2 and install
+                foreach target : tuple[2].split()
+                        meson.add_install_script('meson-add-wants.sh', systemunitdir, target, file)
+                endforeach
+        endif
+endforeach
+
+foreach tuple : units
+        file = tuple[0]
+        input = tuple.get(3, file)
+
+        conds = tuple[1].split(' ')
+        install = ((conds.get(0, '') == '' or conf.get(conds[0], false)) and
+                   (conds.get(1, '') == '' or conf.get(conds[1], false)))
+
+        if install
+                install_data(input,
+                             install_dir : systemunitdir)
+
+                if tuple.length() > 2
+                        foreach target : tuple[2].split()
+                                meson.add_install_script(
+                                        'meson-add-wants.sh', systemunitdir, target, file)
+                        endforeach
+                endif
+        endif
+endforeach
+
+############################################################
+
+meson.add_install_script(meson_make_symlink,
+                         join_paths(pkgsysconfdir, 'user'),
+                         join_paths(sysconfdir, 'xdg/systemd/user'))
+meson.add_install_script(meson_make_symlink,
+                         join_paths(dbussystemservicedir, 'org.freedesktop.systemd1.service'),
+                         join_paths(dbussessionservicedir, 'org.freedesktop.systemd1.service'))
+if conf.get('HAVE_SYSV_COMPAT', false)
+        foreach i : [1, 2, 3, 4, 5]
+                meson.add_install_script(
+                        'sh', '-c',
+                        mkdir_p
+                        .format(join_paths(systemunitdir, 'runlevel@0@.target.wants'.format(i))))
+        endforeach
+endif
+
+subdir('user')
index 67bc4fa..5130d8c 100644 (file)
@@ -8,5 +8,5 @@
 [Unit]
 Description=Network is Online
 Documentation=man:systemd.special(7)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
 After=network.target
index 0ea4bc7..0d54a4c 100644 (file)
@@ -8,5 +8,5 @@
 [Unit]
 Description=Network (Pre)
 Documentation=man:systemd.special(7)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
 RefuseManualStart=yes
index 61ebdca..f8331b6 100644 (file)
@@ -8,6 +8,6 @@
 [Unit]
 Description=Network
 Documentation=man:systemd.special(7)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
 After=network-pre.target
 RefuseManualStart=yes
index d64c364..f7b4133 100644 (file)
@@ -8,7 +8,7 @@
 [Unit]
 Description=Hostname Service Bus Name
 Documentation=man:systemd-hostnamed.service(8) man:hostname(5) man:machine-info(5)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/hostnamed
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/hostnamed
 
 [BusName]
 Service=systemd-hostnamed.service
index 3cd2011..e0c498e 100644 (file)
@@ -8,7 +8,7 @@
 [Unit]
 Description=Locale Service Bus Name
 Documentation=man:systemd-localed.service(8) man:locale.conf(5) man:vconsole.conf(5)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/localed
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/localed
 
 [BusName]
 Service=systemd-localed.service
index d0686b1..b169720 100644 (file)
@@ -8,8 +8,8 @@
 [Unit]
 Description=Login Service Bus Name
 Documentation=man:systemd-logind.service(8) man:logind.conf(5)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/logind
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/logind
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/multiseat
 
 [BusName]
 Service=systemd-logind.service
index 7df8e9e..a1f0154 100644 (file)
@@ -8,7 +8,7 @@
 [Unit]
 Description=Virtual Machine and Container Registration Service Bus Name
 Documentation=man:systemd-machined.service(8)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/machined
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/machined
 
 [BusName]
 Service=systemd-machined.service
index 5b7a7fe..28c8f97 100644 (file)
@@ -8,7 +8,7 @@
 [Unit]
 Description=Network Name Resolution Service Bus Name
 Documentation=man:systemd-resolved.service(8)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/resolved
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/resolved
 
 # This is pulled in by systemd-resolved.service, since it cannot run
 # without its policy set. However, let's conditionalize this unit on
index 9ec055e..f9f41cb 100644 (file)
@@ -8,7 +8,7 @@
 [Unit]
 Description=System and Service Manager Bus Name
 Documentation=man:systemd(1)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd
+Documentation=https://www.freedesktop.org/wiki/Software/systemd
 
 [BusName]
 Activating=no
index eae4e53..1c962b5 100644 (file)
@@ -8,7 +8,7 @@
 [Unit]
 Description=Time & Date Service Bus Name
 Documentation=man:systemd-timedated.service(8) man:localtime(5)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/timedated
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/timedated
 
 [BusName]
 Service=systemd-timedated.service
index 6be3893..1067bcd 100644 (file)
@@ -7,8 +7,8 @@
 
 [Unit]
 Description=Arbitrary Executable File Formats File System Automount Point
-Documentation=https://www.kernel.org/doc/Documentation/binfmt_misc.txt
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+Documentation=https://www.kernel.org/doc/html/latest/admin-guide/binfmt-misc.html
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
 DefaultDependencies=no
 Before=sysinit.target
 ConditionPathExists=/proc/sys/fs/binfmt_misc/
index 8c7c386..27773cd 100644 (file)
@@ -7,8 +7,8 @@
 
 [Unit]
 Description=Arbitrary Executable File Formats File System
-Documentation=https://www.kernel.org/doc/Documentation/binfmt_misc.txt
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+Documentation=https://www.kernel.org/doc/html/latest/admin-guide/binfmt-misc.html
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
 DefaultDependencies=no
 
 [Mount]
index 9561247..9272427 100644 (file)
@@ -10,7 +10,7 @@ Description=Enable File System Quotas
 Documentation=man:quotaon(8)
 DefaultDependencies=no
 After=systemd-quotacheck.service
-Before=local-fs.target shutdown.target
+Before=remote-fs.target shutdown.target
 ConditionPathExists=@QUOTAON@
 
 [Service]
index 668c7ae..f52aeeb 100644 (file)
@@ -16,9 +16,7 @@ Before=shutdown.target
 [Service]
 Environment=HOME=/root
 WorkingDirectory=-/root
-ExecStartPre=-/bin/plymouth --wait quit
-ExecStartPre=-/bin/echo -e 'You are in rescue mode. After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.'
-ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --job-mode=fail --no-block default"
+ExecStart=-@rootlibexecdir@/systemd-sulogin-shell rescue
 Type=idle
 StandardInput=tty-force
 StandardOutput=inherit
index 077a7c9..2594f0c 100644 (file)
@@ -21,8 +21,17 @@ After=rc-local.service
 Before=getty.target
 IgnoreOnIsolate=yes
 
+# IgnoreOnIsolate causes issues with sulogin, if someone isolates
+# rescue.target or starts rescue.service from multi-user.target or
+# graphical.target.
+Conflicts=rescue.service
+Before=rescue.service
+
 [Service]
-ExecStart=-/sbin/agetty --keep-baud 115200,38400,9600 %I $TERM
+# The '-o' option value tells agetty to replace 'login' arguments with an
+# option to preserve environment (-p), followed by '--' for safety, and then
+# the entered username.
+ExecStart=-/sbin/agetty -o '-p -- \\u' --keep-baud 115200,38400,9600 %I $TERM
 Type=idle
 Restart=always
 UtmpIdentifier=%I
index e940beb..492ceb1 100644 (file)
@@ -8,10 +8,11 @@
 [Unit]
 Description=FUSE Control File System
 Documentation=https://www.kernel.org/doc/Documentation/filesystems/fuse.txt
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
 DefaultDependencies=no
 ConditionPathExists=/sys/fs/fuse/connections
 ConditionCapability=CAP_SYS_ADMIN
+ConditionVirtualization=!private-users
 After=systemd-modules-load.service
 Before=sysinit.target
 
index 21648ef..b585f32 100644 (file)
@@ -6,9 +6,9 @@
 #  (at your option) any later version.
 
 [Unit]
-Description=Configuration File System
+Description=Kernel Configuration File System
 Documentation=https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
 DefaultDependencies=no
 ConditionPathExists=/sys/kernel/config
 ConditionCapability=CAP_SYS_RAWIO
index 1e94387..808dbf0 100644 (file)
@@ -6,9 +6,9 @@
 #  (at your option) any later version.
 
 [Unit]
-Description=Debug File System
+Description=Kernel Debug File System
 Documentation=https://www.kernel.org/doc/Documentation/filesystems/debugfs.txt
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
 DefaultDependencies=no
 ConditionPathExists=/sys/kernel/debug
 ConditionCapability=CAP_SYS_RAWIO
index e6e9cf8..d3987cb 100644 (file)
@@ -8,7 +8,7 @@
 [Unit]
 Description=Syslog Socket
 Documentation=man:systemd.special(7)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/syslog
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/syslog
 DefaultDependencies=no
 Before=sockets.target shutdown.target
 
@@ -37,4 +37,4 @@ ReceiveBuffer=8M
 # [Install]
 # Alias=syslog.service
 #
-# See http://www.freedesktop.org/wiki/Software/systemd/syslog for details.
+# See https://www.freedesktop.org/wiki/Software/systemd/syslog for details.
similarity index 80%
rename from units/system-default-target-done.service
rename to units/system-default-target-done.service.in
index 9ce2cd8..97364cd 100644 (file)
@@ -9,7 +9,7 @@ RefuseManualStop=yes
 Type=oneshot
 User=system_fw
 Group=system_fw
-ExecStart=/usr/bin/touch /run/systemd/system/graphical.target.done
+ExecStart=@rootbindir@/touch /run/systemd/system/graphical.target.done
 RemainAfterExit=yes
 SecureBits=keep-caps
 Capabilities=cap_dac_override=i
diff --git a/units/system-delayed-target-done.service.in b/units/system-delayed-target-done.service.in
new file mode 100644 (file)
index 0000000..7bfdea3
--- /dev/null
@@ -0,0 +1,16 @@
+[Unit]
+Description=System Delayed Target Done Service
+After=delayed.target
+DefaultDependencies=no
+RefuseManualStart=yes
+RefuseManualStop=yes
+
+[Service]
+Type=oneshot
+User=system_fw
+Group=system_fw
+ExecStart=@rootbindir@/touch /run/systemd/system/delayed.target.done
+RemainAfterExit=yes
+SecureBits=keep-caps
+Capabilities=cap_dac_override=i
+SmackProcessLabel=System
similarity index 78%
rename from units/system-delayed-target-trigger.service
rename to units/system-delayed-target-trigger.service.in
index e98808e..6467ff7 100644 (file)
@@ -11,7 +11,7 @@ RefuseManualStop=yes
 # At least one service must remain, and systemd will not enter the Startupfinished state.
 # So this unit, which is oneshot type, becomes that one service.
 Type=oneshot
-ExecStart=/usr/bin/wait-default-target.sh System
-ExecStart=/usr/bin/systemctl --no-block start delayed.target
+ExecStart=@rootbindir@/wait-default-target.sh System
+ExecStart=@rootbindir@/systemctl --no-block start delayed.target
 RemainAfterExit=yes
 SmackProcessLabel=System
diff --git a/units/system-update-cleanup.service.in b/units/system-update-cleanup.service.in
new file mode 100644 (file)
index 0000000..116be8b
--- /dev/null
@@ -0,0 +1,32 @@
+#  This file is part of systemd.
+#
+#  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.
+
+[Unit]
+Description=Remove the Offline System Updates symlink
+Documentation=man:systemd.special(5) man:systemd.offline-updates(7)
+After=system-update.target
+DefaultDependencies=no
+Conflicts=shutdown.target
+
+# system-update-generator uses laccess("/system-update"), while a plain
+# ConditionPathExists=/system-update uses access("/system-update"), so
+# we need an alternate condition to cover the case of a dangling symlink.
+#
+# This service is only invoked if /system-update exists, i.e. if the
+# condition tested by system-update-generator remains true and the system
+# would be diverted into system-update.target again after reboot. This way
+# we guard against being diverted into system-update.target again, which
+# works as a safety measure, but we will not step on the toes of the
+# update script if it successfully removed the symlink and scheduled a
+# reboot or some other action on its own.
+ConditionPathExists=|/system-update
+ConditionPathIsSymbolicLink=|/system-update
+
+[Service]
+Type=oneshot
+ExecStart=/bin/rm -fv /system-update
+ExecStart=@SYSTEMCTL@ reboot
index 48d46fc..3542879 100644 (file)
@@ -6,11 +6,12 @@
 #  (at your option) any later version.
 
 [Unit]
-Description=System Update
-Documentation=http://freedesktop.org/wiki/Software/systemd/SystemUpdates
+Description=Offline System Update
+Documentation=man:systemd.offline-updates(7)
 Documentation=man:systemd.special(7) man:systemd-system-update-generator(8)
 Requires=sysinit.target
 Conflicts=shutdown.target
 After=sysinit.target
 Before=shutdown.target
 AllowIsolate=yes
+Wants=system-update-cleanup.service
index 2949635..7899ae7 100644 (file)
@@ -11,7 +11,7 @@ Documentation=man:systemd-ask-password-console.service(8)
 DefaultDependencies=no
 Conflicts=shutdown.target
 After=plymouth-start.service
-Before=paths.target shutdown.target
+Before=paths.target shutdown.target cryptsetup.target
 ConditionPathExists=!/run/plymouth/pid
 
 [Path]
index 68b7710..2c53ff8 100644 (file)
@@ -17,3 +17,4 @@ ConditionPathExists=!/run/plymouth/pid
 [Service]
 ExecStart=@rootbindir@/systemd-tty-ask-password-agent --watch --console
 SmackProcessLabel=System
+SystemCallArchitectures=native
index 95ec9bc..a3ca617 100644 (file)
@@ -10,7 +10,7 @@ Description=Forward Password Requests to Wall Directory Watch
 Documentation=man:systemd-ask-password-console.service(8)
 DefaultDependencies=no
 Conflicts=shutdown.target
-Before=paths.target shutdown.target
+Before=paths.target shutdown.target cryptsetup.target
 
 [Path]
 DirectoryNotEmpty=/run/systemd/ask-password
index e1d8ccd..e6d1333 100644 (file)
@@ -14,3 +14,4 @@ After=systemd-user-sessions.service
 ExecStartPre=-@SYSTEMCTL@ stop systemd-ask-password-console.path systemd-ask-password-console.service systemd-ask-password-plymouth.path systemd-ask-password-plymouth.service
 ExecStart=@rootbindir@/systemd-tty-ask-password-agent --wall
 SmackProcessLabel=System
+SystemCallArchitectures=native
index 588c8d6..18f2d2d 100644 (file)
@@ -19,6 +19,19 @@ Before=shutdown.target
 ExecStart=-@rootlibexecdir@/systemd-coredump
 Nice=9
 OOMScoreAdjust=500
-PrivateNetwork=yes
-ProtectSystem=full
 RuntimeMaxSec=5min
+PrivateTmp=yes
+PrivateDevices=yes
+PrivateNetwork=yes
+ProtectSystem=strict
+ProtectHome=yes
+ProtectControlGroups=yes
+ProtectKernelTunables=yes
+ProtectKernelModules=yes
+MemoryDenyWriteExecute=yes
+RestrictRealtime=yes
+RestrictNamespaces=yes
+RestrictAddressFamilies=AF_UNIX
+SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @mount @obsolete @raw-io @reboot @swap
+SystemCallArchitectures=native
+ReadWritePaths=/var/lib/systemd/coredump
index 4b59ecf..801648c 100644 (file)
@@ -8,17 +8,26 @@
 [Unit]
 Description=Hostname Service
 Documentation=man:systemd-hostnamed.service(8) man:hostname(5) man:machine-info(5)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/hostnamed
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/hostnamed
 
 [Service]
 ExecStart=@rootlibexecdir@/systemd-hostnamed
 BusName=org.freedesktop.hostname1
-CapabilityBoundingSet=CAP_SYS_ADMIN
 WatchdogSec=3min
+CapabilityBoundingSet=CAP_SYS_ADMIN
 PrivateTmp=yes
 PrivateDevices=yes
 PrivateNetwork=yes
-ProtectSystem=yes
-MemoryDenyWriteExecute=yes
-SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @mount @obsolete @raw-io
 SmackProcessLabel=System
+ProtectSystem=strict
+ProtectHome=yes
+ProtectControlGroups=yes
+ProtectKernelTunables=yes
+ProtectKernelModules=yes
+MemoryDenyWriteExecute=yes
+RestrictRealtime=yes
+RestrictNamespaces=yes
+RestrictAddressFamilies=AF_UNIX
+SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @mount @obsolete @raw-io @reboot @swap
+SystemCallArchitectures=native
+ReadWritePaths=/etc
index 0f5489e..5876205 100644 (file)
@@ -8,14 +8,18 @@
 [Unit]
 Description=Virtual Machine and Container Download Service
 Documentation=man:systemd-importd.service(8)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/importd
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/importd
 
 [Service]
 ExecStart=@rootlibexecdir@/systemd-importd
 BusName=org.freedesktop.import1
-CapabilityBoundingSet=CAP_CHOWN CAP_FOWNER CAP_FSETID CAP_MKNOD CAP_SETFCAP CAP_SYS_ADMIN CAP_SETPCAP CAP_DAC_OVERRIDE
-NoNewPrivileges=yes
 WatchdogSec=3min
 KillMode=mixed
+CapabilityBoundingSet=CAP_CHOWN CAP_FOWNER CAP_FSETID CAP_MKNOD CAP_SETFCAP CAP_SYS_ADMIN CAP_SETPCAP CAP_DAC_OVERRIDE
+NoNewPrivileges=yes
 MemoryDenyWriteExecute=yes
-SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @mount @obsolete @raw-io
+RestrictRealtime=yes
+RestrictNamespaces=net
+RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
+SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @obsolete @raw-io @reboot @swap
+SystemCallArchitectures=native
index 192f3cd..2ff668f 100644 (file)
@@ -11,6 +11,7 @@ Documentation=man:systemd-initctl.service(8)
 DefaultDependencies=no
 
 [Service]
-ExecStart=@rootlibexecdir@/systemd-initctl
 NotifyAccess=all
 SmackProcessLabel=System
+ExecStart=@rootlibexecdir@/systemd-initctl
+SystemCallArchitectures=native
index f64a1df..0f9fbaa 100644 (file)
@@ -12,7 +12,7 @@ DefaultDependencies=no
 Conflicts=shutdown.target
 After=local-fs.target
 Before=sysinit.target shutdown.target systemd-update-done.service
-ConditionNeedsUpdate=/etc
+ConditionNeedsUpdate=/var
 
 [Service]
 Type=oneshot
index f4f8458..9909996 100644 (file)
@@ -18,8 +18,16 @@ SupplementaryGroups=systemd-journal
 PrivateTmp=yes
 PrivateDevices=yes
 PrivateNetwork=yes
-ProtectSystem=full
+ProtectSystem=strict
 ProtectHome=yes
+ProtectControlGroups=yes
+ProtectKernelTunables=yes
+ProtectKernelModules=yes
+MemoryDenyWriteExecute=yes
+RestrictRealtime=yes
+RestrictNamespaces=yes
+RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
+SystemCallArchitectures=native
 
 # If there are many split upjournal files we need a lot of fds to
 # access them all and combine
index fdf3da4..5404bf1 100644 (file)
@@ -11,15 +11,24 @@ Documentation=man:systemd-journal-remote(8) man:journal-remote.conf(5)
 Requires=systemd-journal-remote.socket
 
 [Service]
-ExecStart=@rootlibexecdir@/systemd-journal-remote \
-          --listen-https=-3 \
-          --output=/var/log/journal/remote/
+ExecStart=@rootlibexecdir@/systemd-journal-remote --listen-https=-3 --output=/var/log/journal/remote/
 User=systemd-journal-remote
 Group=systemd-journal-remote
+WatchdogSec=3min
 PrivateTmp=yes
 PrivateDevices=yes
 PrivateNetwork=yes
-WatchdogSec=3min
+ProtectSystem=strict
+ProtectHome=yes
+ProtectControlGroups=yes
+ProtectKernelTunables=yes
+ProtectKernelModules=yes
+MemoryDenyWriteExecute=yes
+RestrictRealtime=yes
+RestrictNamespaces=yes
+RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
+SystemCallArchitectures=native
+ReadWritePaths=/var/log/journal/remote
 
 [Install]
 Also=systemd-journal-remote.socket
index 1f488ff..d00b929 100644 (file)
@@ -8,16 +8,27 @@
 [Unit]
 Description=Journal Remote Upload Service
 Documentation=man:systemd-journal-upload(8)
-After=network.target
+Wants=network-online.target
+After=network-online.target
 
 [Service]
-ExecStart=@rootlibexecdir@/systemd-journal-upload \
-          --save-state
+ExecStart=@rootlibexecdir@/systemd-journal-upload --save-state
 User=systemd-journal-upload
 SupplementaryGroups=systemd-journal
+WatchdogSec=3min
 PrivateTmp=yes
 PrivateDevices=yes
-WatchdogSec=3min
+ProtectSystem=strict
+ProtectHome=yes
+ProtectControlGroups=yes
+ProtectKernelTunables=yes
+ProtectKernelModules=yes
+MemoryDenyWriteExecute=yes
+RestrictRealtime=yes
+RestrictNamespaces=yes
+RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
+SystemCallArchitectures=native
+ReadWritePaths=/var/lib/systemd/journal-upload
 
 # If there are many split up journal files we need a lot of fds to
 # access them all and combine
index f9522ca..685e470 100644 (file)
@@ -19,14 +19,17 @@ Sockets=systemd-journald.socket systemd-journald-dev-log.socket systemd-journald
 ExecStart=@rootlibexecdir@/systemd-journald
 Restart=always
 RestartSec=0
-NotifyAccess=all
 StandardOutput=null
 SmackProcessLabel=System
-CapabilityBoundingSet=CAP_SYS_ADMIN CAP_DAC_OVERRIDE CAP_SYS_PTRACE CAP_SYSLOG CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_CHOWN CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_MAC_OVERRIDE
 WatchdogSec=3min
 FileDescriptorStoreMax=1024
+CapabilityBoundingSet=CAP_SYS_ADMIN CAP_DAC_OVERRIDE CAP_SYS_PTRACE CAP_SYSLOG CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_CHOWN CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_MAC_OVERRIDE
 MemoryDenyWriteExecute=yes
-SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @mount @obsolete @raw-io
+RestrictRealtime=yes
+RestrictNamespaces=yes
+RestrictAddressFamilies=AF_UNIX AF_NETLINK
+SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @mount @obsolete @raw-io @reboot @swap
+SystemCallArchitectures=native
 
 # Increase the default a bit in order to allow many simultaneous
 # services being run since we keep one fd open per service. Also, when
index e61266d..a19f412 100644 (file)
@@ -8,18 +8,26 @@
 [Unit]
 Description=Locale Service
 Documentation=man:systemd-localed.service(8) man:locale.conf(5) man:vconsole.conf(5)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/localed
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/localed
 
 [Service]
 ExecStart=@rootlibexecdir@/systemd-localed
 BusName=org.freedesktop.locale1
-CapabilityBoundingSet=
 WatchdogSec=3min
+CapabilityBoundingSet=
 PrivateTmp=yes
 PrivateDevices=yes
 PrivateNetwork=yes
-ProtectSystem=yes
+ProtectSystem=strict
 ProtectHome=yes
+ProtectControlGroups=yes
+ProtectKernelTunables=yes
+ProtectKernelModules=yes
 MemoryDenyWriteExecute=yes
-SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @mount @obsolete @raw-io
 SmackProcessLabel=System
+RestrictRealtime=yes
+RestrictNamespaces=yes
+RestrictAddressFamilies=AF_UNIX
+SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @mount @obsolete @raw-io @reboot @swap
+SystemCallArchitectures=native
+ReadWritePaths=/etc
index 3ec499f..f07d367 100644 (file)
@@ -8,8 +8,8 @@
 [Unit]
 Description=Login Service
 Documentation=man:systemd-logind.service(8) man:logind.conf(5)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/logind
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/multiseat
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/logind
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/multiseat
 Wants=user.slice
 After=nss-user-lookup.target user.slice
 
@@ -23,11 +23,16 @@ ExecStart=@rootlibexecdir@/systemd-logind
 Restart=always
 RestartSec=0
 BusName=org.freedesktop.login1
-CapabilityBoundingSet=CAP_SYS_ADMIN CAP_MAC_ADMIN CAP_AUDIT_CONTROL CAP_CHOWN CAP_KILL CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE CAP_FOWNER CAP_SYS_TTY_CONFIG
 WatchdogSec=3min
+CapabilityBoundingSet=CAP_SYS_ADMIN CAP_MAC_ADMIN CAP_AUDIT_CONTROL CAP_CHOWN CAP_KILL CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE CAP_FOWNER CAP_SYS_TTY_CONFIG
 MemoryDenyWriteExecute=yes
-SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @obsolete @raw-io
 SmackProcessLabel=System::Privileged
+RestrictRealtime=yes
+RestrictNamespaces=yes
+RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6
+SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @obsolete @raw-io @reboot @swap
+SystemCallArchitectures=native
+FileDescriptorStoreMax=512
 
 # Increase the default a bit in order to allow many simultaneous
 # logins since we keep one fd open per session.
index 9fb765c..1de7e2a 100644 (file)
@@ -8,18 +8,22 @@
 [Unit]
 Description=Virtual Machine and Container Registration Service
 Documentation=man:systemd-machined.service(8)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/machined
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/machined
 Wants=machine.slice
 After=machine.slice
+RequiresMountsFor=/var/lib/machines
 
 [Service]
 ExecStart=@rootlibexecdir@/systemd-machined
 BusName=org.freedesktop.machine1
-CapabilityBoundingSet=CAP_KILL CAP_SYS_PTRACE CAP_SYS_ADMIN CAP_SETGID CAP_SYS_CHROOT CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE CAP_CHOWN CAP_FOWNER CAP_FSETID CAP_MKNOD
 WatchdogSec=3min
+CapabilityBoundingSet=CAP_KILL CAP_SYS_PTRACE CAP_SYS_ADMIN CAP_SETGID CAP_SYS_CHROOT CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE CAP_CHOWN CAP_FOWNER CAP_FSETID CAP_MKNOD
 MemoryDenyWriteExecute=yes
-SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @obsolete @raw-io
 SmackProcessLabel=System
+RestrictRealtime=yes
+RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6
+SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @obsolete @raw-io @reboot @swap
+SystemCallArchitectures=native
 
 # Note that machined cannot be placed in a mount namespace, since it
 # needs access to the host's mount namespace in order to implement the
index a9bad7a..a84e919 100644 (file)
@@ -10,7 +10,7 @@ Description=Wait for Network to be Configured
 Documentation=man:systemd-networkd-wait-online.service(8)
 DefaultDependencies=no
 Conflicts=shutdown.target
-Requisite=systemd-networkd.service
+Requires=systemd-networkd.service
 After=systemd-networkd.service
 Before=network-online.target
 
index 38d967d..15e6ad9 100644 (file)
@@ -10,9 +10,8 @@ Description=Network Service
 Documentation=man:systemd-networkd.service(8)
 ConditionCapability=CAP_NET_ADMIN
 DefaultDependencies=no
-# dbus.service can be dropped once on kdbus, and systemd-udevd.service can be
-# dropped once tuntap is moved to netlink
-After=systemd-udevd.service dbus.service network-pre.target systemd-sysusers.service systemd-sysctl.service
+# systemd-udevd.service can be dropped once tuntap is moved to netlink
+After=systemd-udevd.service network-pre.target systemd-sysusers.service systemd-sysctl.service
 Before=network.target multi-user.target shutdown.target
 Conflicts=shutdown.target
 Wants=network.target
@@ -27,13 +26,26 @@ Type=notify
 Restart=on-failure
 RestartSec=0
 ExecStart=@rootlibexecdir@/systemd-networkd
+WatchdogSec=3min
 CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_RAW CAP_SETUID CAP_SETGID CAP_SETPCAP CAP_CHOWN CAP_DAC_OVERRIDE CAP_FOWNER
-ProtectSystem=full
+ProtectSystem=strict
 ProtectHome=yes
-WatchdogSec=3min
+ProtectControlGroups=yes
+ProtectKernelModules=yes
 MemoryDenyWriteExecute=yes
-SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @mount @obsolete @raw-io
+RestrictRealtime=yes
+RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6 AF_PACKET
+SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @mount @obsolete @raw-io @reboot @swap
+SystemCallArchitectures=native
+ReadWritePaths=/run/systemd
 
 [Install]
 WantedBy=multi-user.target
 Also=systemd-networkd.socket
+Alias=dbus-org.freedesktop.network1.service
+
+# We want to enable systemd-networkd-wait-online.service whenever this service
+# is enabled. systemd-networkd-wait-online.service has
+# WantedBy=network-online.target, so enabling it only has an effect if
+# network-online.target itself is enabled or pulled in by some other unit.
+Also=systemd-networkd-wait-online.service
index 71c47f5..8b2cd98 100644 (file)
@@ -10,7 +10,8 @@ Description=Container %i
 Documentation=man:systemd-nspawn(1)
 PartOf=machines.target
 Before=machines.target
-After=network.target
+After=network.target systemd-resolved.service
+RequiresMountsFor=/var/lib/machines
 
 [Service]
 ExecStart=@bindir@/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --network-veth -U --settings=override --machine=%i
@@ -23,9 +24,9 @@ Delegate=yes
 SmackProcessLabel=System
 TasksMax=16384
 
-# Enforce a strict device policy, similar to the one nspawn configures
-# when it allocates its own scope unit. Make sure to keep these
-# policies in sync if you change them!
+## Enforce a strict device policy, similar to the one nspawn configures
+## when it allocates its own scope unit. Make sure to keep these
+## policies in sync if you change them!
 DevicePolicy=closed
 DeviceAllow=/dev/net/tun rwm
 DeviceAllow=char-pts rw
index 34838be..1060974 100644 (file)
@@ -10,7 +10,7 @@ Description=File System Quota Check
 Documentation=man:systemd-quotacheck.service(8)
 DefaultDependencies=no
 After=systemd-remount-fs.service
-Before=local-fs.target shutdown.target
+Before=remote-fs.target shutdown.target
 ConditionPathExists=@QUOTACHECK@
 
 [Service]
index 1152332..b244a8c 100644 (file)
@@ -13,6 +13,7 @@ RequiresMountsFor=@RANDOM_SEED@
 Conflicts=shutdown.target
 After=systemd-remount-fs.service
 Before=sysinit.target shutdown.target
+ConditionVirtualization=!container
 
 [Service]
 Type=oneshot
index 0f3f5f6..bc66691 100644 (file)
@@ -8,7 +8,7 @@
 [Unit]
 Description=Remount Root and Kernel File Systems
 Documentation=man:systemd-remount-fs.service(8)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
 DefaultDependencies=no
 Conflicts=shutdown.target
 After=systemd-fsck-root.service
index 15ab56a..931156a 100644 (file)
@@ -8,10 +8,12 @@
 [Unit]
 Description=Network Name Resolution
 Documentation=man:systemd-resolved.service(8)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/resolved
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/writing-network-configuration-managers
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/writing-resolver-clients
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/resolved
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/writing-network-configuration-managers
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/writing-resolver-clients
 After=systemd-networkd.service network.target
+Before=network-online.target nss-lookup.target
+Wants=nss-lookup.target
 
 # On kdbus systems we pull in the busname explicitly, because it
 # carries policy that allows the daemon to acquire its name.
@@ -23,12 +25,22 @@ Type=notify
 Restart=always
 RestartSec=0
 ExecStart=@rootlibexecdir@/systemd-resolved
+WatchdogSec=3min
 CapabilityBoundingSet=CAP_SETUID CAP_SETGID CAP_SETPCAP CAP_CHOWN CAP_DAC_OVERRIDE CAP_FOWNER CAP_NET_RAW CAP_NET_BIND_SERVICE
-ProtectSystem=full
+PrivateTmp=yes
+PrivateDevices=yes
+ProtectSystem=strict
 ProtectHome=yes
-WatchdogSec=3min
+ProtectControlGroups=yes
+ProtectKernelTunables=yes
+ProtectKernelModules=yes
 MemoryDenyWriteExecute=yes
-SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @mount @obsolete @raw-io
+RestrictRealtime=yes
+RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6
+SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @mount @obsolete @raw-io @reboot @swap
+SystemCallArchitectures=native
+ReadWritePaths=/run/systemd
 
 [Install]
 WantedBy=multi-user.target
+Alias=dbus-org.freedesktop.resolve1.service
index 9913572..d72c753 100644 (file)
@@ -12,7 +12,7 @@ DefaultDependencies=no
 Conflicts=shutdown.target
 After=systemd-modules-load.service
 Before=sysinit.target shutdown.target
-ConditionPathIsReadWrite=/proc/sys/
+ConditionPathIsReadWrite=/proc/sys/net/
 
 [Service]
 Type=oneshot
index bc1795d..2b5f074 100644 (file)
@@ -8,15 +8,23 @@
 [Unit]
 Description=Time & Date Service
 Documentation=man:systemd-timedated.service(8) man:localtime(5)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/timedated
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/timedated
 
 [Service]
 ExecStart=@rootlibexecdir@/systemd-timedated
 BusName=org.freedesktop.timedate1
-CapabilityBoundingSet=CAP_SYS_TIME
 WatchdogSec=3min
+CapabilityBoundingSet=CAP_SYS_TIME
 PrivateTmp=yes
-ProtectSystem=yes
+ProtectSystem=strict
 ProtectHome=yes
+ProtectControlGroups=yes
+ProtectKernelTunables=yes
+ProtectKernelModules=yes
 MemoryDenyWriteExecute=yes
-SystemCallFilter=~@cpu-emulation @debug @keyring @module @mount @obsolete @raw-io
+RestrictRealtime=yes
+RestrictNamespaces=yes
+RestrictAddressFamilies=AF_UNIX
+SystemCallFilter=~@cpu-emulation @debug @keyring @module @mount @obsolete @raw-io @reboot @swap
+SystemCallArchitectures=native
+ReadWritePaths=/etc
index df1e339..8d328bb 100644 (file)
@@ -22,14 +22,22 @@ Type=notify
 Restart=always
 RestartSec=0
 ExecStart=@rootlibexecdir@/systemd-timesyncd
+WatchdogSec=3min
 CapabilityBoundingSet=CAP_SYS_TIME CAP_SETUID CAP_SETGID CAP_SETPCAP CAP_CHOWN CAP_DAC_OVERRIDE CAP_FOWNER
 PrivateTmp=yes
 PrivateDevices=yes
-ProtectSystem=full
+ProtectSystem=strict
 ProtectHome=yes
-WatchdogSec=3min
+ProtectControlGroups=yes
+ProtectKernelTunables=yes
+ProtectKernelModules=yes
 MemoryDenyWriteExecute=yes
-SystemCallFilter=~@cpu-emulation @debug @keyring @module @mount @obsolete @raw-io
+RestrictRealtime=yes
+RestrictNamespaces=yes
+RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
+SystemCallFilter=~@cpu-emulation @debug @keyring @module @mount @obsolete @raw-io @reboot @swap
+SystemCallArchitectures=native
+ReadWritePaths=/var/lib/systemd
 
 [Install]
 WantedBy=sysinit.target
index 8330a1c..46f704e 100644 (file)
@@ -17,3 +17,4 @@ Service=systemd-udevd.service
 ListenSequentialPacket=/run/udev/control
 SocketMode=0600
 PassCredentials=yes
+RemoveOnStop=yes
index da7f19b..4572641 100644 (file)
@@ -21,8 +21,12 @@ Sockets=systemd-udevd-control.socket systemd-udevd-kernel.socket
 Restart=always
 RestartSec=0
 ExecStart=@rootlibexecdir@/systemd-udevd
-MountFlags=slave
 KillMode=mixed
 WatchdogSec=3min
 TasksMax=infinity
 SmackProcessLabel=System::Privileged
+MountFlags=slave
+MemoryDenyWriteExecute=yes
+RestrictRealtime=yes
+RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6
+SystemCallArchitectures=native
index bd56d91..2cec3bb 100644 (file)
@@ -9,12 +9,10 @@
 Description=Setup Virtual Console
 Documentation=man:systemd-vconsole-setup.service(8) man:vconsole.conf(5)
 DefaultDependencies=no
-Conflicts=shutdown.target
-Before=sysinit.target shutdown.target
+Before=initrd-switch-root.target shutdown.target
 ConditionPathExists=/dev/tty0
 
 [Service]
 Type=oneshot
-RemainAfterExit=yes
 ExecStart=@rootlibexecdir@/systemd-vconsole-setup
 SmackProcessLabel=System
diff --git a/units/systemd-volatile-root.service.in b/units/systemd-volatile-root.service.in
new file mode 100644 (file)
index 0000000..cc4e604
--- /dev/null
@@ -0,0 +1,21 @@
+#  This file is part of systemd.
+#
+#  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.
+
+[Unit]
+Description=Enforce Volatile Root File Systems
+Documentation=man:systemd-volatile-root.service(8)
+DefaultDependencies=no
+Conflicts=shutdown.target
+After=sysroot.mount
+Before=initrd-root-fs.target shutdown.target
+Conflicts=shutdown.target
+AssertPathExists=/etc/initrd-release
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=@rootlibexecdir@/systemd-volatile-root yes /sysroot
index 3342a16..04c0408 100644 (file)
@@ -6,9 +6,9 @@
 #  (at your option) any later version.
 
 [Unit]
-Description=Temporary Directory
+Description=Temporary Directory (/tmp)
 Documentation=man:hier(7)
-Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
 ConditionPathIsSymbolicLink=!/tmp
 DefaultDependencies=no
 Conflicts=umount.target
diff --git a/units/user/bluetooth.target b/units/user/bluetooth.target
new file mode 120000 (symlink)
index 0000000..72e74be
--- /dev/null
@@ -0,0 +1 @@
+../bluetooth.target
\ No newline at end of file
diff --git a/units/user/busnames.target b/units/user/busnames.target
new file mode 120000 (symlink)
index 0000000..04f4ba1
--- /dev/null
@@ -0,0 +1 @@
+../busnames.target
\ No newline at end of file
diff --git a/units/user/graphical-session-pre.target b/units/user/graphical-session-pre.target
new file mode 100644 (file)
index 0000000..86d15af
--- /dev/null
@@ -0,0 +1,14 @@
+#  This file is part of systemd.
+#
+#  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.
+
+[Unit]
+Description=Session services which should run early before the graphical session is brought up
+Documentation=man:systemd.special(7)
+Requires=basic.target
+Before=graphical-session.target
+RefuseManualStart=yes
+StopWhenUnneeded=yes
similarity index 75%
rename from units/x-.slice
rename to units/user/graphical-session.target
index ac82c35..00d1623 100644 (file)
@@ -6,7 +6,8 @@
 #  (at your option) any later version.
 
 [Unit]
-Description=Root Slice
+Description=Current graphical user session
 Documentation=man:systemd.special(7)
-DefaultDependencies=no
-Before=slices.target
+Requires=basic.target
+RefuseManualStart=yes
+StopWhenUnneeded=yes
diff --git a/units/user/meson.build b/units/user/meson.build
new file mode 100644 (file)
index 0000000..a42b2be
--- /dev/null
@@ -0,0 +1,44 @@
+units = [
+        'basic.target',
+        'bluetooth.target',
+        'default.target',
+        'exit.target',
+        'graphical-session-pre.target',
+        'graphical-session.target',
+        'paths.target',
+        'printer.target',
+        'shutdown.target',
+        'smartcard.target',
+        'sockets.target',
+        'sound.target',
+        'timers.target',
+]
+
+units += [
+          'delayed.target',
+          'user-delayed-target-trigger.service',
+          'user-default-target-done.service',
+          'user-delayed-target-done.service',
+]
+
+foreach file : units
+        install_data(file,
+                     install_dir : userunitdir)
+endforeach
+
+meson.add_install_script('../meson-add-wants.sh', userunitdir, 'default.target.wants/', 'user-delayed-target-trigger.service')
+meson.add_install_script('../meson-add-wants.sh', userunitdir, 'default.target.wants/', 'user-default-target-done.service')
+meson.add_install_script('../meson-add-wants.sh', userunitdir, 'delayed.target.wants/', 'user-delayed-target-done.service')
+
+in_units = [
+        'systemd-exit.service',
+]
+
+foreach file : in_units
+        gen = configure_file(
+                input : file + '.in',
+                output : file,
+                configuration : substs)
+        install_data(gen,
+                     install_dir : userunitdir)
+endforeach
diff --git a/units/user/paths.target b/units/user/paths.target
new file mode 120000 (symlink)
index 0000000..33545d2
--- /dev/null
@@ -0,0 +1 @@
+../paths.target
\ No newline at end of file
diff --git a/units/user/printer.target b/units/user/printer.target
new file mode 120000 (symlink)
index 0000000..8b8d551
--- /dev/null
@@ -0,0 +1 @@
+../printer.target
\ No newline at end of file
diff --git a/units/user/shutdown.target b/units/user/shutdown.target
new file mode 120000 (symlink)
index 0000000..a9de837
--- /dev/null
@@ -0,0 +1 @@
+../shutdown.target
\ No newline at end of file
diff --git a/units/user/smartcard.target b/units/user/smartcard.target
new file mode 120000 (symlink)
index 0000000..f7a23b6
--- /dev/null
@@ -0,0 +1 @@
+../smartcard.target
\ No newline at end of file
diff --git a/units/user/sockets.target b/units/user/sockets.target
new file mode 120000 (symlink)
index 0000000..a9e4b97
--- /dev/null
@@ -0,0 +1 @@
+../sockets.target
\ No newline at end of file
diff --git a/units/user/sound.target b/units/user/sound.target
new file mode 120000 (symlink)
index 0000000..17c8e9d
--- /dev/null
@@ -0,0 +1 @@
+../sound.target
\ No newline at end of file
diff --git a/units/user/timers.target b/units/user/timers.target
new file mode 120000 (symlink)
index 0000000..f98b68a
--- /dev/null
@@ -0,0 +1 @@
+../timers.target
\ No newline at end of file
index bc60d93..02dddd6 100644 (file)
@@ -25,3 +25,4 @@ Environment=XDG_RUNTIME_DIR=/run/user/%i
 Capabilities=cap_sys_admin,cap_mac_admin,cap_setgid,cap_dac_override=i
 SecureBits=keep-caps
 TimeoutStartSec=infinity
+TimeoutStopSec=120s